From a3431e6884612b095501ee964d4813ac7420666d Mon Sep 17 00:00:00 2001 From: Andrew Kingston Date: Fri, 26 Jul 2024 15:41:07 +0100 Subject: [PATCH 001/180] Add initial work on grid layouts in containers --- packages/client/manifest.json | 101 ++++++++++++++---- .../client/src/components/app/Repeater.svelte | 2 +- .../components/app/container/Container.svelte | 12 +++ .../FlexContainer.svelte} | 0 .../GridContainer.svelte} | 3 + packages/client/src/components/app/index.js | 3 +- .../components/preview/GridDNDHandler.svelte | 2 +- .../components/preview/IndicatorSet.svelte | 16 ++- 8 files changed, 103 insertions(+), 36 deletions(-) create mode 100644 packages/client/src/components/app/container/Container.svelte rename packages/client/src/components/app/{Container.svelte => container/FlexContainer.svelte} (100%) rename packages/client/src/components/app/{Grid.svelte => container/GridContainer.svelte} (97%) diff --git a/packages/client/manifest.json b/packages/client/manifest.json index 37f9c681d6..2559671bab 100644 --- a/packages/client/manifest.json +++ b/packages/client/manifest.json @@ -119,6 +119,48 @@ }, "styles": ["padding", "size", "background", "border", "shadow"], "settings": [ + { + "type": "select", + "label": "Layout", + "key": "layout", + "showInBar": true, + "barStyle": "buttons", + "options": [ + { + "label": "Flex", + "value": "flex", + "barIcon": "ModernGridView", + "barTitle": "Flex layout" + }, + { + "label": "Grid", + "value": "grid", + "barIcon": "ViewGrid", + "barTitle": "Grid layout" + } + ], + "defaultValue": "flex" + }, + { + "type": "number", + "label": "Columns", + "key": "cols", + "placeholder": 12, + "dependsOn": { + "setting": "layout", + "value": "grid" + } + }, + { + "type": "number", + "label": "Rows", + "key": "rows", + "placeholder": 12, + "dependsOn": { + "setting": "layout", + "value": "grid" + } + }, { "type": "select", "label": "Direction", @@ -139,7 +181,12 @@ "barTitle": "Row layout" } ], - "defaultValue": "column" + "defaultValue": "column", + "dependsOn": { + "setting": "layout", + "value": "grid", + "invert": true + } }, { "type": "select", @@ -173,7 +220,12 @@ "barTitle": "Align stretched horizontally" } ], - "defaultValue": "stretch" + "defaultValue": "stretch", + "dependsOn": { + "setting": "layout", + "value": "grid", + "invert": true + } }, { "type": "select", @@ -207,7 +259,12 @@ "barTitle": "Align stretched vertically" } ], - "defaultValue": "top" + "defaultValue": "top", + "dependsOn": { + "setting": "layout", + "value": "grid", + "invert": true + } }, { "type": "select", @@ -229,7 +286,12 @@ "barTitle": "Grow container" } ], - "defaultValue": "shrink" + "defaultValue": "shrink", + "dependsOn": { + "setting": "layout", + "value": "grid", + "invert": true + } }, { "type": "select", @@ -255,7 +317,12 @@ "value": "L" } ], - "defaultValue": "M" + "defaultValue": "M", + "dependsOn": { + "setting": "layout", + "value": "grid", + "invert": true + } }, { "type": "boolean", @@ -263,7 +330,12 @@ "key": "wrap", "showInBar": true, "barIcon": "ModernGridView", - "barTitle": "Wrap" + "barTitle": "Wrap", + "dependsOn": { + "setting": "layout", + "value": "grid", + "invert": true + } }, { "type": "event", @@ -7167,23 +7239,6 @@ "scope": "local" } }, - "grid": { - "name": "Grid", - "icon": "ViewGrid", - "hasChildren": true, - "settings": [ - { - "type": "number", - "key": "cols", - "label": "Columns" - }, - { - "type": "number", - "key": "rows", - "label": "Rows" - } - ] - }, "gridblock": { "name": "Table", "icon": "Table", diff --git a/packages/client/src/components/app/Repeater.svelte b/packages/client/src/components/app/Repeater.svelte index 2d07342cf5..0b9f011a6e 100644 --- a/packages/client/src/components/app/Repeater.svelte +++ b/packages/client/src/components/app/Repeater.svelte @@ -1,7 +1,7 @@ + + + + diff --git a/packages/client/src/components/app/Container.svelte b/packages/client/src/components/app/container/FlexContainer.svelte similarity index 100% rename from packages/client/src/components/app/Container.svelte rename to packages/client/src/components/app/container/FlexContainer.svelte diff --git a/packages/client/src/components/app/Grid.svelte b/packages/client/src/components/app/container/GridContainer.svelte similarity index 97% rename from packages/client/src/components/app/Grid.svelte rename to packages/client/src/components/app/container/GridContainer.svelte index adc050d330..870a593b46 100644 --- a/packages/client/src/components/app/Grid.svelte +++ b/packages/client/src/components/app/container/GridContainer.svelte @@ -7,6 +7,9 @@ export let cols = 12 export let rows = 12 + $: cols = cols || 12 + $: rows = rows || 12 + // Deliberately non-reactive as we want this fixed whenever the grid renders const defaultColSpan = Math.ceil((cols + 1) / 2) const defaultRowSpan = Math.ceil((rows + 1) / 2) diff --git a/packages/client/src/components/app/index.js b/packages/client/src/components/app/index.js index 6d9df6e588..63cdb95ac1 100644 --- a/packages/client/src/components/app/index.js +++ b/packages/client/src/components/app/index.js @@ -13,7 +13,7 @@ import "@spectrum-css/page/dist/index-vars.css" export { default as Placeholder } from "./Placeholder.svelte" // User facing components -export { default as container } from "./Container.svelte" +export { default as container } from "./container/Container.svelte" export { default as section } from "./Section.svelte" export { default as dataprovider } from "./DataProvider.svelte" export { default as divider } from "./Divider.svelte" @@ -35,7 +35,6 @@ export { default as spectrumcard } from "./SpectrumCard.svelte" export { default as tag } from "./Tag.svelte" export { default as markdownviewer } from "./MarkdownViewer.svelte" export { default as embeddedmap } from "./embedded-map/EmbeddedMap.svelte" -export { default as grid } from "./Grid.svelte" export { default as sidepanel } from "./SidePanel.svelte" export { default as modal } from "./Modal.svelte" export { default as gridblock } from "./GridBlock.svelte" diff --git a/packages/client/src/components/preview/GridDNDHandler.svelte b/packages/client/src/components/preview/GridDNDHandler.svelte index df0ccb814e..28ef068cfc 100644 --- a/packages/client/src/components/preview/GridDNDHandler.svelte +++ b/packages/client/src/components/preview/GridDNDHandler.svelte @@ -25,7 +25,7 @@ e.target .closest?.(".component") ?.parentNode.closest(".component") - ?.childNodes[0].classList.contains("grid") || + ?.childNodes[0].classList?.contains("grid") || e.target.classList.contains("anchor") ) } diff --git a/packages/client/src/components/preview/IndicatorSet.svelte b/packages/client/src/components/preview/IndicatorSet.svelte index 2b941b2662..2a346742f1 100644 --- a/packages/client/src/components/preview/IndicatorSet.svelte +++ b/packages/client/src/components/preview/IndicatorSet.svelte @@ -1,7 +1,6 @@ From f58e05b5093eb8c2369b34deb72754ee09c93106 Mon Sep 17 00:00:00 2001 From: Andrew Kingston Date: Mon, 29 Jul 2024 14:45:33 +0100 Subject: [PATCH 002/180] Improve performance --- .../components/preview/GridDNDHandler.svelte | 25 ++++++++----------- .../components/preview/IndicatorSet.svelte | 11 +++++++- 2 files changed, 20 insertions(+), 16 deletions(-) diff --git a/packages/client/src/components/preview/GridDNDHandler.svelte b/packages/client/src/components/preview/GridDNDHandler.svelte index 28ef068cfc..266a86c867 100644 --- a/packages/client/src/components/preview/GridDNDHandler.svelte +++ b/packages/client/src/components/preview/GridDNDHandler.svelte @@ -1,21 +1,20 @@ diff --git a/packages/client/src/components/preview/SettingsBar.svelte b/packages/client/src/components/preview/SettingsBar.svelte index c5109c6bca..e80cb0eaca 100644 --- a/packages/client/src/components/preview/SettingsBar.svelte +++ b/packages/client/src/components/preview/SettingsBar.svelte @@ -4,7 +4,8 @@ import SettingsColorPicker from "./SettingsColorPicker.svelte" import SettingsPicker from "./SettingsPicker.svelte" import { builderStore, componentStore, dndIsDragging } from "stores" - import { domDebounce } from "utils/domDebounce" + import { Utils } from "@budibase/frontend-core" + import { isGridChild } from "utils/grid" const verticalOffset = 36 const horizontalOffset = 2 @@ -49,8 +50,10 @@ return } const id = $builderStore.selectedComponentId - const parent = document.getElementsByClassName(id)?.[0] - const element = parent?.children?.[0] + let element = document.getElementsByClassName(id)?.[0] + if (!isGridChild(element)) { + element = element?.children?.[0] + } // The settings bar is higher in the dom tree than the selection indicators // as we want to be able to render the settings bar wider than the screen, @@ -111,7 +114,7 @@ measured = true } } - const debouncedUpdate = domDebounce(updatePosition) + const debouncedUpdate = Utils.domDebounce(updatePosition) onMount(() => { debouncedUpdate() diff --git a/packages/client/src/utils/domDebounce.js b/packages/client/src/utils/domDebounce.js deleted file mode 100644 index b15d2698b4..0000000000 --- a/packages/client/src/utils/domDebounce.js +++ /dev/null @@ -1,14 +0,0 @@ -export const domDebounce = (callback, extractParams = x => x) => { - let active = false - let lastParams - return (...params) => { - lastParams = extractParams(...params) - if (!active) { - active = true - requestAnimationFrame(() => { - callback(lastParams) - active = false - }) - } - } -} diff --git a/packages/client/src/utils/grid.js b/packages/client/src/utils/grid.js new file mode 100644 index 0000000000..03c48505ce --- /dev/null +++ b/packages/client/src/utils/grid.js @@ -0,0 +1,20 @@ +export const isGridEvent = e => { + return ( + e.target + .closest?.(".component") + ?.parentNode.closest(".component") + ?.childNodes[0]?.classList?.contains("grid") || + e.target.classList.contains("anchor") + ) +} + +export const isGridChild = node => { + return node + ?.closest(".component") + ?.parentNode.closest(".component") + ?.childNodes[0]?.classList?.contains("grid") +} + +export const getGridParentID = node => { + return node?.closest(".grid")?.parentNode.dataset.id +} From cb3c6678596544182aefec600e72a3f224c87942 Mon Sep 17 00:00:00 2001 From: Andrew Kingston Date: Wed, 31 Jul 2024 10:35:57 +0100 Subject: [PATCH 010/180] Large refactor of grid css variable handling to simplify everything --- .../[screenId]/_components/AppPreview.svelte | 4 +- .../builder/src/stores/builder/components.js | 11 -- packages/client/manifest.json | 17 ++- .../client/src/components/Component.svelte | 49 ++++---- .../app/container/GridContainer.svelte | 32 ++++-- .../components/preview/GridDNDHandler.svelte | 106 ++++++------------ .../preview/GridStylesButton.svelte | 48 ++++++++ .../src/components/preview/SettingsBar.svelte | 66 ++++++++++- .../components/preview/SettingsButton.svelte | 1 + packages/client/src/stores/builder.js | 4 +- packages/client/src/utils/grid.js | 85 ++++++++++++++ 11 files changed, 306 insertions(+), 117 deletions(-) create mode 100644 packages/client/src/components/preview/GridStylesButton.svelte diff --git a/packages/builder/src/pages/builder/app/[application]/design/[screenId]/_components/AppPreview.svelte b/packages/builder/src/pages/builder/app/[application]/design/[screenId]/_components/AppPreview.svelte index 94a303ead4..0ce9e096f2 100644 --- a/packages/builder/src/pages/builder/app/[application]/design/[screenId]/_components/AppPreview.svelte +++ b/packages/builder/src/pages/builder/app/[application]/design/[screenId]/_components/AppPreview.svelte @@ -132,8 +132,8 @@ hoverStore.hover(data.id, false) } else if (type === "update-prop") { await componentStore.updateSetting(data.prop, data.value) - } else if (type === "update-meta-styles") { - await componentStore.updateMetaStyles(data.styles, data.id) + } else if (type === "update-styles") { + await componentStore.updateStyles(data.styles, data.id) } else if (type === "delete-component" && data.id) { // Legacy type, can be deleted in future confirmDeleteComponent(data.id) diff --git a/packages/builder/src/stores/builder/components.js b/packages/builder/src/stores/builder/components.js index a35169a646..c281c73dfe 100644 --- a/packages/builder/src/stores/builder/components.js +++ b/packages/builder/src/stores/builder/components.js @@ -64,7 +64,6 @@ export class ComponentStore extends BudiStore { this.moveDown = this.moveDown.bind(this) this.updateStyle = this.updateStyle.bind(this) this.updateStyles = this.updateStyles.bind(this) - this.updateMetaStyles = this.updateMetaStyles.bind(this) this.updateCustomStyle = this.updateCustomStyle.bind(this) this.updateConditions = this.updateConditions.bind(this) this.requestEjectBlock = this.requestEjectBlock.bind(this) @@ -979,16 +978,6 @@ export class ComponentStore extends BudiStore { await this.patch(patchFn, id) } - async updateMetaStyles(styles, id) { - const patchFn = component => { - component._styles.meta = { - ...component._styles.meta, - ...styles, - } - } - await this.patch(patchFn, id) - } - async updateCustomStyle(style) { await this.patch(component => { component._styles.custom = style diff --git a/packages/client/manifest.json b/packages/client/manifest.json index 8231c0005f..1c18fd4801 100644 --- a/packages/client/manifest.json +++ b/packages/client/manifest.json @@ -118,7 +118,9 @@ "height": 200 }, "grid": { - "fill": true + "hAlign": "stretch", + "vAlign": "stretch", + "showControls": false }, "styles": ["padding", "size", "background", "border", "shadow"], "settings": [ @@ -2790,6 +2792,10 @@ "width": 400, "height": 400 }, + "grid": { + "hAlign": "stretch", + "vAlign": "stretch" + }, "settings": [ { "type": "select", @@ -6915,6 +6921,10 @@ "width": 400, "height": 400 }, + "grid": { + "hAlign": "stretch", + "vAlign": "start" + }, "settings": [ { "type": "table", @@ -7256,6 +7266,11 @@ "width": 600, "height": 400 }, + "grid": { + "hAlign": "stretch", + "vAlign": "stretch", + "showControls": false + }, "settings": [ { "type": "dataSource", diff --git a/packages/client/src/components/Component.svelte b/packages/client/src/components/Component.svelte index 340cc6e577..771cb8b0e6 100644 --- a/packages/client/src/components/Component.svelte +++ b/packages/client/src/components/Component.svelte @@ -40,6 +40,7 @@ getActionDependentContextKeys, } from "../utils/buttonActions.js" import { buildStyleString } from "utils/styleable.js" + import { getBaseGridVars } from "utils/grid.js" export let instance = {} export let isLayout = false @@ -103,7 +104,7 @@ let settingsDefinitionMap let missingRequiredSettings = false - // Temporary meta styles which can be added in the app preview for things like + // Temporary styles which can be added in the app preview for things like // DND. We clear these whenever a new instance is received. let ephemeralStyles @@ -197,14 +198,14 @@ $: currentTheme = $context?.device?.theme $: darkMode = !currentTheme?.includes("light") - // Build meta styles and stringify to apply to the wrapper node - $: definitionMetaStyles = getDefinitonMetaStyles(definition) - $: metaStyles = { - ...definitionMetaStyles, - ...instance._styles?.meta, + // Build up full styles and split them into variables and non-variables + $: baseStyles = getBaseStyles(definition) + $: parsedStyles = parseStyles({ + ...baseStyles, + ...instance._styles?.normal, ...ephemeralStyles, - } - $: metaCSS = buildStyleString(metaStyles) + }) + $: wrapperCSS = buildStyleString(parsedStyles.variables) // Update component context $: store.set({ @@ -212,7 +213,7 @@ children: children.length, styles: { ...instance._styles, - meta: metaStyles, + normal: parsedStyles.nonVariables, custom: customCSS, id, empty: emptyState, @@ -612,7 +613,7 @@ } } - const select = e => { + const handleWrapperClick = e => { if (isBlock) { return } @@ -620,19 +621,21 @@ builderStore.actions.selectComponent(id) } - // Util to generate meta styles based on component definition - const alignToStyleMap = { - start: "flex-start", - center: "center", - end: "flex-end", - stretch: "stretch", + // Splits component styles into variables and non-variables + const parseStyles = styles => { + let variables = {} + let nonVariables = {} + for (let style of Object.keys(styles || {})) { + const group = style.startsWith("--") ? variables : nonVariables + group[style] = styles[style] + } + return { variables, nonVariables } } - const getDefinitonMetaStyles = definition => { - const gridHAlign = definition.grid?.hAlign || "stretch" - const gridVAlign = definition.grid?.vAlign || "center" + + // Generates any required base styles based on the component definition + const getBaseStyles = definition => { return { - ["align-items"]: alignToStyleMap[gridHAlign], - ["justify-content"]: alignToStyleMap[gridVAlign], + ...getBaseGridVars(definition), } } @@ -684,9 +687,9 @@ data-name={name} data-icon={icon} data-parent={$component.id} - style={metaCSS} + style={wrapperCSS} {draggable} - on:click={select} + on:click={handleWrapperClick} > {#if errorState} .component) { display: flex; overflow: hidden; - flex-direction: column; - justify-content: center; - align-items: stretch; /* On desktop, use desktop metadata and fall back to mobile */ + /* Position vars */ --col-start: var(--grid-desktop-col-start, var(--grid-mobile-col-start, 1)); --col-end: var(--grid-desktop-col-end, var(--grid-mobile-col-end, 2)); --row-start: var(--grid-desktop-row-start, var(--grid-mobile-row-start, 1)); --row-end: var(--grid-desktop-row-end, var(--grid-mobile-row-end, 2)); + /* Flex vars */ + --h-align: var(--grid-desktop-h-align, var(--grid-mobile-h-align, stretch)); + --v-align: var(--grid-desktop-v-align, var(--grid-mobile-v-align, center)); + --child-flex: var( + --grid-desktop-child-flex, + var(--grid-mobile-child-flex, 0 0 auto) + ); + /* Ensure grid metadata falls within limits */ grid-column-start: min(max(1, var(--col-start)), var(--cols)) !important; grid-column-end: min( @@ -114,20 +120,32 @@ ) !important; grid-row-start: min(max(1, var(--row-start)), var(--rows)) !important; grid-row-end: min(max(2, var(--row-end)), calc(var(--rows) + 1)) !important; + + /* Flex container styles */ + flex-direction: column; + align-items: var(--h-align); + justify-content: var(--v-align); } /* On mobile, use mobile metadata and fall back to desktop */ .grid.mobile :global(> .component) { + /* Position vars */ --col-start: var(--grid-mobile-col-start, var(--grid-desktop-col-start, 1)); --col-end: var(--grid-mobile-col-end, var(--grid-desktop-col-end, 2)); --row-start: var(--grid-mobile-row-start, var(--grid-desktop-row-start, 1)); --row-end: var(--grid-mobile-row-end, var(--grid-desktop-row-end, 2)); + + /* Flex vars */ + --h-align: var(--grid-mobile-h-align, var(--grid-desktop-h-align, stretch)); + --v-align: var(--grid-mobile-v-align, var(--grid-desktop-v-align, center)); + --child-flex: var( + --grid-mobile-child-flex, + var(--grid-desktop-child-flex, 0 0 auto) + ); } /* Handle grid children which need to fill the outer component wrapper */ - .grid :global(> .component.fill > *) { - width: 100%; - height: 100%; - flex: 1 1 0; + .grid :global(> .component > *) { + flex: var(--child-flex) !important; } diff --git a/packages/client/src/components/preview/GridDNDHandler.svelte b/packages/client/src/components/preview/GridDNDHandler.svelte index 4a3f698703..41e3ea4a2f 100644 --- a/packages/client/src/components/preview/GridDNDHandler.svelte +++ b/packages/client/src/components/preview/GridDNDHandler.svelte @@ -2,53 +2,20 @@ import { onMount, onDestroy } from "svelte" import { builderStore, componentStore } from "stores" import { Utils, memo } from "@budibase/frontend-core" - import { isGridEvent, getGridParentID } from "utils/grid" + import { + isGridEvent, + getGridParentID, + getGridVar, + getDefaultGridVarValue, + getOtherDeviceGridVar, + } from "utils/grid" - // Enum for device preview type, included in CSS variables - const Devices = { - Desktop: "desktop", - Mobile: "mobile", - } - - // Generates the CSS variable for a certain grid param suffix, for the current - // device - const getCSSVar = suffix => { - const device = - $builderStore.previewDevice === Devices.Mobile - ? Devices.Mobile - : Devices.Desktop - return `--grid-${device}-${suffix}` - } - - // Generates the CSS variable for a certain grid param suffix, for the other - // device variant than the one included in this variable - const getOtherDeviceCSSVar = cssVar => { - if (cssVar.includes(Devices.Desktop)) { - return cssVar.replace(Devices.Desktop, Devices.Mobile) - } else { - return cssVar.replace(Devices.Mobile, Devices.Desktop) - } - } - - // Gets the default value for a certain grid CSS variable - const getDefaultValue = cssVar => { - return cssVar.endsWith("-start") ? 1 : 2 - } - - // Enums for our grid CSS variables, for the current device - const Vars = { - get ColStart() { - return getCSSVar("col-start") - }, - get ColEnd() { - return getCSSVar("col-end") - }, - get RowStart() { - return getCSSVar("row-start") - }, - get RowEnd() { - return getCSSVar("row-end") - }, + // Grid CSS variables + $: vars = { + colStart: $getGridVar("col-start"), + colEnd: $getGridVar("col-end"), + rowStart: $getGridVar("row-start"), + rowEnd: $getGridVar("row-end"), } let dragInfo @@ -97,34 +64,34 @@ deltaX = minMax(deltaX, 1 - colStart, cols + 1 - colEnd) deltaY = minMax(deltaY, 1 - rowStart, rows + 1 - rowEnd) const newStyles = { - [Vars.ColStart]: colStart + deltaX, - [Vars.ColEnd]: colEnd + deltaX, - [Vars.RowStart]: rowStart + deltaY, - [Vars.RowEnd]: rowEnd + deltaY, + [vars.colStart]: colStart + deltaX, + [vars.colEnd]: colEnd + deltaX, + [vars.rowStart]: rowStart + deltaY, + [vars.rowEnd]: rowEnd + deltaY, } gridStyles.set(newStyles) } else if (mode === "resize") { let newStyles = {} if (side === "right") { - newStyles[Vars.ColEnd] = Math.max(colEnd + deltaX, colStart + 1) + newStyles[vars.colEnd] = Math.max(colEnd + deltaX, colStart + 1) } else if (side === "left") { - newStyles[Vars.ColStart] = Math.min(colStart + deltaX, colEnd - 1) + newStyles[vars.colStart] = Math.min(colStart + deltaX, colEnd - 1) } else if (side === "top") { - newStyles[Vars.RowStart] = Math.min(rowStart + deltaY, rowEnd - 1) + newStyles[vars.rowStart] = Math.min(rowStart + deltaY, rowEnd - 1) } else if (side === "bottom") { - newStyles[Vars.RowEnd] = Math.max(rowEnd + deltaY, rowStart + 1) + newStyles[vars.rowEnd] = Math.max(rowEnd + deltaY, rowStart + 1) } else if (side === "bottom-right") { - newStyles[Vars.ColEnd] = Math.max(colEnd + deltaX, colStart + 1) - newStyles[Vars.RowEnd] = Math.max(rowEnd + deltaY, rowStart + 1) + newStyles[vars.colEnd] = Math.max(colEnd + deltaX, colStart + 1) + newStyles[vars.rowEnd] = Math.max(rowEnd + deltaY, rowStart + 1) } else if (side === "bottom-left") { - newStyles[Vars.ColStart] = Math.min(colStart + deltaX, colEnd - 1) - newStyles[Vars.RowEnd] = Math.max(rowEnd + deltaY, rowStart + 1) + newStyles[vars.colStart] = Math.min(colStart + deltaX, colEnd - 1) + newStyles[vars.rowEnd] = Math.max(rowEnd + deltaY, rowStart + 1) } else if (side === "top-right") { - newStyles[Vars.ColEnd] = Math.max(colEnd + deltaX, colStart + 1) - newStyles[Vars.RowStart] = Math.min(rowStart + deltaY, rowEnd - 1) + newStyles[vars.colEnd] = Math.max(colEnd + deltaX, colStart + 1) + newStyles[vars.rowStart] = Math.min(rowStart + deltaY, rowEnd - 1) } else if (side === "top-left") { - newStyles[Vars.ColStart] = Math.min(colStart + deltaX, colEnd - 1) - newStyles[Vars.RowStart] = Math.min(rowStart + deltaY, rowEnd - 1) + newStyles[vars.colStart] = Math.min(colStart + deltaX, colEnd - 1) + newStyles[vars.rowStart] = Math.min(rowStart + deltaY, rowEnd - 1) } gridStyles.set(newStyles) } @@ -197,20 +164,21 @@ const getCurrent = cssVar => { let style = styles?.getPropertyValue(cssVar) if (!style) { - style = styles?.getPropertyValue(getOtherDeviceCSSVar(cssVar)) + style = styles?.getPropertyValue(getOtherDeviceGridVar(cssVar)) } - return parseInt(style || getDefaultValue(cssVar)) + return parseInt(style || getDefaultGridVarValue(cssVar)) } dragInfo.grid = { startX: e.clientX, startY: e.clientY, // Ensure things are within limits - rowStart: minMax(getCurrent(Vars.RowStart), 1, gridRows), - rowEnd: minMax(getCurrent(Vars.RowEnd), 2, gridRows + 1), - colStart: minMax(getCurrent(Vars.ColStart), 1, gridCols), - colEnd: minMax(getCurrent(Vars.ColEnd), 2, gridCols + 1), + rowStart: minMax(getCurrent(vars.rowStart), 1, gridRows), + rowEnd: minMax(getCurrent(vars.rowEnd), 2, gridRows + 1), + colStart: minMax(getCurrent(vars.colStart), 1, gridCols), + colEnd: minMax(getCurrent(vars.colEnd), 2, gridCols + 1), } + console.log(dragInfo.grid) handleEvent(e) } } @@ -226,7 +194,7 @@ const stopDragging = async () => { // Save changes if ($gridStyles) { - await builderStore.actions.updateMetaStyles($gridStyles, dragInfo.id) + await builderStore.actions.updateStyles($gridStyles, dragInfo.id) } // Reset listener diff --git a/packages/client/src/components/preview/GridStylesButton.svelte b/packages/client/src/components/preview/GridStylesButton.svelte new file mode 100644 index 0000000000..7e436bdebc --- /dev/null +++ b/packages/client/src/components/preview/GridStylesButton.svelte @@ -0,0 +1,48 @@ + + + + +
{ + builderStore.actions.updateStyles( + { [style]: value }, + $componentStore.selectedComponent._id + ) + }} +> + +
+ + diff --git a/packages/client/src/components/preview/SettingsBar.svelte b/packages/client/src/components/preview/SettingsBar.svelte index e80cb0eaca..540204f817 100644 --- a/packages/client/src/components/preview/SettingsBar.svelte +++ b/packages/client/src/components/preview/SettingsBar.svelte @@ -1,11 +1,13 @@ From fc2fb812051c5fbd88f5f580dce09f57cfe96566 Mon Sep 17 00:00:00 2001 From: Andrew Kingston Date: Wed, 31 Jul 2024 10:43:25 +0100 Subject: [PATCH 012/180] Fix bug with responsive css variables --- packages/client/src/utils/grid.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/client/src/utils/grid.js b/packages/client/src/utils/grid.js index c83b580795..a357f86de4 100644 --- a/packages/client/src/utils/grid.js +++ b/packages/client/src/utils/grid.js @@ -20,7 +20,7 @@ const Devices = { // Generates the CSS variable for a certain grid param suffix, for the current // device -const previewDevice = derived(builderStore, $store => $store.device) +const previewDevice = derived(builderStore, $store => $store.previewDevice) export const getGridVar = derived(previewDevice, device => suffix => { const prefix = device === Devices.Mobile ? Devices.Mobile : Devices.Desktop return `--grid-${prefix}-${suffix}` From 0ea9b157c789487e9c5bc71511eb57ac4902f9fc Mon Sep 17 00:00:00 2001 From: Andrew Kingston Date: Wed, 31 Jul 2024 13:58:29 +0100 Subject: [PATCH 013/180] Further refactoring to grid nested layouts --- .../client/src/components/Component.svelte | 6 ++-- .../app/container/GridContainer.svelte | 2 +- .../preview/GridStylesButton.svelte | 11 +++---- .../src/components/preview/SettingsBar.svelte | 31 +++++++++++++++---- .../components/preview/SettingsButton.svelte | 11 +++---- .../preview/SettingsColorPicker.svelte | 5 +-- .../components/preview/SettingsPicker.svelte | 5 +-- packages/client/src/utils/grid.js | 10 +++--- 8 files changed, 50 insertions(+), 31 deletions(-) diff --git a/packages/client/src/components/Component.svelte b/packages/client/src/components/Component.svelte index 771cb8b0e6..85c6dc6e36 100644 --- a/packages/client/src/components/Component.svelte +++ b/packages/client/src/components/Component.svelte @@ -200,11 +200,12 @@ // Build up full styles and split them into variables and non-variables $: baseStyles = getBaseStyles(definition) - $: parsedStyles = parseStyles({ + $: styles = { ...baseStyles, ...instance._styles?.normal, ...ephemeralStyles, - }) + } + $: parsedStyles = parseStyles(styles) $: wrapperCSS = buildStyleString(parsedStyles.variables) // Update component context @@ -214,6 +215,7 @@ styles: { ...instance._styles, normal: parsedStyles.nonVariables, + variables: parsedStyles.variables, custom: customCSS, id, empty: emptyState, diff --git a/packages/client/src/components/app/container/GridContainer.svelte b/packages/client/src/components/app/container/GridContainer.svelte index a5450ffe4c..3e58fef787 100644 --- a/packages/client/src/components/app/container/GridContainer.svelte +++ b/packages/client/src/components/app/container/GridContainer.svelte @@ -95,7 +95,7 @@ /* Ensure all top level children have grid styles applied */ .grid :global(> .component) { display: flex; - overflow: hidden; + overflow: auto; /* On desktop, use desktop metadata and fall back to mobile */ /* Position vars */ diff --git a/packages/client/src/components/preview/GridStylesButton.svelte b/packages/client/src/components/preview/GridStylesButton.svelte index 0a313bba53..e168754f3b 100644 --- a/packages/client/src/components/preview/GridStylesButton.svelte +++ b/packages/client/src/components/preview/GridStylesButton.svelte @@ -1,14 +1,16 @@ @@ -18,10 +20,7 @@ {title} class:active on:click={() => { - builderStore.actions.updateStyles( - { [style]: value }, - $componentStore.selectedComponent._id - ) + builderStore.actions.updateStyles({ [style]: value }, componentId) }} > diff --git a/packages/client/src/components/preview/SettingsBar.svelte b/packages/client/src/components/preview/SettingsBar.svelte index 540204f817..1fecec5376 100644 --- a/packages/client/src/components/preview/SettingsBar.svelte +++ b/packages/client/src/components/preview/SettingsBar.svelte @@ -20,11 +20,12 @@ // TODO: respect dependsOn keys - $: id = $builderStore.selectedComponentId - $: parent = findComponentParent($builderStore.screen.props, id) - $: instance = componentStore.actions.getComponentInstance(id) - $: state = $instance?.state + $: componentId = $builderStore.selectedComponentId + $: component = $componentStore.selectedComponent $: definition = $componentStore.selectedComponentDefinition + $: parent = findComponentParent($builderStore.screen.props, componentId) + $: instance = componentStore.actions.getComponentInstance(componentId) + $: state = $instance?.state $: showBar = definition?.showSettingsBar !== false && !$dndIsDragging && @@ -36,12 +37,13 @@ } } $: settings = getBarSettings(definition) - $: isRoot = id === $builderStore.screen?.props?._id + $: isRoot = componentId === $builderStore.screen?.props?._id $: insideGrid = parent?._component.endsWith("/container") && parent.layout === "grid" $: showGridStyles = insideGrid && definition?.grid?.showControls !== false $: gridHAlignVar = $getGridVar("h-align") $: gridVAlignVar = $getGridVar("v-align") + $: gridStyles = $state?.styles?.variables const getBarSettings = definition => { let allSettings = [] @@ -141,7 +143,7 @@ {#if showBar}
@@ -151,24 +153,32 @@ value="start" icon="AlignLeft" title="Align left" + {gridStyles} + {componentId} />
{/if} @@ -206,6 +224,7 @@ value={option.value} icon={option.barIcon} title={option.barTitle || option.label} + {component} /> {/each} {:else} diff --git a/packages/client/src/components/preview/SettingsButton.svelte b/packages/client/src/components/preview/SettingsButton.svelte index 446a367282..a93ffb77af 100644 --- a/packages/client/src/components/preview/SettingsButton.svelte +++ b/packages/client/src/components/preview/SettingsButton.svelte @@ -1,18 +1,19 @@ @@ -20,7 +21,6 @@
{ if (prop) { @@ -50,7 +50,4 @@ background-color: rgba(13, 102, 208, 0.1); color: var(--spectrum-global-color-blue-600); } - .rotate { - transform: rotate(90deg); - } diff --git a/packages/client/src/components/preview/SettingsColorPicker.svelte b/packages/client/src/components/preview/SettingsColorPicker.svelte index b078d048d2..a292d7d838 100644 --- a/packages/client/src/components/preview/SettingsColorPicker.svelte +++ b/packages/client/src/components/preview/SettingsColorPicker.svelte @@ -1,10 +1,11 @@
diff --git a/packages/client/src/components/preview/SettingsPicker.svelte b/packages/client/src/components/preview/SettingsPicker.svelte index 8b83729fde..3900d065e8 100644 --- a/packages/client/src/components/preview/SettingsPicker.svelte +++ b/packages/client/src/components/preview/SettingsPicker.svelte @@ -1,12 +1,13 @@
diff --git a/packages/client/src/utils/grid.js b/packages/client/src/utils/grid.js index a357f86de4..5879232e89 100644 --- a/packages/client/src/utils/grid.js +++ b/packages/client/src/utils/grid.js @@ -1,5 +1,5 @@ -import { builderStore } from "stores" -import { derived, get } from "svelte/store" +import { builderStore, componentStore } from "stores" +import { derived, get, readable } from "svelte/store" /** * We use CSS variables on components to control positioning and layout of @@ -91,13 +91,13 @@ export const getBaseGridVars = definition => { } // Gets the current value of a certain grid CSS variable for a component -export const getGridVarValue = (component, variable) => { +export const getGridVarValue = (styles, variable) => { // Try the desired variable - let val = component?._styles?.normal?.[variable] + let val = styles?.[variable] // Otherwise try the other device variables if (!val) { - val = component?._styles?.normal?.[getOtherDeviceGridVar(variable)] + val = styles?.[getOtherDeviceGridVar(variable)] } // Otherwise use the default From e385c7291c0beb74a8611a8872d05c122ff978c9 Mon Sep 17 00:00:00 2001 From: Andrew Kingston Date: Wed, 31 Jul 2024 14:12:46 +0100 Subject: [PATCH 014/180] Fix some crashes and improve pixel alignment --- packages/client/src/components/preview/Indicator.svelte | 2 +- .../client/src/components/preview/IndicatorSet.svelte | 9 ++++----- packages/client/src/utils/grid.js | 4 ++-- 3 files changed, 7 insertions(+), 8 deletions(-) diff --git a/packages/client/src/components/preview/Indicator.svelte b/packages/client/src/components/preview/Indicator.svelte index 0480ea91ce..ae6ed081a5 100644 --- a/packages/client/src/components/preview/Indicator.svelte +++ b/packages/client/src/components/preview/Indicator.svelte @@ -69,7 +69,7 @@ z-index: var(--zIndex); border: 2px solid var(--color); pointer-events: none; - border-radius: 4px; + border-radius: 2px; } .indicator.withText { border-top-left-radius: 0; diff --git a/packages/client/src/components/preview/IndicatorSet.svelte b/packages/client/src/components/preview/IndicatorSet.svelte index e437ba84b6..aff62a76a7 100644 --- a/packages/client/src/components/preview/IndicatorSet.svelte +++ b/packages/client/src/components/preview/IndicatorSet.svelte @@ -37,7 +37,6 @@ let callbackCount = 0 $: visibleIndicators = state.indicators.filter(x => x.visible) - $: offset = $builderStore.inBuilder ? 0 : 2 // Update position when any props change $: config.set({ @@ -150,10 +149,10 @@ const elBounds = child.getBoundingClientRect() nextState.indicators.push({ - top: elBounds.top + scrollY - deviceBounds.top - offset, - left: elBounds.left + scrollX - deviceBounds.left - offset, - width: elBounds.width + 4, - height: elBounds.height + 4, + top: Math.round(elBounds.top + scrollY - deviceBounds.top + 1), + left: Math.round(elBounds.left + scrollX - deviceBounds.left + 1), + width: Math.round(elBounds.width + 2), + height: Math.round(elBounds.height + 2), visible: false, insideSidePanel: !!child.closest(".side-panel"), insideModal: !!child.closest(".modal-content"), diff --git a/packages/client/src/utils/grid.js b/packages/client/src/utils/grid.js index 5879232e89..91b4d0a525 100644 --- a/packages/client/src/utils/grid.js +++ b/packages/client/src/utils/grid.js @@ -77,8 +77,8 @@ const alignmentToStyleMap = { stretch: "stretch", } export const getBaseGridVars = definition => { - const gridHAlign = definition.grid?.hAlign || "stretch" - const gridVAlign = definition.grid?.vAlign || "center" + const gridHAlign = definition?.grid?.hAlign || "stretch" + const gridVAlign = definition?.grid?.vAlign || "center" const flexStyles = gridVAlign === "stretch" ? "1 1 0" : "0 0 auto" return { ["--grid-desktop-h-align"]: alignmentToStyleMap[gridHAlign], From de9b80e23dd8a4a6a5abfa96a64ab0b56925a7e2 Mon Sep 17 00:00:00 2001 From: Andrew Kingston Date: Wed, 31 Jul 2024 15:03:29 +0100 Subject: [PATCH 015/180] Multiple style improvements and pixel layout fixes --- packages/client/src/components/ClientApp.svelte | 16 +++++----------- packages/client/src/components/Component.svelte | 3 ++- .../app/container/GridContainer.svelte | 1 + .../src/components/preview/Indicator.svelte | 9 +++++---- .../src/components/preview/IndicatorSet.svelte | 7 ++++--- 5 files changed, 17 insertions(+), 19 deletions(-) diff --git a/packages/client/src/components/ClientApp.svelte b/packages/client/src/components/ClientApp.svelte index 763c8ef771..d0369192a0 100644 --- a/packages/client/src/components/ClientApp.svelte +++ b/packages/client/src/components/ClientApp.svelte @@ -356,22 +356,16 @@ } /* Preview styles */ - /* The additional 6px of size is to account for 4px padding and 2px border */ #clip-root.preview { - padding: 2px; + padding: 6px; } #clip-root.tablet-preview { - width: calc(1024px + 6px); - height: calc(768px + 6px); + width: calc(1024px + 12px); + height: calc(768px + 12px); } #clip-root.mobile-preview { - width: calc(390px + 6px); - height: calc(844px + 6px); - } - - .preview #app-root { - border: 1px solid var(--spectrum-global-color-gray-300); - border-radius: 4px; + width: calc(390px + 12px); + height: calc(844px + 12px); } /* Print styles */ diff --git a/packages/client/src/components/Component.svelte b/packages/client/src/components/Component.svelte index 85c6dc6e36..6ff6fa00fc 100644 --- a/packages/client/src/components/Component.svelte +++ b/packages/client/src/components/Component.svelte @@ -619,6 +619,7 @@ if (isBlock) { return } + console.log("select", id) e.stopPropagation() builderStore.actions.selectComponent(id) } @@ -691,7 +692,7 @@ data-parent={$component.id} style={wrapperCSS} {draggable} - on:click={handleWrapperClick} + on:click|self={handleWrapperClick} > {#if errorState} .component) { display: flex; overflow: auto; + pointer-events: all; /* On desktop, use desktop metadata and fall back to mobile */ /* Position vars */ diff --git a/packages/client/src/components/preview/Indicator.svelte b/packages/client/src/components/preview/Indicator.svelte index ae6ed081a5..d93ecaa02b 100644 --- a/packages/client/src/components/preview/Indicator.svelte +++ b/packages/client/src/components/preview/Indicator.svelte @@ -69,7 +69,7 @@ z-index: var(--zIndex); border: 2px solid var(--color); pointer-events: none; - border-radius: 2px; + border-radius: 4px; } .indicator.withText { border-top-left-radius: 0; @@ -123,7 +123,7 @@ /* Anchor */ .anchor { - --size: 24px; + --size: 20px; position: absolute; width: var(--size); height: var(--size); @@ -133,11 +133,12 @@ border-radius: 50%; } .anchor-inner { - width: 12px; - height: 12px; + width: calc(var(--size) / 2); + height: calc(var(--size) / 2); background: white; border: 2px solid var(--color); pointer-events: none; + border-radius: 2px; } .anchor.right { right: calc(var(--size) / -2 - 1px); diff --git a/packages/client/src/components/preview/IndicatorSet.svelte b/packages/client/src/components/preview/IndicatorSet.svelte index aff62a76a7..6d7918244a 100644 --- a/packages/client/src/components/preview/IndicatorSet.svelte +++ b/packages/client/src/components/preview/IndicatorSet.svelte @@ -11,6 +11,8 @@ export let prefix = null export let allowResizeAnchors = false + // Offset = 6 (clip-root padding) - 1 (half the border thickness) + const offset = 6 - 1 const config = memo($$props) const errorColor = "var(--spectrum-global-color-static-red-600)" const defaultState = () => ({ @@ -146,11 +148,10 @@ }) observer.observe(child) observers.push(observer) - const elBounds = child.getBoundingClientRect() nextState.indicators.push({ - top: Math.round(elBounds.top + scrollY - deviceBounds.top + 1), - left: Math.round(elBounds.left + scrollX - deviceBounds.left + 1), + top: Math.round(elBounds.top + scrollY - deviceBounds.top + offset), + left: Math.round(elBounds.left + scrollX - deviceBounds.left + offset), width: Math.round(elBounds.width + 2), height: Math.round(elBounds.height + 2), visible: false, From 8540f4020ba2a2af55f4656d4d836dda2c300552 Mon Sep 17 00:00:00 2001 From: Andrew Kingston Date: Wed, 31 Jul 2024 15:34:15 +0100 Subject: [PATCH 016/180] Improve client preview styles to work with increase client padding --- .../[screenId]/_components/AppPreview.svelte | 22 ++++++++++++++----- .../src/components/ClientAppSkeleton.svelte | 1 - 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/packages/builder/src/pages/builder/app/[application]/design/[screenId]/_components/AppPreview.svelte b/packages/builder/src/pages/builder/app/[application]/design/[screenId]/_components/AppPreview.svelte index 0ce9e096f2..a5d14062dc 100644 --- a/packages/builder/src/pages/builder/app/[application]/design/[screenId]/_components/AppPreview.svelte +++ b/packages/builder/src/pages/builder/app/[application]/design/[screenId]/_components/AppPreview.svelte @@ -275,6 +275,7 @@ src="/app/preview" class:hidden={loading || error} /> +
.loading { position: absolute; - container-type: inline-size; - width: 100%; - height: 100%; - border: 2px solid transparent; - box-sizing: border-box; + width: calc(100% - 12px); + height: calc(100% - 12px); + left: 6px; + top: 6px; } .loading.tablet { @@ -318,7 +318,6 @@ display: grid; place-items: center; position: relative; - overflow: hidden; margin: auto; height: 100%; } @@ -363,6 +362,17 @@ height: 100%; } + .underlay { + position: absolute; + background: var(--spectrum-global-color-gray-200); + z-index: -1; + --offset: 2px; + width: calc(100% - 12px + 2 * var(--offset)); + height: calc(100% - 12px + 2 * var(--offset)); + left: calc(6px - var(--offset)); + top: calc(6px - var(--offset)); + } + .add-component { position: absolute; bottom: 20px; diff --git a/packages/frontend-core/src/components/ClientAppSkeleton.svelte b/packages/frontend-core/src/components/ClientAppSkeleton.svelte index a1c90d2db7..f867fccddb 100644 --- a/packages/frontend-core/src/components/ClientAppSkeleton.svelte +++ b/packages/frontend-core/src/components/ClientAppSkeleton.svelte @@ -58,7 +58,6 @@ height: 100%; display: flex; flex-direction: column; - border-radius: 4px; overflow: hidden; background-color: var(--spectrum-global-color-gray-200); } From 940e2b5a940257bc965eea8808bea5482ecbf1a8 Mon Sep 17 00:00:00 2001 From: Andrew Kingston Date: Wed, 31 Jul 2024 15:53:40 +0100 Subject: [PATCH 017/180] Improve client loading states, skeleton and underlay --- .../[screenId]/_components/AppPreview.svelte | 71 +++++++++---------- 1 file changed, 34 insertions(+), 37 deletions(-) diff --git a/packages/builder/src/pages/builder/app/[application]/design/[screenId]/_components/AppPreview.svelte b/packages/builder/src/pages/builder/app/[application]/design/[screenId]/_components/AppPreview.svelte index a5d14062dc..0e2eb2ceac 100644 --- a/packages/builder/src/pages/builder/app/[application]/design/[screenId]/_components/AppPreview.svelte +++ b/packages/builder/src/pages/builder/app/[application]/design/[screenId]/_components/AppPreview.svelte @@ -246,13 +246,13 @@ -
+
{#if loading} -
+
diff --git a/packages/client/src/components/Screen.svelte b/packages/client/src/components/Screen.svelte index ab1cc7812d..ac0af9f3b2 100644 --- a/packages/client/src/components/Screen.svelte +++ b/packages/client/src/components/Screen.svelte @@ -13,29 +13,10 @@ const onLoadActions = memo() // Get the screen definition for the current route - $: screenDefinition = getScreenDefinition($screenStore.activeScreen) + $: screenDefinition = $screenStore.activeScreen?.props $: onLoadActions.set($screenStore.activeScreen?.onLoad) $: runOnLoadActions($onLoadActions, params) - const getScreenDefinition = activeScreen => { - if (!activeScreen) { - return null - } - - // Enrich screen definition with some builder screen props and styles - return { - ...activeScreen.props, - layout: activeScreen.layout, - _styles: { - ...activeScreen.props._styles, - normal: { - ...activeScreen.props._styles?.normal, - flex: "1 1 auto", - }, - }, - } - } - // Enrich and execute any on load actions. // We manually construct the full context here as this component is the // one that provides the url context, so it is not available in $context yet diff --git a/packages/client/src/components/app/Layout.svelte b/packages/client/src/components/app/Layout.svelte index cc2a086b2e..3fbe3ed20c 100644 --- a/packages/client/src/components/app/Layout.svelte +++ b/packages/client/src/components/app/Layout.svelte @@ -37,7 +37,6 @@ export let openLogoLinkInNewTab export let textAlign export let embedded = false - export let pageLayout = "flex" const NavigationClasses = { Top: "top", @@ -319,7 +318,7 @@ } }} > -
+
@@ -481,7 +480,7 @@ position: relative; padding: 32px; } - .main.layout--grid { + .main:has(> .grid) { padding-top: 0; padding-bottom: 0; } diff --git a/packages/client/src/components/preview/IndicatorSet.svelte b/packages/client/src/components/preview/IndicatorSet.svelte index 6d7918244a..12ee3ad334 100644 --- a/packages/client/src/components/preview/IndicatorSet.svelte +++ b/packages/client/src/components/preview/IndicatorSet.svelte @@ -1,9 +1,10 @@ From 64c182df0f4026faef8de8499ee597accdabb615 Mon Sep 17 00:00:00 2001 From: Andrew Kingston Date: Thu, 1 Aug 2024 12:06:22 +0100 Subject: [PATCH 025/180] Fix indicator positioning in preview --- packages/client/src/components/preview/IndicatorSet.svelte | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/client/src/components/preview/IndicatorSet.svelte b/packages/client/src/components/preview/IndicatorSet.svelte index b2ad873005..464be3bb16 100644 --- a/packages/client/src/components/preview/IndicatorSet.svelte +++ b/packages/client/src/components/preview/IndicatorSet.svelte @@ -1,7 +1,7 @@ diff --git a/packages/client/src/components/preview/SettingsBar.svelte b/packages/client/src/components/preview/SettingsBar.svelte index c8535899af..6b00221f9e 100644 --- a/packages/client/src/components/preview/SettingsBar.svelte +++ b/packages/client/src/components/preview/SettingsBar.svelte @@ -40,7 +40,10 @@ $: isRoot = componentId === $builderStore.screen?.props?._id $: insideGrid = parent?._component.endsWith("/container") && parent.layout === "grid" - $: showGridStyles = insideGrid && definition?.grid?.showControls !== false + $: showGridStyles = + insideGrid && + (definition?.grid?.hAlign !== "stretch" || + definition?.grid?.vAlign !== "stretch") $: gridHAlignVar = $getGridVar("h-align") $: gridVAlignVar = $getGridVar("v-align") $: gridStyles = $state?.styles diff --git a/packages/client/src/utils/grid.js b/packages/client/src/utils/grid.js index d5be908edb..4fa8a3e49b 100644 --- a/packages/client/src/utils/grid.js +++ b/packages/client/src/utils/grid.js @@ -70,23 +70,17 @@ export const getGridParentID = node => { } // Generates the base set of grid CSS vars from a component definition -const alignmentToStyleMap = { - start: "flex-start", - center: "center", - end: "flex-end", - stretch: "stretch", -} export const getBaseGridVars = definition => { const gridHAlign = definition?.grid?.hAlign || "stretch" const gridVAlign = definition?.grid?.vAlign || "center" const flexStyles = gridVAlign === "stretch" ? "1 1 0" : "0 0 auto" return { - ["--grid-desktop-h-align"]: alignmentToStyleMap[gridHAlign], - ["--grid-mobile-h-align"]: alignmentToStyleMap[gridHAlign], - ["--grid-desktop-v-align"]: alignmentToStyleMap[gridVAlign], - ["--grid-mobile-v-align"]: alignmentToStyleMap[gridVAlign], - ["--grid-desktop-child-flex"]: flexStyles, - ["--grid-mobile-child-flex"]: flexStyles, + "--grid-desktop-h-align": gridHAlign, + "--grid-mobile-h-align": gridHAlign, + "--grid-desktop-v-align": gridVAlign, + "--grid-mobile-v-align": gridVAlign, + "--grid-desktop-child-flex": flexStyles, + "--grid-mobile-child-flex": flexStyles, } } From 5cc4002f326a3a3584928486d2b0b8ee9224a3ad Mon Sep 17 00:00:00 2001 From: Andrew Kingston Date: Fri, 2 Aug 2024 09:22:04 +0100 Subject: [PATCH 030/180] Add better support for auto sizing error state components in grid layouts --- packages/client/manifest.json | 4 ++-- packages/client/src/components/Component.svelte | 10 +++++----- packages/client/src/utils/grid.js | 16 ++++++++-------- 3 files changed, 15 insertions(+), 15 deletions(-) diff --git a/packages/client/manifest.json b/packages/client/manifest.json index 9b3939854c..46595279b4 100644 --- a/packages/client/manifest.json +++ b/packages/client/manifest.json @@ -5344,11 +5344,11 @@ "hasChildren": false, "size": { "width": 600, - "height": 400 + "height": 420 }, "grid": { "hAlign": "stretch", - "vAlign": "stretch" + "vAlign": "center" }, "settings": [ { diff --git a/packages/client/src/components/Component.svelte b/packages/client/src/components/Component.svelte index d45b320b35..7aea6ce6b9 100644 --- a/packages/client/src/components/Component.svelte +++ b/packages/client/src/components/Component.svelte @@ -199,7 +199,7 @@ $: darkMode = !currentTheme?.includes("light") // Build up full styles and split them into variables and non-variables - $: baseStyles = getBaseStyles(definition) + $: baseStyles = getBaseStyles(definition, errorState) $: styles = { ...baseStyles, ...instance._styles?.normal, @@ -632,11 +632,11 @@ } // Generates any required base styles based on the component definition - const getBaseStyles = definition => { + const getBaseStyles = (definition, errored = false) => { return { - "--default-width": definition.size?.width || 100, - "--default-height": definition.size?.height || 100, - ...getBaseGridVars(definition), + "--default-width": errored ? 500 : definition.size?.width || 100, + "--default-height": errored ? 60 : definition.size?.height || 100, + ...getBaseGridVars(definition, errored), } } diff --git a/packages/client/src/utils/grid.js b/packages/client/src/utils/grid.js index 4fa8a3e49b..3052199656 100644 --- a/packages/client/src/utils/grid.js +++ b/packages/client/src/utils/grid.js @@ -70,15 +70,15 @@ export const getGridParentID = node => { } // Generates the base set of grid CSS vars from a component definition -export const getBaseGridVars = definition => { - const gridHAlign = definition?.grid?.hAlign || "stretch" - const gridVAlign = definition?.grid?.vAlign || "center" - const flexStyles = gridVAlign === "stretch" ? "1 1 0" : "0 0 auto" +export const getBaseGridVars = (definition, errored = false) => { + const hAlign = errored ? "stretch" : definition?.grid?.hAlign || "stretch" + const vAlign = errored ? "stretch" : definition?.grid?.vAlign || "center" + const flexStyles = vAlign === "stretch" ? "1 1 0" : "0 0 auto" return { - "--grid-desktop-h-align": gridHAlign, - "--grid-mobile-h-align": gridHAlign, - "--grid-desktop-v-align": gridVAlign, - "--grid-mobile-v-align": gridVAlign, + "--grid-desktop-h-align": hAlign, + "--grid-mobile-h-align": hAlign, + "--grid-desktop-v-align": vAlign, + "--grid-mobile-v-align": vAlign, "--grid-desktop-child-flex": flexStyles, "--grid-mobile-child-flex": flexStyles, } From 8dd0658f182f2766e4bf1a575683810ba7f3d51d Mon Sep 17 00:00:00 2001 From: Andrew Kingston Date: Fri, 2 Aug 2024 09:23:47 +0100 Subject: [PATCH 031/180] Fix component autosizing not working on mobile grids --- .../app/container/GridContainer.svelte | 23 ++++++++++++++----- 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/packages/client/src/components/app/container/GridContainer.svelte b/packages/client/src/components/app/container/GridContainer.svelte index 0df7b46f43..2152bdf42f 100644 --- a/packages/client/src/components/app/container/GridContainer.svelte +++ b/packages/client/src/components/app/container/GridContainer.svelte @@ -115,8 +115,7 @@ --grid-desktop-col-end, var( --grid-mobile-col-end, - /* Our final*/ - round(up, calc(var(--default-width) / var(--col-size) + 1)) + round(up, calc(var(--default-width) / var(--col-size) + 1)) ) ); --row-start: var(--grid-desktop-row-start, var(--grid-mobile-row-start, 1)); @@ -128,7 +127,7 @@ ) ); - /* Flex vars */ + /* Flex vars */ --h-align: var(--grid-desktop-h-align, var(--grid-mobile-h-align, stretch)); --v-align: var(--grid-desktop-v-align, var(--grid-mobile-v-align, center)); --child-flex: var( @@ -153,11 +152,23 @@ /* On mobile, use mobile metadata and fall back to desktop */ .grid.mobile :global(> .component) { - /* Position vars */ + /* Position vars */ --col-start: var(--grid-mobile-col-start, var(--grid-desktop-col-start, 1)); - --col-end: var(--grid-mobile-col-end, var(--grid-desktop-col-end, 2)); + --col-end: var( + --grid-mobile-col-end, + var( + --grid-desktop-col-end, + round(up, calc(var(--default-width) / var(--col-size) + 1)) + ) + ); --row-start: var(--grid-mobile-row-start, var(--grid-desktop-row-start, 1)); - --row-end: var(--grid-mobile-row-end, var(--grid-desktop-row-end, 2)); + --row-end: var( + --grid-mobile-row-end, + var( + --grid-desktop-row-end, + round(up, calc(var(--default-height) / var(--row-size) + 1)) + ) + ); /* Flex vars */ --h-align: var(--grid-mobile-h-align, var(--grid-desktop-h-align, stretch)); From 3630c738372f056d692e8082457a1e6eccb9a0c2 Mon Sep 17 00:00:00 2001 From: Andrew Kingston Date: Fri, 2 Aug 2024 09:40:12 +0100 Subject: [PATCH 032/180] Fix flashing of missing component settings panel when deleting components --- .../design/[screenId]/_layout.svelte | 6 +++- .../builder/src/stores/builder/components.js | 29 ++++++++++--------- .../preview/GridStylesButton.svelte | 1 - 3 files changed, 21 insertions(+), 15 deletions(-) diff --git a/packages/builder/src/pages/builder/app/[application]/design/[screenId]/_layout.svelte b/packages/builder/src/pages/builder/app/[application]/design/[screenId]/_layout.svelte index ac87b53db2..c3f3ef71f5 100644 --- a/packages/builder/src/pages/builder/app/[application]/design/[screenId]/_layout.svelte +++ b/packages/builder/src/pages/builder/app/[application]/design/[screenId]/_layout.svelte @@ -2,7 +2,11 @@ import AppPanel from "./_components/AppPanel.svelte" import * as routify from "@roxi/routify" import { syncURLToState } from "helpers/urlStateSync" - import { screenStore, selectedScreen } from "stores/builder" + import { + screenStore, + selectedScreen, + selectedComponent, + } from "stores/builder" import { onDestroy } from "svelte" import LeftPanel from "./_components/LeftPanel.svelte" diff --git a/packages/builder/src/stores/builder/components.js b/packages/builder/src/stores/builder/components.js index c281c73dfe..21ea255b74 100644 --- a/packages/builder/src/stores/builder/components.js +++ b/packages/builder/src/stores/builder/components.js @@ -574,15 +574,26 @@ export class ComponentStore extends BudiStore { return } - // Determine the next component to select after deletion + // Determine the next component to select, and select it before deletion + // to avoid an intermediate state of no component selection const state = get(this.store) - let nextSelectedComponentId + let nextId if (state.selectedComponentId === component._id) { - nextSelectedComponentId = this.getNext() - if (!nextSelectedComponentId) { - nextSelectedComponentId = this.getPrevious() + nextId = this.getNext() + if (!nextId) { + nextId = this.getPrevious() } } + if (nextId) { + // If this is the nav, select the screen instead + if (nextId.endsWith("-navigation")) { + nextId = nextId.replace("-navigation", "-screen") + } + this.update(state => { + state.selectedComponentId = nextId + return state + }) + } // Patch screen await screenStore.patch(screen => { @@ -601,14 +612,6 @@ export class ComponentStore extends BudiStore { child => child._id !== component._id ) }) - - // Update selected component if required - if (nextSelectedComponentId) { - this.update(state => { - state.selectedComponentId = nextSelectedComponentId - return state - }) - } } copy(component, cut = false, selectParent = true) { diff --git a/packages/client/src/components/preview/GridStylesButton.svelte b/packages/client/src/components/preview/GridStylesButton.svelte index 809efd7971..e168754f3b 100644 --- a/packages/client/src/components/preview/GridStylesButton.svelte +++ b/packages/client/src/components/preview/GridStylesButton.svelte @@ -11,7 +11,6 @@ export let componentId $: currentValue = getGridVarValue(gridStyles, style) - $: console.log(style, currentValue, value) $: active = currentValue === value From 2bc4d3a6da66847aa342afec798230e14eb2f680 Mon Sep 17 00:00:00 2001 From: Andrew Kingston Date: Fri, 2 Aug 2024 10:00:49 +0100 Subject: [PATCH 033/180] Improve more component compatibility with grid layouts --- .../app/[application]/design/[screenId]/_layout.svelte | 6 +----- packages/client/manifest.json | 10 +++++++++- packages/client/src/components/app/ButtonGroup.svelte | 5 +++++ 3 files changed, 15 insertions(+), 6 deletions(-) diff --git a/packages/builder/src/pages/builder/app/[application]/design/[screenId]/_layout.svelte b/packages/builder/src/pages/builder/app/[application]/design/[screenId]/_layout.svelte index c3f3ef71f5..ac87b53db2 100644 --- a/packages/builder/src/pages/builder/app/[application]/design/[screenId]/_layout.svelte +++ b/packages/builder/src/pages/builder/app/[application]/design/[screenId]/_layout.svelte @@ -2,11 +2,7 @@ import AppPanel from "./_components/AppPanel.svelte" import * as routify from "@roxi/routify" import { syncURLToState } from "helpers/urlStateSync" - import { - screenStore, - selectedScreen, - selectedComponent, - } from "stores/builder" + import { screenStore, selectedScreen } from "stores/builder" import { onDestroy } from "svelte" import LeftPanel from "./_components/LeftPanel.svelte" diff --git a/packages/client/manifest.json b/packages/client/manifest.json index 46595279b4..f61ed7d1bc 100644 --- a/packages/client/manifest.json +++ b/packages/client/manifest.json @@ -388,6 +388,14 @@ "name": "Button group", "icon": "Button", "hasChildren": false, + "size": { + "width": 200, + "height": 60 + }, + "grid": { + "hAlign": "stretch", + "vAlign": "stretch" + }, "settings": [ { "section": true, @@ -570,7 +578,7 @@ "icon": "Button", "editable": true, "size": { - "width": 105, + "width": 120, "height": 32 }, "grid": { diff --git a/packages/client/src/components/app/ButtonGroup.svelte b/packages/client/src/components/app/ButtonGroup.svelte index 2cf6b3db7d..b3523cdd21 100644 --- a/packages/client/src/components/app/ButtonGroup.svelte +++ b/packages/client/src/components/app/ButtonGroup.svelte @@ -19,6 +19,11 @@ gap, wrap: true, }} + styles={{ + normal: { + height: "100%", + }, + }} > {#each buttons as { text, type, quiet, disabled, onClick, size, icon, gap }} Date: Fri, 2 Aug 2024 10:35:35 +0100 Subject: [PATCH 034/180] Fix tag component being totally broken --- packages/bbui/package.json | 1 + packages/client/manifest.json | 4 + packages/client/src/components/app/Tag.svelte | 3 + yarn.lock | 228 ++++++++++++++++-- 4 files changed, 215 insertions(+), 21 deletions(-) diff --git a/packages/bbui/package.json b/packages/bbui/package.json index 1b3510cf3b..0830f8ab6f 100644 --- a/packages/bbui/package.json +++ b/packages/bbui/package.json @@ -72,6 +72,7 @@ "@spectrum-css/switch": "1.0.2", "@spectrum-css/table": "3.0.1", "@spectrum-css/tabs": "3.2.12", + "@spectrum-css/tag": "3.0.0", "@spectrum-css/tags": "3.0.2", "@spectrum-css/textfield": "3.0.1", "@spectrum-css/toast": "3.0.1", diff --git a/packages/client/manifest.json b/packages/client/manifest.json index f61ed7d1bc..533da51f22 100644 --- a/packages/client/manifest.json +++ b/packages/client/manifest.json @@ -1245,6 +1245,10 @@ "width": 100, "height": 25 }, + "grid": { + "hAlign": "center", + "vAlign": "center" + }, "settings": [ { "type": "text", diff --git a/packages/client/src/components/app/Tag.svelte b/packages/client/src/components/app/Tag.svelte index 4644161506..f7d071ac79 100644 --- a/packages/client/src/components/app/Tag.svelte +++ b/packages/client/src/components/app/Tag.svelte @@ -57,4 +57,7 @@ .spectrum-Tag--sizeL { padding: 0 var(--spectrum-global-dimension-size-150); } + .spectrum-Tag-label { + height: auto; + } diff --git a/yarn.lock b/yarn.lock index 2d69b37cc6..f04ff376c3 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5067,6 +5067,11 @@ resolved "https://registry.yarnpkg.com/@spectrum-css/tabs/-/tabs-3.2.12.tgz#9b08f23d5aa881b3441af7757800c7173e5685ff" integrity sha512-rPFUW9SSW4+3/UJ3UrtY2/l3sQvlqB1fqxHLPDjgykvbfrnMejcCTNV4ZrFNHXpE/6+kGnk+yVViSPtWGwJzkA== +"@spectrum-css/tag@3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@spectrum-css/tag/-/tag-3.0.0.tgz#b2e335dc526713b83f3e995e8d1d4fc84a3fc4df" + integrity sha512-a9z7ZTAWPonkWRNY5kxVaO6bxu9de3qUZWJ9Bl1YBlwWc8Fy1L7XqT4Wq3pW+4sktUbUUqqPYPIXK9xEFDofEw== + "@spectrum-css/tags@3.0.2": version "3.0.2" resolved "https://registry.yarnpkg.com/@spectrum-css/tags/-/tags-3.0.2.tgz#5bf35fb79c97cd9344de485bd4626ad5b9f07757" @@ -6707,22 +6712,39 @@ acorn-import-assertions@^1.9.0: resolved "https://registry.yarnpkg.com/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz#507276249d684797c84e0734ef84860334cfb1ac" integrity sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA== -acorn-jsx@^5.3.2: +acorn-jsx-walk@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/acorn-jsx-walk/-/acorn-jsx-walk-2.0.0.tgz#a5ed648264e68282d7c2aead80216bfdf232573a" + integrity sha512-uuo6iJj4D4ygkdzd6jPtcxs8vZgDX9YFIkqczGImoypX2fQ4dVImmu3UzA4ynixCIMTrEOWW+95M2HuBaCEOVA== + +acorn-jsx@5.3.2, acorn-jsx@^5.3.2: version "5.3.2" resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== +acorn-loose@8.4.0: + version "8.4.0" + resolved "https://registry.yarnpkg.com/acorn-loose/-/acorn-loose-8.4.0.tgz#26d3e219756d1e180d006f5bcc8d261a28530f55" + integrity sha512-M0EUka6rb+QC4l9Z3T0nJEzNOO7JcoJlYMrBlyBCiFSXRyxjLKayd4TbQs2FDRWQU1h9FR7QVNHt+PEaoNL5rQ== + dependencies: + acorn "^8.11.0" + +acorn-walk@8.3.3, acorn-walk@^8.0.2, acorn-walk@^8.1.1, acorn-walk@^8.2.0, acorn-walk@^8.3.2: + version "8.3.3" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.3.3.tgz#9caeac29eefaa0c41e3d4c65137de4d6f34df43e" + integrity sha512-MxXdReSRhGO7VlFe1bRG/oI7/mdLV9B9JJT0N8vZOhF7gFRR5l3M8W9G8JxmKV+JC5mGqJ0QvqfSOLsCPa4nUw== + dependencies: + acorn "^8.11.0" + acorn-walk@^7.1.1: version "7.2.0" resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.2.0.tgz#0de889a601203909b0fbe07b8938dc21d2e967bc" integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA== -acorn-walk@^8.0.2, acorn-walk@^8.1.1, acorn-walk@^8.2.0, acorn-walk@^8.3.2: - version "8.3.3" - resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.3.3.tgz#9caeac29eefaa0c41e3d4c65137de4d6f34df43e" - integrity sha512-MxXdReSRhGO7VlFe1bRG/oI7/mdLV9B9JJT0N8vZOhF7gFRR5l3M8W9G8JxmKV+JC5mGqJ0QvqfSOLsCPa4nUw== - dependencies: - acorn "^8.11.0" +acorn@8.12.1: + version "8.12.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.12.1.tgz#71616bdccbe25e27a54439e0046e89ca76df2248" + integrity sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg== acorn@^5.2.1, acorn@^5.7.3: version "5.7.4" @@ -6791,6 +6813,16 @@ ajv-formats@^2.0.2: dependencies: ajv "^8.0.0" +ajv@8.17.1: + version "8.17.1" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.17.1.tgz#37d9a5c776af6bc92d7f4f9510eba4c0a60d11a6" + integrity sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g== + dependencies: + fast-deep-equal "^3.1.3" + fast-uri "^3.0.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + ajv@^6.12.3, ajv@^6.12.4: version "6.12.6" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" @@ -8484,6 +8516,11 @@ combos@^0.2.0: resolved "https://registry.yarnpkg.com/combos/-/combos-0.2.0.tgz#dc31c5a899b42293d55fe19c064d3e6e207ba4f7" integrity sha512-Z6YfvgiTCERWJTj3wQiXamFhssdvz1n4ok447rS330lw3uL72WAx8IvrLU7xiE71uyb5WF8JEP+BWB5KhOoGeg== +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@6.2.0: version "6.2.0" resolved "https://registry.yarnpkg.com/commander/-/commander-6.2.0.tgz#b990bfb8ac030aedc6d11bc04d1488ffef56db75" @@ -9551,6 +9588,34 @@ depd@^1.1.0, depd@~1.1.2: resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" integrity sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ== +dependency-cruiser@^16.3.7: + version "16.3.10" + resolved "https://registry.yarnpkg.com/dependency-cruiser/-/dependency-cruiser-16.3.10.tgz#fe26a50d5e10a4496bc2b70d027fca6ded48814f" + integrity sha512-WkCnibHBfvaiaQ+S46LZ6h4AR6oj42Vsf5/0Vgtrwdwn7ZekMJdZ/ALoTwNp/RaGlKW+MbV/fhSZOvmhAWVWzQ== + dependencies: + acorn "8.12.1" + acorn-jsx "5.3.2" + acorn-jsx-walk "2.0.0" + acorn-loose "8.4.0" + acorn-walk "8.3.3" + ajv "8.17.1" + commander "12.1.0" + enhanced-resolve "5.17.1" + ignore "5.3.1" + interpret "^3.1.1" + is-installed-globally "1.0.0" + json5 "2.2.3" + memoize "10.0.0" + picocolors "1.0.1" + picomatch "4.0.2" + prompts "2.4.2" + rechoir "^0.8.0" + safe-regex "2.1.1" + semver "^7.6.3" + teamcity-service-messages "0.1.14" + tsconfig-paths-webpack-plugin "4.1.0" + watskeburt "4.1.0" + dependency-tree@^9.0.0: version "9.0.0" resolved "https://registry.yarnpkg.com/dependency-tree/-/dependency-tree-9.0.0.tgz#9288dd6daf35f6510c1ea30d9894b75369aa50a2" @@ -10221,6 +10286,14 @@ engine.io@~6.5.2: engine.io-parser "~5.2.1" ws "~8.17.1" +enhanced-resolve@5.17.1, enhanced-resolve@^5.7.0: + version "5.17.1" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz#67bfbbcc2f81d511be77d686a90267ef7f898a15" + integrity sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg== + dependencies: + graceful-fs "^4.2.4" + tapable "^2.2.0" + enhanced-resolve@^5.8.3: version "5.14.1" resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.14.1.tgz#de684b6803724477a4af5d74ccae5de52c25f6b3" @@ -11016,6 +11089,11 @@ fast-text-encoding@^1.0.0: resolved "https://registry.yarnpkg.com/fast-text-encoding/-/fast-text-encoding-1.0.6.tgz#0aa25f7f638222e3396d72bf936afcf1d42d6867" integrity sha512-VhXlQgj9ioXCqGstD37E/HBeqEGV/qOD/kmbVG8h5xKBYvM1L3lR1Zn4555cQ8GkYbJa8aJSipLPndE1k6zK2w== +fast-uri@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/fast-uri/-/fast-uri-3.0.1.tgz#cddd2eecfc83a71c1be2cc2ef2061331be8a7134" + integrity sha512-MWipKbbYiYI0UC7cl8m/i/IWTqfC8YXsqjzybjddLsFjStroQzsHXkc73JutMvBiXmOvapk+axIl79ig5t55Bw== + fast-url-parser@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/fast-url-parser/-/fast-url-parser-1.1.3.tgz#f4af3ea9f34d8a271cf58ad2b3759f431f0b318d" @@ -11877,6 +11955,13 @@ global-agent@3.0.0: semver "^7.3.2" serialize-error "^7.0.1" +global-directory@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/global-directory/-/global-directory-4.0.1.tgz#4d7ac7cfd2cb73f304c53b8810891748df5e361e" + integrity sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q== + dependencies: + ini "4.1.1" + global-dirs@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-3.0.1.tgz#0c488971f066baceda21447aecb1a8b911d22485" @@ -12541,6 +12626,11 @@ ignore-walk@^6.0.0: dependencies: minimatch "^7.4.2" +ignore@5.3.1: + version "5.3.1" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.1.tgz#5073e554cd42c5b33b394375f538b8593e34d4ef" + integrity sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw== + ignore@^5.0.4, ignore@^5.2.0, ignore@^5.2.4: version "5.3.0" resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.0.tgz#67418ae40d34d6999c95ff56016759c718c82f78" @@ -12666,6 +12756,11 @@ ini@2.0.0: resolved "https://registry.yarnpkg.com/ini/-/ini-2.0.0.tgz#e5fd556ecdd5726be978fa1001862eacb0a94bc5" integrity sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA== +ini@4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/ini/-/ini-4.1.1.tgz#d95b3d843b1e906e56d6747d5447904ff50ce7a1" + integrity sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g== + ini@^1.3.2, ini@^1.3.4, ini@^1.3.8, ini@~1.3.0: version "1.3.8" resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" @@ -12743,6 +12838,11 @@ interpret@^2.2.0: resolved "https://registry.yarnpkg.com/interpret/-/interpret-2.2.0.tgz#1a78a0b5965c40a5416d007ad6f50ad27c417df9" integrity sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw== +interpret@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/interpret/-/interpret-3.1.1.tgz#5be0ceed67ca79c6c4bc5cf0d7ee843dcea110c4" + integrity sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ== + into-stream@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/into-stream/-/into-stream-3.1.0.tgz#96fb0a936c12babd6ff1752a17d05616abd094c6" @@ -12973,6 +13073,14 @@ is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: dependencies: is-extglob "^2.1.1" +is-installed-globally@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-1.0.0.tgz#08952c43758c33d815692392f7f8437b9e436d5a" + integrity sha512-K55T22lfpQ63N4KEN57jZUAaAYqYHEe8veb/TycJRk9DdSCLLcovXz/mL6mOnhQaZsQGwPhuFopdQIlqGSEjiQ== + dependencies: + global-directory "^4.0.1" + is-path-inside "^4.0.0" + is-installed-globally@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-0.4.0.tgz#9a0fd407949c30f86eb6959ef1b7994ed0b7b520" @@ -13060,6 +13168,11 @@ is-path-inside@^3.0.2, is-path-inside@^3.0.3: resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== +is-path-inside@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-4.0.0.tgz#805aeb62c47c1b12fc3fd13bfb3ed1e7430071db" + integrity sha512-lJJV/5dYS+RcL8uQdBDW9c9uWFLLBNRyFhnAKXw5tVqLlKZ4RMGZKv+YQ/IA3OhD+RpbJa1LLFM1FQPGyIXvOA== + is-plain-obj@^1.0.0, is-plain-obj@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" @@ -14084,6 +14197,11 @@ json-stringify-safe@^5.0.1, json-stringify-safe@~5.0.1: resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" integrity sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA== +json5@2.2.3, json5@^2.2.1, json5@^2.2.2, json5@^2.2.3: + version "2.2.3" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" + integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== + json5@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.2.tgz#63d98d60f21b313b77c4d6da18bfa69d80e1d593" @@ -14091,11 +14209,6 @@ json5@^1.0.2: dependencies: minimist "^1.2.0" -json5@^2.2.1, json5@^2.2.2, json5@^2.2.3: - version "2.2.3" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" - integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== - jsonc-parser@3.2.0, jsonc-parser@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/jsonc-parser/-/jsonc-parser-3.2.0.tgz#31ff3f4c2b9793f89c67212627c51c6394f88e76" @@ -15441,6 +15554,13 @@ memdown@^5.1.0: ltgt "~2.2.0" safe-buffer "~5.2.0" +memoize@10.0.0: + version "10.0.0" + resolved "https://registry.yarnpkg.com/memoize/-/memoize-10.0.0.tgz#43fa66b2022363c7c50cf5dfab732a808a3d7147" + integrity sha512-H6cBLgsi6vMWOcCpvVCdFFnl3kerEXbrYh9q+lY6VXvQSmM6CkmV08VOwT+WE2tzIEqRPFfAq3fm4v/UIW6mSA== + dependencies: + mimic-function "^5.0.0" + memory-pager@^1.0.2: version "1.5.0" resolved "https://registry.yarnpkg.com/memory-pager/-/memory-pager-1.5.0.tgz#d8751655d22d384682741c972f2c3d6dfa3e66b5" @@ -15549,6 +15669,11 @@ mimic-fn@^4.0.0: resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-4.0.0.tgz#60a90550d5cb0b239cca65d893b1a53b29871ecc" integrity sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw== +mimic-function@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/mimic-function/-/mimic-function-5.0.1.tgz#acbe2b3349f99b9deaca7fb70e48b83e94e67076" + integrity sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA== + mimic-response@^1.0.0, mimic-response@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b" @@ -17412,15 +17537,20 @@ phin@^2.9.1: resolved "https://registry.yarnpkg.com/phin/-/phin-2.9.3.tgz#f9b6ac10a035636fb65dfc576aaaa17b8743125c" integrity sha512-CzFr90qM24ju5f88quFC/6qohjC144rehe5n6DH900lgXmUe86+xCKc10ev56gRKC4/BkHUoG4uSiQgBiIXwDA== +picocolors@1.0.1, picocolors@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.1.tgz#a8ad579b571952f0e5d25892de5445bcfe25aaa1" + integrity sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew== + picocolors@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== -picocolors@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.1.tgz#a8ad579b571952f0e5d25892de5445bcfe25aaa1" - integrity sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew== +picomatch@4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-4.0.2.tgz#77c742931e8f3b8820946c76cd0c1f13730d1dab" + integrity sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg== picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.2, picomatch@^2.2.3, picomatch@^2.3.1: version "2.3.1" @@ -18385,7 +18515,7 @@ promise.series@^0.2.0: resolved "https://registry.yarnpkg.com/promise.series/-/promise.series-0.2.0.tgz#2cc7ebe959fc3a6619c04ab4dbdc9e452d864bbd" integrity sha512-VWQJyU2bcDTgZw8kpfBpB/ejZASlCrzwz5f2hjb/zlujOEB4oeiAhHygAWq8ubsX2GVkD4kCU5V2dwOTaCY5EQ== -prompts@^2.0.1: +prompts@2.4.2, prompts@^2.0.1: version "2.4.2" resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.2.tgz#7b57e73b3a48029ad10ebd44f74b01722a4cb069" integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q== @@ -18952,6 +19082,11 @@ regenerator-transform@^0.15.1: dependencies: "@babel/runtime" "^7.8.4" +regexp-tree@~0.1.1: + version "0.1.27" + resolved "https://registry.yarnpkg.com/regexp-tree/-/regexp-tree-0.1.27.tgz#2198f0ef54518ffa743fe74d983b56ffd631b6cd" + integrity sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA== + regexp.prototype.flags@^1.4.3, regexp.prototype.flags@^1.5.2: version "1.5.2" resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz#138f644a3350f981a858c44f6bb1a61ff59be334" @@ -19492,6 +19627,13 @@ safe-regex-test@^1.0.3: es-errors "^1.3.0" is-regex "^1.1.4" +safe-regex@2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-2.1.1.tgz#f7128f00d056e2fe5c11e81a1324dd974aadced2" + integrity sha512-rx+x8AMzKb5Q5lQ95Zoi6ZbJqwCLkqi3XuJXp5P3rT8OEc6sZCJG5AE5dU3lsgRr/F4Bs31jSlVN+j5KrsGu9A== + dependencies: + regexp-tree "~0.1.1" + safe-stable-stringify@^2.1.0, safe-stable-stringify@^2.3.1: version "2.4.3" resolved "https://registry.yarnpkg.com/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz#138c84b6f6edb3db5f8ef3ef7115b8f55ccbf886" @@ -19603,7 +19745,7 @@ semver-diff@^3.1.1: dependencies: semver "^6.3.0" -"semver@2 || 3 || 4 || 5", semver@7.5.3, semver@^5.5.0, semver@^5.6.0, semver@^5.7.1, semver@^6.0.0, semver@^6.1.1, semver@^6.1.2, semver@^6.2.0, semver@^6.3.0, semver@^6.3.1, semver@^7.0.0, semver@^7.1.1, semver@^7.3.2, semver@^7.3.4, semver@^7.3.5, semver@^7.3.7, semver@^7.3.8, semver@^7.5.3, semver@^7.5.4, semver@~2.3.1: +"semver@2 || 3 || 4 || 5", semver@7.5.3, semver@^5.5.0, semver@^5.6.0, semver@^5.7.1, semver@^6.0.0, semver@^6.1.1, semver@^6.1.2, semver@^6.2.0, semver@^6.3.0, semver@^6.3.1, semver@^7.0.0, semver@^7.1.1, semver@^7.3.2, semver@^7.3.4, semver@^7.3.5, semver@^7.3.7, semver@^7.3.8, semver@^7.5.3, semver@^7.5.4, semver@^7.6.3, semver@~2.3.1: version "7.5.3" resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.3.tgz#161ce8c2c6b4b3bdca6caadc9fa3317a4c4fe88e" integrity sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ== @@ -20287,7 +20429,16 @@ string-similarity@^4.0.4: resolved "https://registry.yarnpkg.com/string-similarity/-/string-similarity-4.0.4.tgz#42d01ab0b34660ea8a018da8f56a3309bb8b2a5b" integrity sha512-/q/8Q4Bl4ZKAPjj8WerIBJWALKkaPRfrvhfF8k/B23i4nzrlRj2/go1m90In7nG/3XDSbOo0+pu6RvCTM9RGMQ== -"string-width-cjs@npm:string-width@^4.2.0", "string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.2, string-width@^4.2.3: +"string-width-cjs@npm:string-width@^4.2.0": + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +"string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.2, string-width@^4.2.3: version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -20378,7 +20529,7 @@ stringify-object@^3.2.1: is-obj "^1.0.1" is-regexp "^1.0.0" -"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1: +"strip-ansi-cjs@npm:strip-ansi@^6.0.1": version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== @@ -20392,6 +20543,13 @@ strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: dependencies: ansi-regex "^4.1.0" +strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + strip-ansi@^7.0.1: version "7.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.0.1.tgz#61740a08ce36b61e50e65653f07060d000975fb2" @@ -20867,6 +21025,11 @@ tarn@^3.0.1, tarn@^3.0.2: resolved "https://registry.yarnpkg.com/tarn/-/tarn-3.0.2.tgz#73b6140fbb881b71559c4f8bfde3d9a4b3d27693" integrity sha512-51LAVKUSZSVfI05vjPESNc5vwqqZpbXCsU+/+wxlOrUjk2SnFTt97v9ZgQrD4YmxYW1Px6w2KjaDitCfkvgxMQ== +teamcity-service-messages@0.1.14: + version "0.1.14" + resolved "https://registry.yarnpkg.com/teamcity-service-messages/-/teamcity-service-messages-0.1.14.tgz#193d420a5e4aef8e5e50b8c39e7865e08fbb5d8a" + integrity sha512-29aQwaHqm8RMX74u2o/h1KbMLP89FjNiMxD9wbF2BbWOnbM+q+d1sCEC+MqCc4QW3NJykn77OMpTFw/xTHIc0w== + tedious@^16.4.0: version "16.7.1" resolved "https://registry.yarnpkg.com/tedious/-/tedious-16.7.1.tgz#1190f30fd99a413f1dc9250dee4835cf0788b650" @@ -21258,6 +21421,15 @@ ts-node@10.8.1: v8-compile-cache-lib "^3.0.1" yn "3.1.1" +tsconfig-paths-webpack-plugin@4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/tsconfig-paths-webpack-plugin/-/tsconfig-paths-webpack-plugin-4.1.0.tgz#3c6892c5e7319c146eee1e7302ed9e6f2be4f763" + integrity sha512-xWFISjviPydmtmgeUAuXp4N1fky+VCtfhOkDUFIv5ea7p4wuTomI4QTrXvFBX2S4jZsmyTSrStQl+E+4w+RzxA== + dependencies: + chalk "^4.1.0" + enhanced-resolve "^5.7.0" + tsconfig-paths "^4.1.2" + tsconfig-paths@4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-4.0.0.tgz#1082f5d99fd127b72397eef4809e4dd06d229b64" @@ -22037,6 +22209,11 @@ walker@^1.0.8: dependencies: makeerror "1.0.12" +watskeburt@4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/watskeburt/-/watskeburt-4.1.0.tgz#3c0227669be646a97424b631164b1afe3d4d5344" + integrity sha512-KkY5H51ajqy9HYYI+u9SIURcWnqeVVhdH0I+ab6aXPGHfZYxgRCwnR6Lm3+TYB6jJVt5jFqw4GAKmwf1zHmGQw== + wcwidth@^1.0.0, wcwidth@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8" @@ -22282,7 +22459,7 @@ worker-farm@1.7.0: dependencies: errno "~0.1.7" -"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0: +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== @@ -22300,6 +22477,15 @@ wrap-ansi@^5.1.0: string-width "^3.0.0" strip-ansi "^5.0.0" +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + wrap-ansi@^8.1.0: version "8.1.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" From 0ba00a5117b67719d979894a7ba0bf265c0d3a7d Mon Sep 17 00:00:00 2001 From: Andrew Kingston Date: Fri, 2 Aug 2024 16:13:49 +0100 Subject: [PATCH 035/180] Move most grid specific logic into a dedicated file to avoid polluting rest of the codebase --- .../_components/Screen/GeneralPanel.svelte | 4 +- packages/client/manifest.json | 16 +++ .../client/src/components/ClientApp.svelte | 6 +- .../client/src/components/Component.svelte | 51 ++------ .../client/src/components/app/Layout.svelte | 2 +- .../app/container/GridContainer.svelte | 36 ++---- .../components/preview/GridDNDHandler.svelte | 15 ++- .../src/components/preview/SettingsBar.svelte | 6 +- packages/client/src/utils/grid.js | 122 ++++++++++++++---- 9 files changed, 160 insertions(+), 98 deletions(-) diff --git a/packages/builder/src/pages/builder/app/[application]/design/[screenId]/[componentId]/_components/Screen/GeneralPanel.svelte b/packages/builder/src/pages/builder/app/[application]/design/[screenId]/[componentId]/_components/Screen/GeneralPanel.svelte index 00032cb23a..2a5211a253 100644 --- a/packages/builder/src/pages/builder/app/[application]/design/[screenId]/[componentId]/_components/Screen/GeneralPanel.svelte +++ b/packages/builder/src/pages/builder/app/[application]/design/[screenId]/[componentId]/_components/Screen/GeneralPanel.svelte @@ -103,7 +103,7 @@ key: "props.cols", label: "Columns", control: Stepper, - defaultValue: 12, + defaultValue: 24, props: { min: 2, max: 50, @@ -113,7 +113,7 @@ key: "props.rows", label: "Rows", control: Stepper, - defaultValue: 12, + defaultValue: 24, props: { min: 2, max: 50, diff --git a/packages/client/manifest.json b/packages/client/manifest.json index 533da51f22..10503f30ac 100644 --- a/packages/client/manifest.json +++ b/packages/client/manifest.json @@ -1391,6 +1391,10 @@ "width": 25, "height": 25 }, + "grid": { + "hAlign": "center", + "vAlign": "center" + }, "settings": [ { "type": "icon", @@ -1704,6 +1708,10 @@ "width": 260, "height": 143 }, + "grid": { + "hAlign": "center", + "vAlign": "center" + }, "settings": [ { "type": "text", @@ -1737,6 +1745,10 @@ "width": 400, "height": 100 }, + "grid": { + "hAlign": "stretch", + "vAlign": "stretch" + }, "settings": [ { "type": "text", @@ -5240,6 +5252,10 @@ "width": 300, "height": 120 }, + "grid": { + "hAlign": "center", + "vAlign": "center" + }, "settings": [ { "type": "text", diff --git a/packages/client/src/components/ClientApp.svelte b/packages/client/src/components/ClientApp.svelte index d0369192a0..118aa483ab 100644 --- a/packages/client/src/components/ClientApp.svelte +++ b/packages/client/src/components/ClientApp.svelte @@ -284,7 +284,7 @@ visibility: hidden; padding: 0; margin: 0; - overflow: hidden; + overflow: clip; width: 100%; display: flex; flex-direction: row; @@ -301,7 +301,7 @@ width: 100%; height: 100%; position: relative; - overflow: hidden; + overflow: clip; background-color: transparent; } @@ -311,7 +311,7 @@ } #app-root { - overflow: hidden; + overflow: clip; height: 100%; width: 100%; display: flex; diff --git a/packages/client/src/components/Component.svelte b/packages/client/src/components/Component.svelte index 7aea6ce6b9..6e184bde7e 100644 --- a/packages/client/src/components/Component.svelte +++ b/packages/client/src/components/Component.svelte @@ -39,8 +39,7 @@ getActionContextKey, getActionDependentContextKeys, } from "../utils/buttonActions.js" - import { buildStyleString } from "utils/styleable.js" - import { getBaseGridVars } from "utils/grid.js" + import { gridLayout } from "utils/grid.js" export let instance = {} export let isLayout = false @@ -198,15 +197,18 @@ $: currentTheme = $context?.device?.theme $: darkMode = !currentTheme?.includes("light") - // Build up full styles and split them into variables and non-variables - $: baseStyles = getBaseStyles(definition, errorState) - $: styles = { - ...baseStyles, + $: normalStyles = { ...instance._styles?.normal, ...ephemeralStyles, } - $: parsedStyles = parseStyles(styles) - $: wrapperCSS = buildStyleString(parsedStyles.variables) + $: gridMetadata = { + id, + interactive, + styles: normalStyles, + draggable, + definition, + errored: errorState, + } // Update component context $: store.set({ @@ -214,8 +216,7 @@ children: children.length, styles: { ...instance._styles, - normal: parsedStyles.nonVariables, - variables: parsedStyles.variables, + normal: normalStyles, custom: customCSS, id, empty: emptyState, @@ -615,31 +616,6 @@ } } - const handleWrapperClick = e => { - e.stopPropagation() - builderStore.actions.selectComponent(id) - } - - // Splits component styles into variables and non-variables - const parseStyles = styles => { - let variables = {} - let nonVariables = {} - for (let style of Object.keys(styles || {})) { - const group = style.startsWith("--") ? variables : nonVariables - group[style] = styles[style] - } - return { variables, nonVariables } - } - - // Generates any required base styles based on the component definition - const getBaseStyles = (definition, errored = false) => { - return { - "--default-width": errored ? 500 : definition.size?.width || 100, - "--default-height": errored ? 60 : definition.size?.height || 100, - ...getBaseGridVars(definition, errored), - } - } - onMount(() => { // Register this component instance for external access if ($appStore.isDevApp) { @@ -683,14 +659,11 @@ class:parent={hasChildren} class:block={isBlock} class:error={errorState} - class:fill={definition.grid?.fill} data-id={id} data-name={name} data-icon={icon} data-parent={$component.id} - style={wrapperCSS} - {draggable} - on:click|self={interactive ? handleWrapperClick : null} + use:gridLayout={gridMetadata} > {#if errorState} .grid) { + .main:has(.screenslot-dom > .component > .grid) { padding-top: 0; padding-bottom: 0; } diff --git a/packages/client/src/components/app/container/GridContainer.svelte b/packages/client/src/components/app/container/GridContainer.svelte index 2152bdf42f..b16fc88dbf 100644 --- a/packages/client/src/components/app/container/GridContainer.svelte +++ b/packages/client/src/components/app/container/GridContainer.svelte @@ -68,16 +68,6 @@ position: relative; height: 400px; gap: 0; - - /* Prevent cross-grid variable inheritance */ - /* --grid-desktop-col-start: initial; - --grid-desktop-col-end: initial; - --grid-desktop-row-start: initial; - --grid-desktop-row-end: initial; - --grid-mobile-col-start: initial; - --grid-mobile-col-end: initial; - --grid-mobile-row-start: initial; - --grid-mobile-row-end: initial;*/ } .grid, .underlay { @@ -128,12 +118,8 @@ ); /* Flex vars */ - --h-align: var(--grid-desktop-h-align, var(--grid-mobile-h-align, stretch)); - --v-align: var(--grid-desktop-v-align, var(--grid-mobile-v-align, center)); - --child-flex: var( - --grid-desktop-child-flex, - var(--grid-mobile-child-flex, 0 0 auto) - ); + --h-align: var(--grid-desktop-h-align, var(--grid-mobile-h-align)); + --v-align: var(--grid-desktop-v-align, var(--grid-mobile-v-align)); /* Ensure grid metadata falls within limits */ grid-column-start: min(max(1, var(--col-start)), var(--cols)) !important; @@ -171,16 +157,20 @@ ); /* Flex vars */ - --h-align: var(--grid-mobile-h-align, var(--grid-desktop-h-align, stretch)); - --v-align: var(--grid-mobile-v-align, var(--grid-desktop-v-align, center)); - --child-flex: var( - --grid-mobile-child-flex, - var(--grid-desktop-child-flex, 0 0 auto) - ); + --h-align: var(--grid-mobile-h-align, var(--grid-desktop-h-align)); + --v-align: var(--grid-mobile-v-align, var(--grid-desktop-v-align)); } /* Handle grid children which need to fill the outer component wrapper */ .grid :global(> .component > *) { - flex: var(--child-flex) !important; + flex: 0 0 auto !important; + } + .grid:not(.mobile) :global(> .component.grid-desktop-grow > *) { + flex: 1 1 0 !important; + height: 0 !important; + } + .grid.mobile :global(> .component.grid-mobile-grow > *) { + flex: 1 1 0 !important; + height: 0 !important; } diff --git a/packages/client/src/components/preview/GridDNDHandler.svelte b/packages/client/src/components/preview/GridDNDHandler.svelte index 7e2cbd50c8..12631b980a 100644 --- a/packages/client/src/components/preview/GridDNDHandler.svelte +++ b/packages/client/src/components/preview/GridDNDHandler.svelte @@ -2,7 +2,12 @@ import { onMount, onDestroy } from "svelte" import { builderStore, componentStore } from "stores" import { Utils, memo } from "@budibase/frontend-core" - import { isGridEvent, getGridParentID, getGridVar } from "utils/grid" + import { + isGridEvent, + getGridParentID, + gridCSSVars, + GridVars, + } from "utils/grid" // Smallest possible 1x1 transparent GIF const ghost = new Image(1, 1) @@ -15,10 +20,10 @@ // Grid CSS variables $: vars = { - colStart: $getGridVar("col-start"), - colEnd: $getGridVar("col-end"), - rowStart: $getGridVar("row-start"), - rowEnd: $getGridVar("row-end"), + colStart: $gridCSSVars[GridVars.ColStart], + colEnd: $gridCSSVars[GridVars.ColEnd], + rowStart: $gridCSSVars[GridVars.RowStart], + rowEnd: $gridCSSVars[GridVars.RowEnd], } // Some memoisation of primitive types for performance diff --git a/packages/client/src/components/preview/SettingsBar.svelte b/packages/client/src/components/preview/SettingsBar.svelte index 6b00221f9e..cd11529cfa 100644 --- a/packages/client/src/components/preview/SettingsBar.svelte +++ b/packages/client/src/components/preview/SettingsBar.svelte @@ -7,7 +7,7 @@ import { builderStore, componentStore, dndIsDragging } from "stores" import { Utils } from "@budibase/frontend-core" import { findComponentParent } from "utils/components" - import { getGridVar } from "utils/grid" + import { gridCSSVars, GridVars } from "utils/grid" const verticalOffset = 36 const horizontalOffset = 2 @@ -44,8 +44,8 @@ insideGrid && (definition?.grid?.hAlign !== "stretch" || definition?.grid?.vAlign !== "stretch") - $: gridHAlignVar = $getGridVar("h-align") - $: gridVAlignVar = $getGridVar("v-align") + $: gridHAlignVar = $gridCSSVars[GridVars.HAlign] + $: gridVAlignVar = $gridCSSVars[GridVars.VAlign] $: gridStyles = $state?.styles const getBarSettings = definition => { diff --git a/packages/client/src/utils/grid.js b/packages/client/src/utils/grid.js index 3052199656..d3b16aeafd 100644 --- a/packages/client/src/utils/grid.js +++ b/packages/client/src/utils/grid.js @@ -1,5 +1,6 @@ -import { builderStore, componentStore } from "stores" -import { derived, get, readable } from "svelte/store" +import { builderStore } from "stores" +import { derived } from "svelte/store" +import { buildStyleString } from "utils/styleable.js" /** * We use CSS variables on components to control positioning and layout of @@ -12,20 +13,42 @@ import { derived, get, readable } from "svelte/store" * `grid.hAlign` and `grid.vAlign` keys in the manifest. */ +// Enum representing the different CSS variables we use for grid metadata +export const GridVars = { + HAlign: "h-align", + VAlign: "v-align", + ColStart: "col-start", + ColEnd: "col-end", + RowStart: "row-start", + RowEnd: "row-end", +} + +// Classes used in selectors inside grid containers to control child styles +export const GridClasses = { + DesktopFill: "grid-desktop-grow", + MobileFill: "grid-mobile-grow", +} + // Enum for device preview type, included in grid CSS variables const Devices = { Desktop: "desktop", Mobile: "mobile", } -// Generates the CSS variable for a certain grid param suffix, for the current -// device +// A derived map of all CSS variables for the current device const previewDevice = derived(builderStore, $store => $store.previewDevice) -export const getGridVar = derived(previewDevice, device => suffix => { - const prefix = device === Devices.Mobile ? Devices.Mobile : Devices.Desktop - return `--grid-${prefix}-${suffix}` +export const gridCSSVars = derived(previewDevice, $device => { + const device = $device === Devices.Mobile ? Devices.Mobile : Devices.Desktop + let vars = {} + for (let type of Object.values(GridVars)) { + vars[type] = `--grid-${device}-${type}` + } + return vars }) +// Builds a CSS variable name for a certain piece of grid metadata +export const getGridCSSVar = (device, type) => `--grid-${device}-${type}` + // Generates the CSS variable for a certain grid param suffix, for the other // device variant than the one included in this variable export const getOtherDeviceGridVar = cssVar => { @@ -69,21 +92,6 @@ export const getGridParentID = node => { return node?.parentNode?.closest(".grid")?.parentNode.dataset.id } -// Generates the base set of grid CSS vars from a component definition -export const getBaseGridVars = (definition, errored = false) => { - const hAlign = errored ? "stretch" : definition?.grid?.hAlign || "stretch" - const vAlign = errored ? "stretch" : definition?.grid?.vAlign || "center" - const flexStyles = vAlign === "stretch" ? "1 1 0" : "0 0 auto" - return { - "--grid-desktop-h-align": hAlign, - "--grid-mobile-h-align": hAlign, - "--grid-desktop-v-align": vAlign, - "--grid-mobile-v-align": vAlign, - "--grid-desktop-child-flex": flexStyles, - "--grid-mobile-child-flex": flexStyles, - } -} - // Gets the current value of a certain grid CSS variable for a component export const getGridVarValue = (styles, variable) => { // Try the desired variable @@ -97,3 +105,73 @@ export const getGridVarValue = (styles, variable) => { // Otherwise use the default return val ? val : getDefaultGridVarValue(variable) } + +// Svelte action to apply required class names and styles to our component +// wrappers +export const gridLayout = (node, metadata) => { + let selectComponent + + const applyMetadata = metadata => { + const { id, styles, interactive, errored, definition } = metadata + consol.log(styles) + + // Callback to select the component when clicking on the wrapper + selectComponent = e => { + e.preventDefault() + builderStore.actions.selectComponent(id) + } + + // Generate base set of grid CSS vars based for this component + const hAlign = errored ? "stretch" : definition?.grid?.hAlign || "stretch" + const vAlign = errored ? "stretch" : definition?.grid?.vAlign || "center" + const vars = { + "--default-width": errored ? 500 : definition.size?.width || 100, + "--default-height": errored ? 60 : definition.size?.height || 100, + "--grid-desktop-h-align": hAlign, + "--grid-mobile-h-align": hAlign, + "--grid-desktop-v-align": vAlign, + "--grid-mobile-v-align": vAlign, + } + + // Extract any other CSS variables from the saved component styles + for (let style of Object.keys(styles)) { + if (style.startsWith("--")) { + vars[style] = styles[style] + delete styles[style] + } + } + + // Apply all CSS variables to the wrapper + node.style = buildStyleString(vars) + + // Toggle classes to specify whether our children should fill + const desktopVar = getGridCSSVar(Devices.Desktop, GridVars.VAlign) + const mobileVar = getGridCSSVar(Devices.Mobile, GridVars.VAlign) + node.classList.toggle( + GridClasses.DesktopFill, + vars[desktopVar] === "stretch" + ) + node.classList.toggle(GridClasses.MobileFill, vars[mobileVar] === "stretch") + + // Add a listener to select this node on click + if (interactive) { + node.addEventListener("click", selectComponent, false) + } + } + + const removeListeners = () => { + node.removeEventListener("click", selectComponent) + } + + applyMetadata(metadata) + + return { + update(newMetadata) { + removeListeners() + applyMetadata(newMetadata) + }, + destroy() { + removeListeners() + }, + } +} From 1bce9855d006589b4c6d5a9cf3b03749953f6674 Mon Sep 17 00:00:00 2001 From: Andrew Kingston Date: Fri, 2 Aug 2024 16:44:18 +0100 Subject: [PATCH 036/180] More improvements --- .../components/preview/GridDNDHandler.svelte | 13 ++-- .../preview/GridStylesButton.svelte | 17 ++++- .../src/components/preview/SettingsBar.svelte | 16 ++--- packages/client/src/utils/grid.js | 66 ++++--------------- 4 files changed, 38 insertions(+), 74 deletions(-) diff --git a/packages/client/src/components/preview/GridDNDHandler.svelte b/packages/client/src/components/preview/GridDNDHandler.svelte index 12631b980a..114e131eb3 100644 --- a/packages/client/src/components/preview/GridDNDHandler.svelte +++ b/packages/client/src/components/preview/GridDNDHandler.svelte @@ -5,8 +5,8 @@ import { isGridEvent, getGridParentID, - gridCSSVars, - GridVars, + GridParams, + getGridVar, } from "utils/grid" // Smallest possible 1x1 transparent GIF @@ -19,11 +19,12 @@ let id // Grid CSS variables + $: device = $builderStore.previewDevice $: vars = { - colStart: $gridCSSVars[GridVars.ColStart], - colEnd: $gridCSSVars[GridVars.ColEnd], - rowStart: $gridCSSVars[GridVars.RowStart], - rowEnd: $gridCSSVars[GridVars.RowEnd], + colStart: getGridVar(device, GridParams.ColStart), + colEnd: getGridVar(device, GridParams.ColEnd), + rowStart: getGridVar(device, GridParams.RowStart), + rowEnd: getGridVar(device, GridParams.RowEnd), } // Some memoisation of primitive types for performance diff --git a/packages/client/src/components/preview/GridStylesButton.svelte b/packages/client/src/components/preview/GridStylesButton.svelte index e168754f3b..0dff88f23a 100644 --- a/packages/client/src/components/preview/GridStylesButton.svelte +++ b/packages/client/src/components/preview/GridStylesButton.svelte @@ -1,17 +1,28 @@ diff --git a/packages/client/src/components/preview/SettingsBar.svelte b/packages/client/src/components/preview/SettingsBar.svelte index cd11529cfa..df714681e9 100644 --- a/packages/client/src/components/preview/SettingsBar.svelte +++ b/packages/client/src/components/preview/SettingsBar.svelte @@ -7,7 +7,7 @@ import { builderStore, componentStore, dndIsDragging } from "stores" import { Utils } from "@budibase/frontend-core" import { findComponentParent } from "utils/components" - import { gridCSSVars, GridVars } from "utils/grid" + import { getGridVar, GridParams } from "utils/grid" const verticalOffset = 36 const horizontalOffset = 2 @@ -44,9 +44,9 @@ insideGrid && (definition?.grid?.hAlign !== "stretch" || definition?.grid?.vAlign !== "stretch") - $: gridHAlignVar = $gridCSSVars[GridVars.HAlign] - $: gridVAlignVar = $gridCSSVars[GridVars.VAlign] - $: gridStyles = $state?.styles + $: device = $builderStore.previewDevice + $: gridHAlignVar = getGridVar(device, GridParams.HAlign) + $: gridVAlignVar = getGridVar(device, GridParams.VAlign) const getBarSettings = definition => { let allSettings = [] @@ -156,7 +156,6 @@ value="start" icon="AlignLeft" title="Align left" - {gridStyles} {componentId} />
@@ -189,7 +185,6 @@ value="start" icon="AlignTop" title="Align top" - {gridStyles} {componentId} />
diff --git a/packages/client/src/utils/grid.js b/packages/client/src/utils/grid.js index d3b16aeafd..88e8477d2d 100644 --- a/packages/client/src/utils/grid.js +++ b/packages/client/src/utils/grid.js @@ -1,5 +1,4 @@ import { builderStore } from "stores" -import { derived } from "svelte/store" import { buildStyleString } from "utils/styleable.js" /** @@ -11,10 +10,13 @@ import { buildStyleString } from "utils/styleable.js" * * Component definitions define their default layout preference via the * `grid.hAlign` and `grid.vAlign` keys in the manifest. + * + * We also apply grid-[mobile/desktop]-grow CSS classes to component wrapper + * DOM nodes to use later in selectors, to control the sizing of children. */ // Enum representing the different CSS variables we use for grid metadata -export const GridVars = { +export const GridParams = { HAlign: "h-align", VAlign: "v-align", ColStart: "col-start", @@ -35,38 +37,8 @@ const Devices = { Mobile: "mobile", } -// A derived map of all CSS variables for the current device -const previewDevice = derived(builderStore, $store => $store.previewDevice) -export const gridCSSVars = derived(previewDevice, $device => { - const device = $device === Devices.Mobile ? Devices.Mobile : Devices.Desktop - let vars = {} - for (let type of Object.values(GridVars)) { - vars[type] = `--grid-${device}-${type}` - } - return vars -}) - // Builds a CSS variable name for a certain piece of grid metadata -export const getGridCSSVar = (device, type) => `--grid-${device}-${type}` - -// Generates the CSS variable for a certain grid param suffix, for the other -// device variant than the one included in this variable -export const getOtherDeviceGridVar = cssVar => { - if (cssVar.includes(Devices.Desktop)) { - return cssVar.replace(Devices.Desktop, Devices.Mobile) - } else { - return cssVar.replace(Devices.Mobile, Devices.Desktop) - } -} - -// Gets the default value for a certain grid CSS variable -export const getDefaultGridVarValue = cssVar => { - if (cssVar.includes("align")) { - return cssVar.includes("-h-") ? "stretch" : "center" - } else { - return cssVar.endsWith("-start") ? 1 : 2 - } -} +export const getGridVar = (device, param) => `--grid-${device}-${param}` // Determines whether a JS event originated from immediately within a grid export const isGridEvent = e => { @@ -92,32 +64,18 @@ export const getGridParentID = node => { return node?.parentNode?.closest(".grid")?.parentNode.dataset.id } -// Gets the current value of a certain grid CSS variable for a component -export const getGridVarValue = (styles, variable) => { - // Try the desired variable - let val = styles?.variables?.[variable] - - // Otherwise try the other device variables - if (!val) { - val = styles?.[getOtherDeviceGridVar(variable)] - } - - // Otherwise use the default - return val ? val : getDefaultGridVarValue(variable) -} - // Svelte action to apply required class names and styles to our component // wrappers export const gridLayout = (node, metadata) => { let selectComponent + // Applies the required listeners, CSS and classes to a component DOM node const applyMetadata = metadata => { const { id, styles, interactive, errored, definition } = metadata - consol.log(styles) // Callback to select the component when clicking on the wrapper selectComponent = e => { - e.preventDefault() + e.stopPropagation() builderStore.actions.selectComponent(id) } @@ -145,13 +103,14 @@ export const gridLayout = (node, metadata) => { node.style = buildStyleString(vars) // Toggle classes to specify whether our children should fill - const desktopVar = getGridCSSVar(Devices.Desktop, GridVars.VAlign) - const mobileVar = getGridCSSVar(Devices.Mobile, GridVars.VAlign) node.classList.toggle( GridClasses.DesktopFill, - vars[desktopVar] === "stretch" + vars[getGridVar(Devices.Desktop, GridParams.VAlign)] === "stretch" + ) + node.classList.toggle( + GridClasses.MobileFill, + vars[getGridVar(Devices.Mobile, GridParams.VAlign)] === "stretch" ) - node.classList.toggle(GridClasses.MobileFill, vars[mobileVar] === "stretch") // Add a listener to select this node on click if (interactive) { @@ -159,6 +118,7 @@ export const gridLayout = (node, metadata) => { } } + // Removes the previously set up listeners const removeListeners = () => { node.removeEventListener("click", selectComponent) } From 8a6d4c0bf6f5cb9b36be94b76ce9249d6108e3c1 Mon Sep 17 00:00:00 2001 From: Andrew Kingston Date: Sat, 3 Aug 2024 09:44:32 +0100 Subject: [PATCH 037/180] Update remaining components with sizes and grid metadata --- packages/client/manifest.json | 47 ++++++++++++++++--- .../src/components/app/BackgroundImage.svelte | 17 ++----- 2 files changed, 44 insertions(+), 20 deletions(-) diff --git a/packages/client/manifest.json b/packages/client/manifest.json index 10503f30ac..6f665a80d7 100644 --- a/packages/client/manifest.json +++ b/packages/client/manifest.json @@ -1326,6 +1326,7 @@ "icon": "Images", "hasChildren": true, "styles": ["size"], + "showEmptyState": false, "size": { "width": 400, "height": 300 @@ -1765,7 +1766,11 @@ "icon": "GraphBarVertical", "size": { "width": 600, - "height": 400 + "height": 420 + }, + "grid": { + "hAlign": "stretch", + "vAlign": "center" }, "settings": [ { @@ -1934,7 +1939,11 @@ "icon": "GraphTrend", "size": { "width": 600, - "height": 400 + "height": 420 + }, + "grid": { + "hAlign": "stretch", + "vAlign": "center" }, "settings": [ { @@ -2098,7 +2107,11 @@ "icon": "GraphAreaStacked", "size": { "width": 600, - "height": 400 + "height": 420 + }, + "grid": { + "hAlign": "stretch", + "vAlign": "center" }, "settings": [ { @@ -2274,7 +2287,11 @@ "icon": "GraphPie", "size": { "width": 600, - "height": 400 + "height": 420 + }, + "grid": { + "hAlign": "stretch", + "vAlign": "center" }, "settings": [ { @@ -2414,7 +2431,11 @@ "icon": "GraphDonut", "size": { "width": 600, - "height": 400 + "height": 420 + }, + "grid": { + "hAlign": "stretch", + "vAlign": "center" }, "settings": [ { @@ -2554,7 +2575,11 @@ "icon": "GraphBarVerticalStacked", "size": { "width": 600, - "height": 400 + "height": 420 + }, + "grid": { + "hAlign": "stretch", + "vAlign": "center" }, "settings": [ { @@ -2671,7 +2696,11 @@ "icon": "Histogram", "size": { "width": 600, - "height": 400 + "height": 420 + }, + "grid": { + "hAlign": "stretch", + "vAlign": "center" }, "settings": [ { @@ -4425,6 +4454,10 @@ "width": 400, "height": 320 }, + "grid": { + "hAlign": "stretch", + "vAlign": "stretch" + }, "settings": [ { "type": "dataProvider", diff --git a/packages/client/src/components/app/BackgroundImage.svelte b/packages/client/src/components/app/BackgroundImage.svelte index df6459c417..07216bf9ca 100644 --- a/packages/client/src/components/app/BackgroundImage.svelte +++ b/packages/client/src/components/app/BackgroundImage.svelte @@ -19,20 +19,11 @@ } -{#if url} -
-
- -
+
+
+
-{:else if $builderStore.inBuilder} -
- -
-{/if} +
diff --git a/packages/client/src/components/preview/GridDNDHandler.svelte b/packages/client/src/components/preview/GridDNDHandler.svelte index 114e131eb3..f723d9ad29 100644 --- a/packages/client/src/components/preview/GridDNDHandler.svelte +++ b/packages/client/src/components/preview/GridDNDHandler.svelte @@ -41,7 +41,7 @@ // Util to get the inner DOM node by a component ID const getDOMNode = id => { const component = document.getElementsByClassName(id)[0] - return [...component?.children][0] + return Array.from(component?.children || [])[0] } const getComponentStyles = gridStyles => { From df77aa3f83515f3c2d1d4728d57235a1907a3d4a Mon Sep 17 00:00:00 2001 From: Andrew Kingston Date: Tue, 6 Aug 2024 11:07:20 +0100 Subject: [PATCH 047/180] Update when grid lines are shown, show sibling borders, add component padding, remove row and column settings --- .../_components/Screen/GeneralPanel.svelte | 26 ------ packages/client/manifest.json | 26 ------ .../client/src/components/app/Layout.svelte | 4 +- .../app/container/GridContainer.svelte | 88 ++++++++++++++----- .../components/preview/GridDNDHandler.svelte | 59 ++++++++----- packages/client/src/utils/grid.js | 4 +- 6 files changed, 107 insertions(+), 100 deletions(-) diff --git a/packages/builder/src/pages/builder/app/[application]/design/[screenId]/[componentId]/_components/Screen/GeneralPanel.svelte b/packages/builder/src/pages/builder/app/[application]/design/[screenId]/[componentId]/_components/Screen/GeneralPanel.svelte index 2a5211a253..020dc11ae8 100644 --- a/packages/builder/src/pages/builder/app/[application]/design/[screenId]/[componentId]/_components/Screen/GeneralPanel.svelte +++ b/packages/builder/src/pages/builder/app/[application]/design/[screenId]/[componentId]/_components/Screen/GeneralPanel.svelte @@ -96,32 +96,6 @@ }, ] - // Add grid layout settings if required - if (screen.props.layout === "grid") { - settings = settings.concat([ - { - key: "props.cols", - label: "Columns", - control: Stepper, - defaultValue: 24, - props: { - min: 2, - max: 50, - }, - }, - { - key: "props.rows", - label: "Rows", - control: Stepper, - defaultValue: 24, - props: { - min: 2, - max: 50, - }, - }, - ]) - } - return settings } diff --git a/packages/client/manifest.json b/packages/client/manifest.json index 6f665a80d7..8ca9698bcf 100644 --- a/packages/client/manifest.json +++ b/packages/client/manifest.json @@ -145,32 +145,6 @@ ], "defaultValue": "flex" }, - { - "type": "number", - "label": "Columns", - "key": "cols", - "placeholder": 12, - "defaultValue": 12, - "min": 2, - "max": 50, - "dependsOn": { - "setting": "layout", - "value": "grid" - } - }, - { - "type": "number", - "label": "Rows", - "key": "rows", - "placeholder": 12, - "defaultValue": 12, - "min": 2, - "max": 50, - "dependsOn": { - "setting": "layout", - "value": "grid" - } - }, { "type": "select", "label": "Direction", diff --git a/packages/client/src/components/app/Layout.svelte b/packages/client/src/components/app/Layout.svelte index 9cfa74cbb0..34de8122c8 100644 --- a/packages/client/src/components/app/Layout.svelte +++ b/packages/client/src/components/app/Layout.svelte @@ -480,10 +480,10 @@ position: relative; padding: 32px; } - .main:has(.screenslot-dom > .component > .grid) { + /* .main:has(.screenslot-dom > .component > .grid) { padding-top: 0; padding-bottom: 0; - } + }*/ .layout--none .main { padding: 0; } diff --git a/packages/client/src/components/app/container/GridContainer.svelte b/packages/client/src/components/app/container/GridContainer.svelte index cfe6f7d7bf..b46e763277 100644 --- a/packages/client/src/components/app/container/GridContainer.svelte +++ b/packages/client/src/components/app/container/GridContainer.svelte @@ -2,19 +2,18 @@ import { getContext } from "svelte" const component = getContext("component") - const { styleable, builderStore } = getContext("sdk") + const { styleable } = getContext("sdk") const context = getContext("context") - export let cols = 12 - export let rows = 12 + const cols = 12 + const rowHeight = 24 let width let height - $: cols = cols || 12 - $: rows = rows || 12 $: mobile = $context.device.mobile $: empty = $component.empty + $: rows = Math.max(1, Math.floor(height / rowHeight)) $: colSize = width / cols $: rowSize = height / rows @@ -22,7 +21,6 @@
- {#if $builderStore.inBuilder} -
- {#each { length: cols * rows } as _} -
- {/each} -
- {/if} +
+ {#each { length: cols * rows } as _} +
+ {/each} +
{#if !empty} @@ -57,32 +53,53 @@ .grid { position: relative; height: 400px; - gap: 0; - } - .grid.builder { - background: var(--spectrum-alias-background-color-secondary); + --spacing: 10; } + .grid, .underlay { display: grid; grid-template-rows: repeat(var(--rows), 1fr); grid-template-columns: repeat(var(--cols), 1fr); + gap: 0; } .underlay { + display: none; position: absolute; top: 0; left: 0; width: 100%; height: 100%; - border: 1px solid var(--spectrum-global-color-gray-900); - opacity: 0.07; + border-top: 1px solid var(--spectrum-global-color-gray-900); + border-left: 1px solid var(--spectrum-global-color-gray-900); + opacity: 0.1; pointer-events: none; } .underlay { z-index: 0; } .placeholder { - border: 1px solid var(--spectrum-global-color-gray-900); + border-bottom: 1px solid var(--spectrum-global-color-gray-900); + border-right: 1px solid var(--spectrum-global-color-gray-900); + } + + /* Highlight grid lines when resizing children */ + :global(.grid.highlight > .underlay) { + display: grid; + } + + /* Highlight sibling borders when resizing childern */ + :global(.grid.highlight > .component:not(.dragging):after) { + content: ""; + display: block; + position: absolute; + height: 100%; + width: 100%; + border: 1px solid var(--spectrum-global-color-static-blue-200); + pointer-events: none; + z-index: 1; + top: 0; + left: 0; } /* Ensure all top level children have grid styles applied */ @@ -90,6 +107,9 @@ display: flex; overflow: auto; pointer-events: all; + position: relative; + padding: 5px; + margin: 5px; /* On desktop, use desktop metadata and fall back to mobile */ /* Position vars */ @@ -98,7 +118,12 @@ --grid-desktop-col-end, var( --grid-mobile-col-end, - round(up, calc(var(--default-width) / var(--col-size) + 1)) + round( + up, + calc( + (var(--spacing) * 2 + var(--default-width)) / var(--col-size) + 1 + ) + ) ) ); --row-start: var(--grid-desktop-row-start, var(--grid-mobile-row-start, 1)); @@ -106,7 +131,12 @@ --grid-desktop-row-end, var( --grid-mobile-row-end, - round(up, calc(var(--default-height) / var(--row-size) + 1)) + round( + up, + calc( + (var(--spacing) * 2 + var(--default-height)) / var(--row-size) + 1 + ) + ) ) ); @@ -137,7 +167,12 @@ --grid-mobile-col-end, var( --grid-desktop-col-end, - round(up, calc(var(--default-width) / var(--col-size) + 1)) + round( + up, + calc( + (var(--spacing) * 2 + var(--default-width)) / var(--col-size) + 1 + ) + ) ) ); --row-start: var(--grid-mobile-row-start, var(--grid-desktop-row-start, 1)); @@ -145,7 +180,12 @@ --grid-mobile-row-end, var( --grid-desktop-row-end, - round(up, calc(var(--default-height) / var(--row-size) + 1)) + round( + up, + calc( + (var(--spacing) * 2 + var(--default-height)) / var(--row-size) + 1 + ) + ) ) ); diff --git a/packages/client/src/components/preview/GridDNDHandler.svelte b/packages/client/src/components/preview/GridDNDHandler.svelte index f723d9ad29..fe004982d3 100644 --- a/packages/client/src/components/preview/GridDNDHandler.svelte +++ b/packages/client/src/components/preview/GridDNDHandler.svelte @@ -4,7 +4,7 @@ import { Utils, memo } from "@budibase/frontend-core" import { isGridEvent, - getGridParentID, + getGridParent, GridParams, getGridVar, } from "utils/grid" @@ -62,6 +62,9 @@ const { startX, startY, rowStart, rowEnd, colStart, colEnd } = grid const domGrid = getDOMNode(gridId) + if (!domGrid) { + return + } const cols = parseInt(domGrid.dataset.cols) const rows = parseInt(domGrid.dataset.rows) const { width, height } = domGrid.getBoundingClientRect() @@ -107,7 +110,7 @@ } gridStyles.set(newStyles) } - }, 100) + }, 10) const handleEvent = e => { e.preventDefault() @@ -140,16 +143,20 @@ // Find grid parent const domComponent = getDOMNode(id) - const gridId = getGridParentID(domComponent) - if (!gridId) { + const domGrid = getGridParent(domComponent) + if (!domGrid) { return } + // Apply active class to grid + domComponent.parentNode.classList.add("dragging") + domGrid.classList.add("highlight") + // Update state dragInfo = { domTarget: e.target, id, - gridId, + gridId: domGrid.parentNode.dataset.id, mode, side, } @@ -168,22 +175,23 @@ const { id, gridId } = dragInfo const domComponent = getDOMNode(id) const domGrid = getDOMNode(gridId) + if (!domComponent || !domGrid) { + return + } const gridCols = parseInt(domGrid.dataset.cols) const gridRows = parseInt(domGrid.dataset.rows) const styles = getComputedStyle(domComponent.parentNode) - if (domGrid) { - dragInfo.grid = { - startX: e.clientX, - startY: e.clientY, + dragInfo.grid = { + startX: e.clientX, + startY: e.clientY, - // Ensure things are within limits - rowStart: minMax(styles["grid-row-start"], 1, gridRows), - rowEnd: minMax(styles["grid-row-end"], 2, gridRows + 1), - colStart: minMax(styles["grid-column-start"], 1, gridCols), - colEnd: minMax(styles["grid-column-end"], 2, gridCols + 1), - } - handleEvent(e) + // Ensure things are within limits + rowStart: minMax(styles["grid-row-start"], 1, gridRows), + rowEnd: minMax(styles["grid-row-end"], 2, gridRows + 1), + colStart: minMax(styles["grid-column-start"], 1, gridCols), + colEnd: minMax(styles["grid-column-end"], 2, gridCols + 1), } + handleEvent(e) } const onDragOver = e => { @@ -195,15 +203,26 @@ // Callback when drag stops (whether dropped or not) const stopDragging = async () => { + if (!dragInfo) { + return + } + const { id, gridId, domTarget } = dragInfo + // Save changes if ($gridStyles) { - await builderStore.actions.updateStyles($gridStyles, dragInfo.id) + await builderStore.actions.updateStyles($gridStyles, id) } - // Reset listener - if (dragInfo?.domTarget) { - dragInfo.domTarget.removeEventListener("dragend", stopDragging) + // Reset DOM + const domComponent = getDOMNode(id) + if (domComponent) { + domComponent.parentNode.classList.remove("dragging") } + const domGrid = getDOMNode(gridId) + if (domGrid) { + domGrid.classList.remove("highlight") + } + domTarget.removeEventListener("dragend", stopDragging) // Reset state dragInfo = null diff --git a/packages/client/src/utils/grid.js b/packages/client/src/utils/grid.js index 1d80e49696..54c5e2c24f 100644 --- a/packages/client/src/utils/grid.js +++ b/packages/client/src/utils/grid.js @@ -60,8 +60,8 @@ export const isGridChild = node => { } // Gets the component ID of the closest parent grid -export const getGridParentID = node => { - return node?.parentNode?.closest(".grid")?.parentNode.dataset.id +export const getGridParent = node => { + return node?.parentNode?.closest(".grid") } // Svelte action to apply required class names and styles to our component From d3b7a06871c5ac959ba24437aff3a131ffa537af Mon Sep 17 00:00:00 2001 From: Andrew Kingston Date: Tue, 6 Aug 2024 11:17:01 +0100 Subject: [PATCH 048/180] Ensure nav accounts for grid layout padding --- packages/client/src/components/app/Layout.svelte | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/client/src/components/app/Layout.svelte b/packages/client/src/components/app/Layout.svelte index 34de8122c8..4a49dabbe9 100644 --- a/packages/client/src/components/app/Layout.svelte +++ b/packages/client/src/components/app/Layout.svelte @@ -414,6 +414,9 @@ color: var(--navTextColor); opacity: 1; } + .layout:has(.screenslot-dom > .component > .grid) .nav { + padding: 24px 42px 20px 42px; + } .nav :global(h1) { color: var(--navTextColor); @@ -480,10 +483,7 @@ position: relative; padding: 32px; } - /* .main:has(.screenslot-dom > .component > .grid) { - padding-top: 0; - padding-bottom: 0; - }*/ + .layout--none .main { padding: 0; } From cacc2ab087e73e59922e33b5abacd1818ebe6f18 Mon Sep 17 00:00:00 2001 From: Andrew Kingston Date: Tue, 6 Aug 2024 11:28:58 +0100 Subject: [PATCH 049/180] Fix issues with nesting grids inside grids --- .../components/app/container/GridContainer.svelte | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/packages/client/src/components/app/container/GridContainer.svelte b/packages/client/src/components/app/container/GridContainer.svelte index b46e763277..89e39394ce 100644 --- a/packages/client/src/components/app/container/GridContainer.svelte +++ b/packages/client/src/components/app/container/GridContainer.svelte @@ -54,6 +54,20 @@ position: relative; height: 400px; --spacing: 10; + + /* + Prevent cross-grid variable inheritance. The other variables for alignment + are always set on each component, so we don't need to worry about + inheritance. + */ + --grid-desktop-col-start: initial; + --grid-desktop-col-end: initial; + --grid-desktop-row-start: initial; + --grid-desktop-row-end: initial; + --grid-mobile-col-start: initial; + --grid-mobile-col-end: initial; + --grid-mobile-row-start: initial; + --grid-mobile-row-end: initial; } .grid, From 73079e44175f45f15a8f3b1accb3cec934d1851b Mon Sep 17 00:00:00 2001 From: Andrew Kingston Date: Tue, 6 Aug 2024 11:43:22 +0100 Subject: [PATCH 050/180] Fix some layout edge cases --- packages/client/src/components/app/Layout.svelte | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/packages/client/src/components/app/Layout.svelte b/packages/client/src/components/app/Layout.svelte index 4a49dabbe9..72121640a6 100644 --- a/packages/client/src/components/app/Layout.svelte +++ b/packages/client/src/components/app/Layout.svelte @@ -406,6 +406,9 @@ max-width: 100%; gap: var(--spacing-xl); } + .nav.size--max { + padding: 10px; + } .nav :global(.spectrum-Icon) { color: var(--navTextColor); opacity: 0.75; @@ -414,10 +417,6 @@ color: var(--navTextColor); opacity: 1; } - .layout:has(.screenslot-dom > .component > .grid) .nav { - padding: 24px 42px 20px 42px; - } - .nav :global(h1) { color: var(--navTextColor); } @@ -483,6 +482,9 @@ position: relative; padding: 32px; } + .main:not(.size--max):has(.screenslot-dom > .component > .grid) { + padding: 22px; + } .layout--none .main { padding: 0; @@ -614,6 +616,10 @@ .mobile:not(.layout--none) .main { padding: 16px; } + .mobile:not(.layout--none) + .main:not(.size--max):has(.screenslot-dom > .component > .grid) { + padding: 6px; + } .mobile .main.size--max { padding: 0; } From 4c7f65a811e9bf302d2128d166e047e901e6f07f Mon Sep 17 00:00:00 2001 From: Andrew Kingston Date: Tue, 6 Aug 2024 11:48:00 +0100 Subject: [PATCH 051/180] Add more styles to forms --- packages/client/manifest.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/client/manifest.json b/packages/client/manifest.json index 8ca9698bcf..f232318c53 100644 --- a/packages/client/manifest.json +++ b/packages/client/manifest.json @@ -2825,7 +2825,7 @@ "UpdateFieldValue", "ScrollTo" ], - "styles": ["size"], + "styles": ["padding", "size", "background", "border", "shadow"], "size": { "width": 400, "height": 400 @@ -6804,7 +6804,7 @@ "hAlign": "stretch", "vAlign": "start" }, - "styles": ["size"], + "styles": ["padding", "size", "background", "border", "shadow"], "settings": [ { "type": "table", @@ -6988,7 +6988,7 @@ "formblock": { "name": "Form Block", "icon": "Form", - "styles": ["size"], + "styles": ["padding", "size", "background", "border", "shadow"], "block": true, "info": "Form blocks are only compatible with internal or SQL tables", "size": { From 8e04e85df2cdf07cb9389c6cc9145acbdd95be04 Mon Sep 17 00:00:00 2001 From: Andrew Kingston Date: Tue, 6 Aug 2024 11:48:47 +0100 Subject: [PATCH 052/180] Lint --- .../[componentId]/_components/Screen/GeneralPanel.svelte | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/builder/src/pages/builder/app/[application]/design/[screenId]/[componentId]/_components/Screen/GeneralPanel.svelte b/packages/builder/src/pages/builder/app/[application]/design/[screenId]/[componentId]/_components/Screen/GeneralPanel.svelte index 020dc11ae8..62fe593602 100644 --- a/packages/builder/src/pages/builder/app/[application]/design/[screenId]/[componentId]/_components/Screen/GeneralPanel.svelte +++ b/packages/builder/src/pages/builder/app/[application]/design/[screenId]/[componentId]/_components/Screen/GeneralPanel.svelte @@ -6,7 +6,6 @@ Checkbox, Banner, Select, - Stepper, notifications, } from "@budibase/bbui" import PropertyControl from "components/design/settings/controls/PropertyControl.svelte" From 5eebbd56f6110ba0f2090ba0bfc918731504f1c2 Mon Sep 17 00:00:00 2001 From: Andrew Kingston Date: Thu, 8 Aug 2024 16:15:05 +0100 Subject: [PATCH 053/180] Reduce spacing between components in grids to 16px from 20px --- .../src/components/app/container/GridContainer.svelte | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/client/src/components/app/container/GridContainer.svelte b/packages/client/src/components/app/container/GridContainer.svelte index 89e39394ce..cb2c285b84 100644 --- a/packages/client/src/components/app/container/GridContainer.svelte +++ b/packages/client/src/components/app/container/GridContainer.svelte @@ -53,7 +53,7 @@ .grid { position: relative; height: 400px; - --spacing: 10; + --spacing: 8; /* Prevent cross-grid variable inheritance. The other variables for alignment @@ -122,8 +122,8 @@ overflow: auto; pointer-events: all; position: relative; - padding: 5px; - margin: 5px; + padding: 4px; + margin: 4px; /* On desktop, use desktop metadata and fall back to mobile */ /* Position vars */ From 618b65e3faf6e6f89edc2e568da9438233b38cf9 Mon Sep 17 00:00:00 2001 From: Andrew Kingston Date: Thu, 8 Aug 2024 16:23:55 +0100 Subject: [PATCH 054/180] Use outline rather than pseudo elements for highlighting grid children --- .../components/app/container/GridContainer.svelte | 13 ++----------- 1 file changed, 2 insertions(+), 11 deletions(-) diff --git a/packages/client/src/components/app/container/GridContainer.svelte b/packages/client/src/components/app/container/GridContainer.svelte index cb2c285b84..f3682179c4 100644 --- a/packages/client/src/components/app/container/GridContainer.svelte +++ b/packages/client/src/components/app/container/GridContainer.svelte @@ -103,17 +103,8 @@ } /* Highlight sibling borders when resizing childern */ - :global(.grid.highlight > .component:not(.dragging):after) { - content: ""; - display: block; - position: absolute; - height: 100%; - width: 100%; - border: 1px solid var(--spectrum-global-color-static-blue-200); - pointer-events: none; - z-index: 1; - top: 0; - left: 0; + :global(.grid.highlight > .component:not(.dragging)) { + outline: 1px solid var(--spectrum-global-color-static-blue-200); } /* Ensure all top level children have grid styles applied */ From cdc2092264aed0672dc92136fae570fce4a126b6 Mon Sep 17 00:00:00 2001 From: Andrew Kingston Date: Thu, 8 Aug 2024 16:30:31 +0100 Subject: [PATCH 055/180] Only apply grid action when component is an immediate child of a grid container --- packages/client/src/components/Component.svelte | 9 ++++++++- packages/client/src/utils/grid.js | 6 +++++- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/packages/client/src/components/Component.svelte b/packages/client/src/components/Component.svelte index 0a216bd675..8083678482 100644 --- a/packages/client/src/components/Component.svelte +++ b/packages/client/src/components/Component.svelte @@ -42,6 +42,7 @@ import { gridLayout } from "utils/grid.js" export let instance = {} + export let parent = null export let isLayout = false export let isRoot = false export let isBlock = false @@ -194,14 +195,20 @@ $: pad = pad || (interactive && hasChildren && inDndPath) $: $dndIsDragging, (pad = false) + // Themes $: currentTheme = $context?.device?.theme $: darkMode = !currentTheme?.includes("light") + // Apply ephemeral styles (such as when resizing grid components) $: normalStyles = { ...instance._styles?.normal, ...ephemeralStyles, } + + // Metadata to pass into grid action to apply CSS $: gridMetadata = { + active: + parent?._component.endsWith("/container") && parent?.layout === "grid", id, interactive, styles: normalStyles, @@ -672,7 +679,7 @@ {#if children.length} {#each children as child (child._id)} - + {/each} {:else if emptyState} {#if isRoot} diff --git a/packages/client/src/utils/grid.js b/packages/client/src/utils/grid.js index 54c5e2c24f..d974e31899 100644 --- a/packages/client/src/utils/grid.js +++ b/packages/client/src/utils/grid.js @@ -71,7 +71,11 @@ export const gridLayout = (node, metadata) => { // Applies the required listeners, CSS and classes to a component DOM node const applyMetadata = metadata => { - const { id, styles, interactive, errored, definition, draggable } = metadata + const { id, styles, interactive, errored, definition, draggable, active } = + metadata + if (!active) { + return + } // Callback to select the component when clicking on the wrapper selectComponent = e => { From 8a022bb21e33ba9ada656024fa0c840f494273a8 Mon Sep 17 00:00:00 2001 From: Andrew Kingston Date: Fri, 9 Aug 2024 08:48:32 +0100 Subject: [PATCH 056/180] Use single CSS variable for grid spacing to reduce duplication --- packages/client/src/components/app/Layout.svelte | 7 +++++-- .../src/components/app/container/GridContainer.svelte | 11 ++++++----- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/packages/client/src/components/app/Layout.svelte b/packages/client/src/components/app/Layout.svelte index 72121640a6..a1ce77df72 100644 --- a/packages/client/src/components/app/Layout.svelte +++ b/packages/client/src/components/app/Layout.svelte @@ -352,6 +352,9 @@ z-index: 1; overflow: hidden; position: relative; + + /* Deliberately unitless as we need to do unitless calculations in grids */ + --grid-spacing: 4; } .component { display: contents; @@ -407,7 +410,7 @@ gap: var(--spacing-xl); } .nav.size--max { - padding: 10px; + padding: calc(var(--grid-spacing) * 2px); } .nav :global(.spectrum-Icon) { color: var(--navTextColor); @@ -483,7 +486,7 @@ padding: 32px; } .main:not(.size--max):has(.screenslot-dom > .component > .grid) { - padding: 22px; + padding: calc(32px - var(--grid-spacing) * 2px); } .layout--none .main { diff --git a/packages/client/src/components/app/container/GridContainer.svelte b/packages/client/src/components/app/container/GridContainer.svelte index f3682179c4..6df0fdd2d4 100644 --- a/packages/client/src/components/app/container/GridContainer.svelte +++ b/packages/client/src/components/app/container/GridContainer.svelte @@ -53,7 +53,6 @@ .grid { position: relative; height: 400px; - --spacing: 8; /* Prevent cross-grid variable inheritance. The other variables for alignment @@ -113,8 +112,8 @@ overflow: auto; pointer-events: all; position: relative; - padding: 4px; - margin: 4px; + padding: calc(var(--grid-spacing) * 1px); + margin: calc(var(--grid-spacing) * 1px); /* On desktop, use desktop metadata and fall back to mobile */ /* Position vars */ @@ -126,7 +125,8 @@ round( up, calc( - (var(--spacing) * 2 + var(--default-width)) / var(--col-size) + 1 + (var(--grid-spacing) * 2 + var(--default-width)) / var(--col-size) + + 1 ) ) ) @@ -139,7 +139,8 @@ round( up, calc( - (var(--spacing) * 2 + var(--default-height)) / var(--row-size) + 1 + (var(--grid-spacing) * 2 + var(--default-height)) / var(--row-size) + + 1 ) ) ) From 86061543dde386888bfb60474ec818bc36875248 Mon Sep 17 00:00:00 2001 From: Andrew Kingston Date: Fri, 9 Aug 2024 08:52:03 +0100 Subject: [PATCH 057/180] Slightly improve the look and behaviour of working with grid components --- .../client/src/components/app/container/GridContainer.svelte | 2 +- packages/client/src/components/preview/GridDNDHandler.svelte | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/client/src/components/app/container/GridContainer.svelte b/packages/client/src/components/app/container/GridContainer.svelte index 6df0fdd2d4..8e8621c1a6 100644 --- a/packages/client/src/components/app/container/GridContainer.svelte +++ b/packages/client/src/components/app/container/GridContainer.svelte @@ -103,7 +103,7 @@ /* Highlight sibling borders when resizing childern */ :global(.grid.highlight > .component:not(.dragging)) { - outline: 1px solid var(--spectrum-global-color-static-blue-200); + outline: 2px solid var(--spectrum-global-color-static-blue-200); } /* Ensure all top level children have grid styles applied */ diff --git a/packages/client/src/components/preview/GridDNDHandler.svelte b/packages/client/src/components/preview/GridDNDHandler.svelte index fe004982d3..0a3ecad72c 100644 --- a/packages/client/src/components/preview/GridDNDHandler.svelte +++ b/packages/client/src/components/preview/GridDNDHandler.svelte @@ -147,6 +147,7 @@ if (!domGrid) { return } + builderStore.actions.selectComponent(id) // Apply active class to grid domComponent.parentNode.classList.add("dragging") From 46beead098feffdefc546eb3796b6f839d8c8feb Mon Sep 17 00:00:00 2001 From: Andrew Kingston Date: Fri, 9 Aug 2024 09:14:53 +0100 Subject: [PATCH 058/180] Update the style of edge anchors --- .../src/components/preview/Indicator.svelte | 56 +++++++++++++------ 1 file changed, 39 insertions(+), 17 deletions(-) diff --git a/packages/client/src/components/preview/Indicator.svelte b/packages/client/src/components/preview/Indicator.svelte index d93ecaa02b..605611d3a1 100644 --- a/packages/client/src/components/preview/Indicator.svelte +++ b/packages/client/src/components/preview/Indicator.svelte @@ -131,6 +131,7 @@ display: grid; place-items: center; border-radius: 50%; + transform: translateX(-50%) translateY(-50%); } .anchor-inner { width: calc(var(--size) / 2); @@ -140,45 +141,66 @@ pointer-events: none; border-radius: 2px; } + + /* Thinner anchors for each edge */ + .anchor.right, + .anchor.left { + height: calc(var(--size) * 2); + } + .anchor.top, + .anchor.bottom { + width: calc(var(--size) * 2); + } + .anchor.right .anchor-inner, + .anchor.left .anchor-inner { + height: calc(var(--size) * 1.4); + width: calc(var(--size) * 0.3); + } + .anchor.top .anchor-inner, + .anchor.bottom .anchor-inner { + width: calc(var(--size) * 1.4); + height: calc(var(--size) * 0.3); + } + + /* Anchor positions */ .anchor.right { - right: calc(var(--size) / -2 - 1px); - top: calc(50% - var(--size) / 2); + left: calc(100% + 1px); + top: 50%; cursor: e-resize; } .anchor.left { - left: calc(var(--size) / -2 - 1px); - top: calc(50% - var(--size) / 2); + left: -1px; + top: 50%; cursor: w-resize; } .anchor.bottom { - left: calc(50% - var(--size) / 2 + 1px); - bottom: calc(var(--size) / -2 - 1px); + left: 50%; + top: calc(100% + 1px); cursor: s-resize; } .anchor.top { - left: calc(50% - var(--size) / 2 + 1px); - top: calc(var(--size) / -2 - 1px); + left: 50%; + top: -1px; cursor: n-resize; } - .anchor.bottom-right { - right: calc(var(--size) / -2 - 1px); - bottom: calc(var(--size) / -2 - 1px); + top: 100%; + left: 100%; cursor: se-resize; } .anchor.bottom-left { - left: calc(var(--size) / -2 - 1px); - bottom: calc(var(--size) / -2 - 1px); + left: 0; + top: 100%; cursor: sw-resize; } .anchor.top-right { - right: calc(var(--size) / -2 - 1px); - top: calc(var(--size) / -2 - 1px); + left: 100%; + top: 0; cursor: ne-resize; } .anchor.top-left { - left: calc(var(--size) / -2 - 1px); - top: calc(var(--size) / -2 - 1px); + left: 0; + top: 0; cursor: nw-resize; } From aaa33acc1c2ada8c44412e872ab42cc33497856a Mon Sep 17 00:00:00 2001 From: Andrew Kingston Date: Fri, 9 Aug 2024 18:04:23 +0100 Subject: [PATCH 059/180] Rework grid layouts to automatically grow as required --- .../app/container/GridContainer.svelte | 169 ++++++++++++------ .../components/preview/GridDNDHandler.svelte | 66 ++++--- packages/client/src/constants.js | 3 + packages/client/src/utils/grid.js | 24 ++- 4 files changed, 183 insertions(+), 79 deletions(-) diff --git a/packages/client/src/components/app/container/GridContainer.svelte b/packages/client/src/components/app/container/GridContainer.svelte index 8e8621c1a6..d97e7ceafb 100644 --- a/packages/client/src/components/app/container/GridContainer.svelte +++ b/packages/client/src/components/app/container/GridContainer.svelte @@ -1,50 +1,136 @@
-
- {#each { length: cols * rows } as _} -
- {/each} -
+ {#if $builderStore.inBuilder} +
+ {#each { length: GridColumns * rows } as _, idx} +
+ {/each} +
+ {/if} - {#if !empty} + {#if !empty && mounted} {/if}
@@ -52,7 +138,6 @@ diff --git a/packages/client/src/components/app/GridBlock.svelte b/packages/client/src/components/app/GridBlock.svelte index e86f163dba..357e9ff084 100644 --- a/packages/client/src/components/app/GridBlock.svelte +++ b/packages/client/src/components/app/GridBlock.svelte @@ -198,7 +198,7 @@ overflow: hidden; height: 410px; } - div.in-builder :global(*) { - pointer-events: none; + div.in-builder { + pointer-events: none !important; } diff --git a/packages/client/src/components/preview/GridDNDHandler.svelte b/packages/client/src/components/preview/GridDNDHandler.svelte index 0caee53953..a5ff8e0c27 100644 --- a/packages/client/src/components/preview/GridDNDHandler.svelte +++ b/packages/client/src/components/preview/GridDNDHandler.svelte @@ -36,7 +36,6 @@ // Set ephemeral styles $: instance = componentStore.actions.getComponentInstance(id) $: $instance?.setEphemeralStyles(enrichComponentStyles($styles)) - $: $styles, console.log("new styles") // Sugar for a combination of both min and max const minMax = (value, min, max) => Math.min(max, Math.max(min, value)) From d77e4381cc84892b964a3e667d8b7a0f127d982a Mon Sep 17 00:00:00 2001 From: Andrew Kingston Date: Mon, 12 Aug 2024 09:55:12 +0100 Subject: [PATCH 070/180] Speed up memo stores --- packages/frontend-core/src/utils/memo.js | 25 ++++++++---------------- 1 file changed, 8 insertions(+), 17 deletions(-) diff --git a/packages/frontend-core/src/utils/memo.js b/packages/frontend-core/src/utils/memo.js index ba0e3f3490..b99af15c2c 100644 --- a/packages/frontend-core/src/utils/memo.js +++ b/packages/frontend-core/src/utils/memo.js @@ -4,32 +4,23 @@ import { writable, get, derived } from "svelte/store" // subscribed children will only fire when a new value is actually set export const memo = initialValue => { const store = writable(initialValue) + let currentJSON = null - const tryUpdateValue = (newValue, currentValue) => { - // Sanity check for primitive equality - if (currentValue === newValue) { - return - } - - // Otherwise deep compare via JSON stringify - const currentString = JSON.stringify(currentValue) - const newString = JSON.stringify(newValue) - if (currentString !== newString) { + const tryUpdateValue = newValue => { + const newJSON = JSON.stringify(newValue) + if (newJSON !== currentJSON) { store.set(newValue) + currentJSON = newJSON } } return { subscribe: store.subscribe, - set: newValue => { - const currentValue = get(store) - tryUpdateValue(newValue, currentValue) - }, + set: tryUpdateValue, update: updateFn => { - const currentValue = get(store) - let mutableCurrentValue = JSON.parse(JSON.stringify(currentValue)) + let mutableCurrentValue = JSON.parse(currentJSON) const newValue = updateFn(mutableCurrentValue) - tryUpdateValue(newValue, currentValue) + tryUpdateValue(newValue) }, } } From 5b8846208b441b8331c8859a6bd984ef8f3d7cf6 Mon Sep 17 00:00:00 2001 From: Andrew Kingston Date: Mon, 12 Aug 2024 09:55:45 +0100 Subject: [PATCH 071/180] Prevent pointer events on non-dragged grid children to reduce hit test load --- .../client/src/components/app/container/GridContainer.svelte | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/client/src/components/app/container/GridContainer.svelte b/packages/client/src/components/app/container/GridContainer.svelte index 981a321e14..09fd15d599 100644 --- a/packages/client/src/components/app/container/GridContainer.svelte +++ b/packages/client/src/components/app/container/GridContainer.svelte @@ -177,6 +177,7 @@ /* Highlight sibling borders when resizing childern */ :global(.grid.highlight > .component:not(.dragging)) { outline: 2px solid var(--spectrum-global-color-static-blue-200); + pointer-events: none !important; } /* Ensure all top level children have grid styles applied */ From 9f951bab20b16e491fe5ad45cc9a561a2142a2c4 Mon Sep 17 00:00:00 2001 From: Andrew Kingston Date: Mon, 12 Aug 2024 10:24:14 +0100 Subject: [PATCH 072/180] Revert indicator sets to use IntersectionObservers when multiple indicators are required --- .../components/preview/IndicatorSet.svelte | 61 +++++++++++++++++-- .../src/components/preview/SettingsBar.svelte | 2 +- 2 files changed, 57 insertions(+), 6 deletions(-) diff --git a/packages/client/src/components/preview/IndicatorSet.svelte b/packages/client/src/components/preview/IndicatorSet.svelte index 6c899cb4fd..3c34d0de5d 100644 --- a/packages/client/src/components/preview/IndicatorSet.svelte +++ b/packages/client/src/components/preview/IndicatorSet.svelte @@ -33,7 +33,12 @@ let interval let state = defaultState() let observing = false + let updating = false + let observers = [] + let callbackCount = 0 + let nextState + $: visibleIndicators = state.indicators.filter(x => x.visible) $: offset = $builderStore.inBuilder ? 5 : -1 $: config.set({ componentId, @@ -70,7 +75,25 @@ return isGridChild(document.getElementsByClassName(id)[0]) } + const createIntersectionCallback = idx => entries => { + if (callbackCount >= observers.length) { + return + } + nextState.indicators[idx].visible = + nextState.indicators[idx].insideModal || + nextState.indicators[idx].insideSidePanel || + entries[0].isIntersecting + if (++callbackCount === observers.length) { + state = nextState + updating = false + } + } + const updatePosition = () => { + if (updating) { + return + } + // Sanity check if (!componentId) { state = defaultState() @@ -81,13 +104,17 @@ state = defaultState() return } + updating = true + callbackCount = 0 + observers.forEach(o => o.disconnect()) + observers = [] + nextState = defaultState() // Start observing if this is the first time we've seen our component // in the DOM if (!observing) { observeChanges(componentId) } - let nextState = defaultState() // Check if we're inside a grid if (allowResizeAnchors) { @@ -114,6 +141,7 @@ const children = Array.from(document.getElementsByClassName(className)) .filter(x => x != null) .slice(0, 100) + const multi = children.length > 1 // If there aren't any nodes then reset if (!children.length) { @@ -123,16 +151,39 @@ const device = document.getElementById("app-root") const deviceBounds = device.getBoundingClientRect() - nextState.indicators = children.map(child => { + nextState.indicators = children.map((child, idx) => { const elBounds = child.getBoundingClientRect() - return { + let indicator = { top: Math.round(elBounds.top + scrollY - deviceBounds.top + offset), left: Math.round(elBounds.left + scrollX - deviceBounds.left + offset), width: Math.round(elBounds.width + 2), height: Math.round(elBounds.height + 2), + visible: true, } + + // If observing more than one node then we need to use an intersection + // observer to determine whether each indicator should be visible + if (multi) { + const callback = createIntersectionCallback(idx) + const observer = new IntersectionObserver(callback, { + threshold: 1, + root: device, + }) + observer.observe(child) + observers.push(observer) + indicator.visible = false + indicator.insideSidePanel = !!child.closest(".side-panel") + indicator.insideModal = !!child.closest(".modal-content") + } + + return indicator }) - state = nextState + + // Immediately apply the update if we're just observing a single node + if (!multi) { + state = nextState + updating = false + } } const debouncedUpdate = Utils.domDebounce(updatePosition) @@ -149,7 +200,7 @@ }) -{#each state.indicators as indicator, idx} +{#each visibleIndicators as indicator, idx} Date: Mon, 12 Aug 2024 10:48:38 +0100 Subject: [PATCH 073/180] Allow grid containers to use their natural height as a min height --- .../app/container/GridContainer.svelte | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/packages/client/src/components/app/container/GridContainer.svelte b/packages/client/src/components/app/container/GridContainer.svelte index 09fd15d599..39358484a6 100644 --- a/packages/client/src/components/app/container/GridContainer.svelte +++ b/packages/client/src/components/app/container/GridContainer.svelte @@ -9,22 +9,26 @@ const context = getContext("context") let width + let height let ref let rows = 1 let children = writable({}) let mounted = false let styles = memo({}) - $: rows = calculateRequiredRows($children, mobile) + $: requiredRows = calculateRequiredRows($children, mobile) + $: requiredHeight = requiredRows * GridRowHeight + $: availableRows = Math.floor(height / GridRowHeight) + $: rows = Math.max(requiredRows, availableRows) $: mobile = $context.device.mobile $: empty = $component.empty $: colSize = width / GridColumns - $: height = rows * GridRowHeight $: styles.set({ ...$component.styles, normal: { ...$component.styles?.normal, - "--height": `${height}px`, + "--height": `${requiredHeight}px`, + "--min-height": $component.styles?.normal?.height || 0, "--cols": GridColumns, "--rows": rows, "--col-size": colSize, @@ -118,6 +122,7 @@ class="grid" class:mobile bind:clientWidth={width} + bind:clientHeight={height} use:styleable={$styles} data-cols={GridColumns} data-col-size={colSize} @@ -140,12 +145,13 @@ .grid, .underlay { height: var(--height) !important; - min-height: 0 !important; + min-height: var(--min-height) !important; max-height: none !important; display: grid; + gap: 0; grid-template-rows: repeat(var(--rows), calc(var(--row-size) * 1px)); grid-template-columns: repeat(var(--cols), 1fr); - gap: 0; + position: relative; } .underlay { display: none; From 51db5ac9a993864fa6f936e2be7271b0c5350b3c Mon Sep 17 00:00:00 2001 From: Andrew Kingston Date: Mon, 12 Aug 2024 11:00:59 +0100 Subject: [PATCH 074/180] Lint --- packages/client/src/components/Component.svelte | 2 +- packages/client/src/utils/grid.js | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/packages/client/src/components/Component.svelte b/packages/client/src/components/Component.svelte index 7a8188864f..3d081f5a61 100644 --- a/packages/client/src/components/Component.svelte +++ b/packages/client/src/components/Component.svelte @@ -54,7 +54,7 @@ const component = getContext("component") // Create component context - const store = memo({}) + const store = writable({}) setContext("component", store) // Ref to the svelte component diff --git a/packages/client/src/utils/grid.js b/packages/client/src/utils/grid.js index 3f2336f1cf..4e474b4d50 100644 --- a/packages/client/src/utils/grid.js +++ b/packages/client/src/utils/grid.js @@ -1,5 +1,4 @@ -import { GridSpacing } from "constants" -import { GridRowHeight } from "constants" +import { GridSpacing, GridRowHeight } from "constants" import { builderStore } from "stores" import { buildStyleString } from "utils/styleable.js" From 47e4c668eccb20882e911a6a364deaada596ebd3 Mon Sep 17 00:00:00 2001 From: Andrew Kingston Date: Mon, 12 Aug 2024 14:01:33 +0100 Subject: [PATCH 075/180] Tidy up --- .../client/src/components/app/container/GridContainer.svelte | 4 ++-- packages/client/src/components/preview/IndicatorSet.svelte | 3 +-- packages/client/src/utils/grid.js | 3 +++ 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/packages/client/src/components/app/container/GridContainer.svelte b/packages/client/src/components/app/container/GridContainer.svelte index 39358484a6..b1d00e6c07 100644 --- a/packages/client/src/components/app/container/GridContainer.svelte +++ b/packages/client/src/components/app/container/GridContainer.svelte @@ -5,7 +5,7 @@ import { memo } from "@budibase/frontend-core" const component = getContext("component") - const { styleable, builderStore } = getContext("sdk") + const { styleable } = getContext("sdk") const context = getContext("context") let width @@ -127,7 +127,7 @@ data-cols={GridColumns} data-col-size={colSize} > - {#if $builderStore.inBuilder} + {#if inBuilder}
{#each { length: GridColumns * rows } as _, idx}
diff --git a/packages/client/src/components/preview/IndicatorSet.svelte b/packages/client/src/components/preview/IndicatorSet.svelte index 3c34d0de5d..de7fc0f66c 100644 --- a/packages/client/src/components/preview/IndicatorSet.svelte +++ b/packages/client/src/components/preview/IndicatorSet.svelte @@ -14,6 +14,7 @@ // Offset = 6 (clip-root padding) - 1 (half the border thickness) const config = memo($$props) const errorColor = "var(--spectrum-global-color-static-red-600)" + const observer = new MutationObserver(() => debouncedUpdate()) const defaultState = () => ({ // Cached props componentId, @@ -54,8 +55,6 @@ // Observe style changes $: observeChanges(componentId) - const observer = new MutationObserver(() => debouncedUpdate()) - const observeChanges = id => { observer.disconnect() observing = false diff --git a/packages/client/src/utils/grid.js b/packages/client/src/utils/grid.js index 4e474b4d50..a7ca3e5286 100644 --- a/packages/client/src/utils/grid.js +++ b/packages/client/src/utils/grid.js @@ -135,6 +135,9 @@ export const gridLayout = (node, metadata) => { addDataTag("gridMobileHAlign", Devices.Mobile, GridParams.HAlign) addDataTag("gridDesktopVAlign", Devices.Desktop, GridParams.VAlign) addDataTag("gridMobileVAlign", Devices.Mobile, GridParams.VAlign) + if (node.dataset.insideGrid !== true) { + node.dataset.insideGrid = true + } // Apply all CSS variables to the wrapper node.style = buildStyleString(vars) From 1f99ecc5291edff974c1b2aa72c58b5e0d25320c Mon Sep 17 00:00:00 2001 From: Andrew Kingston Date: Mon, 12 Aug 2024 14:03:31 +0100 Subject: [PATCH 076/180] Fix missing reference --- .../client/src/components/app/container/GridContainer.svelte | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/client/src/components/app/container/GridContainer.svelte b/packages/client/src/components/app/container/GridContainer.svelte index b1d00e6c07..39358484a6 100644 --- a/packages/client/src/components/app/container/GridContainer.svelte +++ b/packages/client/src/components/app/container/GridContainer.svelte @@ -5,7 +5,7 @@ import { memo } from "@budibase/frontend-core" const component = getContext("component") - const { styleable } = getContext("sdk") + const { styleable, builderStore } = getContext("sdk") const context = getContext("context") let width @@ -127,7 +127,7 @@ data-cols={GridColumns} data-col-size={colSize} > - {#if inBuilder} + {#if $builderStore.inBuilder}
{#each { length: GridColumns * rows } as _, idx}
From d423d530e417e80943be330b74d76e55e3055f19 Mon Sep 17 00:00:00 2001 From: Andrew Kingston Date: Mon, 12 Aug 2024 14:45:17 +0100 Subject: [PATCH 077/180] Rewrite settings bar updates to improve performance --- .../src/components/app/GridBlock.svelte | 2 +- .../src/components/preview/SettingsBar.svelte | 204 ++++++++++-------- 2 files changed, 110 insertions(+), 96 deletions(-) diff --git a/packages/client/src/components/app/GridBlock.svelte b/packages/client/src/components/app/GridBlock.svelte index 357e9ff084..30a35b0713 100644 --- a/packages/client/src/components/app/GridBlock.svelte +++ b/packages/client/src/components/app/GridBlock.svelte @@ -198,7 +198,7 @@ overflow: hidden; height: 410px; } - div.in-builder { + div.in-builder :global(> *) { pointer-events: none !important; } diff --git a/packages/client/src/components/preview/SettingsBar.svelte b/packages/client/src/components/preview/SettingsBar.svelte index b0c8cfcc82..09706726bb 100644 --- a/packages/client/src/components/preview/SettingsBar.svelte +++ b/packages/client/src/components/preview/SettingsBar.svelte @@ -11,25 +11,24 @@ const context = getContext("context") const verticalOffset = 36 const horizontalOffset = 2 + const observer = new MutationObserver(() => debouncedUpdate()) let top = 0 let left = 0 let interval let self let measured = false - let observer - + let observing = false let insideGrid = false let gridHAlign let gridVAlign + let deviceEl - // TODO: respect dependsOn keys - - $: componentId = $builderStore.selectedComponentId - $: measured, observeComputedStyles(componentId) + $: id = $builderStore.selectedComponentId + $: id, reset() $: component = $componentStore.selectedComponent $: definition = $componentStore.selectedComponentDefinition - $: instance = componentStore.actions.getComponentInstance(componentId) + $: instance = componentStore.actions.getComponentInstance(id) $: state = $instance?.state $: showBar = definition?.showSettingsBar !== false && @@ -37,7 +36,7 @@ definition && !$state?.errorState $: settings = getBarSettings(component, definition) - $: isRoot = componentId === $builderStore.screen?.props?._id + $: isRoot = id === $builderStore.screen?.props?._id $: showGridStyles = insideGrid && (definition?.grid?.hAlign !== "stretch" || @@ -47,6 +46,21 @@ $: gridHAlignVar = getGridVar(device, GridParams.HAlign) $: gridVAlignVar = getGridVar(device, GridParams.VAlign) + const reset = () => { + observer.disconnect() + measured = false + observing = false + insideGrid = false + } + + const startObserving = domBoundary => { + observer.observe(domBoundary, { + attributes: true, + attributeFilter: ["style"], + }) + observing = true + } + const getBarSettings = (component, definition) => { let allSettings = [] definition?.settings?.forEach(setting => { @@ -68,102 +82,102 @@ if (!showBar) { return } - const id = $builderStore.selectedComponentId - let element = document.getElementsByClassName(id)?.[0] - // Check if we're inside a grid - insideGrid = element?.parentNode.classList.contains("grid") + // Find DOM boundary and ensure it is valid + let domBoundary = document.getElementsByClassName(id)[0] + if (!domBoundary) { + return reset() + } + + // If we're inside a grid, allow time for buttons to render + const nextInsideGrid = domBoundary.dataset.insideGrid === "true" + if (nextInsideGrid && !insideGrid) { + insideGrid = true + return + } else { + insideGrid = nextInsideGrid + } + + // Get the correct DOM boundary depending if we're inside a grid or not if (!insideGrid) { - element = element?.children?.[0] + domBoundary = + domBoundary.getElementsByClassName(`${id}-dom`)[0] || + domBoundary.children?.[0] + } + if (!domBoundary || !self) { + return reset() } - // The settings bar is higher in the dom tree than the selection indicators - // as we want to be able to render the settings bar wider than the screen, - // or outside the screen. - // Therefore we use the clip root rather than the app root to determine - // its position. - const device = document.getElementById("clip-root") - if (element && self) { - // Batch reads to minimize reflow - const deviceBounds = device.getBoundingClientRect() - const elBounds = element.getBoundingClientRect() - const width = self.offsetWidth - const height = self.offsetHeight - const { scrollX, scrollY, innerWidth } = window + // Start observing if required + if (!observing) { + startObserving(domBoundary) + } - // Read grid metadata from data attributes - if (insideGrid) { - if (mobile) { - gridHAlign = element.dataset.gridMobileHAlign - gridVAlign = element.dataset.gridMobileVAlign - } else { - gridHAlign = element.dataset.gridDesktopHAlign - gridVAlign = element.dataset.gridDesktopVAlign - } - } + // Batch reads to minimize reflow + const deviceBounds = deviceEl.getBoundingClientRect() + const elBounds = domBoundary.getBoundingClientRect() + const width = self.offsetWidth + const height = self.offsetHeight + const { scrollX, scrollY, innerWidth } = window - // Vertically, always render above unless no room, then render inside - let newTop = elBounds.top + scrollY - verticalOffset - height - if (newTop < deviceBounds.top - 50) { - newTop = deviceBounds.top - 50 - } - if (newTop < 0) { - newTop = 0 - } - const deviceBottom = deviceBounds.top + deviceBounds.height - if (newTop > deviceBottom - 44) { - newTop = deviceBottom - 44 + // Read grid metadata from data attributes + if (insideGrid) { + if (mobile) { + gridHAlign = domBoundary.dataset.gridMobileHAlign + gridVAlign = domBoundary.dataset.gridMobileVAlign + } else { + gridHAlign = domBoundary.dataset.gridDesktopHAlign + gridVAlign = domBoundary.dataset.gridDesktopVAlign } + } - //If element is at the very top of the screen, put the bar below the element - if (elBounds.top < elBounds.height && elBounds.height < 80) { - newTop = elBounds.bottom + verticalOffset - } + // Vertically, always render above unless no room, then render inside + let newTop = elBounds.top + scrollY - verticalOffset - height + if (newTop < deviceBounds.top - 50) { + newTop = deviceBounds.top - 50 + } + if (newTop < 0) { + newTop = 0 + } + const deviceBottom = deviceBounds.top + deviceBounds.height + if (newTop > deviceBottom - 44) { + newTop = deviceBottom - 44 + } - // Horizontally, try to center first. - // Failing that, render to left edge of component. - // Failing that, render to right edge of component, - // Failing that, render to window left edge and accept defeat. - let elCenter = elBounds.left + scrollX + elBounds.width / 2 - let newLeft = elCenter - width / 2 + //If element is at the very top of the screen, put the bar below the element + if (elBounds.top < elBounds.height && elBounds.height < 80) { + newTop = elBounds.bottom + verticalOffset + } + + // Horizontally, try to center first. + // Failing that, render to left edge of component. + // Failing that, render to right edge of component, + // Failing that, render to window left edge and accept defeat. + let elCenter = elBounds.left + scrollX + elBounds.width / 2 + let newLeft = elCenter - width / 2 + if (newLeft < 0 || newLeft + width > innerWidth) { + newLeft = elBounds.left + scrollX - horizontalOffset if (newLeft < 0 || newLeft + width > innerWidth) { - newLeft = elBounds.left + scrollX - horizontalOffset + newLeft = elBounds.right + scrollX - width + horizontalOffset if (newLeft < 0 || newLeft + width > innerWidth) { - newLeft = elBounds.right + scrollX - width + horizontalOffset - if (newLeft < 0 || newLeft + width > innerWidth) { - newLeft = horizontalOffset - } + newLeft = horizontalOffset } } - - // Only update state when things changes to minimize renders - if (Math.round(newTop) !== Math.round(top)) { - top = newTop - } - if (Math.round(newLeft) !== Math.round(left)) { - left = newLeft - } - - measured = true } + + // Only update state when things changes to minimize renders + if (Math.round(newTop) !== Math.round(top)) { + top = newTop + } + if (Math.round(newLeft) !== Math.round(left)) { + left = newLeft + } + measured = true } const debouncedUpdate = Utils.domDebounce(updatePosition) - const observeComputedStyles = id => { - observer?.disconnect() - const node = document.getElementsByClassName(`${id}-dom`)[0]?.parentNode - if (node) { - observer = new MutationObserver(updatePosition) - observer.observe(node, { - attributes: true, - attributeFilter: ["style"], - childList: false, - subtree: false, - }) - } - } - onMount(() => { + deviceEl = document.getElementById("clip-root") debouncedUpdate() interval = setInterval(debouncedUpdate, 100) document.addEventListener("scroll", debouncedUpdate, true) @@ -172,7 +186,7 @@ onDestroy(() => { clearInterval(interval) document.removeEventListener("scroll", debouncedUpdate, true) - observer?.disconnect() + reset() }) @@ -190,7 +204,7 @@ icon="AlignLeft" title="Align left" active={gridHAlign === "start"} - {componentId} + componentId={id} />
{/if} From 25ff092da291c50da31f0e72d94eff9956ee7c57 Mon Sep 17 00:00:00 2001 From: Andrew Kingston Date: Mon, 12 Aug 2024 14:54:39 +0100 Subject: [PATCH 078/180] Simplify some utils --- .../src/components/preview/GridDNDHandler.svelte | 16 +++++----------- .../src/components/preview/IndicatorSet.svelte | 6 +----- packages/client/src/utils/grid.js | 10 ---------- 3 files changed, 6 insertions(+), 26 deletions(-) diff --git a/packages/client/src/components/preview/GridDNDHandler.svelte b/packages/client/src/components/preview/GridDNDHandler.svelte index a5ff8e0c27..cfcc2892af 100644 --- a/packages/client/src/components/preview/GridDNDHandler.svelte +++ b/packages/client/src/components/preview/GridDNDHandler.svelte @@ -40,12 +40,6 @@ // Sugar for a combination of both min and max const minMax = (value, min, max) => Math.min(max, Math.max(min, value)) - // Util to get the inner DOM node by a component ID - const getDOMNode = id => { - const component = document.getElementsByClassName(id)[0] - return Array.from(component?.children || [])[0] - } - const enrichComponentStyles = styles => { let clone = { ...styles } if (styles) { @@ -137,16 +131,16 @@ } // Find grid parent and read from DOM - const domComponent = getDOMNode(id) - const domGrid = getGridParent(domComponent) + const domComponent = document.getElementsByClassName(id)[0] + const domGrid = domComponent?.closest(".grid") if (!domGrid) { return } - const styles = getComputedStyle(domComponent.parentNode) + const styles = getComputedStyle(domComponent) // Show as active builderStore.actions.selectComponent(id) - domComponent.parentNode.classList.add("dragging") + domComponent.classList.add("dragging") domGrid.classList.add("highlight") // Update state @@ -187,7 +181,7 @@ const { id, domTarget, domGrid, domComponent } = dragInfo // Reset DOM - domComponent.parentNode.classList.remove("dragging") + domComponent.classList.remove("dragging") domGrid.classList.remove("highlight") domTarget.removeEventListener("dragend", stopDragging) diff --git a/packages/client/src/components/preview/IndicatorSet.svelte b/packages/client/src/components/preview/IndicatorSet.svelte index de7fc0f66c..af709d24ba 100644 --- a/packages/client/src/components/preview/IndicatorSet.svelte +++ b/packages/client/src/components/preview/IndicatorSet.svelte @@ -70,10 +70,6 @@ } } - const checkInsideGrid = id => { - return isGridChild(document.getElementsByClassName(id)[0]) - } - const createIntersectionCallback = idx => entries => { if (callbackCount >= observers.length) { return @@ -117,7 +113,7 @@ // Check if we're inside a grid if (allowResizeAnchors) { - nextState.insideGrid = checkInsideGrid(componentId) + nextState.insideGrid = parents[0]?.dataset.insideGrid === "true" } // Get text to display diff --git a/packages/client/src/utils/grid.js b/packages/client/src/utils/grid.js index a7ca3e5286..afce01bbaa 100644 --- a/packages/client/src/utils/grid.js +++ b/packages/client/src/utils/grid.js @@ -52,16 +52,6 @@ export const isGridEvent = e => { ) } -// Determines whether a DOM element is an immediate child of a grid -export const isGridChild = node => { - return node?.parentNode.classList.contains("grid") -} - -// Gets the component ID of the closest parent grid -export const getGridParent = node => { - return node?.parentNode?.closest(".grid") -} - // Svelte action to apply required class names and styles to our component // wrappers export const gridLayout = (node, metadata) => { From 2f3a7018ae56d804a5203c6154a8128d96a3817e Mon Sep 17 00:00:00 2001 From: Andrew Kingston Date: Mon, 12 Aug 2024 15:29:03 +0100 Subject: [PATCH 079/180] More tidy up --- .../components/preview/GridDNDHandler.svelte | 8 +- .../components/preview/IndicatorSet.svelte | 86 +++++++++---------- .../src/components/preview/SettingsBar.svelte | 3 +- 3 files changed, 44 insertions(+), 53 deletions(-) diff --git a/packages/client/src/components/preview/GridDNDHandler.svelte b/packages/client/src/components/preview/GridDNDHandler.svelte index cfcc2892af..1d566f7416 100644 --- a/packages/client/src/components/preview/GridDNDHandler.svelte +++ b/packages/client/src/components/preview/GridDNDHandler.svelte @@ -3,13 +3,7 @@ import { builderStore, componentStore } from "stores" import { Utils, memo } from "@budibase/frontend-core" import { GridRowHeight } from "constants" - import { - isGridEvent, - getGridParent, - GridParams, - getGridVar, - Devices, - } from "utils/grid" + import { isGridEvent, GridParams, getGridVar, Devices } from "utils/grid" const context = getContext("context") diff --git a/packages/client/src/components/preview/IndicatorSet.svelte b/packages/client/src/components/preview/IndicatorSet.svelte index af709d24ba..dfea20a45f 100644 --- a/packages/client/src/components/preview/IndicatorSet.svelte +++ b/packages/client/src/components/preview/IndicatorSet.svelte @@ -3,7 +3,6 @@ import Indicator from "./Indicator.svelte" import { builderStore } from "stores" import { memo, Utils } from "@budibase/frontend-core" - import { isGridChild } from "utils/grid" export let componentId = null export let color = null @@ -14,7 +13,7 @@ // Offset = 6 (clip-root padding) - 1 (half the border thickness) const config = memo($$props) const errorColor = "var(--spectrum-global-color-static-red-600)" - const observer = new MutationObserver(() => debouncedUpdate()) + const mutationObserver = new MutationObserver(() => debouncedUpdate()) const defaultState = () => ({ // Cached props componentId, @@ -33,12 +32,13 @@ let interval let state = defaultState() - let observing = false + let observingMutations = false let updating = false - let observers = [] + let intersectionObservers = [] let callbackCount = 0 let nextState + $: componentId, reset() $: visibleIndicators = state.indicators.filter(x => x.visible) $: offset = $builderStore.inBuilder ? 5 : -1 $: config.set({ @@ -52,22 +52,18 @@ // Update position when any props change $: $config, debouncedUpdate() - // Observe style changes - $: observeChanges(componentId) + const reset = () => { + mutationObserver.disconnect() + observingMutations = false + updating = false + } - const observeChanges = id => { - observer.disconnect() - observing = false - const node = document.getElementsByClassName(id)[0] - if (node) { - observer.observe(node, { - attributes: true, - attributeFilter: ["style"], - childList: false, - subtree: false, - }) - observing = true - } + const observeMutations = element => { + mutationObserver.observe(element, { + attributes: true, + attributeFilter: ["style"], + }) + observingMutations = true } const createIntersectionCallback = idx => entries => { @@ -94,37 +90,37 @@ state = defaultState() return } - const parents = document.getElementsByClassName(componentId) - if (!parents.length) { + let elements = document.getElementsByClassName(componentId) + if (!elements.length) { state = defaultState() return } updating = true callbackCount = 0 - observers.forEach(o => o.disconnect()) - observers = [] + intersectionObservers.forEach(o => o.disconnect()) + intersectionObservers = [] nextState = defaultState() - // Start observing if this is the first time we've seen our component - // in the DOM - if (!observing) { - observeChanges(componentId) + // Start observing mutations if this is the first time we've seen our + // component in the DOM + if (!observingMutations) { + observeMutations(elements[0]) } // Check if we're inside a grid if (allowResizeAnchors) { - nextState.insideGrid = parents[0]?.dataset.insideGrid === "true" + nextState.insideGrid = elements[0]?.dataset.insideGrid === "true" } // Get text to display - nextState.text = parents[0].dataset.name + nextState.text = elements[0].dataset.name if (nextState.prefix) { nextState.text = `${nextState.prefix} ${nextState.text}` } - if (parents[0].dataset.icon) { - nextState.icon = parents[0].dataset.icon + if (elements[0].dataset.icon) { + nextState.icon = elements[0].dataset.icon } - nextState.error = parents[0].classList.contains("error") + nextState.error = elements[0].classList.contains("error") // Batch reads to minimize reflow const scrollX = window.scrollX @@ -132,22 +128,24 @@ // Extract valid children // Sanity limit of active indicators - const className = nextState.insideGrid ? componentId : `${componentId}-dom` - const children = Array.from(document.getElementsByClassName(className)) + if (!nextState.insideGrid) { + elements = document.getElementsByClassName(`${componentId}-dom`) + } + elements = Array.from(elements) .filter(x => x != null) .slice(0, 100) - const multi = children.length > 1 + const multi = elements.length > 1 // If there aren't any nodes then reset - if (!children.length) { + if (!elements.length) { state = defaultState() return } const device = document.getElementById("app-root") const deviceBounds = device.getBoundingClientRect() - nextState.indicators = children.map((child, idx) => { - const elBounds = child.getBoundingClientRect() + nextState.indicators = elements.map((element, idx) => { + const elBounds = element.getBoundingClientRect() let indicator = { top: Math.round(elBounds.top + scrollY - deviceBounds.top + offset), left: Math.round(elBounds.left + scrollX - deviceBounds.left + offset), @@ -160,15 +158,15 @@ // observer to determine whether each indicator should be visible if (multi) { const callback = createIntersectionCallback(idx) - const observer = new IntersectionObserver(callback, { + const intersectionObserver = new IntersectionObserver(callback, { threshold: 1, root: device, }) - observer.observe(child) - observers.push(observer) + intersectionObserver.observe(element) + intersectionObservers.push(intersectionObserver) indicator.visible = false - indicator.insideSidePanel = !!child.closest(".side-panel") - indicator.insideModal = !!child.closest(".modal-content") + indicator.insideSidePanel = !!element.closest(".side-panel") + indicator.insideModal = !!element.closest(".modal-content") } return indicator @@ -189,7 +187,7 @@ }) onDestroy(() => { - observer.disconnect() + mutationObserver.disconnect() clearInterval(interval) document.removeEventListener("scroll", debouncedUpdate, true) }) diff --git a/packages/client/src/components/preview/SettingsBar.svelte b/packages/client/src/components/preview/SettingsBar.svelte index 09706726bb..ec861ab5b4 100644 --- a/packages/client/src/components/preview/SettingsBar.svelte +++ b/packages/client/src/components/preview/SettingsBar.svelte @@ -22,7 +22,6 @@ let insideGrid = false let gridHAlign let gridVAlign - let deviceEl $: id = $builderStore.selectedComponentId $: id, reset() @@ -114,6 +113,7 @@ } // Batch reads to minimize reflow + const deviceEl = document.getElementById("clip-root") const deviceBounds = deviceEl.getBoundingClientRect() const elBounds = domBoundary.getBoundingClientRect() const width = self.offsetWidth @@ -177,7 +177,6 @@ const debouncedUpdate = Utils.domDebounce(updatePosition) onMount(() => { - deviceEl = document.getElementById("clip-root") debouncedUpdate() interval = setInterval(debouncedUpdate, 100) document.addEventListener("scroll", debouncedUpdate, true) From d6f33b219101508e4883b8390b5c56570873a917 Mon Sep 17 00:00:00 2001 From: Andrew Kingston Date: Mon, 12 Aug 2024 16:13:47 +0100 Subject: [PATCH 080/180] Change how z-index is applied to the dragged element --- .../src/components/app/container/GridContainer.svelte | 5 ++++- .../src/components/preview/GridDNDHandler.svelte | 11 +---------- 2 files changed, 5 insertions(+), 11 deletions(-) diff --git a/packages/client/src/components/app/container/GridContainer.svelte b/packages/client/src/components/app/container/GridContainer.svelte index 39358484a6..6cc95e286e 100644 --- a/packages/client/src/components/app/container/GridContainer.svelte +++ b/packages/client/src/components/app/container/GridContainer.svelte @@ -150,7 +150,7 @@ display: grid; gap: 0; grid-template-rows: repeat(var(--rows), calc(var(--row-size) * 1px)); - grid-template-columns: repeat(var(--cols), 1fr); + grid-template-columns: repeat(var(--cols), calc(var(--col-size) * 1px)); position: relative; } .underlay { @@ -185,6 +185,9 @@ outline: 2px solid var(--spectrum-global-color-static-blue-200); pointer-events: none !important; } + :global(.grid.highlight > .component.dragging) { + z-index: 999 !important; + } /* Ensure all top level children have grid styles applied */ .grid :global(> .component) { diff --git a/packages/client/src/components/preview/GridDNDHandler.svelte b/packages/client/src/components/preview/GridDNDHandler.svelte index 1d566f7416..db19c460c1 100644 --- a/packages/client/src/components/preview/GridDNDHandler.svelte +++ b/packages/client/src/components/preview/GridDNDHandler.svelte @@ -29,20 +29,11 @@ // Set ephemeral styles $: instance = componentStore.actions.getComponentInstance(id) - $: $instance?.setEphemeralStyles(enrichComponentStyles($styles)) + $: $instance?.setEphemeralStyles($styles) // Sugar for a combination of both min and max const minMax = (value, min, max) => Math.min(max, Math.max(min, value)) - const enrichComponentStyles = styles => { - let clone = { ...styles } - if (styles) { - clone["z-index"] = 999 - clone["pointer-events"] = "none" - } - return clone - } - const processEvent = Utils.domDebounce((mouseX, mouseY) => { if (!dragInfo?.grid) { return From 96882e7eca0309a0da43693e2bfb86f69377bcd8 Mon Sep 17 00:00:00 2001 From: Andrew Kingston Date: Mon, 12 Aug 2024 19:27:33 +0100 Subject: [PATCH 081/180] Improve performance of styleable util --- packages/client/src/utils/styleable.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/client/src/utils/styleable.js b/packages/client/src/utils/styleable.js index dc6e8f5e26..0f484a9ab9 100644 --- a/packages/client/src/utils/styleable.js +++ b/packages/client/src/utils/styleable.js @@ -5,11 +5,11 @@ import { builderStore } from "stores" */ export const buildStyleString = (styleObject, customStyles) => { let str = "" - Object.entries(styleObject || {}).forEach(([style, value]) => { - if (style && value != null) { - str += `${style}: ${value}; ` + for (let key of Object.keys(styleObject || {})) { + if (styleObject[key] != null) { + str += `${key}:${styleObject[key]};` } - }) + } return str + (customStyles || "") } From ead4be7b88bc3052c78e8ded4fd1cb5c2221b627 Mon Sep 17 00:00:00 2001 From: Andrew Kingston Date: Tue, 13 Aug 2024 09:09:53 +0100 Subject: [PATCH 082/180] Add padding at bottom of grid for screen level grids --- packages/client/src/components/Screen.svelte | 2 +- .../components/app/container/GridContainer.svelte | 13 ++++++++++--- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/packages/client/src/components/Screen.svelte b/packages/client/src/components/Screen.svelte index 3c8fcf97e3..2d62b2f810 100644 --- a/packages/client/src/components/Screen.svelte +++ b/packages/client/src/components/Screen.svelte @@ -14,7 +14,7 @@ // Get the screen definition for the current route $: screen = $screenStore.activeScreen - $: screenDefinition = { cols: 24, rows: 24, ...screen?.props } + $: screenDefinition = { ...screen?.props, addEmptyRows: true } $: onLoadActions.set(screen?.onLoad) $: runOnLoadActions($onLoadActions, params) diff --git a/packages/client/src/components/app/container/GridContainer.svelte b/packages/client/src/components/app/container/GridContainer.svelte index 6cc95e286e..d14108e178 100644 --- a/packages/client/src/components/app/container/GridContainer.svelte +++ b/packages/client/src/components/app/container/GridContainer.svelte @@ -4,6 +4,8 @@ import { GridRowHeight, GridColumns } from "constants" import { memo } from "@budibase/frontend-core" + export let addEmptyRows = false + const component = getContext("component") const { styleable, builderStore } = getContext("sdk") const context = getContext("context") @@ -16,7 +18,7 @@ let mounted = false let styles = memo({}) - $: requiredRows = calculateRequiredRows($children, mobile) + $: requiredRows = calculateRequiredRows($children, mobile, addEmptyRows) $: requiredHeight = requiredRows * GridRowHeight $: availableRows = Math.floor(height / GridRowHeight) $: rows = Math.max(requiredRows, availableRows) @@ -39,7 +41,7 @@ // Calculates the minimum number of rows required to render all child // components, on a certain device type - const calculateRequiredRows = (children, mobile) => { + const calculateRequiredRows = (children, mobile, addEmptyRows) => { const key = mobile ? "mobileRowEnd" : "desktopRowEnd" let max = 2 for (let id of Object.keys(children)) { @@ -47,7 +49,12 @@ max = children[id][key] } } - return max - 1 + let rows = max - 1 + if (addEmptyRows) { + return Math.ceil((rows + 10) / 10) * 10 + } else { + return rows + } } // Stores metadata about a child node as constraints for determining grid size From 73cc871a5eb25db32c6687c624a4f7504ab3fb63 Mon Sep 17 00:00:00 2001 From: Andrew Kingston Date: Tue, 13 Aug 2024 09:14:42 +0100 Subject: [PATCH 083/180] Avoid name clashing --- .../src/components/app/container/GridContainer.svelte | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/packages/client/src/components/app/container/GridContainer.svelte b/packages/client/src/components/app/container/GridContainer.svelte index d14108e178..3c56f9517c 100644 --- a/packages/client/src/components/app/container/GridContainer.svelte +++ b/packages/client/src/components/app/container/GridContainer.svelte @@ -13,7 +13,6 @@ let width let height let ref - let rows = 1 let children = writable({}) let mounted = false let styles = memo({}) @@ -49,11 +48,11 @@ max = children[id][key] } } - let rows = max - 1 + let requiredRows = max - 1 if (addEmptyRows) { - return Math.ceil((rows + 10) / 10) * 10 + return Math.ceil((requiredRows + 10) / 10) * 10 } else { - return rows + return requiredRows } } From 78953848bbfd0deb20846e2c45e549532b8984e3 Mon Sep 17 00:00:00 2001 From: Andrew Kingston Date: Tue, 13 Aug 2024 09:19:16 +0100 Subject: [PATCH 084/180] Fix variable name error in indicator sets --- packages/client/src/components/preview/IndicatorSet.svelte | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/client/src/components/preview/IndicatorSet.svelte b/packages/client/src/components/preview/IndicatorSet.svelte index dfea20a45f..4af1224622 100644 --- a/packages/client/src/components/preview/IndicatorSet.svelte +++ b/packages/client/src/components/preview/IndicatorSet.svelte @@ -67,14 +67,14 @@ } const createIntersectionCallback = idx => entries => { - if (callbackCount >= observers.length) { + if (callbackCount >= intersectionObservers.length) { return } nextState.indicators[idx].visible = nextState.indicators[idx].insideModal || nextState.indicators[idx].insideSidePanel || entries[0].isIntersecting - if (++callbackCount === observers.length) { + if (++callbackCount === intersectionObservers.length) { state = nextState updating = false } From 0875d0c5e1aebef226d8285a8fa82597aacc811f Mon Sep 17 00:00:00 2001 From: Andrew Kingston Date: Tue, 13 Aug 2024 09:52:10 +0100 Subject: [PATCH 085/180] Only show empty rows in grid layouts when in the builder --- .../src/components/app/container/GridContainer.svelte | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/packages/client/src/components/app/container/GridContainer.svelte b/packages/client/src/components/app/container/GridContainer.svelte index 3c56f9517c..f332e197c3 100644 --- a/packages/client/src/components/app/container/GridContainer.svelte +++ b/packages/client/src/components/app/container/GridContainer.svelte @@ -17,7 +17,12 @@ let mounted = false let styles = memo({}) - $: requiredRows = calculateRequiredRows($children, mobile, addEmptyRows) + $: inBuilder = $builderStore.inBuilder + $: requiredRows = calculateRequiredRows( + $children, + mobile, + addEmptyRows && inBuilder + ) $: requiredHeight = requiredRows * GridRowHeight $: availableRows = Math.floor(height / GridRowHeight) $: rows = Math.max(requiredRows, availableRows) @@ -133,7 +138,7 @@ data-cols={GridColumns} data-col-size={colSize} > - {#if $builderStore.inBuilder} + {#if inBuilder}
{#each { length: GridColumns * rows } as _, idx}
From 7a9730b120817a004a3039157591de408760a24e Mon Sep 17 00:00:00 2001 From: Andrew Kingston Date: Wed, 14 Aug 2024 09:24:03 +0100 Subject: [PATCH 086/180] Fix ephemeral styles not clearing properly --- packages/client/src/components/Component.svelte | 3 +++ 1 file changed, 3 insertions(+) diff --git a/packages/client/src/components/Component.svelte b/packages/client/src/components/Component.svelte index 3d081f5a61..0dcf93a5dc 100644 --- a/packages/client/src/components/Component.svelte +++ b/packages/client/src/components/Component.svelte @@ -262,6 +262,9 @@ lastInstanceKey = instanceKey } + // Reset ephemeral state + ephemeralStyles = null + // Pull definition and constructor const component = instance._component constructor = componentStore.actions.getComponentConstructor(component) From 6baf784f4aed847e1957fd10c06ca212ed73192c Mon Sep 17 00:00:00 2001 From: Andrew Kingston Date: Wed, 14 Aug 2024 09:59:02 +0100 Subject: [PATCH 087/180] Ensure images are contained when used inside grids --- .../src/components/app/container/GridContainer.svelte | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/packages/client/src/components/app/container/GridContainer.svelte b/packages/client/src/components/app/container/GridContainer.svelte index f332e197c3..088c41b57b 100644 --- a/packages/client/src/components/app/container/GridContainer.svelte +++ b/packages/client/src/components/app/container/GridContainer.svelte @@ -255,4 +255,10 @@ flex: 1 1 0 !important; height: 0 !important; } + + /* Grid specific CSS overrides for certain components */ + .grid :global(> .component > img) { + object-fit: contain; + max-height: 100%; + } From d36fef5c86ae9337d1ab0e9299d97adf394c2e93 Mon Sep 17 00:00:00 2001 From: Andrew Kingston Date: Wed, 14 Aug 2024 10:09:59 +0100 Subject: [PATCH 088/180] Fix indicators around modals and side panels when used inside grids --- packages/client/manifest.json | 88 +++++++++++++++---- .../client/src/components/Component.svelte | 3 +- .../app/container/GridContainer.svelte | 2 +- packages/client/src/utils/grid.js | 28 +++++- 4 files changed, 99 insertions(+), 22 deletions(-) diff --git a/packages/client/manifest.json b/packages/client/manifest.json index f232318c53..9851fd1155 100644 --- a/packages/client/manifest.json +++ b/packages/client/manifest.json @@ -18,14 +18,37 @@ "numberLike": { "supported": ["number", "boolean"], "partialSupport": [ - { "type": "longform", "message": "stringAsNumber" }, - { "type": "string", "message": "stringAsNumber" }, - { "type": "bigint", "message": "stringAsNumber" }, - { "type": "options", "message": "stringAsNumber" }, - { "type": "formula", "message": "stringAsNumber" }, - { "type": "datetime", "message": "dateAsNumber" } + { + "type": "longform", + "message": "stringAsNumber" + }, + { + "type": "string", + "message": "stringAsNumber" + }, + { + "type": "bigint", + "message": "stringAsNumber" + }, + { + "type": "options", + "message": "stringAsNumber" + }, + { + "type": "formula", + "message": "stringAsNumber" + }, + { + "type": "datetime", + "message": "dateAsNumber" + } ], - "unsupported": [{ "type": "json", "message": "jsonPrimitivesOnly" }] + "unsupported": [ + { + "type": "json", + "message": "jsonPrimitivesOnly" + } + ] }, "stringLike": { "supported": [ @@ -37,19 +60,47 @@ "boolean", "datetime" ], - "unsupported": [{ "type": "json", "message": "jsonPrimitivesOnly" }] + "unsupported": [ + { + "type": "json", + "message": "jsonPrimitivesOnly" + } + ] }, "datetimeLike": { "supported": ["datetime"], "partialSupport": [ - { "type": "longform", "message": "stringAsDate" }, - { "type": "string", "message": "stringAsDate" }, - { "type": "options", "message": "stringAsDate" }, - { "type": "formula", "message": "stringAsDate" }, - { "type": "bigint", "message": "stringAsDate" }, - { "type": "number", "message": "numberAsDate" } + { + "type": "longform", + "message": "stringAsDate" + }, + { + "type": "string", + "message": "stringAsDate" + }, + { + "type": "options", + "message": "stringAsDate" + }, + { + "type": "formula", + "message": "stringAsDate" + }, + { + "type": "bigint", + "message": "stringAsDate" + }, + { + "type": "number", + "message": "numberAsDate" + } ], - "unsupported": [{ "type": "json", "message": "jsonPrimitivesOnly" }] + "unsupported": [ + { + "type": "json", + "message": "jsonPrimitivesOnly" + } + ] } }, "layout": { @@ -4292,7 +4343,10 @@ "label": "High", "value": 3136 }, - { "label": "Custom", "value": "custom" } + { + "label": "Custom", + "value": "custom" + } ] }, { @@ -7148,6 +7202,7 @@ "name": "Side Panel", "icon": "RailRight", "hasChildren": true, + "ignoresLayout": true, "illegalChildren": ["section", "sidepanel", "modal"], "showEmptyState": false, "draggable": false, @@ -7171,6 +7226,7 @@ "icon": "MBox", "hasChildren": true, "illegalChildren": ["section", "modal", "sidepanel"], + "ignoresLayout": true, "showEmptyState": false, "draggable": false, "info": "Modals are hidden by default. They will only be revealed when triggered by the 'Open Modal' action.", diff --git a/packages/client/src/components/Component.svelte b/packages/client/src/components/Component.svelte index 0dcf93a5dc..12dfaaf6d3 100644 --- a/packages/client/src/components/Component.svelte +++ b/packages/client/src/components/Component.svelte @@ -209,8 +209,9 @@ // Metadata to pass into grid action to apply CSS let gridMetadata = memo() $: gridMetadata.set({ - active: + insideGrid: parent?._component.endsWith("/container") && parent?.layout === "grid", + ignoresLayout: definition.ignoresLayout === true, id, interactive, styles: normalStyles, diff --git a/packages/client/src/components/app/container/GridContainer.svelte b/packages/client/src/components/app/container/GridContainer.svelte index 088c41b57b..1f68926658 100644 --- a/packages/client/src/components/app/container/GridContainer.svelte +++ b/packages/client/src/components/app/container/GridContainer.svelte @@ -201,7 +201,7 @@ } /* Ensure all top level children have grid styles applied */ - .grid :global(> .component) { + .grid :global(> .component:not(.ignores-layout)) { display: flex; overflow: auto; pointer-events: all; diff --git a/packages/client/src/utils/grid.js b/packages/client/src/utils/grid.js index afce01bbaa..b9b08a28a6 100644 --- a/packages/client/src/utils/grid.js +++ b/packages/client/src/utils/grid.js @@ -59,9 +59,24 @@ export const gridLayout = (node, metadata) => { // Applies the required listeners, CSS and classes to a component DOM node const applyMetadata = metadata => { - const { id, styles, interactive, errored, definition, draggable, active } = - metadata - if (!active) { + const { + id, + styles, + interactive, + errored, + definition, + draggable, + insideGrid, + ignoresLayout, + } = metadata + if (!insideGrid) { + return + } + + // If this component ignores layout, flag it as such so that we can avoid + // selecting it later + if (ignoresLayout) { + node.classList.add("ignores-layout") return } @@ -143,7 +158,12 @@ export const gridLayout = (node, metadata) => { // Removes the previously set up listeners const removeListeners = () => { - node.removeEventListener("click", selectComponent, false) + // By checking if this is defined we can avoid trying to remove event + // listeners on every component + if (selectComponent) { + node.removeEventListener("click", selectComponent, false) + selectComponent = null + } } applyMetadata(metadata) From 83e7b2d3e2fc3d8f46c8f567af8125738ec5ef8b Mon Sep 17 00:00:00 2001 From: Andrew Kingston Date: Wed, 14 Aug 2024 10:16:01 +0100 Subject: [PATCH 089/180] Move side panel into correct DOM position --- .../client/src/components/app/Layout.svelte | 30 ++++++++++--------- 1 file changed, 16 insertions(+), 14 deletions(-) diff --git a/packages/client/src/components/app/Layout.svelte b/packages/client/src/components/app/Layout.svelte index a1ce77df72..76634d2df3 100644 --- a/packages/client/src/components/app/Layout.svelte +++ b/packages/client/src/components/app/Layout.svelte @@ -322,20 +322,22 @@
-
-
-
- +
+
+ +
From f99ae6b96efffcc9ed99c27dd2a00be73a8bbcee Mon Sep 17 00:00:00 2001 From: Andrew Kingston Date: Wed, 14 Aug 2024 10:26:44 +0100 Subject: [PATCH 090/180] Ensure modals are rendered in the correct DOM position --- packages/client/src/components/ClientApp.svelte | 3 --- packages/client/src/components/app/Layout.svelte | 1 + 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/packages/client/src/components/ClientApp.svelte b/packages/client/src/components/ClientApp.svelte index 118aa483ab..516f505d21 100644 --- a/packages/client/src/components/ClientApp.svelte +++ b/packages/client/src/components/ClientApp.svelte @@ -235,9 +235,6 @@ /> {/key} - -
+
From b62371d1be8d5c676be18caf585b5183a3743670 Mon Sep 17 00:00:00 2001 From: Andrew Kingston Date: Wed, 14 Aug 2024 10:59:06 +0100 Subject: [PATCH 091/180] Allow moving grid components using the label --- packages/client/manifest.json | 28 +++++++++---------- .../components/preview/GridDNDHandler.svelte | 19 ++++++++----- .../src/components/preview/Indicator.svelte | 17 +++++++++-- packages/client/src/utils/grid.js | 9 ++++-- 4 files changed, 48 insertions(+), 25 deletions(-) diff --git a/packages/client/manifest.json b/packages/client/manifest.json index 9851fd1155..db276df8bc 100644 --- a/packages/client/manifest.json +++ b/packages/client/manifest.json @@ -3040,7 +3040,7 @@ "editable": true, "size": { "width": 400, - "height": 32 + "height": 60 }, "settings": [ { @@ -3071,7 +3071,7 @@ "editable": true, "size": { "width": 400, - "height": 32 + "height": 60 }, "settings": [ { @@ -3207,7 +3207,7 @@ "editable": true, "size": { "width": 400, - "height": 50 + "height": 60 }, "settings": [ { @@ -3309,7 +3309,7 @@ "editable": true, "size": { "width": 400, - "height": 50 + "height": 60 }, "settings": [ { @@ -3395,7 +3395,7 @@ "editable": true, "size": { "width": 400, - "height": 50 + "height": 60 }, "settings": [ { @@ -3481,7 +3481,7 @@ "editable": true, "size": { "width": 400, - "height": 50 + "height": 60 }, "settings": [ { @@ -3695,7 +3695,7 @@ "editable": true, "size": { "width": 400, - "height": 50 + "height": 60 }, "settings": [ { @@ -3901,8 +3901,8 @@ "editable": true, "requiredAncestors": ["form"], "size": { - "width": 20, - "height": 20 + "width": 400, + "height": 60 }, "settings": [ { @@ -4028,7 +4028,7 @@ "editable": true, "size": { "width": 400, - "height": 150 + "height": 100 }, "settings": [ { @@ -4152,7 +4152,7 @@ "editable": true, "size": { "width": 400, - "height": 50 + "height": 60 }, "settings": [ { @@ -4270,7 +4270,7 @@ "styles": ["size"], "size": { "width": 400, - "height": 50 + "height": 60 }, "settings": [ { @@ -4430,7 +4430,7 @@ "styles": ["size"], "size": { "width": 400, - "height": 50 + "height": 60 }, "settings": [ { @@ -4785,7 +4785,7 @@ "editable": true, "size": { "width": 400, - "height": 50 + "height": 60 }, "settings": [ { diff --git a/packages/client/src/components/preview/GridDNDHandler.svelte b/packages/client/src/components/preview/GridDNDHandler.svelte index db19c460c1..ad3a5a3ae1 100644 --- a/packages/client/src/components/preview/GridDNDHandler.svelte +++ b/packages/client/src/components/preview/GridDNDHandler.svelte @@ -3,7 +3,13 @@ import { builderStore, componentStore } from "stores" import { Utils, memo } from "@budibase/frontend-core" import { GridRowHeight } from "constants" - import { isGridEvent, GridParams, getGridVar, Devices } from "utils/grid" + import { + isGridEvent, + GridParams, + getGridVar, + Devices, + GridDragModes, + } from "utils/grid" const context = getContext("context") @@ -49,7 +55,7 @@ let deltaX = Math.round(diffX / colSize) const diffY = mouseY - startY let deltaY = Math.round(diffY / GridRowHeight) - if (mode === "move") { + if (mode === GridDragModes.Move) { deltaX = minMax(deltaX, 1 - colStart, cols + 1 - colEnd) deltaY = Math.max(deltaY, 1 - rowStart) const newStyles = { @@ -59,7 +65,7 @@ [vars.rowEnd]: rowEnd + deltaY, } styles.set(newStyles) - } else if (mode === "resize") { + } else if (mode === GridDragModes.Resize) { let newStyles = {} if (side === "right") { newStyles[vars.colEnd] = Math.max(colEnd + deltaX, colStart + 1) @@ -103,14 +109,13 @@ // Extract state let mode, id, side - if (e.target.classList.contains("anchor")) { - // Handle resize - mode = "resize" + if (e.target.dataset.indicator === "true") { + mode = e.target.dataset.dragMode id = e.target.dataset.id side = e.target.dataset.side } else { // Handle move - mode = "move" + mode = GridDragModes.Move const component = e.target.closest(".component") id = component.dataset.id } diff --git a/packages/client/src/components/preview/Indicator.svelte b/packages/client/src/components/preview/Indicator.svelte index 112d392354..dce7945b29 100644 --- a/packages/client/src/components/preview/Indicator.svelte +++ b/packages/client/src/components/preview/Indicator.svelte @@ -1,5 +1,6 @@ @@ -58,13 +58,13 @@ onConfirm={confirmScreenDetails} {onCancel} cancelText={"Back"} - disabled={!screenUrl || error || !touched} + disabled={!route || error || !touched} >
modal.confirm()}>
diff --git a/packages/builder/src/components/design/settings/controls/DataSourceSelect/DataSourceSelect.svelte b/packages/builder/src/components/design/settings/controls/DataSourceSelect/DataSourceSelect.svelte index 99b5ace847..410af53648 100644 --- a/packages/builder/src/components/design/settings/controls/DataSourceSelect/DataSourceSelect.svelte +++ b/packages/builder/src/components/design/settings/controls/DataSourceSelect/DataSourceSelect.svelte @@ -34,6 +34,7 @@ import ClientBindingPanel from "components/common/bindings/ClientBindingPanel.svelte" import DataSourceCategory from "components/design/settings/controls/DataSourceSelect/DataSourceCategory.svelte" import { API } from "api" + import { datasourceSelect as format } from "helpers/data/format" export let value = {} export let otherSources @@ -51,24 +52,15 @@ let modal $: text = value?.label ?? "Choose an option" - $: tables = $tablesStore.list.map(m => ({ - label: m.name, - tableId: m._id, - type: "table", - datasource: $datasources.list.find( - ds => ds._id === m.sourceId || m.datasourceId - ), - })) + $: tables = $tablesStore.list.map(table => + format.table(table, $datasources.list) + ) $: viewsV1 = $viewsStore.list.map(view => ({ ...view, label: view.name, type: "view", })) - $: viewsV2 = $viewsV2Store.list.map(view => ({ - ...view, - label: view.name, - type: "viewV2", - })) + $: viewsV2 = $viewsV2Store.list.map(format.viewV2) $: views = [...(viewsV1 || []), ...(viewsV2 || [])] $: queries = $queriesStore.list .filter(q => showAllQueries || q.queryVerb === "read" || q.readable) diff --git a/packages/builder/src/components/design/settings/controls/TableSelect.svelte b/packages/builder/src/components/design/settings/controls/TableSelect.svelte index 7b73d0a7cf..545110a8cc 100644 --- a/packages/builder/src/components/design/settings/controls/TableSelect.svelte +++ b/packages/builder/src/components/design/settings/controls/TableSelect.svelte @@ -2,24 +2,14 @@ import { Select } from "@budibase/bbui" import { createEventDispatcher, onMount } from "svelte" import { tables as tablesStore, viewsV2 } from "stores/builder" + import { tableSelect as format } from "helpers/data/format" export let value const dispatch = createEventDispatcher() - $: tables = $tablesStore.list.map(table => ({ - type: "table", - label: table.name, - tableId: table._id, - resourceId: table._id, - })) - $: views = $viewsV2.list.map(view => ({ - type: "viewV2", - id: view.id, - label: view.name, - tableId: view.tableId, - resourceId: view.id, - })) + $: tables = $tablesStore.list.map(format.table) + $: views = $viewsV2.list.map(format.viewV2) $: options = [...(tables || []), ...(views || [])] const onChange = e => { diff --git a/packages/builder/src/helpers/data/format.js b/packages/builder/src/helpers/data/format.js new file mode 100644 index 0000000000..51b0f12566 --- /dev/null +++ b/packages/builder/src/helpers/data/format.js @@ -0,0 +1,31 @@ +export const datasourceSelect = { + table: (table, datasources) => ({ + label: table.name, + tableId: table._id, + type: "table", + datasource: datasources.find( + datasource => datasource._id === table.sourceId || table.datasourceId + ), + }), + viewV2: view => ({ + ...view, + label: view.name, + type: "viewV2", + }), +} + +export const tableSelect = { + table: table => ({ + type: "table", + label: table.name, + tableId: table._id, + resourceId: table._id, + }), + viewV2: view => ({ + type: "viewV2", + id: view.id, + label: view.name, + tableId: view.tableId, + resourceId: view.id, + }), +} diff --git a/packages/builder/src/pages/builder/app/[application]/design/[screenId]/_components/ScreenList/ScreenNavItem.svelte b/packages/builder/src/pages/builder/app/[application]/design/[screenId]/_components/ScreenList/ScreenNavItem.svelte index 2a0da6bac3..e533145fa1 100644 --- a/packages/builder/src/pages/builder/app/[application]/design/[screenId]/_components/ScreenList/ScreenNavItem.svelte +++ b/packages/builder/src/pages/builder/app/[application]/design/[screenId]/_components/ScreenList/ScreenNavItem.svelte @@ -20,7 +20,7 @@ let confirmDeleteDialog let screenDetailsModal - const createDuplicateScreen = async ({ screenName, screenUrl }) => { + const createDuplicateScreen = async ({ route }) => { // Create a dupe and ensure it is unique let duplicateScreen = Helpers.cloneDeep(screen) delete duplicateScreen._id @@ -28,9 +28,8 @@ duplicateScreen.props = makeComponentUnique(duplicateScreen.props) // Attach the new name and URL - duplicateScreen.routing.route = sanitizeUrl(screenUrl) + duplicateScreen.routing.route = sanitizeUrl(route) duplicateScreen.routing.homeScreen = false - duplicateScreen.props._instanceName = screenName try { // Create the screen @@ -136,8 +135,8 @@ diff --git a/packages/builder/src/pages/builder/app/[application]/design/_components/NewScreen/CreateScreenModal.svelte b/packages/builder/src/pages/builder/app/[application]/design/_components/NewScreen/CreateScreenModal.svelte index 7c2775e054..554a2c80f5 100644 --- a/packages/builder/src/pages/builder/app/[application]/design/_components/NewScreen/CreateScreenModal.svelte +++ b/packages/builder/src/pages/builder/app/[application]/design/_components/NewScreen/CreateScreenModal.svelte @@ -1,8 +1,9 @@ - - - - Select which datasources you would like to use to create your screens - - - {#each datasources as datasource} -
-
- -
{datasource.name}
-
- - {#each datasource.tablesAndViews as tableOrView} - {@const selected = selectedTablesAndViews.some( - selected => selected.id === tableOrView.id - )} - toggleSelection(tableOrView)} - {selected} - {tableOrView} - /> - {/each} + + + Select which datasources you would like to use to create your screens + + + {#each datasources as datasource} +
+
+ +

{datasource.name}

- {/each} - - - + + {#each datasource.tablesAndViews as tableOrView} + {@const selected = selectedTablesAndViews.some( + selected => selected.id === tableOrView.id + )} + toggleSelection(tableOrView)} + {selected} + {tableOrView} + /> + {/each} +
+ {/each} +
+
diff --git a/packages/builder/src/pages/builder/app/[application]/design/_components/NewScreen/FormTypeModal.svelte b/packages/builder/src/pages/builder/app/[application]/design/_components/NewScreen/FormTypeModal.svelte deleted file mode 100644 index b7108fd9aa..0000000000 --- a/packages/builder/src/pages/builder/app/[application]/design/_components/NewScreen/FormTypeModal.svelte +++ /dev/null @@ -1,115 +0,0 @@ - - - - onConfirm(type)} - {onCancel} - disabled={!type} - size="L" - > - - - -
(type = "Create")} - > -
-
- Create a new row - - For capturing and storing new data from your users - -
- {#if type === "Create"} - - - - {/if} -
-
-
(type = "Update")} - > -
-
- Update an existing row - For viewing and updating existing data -
- {#if type === "Update"} - - - - {/if} -
-
-
(type = "View")} - > -
-
- View an existing row - For a read only view of your data -
- {#if type === "View"} - - - - {/if} -
-
-
-
-
- - diff --git a/packages/builder/src/pages/builder/app/[application]/design/_components/NewScreen/TableOrViewOption.svelte b/packages/builder/src/pages/builder/app/[application]/design/_components/NewScreen/TableOrViewOption.svelte index b0b9f3dfc1..47a4a834ff 100644 --- a/packages/builder/src/pages/builder/app/[application]/design/_components/NewScreen/TableOrViewOption.svelte +++ b/packages/builder/src/pages/builder/app/[application]/design/_components/NewScreen/TableOrViewOption.svelte @@ -1,49 +1,14 @@
-
- - {tableOrView.name} -
- -
- -
- read - -
-
- -
- write - -
-
-
+ + {tableOrView.name}
diff --git a/packages/builder/src/pages/builder/app/[application]/design/_components/NewScreen/TypeModal.svelte b/packages/builder/src/pages/builder/app/[application]/design/_components/NewScreen/TypeModal.svelte new file mode 100644 index 0000000000..045e3000e7 --- /dev/null +++ b/packages/builder/src/pages/builder/app/[application]/design/_components/NewScreen/TypeModal.svelte @@ -0,0 +1,82 @@ + + + onConfirm(selectedType)} + {onCancel} + disabled={!selectedType} + size="L" +> + + + + {#each types as type} +
(selectedType = type.id)} + > +
+ {type.img.alt} +
+
+ {type.title} + {type.description} +
+
+ {/each} +
+
+ + diff --git a/packages/builder/src/pages/builder/app/[application]/design/_components/NewScreen/formTypes.js b/packages/builder/src/pages/builder/app/[application]/design/_components/NewScreen/formTypes.js new file mode 100644 index 0000000000..c1e0d93f5a --- /dev/null +++ b/packages/builder/src/pages/builder/app/[application]/design/_components/NewScreen/formTypes.js @@ -0,0 +1,35 @@ +import formView from "./images/formView.svg" +import formUpdate from "./images/formUpdate.svg" +import formCreate from "./images/formCreate.svg" + +const tableTypes = [ + { + id: "create", + img: { + alt: "A form containing new data", + src: formCreate, + }, + title: "Create a new row", + description: "For capturing and storing new data from your users", + }, + { + id: "update", + img: { + alt: "A form containing edited data", + src: formUpdate, + }, + title: "Update an existing row", + description: "For viewing and updating existing data", + }, + { + id: "view", + img: { + alt: "A form containing read-only data", + src: formView, + }, + title: "View an existing row", + description: "For a read only view of your data", + }, +] + +export default tableTypes diff --git a/packages/builder/src/pages/builder/app/[application]/design/_components/NewScreen/images/blank.png b/packages/builder/src/pages/builder/app/[application]/design/_components/NewScreen/images/blank.png deleted file mode 100644 index 4867cc8dc312698b7e7ec47e90020324ed2ec714..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32283 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 + + + + + + + + + + + + + + diff --git a/packages/builder/src/pages/builder/app/[application]/design/_components/NewScreen/images/form.png b/packages/builder/src/pages/builder/app/[application]/design/_components/NewScreen/images/form.png deleted file mode 100644 index cb9b57d23b2374949084af5d03e269f66fdabfe5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22892 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 Yvyx9Zl9yZ6P*V{!Tpauu`1b++LgmxO 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 + + + + + + + + + + + + + + + + + + + diff --git a/packages/builder/src/pages/builder/app/[application]/design/_components/NewScreen/images/formUpdate.svg b/packages/builder/src/pages/builder/app/[application]/design/_components/NewScreen/images/formUpdate.svg new file mode 100644 index 0000000000..674dbb12cc --- /dev/null +++ b/packages/builder/src/pages/builder/app/[application]/design/_components/NewScreen/images/formUpdate.svg @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/packages/builder/src/pages/builder/app/[application]/design/_components/NewScreen/images/formView.svg b/packages/builder/src/pages/builder/app/[application]/design/_components/NewScreen/images/formView.svg new file mode 100644 index 0000000000..0b65846b16 --- /dev/null +++ b/packages/builder/src/pages/builder/app/[application]/design/_components/NewScreen/images/formView.svg @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/packages/builder/src/pages/builder/app/[application]/design/_components/NewScreen/images/grid.png b/packages/builder/src/pages/builder/app/[application]/design/_components/NewScreen/images/grid.png deleted file mode 100644 index c3efa30a67d733434fade938263e4aba9fd7cdee..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24819 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
pwl7ZpfAcYm`GJ3 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 A%K!iX diff --git a/packages/builder/src/pages/builder/app/[application]/design/_components/NewScreen/images/tableInline.png b/packages/builder/src/pages/builder/app/[application]/design/_components/NewScreen/images/tableInline.png deleted file mode 100644 index 905294a9ae3fd9d5a0c01605770ca5fed5cfb245..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22018 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 dOU1sd{QoE~Vrd>j + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/packages/builder/src/pages/builder/app/[application]/design/_components/NewScreen/images/tableModal.svg b/packages/builder/src/pages/builder/app/[application]/design/_components/NewScreen/images/tableModal.svg new file mode 100644 index 0000000000..a638c0eec8 --- /dev/null +++ b/packages/builder/src/pages/builder/app/[application]/design/_components/NewScreen/images/tableModal.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/packages/builder/src/pages/builder/app/[application]/design/_components/NewScreen/images/tableNewScreen.svg b/packages/builder/src/pages/builder/app/[application]/design/_components/NewScreen/images/tableNewScreen.svg new file mode 100644 index 0000000000..462ddfc4a2 --- /dev/null +++ b/packages/builder/src/pages/builder/app/[application]/design/_components/NewScreen/images/tableNewScreen.svg @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/packages/builder/src/pages/builder/app/[application]/design/_components/NewScreen/images/tableSidePanel.svg b/packages/builder/src/pages/builder/app/[application]/design/_components/NewScreen/images/tableSidePanel.svg new file mode 100644 index 0000000000..c590f1ab70 --- /dev/null +++ b/packages/builder/src/pages/builder/app/[application]/design/_components/NewScreen/images/tableSidePanel.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/packages/builder/src/pages/builder/app/[application]/design/_components/NewScreen/index.svelte b/packages/builder/src/pages/builder/app/[application]/design/_components/NewScreen/index.svelte index ef07b277ef..3101ce41ea 100644 --- a/packages/builder/src/pages/builder/app/[application]/design/_components/NewScreen/index.svelte +++ b/packages/builder/src/pages/builder/app/[application]/design/_components/NewScreen/index.svelte @@ -1,10 +1,9 @@
@@ -106,51 +28,5 @@
-
-
- {#each displayColumns as column} -
- -
- {column.label} -
-
- toggleColumn(column, e.detail)} - value={columnToPermissionOptions(column)} - options={column.options} - /> - {/each} -
-
+
- - diff --git a/packages/frontend-core/src/components/grid/controls/ColumnsSettingContent.svelte b/packages/frontend-core/src/components/grid/controls/ColumnsSettingContent.svelte new file mode 100644 index 0000000000..b825ac1891 --- /dev/null +++ b/packages/frontend-core/src/components/grid/controls/ColumnsSettingContent.svelte @@ -0,0 +1,134 @@ + + +
+
+ {#each displayColumns as column} +
+ +
+ {column.label} +
+
+ toggleColumn(column, e.detail)} + value={columnToPermissionOptions(column)} + options={column.options} + /> + {/each} +
+
+ + From 3dcf17d4386ce737ba64204c996a992d197d6fca Mon Sep 17 00:00:00 2001 From: Adria Navarro Date: Mon, 19 Aug 2024 13:00:23 +0200 Subject: [PATCH 116/180] Fix initial visibility --- .../src/components/grid/controls/ColumnsSettingContent.svelte | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/frontend-core/src/components/grid/controls/ColumnsSettingContent.svelte b/packages/frontend-core/src/components/grid/controls/ColumnsSettingContent.svelte index b825ac1891..4f0e4424d4 100644 --- a/packages/frontend-core/src/components/grid/controls/ColumnsSettingContent.svelte +++ b/packages/frontend-core/src/components/grid/controls/ColumnsSettingContent.svelte @@ -73,7 +73,7 @@ }) function columnToPermissionOptions(column) { - if (!column.schema.visible) { + if (column.schema.visible === false) { return PERMISSION_OPTIONS.HIDDEN } From d17d2453740aa39e39f4ccb171cf83677bf4a324 Mon Sep 17 00:00:00 2001 From: Martin McKeaveney Date: Mon, 19 Aug 2024 12:08:48 +0100 Subject: [PATCH 117/180] allow values to be passed in secrets --- charts/budibase/templates/secrets.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/charts/budibase/templates/secrets.yaml b/charts/budibase/templates/secrets.yaml index 861442acac..a44d2c0d9b 100644 --- a/charts/budibase/templates/secrets.yaml +++ b/charts/budibase/templates/secrets.yaml @@ -23,7 +23,7 @@ data: jwtSecret: {{ template "budibase.defaultsecret" .Values.globals.jwtSecret }} objectStoreAccess: {{ template "budibase.defaultsecret" .Values.services.objectStore.accessKey }} objectStoreSecret: {{ template "budibase.defaultsecret" .Values.services.objectStore.secretKey }} - bbEncryptionKey: {{ template "budibase.defaultsecret" "" }} - apiEncryptionKey: {{ template "budibase.defaultsecret" "" }} + bbEncryptionKey: {{ template "budibase.defaultsecret" .Values.globals.bbEncryptionKey }} + apiEncryptionKey: {{ template "budibase.defaultsecret" .Values.globals.apiEncryptionKey }} {{- end }} {{- end }} From c841e7bef7194be974546a0109b199335e15cc0a Mon Sep 17 00:00:00 2001 From: Budibase Staging Release Bot <> Date: Mon, 19 Aug 2024 11:16:50 +0000 Subject: [PATCH 118/180] Bump version to 2.30.6 --- lerna.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lerna.json b/lerna.json index 990f21a1a8..593ea0d716 100644 --- a/lerna.json +++ b/lerna.json @@ -1,6 +1,6 @@ { "$schema": "node_modules/lerna/schemas/lerna-schema.json", - "version": "2.30.5", + "version": "2.30.6", "npmClient": "yarn", "packages": [ "packages/*", From 120d5d953d2d404db9e0a5f57d599fc11e4a7abf Mon Sep 17 00:00:00 2001 From: Adria Navarro Date: Fri, 9 Aug 2024 10:16:07 +0200 Subject: [PATCH 119/180] Fetch only table fields and validate --- packages/server/src/sdk/app/rows/search.ts | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/packages/server/src/sdk/app/rows/search.ts b/packages/server/src/sdk/app/rows/search.ts index 1ccd89639b..ea0b3bf5b6 100644 --- a/packages/server/src/sdk/app/rows/search.ts +++ b/packages/server/src/sdk/app/rows/search.ts @@ -73,6 +73,19 @@ export async function search( const table = await sdk.tables.getTable(options.tableId) options = searchInputMapping(table, options) + const visibleTableFields = Object.keys(table.schema).filter( + f => table.schema[f].visible !== false + ) + + if (options.fields) { + const tableFields = visibleTableFields.map(f => f.toLowerCase()) + options.fields = options.fields.filter(f => + tableFields.includes(f.toLowerCase()) + ) + } else { + options.fields = visibleTableFields + } + let result: SearchResponse if (isExternalTable) { span?.addTags({ searchType: "external" }) From 723dfee8c8a88f906d31c9cfac2f629c9c349402 Mon Sep 17 00:00:00 2001 From: Adria Navarro Date: Fri, 9 Aug 2024 10:41:10 +0200 Subject: [PATCH 120/180] Add field mapping tests --- .../sdk/app/rows/search/tests/search.spec.ts | 83 ++++++++++++++++--- 1 file changed, 72 insertions(+), 11 deletions(-) diff --git a/packages/server/src/sdk/app/rows/search/tests/search.spec.ts b/packages/server/src/sdk/app/rows/search/tests/search.spec.ts index 252b9a6556..339e7582fc 100644 --- a/packages/server/src/sdk/app/rows/search/tests/search.spec.ts +++ b/packages/server/src/sdk/app/rows/search/tests/search.spec.ts @@ -1,4 +1,4 @@ -import { Datasource, FieldType, Row, Table } from "@budibase/types" +import { Datasource, FieldType, Table } from "@budibase/types" import TestConfiguration from "../../../../../tests/utilities/TestConfiguration" import { search } from "../../../../../sdk/app/rows/search" @@ -32,7 +32,6 @@ describe.each([ let envCleanup: (() => void) | undefined let datasource: Datasource | undefined let table: Table - let rows: Row[] beforeAll(async () => { await withCoreEnv({ SQS_SEARCH_ENABLE: isSqs ? "true" : "false" }, () => @@ -51,7 +50,9 @@ describe.each([ datasource: await dsProvider, }) } + }) + beforeEach(async () => { table = await config.api.table.save( tableForDatasource(datasource, { primary: ["id"], @@ -81,16 +82,13 @@ describe.each([ }) ) - rows = [] for (let i = 0; i < 10; i++) { - rows.push( - await config.api.row.save(table._id!, { - name: generator.first(), - surname: generator.last(), - age: generator.age(), - address: generator.address(), - }) - ) + await config.api.row.save(table._id!, { + name: generator.first(), + surname: generator.last(), + age: generator.age(), + address: generator.address(), + }) } }) @@ -138,4 +136,67 @@ describe.each([ ) }) }) + + it("does not allow accessing hidden fields", async () => { + await config.doInContext(config.appId, async () => { + await config.api.table.save({ + ...table, + schema: { + ...table.schema, + name: { + ...table.schema.name, + visible: true, + }, + age: { + ...table.schema.age, + visible: false, + }, + }, + }) + const result = await search({ + tableId: table._id!, + query: {}, + }) + expect(result.rows).toHaveLength(10) + for (const row of result.rows) { + const keys = Object.keys(row) + expect(keys).toContain("name") + expect(keys).toContain("surname") + expect(keys).toContain("address") + expect(keys).not.toContain("age") + } + }) + }) + + it("does not allow accessing hidden fields even if requested", async () => { + await config.doInContext(config.appId, async () => { + await config.api.table.save({ + ...table, + schema: { + ...table.schema, + name: { + ...table.schema.name, + visible: true, + }, + age: { + ...table.schema.age, + visible: false, + }, + }, + }) + const result = await search({ + tableId: table._id!, + query: {}, + fields: ["name", "age"], + }) + expect(result.rows).toHaveLength(10) + for (const row of result.rows) { + const keys = Object.keys(row) + expect(keys).toContain("name") + expect(keys).not.toContain("age") + expect(keys).not.toContain("surname") + expect(keys).not.toContain("address") + } + }) + }) }) From 3acc9bde45dd98a6904f27f96dafbdd7ae338c38 Mon Sep 17 00:00:00 2001 From: Adria Navarro Date: Fri, 9 Aug 2024 10:43:33 +0200 Subject: [PATCH 121/180] Extra tests --- .../sdk/app/rows/search/tests/search.spec.ts | 49 +++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git a/packages/server/src/sdk/app/rows/search/tests/search.spec.ts b/packages/server/src/sdk/app/rows/search/tests/search.spec.ts index 339e7582fc..1219009381 100644 --- a/packages/server/src/sdk/app/rows/search/tests/search.spec.ts +++ b/packages/server/src/sdk/app/rows/search/tests/search.spec.ts @@ -199,4 +199,53 @@ describe.each([ } }) }) + + it("does not allow accessing non-mapped fields", async () => { + await config.doInContext(config.appId, async () => { + await config.api.table.save({ + ...table, + schema: { + name: table.schema.name, + surname: table.schema.surname, + }, + }) + const result = await search({ + tableId: table._id!, + query: {}, + }) + expect(result.rows).toHaveLength(10) + for (const row of result.rows) { + const keys = Object.keys(row) + expect(keys).toContain("name") + expect(keys).toContain("surname") + expect(keys).not.toContain("address") + expect(keys).not.toContain("age") + } + }) + }) + + it("does not allow accessing non-mapped fields even if requested", async () => { + await config.doInContext(config.appId, async () => { + await config.api.table.save({ + ...table, + schema: { + name: table.schema.name, + surname: table.schema.surname, + }, + }) + const result = await search({ + tableId: table._id!, + query: {}, + fields: ["name", "age"], + }) + expect(result.rows).toHaveLength(10) + for (const row of result.rows) { + const keys = Object.keys(row) + expect(keys).toContain("name") + expect(keys).not.toContain("age") + expect(keys).not.toContain("surname") + expect(keys).not.toContain("address") + } + }) + }) }) From 331e8eb7be6d4ecfc6d5cc24d732e6c32dc37903 Mon Sep 17 00:00:00 2001 From: Adria Navarro Date: Fri, 9 Aug 2024 11:39:58 +0200 Subject: [PATCH 122/180] Add view tests --- .../src/api/routes/tests/viewV2.spec.ts | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/packages/server/src/api/routes/tests/viewV2.spec.ts b/packages/server/src/api/routes/tests/viewV2.spec.ts index e18cffeaa8..9fec41ccac 100644 --- a/packages/server/src/api/routes/tests/viewV2.spec.ts +++ b/packages/server/src/api/routes/tests/viewV2.spec.ts @@ -1602,6 +1602,28 @@ describe.each([ }) expect(response.rows).toHaveLength(0) }) + + it("queries the row api passing the view fields only", async () => { + const searchSpy = jest.spyOn(sdk.rows, "search") + + const view = await config.api.viewV2.create({ + tableId: table._id!, + name: generator.guid(), + schema: { + id: { visible: true }, + one: { visible: false }, + }, + }) + + await config.api.viewV2.search(view.id, { query: {} }) + expect(searchSpy).toHaveBeenCalledTimes(1) + + expect(searchSpy).toHaveBeenCalledWith( + expect.objectContaining({ + fields: ["id"], + }) + ) + }) }) describe("permissions", () => { From 0212f584d27c397d28fff555bb393beb58651827 Mon Sep 17 00:00:00 2001 From: Adria Navarro Date: Fri, 9 Aug 2024 11:40:17 +0200 Subject: [PATCH 123/180] Add imports --- packages/server/src/api/routes/tests/viewV2.spec.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/server/src/api/routes/tests/viewV2.spec.ts b/packages/server/src/api/routes/tests/viewV2.spec.ts index 9fec41ccac..b714dcf5b6 100644 --- a/packages/server/src/api/routes/tests/viewV2.spec.ts +++ b/packages/server/src/api/routes/tests/viewV2.spec.ts @@ -30,6 +30,7 @@ import { withEnv as withCoreEnv, setEnv as setCoreEnv, } from "@budibase/backend-core" +import sdk from "../../../sdk" describe.each([ ["lucene", undefined], @@ -1623,7 +1624,7 @@ describe.each([ fields: ["id"], }) ) - }) + }) }) describe("permissions", () => { From 728b4d363d007ebe49848ae3a365a10139c2191e Mon Sep 17 00:00:00 2001 From: Adria Navarro Date: Fri, 9 Aug 2024 11:47:16 +0200 Subject: [PATCH 124/180] Add removeInvalidFilters utils --- .../server/src/sdk/app/rows/queryUtils.ts | 45 +++++++++ .../src/sdk/app/rows/tests/queryUtils.spec.ts | 96 +++++++++++++++++++ 2 files changed, 141 insertions(+) create mode 100644 packages/server/src/sdk/app/rows/queryUtils.ts create mode 100644 packages/server/src/sdk/app/rows/tests/queryUtils.spec.ts diff --git a/packages/server/src/sdk/app/rows/queryUtils.ts b/packages/server/src/sdk/app/rows/queryUtils.ts new file mode 100644 index 0000000000..84fe05a948 --- /dev/null +++ b/packages/server/src/sdk/app/rows/queryUtils.ts @@ -0,0 +1,45 @@ +import { isLogicalSearchOperator, SearchFilters } from "@budibase/types" +import { cloneDeep } from "lodash/fp" + +export const removeInvalidFilters = ( + filters: SearchFilters, + validFields: string[] +) => { + const result = cloneDeep(filters) + + validFields = validFields.map(f => f.toLowerCase()) + for (const filterKey of Object.keys(result) as (keyof SearchFilters)[]) { + if (typeof result[filterKey] !== "object") { + continue + } + if (isLogicalSearchOperator(filterKey)) { + const resultingConditions: SearchFilters[] = [] + for (const condition of result[filterKey].conditions) { + const resultingCondition = removeInvalidFilters(condition, validFields) + if (Object.keys(resultingCondition).length) { + resultingConditions.push(resultingCondition) + } + } + if (resultingConditions.length) { + result[filterKey].conditions = resultingConditions + } else { + delete result[filterKey] + } + continue + } + + const filter = result[filterKey] + for (const columnKey of Object.keys(filter)) { + if ( + !validFields.map(f => f.toLowerCase()).includes(columnKey.toLowerCase()) + ) { + delete filter[columnKey] + } + } + if (!Object.keys(filter).length) { + delete result[filterKey] + } + } + + return result +} diff --git a/packages/server/src/sdk/app/rows/tests/queryUtils.spec.ts b/packages/server/src/sdk/app/rows/tests/queryUtils.spec.ts new file mode 100644 index 0000000000..b3852da4c6 --- /dev/null +++ b/packages/server/src/sdk/app/rows/tests/queryUtils.spec.ts @@ -0,0 +1,96 @@ +import { SearchFilters } from "@budibase/types" +import { removeInvalidFilters } from "../queryUtils" + +describe("query utils", () => { + describe("removeInvalidFilters", () => { + const fullFilters: SearchFilters = { + equal: { one: "foo" }, + $or: { + conditions: [ + { + equal: { one: "foo2", two: "bar" }, + notEmpty: { one: null }, + $and: { + conditions: [ + { + equal: { three: "baz" }, + notEmpty: { forth: null }, + }, + ], + }, + }, + ], + }, + $and: { + conditions: [{ equal: { one: "foo2" }, notEmpty: { one: null } }], + }, + } + + it("can filter empty queries", () => { + const filters: SearchFilters = {} + const result = removeInvalidFilters(filters, []) + expect(result).toEqual({}) + }) + + it("does not trim any valid field", () => { + const result = removeInvalidFilters(fullFilters, [ + "one", + "two", + "three", + "forth", + ]) + expect(result).toEqual(fullFilters) + }) + + it("trims invalid field", () => { + const result = removeInvalidFilters(fullFilters, [ + "one", + "three", + "forth", + ]) + expect(result).toEqual({ + equal: { one: "foo" }, + $or: { + conditions: [ + { + equal: { one: "foo2" }, + notEmpty: { one: null }, + $and: { + conditions: [ + { + equal: { three: "baz" }, + notEmpty: { forth: null }, + }, + ], + }, + }, + ], + }, + $and: { + conditions: [{ equal: { one: "foo2" }, notEmpty: { one: null } }], + }, + }) + }) + + it("trims invalid field keeping a valid fields", () => { + const result = removeInvalidFilters(fullFilters, ["three", "forth"]) + const expected: SearchFilters = { + $or: { + conditions: [ + { + $and: { + conditions: [ + { + equal: { three: "baz" }, + notEmpty: { forth: null }, + }, + ], + }, + }, + ], + }, + } + expect(result).toEqual(expected) + }) + }) +}) From 42070dcd39841fab1737ab4a7989e14c7454431b Mon Sep 17 00:00:00 2001 From: Adria Navarro Date: Fri, 9 Aug 2024 12:16:22 +0200 Subject: [PATCH 125/180] Add tests --- .../sdk/app/rows/search/tests/search.spec.ts | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/packages/server/src/sdk/app/rows/search/tests/search.spec.ts b/packages/server/src/sdk/app/rows/search/tests/search.spec.ts index 1219009381..068c5f5f07 100644 --- a/packages/server/src/sdk/app/rows/search/tests/search.spec.ts +++ b/packages/server/src/sdk/app/rows/search/tests/search.spec.ts @@ -248,4 +248,37 @@ describe.each([ } }) }) + + !isLucene && + it.each([ + [["id", "name", "age"], 3], + [["name", "age"], 10], + ])( + "cannot query by non search fields", + async (queryFields, expectedRows) => { + await config.doInContext(config.appId, async () => { + const { rows } = await search({ + tableId: table._id!, + query: { + $or: { + conditions: [ + { + $and: { + conditions: [ + { range: { id: { low: 2, high: 4 } } }, + { range: { id: { low: 3, high: 5 } } }, + ], + }, + }, + { equal: { id: 7 } }, + ], + }, + }, + fields: queryFields, + }) + + expect(rows).toHaveLength(expectedRows) + }) + } + ) }) From 6fe628f804f246568df95d2170904845020593e2 Mon Sep 17 00:00:00 2001 From: Adria Navarro Date: Fri, 9 Aug 2024 12:31:54 +0200 Subject: [PATCH 126/180] Fix tests --- packages/server/src/sdk/app/rows/search/tests/search.spec.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/server/src/sdk/app/rows/search/tests/search.spec.ts b/packages/server/src/sdk/app/rows/search/tests/search.spec.ts index 068c5f5f07..c3b5dc3c3b 100644 --- a/packages/server/src/sdk/app/rows/search/tests/search.spec.ts +++ b/packages/server/src/sdk/app/rows/search/tests/search.spec.ts @@ -229,6 +229,7 @@ describe.each([ await config.api.table.save({ ...table, schema: { + id: table.schema.id, name: table.schema.name, surname: table.schema.surname, }, From 5b13e53a3bbfb05fdc4ae0c77053d2d9c2f6a38f Mon Sep 17 00:00:00 2001 From: Adria Navarro Date: Fri, 9 Aug 2024 12:32:18 +0200 Subject: [PATCH 127/180] Fix tests --- packages/server/src/sdk/app/rows/search/tests/search.spec.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/server/src/sdk/app/rows/search/tests/search.spec.ts b/packages/server/src/sdk/app/rows/search/tests/search.spec.ts index c3b5dc3c3b..235598cc40 100644 --- a/packages/server/src/sdk/app/rows/search/tests/search.spec.ts +++ b/packages/server/src/sdk/app/rows/search/tests/search.spec.ts @@ -205,6 +205,7 @@ describe.each([ await config.api.table.save({ ...table, schema: { + id: table.schema.id, name: table.schema.name, surname: table.schema.surname, }, From 48486cdaa4aa8bdc664b8ee33ea4fabab4f74452 Mon Sep 17 00:00:00 2001 From: Adria Navarro Date: Fri, 9 Aug 2024 13:14:16 +0200 Subject: [PATCH 128/180] Implement query --- packages/server/src/sdk/app/rows/search.ts | 6 ++++ .../sdk/app/rows/search/tests/search.spec.ts | 31 ++++++++++++++----- 2 files changed, 30 insertions(+), 7 deletions(-) diff --git a/packages/server/src/sdk/app/rows/search.ts b/packages/server/src/sdk/app/rows/search.ts index ea0b3bf5b6..e840c1ca51 100644 --- a/packages/server/src/sdk/app/rows/search.ts +++ b/packages/server/src/sdk/app/rows/search.ts @@ -14,6 +14,7 @@ import sdk from "../../index" import { searchInputMapping } from "./search/utils" import { db as dbCore } from "@budibase/backend-core" import tracer from "dd-trace" +import { removeInvalidFilters } from "./queryUtils" export { isValidFilter } from "../../../integrations/utils" @@ -86,6 +87,11 @@ export async function search( options.fields = visibleTableFields } + options.query = removeInvalidFilters(options.query, [ + "_id", + ...options.fields, + ]) + let result: SearchResponse if (isExternalTable) { span?.addTags({ searchType: "external" }) diff --git a/packages/server/src/sdk/app/rows/search/tests/search.spec.ts b/packages/server/src/sdk/app/rows/search/tests/search.spec.ts index 235598cc40..510aa209a8 100644 --- a/packages/server/src/sdk/app/rows/search/tests/search.spec.ts +++ b/packages/server/src/sdk/app/rows/search/tests/search.spec.ts @@ -1,4 +1,11 @@ -import { Datasource, FieldType, Table } from "@budibase/types" +import { + AutoColumnFieldMetadata, + AutoFieldSubType, + Datasource, + FieldType, + NumberFieldMetadata, + Table, +} from "@budibase/types" import TestConfiguration from "../../../../../tests/utilities/TestConfiguration" import { search } from "../../../../../sdk/app/rows/search" @@ -53,15 +60,25 @@ describe.each([ }) beforeEach(async () => { + const idFieldSchema: NumberFieldMetadata | AutoColumnFieldMetadata = + isInternal + ? { + name: "id", + type: FieldType.AUTO, + subtype: AutoFieldSubType.AUTO_ID, + autocolumn: true, + } + : { + name: "id", + type: FieldType.NUMBER, + autocolumn: true, + } + table = await config.api.table.save( tableForDatasource(datasource, { primary: ["id"], schema: { - id: { - name: "id", - type: FieldType.NUMBER, - autocolumn: true, - }, + id: idFieldSchema, name: { name: "name", type: FieldType.STRING, @@ -256,7 +273,7 @@ describe.each([ [["id", "name", "age"], 3], [["name", "age"], 10], ])( - "cannot query by non search fields", + "cannot query by non search fields (fields: %s)", async (queryFields, expectedRows) => { await config.doInContext(config.appId, async () => { const { rows } = await search({ From 0bdb6396ed25e3f37639391ffb91a273fd0a155c Mon Sep 17 00:00:00 2001 From: Adria Navarro Date: Fri, 9 Aug 2024 14:17:41 +0200 Subject: [PATCH 129/180] Remove unneeded test --- .../sdk/app/rows/search/tests/search.spec.ts | 51 ------------------- 1 file changed, 51 deletions(-) diff --git a/packages/server/src/sdk/app/rows/search/tests/search.spec.ts b/packages/server/src/sdk/app/rows/search/tests/search.spec.ts index 510aa209a8..db1104bcf6 100644 --- a/packages/server/src/sdk/app/rows/search/tests/search.spec.ts +++ b/packages/server/src/sdk/app/rows/search/tests/search.spec.ts @@ -217,57 +217,6 @@ describe.each([ }) }) - it("does not allow accessing non-mapped fields", async () => { - await config.doInContext(config.appId, async () => { - await config.api.table.save({ - ...table, - schema: { - id: table.schema.id, - name: table.schema.name, - surname: table.schema.surname, - }, - }) - const result = await search({ - tableId: table._id!, - query: {}, - }) - expect(result.rows).toHaveLength(10) - for (const row of result.rows) { - const keys = Object.keys(row) - expect(keys).toContain("name") - expect(keys).toContain("surname") - expect(keys).not.toContain("address") - expect(keys).not.toContain("age") - } - }) - }) - - it("does not allow accessing non-mapped fields even if requested", async () => { - await config.doInContext(config.appId, async () => { - await config.api.table.save({ - ...table, - schema: { - id: table.schema.id, - name: table.schema.name, - surname: table.schema.surname, - }, - }) - const result = await search({ - tableId: table._id!, - query: {}, - fields: ["name", "age"], - }) - expect(result.rows).toHaveLength(10) - for (const row of result.rows) { - const keys = Object.keys(row) - expect(keys).toContain("name") - expect(keys).not.toContain("age") - expect(keys).not.toContain("surname") - expect(keys).not.toContain("address") - } - }) - }) - !isLucene && it.each([ [["id", "name", "age"], 3], From ac62fc0e292c0e1f2f4a0c1acafe94639e70f104 Mon Sep 17 00:00:00 2001 From: Adria Navarro Date: Fri, 9 Aug 2024 14:29:19 +0200 Subject: [PATCH 130/180] Fix jest asserts --- packages/server/src/api/routes/tests/viewV2.spec.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/server/src/api/routes/tests/viewV2.spec.ts b/packages/server/src/api/routes/tests/viewV2.spec.ts index b714dcf5b6..ad6652635f 100644 --- a/packages/server/src/api/routes/tests/viewV2.spec.ts +++ b/packages/server/src/api/routes/tests/viewV2.spec.ts @@ -121,6 +121,7 @@ describe.each([ }) beforeEach(() => { + jest.clearAllMocks() mocks.licenses.useCloudFree() }) @@ -1604,7 +1605,7 @@ describe.each([ expect(response.rows).toHaveLength(0) }) - it("queries the row api passing the view fields only", async () => { + it.only("queries the row api passing the view fields only", async () => { const searchSpy = jest.spyOn(sdk.rows, "search") const view = await config.api.viewV2.create({ From b1d78f129b7b870512713825a84742ffcafa0a8b Mon Sep 17 00:00:00 2001 From: Adria Navarro Date: Fri, 9 Aug 2024 14:29:44 +0200 Subject: [PATCH 131/180] Remove jest only --- packages/server/src/api/routes/tests/viewV2.spec.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/server/src/api/routes/tests/viewV2.spec.ts b/packages/server/src/api/routes/tests/viewV2.spec.ts index ad6652635f..da38112e2b 100644 --- a/packages/server/src/api/routes/tests/viewV2.spec.ts +++ b/packages/server/src/api/routes/tests/viewV2.spec.ts @@ -1605,7 +1605,7 @@ describe.each([ expect(response.rows).toHaveLength(0) }) - it.only("queries the row api passing the view fields only", async () => { + it("queries the row api passing the view fields only", async () => { const searchSpy = jest.spyOn(sdk.rows, "search") const view = await config.api.viewV2.create({ From ee5c4e8ed828c505726941825b7f4629e98602e9 Mon Sep 17 00:00:00 2001 From: Adria Navarro Date: Mon, 12 Aug 2024 10:56:06 +0200 Subject: [PATCH 132/180] Don't trim prefixed keys --- .../server/src/sdk/app/rows/queryUtils.ts | 8 ++- .../src/sdk/app/rows/tests/queryUtils.spec.ts | 53 +++++++++++++++++++ 2 files changed, 60 insertions(+), 1 deletion(-) diff --git a/packages/server/src/sdk/app/rows/queryUtils.ts b/packages/server/src/sdk/app/rows/queryUtils.ts index 84fe05a948..9fa72e84d7 100644 --- a/packages/server/src/sdk/app/rows/queryUtils.ts +++ b/packages/server/src/sdk/app/rows/queryUtils.ts @@ -1,3 +1,4 @@ +import { db } from "@budibase/backend-core" import { isLogicalSearchOperator, SearchFilters } from "@budibase/types" import { cloneDeep } from "lodash/fp" @@ -31,7 +32,12 @@ export const removeInvalidFilters = ( const filter = result[filterKey] for (const columnKey of Object.keys(filter)) { if ( - !validFields.map(f => f.toLowerCase()).includes(columnKey.toLowerCase()) + !validFields + .map(f => f.toLowerCase()) + .includes(columnKey.toLowerCase()) && + !validFields + .map(f => f.toLowerCase()) + .includes(db.removeKeyNumbering(columnKey).toLowerCase()) ) { delete filter[columnKey] } diff --git a/packages/server/src/sdk/app/rows/tests/queryUtils.spec.ts b/packages/server/src/sdk/app/rows/tests/queryUtils.spec.ts index b3852da4c6..f249a8f91e 100644 --- a/packages/server/src/sdk/app/rows/tests/queryUtils.spec.ts +++ b/packages/server/src/sdk/app/rows/tests/queryUtils.spec.ts @@ -92,5 +92,58 @@ describe("query utils", () => { } expect(result).toEqual(expected) }) + + it("keeps filter key numering", () => { + const prefixedFilters: SearchFilters = { + equal: { "1:one": "foo" }, + $or: { + conditions: [ + { + equal: { "2:one": "foo2", "3:two": "bar" }, + notEmpty: { "4:one": null }, + $and: { + conditions: [ + { + equal: { "5:three": "baz", two: "bar2" }, + notEmpty: { forth: null }, + }, + ], + }, + }, + ], + }, + $and: { + conditions: [{ equal: { "6:one": "foo2" }, notEmpty: { one: null } }], + }, + } + + const result = removeInvalidFilters(prefixedFilters, [ + "one", + "three", + "forth", + ]) + expect(result).toEqual({ + equal: { "1:one": "foo" }, + $or: { + conditions: [ + { + equal: { "2:one": "foo2" }, + notEmpty: { "4:one": null }, + $and: { + conditions: [ + { + equal: { "5:three": "baz" }, + notEmpty: { forth: null }, + }, + ], + }, + }, + ], + }, + $and: { + conditions: [{ equal: { "6:one": "foo2" }, notEmpty: { one: null } }], + }, + }) + }) }) }) From 59a164f4df4c25e06120a61f786208b4d25e0049 Mon Sep 17 00:00:00 2001 From: Adria Navarro Date: Mon, 12 Aug 2024 12:57:07 +0200 Subject: [PATCH 133/180] Test relationships --- .../server/src/sdk/app/rows/queryUtils.ts | 12 +++---- .../src/sdk/app/rows/tests/queryUtils.spec.ts | 33 +++++++++++++++++++ 2 files changed, 37 insertions(+), 8 deletions(-) diff --git a/packages/server/src/sdk/app/rows/queryUtils.ts b/packages/server/src/sdk/app/rows/queryUtils.ts index 9fa72e84d7..20e6af4d67 100644 --- a/packages/server/src/sdk/app/rows/queryUtils.ts +++ b/packages/server/src/sdk/app/rows/queryUtils.ts @@ -31,14 +31,10 @@ export const removeInvalidFilters = ( const filter = result[filterKey] for (const columnKey of Object.keys(filter)) { - if ( - !validFields - .map(f => f.toLowerCase()) - .includes(columnKey.toLowerCase()) && - !validFields - .map(f => f.toLowerCase()) - .includes(db.removeKeyNumbering(columnKey).toLowerCase()) - ) { + const possibleKeys = [columnKey, db.removeKeyNumbering(columnKey)].map( + c => c.toLowerCase() + ) + if (!validFields.some(f => possibleKeys.includes(f.toLowerCase()))) { delete filter[columnKey] } } diff --git a/packages/server/src/sdk/app/rows/tests/queryUtils.spec.ts b/packages/server/src/sdk/app/rows/tests/queryUtils.spec.ts index f249a8f91e..4970e83685 100644 --- a/packages/server/src/sdk/app/rows/tests/queryUtils.spec.ts +++ b/packages/server/src/sdk/app/rows/tests/queryUtils.spec.ts @@ -145,5 +145,38 @@ describe("query utils", () => { }, }) }) + + it("handles relationship filters", () => { + const prefixedFilters: SearchFilters = { + $or: { + conditions: [ + { equal: { "1:other.one": "foo" } }, + { + equal: { + "2:other.one": "foo2", + "3:other.two": "bar", + "4:other.three": "baz", + }, + }, + { equal: { "another.three": "baz2" } }, + ], + }, + } + + const result = removeInvalidFilters(prefixedFilters, [ + "other.one", + "other.two", + "another.three", + ]) + expect(result).toEqual({ + $or: { + conditions: [ + { equal: { "1:other.one": "foo" } }, + { equal: { "2:other.one": "foo2", "3:other.two": "bar" } }, + { equal: { "another.three": "baz2" } }, + ], + }, + }) + }) }) }) From 08b0b6af197d0f35392d2655f39909d67ebc4805 Mon Sep 17 00:00:00 2001 From: Adria Navarro Date: Mon, 12 Aug 2024 13:10:38 +0200 Subject: [PATCH 134/180] Fix search relationships --- packages/server/src/sdk/app/rows/search.ts | 56 ++++++++++++++++++++-- 1 file changed, 52 insertions(+), 4 deletions(-) diff --git a/packages/server/src/sdk/app/rows/search.ts b/packages/server/src/sdk/app/rows/search.ts index e840c1ca51..a3c695c61c 100644 --- a/packages/server/src/sdk/app/rows/search.ts +++ b/packages/server/src/sdk/app/rows/search.ts @@ -1,9 +1,12 @@ import { EmptyFilterOption, + FieldType, Row, RowSearchParams, SearchResponse, SortOrder, + Table, + TableSchema, } from "@budibase/types" import { isExternalTableID } from "../../../integrations/utils" import * as internal from "./search/internal" @@ -87,10 +90,10 @@ export async function search( options.fields = visibleTableFields } - options.query = removeInvalidFilters(options.query, [ - "_id", - ...options.fields, - ]) + options.query = removeInvalidFilters( + options.query, + await getQueriableFields(options.fields, table.schema) + ) let result: SearchResponse if (isExternalTable) { @@ -134,3 +137,48 @@ export async function fetchView( ): Promise { return pickApi(tableId).fetchView(viewName, params) } + +async function getQueriableFields( + fields: string[], + schema: TableSchema +): Promise { + const handledTables: Record = {} + const extractTableFields = async ( + fromField: string, + tableId: string + ): Promise => { + const result = [] + if (handledTables[tableId]) { + return [] + } + const table = await sdk.tables.getTable(tableId) + handledTables[tableId] = table + + for (const field of Object.keys(table.schema)) { + const formattedColumn = `${fromField}.${field}` + const subSchema = table.schema[field] + if (subSchema.type === FieldType.LINK) { + result.push( + ...(await extractTableFields(formattedColumn, subSchema.tableId)) + ) + } else { + result.push(formattedColumn) + } + } + return result + } + + const result = [ + "_id", // Querying by _id is always allowed, even if it's never part of the schema + ] + + for (const field of fields) { + if (schema[field].type === FieldType.LINK) { + result.push(...(await extractTableFields(field, schema[field].tableId))) + } else { + result.push(field) + } + } + + return result +} From 1a88d9f89bfc3fa5a10ecea4c235616fae281fb4 Mon Sep 17 00:00:00 2001 From: Adria Navarro Date: Mon, 12 Aug 2024 14:21:05 +0200 Subject: [PATCH 135/180] Don't clean relationship query --- packages/server/src/sdk/app/rows/search.ts | 47 +++++++++++----------- 1 file changed, 23 insertions(+), 24 deletions(-) diff --git a/packages/server/src/sdk/app/rows/search.ts b/packages/server/src/sdk/app/rows/search.ts index a3c695c61c..f4082a16fd 100644 --- a/packages/server/src/sdk/app/rows/search.ts +++ b/packages/server/src/sdk/app/rows/search.ts @@ -6,7 +6,6 @@ import { SearchResponse, SortOrder, Table, - TableSchema, } from "@budibase/types" import { isExternalTableID } from "../../../integrations/utils" import * as internal from "./search/internal" @@ -92,7 +91,7 @@ export async function search( options.query = removeInvalidFilters( options.query, - await getQueriableFields(options.fields, table.schema) + await getQueriableFields(options.fields, table) ) let result: SearchResponse @@ -140,29 +139,35 @@ export async function fetchView( async function getQueriableFields( fields: string[], - schema: TableSchema + table: Table ): Promise { - const handledTables: Record = {} + const handledTables = new Set([table._id!]) const extractTableFields = async ( - fromField: string, - tableId: string + table: Table, + allowedFields: string[] ): Promise => { const result = [] - if (handledTables[tableId]) { - return [] - } - const table = await sdk.tables.getTable(tableId) - handledTables[tableId] = table - - for (const field of Object.keys(table.schema)) { - const formattedColumn = `${fromField}.${field}` + for (const field of Object.keys(table.schema).filter(f => + allowedFields.includes(f) + )) { const subSchema = table.schema[field] if (subSchema.type === FieldType.LINK) { - result.push( - ...(await extractTableFields(formattedColumn, subSchema.tableId)) + if (handledTables.has(`${table._id}_${subSchema.tableId}`)) { + // avoid circular loops + continue + } + handledTables.add(`${subSchema.tableId}_${table._id}`) + const relatedTable = await sdk.tables.getTable(subSchema.tableId) + const relatedFields = await extractTableFields( + relatedTable, + Object.keys(relatedTable.schema) ) + + result.push(...relatedFields.map(f => `${subSchema.name}.${f}`)) + // should be able to filter by relationship using table name + result.push(...relatedFields.map(f => `${relatedTable.name}.${f}`)) } else { - result.push(formattedColumn) + result.push(field) } } return result @@ -172,13 +177,7 @@ async function getQueriableFields( "_id", // Querying by _id is always allowed, even if it's never part of the schema ] - for (const field of fields) { - if (schema[field].type === FieldType.LINK) { - result.push(...(await extractTableFields(field, schema[field].tableId))) - } else { - result.push(field) - } - } + result.push(...(await extractTableFields(table, fields))) return result } From 385c5f6e99e6a68e0d656baa6f30996dadde13fc Mon Sep 17 00:00:00 2001 From: Adria Navarro Date: Wed, 14 Aug 2024 12:24:49 +0200 Subject: [PATCH 136/180] Trim unwanted columns in outputProcessing --- .../src/api/controllers/row/utils/sqlUtils.ts | 8 ++-- .../src/utilities/rowProcessor/index.ts | 48 +++++++++++++------ 2 files changed, 37 insertions(+), 19 deletions(-) diff --git a/packages/server/src/api/controllers/row/utils/sqlUtils.ts b/packages/server/src/api/controllers/row/utils/sqlUtils.ts index 32124fa79d..7beadabd89 100644 --- a/packages/server/src/api/controllers/row/utils/sqlUtils.ts +++ b/packages/server/src/api/controllers/row/utils/sqlUtils.ts @@ -192,10 +192,10 @@ export function buildSqlFieldList( function extractRealFields(table: Table, existing: string[] = []) { return Object.entries(table.schema) .filter( - column => - column[1].type !== FieldType.LINK && - column[1].type !== FieldType.FORMULA && - !existing.find((field: string) => field === column[0]) + ([columnName, column]) => + column.type !== FieldType.LINK && + column.type !== FieldType.FORMULA && + !existing.find((field: string) => field === columnName) ) .map(column => `${table.name}.${column[0]}`) } diff --git a/packages/server/src/utilities/rowProcessor/index.ts b/packages/server/src/utilities/rowProcessor/index.ts index 62a3b2dd74..38cb34a395 100644 --- a/packages/server/src/utilities/rowProcessor/index.ts +++ b/packages/server/src/utilities/rowProcessor/index.ts @@ -19,6 +19,7 @@ import { User, } from "@budibase/types" import { cloneDeep } from "lodash/fp" +import { pick } from "lodash" import { processInputBBReference, processInputBBReferences, @@ -26,7 +27,11 @@ import { processOutputBBReferences, } from "./bbReferenceProcessor" import { isExternalTableID } from "../../integrations/utils" -import { helpers } from "@budibase/shared-core" +import { + helpers, + PROTECTED_EXTERNAL_COLUMNS, + PROTECTED_INTERNAL_COLUMNS, +} from "@budibase/shared-core" import { processString } from "@budibase/string-templates" export * from "./utils" @@ -53,9 +58,9 @@ export async function processAutoColumn( row: Row, opts?: AutoColumnProcessingOpts ) { - let noUser = !userId - let isUserTable = table._id === InternalTables.USER_METADATA - let now = new Date().toISOString() + const noUser = !userId + const isUserTable = table._id === InternalTables.USER_METADATA + const now = new Date().toISOString() // if a row doesn't have a revision then it doesn't exist yet const creating = !row._rev // check its not user table, or whether any of the processing options have been disabled @@ -111,7 +116,7 @@ async function processDefaultValues(table: Table, row: Row) { ctx.user = user } - for (let [key, schema] of Object.entries(table.schema)) { + for (const [key, schema] of Object.entries(table.schema)) { if ("default" in schema && schema.default != null && row[key] == null) { const processed = await processString(schema.default, ctx) @@ -165,10 +170,10 @@ export async function inputProcessing( row: Row, opts?: AutoColumnProcessingOpts ) { - let clonedRow = cloneDeep(row) + const clonedRow = cloneDeep(row) const dontCleanseKeys = ["type", "_id", "_rev", "tableId"] - for (let [key, value] of Object.entries(clonedRow)) { + for (const [key, value] of Object.entries(clonedRow)) { const field = table.schema[key] // cleanse fields that aren't in the schema if (!field) { @@ -268,13 +273,13 @@ export async function outputProcessing( } // process complex types: attachments, bb references... - for (let [property, column] of Object.entries(table.schema)) { + for (const [property, column] of Object.entries(table.schema)) { if ( column.type === FieldType.ATTACHMENTS || column.type === FieldType.ATTACHMENT_SINGLE || column.type === FieldType.SIGNATURE_SINGLE ) { - for (let row of enriched) { + for (const row of enriched) { if (row[property] == null) { continue } @@ -299,7 +304,7 @@ export async function outputProcessing( !opts.skipBBReferences && column.type == FieldType.BB_REFERENCE ) { - for (let row of enriched) { + for (const row of enriched) { row[property] = await processOutputBBReferences( row[property], column.subtype @@ -309,14 +314,14 @@ export async function outputProcessing( !opts.skipBBReferences && column.type == FieldType.BB_REFERENCE_SINGLE ) { - for (let row of enriched) { + for (const row of enriched) { row[property] = await processOutputBBReference( row[property], column.subtype ) } } else if (column.type === FieldType.DATETIME && column.timeOnly) { - for (let row of enriched) { + for (const row of enriched) { if (row[property] instanceof Date) { const hours = row[property].getUTCHours().toString().padStart(2, "0") const minutes = row[property] @@ -343,14 +348,27 @@ export async function outputProcessing( )) as Row[] } // remove null properties to match internal API - if (isExternalTableID(table._id!)) { - for (let row of enriched) { - for (let key of Object.keys(row)) { + const isExternal = isExternalTableID(table._id!) + if (isExternal) { + for (const row of enriched) { + for (const key of Object.keys(row)) { if (row[key] === null) { delete row[key] } } } } + + const protectedColumns = isExternal + ? PROTECTED_EXTERNAL_COLUMNS + : PROTECTED_INTERNAL_COLUMNS + + const tableFields = Object.keys(table.schema).filter( + f => table.schema[f].visible !== false + ) + enriched = enriched.map((r: Row) => + pick(r, [...tableFields, ...protectedColumns]) + ) + return (wasArray ? enriched : enriched[0]) as T } From ce8730f176dfaa90d0d403ad75eb4e9d63b4af51 Mon Sep 17 00:00:00 2001 From: Adria Navarro Date: Wed, 14 Aug 2024 12:30:01 +0200 Subject: [PATCH 137/180] Clean code --- packages/server/src/sdk/app/rows/search.ts | 24 ++++++++-------------- 1 file changed, 9 insertions(+), 15 deletions(-) diff --git a/packages/server/src/sdk/app/rows/search.ts b/packages/server/src/sdk/app/rows/search.ts index f4082a16fd..c96c0738d2 100644 --- a/packages/server/src/sdk/app/rows/search.ts +++ b/packages/server/src/sdk/app/rows/search.ts @@ -76,23 +76,17 @@ export async function search( const table = await sdk.tables.getTable(options.tableId) options = searchInputMapping(table, options) - const visibleTableFields = Object.keys(table.schema).filter( - f => table.schema[f].visible !== false - ) - - if (options.fields) { - const tableFields = visibleTableFields.map(f => f.toLowerCase()) - options.fields = options.fields.filter(f => - tableFields.includes(f.toLowerCase()) + if (options.query) { + const tableFields = Object.keys(table.schema).filter( + f => table.schema[f].visible !== false ) - } else { - options.fields = visibleTableFields - } - options.query = removeInvalidFilters( - options.query, - await getQueriableFields(options.fields, table) - ) + const queriableFields = await getQueriableFields( + options.fields?.filter(f => tableFields.includes(f)) ?? tableFields, + table + ) + options.query = removeInvalidFilters(options.query, queriableFields) + } let result: SearchResponse if (isExternalTable) { From da87c0233b1d9e4d1efc218f746ed7c9db1eeb15 Mon Sep 17 00:00:00 2001 From: Adria Navarro Date: Wed, 14 Aug 2024 12:51:46 +0200 Subject: [PATCH 138/180] Don't trim usertable --- .../src/utilities/rowProcessor/index.ts | 21 +++++++++++-------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/packages/server/src/utilities/rowProcessor/index.ts b/packages/server/src/utilities/rowProcessor/index.ts index 38cb34a395..59b3ea7c16 100644 --- a/packages/server/src/utilities/rowProcessor/index.ts +++ b/packages/server/src/utilities/rowProcessor/index.ts @@ -33,6 +33,7 @@ import { PROTECTED_INTERNAL_COLUMNS, } from "@budibase/shared-core" import { processString } from "@budibase/string-templates" +import { isUserMetadataTable } from "../../api/controllers/row/utils" export * from "./utils" export * from "./attachments" @@ -359,16 +360,18 @@ export async function outputProcessing( } } - const protectedColumns = isExternal - ? PROTECTED_EXTERNAL_COLUMNS - : PROTECTED_INTERNAL_COLUMNS + if (!isUserMetadataTable(table._id!)) { + const protectedColumns = isExternal + ? PROTECTED_EXTERNAL_COLUMNS + : PROTECTED_INTERNAL_COLUMNS - const tableFields = Object.keys(table.schema).filter( - f => table.schema[f].visible !== false - ) - enriched = enriched.map((r: Row) => - pick(r, [...tableFields, ...protectedColumns]) - ) + const tableFields = Object.keys(table.schema).filter( + f => table.schema[f].visible !== false + ) + enriched = enriched.map((r: Row) => + pick(r, [...tableFields, ...protectedColumns]) + ) + } return (wasArray ? enriched : enriched[0]) as T } From f53500450ae2a97e93bf93f03a2d2b436b2bcd66 Mon Sep 17 00:00:00 2001 From: Adria Navarro Date: Wed, 14 Aug 2024 13:00:13 +0200 Subject: [PATCH 139/180] Fix wrong test --- packages/server/src/api/routes/tests/row.spec.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/server/src/api/routes/tests/row.spec.ts b/packages/server/src/api/routes/tests/row.spec.ts index 9351976d66..95e714fbd6 100644 --- a/packages/server/src/api/routes/tests/row.spec.ts +++ b/packages/server/src/api/routes/tests/row.spec.ts @@ -1664,7 +1664,7 @@ describe.each([ isInternal && describe("attachments and signatures", () => { const coreAttachmentEnrichment = async ( - schema: any, + schema: TableSchema, field: string, attachmentCfg: string | string[] ) => { @@ -1691,7 +1691,7 @@ describe.each([ await withEnv({ SELF_HOSTED: "true" }, async () => { return context.doInAppContext(config.getAppId(), async () => { - const enriched: Row[] = await outputProcessing(table, [row]) + const enriched: Row[] = await outputProcessing(testTable, [row]) const [targetRow] = enriched const attachmentEntries = Array.isArray(targetRow[field]) ? targetRow[field] From 09938ae442bf5b94c0d7a5510df1023bd038d830 Mon Sep 17 00:00:00 2001 From: Adria Navarro Date: Wed, 14 Aug 2024 13:13:15 +0200 Subject: [PATCH 140/180] Don't change key order on trimming --- packages/server/src/utilities/rowProcessor/index.ts | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/packages/server/src/utilities/rowProcessor/index.ts b/packages/server/src/utilities/rowProcessor/index.ts index 59b3ea7c16..4b2fd83882 100644 --- a/packages/server/src/utilities/rowProcessor/index.ts +++ b/packages/server/src/utilities/rowProcessor/index.ts @@ -19,7 +19,6 @@ import { User, } from "@budibase/types" import { cloneDeep } from "lodash/fp" -import { pick } from "lodash" import { processInputBBReference, processInputBBReferences, @@ -368,9 +367,16 @@ export async function outputProcessing( const tableFields = Object.keys(table.schema).filter( f => table.schema[f].visible !== false ) - enriched = enriched.map((r: Row) => - pick(r, [...tableFields, ...protectedColumns]) + const fields = [...tableFields, ...protectedColumns].map(f => + f.toLowerCase() ) + for (const row of enriched) { + for (const key of Object.keys(row)) { + if (!fields.includes(key.toLowerCase())) { + delete row[key] + } + } + } } return (wasArray ? enriched : enriched[0]) as T From 084a481821f509a5b865248b5a05ad2372ee460e Mon Sep 17 00:00:00 2001 From: Adria Navarro Date: Wed, 14 Aug 2024 14:17:32 +0200 Subject: [PATCH 141/180] Typo --- packages/server/src/sdk/app/rows/search.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/server/src/sdk/app/rows/search.ts b/packages/server/src/sdk/app/rows/search.ts index c96c0738d2..1bf25ff926 100644 --- a/packages/server/src/sdk/app/rows/search.ts +++ b/packages/server/src/sdk/app/rows/search.ts @@ -81,7 +81,7 @@ export async function search( f => table.schema[f].visible !== false ) - const queriableFields = await getQueriableFields( + const queriableFields = await getQueryableFields( options.fields?.filter(f => tableFields.includes(f)) ?? tableFields, table ) @@ -131,7 +131,7 @@ export async function fetchView( return pickApi(tableId).fetchView(viewName, params) } -async function getQueriableFields( +async function getQueryableFields( fields: string[], table: Table ): Promise { From eb2d71e9808a200f514e935cc082a1f3939e88d7 Mon Sep 17 00:00:00 2001 From: Adria Navarro Date: Wed, 14 Aug 2024 14:35:20 +0200 Subject: [PATCH 142/180] Move getQueryableFields to utils --- .../server/src/sdk/app/rows/queryUtils.ts | 53 ++++++++++++++++++- packages/server/src/sdk/app/rows/search.ts | 49 +---------------- 2 files changed, 53 insertions(+), 49 deletions(-) diff --git a/packages/server/src/sdk/app/rows/queryUtils.ts b/packages/server/src/sdk/app/rows/queryUtils.ts index 20e6af4d67..02e77a77b7 100644 --- a/packages/server/src/sdk/app/rows/queryUtils.ts +++ b/packages/server/src/sdk/app/rows/queryUtils.ts @@ -1,6 +1,12 @@ import { db } from "@budibase/backend-core" -import { isLogicalSearchOperator, SearchFilters } from "@budibase/types" +import { + FieldType, + isLogicalSearchOperator, + SearchFilters, + Table, +} from "@budibase/types" import { cloneDeep } from "lodash/fp" +import sdk from "../../../sdk" export const removeInvalidFilters = ( filters: SearchFilters, @@ -45,3 +51,48 @@ export const removeInvalidFilters = ( return result } + +export const getQueryableFields = async ( + fields: string[], + table: Table +): Promise => { + const handledTables = new Set([table._id!]) + const extractTableFields = async ( + table: Table, + allowedFields: string[] + ): Promise => { + const result = [] + for (const field of Object.keys(table.schema).filter(f => + allowedFields.includes(f) + )) { + const subSchema = table.schema[field] + if (subSchema.type === FieldType.LINK) { + if (handledTables.has(`${table._id}_${subSchema.tableId}`)) { + // avoid circular loops + continue + } + handledTables.add(`${table._id}_${subSchema.tableId}`) + const relatedTable = await sdk.tables.getTable(subSchema.tableId) + const relatedFields = await extractTableFields( + relatedTable, + Object.keys(relatedTable.schema) + ) + + result.push(...relatedFields.map(f => `${subSchema.name}.${f}`)) + // should be able to filter by relationship using table name + result.push(...relatedFields.map(f => `${relatedTable.name}.${f}`)) + } else { + result.push(field) + } + } + return result + } + + const result = [ + "_id", // Querying by _id is always allowed, even if it's never part of the schema + ] + + result.push(...(await extractTableFields(table, fields))) + + return result +} diff --git a/packages/server/src/sdk/app/rows/search.ts b/packages/server/src/sdk/app/rows/search.ts index 1bf25ff926..6a4286814d 100644 --- a/packages/server/src/sdk/app/rows/search.ts +++ b/packages/server/src/sdk/app/rows/search.ts @@ -1,11 +1,9 @@ import { EmptyFilterOption, - FieldType, Row, RowSearchParams, SearchResponse, SortOrder, - Table, } from "@budibase/types" import { isExternalTableID } from "../../../integrations/utils" import * as internal from "./search/internal" @@ -16,7 +14,7 @@ import sdk from "../../index" import { searchInputMapping } from "./search/utils" import { db as dbCore } from "@budibase/backend-core" import tracer from "dd-trace" -import { removeInvalidFilters } from "./queryUtils" +import { getQueryableFields, removeInvalidFilters } from "./queryUtils" export { isValidFilter } from "../../../integrations/utils" @@ -130,48 +128,3 @@ export async function fetchView( ): Promise { return pickApi(tableId).fetchView(viewName, params) } - -async function getQueryableFields( - fields: string[], - table: Table -): Promise { - const handledTables = new Set([table._id!]) - const extractTableFields = async ( - table: Table, - allowedFields: string[] - ): Promise => { - const result = [] - for (const field of Object.keys(table.schema).filter(f => - allowedFields.includes(f) - )) { - const subSchema = table.schema[field] - if (subSchema.type === FieldType.LINK) { - if (handledTables.has(`${table._id}_${subSchema.tableId}`)) { - // avoid circular loops - continue - } - handledTables.add(`${subSchema.tableId}_${table._id}`) - const relatedTable = await sdk.tables.getTable(subSchema.tableId) - const relatedFields = await extractTableFields( - relatedTable, - Object.keys(relatedTable.schema) - ) - - result.push(...relatedFields.map(f => `${subSchema.name}.${f}`)) - // should be able to filter by relationship using table name - result.push(...relatedFields.map(f => `${relatedTable.name}.${f}`)) - } else { - result.push(field) - } - } - return result - } - - const result = [ - "_id", // Querying by _id is always allowed, even if it's never part of the schema - ] - - result.push(...(await extractTableFields(table, fields))) - - return result -} From f0a89764f21839c33c0cdc84ae876c6463298701 Mon Sep 17 00:00:00 2001 From: Adria Navarro Date: Wed, 14 Aug 2024 14:51:17 +0200 Subject: [PATCH 143/180] Add basic test --- .../src/sdk/app/rows/tests/queryUtils.spec.ts | 20 +++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/packages/server/src/sdk/app/rows/tests/queryUtils.spec.ts b/packages/server/src/sdk/app/rows/tests/queryUtils.spec.ts index 4970e83685..a88ceace90 100644 --- a/packages/server/src/sdk/app/rows/tests/queryUtils.spec.ts +++ b/packages/server/src/sdk/app/rows/tests/queryUtils.spec.ts @@ -1,5 +1,6 @@ -import { SearchFilters } from "@budibase/types" -import { removeInvalidFilters } from "../queryUtils" +import { FieldType, SearchFilters, Table } from "@budibase/types" +import { getQueryableFields, removeInvalidFilters } from "../queryUtils" +import { structures } from "../../../../api/routes/tests/utilities" describe("query utils", () => { describe("removeInvalidFilters", () => { @@ -179,4 +180,19 @@ describe("query utils", () => { }) }) }) + + describe("getQueryableFields", () => { + it("allows querying by table schema fields and _id", async () => { + const table: Table = { + ...structures.basicTable(), + schema: { + name: { name: "name", type: FieldType.STRING }, + age: { name: "age", type: FieldType.NUMBER }, + }, + } + + const result = await getQueryableFields(["name", "age"], table) + expect(result).toEqual(["_id", "name", "age"]) + }) + }) }) From b744ec3c3552c07987834319e3491399ddd32d3f Mon Sep 17 00:00:00 2001 From: Adria Navarro Date: Wed, 14 Aug 2024 15:02:30 +0200 Subject: [PATCH 144/180] Add extra tests --- .../server/src/sdk/app/rows/queryUtils.ts | 4 +- .../src/sdk/app/rows/tests/queryUtils.spec.ts | 67 ++++++++++++++++++- 2 files changed, 67 insertions(+), 4 deletions(-) diff --git a/packages/server/src/sdk/app/rows/queryUtils.ts b/packages/server/src/sdk/app/rows/queryUtils.ts index 02e77a77b7..5eb2b2d1c8 100644 --- a/packages/server/src/sdk/app/rows/queryUtils.ts +++ b/packages/server/src/sdk/app/rows/queryUtils.ts @@ -62,8 +62,8 @@ export const getQueryableFields = async ( allowedFields: string[] ): Promise => { const result = [] - for (const field of Object.keys(table.schema).filter(f => - allowedFields.includes(f) + for (const field of Object.keys(table.schema).filter( + f => allowedFields.includes(f) && table.schema[f].visible !== false )) { const subSchema = table.schema[field] if (subSchema.type === FieldType.LINK) { diff --git a/packages/server/src/sdk/app/rows/tests/queryUtils.spec.ts b/packages/server/src/sdk/app/rows/tests/queryUtils.spec.ts index a88ceace90..9a824069d5 100644 --- a/packages/server/src/sdk/app/rows/tests/queryUtils.spec.ts +++ b/packages/server/src/sdk/app/rows/tests/queryUtils.spec.ts @@ -1,6 +1,12 @@ -import { FieldType, SearchFilters, Table } from "@budibase/types" +import { + FieldType, + RelationshipType, + SearchFilters, + Table, +} from "@budibase/types" import { getQueryableFields, removeInvalidFilters } from "../queryUtils" import { structures } from "../../../../api/routes/tests/utilities" +import TestConfiguration from "../../../../tests/utilities/TestConfiguration" describe("query utils", () => { describe("removeInvalidFilters", () => { @@ -182,7 +188,13 @@ describe("query utils", () => { }) describe("getQueryableFields", () => { - it("allows querying by table schema fields and _id", async () => { + const config = new TestConfiguration() + + beforeAll(async () => { + await config.init() + }) + + it("returns table schema fields and _id", async () => { const table: Table = { ...structures.basicTable(), schema: { @@ -194,5 +206,56 @@ describe("query utils", () => { const result = await getQueryableFields(["name", "age"], table) expect(result).toEqual(["_id", "name", "age"]) }) + + it("does not return hidden fields", async () => { + const table: Table = { + ...structures.basicTable(), + schema: { + name: { name: "name", type: FieldType.STRING }, + age: { name: "age", type: FieldType.NUMBER, visible: false }, + }, + } + + const result = await getQueryableFields(["name", "age"], table) + expect(result).toEqual(["_id", "name"]) + }) + + it("includes relationship fields", async () => { + const aux: Table = await config.api.table.save({ + ...structures.basicTable(), + name: "auxTable", + schema: { + title: { name: "title", type: FieldType.STRING }, + name: { name: "name", type: FieldType.STRING }, + }, + }) + + const table: Table = { + ...structures.basicTable(), + schema: { + name: { name: "name", type: FieldType.STRING }, + age: { name: "age", type: FieldType.NUMBER, visible: false }, + aux: { + name: "aux", + type: FieldType.LINK, + tableId: aux._id!, + relationshipType: RelationshipType.ONE_TO_MANY, + fieldName: "table", + }, + }, + } + + const result = await config.doInContext(config.appId, () => { + return getQueryableFields(["name", "age", "aux"], table) + }) + expect(result).toEqual([ + "_id", + "name", + "aux.title", + "aux.name", + "auxTable.title", + "auxTable.name", + ]) + }) }) }) From d8462ba96168a840dd34c6f620bc0fb992f6669b Mon Sep 17 00:00:00 2001 From: Adria Navarro Date: Wed, 14 Aug 2024 18:16:46 +0200 Subject: [PATCH 145/180] Fix tests --- .../server/src/sdk/app/rows/queryUtils.ts | 10 +- .../src/sdk/app/rows/tests/queryUtils.spec.ts | 129 +++++++++++++++++- 2 files changed, 130 insertions(+), 9 deletions(-) diff --git a/packages/server/src/sdk/app/rows/queryUtils.ts b/packages/server/src/sdk/app/rows/queryUtils.ts index 5eb2b2d1c8..dba33d7694 100644 --- a/packages/server/src/sdk/app/rows/queryUtils.ts +++ b/packages/server/src/sdk/app/rows/queryUtils.ts @@ -78,9 +78,13 @@ export const getQueryableFields = async ( Object.keys(relatedTable.schema) ) - result.push(...relatedFields.map(f => `${subSchema.name}.${f}`)) - // should be able to filter by relationship using table name - result.push(...relatedFields.map(f => `${relatedTable.name}.${f}`)) + result.push( + ...relatedFields.flatMap(f => [ + `${subSchema.name}.${f}`, + // should be able to filter by relationship using table name + `${relatedTable.name}.${f}`, + ]) + ) } else { result.push(field) } diff --git a/packages/server/src/sdk/app/rows/tests/queryUtils.spec.ts b/packages/server/src/sdk/app/rows/tests/queryUtils.spec.ts index 9a824069d5..e422ef75a7 100644 --- a/packages/server/src/sdk/app/rows/tests/queryUtils.spec.ts +++ b/packages/server/src/sdk/app/rows/tests/queryUtils.spec.ts @@ -203,11 +203,11 @@ describe("query utils", () => { }, } - const result = await getQueryableFields(["name", "age"], table) + const result = await getQueryableFields(Object.keys(table.schema), table) expect(result).toEqual(["_id", "name", "age"]) }) - it("does not return hidden fields", async () => { + it("excludes hidden fields", async () => { const table: Table = { ...structures.basicTable(), schema: { @@ -216,7 +216,7 @@ describe("query utils", () => { }, } - const result = await getQueryableFields(["name", "age"], table) + const result = await getQueryableFields(Object.keys(table.schema), table) expect(result).toEqual(["_id", "name"]) }) @@ -234,7 +234,6 @@ describe("query utils", () => { ...structures.basicTable(), schema: { name: { name: "name", type: FieldType.STRING }, - age: { name: "age", type: FieldType.NUMBER, visible: false }, aux: { name: "aux", type: FieldType.LINK, @@ -246,16 +245,134 @@ describe("query utils", () => { } const result = await config.doInContext(config.appId, () => { - return getQueryableFields(["name", "age", "aux"], table) + return getQueryableFields(Object.keys(table.schema), table) }) expect(result).toEqual([ "_id", "name", "aux.title", - "aux.name", "auxTable.title", + "aux.name", "auxTable.name", ]) }) + + it("excludes hidden relationship fields", async () => { + const aux: Table = await config.api.table.save({ + ...structures.basicTable(), + name: "auxTable", + schema: { + title: { name: "title", type: FieldType.STRING, visible: false }, + name: { name: "name", type: FieldType.STRING, visible: true }, + }, + }) + + const table: Table = { + ...structures.basicTable(), + schema: { + name: { name: "name", type: FieldType.STRING }, + aux: { + name: "aux", + type: FieldType.LINK, + tableId: aux._id!, + relationshipType: RelationshipType.ONE_TO_MANY, + fieldName: "table", + }, + }, + } + + const result = await config.doInContext(config.appId, () => { + return getQueryableFields(Object.keys(table.schema), table) + }) + expect(result).toEqual(["_id", "name", "aux.name", "auxTable.name"]) + }) + + it("excludes all relationship fields if hidden", async () => { + const aux: Table = await config.api.table.save({ + ...structures.basicTable(), + name: "auxTable", + schema: { + title: { name: "title", type: FieldType.STRING, visible: false }, + name: { name: "name", type: FieldType.STRING, visible: true }, + }, + }) + + const table: Table = { + ...structures.basicTable(), + schema: { + name: { name: "name", type: FieldType.STRING }, + aux: { + name: "aux", + type: FieldType.LINK, + tableId: aux._id!, + relationshipType: RelationshipType.ONE_TO_MANY, + fieldName: "table", + visible: false, + }, + }, + } + + const result = await config.doInContext(config.appId, () => { + return getQueryableFields(Object.keys(table.schema), table) + }) + expect(result).toEqual(["_id", "name"]) + }) + + it("includes nested relationship fields", async () => { + const aux1: Table = await config.api.table.save({ + ...structures.basicTable(), + name: "aux1Table", + schema: { + name: { name: "name", type: FieldType.STRING }, + }, + }) + const aux2: Table = await config.api.table.save({ + ...structures.basicTable(), + name: "aux2Table", + schema: { + title: { name: "title", type: FieldType.STRING }, + aux1: { + name: "aux1", + type: FieldType.LINK, + tableId: aux1._id!, + relationshipType: RelationshipType.ONE_TO_MANY, + fieldName: "aux2", + }, + }, + }) + + const table: Table = { + ...structures.basicTable(), + schema: { + name: { name: "name", type: FieldType.STRING }, + aux: { + name: "aux", + type: FieldType.LINK, + tableId: aux2._id!, + relationshipType: RelationshipType.ONE_TO_MANY, + fieldName: "table", + }, + }, + } + + const result = await config.doInContext(config.appId, () => { + return getQueryableFields(Object.keys(table.schema), table) + }) + expect(result).toEqual([ + "_id", + "name", + // Aux primitive props + "aux.title", + "aux2Table.title", + + // Aux deep 1 primitive props + "aux.aux1.name", + "aux2Table.aux1.name", + + // Aux deep 2 primitive props + "aux.aux1Table.name", + "aux2Table.aux1Table.name", + ]) + }) }) }) From bbf7142bd79043ebc642cd05b428007d725c5dee Mon Sep 17 00:00:00 2001 From: Adria Navarro Date: Fri, 16 Aug 2024 09:36:31 +0200 Subject: [PATCH 146/180] Handle relationships properly --- .../server/src/sdk/app/rows/queryUtils.ts | 12 +- .../src/sdk/app/rows/tests/queryUtils.spec.ts | 139 ++++++++++-------- 2 files changed, 86 insertions(+), 65 deletions(-) diff --git a/packages/server/src/sdk/app/rows/queryUtils.ts b/packages/server/src/sdk/app/rows/queryUtils.ts index dba33d7694..b033c6dd17 100644 --- a/packages/server/src/sdk/app/rows/queryUtils.ts +++ b/packages/server/src/sdk/app/rows/queryUtils.ts @@ -56,10 +56,10 @@ export const getQueryableFields = async ( fields: string[], table: Table ): Promise => { - const handledTables = new Set([table._id!]) const extractTableFields = async ( table: Table, - allowedFields: string[] + allowedFields: string[], + fromTables: string[] ): Promise => { const result = [] for (const field of Object.keys(table.schema).filter( @@ -67,15 +67,15 @@ export const getQueryableFields = async ( )) { const subSchema = table.schema[field] if (subSchema.type === FieldType.LINK) { - if (handledTables.has(`${table._id}_${subSchema.tableId}`)) { + if (fromTables.includes(subSchema.tableId)) { // avoid circular loops continue } - handledTables.add(`${table._id}_${subSchema.tableId}`) const relatedTable = await sdk.tables.getTable(subSchema.tableId) const relatedFields = await extractTableFields( relatedTable, - Object.keys(relatedTable.schema) + Object.keys(relatedTable.schema), + [...fromTables, subSchema.tableId] ) result.push( @@ -96,7 +96,7 @@ export const getQueryableFields = async ( "_id", // Querying by _id is always allowed, even if it's never part of the schema ] - result.push(...(await extractTableFields(table, fields))) + result.push(...(await extractTableFields(table, fields, [table._id!]))) return result } diff --git a/packages/server/src/sdk/app/rows/tests/queryUtils.spec.ts b/packages/server/src/sdk/app/rows/tests/queryUtils.spec.ts index e422ef75a7..57ca93e578 100644 --- a/packages/server/src/sdk/app/rows/tests/queryUtils.spec.ts +++ b/packages/server/src/sdk/app/rows/tests/queryUtils.spec.ts @@ -195,26 +195,26 @@ describe("query utils", () => { }) it("returns table schema fields and _id", async () => { - const table: Table = { + const table: Table = await config.api.table.save({ ...structures.basicTable(), schema: { name: { name: "name", type: FieldType.STRING }, age: { name: "age", type: FieldType.NUMBER }, }, - } + }) const result = await getQueryableFields(Object.keys(table.schema), table) expect(result).toEqual(["_id", "name", "age"]) }) it("excludes hidden fields", async () => { - const table: Table = { + const table: Table = await config.api.table.save({ ...structures.basicTable(), schema: { name: { name: "name", type: FieldType.STRING }, age: { name: "age", type: FieldType.NUMBER, visible: false }, }, - } + }) const result = await getQueryableFields(Object.keys(table.schema), table) expect(result).toEqual(["_id", "name"]) @@ -230,7 +230,7 @@ describe("query utils", () => { }, }) - const table: Table = { + const table: Table = await config.api.table.save({ ...structures.basicTable(), schema: { name: { name: "name", type: FieldType.STRING }, @@ -242,7 +242,7 @@ describe("query utils", () => { fieldName: "table", }, }, - } + }) const result = await config.doInContext(config.appId, () => { return getQueryableFields(Object.keys(table.schema), table) @@ -267,7 +267,7 @@ describe("query utils", () => { }, }) - const table: Table = { + const table: Table = await config.api.table.save({ ...structures.basicTable(), schema: { name: { name: "name", type: FieldType.STRING }, @@ -279,7 +279,7 @@ describe("query utils", () => { fieldName: "table", }, }, - } + }) const result = await config.doInContext(config.appId, () => { return getQueryableFields(Object.keys(table.schema), table) @@ -297,7 +297,7 @@ describe("query utils", () => { }, }) - const table: Table = { + const table: Table = await config.api.table.save({ ...structures.basicTable(), schema: { name: { name: "name", type: FieldType.STRING }, @@ -310,7 +310,7 @@ describe("query utils", () => { visible: false, }, }, - } + }) const result = await config.doInContext(config.appId, () => { return getQueryableFields(Object.keys(table.schema), table) @@ -318,61 +318,82 @@ describe("query utils", () => { expect(result).toEqual(["_id", "name"]) }) - it("includes nested relationship fields", async () => { - const aux1: Table = await config.api.table.save({ - ...structures.basicTable(), - name: "aux1Table", - schema: { - name: { name: "name", type: FieldType.STRING }, - }, - }) - const aux2: Table = await config.api.table.save({ - ...structures.basicTable(), - name: "aux2Table", - schema: { - title: { name: "title", type: FieldType.STRING }, - aux1: { - name: "aux1", - type: FieldType.LINK, - tableId: aux1._id!, - relationshipType: RelationshipType.ONE_TO_MANY, - fieldName: "aux2", + describe("nested relationship", () => { + let table: Table, aux1: Table, aux2: Table + + beforeAll(async () => { + aux1 = await config.api.table.save({ + ...structures.basicTable(), + name: "aux1Table", + schema: { + name: { name: "name", type: FieldType.STRING }, }, - }, - }) - - const table: Table = { - ...structures.basicTable(), - schema: { - name: { name: "name", type: FieldType.STRING }, - aux: { - name: "aux", - type: FieldType.LINK, - tableId: aux2._id!, - relationshipType: RelationshipType.ONE_TO_MANY, - fieldName: "table", + }) + aux2 = await config.api.table.save({ + ...structures.basicTable(), + name: "aux2Table", + schema: { + title: { name: "title", type: FieldType.STRING }, + aux1_1: { + name: "aux1_1", + type: FieldType.LINK, + tableId: aux1._id!, + relationshipType: RelationshipType.ONE_TO_MANY, + fieldName: "aux2_1", + }, }, - }, - } + }) - const result = await config.doInContext(config.appId, () => { - return getQueryableFields(Object.keys(table.schema), table) + table = await config.api.table.save({ + ...structures.basicTable(), + schema: { + name: { name: "name", type: FieldType.STRING }, + aux1: { + name: "aux1", + type: FieldType.LINK, + tableId: aux1._id!, + relationshipType: RelationshipType.ONE_TO_MANY, + fieldName: "table", + }, + aux2: { + name: "aux2", + type: FieldType.LINK, + tableId: aux2._id!, + relationshipType: RelationshipType.ONE_TO_MANY, + fieldName: "table", + }, + }, + }) }) - expect(result).toEqual([ - "_id", - "name", - // Aux primitive props - "aux.title", - "aux2Table.title", - // Aux deep 1 primitive props - "aux.aux1.name", - "aux2Table.aux1.name", + it("includes nested relationship fields from main table", async () => { + const result = await config.doInContext(config.appId, () => { + return getQueryableFields(Object.keys(table.schema), table) + }) + expect(result).toEqual([ + "_id", + "name", + // deep 1 aux1 primitive props + "aux1.name", + "aux1Table.name", - // Aux deep 2 primitive props - "aux.aux1Table.name", - "aux2Table.aux1Table.name", - ]) + // deep 2 aux1 primitive props + "aux1.aux2_1.title", + "aux1Table.aux2_1.title", + "aux1.aux2Table.title", + "aux1Table.aux2Table.title", + + // deep 1 aux2 primitive props + "aux2.title", + "aux2Table.title", + + // deep 2 aux2 primitive props + "aux2.aux1_1.name", + "aux2Table.aux1_1.name", + "aux2.aux1Table.name", + "aux2Table.aux1Table.name", + ]) + }) }) }) }) From 27c618d263a8f416cac281f64fe1a0c81d7186f8 Mon Sep 17 00:00:00 2001 From: Adria Navarro Date: Fri, 16 Aug 2024 09:57:13 +0200 Subject: [PATCH 147/180] Extra tests --- .../src/sdk/app/rows/tests/queryUtils.spec.ts | 114 +++++++++++++++++- 1 file changed, 108 insertions(+), 6 deletions(-) diff --git a/packages/server/src/sdk/app/rows/tests/queryUtils.spec.ts b/packages/server/src/sdk/app/rows/tests/queryUtils.spec.ts index 57ca93e578..cdc29b8b32 100644 --- a/packages/server/src/sdk/app/rows/tests/queryUtils.spec.ts +++ b/packages/server/src/sdk/app/rows/tests/queryUtils.spec.ts @@ -322,14 +322,14 @@ describe("query utils", () => { let table: Table, aux1: Table, aux2: Table beforeAll(async () => { - aux1 = await config.api.table.save({ + const { _id: aux1Id } = await config.api.table.save({ ...structures.basicTable(), name: "aux1Table", schema: { name: { name: "name", type: FieldType.STRING }, }, }) - aux2 = await config.api.table.save({ + const { _id: aux2Id } = await config.api.table.save({ ...structures.basicTable(), name: "aux2Table", schema: { @@ -337,33 +337,45 @@ describe("query utils", () => { aux1_1: { name: "aux1_1", type: FieldType.LINK, - tableId: aux1._id!, + tableId: aux1Id!, relationshipType: RelationshipType.ONE_TO_MANY, fieldName: "aux2_1", }, + aux1_2: { + name: "aux1_2", + type: FieldType.LINK, + tableId: aux1Id!, + relationshipType: RelationshipType.ONE_TO_MANY, + fieldName: "aux2_2", + }, }, }) - table = await config.api.table.save({ + const { _id: tableId } = await config.api.table.save({ ...structures.basicTable(), schema: { name: { name: "name", type: FieldType.STRING }, aux1: { name: "aux1", type: FieldType.LINK, - tableId: aux1._id!, + tableId: aux1Id!, relationshipType: RelationshipType.ONE_TO_MANY, fieldName: "table", }, aux2: { name: "aux2", type: FieldType.LINK, - tableId: aux2._id!, + tableId: aux2Id!, relationshipType: RelationshipType.ONE_TO_MANY, fieldName: "table", }, }, }) + + // We need to refech them to get the updated foreign keys + aux1 = await config.api.table.get(aux1Id!) + aux2 = await config.api.table.get(aux2Id!) + table = await config.api.table.get(tableId!) }) it("includes nested relationship fields from main table", async () => { @@ -383,6 +395,12 @@ describe("query utils", () => { "aux1.aux2Table.title", "aux1Table.aux2Table.title", + // deep 2 aux2 primitive props + "aux1.aux2_2.title", + "aux1Table.aux2_2.title", + "aux1.aux2Table.title", + "aux1Table.aux2Table.title", + // deep 1 aux2 primitive props "aux2.title", "aux2Table.title", @@ -392,6 +410,90 @@ describe("query utils", () => { "aux2Table.aux1_1.name", "aux2.aux1Table.name", "aux2Table.aux1Table.name", + "aux2.aux1_2.name", + "aux2Table.aux1_2.name", + "aux2.aux1Table.name", + "aux2Table.aux1Table.name", + ]) + }) + + it("includes nested relationship fields from aux 1 table", async () => { + const result = await config.doInContext(config.appId, () => { + return getQueryableFields(Object.keys(aux1.schema), aux1) + }) + expect(result).toEqual([ + "_id", + "name", + + // deep 1 aux2_1 primitive props + "aux2_1.title", + "aux2Table.title", + + // deep 2 aux2_1 primitive props + "aux2_1.table.name", + "aux2Table.table.name", + "aux2_1.TestTable.name", + "aux2Table.TestTable.name", + + // deep 1 aux2_2 primitive props + "aux2_2.title", + "aux2Table.title", + + // deep 2 aux2_2 primitive props + "aux2_2.table.name", + "aux2Table.table.name", + "aux2_2.TestTable.name", + "aux2Table.TestTable.name", + + // deep 1 table primitive props + "table.name", + "TestTable.name", + + // deep 2 table primitive props + "table.aux2.title", + "TestTable.aux2.title", + "table.aux2Table.title", + "TestTable.aux2Table.title", + ]) + }) + + it("includes nested relationship fields from aux 2 table", async () => { + const result = await config.doInContext(config.appId, () => { + return getQueryableFields(Object.keys(aux2.schema), aux2) + }) + expect(result).toEqual([ + "_id", + "title", + + // deep 1 aux1_1 primitive props + "aux1_1.name", + "aux1Table.name", + + // deep 2 aux1_1 primitive props + "aux1_1.table.name", + "aux1Table.table.name", + "aux1_1.TestTable.name", + "aux1Table.TestTable.name", + + // deep 1 aux1_2 primitive props + "aux1_2.name", + "aux1Table.name", + + // deep 2 aux1_2 primitive props + "aux1_2.table.name", + "aux1Table.table.name", + "aux1_2.TestTable.name", + "aux1Table.TestTable.name", + + // deep 1 table primitive props + "table.name", + "TestTable.name", + + // deep 2 table primitive props + "table.aux1.name", + "TestTable.aux1.name", + "table.aux1Table.name", + "TestTable.aux1Table.name", ]) }) }) From 07fe8c6c1fafeb7c6eeed79abad8fab80d07a65e Mon Sep 17 00:00:00 2001 From: Adria Navarro Date: Fri, 16 Aug 2024 10:03:15 +0200 Subject: [PATCH 148/180] Many to many tests --- .../src/sdk/app/rows/tests/queryUtils.spec.ts | 382 ++++++++++-------- 1 file changed, 222 insertions(+), 160 deletions(-) diff --git a/packages/server/src/sdk/app/rows/tests/queryUtils.spec.ts b/packages/server/src/sdk/app/rows/tests/queryUtils.spec.ts index cdc29b8b32..c156b2d5ba 100644 --- a/packages/server/src/sdk/app/rows/tests/queryUtils.spec.ts +++ b/packages/server/src/sdk/app/rows/tests/queryUtils.spec.ts @@ -319,182 +319,244 @@ describe("query utils", () => { }) describe("nested relationship", () => { - let table: Table, aux1: Table, aux2: Table + describe("one-to-many", () => { + let table: Table, aux1: Table, aux2: Table - beforeAll(async () => { - const { _id: aux1Id } = await config.api.table.save({ - ...structures.basicTable(), - name: "aux1Table", - schema: { - name: { name: "name", type: FieldType.STRING }, - }, - }) - const { _id: aux2Id } = await config.api.table.save({ - ...structures.basicTable(), - name: "aux2Table", - schema: { - title: { name: "title", type: FieldType.STRING }, - aux1_1: { - name: "aux1_1", - type: FieldType.LINK, - tableId: aux1Id!, - relationshipType: RelationshipType.ONE_TO_MANY, - fieldName: "aux2_1", + beforeAll(async () => { + const { _id: aux1Id } = await config.api.table.save({ + ...structures.basicTable(), + name: "aux1Table", + schema: { + name: { name: "name", type: FieldType.STRING }, }, - aux1_2: { - name: "aux1_2", - type: FieldType.LINK, - tableId: aux1Id!, - relationshipType: RelationshipType.ONE_TO_MANY, - fieldName: "aux2_2", + }) + const { _id: aux2Id } = await config.api.table.save({ + ...structures.basicTable(), + name: "aux2Table", + schema: { + title: { name: "title", type: FieldType.STRING }, + aux1_1: { + name: "aux1_1", + type: FieldType.LINK, + tableId: aux1Id!, + relationshipType: RelationshipType.ONE_TO_MANY, + fieldName: "aux2_1", + }, + aux1_2: { + name: "aux1_2", + type: FieldType.LINK, + tableId: aux1Id!, + relationshipType: RelationshipType.ONE_TO_MANY, + fieldName: "aux2_2", + }, }, - }, + }) + + const { _id: tableId } = await config.api.table.save({ + ...structures.basicTable(), + schema: { + name: { name: "name", type: FieldType.STRING }, + aux1: { + name: "aux1", + type: FieldType.LINK, + tableId: aux1Id!, + relationshipType: RelationshipType.ONE_TO_MANY, + fieldName: "table", + }, + aux2: { + name: "aux2", + type: FieldType.LINK, + tableId: aux2Id!, + relationshipType: RelationshipType.ONE_TO_MANY, + fieldName: "table", + }, + }, + }) + + // We need to refech them to get the updated foreign keys + aux1 = await config.api.table.get(aux1Id!) + aux2 = await config.api.table.get(aux2Id!) + table = await config.api.table.get(tableId!) }) - const { _id: tableId } = await config.api.table.save({ - ...structures.basicTable(), - schema: { - name: { name: "name", type: FieldType.STRING }, - aux1: { - name: "aux1", - type: FieldType.LINK, - tableId: aux1Id!, - relationshipType: RelationshipType.ONE_TO_MANY, - fieldName: "table", - }, - aux2: { - name: "aux2", - type: FieldType.LINK, - tableId: aux2Id!, - relationshipType: RelationshipType.ONE_TO_MANY, - fieldName: "table", - }, - }, + it("includes nested relationship fields from main table", async () => { + const result = await config.doInContext(config.appId, () => { + return getQueryableFields(Object.keys(table.schema), table) + }) + expect(result).toEqual([ + "_id", + "name", + // deep 1 aux1 primitive props + "aux1.name", + "aux1Table.name", + + // deep 2 aux1 primitive props + "aux1.aux2_1.title", + "aux1Table.aux2_1.title", + "aux1.aux2Table.title", + "aux1Table.aux2Table.title", + + // deep 2 aux2 primitive props + "aux1.aux2_2.title", + "aux1Table.aux2_2.title", + "aux1.aux2Table.title", + "aux1Table.aux2Table.title", + + // deep 1 aux2 primitive props + "aux2.title", + "aux2Table.title", + + // deep 2 aux2 primitive props + "aux2.aux1_1.name", + "aux2Table.aux1_1.name", + "aux2.aux1Table.name", + "aux2Table.aux1Table.name", + "aux2.aux1_2.name", + "aux2Table.aux1_2.name", + "aux2.aux1Table.name", + "aux2Table.aux1Table.name", + ]) }) - // We need to refech them to get the updated foreign keys - aux1 = await config.api.table.get(aux1Id!) - aux2 = await config.api.table.get(aux2Id!) - table = await config.api.table.get(tableId!) + it("includes nested relationship fields from aux 1 table", async () => { + const result = await config.doInContext(config.appId, () => { + return getQueryableFields(Object.keys(aux1.schema), aux1) + }) + expect(result).toEqual([ + "_id", + "name", + + // deep 1 aux2_1 primitive props + "aux2_1.title", + "aux2Table.title", + + // deep 2 aux2_1 primitive props + "aux2_1.table.name", + "aux2Table.table.name", + "aux2_1.TestTable.name", + "aux2Table.TestTable.name", + + // deep 1 aux2_2 primitive props + "aux2_2.title", + "aux2Table.title", + + // deep 2 aux2_2 primitive props + "aux2_2.table.name", + "aux2Table.table.name", + "aux2_2.TestTable.name", + "aux2Table.TestTable.name", + + // deep 1 table primitive props + "table.name", + "TestTable.name", + + // deep 2 table primitive props + "table.aux2.title", + "TestTable.aux2.title", + "table.aux2Table.title", + "TestTable.aux2Table.title", + ]) + }) + + it("includes nested relationship fields from aux 2 table", async () => { + const result = await config.doInContext(config.appId, () => { + return getQueryableFields(Object.keys(aux2.schema), aux2) + }) + expect(result).toEqual([ + "_id", + "title", + + // deep 1 aux1_1 primitive props + "aux1_1.name", + "aux1Table.name", + + // deep 2 aux1_1 primitive props + "aux1_1.table.name", + "aux1Table.table.name", + "aux1_1.TestTable.name", + "aux1Table.TestTable.name", + + // deep 1 aux1_2 primitive props + "aux1_2.name", + "aux1Table.name", + + // deep 2 aux1_2 primitive props + "aux1_2.table.name", + "aux1Table.table.name", + "aux1_2.TestTable.name", + "aux1Table.TestTable.name", + + // deep 1 table primitive props + "table.name", + "TestTable.name", + + // deep 2 table primitive props + "table.aux1.name", + "TestTable.aux1.name", + "table.aux1Table.name", + "TestTable.aux1Table.name", + ]) + }) }) - it("includes nested relationship fields from main table", async () => { - const result = await config.doInContext(config.appId, () => { - return getQueryableFields(Object.keys(table.schema), table) + describe("many-to-many", () => { + let table: Table, aux: Table + + beforeAll(async () => { + const { _id: auxId } = await config.api.table.save({ + ...structures.basicTable(), + name: "auxTable", + schema: { + title: { name: "title", type: FieldType.STRING }, + }, + }) + + const { _id: tableId } = await config.api.table.save({ + ...structures.basicTable(), + schema: { + name: { name: "name", type: FieldType.STRING }, + aux: { + name: "aux", + type: FieldType.LINK, + tableId: auxId!, + relationshipType: RelationshipType.MANY_TO_MANY, + fieldName: "table", + }, + }, + }) + + // We need to refech them to get the updated foreign keys + aux = await config.api.table.get(auxId!) + table = await config.api.table.get(tableId!) }) - expect(result).toEqual([ - "_id", - "name", - // deep 1 aux1 primitive props - "aux1.name", - "aux1Table.name", - // deep 2 aux1 primitive props - "aux1.aux2_1.title", - "aux1Table.aux2_1.title", - "aux1.aux2Table.title", - "aux1Table.aux2Table.title", + it("includes nested relationship fields from main table", async () => { + const result = await config.doInContext(config.appId, () => { + return getQueryableFields(Object.keys(table.schema), table) + }) + expect(result).toEqual([ + "_id", + "name", - // deep 2 aux2 primitive props - "aux1.aux2_2.title", - "aux1Table.aux2_2.title", - "aux1.aux2Table.title", - "aux1Table.aux2Table.title", - - // deep 1 aux2 primitive props - "aux2.title", - "aux2Table.title", - - // deep 2 aux2 primitive props - "aux2.aux1_1.name", - "aux2Table.aux1_1.name", - "aux2.aux1Table.name", - "aux2Table.aux1Table.name", - "aux2.aux1_2.name", - "aux2Table.aux1_2.name", - "aux2.aux1Table.name", - "aux2Table.aux1Table.name", - ]) - }) - - it("includes nested relationship fields from aux 1 table", async () => { - const result = await config.doInContext(config.appId, () => { - return getQueryableFields(Object.keys(aux1.schema), aux1) + // deep 1 aux primitive props + "aux.title", + "auxTable.title", + ]) }) - expect(result).toEqual([ - "_id", - "name", - // deep 1 aux2_1 primitive props - "aux2_1.title", - "aux2Table.title", + it("includes nested relationship fields from aux table", async () => { + const result = await config.doInContext(config.appId, () => { + return getQueryableFields(Object.keys(aux.schema), aux) + }) + expect(result).toEqual([ + "_id", + "title", - // deep 2 aux2_1 primitive props - "aux2_1.table.name", - "aux2Table.table.name", - "aux2_1.TestTable.name", - "aux2Table.TestTable.name", - - // deep 1 aux2_2 primitive props - "aux2_2.title", - "aux2Table.title", - - // deep 2 aux2_2 primitive props - "aux2_2.table.name", - "aux2Table.table.name", - "aux2_2.TestTable.name", - "aux2Table.TestTable.name", - - // deep 1 table primitive props - "table.name", - "TestTable.name", - - // deep 2 table primitive props - "table.aux2.title", - "TestTable.aux2.title", - "table.aux2Table.title", - "TestTable.aux2Table.title", - ]) - }) - - it("includes nested relationship fields from aux 2 table", async () => { - const result = await config.doInContext(config.appId, () => { - return getQueryableFields(Object.keys(aux2.schema), aux2) + // deep 1 dependency primitive props + "table.name", + "TestTable.name", + ]) }) - expect(result).toEqual([ - "_id", - "title", - - // deep 1 aux1_1 primitive props - "aux1_1.name", - "aux1Table.name", - - // deep 2 aux1_1 primitive props - "aux1_1.table.name", - "aux1Table.table.name", - "aux1_1.TestTable.name", - "aux1Table.TestTable.name", - - // deep 1 aux1_2 primitive props - "aux1_2.name", - "aux1Table.name", - - // deep 2 aux1_2 primitive props - "aux1_2.table.name", - "aux1Table.table.name", - "aux1_2.TestTable.name", - "aux1Table.TestTable.name", - - // deep 1 table primitive props - "table.name", - "TestTable.name", - - // deep 2 table primitive props - "table.aux1.name", - "TestTable.aux1.name", - "table.aux1Table.name", - "TestTable.aux1Table.name", - ]) }) }) }) From f4d5eb31de2596033ae5abcdaeed7a73ab415569 Mon Sep 17 00:00:00 2001 From: mike12345567 Date: Mon, 19 Aug 2024 16:20:33 +0100 Subject: [PATCH 149/180] Fixing test case. --- .../src/integrations/tests/sqlAlias.spec.ts | 21 +++++++++++-------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/packages/server/src/integrations/tests/sqlAlias.spec.ts b/packages/server/src/integrations/tests/sqlAlias.spec.ts index 0b433896bf..6f34f4eb89 100644 --- a/packages/server/src/integrations/tests/sqlAlias.spec.ts +++ b/packages/server/src/integrations/tests/sqlAlias.spec.ts @@ -97,13 +97,14 @@ describe("Captures of real examples", () => { const filters = queryJson.filters?.oneOf?.taskid as number[] let query = new Sql(SqlClient.POSTGRES, limit)._query(queryJson) expect(query).toEqual({ - bindings: [...filters, limit, limit], - sql: multiline(`select "a"."executorid" as "a.executorid", "a"."taskname" as "a.taskname", - "a"."taskid" as "a.taskid", "a"."completed" as "a.completed", "a"."qaid" as "a.qaid", - "b"."productname" as "b.productname", "b"."productid" as "b.productid" - from (select * from "tasks" as "a" where "a"."taskid" in ($1, $2) order by "a"."taskid" asc limit $3) as "a" - left join "products_tasks" as "c" on "a"."taskid" = "c"."taskid" - left join "products" as "b" on "b"."productid" = "c"."productid" order by "a"."taskid" asc limit $4`), + bindings: [...filters, limit, ...filters, limit], + sql: multiline( + `select "a"."executorid" as "a.executorid", "a"."taskname" as "a.taskname", "a"."taskid" as "a.taskid", + "a"."completed" as "a.completed", "a"."qaid" as "a.qaid", "b"."productname" as "b.productname", "b"."productid" as "b.productid" + from (select * from "tasks" as "a" where "a"."taskid" in ($1, $2) order by "a"."taskid" asc limit $3) as "a" + left join "products_tasks" as "c" on "a"."taskid" = "c"."taskid" left join "products" as "b" on "b"."productid" = "c"."productid" + where "a"."taskid" in ($4, $5) order by "a"."taskid" asc limit $6` + ), }) }) @@ -123,6 +124,7 @@ describe("Captures of real examples", () => { rangeValue.low, rangeValue.high, equalValue, + true, limit, ], sql: expect.stringContaining( @@ -186,8 +188,9 @@ describe("Captures of real examples", () => { }, queryJson) expect(returningQuery).toEqual({ sql: multiline(`select top (@p0) * from (select top (@p1) * from [people] where CASE WHEN [people].[name] = @p2 - THEN 1 ELSE 0 END = 1 and CASE WHEN [people].[age] = @p3 THEN 1 ELSE 0 END = 1 order by [people].[name] asc) as [people]`), - bindings: [5000, 1, "Test", 22], + THEN 1 ELSE 0 END = 1 and CASE WHEN [people].[age] = @p3 THEN 1 ELSE 0 END = 1 order by [people].[name] asc) as [people] + where CASE WHEN [people].[name] = @p4 THEN 1 ELSE 0 END = 1 and CASE WHEN [people].[age] = @p5 THEN 1 ELSE 0 END = 1`), + bindings: [5000, 1, "Test", 22, "Test", 22], }) }) }) From a5533bb033fffab296feb4cb18d962a3802f4b63 Mon Sep 17 00:00:00 2001 From: mike12345567 Date: Mon, 19 Aug 2024 16:49:40 +0100 Subject: [PATCH 150/180] Fixing test cases. --- packages/backend-core/src/sql/sql.ts | 2 ++ .../server/src/integrations/tests/sql.spec.ts | 21 ++++++++++--------- 2 files changed, 13 insertions(+), 10 deletions(-) diff --git a/packages/backend-core/src/sql/sql.ts b/packages/backend-core/src/sql/sql.ts index 69ad20505f..02c5e5519a 100644 --- a/packages/backend-core/src/sql/sql.ts +++ b/packages/backend-core/src/sql/sql.ts @@ -36,6 +36,7 @@ import { } from "@budibase/types" import environment from "../environment" import { dataFilters, helpers } from "@budibase/shared-core" +import { cloneDeep } from "lodash" type QueryFunction = (query: SqlQuery | SqlQuery[], operation: Operation) => any @@ -268,6 +269,7 @@ class InternalBuilder { } private parseFilters(filters: SearchFilters): SearchFilters { + filters = cloneDeep(filters) for (const op of Object.values(BasicOperator)) { const filter = filters[op] if (!filter) { diff --git a/packages/server/src/integrations/tests/sql.spec.ts b/packages/server/src/integrations/tests/sql.spec.ts index c4b2a69f7d..a6e63c434d 100644 --- a/packages/server/src/integrations/tests/sql.spec.ts +++ b/packages/server/src/integrations/tests/sql.spec.ts @@ -194,8 +194,8 @@ describe("SQL query builder", () => { }) ) expect(query).toEqual({ - bindings: ["john%", limit, 5000], - sql: `select * from (select * from (select * from (select * from "test" where LOWER("test"."name") LIKE :1 order by "test"."id" asc) where rownum <= :2) "test" order by "test"."id" asc) where rownum <= :3`, + bindings: ["john%", limit, "john%", 5000], + sql: `select * from (select * from (select * from (select * from "test" where LOWER("test"."name") LIKE :1 order by "test"."id" asc) where rownum <= :2) "test" where LOWER("test"."name") LIKE :3 order by "test"."id" asc) where rownum <= :4`, }) query = new Sql(SqlClient.ORACLE, limit)._query( @@ -208,9 +208,10 @@ describe("SQL query builder", () => { }, }) ) + const filterSet = [`%20%`, `%25%`, `%"john"%`, `%"mary"%`] expect(query).toEqual({ - bindings: ["%20%", "%25%", `%"john"%`, `%"mary"%`, limit, 5000], - sql: `select * from (select * from (select * from (select * from "test" where COALESCE(LOWER("test"."age"), '') LIKE :1 AND COALESCE(LOWER("test"."age"), '') LIKE :2 and COALESCE(LOWER("test"."name"), '') LIKE :3 AND COALESCE(LOWER("test"."name"), '') LIKE :4 order by "test"."id" asc) where rownum <= :5) "test" order by "test"."id" asc) where rownum <= :6`, + bindings: [...filterSet, limit, ...filterSet, 5000], + sql: `select * from (select * from (select * from (select * from "test" where COALESCE(LOWER("test"."age"), '') LIKE :1 AND COALESCE(LOWER("test"."age"), '') LIKE :2 and COALESCE(LOWER("test"."name"), '') LIKE :3 AND COALESCE(LOWER("test"."name"), '') LIKE :4 order by "test"."id" asc) where rownum <= :5) "test" where COALESCE(LOWER("test"."age"), '') LIKE :6 AND COALESCE(LOWER("test"."age"), '') LIKE :7 and COALESCE(LOWER("test"."name"), '') LIKE :8 AND COALESCE(LOWER("test"."name"), '') LIKE :9 order by "test"."id" asc) where rownum <= :10`, }) query = new Sql(SqlClient.ORACLE, limit)._query( @@ -223,8 +224,8 @@ describe("SQL query builder", () => { }) ) expect(query).toEqual({ - bindings: [`%jo%`, limit, 5000], - sql: `select * from (select * from (select * from (select * from "test" where LOWER("test"."name") LIKE :1 order by "test"."id" asc) where rownum <= :2) "test" order by "test"."id" asc) where rownum <= :3`, + bindings: [`%jo%`, limit, `%jo%`, 5000], + sql: `select * from (select * from (select * from (select * from "test" where LOWER("test"."name") LIKE :1 order by "test"."id" asc) where rownum <= :2) "test" where LOWER("test"."name") LIKE :3 order by "test"."id" asc) where rownum <= :4`, }) }) @@ -241,8 +242,8 @@ describe("SQL query builder", () => { ) expect(query).toEqual({ - bindings: ["John", limit, 5000], - sql: `select * from (select * from (select * from (select * from "test" where (to_char("test"."name") IS NOT NULL AND to_char("test"."name") = :1) order by "test"."id" asc) where rownum <= :2) "test" order by "test"."id" asc) where rownum <= :3`, + bindings: ["John", limit, "John", 5000], + sql: `select * from (select * from (select * from (select * from "test" where (to_char("test"."name") IS NOT NULL AND to_char("test"."name") = :1) order by "test"."id" asc) where rownum <= :2) "test" where (to_char("test"."name") IS NOT NULL AND to_char("test"."name") = :3) order by "test"."id" asc) where rownum <= :4`, }) }) @@ -259,8 +260,8 @@ describe("SQL query builder", () => { ) expect(query).toEqual({ - bindings: ["John", limit, 5000], - sql: `select * from (select * from (select * from (select * from "test" where (to_char("test"."name") IS NOT NULL AND to_char("test"."name") != :1) OR to_char("test"."name") IS NULL order by "test"."id" asc) where rownum <= :2) "test" order by "test"."id" asc) where rownum <= :3`, + bindings: ["John", limit, "John", 5000], + sql: `select * from (select * from (select * from (select * from "test" where (to_char("test"."name") IS NOT NULL AND to_char("test"."name") != :1) OR to_char("test"."name") IS NULL order by "test"."id" asc) where rownum <= :2) "test" where (to_char("test"."name") IS NOT NULL AND to_char("test"."name") != :3) OR to_char("test"."name") IS NULL order by "test"."id" asc) where rownum <= :4`, }) }) }) From bbcb77c738b4c7c82e94c8f7d4c52bc8d2c5af1d Mon Sep 17 00:00:00 2001 From: mike12345567 Date: Tue, 20 Aug 2024 07:38:23 +0100 Subject: [PATCH 151/180] Fixing an issue where searching on a relationship column which is in a broken state would break in SQS (previously this was allowed and would return empty relationships). --- .../src/api/controllers/row/utils/sqlUtils.ts | 9 ++++- .../server/src/sdk/app/rows/queryUtils.ts | 33 +++++++++++-------- .../src/sdk/app/rows/search/internal/sqs.ts | 2 +- 3 files changed, 29 insertions(+), 15 deletions(-) diff --git a/packages/server/src/api/controllers/row/utils/sqlUtils.ts b/packages/server/src/api/controllers/row/utils/sqlUtils.ts index 7beadabd89..a24ec17c26 100644 --- a/packages/server/src/api/controllers/row/utils/sqlUtils.ts +++ b/packages/server/src/api/controllers/row/utils/sqlUtils.ts @@ -151,7 +151,10 @@ export function buildExternalRelationships( return relationships } -export function buildInternalRelationships(table: Table): RelationshipsJson[] { +export function buildInternalRelationships( + table: Table, + allTables: Table[] +): RelationshipsJson[] { const relationships: RelationshipsJson[] = [] const links = Object.values(table.schema).filter( column => column.type === FieldType.LINK @@ -164,6 +167,10 @@ export function buildInternalRelationships(table: Table): RelationshipsJson[] { const linkTableId = link.tableId! const junctionTableId = generateJunctionTableID(tableId, linkTableId) const isFirstTable = tableId > linkTableId + // skip relationships with missing table definitions + if (!allTables.find(table => table._id === linkTableId)) { + continue + } relationships.push({ through: junctionTableId, column: link.name, diff --git a/packages/server/src/sdk/app/rows/queryUtils.ts b/packages/server/src/sdk/app/rows/queryUtils.ts index b033c6dd17..a5e78b2fb9 100644 --- a/packages/server/src/sdk/app/rows/queryUtils.ts +++ b/packages/server/src/sdk/app/rows/queryUtils.ts @@ -71,20 +71,27 @@ export const getQueryableFields = async ( // avoid circular loops continue } - const relatedTable = await sdk.tables.getTable(subSchema.tableId) - const relatedFields = await extractTableFields( - relatedTable, - Object.keys(relatedTable.schema), - [...fromTables, subSchema.tableId] - ) + try { + const relatedTable = await sdk.tables.getTable(subSchema.tableId) + const relatedFields = await extractTableFields( + relatedTable, + Object.keys(relatedTable.schema), + [...fromTables, subSchema.tableId] + ) - result.push( - ...relatedFields.flatMap(f => [ - `${subSchema.name}.${f}`, - // should be able to filter by relationship using table name - `${relatedTable.name}.${f}`, - ]) - ) + result.push( + ...relatedFields.flatMap(f => [ + `${subSchema.name}.${f}`, + // should be able to filter by relationship using table name + `${relatedTable.name}.${f}`, + ]) + ) + } catch (err: any) { + // if related table is removed, ignore + if (err.status !== 404) { + throw err + } + } } else { result.push(field) } diff --git a/packages/server/src/sdk/app/rows/search/internal/sqs.ts b/packages/server/src/sdk/app/rows/search/internal/sqs.ts index 4bfa8f8fa5..6736ff6abf 100644 --- a/packages/server/src/sdk/app/rows/search/internal/sqs.ts +++ b/packages/server/src/sdk/app/rows/search/internal/sqs.ts @@ -297,7 +297,7 @@ export async function search( throw new Error("Unable to find table") } - const relationships = buildInternalRelationships(table) + const relationships = buildInternalRelationships(table, allTables) const searchFilters: SearchFilters = { ...cleanupFilters(query, table, allTables), From 760be9d6af8d24ef0e5a6854e53a9c3d566b0cc1 Mon Sep 17 00:00:00 2001 From: Budibase Staging Release Bot <> Date: Tue, 20 Aug 2024 06:50:05 +0000 Subject: [PATCH 152/180] Bump version to 2.30.7 --- lerna.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lerna.json b/lerna.json index 593ea0d716..d4ea1cc162 100644 --- a/lerna.json +++ b/lerna.json @@ -1,6 +1,6 @@ { "$schema": "node_modules/lerna/schemas/lerna-schema.json", - "version": "2.30.6", + "version": "2.30.7", "npmClient": "yarn", "packages": [ "packages/*", From 9385bc878b2b463b61f24e95117e375df8e75e8e Mon Sep 17 00:00:00 2001 From: Andrew Kingston Date: Tue, 20 Aug 2024 10:34:29 +0100 Subject: [PATCH 153/180] Bump submodules which are somehow out of date and failing CI --- packages/account-portal | 2 +- packages/pro | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/account-portal b/packages/account-portal index 32b8fa4643..516b27b74c 160000 --- a/packages/account-portal +++ b/packages/account-portal @@ -1 +1 @@ -Subproject commit 32b8fa4643b4f0f74ee89760deffe431ab347ad9 +Subproject commit 516b27b74cbcb7069a25f5e738dc91c22d7c4538 diff --git a/packages/pro b/packages/pro index 94747fd5bb..14c89a5b20 160000 --- a/packages/pro +++ b/packages/pro @@ -1 +1 @@ -Subproject commit 94747fd5bb67c218244bb60b9540f3a6f1c3f6f1 +Subproject commit 14c89a5b20ee4de07723063458a2437b0dd4f2c9 From 5435028e7daff6844988d1a1cb51b4968e35776f Mon Sep 17 00:00:00 2001 From: mike12345567 Date: Tue, 20 Aug 2024 12:13:37 +0100 Subject: [PATCH 154/180] Fix for cyclic relationships, getQueryableFields allowed relationships from other tables, which can't work. --- packages/server/src/sdk/app/rows/queryUtils.ts | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/packages/server/src/sdk/app/rows/queryUtils.ts b/packages/server/src/sdk/app/rows/queryUtils.ts index a5e78b2fb9..78cf64e184 100644 --- a/packages/server/src/sdk/app/rows/queryUtils.ts +++ b/packages/server/src/sdk/app/rows/queryUtils.ts @@ -59,14 +59,15 @@ export const getQueryableFields = async ( const extractTableFields = async ( table: Table, allowedFields: string[], - fromTables: string[] + fromTables: string[], + opts: { allowRelationships?: boolean } = { allowRelationships: true } ): Promise => { const result = [] for (const field of Object.keys(table.schema).filter( f => allowedFields.includes(f) && table.schema[f].visible !== false )) { const subSchema = table.schema[field] - if (subSchema.type === FieldType.LINK) { + if (opts.allowRelationships && subSchema.type === FieldType.LINK) { if (fromTables.includes(subSchema.tableId)) { // avoid circular loops continue @@ -76,7 +77,9 @@ export const getQueryableFields = async ( const relatedFields = await extractTableFields( relatedTable, Object.keys(relatedTable.schema), - [...fromTables, subSchema.tableId] + [...fromTables, subSchema.tableId], + // don't let it recurse back and forth between relationships + { allowRelationships: false } ) result.push( From 0d389bd8d79fcbde5f79c8fc3bb05e711e9f2b0e Mon Sep 17 00:00:00 2001 From: mike12345567 Date: Tue, 20 Aug 2024 12:31:46 +0100 Subject: [PATCH 155/180] Quick set of fixes, test cases assumed that multi-depth relationships were allowed, fixing this. --- .../server/src/sdk/app/rows/queryUtils.ts | 28 ++++--- .../src/sdk/app/rows/tests/queryUtils.spec.ts | 74 ++----------------- 2 files changed, 24 insertions(+), 78 deletions(-) diff --git a/packages/server/src/sdk/app/rows/queryUtils.ts b/packages/server/src/sdk/app/rows/queryUtils.ts index 78cf64e184..65f400a1d9 100644 --- a/packages/server/src/sdk/app/rows/queryUtils.ts +++ b/packages/server/src/sdk/app/rows/queryUtils.ts @@ -16,32 +16,32 @@ export const removeInvalidFilters = ( validFields = validFields.map(f => f.toLowerCase()) for (const filterKey of Object.keys(result) as (keyof SearchFilters)[]) { - if (typeof result[filterKey] !== "object") { + const filter = result[filterKey] + if (!filter || typeof filter !== "object") { continue } if (isLogicalSearchOperator(filterKey)) { const resultingConditions: SearchFilters[] = [] - for (const condition of result[filterKey].conditions) { + for (const condition of filter.conditions) { const resultingCondition = removeInvalidFilters(condition, validFields) if (Object.keys(resultingCondition).length) { resultingConditions.push(resultingCondition) } } if (resultingConditions.length) { - result[filterKey].conditions = resultingConditions + filter.conditions = resultingConditions } else { delete result[filterKey] } continue } - const filter = result[filterKey] for (const columnKey of Object.keys(filter)) { const possibleKeys = [columnKey, db.removeKeyNumbering(columnKey)].map( c => c.toLowerCase() ) if (!validFields.some(f => possibleKeys.includes(f.toLowerCase()))) { - delete filter[columnKey] + delete filter[columnKey as keyof typeof filter] } } if (!Object.keys(filter).length) { @@ -60,18 +60,22 @@ export const getQueryableFields = async ( table: Table, allowedFields: string[], fromTables: string[], - opts: { allowRelationships?: boolean } = { allowRelationships: true } + opts?: { noRelationships?: boolean } ): Promise => { const result = [] for (const field of Object.keys(table.schema).filter( f => allowedFields.includes(f) && table.schema[f].visible !== false )) { const subSchema = table.schema[field] - if (opts.allowRelationships && subSchema.type === FieldType.LINK) { - if (fromTables.includes(subSchema.tableId)) { - // avoid circular loops - continue - } + const isRelationship = subSchema.type === FieldType.LINK + // avoid relationship loops + if ( + isRelationship && + (opts?.noRelationships || fromTables.includes(subSchema.tableId)) + ) { + continue + } + if (isRelationship) { try { const relatedTable = await sdk.tables.getTable(subSchema.tableId) const relatedFields = await extractTableFields( @@ -79,7 +83,7 @@ export const getQueryableFields = async ( Object.keys(relatedTable.schema), [...fromTables, subSchema.tableId], // don't let it recurse back and forth between relationships - { allowRelationships: false } + { noRelationships: true } ) result.push( diff --git a/packages/server/src/sdk/app/rows/tests/queryUtils.spec.ts b/packages/server/src/sdk/app/rows/tests/queryUtils.spec.ts index c156b2d5ba..aabc359484 100644 --- a/packages/server/src/sdk/app/rows/tests/queryUtils.spec.ts +++ b/packages/server/src/sdk/app/rows/tests/queryUtils.spec.ts @@ -386,35 +386,13 @@ describe("query utils", () => { expect(result).toEqual([ "_id", "name", - // deep 1 aux1 primitive props + // aux1 primitive props "aux1.name", "aux1Table.name", - // deep 2 aux1 primitive props - "aux1.aux2_1.title", - "aux1Table.aux2_1.title", - "aux1.aux2Table.title", - "aux1Table.aux2Table.title", - - // deep 2 aux2 primitive props - "aux1.aux2_2.title", - "aux1Table.aux2_2.title", - "aux1.aux2Table.title", - "aux1Table.aux2Table.title", - - // deep 1 aux2 primitive props + // aux2 primitive props "aux2.title", "aux2Table.title", - - // deep 2 aux2 primitive props - "aux2.aux1_1.name", - "aux2Table.aux1_1.name", - "aux2.aux1Table.name", - "aux2Table.aux1Table.name", - "aux2.aux1_2.name", - "aux2Table.aux1_2.name", - "aux2.aux1Table.name", - "aux2Table.aux1Table.name", ]) }) @@ -426,35 +404,17 @@ describe("query utils", () => { "_id", "name", - // deep 1 aux2_1 primitive props + // aux2_1 primitive props "aux2_1.title", "aux2Table.title", - // deep 2 aux2_1 primitive props - "aux2_1.table.name", - "aux2Table.table.name", - "aux2_1.TestTable.name", - "aux2Table.TestTable.name", - - // deep 1 aux2_2 primitive props + // aux2_2 primitive props "aux2_2.title", "aux2Table.title", - // deep 2 aux2_2 primitive props - "aux2_2.table.name", - "aux2Table.table.name", - "aux2_2.TestTable.name", - "aux2Table.TestTable.name", - - // deep 1 table primitive props + // table primitive props "table.name", "TestTable.name", - - // deep 2 table primitive props - "table.aux2.title", - "TestTable.aux2.title", - "table.aux2Table.title", - "TestTable.aux2Table.title", ]) }) @@ -466,35 +426,17 @@ describe("query utils", () => { "_id", "title", - // deep 1 aux1_1 primitive props + // aux1_1 primitive props "aux1_1.name", "aux1Table.name", - // deep 2 aux1_1 primitive props - "aux1_1.table.name", - "aux1Table.table.name", - "aux1_1.TestTable.name", - "aux1Table.TestTable.name", - - // deep 1 aux1_2 primitive props + // aux1_2 primitive props "aux1_2.name", "aux1Table.name", - // deep 2 aux1_2 primitive props - "aux1_2.table.name", - "aux1Table.table.name", - "aux1_2.TestTable.name", - "aux1Table.TestTable.name", - - // deep 1 table primitive props + // table primitive props "table.name", "TestTable.name", - - // deep 2 table primitive props - "table.aux1.name", - "TestTable.aux1.name", - "table.aux1Table.name", - "TestTable.aux1Table.name", ]) }) }) From f2beedbee6d9c4eb1997820e68db10a7b0fba95f Mon Sep 17 00:00:00 2001 From: mike12345567 Date: Tue, 20 Aug 2024 13:14:24 +0100 Subject: [PATCH 156/180] Adding a test case for primary display columns, ignore when it has been set to a relationship, instead use another column which is valid in the table. --- .../src/api/routes/tests/search.spec.ts | 64 +++++++++++++++++-- packages/server/src/db/linkedRows/index.ts | 55 +++++++++++++--- 2 files changed, 102 insertions(+), 17 deletions(-) diff --git a/packages/server/src/api/routes/tests/search.spec.ts b/packages/server/src/api/routes/tests/search.spec.ts index 9de97747e5..3607fbf329 100644 --- a/packages/server/src/api/routes/tests/search.spec.ts +++ b/packages/server/src/api/routes/tests/search.spec.ts @@ -44,14 +44,14 @@ import { DEFAULT_EMPLOYEE_TABLE_SCHEMA } from "../../../db/defaultData/datasourc import { generateRowIdField } from "../../../integrations/utils" describe.each([ - ["in-memory", undefined], - ["lucene", undefined], + // ["in-memory", undefined], + // ["lucene", undefined], ["sqs", undefined], - [DatabaseName.POSTGRES, getDatasource(DatabaseName.POSTGRES)], - [DatabaseName.MYSQL, getDatasource(DatabaseName.MYSQL)], - [DatabaseName.SQL_SERVER, getDatasource(DatabaseName.SQL_SERVER)], - [DatabaseName.MARIADB, getDatasource(DatabaseName.MARIADB)], - [DatabaseName.ORACLE, getDatasource(DatabaseName.ORACLE)], + // [DatabaseName.POSTGRES, getDatasource(DatabaseName.POSTGRES)], + // [DatabaseName.MYSQL, getDatasource(DatabaseName.MYSQL)], + // [DatabaseName.SQL_SERVER, getDatasource(DatabaseName.SQL_SERVER)], + // [DatabaseName.MARIADB, getDatasource(DatabaseName.MARIADB)], + // [DatabaseName.ORACLE, getDatasource(DatabaseName.ORACLE)], ])("search (%s)", (name, dsProvider) => { const isSqs = name === "sqs" const isLucene = name === "lucene" @@ -2762,6 +2762,56 @@ describe.each([ }) }) + describe("primaryDisplay", () => { + beforeAll(async () => { + let toRelateTable = await createTable({ + name: { + name: "name", + type: FieldType.STRING, + }, + }) + table = await config.api.table.save( + tableForDatasource(datasource, { + schema: { + name: { + name: "name", + type: FieldType.STRING, + }, + link: { + name: "link", + type: FieldType.LINK, + relationshipType: RelationshipType.MANY_TO_ONE, + tableId: toRelateTable._id!, + fieldName: "link", + }, + }, + }) + ) + toRelateTable = await config.api.table.get(toRelateTable._id!) + await config.api.table.save({ + ...toRelateTable, + primaryDisplay: "link", + }) + const relatedRows = await Promise.all([ + config.api.row.save(toRelateTable._id!, { name: "test" }), + ]) + await Promise.all([ + config.api.row.save(table._id!, { + name: "test", + link: relatedRows.map(row => row._id), + }), + ]) + }) + + it("should be able to query, primary display on related table shouldn't be used", async () => { + // this test makes sure that if a relationship has been specified as the primary display on a table + // it is ignored and another column is used instead + await expectQuery({}).toContain([ + { name: "test", link: [{ primaryDisplay: "test" }] }, + ]) + }) + }) + !isLucene && describe("$and", () => { beforeAll(async () => { diff --git a/packages/server/src/db/linkedRows/index.ts b/packages/server/src/db/linkedRows/index.ts index 87f980600a..1b3fd4f809 100644 --- a/packages/server/src/db/linkedRows/index.ts +++ b/packages/server/src/db/linkedRows/index.ts @@ -1,10 +1,10 @@ import LinkController from "./LinkController" import { getLinkDocuments, - getUniqueByProp, - getRelatedTableForField, - getLinkedTableIDs, getLinkedTable, + getLinkedTableIDs, + getRelatedTableForField, + getUniqueByProp, } from "./linkUtils" import flatten from "lodash/flatten" import { USER_METDATA_PREFIX } from "../utils" @@ -13,16 +13,25 @@ import { getGlobalUsersFromMetadata } from "../../utilities/global" import { processFormulas } from "../../utilities/rowProcessor" import { context } from "@budibase/backend-core" import { - Table, - Row, - LinkDocumentValue, - FieldType, ContextUser, + FieldType, + LinkDocumentValue, + Row, + Table, } from "@budibase/types" import sdk from "../../sdk" export { IncludeDocs, getLinkDocuments, createLinkView } from "./linkUtils" +const INVALID_DISPLAY_COLUMN_TYPE = [ + FieldType.LINK, + FieldType.ATTACHMENTS, + FieldType.ATTACHMENT_SINGLE, + FieldType.SIGNATURE_SINGLE, + FieldType.BB_REFERENCE, + FieldType.BB_REFERENCE_SINGLE, +] + /** * This functionality makes sure that when rows with links are created, updated or deleted they are processed * correctly - making sure that no stale links are left around and that all links have been made successfully. @@ -206,6 +215,34 @@ export async function attachFullLinkedDocs( return rows } +/** + * Finds a valid value for the primary display, avoiding columns which break things + * like relationships (can be circular). + * @param row The row to lift a value from for the primary display. + * @param table The related table to attempt to work out the primary display column from. + */ +function getPrimaryDisplayValue(row: Row, table?: Table) { + const primaryDisplay = table?.primaryDisplay + let invalid = true + if (primaryDisplay) { + const primaryDisplaySchema = table?.schema[primaryDisplay] + invalid = + INVALID_DISPLAY_COLUMN_TYPE.includes(primaryDisplaySchema.type) && + row[primaryDisplay] + } + if (invalid || !primaryDisplay) { + const validKey = Object.keys(table?.schema || {}).filter( + key => + table?.schema[key].type && + !INVALID_DISPLAY_COLUMN_TYPE.includes(table?.schema[key].type) && + row[key] + ) + return validKey[0] ? row[validKey[0]] : undefined + } else { + return row[primaryDisplay] + } +} + /** * This function will take the given enriched rows and squash the links to only contain the primary display field. * @param table The table from which the rows originated. @@ -232,9 +269,7 @@ export async function squashLinksToPrimaryDisplay( const linkTblId = link.tableId || getRelatedTableForField(table, column) const linkedTable = await getLinkedTable(linkTblId!, linkedTables) const obj: any = { _id: link._id } - if (linkedTable?.primaryDisplay && link[linkedTable.primaryDisplay]) { - obj.primaryDisplay = link[linkedTable.primaryDisplay] - } + obj.primaryDisplay = getPrimaryDisplayValue(link, linkedTable) newLinks.push(obj) } row[column] = newLinks From aab120b9ca3c73da1a089a0d67e7ad54037f1a1e Mon Sep 17 00:00:00 2001 From: mike12345567 Date: Tue, 20 Aug 2024 13:18:40 +0100 Subject: [PATCH 157/180] Bringing back test cases. --- .../server/src/api/routes/tests/search.spec.ts | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/packages/server/src/api/routes/tests/search.spec.ts b/packages/server/src/api/routes/tests/search.spec.ts index 3607fbf329..be7b29bb86 100644 --- a/packages/server/src/api/routes/tests/search.spec.ts +++ b/packages/server/src/api/routes/tests/search.spec.ts @@ -44,14 +44,14 @@ import { DEFAULT_EMPLOYEE_TABLE_SCHEMA } from "../../../db/defaultData/datasourc import { generateRowIdField } from "../../../integrations/utils" describe.each([ - // ["in-memory", undefined], - // ["lucene", undefined], + ["in-memory", undefined], + ["lucene", undefined], ["sqs", undefined], - // [DatabaseName.POSTGRES, getDatasource(DatabaseName.POSTGRES)], - // [DatabaseName.MYSQL, getDatasource(DatabaseName.MYSQL)], - // [DatabaseName.SQL_SERVER, getDatasource(DatabaseName.SQL_SERVER)], - // [DatabaseName.MARIADB, getDatasource(DatabaseName.MARIADB)], - // [DatabaseName.ORACLE, getDatasource(DatabaseName.ORACLE)], + [DatabaseName.POSTGRES, getDatasource(DatabaseName.POSTGRES)], + [DatabaseName.MYSQL, getDatasource(DatabaseName.MYSQL)], + [DatabaseName.SQL_SERVER, getDatasource(DatabaseName.SQL_SERVER)], + [DatabaseName.MARIADB, getDatasource(DatabaseName.MARIADB)], + [DatabaseName.ORACLE, getDatasource(DatabaseName.ORACLE)], ])("search (%s)", (name, dsProvider) => { const isSqs = name === "sqs" const isLucene = name === "lucene" From 8847a5b1461ac93436d02a8a58001f42e15a3582 Mon Sep 17 00:00:00 2001 From: mike12345567 Date: Tue, 20 Aug 2024 13:19:58 +0100 Subject: [PATCH 158/180] Disabling for old/in-memory search. --- .../src/api/routes/tests/search.spec.ts | 89 ++++++++++--------- 1 file changed, 45 insertions(+), 44 deletions(-) diff --git a/packages/server/src/api/routes/tests/search.spec.ts b/packages/server/src/api/routes/tests/search.spec.ts index be7b29bb86..bac9b6f774 100644 --- a/packages/server/src/api/routes/tests/search.spec.ts +++ b/packages/server/src/api/routes/tests/search.spec.ts @@ -2762,55 +2762,56 @@ describe.each([ }) }) - describe("primaryDisplay", () => { - beforeAll(async () => { - let toRelateTable = await createTable({ - name: { - name: "name", - type: FieldType.STRING, - }, - }) - table = await config.api.table.save( - tableForDatasource(datasource, { - schema: { - name: { - name: "name", - type: FieldType.STRING, - }, - link: { - name: "link", - type: FieldType.LINK, - relationshipType: RelationshipType.MANY_TO_ONE, - tableId: toRelateTable._id!, - fieldName: "link", - }, + isSql && + describe("primaryDisplay", () => { + beforeAll(async () => { + let toRelateTable = await createTable({ + name: { + name: "name", + type: FieldType.STRING, }, }) - ) - toRelateTable = await config.api.table.get(toRelateTable._id!) - await config.api.table.save({ - ...toRelateTable, - primaryDisplay: "link", + table = await config.api.table.save( + tableForDatasource(datasource, { + schema: { + name: { + name: "name", + type: FieldType.STRING, + }, + link: { + name: "link", + type: FieldType.LINK, + relationshipType: RelationshipType.MANY_TO_ONE, + tableId: toRelateTable._id!, + fieldName: "link", + }, + }, + }) + ) + toRelateTable = await config.api.table.get(toRelateTable._id!) + await config.api.table.save({ + ...toRelateTable, + primaryDisplay: "link", + }) + const relatedRows = await Promise.all([ + config.api.row.save(toRelateTable._id!, { name: "test" }), + ]) + await Promise.all([ + config.api.row.save(table._id!, { + name: "test", + link: relatedRows.map(row => row._id), + }), + ]) }) - const relatedRows = await Promise.all([ - config.api.row.save(toRelateTable._id!, { name: "test" }), - ]) - await Promise.all([ - config.api.row.save(table._id!, { - name: "test", - link: relatedRows.map(row => row._id), - }), - ]) - }) - it("should be able to query, primary display on related table shouldn't be used", async () => { - // this test makes sure that if a relationship has been specified as the primary display on a table - // it is ignored and another column is used instead - await expectQuery({}).toContain([ - { name: "test", link: [{ primaryDisplay: "test" }] }, - ]) + it("should be able to query, primary display on related table shouldn't be used", async () => { + // this test makes sure that if a relationship has been specified as the primary display on a table + // it is ignored and another column is used instead + await expectQuery({}).toContain([ + { name: "test", link: [{ primaryDisplay: "test" }] }, + ]) + }) }) - }) !isLucene && describe("$and", () => { From e941491d8ce9019128ddf291978885c192de0aac Mon Sep 17 00:00:00 2001 From: mike12345567 Date: Tue, 20 Aug 2024 13:24:41 +0100 Subject: [PATCH 159/180] Don't check row value - always use the column or not. --- packages/server/src/db/linkedRows/index.ts | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/packages/server/src/db/linkedRows/index.ts b/packages/server/src/db/linkedRows/index.ts index 1b3fd4f809..037e53d02f 100644 --- a/packages/server/src/db/linkedRows/index.ts +++ b/packages/server/src/db/linkedRows/index.ts @@ -226,16 +226,13 @@ function getPrimaryDisplayValue(row: Row, table?: Table) { let invalid = true if (primaryDisplay) { const primaryDisplaySchema = table?.schema[primaryDisplay] - invalid = - INVALID_DISPLAY_COLUMN_TYPE.includes(primaryDisplaySchema.type) && - row[primaryDisplay] + invalid = INVALID_DISPLAY_COLUMN_TYPE.includes(primaryDisplaySchema.type) } if (invalid || !primaryDisplay) { const validKey = Object.keys(table?.schema || {}).filter( key => table?.schema[key].type && - !INVALID_DISPLAY_COLUMN_TYPE.includes(table?.schema[key].type) && - row[key] + !INVALID_DISPLAY_COLUMN_TYPE.includes(table?.schema[key].type) ) return validKey[0] ? row[validKey[0]] : undefined } else { From ff855a677a98aeabd5df955eb156e9fd12836358 Mon Sep 17 00:00:00 2001 From: mike12345567 Date: Tue, 20 Aug 2024 13:27:20 +0100 Subject: [PATCH 160/180] PR comments. --- packages/server/src/db/linkedRows/index.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/server/src/db/linkedRows/index.ts b/packages/server/src/db/linkedRows/index.ts index 037e53d02f..2da7e212b9 100644 --- a/packages/server/src/db/linkedRows/index.ts +++ b/packages/server/src/db/linkedRows/index.ts @@ -229,12 +229,12 @@ function getPrimaryDisplayValue(row: Row, table?: Table) { invalid = INVALID_DISPLAY_COLUMN_TYPE.includes(primaryDisplaySchema.type) } if (invalid || !primaryDisplay) { - const validKey = Object.keys(table?.schema || {}).filter( + const validKey = Object.keys(table?.schema || {}).find( key => table?.schema[key].type && !INVALID_DISPLAY_COLUMN_TYPE.includes(table?.schema[key].type) ) - return validKey[0] ? row[validKey[0]] : undefined + return validKey ? row[validKey] : undefined } else { return row[primaryDisplay] } From ae49b0309dd65997bdbd25879d57371338b45157 Mon Sep 17 00:00:00 2001 From: Budibase Staging Release Bot <> Date: Tue, 20 Aug 2024 12:37:48 +0000 Subject: [PATCH 161/180] Bump version to 2.30.8 --- lerna.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lerna.json b/lerna.json index d4ea1cc162..35ba5cedb1 100644 --- a/lerna.json +++ b/lerna.json @@ -1,6 +1,6 @@ { "$schema": "node_modules/lerna/schemas/lerna-schema.json", - "version": "2.30.7", + "version": "2.30.8", "npmClient": "yarn", "packages": [ "packages/*", From 7e5f43dd6d9ae805dd95f595e5b119f77ab405d8 Mon Sep 17 00:00:00 2001 From: Andrew Kingston Date: Tue, 20 Aug 2024 14:58:07 +0100 Subject: [PATCH 162/180] Update table autoscreens to use grid layout --- packages/builder/src/templates/Component.js | 24 ++++++++ .../screenTemplating/table/inline.js | 5 ++ .../templates/screenTemplating/table/modal.js | 26 ++++----- .../screenTemplating/table/newScreen.js | 57 ++++++++++++------- .../screenTemplating/table/sidePanel.js | 27 +++++---- 5 files changed, 90 insertions(+), 49 deletions(-) diff --git a/packages/builder/src/templates/Component.js b/packages/builder/src/templates/Component.js index ccd075161f..8f70cbe92b 100644 --- a/packages/builder/src/templates/Component.js +++ b/packages/builder/src/templates/Component.js @@ -54,4 +54,28 @@ export class Component extends BaseStructure { getId() { return this._json._id } + + gridDesktopColSpan(start, end) { + this._json._styles.normal["--grid-desktop-col-start"] = start + this._json._styles.normal["--grid-desktop-col-end"] = end + return this + } + + gridDesktopRowSpan(start, end) { + this._json._styles.normal["--grid-desktop-row-start"] = start + this._json._styles.normal["--grid-desktop-row-end"] = end + return this + } + + gridMobileColSpan(start, end) { + this._json._styles.normal["--grid-mobile-col-start"] = start + this._json._styles.normal["--grid-mobile-col-end"] = end + return this + } + + gridMobileRowSpan(start, end) { + this._json._styles.normal["--grid-mobile-row-start"] = start + this._json._styles.normal["--grid-mobile-row-end"] = end + return this + } } diff --git a/packages/builder/src/templates/screenTemplating/table/inline.js b/packages/builder/src/templates/screenTemplating/table/inline.js index a11409c5c3..d218aa998a 100644 --- a/packages/builder/src/templates/screenTemplating/table/inline.js +++ b/packages/builder/src/templates/screenTemplating/table/inline.js @@ -9,16 +9,21 @@ const inline = ({ tableOrView, permissions, screens }) => { .customProps({ text: tableOrView.name, }) + .gridDesktopColSpan(1, 13) + .gridDesktopRowSpan(1, 3) const tableBlock = new Component("@budibase/standard-components/gridblock") .instanceName(`${tableOrView.name} - Table`) .customProps({ table: tableOrView.datasourceSelectFormat, }) + .gridDesktopColSpan(1, 13) + .gridDesktopRowSpan(3, 21) const screenTemplate = new Screen() .route(getValidRoute(screens, tableOrView.name, permissions.write)) .instanceName(`${tableOrView.name} - List`) + .customProps({ layout: "grid" }) .role(permissions.write) .autoTableId(tableOrView.id) .addChild(heading) diff --git a/packages/builder/src/templates/screenTemplating/table/modal.js b/packages/builder/src/templates/screenTemplating/table/modal.js index 078bb646fa..0dede08711 100644 --- a/packages/builder/src/templates/screenTemplating/table/modal.js +++ b/packages/builder/src/templates/screenTemplating/table/modal.js @@ -33,26 +33,22 @@ const modal = ({ tableOrView, permissions, screens }) => { type: "cta", }) - buttonGroup.instanceName(`${tableOrView.name} - Create`).customProps({ - hAlign: "right", - buttons: [createButton.json()], - }) - - const tableHeader = new Component("@budibase/standard-components/container") - .instanceName("Heading container") + buttonGroup + .instanceName(`${tableOrView.name} - Create`) .customProps({ - direction: "row", - hAlign: "stretch", + hAlign: "right", + buttons: [createButton.json()], }) + .gridDesktopColSpan(7, 13) + .gridDesktopRowSpan(1, 3) const heading = new Component("@budibase/standard-components/heading") .instanceName("Table heading") .customProps({ text: tableOrView.name, }) - - tableHeader.addChild(heading) - tableHeader.addChild(buttonGroup) + .gridDesktopColSpan(1, 7) + .gridDesktopRowSpan(1, 3) const createFormBlock = new Component( "@budibase/standard-components/formblock" @@ -134,13 +130,17 @@ const modal = ({ tableOrView, permissions, screens }) => { ], }) .instanceName(`${tableOrView.name} - Table`) + .gridDesktopColSpan(1, 13) + .gridDesktopRowSpan(3, 21) const template = new Screen() .route(getValidRoute(screens, tableOrView.name, permissions.write)) .instanceName(`${tableOrView.name} - List and details`) + .customProps({ layout: "grid" }) .role(permissions.write) .autoTableId(tableOrView.id) - .addChild(tableHeader) + .addChild(buttonGroup) + .addChild(heading) .addChild(tableBlock) .addChild(createRowModal) .addChild(detailsModal) diff --git a/packages/builder/src/templates/screenTemplating/table/newScreen.js b/packages/builder/src/templates/screenTemplating/table/newScreen.js index 4774d8e54c..956a325133 100644 --- a/packages/builder/src/templates/screenTemplating/table/newScreen.js +++ b/packages/builder/src/templates/screenTemplating/table/newScreen.js @@ -4,6 +4,7 @@ import { capitalise } from "helpers" import { makePropSafe as safe } from "@budibase/string-templates" import getValidRoute from "../getValidRoute" import { Helpers } from "@budibase/bbui" +import { head } from "lodash" const getTableScreenTemplate = ({ route, @@ -11,36 +12,41 @@ const getTableScreenTemplate = ({ createScreenRoute, tableOrView, permissions, + gridLayout, }) => { - const newButton = new Component("@budibase/standard-components/button") - .instanceName("New button") - .customProps({ - text: "Create row", - onClick: [ - { - "##eventHandlerType": "Navigate To", - parameters: { - type: "url", - url: createScreenRoute, - }, + const buttonGroup = new Component("@budibase/standard-components/buttongroup") + const createButton = new Component("@budibase/standard-components/button") + + createButton.customProps({ + onClick: [ + { + "##eventHandlerType": "Navigate To", + parameters: { + type: "url", + url: createScreenRoute, }, - ], + }, + ], + text: "Create row", + type: "cta", + }) + + buttonGroup + .instanceName(`${tableOrView.name} - Create`) + .customProps({ + hAlign: "right", + buttons: [createButton.json()], }) + .gridDesktopColSpan(7, 13) + .gridDesktopRowSpan(1, 3) const heading = new Component("@budibase/standard-components/heading") .instanceName("Table heading") .customProps({ text: tableOrView.name, }) - - const tableHeader = new Component("@budibase/standard-components/container") - .instanceName("Heading container") - .customProps({ - direction: "row", - hAlign: "stretch", - }) - .addChild(heading) - .addChild(newButton) + .gridDesktopColSpan(1, 7) + .gridDesktopRowSpan(1, 3) const updateScreenRouteSegments = updateScreenRoute.split(":id") if (updateScreenRouteSegments.length !== 2) { @@ -67,14 +73,18 @@ const getTableScreenTemplate = ({ }, ], }) + .gridDesktopColSpan(1, 13) + .gridDesktopRowSpan(3, 21) const template = new Screen() .route(route) .instanceName(`${tableOrView.name} - List`) + .customProps({ layout: gridLayout ? "grid" : "flex" }) .role(permissions.write) .autoTableId(tableOrView.id) - .addChild(tableHeader) .addChild(tableBlock) + .addChild(heading) + .addChild(buttonGroup) .json() return { @@ -300,6 +310,7 @@ const newScreen = ({ tableOrView, permissions, screens }) => { createScreenRoute, permissions, tableOrView, + gridLayout: true, }) const updateScreenTemplate = getUpdateScreenTemplate({ @@ -307,6 +318,7 @@ const newScreen = ({ tableOrView, permissions, screens }) => { tableScreenRoute, tableOrView, permissions, + gridLayout: false, }) const createScreenTemplate = getCreateScreenTemplate({ @@ -314,6 +326,7 @@ const newScreen = ({ tableOrView, permissions, screens }) => { tableScreenRoute, tableOrView, permissions, + gridLayout: false, }) return [tableScreenTemplate, updateScreenTemplate, createScreenTemplate] diff --git a/packages/builder/src/templates/screenTemplating/table/sidePanel.js b/packages/builder/src/templates/screenTemplating/table/sidePanel.js index 61b69117ce..ef88597733 100644 --- a/packages/builder/src/templates/screenTemplating/table/sidePanel.js +++ b/packages/builder/src/templates/screenTemplating/table/sidePanel.js @@ -31,27 +31,22 @@ const sidePanel = ({ tableOrView, permissions, screens }) => { type: "cta", }) - buttonGroup.instanceName(`${tableOrView.name} - Create`).customProps({ - hAlign: "right", - buttons: [createButton.json()], - }) - - const tableHeader = new Component("@budibase/standard-components/container") - .instanceName("Heading container") + buttonGroup + .instanceName(`${tableOrView.name} - Create`) .customProps({ - layout: "flex", - direction: "row", - hAlign: "stretch", + hAlign: "right", + buttons: [createButton.json()], }) + .gridDesktopColSpan(7, 13) + .gridDesktopRowSpan(1, 3) const heading = new Component("@budibase/standard-components/heading") .instanceName("Table heading") .customProps({ text: tableOrView.name, }) - - tableHeader.addChild(heading) - tableHeader.addChild(buttonGroup) + .gridDesktopColSpan(1, 7) + .gridDesktopRowSpan(1, 3) const createFormBlock = new Component( "@budibase/standard-components/formblock" @@ -131,13 +126,17 @@ const sidePanel = ({ tableOrView, permissions, screens }) => { ], }) .instanceName(`${tableOrView.name} - Table`) + .gridDesktopColSpan(1, 13) + .gridDesktopRowSpan(3, 21) const template = new Screen() .route(getValidRoute(screens, tableOrView.name, permissions.write)) .instanceName(`${tableOrView.name} - List and details`) + .customProps({ layout: "grid" }) .role(permissions.write) .autoTableId(tableOrView.id) - .addChild(tableHeader) + .addChild(heading) + .addChild(buttonGroup) .addChild(tableBlock) .addChild(createRowSidePanel) .addChild(detailsSidePanel) From 2d45f192f62f1b371f1667f4841206bc48c553a9 Mon Sep 17 00:00:00 2001 From: Andrew Kingston Date: Tue, 20 Aug 2024 15:07:23 +0100 Subject: [PATCH 163/180] Lint --- .../builder/src/templates/screenTemplating/table/newScreen.js | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/builder/src/templates/screenTemplating/table/newScreen.js b/packages/builder/src/templates/screenTemplating/table/newScreen.js index 956a325133..051b8edb82 100644 --- a/packages/builder/src/templates/screenTemplating/table/newScreen.js +++ b/packages/builder/src/templates/screenTemplating/table/newScreen.js @@ -4,7 +4,6 @@ import { capitalise } from "helpers" import { makePropSafe as safe } from "@budibase/string-templates" import getValidRoute from "../getValidRoute" import { Helpers } from "@budibase/bbui" -import { head } from "lodash" const getTableScreenTemplate = ({ route, From aba38c02b9a45ea38fd2df5b55bb9d275de6e1fd Mon Sep 17 00:00:00 2001 From: Andrew Kingston Date: Tue, 20 Aug 2024 15:28:12 +0100 Subject: [PATCH 164/180] Fix memos --- packages/frontend-core/src/utils/memo.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/frontend-core/src/utils/memo.js b/packages/frontend-core/src/utils/memo.js index b99af15c2c..724b3b9e66 100644 --- a/packages/frontend-core/src/utils/memo.js +++ b/packages/frontend-core/src/utils/memo.js @@ -4,7 +4,7 @@ import { writable, get, derived } from "svelte/store" // subscribed children will only fire when a new value is actually set export const memo = initialValue => { const store = writable(initialValue) - let currentJSON = null + let currentJSON = JSON.stringify(null) const tryUpdateValue = newValue => { const newJSON = JSON.stringify(newValue) From fa5a2ae198e1058f9fad75f9d1740c47ec0cd4b8 Mon Sep 17 00:00:00 2001 From: Andrew Kingston Date: Tue, 20 Aug 2024 15:29:39 +0100 Subject: [PATCH 165/180] Fix param --- packages/frontend-core/src/utils/memo.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/frontend-core/src/utils/memo.js b/packages/frontend-core/src/utils/memo.js index 724b3b9e66..8192be6790 100644 --- a/packages/frontend-core/src/utils/memo.js +++ b/packages/frontend-core/src/utils/memo.js @@ -4,7 +4,7 @@ import { writable, get, derived } from "svelte/store" // subscribed children will only fire when a new value is actually set export const memo = initialValue => { const store = writable(initialValue) - let currentJSON = JSON.stringify(null) + let currentJSON = JSON.stringify(initialValue) const tryUpdateValue = newValue => { const newJSON = JSON.stringify(newValue) From db7b5fa8270bb93ace455b72ed8812939d855276 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 20 Aug 2024 15:13:53 +0000 Subject: [PATCH 166/180] Bump elliptic from 6.5.4 to 6.5.7 Bumps [elliptic](https://github.com/indutny/elliptic) from 6.5.4 to 6.5.7. - [Commits](https://github.com/indutny/elliptic/compare/v6.5.4...v6.5.7) --- updated-dependencies: - dependency-name: elliptic dependency-type: indirect ... Signed-off-by: dependabot[bot] --- yarn.lock | 1757 ++--------------------------------------------------- 1 file changed, 58 insertions(+), 1699 deletions(-) diff --git a/yarn.lock b/yarn.lock index 6d71f587c0..f5cedd7097 100644 --- a/yarn.lock +++ b/yarn.lock @@ -25,14 +25,6 @@ "@jridgewell/gen-mapping" "^0.3.0" "@jridgewell/trace-mapping" "^0.3.9" -"@ampproject/remapping@^2.3.0": - version "2.3.0" - resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.3.0.tgz#ed441b6fa600072520ce18b43d2c8cc8caecc7f4" - integrity sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw== - dependencies: - "@jridgewell/gen-mapping" "^0.3.5" - "@jridgewell/trace-mapping" "^0.3.24" - "@apidevtools/json-schema-ref-parser@^9.0.6": version "9.1.2" resolved "https://registry.yarnpkg.com/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-9.1.2.tgz#8ff5386b365d4c9faa7c8b566ff16a46a577d9b8" @@ -633,13 +625,6 @@ dependencies: tslib "^2.5.0" -"@aws/dynamodb-auto-marshaller@^0.7.1": - version "0.7.1" - resolved "https://registry.yarnpkg.com/@aws/dynamodb-auto-marshaller/-/dynamodb-auto-marshaller-0.7.1.tgz#70676c056e4ecb798c08ec2e398a3d93e703858d" - integrity sha512-LeURlf6/avrfFo9+4Yht9J3CUTJ72yoBpm1FOUmlexuHNW4Ka61tG30w3ZDCXXXmCO2rG0k3ywAgNJEo3WPbyw== - dependencies: - tslib "^1.8.1" - "@azure/abort-controller@^1.0.0", "@azure/abort-controller@^1.0.4": version "1.1.0" resolved "https://registry.yarnpkg.com/@azure/abort-controller/-/abort-controller-1.1.0.tgz#788ee78457a55af8a1ad342acb182383d2119249" @@ -2002,13 +1987,6 @@ dependencies: regenerator-runtime "^0.14.0" -"@babel/runtime@^7.13.10": - version "7.25.0" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.25.0.tgz#3af9a91c1b739c569d5d80cc917280919c544ecb" - integrity sha512-7dRy4DwXwtzBrPbZflqxnvfxLF8kdZXPkhymtDeFoFqE6ldzjQFgYTtYIFARcLEYDrqfBfYcZt1WqFxRoyC9Rw== - dependencies: - regenerator-runtime "^0.14.0" - "@babel/template@^7.22.15", "@babel/template@^7.22.5", "@babel/template@^7.3.3": version "7.22.15" resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.22.15.tgz#09576efc3830f0430f4548ef971dde1350ef2f38" @@ -2133,7 +2111,7 @@ pouchdb-promise "^6.0.4" through2 "^2.0.0" -"@budibase/pro@npm:@budibase/pro@latest": +"@budibase/pro@0.0.0", "@budibase/pro@npm:@budibase/pro@latest": version "2.29.24" resolved "https://registry.yarnpkg.com/@budibase/pro/-/pro-2.29.24.tgz#2dbd4c6c0f757aab7e17c413c6d6e4520086f9ac" integrity sha512-m1v24UD6O21Vbrfsuo5kC5oeg7FzjWO2w8TQMw1VvPKmdIqqclaKDPTPytxwllTMkapMDRNzM5cQzqnQ3yHf6A== @@ -2199,32 +2177,6 @@ dependencies: "@bull-board/api" "5.10.2" -"@camunda8/sdk@^8.5.3": - version "8.6.10" - resolved "https://registry.yarnpkg.com/@camunda8/sdk/-/sdk-8.6.10.tgz#61fdadc6bc89a234648ba4bc622b0db10f283de9" - integrity sha512-FzSoLYd0yFFElC2G3NX93GnP7r53uQDR+6njV1EEAGPhz4QQfZeEW07vMNZ9BFeNn5jhtv9IWmHdHxYwJxxmcw== - dependencies: - "@grpc/grpc-js" "1.10.9" - "@grpc/proto-loader" "0.7.13" - chalk "^2.4.2" - console-stamp "^3.0.2" - dayjs "^1.8.15" - debug "^4.3.4" - fast-xml-parser "^4.1.3" - got "^11.8.6" - jwt-decode "^4.0.0" - lodash.mergewith "^4.6.2" - long "^4.0.0" - lossless-json "^4.0.1" - neon-env "^0.1.3" - promise-retry "^1.1.1" - reflect-metadata "^0.2.1" - stack-trace "0.0.10" - typed-duration "^1.0.12" - uuid "^7.0.3" - optionalDependencies: - win-ca "3.5.1" - "@codemirror/autocomplete@^6.0.0", "@codemirror/autocomplete@^6.7.1": version "6.7.1" resolved "https://registry.yarnpkg.com/@codemirror/autocomplete/-/autocomplete-6.7.1.tgz#3364799b78dff70fb8f81615536c52ea53ce40b2" @@ -2408,231 +2360,116 @@ find-up "^5.0.0" strip-json-comments "^3.1.1" -"@esbuild/aix-ppc64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz#c7184a326533fcdf1b8ee0733e21c713b975575f" - integrity sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ== - "@esbuild/android-arm64@0.18.20": version "0.18.20" resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz#984b4f9c8d0377443cc2dfcef266d02244593622" integrity sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ== -"@esbuild/android-arm64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz#09d9b4357780da9ea3a7dfb833a1f1ff439b4052" - integrity sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A== - "@esbuild/android-arm@0.18.20": version "0.18.20" resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.18.20.tgz#fedb265bc3a589c84cc11f810804f234947c3682" integrity sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw== -"@esbuild/android-arm@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.21.5.tgz#9b04384fb771926dfa6d7ad04324ecb2ab9b2e28" - integrity sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg== - "@esbuild/android-x64@0.18.20": version "0.18.20" resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.18.20.tgz#35cf419c4cfc8babe8893d296cd990e9e9f756f2" integrity sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg== -"@esbuild/android-x64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.21.5.tgz#29918ec2db754cedcb6c1b04de8cd6547af6461e" - integrity sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA== - "@esbuild/darwin-arm64@0.18.20": version "0.18.20" resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz#08172cbeccf95fbc383399a7f39cfbddaeb0d7c1" integrity sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA== -"@esbuild/darwin-arm64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz#e495b539660e51690f3928af50a76fb0a6ccff2a" - integrity sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ== - "@esbuild/darwin-x64@0.18.20": version "0.18.20" resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz#d70d5790d8bf475556b67d0f8b7c5bdff053d85d" integrity sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ== -"@esbuild/darwin-x64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz#c13838fa57372839abdddc91d71542ceea2e1e22" - integrity sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw== - "@esbuild/freebsd-arm64@0.18.20": version "0.18.20" resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz#98755cd12707f93f210e2494d6a4b51b96977f54" integrity sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw== -"@esbuild/freebsd-arm64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz#646b989aa20bf89fd071dd5dbfad69a3542e550e" - integrity sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g== - "@esbuild/freebsd-x64@0.18.20": version "0.18.20" resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz#c1eb2bff03915f87c29cece4c1a7fa1f423b066e" integrity sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ== -"@esbuild/freebsd-x64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz#aa615cfc80af954d3458906e38ca22c18cf5c261" - integrity sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ== - "@esbuild/linux-arm64@0.18.20": version "0.18.20" resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz#bad4238bd8f4fc25b5a021280c770ab5fc3a02a0" integrity sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA== -"@esbuild/linux-arm64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz#70ac6fa14f5cb7e1f7f887bcffb680ad09922b5b" - integrity sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q== - "@esbuild/linux-arm@0.18.20": version "0.18.20" resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz#3e617c61f33508a27150ee417543c8ab5acc73b0" integrity sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg== -"@esbuild/linux-arm@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz#fc6fd11a8aca56c1f6f3894f2bea0479f8f626b9" - integrity sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA== - "@esbuild/linux-ia32@0.18.20": version "0.18.20" resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz#699391cccba9aee6019b7f9892eb99219f1570a7" integrity sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA== -"@esbuild/linux-ia32@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz#3271f53b3f93e3d093d518d1649d6d68d346ede2" - integrity sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg== - "@esbuild/linux-loong64@0.18.20": version "0.18.20" resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz#e6fccb7aac178dd2ffb9860465ac89d7f23b977d" integrity sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg== -"@esbuild/linux-loong64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz#ed62e04238c57026aea831c5a130b73c0f9f26df" - integrity sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg== - "@esbuild/linux-mips64el@0.18.20": version "0.18.20" resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz#eeff3a937de9c2310de30622a957ad1bd9183231" integrity sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ== -"@esbuild/linux-mips64el@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz#e79b8eb48bf3b106fadec1ac8240fb97b4e64cbe" - integrity sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg== - "@esbuild/linux-ppc64@0.18.20": version "0.18.20" resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz#2f7156bde20b01527993e6881435ad79ba9599fb" integrity sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA== -"@esbuild/linux-ppc64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz#5f2203860a143b9919d383ef7573521fb154c3e4" - integrity sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w== - "@esbuild/linux-riscv64@0.18.20": version "0.18.20" resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz#6628389f210123d8b4743045af8caa7d4ddfc7a6" integrity sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A== -"@esbuild/linux-riscv64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz#07bcafd99322d5af62f618cb9e6a9b7f4bb825dc" - integrity sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA== - "@esbuild/linux-s390x@0.18.20": version "0.18.20" resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz#255e81fb289b101026131858ab99fba63dcf0071" integrity sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ== -"@esbuild/linux-s390x@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz#b7ccf686751d6a3e44b8627ababc8be3ef62d8de" - integrity sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A== - "@esbuild/linux-x64@0.18.20": version "0.18.20" resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz#c7690b3417af318a9b6f96df3031a8865176d338" integrity sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w== -"@esbuild/linux-x64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz#6d8f0c768e070e64309af8004bb94e68ab2bb3b0" - integrity sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ== - "@esbuild/netbsd-x64@0.18.20": version "0.18.20" resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz#30e8cd8a3dded63975e2df2438ca109601ebe0d1" integrity sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A== -"@esbuild/netbsd-x64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz#bbe430f60d378ecb88decb219c602667387a6047" - integrity sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg== - "@esbuild/openbsd-x64@0.18.20": version "0.18.20" resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz#7812af31b205055874c8082ea9cf9ab0da6217ae" integrity sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg== -"@esbuild/openbsd-x64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz#99d1cf2937279560d2104821f5ccce220cb2af70" - integrity sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow== - "@esbuild/sunos-x64@0.18.20": version "0.18.20" resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz#d5c275c3b4e73c9b0ecd38d1ca62c020f887ab9d" integrity sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ== -"@esbuild/sunos-x64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz#08741512c10d529566baba837b4fe052c8f3487b" - integrity sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg== - "@esbuild/win32-arm64@0.18.20": version "0.18.20" resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz#73bc7f5a9f8a77805f357fab97f290d0e4820ac9" integrity sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg== -"@esbuild/win32-arm64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz#675b7385398411240735016144ab2e99a60fc75d" - integrity sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A== - "@esbuild/win32-ia32@0.18.20": version "0.18.20" resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz#ec93cbf0ef1085cc12e71e0d661d20569ff42102" integrity sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g== -"@esbuild/win32-ia32@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz#1bfc3ce98aa6ca9a0969e4d2af72144c59c1193b" - integrity sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA== - "@esbuild/win32-x64@0.18.20": version "0.18.20" resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz#786c5f41f043b07afb1af37683d7c33668858f6d" integrity sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ== -"@esbuild/win32-x64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz#acad351d582d157bb145535db2a6ff53dd514b5c" - integrity sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw== - "@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.4.0": version "4.4.0" resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59" @@ -2640,25 +2477,11 @@ dependencies: eslint-visitor-keys "^3.3.0" -"@eslint-community/regexpp@^4.10.0", "@eslint-community/regexpp@^4.11.0": - version "4.11.0" - resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.11.0.tgz#b0ffd0312b4a3fd2d6f77237e7248a5ad3a680ae" - integrity sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A== - "@eslint-community/regexpp@^4.5.1", "@eslint-community/regexpp@^4.6.1": version "4.10.0" resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.10.0.tgz#548f6de556857c8bb73bbee70c35dc82a2e74d63" integrity sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA== -"@eslint/config-array@^0.17.1": - version "0.17.1" - resolved "https://registry.yarnpkg.com/@eslint/config-array/-/config-array-0.17.1.tgz#d9b8b8b6b946f47388f32bedfd3adf29ca8f8910" - integrity sha512-BlYOpej8AQ8Ev9xVqroV7a02JK3SkBAaN9GfMMH9W6Ch8FlQlkjGw4Ir7+FgYwfirivAf4t+GtzuAxqfukmISA== - dependencies: - "@eslint/object-schema" "^2.1.4" - debug "^4.3.1" - minimatch "^3.1.2" - "@eslint/eslintrc@^2.1.4": version "2.1.4" resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.1.4.tgz#388a269f0f25c1b6adc317b5a2c55714894c70ad" @@ -2674,36 +2497,11 @@ minimatch "^3.1.2" strip-json-comments "^3.1.1" -"@eslint/eslintrc@^3.1.0": - version "3.1.0" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-3.1.0.tgz#dbd3482bfd91efa663cbe7aa1f506839868207b6" - integrity sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ== - dependencies: - ajv "^6.12.4" - debug "^4.3.2" - espree "^10.0.1" - globals "^14.0.0" - ignore "^5.2.0" - import-fresh "^3.2.1" - js-yaml "^4.1.0" - minimatch "^3.1.2" - strip-json-comments "^3.1.1" - "@eslint/js@8.57.0": version "8.57.0" resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.57.0.tgz#a5417ae8427873f1dd08b70b3574b453e67b5f7f" integrity sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g== -"@eslint/js@9.9.0", "@eslint/js@^9.7.0": - version "9.9.0" - resolved "https://registry.yarnpkg.com/@eslint/js/-/js-9.9.0.tgz#d8437adda50b3ed4401964517b64b4f59b0e2638" - integrity sha512-hhetes6ZHP3BlXLxmd8K2SNgkhNSi+UcecbnwWKwpP7kyi/uC75DJ1lOOBO3xrC4jyojtGE3YxKZPHfk4yrgug== - -"@eslint/object-schema@^2.1.4": - version "2.1.4" - resolved "https://registry.yarnpkg.com/@eslint/object-schema/-/object-schema-2.1.4.tgz#9e69f8bb4031e11df79e03db09f9dbbae1740843" - integrity sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ== - "@fontsource/source-sans-pro@^5.0.3": version "5.0.3" resolved "https://registry.yarnpkg.com/@fontsource/source-sans-pro/-/source-sans-pro-5.0.3.tgz#7d6e84a8169ba12fa5e6ce70757aa2ca7e74d855" @@ -2792,14 +2590,6 @@ teeny-request "^8.0.0" uuid "^8.0.0" -"@grpc/grpc-js@1.10.9": - version "1.10.9" - resolved "https://registry.yarnpkg.com/@grpc/grpc-js/-/grpc-js-1.10.9.tgz#468cc1549a3fe37b760a16745fb7685d91f4f10c" - integrity sha512-5tcgUctCG0qoNyfChZifz2tJqbRbXVO9J7X6duFcOjY3HUNCxg5D0ZCK7EP9vIcZ0zRpLU9bWkyCqVCLZ46IbQ== - dependencies: - "@grpc/proto-loader" "^0.7.13" - "@js-sdsl/ordered-map" "^4.4.2" - "@grpc/grpc-js@^1.10.9": version "1.10.10" resolved "https://registry.yarnpkg.com/@grpc/grpc-js/-/grpc-js-1.10.10.tgz#476d315feeb9dbb0f2d6560008c92688c30f13e0" @@ -2808,7 +2598,7 @@ "@grpc/proto-loader" "^0.7.13" "@js-sdsl/ordered-map" "^4.4.2" -"@grpc/proto-loader@0.7.13", "@grpc/proto-loader@^0.7.13": +"@grpc/proto-loader@^0.7.13": version "0.7.13" resolved "https://registry.yarnpkg.com/@grpc/proto-loader/-/proto-loader-0.7.13.tgz#f6a44b2b7c9f7b609f5748c6eac2d420e37670cf" integrity sha512-AiXO/bfe9bmxBjxxtYxFAXGZvMaN5s8kO+jBHAJCON8rJoB5YS/D6X7ZNc6XQkuHNmyl4CYaMI1fJ/Gn27RGGw== @@ -2818,32 +2608,18 @@ protobufjs "^7.2.5" yargs "^17.7.2" -"@hapi/hoek@^9.0.0", "@hapi/hoek@^9.3.0": +"@hapi/hoek@^9.0.0": version "9.3.0" resolved "https://registry.yarnpkg.com/@hapi/hoek/-/hoek-9.3.0.tgz#8368869dcb735be2e7f5cb7647de78e167a251fb" integrity sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ== -"@hapi/topo@^5.0.0", "@hapi/topo@^5.1.0": +"@hapi/topo@^5.0.0": version "5.1.0" resolved "https://registry.yarnpkg.com/@hapi/topo/-/topo-5.1.0.tgz#dc448e332c6c6e37a4dc02fd84ba8d44b9afb012" integrity sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg== dependencies: "@hapi/hoek" "^9.0.0" -"@hubspot/api-client@7.1.2": - version "7.1.2" - resolved "https://registry.yarnpkg.com/@hubspot/api-client/-/api-client-7.1.2.tgz#a405b0a18b8caa27f129fd510b2555e5a5cc2708" - integrity sha512-JVQqh0fdHf97ePk0Hg/7BJsiXNlS9HQRPiM/CLgvVWt5CIviSLQ/kHLZXREmZqTWu7BisjCgHxnSx/d7gRdr2g== - dependencies: - bluebird "^3.7.2" - bottleneck "^2.19.5" - btoa "^1.2.1" - es6-promise "^4.2.4" - form-data "^2.5.0" - lodash "^4.17.21" - node-fetch "^2.6.0" - url-parse "^1.4.3" - "@humanwhocodes/config-array@^0.11.14": version "0.11.14" resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.14.tgz#d78e481a039f7566ecc9660b4ea7fe6b1fec442b" @@ -2863,11 +2639,6 @@ resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz#4a2868d75d6d6963e423bcf90b7fd1be343409d3" integrity sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA== -"@humanwhocodes/retry@^0.3.0": - version "0.3.0" - resolved "https://registry.yarnpkg.com/@humanwhocodes/retry/-/retry-0.3.0.tgz#6d86b8cb322660f03d3f0aa94b99bdd8e172d570" - integrity sha512-d2CGZR2o7fS6sWB7DG/3a95bGKQyHMACZ5aW8qGkkqQpUoZV6C0X7Pc7l4ZNMZkfNBf4VWNe9E1jRsf0G146Ew== - "@hutson/parse-repository-url@^3.0.0": version "3.0.2" resolved "https://registry.yarnpkg.com/@hutson/parse-repository-url/-/parse-repository-url-3.0.2.tgz#98c23c950a3d9b6c8f0daed06da6c3af06981340" @@ -3421,11 +3192,6 @@ resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== -"@jridgewell/sourcemap-codec@^1.5.0": - version "1.5.0" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz#3188bcb273a414b0d215fd22a58540b989b9409a" - integrity sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ== - "@jridgewell/trace-mapping@0.3.9": version "0.3.9" resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz#6534fd5933a53ba7cbf3a17615e273a0d1273ff9" @@ -3457,13 +3223,6 @@ resolved "https://registry.yarnpkg.com/@jsdevtools/ono/-/ono-7.1.3.tgz#9df03bbd7c696a5c58885c34aa06da41c8543796" integrity sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg== -"@koa/cors@^5.0.0": - version "5.0.0" - resolved "https://registry.yarnpkg.com/@koa/cors/-/cors-5.0.0.tgz#0029b5f057fa0d0ae0e37dd2c89ece315a0daffd" - integrity sha512-x/iUDjcS90W69PryLDIMgFyV21YLTnG9zOpPXS7Bkt2b8AsY3zZsIpOLBkYr9fBcF3HbkKaER5hOBZLfpLgYNw== - dependencies: - vary "^1.1.2" - "@koa/router@8.0.8": version "8.0.8" resolved "https://registry.yarnpkg.com/@koa/router/-/router-8.0.8.tgz#95f32d11373d03d89dcb63fabe9ac6f471095236" @@ -4058,7 +3817,7 @@ dependencies: slash "^4.0.0" -"@rollup/plugin-commonjs@16.0.0", "@rollup/plugin-commonjs@^16.0.0": +"@rollup/plugin-commonjs@^16.0.0": version "16.0.0" resolved "https://registry.yarnpkg.com/@rollup/plugin-commonjs/-/plugin-commonjs-16.0.0.tgz#169004d56cd0f0a1d0f35915d31a036b0efe281f" integrity sha512-LuNyypCP3msCGVQJ7ki8PqYdpjfEkE/xtFa5DqlF+7IBD0JsfMZ87C58heSwIMint58sAUZbt3ITqOmdQv/dXw== @@ -4144,15 +3903,7 @@ is-module "^1.0.0" resolve "^1.22.1" -"@rollup/plugin-replace@^2.4.2": - version "2.4.2" - resolved "https://registry.yarnpkg.com/@rollup/plugin-replace/-/plugin-replace-2.4.2.tgz#a2d539314fbc77c244858faa523012825068510a" - integrity sha512-IGcu+cydlUMZ5En85jxHH4qj2hta/11BHq95iHEyb2sbgiN0eCdzvUcHw5gt9pBL5lTi4JDYJ1acCoMGpTvEZg== - dependencies: - "@rollup/pluginutils" "^3.1.0" - magic-string "^0.25.7" - -"@rollup/plugin-replace@^5.0.2", "@rollup/plugin-replace@^5.0.3": +"@rollup/plugin-replace@^5.0.3": version "5.0.7" resolved "https://registry.yarnpkg.com/@rollup/plugin-replace/-/plugin-replace-5.0.7.tgz#150c9ee9db8031d9e4580a61a0edeaaed3d37687" integrity sha512-PqxSfuorkHz/SPpyngLyg5GCEkOcee9M1bkxiVDr41Pd61mqP1PLOoDPbpl44SB2mQGKwV/In74gqQmGITOhEQ== @@ -4208,178 +3959,81 @@ resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.18.0.tgz#bbd0e616b2078cd2d68afc9824d1fadb2f2ffd27" integrity sha512-Tya6xypR10giZV1XzxmH5wr25VcZSncG0pZIjfePT0OVBvqNEurzValetGNarVrGiq66EBVAFn15iYX4w6FKgQ== -"@rollup/rollup-android-arm-eabi@4.19.1": - version "4.19.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.19.1.tgz#7746deb85e4a8fb54fbfda8ac5c102692f102476" - integrity sha512-XzqSg714++M+FXhHfXpS1tDnNZNpgxxuGZWlRG/jSj+VEPmZ0yg6jV4E0AL3uyBKxO8mO3xtOsP5mQ+XLfrlww== - "@rollup/rollup-android-arm64@4.18.0": version "4.18.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.18.0.tgz#97255ef6384c5f73f4800c0de91f5f6518e21203" integrity sha512-avCea0RAP03lTsDhEyfy+hpfr85KfyTctMADqHVhLAF3MlIkq83CP8UfAHUssgXTYd+6er6PaAhx/QGv4L1EiA== -"@rollup/rollup-android-arm64@4.19.1": - version "4.19.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.19.1.tgz#93de4d867709d3313794723b5afd91e1e174f906" - integrity sha512-thFUbkHteM20BGShD6P08aungq4irbIZKUNbG70LN8RkO7YztcGPiKTTGZS7Kw+x5h8hOXs0i4OaHwFxlpQN6A== - "@rollup/rollup-darwin-arm64@4.18.0": version "4.18.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.18.0.tgz#b6dd74e117510dfe94541646067b0545b42ff096" integrity sha512-IWfdwU7KDSm07Ty0PuA/W2JYoZ4iTj3TUQjkVsO/6U+4I1jN5lcR71ZEvRh52sDOERdnNhhHU57UITXz5jC1/w== -"@rollup/rollup-darwin-arm64@4.19.1": - version "4.19.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.19.1.tgz#e41e6a81673260ab196e0f59462b9940a6ac03cd" - integrity sha512-8o6eqeFZzVLia2hKPUZk4jdE3zW7LCcZr+MD18tXkgBBid3lssGVAYuox8x6YHoEPDdDa9ixTaStcmx88lio5Q== - "@rollup/rollup-darwin-x64@4.18.0": version "4.18.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.18.0.tgz#e07d76de1cec987673e7f3d48ccb8e106d42c05c" integrity sha512-n2LMsUz7Ynu7DoQrSQkBf8iNrjOGyPLrdSg802vk6XT3FtsgX6JbE8IHRvposskFm9SNxzkLYGSq9QdpLYpRNA== -"@rollup/rollup-darwin-x64@4.19.1": - version "4.19.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.19.1.tgz#2b0a0aef6e8c5317d494cfc9076d7a16b099bdcb" - integrity sha512-4T42heKsnbjkn7ovYiAdDVRRWZLU9Kmhdt6HafZxFcUdpjlBlxj4wDrt1yFWLk7G4+E+8p2C9tcmSu0KA6auGA== - "@rollup/rollup-linux-arm-gnueabihf@4.18.0": version "4.18.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.18.0.tgz#9f1a6d218b560c9d75185af4b8bb42f9f24736b8" integrity sha512-C/zbRYRXFjWvz9Z4haRxcTdnkPt1BtCkz+7RtBSuNmKzMzp3ZxdM28Mpccn6pt28/UWUCTXa+b0Mx1k3g6NOMA== -"@rollup/rollup-linux-arm-gnueabihf@4.19.1": - version "4.19.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.19.1.tgz#e22319deb5367384ef315e66bc6de80d2bf2b3ae" - integrity sha512-MXg1xp+e5GhZ3Vit1gGEyoC+dyQUBy2JgVQ+3hUrD9wZMkUw/ywgkpK7oZgnB6kPpGrxJ41clkPPnsknuD6M2Q== - "@rollup/rollup-linux-arm-musleabihf@4.18.0": version "4.18.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.18.0.tgz#53618b92e6ffb642c7b620e6e528446511330549" integrity sha512-l3m9ewPgjQSXrUMHg93vt0hYCGnrMOcUpTz6FLtbwljo2HluS4zTXFy2571YQbisTnfTKPZ01u/ukJdQTLGh9A== -"@rollup/rollup-linux-arm-musleabihf@4.19.1": - version "4.19.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.19.1.tgz#d5dd68f5d7ae21b345a5c87208c94e5c813f54b8" - integrity sha512-DZNLwIY4ftPSRVkJEaxYkq7u2zel7aah57HESuNkUnz+3bZHxwkCUkrfS2IWC1sxK6F2QNIR0Qr/YXw7nkF3Pw== - "@rollup/rollup-linux-arm64-gnu@4.18.0": version "4.18.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.18.0.tgz#99a7ba5e719d4f053761a698f7b52291cefba577" integrity sha512-rJ5D47d8WD7J+7STKdCUAgmQk49xuFrRi9pZkWoRD1UeSMakbcepWXPF8ycChBoAqs1pb2wzvbY6Q33WmN2ftw== -"@rollup/rollup-linux-arm64-gnu@4.19.1": - version "4.19.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.19.1.tgz#1703d3a418d33f8f025acaf93f39ca1efcd5b645" - integrity sha512-C7evongnjyxdngSDRRSQv5GvyfISizgtk9RM+z2biV5kY6S/NF/wta7K+DanmktC5DkuaJQgoKGf7KUDmA7RUw== - "@rollup/rollup-linux-arm64-musl@4.18.0": version "4.18.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.18.0.tgz#f53db99a45d9bc00ce94db8a35efa7c3c144a58c" integrity sha512-be6Yx37b24ZwxQ+wOQXXLZqpq4jTckJhtGlWGZs68TgdKXJgw54lUUoFYrg6Zs/kjzAQwEwYbp8JxZVzZLRepQ== -"@rollup/rollup-linux-arm64-musl@4.19.1": - version "4.19.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.19.1.tgz#3f59c2c6e60f75ce8b1090bd841c555e3bb01f0e" - integrity sha512-89tFWqxfxLLHkAthAcrTs9etAoBFRduNfWdl2xUs/yLV+7XDrJ5yuXMHptNqf1Zw0UCA3cAutkAiAokYCkaPtw== - "@rollup/rollup-linux-powerpc64le-gnu@4.18.0": version "4.18.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.18.0.tgz#cbb0837408fe081ce3435cf3730e090febafc9bf" integrity sha512-hNVMQK+qrA9Todu9+wqrXOHxFiD5YmdEi3paj6vP02Kx1hjd2LLYR2eaN7DsEshg09+9uzWi2W18MJDlG0cxJA== -"@rollup/rollup-linux-powerpc64le-gnu@4.19.1": - version "4.19.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.19.1.tgz#3f99a0921596a6f539121a312df29af52a205f15" - integrity sha512-PromGeV50sq+YfaisG8W3fd+Cl6mnOOiNv2qKKqKCpiiEke2KiKVyDqG/Mb9GWKbYMHj5a01fq/qlUR28PFhCQ== - "@rollup/rollup-linux-riscv64-gnu@4.18.0": version "4.18.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.18.0.tgz#8ed09c1d1262ada4c38d791a28ae0fea28b80cc9" integrity sha512-ROCM7i+m1NfdrsmvwSzoxp9HFtmKGHEqu5NNDiZWQtXLA8S5HBCkVvKAxJ8U+CVctHwV2Gb5VUaK7UAkzhDjlg== -"@rollup/rollup-linux-riscv64-gnu@4.19.1": - version "4.19.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.19.1.tgz#c08fb3e629d50d2eac31329347cfc559a1cf81d1" - integrity sha512-/1BmHYh+iz0cNCP0oHCuF8CSiNj0JOGf0jRlSo3L/FAyZyG2rGBuKpkZVH9YF+x58r1jgWxvm1aRg3DHrLDt6A== - "@rollup/rollup-linux-s390x-gnu@4.18.0": version "4.18.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.18.0.tgz#938138d3c8e0c96f022252a28441dcfb17afd7ec" integrity sha512-0UyyRHyDN42QL+NbqevXIIUnKA47A+45WyasO+y2bGJ1mhQrfrtXUpTxCOrfxCR4esV3/RLYyucGVPiUsO8xjg== -"@rollup/rollup-linux-s390x-gnu@4.19.1": - version "4.19.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.19.1.tgz#173722cd745779d730d4b24d21386185e0e12de8" - integrity sha512-0cYP5rGkQWRZKy9/HtsWVStLXzCF3cCBTRI+qRL8Z+wkYlqN7zrSYm6FuY5Kd5ysS5aH0q5lVgb/WbG4jqXN1Q== - "@rollup/rollup-linux-x64-gnu@4.18.0": version "4.18.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.18.0.tgz#1a7481137a54740bee1ded4ae5752450f155d942" integrity sha512-xuglR2rBVHA5UsI8h8UbX4VJ470PtGCf5Vpswh7p2ukaqBGFTnsfzxUBetoWBWymHMxbIG0Cmx7Y9qDZzr648w== -"@rollup/rollup-linux-x64-gnu@4.19.1": - version "4.19.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.19.1.tgz#0af2b6541ab0f4954d2c4f96bcdc7947420dd28c" - integrity sha512-XUXeI9eM8rMP8aGvii/aOOiMvTs7xlCosq9xCjcqI9+5hBxtjDpD+7Abm1ZhVIFE1J2h2VIg0t2DX/gjespC2Q== - "@rollup/rollup-linux-x64-musl@4.18.0": version "4.18.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.18.0.tgz#f1186afc601ac4f4fc25fac4ca15ecbee3a1874d" integrity sha512-LKaqQL9osY/ir2geuLVvRRs+utWUNilzdE90TpyoX0eNqPzWjRm14oMEE+YLve4k/NAqCdPkGYDaDF5Sw+xBfg== -"@rollup/rollup-linux-x64-musl@4.19.1": - version "4.19.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.19.1.tgz#f973f9552744764b221128f7c3629222216ace69" - integrity sha512-V7cBw/cKXMfEVhpSvVZhC+iGifD6U1zJ4tbibjjN+Xi3blSXaj/rJynAkCFFQfoG6VZrAiP7uGVzL440Q6Me2Q== - "@rollup/rollup-win32-arm64-msvc@4.18.0": version "4.18.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.18.0.tgz#ed6603e93636a96203c6915be4117245c1bd2daf" integrity sha512-7J6TkZQFGo9qBKH0pk2cEVSRhJbL6MtfWxth7Y5YmZs57Pi+4x6c2dStAUvaQkHQLnEQv1jzBUW43GvZW8OFqA== -"@rollup/rollup-win32-arm64-msvc@4.19.1": - version "4.19.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.19.1.tgz#21ac5ed84d914bc31821fec3dd909f7257cfb17b" - integrity sha512-88brja2vldW/76jWATlBqHEoGjJLRnP0WOEKAUbMcXaAZnemNhlAHSyj4jIwMoP2T750LE9lblvD4e2jXleZsA== - "@rollup/rollup-win32-ia32-msvc@4.18.0": version "4.18.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.18.0.tgz#14e0b404b1c25ebe6157a15edb9c46959ba74c54" integrity sha512-Txjh+IxBPbkUB9+SXZMpv+b/vnTEtFyfWZgJ6iyCmt2tdx0OF5WhFowLmnh8ENGNpfUlUZkdI//4IEmhwPieNg== -"@rollup/rollup-win32-ia32-msvc@4.19.1": - version "4.19.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.19.1.tgz#0cfe740063b35dcd5a62c4e243226631a846ce11" - integrity sha512-LdxxcqRVSXi6k6JUrTah1rHuaupoeuiv38du8Mt4r4IPer3kwlTo+RuvfE8KzZ/tL6BhaPlzJ3835i6CxrFIRQ== - "@rollup/rollup-win32-x64-msvc@4.18.0": version "4.18.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.18.0.tgz#5d694d345ce36b6ecf657349e03eb87297e68da4" integrity sha512-UOo5FdvOL0+eIVTgS4tIdbW+TtnBLWg1YBCcU2KWM7nuNwRz9bksDX1bekJJCpu25N1DVWaCwnT39dVQxzqS8g== -"@rollup/rollup-win32-x64-msvc@4.19.1": - version "4.19.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.19.1.tgz#5f2c40d3f1b53ede80fb4e6964f840c0f8936832" - integrity sha512-2bIrL28PcK3YCqD9anGxDxamxdiJAxA+l7fWIwM5o8UqNy1t3d1NdAweO2XhA0KTDJ5aH1FsuiT5+7VhtHliXg== - -"@roxi/routify@2.18.0": - version "2.18.0" - resolved "https://registry.yarnpkg.com/@roxi/routify/-/routify-2.18.0.tgz#8f88bedd936312d0dbe44cbc11ab179b1f938ec2" - integrity sha512-MVB50HN+VQWLzfjLplcBjsSBvwOiExKOmht2DuWR3WQ60JxQi9pSejkB06tFVkFKNXz2X5iYtKDqKBTdae/gRg== - dependencies: - "@roxi/ssr" "^0.2.1" - "@types/node" ">=4.2.0 < 13" - chalk "^4.0.0" - cheap-watch "^1.0.2" - commander "^7.1.0" - configent "^2.1.4" - esm "^3.2.25" - fs-extra "^9.0.1" - log-symbols "^3.0.0" - picomatch "^2.2.2" - rollup-pluginutils "^2.8.2" - "@roxi/routify@2.18.12": version "2.18.12" resolved "https://registry.yarnpkg.com/@roxi/routify/-/routify-2.18.12.tgz#901ca95b96f274ddddaefbf18424557ee1ae3fae" @@ -4415,22 +4069,14 @@ koa "^2.13.4" node-mocks-http "^1.11.0" -"@shopify/jest-koa-mocks@5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@shopify/jest-koa-mocks/-/jest-koa-mocks-5.3.0.tgz#0b9b6ce01a7ef945df7272aa08cda559c11b39f5" - integrity sha512-Yy9uS298/aWhT/bjfhUAcFRaq7pq7j0ybaI6U/vWQ5IcdWD3E73iqptkw+FNC+Z9cdV9QT8osFd0r0frFNb9Nw== - dependencies: - koa "^2.13.4" - node-mocks-http "^1.11.0" - -"@sideway/address@^4.1.3", "@sideway/address@^4.1.5": +"@sideway/address@^4.1.3": version "4.1.5" resolved "https://registry.yarnpkg.com/@sideway/address/-/address-4.1.5.tgz#4bc149a0076623ced99ca8208ba780d65a99b9d5" integrity sha512-IqO/DUQHUkPeixNQ8n0JA6102hT9CmaljNTPmQ1u8MEhBo/R4Q8eKLN/vGZxuebwOroDB4cbpjheD4+/sKFK4Q== dependencies: "@hapi/hoek" "^9.0.0" -"@sideway/formula@^3.0.0", "@sideway/formula@^3.0.1": +"@sideway/formula@^3.0.0": version "3.0.1" resolved "https://registry.yarnpkg.com/@sideway/formula/-/formula-3.0.1.tgz#80fcbcbaf7ce031e0ef2dd29b1bfc7c3f583611f" integrity sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg== @@ -4469,11 +4115,6 @@ resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.7.0.tgz#9a06f4f137ee84d7df0460c1fdb1135ffa6c50fd" integrity sha512-ONhaKPIufzzrlNbqtWFFd+jlnemX6lJAgq9ZeiZtS7I1PIf/la7CW4m83rTXRnVnsMbW2k56pGYu7AUFJD9Pow== -"@sindresorhus/is@^4.0.0": - version "4.6.0" - resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-4.6.0.tgz#3c7c9c46e678feefe7a2e5bb609d3dbd665ffb3f" - integrity sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw== - "@sinonjs/commons@^2.0.0": version "2.0.0" resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-2.0.0.tgz#fd4ca5b063554307e8327b4564bd56d3b73924a3" @@ -5275,14 +4916,7 @@ dependencies: defer-to-connect "^1.0.1" -"@szmarczak/http-timer@^4.0.5": - version "4.0.6" - resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-4.0.6.tgz#b4a914bb62e7c272d4e5989fe4440f812ab1d807" - integrity sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w== - dependencies: - defer-to-connect "^2.0.0" - -"@techpass/passport-openidconnect@0.3.3", "@techpass/passport-openidconnect@^0.3.0": +"@techpass/passport-openidconnect@0.3.3": version "0.3.3" resolved "https://registry.yarnpkg.com/@techpass/passport-openidconnect/-/passport-openidconnect-0.3.3.tgz#6c01c78bd8da0ca8917378dfbe18024702620352" integrity sha512-i2X/CofjnGBqpTmw6b+Ex3Co/NrR2xjnIHvnOJk62XIlJJHNSTwmhJ1PkXoA5RGKlxZWchADFGjLTJnebvRj7A== @@ -5462,16 +5096,6 @@ "@types/connect" "*" "@types/node" "*" -"@types/cacheable-request@^6.0.1": - version "6.0.3" - resolved "https://registry.yarnpkg.com/@types/cacheable-request/-/cacheable-request-6.0.3.tgz#a430b3260466ca7b5ca5bfd735693b36e7a9d183" - integrity sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw== - dependencies: - "@types/http-cache-semantics" "*" - "@types/keyv" "^3.1.4" - "@types/node" "*" - "@types/responselike" "^1.0.0" - "@types/caseless@*": version "0.12.2" resolved "https://registry.yarnpkg.com/@types/caseless/-/caseless-0.12.2.tgz#f65d3d6389e01eeb458bd54dc8f52b95a9463bc8" @@ -5563,21 +5187,6 @@ "@types/docker-modem" "*" "@types/node" "*" -"@types/eslint@*": - version "9.6.0" - resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-9.6.0.tgz#51d4fe4d0316da9e9f2c80884f2c20ed5fb022ff" - integrity sha512-gi6WQJ7cHRgZxtkQEoyHMppPjq9Kxo5Tjn2prSKDSmZrCz8TZ3jSRCeTJm+WoM+oB0WG37bRqLzaaU3q7JypGg== - dependencies: - "@types/estree" "*" - "@types/json-schema" "*" - -"@types/eslint__js@^8.42.3": - version "8.42.3" - resolved "https://registry.yarnpkg.com/@types/eslint__js/-/eslint__js-8.42.3.tgz#d1fa13e5c1be63a10b4e3afe992779f81c1179a0" - integrity sha512-alfG737uhmPdnvkrLdZLcEKJ/B8s9Y4hrZ+YAdzUeoArBlSUERA2E87ROfOaS4jd/C45fzOoZzidLc1IPwLqOw== - dependencies: - "@types/eslint" "*" - "@types/estree@*", "@types/estree@1.0.5", "@types/estree@^1.0.0", "@types/estree@^1.0.1": version "1.0.5" resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.5.tgz#a6ce3e556e00fd9895dd872dd172ad0d4bd687f4" @@ -5631,11 +5240,6 @@ resolved "https://registry.yarnpkg.com/@types/http-assert/-/http-assert-1.5.3.tgz#ef8e3d1a8d46c387f04ab0f2e8ab8cb0c5078661" integrity sha512-FyAOrDuQmBi8/or3ns4rwPno7/9tJTijVW6aQQjK02+kOQ8zmoNg2XJtAuQhvQcy1ASJq38wirX5//9J1EqoUA== -"@types/http-cache-semantics@*": - version "4.0.4" - resolved "https://registry.yarnpkg.com/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz#b979ebad3919799c979b17c72621c0bc0a31c6c4" - integrity sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA== - "@types/http-errors@*": version "2.0.1" resolved "https://registry.yarnpkg.com/@types/http-errors/-/http-errors-2.0.1.tgz#20172f9578b225f6c7da63446f56d4ce108d5a65" @@ -5675,7 +5279,7 @@ expect "^29.0.0" pretty-format "^29.0.0" -"@types/json-schema@*", "@types/json-schema@^7.0.12", "@types/json-schema@^7.0.6", "@types/json-schema@^7.0.9": +"@types/json-schema@^7.0.12", "@types/json-schema@^7.0.6", "@types/json-schema@^7.0.9": version "7.0.15" resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== @@ -5697,13 +5301,6 @@ resolved "https://registry.yarnpkg.com/@types/keygrip/-/keygrip-1.0.2.tgz#513abfd256d7ad0bf1ee1873606317b33b1b2a72" integrity sha512-GJhpTepz2udxGexqos8wgaBx4I/zWIDPh/KOGEwAqtuGDkOUJu5eFvwmdBX4AmB8Odsr+9pHCQqiAqDL/yKMKw== -"@types/keyv@^3.1.4": - version "3.1.4" - resolved "https://registry.yarnpkg.com/@types/keyv/-/keyv-3.1.4.tgz#3ccdb1c6751b0c7e52300bcdacd5bcbf8faa75b6" - integrity sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg== - dependencies: - "@types/node" "*" - "@types/koa-compose@*": version "3.2.5" resolved "https://registry.yarnpkg.com/@types/koa-compose/-/koa-compose-3.2.5.tgz#85eb2e80ac50be95f37ccf8c407c09bbe3468e9d" @@ -5711,37 +5308,13 @@ dependencies: "@types/koa" "*" -"@types/koa-passport@^4.0.3": - version "4.0.3" - resolved "https://registry.yarnpkg.com/@types/koa-passport/-/koa-passport-4.0.3.tgz#063ec6310edee76cf854aadaa717b97f04b104fb" - integrity sha512-tNMYd/bcv0Zw7fc0CzEBYM9uUzVtn4XWzdUYfkTgSkEljP6nap7eI4E5x43ukrUQvztgXSYFkz3Uk+ujFeUzTg== - dependencies: - "@types/koa" "*" - "@types/passport" "*" - -"@types/koa-send@*", "@types/koa-send@^4.1.6": +"@types/koa-send@^4.1.6": version "4.1.6" resolved "https://registry.yarnpkg.com/@types/koa-send/-/koa-send-4.1.6.tgz#15d90e95e3ccce669a15b6a3c56c3a650a167cea" integrity sha512-vgnNGoOJkx7FrF0Jl6rbK1f8bBecqAchKpXtKuXzqIEdXTDO6dsSTjr+eZ5m7ltSjH4K/E7auNJEQCAd0McUPA== dependencies: "@types/koa" "*" -"@types/koa-session@^6.4.5": - version "6.4.5" - resolved "https://registry.yarnpkg.com/@types/koa-session/-/koa-session-6.4.5.tgz#ac10bac507f4bb722fa6c55c33607b5c8769f779" - integrity sha512-Vc6+fslnPuMH2v9y80WYeo39UMo8mweuNNthKCwYU2ZE6l5vnRrzRU3BRvexKwsoI5sxsRl5CxDsBlLI8kY/XA== - dependencies: - "@types/cookies" "*" - "@types/koa" "*" - -"@types/koa-static@^4.0.2": - version "4.0.4" - resolved "https://registry.yarnpkg.com/@types/koa-static/-/koa-static-4.0.4.tgz#ce6f2a5d14cc7ef19f9bf6ee8e4f3eadfcc77323" - integrity sha512-j1AUzzl7eJYEk9g01hNTlhmipFh8RFbOQmaMNLvLcNNAkPw0bdTs3XTa3V045XFlrWN0QYnblbDJv2RzawTn6A== - dependencies: - "@types/koa" "*" - "@types/koa-send" "*" - "@types/koa@*": version "2.13.5" resolved "https://registry.yarnpkg.com/@types/koa/-/koa-2.13.5.tgz#64b3ca4d54e08c0062e89ec666c9f45443b21a61" @@ -5770,13 +5343,6 @@ "@types/koa-compose" "*" "@types/node" "*" -"@types/koa__cors@^5.0.0": - version "5.0.0" - resolved "https://registry.yarnpkg.com/@types/koa__cors/-/koa__cors-5.0.0.tgz#74567a045b599266e2cd3940cef96cedecc2ef1f" - integrity sha512-LCk/n25Obq5qlernGOK/2LUwa/2YJb2lxHUkkvYFDOpLXlVI6tKcdfCHRBQnOY4LwH6el5WOLs6PD/a8Uzau6g== - dependencies: - "@types/koa" "*" - "@types/koa__router@8.0.8": version "8.0.8" resolved "https://registry.yarnpkg.com/@types/koa__router/-/koa__router-8.0.8.tgz#b1e0e9a512498777d3366bbdf0e853df27ec831c" @@ -5868,22 +5434,15 @@ dependencies: undici-types "~5.26.4" -"@types/node@>=4.2.0 < 13", "@types/node@^12.20.52": - version "12.20.55" - resolved "https://registry.yarnpkg.com/@types/node/-/node-12.20.55.tgz#c329cbd434c42164f846b909bd6f85b5537f6240" - integrity sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ== - "@types/node@>=8.0.0 <15": version "14.18.37" resolved "https://registry.yarnpkg.com/@types/node/-/node-14.18.37.tgz#0bfcd173e8e1e328337473a8317e37b3b14fd30d" integrity sha512-7GgtHCs/QZrBrDzgIJnQtuSvhFSwhyYSI2uafSwZoNt1iOGhEN5fwNrQMjtONyHm9+/LoA4453jH0CMYcr06Pg== -"@types/node@>=8.1.0": - version "22.0.0" - resolved "https://registry.yarnpkg.com/@types/node/-/node-22.0.0.tgz#04862a2a71e62264426083abe1e27e87cac05a30" - integrity sha512-VT7KSYudcPOzP5Q0wfbowyNLaVR8QWUdw+088uFWwfvpY6uCWaXpqV6ieLAu9WBcnTa7H4Z5RLK8I5t2FuOcqw== - dependencies: - undici-types "~6.11.1" +"@types/node@^12.20.52": + version "12.20.55" + resolved "https://registry.yarnpkg.com/@types/node/-/node-12.20.55.tgz#c329cbd434c42164f846b909bd6f85b5537f6240" + integrity sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ== "@types/node@^18.11.18": version "18.19.10" @@ -5892,25 +5451,11 @@ dependencies: undici-types "~5.26.4" -"@types/nodemailer@^6.4.4": - version "6.4.15" - resolved "https://registry.yarnpkg.com/@types/nodemailer/-/nodemailer-6.4.15.tgz#494be695e11c438f7f5df738fb4ab740312a6ed2" - integrity sha512-0EBJxawVNjPkng1zm2vopRctuWVCxk34JcIlRuXSf54habUWdz1FB7wHDqOqvDa8Mtpt0Q3LTXQkAs2LNyK5jQ== - dependencies: - "@types/node" "*" - "@types/normalize-package-data@^2.4.0": version "2.4.1" resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz#d3357479a0fdfdd5907fe67e17e0a85c906e1301" integrity sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw== -"@types/oauth@*": - version "0.9.5" - resolved "https://registry.yarnpkg.com/@types/oauth/-/oauth-0.9.5.tgz#acc4209bfa1c8d7d3aaf2c9ad0b32216a29616c1" - integrity sha512-+oQ3C2Zx6ambINOcdIARF5Z3Tu3x//HipE889/fqo3sgpQZbe9c6ExdQFtN6qlhpR7p83lTZfPJt0tCAW29dog== - dependencies: - "@types/node" "*" - "@types/oracledb@6.5.1": version "6.5.1" resolved "https://registry.yarnpkg.com/@types/oracledb/-/oracledb-6.5.1.tgz#17d021cabc9d216dfa6d3d65ae3ee585c33baab3" @@ -5918,37 +5463,6 @@ dependencies: "@types/node" "*" -"@types/passport-google-oauth@^1.0.42": - version "1.0.45" - resolved "https://registry.yarnpkg.com/@types/passport-google-oauth/-/passport-google-oauth-1.0.45.tgz#c986c787ec9706b4a596d2bae43342b50b54973d" - integrity sha512-O3Y3DDKnf9lR8+DSaUOCEGF6aFjVYdI8TLhQYtySZ3Sq75c5tGYJ0KJRDZw0GsyLD/Que0nqFkP/GnDVwZZL9w== - dependencies: - "@types/express" "*" - "@types/passport" "*" - -"@types/passport-microsoft@1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@types/passport-microsoft/-/passport-microsoft-1.0.0.tgz#a2ddc2200843570d38c35c53f6388e33df915b58" - integrity sha512-vD9ajSUc9Sz/8gdCj0ODUbPYQDxcI/imIDdgMPh//c5yMK/PgV6SNUXFLBzJo89Y30LU6bYAfXKn40WJqtMBiA== - dependencies: - "@types/passport-oauth2" "*" - -"@types/passport-oauth2@*": - version "1.4.17" - resolved "https://registry.yarnpkg.com/@types/passport-oauth2/-/passport-oauth2-1.4.17.tgz#d5d54339d44f6883d03e69dc0cc0e2114067abb4" - integrity sha512-ODiAHvso6JcWJ6ZkHHroVp05EHGhqQN533PtFNBkg8Fy5mERDqsr030AX81M0D69ZcaMvhF92SRckEk2B0HYYg== - dependencies: - "@types/express" "*" - "@types/oauth" "*" - "@types/passport" "*" - -"@types/passport@*": - version "1.0.16" - resolved "https://registry.yarnpkg.com/@types/passport/-/passport-1.0.16.tgz#5a2918b180a16924c4d75c31254c31cdca5ce6cf" - integrity sha512-FD0qD5hbPWQzaM0wHUnJ/T0BBCJBxCeemtnCwc/ThhTg3x9jfrAcRUmj5Dopza+MfFS9acTe3wk7rcVnRIp/0A== - dependencies: - "@types/express" "*" - "@types/pg@8.6.6": version "8.6.6" resolved "https://registry.yarnpkg.com/@types/pg/-/pg-8.6.6.tgz#21cdf873a3e345a6e78f394677e3b3b1b543cb80" @@ -6181,13 +5695,6 @@ resolved "https://registry.yarnpkg.com/@types/resolve/-/resolve-1.20.2.tgz#97d26e00cd4a0423b4af620abecf3e6f442b7975" integrity sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q== -"@types/responselike@^1.0.0": - version "1.0.3" - resolved "https://registry.yarnpkg.com/@types/responselike/-/responselike-1.0.3.tgz#cc29706f0a397cfe6df89debfe4bf5cea159db50" - integrity sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw== - dependencies: - "@types/node" "*" - "@types/retry@*": version "0.12.5" resolved "https://registry.yarnpkg.com/@types/retry/-/retry-0.12.5.tgz#f090ff4bd8d2e5b940ff270ab39fd5ca1834a07e" @@ -6218,13 +5725,6 @@ dependencies: "@types/node" "*" -"@types/server-destroy@^1.0.1": - version "1.0.3" - resolved "https://registry.yarnpkg.com/@types/server-destroy/-/server-destroy-1.0.3.tgz#2460932ea3a02a70ec99669c8f40ff089a5b8a2b" - integrity sha512-Qq0fn70C7TLDG1W9FCblKufNWW1OckQ41dVKV2Dku5KdZF7bexezG4e2WBaBKhdwL3HZ+cYCEIKwg2BRgzrWmA== - dependencies: - "@types/node" "*" - "@types/ssh2-streams@*": version "0.1.12" resolved "https://registry.yarnpkg.com/@types/ssh2-streams/-/ssh2-streams-0.1.12.tgz#e68795ba2bf01c76b93f9c9809e1f42f0eaaec5f" @@ -6326,7 +5826,7 @@ dependencies: "@types/node" "*" -"@types/uuid@8.3.4", "@types/uuid@^8.3.4": +"@types/uuid@8.3.4": version "8.3.4" resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-8.3.4.tgz#bd86a43617df0594787d38b735f55c805becf1bc" integrity sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw== @@ -6376,21 +5876,6 @@ dependencies: "@types/yargs-parser" "*" -"@typescript-eslint/eslint-plugin@7.18.0", "@typescript-eslint/eslint-plugin@^7.16.1": - version "7.18.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.18.0.tgz#b16d3cf3ee76bf572fdf511e79c248bdec619ea3" - integrity sha512-94EQTWZ40mzBc42ATNIBimBEDltSJ9RQHCC8vc/PDbxi4k8dVwUAv4o98dk50M1zB+JGFxp43FP7f8+FP8R6Sw== - dependencies: - "@eslint-community/regexpp" "^4.10.0" - "@typescript-eslint/scope-manager" "7.18.0" - "@typescript-eslint/type-utils" "7.18.0" - "@typescript-eslint/utils" "7.18.0" - "@typescript-eslint/visitor-keys" "7.18.0" - graphemer "^1.4.0" - ignore "^5.3.1" - natural-compare "^1.4.0" - ts-api-utils "^1.3.0" - "@typescript-eslint/eslint-plugin@7.3.1": version "7.3.1" resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.3.1.tgz#0d8f38a6c8a1802139e62184ee7a68ed024f30a1" @@ -6419,17 +5904,6 @@ "@typescript-eslint/visitor-keys" "6.9.0" debug "^4.3.4" -"@typescript-eslint/parser@7.18.0", "@typescript-eslint/parser@^7.16.1": - version "7.18.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-7.18.0.tgz#83928d0f1b7f4afa974098c64b5ce6f9051f96a0" - integrity sha512-4Z+L8I2OqhZV8qA132M4wNL30ypZGYOQVBfMgxDH/K5UX0PNqTu1c6za9ST5r9+tavvHiTWmBnKzpCJ/GlVFtg== - dependencies: - "@typescript-eslint/scope-manager" "7.18.0" - "@typescript-eslint/types" "7.18.0" - "@typescript-eslint/typescript-estree" "7.18.0" - "@typescript-eslint/visitor-keys" "7.18.0" - debug "^4.3.4" - "@typescript-eslint/parser@7.3.1": version "7.3.1" resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-7.3.1.tgz#c4ba7dc2744318a5e4506596cbc3a0086255c526" @@ -6457,14 +5931,6 @@ "@typescript-eslint/types" "6.9.0" "@typescript-eslint/visitor-keys" "6.9.0" -"@typescript-eslint/scope-manager@7.18.0": - version "7.18.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-7.18.0.tgz#c928e7a9fc2c0b3ed92ab3112c614d6bd9951c83" - integrity sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA== - dependencies: - "@typescript-eslint/types" "7.18.0" - "@typescript-eslint/visitor-keys" "7.18.0" - "@typescript-eslint/scope-manager@7.3.1": version "7.3.1" resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-7.3.1.tgz#73fd0cb4211a7be23e49e5b6efec8820caa6ec36" @@ -6473,16 +5939,6 @@ "@typescript-eslint/types" "7.3.1" "@typescript-eslint/visitor-keys" "7.3.1" -"@typescript-eslint/type-utils@7.18.0", "@typescript-eslint/type-utils@^7.2.0": - version "7.18.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-7.18.0.tgz#2165ffaee00b1fbbdd2d40aa85232dab6998f53b" - integrity sha512-XL0FJXuCLaDuX2sYqZUUSOJ2sG5/i1AAze+axqmLnSkNEVMVYLF+cbwlB2w8D1tinFuSikHmFta+P+HOofrLeA== - dependencies: - "@typescript-eslint/typescript-estree" "7.18.0" - "@typescript-eslint/utils" "7.18.0" - debug "^4.3.4" - ts-api-utils "^1.3.0" - "@typescript-eslint/type-utils@7.3.1": version "7.3.1" resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-7.3.1.tgz#cbf90d3d7e788466aa8a5c0ab3f46103f098aa0d" @@ -6508,11 +5964,6 @@ resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-6.9.0.tgz#86a0cbe7ac46c0761429f928467ff3d92f841098" integrity sha512-+KB0lbkpxBkBSiVCuQvduqMJy+I1FyDbdwSpM3IoBS7APl4Bu15lStPjgBIdykdRqQNYqYNMa8Kuidax6phaEw== -"@typescript-eslint/types@7.18.0": - version "7.18.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-7.18.0.tgz#b90a57ccdea71797ffffa0321e744f379ec838c9" - integrity sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ== - "@typescript-eslint/types@7.3.1": version "7.3.1" resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-7.3.1.tgz#ae104de8efa4227a462c0874d856602c5994413c" @@ -6544,20 +5995,6 @@ semver "^7.5.4" ts-api-utils "^1.0.1" -"@typescript-eslint/typescript-estree@7.18.0": - version "7.18.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-7.18.0.tgz#b5868d486c51ce8f312309ba79bdb9f331b37931" - integrity sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA== - dependencies: - "@typescript-eslint/types" "7.18.0" - "@typescript-eslint/visitor-keys" "7.18.0" - debug "^4.3.4" - globby "^11.1.0" - is-glob "^4.0.3" - minimatch "^9.0.4" - semver "^7.6.0" - ts-api-utils "^1.3.0" - "@typescript-eslint/typescript-estree@7.3.1": version "7.3.1" resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-7.3.1.tgz#598848195fad34c7aa73f548bd00a4d4e5f5e2bb" @@ -6585,16 +6022,6 @@ semver "^7.3.5" tsutils "^3.21.0" -"@typescript-eslint/utils@7.18.0", "@typescript-eslint/utils@^7.3.1": - version "7.18.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-7.18.0.tgz#bca01cde77f95fc6a8d5b0dbcbfb3d6ca4be451f" - integrity sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw== - dependencies: - "@eslint-community/eslint-utils" "^4.4.0" - "@typescript-eslint/scope-manager" "7.18.0" - "@typescript-eslint/types" "7.18.0" - "@typescript-eslint/typescript-estree" "7.18.0" - "@typescript-eslint/utils@7.3.1": version "7.3.1" resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-7.3.1.tgz#fc28fd508ccf89495012561b7c02a6fdad162460" @@ -6646,14 +6073,6 @@ "@typescript-eslint/types" "6.9.0" eslint-visitor-keys "^3.4.1" -"@typescript-eslint/visitor-keys@7.18.0": - version "7.18.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-7.18.0.tgz#0564629b6124d67607378d0f0332a0495b25e7d7" - integrity sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg== - dependencies: - "@typescript-eslint/types" "7.18.0" - eslint-visitor-keys "^3.4.3" - "@typescript-eslint/visitor-keys@7.3.1": version "7.3.1" resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-7.3.1.tgz#6ddef14a3ce2a79690f01176f5305c34d7b93d8c" @@ -6676,23 +6095,6 @@ "@vitest/utils" "0.29.8" chai "^4.3.7" -"@vitest/expect@2.0.5": - version "2.0.5" - resolved "https://registry.yarnpkg.com/@vitest/expect/-/expect-2.0.5.tgz#f3745a6a2c18acbea4d39f5935e913f40d26fa86" - integrity sha512-yHZtwuP7JZivj65Gxoi8upUN2OzHTi3zVfjwdpu2WrvCZPLwsJ2Ey5ILIPccoW23dd/zQBlJ4/dhi7DWNyXCpA== - dependencies: - "@vitest/spy" "2.0.5" - "@vitest/utils" "2.0.5" - chai "^5.1.1" - tinyrainbow "^1.2.0" - -"@vitest/pretty-format@2.0.5", "@vitest/pretty-format@^2.0.5": - version "2.0.5" - resolved "https://registry.yarnpkg.com/@vitest/pretty-format/-/pretty-format-2.0.5.tgz#91d2e6d3a7235c742e1a6cc50e7786e2f2979b1e" - integrity sha512-h8k+1oWHfwTkyTkb9egzwNMfJAEx4veaPSnMeKbVSjp4euqGSbQlm5+6VHwTr7u4FJslVVsUG5nopCaAYdOmSQ== - dependencies: - tinyrainbow "^1.2.0" - "@vitest/runner@0.29.8": version "0.29.8" resolved "https://registry.yarnpkg.com/@vitest/runner/-/runner-0.29.8.tgz#ede8a7be8a074ea1180bc1d1595bd879ed15971c" @@ -6702,23 +6104,6 @@ p-limit "^4.0.0" pathe "^1.1.0" -"@vitest/runner@2.0.5": - version "2.0.5" - resolved "https://registry.yarnpkg.com/@vitest/runner/-/runner-2.0.5.tgz#89197e712bb93513537d6876995a4843392b2a84" - integrity sha512-TfRfZa6Bkk9ky4tW0z20WKXFEwwvWhRY+84CnSEtq4+3ZvDlJyY32oNTJtM7AW9ihW90tX/1Q78cb6FjoAs+ig== - dependencies: - "@vitest/utils" "2.0.5" - pathe "^1.1.2" - -"@vitest/snapshot@2.0.5": - version "2.0.5" - resolved "https://registry.yarnpkg.com/@vitest/snapshot/-/snapshot-2.0.5.tgz#a2346bc5013b73c44670c277c430e0334690a162" - integrity sha512-SgCPUeDFLaM0mIUHfaArq8fD2WbaXG/zVXjRupthYfYGzc8ztbFbu6dUNOblBG7XLMR1kEhS/DNnfCZ2IhdDew== - dependencies: - "@vitest/pretty-format" "2.0.5" - magic-string "^0.30.10" - pathe "^1.1.2" - "@vitest/spy@0.29.8": version "0.29.8" resolved "https://registry.yarnpkg.com/@vitest/spy/-/spy-0.29.8.tgz#2e0c3b30e04d317b2197e3356234448aa432e131" @@ -6726,13 +6111,6 @@ dependencies: tinyspy "^1.0.2" -"@vitest/spy@2.0.5": - version "2.0.5" - resolved "https://registry.yarnpkg.com/@vitest/spy/-/spy-2.0.5.tgz#590fc07df84a78b8e9dd976ec2090920084a2b9f" - integrity sha512-c/jdthAhvJdpfVuaexSrnawxZz6pywlTPe84LUB2m/4t3rl2fTo9NFGBG4oWgaD+FTgDDV8hJ/nibT7IfH3JfA== - dependencies: - tinyspy "^3.0.0" - "@vitest/utils@0.29.8": version "0.29.8" resolved "https://registry.yarnpkg.com/@vitest/utils/-/utils-0.29.8.tgz#423da85fd0c6633f3ab496cf7d2fc0119b850df8" @@ -6743,16 +6121,6 @@ loupe "^2.3.6" pretty-format "^27.5.1" -"@vitest/utils@2.0.5": - version "2.0.5" - resolved "https://registry.yarnpkg.com/@vitest/utils/-/utils-2.0.5.tgz#6f8307a4b6bc6ceb9270007f73c67c915944e926" - integrity sha512-d8HKbqIcya+GR67mkZbrzhS5kKhtp8dQLcmRZLGTscGVg7yImT82cIrhtn2L8+VujWcy6KZweApgNmPsTAO/UQ== - dependencies: - "@vitest/pretty-format" "2.0.5" - estree-walker "^3.0.3" - loupe "^3.1.1" - tinyrainbow "^1.2.0" - "@yarnpkg/lockfile@^1.1.0": version "1.1.0" resolved "https://registry.yarnpkg.com/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz#e77a97fbd345b76d83245edcd17d393b1b41fb31" @@ -6818,7 +6186,7 @@ abortcontroller-polyfill@^1.4.0: resolved "https://registry.yarnpkg.com/abortcontroller-polyfill/-/abortcontroller-polyfill-1.7.5.tgz#6738495f4e901fbb57b6c0611d0c75f76c485bed" integrity sha512-JMJ5soJWP18htbbxJjG7bG6yuI6pRhgJ0scHHTfkUjf6wjP912xZWvM+A4sJK3gqd9E8fcPbDnOefbA9Th/FIQ== -abstract-leveldown@^6.2.1, abstract-leveldown@^6.3.0: +abstract-leveldown@^6.2.1: version "6.3.0" resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-6.3.0.tgz#d25221d1e6612f820c35963ba4bd739928f6026a" integrity sha512-TU5nlYgta8YrBMNpc9FwQzRbiXsj49gsALsXadbGHt9CROPzX5fB0rWDR5mtdpOOKa5XqRFpbj1QroPAoPzVjQ== @@ -6883,39 +6251,22 @@ acorn-import-assertions@^1.9.0: resolved "https://registry.yarnpkg.com/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz#507276249d684797c84e0734ef84860334cfb1ac" integrity sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA== -acorn-jsx-walk@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/acorn-jsx-walk/-/acorn-jsx-walk-2.0.0.tgz#a5ed648264e68282d7c2aead80216bfdf232573a" - integrity sha512-uuo6iJj4D4ygkdzd6jPtcxs8vZgDX9YFIkqczGImoypX2fQ4dVImmu3UzA4ynixCIMTrEOWW+95M2HuBaCEOVA== - -acorn-jsx@5.3.2, acorn-jsx@^5.3.2: +acorn-jsx@^5.3.2: version "5.3.2" resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== -acorn-loose@8.4.0: - version "8.4.0" - resolved "https://registry.yarnpkg.com/acorn-loose/-/acorn-loose-8.4.0.tgz#26d3e219756d1e180d006f5bcc8d261a28530f55" - integrity sha512-M0EUka6rb+QC4l9Z3T0nJEzNOO7JcoJlYMrBlyBCiFSXRyxjLKayd4TbQs2FDRWQU1h9FR7QVNHt+PEaoNL5rQ== - dependencies: - acorn "^8.11.0" - -acorn-walk@8.3.3, acorn-walk@^8.0.2, acorn-walk@^8.1.1, acorn-walk@^8.2.0: - version "8.3.3" - resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.3.3.tgz#9caeac29eefaa0c41e3d4c65137de4d6f34df43e" - integrity sha512-MxXdReSRhGO7VlFe1bRG/oI7/mdLV9B9JJT0N8vZOhF7gFRR5l3M8W9G8JxmKV+JC5mGqJ0QvqfSOLsCPa4nUw== - dependencies: - acorn "^8.11.0" - acorn-walk@^7.1.1: version "7.2.0" resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.2.0.tgz#0de889a601203909b0fbe07b8938dc21d2e967bc" integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA== -acorn@8.12.1, acorn@^8.12.0: - version "8.12.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.12.1.tgz#71616bdccbe25e27a54439e0046e89ca76df2248" - integrity sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg== +acorn-walk@^8.0.2, acorn-walk@^8.1.1, acorn-walk@^8.2.0: + version "8.3.3" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.3.3.tgz#9caeac29eefaa0c41e3d4c65137de4d6f34df43e" + integrity sha512-MxXdReSRhGO7VlFe1bRG/oI7/mdLV9B9JJT0N8vZOhF7gFRR5l3M8W9G8JxmKV+JC5mGqJ0QvqfSOLsCPa4nUw== + dependencies: + acorn "^8.11.0" acorn@^5.2.1, acorn@^5.7.3: version "5.7.4" @@ -6984,16 +6335,6 @@ ajv-formats@^2.0.2: dependencies: ajv "^8.0.0" -ajv@8.17.1: - version "8.17.1" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.17.1.tgz#37d9a5c776af6bc92d7f4f9510eba4c0a60d11a6" - integrity sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g== - dependencies: - fast-deep-equal "^3.1.3" - fast-uri "^3.0.1" - json-schema-traverse "^1.0.0" - require-from-string "^2.0.2" - ajv@^6.12.3, ajv@^6.12.4: version "6.12.6" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" @@ -7408,11 +6749,6 @@ assertion-error@^1.1.0: resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b" integrity sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw== -assertion-error@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-2.0.1.tgz#f641a196b335690b1070bf00b6e7593fec190bf7" - integrity sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA== - ast-module-types@^2.7.1: version "2.7.1" resolved "https://registry.yarnpkg.com/ast-module-types/-/ast-module-types-2.7.1.tgz#3f7989ef8dfa1fdb82dfe0ab02bdfc7c77a57dd3" @@ -7440,13 +6776,6 @@ async-retry@^1.3.3: dependencies: retry "0.13.1" -async@^2.6.3: - version "2.6.4" - resolved "https://registry.yarnpkg.com/async/-/async-2.6.4.tgz#706b7ff6084664cd7eae713f6f965433b5504221" - integrity sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA== - dependencies: - lodash "^4.17.14" - async@^3.2.1, async@^3.2.3, async@^3.2.4: version "3.2.5" resolved "https://registry.yarnpkg.com/async/-/async-3.2.5.tgz#ebd52a8fdaf7a2289a24df399f8d8485c8a46b66" @@ -7750,11 +7079,6 @@ big-integer@^1.6.43: resolved "https://registry.yarnpkg.com/big-integer/-/big-integer-1.6.51.tgz#0df92a5d9880560d3ff2d5fd20245c889d130686" integrity sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg== -big.js@^5.2.2: - version "5.2.2" - resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" - integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== - bignumber.js@^2.4.0: version "2.4.0" resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-2.4.0.tgz#838a992da9f9d737e0f4b2db0be62bb09dd0c5e8" @@ -7839,11 +7163,6 @@ boolean@^3.0.1: resolved "https://registry.yarnpkg.com/boolean/-/boolean-3.2.0.tgz#9e5294af4e98314494cbb17979fa54ca159f116b" integrity sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw== -bottleneck@^2.19.5: - version "2.19.5" - resolved "https://registry.yarnpkg.com/bottleneck/-/bottleneck-2.19.5.tgz#5df0b90f59fd47656ebe63c78a98419205cadd91" - integrity sha512-VHiNCbI1lKdl44tGrhNfU3lup0Tj/ZBMJB5/2ZbNXRCPuRCO7ed2mgcK4r17y+KB2EfuYuRaVlwNbAeaWGSpbw== - bowser@^2.11.0: version "2.11.0" resolved "https://registry.yarnpkg.com/bowser/-/bowser-2.11.0.tgz#5ca3c35757a7aa5771500c70a73a9f91ef420a8f" @@ -7993,11 +7312,6 @@ bson@^6.7.0: resolved "https://registry.yarnpkg.com/bson/-/bson-6.8.0.tgz#5063c41ba2437c2b8ff851b50d9e36cb7aaa7525" integrity sha512-iOJg8pr7wq2tg/zSlCCHMi3hMm5JTOxLTagf3zxhcenHsFp+c6uOs6K7W5UE7A4QIJGtqh/ZovFNMP4mOPJynQ== -btoa@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/btoa/-/btoa-1.2.1.tgz#01a9909f8b2c93f6bf680ba26131eb30f7fa3d73" - integrity sha512-SB4/MIGlsiVkMcHmT+pSmIPoNDoHg+7cMzmt3Uxt628MTz2487DKSqK/fuhFBrkuqrYv5UCEnACpF4dTFNKc/g== - buffer-alloc-unsafe@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz#bd7dc26ae2972d0eda253be061dba992349c19f0" @@ -8201,11 +7515,6 @@ cache-content-type@^1.0.0: mime-types "^2.1.18" ylru "^1.2.0" -cacheable-lookup@^5.0.3: - version "5.0.4" - resolved "https://registry.yarnpkg.com/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz#5a6b865b2c44357be3d5ebc2a467b032719a7005" - integrity sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA== - cacheable-request@^2.1.1: version "2.1.4" resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-2.1.4.tgz#0d808801b6342ad33c91df9d0b44dc09b91e5c3d" @@ -8232,19 +7541,6 @@ cacheable-request@^6.0.0: normalize-url "^4.1.0" responselike "^1.0.2" -cacheable-request@^7.0.2: - version "7.0.4" - resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-7.0.4.tgz#7a33ebf08613178b403635be7b899d3e69bbe817" - integrity sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg== - dependencies: - clone-response "^1.0.2" - get-stream "^5.1.0" - http-cache-semantics "^4.0.0" - keyv "^4.0.0" - lowercase-keys "^2.0.0" - normalize-url "^6.0.1" - responselike "^2.0.0" - call-bind@^1.0.2, call-bind@^1.0.5, call-bind@^1.0.6, call-bind@^1.0.7: version "1.0.7" resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.7.tgz#06016599c40c56498c18769d2730be242b6fa3b9" @@ -8318,17 +7614,6 @@ chai@^4.3.7: pathval "^1.1.1" type-detect "^4.0.8" -chai@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/chai/-/chai-5.1.1.tgz#f035d9792a22b481ead1c65908d14bb62ec1c82c" - integrity sha512-pT1ZgP8rPNqUgieVaEY+ryQr6Q4HXNg8Ei9UnLUrjN4IA7dvQC5JB+/kxVcPNDHyBcc/26CXPkbNzq3qwrOEKA== - dependencies: - assertion-error "^2.0.1" - check-error "^2.1.1" - deep-eql "^5.0.1" - loupe "^3.1.0" - pathval "^2.0.0" - chalk@4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.0.tgz#4e14870a618d9e2edd97dd8345fd9d9dc315646a" @@ -8382,7 +7667,7 @@ charenc@0.0.2: resolved "https://registry.yarnpkg.com/charenc/-/charenc-0.0.2.tgz#c0a1d2f3a7092e03774bfa83f14c0fc5790a8667" integrity sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA== -cheap-watch@^1.0.2, cheap-watch@^1.0.4: +cheap-watch@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/cheap-watch/-/cheap-watch-1.0.4.tgz#0bcb4a3a8fbd9d5327936493f6b56baa668d8fef" integrity sha512-QR/9FrtRL5fjfUJBhAKCdi0lSRQ3rVRRum3GF9wDKp2TJbEIMGhUEr2yU8lORzm9Isdjx7/k9S0DFDx+z5VGtw== @@ -8394,11 +7679,6 @@ check-error@^1.0.3: dependencies: get-func-name "^2.0.2" -check-error@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/check-error/-/check-error-2.1.1.tgz#87eb876ae71ee388fa0471fe423f494be1d96ccc" - integrity sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw== - chokidar@3.5.3, chokidar@^3.5.2, chokidar@^3.5.3: version "3.5.3" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" @@ -8695,11 +7975,6 @@ combos@^0.2.0: resolved "https://registry.yarnpkg.com/combos/-/combos-0.2.0.tgz#dc31c5a899b42293d55fe19c064d3e6e207ba4f7" integrity sha512-Z6YfvgiTCERWJTj3wQiXamFhssdvz1n4ok447rS330lw3uL72WAx8IvrLU7xiE71uyb5WF8JEP+BWB5KhOoGeg== -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@6.2.0: version "6.2.0" resolved "https://registry.yarnpkg.com/commander/-/commander-6.2.0.tgz#b990bfb8ac030aedc6d11bc04d1488ffef56db75" @@ -8725,7 +8000,7 @@ commander@^5.1.0: resolved "https://registry.yarnpkg.com/commander/-/commander-5.1.0.tgz#46abbd1652f8e059bddaef99bbdcb2ad9cf179ae" integrity sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg== -commander@^7.1.0, commander@^7.2.0: +commander@^7.2.0: version "7.2.0" resolved "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7" integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== @@ -8855,7 +8130,7 @@ config-chain@^1.1.13: ini "^1.3.4" proto-list "~1.2.1" -configent@^2.1.4, configent@^2.2.0: +configent@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/configent/-/configent-2.2.0.tgz#2de230fc43f22c47cfd99016aa6962d6f9546994" integrity sha512-yIN6zfOWk2nycNJ2JFNiWEai0oiqAhISIht8+pbEBP8bdcpwoQ74AhCZPbUv9aRVJwo7wh1MbCBDUV44UJa7Kw== @@ -8884,14 +8159,6 @@ console-control-strings@^1.0.0, console-control-strings@^1.1.0: resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" integrity sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ== -console-stamp@^3.0.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/console-stamp/-/console-stamp-3.1.2.tgz#35dac393e16069a4d9d37b71ca6d5d13d7f3f8fd" - integrity sha512-ab66x3NxOTxPuq71dI6gXEiw2X6ql4Le5gZz0bm7FW3FSCB00eztra/oQUuCoCGlsyKOxtULnHwphzMrRtzMBg== - dependencies: - chalk "^4.1.2" - dateformat "^4.6.3" - consolidate@^0.16.0: version "0.16.0" resolved "https://registry.yarnpkg.com/consolidate/-/consolidate-0.16.0.tgz#a11864768930f2f19431660a65906668f5fbdc16" @@ -9444,11 +8711,6 @@ dayjs@^1.10.8: resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.11.tgz#dfe0e9d54c5f8b68ccf8ca5f72ac603e7e5ed59e" integrity sha512-okzr3f11N6WuqYtZSvm+F776mB41wRZMhKP+hc34YdW+KmtYYK9iqvHSwo2k9FEH3fhGXvOPV6yz2IcSrfRUDg== -dayjs@^1.8.15: - version "1.11.12" - resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.12.tgz#5245226cc7f40a15bf52e0b99fd2a04669ccac1d" - integrity sha512-Rt2g+nTbLlDWZTwwrIXjy9MeiZmSDI375FvZs72ngxx8PDC6YXOeR3q5LAuPzjZQxhiWdRKac7RKV+YyQYfYIg== - dc-polyfill@^0.1.2: version "0.1.3" resolved "https://registry.yarnpkg.com/dc-polyfill/-/dc-polyfill-0.1.3.tgz#fe9eefc86813439dd46d6f9ad9582ec079c39720" @@ -9512,13 +8774,6 @@ debug@^3.1.0, debug@^3.2.6, debug@^3.2.7: dependencies: ms "^2.1.1" -debug@^4.3.5: - version "4.3.6" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.6.tgz#2ab2c38fbaffebf8aa95fdfe6d88438c7a13c52b" - integrity sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg== - dependencies: - ms "2.1.2" - debuglog@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/debuglog/-/debuglog-1.0.1.tgz#aa24ffb9ac3df9a2351837cfb2d279360cd78492" @@ -9631,11 +8886,6 @@ deep-eql@^4.1.3: dependencies: type-detect "^4.0.0" -deep-eql@^5.0.1: - version "5.0.2" - resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-5.0.2.tgz#4b756d8d770a9257300825d52a2c2cff99c3a341" - integrity sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q== - deep-equal@^2.0.5: version "2.2.0" resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-2.2.0.tgz#5caeace9c781028b9ff459f33b779346637c43e6" @@ -9674,11 +8924,6 @@ deep-is@^0.1.3, deep-is@~0.1.3: resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== -deepmerge-ts@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/deepmerge-ts/-/deepmerge-ts-5.1.0.tgz#c55206cc4c7be2ded89b9c816cf3608884525d7a" - integrity sha512-eS8dRJOckyo9maw9Tu5O5RUi/4inFLrnoLkBe3cPfDMx3WZioXtmOew4TXQaxq7Rhl4xjDtR7c6x8nNTxOvbFw== - deepmerge@^4.2.2: version "4.3.1" resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a" @@ -9696,11 +8941,6 @@ defer-to-connect@^1.0.1: resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-1.1.3.tgz#331ae050c08dcf789f8c83a7b81f0ed94f4ac591" integrity sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ== -defer-to-connect@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-2.0.1.tgz#8016bdb4143e4632b77a3449c6236277de520587" - integrity sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg== - deferred-leveldown@~0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/deferred-leveldown/-/deferred-leveldown-0.2.0.tgz#2cef1f111e1c57870d8bbb8af2650e587cd2f5b4" @@ -9744,11 +8984,6 @@ defined@^1.0.0: resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.1.tgz#c0b9db27bfaffd95d6f61399419b893df0f91ebf" integrity sha512-hsBd2qSVCRE+5PmNdHt1uzyrFu5d3RwmFDKzyNZMFq/EwDNJF7Ee5+D5oEKF0hU6LhtoUF1macFvOe4AskQC1Q== -defined@~0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/defined/-/defined-0.0.0.tgz#f35eea7d705e933baf13b2f03b3f83d921403b3e" - integrity sha512-zpqiCT8bODLu3QSmLLic8xJnYWBFjOSu/fBCm189oAiTtPq/PSanNACKZDS7kgSyCJY7P+IcODzlIogBK/9RBg== - delay@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/delay/-/delay-5.0.0.tgz#137045ef1b96e5071060dd5be60bf9334436bd1d" @@ -9784,34 +9019,6 @@ depd@^1.1.0, depd@~1.1.2: resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" integrity sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ== -dependency-cruiser@^16.3.7: - version "16.3.10" - resolved "https://registry.yarnpkg.com/dependency-cruiser/-/dependency-cruiser-16.3.10.tgz#fe26a50d5e10a4496bc2b70d027fca6ded48814f" - integrity sha512-WkCnibHBfvaiaQ+S46LZ6h4AR6oj42Vsf5/0Vgtrwdwn7ZekMJdZ/ALoTwNp/RaGlKW+MbV/fhSZOvmhAWVWzQ== - dependencies: - acorn "8.12.1" - acorn-jsx "5.3.2" - acorn-jsx-walk "2.0.0" - acorn-loose "8.4.0" - acorn-walk "8.3.3" - ajv "8.17.1" - commander "12.1.0" - enhanced-resolve "5.17.1" - ignore "5.3.1" - interpret "^3.1.1" - is-installed-globally "1.0.0" - json5 "2.2.3" - memoize "10.0.0" - picocolors "1.0.1" - picomatch "4.0.2" - prompts "2.4.2" - rechoir "^0.8.0" - safe-regex "2.1.1" - semver "^7.6.3" - teamcity-service-messages "0.1.14" - tsconfig-paths-webpack-plugin "4.1.0" - watskeburt "4.1.0" - dependency-tree@^9.0.0: version "9.0.0" resolved "https://registry.yarnpkg.com/dependency-tree/-/dependency-tree-9.0.0.tgz#9288dd6daf35f6510c1ea30d9894b75369aa50a2" @@ -10072,13 +9279,6 @@ docker-compose@0.24.0: dependencies: yaml "^1.10.2" -docker-compose@^0.23.6: - version "0.23.19" - resolved "https://registry.yarnpkg.com/docker-compose/-/docker-compose-0.23.19.tgz#9947726e2fe67bdfa9e8efe1ff15aa0de2e10eb8" - integrity sha512-v5vNLIdUqwj4my80wxFDkNH+4S85zsRuH29SO7dCWVWPCMt/ohZBsGN6g6KXWifT0pzQ7uOxqEKCYCDPJ8Vz4g== - dependencies: - yaml "^1.10.2" - docker-compose@^0.24.6: version "0.24.6" resolved "https://registry.yarnpkg.com/docker-compose/-/docker-compose-0.24.6.tgz#d1f490a641bdb7ccc07c4d446b264f026f9a1f15" @@ -10287,24 +9487,6 @@ duplexify@^4.0.0, duplexify@^4.1.2: readable-stream "^3.1.1" stream-shift "^1.0.0" -dynalite@^3.2.1: - version "3.2.2" - resolved "https://registry.yarnpkg.com/dynalite/-/dynalite-3.2.2.tgz#34b4f4dd69638f17c0f7551a867959972c892441" - integrity sha512-sx9ZjTgMs/D4gHnba4rnBkw29648dHwHmywJet132KAbiq1ZyWx9W1fMd/eP9cPwTKDXyCBuTYOChE0qMDjaXQ== - dependencies: - async "^2.6.3" - big.js "^5.2.2" - buffer-crc32 "^0.2.13" - lazy "^1.0.11" - levelup "^4.4.0" - lock "^1.1.0" - memdown "^5.1.0" - minimist "^1.2.5" - once "^1.4.0" - subleveldown "^5.0.1" - optionalDependencies: - leveldown "^5.6.0" - eastasianwidth@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" @@ -10363,23 +9545,10 @@ electron-to-chromium@^1.4.284: resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.317.tgz#9a3d38a1a37f26a417d3d95dafe198ff11ed072b" integrity sha512-JhCRm9v30FMNzQSsjl4kXaygU+qHBD0Yh7mKxyjmF0V8VwYVB6qpBRX28GyAucrM9wDCpSUctT6FpMUQxbyKuA== -elliptic@^6.5.3: - version "6.5.4" - resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb" - integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ== - dependencies: - bn.js "^4.11.9" - brorand "^1.1.0" - hash.js "^1.0.0" - hmac-drbg "^1.0.1" - inherits "^2.0.4" - minimalistic-assert "^1.0.1" - minimalistic-crypto-utils "^1.0.1" - -elliptic@^6.5.5: - version "6.5.5" - resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.5.tgz#c715e09f78b6923977610d4c2346d6ce22e6dded" - integrity sha512-7EjbcmUm17NQFu4Pmgmq2olYMj8nwMnpcddByChSUjArp8F5DQWcIcpriwO4ZToLNAJig0yiyjswfyGNje/ixw== +elliptic@^6.5.3, elliptic@^6.5.5: + version "6.5.7" + resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.7.tgz#8ec4da2cb2939926a1b9a73619d768207e647c8b" + integrity sha512-ESVCtTwiA+XhY3wyh24QqRGBoP3rEdDUl3EDUUo9tft074fi19IrdpH7hLCMMP3CIj7jb3W96rn8lt/BqIlt5Q== dependencies: bn.js "^4.11.9" brorand "^1.1.0" @@ -10419,7 +9588,7 @@ encodeurl@^1.0.2: resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== -encoding-down@^6.2.0, encoding-down@^6.3.0: +encoding-down@^6.3.0: version "6.3.0" resolved "https://registry.yarnpkg.com/encoding-down/-/encoding-down-6.3.0.tgz#b1c4eb0e1728c146ecaef8e32963c549e76d082b" integrity sha512-QKrV0iKR6MZVJV08QY0wp1e7vF6QbhnbQhb07bwpEyuz4uZiZgPlEGdkCROuFkUwdxlFaiPIhjyarH1ee/3vhw== @@ -10482,14 +9651,6 @@ engine.io@~6.5.2: engine.io-parser "~5.2.1" ws "~8.17.1" -enhanced-resolve@5.17.1, enhanced-resolve@^5.7.0: - version "5.17.1" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz#67bfbbcc2f81d511be77d686a90267ef7f898a15" - integrity sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg== - dependencies: - graceful-fs "^4.2.4" - tapable "^2.2.0" - enhanced-resolve@^5.8.3: version "5.14.1" resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.14.1.tgz#de684b6803724477a4af5d74ccae5de52c25f6b3" @@ -10530,11 +9691,6 @@ envinfo@7.8.1: resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.8.1.tgz#06377e3e5f4d379fea7ac592d5ad8927e0c4d475" integrity sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw== -err-code@^1.0.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/err-code/-/err-code-1.1.2.tgz#06e0116d3028f6aef4806849eb0ea6a748ae6960" - integrity sha512-CJAN+O0/yA1CKfRn9SXOGctSpEM7DCon/r/5r2eXFMY2zCCJBasFhcM5I+1kh3Ap11FsQCX+vGHceNPvpWKhoA== - err-code@^2.0.2: version "2.0.3" resolved "https://registry.yarnpkg.com/err-code/-/err-code-2.0.3.tgz#23c2f3b756ffdfc608d30e27c9a941024807e7f9" @@ -10693,11 +9849,6 @@ es6-error@^4.0.1, es6-error@^4.1.1: resolved "https://registry.yarnpkg.com/es6-error/-/es6-error-4.1.1.tgz#9e3af407459deed47e9a91f9b885a84eb05c561d" integrity sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg== -es6-promise@^4.2.4: - version "4.2.8" - resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.8.tgz#4eb21594c972bc40553d276e510539143db53e0a" - integrity sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w== - esbuild-node-externals@^1.14.0: version "1.14.0" resolved "https://registry.yarnpkg.com/esbuild-node-externals/-/esbuild-node-externals-1.14.0.tgz#fc2950c67a068dc2b538fd1381ad7d8e20a6f54d" @@ -10734,35 +9885,6 @@ esbuild@^0.18.10, esbuild@^0.18.17: "@esbuild/win32-ia32" "0.18.20" "@esbuild/win32-x64" "0.18.20" -esbuild@^0.21.3: - version "0.21.5" - resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.21.5.tgz#9ca301b120922959b766360d8ac830da0d02997d" - integrity sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw== - optionalDependencies: - "@esbuild/aix-ppc64" "0.21.5" - "@esbuild/android-arm" "0.21.5" - "@esbuild/android-arm64" "0.21.5" - "@esbuild/android-x64" "0.21.5" - "@esbuild/darwin-arm64" "0.21.5" - "@esbuild/darwin-x64" "0.21.5" - "@esbuild/freebsd-arm64" "0.21.5" - "@esbuild/freebsd-x64" "0.21.5" - "@esbuild/linux-arm" "0.21.5" - "@esbuild/linux-arm64" "0.21.5" - "@esbuild/linux-ia32" "0.21.5" - "@esbuild/linux-loong64" "0.21.5" - "@esbuild/linux-mips64el" "0.21.5" - "@esbuild/linux-ppc64" "0.21.5" - "@esbuild/linux-riscv64" "0.21.5" - "@esbuild/linux-s390x" "0.21.5" - "@esbuild/linux-x64" "0.21.5" - "@esbuild/netbsd-x64" "0.21.5" - "@esbuild/openbsd-x64" "0.21.5" - "@esbuild/sunos-x64" "0.21.5" - "@esbuild/win32-arm64" "0.21.5" - "@esbuild/win32-ia32" "0.21.5" - "@esbuild/win32-x64" "0.21.5" - escalade@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" @@ -10836,18 +9958,6 @@ eslint-module-utils@^2.8.0: dependencies: debug "^3.2.7" -eslint-plugin-functional@^6.6.3: - version "6.6.3" - resolved "https://registry.yarnpkg.com/eslint-plugin-functional/-/eslint-plugin-functional-6.6.3.tgz#85b895afb91835c5ffa2eb97f473fd4182aa5228" - integrity sha512-sVbbvNvwX3HVkXAykKyoNLv57r4DPF7f1sy+/8j4YtzLYVQPGljMUWv3T6Kd4lwnnjmcKuj0EkIbS+knL6P5jw== - dependencies: - "@typescript-eslint/utils" "^7.3.1" - deepmerge-ts "^5.1.0" - escape-string-regexp "^4.0.0" - is-immutable-type "^4.0.0" - semver "^7.6.0" - ts-api-utils "^1.3.0" - eslint-plugin-import@^2.26.0, eslint-plugin-import@^2.29.0: version "2.29.1" resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz#d45b37b5ef5901d639c15270d74d46d161150643" @@ -10917,14 +10027,6 @@ eslint-scope@^7.0.0, eslint-scope@^7.2.2: esrecurse "^4.3.0" estraverse "^5.2.0" -eslint-scope@^8.0.2: - version "8.0.2" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-8.0.2.tgz#5cbb33d4384c9136083a71190d548158fe128f94" - integrity sha512-6E4xmrTw5wtxnLA5wYL3WDfhZ/1bUBGOXV0zQvVRDOtrR8D0p6W7fs3JweNYhwRYeGvd/1CKX2se0/2s7Q/nJA== - dependencies: - esrecurse "^4.3.0" - estraverse "^5.2.0" - eslint-visitor-keys@^2.0.0, eslint-visitor-keys@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" @@ -10935,11 +10037,6 @@ eslint-visitor-keys@^3.0.0, eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4 resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== -eslint-visitor-keys@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-4.0.0.tgz#e3adc021aa038a2a8e0b2f8b0ce8f66b9483b1fb" - integrity sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw== - eslint@^8.52.0, eslint@^8.56.0: version "8.57.0" resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.57.0.tgz#c786a6fd0e0b68941aaf624596fb987089195668" @@ -10984,60 +10081,11 @@ eslint@^8.52.0, eslint@^8.56.0: strip-ansi "^6.0.1" text-table "^0.2.0" -eslint@^9.7.0: - version "9.9.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-9.9.0.tgz#8d214e69ae4debeca7ae97daebbefe462072d975" - integrity sha512-JfiKJrbx0506OEerjK2Y1QlldtBxkAlLxT5OEcRF8uaQ86noDe2k31Vw9rnSWv+MXZHj7OOUV/dA0AhdLFcyvA== - dependencies: - "@eslint-community/eslint-utils" "^4.2.0" - "@eslint-community/regexpp" "^4.11.0" - "@eslint/config-array" "^0.17.1" - "@eslint/eslintrc" "^3.1.0" - "@eslint/js" "9.9.0" - "@humanwhocodes/module-importer" "^1.0.1" - "@humanwhocodes/retry" "^0.3.0" - "@nodelib/fs.walk" "^1.2.8" - ajv "^6.12.4" - chalk "^4.0.0" - cross-spawn "^7.0.2" - debug "^4.3.2" - escape-string-regexp "^4.0.0" - eslint-scope "^8.0.2" - eslint-visitor-keys "^4.0.0" - espree "^10.1.0" - esquery "^1.5.0" - esutils "^2.0.2" - fast-deep-equal "^3.1.3" - file-entry-cache "^8.0.0" - find-up "^5.0.0" - glob-parent "^6.0.2" - ignore "^5.2.0" - imurmurhash "^0.1.4" - is-glob "^4.0.0" - is-path-inside "^3.0.3" - json-stable-stringify-without-jsonify "^1.0.1" - levn "^0.4.1" - lodash.merge "^4.6.2" - minimatch "^3.1.2" - natural-compare "^1.4.0" - optionator "^0.9.3" - strip-ansi "^6.0.1" - text-table "^0.2.0" - esm@^3.2.25: version "3.2.25" resolved "https://registry.yarnpkg.com/esm/-/esm-3.2.25.tgz#342c18c29d56157688ba5ce31f8431fbb795cc10" integrity sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA== -espree@^10.0.1, espree@^10.1.0: - version "10.1.0" - resolved "https://registry.yarnpkg.com/espree/-/espree-10.1.0.tgz#8788dae611574c0f070691f522e4116c5a11fc56" - integrity sha512-M1M6CpiE6ffoigIOWYO9UDP8TMUw9kqb21tf+08IgDYjCsOvCuDt4jQcZmoYxx+w7zlKw9/N0KXfto+I8/FrXA== - dependencies: - acorn "^8.12.0" - acorn-jsx "^5.3.2" - eslint-visitor-keys "^4.0.0" - espree@^9.0.0, espree@^9.6.0, espree@^9.6.1: version "9.6.1" resolved "https://registry.yarnpkg.com/espree/-/espree-9.6.1.tgz#a2a17b8e434690a5432f2f8018ce71d331a48c6f" @@ -11074,13 +10122,6 @@ esquery@^1.4.2: dependencies: estraverse "^5.1.0" -esquery@^1.5.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.6.0.tgz#91419234f804d852a82dceec3e16cdc22cf9dae7" - integrity sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg== - dependencies: - estraverse "^5.1.0" - esrecurse@^4.3.0: version "4.3.0" resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" @@ -11211,21 +10252,6 @@ execa@^5.0.0: signal-exit "^3.0.3" strip-final-newline "^2.0.0" -execa@^8.0.1: - version "8.0.1" - resolved "https://registry.yarnpkg.com/execa/-/execa-8.0.1.tgz#51f6a5943b580f963c3ca9c6321796db8cc39b8c" - integrity sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg== - dependencies: - cross-spawn "^7.0.3" - get-stream "^8.0.1" - human-signals "^5.0.0" - is-stream "^3.0.0" - merge-stream "^2.0.0" - npm-run-path "^5.1.0" - onetime "^6.0.0" - signal-exit "^4.1.0" - strip-final-newline "^3.0.0" - exif-parser@^0.1.12: version "0.1.12" resolved "https://registry.yarnpkg.com/exif-parser/-/exif-parser-0.1.12.tgz#58a9d2d72c02c1f6f02a0ef4a9166272b7760922" @@ -11366,11 +10392,6 @@ fast-text-encoding@^1.0.0: resolved "https://registry.yarnpkg.com/fast-text-encoding/-/fast-text-encoding-1.0.6.tgz#0aa25f7f638222e3396d72bf936afcf1d42d6867" integrity sha512-VhXlQgj9ioXCqGstD37E/HBeqEGV/qOD/kmbVG8h5xKBYvM1L3lR1Zn4555cQ8GkYbJa8aJSipLPndE1k6zK2w== -fast-uri@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/fast-uri/-/fast-uri-3.0.1.tgz#cddd2eecfc83a71c1be2cc2ef2061331be8a7134" - integrity sha512-MWipKbbYiYI0UC7cl8m/i/IWTqfC8YXsqjzybjddLsFjStroQzsHXkc73JutMvBiXmOvapk+axIl79ig5t55Bw== - fast-url-parser@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/fast-url-parser/-/fast-url-parser-1.1.3.tgz#f4af3ea9f34d8a271cf58ad2b3759f431f0b318d" @@ -11385,13 +10406,6 @@ fast-xml-parser@4.2.5: dependencies: strnum "^1.0.5" -fast-xml-parser@^4.1.3: - version "4.4.1" - resolved "https://registry.yarnpkg.com/fast-xml-parser/-/fast-xml-parser-4.4.1.tgz#86dbf3f18edf8739326447bcaac31b4ae7f6514f" - integrity sha512-xkjOecfnKGkSsOwtZ5Pz7Us/T6mrbPQrq0nh+aCO5V9nk5NLWmasAHumTKjiPJPWANe+kAZ84Jc8ooJkzZ88Sw== - dependencies: - strnum "^1.0.5" - fast-xml-parser@^4.2.2, fast-xml-parser@^4.2.5: version "4.4.0" resolved "https://registry.yarnpkg.com/fast-xml-parser/-/fast-xml-parser-4.4.0.tgz#341cc98de71e9ba9e651a67f41f1752d1441a501" @@ -11472,13 +10486,6 @@ file-entry-cache@^6.0.1: dependencies: flat-cache "^3.0.4" -file-entry-cache@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-8.0.0.tgz#7787bddcf1131bffb92636c69457bbc0edd6d81f" - integrity sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ== - dependencies: - flat-cache "^4.0.0" - file-type@^11.1.0: version "11.1.0" resolved "https://registry.yarnpkg.com/file-type/-/file-type-11.1.0.tgz#93780f3fed98b599755d846b99a1617a2ad063b8" @@ -11613,14 +10620,6 @@ flat-cache@^3.0.4: flatted "^3.1.0" rimraf "^3.0.2" -flat-cache@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-4.0.1.tgz#0ece39fcb14ee012f4b0410bd33dd9c1f011127c" - integrity sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw== - dependencies: - flatted "^3.2.9" - keyv "^4.5.4" - flat@^5.0.2: version "5.0.2" resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" @@ -11631,11 +10630,6 @@ flatted@^3.1.0: resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.5.tgz#76c8584f4fc843db64702a6bd04ab7a8bd666da3" integrity sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg== -flatted@^3.2.9: - version "3.3.1" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.1.tgz#21db470729a6734d4997002f439cb308987f567a" - integrity sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw== - flatten@^1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/flatten/-/flatten-1.0.3.tgz#c1283ac9f27b368abc1e36d1ff7b04501a30356b" @@ -11767,7 +10761,7 @@ fs-extra@^11.1.0, fs-extra@^11.1.1: jsonfile "^6.0.1" universalify "^2.0.0" -fs-extra@^9.0.0, fs-extra@^9.0.1, fs-extra@^9.1.0: +fs-extra@^9.0.0, fs-extra@^9.1.0: version "9.1.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== @@ -11796,7 +10790,7 @@ fs.realpath@^1.0.0: resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== -fsevents@^2.3.2, fsevents@~2.3.2, fsevents@~2.3.3: +fsevents@^2.3.2, fsevents@~2.3.2: version "2.3.3" resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== @@ -11816,7 +10810,7 @@ function.prototype.name@^1.1.6: es-abstract "^1.22.1" functions-have-names "^1.2.3" -functional-red-black-tree@^1.0.1, functional-red-black-tree@~1.0.1: +functional-red-black-tree@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= @@ -12037,11 +11031,6 @@ get-stream@^6.0.0: resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== -get-stream@^8.0.1: - version "8.0.1" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-8.0.1.tgz#def9dfd71742cd7754a7761ed43749a27d02eca2" - integrity sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA== - get-symbol-description@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.2.tgz#533744d5aa20aca4e079c8e5daf7fd44202821f5" @@ -12184,18 +11173,6 @@ glob@^10.0.0, glob@^10.2.2: minipass "^7.1.2" path-scurry "^1.11.1" -glob@^10.3.7: - version "10.4.5" - resolved "https://registry.yarnpkg.com/glob/-/glob-10.4.5.tgz#f4d9f0b90ffdbab09c9d77f5f29b4262517b0956" - integrity sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg== - dependencies: - foreground-child "^3.1.0" - jackspeak "^3.1.2" - minimatch "^9.0.4" - minipass "^7.1.2" - package-json-from-dist "^1.0.0" - path-scurry "^1.11.1" - glob@^5.0.15: version "5.0.15" resolved "https://registry.yarnpkg.com/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1" @@ -12252,13 +11229,6 @@ global-agent@3.0.0: semver "^7.3.2" serialize-error "^7.0.1" -global-directory@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/global-directory/-/global-directory-4.0.1.tgz#4d7ac7cfd2cb73f304c53b8810891748df5e361e" - integrity sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q== - dependencies: - ini "4.1.1" - global-dirs@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-3.0.1.tgz#0c488971f066baceda21447aecb1a8b911d22485" @@ -12286,11 +11256,6 @@ globals@^13.19.0: dependencies: type-fest "^0.20.2" -globals@^14.0.0: - version "14.0.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-14.0.0.tgz#898d7413c29babcf6bafe56fcadded858ada724e" - integrity sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ== - globalthis@^1.0.1, globalthis@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.3.tgz#5852882a52b80dc301b0660273e1ed082f0b6ccf" @@ -12394,23 +11359,6 @@ gopd@^1.0.1: dependencies: get-intrinsic "^1.1.3" -got@^11.8.6: - version "11.8.6" - resolved "https://registry.yarnpkg.com/got/-/got-11.8.6.tgz#276e827ead8772eddbcfc97170590b841823233a" - integrity sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g== - dependencies: - "@sindresorhus/is" "^4.0.0" - "@szmarczak/http-timer" "^4.0.5" - "@types/cacheable-request" "^6.0.1" - "@types/responselike" "^1.0.0" - cacheable-lookup "^5.0.3" - cacheable-request "^7.0.2" - decompress-response "^6.0.0" - http2-wrapper "^1.0.0-beta.5.2" - lowercase-keys "^2.0.0" - p-cancelable "^2.0.0" - responselike "^2.0.0" - got@^8.3.1: version "8.3.2" resolved "https://registry.yarnpkg.com/got/-/got-8.3.2.tgz#1d23f64390e97f776cac52e5b936e5f514d2e937" @@ -12810,14 +11758,6 @@ http-signature@~1.2.0: jsprim "^1.2.2" sshpk "^1.7.0" -http2-wrapper@^1.0.0-beta.5.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/http2-wrapper/-/http2-wrapper-1.0.3.tgz#b8f55e0c1f25d4ebd08b3b0c2c079f9590800b3d" - integrity sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg== - dependencies: - quick-lru "^5.1.1" - resolve-alpn "^1.0.0" - https-proxy-agent@^5.0.0, https-proxy-agent@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6" @@ -12839,11 +11779,6 @@ human-signals@^2.1.0: resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== -human-signals@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-5.0.0.tgz#42665a284f9ae0dade3ba41ebc37eb4b852f3a28" - integrity sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ== - humanize-ms@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/humanize-ms/-/humanize-ms-1.2.1.tgz#c46e3159a293f6b896da29316d8b6fe8bb79bbed" @@ -12856,11 +11791,6 @@ husky@^8.0.3: resolved "https://registry.yarnpkg.com/husky/-/husky-8.0.3.tgz#4936d7212e46d1dea28fef29bb3a108872cd9184" integrity sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg== -husky@^9.1.4: - version "9.1.4" - resolved "https://registry.yarnpkg.com/husky/-/husky-9.1.4.tgz#926fd19c18d345add5eab0a42b2b6d9a80259b34" - integrity sha512-bho94YyReb4JV7LYWRWxZ/xr6TtOTt8cMfmQ39MQYJ7f/YE268s3GdghGwi+y4zAeqewE5zYLvuhV0M0ijsDEA== - ical-generator@4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/ical-generator/-/ical-generator-4.1.0.tgz#2a336c951864c5583a2aa715d16f2edcdfd2d90b" @@ -12933,21 +11863,11 @@ ignore-walk@^6.0.0: dependencies: minimatch "^7.4.2" -ignore@5.3.1: - version "5.3.1" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.1.tgz#5073e554cd42c5b33b394375f538b8593e34d4ef" - integrity sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw== - ignore@^5.0.4, ignore@^5.2.0, ignore@^5.2.4: version "5.3.0" resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.0.tgz#67418ae40d34d6999c95ff56016759c718c82f78" integrity sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg== -ignore@^5.3.1: - version "5.3.2" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.2.tgz#3cd40e729f3643fd87cb04e50bf0eb722bc596f5" - integrity sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g== - image-q@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/image-q/-/image-q-4.0.0.tgz#31e075be7bae3c1f42a85c469b4732c358981776" @@ -12965,11 +11885,6 @@ immediate@~3.0.5: resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.0.6.tgz#9db1dbd0faf8de6fbe0f5dd5e56bb606280de69b" integrity sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ== -immediate@~3.2.3: - version "3.2.3" - resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.2.3.tgz#d140fa8f614659bd6541233097ddaac25cdd991c" - integrity sha512-RrGCXRm/fRVqMIhqXrGEX9rRADavPiDFSoMb/k64i9XMk8uH4r/Omi5Ctierj6XzNecwDbO4WuFbDD1zmpl3Tg== - import-cwd@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/import-cwd/-/import-cwd-3.0.0.tgz#20845547718015126ea9b3676b7592fb8bd4cf92" @@ -13068,11 +11983,6 @@ ini@2.0.0: resolved "https://registry.yarnpkg.com/ini/-/ini-2.0.0.tgz#e5fd556ecdd5726be978fa1001862eacb0a94bc5" integrity sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA== -ini@4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/ini/-/ini-4.1.1.tgz#d95b3d843b1e906e56d6747d5447904ff50ce7a1" - integrity sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g== - ini@^1.3.2, ini@^1.3.4, ini@^1.3.8, ini@~1.3.0: version "1.3.8" resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" @@ -13150,11 +12060,6 @@ interpret@^2.2.0: resolved "https://registry.yarnpkg.com/interpret/-/interpret-2.2.0.tgz#1a78a0b5965c40a5416d007ad6f50ad27c417df9" integrity sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw== -interpret@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/interpret/-/interpret-3.1.1.tgz#5be0ceed67ca79c6c4bc5cf0d7ee843dcea110c4" - integrity sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ== - into-stream@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/into-stream/-/into-stream-3.1.0.tgz#96fb0a936c12babd6ff1752a17d05616abd094c6" @@ -13331,11 +12236,6 @@ is-docker@^2.0.0, is-docker@^2.1.1: resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== -is-electron@^2.2.0: - version "2.2.2" - resolved "https://registry.yarnpkg.com/is-electron/-/is-electron-2.2.2.tgz#3778902a2044d76de98036f5dc58089ac4d80bb9" - integrity sha512-FO/Rhvz5tuw4MCWkpMzHFKWD2LsfHzIb7i6MdPYZ/KW7AlxawyLkqdy+jPZP1WubqEADE3O4FUENlJHDfQASRg== - is-extendable@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" @@ -13385,23 +12285,6 @@ is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: dependencies: is-extglob "^2.1.1" -is-immutable-type@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/is-immutable-type/-/is-immutable-type-4.0.0.tgz#d62ad1ff411eef8dfa3a87222960ec3b645db1a1" - integrity sha512-gyFBCXv+NikTs8/PGZhgjbMmFZQ5jvHGZIsVu6+/9Bk4K7imlWBIDN7hTr9fNioGzFg71I4YM3z8f0aKXarTAw== - dependencies: - "@typescript-eslint/type-utils" "^7.2.0" - ts-api-utils "^1.3.0" - ts-declaration-location "^1.0.0" - -is-installed-globally@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-1.0.0.tgz#08952c43758c33d815692392f7f8437b9e436d5a" - integrity sha512-K55T22lfpQ63N4KEN57jZUAaAYqYHEe8veb/TycJRk9DdSCLLcovXz/mL6mOnhQaZsQGwPhuFopdQIlqGSEjiQ== - dependencies: - global-directory "^4.0.1" - is-path-inside "^4.0.0" - is-installed-globally@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-0.4.0.tgz#9a0fd407949c30f86eb6959ef1b7994ed0b7b520" @@ -13489,11 +12372,6 @@ is-path-inside@^3.0.2, is-path-inside@^3.0.3: resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== -is-path-inside@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-4.0.0.tgz#805aeb62c47c1b12fc3fd13bfb3ed1e7430071db" - integrity sha512-lJJV/5dYS+RcL8uQdBDW9c9uWFLLBNRyFhnAKXw5tVqLlKZ4RMGZKv+YQ/IA3OhD+RpbJa1LLFM1FQPGyIXvOA== - is-plain-obj@^1.0.0, is-plain-obj@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" @@ -13604,11 +12482,6 @@ is-stream@^2.0.0, is-stream@^2.0.1: resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== -is-stream@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-3.0.0.tgz#e6bfd7aa6bef69f4f472ce9bb681e3e57b4319ac" - integrity sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA== - is-string@^1.0.5, is-string@^1.0.7: version "1.0.7" resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" @@ -13967,15 +12840,6 @@ jest-docblock@^29.7.0: dependencies: detect-newline "^3.0.0" -jest-dynalite@^3.6.1: - version "3.6.1" - resolved "https://registry.yarnpkg.com/jest-dynalite/-/jest-dynalite-3.6.1.tgz#8bae305a3c33d9a8036f563827b173b54a323ca5" - integrity sha512-MERtTt8Pj39vFmbItMC3YuIaqLf1kh/pJIE0DRcjeP/2Fa8Nni9IxwN6XWIMgXNbFKtlOM6ppH+Bsy0rWIdPiw== - dependencies: - "@aws/dynamodb-auto-marshaller" "^0.7.1" - dynalite "^3.2.1" - setimmediate "^1.0.5" - jest-each@^29.7.0: version "29.7.0" resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-29.7.0.tgz#162a9b3f2328bdd991beaabffbb74745e56577d1" @@ -14308,17 +13172,6 @@ joi@17.6.0: "@sideway/formula" "^3.0.0" "@sideway/pinpoint" "^2.0.0" -joi@^17.13.1: - version "17.13.3" - resolved "https://registry.yarnpkg.com/joi/-/joi-17.13.3.tgz#0f5cc1169c999b30d344366d384b12d92558bcec" - integrity sha512-otDA4ldcIx+ZXsKHWmp0YizCweVRZG96J10b0FevjfuncLO1oX59THoAmHkNubYJ+9gWsYsp5k8v4ib6oDv1fA== - dependencies: - "@hapi/hoek" "^9.3.0" - "@hapi/topo" "^5.1.0" - "@sideway/address" "^4.1.5" - "@sideway/formula" "^3.0.1" - "@sideway/pinpoint" "^2.0.0" - join-component@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/join-component/-/join-component-1.1.0.tgz#b8417b750661a392bee2c2537c68b2a9d4977cd5" @@ -14471,11 +13324,6 @@ json-buffer@3.0.0: resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.0.tgz#5b1f397afc75d677bde8bcfc0e47e1f9a3d9a898" integrity sha512-CuUqjv0FUZIdXkHPI8MezCnFCdaTAacej1TZYulLoAg1h/PhwkdXFN4V/gzY4g+fMBCOV2xF+rp7t2XD2ns/NQ== -json-buffer@3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" - integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== - json-format-highlight@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/json-format-highlight/-/json-format-highlight-1.0.4.tgz#2e44277edabcec79a3d2c84e984c62e2258037b9" @@ -14521,11 +13369,6 @@ json-stringify-safe@^5.0.1, json-stringify-safe@~5.0.1: resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" integrity sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA== -json5@2.2.3, json5@^2.2.1, json5@^2.2.2, json5@^2.2.3: - version "2.2.3" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" - integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== - json5@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.2.tgz#63d98d60f21b313b77c4d6da18bfa69d80e1d593" @@ -14533,6 +13376,11 @@ json5@^1.0.2: dependencies: minimist "^1.2.0" +json5@^2.2.1, json5@^2.2.2, json5@^2.2.3: + version "2.2.3" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" + integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== + jsonc-parser@3.2.0, jsonc-parser@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/jsonc-parser/-/jsonc-parser-3.2.0.tgz#31ff3f4c2b9793f89c67212627c51c6394f88e76" @@ -14628,11 +13476,6 @@ jws@^4.0.0: jwa "^2.0.0" safe-buffer "^5.0.1" -jwt-decode@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/jwt-decode/-/jwt-decode-4.0.0.tgz#2270352425fd413785b2faf11f6e755c5151bd4b" - integrity sha512-+KJGIyHgkGuIq3IEBNftfhW/LfWhXUIY6OmyVWjliu5KH1y0fw7VQ8YndE2O4qZdMSd9SqbnC8GOcZEy0Om7sA== - keygrip@~1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/keygrip/-/keygrip-1.1.0.tgz#871b1681d5e159c62a445b0c74b615e0917e7226" @@ -14654,13 +13497,6 @@ keyv@^3.0.0: dependencies: json-buffer "3.0.0" -keyv@^4.0.0, keyv@^4.5.4: - version "4.5.4" - resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" - integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== - dependencies: - json-buffer "3.0.1" - kill-port@^1.6.1: version "1.6.1" resolved "https://registry.yarnpkg.com/kill-port/-/kill-port-1.6.1.tgz#560fe79484583bdf3a5e908557dae614447618aa" @@ -14762,7 +13598,7 @@ koa-mount@^4.0.0: debug "^4.0.1" koa-compose "^4.1.0" -koa-passport@4.1.4, koa-passport@^4.1.4: +koa-passport@4.1.4: version "4.1.4" resolved "https://registry.yarnpkg.com/koa-passport/-/koa-passport-4.1.4.tgz#5f1665c1c2a37ace79af9f970b770885ca30ccfa" integrity sha512-dJBCkl4X+zdYxbI2V2OtoGy0PUenpvp2ZLLWObc8UJhsId0iQpTFT8RVcuA0709AL2txGwRHnSPoT1bYNGa6Kg== @@ -14803,7 +13639,7 @@ koa-send@5.0.1, koa-send@^5.0.0: http-errors "^1.7.3" resolve-path "^1.4.0" -koa-session@5.13.1, koa-session@^5.12.0: +koa-session@5.13.1: version "5.13.1" resolved "https://registry.yarnpkg.com/koa-session/-/koa-session-5.13.1.tgz#a47e39015a4b464e21e3e1e2deeca48eb83916ee" integrity sha512-TfYiun6xiFosyfIJKnEw0aoG5XmLIwM+K3OVWfkz84qY0NP2gbk0F/olRn0/Hrxq0f14s8amHVXeWyKYH3Cx3Q== @@ -14821,7 +13657,7 @@ koa-static@5.0.0, koa-static@^5.0.0: debug "^3.1.0" koa-send "^5.0.0" -koa-useragent@4.1.0, koa-useragent@^4.1.0: +koa-useragent@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/koa-useragent/-/koa-useragent-4.1.0.tgz#d3f128b552c6da3e5e9e9e9c887b2922b16e4468" integrity sha512-x/HUDZ1zAmNNh5hA9hHbPm9p3UVg2prlpHzxCXQCzbibrNS0kmj7MkCResCbAbG7ZT6FVxNSMjR94ZGamdMwxA== @@ -14921,11 +13757,6 @@ latest-version@^5.1.0: dependencies: package-json "^6.3.0" -lazy@^1.0.11: - version "1.0.11" - resolved "https://registry.yarnpkg.com/lazy/-/lazy-1.0.11.tgz#daa068206282542c088288e975c297c1ae77b690" - integrity sha512-Y+CjUfLmIpoUCCRl0ub4smrYtGGr5AOa2AKOaWelGHOGz33X/Y/KizefGqbkwfz44+cnq/+9habclf8vOmu2LA== - lazystream@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/lazystream/-/lazystream-1.0.1.tgz#494c831062f1f9408251ec44db1cba29242a2638" @@ -15119,13 +13950,6 @@ level-js@^5.0.0: inherits "^2.0.3" ltgt "^2.1.2" -level-option-wrap@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/level-option-wrap/-/level-option-wrap-1.1.0.tgz#ad20e68d9f3c22c8897531cc6aa7af596b1ed129" - integrity sha512-gQouC22iCqHuBLNl4BHxEZUxLvUKALAtT/Q0c6ziOxZQ8c02G/gyxHWNbLbxUzRNfMrRnbt6TZT3gNe8VBqQeg== - dependencies: - defined "~0.0.0" - level-packager@^5.1.0: version "5.1.1" resolved "https://registry.yarnpkg.com/level-packager/-/level-packager-5.1.1.tgz#323ec842d6babe7336f70299c14df2e329c18939" @@ -15174,7 +13998,7 @@ level@6.0.1: level-packager "^5.1.0" leveldown "^5.4.0" -leveldown@5.6.0, leveldown@^5.4.0, leveldown@^5.6.0: +leveldown@5.6.0, leveldown@^5.4.0: version "5.6.0" resolved "https://registry.yarnpkg.com/leveldown/-/leveldown-5.6.0.tgz#16ba937bb2991c6094e13ac5a6898ee66d3eee98" integrity sha512-iB8O/7Db9lPaITU1aA2txU/cBEXAt4vWwKQRrrWuS6XDgbP4QZGj9BL2aNbwb002atoQ/lIotJkfyzz+ygQnUQ== @@ -15183,7 +14007,7 @@ leveldown@5.6.0, leveldown@^5.4.0, leveldown@^5.6.0: napi-macros "~2.0.0" node-gyp-build "~4.1.0" -levelup@4.4.0, levelup@^4.3.2, levelup@^4.4.0: +levelup@4.4.0, levelup@^4.3.2: version "4.4.0" resolved "https://registry.yarnpkg.com/levelup/-/levelup-4.4.0.tgz#f89da3a228c38deb49c48f88a70fb71f01cafed6" integrity sha512-94++VFO3qN95cM/d6eBXvd894oJE0w3cInq9USsyQzzoJxmiYzPAocNcuGCPGGjoXqDVJcr3C1jzt1TSjyaiLQ== @@ -15356,11 +14180,6 @@ locate-path@^6.0.0: dependencies: p-locate "^5.0.0" -lock@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/lock/-/lock-1.1.0.tgz#53157499d1653b136ca66451071fca615703fa55" - integrity sha512-NZQIJJL5Rb9lMJ0Yl1JoVr9GSdo4HTPsUEWsSFzB8dE8DSoiLCVavWZPi7Rnlv/o73u6I24S/XYc/NmG4l8EKA== - lodash-es@^4.17.15, lodash-es@^4.17.21: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.21.tgz#43e626c46e6591b7750beb2b50117390c609e3ee" @@ -15501,7 +14320,7 @@ lodash.xor@^4.5.0: resolved "https://registry.yarnpkg.com/lodash.xor/-/lodash.xor-4.5.0.tgz#4d48ed7e98095b0632582ba714d3ff8ae8fb1db6" integrity sha512-sVN2zimthq7aZ5sPGXnSz32rZPuqcparVW50chJQe+mzTYV+IsxSsl/2gnkWWE2Of7K3myBQBqtLKOUEHJKRsQ== -lodash@4.17.21, lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.17.3, lodash@^4.7.0: +lodash@4.17.21, lodash@^4.17.11, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.17.3, lodash@^4.7.0: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== @@ -15548,11 +14367,6 @@ lookpath@1.1.0: resolved "https://registry.yarnpkg.com/lookpath/-/lookpath-1.1.0.tgz#932d68371a2f0b4a5644f03d6a2b4728edba96d2" integrity sha512-B9NM7XpVfkyWqfOBI/UW0kVhGw7pJztsduch+1wkbYDi90mYK6/InFul3lG0hYko/VEcVMARVBJ5daFRc5aKCw== -lossless-json@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/lossless-json/-/lossless-json-4.0.1.tgz#d45229e3abb213a0235812780ca894ea8c5b2c6b" - integrity sha512-l0L+ppmgPDnb+JGxNLndPtJZGNf6+ZmVaQzoxQm3u6TXmhdnsA+YtdVR8DjzZd/em58686CQhOFDPewfJ4l7MA== - loupe@^2.3.6: version "2.3.7" resolved "https://registry.yarnpkg.com/loupe/-/loupe-2.3.7.tgz#6e69b7d4db7d3ab436328013d37d1c8c3540c697" @@ -15560,13 +14374,6 @@ loupe@^2.3.6: dependencies: get-func-name "^2.0.1" -loupe@^3.1.0, loupe@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/loupe/-/loupe-3.1.1.tgz#71d038d59007d890e3247c5db97c1ec5a92edc54" - integrity sha512-edNu/8D5MKVfGVFRhFf8aAxiTM6Wumfz5XsaatSxlD3w4R1d/WEKUTydCdPGbl9K7QG/Ca3GnDV2sIKIpXRQcw== - dependencies: - get-func-name "^2.0.1" - lowercase-keys@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.0.tgz#4e3366b39e7f5457e35f1324bdf6f88d0bfc7306" @@ -15684,13 +14491,6 @@ magic-string@^0.26.7: dependencies: sourcemap-codec "^1.4.8" -magic-string@^0.30.10: - version "0.30.11" - resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.11.tgz#301a6f93b3e8c2cb13ac1a7a673492c0dfd12954" - integrity sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A== - dependencies: - "@jridgewell/sourcemap-codec" "^1.5.0" - magic-string@^0.30.3, magic-string@^0.30.4: version "0.30.10" resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.10.tgz#123d9c41a0cb5640c892b041d4cfb3bd0aa4b39e" @@ -15705,7 +14505,7 @@ make-dir@4.0.0: dependencies: semver "^7.5.3" -make-dir@^1.0.0, make-dir@^1.3.0: +make-dir@^1.0.0: version "1.3.0" resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.3.0.tgz#79c1033b80515bd6d24ec9933e860ca75ee27f0c" integrity sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ== @@ -15865,25 +14665,6 @@ memdown@1.4.1: ltgt "~2.2.0" safe-buffer "~5.1.1" -memdown@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/memdown/-/memdown-5.1.0.tgz#608e91a9f10f37f5b5fe767667a8674129a833cb" - integrity sha512-B3J+UizMRAlEArDjWHTMmadet+UKwHd3UjMgGBkZcKAxAYVPS9o0Yeiha4qvz7iGiL2Sb3igUft6p7nbFWctpw== - dependencies: - abstract-leveldown "~6.2.1" - functional-red-black-tree "~1.0.1" - immediate "~3.2.3" - inherits "~2.0.1" - ltgt "~2.2.0" - safe-buffer "~5.2.0" - -memoize@10.0.0: - version "10.0.0" - resolved "https://registry.yarnpkg.com/memoize/-/memoize-10.0.0.tgz#43fa66b2022363c7c50cf5dfab732a808a3d7147" - integrity sha512-H6cBLgsi6vMWOcCpvVCdFFnl3kerEXbrYh9q+lY6VXvQSmM6CkmV08VOwT+WE2tzIEqRPFfAq3fm4v/UIW6mSA== - dependencies: - mimic-function "^5.0.0" - memory-pager@^1.0.2: version "1.5.0" resolved "https://registry.yarnpkg.com/memory-pager/-/memory-pager-1.5.0.tgz#d8751655d22d384682741c972f2c3d6dfa3e66b5" @@ -15987,16 +14768,6 @@ mimic-fn@^2.0.0, mimic-fn@^2.1.0: resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== -mimic-fn@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-4.0.0.tgz#60a90550d5cb0b239cca65d893b1a53b29871ecc" - integrity sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw== - -mimic-function@^5.0.0: - version "5.0.1" - resolved "https://registry.yarnpkg.com/mimic-function/-/mimic-function-5.0.1.tgz#acbe2b3349f99b9deaca7fb70e48b83e94e67076" - integrity sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA== - mimic-response@^1.0.0, mimic-response@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b" @@ -16055,13 +14826,6 @@ minimatch@9.0.3: dependencies: brace-expansion "^2.0.1" -minimatch@^10.0.0: - version "10.0.1" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-10.0.1.tgz#ce0521856b453c86e25f2c4c0d03e6ff7ddc440b" - integrity sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ== - dependencies: - brace-expansion "^2.0.1" - minimatch@^5.0.1, minimatch@^5.1.0: version "5.1.6" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.6.tgz#1cfcb8cf5522ea69952cd2af95ae09477f122a96" @@ -16462,11 +15226,6 @@ neo-async@^2.6.2: resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== -neon-env@^0.1.3: - version "0.1.3" - resolved "https://registry.yarnpkg.com/neon-env/-/neon-env-0.1.3.tgz#071e86fde3c698e9314f057d209e0b79ddab16e9" - integrity sha512-Zo+L6Nm19gJrjyfhxn/ZDm8eIIDzr75o64ZhijBau4LNuhLzjEAteRg3gchIvgaN8XTo5BxN6iTNP5clZQ0agA== - nice-try@^1.0.4: version "1.0.5" resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" @@ -16520,7 +15279,7 @@ node-fetch@2.6.0, node-fetch@2.6.7, node-fetch@^2.6.0, node-fetch@^2.6.1, node-f dependencies: whatwg-url "^5.0.0" -node-forge@^1.2.1, node-forge@^1.3.1: +node-forge@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-1.3.1.tgz#be8da2af243b2417d5f646a770663a92b7e9ded3" integrity sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA== @@ -16606,11 +15365,6 @@ node-source-walk@^5.0.0: dependencies: "@babel/parser" "^7.0.0" -nodemailer@6.9.13: - version "6.9.13" - resolved "https://registry.yarnpkg.com/nodemailer/-/nodemailer-6.9.13.tgz#5b292bf1e92645f4852ca872c56a6ba6c4a3d3d6" - integrity sha512-7o38Yogx6krdoBf3jCAqnIN4oSQFx+fMa0I7dK1D+me9kBxx12D+/33wSb+fhOCtIxvYJ+4x4IMEhmhCKfAiOA== - nodemailer@6.9.9: version "6.9.9" resolved "https://registry.yarnpkg.com/nodemailer/-/nodemailer-6.9.9.tgz#4549bfbf710cc6addec5064dd0f19874d24248d9" @@ -16824,13 +15578,6 @@ npm-run-path@^4.0.1: dependencies: path-key "^3.0.0" -npm-run-path@^5.1.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-5.3.0.tgz#e23353d0ebb9317f174e93417e4a4d82d0249e9f" - integrity sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ== - dependencies: - path-key "^4.0.0" - npmlog@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-5.0.1.tgz#f06678e80e29419ad67ab964e0fa69959c1eb8b0" @@ -17100,13 +15847,6 @@ onetime@^5.1.0, onetime@^5.1.2: dependencies: mimic-fn "^2.1.0" -onetime@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-6.0.0.tgz#7c24c18ed1fd2e9bca4bd26806a33613c77d34b4" - integrity sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ== - dependencies: - mimic-fn "^4.0.0" - only@~0.0.2: version "0.0.2" resolved "https://registry.yarnpkg.com/only/-/only-0.0.2.tgz#2afde84d03e50b9a8edc444e30610a70295edfb4" @@ -17267,11 +16007,6 @@ p-cancelable@^1.0.0: resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-1.1.0.tgz#d078d15a3af409220c886f1d9a0ca2e441ab26cc" integrity sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw== -p-cancelable@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-2.1.1.tgz#aab7fbd416582fa32a3db49859c122487c5ed2cf" - integrity sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg== - p-defer@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-defer/-/p-defer-1.0.0.tgz#9f6eb182f6c9aa8cd743004a7d4f96b196b0fb0c" @@ -17421,11 +16156,6 @@ p-waterfall@2.1.1: dependencies: p-reduce "^2.0.0" -package-json-from-dist@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz#e501cd3094b278495eb4258d4c9f6d5ac3019f00" - integrity sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw== - package-json@^6.3.0: version "6.5.0" resolved "https://registry.yarnpkg.com/package-json/-/package-json-6.5.0.tgz#6feedaca35e75725876d0b0e64974697fed145b0" @@ -17601,7 +16331,7 @@ passport-google-oauth20@2.x.x: dependencies: passport-oauth2 "1.x.x" -passport-google-oauth@2.0.0, passport-google-oauth@^2.0.0: +passport-google-oauth@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/passport-google-oauth/-/passport-google-oauth-2.0.0.tgz#f6eb4bc96dd6c16ec0ecfdf4e05ec48ca54d4dae" integrity sha512-JKxZpBx6wBQXX1/a1s7VmdBgwOugohH+IxCy84aPTZNq/iIPX6u7Mqov1zY7MKRz3niFPol0KJz8zPLBoHKtYA== @@ -17616,14 +16346,6 @@ passport-local@1.0.0: dependencies: passport-strategy "1.x.x" -passport-microsoft@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/passport-microsoft/-/passport-microsoft-1.0.0.tgz#78954cf3201fdce61beeb6587a3b158f8e9db86c" - integrity sha512-L1JHeCbSObSZZXiG7jU2KoKie6nzZLwGt38HXz1GasKrsCQdOnf5kH8ltV4BWNUfBL2Pt1csWn1iuBSerprrcg== - dependencies: - passport-oauth2 "1.6.1" - pkginfo "0.4.x" - passport-oauth1@1.x.x: version "1.3.0" resolved "https://registry.yarnpkg.com/passport-oauth1/-/passport-oauth1-1.3.0.tgz#5d57f1415c8e28e46b461a12ec1b492934f7c354" @@ -17638,17 +16360,6 @@ passport-oauth2-refresh@^2.1.0: resolved "https://registry.yarnpkg.com/passport-oauth2-refresh/-/passport-oauth2-refresh-2.1.0.tgz#c31cd133826383f5539d16ad8ab4f35ca73ce4a4" integrity sha512-4ML7ooCESCqiTgdDBzNUFTBcPR8zQq9iM6eppEUGMMvLdsjqRL93jKwWm4Az3OJcI+Q2eIVyI8sVRcPFvxcF/A== -passport-oauth2@1.6.1: - version "1.6.1" - resolved "https://registry.yarnpkg.com/passport-oauth2/-/passport-oauth2-1.6.1.tgz#c5aee8f849ce8bd436c7f81d904a3cd1666f181b" - integrity sha512-ZbV43Hq9d/SBSYQ22GOiglFsjsD1YY/qdiptA+8ej+9C1dL1TVB+mBE5kDH/D4AJo50+2i8f4bx0vg4/yDDZCQ== - dependencies: - base64url "3.x.x" - oauth "0.9.x" - passport-strategy "1.x.x" - uid2 "0.0.x" - utils-merge "1.x.x" - passport-oauth2@1.x.x: version "1.7.0" resolved "https://registry.yarnpkg.com/passport-oauth2/-/passport-oauth2-1.7.0.tgz#5c4766c8531ac45ffe9ec2c09de9809e2c841fc4" @@ -17699,11 +16410,6 @@ path-key@^3.0.0, path-key@^3.1.0: resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== -path-key@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-4.0.0.tgz#295588dc3aee64154f877adb9d780b81c554bf18" - integrity sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ== - path-parse@^1.0.7: version "1.0.7" resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" @@ -17764,11 +16470,6 @@ pathval@^1.1.1: resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.1.tgz#8534e77a77ce7ac5a2512ea21e0fdb8fcf6c3d8d" integrity sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ== -pathval@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/pathval/-/pathval-2.0.0.tgz#7e2550b422601d4f6b8e26f1301bc8f15a741a25" - integrity sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA== - pause@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/pause/-/pause-0.0.1.tgz#1d408b3fdb76923b9543d96fb4c9dfd535d9cb5d" @@ -17865,21 +16566,11 @@ phin@^2.9.1: resolved "https://registry.yarnpkg.com/phin/-/phin-2.9.3.tgz#f9b6ac10a035636fb65dfc576aaaa17b8743125c" integrity sha512-CzFr90qM24ju5f88quFC/6qohjC144rehe5n6DH900lgXmUe86+xCKc10ev56gRKC4/BkHUoG4uSiQgBiIXwDA== -picocolors@1.0.1, picocolors@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.1.tgz#a8ad579b571952f0e5d25892de5445bcfe25aaa1" - integrity sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew== - picocolors@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== -picomatch@4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-4.0.2.tgz#77c742931e8f3b8820946c76cd0c1f13730d1dab" - integrity sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg== - picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.2, picomatch@^2.2.3, picomatch@^2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" @@ -18050,11 +16741,6 @@ pkg-types@^1.1.1: mlly "^1.7.0" pathe "^1.1.2" -pkginfo@0.4.x: - version "0.4.1" - resolved "https://registry.yarnpkg.com/pkginfo/-/pkginfo-0.4.1.tgz#b5418ef0439de5425fc4995042dced14fb2a84ff" - integrity sha512-8xCNE/aT/EXKenuMDZ+xTVwkT8gsoHN2z/Q29l80u0ppGEXVvsKRzNMbtKhg8LS8k1tJLAHHylf6p4VFmP6XUQ== - pluralize@^8.0.0: version "8.0.0" resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-8.0.0.tgz#1a6fa16a38d12a1901e0320fa017051c539ce3b1" @@ -18372,15 +17058,6 @@ postcss@^8.1.7, postcss@^8.2.9, postcss@^8.3.11, postcss@^8.4.12, postcss@^8.4.2 picocolors "^1.0.0" source-map-js "^1.2.0" -postcss@^8.4.39: - version "8.4.40" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.40.tgz#eb81f2a4dd7668ed869a6db25999e02e9ad909d8" - integrity sha512-YF2kKIUzAofPMpfH6hOi2cGnv/HrUlfucspc7pDyvv7kGdqXrfj8SCl/t8owkEgKEuu8ZcRjSOxFxVLqwChZ2Q== - dependencies: - nanoid "^3.3.7" - picocolors "^1.0.1" - source-map-js "^1.2.0" - postgres-array@~2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/postgres-array/-/postgres-array-2.0.0.tgz#48f8fce054fbc69671999329b8834b772652d82e" @@ -18411,15 +17088,6 @@ posthog-js@^1.118.0: fflate "^0.4.8" preact "^10.19.3" -posthog-js@^1.13.4: - version "1.150.1" - resolved "https://registry.yarnpkg.com/posthog-js/-/posthog-js-1.150.1.tgz#ce2e0aa0dc30369bf1b1b9a38b9fbf25e5c01ba0" - integrity sha512-jHSnqtAWkUQkiedQgHpD00+z8RUF0loDq7ORakBKfQjdntTJIEk16ewqTNRxnpE86guWDoy2J3iAqLgAYfFaLA== - dependencies: - fflate "^0.4.8" - preact "^10.19.3" - web-vitals "^4.0.1" - posthog-node@1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/posthog-node/-/posthog-node-1.3.0.tgz#804ed2f213a2f05253f798bf9569d55a9cad94f7" @@ -18821,14 +17489,6 @@ promise-inflight@^1.0.1: resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" integrity sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g== -promise-retry@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/promise-retry/-/promise-retry-1.1.1.tgz#6739e968e3051da20ce6497fb2b50f6911df3d6d" - integrity sha512-StEy2osPr28o17bIW776GtwO6+Q+M9zPiZkYfosciUUMYqjhU/ffwRAH0zN2+uvGyUsn8/YICIHRzLbPacpZGw== - dependencies: - err-code "^1.0.0" - retry "^0.10.0" - promise-retry@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/promise-retry/-/promise-retry-2.0.1.tgz#ff747a13620ab57ba688f5fc67855410c370da22" @@ -18842,7 +17502,7 @@ promise.series@^0.2.0: resolved "https://registry.yarnpkg.com/promise.series/-/promise.series-0.2.0.tgz#2cc7ebe959fc3a6619c04ab4dbdc9e452d864bbd" integrity sha512-VWQJyU2bcDTgZw8kpfBpB/ejZASlCrzwz5f2hjb/zlujOEB4oeiAhHygAWq8ubsX2GVkD4kCU5V2dwOTaCY5EQ== -prompts@2.4.2, prompts@^2.0.1: +prompts@^2.0.1: version "2.4.2" resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.2.tgz#7b57e73b3a48029ad10ebd44f74b01722a4cb069" integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q== @@ -19007,13 +17667,6 @@ q@^1.1.2: resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" integrity sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw== -qs@^6.10.3: - version "6.12.3" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.12.3.tgz#e43ce03c8521b9c7fd7f1f13e514e5ca37727754" - integrity sha512-AWJm14H1vVaO/iNZ4/hO+HyaTehuy9nRqVdkTqlJt0HWvBiBIEXFmb4C0DGeYo3Xes9rrEW+TxHsaigCbN5ICQ== - dependencies: - side-channel "^1.0.6" - qs@^6.11.0, qs@^6.4.0: version "6.12.1" resolved "https://registry.yarnpkg.com/qs/-/qs-6.12.1.tgz#39422111ca7cbdb70425541cba20c7d7b216599a" @@ -19075,11 +17728,6 @@ quick-lru@^4.0.1: resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-4.0.1.tgz#5b8878f113a58217848c6482026c73e1ba57727f" integrity sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g== -quick-lru@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-5.1.1.tgz#366493e6b3e42a3a6885e2e99d18f80fb7a8c932" - integrity sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA== - quote-unquote@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/quote-unquote/-/quote-unquote-1.0.0.tgz#67a9a77148effeaf81a4d428404a710baaac8a0b" @@ -19132,11 +17780,6 @@ rc@1.2.8, rc@^1.2.7, rc@^1.2.8: minimist "^1.2.0" strip-json-comments "~2.0.1" -reachdown@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/reachdown/-/reachdown-1.1.0.tgz#c3b85b459dbd0fe2c79782233a0a38e66a9b5454" - integrity sha512-6LsdRe4cZyOjw4NnvbhUd/rGG7WQ9HMopPr+kyL018Uci4kijtxcGR5kVb5Ln13k4PEE+fEFQbjfOvNw7cnXmA== - react-is@^17.0.1: version "17.0.2" resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0" @@ -19375,11 +18018,6 @@ redlock@4.2.0: dependencies: bluebird "^3.7.2" -reflect-metadata@^0.2.1: - version "0.2.2" - resolved "https://registry.yarnpkg.com/reflect-metadata/-/reflect-metadata-0.2.2.tgz#400c845b6cba87a21f2c65c4aeb158f4fa4d9c5b" - integrity sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q== - regenerate-unicode-properties@^10.1.0: version "10.1.0" resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz#7c3192cab6dd24e21cb4461e5ddd7dd24fa8374c" @@ -19409,11 +18047,6 @@ regenerator-transform@^0.15.1: dependencies: "@babel/runtime" "^7.8.4" -regexp-tree@~0.1.1: - version "0.1.27" - resolved "https://registry.yarnpkg.com/regexp-tree/-/regexp-tree-0.1.27.tgz#2198f0ef54518ffa743fe74d983b56ffd631b6cd" - integrity sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA== - regexp.prototype.flags@^1.4.3, regexp.prototype.flags@^1.5.2: version "1.5.2" resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz#138f644a3350f981a858c44f6bb1a61ff59be334" @@ -19538,11 +18171,6 @@ requires-port@^1.0.0: resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ== -resolve-alpn@^1.0.0: - version "1.2.1" - resolved "https://registry.yarnpkg.com/resolve-alpn/-/resolve-alpn-1.2.1.tgz#b7adbdac3546aaaec20b45e7d8265927072726f9" - integrity sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g== - resolve-cwd@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" @@ -19594,13 +18222,6 @@ responselike@1.0.2, responselike@^1.0.2: dependencies: lowercase-keys "^1.0.0" -responselike@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/responselike/-/responselike-2.0.1.tgz#9a0bc8fdc252f3fb1cca68b016591059ba1422bc" - integrity sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw== - dependencies: - lowercase-keys "^2.0.0" - restore-cursor@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" @@ -19631,11 +18252,6 @@ retry@0.13.1, retry@^0.13.1: resolved "https://registry.yarnpkg.com/retry/-/retry-0.13.1.tgz#185b1587acf67919d63b357349e03537b2484658" integrity "sha1-GFsVh6z2eRnWOzVzSeA1N7JIRlg= sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==" -retry@^0.10.0: - version "0.10.1" - resolved "https://registry.yarnpkg.com/retry/-/retry-0.10.1.tgz#e76388d217992c252750241d3d3956fed98d8ff4" - integrity sha512-ZXUSQYTHdl3uS7IuCehYfMzKyIDBNoAuUblvy5oGO5UJSUTmStUUVPXbA9Qxd173Bgre53yCQczQuHgRWAdvJQ== - retry@^0.12.0: version "0.12.0" resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b" @@ -19665,13 +18281,6 @@ rimraf@^4.4.1: dependencies: glob "^9.2.0" -rimraf@^5.0.7: - version "5.0.9" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-5.0.9.tgz#c3baa1b886eadc2ec7981a06a593c3d01134ffe9" - integrity sha512-3i7b8OcswU6CpU8Ej89quJD4O98id7TtVM5U4Mybh84zQXdrFmDLouWBEEaD/QfO3gDDfH+AGFCGsR7kngzQnA== - dependencies: - glob "^10.3.7" - ripemd160@^2.0.0, ripemd160@^2.0.1: version "2.0.2" resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" @@ -19834,31 +18443,6 @@ rollup@^3.27.1: optionalDependencies: fsevents "~2.3.2" -rollup@^4.13.0: - version "4.19.1" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.19.1.tgz#21d865cd60d4a325172ce8b082e60caccd97b309" - integrity sha512-K5vziVlg7hTpYfFBI+91zHBEMo6jafYXpkMlqZjg7/zhIG9iHqazBf4xz9AVdjS9BruRn280ROqLI7G3OFRIlw== - dependencies: - "@types/estree" "1.0.5" - optionalDependencies: - "@rollup/rollup-android-arm-eabi" "4.19.1" - "@rollup/rollup-android-arm64" "4.19.1" - "@rollup/rollup-darwin-arm64" "4.19.1" - "@rollup/rollup-darwin-x64" "4.19.1" - "@rollup/rollup-linux-arm-gnueabihf" "4.19.1" - "@rollup/rollup-linux-arm-musleabihf" "4.19.1" - "@rollup/rollup-linux-arm64-gnu" "4.19.1" - "@rollup/rollup-linux-arm64-musl" "4.19.1" - "@rollup/rollup-linux-powerpc64le-gnu" "4.19.1" - "@rollup/rollup-linux-riscv64-gnu" "4.19.1" - "@rollup/rollup-linux-s390x-gnu" "4.19.1" - "@rollup/rollup-linux-x64-gnu" "4.19.1" - "@rollup/rollup-linux-x64-musl" "4.19.1" - "@rollup/rollup-win32-arm64-msvc" "4.19.1" - "@rollup/rollup-win32-ia32-msvc" "4.19.1" - "@rollup/rollup-win32-x64-msvc" "4.19.1" - fsevents "~2.3.2" - rollup@^4.9.4, rollup@^4.9.6: version "4.18.0" resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.18.0.tgz#497f60f0c5308e4602cf41136339fbf87d5f5dda" @@ -19959,13 +18543,6 @@ safe-regex-test@^1.0.3: es-errors "^1.3.0" is-regex "^1.1.4" -safe-regex@2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-2.1.1.tgz#f7128f00d056e2fe5c11e81a1324dd974aadced2" - integrity sha512-rx+x8AMzKb5Q5lQ95Zoi6ZbJqwCLkqi3XuJXp5P3rT8OEc6sZCJG5AE5dU3lsgRr/F4Bs31jSlVN+j5KrsGu9A== - dependencies: - regexp-tree "~0.1.1" - safe-stable-stringify@^2.1.0, safe-stable-stringify@^2.3.1: version "2.4.3" resolved "https://registry.yarnpkg.com/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz#138c84b6f6edb3db5f8ef3ef7115b8f55ccbf886" @@ -20077,7 +18654,7 @@ semver-diff@^3.1.1: dependencies: semver "^6.3.0" -"semver@2 || 3 || 4 || 5", semver@7.5.3, semver@^5.5.0, semver@^5.6.0, semver@^5.7.1, semver@^6.0.0, semver@^6.1.1, semver@^6.1.2, semver@^6.2.0, semver@^6.3.0, semver@^6.3.1, semver@^7.0.0, semver@^7.1.1, semver@^7.3.2, semver@^7.3.4, semver@^7.3.5, semver@^7.3.7, semver@^7.3.8, semver@^7.5.3, semver@^7.5.4, semver@^7.6.0, semver@^7.6.3, semver@~2.3.1: +"semver@2 || 3 || 4 || 5", semver@7.5.3, semver@^5.5.0, semver@^5.6.0, semver@^5.7.1, semver@^6.0.0, semver@^6.1.1, semver@^6.1.2, semver@^6.2.0, semver@^6.3.0, semver@^6.3.1, semver@^7.0.0, semver@^7.1.1, semver@^7.3.2, semver@^7.3.4, semver@^7.3.5, semver@^7.3.7, semver@^7.3.8, semver@^7.5.3, semver@^7.5.4, semver@~2.3.1: version "7.5.3" resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.3.tgz#161ce8c2c6b4b3bdca6caadc9fa3317a4c4fe88e" integrity sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ== @@ -20110,7 +18687,7 @@ serialize-javascript@^6.0.1: dependencies: randombytes "^2.1.0" -server-destroy@1.0.1, server-destroy@^1.0.1: +server-destroy@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/server-destroy/-/server-destroy-1.0.1.tgz#f13bf928e42b9c3e79383e61cc3998b5d14e6cdd" integrity sha512-rb+9B5YBIEzYcD6x2VKidaa+cqYBJQKnU4oe4E3ANwRRN56yk/ua1YCJT1n21NTS8w6CcOclAKNP3PhdCXKYtQ== @@ -20142,11 +18719,6 @@ set-function-name@^2.0.1, set-function-name@^2.0.2: functions-have-names "^1.2.3" has-property-descriptors "^1.0.2" -setimmediate@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" - integrity sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA== - setprototypeof@1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" @@ -20240,7 +18812,7 @@ signal-exit@3.0.7, signal-exit@^3.0.0, signal-exit@^3.0.2, signal-exit@^3.0.3, s resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== -signal-exit@^4.0.1, signal-exit@^4.1.0: +signal-exit@^4.0.1: version "4.1.0" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== @@ -20645,7 +19217,7 @@ stable@^0.1.8: resolved "https://registry.yarnpkg.com/stable/-/stable-0.1.8.tgz#836eb3c8382fe2936feaf544631017ce7d47a3cf" integrity sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w== -stack-trace@0.0.10, stack-trace@0.0.x: +stack-trace@0.0.x: version "0.0.10" resolved "https://registry.yarnpkg.com/stack-trace/-/stack-trace-0.0.10.tgz#547c70b347e8d32b4e108ea1a2a159e5fdde19c0" integrity sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg== @@ -20677,7 +19249,7 @@ statuses@2.0.1, statuses@^2.0.0: resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA== -std-env@^3.3.1, std-env@^3.7.0: +std-env@^3.3.1: version "3.7.0" resolved "https://registry.yarnpkg.com/std-env/-/std-env-3.7.0.tgz#c9f7386ced6ecf13360b6c6c55b8aaa4ef7481d2" integrity sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg== @@ -20923,11 +19495,6 @@ strip-final-newline@^2.0.0: resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== -strip-final-newline@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-3.0.0.tgz#52894c313fbff318835280aed60ff71ebf12b8fd" - integrity sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw== - strip-indent@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-3.0.0.tgz#c32e1cee940b6b3432c771bc2c54bcce73cd3001" @@ -20959,14 +19526,6 @@ strip-outer@^1.0.0: dependencies: escape-string-regexp "^1.0.2" -stripe@9.16.0: - version "9.16.0" - resolved "https://registry.yarnpkg.com/stripe/-/stripe-9.16.0.tgz#94c24549c91fced457b9e3259e8a1a1bdb6dbd0e" - integrity sha512-Dn8K+jSoQcXjxCobRI4HXUdHjOXsiF/KszK49fJnkbeCFjZ3EZxLG2JiM/CX+Hcq27NBDtv/Sxhvy+HhTmvyaQ== - dependencies: - "@types/node" ">=8.1.0" - qs "^6.10.3" - striptags@^3.1.1: version "3.2.0" resolved "https://registry.yarnpkg.com/striptags/-/striptags-3.2.0.tgz#cc74a137db2de8b0b9a370006334161f7dd67052" @@ -21035,18 +19594,6 @@ sublevel-pouchdb@7.2.2: ltgt "2.2.1" readable-stream "1.1.14" -subleveldown@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/subleveldown/-/subleveldown-5.0.1.tgz#aa2b4e4698a48d9a86856b2c4df1b6bce2d2ce53" - integrity sha512-cVqd/URpp7si1HWu5YqQ3vqQkjuolAwHypY1B4itPlS71/lsf6TQPZ2Y0ijT22EYVkvH5ove9JFJf4u7VGPuZw== - dependencies: - abstract-leveldown "^6.3.0" - encoding-down "^6.2.0" - inherits "^2.0.3" - level-option-wrap "^1.1.0" - levelup "^4.4.0" - reachdown "^1.1.0" - superagent@^8.0.5: version "8.1.2" resolved "https://registry.yarnpkg.com/superagent/-/superagent-8.1.2.tgz#03cb7da3ec8b32472c9d20f6c2a57c7f3765f30b" @@ -21350,11 +19897,6 @@ tarn@^3.0.1, tarn@^3.0.2: resolved "https://registry.yarnpkg.com/tarn/-/tarn-3.0.2.tgz#73b6140fbb881b71559c4f8bfde3d9a4b3d27693" integrity sha512-51LAVKUSZSVfI05vjPESNc5vwqqZpbXCsU+/+wxlOrUjk2SnFTt97v9ZgQrD4YmxYW1Px6w2KjaDitCfkvgxMQ== -teamcity-service-messages@0.1.14: - version "0.1.14" - resolved "https://registry.yarnpkg.com/teamcity-service-messages/-/teamcity-service-messages-0.1.14.tgz#193d420a5e4aef8e5e50b8c39e7865e08fbb5d8a" - integrity sha512-29aQwaHqm8RMX74u2o/h1KbMLP89FjNiMxD9wbF2BbWOnbM+q+d1sCEC+MqCc4QW3NJykn77OMpTFw/xTHIc0w== - tedious@^16.4.0: version "16.7.1" resolved "https://registry.yarnpkg.com/tedious/-/tedious-16.7.1.tgz#1190f30fd99a413f1dc9250dee4835cf0788b650" @@ -21518,11 +20060,6 @@ timekeeper@2.2.0: resolved "https://registry.yarnpkg.com/timekeeper/-/timekeeper-2.2.0.tgz#9645731fce9e3280a18614a57a9d1b72af3ca368" integrity sha512-W3AmPTJWZkRwu+iSNxPIsLZ2ByADsOLbbLxe46UJyWj3mlYLlwucKiq+/dPm0l9wTzqoF3/2PH0AGFCebjq23A== -timekeeper@^2.2.0: - version "2.3.1" - resolved "https://registry.yarnpkg.com/timekeeper/-/timekeeper-2.3.1.tgz#2deb6e0b95d93625fda84c18d47f84a99e4eba01" - integrity sha512-LeQRS7/4JcC0PgdSFnfUiStQEdiuySlCj/5SJ18D+T1n9BoY7PxKFfCwLulpHXoLUFr67HxBddQdEX47lDGx1g== - timm@^1.6.1: version "1.7.1" resolved "https://registry.yarnpkg.com/timm/-/timm-1.7.1.tgz#96bab60c7d45b5a10a8a4d0f0117c6b7e5aff76f" @@ -21546,11 +20083,6 @@ tinybench@^2.3.1: resolved "https://registry.yarnpkg.com/tinybench/-/tinybench-2.8.0.tgz#30e19ae3a27508ee18273ffed9ac7018949acd7b" integrity sha512-1/eK7zUnIklz4JUUlL+658n58XO2hHLQfSk1Zf2LKieUjxidN16eKFEoDEfjHc3ohofSSqK3X5yO6VGb6iW8Lw== -tinybench@^2.8.0: - version "2.9.0" - resolved "https://registry.yarnpkg.com/tinybench/-/tinybench-2.9.0.tgz#103c9f8ba6d7237a47ab6dd1dcff77251863426b" - integrity sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg== - tinycolor2@^1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/tinycolor2/-/tinycolor2-1.6.0.tgz#f98007460169b0263b97072c5ae92484ce02d09e" @@ -21561,26 +20093,11 @@ tinypool@^0.4.0: resolved "https://registry.yarnpkg.com/tinypool/-/tinypool-0.4.0.tgz#3cf3ebd066717f9f837e8d7d31af3c127fdb5446" integrity sha512-2ksntHOKf893wSAH4z/+JbPpi92esw8Gn9N2deXX+B0EO92hexAVI9GIZZPx7P5aYo5KULfeOSt3kMOmSOy6uA== -tinypool@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/tinypool/-/tinypool-1.0.0.tgz#a68965218e04f4ad9de037d2a1cd63cda9afb238" - integrity sha512-KIKExllK7jp3uvrNtvRBYBWBOAXSX8ZvoaD8T+7KB/QHIuoJW3Pmr60zucywjAlMb5TeXUkcs/MWeWLu0qvuAQ== - -tinyrainbow@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/tinyrainbow/-/tinyrainbow-1.2.0.tgz#5c57d2fc0fb3d1afd78465c33ca885d04f02abb5" - integrity sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ== - tinyspy@^1.0.2: version "1.1.1" resolved "https://registry.yarnpkg.com/tinyspy/-/tinyspy-1.1.1.tgz#0cb91d5157892af38cb2d217f5c7e8507a5bf092" integrity sha512-UVq5AXt/gQlti7oxoIg5oi/9r0WpF7DGEVwXgqWSMmyN16+e3tl5lIvTaOpJ3TAtu5xFzWccFRM4R5NaWHF+4g== -tinyspy@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/tinyspy/-/tinyspy-3.0.0.tgz#cb61644f2713cd84dee184863f4642e06ddf0585" - integrity sha512-q5nmENpTHgiPVd1cJDDc9cVoYN5x4vCvwT3FMilvKPKneCBZAxn2YWQjDF0UMcE9k0Cay1gBiDfTMU0g+mPMQA== - tlhunter-sorted-set@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/tlhunter-sorted-set/-/tlhunter-sorted-set-0.1.0.tgz#1c3eae28c0fa4dff97e9501d2e3c204b86406f4b" @@ -21718,18 +20235,6 @@ ts-api-utils@^1.0.1: resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-1.0.3.tgz#f12c1c781d04427313dbac808f453f050e54a331" integrity sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg== -ts-api-utils@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-1.3.0.tgz#4b490e27129f1e8e686b45cc4ab63714dc60eea1" - integrity sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ== - -ts-declaration-location@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/ts-declaration-location/-/ts-declaration-location-1.0.4.tgz#60c64133202ec5d171fdf0395f70f786f92f14c0" - integrity sha512-r4JoxYhKULbZuH81Pjrp9OEG5St7XWk7zXwGkLKhmVcjiBVHTJXV5wK6dEa9JKW5QGSTW6b1lOjxAKp8R1SQhg== - dependencies: - minimatch "^10.0.0" - ts-graphviz@^1.5.0: version "1.5.4" resolved "https://registry.yarnpkg.com/ts-graphviz/-/ts-graphviz-1.5.4.tgz#61a3059afeac4f6d4be3c6729a4d88546ca9e095" @@ -21768,39 +20273,6 @@ ts-node@10.8.1: v8-compile-cache-lib "^3.0.1" yn "3.1.1" -ts-node@^10.9.2: - version "10.9.2" - resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.9.2.tgz#70f021c9e185bccdca820e26dc413805c101c71f" - integrity sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ== - dependencies: - "@cspotcode/source-map-support" "^0.8.0" - "@tsconfig/node10" "^1.0.7" - "@tsconfig/node12" "^1.0.7" - "@tsconfig/node14" "^1.0.0" - "@tsconfig/node16" "^1.0.2" - acorn "^8.4.1" - acorn-walk "^8.1.1" - arg "^4.1.0" - create-require "^1.1.0" - diff "^4.0.1" - make-error "^1.1.1" - v8-compile-cache-lib "^3.0.1" - yn "3.1.1" - -tsconfck@^3.0.3: - version "3.1.1" - resolved "https://registry.yarnpkg.com/tsconfck/-/tsconfck-3.1.1.tgz#c7284913262c293b43b905b8b034f524de4a3162" - integrity sha512-00eoI6WY57SvZEVjm13stEVE90VkEdJAFGgpFLTsZbJyW/LwFQ7uQxJHWpZ2hzSWgCPKc9AnBnNP+0X7o3hAmQ== - -tsconfig-paths-webpack-plugin@4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/tsconfig-paths-webpack-plugin/-/tsconfig-paths-webpack-plugin-4.1.0.tgz#3c6892c5e7319c146eee1e7302ed9e6f2be4f763" - integrity sha512-xWFISjviPydmtmgeUAuXp4N1fky+VCtfhOkDUFIv5ea7p4wuTomI4QTrXvFBX2S4jZsmyTSrStQl+E+4w+RzxA== - dependencies: - chalk "^4.1.0" - enhanced-resolve "^5.7.0" - tsconfig-paths "^4.1.2" - tsconfig-paths@4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-4.0.0.tgz#1082f5d99fd127b72397eef4809e4dd06d229b64" @@ -21820,7 +20292,7 @@ tsconfig-paths@^3.10.1, tsconfig-paths@^3.15.0: minimist "^1.2.6" strip-bom "^3.0.0" -tsconfig-paths@^4.1.2, tsconfig-paths@^4.2.0: +tsconfig-paths@^4.1.2: version "4.2.0" resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz#ef78e19039133446d244beac0fd6a1632e2d107c" integrity sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg== @@ -21983,11 +20455,6 @@ typed-array-length@^1.0.6: is-typed-array "^1.1.13" possible-typed-array-names "^1.0.0" -typed-duration@^1.0.12: - version "1.0.13" - resolved "https://registry.yarnpkg.com/typed-duration/-/typed-duration-1.0.13.tgz#a40f9ba563b6e20674cac491e15ecbf6811d85a7" - integrity sha512-HLwA+hNq/2eXe03isJSfa7YJt6NikplBGdNKvlhyuR6WL5iZi2uXJIZv1SSOMEIukCZbeQ8QwIcQ801S0/Qulw== - typedarray-to-buffer@^3.1.5: version "3.1.5" resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" @@ -22017,15 +20484,6 @@ typeof@^1.0.0: resolved "https://registry.yarnpkg.com/typeof/-/typeof-1.0.0.tgz#9c84403f2323ae5399167275497638ea1d2f2440" integrity sha512-Pze0mIxYXhaJdpw1ayMzOA7rtGr1OmsTY/Z+FWtRKIqXFz6aoDLjqdbWE/tcIBSC8nhnVXiRrEXujodR/xiFAA== -typescript-eslint@^7.16.1: - version "7.18.0" - resolved "https://registry.yarnpkg.com/typescript-eslint/-/typescript-eslint-7.18.0.tgz#e90d57649b2ad37a7475875fa3e834a6d9f61eb2" - integrity sha512-PonBkP603E3tt05lDkbOMyaxJjvKqQrXsnow72sVeOFINDE/qNmnnd+f9b4N+U7W6MXnnYyrhtmF2t08QWwUbA== - dependencies: - "@typescript-eslint/eslint-plugin" "7.18.0" - "@typescript-eslint/parser" "7.18.0" - "@typescript-eslint/utils" "7.18.0" - typescript-eslint@^7.3.1: version "7.3.1" resolved "https://registry.yarnpkg.com/typescript-eslint/-/typescript-eslint-7.3.1.tgz#9f4808abea3b33c4dd3bb51dd801471e91d1bd58" @@ -22049,11 +20507,6 @@ typescript@^4.0.0, typescript@^4.5.5: resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.5.tgz#095979f9bcc0d09da324d58d03ce8f8374cbe65a" integrity sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g== -typescript@^5.5.3: - version "5.5.4" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.5.4.tgz#d9852d6c82bad2d2eda4fd74a5762a8f5909e9ba" - integrity sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q== - typo-js@*: version "1.2.2" resolved "https://registry.yarnpkg.com/typo-js/-/typo-js-1.2.2.tgz#340484d81fe518e77c81a5a770162b14492f183b" @@ -22107,11 +20560,6 @@ undici-types@~5.26.4: resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== -undici-types@~6.11.1: - version "6.11.1" - resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.11.1.tgz#432ea6e8efd54a48569705a699e62d8f4981b197" - integrity sha512-mIDEX2ek50x0OlRgxryxsenE5XaQD4on5U2inY7RApK3SOJpofyw7uW2AyfMKkhAxXIceo2DeWGVGwyvng1GNQ== - undici@^4.14.1: version "4.16.0" resolved "https://registry.yarnpkg.com/undici/-/undici-4.16.0.tgz#469bb87b3b918818d3d7843d91a1d08da357d5ff" @@ -22226,7 +20674,7 @@ update-browserslist-db@^1.0.10: escalade "^3.1.1" picocolors "^1.0.0" -update-dotenv@1.1.1, update-dotenv@^1.1.1: +update-dotenv@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/update-dotenv/-/update-dotenv-1.1.1.tgz#17146f302f216c3c92419d5a327a45be910050ca" integrity sha512-3cIC18In/t0X/yH793c00qqxcKD8jVCgNOPif/fGQkFpYMGecM9YAc+kaAKXuZsM2dE9I9wFI7KvAuNX22SGMQ== @@ -22270,7 +20718,7 @@ url-parse-lax@^3.0.0: dependencies: prepend-http "^2.0.0" -url-parse@^1.4.3, url-parse@^1.5.3: +url-parse@^1.5.3: version "1.5.10" resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.10.tgz#9d3c2f736c1d75dd3bd2be507dcc111f1e2ea9c1" integrity sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ== @@ -22345,11 +20793,6 @@ uuid@^3.3.2: resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== -uuid@^7.0.3: - version "7.0.3" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-7.0.3.tgz#c5c9f2c8cf25dc0a372c4df1441c41f5bd0c680b" - integrity sha512-DPSke0pXhTZgoF/d+WSt2QaKMCFSfx7QegxEWT+JOuHF5aWrKEn0G+ztjuJg/gG8/ItK+rbPCD/yNv8yyih6Cg== - uuid@^9.0.0, uuid@^9.0.1: version "9.0.1" resolved "https://registry.yarnpkg.com/uuid/-/uuid-9.0.1.tgz#e188d4c8853cc722220392c424cd637f32293f30" @@ -22432,17 +20875,6 @@ vite-node@0.29.8: picocolors "^1.0.0" vite "^3.0.0 || ^4.0.0" -vite-node@2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/vite-node/-/vite-node-2.0.5.tgz#36d909188fc6e3aba3da5fc095b3637d0d18e27b" - integrity sha512-LdsW4pxj0Ot69FAoXZ1yTnA9bjGohr2yNBU7QKRxpz8ITSkhuDl6h3zS/tvgz4qrNjeRnvrWeXQ8ZF7Um4W00Q== - dependencies: - cac "^6.7.14" - debug "^4.3.5" - pathe "^1.1.2" - tinyrainbow "^1.2.0" - vite "^5.0.0" - vite-plugin-static-copy@^0.17.0: version "0.17.0" resolved "https://registry.yarnpkg.com/vite-plugin-static-copy/-/vite-plugin-static-copy-0.17.0.tgz#e45527da186c4a3818d09635797b6fc7cc9e035f" @@ -22453,15 +20885,6 @@ vite-plugin-static-copy@^0.17.0: fs-extra "^11.1.0" picocolors "^1.0.0" -vite-tsconfig-paths@^4.3.2: - version "4.3.2" - resolved "https://registry.yarnpkg.com/vite-tsconfig-paths/-/vite-tsconfig-paths-4.3.2.tgz#321f02e4b736a90ff62f9086467faf4e2da857a9" - integrity sha512-0Vd/a6po6Q+86rPlntHye7F31zA2URZMbH8M3saAZ/xR9QoGN/L21bxEGfXdWmFdNkqPpRdxFT7nmNe12e9/uA== - dependencies: - debug "^4.1.1" - globrex "^0.1.2" - tsconfck "^3.0.3" - "vite@^3.0.0 || ^4.0.0", vite@^4.5.0: version "4.5.3" resolved "https://registry.yarnpkg.com/vite/-/vite-4.5.3.tgz#d88a4529ea58bae97294c7e2e6f0eab39a50fb1a" @@ -22473,17 +20896,6 @@ vite-tsconfig-paths@^4.3.2: optionalDependencies: fsevents "~2.3.2" -vite@^5.0.0: - version "5.3.5" - resolved "https://registry.yarnpkg.com/vite/-/vite-5.3.5.tgz#b847f846fb2b6cb6f6f4ed50a830186138cb83d8" - integrity sha512-MdjglKR6AQXQb9JGiS7Rc2wC6uMjcm7Go/NHNO63EwiJXfuk9PgqiP/n5IDJCziMkfw9n4Ubp7lttNwz+8ZVKA== - dependencies: - esbuild "^0.21.3" - postcss "^8.4.39" - rollup "^4.13.0" - optionalDependencies: - fsevents "~2.3.3" - vitefu@^0.2.2: version "0.2.5" resolved "https://registry.yarnpkg.com/vitefu/-/vitefu-0.2.5.tgz#c1b93c377fbdd3e5ddd69840ea3aa70b40d90969" @@ -22519,31 +20931,6 @@ vitest@^0.29.2: vite-node "0.29.8" why-is-node-running "^2.2.2" -vitest@^2.0.4: - version "2.0.5" - resolved "https://registry.yarnpkg.com/vitest/-/vitest-2.0.5.tgz#2f15a532704a7181528e399cc5b754c7f335fd62" - integrity sha512-8GUxONfauuIdeSl5f9GTgVEpg5BTOlplET4WEDaeY2QBiN8wSm68vxN/tb5z405OwppfoCavnwXafiaYBC/xOA== - dependencies: - "@ampproject/remapping" "^2.3.0" - "@vitest/expect" "2.0.5" - "@vitest/pretty-format" "^2.0.5" - "@vitest/runner" "2.0.5" - "@vitest/snapshot" "2.0.5" - "@vitest/spy" "2.0.5" - "@vitest/utils" "2.0.5" - chai "^5.1.1" - debug "^4.3.5" - execa "^8.0.1" - magic-string "^0.30.10" - pathe "^1.1.2" - std-env "^3.7.0" - tinybench "^2.8.0" - tinypool "^1.0.0" - tinyrainbow "^1.2.0" - vite "^5.0.0" - vite-node "2.0.5" - why-is-node-running "^2.3.0" - vlq@^0.2.2: version "0.2.3" resolved "https://registry.yarnpkg.com/vlq/-/vlq-0.2.3.tgz#8f3e4328cf63b1540c0d67e1b2778386f8975b26" @@ -22592,11 +20979,6 @@ walker@^1.0.8: dependencies: makeerror "1.0.12" -watskeburt@4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/watskeburt/-/watskeburt-4.1.0.tgz#3c0227669be646a97424b631164b1afe3d4d5344" - integrity sha512-KkY5H51ajqy9HYYI+u9SIURcWnqeVVhdH0I+ab6aXPGHfZYxgRCwnR6Lm3+TYB6jJVt5jFqw4GAKmwf1zHmGQw== - wcwidth@^1.0.0, wcwidth@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8" @@ -22614,11 +20996,6 @@ web-streams-polyfill@^3.2.1: resolved "https://registry.yarnpkg.com/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz#2073b91a2fdb1fbfbd401e7de0ac9f8214cecb4b" integrity sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw== -web-vitals@^4.0.1: - version "4.2.2" - resolved "https://registry.yarnpkg.com/web-vitals/-/web-vitals-4.2.2.tgz#e883245180b95e175eb75a5ca8903b1a11597d7a" - integrity sha512-nYfoOqb4EmElljyXU2qdeE76KsvoHdftQKY4DzA9Aw8DervCg2bG634pHLrJ/d6+B4mE3nWTSJv8Mo7B2mbZkw== - webfinger@^0.4.2: version "0.4.2" resolved "https://registry.yarnpkg.com/webfinger/-/webfinger-0.4.2.tgz#3477a6d97799461896039fcffc650b73468ee76d" @@ -22775,14 +21152,6 @@ why-is-node-running@^2.2.2: siginfo "^2.0.0" stackback "0.0.2" -why-is-node-running@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/why-is-node-running/-/why-is-node-running-2.3.0.tgz#a3f69a97107f494b3cdc3bdddd883a7d65cebf04" - integrity sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w== - dependencies: - siginfo "^2.0.0" - stackback "0.0.2" - wide-align@^1.1.2, wide-align@^1.1.5: version "1.1.5" resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.5.tgz#df1d4c206854369ecf3c9a4898f1b23fbd9d15d3" @@ -22797,16 +21166,6 @@ widest-line@^3.1.0: dependencies: string-width "^4.0.0" -win-ca@3.5.1: - version "3.5.1" - resolved "https://registry.yarnpkg.com/win-ca/-/win-ca-3.5.1.tgz#2ef37ac24b0a1daa2714b4c5ef258c5242429e00" - integrity sha512-RNy9gpBS6cxWHjfbqwBA7odaHyT+YQNhtdpJZwYCFoxB/Dq22oeOZ9YCXMwjhLytKpo7JJMnKdJ/ve7N12zzfQ== - dependencies: - is-electron "^2.2.0" - make-dir "^1.3.0" - node-forge "^1.2.1" - split "^1.0.1" - winston-transport@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/winston-transport/-/winston-transport-4.5.0.tgz#6e7b0dd04d393171ed5e4e4905db265f7ab384fa" From 4be3f0a3200ff72103663aef9cd6902ec6a102ed Mon Sep 17 00:00:00 2001 From: Andrew Kingston Date: Wed, 21 Aug 2024 09:55:30 +0100 Subject: [PATCH 167/180] Fix issue where we were saving the entire datasource definition into every datasource setting --- .../DataSourceSelect/DataSourceCategory.svelte | 2 +- packages/builder/src/helpers/data/format.js | 18 ++++++++++-------- 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/packages/builder/src/components/design/settings/controls/DataSourceSelect/DataSourceCategory.svelte b/packages/builder/src/components/design/settings/controls/DataSourceSelect/DataSourceCategory.svelte index fa6f477ed9..f6d7cfc2c3 100644 --- a/packages/builder/src/components/design/settings/controls/DataSourceSelect/DataSourceCategory.svelte +++ b/packages/builder/src/components/design/settings/controls/DataSourceSelect/DataSourceCategory.svelte @@ -29,7 +29,7 @@ on:click={() => onSelect(data)} > - {data.datasource?.name ? `${data.datasource.name} - ` : ""}{data.label} + {data.datasourceName ? `${data.datasourceName} - ` : ""}{data.label} ({ - label: table.name, - tableId: table._id, - type: "table", - datasource: datasources.find( - datasource => datasource._id === table.sourceId || table.datasourceId - ), - }), + table: (table, datasources) => { + const sourceId = table.sourceId || table.datasourceId + const datasource = datasources.find(ds => ds._id === sourceId) + return { + label: table.name, + tableId: table._id, + type: "table", + datasourceName: datasource?.name, + } + }, viewV2: view => ({ ...view, label: view.name, From ace100adfe74e32965e6116f2528547c1d4b515e Mon Sep 17 00:00:00 2001 From: mike12345567 Date: Wed, 21 Aug 2024 10:05:25 +0100 Subject: [PATCH 168/180] updating yarn lock. --- yarn.lock | 1709 +++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 1666 insertions(+), 43 deletions(-) diff --git a/yarn.lock b/yarn.lock index f5cedd7097..713a1845b5 100644 --- a/yarn.lock +++ b/yarn.lock @@ -25,6 +25,14 @@ "@jridgewell/gen-mapping" "^0.3.0" "@jridgewell/trace-mapping" "^0.3.9" +"@ampproject/remapping@^2.3.0": + version "2.3.0" + resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.3.0.tgz#ed441b6fa600072520ce18b43d2c8cc8caecc7f4" + integrity sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw== + dependencies: + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.24" + "@apidevtools/json-schema-ref-parser@^9.0.6": version "9.1.2" resolved "https://registry.yarnpkg.com/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-9.1.2.tgz#8ff5386b365d4c9faa7c8b566ff16a46a577d9b8" @@ -625,6 +633,13 @@ dependencies: tslib "^2.5.0" +"@aws/dynamodb-auto-marshaller@^0.7.1": + version "0.7.1" + resolved "https://registry.yarnpkg.com/@aws/dynamodb-auto-marshaller/-/dynamodb-auto-marshaller-0.7.1.tgz#70676c056e4ecb798c08ec2e398a3d93e703858d" + integrity sha512-LeURlf6/avrfFo9+4Yht9J3CUTJ72yoBpm1FOUmlexuHNW4Ka61tG30w3ZDCXXXmCO2rG0k3ywAgNJEo3WPbyw== + dependencies: + tslib "^1.8.1" + "@azure/abort-controller@^1.0.0", "@azure/abort-controller@^1.0.4": version "1.1.0" resolved "https://registry.yarnpkg.com/@azure/abort-controller/-/abort-controller-1.1.0.tgz#788ee78457a55af8a1ad342acb182383d2119249" @@ -1987,6 +2002,13 @@ dependencies: regenerator-runtime "^0.14.0" +"@babel/runtime@^7.13.10": + version "7.25.0" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.25.0.tgz#3af9a91c1b739c569d5d80cc917280919c544ecb" + integrity sha512-7dRy4DwXwtzBrPbZflqxnvfxLF8kdZXPkhymtDeFoFqE6ldzjQFgYTtYIFARcLEYDrqfBfYcZt1WqFxRoyC9Rw== + dependencies: + regenerator-runtime "^0.14.0" + "@babel/template@^7.22.15", "@babel/template@^7.22.5", "@babel/template@^7.3.3": version "7.22.15" resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.22.15.tgz#09576efc3830f0430f4548ef971dde1350ef2f38" @@ -2111,7 +2133,7 @@ pouchdb-promise "^6.0.4" through2 "^2.0.0" -"@budibase/pro@0.0.0", "@budibase/pro@npm:@budibase/pro@latest": +"@budibase/pro@npm:@budibase/pro@latest": version "2.29.24" resolved "https://registry.yarnpkg.com/@budibase/pro/-/pro-2.29.24.tgz#2dbd4c6c0f757aab7e17c413c6d6e4520086f9ac" integrity sha512-m1v24UD6O21Vbrfsuo5kC5oeg7FzjWO2w8TQMw1VvPKmdIqqclaKDPTPytxwllTMkapMDRNzM5cQzqnQ3yHf6A== @@ -2177,6 +2199,32 @@ dependencies: "@bull-board/api" "5.10.2" +"@camunda8/sdk@^8.5.3": + version "8.6.10" + resolved "https://registry.yarnpkg.com/@camunda8/sdk/-/sdk-8.6.10.tgz#61fdadc6bc89a234648ba4bc622b0db10f283de9" + integrity sha512-FzSoLYd0yFFElC2G3NX93GnP7r53uQDR+6njV1EEAGPhz4QQfZeEW07vMNZ9BFeNn5jhtv9IWmHdHxYwJxxmcw== + dependencies: + "@grpc/grpc-js" "1.10.9" + "@grpc/proto-loader" "0.7.13" + chalk "^2.4.2" + console-stamp "^3.0.2" + dayjs "^1.8.15" + debug "^4.3.4" + fast-xml-parser "^4.1.3" + got "^11.8.6" + jwt-decode "^4.0.0" + lodash.mergewith "^4.6.2" + long "^4.0.0" + lossless-json "^4.0.1" + neon-env "^0.1.3" + promise-retry "^1.1.1" + reflect-metadata "^0.2.1" + stack-trace "0.0.10" + typed-duration "^1.0.12" + uuid "^7.0.3" + optionalDependencies: + win-ca "3.5.1" + "@codemirror/autocomplete@^6.0.0", "@codemirror/autocomplete@^6.7.1": version "6.7.1" resolved "https://registry.yarnpkg.com/@codemirror/autocomplete/-/autocomplete-6.7.1.tgz#3364799b78dff70fb8f81615536c52ea53ce40b2" @@ -2360,116 +2408,231 @@ find-up "^5.0.0" strip-json-comments "^3.1.1" +"@esbuild/aix-ppc64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz#c7184a326533fcdf1b8ee0733e21c713b975575f" + integrity sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ== + "@esbuild/android-arm64@0.18.20": version "0.18.20" resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz#984b4f9c8d0377443cc2dfcef266d02244593622" integrity sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ== +"@esbuild/android-arm64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz#09d9b4357780da9ea3a7dfb833a1f1ff439b4052" + integrity sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A== + "@esbuild/android-arm@0.18.20": version "0.18.20" resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.18.20.tgz#fedb265bc3a589c84cc11f810804f234947c3682" integrity sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw== +"@esbuild/android-arm@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.21.5.tgz#9b04384fb771926dfa6d7ad04324ecb2ab9b2e28" + integrity sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg== + "@esbuild/android-x64@0.18.20": version "0.18.20" resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.18.20.tgz#35cf419c4cfc8babe8893d296cd990e9e9f756f2" integrity sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg== +"@esbuild/android-x64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.21.5.tgz#29918ec2db754cedcb6c1b04de8cd6547af6461e" + integrity sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA== + "@esbuild/darwin-arm64@0.18.20": version "0.18.20" resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz#08172cbeccf95fbc383399a7f39cfbddaeb0d7c1" integrity sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA== +"@esbuild/darwin-arm64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz#e495b539660e51690f3928af50a76fb0a6ccff2a" + integrity sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ== + "@esbuild/darwin-x64@0.18.20": version "0.18.20" resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz#d70d5790d8bf475556b67d0f8b7c5bdff053d85d" integrity sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ== +"@esbuild/darwin-x64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz#c13838fa57372839abdddc91d71542ceea2e1e22" + integrity sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw== + "@esbuild/freebsd-arm64@0.18.20": version "0.18.20" resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz#98755cd12707f93f210e2494d6a4b51b96977f54" integrity sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw== +"@esbuild/freebsd-arm64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz#646b989aa20bf89fd071dd5dbfad69a3542e550e" + integrity sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g== + "@esbuild/freebsd-x64@0.18.20": version "0.18.20" resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz#c1eb2bff03915f87c29cece4c1a7fa1f423b066e" integrity sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ== +"@esbuild/freebsd-x64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz#aa615cfc80af954d3458906e38ca22c18cf5c261" + integrity sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ== + "@esbuild/linux-arm64@0.18.20": version "0.18.20" resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz#bad4238bd8f4fc25b5a021280c770ab5fc3a02a0" integrity sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA== +"@esbuild/linux-arm64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz#70ac6fa14f5cb7e1f7f887bcffb680ad09922b5b" + integrity sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q== + "@esbuild/linux-arm@0.18.20": version "0.18.20" resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz#3e617c61f33508a27150ee417543c8ab5acc73b0" integrity sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg== +"@esbuild/linux-arm@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz#fc6fd11a8aca56c1f6f3894f2bea0479f8f626b9" + integrity sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA== + "@esbuild/linux-ia32@0.18.20": version "0.18.20" resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz#699391cccba9aee6019b7f9892eb99219f1570a7" integrity sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA== +"@esbuild/linux-ia32@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz#3271f53b3f93e3d093d518d1649d6d68d346ede2" + integrity sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg== + "@esbuild/linux-loong64@0.18.20": version "0.18.20" resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz#e6fccb7aac178dd2ffb9860465ac89d7f23b977d" integrity sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg== +"@esbuild/linux-loong64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz#ed62e04238c57026aea831c5a130b73c0f9f26df" + integrity sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg== + "@esbuild/linux-mips64el@0.18.20": version "0.18.20" resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz#eeff3a937de9c2310de30622a957ad1bd9183231" integrity sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ== +"@esbuild/linux-mips64el@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz#e79b8eb48bf3b106fadec1ac8240fb97b4e64cbe" + integrity sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg== + "@esbuild/linux-ppc64@0.18.20": version "0.18.20" resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz#2f7156bde20b01527993e6881435ad79ba9599fb" integrity sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA== +"@esbuild/linux-ppc64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz#5f2203860a143b9919d383ef7573521fb154c3e4" + integrity sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w== + "@esbuild/linux-riscv64@0.18.20": version "0.18.20" resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz#6628389f210123d8b4743045af8caa7d4ddfc7a6" integrity sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A== +"@esbuild/linux-riscv64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz#07bcafd99322d5af62f618cb9e6a9b7f4bb825dc" + integrity sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA== + "@esbuild/linux-s390x@0.18.20": version "0.18.20" resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz#255e81fb289b101026131858ab99fba63dcf0071" integrity sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ== +"@esbuild/linux-s390x@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz#b7ccf686751d6a3e44b8627ababc8be3ef62d8de" + integrity sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A== + "@esbuild/linux-x64@0.18.20": version "0.18.20" resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz#c7690b3417af318a9b6f96df3031a8865176d338" integrity sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w== +"@esbuild/linux-x64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz#6d8f0c768e070e64309af8004bb94e68ab2bb3b0" + integrity sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ== + "@esbuild/netbsd-x64@0.18.20": version "0.18.20" resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz#30e8cd8a3dded63975e2df2438ca109601ebe0d1" integrity sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A== +"@esbuild/netbsd-x64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz#bbe430f60d378ecb88decb219c602667387a6047" + integrity sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg== + "@esbuild/openbsd-x64@0.18.20": version "0.18.20" resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz#7812af31b205055874c8082ea9cf9ab0da6217ae" integrity sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg== +"@esbuild/openbsd-x64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz#99d1cf2937279560d2104821f5ccce220cb2af70" + integrity sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow== + "@esbuild/sunos-x64@0.18.20": version "0.18.20" resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz#d5c275c3b4e73c9b0ecd38d1ca62c020f887ab9d" integrity sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ== +"@esbuild/sunos-x64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz#08741512c10d529566baba837b4fe052c8f3487b" + integrity sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg== + "@esbuild/win32-arm64@0.18.20": version "0.18.20" resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz#73bc7f5a9f8a77805f357fab97f290d0e4820ac9" integrity sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg== +"@esbuild/win32-arm64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz#675b7385398411240735016144ab2e99a60fc75d" + integrity sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A== + "@esbuild/win32-ia32@0.18.20": version "0.18.20" resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz#ec93cbf0ef1085cc12e71e0d661d20569ff42102" integrity sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g== +"@esbuild/win32-ia32@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz#1bfc3ce98aa6ca9a0969e4d2af72144c59c1193b" + integrity sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA== + "@esbuild/win32-x64@0.18.20": version "0.18.20" resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz#786c5f41f043b07afb1af37683d7c33668858f6d" integrity sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ== +"@esbuild/win32-x64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz#acad351d582d157bb145535db2a6ff53dd514b5c" + integrity sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw== + "@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.4.0": version "4.4.0" resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59" @@ -2477,11 +2640,25 @@ dependencies: eslint-visitor-keys "^3.3.0" +"@eslint-community/regexpp@^4.10.0", "@eslint-community/regexpp@^4.11.0": + version "4.11.0" + resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.11.0.tgz#b0ffd0312b4a3fd2d6f77237e7248a5ad3a680ae" + integrity sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A== + "@eslint-community/regexpp@^4.5.1", "@eslint-community/regexpp@^4.6.1": version "4.10.0" resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.10.0.tgz#548f6de556857c8bb73bbee70c35dc82a2e74d63" integrity sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA== +"@eslint/config-array@^0.17.1": + version "0.17.1" + resolved "https://registry.yarnpkg.com/@eslint/config-array/-/config-array-0.17.1.tgz#d9b8b8b6b946f47388f32bedfd3adf29ca8f8910" + integrity sha512-BlYOpej8AQ8Ev9xVqroV7a02JK3SkBAaN9GfMMH9W6Ch8FlQlkjGw4Ir7+FgYwfirivAf4t+GtzuAxqfukmISA== + dependencies: + "@eslint/object-schema" "^2.1.4" + debug "^4.3.1" + minimatch "^3.1.2" + "@eslint/eslintrc@^2.1.4": version "2.1.4" resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.1.4.tgz#388a269f0f25c1b6adc317b5a2c55714894c70ad" @@ -2497,11 +2674,36 @@ minimatch "^3.1.2" strip-json-comments "^3.1.1" +"@eslint/eslintrc@^3.1.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-3.1.0.tgz#dbd3482bfd91efa663cbe7aa1f506839868207b6" + integrity sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ== + dependencies: + ajv "^6.12.4" + debug "^4.3.2" + espree "^10.0.1" + globals "^14.0.0" + ignore "^5.2.0" + import-fresh "^3.2.1" + js-yaml "^4.1.0" + minimatch "^3.1.2" + strip-json-comments "^3.1.1" + "@eslint/js@8.57.0": version "8.57.0" resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.57.0.tgz#a5417ae8427873f1dd08b70b3574b453e67b5f7f" integrity sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g== +"@eslint/js@9.9.0", "@eslint/js@^9.7.0": + version "9.9.0" + resolved "https://registry.yarnpkg.com/@eslint/js/-/js-9.9.0.tgz#d8437adda50b3ed4401964517b64b4f59b0e2638" + integrity sha512-hhetes6ZHP3BlXLxmd8K2SNgkhNSi+UcecbnwWKwpP7kyi/uC75DJ1lOOBO3xrC4jyojtGE3YxKZPHfk4yrgug== + +"@eslint/object-schema@^2.1.4": + version "2.1.4" + resolved "https://registry.yarnpkg.com/@eslint/object-schema/-/object-schema-2.1.4.tgz#9e69f8bb4031e11df79e03db09f9dbbae1740843" + integrity sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ== + "@fontsource/source-sans-pro@^5.0.3": version "5.0.3" resolved "https://registry.yarnpkg.com/@fontsource/source-sans-pro/-/source-sans-pro-5.0.3.tgz#7d6e84a8169ba12fa5e6ce70757aa2ca7e74d855" @@ -2590,6 +2792,14 @@ teeny-request "^8.0.0" uuid "^8.0.0" +"@grpc/grpc-js@1.10.9": + version "1.10.9" + resolved "https://registry.yarnpkg.com/@grpc/grpc-js/-/grpc-js-1.10.9.tgz#468cc1549a3fe37b760a16745fb7685d91f4f10c" + integrity sha512-5tcgUctCG0qoNyfChZifz2tJqbRbXVO9J7X6duFcOjY3HUNCxg5D0ZCK7EP9vIcZ0zRpLU9bWkyCqVCLZ46IbQ== + dependencies: + "@grpc/proto-loader" "^0.7.13" + "@js-sdsl/ordered-map" "^4.4.2" + "@grpc/grpc-js@^1.10.9": version "1.10.10" resolved "https://registry.yarnpkg.com/@grpc/grpc-js/-/grpc-js-1.10.10.tgz#476d315feeb9dbb0f2d6560008c92688c30f13e0" @@ -2598,7 +2808,7 @@ "@grpc/proto-loader" "^0.7.13" "@js-sdsl/ordered-map" "^4.4.2" -"@grpc/proto-loader@^0.7.13": +"@grpc/proto-loader@0.7.13", "@grpc/proto-loader@^0.7.13": version "0.7.13" resolved "https://registry.yarnpkg.com/@grpc/proto-loader/-/proto-loader-0.7.13.tgz#f6a44b2b7c9f7b609f5748c6eac2d420e37670cf" integrity sha512-AiXO/bfe9bmxBjxxtYxFAXGZvMaN5s8kO+jBHAJCON8rJoB5YS/D6X7ZNc6XQkuHNmyl4CYaMI1fJ/Gn27RGGw== @@ -2608,18 +2818,32 @@ protobufjs "^7.2.5" yargs "^17.7.2" -"@hapi/hoek@^9.0.0": +"@hapi/hoek@^9.0.0", "@hapi/hoek@^9.3.0": version "9.3.0" resolved "https://registry.yarnpkg.com/@hapi/hoek/-/hoek-9.3.0.tgz#8368869dcb735be2e7f5cb7647de78e167a251fb" integrity sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ== -"@hapi/topo@^5.0.0": +"@hapi/topo@^5.0.0", "@hapi/topo@^5.1.0": version "5.1.0" resolved "https://registry.yarnpkg.com/@hapi/topo/-/topo-5.1.0.tgz#dc448e332c6c6e37a4dc02fd84ba8d44b9afb012" integrity sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg== dependencies: "@hapi/hoek" "^9.0.0" +"@hubspot/api-client@7.1.2": + version "7.1.2" + resolved "https://registry.yarnpkg.com/@hubspot/api-client/-/api-client-7.1.2.tgz#a405b0a18b8caa27f129fd510b2555e5a5cc2708" + integrity sha512-JVQqh0fdHf97ePk0Hg/7BJsiXNlS9HQRPiM/CLgvVWt5CIviSLQ/kHLZXREmZqTWu7BisjCgHxnSx/d7gRdr2g== + dependencies: + bluebird "^3.7.2" + bottleneck "^2.19.5" + btoa "^1.2.1" + es6-promise "^4.2.4" + form-data "^2.5.0" + lodash "^4.17.21" + node-fetch "^2.6.0" + url-parse "^1.4.3" + "@humanwhocodes/config-array@^0.11.14": version "0.11.14" resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.14.tgz#d78e481a039f7566ecc9660b4ea7fe6b1fec442b" @@ -2639,6 +2863,11 @@ resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz#4a2868d75d6d6963e423bcf90b7fd1be343409d3" integrity sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA== +"@humanwhocodes/retry@^0.3.0": + version "0.3.0" + resolved "https://registry.yarnpkg.com/@humanwhocodes/retry/-/retry-0.3.0.tgz#6d86b8cb322660f03d3f0aa94b99bdd8e172d570" + integrity sha512-d2CGZR2o7fS6sWB7DG/3a95bGKQyHMACZ5aW8qGkkqQpUoZV6C0X7Pc7l4ZNMZkfNBf4VWNe9E1jRsf0G146Ew== + "@hutson/parse-repository-url@^3.0.0": version "3.0.2" resolved "https://registry.yarnpkg.com/@hutson/parse-repository-url/-/parse-repository-url-3.0.2.tgz#98c23c950a3d9b6c8f0daed06da6c3af06981340" @@ -3192,6 +3421,11 @@ resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== +"@jridgewell/sourcemap-codec@^1.5.0": + version "1.5.0" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz#3188bcb273a414b0d215fd22a58540b989b9409a" + integrity sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ== + "@jridgewell/trace-mapping@0.3.9": version "0.3.9" resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz#6534fd5933a53ba7cbf3a17615e273a0d1273ff9" @@ -3223,6 +3457,13 @@ resolved "https://registry.yarnpkg.com/@jsdevtools/ono/-/ono-7.1.3.tgz#9df03bbd7c696a5c58885c34aa06da41c8543796" integrity sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg== +"@koa/cors@^5.0.0": + version "5.0.0" + resolved "https://registry.yarnpkg.com/@koa/cors/-/cors-5.0.0.tgz#0029b5f057fa0d0ae0e37dd2c89ece315a0daffd" + integrity sha512-x/iUDjcS90W69PryLDIMgFyV21YLTnG9zOpPXS7Bkt2b8AsY3zZsIpOLBkYr9fBcF3HbkKaER5hOBZLfpLgYNw== + dependencies: + vary "^1.1.2" + "@koa/router@8.0.8": version "8.0.8" resolved "https://registry.yarnpkg.com/@koa/router/-/router-8.0.8.tgz#95f32d11373d03d89dcb63fabe9ac6f471095236" @@ -3817,7 +4058,7 @@ dependencies: slash "^4.0.0" -"@rollup/plugin-commonjs@^16.0.0": +"@rollup/plugin-commonjs@16.0.0", "@rollup/plugin-commonjs@^16.0.0": version "16.0.0" resolved "https://registry.yarnpkg.com/@rollup/plugin-commonjs/-/plugin-commonjs-16.0.0.tgz#169004d56cd0f0a1d0f35915d31a036b0efe281f" integrity sha512-LuNyypCP3msCGVQJ7ki8PqYdpjfEkE/xtFa5DqlF+7IBD0JsfMZ87C58heSwIMint58sAUZbt3ITqOmdQv/dXw== @@ -3903,7 +4144,15 @@ is-module "^1.0.0" resolve "^1.22.1" -"@rollup/plugin-replace@^5.0.3": +"@rollup/plugin-replace@^2.4.2": + version "2.4.2" + resolved "https://registry.yarnpkg.com/@rollup/plugin-replace/-/plugin-replace-2.4.2.tgz#a2d539314fbc77c244858faa523012825068510a" + integrity sha512-IGcu+cydlUMZ5En85jxHH4qj2hta/11BHq95iHEyb2sbgiN0eCdzvUcHw5gt9pBL5lTi4JDYJ1acCoMGpTvEZg== + dependencies: + "@rollup/pluginutils" "^3.1.0" + magic-string "^0.25.7" + +"@rollup/plugin-replace@^5.0.2", "@rollup/plugin-replace@^5.0.3": version "5.0.7" resolved "https://registry.yarnpkg.com/@rollup/plugin-replace/-/plugin-replace-5.0.7.tgz#150c9ee9db8031d9e4580a61a0edeaaed3d37687" integrity sha512-PqxSfuorkHz/SPpyngLyg5GCEkOcee9M1bkxiVDr41Pd61mqP1PLOoDPbpl44SB2mQGKwV/In74gqQmGITOhEQ== @@ -3959,81 +4208,178 @@ resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.18.0.tgz#bbd0e616b2078cd2d68afc9824d1fadb2f2ffd27" integrity sha512-Tya6xypR10giZV1XzxmH5wr25VcZSncG0pZIjfePT0OVBvqNEurzValetGNarVrGiq66EBVAFn15iYX4w6FKgQ== +"@rollup/rollup-android-arm-eabi@4.21.0": + version "4.21.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.21.0.tgz#d941173f82f9b041c61b0dc1a2a91dcd06e4b31e" + integrity sha512-WTWD8PfoSAJ+qL87lE7votj3syLavxunWhzCnx3XFxFiI/BA/r3X7MUM8dVrH8rb2r4AiO8jJsr3ZjdaftmnfA== + "@rollup/rollup-android-arm64@4.18.0": version "4.18.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.18.0.tgz#97255ef6384c5f73f4800c0de91f5f6518e21203" integrity sha512-avCea0RAP03lTsDhEyfy+hpfr85KfyTctMADqHVhLAF3MlIkq83CP8UfAHUssgXTYd+6er6PaAhx/QGv4L1EiA== +"@rollup/rollup-android-arm64@4.21.0": + version "4.21.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.21.0.tgz#7e7157c8543215245ceffc445134d9e843ba51c0" + integrity sha512-a1sR2zSK1B4eYkiZu17ZUZhmUQcKjk2/j9Me2IDjk1GHW7LB5Z35LEzj9iJch6gtUfsnvZs1ZNyDW2oZSThrkA== + "@rollup/rollup-darwin-arm64@4.18.0": version "4.18.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.18.0.tgz#b6dd74e117510dfe94541646067b0545b42ff096" integrity sha512-IWfdwU7KDSm07Ty0PuA/W2JYoZ4iTj3TUQjkVsO/6U+4I1jN5lcR71ZEvRh52sDOERdnNhhHU57UITXz5jC1/w== +"@rollup/rollup-darwin-arm64@4.21.0": + version "4.21.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.21.0.tgz#f0a18a4fc8dc6eb1e94a51fa2adb22876f477947" + integrity sha512-zOnKWLgDld/svhKO5PD9ozmL6roy5OQ5T4ThvdYZLpiOhEGY+dp2NwUmxK0Ld91LrbjrvtNAE0ERBwjqhZTRAA== + "@rollup/rollup-darwin-x64@4.18.0": version "4.18.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.18.0.tgz#e07d76de1cec987673e7f3d48ccb8e106d42c05c" integrity sha512-n2LMsUz7Ynu7DoQrSQkBf8iNrjOGyPLrdSg802vk6XT3FtsgX6JbE8IHRvposskFm9SNxzkLYGSq9QdpLYpRNA== +"@rollup/rollup-darwin-x64@4.21.0": + version "4.21.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.21.0.tgz#34b7867613e5cc42d2b85ddc0424228cc33b43f0" + integrity sha512-7doS8br0xAkg48SKE2QNtMSFPFUlRdw9+votl27MvT46vo44ATBmdZdGysOevNELmZlfd+NEa0UYOA8f01WSrg== + "@rollup/rollup-linux-arm-gnueabihf@4.18.0": version "4.18.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.18.0.tgz#9f1a6d218b560c9d75185af4b8bb42f9f24736b8" integrity sha512-C/zbRYRXFjWvz9Z4haRxcTdnkPt1BtCkz+7RtBSuNmKzMzp3ZxdM28Mpccn6pt28/UWUCTXa+b0Mx1k3g6NOMA== +"@rollup/rollup-linux-arm-gnueabihf@4.21.0": + version "4.21.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.21.0.tgz#422b19ff9ae02b05d3395183d1d43b38c7c8be0b" + integrity sha512-pWJsfQjNWNGsoCq53KjMtwdJDmh/6NubwQcz52aEwLEuvx08bzcy6tOUuawAOncPnxz/3siRtd8hiQ32G1y8VA== + "@rollup/rollup-linux-arm-musleabihf@4.18.0": version "4.18.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.18.0.tgz#53618b92e6ffb642c7b620e6e528446511330549" integrity sha512-l3m9ewPgjQSXrUMHg93vt0hYCGnrMOcUpTz6FLtbwljo2HluS4zTXFy2571YQbisTnfTKPZ01u/ukJdQTLGh9A== +"@rollup/rollup-linux-arm-musleabihf@4.21.0": + version "4.21.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.21.0.tgz#568aa29195ef6fc57ec6ed3f518923764406a8ee" + integrity sha512-efRIANsz3UHZrnZXuEvxS9LoCOWMGD1rweciD6uJQIx2myN3a8Im1FafZBzh7zk1RJ6oKcR16dU3UPldaKd83w== + "@rollup/rollup-linux-arm64-gnu@4.18.0": version "4.18.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.18.0.tgz#99a7ba5e719d4f053761a698f7b52291cefba577" integrity sha512-rJ5D47d8WD7J+7STKdCUAgmQk49xuFrRi9pZkWoRD1UeSMakbcepWXPF8ycChBoAqs1pb2wzvbY6Q33WmN2ftw== +"@rollup/rollup-linux-arm64-gnu@4.21.0": + version "4.21.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.21.0.tgz#22309c8bcba9a73114f69165c72bc94b2fbec085" + integrity sha512-ZrPhydkTVhyeGTW94WJ8pnl1uroqVHM3j3hjdquwAcWnmivjAwOYjTEAuEDeJvGX7xv3Z9GAvrBkEzCgHq9U1w== + "@rollup/rollup-linux-arm64-musl@4.18.0": version "4.18.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.18.0.tgz#f53db99a45d9bc00ce94db8a35efa7c3c144a58c" integrity sha512-be6Yx37b24ZwxQ+wOQXXLZqpq4jTckJhtGlWGZs68TgdKXJgw54lUUoFYrg6Zs/kjzAQwEwYbp8JxZVzZLRepQ== +"@rollup/rollup-linux-arm64-musl@4.21.0": + version "4.21.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.21.0.tgz#c93c388af6d33f082894b8a60839d7265b2b9bc5" + integrity sha512-cfaupqd+UEFeURmqNP2eEvXqgbSox/LHOyN9/d2pSdV8xTrjdg3NgOFJCtc1vQ/jEke1qD0IejbBfxleBPHnPw== + "@rollup/rollup-linux-powerpc64le-gnu@4.18.0": version "4.18.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.18.0.tgz#cbb0837408fe081ce3435cf3730e090febafc9bf" integrity sha512-hNVMQK+qrA9Todu9+wqrXOHxFiD5YmdEi3paj6vP02Kx1hjd2LLYR2eaN7DsEshg09+9uzWi2W18MJDlG0cxJA== +"@rollup/rollup-linux-powerpc64le-gnu@4.21.0": + version "4.21.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.21.0.tgz#493c5e19e395cf3c6bd860c7139c8a903dea72b4" + integrity sha512-ZKPan1/RvAhrUylwBXC9t7B2hXdpb/ufeu22pG2psV7RN8roOfGurEghw1ySmX/CmDDHNTDDjY3lo9hRlgtaHg== + "@rollup/rollup-linux-riscv64-gnu@4.18.0": version "4.18.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.18.0.tgz#8ed09c1d1262ada4c38d791a28ae0fea28b80cc9" integrity sha512-ROCM7i+m1NfdrsmvwSzoxp9HFtmKGHEqu5NNDiZWQtXLA8S5HBCkVvKAxJ8U+CVctHwV2Gb5VUaK7UAkzhDjlg== +"@rollup/rollup-linux-riscv64-gnu@4.21.0": + version "4.21.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.21.0.tgz#a2eab4346fbe5909165ce99adb935ba30c9fb444" + integrity sha512-H1eRaCwd5E8eS8leiS+o/NqMdljkcb1d6r2h4fKSsCXQilLKArq6WS7XBLDu80Yz+nMqHVFDquwcVrQmGr28rg== + "@rollup/rollup-linux-s390x-gnu@4.18.0": version "4.18.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.18.0.tgz#938138d3c8e0c96f022252a28441dcfb17afd7ec" integrity sha512-0UyyRHyDN42QL+NbqevXIIUnKA47A+45WyasO+y2bGJ1mhQrfrtXUpTxCOrfxCR4esV3/RLYyucGVPiUsO8xjg== +"@rollup/rollup-linux-s390x-gnu@4.21.0": + version "4.21.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.21.0.tgz#0bc49a79db4345d78d757bb1b05e73a1b42fa5c3" + integrity sha512-zJ4hA+3b5tu8u7L58CCSI0A9N1vkfwPhWd/puGXwtZlsB5bTkwDNW/+JCU84+3QYmKpLi+XvHdmrlwUwDA6kqw== + "@rollup/rollup-linux-x64-gnu@4.18.0": version "4.18.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.18.0.tgz#1a7481137a54740bee1ded4ae5752450f155d942" integrity sha512-xuglR2rBVHA5UsI8h8UbX4VJ470PtGCf5Vpswh7p2ukaqBGFTnsfzxUBetoWBWymHMxbIG0Cmx7Y9qDZzr648w== +"@rollup/rollup-linux-x64-gnu@4.21.0": + version "4.21.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.21.0.tgz#4fd36a6a41f3406d8693321b13d4f9b7658dd4b9" + integrity sha512-e2hrvElFIh6kW/UNBQK/kzqMNY5mO+67YtEh9OA65RM5IJXYTWiXjX6fjIiPaqOkBthYF1EqgiZ6OXKcQsM0hg== + "@rollup/rollup-linux-x64-musl@4.18.0": version "4.18.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.18.0.tgz#f1186afc601ac4f4fc25fac4ca15ecbee3a1874d" integrity sha512-LKaqQL9osY/ir2geuLVvRRs+utWUNilzdE90TpyoX0eNqPzWjRm14oMEE+YLve4k/NAqCdPkGYDaDF5Sw+xBfg== +"@rollup/rollup-linux-x64-musl@4.21.0": + version "4.21.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.21.0.tgz#10ebb13bd4469cbad1a5d9b073bd27ec8a886200" + integrity sha512-1vvmgDdUSebVGXWX2lIcgRebqfQSff0hMEkLJyakQ9JQUbLDkEaMsPTLOmyccyC6IJ/l3FZuJbmrBw/u0A0uCQ== + "@rollup/rollup-win32-arm64-msvc@4.18.0": version "4.18.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.18.0.tgz#ed6603e93636a96203c6915be4117245c1bd2daf" integrity sha512-7J6TkZQFGo9qBKH0pk2cEVSRhJbL6MtfWxth7Y5YmZs57Pi+4x6c2dStAUvaQkHQLnEQv1jzBUW43GvZW8OFqA== +"@rollup/rollup-win32-arm64-msvc@4.21.0": + version "4.21.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.21.0.tgz#2fef1a90f1402258ef915ae5a94cc91a5a1d5bfc" + integrity sha512-s5oFkZ/hFcrlAyBTONFY1TWndfyre1wOMwU+6KCpm/iatybvrRgmZVM+vCFwxmC5ZhdlgfE0N4XorsDpi7/4XQ== + "@rollup/rollup-win32-ia32-msvc@4.18.0": version "4.18.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.18.0.tgz#14e0b404b1c25ebe6157a15edb9c46959ba74c54" integrity sha512-Txjh+IxBPbkUB9+SXZMpv+b/vnTEtFyfWZgJ6iyCmt2tdx0OF5WhFowLmnh8ENGNpfUlUZkdI//4IEmhwPieNg== +"@rollup/rollup-win32-ia32-msvc@4.21.0": + version "4.21.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.21.0.tgz#a18ad47a95c5f264defb60acdd8c27569f816fc1" + integrity sha512-G9+TEqRnAA6nbpqyUqgTiopmnfgnMkR3kMukFBDsiyy23LZvUCpiUwjTRx6ezYCjJODXrh52rBR9oXvm+Fp5wg== + "@rollup/rollup-win32-x64-msvc@4.18.0": version "4.18.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.18.0.tgz#5d694d345ce36b6ecf657349e03eb87297e68da4" integrity sha512-UOo5FdvOL0+eIVTgS4tIdbW+TtnBLWg1YBCcU2KWM7nuNwRz9bksDX1bekJJCpu25N1DVWaCwnT39dVQxzqS8g== +"@rollup/rollup-win32-x64-msvc@4.21.0": + version "4.21.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.21.0.tgz#20c09cf44dcb082140cc7f439dd679fe4bba3375" + integrity sha512-2jsCDZwtQvRhejHLfZ1JY6w6kEuEtfF9nzYsZxzSlNVKDX+DpsDJ+Rbjkm74nvg2rdx0gwBS+IMdvwJuq3S9pQ== + +"@roxi/routify@2.18.0": + version "2.18.0" + resolved "https://registry.yarnpkg.com/@roxi/routify/-/routify-2.18.0.tgz#8f88bedd936312d0dbe44cbc11ab179b1f938ec2" + integrity sha512-MVB50HN+VQWLzfjLplcBjsSBvwOiExKOmht2DuWR3WQ60JxQi9pSejkB06tFVkFKNXz2X5iYtKDqKBTdae/gRg== + dependencies: + "@roxi/ssr" "^0.2.1" + "@types/node" ">=4.2.0 < 13" + chalk "^4.0.0" + cheap-watch "^1.0.2" + commander "^7.1.0" + configent "^2.1.4" + esm "^3.2.25" + fs-extra "^9.0.1" + log-symbols "^3.0.0" + picomatch "^2.2.2" + rollup-pluginutils "^2.8.2" + "@roxi/routify@2.18.12": version "2.18.12" resolved "https://registry.yarnpkg.com/@roxi/routify/-/routify-2.18.12.tgz#901ca95b96f274ddddaefbf18424557ee1ae3fae" @@ -4069,14 +4415,22 @@ koa "^2.13.4" node-mocks-http "^1.11.0" -"@sideway/address@^4.1.3": +"@shopify/jest-koa-mocks@5.3.0": + version "5.3.0" + resolved "https://registry.yarnpkg.com/@shopify/jest-koa-mocks/-/jest-koa-mocks-5.3.0.tgz#0b9b6ce01a7ef945df7272aa08cda559c11b39f5" + integrity sha512-Yy9uS298/aWhT/bjfhUAcFRaq7pq7j0ybaI6U/vWQ5IcdWD3E73iqptkw+FNC+Z9cdV9QT8osFd0r0frFNb9Nw== + dependencies: + koa "^2.13.4" + node-mocks-http "^1.11.0" + +"@sideway/address@^4.1.3", "@sideway/address@^4.1.5": version "4.1.5" resolved "https://registry.yarnpkg.com/@sideway/address/-/address-4.1.5.tgz#4bc149a0076623ced99ca8208ba780d65a99b9d5" integrity sha512-IqO/DUQHUkPeixNQ8n0JA6102hT9CmaljNTPmQ1u8MEhBo/R4Q8eKLN/vGZxuebwOroDB4cbpjheD4+/sKFK4Q== dependencies: "@hapi/hoek" "^9.0.0" -"@sideway/formula@^3.0.0": +"@sideway/formula@^3.0.0", "@sideway/formula@^3.0.1": version "3.0.1" resolved "https://registry.yarnpkg.com/@sideway/formula/-/formula-3.0.1.tgz#80fcbcbaf7ce031e0ef2dd29b1bfc7c3f583611f" integrity sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg== @@ -4115,6 +4469,11 @@ resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.7.0.tgz#9a06f4f137ee84d7df0460c1fdb1135ffa6c50fd" integrity sha512-ONhaKPIufzzrlNbqtWFFd+jlnemX6lJAgq9ZeiZtS7I1PIf/la7CW4m83rTXRnVnsMbW2k56pGYu7AUFJD9Pow== +"@sindresorhus/is@^4.0.0": + version "4.6.0" + resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-4.6.0.tgz#3c7c9c46e678feefe7a2e5bb609d3dbd665ffb3f" + integrity sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw== + "@sinonjs/commons@^2.0.0": version "2.0.0" resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-2.0.0.tgz#fd4ca5b063554307e8327b4564bd56d3b73924a3" @@ -4916,7 +5275,14 @@ dependencies: defer-to-connect "^1.0.1" -"@techpass/passport-openidconnect@0.3.3": +"@szmarczak/http-timer@^4.0.5": + version "4.0.6" + resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-4.0.6.tgz#b4a914bb62e7c272d4e5989fe4440f812ab1d807" + integrity sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w== + dependencies: + defer-to-connect "^2.0.0" + +"@techpass/passport-openidconnect@0.3.3", "@techpass/passport-openidconnect@^0.3.0": version "0.3.3" resolved "https://registry.yarnpkg.com/@techpass/passport-openidconnect/-/passport-openidconnect-0.3.3.tgz#6c01c78bd8da0ca8917378dfbe18024702620352" integrity sha512-i2X/CofjnGBqpTmw6b+Ex3Co/NrR2xjnIHvnOJk62XIlJJHNSTwmhJ1PkXoA5RGKlxZWchADFGjLTJnebvRj7A== @@ -5096,6 +5462,16 @@ "@types/connect" "*" "@types/node" "*" +"@types/cacheable-request@^6.0.1": + version "6.0.3" + resolved "https://registry.yarnpkg.com/@types/cacheable-request/-/cacheable-request-6.0.3.tgz#a430b3260466ca7b5ca5bfd735693b36e7a9d183" + integrity sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw== + dependencies: + "@types/http-cache-semantics" "*" + "@types/keyv" "^3.1.4" + "@types/node" "*" + "@types/responselike" "^1.0.0" + "@types/caseless@*": version "0.12.2" resolved "https://registry.yarnpkg.com/@types/caseless/-/caseless-0.12.2.tgz#f65d3d6389e01eeb458bd54dc8f52b95a9463bc8" @@ -5187,6 +5563,21 @@ "@types/docker-modem" "*" "@types/node" "*" +"@types/eslint@*": + version "9.6.0" + resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-9.6.0.tgz#51d4fe4d0316da9e9f2c80884f2c20ed5fb022ff" + integrity sha512-gi6WQJ7cHRgZxtkQEoyHMppPjq9Kxo5Tjn2prSKDSmZrCz8TZ3jSRCeTJm+WoM+oB0WG37bRqLzaaU3q7JypGg== + dependencies: + "@types/estree" "*" + "@types/json-schema" "*" + +"@types/eslint__js@^8.42.3": + version "8.42.3" + resolved "https://registry.yarnpkg.com/@types/eslint__js/-/eslint__js-8.42.3.tgz#d1fa13e5c1be63a10b4e3afe992779f81c1179a0" + integrity sha512-alfG737uhmPdnvkrLdZLcEKJ/B8s9Y4hrZ+YAdzUeoArBlSUERA2E87ROfOaS4jd/C45fzOoZzidLc1IPwLqOw== + dependencies: + "@types/eslint" "*" + "@types/estree@*", "@types/estree@1.0.5", "@types/estree@^1.0.0", "@types/estree@^1.0.1": version "1.0.5" resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.5.tgz#a6ce3e556e00fd9895dd872dd172ad0d4bd687f4" @@ -5240,6 +5631,11 @@ resolved "https://registry.yarnpkg.com/@types/http-assert/-/http-assert-1.5.3.tgz#ef8e3d1a8d46c387f04ab0f2e8ab8cb0c5078661" integrity sha512-FyAOrDuQmBi8/or3ns4rwPno7/9tJTijVW6aQQjK02+kOQ8zmoNg2XJtAuQhvQcy1ASJq38wirX5//9J1EqoUA== +"@types/http-cache-semantics@*": + version "4.0.4" + resolved "https://registry.yarnpkg.com/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz#b979ebad3919799c979b17c72621c0bc0a31c6c4" + integrity sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA== + "@types/http-errors@*": version "2.0.1" resolved "https://registry.yarnpkg.com/@types/http-errors/-/http-errors-2.0.1.tgz#20172f9578b225f6c7da63446f56d4ce108d5a65" @@ -5279,7 +5675,7 @@ expect "^29.0.0" pretty-format "^29.0.0" -"@types/json-schema@^7.0.12", "@types/json-schema@^7.0.6", "@types/json-schema@^7.0.9": +"@types/json-schema@*", "@types/json-schema@^7.0.12", "@types/json-schema@^7.0.6", "@types/json-schema@^7.0.9": version "7.0.15" resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== @@ -5301,6 +5697,13 @@ resolved "https://registry.yarnpkg.com/@types/keygrip/-/keygrip-1.0.2.tgz#513abfd256d7ad0bf1ee1873606317b33b1b2a72" integrity sha512-GJhpTepz2udxGexqos8wgaBx4I/zWIDPh/KOGEwAqtuGDkOUJu5eFvwmdBX4AmB8Odsr+9pHCQqiAqDL/yKMKw== +"@types/keyv@^3.1.4": + version "3.1.4" + resolved "https://registry.yarnpkg.com/@types/keyv/-/keyv-3.1.4.tgz#3ccdb1c6751b0c7e52300bcdacd5bcbf8faa75b6" + integrity sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg== + dependencies: + "@types/node" "*" + "@types/koa-compose@*": version "3.2.5" resolved "https://registry.yarnpkg.com/@types/koa-compose/-/koa-compose-3.2.5.tgz#85eb2e80ac50be95f37ccf8c407c09bbe3468e9d" @@ -5308,13 +5711,37 @@ dependencies: "@types/koa" "*" -"@types/koa-send@^4.1.6": +"@types/koa-passport@^4.0.3": + version "4.0.3" + resolved "https://registry.yarnpkg.com/@types/koa-passport/-/koa-passport-4.0.3.tgz#063ec6310edee76cf854aadaa717b97f04b104fb" + integrity sha512-tNMYd/bcv0Zw7fc0CzEBYM9uUzVtn4XWzdUYfkTgSkEljP6nap7eI4E5x43ukrUQvztgXSYFkz3Uk+ujFeUzTg== + dependencies: + "@types/koa" "*" + "@types/passport" "*" + +"@types/koa-send@*", "@types/koa-send@^4.1.6": version "4.1.6" resolved "https://registry.yarnpkg.com/@types/koa-send/-/koa-send-4.1.6.tgz#15d90e95e3ccce669a15b6a3c56c3a650a167cea" integrity sha512-vgnNGoOJkx7FrF0Jl6rbK1f8bBecqAchKpXtKuXzqIEdXTDO6dsSTjr+eZ5m7ltSjH4K/E7auNJEQCAd0McUPA== dependencies: "@types/koa" "*" +"@types/koa-session@^6.4.5": + version "6.4.5" + resolved "https://registry.yarnpkg.com/@types/koa-session/-/koa-session-6.4.5.tgz#ac10bac507f4bb722fa6c55c33607b5c8769f779" + integrity sha512-Vc6+fslnPuMH2v9y80WYeo39UMo8mweuNNthKCwYU2ZE6l5vnRrzRU3BRvexKwsoI5sxsRl5CxDsBlLI8kY/XA== + dependencies: + "@types/cookies" "*" + "@types/koa" "*" + +"@types/koa-static@^4.0.2": + version "4.0.4" + resolved "https://registry.yarnpkg.com/@types/koa-static/-/koa-static-4.0.4.tgz#ce6f2a5d14cc7ef19f9bf6ee8e4f3eadfcc77323" + integrity sha512-j1AUzzl7eJYEk9g01hNTlhmipFh8RFbOQmaMNLvLcNNAkPw0bdTs3XTa3V045XFlrWN0QYnblbDJv2RzawTn6A== + dependencies: + "@types/koa" "*" + "@types/koa-send" "*" + "@types/koa@*": version "2.13.5" resolved "https://registry.yarnpkg.com/@types/koa/-/koa-2.13.5.tgz#64b3ca4d54e08c0062e89ec666c9f45443b21a61" @@ -5343,6 +5770,13 @@ "@types/koa-compose" "*" "@types/node" "*" +"@types/koa__cors@^5.0.0": + version "5.0.0" + resolved "https://registry.yarnpkg.com/@types/koa__cors/-/koa__cors-5.0.0.tgz#74567a045b599266e2cd3940cef96cedecc2ef1f" + integrity sha512-LCk/n25Obq5qlernGOK/2LUwa/2YJb2lxHUkkvYFDOpLXlVI6tKcdfCHRBQnOY4LwH6el5WOLs6PD/a8Uzau6g== + dependencies: + "@types/koa" "*" + "@types/koa__router@8.0.8": version "8.0.8" resolved "https://registry.yarnpkg.com/@types/koa__router/-/koa__router-8.0.8.tgz#b1e0e9a512498777d3366bbdf0e853df27ec831c" @@ -5434,15 +5868,22 @@ dependencies: undici-types "~5.26.4" +"@types/node@>=4.2.0 < 13", "@types/node@^12.20.52": + version "12.20.55" + resolved "https://registry.yarnpkg.com/@types/node/-/node-12.20.55.tgz#c329cbd434c42164f846b909bd6f85b5537f6240" + integrity sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ== + "@types/node@>=8.0.0 <15": version "14.18.37" resolved "https://registry.yarnpkg.com/@types/node/-/node-14.18.37.tgz#0bfcd173e8e1e328337473a8317e37b3b14fd30d" integrity sha512-7GgtHCs/QZrBrDzgIJnQtuSvhFSwhyYSI2uafSwZoNt1iOGhEN5fwNrQMjtONyHm9+/LoA4453jH0CMYcr06Pg== -"@types/node@^12.20.52": - version "12.20.55" - resolved "https://registry.yarnpkg.com/@types/node/-/node-12.20.55.tgz#c329cbd434c42164f846b909bd6f85b5537f6240" - integrity sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ== +"@types/node@>=8.1.0": + version "22.4.2" + resolved "https://registry.yarnpkg.com/@types/node/-/node-22.4.2.tgz#55fefb1c3dba2ecd7eb76738c6b80da75760523f" + integrity sha512-nAvM3Ey230/XzxtyDcJ+VjvlzpzoHwLsF7JaDRfoI0ytO0mVheerNmM45CtA0yOILXwXXxOrcUWH3wltX+7PSw== + dependencies: + undici-types "~6.19.2" "@types/node@^18.11.18": version "18.19.10" @@ -5451,11 +5892,25 @@ dependencies: undici-types "~5.26.4" +"@types/nodemailer@^6.4.4": + version "6.4.15" + resolved "https://registry.yarnpkg.com/@types/nodemailer/-/nodemailer-6.4.15.tgz#494be695e11c438f7f5df738fb4ab740312a6ed2" + integrity sha512-0EBJxawVNjPkng1zm2vopRctuWVCxk34JcIlRuXSf54habUWdz1FB7wHDqOqvDa8Mtpt0Q3LTXQkAs2LNyK5jQ== + dependencies: + "@types/node" "*" + "@types/normalize-package-data@^2.4.0": version "2.4.1" resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz#d3357479a0fdfdd5907fe67e17e0a85c906e1301" integrity sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw== +"@types/oauth@*": + version "0.9.5" + resolved "https://registry.yarnpkg.com/@types/oauth/-/oauth-0.9.5.tgz#acc4209bfa1c8d7d3aaf2c9ad0b32216a29616c1" + integrity sha512-+oQ3C2Zx6ambINOcdIARF5Z3Tu3x//HipE889/fqo3sgpQZbe9c6ExdQFtN6qlhpR7p83lTZfPJt0tCAW29dog== + dependencies: + "@types/node" "*" + "@types/oracledb@6.5.1": version "6.5.1" resolved "https://registry.yarnpkg.com/@types/oracledb/-/oracledb-6.5.1.tgz#17d021cabc9d216dfa6d3d65ae3ee585c33baab3" @@ -5463,6 +5918,37 @@ dependencies: "@types/node" "*" +"@types/passport-google-oauth@^1.0.42": + version "1.0.45" + resolved "https://registry.yarnpkg.com/@types/passport-google-oauth/-/passport-google-oauth-1.0.45.tgz#c986c787ec9706b4a596d2bae43342b50b54973d" + integrity sha512-O3Y3DDKnf9lR8+DSaUOCEGF6aFjVYdI8TLhQYtySZ3Sq75c5tGYJ0KJRDZw0GsyLD/Que0nqFkP/GnDVwZZL9w== + dependencies: + "@types/express" "*" + "@types/passport" "*" + +"@types/passport-microsoft@1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@types/passport-microsoft/-/passport-microsoft-1.0.0.tgz#a2ddc2200843570d38c35c53f6388e33df915b58" + integrity sha512-vD9ajSUc9Sz/8gdCj0ODUbPYQDxcI/imIDdgMPh//c5yMK/PgV6SNUXFLBzJo89Y30LU6bYAfXKn40WJqtMBiA== + dependencies: + "@types/passport-oauth2" "*" + +"@types/passport-oauth2@*": + version "1.4.17" + resolved "https://registry.yarnpkg.com/@types/passport-oauth2/-/passport-oauth2-1.4.17.tgz#d5d54339d44f6883d03e69dc0cc0e2114067abb4" + integrity sha512-ODiAHvso6JcWJ6ZkHHroVp05EHGhqQN533PtFNBkg8Fy5mERDqsr030AX81M0D69ZcaMvhF92SRckEk2B0HYYg== + dependencies: + "@types/express" "*" + "@types/oauth" "*" + "@types/passport" "*" + +"@types/passport@*": + version "1.0.16" + resolved "https://registry.yarnpkg.com/@types/passport/-/passport-1.0.16.tgz#5a2918b180a16924c4d75c31254c31cdca5ce6cf" + integrity sha512-FD0qD5hbPWQzaM0wHUnJ/T0BBCJBxCeemtnCwc/ThhTg3x9jfrAcRUmj5Dopza+MfFS9acTe3wk7rcVnRIp/0A== + dependencies: + "@types/express" "*" + "@types/pg@8.6.6": version "8.6.6" resolved "https://registry.yarnpkg.com/@types/pg/-/pg-8.6.6.tgz#21cdf873a3e345a6e78f394677e3b3b1b543cb80" @@ -5695,6 +6181,13 @@ resolved "https://registry.yarnpkg.com/@types/resolve/-/resolve-1.20.2.tgz#97d26e00cd4a0423b4af620abecf3e6f442b7975" integrity sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q== +"@types/responselike@^1.0.0": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@types/responselike/-/responselike-1.0.3.tgz#cc29706f0a397cfe6df89debfe4bf5cea159db50" + integrity sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw== + dependencies: + "@types/node" "*" + "@types/retry@*": version "0.12.5" resolved "https://registry.yarnpkg.com/@types/retry/-/retry-0.12.5.tgz#f090ff4bd8d2e5b940ff270ab39fd5ca1834a07e" @@ -5725,6 +6218,13 @@ dependencies: "@types/node" "*" +"@types/server-destroy@^1.0.1": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@types/server-destroy/-/server-destroy-1.0.3.tgz#2460932ea3a02a70ec99669c8f40ff089a5b8a2b" + integrity sha512-Qq0fn70C7TLDG1W9FCblKufNWW1OckQ41dVKV2Dku5KdZF7bexezG4e2WBaBKhdwL3HZ+cYCEIKwg2BRgzrWmA== + dependencies: + "@types/node" "*" + "@types/ssh2-streams@*": version "0.1.12" resolved "https://registry.yarnpkg.com/@types/ssh2-streams/-/ssh2-streams-0.1.12.tgz#e68795ba2bf01c76b93f9c9809e1f42f0eaaec5f" @@ -5826,7 +6326,7 @@ dependencies: "@types/node" "*" -"@types/uuid@8.3.4": +"@types/uuid@8.3.4", "@types/uuid@^8.3.4": version "8.3.4" resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-8.3.4.tgz#bd86a43617df0594787d38b735f55c805becf1bc" integrity sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw== @@ -5876,6 +6376,21 @@ dependencies: "@types/yargs-parser" "*" +"@typescript-eslint/eslint-plugin@7.18.0", "@typescript-eslint/eslint-plugin@^7.16.1": + version "7.18.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.18.0.tgz#b16d3cf3ee76bf572fdf511e79c248bdec619ea3" + integrity sha512-94EQTWZ40mzBc42ATNIBimBEDltSJ9RQHCC8vc/PDbxi4k8dVwUAv4o98dk50M1zB+JGFxp43FP7f8+FP8R6Sw== + dependencies: + "@eslint-community/regexpp" "^4.10.0" + "@typescript-eslint/scope-manager" "7.18.0" + "@typescript-eslint/type-utils" "7.18.0" + "@typescript-eslint/utils" "7.18.0" + "@typescript-eslint/visitor-keys" "7.18.0" + graphemer "^1.4.0" + ignore "^5.3.1" + natural-compare "^1.4.0" + ts-api-utils "^1.3.0" + "@typescript-eslint/eslint-plugin@7.3.1": version "7.3.1" resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.3.1.tgz#0d8f38a6c8a1802139e62184ee7a68ed024f30a1" @@ -5904,6 +6419,17 @@ "@typescript-eslint/visitor-keys" "6.9.0" debug "^4.3.4" +"@typescript-eslint/parser@7.18.0", "@typescript-eslint/parser@^7.16.1": + version "7.18.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-7.18.0.tgz#83928d0f1b7f4afa974098c64b5ce6f9051f96a0" + integrity sha512-4Z+L8I2OqhZV8qA132M4wNL30ypZGYOQVBfMgxDH/K5UX0PNqTu1c6za9ST5r9+tavvHiTWmBnKzpCJ/GlVFtg== + dependencies: + "@typescript-eslint/scope-manager" "7.18.0" + "@typescript-eslint/types" "7.18.0" + "@typescript-eslint/typescript-estree" "7.18.0" + "@typescript-eslint/visitor-keys" "7.18.0" + debug "^4.3.4" + "@typescript-eslint/parser@7.3.1": version "7.3.1" resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-7.3.1.tgz#c4ba7dc2744318a5e4506596cbc3a0086255c526" @@ -5931,6 +6457,14 @@ "@typescript-eslint/types" "6.9.0" "@typescript-eslint/visitor-keys" "6.9.0" +"@typescript-eslint/scope-manager@7.18.0": + version "7.18.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-7.18.0.tgz#c928e7a9fc2c0b3ed92ab3112c614d6bd9951c83" + integrity sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA== + dependencies: + "@typescript-eslint/types" "7.18.0" + "@typescript-eslint/visitor-keys" "7.18.0" + "@typescript-eslint/scope-manager@7.3.1": version "7.3.1" resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-7.3.1.tgz#73fd0cb4211a7be23e49e5b6efec8820caa6ec36" @@ -5939,6 +6473,16 @@ "@typescript-eslint/types" "7.3.1" "@typescript-eslint/visitor-keys" "7.3.1" +"@typescript-eslint/type-utils@7.18.0", "@typescript-eslint/type-utils@^7.2.0": + version "7.18.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-7.18.0.tgz#2165ffaee00b1fbbdd2d40aa85232dab6998f53b" + integrity sha512-XL0FJXuCLaDuX2sYqZUUSOJ2sG5/i1AAze+axqmLnSkNEVMVYLF+cbwlB2w8D1tinFuSikHmFta+P+HOofrLeA== + dependencies: + "@typescript-eslint/typescript-estree" "7.18.0" + "@typescript-eslint/utils" "7.18.0" + debug "^4.3.4" + ts-api-utils "^1.3.0" + "@typescript-eslint/type-utils@7.3.1": version "7.3.1" resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-7.3.1.tgz#cbf90d3d7e788466aa8a5c0ab3f46103f098aa0d" @@ -5964,6 +6508,11 @@ resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-6.9.0.tgz#86a0cbe7ac46c0761429f928467ff3d92f841098" integrity sha512-+KB0lbkpxBkBSiVCuQvduqMJy+I1FyDbdwSpM3IoBS7APl4Bu15lStPjgBIdykdRqQNYqYNMa8Kuidax6phaEw== +"@typescript-eslint/types@7.18.0": + version "7.18.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-7.18.0.tgz#b90a57ccdea71797ffffa0321e744f379ec838c9" + integrity sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ== + "@typescript-eslint/types@7.3.1": version "7.3.1" resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-7.3.1.tgz#ae104de8efa4227a462c0874d856602c5994413c" @@ -5995,6 +6544,20 @@ semver "^7.5.4" ts-api-utils "^1.0.1" +"@typescript-eslint/typescript-estree@7.18.0": + version "7.18.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-7.18.0.tgz#b5868d486c51ce8f312309ba79bdb9f331b37931" + integrity sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA== + dependencies: + "@typescript-eslint/types" "7.18.0" + "@typescript-eslint/visitor-keys" "7.18.0" + debug "^4.3.4" + globby "^11.1.0" + is-glob "^4.0.3" + minimatch "^9.0.4" + semver "^7.6.0" + ts-api-utils "^1.3.0" + "@typescript-eslint/typescript-estree@7.3.1": version "7.3.1" resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-7.3.1.tgz#598848195fad34c7aa73f548bd00a4d4e5f5e2bb" @@ -6022,6 +6585,16 @@ semver "^7.3.5" tsutils "^3.21.0" +"@typescript-eslint/utils@7.18.0", "@typescript-eslint/utils@^7.3.1": + version "7.18.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-7.18.0.tgz#bca01cde77f95fc6a8d5b0dbcbfb3d6ca4be451f" + integrity sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw== + dependencies: + "@eslint-community/eslint-utils" "^4.4.0" + "@typescript-eslint/scope-manager" "7.18.0" + "@typescript-eslint/types" "7.18.0" + "@typescript-eslint/typescript-estree" "7.18.0" + "@typescript-eslint/utils@7.3.1": version "7.3.1" resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-7.3.1.tgz#fc28fd508ccf89495012561b7c02a6fdad162460" @@ -6073,6 +6646,14 @@ "@typescript-eslint/types" "6.9.0" eslint-visitor-keys "^3.4.1" +"@typescript-eslint/visitor-keys@7.18.0": + version "7.18.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-7.18.0.tgz#0564629b6124d67607378d0f0332a0495b25e7d7" + integrity sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg== + dependencies: + "@typescript-eslint/types" "7.18.0" + eslint-visitor-keys "^3.4.3" + "@typescript-eslint/visitor-keys@7.3.1": version "7.3.1" resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-7.3.1.tgz#6ddef14a3ce2a79690f01176f5305c34d7b93d8c" @@ -6095,6 +6676,23 @@ "@vitest/utils" "0.29.8" chai "^4.3.7" +"@vitest/expect@2.0.5": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@vitest/expect/-/expect-2.0.5.tgz#f3745a6a2c18acbea4d39f5935e913f40d26fa86" + integrity sha512-yHZtwuP7JZivj65Gxoi8upUN2OzHTi3zVfjwdpu2WrvCZPLwsJ2Ey5ILIPccoW23dd/zQBlJ4/dhi7DWNyXCpA== + dependencies: + "@vitest/spy" "2.0.5" + "@vitest/utils" "2.0.5" + chai "^5.1.1" + tinyrainbow "^1.2.0" + +"@vitest/pretty-format@2.0.5", "@vitest/pretty-format@^2.0.5": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@vitest/pretty-format/-/pretty-format-2.0.5.tgz#91d2e6d3a7235c742e1a6cc50e7786e2f2979b1e" + integrity sha512-h8k+1oWHfwTkyTkb9egzwNMfJAEx4veaPSnMeKbVSjp4euqGSbQlm5+6VHwTr7u4FJslVVsUG5nopCaAYdOmSQ== + dependencies: + tinyrainbow "^1.2.0" + "@vitest/runner@0.29.8": version "0.29.8" resolved "https://registry.yarnpkg.com/@vitest/runner/-/runner-0.29.8.tgz#ede8a7be8a074ea1180bc1d1595bd879ed15971c" @@ -6104,6 +6702,23 @@ p-limit "^4.0.0" pathe "^1.1.0" +"@vitest/runner@2.0.5": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@vitest/runner/-/runner-2.0.5.tgz#89197e712bb93513537d6876995a4843392b2a84" + integrity sha512-TfRfZa6Bkk9ky4tW0z20WKXFEwwvWhRY+84CnSEtq4+3ZvDlJyY32oNTJtM7AW9ihW90tX/1Q78cb6FjoAs+ig== + dependencies: + "@vitest/utils" "2.0.5" + pathe "^1.1.2" + +"@vitest/snapshot@2.0.5": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@vitest/snapshot/-/snapshot-2.0.5.tgz#a2346bc5013b73c44670c277c430e0334690a162" + integrity sha512-SgCPUeDFLaM0mIUHfaArq8fD2WbaXG/zVXjRupthYfYGzc8ztbFbu6dUNOblBG7XLMR1kEhS/DNnfCZ2IhdDew== + dependencies: + "@vitest/pretty-format" "2.0.5" + magic-string "^0.30.10" + pathe "^1.1.2" + "@vitest/spy@0.29.8": version "0.29.8" resolved "https://registry.yarnpkg.com/@vitest/spy/-/spy-0.29.8.tgz#2e0c3b30e04d317b2197e3356234448aa432e131" @@ -6111,6 +6726,13 @@ dependencies: tinyspy "^1.0.2" +"@vitest/spy@2.0.5": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@vitest/spy/-/spy-2.0.5.tgz#590fc07df84a78b8e9dd976ec2090920084a2b9f" + integrity sha512-c/jdthAhvJdpfVuaexSrnawxZz6pywlTPe84LUB2m/4t3rl2fTo9NFGBG4oWgaD+FTgDDV8hJ/nibT7IfH3JfA== + dependencies: + tinyspy "^3.0.0" + "@vitest/utils@0.29.8": version "0.29.8" resolved "https://registry.yarnpkg.com/@vitest/utils/-/utils-0.29.8.tgz#423da85fd0c6633f3ab496cf7d2fc0119b850df8" @@ -6121,6 +6743,16 @@ loupe "^2.3.6" pretty-format "^27.5.1" +"@vitest/utils@2.0.5": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@vitest/utils/-/utils-2.0.5.tgz#6f8307a4b6bc6ceb9270007f73c67c915944e926" + integrity sha512-d8HKbqIcya+GR67mkZbrzhS5kKhtp8dQLcmRZLGTscGVg7yImT82cIrhtn2L8+VujWcy6KZweApgNmPsTAO/UQ== + dependencies: + "@vitest/pretty-format" "2.0.5" + estree-walker "^3.0.3" + loupe "^3.1.1" + tinyrainbow "^1.2.0" + "@yarnpkg/lockfile@^1.1.0": version "1.1.0" resolved "https://registry.yarnpkg.com/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz#e77a97fbd345b76d83245edcd17d393b1b41fb31" @@ -6186,7 +6818,7 @@ abortcontroller-polyfill@^1.4.0: resolved "https://registry.yarnpkg.com/abortcontroller-polyfill/-/abortcontroller-polyfill-1.7.5.tgz#6738495f4e901fbb57b6c0611d0c75f76c485bed" integrity sha512-JMJ5soJWP18htbbxJjG7bG6yuI6pRhgJ0scHHTfkUjf6wjP912xZWvM+A4sJK3gqd9E8fcPbDnOefbA9Th/FIQ== -abstract-leveldown@^6.2.1: +abstract-leveldown@^6.2.1, abstract-leveldown@^6.3.0: version "6.3.0" resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-6.3.0.tgz#d25221d1e6612f820c35963ba4bd739928f6026a" integrity sha512-TU5nlYgta8YrBMNpc9FwQzRbiXsj49gsALsXadbGHt9CROPzX5fB0rWDR5mtdpOOKa5XqRFpbj1QroPAoPzVjQ== @@ -6251,17 +6883,29 @@ acorn-import-assertions@^1.9.0: resolved "https://registry.yarnpkg.com/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz#507276249d684797c84e0734ef84860334cfb1ac" integrity sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA== +acorn-jsx-walk@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/acorn-jsx-walk/-/acorn-jsx-walk-2.0.0.tgz#a5ed648264e68282d7c2aead80216bfdf232573a" + integrity sha512-uuo6iJj4D4ygkdzd6jPtcxs8vZgDX9YFIkqczGImoypX2fQ4dVImmu3UzA4ynixCIMTrEOWW+95M2HuBaCEOVA== + acorn-jsx@^5.3.2: version "5.3.2" resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== +acorn-loose@^8.4.0: + version "8.4.0" + resolved "https://registry.yarnpkg.com/acorn-loose/-/acorn-loose-8.4.0.tgz#26d3e219756d1e180d006f5bcc8d261a28530f55" + integrity sha512-M0EUka6rb+QC4l9Z3T0nJEzNOO7JcoJlYMrBlyBCiFSXRyxjLKayd4TbQs2FDRWQU1h9FR7QVNHt+PEaoNL5rQ== + dependencies: + acorn "^8.11.0" + acorn-walk@^7.1.1: version "7.2.0" resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.2.0.tgz#0de889a601203909b0fbe07b8938dc21d2e967bc" integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA== -acorn-walk@^8.0.2, acorn-walk@^8.1.1, acorn-walk@^8.2.0: +acorn-walk@^8.0.2, acorn-walk@^8.1.1, acorn-walk@^8.2.0, acorn-walk@^8.3.3: version "8.3.3" resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.3.3.tgz#9caeac29eefaa0c41e3d4c65137de4d6f34df43e" integrity sha512-MxXdReSRhGO7VlFe1bRG/oI7/mdLV9B9JJT0N8vZOhF7gFRR5l3M8W9G8JxmKV+JC5mGqJ0QvqfSOLsCPa4nUw== @@ -6283,6 +6927,11 @@ acorn@^8.1.0, acorn@^8.10.0, acorn@^8.11.0, acorn@^8.11.3, acorn@^8.2.4, acorn@^ resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.12.0.tgz#1627bfa2e058148036133b8d9b51a700663c294c" integrity sha512-RTvkC4w+KNXrM39/lWCUaG0IbRkWdCv7W/IOW9oU6SawyxulvkQy5HQPVTKxEjczcUvapcrw3cFx/60VN/NRNw== +acorn@^8.12.0, acorn@^8.12.1: + version "8.12.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.12.1.tgz#71616bdccbe25e27a54439e0046e89ca76df2248" + integrity sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg== + add-stream@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/add-stream/-/add-stream-1.0.0.tgz#6a7990437ca736d5e1288db92bd3266d5f5cb2aa" @@ -6355,6 +7004,16 @@ ajv@^8.0.0, ajv@^8.1.0, ajv@^8.4.0: require-from-string "^2.0.2" uri-js "^4.2.2" +ajv@^8.17.1: + version "8.17.1" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.17.1.tgz#37d9a5c776af6bc92d7f4f9510eba4c0a60d11a6" + integrity sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g== + dependencies: + fast-deep-equal "^3.1.3" + fast-uri "^3.0.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + amdefine@>=0.0.4: version "1.0.1" resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" @@ -6749,6 +7408,11 @@ assertion-error@^1.1.0: resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b" integrity sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw== +assertion-error@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-2.0.1.tgz#f641a196b335690b1070bf00b6e7593fec190bf7" + integrity sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA== + ast-module-types@^2.7.1: version "2.7.1" resolved "https://registry.yarnpkg.com/ast-module-types/-/ast-module-types-2.7.1.tgz#3f7989ef8dfa1fdb82dfe0ab02bdfc7c77a57dd3" @@ -6776,6 +7440,13 @@ async-retry@^1.3.3: dependencies: retry "0.13.1" +async@^2.6.3: + version "2.6.4" + resolved "https://registry.yarnpkg.com/async/-/async-2.6.4.tgz#706b7ff6084664cd7eae713f6f965433b5504221" + integrity sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA== + dependencies: + lodash "^4.17.14" + async@^3.2.1, async@^3.2.3, async@^3.2.4: version "3.2.5" resolved "https://registry.yarnpkg.com/async/-/async-3.2.5.tgz#ebd52a8fdaf7a2289a24df399f8d8485c8a46b66" @@ -7079,6 +7750,11 @@ big-integer@^1.6.43: resolved "https://registry.yarnpkg.com/big-integer/-/big-integer-1.6.51.tgz#0df92a5d9880560d3ff2d5fd20245c889d130686" integrity sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg== +big.js@^5.2.2: + version "5.2.2" + resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" + integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== + bignumber.js@^2.4.0: version "2.4.0" resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-2.4.0.tgz#838a992da9f9d737e0f4b2db0be62bb09dd0c5e8" @@ -7163,6 +7839,11 @@ boolean@^3.0.1: resolved "https://registry.yarnpkg.com/boolean/-/boolean-3.2.0.tgz#9e5294af4e98314494cbb17979fa54ca159f116b" integrity sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw== +bottleneck@^2.19.5: + version "2.19.5" + resolved "https://registry.yarnpkg.com/bottleneck/-/bottleneck-2.19.5.tgz#5df0b90f59fd47656ebe63c78a98419205cadd91" + integrity sha512-VHiNCbI1lKdl44tGrhNfU3lup0Tj/ZBMJB5/2ZbNXRCPuRCO7ed2mgcK4r17y+KB2EfuYuRaVlwNbAeaWGSpbw== + bowser@^2.11.0: version "2.11.0" resolved "https://registry.yarnpkg.com/bowser/-/bowser-2.11.0.tgz#5ca3c35757a7aa5771500c70a73a9f91ef420a8f" @@ -7312,6 +7993,11 @@ bson@^6.7.0: resolved "https://registry.yarnpkg.com/bson/-/bson-6.8.0.tgz#5063c41ba2437c2b8ff851b50d9e36cb7aaa7525" integrity sha512-iOJg8pr7wq2tg/zSlCCHMi3hMm5JTOxLTagf3zxhcenHsFp+c6uOs6K7W5UE7A4QIJGtqh/ZovFNMP4mOPJynQ== +btoa@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/btoa/-/btoa-1.2.1.tgz#01a9909f8b2c93f6bf680ba26131eb30f7fa3d73" + integrity sha512-SB4/MIGlsiVkMcHmT+pSmIPoNDoHg+7cMzmt3Uxt628MTz2487DKSqK/fuhFBrkuqrYv5UCEnACpF4dTFNKc/g== + buffer-alloc-unsafe@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz#bd7dc26ae2972d0eda253be061dba992349c19f0" @@ -7515,6 +8201,11 @@ cache-content-type@^1.0.0: mime-types "^2.1.18" ylru "^1.2.0" +cacheable-lookup@^5.0.3: + version "5.0.4" + resolved "https://registry.yarnpkg.com/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz#5a6b865b2c44357be3d5ebc2a467b032719a7005" + integrity sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA== + cacheable-request@^2.1.1: version "2.1.4" resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-2.1.4.tgz#0d808801b6342ad33c91df9d0b44dc09b91e5c3d" @@ -7541,6 +8232,19 @@ cacheable-request@^6.0.0: normalize-url "^4.1.0" responselike "^1.0.2" +cacheable-request@^7.0.2: + version "7.0.4" + resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-7.0.4.tgz#7a33ebf08613178b403635be7b899d3e69bbe817" + integrity sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg== + dependencies: + clone-response "^1.0.2" + get-stream "^5.1.0" + http-cache-semantics "^4.0.0" + keyv "^4.0.0" + lowercase-keys "^2.0.0" + normalize-url "^6.0.1" + responselike "^2.0.0" + call-bind@^1.0.2, call-bind@^1.0.5, call-bind@^1.0.6, call-bind@^1.0.7: version "1.0.7" resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.7.tgz#06016599c40c56498c18769d2730be242b6fa3b9" @@ -7614,6 +8318,17 @@ chai@^4.3.7: pathval "^1.1.1" type-detect "^4.0.8" +chai@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/chai/-/chai-5.1.1.tgz#f035d9792a22b481ead1c65908d14bb62ec1c82c" + integrity sha512-pT1ZgP8rPNqUgieVaEY+ryQr6Q4HXNg8Ei9UnLUrjN4IA7dvQC5JB+/kxVcPNDHyBcc/26CXPkbNzq3qwrOEKA== + dependencies: + assertion-error "^2.0.1" + check-error "^2.1.1" + deep-eql "^5.0.1" + loupe "^3.1.0" + pathval "^2.0.0" + chalk@4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.0.tgz#4e14870a618d9e2edd97dd8345fd9d9dc315646a" @@ -7667,7 +8382,7 @@ charenc@0.0.2: resolved "https://registry.yarnpkg.com/charenc/-/charenc-0.0.2.tgz#c0a1d2f3a7092e03774bfa83f14c0fc5790a8667" integrity sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA== -cheap-watch@^1.0.4: +cheap-watch@^1.0.2, cheap-watch@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/cheap-watch/-/cheap-watch-1.0.4.tgz#0bcb4a3a8fbd9d5327936493f6b56baa668d8fef" integrity sha512-QR/9FrtRL5fjfUJBhAKCdi0lSRQ3rVRRum3GF9wDKp2TJbEIMGhUEr2yU8lORzm9Isdjx7/k9S0DFDx+z5VGtw== @@ -7679,6 +8394,11 @@ check-error@^1.0.3: dependencies: get-func-name "^2.0.2" +check-error@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/check-error/-/check-error-2.1.1.tgz#87eb876ae71ee388fa0471fe423f494be1d96ccc" + integrity sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw== + chokidar@3.5.3, chokidar@^3.5.2, chokidar@^3.5.3: version "3.5.3" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" @@ -7990,6 +8710,11 @@ 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.16.0, commander@^2.19.0, commander@^2.20.0, commander@^2.20.3, commander@^2.5.0, commander@^2.7.1, commander@^2.8.1: version "2.20.3" resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" @@ -8000,7 +8725,7 @@ commander@^5.1.0: resolved "https://registry.yarnpkg.com/commander/-/commander-5.1.0.tgz#46abbd1652f8e059bddaef99bbdcb2ad9cf179ae" integrity sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg== -commander@^7.2.0: +commander@^7.1.0, commander@^7.2.0: version "7.2.0" resolved "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7" integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== @@ -8130,7 +8855,7 @@ config-chain@^1.1.13: ini "^1.3.4" proto-list "~1.2.1" -configent@^2.2.0: +configent@^2.1.4, configent@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/configent/-/configent-2.2.0.tgz#2de230fc43f22c47cfd99016aa6962d6f9546994" integrity sha512-yIN6zfOWk2nycNJ2JFNiWEai0oiqAhISIht8+pbEBP8bdcpwoQ74AhCZPbUv9aRVJwo7wh1MbCBDUV44UJa7Kw== @@ -8159,6 +8884,14 @@ console-control-strings@^1.0.0, console-control-strings@^1.1.0: resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" integrity sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ== +console-stamp@^3.0.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/console-stamp/-/console-stamp-3.1.2.tgz#35dac393e16069a4d9d37b71ca6d5d13d7f3f8fd" + integrity sha512-ab66x3NxOTxPuq71dI6gXEiw2X6ql4Le5gZz0bm7FW3FSCB00eztra/oQUuCoCGlsyKOxtULnHwphzMrRtzMBg== + dependencies: + chalk "^4.1.2" + dateformat "^4.6.3" + consolidate@^0.16.0: version "0.16.0" resolved "https://registry.yarnpkg.com/consolidate/-/consolidate-0.16.0.tgz#a11864768930f2f19431660a65906668f5fbdc16" @@ -8711,6 +9444,11 @@ dayjs@^1.10.8: resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.11.tgz#dfe0e9d54c5f8b68ccf8ca5f72ac603e7e5ed59e" integrity sha512-okzr3f11N6WuqYtZSvm+F776mB41wRZMhKP+hc34YdW+KmtYYK9iqvHSwo2k9FEH3fhGXvOPV6yz2IcSrfRUDg== +dayjs@^1.8.15: + version "1.11.13" + resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.13.tgz#92430b0139055c3ebb60150aa13e860a4b5a366c" + integrity sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg== + dc-polyfill@^0.1.2: version "0.1.3" resolved "https://registry.yarnpkg.com/dc-polyfill/-/dc-polyfill-0.1.3.tgz#fe9eefc86813439dd46d6f9ad9582ec079c39720" @@ -8774,6 +9512,13 @@ debug@^3.1.0, debug@^3.2.6, debug@^3.2.7: dependencies: ms "^2.1.1" +debug@^4.3.5: + version "4.3.6" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.6.tgz#2ab2c38fbaffebf8aa95fdfe6d88438c7a13c52b" + integrity sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg== + dependencies: + ms "2.1.2" + debuglog@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/debuglog/-/debuglog-1.0.1.tgz#aa24ffb9ac3df9a2351837cfb2d279360cd78492" @@ -8886,6 +9631,11 @@ deep-eql@^4.1.3: dependencies: type-detect "^4.0.0" +deep-eql@^5.0.1: + version "5.0.2" + resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-5.0.2.tgz#4b756d8d770a9257300825d52a2c2cff99c3a341" + integrity sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q== + deep-equal@^2.0.5: version "2.2.0" resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-2.2.0.tgz#5caeace9c781028b9ff459f33b779346637c43e6" @@ -8924,6 +9674,11 @@ deep-is@^0.1.3, deep-is@~0.1.3: resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== +deepmerge-ts@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/deepmerge-ts/-/deepmerge-ts-5.1.0.tgz#c55206cc4c7be2ded89b9c816cf3608884525d7a" + integrity sha512-eS8dRJOckyo9maw9Tu5O5RUi/4inFLrnoLkBe3cPfDMx3WZioXtmOew4TXQaxq7Rhl4xjDtR7c6x8nNTxOvbFw== + deepmerge@^4.2.2: version "4.3.1" resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a" @@ -8941,6 +9696,11 @@ defer-to-connect@^1.0.1: resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-1.1.3.tgz#331ae050c08dcf789f8c83a7b81f0ed94f4ac591" integrity sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ== +defer-to-connect@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-2.0.1.tgz#8016bdb4143e4632b77a3449c6236277de520587" + integrity sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg== + deferred-leveldown@~0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/deferred-leveldown/-/deferred-leveldown-0.2.0.tgz#2cef1f111e1c57870d8bbb8af2650e587cd2f5b4" @@ -8984,6 +9744,11 @@ defined@^1.0.0: resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.1.tgz#c0b9db27bfaffd95d6f61399419b893df0f91ebf" integrity sha512-hsBd2qSVCRE+5PmNdHt1uzyrFu5d3RwmFDKzyNZMFq/EwDNJF7Ee5+D5oEKF0hU6LhtoUF1macFvOe4AskQC1Q== +defined@~0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/defined/-/defined-0.0.0.tgz#f35eea7d705e933baf13b2f03b3f83d921403b3e" + integrity sha512-zpqiCT8bODLu3QSmLLic8xJnYWBFjOSu/fBCm189oAiTtPq/PSanNACKZDS7kgSyCJY7P+IcODzlIogBK/9RBg== + delay@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/delay/-/delay-5.0.0.tgz#137045ef1b96e5071060dd5be60bf9334436bd1d" @@ -9019,6 +9784,34 @@ depd@^1.1.0, depd@~1.1.2: resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" integrity sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ== +dependency-cruiser@^16.3.7: + version "16.4.0" + resolved "https://registry.yarnpkg.com/dependency-cruiser/-/dependency-cruiser-16.4.0.tgz#a1b7d452acddf05045ae4f7942a2e9337aedad35" + integrity sha512-la/NnD23m6esCox8KMiZ/pcmtec6G/r7LgnJvkBepcErdzlGaxWnyaxtpoYB3fgODrU/7E2u81/nX5FNu5zfyw== + dependencies: + acorn "^8.12.1" + acorn-jsx "^5.3.2" + acorn-jsx-walk "^2.0.0" + acorn-loose "^8.4.0" + acorn-walk "^8.3.3" + ajv "^8.17.1" + commander "^12.1.0" + enhanced-resolve "^5.17.1" + ignore "^5.3.2" + interpret "^3.1.1" + is-installed-globally "^1.0.0" + json5 "^2.2.3" + memoize "^10.0.0" + picocolors "^1.0.1" + picomatch "^4.0.2" + prompts "^2.4.2" + rechoir "^0.8.0" + safe-regex "^2.1.1" + semver "^7.6.3" + teamcity-service-messages "^0.1.14" + tsconfig-paths-webpack-plugin "^4.1.0" + watskeburt "^4.1.0" + dependency-tree@^9.0.0: version "9.0.0" resolved "https://registry.yarnpkg.com/dependency-tree/-/dependency-tree-9.0.0.tgz#9288dd6daf35f6510c1ea30d9894b75369aa50a2" @@ -9279,6 +10072,13 @@ docker-compose@0.24.0: dependencies: yaml "^1.10.2" +docker-compose@^0.23.6: + version "0.23.19" + resolved "https://registry.yarnpkg.com/docker-compose/-/docker-compose-0.23.19.tgz#9947726e2fe67bdfa9e8efe1ff15aa0de2e10eb8" + integrity sha512-v5vNLIdUqwj4my80wxFDkNH+4S85zsRuH29SO7dCWVWPCMt/ohZBsGN6g6KXWifT0pzQ7uOxqEKCYCDPJ8Vz4g== + dependencies: + yaml "^1.10.2" + docker-compose@^0.24.6: version "0.24.6" resolved "https://registry.yarnpkg.com/docker-compose/-/docker-compose-0.24.6.tgz#d1f490a641bdb7ccc07c4d446b264f026f9a1f15" @@ -9487,6 +10287,24 @@ duplexify@^4.0.0, duplexify@^4.1.2: readable-stream "^3.1.1" stream-shift "^1.0.0" +dynalite@^3.2.1: + version "3.2.2" + resolved "https://registry.yarnpkg.com/dynalite/-/dynalite-3.2.2.tgz#34b4f4dd69638f17c0f7551a867959972c892441" + integrity sha512-sx9ZjTgMs/D4gHnba4rnBkw29648dHwHmywJet132KAbiq1ZyWx9W1fMd/eP9cPwTKDXyCBuTYOChE0qMDjaXQ== + dependencies: + async "^2.6.3" + big.js "^5.2.2" + buffer-crc32 "^0.2.13" + lazy "^1.0.11" + levelup "^4.4.0" + lock "^1.1.0" + memdown "^5.1.0" + minimist "^1.2.5" + once "^1.4.0" + subleveldown "^5.0.1" + optionalDependencies: + leveldown "^5.6.0" + eastasianwidth@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" @@ -9588,7 +10406,7 @@ encodeurl@^1.0.2: resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== -encoding-down@^6.3.0: +encoding-down@^6.2.0, encoding-down@^6.3.0: version "6.3.0" resolved "https://registry.yarnpkg.com/encoding-down/-/encoding-down-6.3.0.tgz#b1c4eb0e1728c146ecaef8e32963c549e76d082b" integrity sha512-QKrV0iKR6MZVJV08QY0wp1e7vF6QbhnbQhb07bwpEyuz4uZiZgPlEGdkCROuFkUwdxlFaiPIhjyarH1ee/3vhw== @@ -9651,6 +10469,14 @@ engine.io@~6.5.2: engine.io-parser "~5.2.1" ws "~8.17.1" +enhanced-resolve@^5.17.1, enhanced-resolve@^5.7.0: + version "5.17.1" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz#67bfbbcc2f81d511be77d686a90267ef7f898a15" + integrity sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg== + dependencies: + graceful-fs "^4.2.4" + tapable "^2.2.0" + enhanced-resolve@^5.8.3: version "5.14.1" resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.14.1.tgz#de684b6803724477a4af5d74ccae5de52c25f6b3" @@ -9691,6 +10517,11 @@ envinfo@7.8.1: resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.8.1.tgz#06377e3e5f4d379fea7ac592d5ad8927e0c4d475" integrity sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw== +err-code@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/err-code/-/err-code-1.1.2.tgz#06e0116d3028f6aef4806849eb0ea6a748ae6960" + integrity sha512-CJAN+O0/yA1CKfRn9SXOGctSpEM7DCon/r/5r2eXFMY2zCCJBasFhcM5I+1kh3Ap11FsQCX+vGHceNPvpWKhoA== + err-code@^2.0.2: version "2.0.3" resolved "https://registry.yarnpkg.com/err-code/-/err-code-2.0.3.tgz#23c2f3b756ffdfc608d30e27c9a941024807e7f9" @@ -9849,6 +10680,11 @@ es6-error@^4.0.1, es6-error@^4.1.1: resolved "https://registry.yarnpkg.com/es6-error/-/es6-error-4.1.1.tgz#9e3af407459deed47e9a91f9b885a84eb05c561d" integrity sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg== +es6-promise@^4.2.4: + version "4.2.8" + resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.8.tgz#4eb21594c972bc40553d276e510539143db53e0a" + integrity sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w== + esbuild-node-externals@^1.14.0: version "1.14.0" resolved "https://registry.yarnpkg.com/esbuild-node-externals/-/esbuild-node-externals-1.14.0.tgz#fc2950c67a068dc2b538fd1381ad7d8e20a6f54d" @@ -9885,6 +10721,35 @@ esbuild@^0.18.10, esbuild@^0.18.17: "@esbuild/win32-ia32" "0.18.20" "@esbuild/win32-x64" "0.18.20" +esbuild@^0.21.3: + version "0.21.5" + resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.21.5.tgz#9ca301b120922959b766360d8ac830da0d02997d" + integrity sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw== + optionalDependencies: + "@esbuild/aix-ppc64" "0.21.5" + "@esbuild/android-arm" "0.21.5" + "@esbuild/android-arm64" "0.21.5" + "@esbuild/android-x64" "0.21.5" + "@esbuild/darwin-arm64" "0.21.5" + "@esbuild/darwin-x64" "0.21.5" + "@esbuild/freebsd-arm64" "0.21.5" + "@esbuild/freebsd-x64" "0.21.5" + "@esbuild/linux-arm" "0.21.5" + "@esbuild/linux-arm64" "0.21.5" + "@esbuild/linux-ia32" "0.21.5" + "@esbuild/linux-loong64" "0.21.5" + "@esbuild/linux-mips64el" "0.21.5" + "@esbuild/linux-ppc64" "0.21.5" + "@esbuild/linux-riscv64" "0.21.5" + "@esbuild/linux-s390x" "0.21.5" + "@esbuild/linux-x64" "0.21.5" + "@esbuild/netbsd-x64" "0.21.5" + "@esbuild/openbsd-x64" "0.21.5" + "@esbuild/sunos-x64" "0.21.5" + "@esbuild/win32-arm64" "0.21.5" + "@esbuild/win32-ia32" "0.21.5" + "@esbuild/win32-x64" "0.21.5" + escalade@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" @@ -9958,6 +10823,18 @@ eslint-module-utils@^2.8.0: dependencies: debug "^3.2.7" +eslint-plugin-functional@^6.6.3: + version "6.6.3" + resolved "https://registry.yarnpkg.com/eslint-plugin-functional/-/eslint-plugin-functional-6.6.3.tgz#85b895afb91835c5ffa2eb97f473fd4182aa5228" + integrity sha512-sVbbvNvwX3HVkXAykKyoNLv57r4DPF7f1sy+/8j4YtzLYVQPGljMUWv3T6Kd4lwnnjmcKuj0EkIbS+knL6P5jw== + dependencies: + "@typescript-eslint/utils" "^7.3.1" + deepmerge-ts "^5.1.0" + escape-string-regexp "^4.0.0" + is-immutable-type "^4.0.0" + semver "^7.6.0" + ts-api-utils "^1.3.0" + eslint-plugin-import@^2.26.0, eslint-plugin-import@^2.29.0: version "2.29.1" resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz#d45b37b5ef5901d639c15270d74d46d161150643" @@ -10027,6 +10904,14 @@ eslint-scope@^7.0.0, eslint-scope@^7.2.2: esrecurse "^4.3.0" estraverse "^5.2.0" +eslint-scope@^8.0.2: + version "8.0.2" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-8.0.2.tgz#5cbb33d4384c9136083a71190d548158fe128f94" + integrity sha512-6E4xmrTw5wtxnLA5wYL3WDfhZ/1bUBGOXV0zQvVRDOtrR8D0p6W7fs3JweNYhwRYeGvd/1CKX2se0/2s7Q/nJA== + dependencies: + esrecurse "^4.3.0" + estraverse "^5.2.0" + eslint-visitor-keys@^2.0.0, eslint-visitor-keys@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" @@ -10037,6 +10922,11 @@ eslint-visitor-keys@^3.0.0, eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4 resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== +eslint-visitor-keys@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-4.0.0.tgz#e3adc021aa038a2a8e0b2f8b0ce8f66b9483b1fb" + integrity sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw== + eslint@^8.52.0, eslint@^8.56.0: version "8.57.0" resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.57.0.tgz#c786a6fd0e0b68941aaf624596fb987089195668" @@ -10081,11 +10971,60 @@ eslint@^8.52.0, eslint@^8.56.0: strip-ansi "^6.0.1" text-table "^0.2.0" +eslint@^9.7.0: + version "9.9.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-9.9.0.tgz#8d214e69ae4debeca7ae97daebbefe462072d975" + integrity sha512-JfiKJrbx0506OEerjK2Y1QlldtBxkAlLxT5OEcRF8uaQ86noDe2k31Vw9rnSWv+MXZHj7OOUV/dA0AhdLFcyvA== + dependencies: + "@eslint-community/eslint-utils" "^4.2.0" + "@eslint-community/regexpp" "^4.11.0" + "@eslint/config-array" "^0.17.1" + "@eslint/eslintrc" "^3.1.0" + "@eslint/js" "9.9.0" + "@humanwhocodes/module-importer" "^1.0.1" + "@humanwhocodes/retry" "^0.3.0" + "@nodelib/fs.walk" "^1.2.8" + ajv "^6.12.4" + chalk "^4.0.0" + cross-spawn "^7.0.2" + debug "^4.3.2" + escape-string-regexp "^4.0.0" + eslint-scope "^8.0.2" + eslint-visitor-keys "^4.0.0" + espree "^10.1.0" + esquery "^1.5.0" + esutils "^2.0.2" + fast-deep-equal "^3.1.3" + file-entry-cache "^8.0.0" + find-up "^5.0.0" + glob-parent "^6.0.2" + ignore "^5.2.0" + imurmurhash "^0.1.4" + is-glob "^4.0.0" + is-path-inside "^3.0.3" + json-stable-stringify-without-jsonify "^1.0.1" + levn "^0.4.1" + lodash.merge "^4.6.2" + minimatch "^3.1.2" + natural-compare "^1.4.0" + optionator "^0.9.3" + strip-ansi "^6.0.1" + text-table "^0.2.0" + esm@^3.2.25: version "3.2.25" resolved "https://registry.yarnpkg.com/esm/-/esm-3.2.25.tgz#342c18c29d56157688ba5ce31f8431fbb795cc10" integrity sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA== +espree@^10.0.1, espree@^10.1.0: + version "10.1.0" + resolved "https://registry.yarnpkg.com/espree/-/espree-10.1.0.tgz#8788dae611574c0f070691f522e4116c5a11fc56" + integrity sha512-M1M6CpiE6ffoigIOWYO9UDP8TMUw9kqb21tf+08IgDYjCsOvCuDt4jQcZmoYxx+w7zlKw9/N0KXfto+I8/FrXA== + dependencies: + acorn "^8.12.0" + acorn-jsx "^5.3.2" + eslint-visitor-keys "^4.0.0" + espree@^9.0.0, espree@^9.6.0, espree@^9.6.1: version "9.6.1" resolved "https://registry.yarnpkg.com/espree/-/espree-9.6.1.tgz#a2a17b8e434690a5432f2f8018ce71d331a48c6f" @@ -10122,6 +11061,13 @@ esquery@^1.4.2: dependencies: estraverse "^5.1.0" +esquery@^1.5.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.6.0.tgz#91419234f804d852a82dceec3e16cdc22cf9dae7" + integrity sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg== + dependencies: + estraverse "^5.1.0" + esrecurse@^4.3.0: version "4.3.0" resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" @@ -10252,6 +11198,21 @@ execa@^5.0.0: signal-exit "^3.0.3" strip-final-newline "^2.0.0" +execa@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/execa/-/execa-8.0.1.tgz#51f6a5943b580f963c3ca9c6321796db8cc39b8c" + integrity sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg== + dependencies: + cross-spawn "^7.0.3" + get-stream "^8.0.1" + human-signals "^5.0.0" + is-stream "^3.0.0" + merge-stream "^2.0.0" + npm-run-path "^5.1.0" + onetime "^6.0.0" + signal-exit "^4.1.0" + strip-final-newline "^3.0.0" + exif-parser@^0.1.12: version "0.1.12" resolved "https://registry.yarnpkg.com/exif-parser/-/exif-parser-0.1.12.tgz#58a9d2d72c02c1f6f02a0ef4a9166272b7760922" @@ -10392,6 +11353,11 @@ fast-text-encoding@^1.0.0: resolved "https://registry.yarnpkg.com/fast-text-encoding/-/fast-text-encoding-1.0.6.tgz#0aa25f7f638222e3396d72bf936afcf1d42d6867" integrity sha512-VhXlQgj9ioXCqGstD37E/HBeqEGV/qOD/kmbVG8h5xKBYvM1L3lR1Zn4555cQ8GkYbJa8aJSipLPndE1k6zK2w== +fast-uri@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/fast-uri/-/fast-uri-3.0.1.tgz#cddd2eecfc83a71c1be2cc2ef2061331be8a7134" + integrity sha512-MWipKbbYiYI0UC7cl8m/i/IWTqfC8YXsqjzybjddLsFjStroQzsHXkc73JutMvBiXmOvapk+axIl79ig5t55Bw== + fast-url-parser@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/fast-url-parser/-/fast-url-parser-1.1.3.tgz#f4af3ea9f34d8a271cf58ad2b3759f431f0b318d" @@ -10406,6 +11372,13 @@ fast-xml-parser@4.2.5: dependencies: strnum "^1.0.5" +fast-xml-parser@^4.1.3: + version "4.4.1" + resolved "https://registry.yarnpkg.com/fast-xml-parser/-/fast-xml-parser-4.4.1.tgz#86dbf3f18edf8739326447bcaac31b4ae7f6514f" + integrity sha512-xkjOecfnKGkSsOwtZ5Pz7Us/T6mrbPQrq0nh+aCO5V9nk5NLWmasAHumTKjiPJPWANe+kAZ84Jc8ooJkzZ88Sw== + dependencies: + strnum "^1.0.5" + fast-xml-parser@^4.2.2, fast-xml-parser@^4.2.5: version "4.4.0" resolved "https://registry.yarnpkg.com/fast-xml-parser/-/fast-xml-parser-4.4.0.tgz#341cc98de71e9ba9e651a67f41f1752d1441a501" @@ -10486,6 +11459,13 @@ file-entry-cache@^6.0.1: dependencies: flat-cache "^3.0.4" +file-entry-cache@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-8.0.0.tgz#7787bddcf1131bffb92636c69457bbc0edd6d81f" + integrity sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ== + dependencies: + flat-cache "^4.0.0" + file-type@^11.1.0: version "11.1.0" resolved "https://registry.yarnpkg.com/file-type/-/file-type-11.1.0.tgz#93780f3fed98b599755d846b99a1617a2ad063b8" @@ -10620,6 +11600,14 @@ flat-cache@^3.0.4: flatted "^3.1.0" rimraf "^3.0.2" +flat-cache@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-4.0.1.tgz#0ece39fcb14ee012f4b0410bd33dd9c1f011127c" + integrity sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw== + dependencies: + flatted "^3.2.9" + keyv "^4.5.4" + flat@^5.0.2: version "5.0.2" resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" @@ -10630,6 +11618,11 @@ flatted@^3.1.0: resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.5.tgz#76c8584f4fc843db64702a6bd04ab7a8bd666da3" integrity sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg== +flatted@^3.2.9: + version "3.3.1" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.1.tgz#21db470729a6734d4997002f439cb308987f567a" + integrity sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw== + flatten@^1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/flatten/-/flatten-1.0.3.tgz#c1283ac9f27b368abc1e36d1ff7b04501a30356b" @@ -10761,7 +11754,7 @@ fs-extra@^11.1.0, fs-extra@^11.1.1: jsonfile "^6.0.1" universalify "^2.0.0" -fs-extra@^9.0.0, fs-extra@^9.1.0: +fs-extra@^9.0.0, fs-extra@^9.0.1, fs-extra@^9.1.0: version "9.1.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== @@ -10790,7 +11783,7 @@ fs.realpath@^1.0.0: resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== -fsevents@^2.3.2, fsevents@~2.3.2: +fsevents@^2.3.2, fsevents@~2.3.2, fsevents@~2.3.3: version "2.3.3" resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== @@ -10810,7 +11803,7 @@ function.prototype.name@^1.1.6: es-abstract "^1.22.1" functions-have-names "^1.2.3" -functional-red-black-tree@^1.0.1: +functional-red-black-tree@^1.0.1, functional-red-black-tree@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= @@ -11031,6 +12024,11 @@ get-stream@^6.0.0: resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== +get-stream@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-8.0.1.tgz#def9dfd71742cd7754a7761ed43749a27d02eca2" + integrity sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA== + get-symbol-description@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.2.tgz#533744d5aa20aca4e079c8e5daf7fd44202821f5" @@ -11173,6 +12171,18 @@ glob@^10.0.0, glob@^10.2.2: minipass "^7.1.2" path-scurry "^1.11.1" +glob@^10.3.7: + version "10.4.5" + resolved "https://registry.yarnpkg.com/glob/-/glob-10.4.5.tgz#f4d9f0b90ffdbab09c9d77f5f29b4262517b0956" + integrity sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg== + dependencies: + foreground-child "^3.1.0" + jackspeak "^3.1.2" + minimatch "^9.0.4" + minipass "^7.1.2" + package-json-from-dist "^1.0.0" + path-scurry "^1.11.1" + glob@^5.0.15: version "5.0.15" resolved "https://registry.yarnpkg.com/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1" @@ -11229,6 +12239,13 @@ global-agent@3.0.0: semver "^7.3.2" serialize-error "^7.0.1" +global-directory@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/global-directory/-/global-directory-4.0.1.tgz#4d7ac7cfd2cb73f304c53b8810891748df5e361e" + integrity sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q== + dependencies: + ini "4.1.1" + global-dirs@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-3.0.1.tgz#0c488971f066baceda21447aecb1a8b911d22485" @@ -11256,6 +12273,11 @@ globals@^13.19.0: dependencies: type-fest "^0.20.2" +globals@^14.0.0: + version "14.0.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-14.0.0.tgz#898d7413c29babcf6bafe56fcadded858ada724e" + integrity sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ== + globalthis@^1.0.1, globalthis@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.3.tgz#5852882a52b80dc301b0660273e1ed082f0b6ccf" @@ -11359,6 +12381,23 @@ gopd@^1.0.1: dependencies: get-intrinsic "^1.1.3" +got@^11.8.6: + version "11.8.6" + resolved "https://registry.yarnpkg.com/got/-/got-11.8.6.tgz#276e827ead8772eddbcfc97170590b841823233a" + integrity sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g== + dependencies: + "@sindresorhus/is" "^4.0.0" + "@szmarczak/http-timer" "^4.0.5" + "@types/cacheable-request" "^6.0.1" + "@types/responselike" "^1.0.0" + cacheable-lookup "^5.0.3" + cacheable-request "^7.0.2" + decompress-response "^6.0.0" + http2-wrapper "^1.0.0-beta.5.2" + lowercase-keys "^2.0.0" + p-cancelable "^2.0.0" + responselike "^2.0.0" + got@^8.3.1: version "8.3.2" resolved "https://registry.yarnpkg.com/got/-/got-8.3.2.tgz#1d23f64390e97f776cac52e5b936e5f514d2e937" @@ -11758,6 +12797,14 @@ http-signature@~1.2.0: jsprim "^1.2.2" sshpk "^1.7.0" +http2-wrapper@^1.0.0-beta.5.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/http2-wrapper/-/http2-wrapper-1.0.3.tgz#b8f55e0c1f25d4ebd08b3b0c2c079f9590800b3d" + integrity sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg== + dependencies: + quick-lru "^5.1.1" + resolve-alpn "^1.0.0" + https-proxy-agent@^5.0.0, https-proxy-agent@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6" @@ -11779,6 +12826,11 @@ human-signals@^2.1.0: resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== +human-signals@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-5.0.0.tgz#42665a284f9ae0dade3ba41ebc37eb4b852f3a28" + integrity sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ== + humanize-ms@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/humanize-ms/-/humanize-ms-1.2.1.tgz#c46e3159a293f6b896da29316d8b6fe8bb79bbed" @@ -11791,6 +12843,11 @@ husky@^8.0.3: resolved "https://registry.yarnpkg.com/husky/-/husky-8.0.3.tgz#4936d7212e46d1dea28fef29bb3a108872cd9184" integrity sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg== +husky@^9.1.4: + version "9.1.5" + resolved "https://registry.yarnpkg.com/husky/-/husky-9.1.5.tgz#2b6edede53ee1adbbd3a3da490628a23f5243b83" + integrity sha512-rowAVRUBfI0b4+niA4SJMhfQwc107VLkBUgEYYAOQAbqDCnra1nYh83hF/MDmhYs9t9n1E3DuKOrs2LYNC+0Ag== + ical-generator@4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/ical-generator/-/ical-generator-4.1.0.tgz#2a336c951864c5583a2aa715d16f2edcdfd2d90b" @@ -11868,6 +12925,11 @@ ignore@^5.0.4, ignore@^5.2.0, ignore@^5.2.4: resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.0.tgz#67418ae40d34d6999c95ff56016759c718c82f78" integrity sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg== +ignore@^5.3.1, ignore@^5.3.2: + version "5.3.2" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.2.tgz#3cd40e729f3643fd87cb04e50bf0eb722bc596f5" + integrity sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g== + image-q@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/image-q/-/image-q-4.0.0.tgz#31e075be7bae3c1f42a85c469b4732c358981776" @@ -11885,6 +12947,11 @@ immediate@~3.0.5: resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.0.6.tgz#9db1dbd0faf8de6fbe0f5dd5e56bb606280de69b" integrity sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ== +immediate@~3.2.3: + version "3.2.3" + resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.2.3.tgz#d140fa8f614659bd6541233097ddaac25cdd991c" + integrity sha512-RrGCXRm/fRVqMIhqXrGEX9rRADavPiDFSoMb/k64i9XMk8uH4r/Omi5Ctierj6XzNecwDbO4WuFbDD1zmpl3Tg== + import-cwd@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/import-cwd/-/import-cwd-3.0.0.tgz#20845547718015126ea9b3676b7592fb8bd4cf92" @@ -11983,6 +13050,11 @@ ini@2.0.0: resolved "https://registry.yarnpkg.com/ini/-/ini-2.0.0.tgz#e5fd556ecdd5726be978fa1001862eacb0a94bc5" integrity sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA== +ini@4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/ini/-/ini-4.1.1.tgz#d95b3d843b1e906e56d6747d5447904ff50ce7a1" + integrity sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g== + ini@^1.3.2, ini@^1.3.4, ini@^1.3.8, ini@~1.3.0: version "1.3.8" resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" @@ -12060,6 +13132,11 @@ interpret@^2.2.0: resolved "https://registry.yarnpkg.com/interpret/-/interpret-2.2.0.tgz#1a78a0b5965c40a5416d007ad6f50ad27c417df9" integrity sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw== +interpret@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/interpret/-/interpret-3.1.1.tgz#5be0ceed67ca79c6c4bc5cf0d7ee843dcea110c4" + integrity sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ== + into-stream@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/into-stream/-/into-stream-3.1.0.tgz#96fb0a936c12babd6ff1752a17d05616abd094c6" @@ -12236,6 +13313,11 @@ is-docker@^2.0.0, is-docker@^2.1.1: resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== +is-electron@^2.2.0: + version "2.2.2" + resolved "https://registry.yarnpkg.com/is-electron/-/is-electron-2.2.2.tgz#3778902a2044d76de98036f5dc58089ac4d80bb9" + integrity sha512-FO/Rhvz5tuw4MCWkpMzHFKWD2LsfHzIb7i6MdPYZ/KW7AlxawyLkqdy+jPZP1WubqEADE3O4FUENlJHDfQASRg== + is-extendable@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" @@ -12285,6 +13367,15 @@ is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: dependencies: is-extglob "^2.1.1" +is-immutable-type@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/is-immutable-type/-/is-immutable-type-4.0.0.tgz#d62ad1ff411eef8dfa3a87222960ec3b645db1a1" + integrity sha512-gyFBCXv+NikTs8/PGZhgjbMmFZQ5jvHGZIsVu6+/9Bk4K7imlWBIDN7hTr9fNioGzFg71I4YM3z8f0aKXarTAw== + dependencies: + "@typescript-eslint/type-utils" "^7.2.0" + ts-api-utils "^1.3.0" + ts-declaration-location "^1.0.0" + is-installed-globally@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-0.4.0.tgz#9a0fd407949c30f86eb6959ef1b7994ed0b7b520" @@ -12293,6 +13384,14 @@ is-installed-globally@^0.4.0: global-dirs "^3.0.0" is-path-inside "^3.0.2" +is-installed-globally@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-1.0.0.tgz#08952c43758c33d815692392f7f8437b9e436d5a" + integrity sha512-K55T22lfpQ63N4KEN57jZUAaAYqYHEe8veb/TycJRk9DdSCLLcovXz/mL6mOnhQaZsQGwPhuFopdQIlqGSEjiQ== + dependencies: + global-directory "^4.0.1" + is-path-inside "^4.0.0" + is-interactive@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-interactive/-/is-interactive-1.0.0.tgz#cea6e6ae5c870a7b0a0004070b7b587e0252912e" @@ -12372,6 +13471,11 @@ is-path-inside@^3.0.2, is-path-inside@^3.0.3: resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== +is-path-inside@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-4.0.0.tgz#805aeb62c47c1b12fc3fd13bfb3ed1e7430071db" + integrity sha512-lJJV/5dYS+RcL8uQdBDW9c9uWFLLBNRyFhnAKXw5tVqLlKZ4RMGZKv+YQ/IA3OhD+RpbJa1LLFM1FQPGyIXvOA== + is-plain-obj@^1.0.0, is-plain-obj@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" @@ -12482,6 +13586,11 @@ is-stream@^2.0.0, is-stream@^2.0.1: resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== +is-stream@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-3.0.0.tgz#e6bfd7aa6bef69f4f472ce9bb681e3e57b4319ac" + integrity sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA== + is-string@^1.0.5, is-string@^1.0.7: version "1.0.7" resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" @@ -12840,6 +13949,15 @@ jest-docblock@^29.7.0: dependencies: detect-newline "^3.0.0" +jest-dynalite@^3.6.1: + version "3.6.1" + resolved "https://registry.yarnpkg.com/jest-dynalite/-/jest-dynalite-3.6.1.tgz#8bae305a3c33d9a8036f563827b173b54a323ca5" + integrity sha512-MERtTt8Pj39vFmbItMC3YuIaqLf1kh/pJIE0DRcjeP/2Fa8Nni9IxwN6XWIMgXNbFKtlOM6ppH+Bsy0rWIdPiw== + dependencies: + "@aws/dynamodb-auto-marshaller" "^0.7.1" + dynalite "^3.2.1" + setimmediate "^1.0.5" + jest-each@^29.7.0: version "29.7.0" resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-29.7.0.tgz#162a9b3f2328bdd991beaabffbb74745e56577d1" @@ -13172,6 +14290,17 @@ joi@17.6.0: "@sideway/formula" "^3.0.0" "@sideway/pinpoint" "^2.0.0" +joi@^17.13.1: + version "17.13.3" + resolved "https://registry.yarnpkg.com/joi/-/joi-17.13.3.tgz#0f5cc1169c999b30d344366d384b12d92558bcec" + integrity sha512-otDA4ldcIx+ZXsKHWmp0YizCweVRZG96J10b0FevjfuncLO1oX59THoAmHkNubYJ+9gWsYsp5k8v4ib6oDv1fA== + dependencies: + "@hapi/hoek" "^9.3.0" + "@hapi/topo" "^5.1.0" + "@sideway/address" "^4.1.5" + "@sideway/formula" "^3.0.1" + "@sideway/pinpoint" "^2.0.0" + join-component@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/join-component/-/join-component-1.1.0.tgz#b8417b750661a392bee2c2537c68b2a9d4977cd5" @@ -13324,6 +14453,11 @@ json-buffer@3.0.0: resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.0.tgz#5b1f397afc75d677bde8bcfc0e47e1f9a3d9a898" integrity sha512-CuUqjv0FUZIdXkHPI8MezCnFCdaTAacej1TZYulLoAg1h/PhwkdXFN4V/gzY4g+fMBCOV2xF+rp7t2XD2ns/NQ== +json-buffer@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" + integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== + json-format-highlight@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/json-format-highlight/-/json-format-highlight-1.0.4.tgz#2e44277edabcec79a3d2c84e984c62e2258037b9" @@ -13476,6 +14610,11 @@ jws@^4.0.0: jwa "^2.0.0" safe-buffer "^5.0.1" +jwt-decode@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/jwt-decode/-/jwt-decode-4.0.0.tgz#2270352425fd413785b2faf11f6e755c5151bd4b" + integrity sha512-+KJGIyHgkGuIq3IEBNftfhW/LfWhXUIY6OmyVWjliu5KH1y0fw7VQ8YndE2O4qZdMSd9SqbnC8GOcZEy0Om7sA== + keygrip@~1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/keygrip/-/keygrip-1.1.0.tgz#871b1681d5e159c62a445b0c74b615e0917e7226" @@ -13497,6 +14636,13 @@ keyv@^3.0.0: dependencies: json-buffer "3.0.0" +keyv@^4.0.0, keyv@^4.5.4: + version "4.5.4" + resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" + integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== + dependencies: + json-buffer "3.0.1" + kill-port@^1.6.1: version "1.6.1" resolved "https://registry.yarnpkg.com/kill-port/-/kill-port-1.6.1.tgz#560fe79484583bdf3a5e908557dae614447618aa" @@ -13598,7 +14744,7 @@ koa-mount@^4.0.0: debug "^4.0.1" koa-compose "^4.1.0" -koa-passport@4.1.4: +koa-passport@4.1.4, koa-passport@^4.1.4: version "4.1.4" resolved "https://registry.yarnpkg.com/koa-passport/-/koa-passport-4.1.4.tgz#5f1665c1c2a37ace79af9f970b770885ca30ccfa" integrity sha512-dJBCkl4X+zdYxbI2V2OtoGy0PUenpvp2ZLLWObc8UJhsId0iQpTFT8RVcuA0709AL2txGwRHnSPoT1bYNGa6Kg== @@ -13639,7 +14785,7 @@ koa-send@5.0.1, koa-send@^5.0.0: http-errors "^1.7.3" resolve-path "^1.4.0" -koa-session@5.13.1: +koa-session@5.13.1, koa-session@^5.12.0: version "5.13.1" resolved "https://registry.yarnpkg.com/koa-session/-/koa-session-5.13.1.tgz#a47e39015a4b464e21e3e1e2deeca48eb83916ee" integrity sha512-TfYiun6xiFosyfIJKnEw0aoG5XmLIwM+K3OVWfkz84qY0NP2gbk0F/olRn0/Hrxq0f14s8amHVXeWyKYH3Cx3Q== @@ -13657,7 +14803,7 @@ koa-static@5.0.0, koa-static@^5.0.0: debug "^3.1.0" koa-send "^5.0.0" -koa-useragent@^4.1.0: +koa-useragent@4.1.0, koa-useragent@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/koa-useragent/-/koa-useragent-4.1.0.tgz#d3f128b552c6da3e5e9e9e9c887b2922b16e4468" integrity sha512-x/HUDZ1zAmNNh5hA9hHbPm9p3UVg2prlpHzxCXQCzbibrNS0kmj7MkCResCbAbG7ZT6FVxNSMjR94ZGamdMwxA== @@ -13757,6 +14903,11 @@ latest-version@^5.1.0: dependencies: package-json "^6.3.0" +lazy@^1.0.11: + version "1.0.11" + resolved "https://registry.yarnpkg.com/lazy/-/lazy-1.0.11.tgz#daa068206282542c088288e975c297c1ae77b690" + integrity sha512-Y+CjUfLmIpoUCCRl0ub4smrYtGGr5AOa2AKOaWelGHOGz33X/Y/KizefGqbkwfz44+cnq/+9habclf8vOmu2LA== + lazystream@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/lazystream/-/lazystream-1.0.1.tgz#494c831062f1f9408251ec44db1cba29242a2638" @@ -13950,6 +15101,13 @@ level-js@^5.0.0: inherits "^2.0.3" ltgt "^2.1.2" +level-option-wrap@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/level-option-wrap/-/level-option-wrap-1.1.0.tgz#ad20e68d9f3c22c8897531cc6aa7af596b1ed129" + integrity sha512-gQouC22iCqHuBLNl4BHxEZUxLvUKALAtT/Q0c6ziOxZQ8c02G/gyxHWNbLbxUzRNfMrRnbt6TZT3gNe8VBqQeg== + dependencies: + defined "~0.0.0" + level-packager@^5.1.0: version "5.1.1" resolved "https://registry.yarnpkg.com/level-packager/-/level-packager-5.1.1.tgz#323ec842d6babe7336f70299c14df2e329c18939" @@ -13998,7 +15156,7 @@ level@6.0.1: level-packager "^5.1.0" leveldown "^5.4.0" -leveldown@5.6.0, leveldown@^5.4.0: +leveldown@5.6.0, leveldown@^5.4.0, leveldown@^5.6.0: version "5.6.0" resolved "https://registry.yarnpkg.com/leveldown/-/leveldown-5.6.0.tgz#16ba937bb2991c6094e13ac5a6898ee66d3eee98" integrity sha512-iB8O/7Db9lPaITU1aA2txU/cBEXAt4vWwKQRrrWuS6XDgbP4QZGj9BL2aNbwb002atoQ/lIotJkfyzz+ygQnUQ== @@ -14007,7 +15165,7 @@ leveldown@5.6.0, leveldown@^5.4.0: napi-macros "~2.0.0" node-gyp-build "~4.1.0" -levelup@4.4.0, levelup@^4.3.2: +levelup@4.4.0, levelup@^4.3.2, levelup@^4.4.0: version "4.4.0" resolved "https://registry.yarnpkg.com/levelup/-/levelup-4.4.0.tgz#f89da3a228c38deb49c48f88a70fb71f01cafed6" integrity sha512-94++VFO3qN95cM/d6eBXvd894oJE0w3cInq9USsyQzzoJxmiYzPAocNcuGCPGGjoXqDVJcr3C1jzt1TSjyaiLQ== @@ -14180,6 +15338,11 @@ locate-path@^6.0.0: dependencies: p-locate "^5.0.0" +lock@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/lock/-/lock-1.1.0.tgz#53157499d1653b136ca66451071fca615703fa55" + integrity sha512-NZQIJJL5Rb9lMJ0Yl1JoVr9GSdo4HTPsUEWsSFzB8dE8DSoiLCVavWZPi7Rnlv/o73u6I24S/XYc/NmG4l8EKA== + lodash-es@^4.17.15, lodash-es@^4.17.21: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.21.tgz#43e626c46e6591b7750beb2b50117390c609e3ee" @@ -14320,7 +15483,7 @@ lodash.xor@^4.5.0: resolved "https://registry.yarnpkg.com/lodash.xor/-/lodash.xor-4.5.0.tgz#4d48ed7e98095b0632582ba714d3ff8ae8fb1db6" integrity sha512-sVN2zimthq7aZ5sPGXnSz32rZPuqcparVW50chJQe+mzTYV+IsxSsl/2gnkWWE2Of7K3myBQBqtLKOUEHJKRsQ== -lodash@4.17.21, lodash@^4.17.11, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.17.3, lodash@^4.7.0: +lodash@4.17.21, lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.17.3, lodash@^4.7.0: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== @@ -14367,6 +15530,11 @@ lookpath@1.1.0: resolved "https://registry.yarnpkg.com/lookpath/-/lookpath-1.1.0.tgz#932d68371a2f0b4a5644f03d6a2b4728edba96d2" integrity sha512-B9NM7XpVfkyWqfOBI/UW0kVhGw7pJztsduch+1wkbYDi90mYK6/InFul3lG0hYko/VEcVMARVBJ5daFRc5aKCw== +lossless-json@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/lossless-json/-/lossless-json-4.0.1.tgz#d45229e3abb213a0235812780ca894ea8c5b2c6b" + integrity sha512-l0L+ppmgPDnb+JGxNLndPtJZGNf6+ZmVaQzoxQm3u6TXmhdnsA+YtdVR8DjzZd/em58686CQhOFDPewfJ4l7MA== + loupe@^2.3.6: version "2.3.7" resolved "https://registry.yarnpkg.com/loupe/-/loupe-2.3.7.tgz#6e69b7d4db7d3ab436328013d37d1c8c3540c697" @@ -14374,6 +15542,13 @@ loupe@^2.3.6: dependencies: get-func-name "^2.0.1" +loupe@^3.1.0, loupe@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/loupe/-/loupe-3.1.1.tgz#71d038d59007d890e3247c5db97c1ec5a92edc54" + integrity sha512-edNu/8D5MKVfGVFRhFf8aAxiTM6Wumfz5XsaatSxlD3w4R1d/WEKUTydCdPGbl9K7QG/Ca3GnDV2sIKIpXRQcw== + dependencies: + get-func-name "^2.0.1" + lowercase-keys@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.0.tgz#4e3366b39e7f5457e35f1324bdf6f88d0bfc7306" @@ -14491,6 +15666,13 @@ magic-string@^0.26.7: dependencies: sourcemap-codec "^1.4.8" +magic-string@^0.30.10: + version "0.30.11" + resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.11.tgz#301a6f93b3e8c2cb13ac1a7a673492c0dfd12954" + integrity sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A== + dependencies: + "@jridgewell/sourcemap-codec" "^1.5.0" + magic-string@^0.30.3, magic-string@^0.30.4: version "0.30.10" resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.10.tgz#123d9c41a0cb5640c892b041d4cfb3bd0aa4b39e" @@ -14505,7 +15687,7 @@ make-dir@4.0.0: dependencies: semver "^7.5.3" -make-dir@^1.0.0: +make-dir@^1.0.0, make-dir@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.3.0.tgz#79c1033b80515bd6d24ec9933e860ca75ee27f0c" integrity sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ== @@ -14665,6 +15847,25 @@ memdown@1.4.1: ltgt "~2.2.0" safe-buffer "~5.1.1" +memdown@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/memdown/-/memdown-5.1.0.tgz#608e91a9f10f37f5b5fe767667a8674129a833cb" + integrity sha512-B3J+UizMRAlEArDjWHTMmadet+UKwHd3UjMgGBkZcKAxAYVPS9o0Yeiha4qvz7iGiL2Sb3igUft6p7nbFWctpw== + dependencies: + abstract-leveldown "~6.2.1" + functional-red-black-tree "~1.0.1" + immediate "~3.2.3" + inherits "~2.0.1" + ltgt "~2.2.0" + safe-buffer "~5.2.0" + +memoize@^10.0.0: + version "10.0.0" + resolved "https://registry.yarnpkg.com/memoize/-/memoize-10.0.0.tgz#43fa66b2022363c7c50cf5dfab732a808a3d7147" + integrity sha512-H6cBLgsi6vMWOcCpvVCdFFnl3kerEXbrYh9q+lY6VXvQSmM6CkmV08VOwT+WE2tzIEqRPFfAq3fm4v/UIW6mSA== + dependencies: + mimic-function "^5.0.0" + memory-pager@^1.0.2: version "1.5.0" resolved "https://registry.yarnpkg.com/memory-pager/-/memory-pager-1.5.0.tgz#d8751655d22d384682741c972f2c3d6dfa3e66b5" @@ -14768,6 +15969,16 @@ mimic-fn@^2.0.0, mimic-fn@^2.1.0: resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== +mimic-fn@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-4.0.0.tgz#60a90550d5cb0b239cca65d893b1a53b29871ecc" + integrity sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw== + +mimic-function@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/mimic-function/-/mimic-function-5.0.1.tgz#acbe2b3349f99b9deaca7fb70e48b83e94e67076" + integrity sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA== + mimic-response@^1.0.0, mimic-response@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b" @@ -14826,6 +16037,13 @@ minimatch@9.0.3: dependencies: brace-expansion "^2.0.1" +minimatch@^10.0.0: + version "10.0.1" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-10.0.1.tgz#ce0521856b453c86e25f2c4c0d03e6ff7ddc440b" + integrity sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ== + dependencies: + brace-expansion "^2.0.1" + minimatch@^5.0.1, minimatch@^5.1.0: version "5.1.6" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.6.tgz#1cfcb8cf5522ea69952cd2af95ae09477f122a96" @@ -15226,6 +16444,11 @@ neo-async@^2.6.2: resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== +neon-env@^0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/neon-env/-/neon-env-0.1.3.tgz#071e86fde3c698e9314f057d209e0b79ddab16e9" + integrity sha512-Zo+L6Nm19gJrjyfhxn/ZDm8eIIDzr75o64ZhijBau4LNuhLzjEAteRg3gchIvgaN8XTo5BxN6iTNP5clZQ0agA== + nice-try@^1.0.4: version "1.0.5" resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" @@ -15279,7 +16502,7 @@ node-fetch@2.6.0, node-fetch@2.6.7, node-fetch@^2.6.0, node-fetch@^2.6.1, node-f dependencies: whatwg-url "^5.0.0" -node-forge@^1.3.1: +node-forge@^1.2.1, node-forge@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-1.3.1.tgz#be8da2af243b2417d5f646a770663a92b7e9ded3" integrity sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA== @@ -15365,6 +16588,11 @@ node-source-walk@^5.0.0: dependencies: "@babel/parser" "^7.0.0" +nodemailer@6.9.13: + version "6.9.13" + resolved "https://registry.yarnpkg.com/nodemailer/-/nodemailer-6.9.13.tgz#5b292bf1e92645f4852ca872c56a6ba6c4a3d3d6" + integrity sha512-7o38Yogx6krdoBf3jCAqnIN4oSQFx+fMa0I7dK1D+me9kBxx12D+/33wSb+fhOCtIxvYJ+4x4IMEhmhCKfAiOA== + nodemailer@6.9.9: version "6.9.9" resolved "https://registry.yarnpkg.com/nodemailer/-/nodemailer-6.9.9.tgz#4549bfbf710cc6addec5064dd0f19874d24248d9" @@ -15578,6 +16806,13 @@ npm-run-path@^4.0.1: dependencies: path-key "^3.0.0" +npm-run-path@^5.1.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-5.3.0.tgz#e23353d0ebb9317f174e93417e4a4d82d0249e9f" + integrity sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ== + dependencies: + path-key "^4.0.0" + npmlog@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-5.0.1.tgz#f06678e80e29419ad67ab964e0fa69959c1eb8b0" @@ -15847,6 +17082,13 @@ onetime@^5.1.0, onetime@^5.1.2: dependencies: mimic-fn "^2.1.0" +onetime@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-6.0.0.tgz#7c24c18ed1fd2e9bca4bd26806a33613c77d34b4" + integrity sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ== + dependencies: + mimic-fn "^4.0.0" + only@~0.0.2: version "0.0.2" resolved "https://registry.yarnpkg.com/only/-/only-0.0.2.tgz#2afde84d03e50b9a8edc444e30610a70295edfb4" @@ -16007,6 +17249,11 @@ p-cancelable@^1.0.0: resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-1.1.0.tgz#d078d15a3af409220c886f1d9a0ca2e441ab26cc" integrity sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw== +p-cancelable@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-2.1.1.tgz#aab7fbd416582fa32a3db49859c122487c5ed2cf" + integrity sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg== + p-defer@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-defer/-/p-defer-1.0.0.tgz#9f6eb182f6c9aa8cd743004a7d4f96b196b0fb0c" @@ -16156,6 +17403,11 @@ p-waterfall@2.1.1: dependencies: p-reduce "^2.0.0" +package-json-from-dist@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz#e501cd3094b278495eb4258d4c9f6d5ac3019f00" + integrity sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw== + package-json@^6.3.0: version "6.5.0" resolved "https://registry.yarnpkg.com/package-json/-/package-json-6.5.0.tgz#6feedaca35e75725876d0b0e64974697fed145b0" @@ -16331,7 +17583,7 @@ passport-google-oauth20@2.x.x: dependencies: passport-oauth2 "1.x.x" -passport-google-oauth@2.0.0: +passport-google-oauth@2.0.0, passport-google-oauth@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/passport-google-oauth/-/passport-google-oauth-2.0.0.tgz#f6eb4bc96dd6c16ec0ecfdf4e05ec48ca54d4dae" integrity sha512-JKxZpBx6wBQXX1/a1s7VmdBgwOugohH+IxCy84aPTZNq/iIPX6u7Mqov1zY7MKRz3niFPol0KJz8zPLBoHKtYA== @@ -16346,6 +17598,14 @@ passport-local@1.0.0: dependencies: passport-strategy "1.x.x" +passport-microsoft@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/passport-microsoft/-/passport-microsoft-1.0.0.tgz#78954cf3201fdce61beeb6587a3b158f8e9db86c" + integrity sha512-L1JHeCbSObSZZXiG7jU2KoKie6nzZLwGt38HXz1GasKrsCQdOnf5kH8ltV4BWNUfBL2Pt1csWn1iuBSerprrcg== + dependencies: + passport-oauth2 "1.6.1" + pkginfo "0.4.x" + passport-oauth1@1.x.x: version "1.3.0" resolved "https://registry.yarnpkg.com/passport-oauth1/-/passport-oauth1-1.3.0.tgz#5d57f1415c8e28e46b461a12ec1b492934f7c354" @@ -16360,6 +17620,17 @@ passport-oauth2-refresh@^2.1.0: resolved "https://registry.yarnpkg.com/passport-oauth2-refresh/-/passport-oauth2-refresh-2.1.0.tgz#c31cd133826383f5539d16ad8ab4f35ca73ce4a4" integrity sha512-4ML7ooCESCqiTgdDBzNUFTBcPR8zQq9iM6eppEUGMMvLdsjqRL93jKwWm4Az3OJcI+Q2eIVyI8sVRcPFvxcF/A== +passport-oauth2@1.6.1: + version "1.6.1" + resolved "https://registry.yarnpkg.com/passport-oauth2/-/passport-oauth2-1.6.1.tgz#c5aee8f849ce8bd436c7f81d904a3cd1666f181b" + integrity sha512-ZbV43Hq9d/SBSYQ22GOiglFsjsD1YY/qdiptA+8ej+9C1dL1TVB+mBE5kDH/D4AJo50+2i8f4bx0vg4/yDDZCQ== + dependencies: + base64url "3.x.x" + oauth "0.9.x" + passport-strategy "1.x.x" + uid2 "0.0.x" + utils-merge "1.x.x" + passport-oauth2@1.x.x: version "1.7.0" resolved "https://registry.yarnpkg.com/passport-oauth2/-/passport-oauth2-1.7.0.tgz#5c4766c8531ac45ffe9ec2c09de9809e2c841fc4" @@ -16410,6 +17681,11 @@ path-key@^3.0.0, path-key@^3.1.0: resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== +path-key@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-4.0.0.tgz#295588dc3aee64154f877adb9d780b81c554bf18" + integrity sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ== + path-parse@^1.0.7: version "1.0.7" resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" @@ -16470,6 +17746,11 @@ pathval@^1.1.1: resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.1.tgz#8534e77a77ce7ac5a2512ea21e0fdb8fcf6c3d8d" integrity sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ== +pathval@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/pathval/-/pathval-2.0.0.tgz#7e2550b422601d4f6b8e26f1301bc8f15a741a25" + integrity sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA== + pause@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/pause/-/pause-0.0.1.tgz#1d408b3fdb76923b9543d96fb4c9dfd535d9cb5d" @@ -16571,11 +17852,21 @@ picocolors@^1.0.0: resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== +picocolors@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.1.tgz#a8ad579b571952f0e5d25892de5445bcfe25aaa1" + integrity sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew== + picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.2, picomatch@^2.2.3, picomatch@^2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== +picomatch@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-4.0.2.tgz#77c742931e8f3b8820946c76cd0c1f13730d1dab" + integrity sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg== + pify@5.0.0, pify@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/pify/-/pify-5.0.0.tgz#1f5eca3f5e87ebec28cc6d54a0e4aaf00acc127f" @@ -16741,6 +18032,11 @@ pkg-types@^1.1.1: mlly "^1.7.0" pathe "^1.1.2" +pkginfo@0.4.x: + version "0.4.1" + resolved "https://registry.yarnpkg.com/pkginfo/-/pkginfo-0.4.1.tgz#b5418ef0439de5425fc4995042dced14fb2a84ff" + integrity sha512-8xCNE/aT/EXKenuMDZ+xTVwkT8gsoHN2z/Q29l80u0ppGEXVvsKRzNMbtKhg8LS8k1tJLAHHylf6p4VFmP6XUQ== + pluralize@^8.0.0: version "8.0.0" resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-8.0.0.tgz#1a6fa16a38d12a1901e0320fa017051c539ce3b1" @@ -17058,6 +18354,15 @@ postcss@^8.1.7, postcss@^8.2.9, postcss@^8.3.11, postcss@^8.4.12, postcss@^8.4.2 picocolors "^1.0.0" source-map-js "^1.2.0" +postcss@^8.4.41: + version "8.4.41" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.41.tgz#d6104d3ba272d882fe18fc07d15dc2da62fa2681" + integrity sha512-TesUflQ0WKZqAvg52PWL6kHgLKP6xB6heTOdoYM0Wt2UHyxNa4K25EZZMgKns3BH1RLVbZCREPpLY0rhnNoHVQ== + dependencies: + nanoid "^3.3.7" + picocolors "^1.0.1" + source-map-js "^1.2.0" + postgres-array@~2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/postgres-array/-/postgres-array-2.0.0.tgz#48f8fce054fbc69671999329b8834b772652d82e" @@ -17088,6 +18393,15 @@ posthog-js@^1.118.0: fflate "^0.4.8" preact "^10.19.3" +posthog-js@^1.13.4: + version "1.157.2" + resolved "https://registry.yarnpkg.com/posthog-js/-/posthog-js-1.157.2.tgz#dc2515818ead408aefb900e90c535fb57beb1f59" + integrity sha512-ATYKGs+Q51u26nHHhrhWNh1whqFm7j/rwQQYw+y6/YzNmRlo+YsqrGZji9nqXb9/4fo0ModDr+ZmuOI3hKkUXA== + dependencies: + fflate "^0.4.8" + preact "^10.19.3" + web-vitals "^4.0.1" + posthog-node@1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/posthog-node/-/posthog-node-1.3.0.tgz#804ed2f213a2f05253f798bf9569d55a9cad94f7" @@ -17489,6 +18803,14 @@ promise-inflight@^1.0.1: resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" integrity sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g== +promise-retry@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/promise-retry/-/promise-retry-1.1.1.tgz#6739e968e3051da20ce6497fb2b50f6911df3d6d" + integrity sha512-StEy2osPr28o17bIW776GtwO6+Q+M9zPiZkYfosciUUMYqjhU/ffwRAH0zN2+uvGyUsn8/YICIHRzLbPacpZGw== + dependencies: + err-code "^1.0.0" + retry "^0.10.0" + promise-retry@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/promise-retry/-/promise-retry-2.0.1.tgz#ff747a13620ab57ba688f5fc67855410c370da22" @@ -17502,7 +18824,7 @@ promise.series@^0.2.0: resolved "https://registry.yarnpkg.com/promise.series/-/promise.series-0.2.0.tgz#2cc7ebe959fc3a6619c04ab4dbdc9e452d864bbd" integrity sha512-VWQJyU2bcDTgZw8kpfBpB/ejZASlCrzwz5f2hjb/zlujOEB4oeiAhHygAWq8ubsX2GVkD4kCU5V2dwOTaCY5EQ== -prompts@^2.0.1: +prompts@^2.0.1, prompts@^2.4.2: version "2.4.2" resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.2.tgz#7b57e73b3a48029ad10ebd44f74b01722a4cb069" integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q== @@ -17667,6 +18989,13 @@ q@^1.1.2: resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" integrity sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw== +qs@^6.10.3: + version "6.13.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.13.0.tgz#6ca3bd58439f7e245655798997787b0d88a51906" + integrity sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg== + dependencies: + side-channel "^1.0.6" + qs@^6.11.0, qs@^6.4.0: version "6.12.1" resolved "https://registry.yarnpkg.com/qs/-/qs-6.12.1.tgz#39422111ca7cbdb70425541cba20c7d7b216599a" @@ -17728,6 +19057,11 @@ quick-lru@^4.0.1: resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-4.0.1.tgz#5b8878f113a58217848c6482026c73e1ba57727f" integrity sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g== +quick-lru@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-5.1.1.tgz#366493e6b3e42a3a6885e2e99d18f80fb7a8c932" + integrity sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA== + quote-unquote@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/quote-unquote/-/quote-unquote-1.0.0.tgz#67a9a77148effeaf81a4d428404a710baaac8a0b" @@ -17780,6 +19114,11 @@ rc@1.2.8, rc@^1.2.7, rc@^1.2.8: minimist "^1.2.0" strip-json-comments "~2.0.1" +reachdown@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/reachdown/-/reachdown-1.1.0.tgz#c3b85b459dbd0fe2c79782233a0a38e66a9b5454" + integrity sha512-6LsdRe4cZyOjw4NnvbhUd/rGG7WQ9HMopPr+kyL018Uci4kijtxcGR5kVb5Ln13k4PEE+fEFQbjfOvNw7cnXmA== + react-is@^17.0.1: version "17.0.2" resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0" @@ -18018,6 +19357,11 @@ redlock@4.2.0: dependencies: bluebird "^3.7.2" +reflect-metadata@^0.2.1: + version "0.2.2" + resolved "https://registry.yarnpkg.com/reflect-metadata/-/reflect-metadata-0.2.2.tgz#400c845b6cba87a21f2c65c4aeb158f4fa4d9c5b" + integrity sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q== + regenerate-unicode-properties@^10.1.0: version "10.1.0" resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz#7c3192cab6dd24e21cb4461e5ddd7dd24fa8374c" @@ -18047,6 +19391,11 @@ regenerator-transform@^0.15.1: dependencies: "@babel/runtime" "^7.8.4" +regexp-tree@~0.1.1: + version "0.1.27" + resolved "https://registry.yarnpkg.com/regexp-tree/-/regexp-tree-0.1.27.tgz#2198f0ef54518ffa743fe74d983b56ffd631b6cd" + integrity sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA== + regexp.prototype.flags@^1.4.3, regexp.prototype.flags@^1.5.2: version "1.5.2" resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz#138f644a3350f981a858c44f6bb1a61ff59be334" @@ -18171,6 +19520,11 @@ requires-port@^1.0.0: resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ== +resolve-alpn@^1.0.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/resolve-alpn/-/resolve-alpn-1.2.1.tgz#b7adbdac3546aaaec20b45e7d8265927072726f9" + integrity sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g== + resolve-cwd@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" @@ -18222,6 +19576,13 @@ responselike@1.0.2, responselike@^1.0.2: dependencies: lowercase-keys "^1.0.0" +responselike@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/responselike/-/responselike-2.0.1.tgz#9a0bc8fdc252f3fb1cca68b016591059ba1422bc" + integrity sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw== + dependencies: + lowercase-keys "^2.0.0" + restore-cursor@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" @@ -18252,6 +19613,11 @@ retry@0.13.1, retry@^0.13.1: resolved "https://registry.yarnpkg.com/retry/-/retry-0.13.1.tgz#185b1587acf67919d63b357349e03537b2484658" integrity "sha1-GFsVh6z2eRnWOzVzSeA1N7JIRlg= sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==" +retry@^0.10.0: + version "0.10.1" + resolved "https://registry.yarnpkg.com/retry/-/retry-0.10.1.tgz#e76388d217992c252750241d3d3956fed98d8ff4" + integrity sha512-ZXUSQYTHdl3uS7IuCehYfMzKyIDBNoAuUblvy5oGO5UJSUTmStUUVPXbA9Qxd173Bgre53yCQczQuHgRWAdvJQ== + retry@^0.12.0: version "0.12.0" resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b" @@ -18281,6 +19647,13 @@ rimraf@^4.4.1: dependencies: glob "^9.2.0" +rimraf@^5.0.7: + version "5.0.10" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-5.0.10.tgz#23b9843d3dc92db71f96e1a2ce92e39fd2a8221c" + integrity sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ== + dependencies: + glob "^10.3.7" + ripemd160@^2.0.0, ripemd160@^2.0.1: version "2.0.2" resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" @@ -18443,6 +19816,31 @@ rollup@^3.27.1: optionalDependencies: fsevents "~2.3.2" +rollup@^4.20.0: + version "4.21.0" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.21.0.tgz#28db5f5c556a5180361d35009979ccc749560b9d" + integrity sha512-vo+S/lfA2lMS7rZ2Qoubi6I5hwZwzXeUIctILZLbHI+laNtvhhOIon2S1JksA5UEDQ7l3vberd0fxK44lTYjbQ== + dependencies: + "@types/estree" "1.0.5" + optionalDependencies: + "@rollup/rollup-android-arm-eabi" "4.21.0" + "@rollup/rollup-android-arm64" "4.21.0" + "@rollup/rollup-darwin-arm64" "4.21.0" + "@rollup/rollup-darwin-x64" "4.21.0" + "@rollup/rollup-linux-arm-gnueabihf" "4.21.0" + "@rollup/rollup-linux-arm-musleabihf" "4.21.0" + "@rollup/rollup-linux-arm64-gnu" "4.21.0" + "@rollup/rollup-linux-arm64-musl" "4.21.0" + "@rollup/rollup-linux-powerpc64le-gnu" "4.21.0" + "@rollup/rollup-linux-riscv64-gnu" "4.21.0" + "@rollup/rollup-linux-s390x-gnu" "4.21.0" + "@rollup/rollup-linux-x64-gnu" "4.21.0" + "@rollup/rollup-linux-x64-musl" "4.21.0" + "@rollup/rollup-win32-arm64-msvc" "4.21.0" + "@rollup/rollup-win32-ia32-msvc" "4.21.0" + "@rollup/rollup-win32-x64-msvc" "4.21.0" + fsevents "~2.3.2" + rollup@^4.9.4, rollup@^4.9.6: version "4.18.0" resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.18.0.tgz#497f60f0c5308e4602cf41136339fbf87d5f5dda" @@ -18543,6 +19941,13 @@ safe-regex-test@^1.0.3: es-errors "^1.3.0" is-regex "^1.1.4" +safe-regex@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-2.1.1.tgz#f7128f00d056e2fe5c11e81a1324dd974aadced2" + integrity sha512-rx+x8AMzKb5Q5lQ95Zoi6ZbJqwCLkqi3XuJXp5P3rT8OEc6sZCJG5AE5dU3lsgRr/F4Bs31jSlVN+j5KrsGu9A== + dependencies: + regexp-tree "~0.1.1" + safe-stable-stringify@^2.1.0, safe-stable-stringify@^2.3.1: version "2.4.3" resolved "https://registry.yarnpkg.com/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz#138c84b6f6edb3db5f8ef3ef7115b8f55ccbf886" @@ -18654,7 +20059,7 @@ semver-diff@^3.1.1: dependencies: semver "^6.3.0" -"semver@2 || 3 || 4 || 5", semver@7.5.3, semver@^5.5.0, semver@^5.6.0, semver@^5.7.1, semver@^6.0.0, semver@^6.1.1, semver@^6.1.2, semver@^6.2.0, semver@^6.3.0, semver@^6.3.1, semver@^7.0.0, semver@^7.1.1, semver@^7.3.2, semver@^7.3.4, semver@^7.3.5, semver@^7.3.7, semver@^7.3.8, semver@^7.5.3, semver@^7.5.4, semver@~2.3.1: +"semver@2 || 3 || 4 || 5", semver@7.5.3, semver@^5.5.0, semver@^5.6.0, semver@^5.7.1, semver@^6.0.0, semver@^6.1.1, semver@^6.1.2, semver@^6.2.0, semver@^6.3.0, semver@^6.3.1, semver@^7.0.0, semver@^7.1.1, semver@^7.3.2, semver@^7.3.4, semver@^7.3.5, semver@^7.3.7, semver@^7.3.8, semver@^7.5.3, semver@^7.5.4, semver@^7.6.0, semver@^7.6.3, semver@~2.3.1: version "7.5.3" resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.3.tgz#161ce8c2c6b4b3bdca6caadc9fa3317a4c4fe88e" integrity sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ== @@ -18687,7 +20092,7 @@ serialize-javascript@^6.0.1: dependencies: randombytes "^2.1.0" -server-destroy@1.0.1: +server-destroy@1.0.1, server-destroy@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/server-destroy/-/server-destroy-1.0.1.tgz#f13bf928e42b9c3e79383e61cc3998b5d14e6cdd" integrity sha512-rb+9B5YBIEzYcD6x2VKidaa+cqYBJQKnU4oe4E3ANwRRN56yk/ua1YCJT1n21NTS8w6CcOclAKNP3PhdCXKYtQ== @@ -18719,6 +20124,11 @@ set-function-name@^2.0.1, set-function-name@^2.0.2: functions-have-names "^1.2.3" has-property-descriptors "^1.0.2" +setimmediate@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" + integrity sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA== + setprototypeof@1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" @@ -18812,7 +20222,7 @@ signal-exit@3.0.7, signal-exit@^3.0.0, signal-exit@^3.0.2, signal-exit@^3.0.3, s resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== -signal-exit@^4.0.1: +signal-exit@^4.0.1, signal-exit@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== @@ -19217,7 +20627,7 @@ stable@^0.1.8: resolved "https://registry.yarnpkg.com/stable/-/stable-0.1.8.tgz#836eb3c8382fe2936feaf544631017ce7d47a3cf" integrity sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w== -stack-trace@0.0.x: +stack-trace@0.0.10, stack-trace@0.0.x: version "0.0.10" resolved "https://registry.yarnpkg.com/stack-trace/-/stack-trace-0.0.10.tgz#547c70b347e8d32b4e108ea1a2a159e5fdde19c0" integrity sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg== @@ -19249,7 +20659,7 @@ statuses@2.0.1, statuses@^2.0.0: resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA== -std-env@^3.3.1: +std-env@^3.3.1, std-env@^3.7.0: version "3.7.0" resolved "https://registry.yarnpkg.com/std-env/-/std-env-3.7.0.tgz#c9f7386ced6ecf13360b6c6c55b8aaa4ef7481d2" integrity sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg== @@ -19495,6 +20905,11 @@ strip-final-newline@^2.0.0: resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== +strip-final-newline@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-3.0.0.tgz#52894c313fbff318835280aed60ff71ebf12b8fd" + integrity sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw== + strip-indent@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-3.0.0.tgz#c32e1cee940b6b3432c771bc2c54bcce73cd3001" @@ -19526,6 +20941,14 @@ strip-outer@^1.0.0: dependencies: escape-string-regexp "^1.0.2" +stripe@9.16.0: + version "9.16.0" + resolved "https://registry.yarnpkg.com/stripe/-/stripe-9.16.0.tgz#94c24549c91fced457b9e3259e8a1a1bdb6dbd0e" + integrity sha512-Dn8K+jSoQcXjxCobRI4HXUdHjOXsiF/KszK49fJnkbeCFjZ3EZxLG2JiM/CX+Hcq27NBDtv/Sxhvy+HhTmvyaQ== + dependencies: + "@types/node" ">=8.1.0" + qs "^6.10.3" + striptags@^3.1.1: version "3.2.0" resolved "https://registry.yarnpkg.com/striptags/-/striptags-3.2.0.tgz#cc74a137db2de8b0b9a370006334161f7dd67052" @@ -19594,6 +21017,18 @@ sublevel-pouchdb@7.2.2: ltgt "2.2.1" readable-stream "1.1.14" +subleveldown@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/subleveldown/-/subleveldown-5.0.1.tgz#aa2b4e4698a48d9a86856b2c4df1b6bce2d2ce53" + integrity sha512-cVqd/URpp7si1HWu5YqQ3vqQkjuolAwHypY1B4itPlS71/lsf6TQPZ2Y0ijT22EYVkvH5ove9JFJf4u7VGPuZw== + dependencies: + abstract-leveldown "^6.3.0" + encoding-down "^6.2.0" + inherits "^2.0.3" + level-option-wrap "^1.1.0" + levelup "^4.4.0" + reachdown "^1.1.0" + superagent@^8.0.5: version "8.1.2" resolved "https://registry.yarnpkg.com/superagent/-/superagent-8.1.2.tgz#03cb7da3ec8b32472c9d20f6c2a57c7f3765f30b" @@ -19897,6 +21332,11 @@ tarn@^3.0.1, tarn@^3.0.2: resolved "https://registry.yarnpkg.com/tarn/-/tarn-3.0.2.tgz#73b6140fbb881b71559c4f8bfde3d9a4b3d27693" integrity sha512-51LAVKUSZSVfI05vjPESNc5vwqqZpbXCsU+/+wxlOrUjk2SnFTt97v9ZgQrD4YmxYW1Px6w2KjaDitCfkvgxMQ== +teamcity-service-messages@^0.1.14: + version "0.1.14" + resolved "https://registry.yarnpkg.com/teamcity-service-messages/-/teamcity-service-messages-0.1.14.tgz#193d420a5e4aef8e5e50b8c39e7865e08fbb5d8a" + integrity sha512-29aQwaHqm8RMX74u2o/h1KbMLP89FjNiMxD9wbF2BbWOnbM+q+d1sCEC+MqCc4QW3NJykn77OMpTFw/xTHIc0w== + tedious@^16.4.0: version "16.7.1" resolved "https://registry.yarnpkg.com/tedious/-/tedious-16.7.1.tgz#1190f30fd99a413f1dc9250dee4835cf0788b650" @@ -20060,6 +21500,11 @@ timekeeper@2.2.0: resolved "https://registry.yarnpkg.com/timekeeper/-/timekeeper-2.2.0.tgz#9645731fce9e3280a18614a57a9d1b72af3ca368" integrity sha512-W3AmPTJWZkRwu+iSNxPIsLZ2ByADsOLbbLxe46UJyWj3mlYLlwucKiq+/dPm0l9wTzqoF3/2PH0AGFCebjq23A== +timekeeper@^2.2.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/timekeeper/-/timekeeper-2.3.1.tgz#2deb6e0b95d93625fda84c18d47f84a99e4eba01" + integrity sha512-LeQRS7/4JcC0PgdSFnfUiStQEdiuySlCj/5SJ18D+T1n9BoY7PxKFfCwLulpHXoLUFr67HxBddQdEX47lDGx1g== + timm@^1.6.1: version "1.7.1" resolved "https://registry.yarnpkg.com/timm/-/timm-1.7.1.tgz#96bab60c7d45b5a10a8a4d0f0117c6b7e5aff76f" @@ -20083,6 +21528,11 @@ tinybench@^2.3.1: resolved "https://registry.yarnpkg.com/tinybench/-/tinybench-2.8.0.tgz#30e19ae3a27508ee18273ffed9ac7018949acd7b" integrity sha512-1/eK7zUnIklz4JUUlL+658n58XO2hHLQfSk1Zf2LKieUjxidN16eKFEoDEfjHc3ohofSSqK3X5yO6VGb6iW8Lw== +tinybench@^2.8.0: + version "2.9.0" + resolved "https://registry.yarnpkg.com/tinybench/-/tinybench-2.9.0.tgz#103c9f8ba6d7237a47ab6dd1dcff77251863426b" + integrity sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg== + tinycolor2@^1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/tinycolor2/-/tinycolor2-1.6.0.tgz#f98007460169b0263b97072c5ae92484ce02d09e" @@ -20093,11 +21543,26 @@ tinypool@^0.4.0: resolved "https://registry.yarnpkg.com/tinypool/-/tinypool-0.4.0.tgz#3cf3ebd066717f9f837e8d7d31af3c127fdb5446" integrity sha512-2ksntHOKf893wSAH4z/+JbPpi92esw8Gn9N2deXX+B0EO92hexAVI9GIZZPx7P5aYo5KULfeOSt3kMOmSOy6uA== +tinypool@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/tinypool/-/tinypool-1.0.1.tgz#c64233c4fac4304e109a64340178760116dbe1fe" + integrity sha512-URZYihUbRPcGv95En+sz6MfghfIc2OJ1sv/RmhWZLouPY0/8Vo80viwPvg3dlaS9fuq7fQMEfgRRK7BBZThBEA== + +tinyrainbow@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/tinyrainbow/-/tinyrainbow-1.2.0.tgz#5c57d2fc0fb3d1afd78465c33ca885d04f02abb5" + integrity sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ== + tinyspy@^1.0.2: version "1.1.1" resolved "https://registry.yarnpkg.com/tinyspy/-/tinyspy-1.1.1.tgz#0cb91d5157892af38cb2d217f5c7e8507a5bf092" integrity sha512-UVq5AXt/gQlti7oxoIg5oi/9r0WpF7DGEVwXgqWSMmyN16+e3tl5lIvTaOpJ3TAtu5xFzWccFRM4R5NaWHF+4g== +tinyspy@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/tinyspy/-/tinyspy-3.0.0.tgz#cb61644f2713cd84dee184863f4642e06ddf0585" + integrity sha512-q5nmENpTHgiPVd1cJDDc9cVoYN5x4vCvwT3FMilvKPKneCBZAxn2YWQjDF0UMcE9k0Cay1gBiDfTMU0g+mPMQA== + tlhunter-sorted-set@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/tlhunter-sorted-set/-/tlhunter-sorted-set-0.1.0.tgz#1c3eae28c0fa4dff97e9501d2e3c204b86406f4b" @@ -20235,6 +21700,18 @@ ts-api-utils@^1.0.1: resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-1.0.3.tgz#f12c1c781d04427313dbac808f453f050e54a331" integrity sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg== +ts-api-utils@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-1.3.0.tgz#4b490e27129f1e8e686b45cc4ab63714dc60eea1" + integrity sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ== + +ts-declaration-location@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/ts-declaration-location/-/ts-declaration-location-1.0.4.tgz#60c64133202ec5d171fdf0395f70f786f92f14c0" + integrity sha512-r4JoxYhKULbZuH81Pjrp9OEG5St7XWk7zXwGkLKhmVcjiBVHTJXV5wK6dEa9JKW5QGSTW6b1lOjxAKp8R1SQhg== + dependencies: + minimatch "^10.0.0" + ts-graphviz@^1.5.0: version "1.5.4" resolved "https://registry.yarnpkg.com/ts-graphviz/-/ts-graphviz-1.5.4.tgz#61a3059afeac4f6d4be3c6729a4d88546ca9e095" @@ -20273,6 +21750,39 @@ ts-node@10.8.1: v8-compile-cache-lib "^3.0.1" yn "3.1.1" +ts-node@^10.9.2: + version "10.9.2" + resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.9.2.tgz#70f021c9e185bccdca820e26dc413805c101c71f" + integrity sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ== + dependencies: + "@cspotcode/source-map-support" "^0.8.0" + "@tsconfig/node10" "^1.0.7" + "@tsconfig/node12" "^1.0.7" + "@tsconfig/node14" "^1.0.0" + "@tsconfig/node16" "^1.0.2" + acorn "^8.4.1" + acorn-walk "^8.1.1" + arg "^4.1.0" + create-require "^1.1.0" + diff "^4.0.1" + make-error "^1.1.1" + v8-compile-cache-lib "^3.0.1" + yn "3.1.1" + +tsconfck@^3.0.3: + version "3.1.1" + resolved "https://registry.yarnpkg.com/tsconfck/-/tsconfck-3.1.1.tgz#c7284913262c293b43b905b8b034f524de4a3162" + integrity sha512-00eoI6WY57SvZEVjm13stEVE90VkEdJAFGgpFLTsZbJyW/LwFQ7uQxJHWpZ2hzSWgCPKc9AnBnNP+0X7o3hAmQ== + +tsconfig-paths-webpack-plugin@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/tsconfig-paths-webpack-plugin/-/tsconfig-paths-webpack-plugin-4.1.0.tgz#3c6892c5e7319c146eee1e7302ed9e6f2be4f763" + integrity sha512-xWFISjviPydmtmgeUAuXp4N1fky+VCtfhOkDUFIv5ea7p4wuTomI4QTrXvFBX2S4jZsmyTSrStQl+E+4w+RzxA== + dependencies: + chalk "^4.1.0" + enhanced-resolve "^5.7.0" + tsconfig-paths "^4.1.2" + tsconfig-paths@4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-4.0.0.tgz#1082f5d99fd127b72397eef4809e4dd06d229b64" @@ -20292,7 +21802,7 @@ tsconfig-paths@^3.10.1, tsconfig-paths@^3.15.0: minimist "^1.2.6" strip-bom "^3.0.0" -tsconfig-paths@^4.1.2: +tsconfig-paths@^4.1.2, tsconfig-paths@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz#ef78e19039133446d244beac0fd6a1632e2d107c" integrity sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg== @@ -20455,6 +21965,11 @@ typed-array-length@^1.0.6: is-typed-array "^1.1.13" possible-typed-array-names "^1.0.0" +typed-duration@^1.0.12: + version "1.0.13" + resolved "https://registry.yarnpkg.com/typed-duration/-/typed-duration-1.0.13.tgz#a40f9ba563b6e20674cac491e15ecbf6811d85a7" + integrity sha512-HLwA+hNq/2eXe03isJSfa7YJt6NikplBGdNKvlhyuR6WL5iZi2uXJIZv1SSOMEIukCZbeQ8QwIcQ801S0/Qulw== + typedarray-to-buffer@^3.1.5: version "3.1.5" resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" @@ -20484,6 +21999,15 @@ typeof@^1.0.0: resolved "https://registry.yarnpkg.com/typeof/-/typeof-1.0.0.tgz#9c84403f2323ae5399167275497638ea1d2f2440" integrity sha512-Pze0mIxYXhaJdpw1ayMzOA7rtGr1OmsTY/Z+FWtRKIqXFz6aoDLjqdbWE/tcIBSC8nhnVXiRrEXujodR/xiFAA== +typescript-eslint@^7.16.1: + version "7.18.0" + resolved "https://registry.yarnpkg.com/typescript-eslint/-/typescript-eslint-7.18.0.tgz#e90d57649b2ad37a7475875fa3e834a6d9f61eb2" + integrity sha512-PonBkP603E3tt05lDkbOMyaxJjvKqQrXsnow72sVeOFINDE/qNmnnd+f9b4N+U7W6MXnnYyrhtmF2t08QWwUbA== + dependencies: + "@typescript-eslint/eslint-plugin" "7.18.0" + "@typescript-eslint/parser" "7.18.0" + "@typescript-eslint/utils" "7.18.0" + typescript-eslint@^7.3.1: version "7.3.1" resolved "https://registry.yarnpkg.com/typescript-eslint/-/typescript-eslint-7.3.1.tgz#9f4808abea3b33c4dd3bb51dd801471e91d1bd58" @@ -20507,6 +22031,11 @@ typescript@^4.0.0, typescript@^4.5.5: resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.5.tgz#095979f9bcc0d09da324d58d03ce8f8374cbe65a" integrity sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g== +typescript@^5.5.3: + version "5.5.4" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.5.4.tgz#d9852d6c82bad2d2eda4fd74a5762a8f5909e9ba" + integrity sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q== + typo-js@*: version "1.2.2" resolved "https://registry.yarnpkg.com/typo-js/-/typo-js-1.2.2.tgz#340484d81fe518e77c81a5a770162b14492f183b" @@ -20560,6 +22089,11 @@ undici-types@~5.26.4: resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== +undici-types@~6.19.2: + version "6.19.8" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.19.8.tgz#35111c9d1437ab83a7cdc0abae2f26d88eda0a02" + integrity sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw== + undici@^4.14.1: version "4.16.0" resolved "https://registry.yarnpkg.com/undici/-/undici-4.16.0.tgz#469bb87b3b918818d3d7843d91a1d08da357d5ff" @@ -20674,7 +22208,7 @@ update-browserslist-db@^1.0.10: escalade "^3.1.1" picocolors "^1.0.0" -update-dotenv@1.1.1: +update-dotenv@1.1.1, update-dotenv@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/update-dotenv/-/update-dotenv-1.1.1.tgz#17146f302f216c3c92419d5a327a45be910050ca" integrity sha512-3cIC18In/t0X/yH793c00qqxcKD8jVCgNOPif/fGQkFpYMGecM9YAc+kaAKXuZsM2dE9I9wFI7KvAuNX22SGMQ== @@ -20718,7 +22252,7 @@ url-parse-lax@^3.0.0: dependencies: prepend-http "^2.0.0" -url-parse@^1.5.3: +url-parse@^1.4.3, url-parse@^1.5.3: version "1.5.10" resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.10.tgz#9d3c2f736c1d75dd3bd2be507dcc111f1e2ea9c1" integrity sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ== @@ -20793,6 +22327,11 @@ uuid@^3.3.2: resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== +uuid@^7.0.3: + version "7.0.3" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-7.0.3.tgz#c5c9f2c8cf25dc0a372c4df1441c41f5bd0c680b" + integrity sha512-DPSke0pXhTZgoF/d+WSt2QaKMCFSfx7QegxEWT+JOuHF5aWrKEn0G+ztjuJg/gG8/ItK+rbPCD/yNv8yyih6Cg== + uuid@^9.0.0, uuid@^9.0.1: version "9.0.1" resolved "https://registry.yarnpkg.com/uuid/-/uuid-9.0.1.tgz#e188d4c8853cc722220392c424cd637f32293f30" @@ -20875,6 +22414,17 @@ vite-node@0.29.8: picocolors "^1.0.0" vite "^3.0.0 || ^4.0.0" +vite-node@2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/vite-node/-/vite-node-2.0.5.tgz#36d909188fc6e3aba3da5fc095b3637d0d18e27b" + integrity sha512-LdsW4pxj0Ot69FAoXZ1yTnA9bjGohr2yNBU7QKRxpz8ITSkhuDl6h3zS/tvgz4qrNjeRnvrWeXQ8ZF7Um4W00Q== + dependencies: + cac "^6.7.14" + debug "^4.3.5" + pathe "^1.1.2" + tinyrainbow "^1.2.0" + vite "^5.0.0" + vite-plugin-static-copy@^0.17.0: version "0.17.0" resolved "https://registry.yarnpkg.com/vite-plugin-static-copy/-/vite-plugin-static-copy-0.17.0.tgz#e45527da186c4a3818d09635797b6fc7cc9e035f" @@ -20885,6 +22435,15 @@ vite-plugin-static-copy@^0.17.0: fs-extra "^11.1.0" picocolors "^1.0.0" +vite-tsconfig-paths@^4.3.2: + version "4.3.2" + resolved "https://registry.yarnpkg.com/vite-tsconfig-paths/-/vite-tsconfig-paths-4.3.2.tgz#321f02e4b736a90ff62f9086467faf4e2da857a9" + integrity sha512-0Vd/a6po6Q+86rPlntHye7F31zA2URZMbH8M3saAZ/xR9QoGN/L21bxEGfXdWmFdNkqPpRdxFT7nmNe12e9/uA== + dependencies: + debug "^4.1.1" + globrex "^0.1.2" + tsconfck "^3.0.3" + "vite@^3.0.0 || ^4.0.0", vite@^4.5.0: version "4.5.3" resolved "https://registry.yarnpkg.com/vite/-/vite-4.5.3.tgz#d88a4529ea58bae97294c7e2e6f0eab39a50fb1a" @@ -20896,6 +22455,17 @@ vite-plugin-static-copy@^0.17.0: optionalDependencies: fsevents "~2.3.2" +vite@^5.0.0: + version "5.4.2" + resolved "https://registry.yarnpkg.com/vite/-/vite-5.4.2.tgz#8acb6ec4bfab823cdfc1cb2d6c53ed311bc4e47e" + integrity sha512-dDrQTRHp5C1fTFzcSaMxjk6vdpKvT+2/mIdE07Gw2ykehT49O0z/VHS3zZ8iV/Gh8BJJKHWOe5RjaNrW5xf/GA== + dependencies: + esbuild "^0.21.3" + postcss "^8.4.41" + rollup "^4.20.0" + optionalDependencies: + fsevents "~2.3.3" + vitefu@^0.2.2: version "0.2.5" resolved "https://registry.yarnpkg.com/vitefu/-/vitefu-0.2.5.tgz#c1b93c377fbdd3e5ddd69840ea3aa70b40d90969" @@ -20931,6 +22501,31 @@ vitest@^0.29.2: vite-node "0.29.8" why-is-node-running "^2.2.2" +vitest@^2.0.4: + version "2.0.5" + resolved "https://registry.yarnpkg.com/vitest/-/vitest-2.0.5.tgz#2f15a532704a7181528e399cc5b754c7f335fd62" + integrity sha512-8GUxONfauuIdeSl5f9GTgVEpg5BTOlplET4WEDaeY2QBiN8wSm68vxN/tb5z405OwppfoCavnwXafiaYBC/xOA== + dependencies: + "@ampproject/remapping" "^2.3.0" + "@vitest/expect" "2.0.5" + "@vitest/pretty-format" "^2.0.5" + "@vitest/runner" "2.0.5" + "@vitest/snapshot" "2.0.5" + "@vitest/spy" "2.0.5" + "@vitest/utils" "2.0.5" + chai "^5.1.1" + debug "^4.3.5" + execa "^8.0.1" + magic-string "^0.30.10" + pathe "^1.1.2" + std-env "^3.7.0" + tinybench "^2.8.0" + tinypool "^1.0.0" + tinyrainbow "^1.2.0" + vite "^5.0.0" + vite-node "2.0.5" + why-is-node-running "^2.3.0" + vlq@^0.2.2: version "0.2.3" resolved "https://registry.yarnpkg.com/vlq/-/vlq-0.2.3.tgz#8f3e4328cf63b1540c0d67e1b2778386f8975b26" @@ -20979,6 +22574,11 @@ walker@^1.0.8: dependencies: makeerror "1.0.12" +watskeburt@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/watskeburt/-/watskeburt-4.1.0.tgz#3c0227669be646a97424b631164b1afe3d4d5344" + integrity sha512-KkY5H51ajqy9HYYI+u9SIURcWnqeVVhdH0I+ab6aXPGHfZYxgRCwnR6Lm3+TYB6jJVt5jFqw4GAKmwf1zHmGQw== + wcwidth@^1.0.0, wcwidth@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8" @@ -20996,6 +22596,11 @@ web-streams-polyfill@^3.2.1: resolved "https://registry.yarnpkg.com/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz#2073b91a2fdb1fbfbd401e7de0ac9f8214cecb4b" integrity sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw== +web-vitals@^4.0.1: + version "4.2.3" + resolved "https://registry.yarnpkg.com/web-vitals/-/web-vitals-4.2.3.tgz#270c4baecfbc6ec6fc15da1989e465e5f9b94fb7" + integrity sha512-/CFAm1mNxSmOj6i0Co+iGFJ58OS4NRGVP+AWS/l509uIK5a1bSoIVaHz/ZumpHTfHSZBpgrJ+wjfpAOrTHok5Q== + webfinger@^0.4.2: version "0.4.2" resolved "https://registry.yarnpkg.com/webfinger/-/webfinger-0.4.2.tgz#3477a6d97799461896039fcffc650b73468ee76d" @@ -21152,6 +22757,14 @@ why-is-node-running@^2.2.2: siginfo "^2.0.0" stackback "0.0.2" +why-is-node-running@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/why-is-node-running/-/why-is-node-running-2.3.0.tgz#a3f69a97107f494b3cdc3bdddd883a7d65cebf04" + integrity sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w== + dependencies: + siginfo "^2.0.0" + stackback "0.0.2" + wide-align@^1.1.2, wide-align@^1.1.5: version "1.1.5" resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.5.tgz#df1d4c206854369ecf3c9a4898f1b23fbd9d15d3" @@ -21166,6 +22779,16 @@ widest-line@^3.1.0: dependencies: string-width "^4.0.0" +win-ca@3.5.1: + version "3.5.1" + resolved "https://registry.yarnpkg.com/win-ca/-/win-ca-3.5.1.tgz#2ef37ac24b0a1daa2714b4c5ef258c5242429e00" + integrity sha512-RNy9gpBS6cxWHjfbqwBA7odaHyT+YQNhtdpJZwYCFoxB/Dq22oeOZ9YCXMwjhLytKpo7JJMnKdJ/ve7N12zzfQ== + dependencies: + is-electron "^2.2.0" + make-dir "^1.3.0" + node-forge "^1.2.1" + split "^1.0.1" + winston-transport@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/winston-transport/-/winston-transport-4.5.0.tgz#6e7b0dd04d393171ed5e4e4905db265f7ab384fa" From e6c5a7ecd707b246f6e95721d4a6a98f3465915a Mon Sep 17 00:00:00 2001 From: mike12345567 Date: Wed, 21 Aug 2024 11:05:48 +0100 Subject: [PATCH 169/180] PR comments. --- packages/server/src/api/controllers/row/views.ts | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/packages/server/src/api/controllers/row/views.ts b/packages/server/src/api/controllers/row/views.ts index bcf9c6b441..16d0f0205d 100644 --- a/packages/server/src/api/controllers/row/views.ts +++ b/packages/server/src/api/controllers/row/views.ts @@ -57,10 +57,9 @@ export async function searchView( } }) }) - } else { - const operator = query.allOr ? "$or" : "$and" + } else query = { - [operator]: { + $and: { conditions: [query, body.query], }, } From c5476ce3b3e53317de8044d85a3901e4834f395b Mon Sep 17 00:00:00 2001 From: Adria Navarro Date: Wed, 21 Aug 2024 12:14:40 +0200 Subject: [PATCH 170/180] Test both allOr and allAnd --- .../src/api/routes/tests/viewV2.spec.ts | 141 ++++++++++-------- 1 file changed, 75 insertions(+), 66 deletions(-) diff --git a/packages/server/src/api/routes/tests/viewV2.spec.ts b/packages/server/src/api/routes/tests/viewV2.spec.ts index da38112e2b..41f4cebf17 100644 --- a/packages/server/src/api/routes/tests/viewV2.spec.ts +++ b/packages/server/src/api/routes/tests/viewV2.spec.ts @@ -1493,82 +1493,90 @@ describe.each([ }) isLucene && - it("in lucene, cannot override a view filter", async () => { - await config.api.row.save(table._id!, { - one: "foo", - two: "bar", - }) - const two = await config.api.row.save(table._id!, { - one: "foo2", - two: "bar2", - }) + it.each([true, false])( + "in lucene, cannot override a view filter", + async allOr => { + await config.api.row.save(table._id!, { + one: "foo", + two: "bar", + }) + const two = await config.api.row.save(table._id!, { + one: "foo2", + two: "bar2", + }) - const view = await config.api.viewV2.create({ - tableId: table._id!, - name: generator.guid(), - query: [ - { - operator: BasicOperator.EQUAL, - field: "two", - value: "bar2", + const view = await config.api.viewV2.create({ + tableId: table._id!, + name: generator.guid(), + query: [ + { + operator: BasicOperator.EQUAL, + field: "two", + value: "bar2", + }, + ], + schema: { + id: { visible: true }, + one: { visible: false }, + two: { visible: true }, }, - ], - schema: { - id: { visible: true }, - one: { visible: false }, - two: { visible: true }, - }, - }) + }) - const response = await config.api.viewV2.search(view.id, { - query: { - equal: { - two: "bar", + const response = await config.api.viewV2.search(view.id, { + query: { + allOr, + equal: { + two: "bar", + }, }, - }, - }) - expect(response.rows).toHaveLength(1) - expect(response.rows).toEqual([ - expect.objectContaining({ _id: two._id }), - ]) - }) + }) + expect(response.rows).toHaveLength(1) + expect(response.rows).toEqual([ + expect.objectContaining({ _id: two._id }), + ]) + } + ) !isLucene && - it("can filter a view without a view filter", async () => { - const one = await config.api.row.save(table._id!, { - one: "foo", - two: "bar", - }) - await config.api.row.save(table._id!, { - one: "foo2", - two: "bar2", - }) + it.each([true, false])( + "can filter a view without a view filter", + async allOr => { + const one = await config.api.row.save(table._id!, { + one: "foo", + two: "bar", + }) + await config.api.row.save(table._id!, { + one: "foo2", + two: "bar2", + }) - const view = await config.api.viewV2.create({ - tableId: table._id!, - name: generator.guid(), - schema: { - id: { visible: true }, - one: { visible: false }, - two: { visible: true }, - }, - }) - - const response = await config.api.viewV2.search(view.id, { - query: { - equal: { - two: "bar", + const view = await config.api.viewV2.create({ + tableId: table._id!, + name: generator.guid(), + schema: { + id: { visible: true }, + one: { visible: false }, + two: { visible: true }, }, - }, - }) - expect(response.rows).toHaveLength(1) - expect(response.rows).toEqual([ - expect.objectContaining({ _id: one._id }), - ]) - }) + }) + + const response = await config.api.viewV2.search(view.id, { + query: { + allOr, + equal: { + two: "bar", + }, + }, + }) + expect(response.rows).toHaveLength(1) + expect(response.rows).toEqual([ + expect.objectContaining({ _id: one._id }), + ]) + } + ) !isLucene && - it("cannot bypass a view filter", async () => { + it.each([true, false])("cannot bypass a view filter", async allOr => { await config.api.row.save(table._id!, { one: "foo", two: "bar", @@ -1597,6 +1605,7 @@ describe.each([ const response = await config.api.viewV2.search(view.id, { query: { + allOr, equal: { two: "bar", }, From ff9d934f87b4fe70988fbc1a6069d87d18ea27a0 Mon Sep 17 00:00:00 2001 From: Adria Navarro Date: Wed, 21 Aug 2024 12:58:39 +0200 Subject: [PATCH 171/180] Allow filtering via allOr --- packages/server/src/api/controllers/row/views.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/server/src/api/controllers/row/views.ts b/packages/server/src/api/controllers/row/views.ts index c38a415aa2..b9ebf3cc71 100644 --- a/packages/server/src/api/controllers/row/views.ts +++ b/packages/server/src/api/controllers/row/views.ts @@ -38,7 +38,6 @@ export async function searchView( let query = dataFilters.buildQuery(view.query || []) if (body.query) { // Delete extraneous search params that cannot be overridden - delete body.query.allOr delete body.query.onEmptyFilter if (!isExternalTableID(view.tableId) && !db.isSqsEnabledForTenant()) { From e536ec50935972269b6615c47cbf2175fac15ca5 Mon Sep 17 00:00:00 2001 From: Adria Navarro Date: Wed, 21 Aug 2024 12:58:46 +0200 Subject: [PATCH 172/180] Fix conditions --- packages/backend-core/src/sql/sql.ts | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/packages/backend-core/src/sql/sql.ts b/packages/backend-core/src/sql/sql.ts index ebae09e156..21baa5adcc 100644 --- a/packages/backend-core/src/sql/sql.ts +++ b/packages/backend-core/src/sql/sql.ts @@ -465,20 +465,16 @@ class InternalBuilder { if (filters.$and) { const { $and } = filters - query = query.where(x => { - for (const condition of $and.conditions) { - x = this.addFilters(x, condition, opts) - } - }) + for (const condition of $and.conditions) { + query = query.andWhere(b => this.addFilters(b, condition, opts)) + } } if (filters.$or) { const { $or } = filters - query = query.where(x => { - for (const condition of $or.conditions) { - x = this.addFilters(x, { ...condition, allOr: true }, opts) - } - }) + for (const condition of $or.conditions) { + query = query.orWhere(b => this.addFilters(b, condition, opts)) + } } if (filters.oneOf) { From 9f05804c67d30e156dd225ec4f27d71d069907c5 Mon Sep 17 00:00:00 2001 From: Adria Navarro Date: Wed, 21 Aug 2024 12:59:28 +0200 Subject: [PATCH 173/180] Add extra tests --- .../src/api/routes/tests/viewV2.spec.ts | 102 ++++++++++++++++++ 1 file changed, 102 insertions(+) diff --git a/packages/server/src/api/routes/tests/viewV2.spec.ts b/packages/server/src/api/routes/tests/viewV2.spec.ts index 41f4cebf17..ea7ebed0b6 100644 --- a/packages/server/src/api/routes/tests/viewV2.spec.ts +++ b/packages/server/src/api/routes/tests/viewV2.spec.ts @@ -1492,6 +1492,108 @@ describe.each([ ) }) + !isLucene && + it("can query on top of the view filters", async () => { + await config.api.row.save(table._id!, { + one: "foo", + two: "bar", + }) + await config.api.row.save(table._id!, { + one: "foo2", + two: "bar2", + }) + const three = await config.api.row.save(table._id!, { + one: "foo3", + two: "bar3", + }) + + const view = await config.api.viewV2.create({ + tableId: table._id!, + name: generator.guid(), + query: [ + { + operator: BasicOperator.NOT_EQUAL, + field: "two", + value: "bar2", + }, + ], + schema: { + id: { visible: true }, + one: { visible: false }, + two: { visible: true }, + }, + }) + + const response = await config.api.viewV2.search(view.id, { + query: { + [BasicOperator.NOT_EQUAL]: { + two: "bar", + }, + [BasicOperator.NOT_EMPTY]: { + two: null, + }, + }, + }) + expect(response.rows).toHaveLength(1) + expect(response).toEqual({ + rows: expect.arrayContaining([ + expect.objectContaining({ _id: three._id }), + ]), + }) + }) + + !isLucene && + it("can query on top of the view filters (using or filters)", async () => { + const one = await config.api.row.save(table._id!, { + one: "foo", + two: "bar", + }) + await config.api.row.save(table._id!, { + one: "foo2", + two: "bar2", + }) + const three = await config.api.row.save(table._id!, { + one: "foo3", + two: "bar3", + }) + + const view = await config.api.viewV2.create({ + tableId: table._id!, + name: generator.guid(), + query: [ + { + operator: BasicOperator.NOT_EQUAL, + field: "two", + value: "bar2", + }, + ], + schema: { + id: { visible: true }, + one: { visible: false }, + two: { visible: true }, + }, + }) + + const response = await config.api.viewV2.search(view.id, { + query: { + allOr: true, + [BasicOperator.NOT_EQUAL]: { + two: "bar", + }, + [BasicOperator.NOT_EMPTY]: { + two: null, + }, + }, + }) + expect(response.rows).toHaveLength(2) + expect(response).toEqual({ + rows: expect.arrayContaining([ + expect.objectContaining({ _id: one._id }), + expect.objectContaining({ _id: three._id }), + ]), + }) + }) + isLucene && it.each([true, false])( "in lucene, cannot override a view filter", From 8c3f1c39c8189dee23524687861b98cc7d23ceae Mon Sep 17 00:00:00 2001 From: Adria Navarro Date: Wed, 21 Aug 2024 13:33:02 +0200 Subject: [PATCH 174/180] Fix test expect --- .../server/src/api/routes/tests/viewV2.spec.ts | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/packages/server/src/api/routes/tests/viewV2.spec.ts b/packages/server/src/api/routes/tests/viewV2.spec.ts index ea7ebed0b6..149369785c 100644 --- a/packages/server/src/api/routes/tests/viewV2.spec.ts +++ b/packages/server/src/api/routes/tests/viewV2.spec.ts @@ -1535,11 +1535,11 @@ describe.each([ }, }) expect(response.rows).toHaveLength(1) - expect(response).toEqual({ - rows: expect.arrayContaining([ + expect(response.rows).toEqual( + expect.arrayContaining([ expect.objectContaining({ _id: three._id }), - ]), - }) + ]) + ) }) !isLucene && @@ -1586,12 +1586,12 @@ describe.each([ }, }) expect(response.rows).toHaveLength(2) - expect(response).toEqual({ - rows: expect.arrayContaining([ + expect(response.rows).toEqual( + expect.arrayContaining([ expect.objectContaining({ _id: one._id }), expect.objectContaining({ _id: three._id }), - ]), - }) + ]) + ) }) isLucene && From 7c06f1a40750fd866df3a4c888d7405171bb060b Mon Sep 17 00:00:00 2001 From: Adria Navarro Date: Wed, 21 Aug 2024 13:40:17 +0200 Subject: [PATCH 175/180] Run tests for lucene as well --- .../src/api/routes/tests/viewV2.spec.ts | 190 +++++++++--------- 1 file changed, 93 insertions(+), 97 deletions(-) diff --git a/packages/server/src/api/routes/tests/viewV2.spec.ts b/packages/server/src/api/routes/tests/viewV2.spec.ts index 149369785c..4401efc480 100644 --- a/packages/server/src/api/routes/tests/viewV2.spec.ts +++ b/packages/server/src/api/routes/tests/viewV2.spec.ts @@ -1492,108 +1492,104 @@ describe.each([ ) }) - !isLucene && - it("can query on top of the view filters", async () => { - await config.api.row.save(table._id!, { - one: "foo", - two: "bar", - }) - await config.api.row.save(table._id!, { - one: "foo2", - two: "bar2", - }) - const three = await config.api.row.save(table._id!, { - one: "foo3", - two: "bar3", - }) - - const view = await config.api.viewV2.create({ - tableId: table._id!, - name: generator.guid(), - query: [ - { - operator: BasicOperator.NOT_EQUAL, - field: "two", - value: "bar2", - }, - ], - schema: { - id: { visible: true }, - one: { visible: false }, - two: { visible: true }, - }, - }) - - const response = await config.api.viewV2.search(view.id, { - query: { - [BasicOperator.NOT_EQUAL]: { - two: "bar", - }, - [BasicOperator.NOT_EMPTY]: { - two: null, - }, - }, - }) - expect(response.rows).toHaveLength(1) - expect(response.rows).toEqual( - expect.arrayContaining([ - expect.objectContaining({ _id: three._id }), - ]) - ) + it("can query on top of the view filters", async () => { + await config.api.row.save(table._id!, { + one: "foo", + two: "bar", + }) + await config.api.row.save(table._id!, { + one: "foo2", + two: "bar2", + }) + const three = await config.api.row.save(table._id!, { + one: "foo3", + two: "bar3", }) - !isLucene && - it("can query on top of the view filters (using or filters)", async () => { - const one = await config.api.row.save(table._id!, { - one: "foo", - two: "bar", - }) - await config.api.row.save(table._id!, { - one: "foo2", - two: "bar2", - }) - const three = await config.api.row.save(table._id!, { - one: "foo3", - two: "bar3", - }) - - const view = await config.api.viewV2.create({ - tableId: table._id!, - name: generator.guid(), - query: [ - { - operator: BasicOperator.NOT_EQUAL, - field: "two", - value: "bar2", - }, - ], - schema: { - id: { visible: true }, - one: { visible: false }, - two: { visible: true }, + const view = await config.api.viewV2.create({ + tableId: table._id!, + name: generator.guid(), + query: [ + { + operator: BasicOperator.NOT_EQUAL, + field: "one", + value: "foo2", }, - }) - - const response = await config.api.viewV2.search(view.id, { - query: { - allOr: true, - [BasicOperator.NOT_EQUAL]: { - two: "bar", - }, - [BasicOperator.NOT_EMPTY]: { - two: null, - }, - }, - }) - expect(response.rows).toHaveLength(2) - expect(response.rows).toEqual( - expect.arrayContaining([ - expect.objectContaining({ _id: one._id }), - expect.objectContaining({ _id: three._id }), - ]) - ) + ], + schema: { + id: { visible: true }, + one: { visible: true }, + two: { visible: true }, + }, }) + const response = await config.api.viewV2.search(view.id, { + query: { + [BasicOperator.EQUAL]: { + two: "bar3", + }, + [BasicOperator.NOT_EMPTY]: { + two: null, + }, + }, + }) + expect(response.rows).toHaveLength(1) + expect(response.rows).toEqual( + expect.arrayContaining([expect.objectContaining({ _id: three._id })]) + ) + }) + + it("can query on top of the view filters (using or filters)", async () => { + const one = await config.api.row.save(table._id!, { + one: "foo", + two: "bar", + }) + await config.api.row.save(table._id!, { + one: "foo2", + two: "bar2", + }) + const three = await config.api.row.save(table._id!, { + one: "foo3", + two: "bar3", + }) + + const view = await config.api.viewV2.create({ + tableId: table._id!, + name: generator.guid(), + query: [ + { + operator: BasicOperator.NOT_EQUAL, + field: "two", + value: "bar2", + }, + ], + schema: { + id: { visible: true }, + one: { visible: false }, + two: { visible: true }, + }, + }) + + const response = await config.api.viewV2.search(view.id, { + query: { + allOr: true, + [BasicOperator.NOT_EQUAL]: { + two: "bar", + }, + [BasicOperator.NOT_EMPTY]: { + two: null, + }, + }, + }) + expect(response.rows).toHaveLength(2) + expect(response.rows).toEqual( + expect.arrayContaining([ + expect.objectContaining({ _id: one._id }), + expect.objectContaining({ _id: three._id }), + ]) + ) + }) + isLucene && it.each([true, false])( "in lucene, cannot override a view filter", From 40e7ab13718718a892b713cbb3ef80342607b4b4 Mon Sep 17 00:00:00 2001 From: Adria Navarro Date: Wed, 21 Aug 2024 13:45:26 +0200 Subject: [PATCH 176/180] Fix build --- packages/server/src/api/controllers/row/views.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/server/src/api/controllers/row/views.ts b/packages/server/src/api/controllers/row/views.ts index 16d0f0205d..0a76c37dfc 100644 --- a/packages/server/src/api/controllers/row/views.ts +++ b/packages/server/src/api/controllers/row/views.ts @@ -63,7 +63,6 @@ export async function searchView( conditions: [query, body.query], }, } - } } await context.ensureSnippetContext(true) From dc5a7dbc621d92d9862c6a7c19860de1205a1777 Mon Sep 17 00:00:00 2001 From: Adria Navarro Date: Wed, 21 Aug 2024 14:25:48 +0200 Subject: [PATCH 177/180] Fixes --- packages/backend-core/src/sql/sql.ts | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/packages/backend-core/src/sql/sql.ts b/packages/backend-core/src/sql/sql.ts index 21baa5adcc..a837ce61ef 100644 --- a/packages/backend-core/src/sql/sql.ts +++ b/packages/backend-core/src/sql/sql.ts @@ -337,7 +337,7 @@ class InternalBuilder { if (!filters) { return query } - filters = this.parseFilters(filters) + filters = this.parseFilters({ ...filters }) const aliases = this.query.tableAliases // if all or specified in filters, then everything is an or const allOr = filters.allOr @@ -466,15 +466,21 @@ class InternalBuilder { if (filters.$and) { const { $and } = filters for (const condition of $and.conditions) { - query = query.andWhere(b => this.addFilters(b, condition, opts)) + query = query.where(b => { + this.addFilters(b, condition, opts) + }) } } if (filters.$or) { const { $or } = filters - for (const condition of $or.conditions) { - query = query.orWhere(b => this.addFilters(b, condition, opts)) - } + query = query.where(b => { + for (const condition of $or.conditions) { + b.orWhere(c => + this.addFilters(c, { ...condition, allOr: true }, opts) + ) + } + }) } if (filters.oneOf) { From 6127aca09f36b89ce20c79d98a7ea9b1721a0e2e Mon Sep 17 00:00:00 2001 From: Budibase Staging Release Bot <> Date: Wed, 21 Aug 2024 13:47:45 +0000 Subject: [PATCH 178/180] Bump version to 2.31.0 --- lerna.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lerna.json b/lerna.json index 35ba5cedb1..a3543ca936 100644 --- a/lerna.json +++ b/lerna.json @@ -1,6 +1,6 @@ { "$schema": "node_modules/lerna/schemas/lerna-schema.json", - "version": "2.30.8", + "version": "2.31.0", "npmClient": "yarn", "packages": [ "packages/*", From 1e4fb27d7c6add51153b7e277a6850769c7b4bfa Mon Sep 17 00:00:00 2001 From: Andrew Kingston Date: Wed, 21 Aug 2024 16:39:54 +0100 Subject: [PATCH 179/180] Ensure autoscreens use a specific component order to look better on older client versions --- packages/builder/src/templates/screenTemplating/table/modal.js | 2 +- .../builder/src/templates/screenTemplating/table/newScreen.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/builder/src/templates/screenTemplating/table/modal.js b/packages/builder/src/templates/screenTemplating/table/modal.js index 0dede08711..caf1582fbb 100644 --- a/packages/builder/src/templates/screenTemplating/table/modal.js +++ b/packages/builder/src/templates/screenTemplating/table/modal.js @@ -139,8 +139,8 @@ const modal = ({ tableOrView, permissions, screens }) => { .customProps({ layout: "grid" }) .role(permissions.write) .autoTableId(tableOrView.id) - .addChild(buttonGroup) .addChild(heading) + .addChild(buttonGroup) .addChild(tableBlock) .addChild(createRowModal) .addChild(detailsModal) diff --git a/packages/builder/src/templates/screenTemplating/table/newScreen.js b/packages/builder/src/templates/screenTemplating/table/newScreen.js index 051b8edb82..34026bca7f 100644 --- a/packages/builder/src/templates/screenTemplating/table/newScreen.js +++ b/packages/builder/src/templates/screenTemplating/table/newScreen.js @@ -81,9 +81,9 @@ const getTableScreenTemplate = ({ .customProps({ layout: gridLayout ? "grid" : "flex" }) .role(permissions.write) .autoTableId(tableOrView.id) - .addChild(tableBlock) .addChild(heading) .addChild(buttonGroup) + .addChild(tableBlock) .json() return { From 741d8d9df4716dec2f8102a5fc2c477e197c96d8 Mon Sep 17 00:00:00 2001 From: Budibase Staging Release Bot <> Date: Wed, 21 Aug 2024 17:43:46 +0000 Subject: [PATCH 180/180] Bump version to 2.31.1 --- lerna.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lerna.json b/lerna.json index a3543ca936..5d04ae9f3c 100644 --- a/lerna.json +++ b/lerna.json @@ -1,6 +1,6 @@ { "$schema": "node_modules/lerna/schemas/lerna-schema.json", - "version": "2.31.0", + "version": "2.31.1", "npmClient": "yarn", "packages": [ "packages/*",

K!sjL$Lv!Wkn)K>4}0WK}T!0MY-`Gz%=`-%HF zzfruL%8whFdA@Nd4cE$TNUubnlCR&8P4X$LW11t zsJkt_W%8=e&^|8*nG;K~C7M{R#^Ys(9vbIIf^B)T6MEP9iMGUNKqTkF9+gZ_XeXNiy{!2=`+vnFS*FMpuK z1z2YCh-Kfqi~HuzbqDBqq(=OH4}VDT!e$Prt!5;>*Gc?Drx{o8YD%zX57y@S9i%-N z+jvMzErUp5v5x{jw*zOO@t zUn*43a)hhkdU^@U)u8n`L2*rr+hNMCR;WhTOFdJF=kJso|Mr${Ng<( znnq!wvxC^=&1JBAWm{^OjwGe1z+bsHrs|rLZ%-*E> zm5P!0j!FyGU^I+uYSd-CLl_sR$E7fh-mwEQ!M9~rL;|!r$W3(*^|FvhbGd5`8@U&P zTq94thgOqJk%|68e6BWcS?Ujv-PLOFUIaT~4{(994WfR}$OCCPT}OT2a&HIIvS5!QPgku4Uxqgyz?gAl3n3ZxQaLULmby!A+|W3c)-8vwofTmRR>Y2UKX#G768#DG?Rxoa zXwxi!<0e;IhgMcx>U#OYMA;9Wd!HDOu6mfnf zfWDKdpr8cTc=4Q^%U2YGts|SvFKLN>e9!`uwU%m3l-fOrywL)wkT2{}c%PSQDfK5O z5DwFRZShRM4lO&)V;@}2r54^#u`M$sxP{t(#X1Hfdc}sx5M?pd>Bk8LhIHS^(jm$V z>0%SghKz|&nAnJhq5CDfb9?49{q*~@#@{T$*6QpKd2Dy7W8+!NK^H&_{+0CNlOi5w|6 zwZvh>)t5QMZ{Bm|0|-SIZ-?hXJSMH+>p?O5YCMIr`tlMVNjUZw|BV(uPvFZ*3xC5z zN^hbzcmLfn2<`~SH*>n6DqyA{Y|?jKGKPT`fA)$+CjN5XxL@xwLz=~pJfs|V!nT2g z4w;=Ls}(bGthk+*8%NoebOf7xkrK;cu$M2*^wESYI(vUZ}20f!o^-DhR0um z`iVW%IUaW7uxW9R-Gf=QlmiYVB7`x`{&p zU@(#zIXf5EIKx7(3S_|<@Ei)$UE6<^*=6qM5Vo>J1L%?vm|>VJIzNk5``dE(j0Fvh ze0I8#HYTlH&m;5*UaZvxr>Fs+)+|!Eczj8KmcsZ&f z=|0?LE6MKDEX&Ok4vK$Tt!ZS-OiNE%3w8-VYVbo4N~M7t{{m^kmz3Jp+hXVaD**CgoyJnJdon4!O)O5+t; z=Fujhh~|%1%VBcMVc8eHUOm3xi{Hzi0bkuY;s3rqyDv};Xr?vgg8?57pW^DDn_o9V z9ZJz1hS~qRUjd)u;-9@+fI4w&G2iyDr|x$&lozTm>cr=T?8C1Yz{e8yNan2|VjBVL zk|T=fovl(MSwN3VseKCZnNOp+|Lk)D}BK-y7QW_6aoKu()$(KhC|E(6)Yx3G!2esO}jHzA6C0-Nt2tn!ezL zd)dd#-ZTCTnjm1!Au?-9x#Pj%xeC{y+uw%UlQGQ)@BT63Q%{l9$6+UO`?5Ij&-=fE z6PpaJ`o`wXFR3uv#;+lQUl88sUO2$o+yIOeCu7kt80`!_WNTIqh;W?tCdIh13^VTu;20rwFJj5}4l%M*Zs*o+86GzVu{RO~FLY zzXkePKaMDY7Kim$WPP~d3LBC_iff)<5C$#eJ-kFBf2*^A*iw(qX*&>Wq$~wSZVn<< zIYl&!(D$xVuNuEM&w|MXb7Jo-}?%WMyK;cp8uckCc4srDgm9?gnO!F)dSlhD z9(%pH<6y4eL!c}?xxjR_KoHSiR4gn)ev6%wmiACpBXha~2C15bk(m>_Kw8kBAX9SDFP+uP(D0`gt7| ztY4glDLUQs`Zp1B1695839KcDyk>jw^1YZkiS>>fjH?&-5m$qGUppwpoOGT-lUzW2jtO_qL8f*9VhyREn$JR3Obn*m`tiOhVPgM_Q|-S0sXy=$4>KeT@)Sl zb{8-{{!tG+a8n-)iZSZa^-Nk`V4ni=&W}ag7-=%wBXu&-ety3$ruc@0zOcRy8tk51 zdxSni0UBzb{Q!99WUC)F#HJp84VP8sdu@&hywV7u;b@0tHpAY`%MtHF?ex`khX0mxO_<*d(mFhC;1} z453)=%>CmgN@kW|XQ>O(jUVTrPm`;kL|?le;`>j4S4nzHt?$9VCi6L`suzl&RA4dy zi14&DGmDC(5P89FX3cG?#{GmRC&LRH3iF1-#V%YfQWOLK$-|2vQMhdoRfBDjoIffl zAoms>EGoCRL?bO_YxWue0q6G1%o+F&C#L5!Wu9|s$8foNZQDXYMIe4bFqjf9Pm#ib zLpF~`7+*K1KK?KAdy<-d3qZ)%)HGV?i^HNAe%8T05;ZrV*iiVqHF%BA^)edDisPs& z{7FYj3b-G>D!4Eir>Lv3Yp&&T_yC^S8oPf>z2__J?UK7 zJ{lgb#tZKEB&j%l$iA)EHqO_ah>$QOrA6};(hvlIFe65u!{8Phzc#ev+c7YDA8S*_ zCd}N*rM6hJ8*`gs4Nx{n!$s`FPU+jC+vl)u#mtT~LJj!eEI>-P{k?-H>RjN}?B%V^ znak(H?=*>0AL#K`SHuE<37YoIFKD5_@8V#?&isnxua&zEmY1)ijQdCwh|V9Lt=3o^ zq6BX+&~a~kMbcB%SF(g-5|rOk{(xYpAQ6e;ihXy_k#X}hG}8VX`WHgNRb4o7R5MCh z?b5CyXH%_tO~>PlHOywl?RmJV`>WT2w;)wlvTxTP#HJwRNo$D!O9TO0dVnRqUEg1F zXO|Dx@DFn~hwnBrlycVl60(*V+CI@vZz=MW3Qxp-(Ns=*vB{bseWItIhZ0QOMKz!t zmQnl|zp*6V52AU@b!0{vrKG#KV~r4~`V;%It?56(qgr|qu@2!g*ovNnO8`F$VzA{% zN0pkpbGbt*0o6X^1;wTFHKuWFl>-AUn+k1!39m^jpSe#QSws?oi{dv|Du|s zzr-1yNb~kQc0m&B{F`^XLzt%I?{{Z}@prhHF<^DCQJz7&{r`i4kz%A?)Zdl6qZo1L zNX%vV<+O`B8ZD~+!UW}%F=-7@K|I4j?)?a3-Ut2L0& zxFsp=ZVMiM5kI$=MX87=Q8MzFCUJDZTb!aBJrLF4_3w{@w zc+~$UUNEvr#O`00TyulOM(@#}JEoPakjCdM2}2Vk3Tqd<6(9Xq_E%`vBRB4F!jC(N ztYwZc%KV*-(J|sgI(pbb?~)oXrl;H|SDY0$P5IX8QSekq44?XQ#yfKYF(??tRMRF# zEdKk?sp+hymY^O43v2(y@)2zWFWdl~i~Df29PrS-S8tMbqDFF5c8cjHUs{<$*4E4? zKFY37$0j0Gy$0JumQG7Fk)HkSU~+r6n7>5Te9bVR@ zAJA(hNL#dog*+#$@Mkf5uqFnQ1Q7hYP#nW-q5cXm;X0dL1J*wbCm7j7vnmrISE*-= ztc%hoCZ*h%n0=A>553iEtCItZDZLUCX)BbMD5l3;~k19D;5_o&GwnK|dyXUXBYRz-QQ!icVclWo>z_T{Ha| zsH9H0bBfZ>vr3U^bf4aE?K!Asxsjklx3-6z^q+Mc)?wk5D4n)zp(Cj#Fs2+wJB!!l z@wMbX*s>`1%?XU|tg~nl{peE?;%yKiU`Zi6M41#9Bnev$j}n#`BVzS(THsRsrod4z zDY)l;r28w*p!*mlV3BZhd_vtVIW>;#JrVej#|gKPs_$`@{rj1r9QdeOj&`EJQP`-4 zAHQ!3H*oGxg_^2c!*`u%ZK~_vUWM+eeMBtkFwPK<26~_vP}oV+=mYVh{VDI-CbRsN zm#5*@tr+(J1sJmch~$8?tGVf@p^9IkhX1eC0lhn%Y?|#s5^v z?+PwXKZ@_C{r&y-8_(9fu-8TbZdH6=H7Fayb~&(K zSUauJ;%|3em@6YYqEa-@4cDG*Wuj47r7)X9FqB2}0_#Fe8W=-kij#%z$DzC3j zW?MmskJ?=L->d$1=kx>ykk-`euQUrgb}^or$YDvik|j!T5?rqouFcktdW4V9}fPwU^UT zg^VE80bD5km1gc4qWKdH=?O~cw@z}4Mc0tStJ#O(V^_25CN>(F|WIICv?h z8w;K2n2c#qYVeJG(ba2du08}aDaRf2gP{xKZ{*+gCo_Vp2VQXZ8!REtLE(A)WpPzo z@UVV}yU)dW+Kk@`)7y>nll7VEqmTRonmf?(Bo6?1sqt$F)Iz+^99Y;rhy8uLW$<#z zW$JrXxjryH4dtw0eYWR3YTvStmK- zher{hCp}MN0e>0C>gAmccV{$56f9}t54%ZkKk&9;sopc}dj5d-#?njYx@_>ESM~u8 zA8xp|2y5AGclJ96M-h#&>LVe^l0Q2cTzqAoXYnn2mcKY*i1KNkL7f+4^MF_9g8a?A z&w6G>)8DZU|5F|Q80ejUwJ6Mkc1&$i7I2>@3QWdo#_@3F82Ozds05y|x1W1k8JpQY zzl{Y%HcXUT7TSZA($Zqr_x1w+(KlX9np|5pMRqgCd&X{~IZCpRXI4xps{qs-LOfCB zdqIY|HTaCc^d{)vM3{GbgV2Vzo8}e|45MH-0v)OQAJdkDf@2d!$>@e|cW5-?2Dx00 z=s(3XmQajcHGa^m(3mJN3c= zeZb#p`J4asEO8Vtt%re)hyo;?nGD^GI^39q!tRYRjOZCU|7dfLB<8F9tA1G|Vsk@eN(l1J-unOh_K zB_dwN+ufTYR$qD)W68$*JW$@x%WMT4-@PBX*mK%&?+gmst^A)|JR?qt-FyveX^bfG zZ&V7zRcrmXUX}bREylPEPpR3IhY&N8O^?CRjRcKj`T%a=*-6c0u7F)!IMM(#v{$iSlu66VEt zR)X((2Hn=*&U%?MrPB~LrCN2J6tnS8e#=o7KY4v4n}mLvk}PYF#z>`xky3=;Ck&${ zbUkEm+UrEidLn4W$Ea++KJy=(G9`cO6aC$;#i|$%q7(a;bNKu>-gp7~Tvn zM0x;#ujqB=oNkNpHWuth0L!y)v8?csDz}J9EfMXnpkctIIp%LdhUFrwNJf{ zA%gS(tYSx**V)6-oj}fhRvequ5zfVyl6>oC+Gxsb)wtvYXrX$uwl;Jjr9njeJDJNH z*IQn+lFJkA92QZDTw~6j>-e*X+_``|d_u~^*QWtrIV!D7o=bOjrh!IH0!cu$Dqh_z zqGbJlrnGTWiEvrPLb2@_I~nJQ%?=`_sa#4V0d{x+x{SsT!-mPNX?4uIicD z&(j+C%Ddm>a4IQl4*IpY-u}R4M4Rd;mHkNBr$Tk8ETM-QfKEsPEauS`V=4IgZW`C+#4?>~j@Wmw+rHr1AdNHT0N6VD^db zy|Y<@Kk%Dv1^qQMCz`qqJK5YdA!o!2)kHdQIICdjF>3-n-*@fl<_mMTO~z}ufwwJ@ zVx~yx!RZnGx?JQ}A!6AVM(C&3B!J|oervs(aXi1dUHnWH!#CUWNPx>wBrViz5Vk;y z1QHH(weJiw76{Ep*-vyU=BZx?6%Sv^EcEq-z+woEv0dT*7vnhy5xRBvGD@J?VH96k)vv4l(?clt~UPM8S1}rar4uXPY*rh1i^zITOS--=oRy)T>wrc z?iHuQX`bG!=xn}JE&7aoidM!X^zVjFl?t-WVK@z_xSbC|=sHm%t)f1*CJlWAN6|(O zQWpiGHZ!V0lg)v{Gt1w(qivf5Y(bpf6XVHlnL^l;pve%N@*?S*Ox-H8U+ey+4t6#< zl|ma8!|VKwv8yoqvj3EcsKnYJE*Q;d*`}b2Z}rH*30yo8WSL9DqC~Pus^G5&Z7}B~ zQl&O6X2IX#S5baIUrv^*XEil&&!}ouIj(o+6CBvN-Cj_J2Ie+GGk7wO`J8v3VCNPS z`k)M|87fGgo&?OkPV~p`=N+?Qc5NJG)Ls8g!1C25DYj5lD^coB3teURv@L3tUZLzh z+!14k0L$G-!M~92$+GS6RWEbe3Z(zUPncN?nT#H+qbb{OL)CsUXtc1g-o^C;x= z1?6y$W5(C7a4Y9IjWlD`y1Y++fhb+RL}LJGb&B|Q3KzEHLrj0ag<+ll(xn}DH*JE6 z^p&kUGUcbU1@#u~@`Q@HEYY^BB^khG^L7>xhndYE!`7f7I6-2x+RekhlOYuGpW#7yCjkE)o=T93Kd`YY3@$ZkJ_Zfhv6G!v}^sQRoy zMpdl@p6v%-iff|3z1`W&zH0h?voG5H-d39S7+p@m+iyX2^?A#+U(S$dnm;cYk0j~& zEwMh%whB4h1Frlq(S)QXD-(%6pTAMq$5J$4s-?7%cW2-Ua7{@HI0C#<>PhoGi?kYJ z*vDu!Ja#{=301H?-SQxYI8M(_*W3w**83QKr2gw9h7T}s>`u(m6E_f_=w=4qKsPu2eVL~7z6b3EvVQBj!;~b{ zHT}IUj3cu5F*JoU&d_{D!PvDBJCnso07=k0YU%i6&XOb9x47zamiqTPLFnjPZZ}cw z#e*R0f;m2?KltKj+cFP#vPYh>3yP(9rV!DTD17r2+-4K>ARXQGgCq2pSjXUAzOl+U z0vIM46uKVZBI+`6xgF*5p2eoD6%1@0EBg#M%sct+md%-rVS=||3Q9;>Pfotmcg6oc?X zT;ZY6Bg=S?)SPQ(HU?8?vnlwXdV`S||M!rL-J2O2edLYxF0M87oYwRdFC~wnUxgWE ze@EoCqyZ3mk3zz;kQmmYw!M;mr!eyD7HzFjJmJ}p9|q%Zf09C{0FB;1(qNLrjoLg9q&f_b@JZ^yNr8AQ(k;Uw(wEynTky_fBFOGMpYII3E zUn`0C&DS*vRVqo@zdc1T$u<*q#4mA&B;TRAW;8N7@K-sC`fpY38$#2Eofyj?l4shg z8`+tN(MjeR(fMf(y7Gx>!K+_ntMZO7Fap3m7=RGD`%;NiYah}IS*eQSbq(NUzO4>@ zFR8Keu*Cl+W}q*9GLXEZqLdqP3q?0+S95^~a;8Y#bX_25wH?G*niBR$OV;`7PLVe5 zng$#^Be#$4P;g^G3o5C_Q4P-AFNI7DPtzVgZxZg$E(Z4z*_?SCOFgRA425ny3t(b_ z`2;9`7S2Khvi$9TdDJH)hER7N8nYsJ^RU}GSIapRl!a%^;$!4ZE32aD{oG#r#M$6x ziP=S&KlP@pnOp2SiK#B!SOEE2B+&37_1i6+ z7*yHAvdFPG_|!hMB@6l?LO%PwRZpn&u-^S5tp0Vr8MkyxllW~LiPzRJ^!aW%skM{{rW zyQ>V|<3(dD#bL78->JPc+;?b4r+oE+^!}7Y#l~_w)$`}}o)977Ka+vZBI})0w)&;u|`*E?%Mx@aeC=takWcW1? z+}A9yN8K&K>p+q@M5ir#ZGk;viy60aSwkQM=EliJ0rV{5l6w^M)oUe|A)Mj|J~?(O z66W-?czwi11R$m-ai)$G^)X=K+0^SJN~ zPZ^9;zu;tEM!sT^d^x^OcXbmeN#x6m-If%Y$MCmervLu=##29eWf7NafEmXX-K~o- zFGYNQmM?0#6MGqYrD{V%+@z-2*;W;?u@-o!mZsJlJNz$Ej>28zLG50U>cxD>*$%zi z9QIl8+KsO}>9}L+%rHR!y<9SR{=PQWxQ)4Cf1i<$JG*^LSaWFoB^2Bx>}!|%KxMql z%}F`90Ijdj9iq<2u<~dYM>gT)))Uk?VV3Chpp+k^-QNl)y~vFaPc2SFC;?(xo1IfhCdT;K|)0AEvuTKL~zoNWnY`vu|+?^}QYh+8J zQR$4=-r)X%&^azzt!`LT7!i#SSHPNk&v}M@4*zPdr$qSKW@j%M)vBf*hdj>Leo`C3 ze$>tWvh(Bv_bTXxNfg%;%tE!Fe6T%u3oETb4`myVb2ycaU3o`fOf;B%z@9Cl>WH}7 zrHz$$SCc@f<#V?2Z(kPaC2h~n1qxDmShd$rG57aF^O~OJ=1Y4-^~7Ao-sP;edQbCo z$BdS}WI-ko0gD;rW~cZahau;MfWd$~Z01}GC3q4~O1?)%85Uc0rfrp9(d)|<()Y$D zSfaCV?>lLZ38~@FT!xg6y{C6F8IqBIB`AnY`{SqCfLKm#c|Xl!rr~(x z;fUnQ+J1BQPe2Aghjbq^<+ZRj3+zM>!NqGh67LO7LEJ?cx47yxL{n9)JF{AE^(dpL z6X9kP1gW`t<)8$NExf=AL|mL9wor=_M8r6IJ=*7FqS}`+(i9JSusvi6aDm9!;LE)K z_yR;*yuiTIvpj4fRXQ`Hv5(djNX=V@+>Yrn;iqd_dhw%o<`2d)?KA#G*s>O!kPR!v zSCmwD0myu;MJ1 z{yPLY=UhNIbk<1Yg?whh1C8v>Q}O;`To-|?F%27Dg*}ov8idCX7Exi++ zV!JXI;`e@nRw~(Gd-nclw7(WJ(a>PD>_E8Xx^bsHx@Qj_ifBsvxZ)L_oRLM?rQ#hA z6A2BCfpBofTSc4O^o;ef<$OzvO`;GLt4=piEoM0#IKG^(24C=&+3Rl-%yX( zYT`$aKPYN_AiFmV1~lw@+!^rd8uf`uUE8#9(c|P%IOs+2P*r+xu`pXTQ`q;z&wp)} znM3WZMoE6Z0j@nuzJuK3-yxIDFkff*Ic7R9%elq&X=c#3=z-B{Wjdqn>6D>YAk&}6G|!Cw4*_a| zS#urY>c-%ZEWMAw&etY<`>dZ-JnK?)p+|C{6+*n@vy!=iPv{+~twyG6eNF1u72md? za3}cdCwKi{Yt+SuExo`3qBCtzK+Hig&o5>B^SGCU0(-Y$ifv!=4N!OpZ!p%AiCLM; zkDtxLl?^J#McJ+!oLKW;x19B2TP#mZ6bqgzjXAyKFL*I4_&?u68Z6P^J=^d1O$1z* z?NR+;zg@Hz`_80Lxt+zAn!)C$r$9YqPBA8OWse|D*y;oQ%*#ME|U+rPI<=ZJSmW-puZm9v&x$ zXkP=jn`#U07S;e_fC_Nu{D~&pwpi|o=tk9yakjH!3TpLf8uw@l-qSfN`%@ahcBCa{@6yRPpW)EU6V_-pt$2^9W^ znwl&BGA!i2pc73BR_}h(97dAU%f>`Ieuiz0jiqxl}dvi|X1nmpHaJ5di;e2et@(9U3 zm7@7C!o`E9ZBr4EpZ?*ShCs2ZeAr8iGTuW!!A_Ei`rrNi{R_&m|L^_@KWV-@ru&gy zQ@d-nv1{$||BrsWe_dGB2tR)Z>=AhL)I2+y@OOUrb~0Zn9^!3?dph6yt)FcRcOUzwu2L;n||=Wi%1_-fzE&$p7+pNT<8^Kaj_n7PKD0|Nomm z+YdU*=Nx9=1%zCao8&=jJ+wC%+7~>Lh)tb=dPk8N>~Ekwa^P8H8tv)`x|iUTws6b8 zBX&012}uqE{-u&IO9=UIgBj*1RYa*!Z3Nb>*>CwbhMX+2y=a@60X)}wd^IHxWoHbJ zXYYxC#}?-zn=v&6img&MxDH6${@)kS6g=TxaB%H7%*En?Bj~m0f4Ksnc|JCuAraGc zn5C)5QZca$FQbPE<0O0kmfDQQIjl~0<$ota_qt=2d6qU^ttz#7v9^Y&KFE7Oo2M&j zPv-xGVm;$O1v1@#)wKU1zSQ@n!6BDT+8_&B0zZqU;0vl;AZ&7jR#kuYA%?`C<8(rp z{az9L3x*M48_i>KzUmbaL22|mZR-+bMa>VP#nHwT?Ju77=PYfUh4ADbV2vX;!t?oi zMq{tLjLGc{@Y!>v979v>mh5j4Ruztl8W?dHl7LeVsN@ge3IGZuQn-34}1I+;4*?wcUE z6z$JW-j72>B}x)|3s3i6>$CU zsvXQvm5k6j?Nl4h=@oM$yFK*c+!1W0P)cNX8usJl%XR31aK1Mw>hyet08`X{)y?Y3u>R(s6Enxx`DZATE$fm! ztC_#(5CzFr^d0$y=AhxarTmh(b9}gq7XtR<{$C`iqV$OEH#(vC5I!s~oARSEtFeVa zcfCt*x<30QM}lO;Va1)CIoUL zDT^I!TL%Hni9G3Qozu+Qu0i7Hor@MCjNGn4rC_`-o3XGt1htr!n@vqfHf&hEDY}fX z_{%*$Z((9y!L4{DtL;J>uRMo6O(!8?81vrt=>iIAn~7gUQ?N%=xG{nYUm+*`KP`71 zMV&}L@Jh2dA?ufApjAqgE^Ot5>r-{7Y;qz(dDchCU4%nd{w@5*gM*@X`1<#y0pKPP zw56?BgG|Oub{mFEI|N0sE=E?7QTwY2v`YkA`mgWUegkIW%H!S1NiFmRn?g z;Lr|~5I_48lVz5j_3d&~3K{>_vwQ6$65_TKd_cxlmdDusFfH0VhH{AY<6rz#zZ<#r z;gXtpH~GGbel_F5$h-J3!b)ta zL&tdBxSI|XXFF|$kq#S&$h`R{bLU%f$pqqg4h4bkZDgz%&aKfrwWq-_*Ty8Q&WZcX zKWhZfI@TKxveYzgd=fJar5RedA@n+c!Yb3*R}EZ zA-dU6rJ476GzDLXZo$&e>m_i=t(u^jH;zO&alwuYmxSx9v1F1;Ret}cZ!U*{9V4W59DOBplX@jF z*Xd7w_l@KklY~1pewb(vny~W>w4_`v0GwK+nr}X$Siutr35idCU!?h@B|mbgOAF9baT7k z<4FRolY94Qi~vEDeCx6<(5JGiS4|Nn6GNsL zZ-mHJFJu0)DA!iFulP8eUn4YliF+g3htVq7;AB-dqh|MWoDtYwvDcZVA0$tjVeBDJ zB4PftI|Wgxi{L^zuKb7G1vx*~{SUZ1W69X${$T4k=ZG@XIa_wP{hE6`5L#&`$~1Yz z>Z%L$Z}8SWhpjrD4h=SwCmVn=cI45VL(JzdHe^1zVi#I-@oQ)bzHr!p4u8iX+v4UW zk8AV?{Og%IS*t;AaI;ls3?5x(?+baKbOZ_#7@ZMFxMsYmJ8+P1Y6pf$j`v@7PX^9c za|_RnjRCQUNO{Dg8jM+pkB^Q|>qOaw^#q+RCT53|#}8`fERq!`R{l^l0^ z?bG-Mhy4aPAKOX>dEErFj(*yUEe>#x!x=hAAa1o$kak63v7v>zGVfPTY9X`=u zXNeh-HQrR%cH_s&gOH za-KomA?r5Rk=IJmJl*yvjAVF&(FMFM)O{M)e?&+KeS*RS?`<5HoAZ)eb3IGOJLS5U z0kbmeZ#ddnMt1496MynJJhc7v)rsXe&RlNg8L@bG-`#2B0PTq2Nc{ljn6$FmzbRrA z;*4}=l21manWhT>3rAxQqlvE%LF!qGCAks$X!h`r5lQzVCFSTvPgI&@!VPjk_k z6X}bj$S<)v%i)g5I5$IM-R|Vk89Y~CC01R$qnUp+03WJr;aH#5qUD*hr6Enh3s3QH zM6rewi}8#+%u2T}nkHA@$_+z7DI+YShy36K7QQUGx&*p1jXV%@-ukQLL31|QWZ$ea zBvE8p<_@>c5TApF=debq_wxP8qJHLMinlpL-hFx8Ha9$z7MDH}W5)Vx$8yCj5XM>L zZaFEvaf^0DTv#jh3x`69M)vbio&T9gvm3nU?q;h-O=xKz_B(zfQv?l60Hh%FTgG5H zr0`~AuipQa{OfHiB_ti~sH@?oAjr)<0{0Y_+d{F%@~5yQ@RIqOGnCq+%fYgqj&AqD z#h77;U6y1%+;Oj0XqqBA$BIGee>s?Mb=vvfsstn_xdYH-1EvDO6U(6dA)6iPxNKELTAi1Bcempb@09u z4j6KJDefGtf-lhiK>622pn}WoUHiK9yZ0Ks^pw^+KFY~r^nW>a_pvC@X z6j=yA--WUM z5j-NJi(U^)V@z9VWHhjWYG)N!ZU?JmbAR1zgKQJ`RX}*w*{wASGzA-+PjV|jms_33 zofeZjSuy94@hUhilbC8^GCnmN9eS@U#*cQABgoL1akpt~tbeUqyp9X{ek448See6@ zB)=Ue5BwV|rc8&%x+xrwxuf46o6*i0I3w&a8%Aq&p0qevx~H#?#B&HKM&YL}bQN6rrQjIX=b(Hhz0f*Beb z38d+2*E|_g`24m{N-lGb)*5vGtm;|PNphG@1 zW5XEh!BH$=tcy2rmY2CJn>_pFVzSK4bA#2BW0agTsHpm7nn`S%#TBVr>F zP)Dta^e$+ouFKISpb!Znivlz@2>;y7eMK~>ndEnxBhDar5 z(Gi|S_Tl^yR{RV9z^&7OyiBoNzzV87caQ8UTx@7}GK_u2R5QgX;?VltYm48q~-JhbYOed{1c}9M$zC~ zQfiH{Ju@1NrlMls_kyIUhM^u;-s|rixd8)i^HB`ePvPx#(daJV%moo&bXL46XK7Bp zE;k&^HleGjF+Sjhx-~5)4$rK;sn0TGv>yFnF`Xsh2F>VVmlF=$JPnRk!5*Ox8&!1s zV>V8?4A-?vrJxd+(dLU;Y5ZUcUJYt%+h)X=NgV9Y1drFM%eJxnA!yjT_gS>A5kkc- z06pW#M5CZiZW+9m=SpKtqKU2#jUEH2jrb(jk=hJ>QweDd1G1gMXc#Xv4778S^k^4@ zq{Y)!$=SWI(i=5e1slBJLv$gidQdjr_7>jnRu*CFk8{jLeQJ0?d>mXkF{~O)@M(v& zr1Yqo(_t)Ah;v9K8H#8(Y#XQw`PV;!5PxYy)PtxBRrbxQgxkcedzL8O(~N2T^9@Al zKJ<H|kiKok7oF%6|;zt@2hE9f%l_qZ` zXiVUe!yiSLj!Q`15Sjn1$hehw1;6hnV#X5OK~dIrT0dg!d}-3s*l0(@1$}3Mp#i!{ zuDK+E#LXX{k6-`Ey$U{my0(s<3YOs-1C(6cndq`ctzDpAJ?X@acW|4o1aDi;0+f!^ zZ_$Oo+bzRpH4k$cV=pS^#^B={GG9c-JEG*I;b5KB2G5~xkBvg=FuKL!3L!P%J(NA- z9kH=|=hsa95?TeHq84aQ>X{?9OteC1Cw2U5nCtO(*nqMB9YT60p3!Bx#|7#Fje2c! zGvrJ=pc$o{{+fhxC1)IGEMcN7qvIE6#CAn5dqBht*&5S^@`RiQr>G=$%?QefeUY-G zSL3lA!Mq(;>7wP%4ctv+t#Y26?7VJ7GzELO4*}1>7!Ce~rb#+UK6h5=T`Nu6k|EA2 zSHo3Z77Tke_Cf2yHZynlIpmexof>a4Gh64I4rsuRZNIHWZWnHr*8h40w+`P(%Iank z@HqF7Gl#U4=wo0ue69+FFQ)INqPsS>1^AkSEyA<}m&(T8rK^p$ldG^9gCFo#`-$bw zJ82dC8rl&-aLB(|i0O4DK@8iby_SiLsXl_C|1~3~tmn3=xzS>oF@K`RO<+w{dOn%J+9}=@f=h6V%HOXXhW(O@ zP7Sqzg!$MB5_Tw zbLvtFMW6rp5Ix1@w@Yx$1r&#yDfH~uqE};h$6rVjKAzQx^t}Nt8a|+kxG9JudSi*& zv3x(uN8Wtbk6L!;B18P($$`>}S>Sl&vz@^qT3)O08hjR(fo(#@wEV$NvH9eopm81Yfu@i( z3Zg>p`UxrP650^wgk28YU8Oj;2rAX(zHI}ym98S|tbQVVJ3ep-SzkooJh^%paQuD}2}*Q=7=1>M98BQJ-8Of^+yl>oW?~X_ocmrrr-;zTCBoF4ZHi8+BmEg`qpWAi1zdXAPxGy{uTZ@Ua+YWf^oQ+4> zNfp&hzlOhxFpm#ReOFymgk6I2hehN<@`H-IM%goJWM~TBz*V@clW!p~|Jxl+q1Rcg zkGbqN?bbS0%ynh*FYmicm4ww8r?XrLW)@}KSeb`C#SfFzn?IwhUS}&xSH56y{i&k@ z1^-h0l}cdi|D8{rKfC4sH6fF0VjbE{O@Y}}i2?bFoZ@}KE1l7$t#EC(?YZB_)yWu8 z4>{u9`1C>|gyKS^aPUDQ6 z8X{`$%V$U5N(gdkjU|5gDHCRONF&Q)Hyb~j5$lQ(t81P+ZRpd++~`$HbAA(rD}DLL z;hGr{#)^1ZsPv|b=qJ;Wr6+%<29RGv{0D8-gwAZ^`^5B7TGKhL|G6FZaRJn zy(7YaimBMhByt%`Zc~_}7((58W*;%6bqnaG^UvHAj{F@c{vo%v?D2$B^uSnGwxUjm zmF7Q!^D)!8*M99V5WeFukSJSfo~nzrQ^hBOx^?9?D6xhRe1eLp>?8KoYu&HeT?jOR z$^~?{0p=d{ZuAC2t6&4Sfa6`j7*otuVN~KjrW0w~vVlUJYxbw4=qp|HU6L_DqDGE= zk$1dh2@piJ&|3Hqt%5I5M%W)BfPS*2$uJFV+P)>bt%LUo0CkQoEkSB*yauxj9L+hFWNK4-?f@()t<2DMYP z3a;=DYaQ3zKbcxOrRMeTj%R1(Ztty)>G_fU-dF6>CS)n2M?qtMg=dMcfhU;nLqLJF ztU9433wle@nXqT;**g@;zYfJK7-{ud+g;|=^<)kqUpF3O4y(BFuO?`XTx)#T;|c!kJr$n=7`@Gmz?v@1^I4s1rHlP>@O0B=b|K~!BZ zwy1QGwxE#fbpQJd|Ki2i!NjfhxMU+0dn5@+dzS|ZrFp91U$l)|5j+gh=MalXy#ayt z;%6oNSKkUY5AX{B!<;&AL6)JJDgn*0@=U4>wGTI%fm_h3+~zzf4xfjPgg85CE`AFC y4eyTF0000?&v;DHbZkt}#;(&ohGG|3=Tb4Ll!8t-={OmqP_GNOVG zo`Z;E!OcV8!hk_0X2fw+WL3+``uPWcUiwF!x>scEH3<|KG?HRA+z-4>-C7 zYYw&pE+w@OX$86Q-=grd|F_Wp&K?C^x8Xi_#eZE0zpRWxoTBTkIs?4P$ZD?co7rBw zlEf|Lm9TCHpT$3#WmD=ysR+>%p<}KZ?>Y>J5GB_wQiKQmvQk(Lu}TNtNctj?GA8uD zct)O`KxiAM`xl6)z|%T7py%!#X-M_4}A?Hu8L#%Z%mpJstY%@N3~2<#|Zd~kn_ z8lpnS8H)KdFhl81M=&@hieaxO-qVe%m&46*`o%N&OLkOQl=U@(xvYa3>CKlxB*?=s zy~;G!U7Vy5L^88;MI)0Kd8o{en&vcN&|*)FVl6lCXZ1Z)9+~JdmZq0Bc2-|36BQJxi+Amx}TSXz13YKDHJdf)!K?x4$XL%Nf` zz%0e8FFXzVNT;J%c|$lO{Y-pf-NYspLEdXYDKvXK>n{7P+P^jSj@2Dej=BjgdELK1 zWTjnSx^9r^FQ!X}$Bj+Q4K^2Z(8>PesFGyx4ebFHM{W$>virH!*Lb+zdIC-4&KqAO z6q#4La+4iVkiERfN!#mdx^J#`p1SCIJbNItno~pD>IZ_uE%V^)UM(Bv?V)Q*+-{d0J-#y04P?^T=jO2dD zkAec!ymqX4I_WSxVtJ2vMhYo-w%YiGbGfnp5?9wec{t~@d83+Hq0TMY$@_ggD{jIU zkW`YI9raUa1j+fMY#7whT8-NI)%nwjQ=f4+@@>BJkxY!Eh_p%%!-V^y3YkUvl!t_0 z^4USYWuBni;unTaRBq&eL}9_}G>`5J<3*DjXiz2gl_3ws4~Pde3GuP8nHdCOr!z8w zfP0Tg`EPemPDKEWB07jQ5)l;D_~xhQV8Ks8j}G{k>3I+YC=?4e#?0} zLzTRw_{^Xg7J%{-Klx>Cd#re0*k0r~@w&a@h}%~v^e)blN9M|3#{Yu#Dy(+Bq3pdsMO68WxRMu%%oD=q4mHwuEgRB zZ+Jvq!lL(HuFm?vdMf7!5^GAQu|kFCC5B3t)Zh~bX*661Ya6SGSirA@$5lL^Y+#KidKsd_pok&Ewv6X(fcDmhVq!_T(GOM@ogh2PRERBxLE5nvET)5$NlE`b z*uwMlozjxOJG!}poOZIB+P%N%)jAZCEPBwh6RaL<3(n@Vi)4!_ckCkJSG&o`Ib8#{ ze#m@8F~t5YzW*I~k+K_l3MC?ml8&^SC6XBAt9v-M+x3PpUzJzsF;7}Sjoel7f}G8X zlF-!lFTMy=!)|ABNNigNGFTh}lHn^4n%+?7DZ*Ne0e%gqHVQ_rok&!p^PSx0!{7fi9YlUP~o_R4m>bg;EEJSB0|bWLNe(X`Xkz@&8eWe$B3Hzeba>3C8oPCaa)V z@NRp-HMn~mnKc1$N3vKwiLSSNm06K-9>tg!*{l%;6fQZ-bPw~1E!h_dSE@;)ZO$)` z>t#Rj(y%+JAzzipeK>ZA98lvVxg@EyB+)-_;??VldIbW1zZMNfCIGGuk?shNAB@dT zy>>701(89JWl%|G2YT{K<3%dhyJ*if3~=bG$`$4}-AyF|1TQ>vV05 zjosbyR~nHZKAjoGO#1k=FgFu}Lz;(LzcoL(8D%CG)1{ zcCVyFf8C&oZH#JZ6u_0}Ipa0M%HR)#zi$p4KJAzRCEQ&+xOcolX$* zg1O{4fOUj5Y*qmSX`ggIDQvTrH5?<$NWB(Rb~H`!&b6vIA`RR~3y?h-EaYsQ zx1smi%V-_uc=5`{%$d_4zt(6Q#3E|L4>!dU)3W#2J?+a`qPI_6l6gI7TnJ4_oc^1( z;;q?pn~(Z}nZ&L#1TBlQ)+)g8)JL*GOsEwK-+mHR7&oIS>AN4ii{J^}j6C${LVwX~ zX2l5mM>F)NR;2p^Rjh@L#R8Yt4|`}`Oy{jJaHX#3_AeSS5JUSx&&}q0hP+>?7t}@K zza69`$3!SOItqT8_d*VI5S!z-!LQ6Gbcb1=!-#1h%X&948ObiNJuni-JBU4rRPBuk zfF+I@3Ao63yt2C38SIdEetBO6Io%qG;Yp_XbeqT4gO^25|45NU{T1Qj@>MqDz`WnNI~4yq~Q{#zqqwdtt;rE>rd#2Jw-rv>cwU z-SpL5WMPG4>w>4X+CJI7buICuhL8Bn!ac?%ig5`L!eby{cAvf7FCjmGiVoSU!h`o` zm6@JLUnlQcpQ#;&+@Xm<2^gOU5|ooAi7kcy;*LAL-cGNu^qP|kWc5GV5InDii6CzK zwWXFHpDrB?sDtY+u<5j9ctIoDH-`Ui!2Kg2_D)DL8gq_wVdm0f(D}}G0RXwebO?qU zIAY2r6{y~Q#j;qum{Y4K4BRC{1gb z&&4YPuu{{wJUbMbVh}ATnMzgz3}HIOm8^rVkX=K%E<3H$THA-st#90YHK;cvOqfq8 zhoP*&Bg5O(%T)nzzyknu!H@OD#j}v2O6@73x6fxqc7776u|adQurpqhG%zhT`7I#x zNyV%D>J{mY6#~4-@t~(z(1ibJ7Kd%SjSMw3&|vNmkvJJ*T-7>ZroKZUlQv?F-RK6h znfi%=`XuzuUfP*BF1hS27v$cN7zd-|fHDC9c6eFo{rsAiuby`*WR8Hx7x7NE+;boq z9%c+4CkzJMtysHCAq{f)o{q$I0YR99CEE#)>$uAm*$TF?s+mX7!GFDpC;O*CNByIQ?e93T2 zb82>H%H~jF`@ewq*szw5%2;x0gU>fi2jf9FCP_-oM_Z+A4H4E-PTRH7d<9U)qMvenzdNV~YK0NZ1rCy#0@pNF9OOs@A*fY4iy0X=@3f-W>Rw?~11 zxaaznx-dV)kM)AAky#;8DW_;v?_;l>0a;}R*uG|uM75mZtM44|W?QwB7R>MIPkFdiKlQ4c7G@+5 z)$4DXWPkW#t%vxrXZVg`(5tXm^4RAETY48ZpZ~K?Epx?aKcQ4NITk9uMQbbQBK%M@oiyzr^V zJgE@tUq5}d6$i$hDRwTlswc?b+ncJkLQmOl$9vM>YZUQEW)ui4jU71xRQ-P+SLXPd z=L$cz2LHguQ9qfhntzOXE|znj8W_4UT8_>UpKfrf<@%IxjeH)4A!~Z`>$K{lEGfr2 zbFI$xMwO@>FvL!34*lKo@q(vSfs}+~hRnn)fL&#kfrf!AU&yNiN;W(QS!hq~(}R;k z+7`RJO|V<&h@X>=KSAZg&1j+EDmFRVc0nEYX2G)Br8pXRuSH)xD! zTR@ZG2=pLQe!PQuC&t;6DP5;N4kg0izH*8vNA)$PjZCx0F^il9%vicyL5JyeQn7<) zN`BL~r5mo!zHNwiluDnB*r_#cW1dDis;0fyfD_)hqsAZEHz)Ql5D&#~5zDBD``t5h z$QF*laf(0%ftyUtSy@mifF8H?TCE^g=jdCY08??I6~$tkk#0ETx+y~Fx_$Mm;xVp# ztpt5jq#*o7RvVmF{PF!|LqkKY&4xj=RIiH%{96UPm=l?gNPI`*f}AC&80BOvx`}7I zpww*M_n~vJX5k0F^t;BYbh$$f{<5AWngh~;DFnek3yqNvu;mF7^s9!!>R>SAXIRNY zd0CQq8teXKdaYvozGF^Hl5o`MBpQ)eWd7lwne>>g8y@7Vq+VoeW?u|nT|7J->_=mQ zal1peRzTpEkuYwLoc1GtRR~rQ(>(5K9~-Zvgb}K|CQdZyxzVjw%rxC69?EoNJ==m! zE9~l73s&`RCl7S%JtqYBQzpokettgAP!hN;pxT8lH;_GN&umiB_>dK6XpknfypUvQ zde2KV`nsc~-=>RMYAf6NVkDmSPm6@u_A0prra)7i;;~hem8|eS>7TQD^I>#fgz&U{ z>g;WY2^ytP4*hmstnLWJl|SjkM+j~?WnS5+dhhm3aps~gl@nmS71eTQhI>RD`CWE&#u_8-;}qt= z>RXzzLc$`wBmAU3e$DxRRFw4o5ZqJJHLoT%u2dJV4Cf7i$N z7Fs4jEdTJ-YWT#@4-=AnXOh`v#3n~&+n7L8aqFA>`tyNx?u7dyf;oFCs}r0D_3M>X zxQwAF;4^XHuU~_CIv^EJ`Zk5Oxo9t~&53sDgoCrH%V%(XvIcqKwg-DO!$4bv_VUg0 zge{EX?fU4?&6Cq6G)MXDWB9sFE9q@PUAGZjobf^o2G-6)SCfIN<$>rdv6i-Czd($T zZ6`p8*tCzQrxLYY(`xm676XmGaYA0VgAg| zrknT@NDRdK$A&dA-6vdBcWD$q-wm`1WUP3EAc-^E0#jmMFQ@UrNYWYaHmU)GaF_Q$SJV+h84f>X>&k+TZyt=7#dWDx9DfrzSZ&kd|)uHZtNsB@KNR%Cz@6JhB=5(cxVP*f_`^al=ax(&$xv zR{}Z-tW;-9V>CQXn(BOre=O(8#41=98D5CK`x+{&U~!;fCAiloV3=M15P4s%lVCo^ z3BiZ4MXI1M4U;7o1#~{~h6svd^1OQ93kNzULFzxp%%*avuZ1ep z`sONOVXMI~oM(AKseTo7BpXZd)r;#Ze^KaT;*D;q9xlB1w~vV}$%B$Bn#W(KTc|y^ zx{~e7UP?nlB^;K@3Gbt(Vc&U1OSqe8O~Yg57Ie$^Trm(^AwMTlMBS2&%FynMAM5s# z&8XuUI{s*EIXU4Hg8auzN<}pBP;A-sFWa)56|56fBefC^$Im|*>~x}Tm^NCVJK8O$ zVJ}%%>vU?GhvH1N?LGO9{*GxY%IH$6m4DIp7y}sXuzGj|=O~VBHzuMLzq}-oA};=- zoG8O!#21@Lm7AI(teD#L_YS}T?#3h*;E@Jm-%3}$)~dQRi-c5{<7T9Rr;*5IPnJN3 z<009bf%lzW$e+Qm%jBNSTJ{n&T)Fhw8|!rzWuxT$iY>3G7FHYo+`!br<7)&%B(Fn9 z+aPKtLF>XN{oZ0l1cbFbUkqqmBH$_FGQKx%gS^yI;DDK>4$_o=vplui{ThqhY_BJH zXdmq@F2JSE(S+rfF3;cNIp}}aLLZHNSVil#WD&WL- z8L5hXp^Ubm`=SLqQyv0`i5bRB+ku;Oy@}{6PvKh>9HbGVpsmS*pU(os?F-`=AcaBGmz+iNVPs|B1iik3GG3R=22NwrL$ zj~o|^|7M0l3zSE>Xp*{Jqrs_Ce98<*6^m&l*#qcPLtz#)`Tri>8-`^-x0LL=g%hsb z!^o$BuzCtAv@?csU&!iosEE1fM+okQ+;%$-bojycp({s?Z`rvm=(lP8wak;*+J+7J zie`KpwB_9L%4pnGs&EhItpZBsU&IL4EZLtp<;8DE@!i_9!47KJr9VQw?vV(~0~F6e z3V0WR(?$=`VWX*}zEbGcEHc;W`^%3)0e~l(Yqgej8Ctp?zx$ozAE%lJe?G;L4p<0nko$&sze_fS)U8AIEoo z_vqF_`cqnSt2nGX%kz4*M^iA3!f#+T4qQ!3I*)fi@`3FHSF1WOrf$o)czOoeJk^45 z7sr|d4QBWvJ!sgJL_=WRBf6k3X^V@!Cc7}}qU*;Z*7pt~e3Mqx8IzA0rX~5rd{p4X zy1hAZF=Y^_!n22t*+we8hNRN_raB2fdTc7zUJIoRGX;t>2u-?sLNp<^@eA55$ysH~ z(@3xX5j=0P9U*}ELL+{f^T{ahaOpXCnCkfFyJXpNWqzE{!99GWKvk+p?1L`-4`zeL z=t3nhH)WnVI798UFndkG(sts)T~mUM?COhel`AY@LZ$r?*P@R#*9cV-AjHXa{G7Jy zOW{$Eda3^6ZlS^Oh@nfZweTY%OOjG?I27wtsyYSV|8%J}xho8`IORMI(s6J>Yw38s zOtMnpaO3i|ao7^Y*kNa_?=F9XNJ}aIf*)Y@yU*>P$xn!2NA~sb zwL^IsJvz;5%#)~&)74PnH#Y+@4>FgML9I@KYLv^uX}W#5|FGTKYe=&RrC4m zNrggBJsKPR{S}BE7wEO>*qiGTjp@%N>kqp90;_Mi{#~WkCyyLWD`qJ=xn>9axp*T? z7Vmc`o<)9b+VhyL^YT3nj=Kf^2NRK*2Sr%bcaVye4kW6}hB;70xGqjgsKxo|Y4yKr zRo30aJwTJ^Vw>}$ceMdJYgN_&h?di%9#t-_#V2CA)utaHcPqvIJp6DNHSf7GksJ(( z&Iet;L^gR%y+g$PZF|t+wdUpR2e^ZlY;YbncPacn*&$o|p$ezqK;PsUtZlezkw-eIqi%S5KtaNc1 z(%Tw*Mno){A{_HcQUNtt%{0Hz%G%hJ_)GmyAwtUBn-L-ZGsm>pQbUW+wpMZlMSvco z^BWXIWbdufvY>{Co@PqK^ZR1tT;JJ=xPrrggtx}g74ywz$D}ji1=xzD`4hYEzFvi< zVGkBh7jcwI+t%Mq#m%;G0Y9>0=I{p`{a&rEN9#Z{*ebszM0kd z-dPgip3UX*JdA)%qN8uYTBU>+uM?$AzfP#Bd9&H`Jv*$VEXLIXM-0?3T*0mvjXS)U+rtkJ$6feoMDfw{;|2iqTe2Ad^|6~DX z-7GV+NmqNI@7uRxmP0EKO*E(@j~#>nL)DX;#5 zdi&aCuwukm)Ds%*Sllh*tvbhDyEfS4_a$gFIDo)imbhhp7v;^#;G(_rAQ zH3kRAZNPcUYV;}Pz=j8qiP!97kHQHLn=JTVW2=7u)KKDsWF zLEBvp%Y;^95M30$eC-8%RyS0%RP&4Kf71ofpX>Y2g`b4@jTz=GPC}%hTb&S9b}k%t zIOS#-P{B}FMy$V)`Bq_v0~_X`f1Q(fcL>}CQCISgP|2O?EAK9W&4MTw*MhI{NHOuk zb?A7dzk89E(3wVNLaOVU0{zO2L`39vAfxLj=iyoCm`({J^`!*-XW?PKCQVtW7 zKs_}_bOJxWug*vTO`1W-88?Le4zTLgDqi;SFL^cgEv6)@9FcaRaZWg#~?{FzZb}n*bNiB6Zda=`kKL8mB|3r6P z5mZHbGTbnsfI*+B?q+AdBCSHp92TXX{F?&ZLIcdmgmDLgVw<;&Y(bi~p3p` zeoQ?KS6irnB*5*D>KFYy)sFX>1fSqtCO*+( zdZId}_9tpwCQ@GX9%odeiS5EoI%CMYs&+LbHbqa8Rudpj>baO(YxM}oI5++3RPfind0`_5a<*TUEmjBVe;G;U@xaoD^ z6Ri_MnrzSuv%~I{o@{+r3zX0@sDzb?ojp41{hMFj3hqDEySYs#Z`^e`=2w$$InYTvb90iUyH1wpPnmlFin?X_Q(&Ktjp zV8q9_hy-FCmjZ3Op@DS*;g(@iiulVY^NG*R>&+?<5>A`ce^plh>tsO94JSpUy>Xo$ zDGWe1=2;36NbkIJ@UuP>V?2w}z)Y%c&)l54NxT;dmw#_y(55Kpn$8bjB|N&0Wu_vT z0r!V+8K2)hT)MMNx7wfMpM^EI&tr;kye!8oyZjwlGxFSZduh?7 z{D()TYDd!}SDabGEG4$s6eeGr*(4;gYdoslJN;#!Y5tAe$61cpspDsKHw%e)Y|HqK zmifa%`yOLmhq5;DEWTiSkXfA5+7{z})2%zOO6(>JHEPfVBDDI4m?_--Mq?(UEwBQp zSoG6Qlw2$Rw342uhdPDXmtMh_Xq7Bt&pRPondPmwk%m*pr0lxuf^U5b>5Ax~^J(?5 zAwSJ7IR=1}Cno21>?XEQzL+SNBnQDE#A@Oa#JvHl-=slYbW)WMYV}vG6)gC}`cM>h zM`xOyt^bUr!LJ??s*6GNAy7eW*I!g6*JR3sX`7?)^Q;?a^>~o!$cysto2|l9bs{Q- z*#hyVJuTMopom|wIWr?_b}bN)rNG0myapQ=g-cjh*YxH?J$rKSaJN0iIc`QA2pT{L z_f`#&K9;--y98k2D`$Ac20CjF9Rto$45ntm=;jp<8*Xr#nQJOGTm+pD;VvLM6=BX5 zjXXiNsv4fy?`EqC^(`4FqorE|;%)RPHDZx|r_*_u*JXGwr9V%Qc^FOx!RQ=jJCUFa};{mKOXX{s@|ABre^=GLK&Dkz`l9WYU)w$`Gg6%?(WM{WUtA$&~5 z;9HCV*i2~f3se~G`gsGI?qKlmn3O7q-w(eF=B10hCp0aID`%%4u%O%5Ok*E{5K97P-E2c-4bA+P0z_DPEG2{LtcZLCjPc8^Ft0i3 z5HM4w#9bKev%-JS54lS78gL#|wR`hSNE%l?!C6FS{{(#aTt#|+RDqO`njzwLVf6@%|E zh$|wptmX`T)#;z)8InEXq0#PsUK*ikc7~6Qd#og;5cAWK7=n!Dv+&ev^?Ta&-1o_F z<#7+)RS#fW6F;hf7qm#?lj}xkw9EII%SSjto^A zOA`Uw=2vQ1;_n_9aT#RjO@)CG`+7A0hrr*$7N==ci4IP%Bmu2h600UgfAcSV=Oa|F zhwFzT%ZN$bc3c&QLCho2FdqMH>0q0LJ@2i)9c0;nRqK0P+2kKb+0(Pan`_jhAkus+ zM+h}wstp4ZoR0KXbA-U2RK5>`qHzV+K<%0jD5z^StcAwpCfBOztDf}nxi>u^I{9Vk zt@lyMev#*-UO3VF$4c3KXJ!sNyG?F|Nn8hK5$Nor1Eq4D4YXV>CCx{@dT%KDk8fJ7 zRhw?c=P_d1*3@ zfy8nfv)cO>@WsaEm*2Zl6Q`w}KrwGaL|2(k^NYV1VSH;8rR+W8{gZFOGW2Hj>?mO3 z&Rs(NV}(E^*jZm@c;Yn@pi}uDhhU8#_c*3<_I4f^6r|lpl+GKYs9wPVkTT=8ax)*KsOOYLRq4eBu*TJt~FGz3JI|!T) za2q82yDnqF>AU(guHo8xp!(UpSk+BMVb(ncRIG6zCYRdlU!Q#s+|4=j5>ebJ%h(?@ zOUyLX*;k<+jdgS`jhmV)VH`5M@&i(_p-&X2D~cCuVq5jGuzy6%KmUAvt~7kVpHQ=M z$f@-zzZm9>eq=Gg%MSy7XIyYZumHSAj$txIS@nbM(KAv$qqlPl(b#A1U%GH(CKU~= zhCC#iJ?6C-GZH`e}H^ycK~Z!ghwXMklM2cUqP2g-+V=veBCi39l1H0kHDXHeDFh; zV7izi#66GiPtUUMoROIC64Kk;d|xvFIWDJsgN;4sr7Y3T)rg*EJNy!8iQMW)C?J*GLv48)E5CWb0qn) zgy23I@;H)(>{we5r2UmbqZM9t_J$s>y(}eS^d>wN#~7j{fwuZ?M!y&9=|CU#j(=@! z;z(6Sdskmtf+Esp`!D!N(nQ?;Y^;pEX3Y5TPp(~vzx!Fcl-l~*GCuD=#s^7+!uPLKO($1x`sAXiGA%s!j6 z_frNKp=(=j)269fxJlteh_K1yiFYK~8>n&7pg1jxQBY66*dpe5qfcD>1e(iUF)!DM z3c6|8kG;_fHdhsaoz`%WHTw2`jO%BLA%1v_U zXjrPDa{QHSqIG~lZKE2hjW!MQy*(UH>VX>^rZ`P;be4MIbiwqd;0D6XvbpWRv2IkM zP4shR7eF-Qw z^}8)IJCd5GhBs>Qj$o1R5H%+b4Y`}zlL2nsyMj$i9P2qd`BepS&J_|N=)kjPUeOGseZH2M>#6>mzQLAr>{%M^u(roBIoQgSg4`}X() zI#4qBF0xBeJ@)t%g{}RkIMZ|$edw)0V$Nooh`HkGaGecbtO2JL&{=TV%!D_ge8A5h zn%tSHIwaFC75)2GfhgJH!zY!dZgwi~INr)U&!)xDN{`J{z88+Q>bJow@=La*kdA7i zN4XxTVO#=GK;$;cV%89$XKtgR%rU`I*$2sTrCR?jY1gP)LZ^m-5t_(X*hc;$Cs4+M zXmzVr37wbQX^4H!uA`YqXhpZsU1{x*`xn!#o=)?j;u~8;5*oN@j?Sj~DNlf>NFAqj zikyL+uHlhRp7yHTDucGW&>n*e-pr(~{kxDi@}qu+_pbb%bzj%n0GV@n~m)beMEUT+8k}6re7+T6upXT(5j6i1qhB#_e(vxlCe@YV=|2t#5|aVfJ`epQH_ zDcY@?C|%;guQS!RE#1BkUrh5MgfJgSW<;4euCItNVsH?S%QCsyl1-2qSkI-t4}2EPQ!OsJ%#`2sR@|YkYk_z&yr@_%x6zpm+7h<@yfrdE_Wko=h^v|!feC7 zm6gOcD!{Xch#;DxX!wUcSzA%G~g{Z&#Lctpn|6wUqdGsga*VKw*0G2BYt4mavX z1ieCfWqVd`_H2$8rv0(ZU>oMM*4U+O?U^0eO$cSW!x;#wu^363QqS+<{SgT8h$s}n zF5%NK5B8{O6wl2OaVuENcWD2T_*MI=8G2<*d?Vu?aHCAD*)^`G?(eQpS$zQmPvvyV zUPT=HoMIg$ZigY4v>+6Rl())zm_F7^8km25bOBnvTL?BE2DFCu;GSjlgrBcSN}+8? zXE<3*j3Ni-jL7A`(P%RAq>u!%1CcHQv^djR)G-9-K@b_~WGK!3>a?2pC?o@}SfWQfOic@n$AJtQq-A*K8| z=6MM}qiCs1R=6NbuXxW!0p3zQjP=AdkR(8zH#aSF0SU*TjQ;)SCbOnhdt>@LODhF2 zKuF~fuK_OF!4&bsqPlt}<@(-DOp-xcBq^oeYU%V&G$uz3;>2%l2AGiICRHV?iT@SZ zw!@t~(`-r_R;pGPOI!j`3V22SyzCRT%)5+=R zebf%7&V>u^^=LF@aEi@NGXLUeDqqTGCWTe&kcLM0Wcc9_;HIv1LhLpF_*cAHq4Xik zj`TvPZ|}fh-};|_bYK!I7Jr(T+TfTlnm4I-%9*o80=r~T!d+{|e%a3_xqfjI55TZ* zM(sg=(mu>6eC@U^5m9b4H>mI}=32|4S#%@9D{un&%p+Qm_Vf7Bsg-_v7@f>&Jg#1* zdDU^hMSRA&SrpmokJpy~Oca?^Nb=d_(22WonEH2)g(4Fq(3PvSvE`cBI z_!`wId9Jp~<+N#(~5_MbJ5EM=-6Lq|#SXQEl1YpX(nR5avDdX-|#c%h~_A0Zzy zT>e8&sLq7|s#fdX8uan%k&h0 zTt{H1@9PA>^J<7as%Ctq-#Sm_GY$L%iyKbKVHcpg2hD>`-yW_FF~GKOr5`zB1!g}H zXE!*bb-e4@_(4eL9@I$^&ZGSO!VhZcZ^I_!)^-@G_0_W$*ON0{e0TJ zirU2-t_w|5&Tbpb9GeA~q=_DHX-+lztKDU=x=S8V^!1LFyAy7+$@U0tQ*!(3pTI*> zxF@KQ#1m%TB@84KZO!8Z^nM84+psB|I?a!$5MFdm-DT(=bPqC-2l5vYab114d{PXK z^t&Ee+{=Oi@<>AzImD4;=zik&<_jmBO)hH=W{mYC$4 z6=Qkz)hN;bo%tsq4G8^$!XCcWax9xp{iuqz)KjnHA`UC4EGK6MyXJgAu%`iicm}_n zXT!t2T2?oeQV>bC5;m^+t6tNl0E|6~4S~J%2LVMaYCxD$CVQd}Fp4ScOb)I{@e1DF zD6ge&4uMjw=QQ5Y?xkybRnK!+=0YSc=BV^#%E69|WtE7?MVVPX^FQJ|z2`e`cy!Yq z>p?~iU;={5;RYXth!+WCfrbDeMcY6iK~Lb( z)7%Z=lVAmV#@b=dG>HBf+g-moJ}6<(yzg&0{ngW{f6YL}Pp`Q|F)>MZP010V5J0HL z95tUymYdpgaXs37yNmtS_(FL5JJzW62tPmQ5h#zJ#9hhE?e`B!-gb&fkNXh%7piX| z6px1lSI3PDWs;et(BI9w(bD&*XLM)=nb%Ufl@X(gI(;P*NNO^Aa87pzH+T37*daCy~gRLPm zf(F>)UHl2LQ675^{a_#qBD(Qq7Y%=XSCta9={v*yL3&Cr zF(`oOAm#N(z|(z(%Z8hQ9p<{<6Jm|_5^fcFLRxBv(m^@*GxrP@^qa>5@=<-Y;EYhp zispXpKdD@VUf0)<`IdO0FJy6$smv1TEhlVRxJ71$8n%vc>o>Thqv;)Za*2K2tIwCC0qWfE}!(zW=RjBt91Vv z7LAkGz9EdnkEZ+es1Nyj(sB>*norClC+M_g597-9?b6u(nq9_bNYo93{;Ld^*so8+ z_uAqaF+&{|`3!qOjo;tW(r@?HbK4zU^&mjy@^ATXk-E?_TH`w$yCp88JA%)M#E*G* z37hwk06an^bQo~qa}d~(*dqzUonO1;l56cy?*;=eLQZM<_e+z*e&N-eXa7C)`CEr{ zw9;yXCrrP2MjBb2BG@g}4Q>i3`?y<`LO-x|D*H_OIB`URq;BDlYdS^#PZj{JI6mKx_t4&warL$LjTk$gf3)s*ntX!Z^W|Ma7A<90hY0&5AR$&vv0+(E9~e1GbLNcI zS0NhZRE!V*3I9;CtF4|0-6(PJA#Njws~JJvxJ{|Q({tMe4F0q!A;RJ&IA^)4Eze6B zK+AvY*3_QnG<-NS>q?C?n{^+ik38#xbN=gIGAPB6-07nyVVtQc*zbbbCOAXAPGB1P zwnmy}g7?y+h>VP7RdONFT%_9DJh<;K^!mlQADPtCYXicy1r)NkBOQia<)F_0YE3L( zw#EOBNqJb~M3WzRi|p1MrDrLoRtP6z6g$!W>90BC`&Ws%6erts5d*|V7+@f78jmU`L39U|S`ATe||h;(npD%ua?^H5G54ptq0dlkuQe0 zXAR2uzT{BEg?D#R`o;prh83}qqw0reVZIB57dsacK%XtS-$IuS+qy2a7P}}DDigA+ zi$DhEO1n%G-^4W%7vB}Oe6A=gKh3&hw{mt_OXw?H;);~^5dF!9Cw?kjfUIB{8E5G& zxWx#rD(ymOdRcWGdf5Mt<4X^{DCcVBXl;AXW>Aq>qA|xqbmuvn1+p8EtUAZ)h->8I z+8&EXZjpB_t#9PhPce2PAi=WBPSe~rFbUm{)*QJE`?YXN_2$}m{r6=?Rms|~k#4?A zdN!sZV7+=^-&z6x_Jjf(@uZpMk&)pLuWn}BNzea52-qXK4d!y*4s2A4s?Z;~xo!BD zkB+Rb3SpL^KlmN`yuqDg!0pq|cPa1LR79_dYZ9A zVxz&$f9K9#Da^jSWp*V8t{9%kmzh=pYK@C!^H~fu2BPl%Ilk4|VI*egd3N3{0p}(= zI12C|%Sm?dwwC9*Jc#Q)hoD?*XO(mWb;z=|r>bgD_a}J{T#bTq)0*lI^#nA}Tyt;H zT)B5Xi||*7OMLA(*+)Zi4~X%@asY}L#Wcx5o0Su z5LW5LK~KTArcAB)U17bU5^LsUqWepGO>ZvI1lEM6pT1_VDYZf0B zqzcCVS9haqUMba}^-#wtk>Vk>@1e>{UYDa@du}Ad{rWvAboatbt#y7-4++fOv%J+8 z=2R!2tvWY7Sn8wB%cB&{(RujZ+xE>UJ(*}h*l}4$Y@^r$vS(YzhKHGj8A(iH-2WC*o|c#3q843Fai%mVbl z$!S)>@VdES)JLt;h6B>GhLVp-o11Ao-Jn88LiXr`@wZLRq!UYq=z`Y3IV{ZSpk|#j zN9+4}R{``s9JLyl><{w1hpau~NKpu~^wyj>()sq?AFzg=pqcq%M zj{yFg0J&cageu8OqA#h#!PRtek_`-yBwBUF^zF@dA1J`OGq4(^8GG_q(rlt~q*!L2 ztr@s{_3(QDC03TR95f(3E&b0V4iFkq3Zs3n=$cov`L5S(JoV|Po`rx~^6ZFsP-J2= zHTtQ$?L?+ig@^l3zjD!NJaC9Mc2HLipnhD&Gng`!J5v9FgAnM|NicoTc?w1YvqV)Uk>s+qB zfR+7pj`KW^zQKolN1}xz@WR%M_Mb3j`xT=zHRY!+hW1pDTYp5XhYsa-BG^>PKNs}D zX;9F!DApArY{cx$l}X4(1czEGWllS9m_eumc~qiJk!9Yb^`j2Ec9IHDBLi8*1AR%; z2)h(xBynT%0MAZ9XH|Who@~_JKMp=P>+NZ+i&`ScA?o;3NNz7LU{>l`AHkL)IOCmi z`X&R&TlGZ-DMez0V1v6H)xW3hsbm^J44@( zMbk7=U-hiYrO-6_E^Vy;YcO0YZ^s%P=-?1|fP{h7c7|~f?m2>8y|b@hk#a*|StaRG zi+>)}KF?g6vm>}P#b)KwY>(Ti0V^fA_dEVRj4SF6>erC;V6rU*h4mUuI`c+ooxG8K zTx*OWUu!8nCRC=eZkyJ!og(-#Lq_-aFb*_oS3~vI=6=hn*pN`usf3S`i!LlMzW-A~ zb$WdjrrnN*@^efw&kJRKw|gE#_}FrRy(T2K5h}Pqzg5^-JcFMo6;^hbLLWVH#|byi z*bQ8F+7ue@h(cbus=(l?x3#wicJ<$xWLoJzHsoGnmFMq%XxEFr^6q_%4h#-q73DKP zm08KwkU>A59C0yHqBHhwThI!qCx2Gpj|GqJYsq#mjd@x=r5C?;A0yp_~uJp?2mEBj9A2QSFUIN^a zLU(bg9$t^pYR?H-hi<7QHxr37hOGTHnY+$^gqh55*4OpOmOTyR$jEG&r?P}bZzADz zpKDr^IGrE>bhfKXUt25|!AuvViA$v7EP3O0&E+VF?|;sp z#G%R|X{G@P^WLy6emecpq`SiL<=M{(6BHfp_==9Wn%bWeVJaWC0kJW;f@OF{vizV!v}D!-Iny~--{WLR0(0`UQ2hBKOn zU=S454B>0~>E$0S*ETe=gNV4Nj56Pi7b$ea`IkTTMA7nwj-uq%qEG5Ni8)d{SaQ4p z)HW4Crjs(&Zh08 z%D$OzMoFq?bu9MuwsHEq!E7w!;~^1Aq->uZg4%vz2i^WK#I$Zurz&UaWsJ}2CD^+g zVt{wfNzq z_=0fk#96Jc+49v=E-#u~C1s6EmN|i z-F@c$zcYvgdPBm^3OZW%hKB?%kF}?Aeyf6G!lhfp-DyP-p43T; zk8m%&t^kGP;eL~LhVy1`%3_QJ8nW{;{(c$Hevotp&S>W_Hy0dEEVHoa({b=h92Dy5 zItj03RY#@dLj&Mj;T##eBboH1y4B%Ru=(Gfu&|N=%pvW_qH_Y;=ja`2%`SO+U)A}v z+lR^>;R#I`8xx?u8a)YvU<}b>82}heSZcM1TtG(jXN#8_m5!u#4+zRG9JD2_7H|em zhgxqH{9_|cDx9G>x8cS~W3WzaKi+KK)-Mr2T*R{^+!;qsxetA2Hcm1Fw_$z?di+!L zge=nRgwRGC!+6f}47~GPBT;sAR?xTjb;TWG|BXsrk57C&l*pngR2lFNtKX`!hb$m2aUc zK9G#@%ZTi=7(()Z$wNnLY&w*!Z-11c_M7$+fV@OA5pNSe^Eq|J2+i8ms7%;$(qq@I=abFZsxW5|q%UK*#t zF`X?`23%Ug*Bg*eb<_Dj{(vthCfmOix@xOc<5znZs}cXnWT(?e>PC`>BtdTN=4awQ zETnM0&vudP+ht#=`9X!w|9o<&>$wanX_5X|uR-40Ne6m$b0i(xRn;L#YUPr8xh=f= zKrjQy;kh6P&6_X>Omf)Mn3>LEZc?_!T@D}8G!}ks5YaVg=!yy59LbC`?i3)e%)T}R z6Qrj5O>+;78>Ym_f1hOg#W13A8#6e2w50;?V?LOFK@Ba@IhnO?3HvBg370>!fnobt zZu^RsQlf(x9w@SC2pBMCK}9>HtHox<2yF;Wf;baF8=bro*Gm zU!j4U2{B4Q8+c@eop!WxLwFrj{2cs~FLJV>H_bb6dUyZ3-bTHKjNf3%KNFq2kbiZ6 z^;H^i?*x)fIe~6_{DdPlmOMMQ!u0(`5^rSMoXc3(k-=r&T$Y-+~DnW#oB(7y7s8nUInu z@I0$H*h{p38xUWLlsbm>k7O57B}=jDSo0jIyH2>~1E(!pygAsWR+1-|Rn{5zpTr@Y zW+i|ls{&!DvWt3Ry-`f6g@1#YAqL6QraToUtNv3bY~1j{T;N9C1o(+T5dC*MyW|4% zN+h;MFG_0OHU!WO`)dtsg6UJHe-eHrpMomaT^Ec>6M2ZRDhg@o#UECLD z4AHpXFh*t?jf{##-trC*L62Q8dv9u!b1yZ${nJwQbjthP3v7YYJ39Wc&)?IoN=vJ0 z=&)}QX4MBq#ZX>#rD-)bQ@h<56ut*920dwT-p;PdL0TKdXd(@HkmmnX&h#DdA?8+$ zi<0gQE)Bw7TjdJ38HOxvi0OIjYCFvA6zSgi~CjQ7nMTPZ3XoeFfUU85>a z2uQ!UV4MnPaB}c|q-8iVzcWgr8jySMD(*DF-8b*jvb^Vx>z?fYW2v!_Ik>bHU~3LqU4VWQjU8W zDy)4~@Gi#m!Q~~nD+XX47Q&RG$=JbNfcN;1BX$#5DRb(bRzO|m$RzS~`|<5!b5q%) z^glMsuUzE_g)?IPbfmPEMwG);Slg8n6*zscLuecbiRZgW1lQ1+T#v%?rcNyoA)5>+Ep^yVP9z;RF$qZ9XKT~rzG)ukvvepeH7aQu-|8tqvCH%X89I4ewb2R2 z`tK=DLG@p1seLj7km_+n%d)saxhz-k507Ct2j?p)(fEwYd(ED1RMHT(8mI^*y^$Yq zP^`0R-6mRm4jg&ce?TQW1S*H52GN(lV?v0`Jc_OQ-&j~mJ4c0ZgFvNPX#zU}yl>-7 zbvGec31(8Zm4i*);-W2959+Sl1fDte{BSok2>In}dY^cVb+FG%7BlQl6(~9*2@T+7 zGvqHMul&G`x*M1mVFNScO!uj%o4`lY!mtODj4R*^ZHLU z;lBMV&ti{8XD`#E{?WV2&5G*m8A(ya7wnjpuMNqN!TTk{P50OR{WE3vvj_}cyNUPiYoJ@&8T^Xl%I7@ywJwt?3_-~S^c35)^K=6RLh zF3maBg;pd!Vk#)}6fU>p7{q6P+Bpx#tIy}Q=mSlDTOaFle$m>sq9@aSAUe*HQ;r5t zO|6#&X?Ds_O6-^&T5mFoel3fGH1I+o#(wIjVL0YbgZ5EQoiNJ`FE{Le$h?}S5Zd^z z2@`x!gDUpp{H?rI!QI`pLIpBo>RnGO?kNAr7du!?dQ$L^Y<%eaIFBzQdjzK@eEL`n zW^8#xIR#%7%7*acqsifz!YjgWKSYS^#^Aqp&M@7M*A6Q9t zgLeBqdtty2_W?6Th#heKA+1=_ft-6?8vmGxZ)ku}4%%FD2i# zQXt{}(BawkbQqN;@;+M$d=Y{g3Lj{M^kE^VXOs^9G)AygVfz|tIPRXEIE~+CLf9sVoP+TYqzncP>BgW^-Zk5g4X;CDT?DoOzyi)_B zgOx)rlwbsBNc~7vWxg5a@^#K^8&mPxEN5b*4g`e3p0QOW0Lhi-A-D0X!-Kr{MrEMcf?p?TY2He*V@Y{VW+kG!$$=kLxv(5RV!XWa{u@HY=n((*8HW z`d+45>aNFwI(DF7Y^`23(}|RVXlikCog{$eSP_GFD3TqxH?y#PO=vgHQEg+ox|g~o zgBW#aIvJbZCHb%n-}W@NTa|g#Xk?2S+PKsl$=N8rbngX?Rx8GC3Li+dd>eew#dQ<( z7C9uss4RR{0oyBMG}I9YV^=D)a4oh*N}+hlX?vrd0Z>4CgQ)dE>P2~Mk^68(R;IxGl98Nff0`bhv}&&{^O+r+17#8zQ?G z{jhv})ochUUWKiI!HGGBuVWo_Ps#gIdN0#s>{nhJn>~WO;sx=%%&o zPt=k9Obj{6`N%GG@lp-J9?R0i21g`g9{bK(i{WYEBybROlMqKYh7aZy3KoXgo~jmnNCUDOc~Pt>B5!z z80>!Z{=$Ah2A#10-Xv99rNO0h$X)x3yY8m6oU85nAo6WIM&VsLld~PIhA-H5L23Zi zW(2^c*9m+mH60nyVESI9;<|ZgGCXkhZ*r9c^GNu&23L8k8&OoIo_6?HnH57g-9($A z8p_O7!xZy`^DeA@N(4j}&s%B~3v5ac1sp&%Xd^k3+jcx=jo||up5{P%miNb`Ba;Rl zF)<=+^^GSLe)ucQF_Mg*)^$+B=8~6_-EQ@keeokeDX~OW`fey$u|PV6t!eNJqAJV< z!t@8B$Jec?(y*r!Q zy<8Om?CAkMi>JBJP!5gr4iP8EVgypXb_Z6qA~!y4RVdby@=ellRmv`f+W6ns{3qJ< zS&QwCoR7kn`a3b03gW_=Z2tcK;UY&Ut(>|!JznCXtFSgW)R!$5T1^*E&_-F&53wBk zQ0XGl{0pm1zgB~%zCte4`RqXD^iHY7F^v8o@h-@^s{?@r6r0b(qHonvR z1XBMU^(Xp$R*eKYg_Q$1o%oa@J|hD3q?;x+K`s_=u^GeR_bIY6Xv-8l`7%Luu*`=e zid-r9w|J?ck6M5$09Lt^A{`%1#(W*PBI@Xc2~}6#cw6Vdge7qPobwjyC6Do zmhBn)kxlgzzNkP^C=4KA05`kt}nm6WV!@Di&_sims`BuUhV3VXHuWi{PDsYV`x?dtU7p=XXx_3{z)4iOd zs9vzC)iy@L{wFodpLoi?7y0qW^WA1#iyaEH1E^>eTZ9SY`d^T{MF?55Pty<|RMUV0 z6N?h3E<(>zC0eDvr2pUxw>Wclr4)$io7{LotfnCl2dp;Nz&|LP7}UKj#hckGLUSZ~ znNMW!-Z2`oa?58_$bPCal20S(YQ20US>N_SHZ)#}%`F{ev+WgahlGgMLJAI@Y$S&p zS2BPnalRu75nIzG{8g4V!>Af7mtub|C6XhOjqa$INHlkndCN$HbM7Y%=gVTl-xq!8 zFPXp(|Ah0?A;c$Tij#xx_-0|cx4<*GQD5cD9*s6&HU?8qH;~ekl;I>lx2bP50Bfmu zhpON~QL?F~8{|IiTq8BzrzyF~)LSQlR36efbSyN0gwk}{ZZfdK$m2<2DiRaIK++d{ zafgr}+B+0Y$(GSk>JoXiP9t@6%5SCK1iNhi`|;tQ>9H6w%A%$j93+32(o$8>L9`1n zHymQSiuGW8{vImYAw7_00%l<$y~yan7&(l{4avlsBbYoxXv(oecAT(;I|J|tiC-?= zephN0ZJzdnlh{$wtM3Z=awbOnj+g5u8@SyPeloRLOh}^I2B{fc4WqSsXY z`UNxR7>MN+^ZDni?!Q|x2C>$zujNZWaV9t0RQ+vfKL5I{3rDObL&ZLRnT~>Vv)|(- zbTedVFCyGkIxErJCc)#EGm7W86lc{ppc0AG^>%b>_8T`g#M>;_aP<-Hwm|jCdQ|(7 zb0D>MQOxrQ`7((~)d+~>J^PspEnQrx~G)|(K?R6X@$)jGIZ(Eo5!qH z_wktBBkbdsFqa*u0!39qD_KgK?h^^*{T3@Bfr=)Aa(Lu1Jjt!cIxsLOHvi5Dn7->K zRLS1y&Y4TFs6-JT@?bmXWay=F^kJGio49UBhzZ{1a0qy(XTdU|iF#`sFS)tMuT*sw z4jMuSqycW#*RhOagB$|+*ltW-r0-|cUvgu%7i)o=w=WLu0BAV@zjuLAm+D{ilvNp2 zX;8PyOutTRW2FxWXjI%}{frd?4nMC}5GVfP&mT!;(#}rTuOLzMVzadV2)fljk-xxF z_al;W#uJfWls2ZM5OXhh*gl=fw{x$PQ@jlE$wj%1808-b*`j4~x*(mT8+wa^-_jg{18qNGTnx_-EVKM=jTWnGvxi>K-F=LCQ-0I;`2EHT4O_o+&=%gx{E>;&S zAw5D;5m5J<+ByrPlo(;g?Z-dLSw(XV?iK>qx|+Ay>BsaWP0YQ_OEu}wPl^@@GjQ^_ z)w9+xS_oeUbIy$liS}{a5GpOv{3bqirr66FA>r-IyAb?`_Q+UJ64>uLD4aL_psID^ zraE|EI4teJ-fcw}bY9dOX?~8qz&l)i%a4_XnH1`faV@L_bBCLhOt$8vt7Q~YEHu=G+hL)a$U?v36U zPI1Hux;sg?!hw#0C&>xK#PKC8o`TWRmE4>zjnzTp+6(%j`7X}_p{fXJ7`}2RKI{5} zvIX2CJNn}0Q*S6%LUa2)KUimSI->Wk1Yt!;jC>PZv{Ay^!hGC1kH zJMNVA4&GYqp!XOkNp^Ni|0aqMnCUH>Q)MQXF2Ly-!!((9)qPl^aCwm2l15cUF^+W{ zo_?X;vayH-NumI0?ZrDz3=kp1jX!(G;S^Aqe8k98e05s#`}pJiojZj@6k6NX_*NgS z`%g#&PF+N<2gD5B%#@`rUt${0Qa4jf8mh~Q1hwWprcP_<_^}6drMaCuC01!?J{44- znLwnTKlosgQTx2JF40Wl_Z1J+{drk?iBCczu-@Cls4I;cR20fpt^2*#R@<=9gh)p- z=EA#oj=7irZ%vaNt^LaCAPO^NkOsL`|}a^Vh#mya+f$ z$u@$i9+M!wt+?#>Mpu?eAB3uzBPYxvuP!Qv_ohBZ52iyHK>ps}-}GAk=RJt!&k-Th zoeCgU6)OFcP7=>btV)yK5W9)VMY(NI79*=#Inei{rFVfJGVrrAF;75K8G;- z;GtP%^IptGzF^=E^KQla19S%93hIJA5N@hIm|*!y(wnux%v!!YCpV&Z)ugq>X62mY z3IQlENx(DM?<$*@*7*I&&OvY4?sS>o;?ly?ja3X6dz~nA1lRSlhfGrgRCYq#)f}yb*^TF(yLexNthVQyhn&c zXVn_-{iK;mMX>6*5@T)XHSx215^q6RNdnlC; za(9C*YJqJoE+ILCCbx`wNhN}!Qh#0;jHB@oSETO+#3Y8kXH%<@6PPB;jYu)?56Nmb zsmU+}t;ld%N0L6O7t^%Lg~9a3Q_xFV0E%)O)%fj}COe8+BpyPwonvZ+odn&ML@3s( z;JrR`Ae_IrapvfOM;4d^!t*Z-?`vP)LoQ$-u@zCjrGwjoiv-bNs2O5^byM#Pq1>Q7)3(?1e8} z7ESif@Kx+7ZFOzMprxTe)f=LJ8 zBq6*$u--#ZbSI+tTXGod>~XoI=6#+Up;71uyJ}&xZUfEO^2qI?bR&Mx-cy4hB`K7; z*3ef1#V6?(XjH+Bh`u^PQ=4H*+x;b1``; zm8zstPm)UZURir3TwYcT0Tu@q001CJhzlzM03gfX85|n&yC&%p!{@tzG>{S#27LYZ z<#v@MeAmF(iK{yT0B~skWe`AmCiZtFl#_&v2-GPU95Mnr2II)~cNMCW2+&E$*4oN;dcUMj zyT0yPPETPP!PE6-EAQU_y7qkmO-%lu^n|SG06qUd2^F~Te_PJ~zi#;74*&n?`Tsb| z{|~0YOYE5u#vJrQBOr-$J*3DKkBf_UrKb*hI7q?5n; z;(@KCm+ynLaNhhW52!ggz~tzMtNDv-$rQ?x&7+s+nSYV%`0lR0<1t2chex;&&VRXf z&La1NWzxT#RhF*S;N2Gww7<;M4Fsqnw#2jT@&OMz?WxWTnb!NJdYO?TcoX@zUV{OX z>+f7oRDZd0IamXv@=sd!euJ%^mwkKK$cjQ2*{~>k#M(SRsV{_tx)hJ-e(1&7*bu;| z{S7SyzabUfvo{+ zJ@RWz&czkJy)jF;U3j7M*j2^?M7LEtAIRLm%NIrz4D4KNJIc-(j{Q+(TBzs_7o7@B zm#cx|SyARwyu2q+wv)KSQU0&Vp<5>OT$SvqiPoyw-&UcD-aRdzzet5HXYM~1`Tj)> z(DKsxKTfHSUSQ}vWV6=SBG-YXvkrt%%d5zMs6;C?^ozb*uJBJAo`DuNSNx;_oYnH% z-la>o>Ev6PR%9z4$Jm!7 zRw#ZVkkAWVf3$#0gq(*g%wA#eFYg~>lk=UG|4`!KH{%hTtf~QKTd*gQ$w}=DNjkjWt-^-lX-4A5$dgqc)3CHDeFF*C6tYw(fd{$ z6^)fdV?f-+s=?_$__Nap$yWcjj$Jm`QeYeaVN_yF_9v}qVQr81ULtdlXEHGANFH_} zJPLdoSieWq+cv}5S%;5!lLqUA$O$M%$7 z9F|Zh*L9OePi8)zB9nd*F{(~%diGhdscrnci630-SCAz)MO~e6l*a(EhGpIS`716Ax3!}q`p3)1n&D=| zYM^X`lVY+u%JS*E62MY8K8L|KduGg|RbsK1PjaT#su71J(xst!hJ;d{vrd1K6BCKJC*xA^9!u;ES}-r_;a!Fr&KRi8#7j7;qwO&>GYx%6 zGR;CLN39Il3LueQie8*7mn{c%gyW?Y@iN4(BnNHu7Noa!U9$y;dc;s#~sN@7)o@m$E9Mr zoCI#cU1t+1gPCXsQ8>>8ksEWb2}<1COh+7rpO9L&F&Ql}qF6CfU9(j1rDy{Jk!$J(&j#eRcJc;6uj>F%FQ96z(!~$jn0C`3;c~x)MPN#+~mExmh6QwYd)Q- zY8grLj*;%Ms?6R)8km+G^(aGHnsQuI7tGjzv1!&tQAV)6AQ-AgfSG%+J)Ral|iw&9RF zdCRbVkT8SDR?Nj{V*RPP($H9O9(P0#Cd!{4JN?f&vUMT8&L`e#aWyu9`@q9@c_JUa zK`o-Gy&f~EomS}T9|~mvUu+Sn0@B;1a7XKouF(;1UW0yBjG9%-N?^;ar&-q1oQ) z`ToT{2ANjzGr`cPDoyjicx#*;&q#KC!No-xq`S1Tq)jA;xe$fS zV-fRo8Ob|`f#<-dtrZ7Q=ub3zj=NQ1Z$D4{-E}Ps@4y{A&*4X#xB|YpwqAB7`hVkr zQCE>$Hq*dg_axD7P=0KT?h-Hwb#|!_)+oK^pm@*j85Tdkar!#ik6LZ5 zHM~haf@?$%hjr?EgC2dFM)^6CPe@_H^v_ZRBYz4kEbMb=Ci~QUEjtX|M0J|b^2?+X zOZ1&@COj#o{5sI%y-60*oloy;We4MJ=|%vRJwf3&H%BNmlCB2m1%=)?LF#lT9;A4E z3Qh8M?M@jf>apfmch^6~F6t;tN99afl(4t^;0H!KZxLroHB0g-ooB1FAJB;Li)c>G z2QhHi=PBw*LX0P>$jYIXvq0d`IV{S@9#Yyik9AU!o`^~qlwS@6IQAcO8EuH`NUl5D zfIE|^y7iN31|Qe&~X@3=2i)6$+veR8uh(!X*qFP6! zU7`Ar62c2VY6yWP;Uo_)avUcyp&jBoA7U=#HBIYPkA+4pJrz6e&e<*z<&tUdr6z}$ zRJ-8Qn{HZVSU71ruXc8{Aiih)NnnHUNkGCuSAqcJ*BKJl+h@l$&l)#xT_+uf*a9kW z2V4^(7RECVONi?Hm#$e}BYFLcr(QduDfI7~6=32}213mSDp|=Zyq>Lo!jp_pKbVfY zJR|X#WsS+$OWlDq-b=Id)!9HV#p%91obwH~G6h6fwyiJ&8Ifo1<)g>U&XmCJa#`2D zxP`2C>z=1sx{X1Qn2?9q=%AAyeGi*CQZsGKYi^>m*67~p9Vn@I2qu8Mr5FV*GD`WJ z)Mc&iDKV2A#M^mzvc5JD?xz0$8$=`_`TnV3z>0pgk^pqV@ChHzo>E;E6ZN)=lL{WN zkli(;+$T(FMou?gDCqAHQ07n%m!tm|<8xNO>hVjGR?xWfpu)tp7>c5{yGa03@gS5- zY#ozs(shpmlLrbwt7nB}RS84cOZ-vZ)Dho1V6c+xrK4pC5GxCB;#>V`EHTNni(Uq` zl0K;xI5gcVhPK>zGE_-HvvmenejhjoDg;uh75Dk$_nV#DDJerp+9|qw4!qbE(*Yc) z4Y(g{#0wruRP|3o89i?$Rd7bdHNpoG=J{8Vex9nu=&o)1W%sO0@m_WL_B(rO3~5pA z*py`lDWl~}-4gIOg0p};h)ot1sn_Z@IqMyScE*9aRpyIl=C!GlRa{ zmYB3P2ytP!=0IIT7jn7V0`V&9)@Z3|G#^x9PogUt{w`I>%` zv%2ywMugs3ppHF>Tr?W87Fb(5G+hCw>SnBev<6%O1q!xtffWEnYDV2&vh$)T4fcY_ zjAyr-d)#q7pG@lAUICg?d3@^Z{({f{N0%1MI{)x89H^r+>O_r|X=Th-^f+X7)3md8 z@$u0CSuc5Qx4EJ99fNhLA{sd%rUSXJFC*}@#+yi+#gZ1$MR2-zyZxOG9SP)@A8IRx zeP2+^DNK)=g-X}K^~(5VY@}P4^uTBN&DhvTIj*bJG{|qWollpIo}uXRE0?o33-)*G zYhRD4t5=W_f=?aTJ(mJSSbHk)b)c`jR2tu|TOnC(w+;W5N2#Qzy@t5rMx;>$%P?c9 z4cw;As&30-<Qcr~8_~0*oMP>XTJcdzV(6wj@)~wha66zwC$GT(UbLcoRNx z{6;iB(tCwxjV3t6aVRsrYUaLwM#5Gu0quo1VkO(k z50$eS5&NHX&0G_dD~xa5Bd{9hw}Hsvt+TI8-uMy^i5!|Gv^=={Z{>$XZGz+&szlNdh z1V~&V;}L=tUaq{&MX!N+jhu2)`3aVz8swm5*X)6Ahxx-CV~kn1Ou zPY|@%r=}LMZTV=SAWmD+3hP+gxY}l4*9@uR((M2&uh2@MWjDAGCJQY?VqX0|v#=AG z03BxP(_TN(F^V|UX$}-w;yvq*KRBWt>-fmhR?IJ*zv6-+&UEbK!pfJlFP{Z^1~3(& zp1AbZnwpn`J=Gn*Jw}Ot6E>;No(E@5H%7w>XomYTk4*4I!&?dJrAY5WBhe7?*@UIV z(`oQje^q-Bm`J*zu1xn?!H>!)Sg1chC)TL!Y?F7^ij|YOwT@O$6wKDA$oVcssAuJ? zM0LAPQzl9vOMpW2vz1}Zl9j{nfjvnlqVHYMA*Bkn>1T$GhUZ7uI~jny%BkP=SWhQkM10b z(*c~_k?NCg=d>a(d>kP$-{+2}LmZYT*VI*mp^5sLf|3S*MQQyP z2Po~wMs-s0%ijE*rbZWaXB}|?-cYGMf(T;JhRKtFO3JFxLaWz{*2RW~yR1RZ!dN9f z`R@a-wP$mht?>e_kjM6u()8pdNc-d}4~iTW=6gg>m<_im8xiz!dQUL(F(98ne0fsI z8H1t<0jN2M5fpqOnos9@Dw(uRD}gJi6;GiATC3@utaGcG zH>54nF2l^aKx{wB6jZN6aLpqt8`qph@Z}aj>18b`)#N~b#->-!Nn%nAvc-t%dp(W} zbf-4_KAa*_G1=&C85+&5k3t>r$6;+dIx0SDZlX@BYOEHp%el(_{9IRrR!sPkVO{m& z`((w3c4ezLnnm?A*=E@G$f7z?*p9>s#qS6ztUC3#m0%^9QLP;Hd%8fB+cO25w z*oBD{-r)~JElOYbIf!nTsx$pHjHMSZ|NY123PeoL#DA6m(Xa{jjg-IGeb8%8YH786 zL~sqLjP8_zBPwT1>k7|Qmb<`F)RJqbdwu`x z0S%t4d0ZCizB?+$Acd@G7n(b1X;qT8<5g7XI`-~JCmFDnn)T^>=&((uRUEG(`^vP> zOVHp*gz2tj?`Luv{3EG=bsXpSGU<*1WuudtsNC!#_L>Q1nitaja$H2#?e%o~J_YD_ zOfgJWKcrmt{?y~h2}m#!UDKp?<25i2X(Ly}=t1=xbMv!bQdgfqP9&4;o;V**BO^_I z>&je35;X*kS(?-b9+lG=qF+QCAZ0GNxVg#Ja>>N#sw%!}O;iymQ!pBJ+dTlKEav99 z_tmUzZqnmm`8JHHAIe=e2unKP(*yt&iyqus}MV#?#o3?x2L%P{_fa>G&eM z!z1hztm3{o)Z;htr;nUxp3)~#y7d;)Lt&Y*jSiY9#Azh>tJ>nc2p+;PNwjX0El(GEIs1UM!q-COpMXxM|h#1)t! z1xjERt*Q+jHZoRyjz-u|?8B)jG3)~2D_eq$(0XhjFyjrTbjq|cX}Q!(JY2mBJZ29R zMkMNQh8ZvbdpVpmOTLB+XI0%GFW`c7Sz0(BtNNbjsEH?#r zuBIEDPWpkuw>OZnpL4Q{{@#5do^rIUx&8|8A!e<+IPes!N3-wRl+Qqe;~F`0ACH!I z0+a-O_R2VKgJt1r_~GAYc(z-t7Gn|}aB@OoK*5dHHsHEbn6)tvZm)rxchVi4%-;bw>-}373HYmfyWB4947rz*2YMIeK9-t~& zU#^AjI*|Jzv-;Rgw;vb3+-anHUbf(vP`+E?c<7!u_zPTE$!W5B$DKOp9{y&Zek|ZD zYmp9c93jPS80S}&2_aRNZiA#-zmji;tuzg%Lp@(s#6*ZEX|^%uQEvLWM!}-+DJ1m@ zdsGY*mewpYyPtvKNaZzrdY59)$L%1is1o5iha%I(!kL`nR{<6BfC?U2nPQNS$NZT^_{(w z8vqS6MAsRKn!oy7J5w6m&_8|3cF>%>ogNJcE+_8lFmH(vg?@&1vk-ImKVC74 z6iXw%H0P~ba@{}uAoQ%N(i#vfjklO z)!2KaN0iG=aR06|0cr8I5h77~X>nerrw$KG_ILRBQgKd&XNBS9<|Jp_e@kZ^ zvnm=#m#XqPoX&FanT;^LJ*z~X1Czlpe6ZGPghi%+d0wZO9^k`@7_-py=^wyy1y`Xz)cXMOa56s~*UM~zcBMs2K@NsAQ*C!ComjiaPcO>H!hEZFqp3p;%7sLCfR5NCTsu zxJzWCgtU~NH`*~3HG<_3{$7{PSTW*2K8GGe8=71X5$YML?UlE(dkrO2O?dS$i!st+jklENb*#jC@Vyhm zA9qIJhRsPEmFBtg_;Q+?u`-+vaa z3c;XiR!;5|n1rwB#PS7c*ku_TQvI1cZX7vS_sJ&?3bf;rqq8CM+d`vCXrvO6cxXnMNs{K@=lik<$o;E%E z^s{pRt-$QMTjsU_J%AK6|8k$i#>fH?^U~d`_wh0QB&bizZ0DD2x|kn;WEBATnrq#O zCJ%e?^kmucniN?$k2^HN41Ejnh)LnFFKpKePs%R(<=j}HYDzMk3UkBgTb%kgX$gG9 zQiH%72;CVu560E!#?VFWQKr2jaMm3uE2Z}#{8C=55tLoE&#S6Xis9b6f3~7Wo(!T6 zFQvs#1R6wt&RgwAzR^x(zY@Cb9)GQY8Y`c=dSpaaAw~_swIYrJ5AjI45p-g*|H5y{ z-tJWCWIvpImiYHR-m)q$>Kve}LNlL^nJSHejK|?}Gh?x6U#{yPmr?y~mM23Xb?v|gs>1ne(k9B z^G;6JRYbWro;hxwS?z<|{};7O09Ud1SAB~V1tOMXwSen(3LG>Y;7i}X4FL8NqYmKK zXD>T$paU%5c&}t&%nAah^k#P!laO$KK zc-fErtl06PN)@SUILY0X>;67w#gTCA7Lj`n&pl*ODloBTsb=rzS)Bfjsvr?8I_gIQ ztYNkW^f^&At3U=&v>b($hTvklpm_nUu)PXDqRPbq3 zTUw<9(uH|2_yiJ6Wj8wGurt@jZoA%MTc~$)x%z27WV4js9t-3L!%C#^q9(D9?^2q^ z;Tw3_?1g6#%*T^03fa$WdjmV zD?Y>Twx^0O0EP!iR-VPGYKANZPMC%WlnKerYDP7u{K{MS_xtTV`R9RcD}Mg?C&5LF z*TzWq%yg4ZpM(f$10@{383LEELVDM{)x4JOx=qtG*o3f|_wYNSSKF0nNgc8>Bk#+s zjk7f@R~t=>u%Dy+a3z(ZN=KXv=jvYWWc<;W1q4N$3DQ+lqRq~JC5Z;Rj1h3zZELXA z_sk|wetU!2X*a8&N(9^5?}2E-Q2x-;xJ|1<>7Bv;&pg0PLA=3{ry-bfFK}M9rP|ii zQ4CY@37KB-Qg-~^l5Jni^{j?e9<6&dDg_u621>dg7bRx<1X&p4L6bmB`6@EFfeYqg zo$)+N1iEJE*kFcLxs?7S`cJs3R}z{QG9U_7tOFS(7~%BgeZ-Ms2=r(com?o(vR)gW zgp^m}CT$Z*LJ*A52rgz0M54qb$};bPa2SlAorr`}sPJdvvk@b8b0bxQTTSa<{%>Bk z=N)W(Z@3CUs1URm+<8M&$KFiO+LFq|#cjKh zZb2K@Cd+s~ydGcg&3`5xVmqpK83;YU=K|B!-*xO<+9mY7GbS;L8!DWCul*jsZEmTj zV5mJGrh#*~9g1{%>UGJ3Fm4Zm*1?8z85^S&Z;dPy%A=#=E~~L%m5%H+;8B{OG6#L; z(>uZ5c3(fZPalft(zU30k-tiy|E;+tWw|V;TDt{s-3fJuti?(ywHD=dP}TBvvp_?P z#GTu-A4KA>Rw_=S%LQLtF>f1r>l0`)tXzK|N)`vl$tBZJr)F?j!NHc`r=BRAzMDdL zsMx^*$z>u_t@R!Ld2^4MZ+KG`*~?b>W^8HorWp451h*Oq|L|3vB9Uzr62C0Fruvv7 z_|VcrV^XP&4m~%GBnF1n45mOWc2v_tnP;RZoQlm)8EjJ|-?mlCjn&?T?(x-awf!bI zS#j_vEZhHR+KJKm0-`CLV4&Q%t=C85l1dU0DVjjr=KaC5fZ0rf^sY>h+eR)r9X z=8V&Yzo2$N4pwvpphQMx1Ig{CAv<_;&cbqGp32%gA>Lv*B~3}#;vr}_;WTodc! zGyS0%24SM$tHFL=9bNq}=;F}u>=b)R3-fv4T*&z{6cCM@DovF{Ufg*?O`Et5!Ebdb)rti@HXzQ{9E8q8VC3u@o`0JHVJ4Tj%1lX_@KGg96 zeIL);gOUIB`qegvhW3%-`y`x0H?Eb&%>=D1NxW&}M3b9hI(z?)%frVv_nciT!t`v% z6x-gr>St(Z4431Wd9hbD-ixUL0^ASMvE5ZK#(`PV`~&*M71X{`opQD2q0lx0tDFM9 z1it($vJzBtp}*%;u%M$sxBXGu2>tRD^*5ZtM@EiU>>1x{LW!HGEr94c9QbjCmD}^C zl6S)({q;{S2N4R8u#(TL-|iCF^N#a?<*R*qPm%BY+CZU^eEsSpRk8iP0a*z**Yj^p zaL0EfR;1DoMkB0DPsT)0Ujy1nGtxGuYu!+X zIdZoR$z;lcu)BoXt6%J@)LDAVFc7EMz#GXm(t)-U{tq!~=0V61MgO-->TfEnu0d>2 zEinz;XSe+QAk&`PYRZqf!*j1DKVOTv!N8b%zVV7He$cirD&4MWxWp3$?1Fs^UB2xtHC`pVw?8KY zyt{?fzi3=aZU7@!o?=_)dE<-c(7%36RHAUJ-axrZ`$LvqUyx^0H%Z^`HX(unli z#V|?m3OliLLK6AmS?$sVY=hk9J)962lU)XRnRhzVfd!}fpyxd0YVvm{GEWuwLt|*R zk6dr|A2Oye{iCsT(1pyd_5J}QAx2xhI4Q4W^fob0Q%@w{4<}@Ocn5@>Qus^~;vG3p z_aU*=%pe4NXVZJawZ7Pl~< z^A9Sdy|MUEt@=%7Y@F>OKHS|Lf4ID2YL+_Y9Mi!JNKcfLKNAv+nwRF|fNE1$*%+Yi zDg~<2xF2Gg%*#b#;HV7Fpv83)?^*GUIsPGnp?dpt-PD<))ix7Yj6oN*tg)0zjF zQ1x_UjoYS1^wa~En0?~Q<9AO(4o@0qI)%xe#|aVjR$>$MYeqz+O>+9$S`8PLgd;&= zTagf^LQP?}sF2A$^WgU1;w3Q_3?E9FUbha0PO1}TJOnncz83ckYvgP+n3sR?-8QYy z5i|?6AwOQ`OVZL-`@BL_CfyZ)l@CtapVaY&nSMnGImEWpb53|CZ4E4EYQAT!RFxpA zfyw&dUAM}ODL@D&6krAS;yYeP8Aa1My=C*oZSS3%9)Wc_e(&O%j4JB=o1**9Sl{Ke zfmwBG^qG!r$00I3gEo72lDIX zak-P4#4~;r*-6*YvYQOf`N*l@o>7*)=RiHBBh)TPt73+jQ+jcxU!?M<^eZ3hdh2~nhhY(O6_*N=7p@p$4krfw4!ioAHH*f#DiCZ%`EN=l} z+D=6`vYd=oJd!&x)UqihV0j*QXBt?>@A9YWjZ7rr@?TN_wbUPY?psbL!}Wj(9K>#Y zs}fUuEE#)?jhp0(#^SfTod7vRHX>n zhAMHhcOM4$i&5D+A1(ktW8}Wii^=2w0*k)Fa!SS2pi_Q15c`__vUFw?A@cE_G%ojz z`hQpvxCGGHQhE7t5R`#|I4oody`I!uU=w|;)gagN-#p0MY!k?5iE=f>&?KFy8q*kW z@!pdvd<4R9n@w`YJFXl!F4Hiza`jR;q-W+}5fBn?J3adAis|f?jTNYMv$->&TX~Iv z`Hsn030Wzr;kPZ}WgA-zG=RZ5;CG}uaZQ~&R5_j;<*Qll_zGr=m~9~Y&!Y~-ycw*L z3YbL>1AI@=86Ag(ukIbqE!>eC-x_}`SS1=rWYNVGRXUq@Vu+z^<(eWF7xk)fXMUFq zEpBl<>R9%qZ`+2Z36+UF!1G&V5DD<0ADUOq{OW8Q4qxv?6s zVO4DD13~SEOfF@7>rX)369}zPAEAeKU?;Sj_0TSxrt#WEvU29G!xEwgKF{))*_|_T zqhxFlGO(+qbJp<5CwA^GXu9I$9}`LchmxV`OJTE>Yu48$I1f(7jXUTrf_&e_S6Jy~ zo_?-m{zkgH;gJ~tIv5I&bWFxAZw>fCt^pdRUwkC5KhJ62FLRR7G1Cz2v^HOGIqmlR zjpzBS4=mF=s44RiIitfRyCN29Q#wL#*0Zvj!aY*>A2(_QzK&Chy!|^AVZjn0utPeb zA=mn_b}Co?Ey11Ye(WDtdqd01U{9L1iW%=*UZgz!zOl{ic^QhvRDJ3zSb6hv@gmCK zu=bvB5q#+R>IvTF$tq%2eQN6H0WN=5v^W%OOu%jF*gX7oC^)gTdD!_3IyL9~ae)|D z^m)=}R>y-HMS_bH#$2{1=RUa?aIZq`>;6lxb(XquJ5sQA*XWiq`7Rw?@>`J3r$Jeb zbSJ6ayZ(0bm>G40v;;$;-74ee|Fy?+s{8dAN#Ij|ZXKAj7P70yXE9nHH7}H}~~+pMg-^0jA`YYrNVtG0%rPVrp2%K=h{TLCopoPw@D;L?XRUvH zCERw{nKXAqSvteT@*;r7@nqaz?;sQXh4%kqJkAA{K;@#MmJG1jgdSIrd9i8G8_Vnu zx6tNdyGN=Aa^nODg|mVyzqa3T=Wewfwem-_w_Dh_Vb-bsQkOOxr&bESey!aaSem#2d3 z;zsN88V)UKwzW@2P?qYmzc4LZBY@?laL`RwG9l&aJB1o7cs%Ge@O~yMhTZa4&mvNu zT6oPQ{b2Fq#;mEUPz1GHAJMNewuDqnbVXcrD<1%zBAvxFR9O7CUtojmP_z8OpTmdp zaYu-aQH#v4AAn&t-8mf8^UnlqIruc^Uzm2YhVBW^5oPi?2Flzo2I-#9bJ3gBQ#s#3 z6Q%csKF*xvl?fKu%7IP50>jr{T59;`!w6iLrW+zQIusOTP`^_LQy%TZKWQgVeUC4n zwdqJY`!jHrv@!!_v-shv1hA;kB};)Vw8|$QmF-V_3nok_{ut&ZKYs93v%Xg=%&9+y z#ya2e%Ws##McWX-M_`W6kJ0~ba0Za#CtqqkBZJ1~$I#Fj34#`q4&<<-#f}yYqMi3l zV0*e3`H8wEy8JUG6?i}f658k%aPY)yx&epArwTycTd zxpZXer_&+%xh&2nMtcME;ofyJ89PCz)|7xm49|P6_WrDqP-4|$ANS`wu+RclZYRiQ z!ck#}AfkSIiRp;lVP8vWcEBLtZ*UTPL~x!Jhsu=&-*x3?cSvPE$b^ z{K&Y&B7|WZYX~ROMnQvh=o*%Q)s|_AfQEdqtw4fjZn^u1@IdjclON;pTPdv z(=yiJ?}@u_Q?a*FTP&B%RpdV%66abXquv}Ra9KUQ-oheOe)cKxCs70i*#w?My z_6&DD7iKtiFY~W|c}@sw5})F9qJ$+2$KB|lK%3jR_e67dkV`6?k~`v>|HTiWX&?Ls zf;p7E7S{W%8ty+$Q^8hAgMGu7yZ99AZSv^!`onRdb}ee;Xuw(tz|zOT><8AonnYqS z2(qxj*eMNLdrF^qmaz<6d<>(t;rcs@tv3esLxVniJ6?no0IIZkAe(jg`MLg6at#O> zCwTkaw>*^s$3DDy*Eo7yy)b1kl`z%of=7Ougme!(;Ap<4UMXC&v7N#OLdeQ$ zV@g9SiuMg9jgj+)n%e>79mY8;5T^tx)Yf5dKU)P%;{Pq_43H}El$)MHY2t0vH0{DL z4RrB|)g6;NqsH7qb8Os5&u+Zvg}Z=7tHt#F&G30hmof5INmlP81OY-Fn|Z0n(?kUg z4$3Q?A*Wq>lY(P9I$+0V>;$dun5Le0J(hbL^=c~fXd3}XOxg+R7pKSACsyM7=`AOk zoj#0GH`ZJ*$mrw%%bnNUKPS{R*BY-BM4Eh>UQa>(3iIZ?>!_?QyKaP{eEP2yz+LV?bIuLcNg694( z6{@uD0#nw85hQ1`k~4Y;4d$sqhDO2DXy3@*t$#$TI!VEP8(O<7Hmxpww%p1dg6{Oi z>nq_Xg}p%w#YlTl->UE$d&TD1ep2+eK*>D(*0ucVQ_tEf_k?sTV4B%>&lmsWwi z^Sl;Nm);DX0;Lsf_Iw{ARxiM z3?yW2Slmup+eWp{Wio1CEJnqR=|!eJ^sfB~PTh^dvr5}0bXTU|c)yR!`b8}~gfF3->fy^qGLBkRa5i5{n3dV0$B(v7Mdl!U>tGa7~LQE-MyFXskjE)Hp&rgQTeX) zFxX%+%V#qGy487`a&#D#EqP9We??ae`2ap*bsj_+f7;Dk3v)>_ItG@)5PqVnPphSK zsZOWIhROE?9$6J+8v1ctk5MzC9_d(A&G#0VAK#6Nehh0|R76~ko!^xiPvgk?qAM4G zp`)=b2vWba| zHgBVyyC72DhyTcny7nhlQ%;M_r3Q%_Dbck>STYo+>dxs+KRpkWJ>wrTtcY&y&ZomE zPitiMQrDdGVA=jom$M68NG_Ft>92JNN!R1W&2SOTD zwWbq=?(R=E(&)}YmVcywSv`FGA*X>WtZCdXHhw?6jCRGgtMWJ%cHTjIi^n!!G0=|C z`UP3%aT^>!9dAqTzyhV7wQX6HCrL5Yt@eT`PyT}WdNamP!sYMzD95kZ_6*ai7@^e<7gGM} zw8pXno2%&&Ze@CvM)-+mZz2QhxN`B)QNu46CGSl>Dv`d??bv~mgq6PmH#fm@`uZyR zOY465B7ISZzsSrG-Fw-!JY+CC;a~H#KRyk-*E{+>tlWPNhr8J#PlGD+^r#a)=eNuv z&l9El^o^~s@4d*6*da(p*`LM2evkwEkRDXRd|w8dL6O`N$2Gp1 zlP9XQ!z593iAz8JoM?J~-tS=Ey$-aBp`ed{KkFji6{Y+|-6D9C6K-?E)O-$ijGem? zTAGlMdg#E!asO)&Ju7{wT@@qMTo&tMVqytj@^yAorsY2Zmi36N6b%K_KTC8m=_eDI zb&oQ*Jw(^V(8reG160ntbGRyuwDQy_7#~UgiQvP~uiW5ppTFM38;ww4eqm~K8$Mo~ z(BjhV*l(ZjxM8246_0qnFG4N@-n3D%Rgn{c*n&Yt7|0)6!?|B~NNJccf%Z8_EjlOd zNa94)Ey1w-MT}cIsWvmhGdJswi}#9uX-!Bm+16z^v#li7R96o#P z=D`eeY5hWjI5KmF#OGMEa&xE5Q_SvSnKF{!LJT_1!avbDNH0EsP)yZr+K7~p*T)n{ z;#AFyel;)R4c*)FXP_EaG@=n;`(c^hZTDL5N2ermx0dI@P0pqTp#`q2$aMsM@dO0@ zx{B=rAT4O=TB?AhZYZV)0Q)0T^;AVoq54c~5SOy@ZYJ<8N9pgmM&PC(b!p&1_|Eqy zX)daFj}9XoJcLqiR&ZDX$9}M5s<|JZRRg^T+ZWr%Q7yqaD#P9(jOteeq}FrG0pVcI1+U&q@5iU5 zFBl%K((*~;rL&tBNQD|4glg=I{{>AihCxe7pvx)Wbj%trBA&>ae$iZtXc;MN-%wV+ zEktS8zDIoXC8_u5XeQ~>2gxa>%b32WGBs5h$;^HQh~Z20n4gB$PPI*Ow{b-kXBv@{ zQ7U{?>73VOG_Nu6R$_9iuA&8H(jaQ>1X7LDgicV@7wTxh9d5_RRmlZNMAKHq`NwEL zd5I*N%rYnDYPigx_((ePCzOpAbp;dFG#nWg&b;5hAXXqh8Dmp71%u|VXv=BwDe^Xh z3O$?Ea}L+qsRiDQBpLeUIE~~2qWD#>oEi2ZWu_gd)vU;Q4h`aCnyeo#xiN`YMc*$N zL>Q}dBlbJdPc1*jp=oa|)c0C`Wc;51sWMj0l}Fb@mzXMaW`tl?kj4OU@tKLB zUGy=JIt`ITuh4#UCCGsbj)*otYfu$yKbuApT$P&mCk5=zO?o4V3mc&q#r3a%sy3fB zz^w1Meb(Im4ZcH^;F`et_COU;Ph02%VubQoSWu;`RhO+Qi-N}*p|L0g8Cs7I>@Q-W zP-Kufdjw(_OXwNcv*3MygS7KNP{P1l4$P(FGYr|x(%nTfNIVRB1f&28z%rYT+4T5b zbh>8Bp2FzN{Y)AM=1T2uS_12*Ynv9EzemNc=X_5#C?r=``3}>Z8j%L7UQgNmTC|o| zvwcEEG!L>4iTQE>4eK%EAmE1^Z+jr@g}E^&r&xn3bxuVCM*Rgc3H8CH4>y=D5-$Hj=F!jTF}+7)={JckK~@tO=}XG=_jB5eUyi#RTg?#}3>*BW)pv&A2=-df_oF9ubK*^OB6LVnAPfLS-=Q z0Htzmpt%l4=0YEEkYH#LN?Q>O$O8K{5ETn=&?t&YCl;GPPzR>M^HLp>jNU91;gBK zK-9XA(lbBIg(T{TN06-oy08PBV@p7)MbyRdFqpEKfu7)+!1{*JQ(=zXZj`Z4sew%$ zO0pP?8D>=K2N7w@1^Y#}_G2HB0jz2EVq(EDucMH=4=Ro~E8p)N886!K7?asn%~W?# zWl~hZ;4dFV5&whgt=Q~eypyHn$x>fjQT^y5?%>W2LqUJ4IuDNw-kPU-q~LPmRN9BM zY#a9xj0L6&rxbo?46L+>bJOq99;-jLrlVV5>kUNz@V>gz!le9EaUf=#4Ic!*dfu{D zLG;Bp1{epjhDB~wV%ORq<9P$&!bD$u4H0Y^?F_&MOOd|3QPrk?JZ{xq{TE+@o)%l{ zHrk81fP9c0_$5PuKEjHNz-YI4w2Fi)Bp_k`>^+ozI-P7^0(DuW`xnqI#{cDKy~k9 zna{eq^ep7L5dGi3zPU_X1%@&@GQ}8Fx5gJIko~(~mjQ$*FgB6rC!G0mEXO}KS017ly1gej(?>0?j(>qrLhJ&n(G z@s+xp5NEw=0&80IE$h8%78W!Pus4%kAP`ySEi4!a}zjQ+XkJd1iWkVp^m!5i11FV}5{s zaz185!59UKpbqYYsC&!bpv1Dy%^|yWQXTeAU8V%qw8@3DDL)9XRPGkBVb7FXu<@7^ zi0FIoh<^6tMLn(wr~-ee(kP?Jw8s z`m>)dYbcM%Ez<$n9?Io9--FqMe*M*ro|x#*{&1mpY&VbBGJuC?3{b&B1)$r@LbsPE zdU?6g^EZ6nJ8>1Dt%dpp#!4qsHI+N+5Pv;J6Wy6+-p3CjDeA;Rz_N3LF1jMgeI|>2 zJ(kH!9~wZlRj}A0CniOlyvo$&e$9d5=vT)T7f!8sUr4%PHIQaI3Rl3P4-W(SwM2yV zNn&LIxx%Qi=zUIhf~>NpsjP zI7eC(V`je2l)Z_LV?b!XPGn3_O<;Y~#!bavx9GB*kt@|g_Ae16c55*m7@z@vuTKLT zlT{hVSl>2-twLTHKVzo|R9l>j zvLLhb!qw-*g_l)jIZjjdX^=q2&iiq}+@avCe3wAi()#!(H_8j8C3fL zIrpa95WJEYScpoYv;@{SJkp4P)vyo6GOO@}$8n*SPm`cS6mX**a1aA74Hah=FVUe; z>Ud|p{s9Q?*(1H!Ken1)hx69;CMw0jDFY zD7|S990zoOXCECdK6q>o3XJhRhm$CsmcaVvDJ(0Ci^O!GhkvZ32XrqT6im6~#gpFD zyJtra9k+{sV>V_9>@UVyHQX-O2r&Gs`_bM#l>uh56soYaQP*rl0-7v!VsUJm zImQYlWTUY<&2_E02UPEwL-nC4@B%0+fmFR_#bKp?i(&|u_Z9E zK97-|ZIZFRT|CuaN-yNvg^gKYAyD2-HQXCu!p!kS<57zY$kD-7y!9ZtZTAw(c;1;F zt3-O;q7*{Cr`*FMQpEt(B3v*gv%IY?E_}#Q!q2WoFj7NviDT1j9CTU#5D%K;a6HxP2l(EXnyA8xcT^9KR?i{%8KX<2sIsDVHQwstt zd1mp(#CMG-h6*^aLDhRU&Af1K8sTTcXDfj{<5zty`-h6)Nrc3+%xY)jAQ2tldz|K} z@1m#Bd)F&}Zq7KAX$h=vj=fGV=7x-0uM->zHzUZLy;@YByuX<-8Tx}#tgJ>!{C)iM zV*$YLxbdhnq6sai0A8y26ec4N3Ig$=a>8Op+gWZ#YG<3GI6Fn4aFNCn+NWN}nprWB zOQ0&GyVvjFvbT;aw6?h6fYb3HHl6lZ%TVyQ1gcT*U3#l{@?2gxv6nLp)#O30d7T9a z4lva^lQfcSB?;?W-<{<@8VXIR{m>&4USvSkl$E0SIcy@xxvV$+g}}1ba6k-#c;