@@ -488,7 +472,7 @@
flex-direction: row;
gap: var(--spacing-l);
flex-wrap: wrap;
- align-items: center;
+ align-items: flex-end;
}
.side-panel-icons {
@@ -505,6 +489,13 @@
.date-picker {
flex-basis: calc(70% - 32px);
min-width: 100px;
+ display: flex;
+ flex-direction: row;
+ }
+ .date-picker :global(.date-range-picker),
+ .date-picker :global(.spectrum-Form-item) {
+ flex: 1 1 auto;
+ width: 0;
}
.freeSearch {
diff --git a/packages/client/manifest.json b/packages/client/manifest.json
index bf73286933..1f6a81236b 100644
--- a/packages/client/manifest.json
+++ b/packages/client/manifest.json
@@ -3869,12 +3869,6 @@
"key": "timeOnly",
"defaultValue": false
},
- {
- "type": "boolean",
- "label": "24-hour time",
- "key": "time24hr",
- "defaultValue": false
- },
{
"type": "boolean",
"label": "Ignore time zones",
diff --git a/packages/client/package.json b/packages/client/package.json
index 00f89a6445..0f93adfd7d 100644
--- a/packages/client/package.json
+++ b/packages/client/package.json
@@ -24,14 +24,7 @@
"@budibase/shared-core": "0.0.0",
"@budibase/string-templates": "0.0.0",
"@budibase/types": "0.0.0",
- "@spectrum-css/button": "^3.0.3",
- "@spectrum-css/card": "^3.0.3",
- "@spectrum-css/divider": "^1.0.3",
- "@spectrum-css/link": "^3.1.3",
- "@spectrum-css/page": "^3.0.1",
- "@spectrum-css/tag": "^3.1.4",
- "@spectrum-css/typography": "^3.0.2",
- "@spectrum-css/vars": "^3.0.1",
+ "@spectrum-css/card": "3.0.3",
"apexcharts": "^3.22.1",
"dayjs": "^1.10.8",
"downloadjs": "1.4.7",
diff --git a/packages/client/src/components/app/DateRangePicker.svelte b/packages/client/src/components/app/DateRangePicker.svelte
index 5c710ad766..8131f3bd89 100644
--- a/packages/client/src/components/app/DateRangePicker.svelte
+++ b/packages/client/src/components/app/DateRangePicker.svelte
@@ -38,10 +38,8 @@
if (!field || !value) {
return null
}
-
let low = dayjs.utc().subtract(1, "year")
let high = dayjs.utc().add(1, "day")
-
if (value === "Last 1 day") {
low = dayjs.utc().subtract(1, "day")
} else if (value === "Last 7 days") {
@@ -53,7 +51,6 @@
} else if (value === "Last 6 months") {
low = dayjs.utc().subtract(6, "months")
}
-
return {
range: {
[field]: {
diff --git a/packages/client/src/components/app/GridBlock.svelte b/packages/client/src/components/app/GridBlock.svelte
index 55e5a2bd66..e365429cb6 100644
--- a/packages/client/src/components/app/GridBlock.svelte
+++ b/packages/client/src/components/app/GridBlock.svelte
@@ -50,6 +50,8 @@
metadata: { dataSource: table },
},
]
+ $: height = $component.styles?.normal?.height || "408px"
+ $: styles = getSanitisedStyles($component.styles)
// Provide additional data context for live binding eval
export const getAdditionalDataContext = () => {
@@ -106,39 +108,48 @@
},
}))
}
+
+ const getSanitisedStyles = styles => {
+ return {
+ ...styles,
+ normal: {
+ ...styles?.normal,
+ height: undefined,
+ },
+ }
+ }
-
-
- onRowClick?.({ row: e.detail })}
- />
-
+
+
+
+ onRowClick?.({ row: e.detail })}
+ />
+
+
diff --git a/packages/frontend-core/src/api/backups.js b/packages/frontend-core/src/api/backups.js
index 7663ae09af..40546b6f66 100644
--- a/packages/frontend-core/src/api/backups.js
+++ b/packages/frontend-core/src/api/backups.js
@@ -1,7 +1,4 @@
export const buildBackupsEndpoints = API => ({
- /**
- * Gets a list of users in the current tenant.
- */
searchBackups: async ({ appId, trigger, type, page, startDate, endDate }) => {
const opts = {}
if (page) {
diff --git a/packages/frontend-core/src/components/grid/cells/AttachmentCell.svelte b/packages/frontend-core/src/components/grid/cells/AttachmentCell.svelte
index e7dc51e5d5..1a2494987a 100644
--- a/packages/frontend-core/src/components/grid/cells/AttachmentCell.svelte
+++ b/packages/frontend-core/src/components/grid/cells/AttachmentCell.svelte
@@ -1,6 +1,7 @@
-
+
+
+
- {#if value}
- {displayValue}
- {/if}
+ {displayValue}
{#if editable}
{/if}
-{#if editable}
-
- onChange(e.detail)}
- appendTo={document.documentElement}
- enableTime={!dateOnly}
- {timeOnly}
- time24hr
- ignoreTimezones={schema.ignoreTimezones}
- bind:flatpickr
- on:open={() => (isOpen = true)}
- on:close={() => (isOpen = false)}
+{#if isOpen}
+
+ (value = e.detail)}
+ {enableTime}
+ {timeOnly}
+ {ignoreTimezones}
/>
-
+
{/if}
diff --git a/packages/frontend-core/src/components/grid/cells/GridCell.svelte b/packages/frontend-core/src/components/grid/cells/GridCell.svelte
index 74d98ec130..32a9dea83b 100644
--- a/packages/frontend-core/src/components/grid/cells/GridCell.svelte
+++ b/packages/frontend-core/src/components/grid/cells/GridCell.svelte
@@ -43,6 +43,9 @@
on:mouseup
on:click
on:contextmenu
+ on:touchstart
+ on:touchend
+ on:touchcancel
{style}
>
{#if error}
diff --git a/packages/frontend-core/src/components/grid/cells/HeaderCell.svelte b/packages/frontend-core/src/components/grid/cells/HeaderCell.svelte
index 657f618759..af1f1b6b78 100644
--- a/packages/frontend-core/src/components/grid/cells/HeaderCell.svelte
+++ b/packages/frontend-core/src/components/grid/cells/HeaderCell.svelte
@@ -1,30 +1,22 @@
@@ -258,6 +252,9 @@
-
- {#if editIsOpen}
- {
- editIsOpen = false
- }}
- class="content"
- >
-
-
- {:else}
-
+
+
+
+
+
+
+
+ {#if $config.canEditColumns && column.schema.type === "link" && column.schema.tableId === TableNames.USERS}
+
+ {/if}
+
+ {/if}
+
+{/if}
diff --git a/packages/frontend-core/src/components/grid/cells/RelationshipCell.svelte b/packages/frontend-core/src/components/grid/cells/RelationshipCell.svelte
index bf1fe92ef0..a01baa5c8e 100644
--- a/packages/frontend-core/src/components/grid/cells/RelationshipCell.svelte
+++ b/packages/frontend-core/src/components/grid/cells/RelationshipCell.svelte
@@ -1,10 +1,11 @@
+
+
+ dispatch("close")}
+ on:wheel={e => e.stopPropagation()}
+ >
+
+
+
+
+
diff --git a/packages/frontend-core/src/components/grid/overlays/KeyboardManager.svelte b/packages/frontend-core/src/components/grid/overlays/KeyboardManager.svelte
index ed09301bb9..cef4144833 100644
--- a/packages/frontend-core/src/components/grid/overlays/KeyboardManager.svelte
+++ b/packages/frontend-core/src/components/grid/overlays/KeyboardManager.svelte
@@ -20,6 +20,7 @@
const ignoredOriginSelectors = [
".spectrum-Modal",
+ ".date-time-popover",
"#builder-side-panel-container",
"[data-grid-ignore]",
]
diff --git a/packages/frontend-core/src/components/grid/overlays/MenuOverlay.svelte b/packages/frontend-core/src/components/grid/overlays/MenuOverlay.svelte
index 55308d4c6e..13430a3f7d 100644
--- a/packages/frontend-core/src/components/grid/overlays/MenuOverlay.svelte
+++ b/packages/frontend-core/src/components/grid/overlays/MenuOverlay.svelte
@@ -1,7 +1,8 @@
+
+
{#if $menu.visible}
-
+ {#key style}
+
+
+
+
+
+
+
+
+
+
+
+ {/key}
{/if}
diff --git a/packages/frontend-core/src/components/grid/overlays/PopoverOverlay.svelte b/packages/frontend-core/src/components/grid/overlays/PopoverOverlay.svelte
new file mode 100644
index 0000000000..a03ba6d927
--- /dev/null
+++ b/packages/frontend-core/src/components/grid/overlays/PopoverOverlay.svelte
@@ -0,0 +1,9 @@
+
+
+
diff --git a/packages/frontend-core/src/components/grid/overlays/ResizeOverlay.svelte b/packages/frontend-core/src/components/grid/overlays/ResizeOverlay.svelte
index 1140962583..e564108430 100644
--- a/packages/frontend-core/src/components/grid/overlays/ResizeOverlay.svelte
+++ b/packages/frontend-core/src/components/grid/overlays/ResizeOverlay.svelte
@@ -21,6 +21,7 @@
class="resize-slider"
class:visible={activeColumn === $stickyColumn.name}
on:mousedown={e => resize.actions.startResizing($stickyColumn, e)}
+ on:touchstart={e => resize.actions.startResizing($stickyColumn, e)}
on:dblclick={() => resize.actions.resetSize($stickyColumn)}
style="left:{GutterWidth + $stickyColumn.width}px;"
>
@@ -32,6 +33,7 @@
class="resize-slider"
class:visible={activeColumn === column.name}
on:mousedown={e => resize.actions.startResizing(column, e)}
+ on:touchstart={e => resize.actions.startResizing(column, e)}
on:dblclick={() => resize.actions.resetSize(column)}
style={getStyle(column, offset, $scrollLeft)}
>
diff --git a/packages/frontend-core/src/components/grid/overlays/ScrollOverlay.svelte b/packages/frontend-core/src/components/grid/overlays/ScrollOverlay.svelte
index 43a64f3fbd..71d04ecbda 100644
--- a/packages/frontend-core/src/components/grid/overlays/ScrollOverlay.svelte
+++ b/packages/frontend-core/src/components/grid/overlays/ScrollOverlay.svelte
@@ -2,6 +2,7 @@
import { getContext } from "svelte"
import { domDebounce } from "../../../utils/utils"
import { DefaultRowHeight, ScrollBarSize } from "../lib/constants"
+ import { parseEventLocation } from "../lib/utils"
const {
scroll,
@@ -17,6 +18,7 @@
height,
isDragging,
menu,
+ focusedCellAPI,
} = getContext("grid")
// State for dragging bars
@@ -47,33 +49,27 @@
$: barLeft = ScrollBarSize + availWidth * ($scrollLeft / $maxScrollLeft)
// Helper to close the context menu if it's open
- const closeMenu = () => {
+ const closePopovers = () => {
if ($menu.visible) {
menu.actions.close()
}
- }
-
- const getLocation = e => {
- return {
- y: e.touches?.[0]?.clientY ?? e.clientY,
- x: e.touches?.[0]?.clientX ?? e.clientX,
- }
+ $focusedCellAPI?.blur()
}
// V scrollbar drag handlers
const startVDragging = e => {
e.preventDefault()
- initialMouse = getLocation(e).y
+ initialMouse = parseEventLocation(e).y
initialScroll = $scrollTop
document.addEventListener("mousemove", moveVDragging)
document.addEventListener("touchmove", moveVDragging)
document.addEventListener("mouseup", stopVDragging)
document.addEventListener("touchend", stopVDragging)
isDraggingV = true
- closeMenu()
+ closePopovers()
}
const moveVDragging = domDebounce(e => {
- const delta = getLocation(e).y - initialMouse
+ const delta = parseEventLocation(e).y - initialMouse
const weight = delta / availHeight
const newScrollTop = initialScroll + weight * $maxScrollTop
scroll.update(state => ({
@@ -92,17 +88,17 @@
// H scrollbar drag handlers
const startHDragging = e => {
e.preventDefault()
- initialMouse = getLocation(e).x
+ initialMouse = parseEventLocation(e).x
initialScroll = $scrollLeft
document.addEventListener("mousemove", moveHDragging)
document.addEventListener("touchmove", moveHDragging)
document.addEventListener("mouseup", stopHDragging)
document.addEventListener("touchend", stopHDragging)
isDraggingH = true
- closeMenu()
+ closePopovers()
}
const moveHDragging = domDebounce(e => {
- const delta = getLocation(e).x - initialMouse
+ const delta = parseEventLocation(e).x - initialMouse
const weight = delta / availWidth
const newScrollLeft = initialScroll + weight * $maxScrollLeft
scroll.update(state => ({
diff --git a/packages/frontend-core/src/components/grid/stores/columns.js b/packages/frontend-core/src/components/grid/stores/columns.js
index 31638e7c79..8ceaae105f 100644
--- a/packages/frontend-core/src/components/grid/stores/columns.js
+++ b/packages/frontend-core/src/components/grid/stores/columns.js
@@ -48,22 +48,28 @@ export const createStores = () => {
export const deriveStores = context => {
const { columns, stickyColumn } = context
- // Derive if we have any normal columns
- const hasNonAutoColumn = derived(
+ // Quick access to all columns
+ const allColumns = derived(
[columns, stickyColumn],
([$columns, $stickyColumn]) => {
let allCols = $columns || []
if ($stickyColumn) {
allCols = [...allCols, $stickyColumn]
}
- const normalCols = allCols.filter(column => {
- return !column.schema?.autocolumn
- })
- return normalCols.length > 0
+ return allCols
}
)
+ // Derive if we have any normal columns
+ const hasNonAutoColumn = derived(allColumns, $allColumns => {
+ const normalCols = $allColumns.filter(column => {
+ return !column.schema?.autocolumn
+ })
+ return normalCols.length > 0
+ })
+
return {
+ allColumns,
hasNonAutoColumn,
}
}
@@ -142,24 +148,26 @@ export const createActions = context => {
}
export const initialise = context => {
- const { definition, columns, stickyColumn, enrichedSchema } = context
+ const {
+ definition,
+ columns,
+ stickyColumn,
+ allColumns,
+ enrichedSchema,
+ compact,
+ } = context
// Merge new schema fields with existing schema in order to preserve widths
- enrichedSchema.subscribe($enrichedSchema => {
+ const processColumns = $enrichedSchema => {
if (!$enrichedSchema) {
columns.set([])
stickyColumn.set(null)
return
}
const $definition = get(definition)
- const $columns = get(columns)
+ const $allColumns = get(allColumns)
const $stickyColumn = get(stickyColumn)
-
- // Generate array of all columns to easily find pre-existing columns
- let allColumns = $columns || []
- if ($stickyColumn) {
- allColumns.push($stickyColumn)
- }
+ const $compact = get(compact)
// Find primary display
let primaryDisplay
@@ -171,7 +179,7 @@ export const initialise = context => {
// Get field list
let fields = []
Object.keys($enrichedSchema).forEach(field => {
- if (field !== primaryDisplay) {
+ if ($compact || field !== primaryDisplay) {
fields.push(field)
}
})
@@ -181,7 +189,7 @@ export const initialise = context => {
fields
.map(field => {
const fieldSchema = $enrichedSchema[field]
- const oldColumn = allColumns?.find(x => x.name === field)
+ const oldColumn = $allColumns?.find(x => x.name === field)
return {
name: field,
label: fieldSchema.displayName || field,
@@ -189,9 +197,18 @@ export const initialise = context => {
width: fieldSchema.width || oldColumn?.width || DefaultColumnWidth,
visible: fieldSchema.visible ?? true,
order: fieldSchema.order ?? oldColumn?.order,
+ primaryDisplay: field === primaryDisplay,
}
})
.sort((a, b) => {
+ // If we don't have a pinned column then primary display will be in
+ // the normal columns list, and should be first
+ if (a.name === primaryDisplay) {
+ return -1
+ } else if (b.name === primaryDisplay) {
+ return 1
+ }
+
// Sort by order first
const orderA = a.order
const orderB = b.order
@@ -214,12 +231,12 @@ export const initialise = context => {
)
// Update sticky column
- if (!primaryDisplay) {
+ if ($compact || !primaryDisplay) {
stickyColumn.set(null)
return
}
const stickySchema = $enrichedSchema[primaryDisplay]
- const oldStickyColumn = allColumns?.find(x => x.name === primaryDisplay)
+ const oldStickyColumn = $allColumns?.find(x => x.name === primaryDisplay)
stickyColumn.set({
name: primaryDisplay,
label: stickySchema.displayName || primaryDisplay,
@@ -228,6 +245,13 @@ export const initialise = context => {
visible: true,
order: 0,
left: GutterWidth,
+ primaryDisplay: true,
})
- })
+ }
+
+ // Process columns when schema changes
+ enrichedSchema.subscribe(processColumns)
+
+ // Process columns when compact flag changes
+ compact.subscribe(() => processColumns(get(enrichedSchema)))
}
diff --git a/packages/frontend-core/src/components/grid/stores/menu.js b/packages/frontend-core/src/components/grid/stores/menu.js
index 2d11b65bd4..ea32285a95 100644
--- a/packages/frontend-core/src/components/grid/stores/menu.js
+++ b/packages/frontend-core/src/components/grid/stores/menu.js
@@ -13,13 +13,13 @@ export const createStores = () => {
}
export const createActions = context => {
- const { menu, focusedCellId, rand } = context
+ const { menu, focusedCellId, gridID } = context
const open = (cellId, e) => {
e.preventDefault()
// Get DOM node for grid data wrapper to compute relative position to
- const gridNode = document.getElementById(`grid-${rand}`)
+ const gridNode = document.getElementById(gridID)
const dataNode = gridNode?.getElementsByClassName("grid-data-outer")?.[0]
if (!dataNode) {
return
diff --git a/packages/frontend-core/src/components/grid/stores/reorder.js b/packages/frontend-core/src/components/grid/stores/reorder.js
index f820593174..b3abbbabf3 100644
--- a/packages/frontend-core/src/components/grid/stores/reorder.js
+++ b/packages/frontend-core/src/components/grid/stores/reorder.js
@@ -1,4 +1,5 @@
import { get, writable, derived } from "svelte/store"
+import { parseEventLocation } from "../lib/utils"
const reorderInitialState = {
sourceColumn: null,
@@ -31,8 +32,8 @@ export const createActions = context => {
scroll,
bounds,
stickyColumn,
- ui,
maxScrollLeft,
+ width,
} = context
let autoScrollInterval
@@ -43,7 +44,6 @@ export const createActions = context => {
const $visibleColumns = get(visibleColumns)
const $bounds = get(bounds)
const $stickyColumn = get(stickyColumn)
- ui.actions.blur()
// Generate new breakpoints for the current columns
let breakpoints = $visibleColumns.map(col => ({
@@ -55,6 +55,11 @@ export const createActions = context => {
x: 0,
column: $stickyColumn.name,
})
+ } else if (!$visibleColumns[0].primaryDisplay) {
+ breakpoints.unshift({
+ x: 0,
+ column: null,
+ })
}
// Update state
@@ -69,6 +74,9 @@ export const createActions = context => {
// Add listeners to handle mouse movement
document.addEventListener("mousemove", onReorderMouseMove)
document.addEventListener("mouseup", stopReordering)
+ document.addEventListener("touchmove", onReorderMouseMove)
+ document.addEventListener("touchend", stopReordering)
+ document.addEventListener("touchcancel", stopReordering)
// Trigger a move event immediately so ensure a candidate column is chosen
onReorderMouseMove(e)
@@ -77,7 +85,7 @@ export const createActions = context => {
// Callback when moving the mouse when reordering columns
const onReorderMouseMove = e => {
// Immediately handle the current position
- const x = e.clientX
+ const { x } = parseEventLocation(e)
reorder.update(state => ({
...state,
latestX: x,
@@ -86,8 +94,8 @@ export const createActions = context => {
// Check if we need to start auto-scrolling
const $reorder = get(reorder)
- const proximityCutoff = 140
- const speedFactor = 8
+ const proximityCutoff = Math.min(140, get(width) / 6)
+ const speedFactor = 16
const rightProximity = Math.max(0, $reorder.gridLeft + $reorder.width - x)
const leftProximity = Math.max(0, x - $reorder.gridLeft)
if (rightProximity < proximityCutoff) {
@@ -158,19 +166,22 @@ export const createActions = context => {
// Ensure auto-scrolling is stopped
stopAutoScroll()
- // Swap position of columns
- let { sourceColumn, targetColumn } = get(reorder)
- moveColumn(sourceColumn, targetColumn)
-
- // Reset state
- reorder.set(reorderInitialState)
-
// Remove event handlers
document.removeEventListener("mousemove", onReorderMouseMove)
document.removeEventListener("mouseup", stopReordering)
+ document.removeEventListener("touchmove", onReorderMouseMove)
+ document.removeEventListener("touchend", stopReordering)
+ document.removeEventListener("touchcancel", stopReordering)
- // Save column changes
- await columns.actions.saveChanges()
+ // Ensure there's actually a change
+ let { sourceColumn, targetColumn } = get(reorder)
+ if (sourceColumn !== targetColumn) {
+ moveColumn(sourceColumn, targetColumn)
+ await columns.actions.saveChanges()
+ }
+
+ // Reset state
+ reorder.set(reorderInitialState)
}
// Moves a column after another columns.
@@ -185,8 +196,7 @@ export const createActions = context => {
if (--targetIdx < sourceIdx) {
targetIdx++
}
- state.splice(targetIdx, 0, removed[0])
- return state.slice()
+ return state.toSpliced(targetIdx, 0, removed[0])
})
}
diff --git a/packages/frontend-core/src/components/grid/stores/resize.js b/packages/frontend-core/src/components/grid/stores/resize.js
index 2dc9e0784c..157465e838 100644
--- a/packages/frontend-core/src/components/grid/stores/resize.js
+++ b/packages/frontend-core/src/components/grid/stores/resize.js
@@ -1,5 +1,6 @@
import { writable, get, derived } from "svelte/store"
import { MinColumnWidth, DefaultColumnWidth } from "../lib/constants"
+import { parseEventLocation } from "../lib/utils"
const initialState = {
initialMouseX: null,
@@ -24,8 +25,11 @@ export const createActions = context => {
// Starts resizing a certain column
const startResizing = (column, e) => {
+ const { x } = parseEventLocation(e)
+
// Prevent propagation to stop reordering triggering
e.stopPropagation()
+ e.preventDefault()
ui.actions.blur()
// Find and cache index
@@ -39,7 +43,7 @@ export const createActions = context => {
width: column.width,
left: column.left,
initialWidth: column.width,
- initialMouseX: e.clientX,
+ initialMouseX: x,
column: column.name,
columnIdx,
})
@@ -47,12 +51,16 @@ export const createActions = context => {
// Add mouse event listeners to handle resizing
document.addEventListener("mousemove", onResizeMouseMove)
document.addEventListener("mouseup", stopResizing)
+ document.addEventListener("touchmove", onResizeMouseMove)
+ document.addEventListener("touchend", stopResizing)
+ document.addEventListener("touchcancel", stopResizing)
}
// Handler for moving the mouse to resize columns
const onResizeMouseMove = e => {
const { initialMouseX, initialWidth, width, columnIdx } = get(resize)
- const dx = e.clientX - initialMouseX
+ const { x } = parseEventLocation(e)
+ const dx = x - initialMouseX
const newWidth = Math.round(Math.max(MinColumnWidth, initialWidth + dx))
// Ignore small changes
@@ -87,6 +95,9 @@ export const createActions = context => {
resize.set(initialState)
document.removeEventListener("mousemove", onResizeMouseMove)
document.removeEventListener("mouseup", stopResizing)
+ document.removeEventListener("touchmove", onResizeMouseMove)
+ document.removeEventListener("touchend", stopResizing)
+ document.removeEventListener("touchcancel", stopResizing)
// Persist width if it changed
if ($resize.width !== $resize.initialWidth) {
diff --git a/packages/frontend-core/src/components/grid/stores/rows.js b/packages/frontend-core/src/components/grid/stores/rows.js
index 5dc9413ccd..fc941ecc7f 100644
--- a/packages/frontend-core/src/components/grid/stores/rows.js
+++ b/packages/frontend-core/src/components/grid/stores/rows.js
@@ -196,6 +196,20 @@ export const createActions = context => {
// Handles validation errors from the rows API and updates local validation
// state, storing error messages against relevant cells
const handleValidationError = (rowId, error) => {
+ // If the server doesn't reply with a valid error, assume that the source
+ // of the error is the focused cell's column
+ if (!error?.json?.validationErrors && error?.message) {
+ const focusedColumn = get(focusedCellId)?.split("-")[1]
+ if (focusedColumn) {
+ error = {
+ json: {
+ validationErrors: {
+ [focusedColumn]: error.message,
+ },
+ },
+ }
+ }
+ }
if (error?.json?.validationErrors) {
// Normal validation errors
const keys = Object.keys(error.json.validationErrors)
@@ -214,11 +228,19 @@ export const createActions = context => {
// Process errors for columns that we have
for (let column of erroredColumns) {
+ // Ensure we have a valid error to display
+ let err = error.json.validationErrors[column]
+ if (Array.isArray(err)) {
+ err = err[0]
+ }
+ if (typeof err !== "string" || !err.length) {
+ error = "Something went wrong"
+ }
+ // Set error against the cell
validation.actions.setError(
`${rowId}-${column}`,
- `${column} ${error.json.validationErrors[column]}`
+ Helpers.capitalise(err)
)
-
// Ensure the column is visible
const index = $columns.findIndex(x => x.name === column)
if (index !== -1 && !$columns[index].visible) {
@@ -523,6 +545,7 @@ export const initialise = context => {
previousFocusedCellId,
rows,
validation,
+ focusedCellId,
} = context
// Wipe the row change cache when changing row
@@ -537,12 +560,22 @@ export const initialise = context => {
// Ensure any unsaved changes are saved when changing cell
previousFocusedCellId.subscribe(async id => {
- const rowId = id?.split("-")[0]
- const hasErrors = validation.actions.rowHasErrors(rowId)
- const hasChanges = Object.keys(get(rowChangeCache)[rowId] || {}).length > 0
- const isSavingChanges = get(inProgressChanges)[rowId]
- if (rowId && !hasErrors && hasChanges && !isSavingChanges) {
- await rows.actions.applyRowChanges(rowId)
+ if (!id) {
+ return
+ }
+ // Stop if we changed row
+ const oldRowId = id.split("-")[0]
+ const oldColumn = id.split("-")[1]
+ const newRowId = get(focusedCellId)?.split("-")[0]
+ if (oldRowId !== newRowId) {
+ return
+ }
+ // Otherwise we just changed cell in the same row
+ const hasChanges = oldColumn in (get(rowChangeCache)[oldRowId] || {})
+ const hasErrors = validation.actions.rowHasErrors(oldRowId)
+ const isSavingChanges = get(inProgressChanges)[oldRowId]
+ if (oldRowId && !hasErrors && hasChanges && !isSavingChanges) {
+ await rows.actions.applyRowChanges(oldRowId)
}
})
}
diff --git a/packages/frontend-core/src/components/grid/stores/ui.js b/packages/frontend-core/src/components/grid/stores/ui.js
index da0558bb5b..928f93f3e1 100644
--- a/packages/frontend-core/src/components/grid/stores/ui.js
+++ b/packages/frontend-core/src/components/grid/stores/ui.js
@@ -98,7 +98,7 @@ export const deriveStores = context => {
// Derive whether we should use the compact UI, depending on width
const compact = derived([stickyColumn, width], ([$stickyColumn, $width]) => {
- return ($stickyColumn?.width || 0) + $width + GutterWidth < 1100
+ return ($stickyColumn?.width || 0) + $width + GutterWidth < 800
})
return {
diff --git a/packages/frontend-core/src/components/grid/stores/viewport.js b/packages/frontend-core/src/components/grid/stores/viewport.js
index 8df8acd0f4..96a5a954ee 100644
--- a/packages/frontend-core/src/components/grid/stores/viewport.js
+++ b/packages/frontend-core/src/components/grid/stores/viewport.js
@@ -1,7 +1,6 @@
import { derived } from "svelte/store"
import {
- MaxCellRenderHeight,
- MaxCellRenderWidthOverflow,
+ MaxCellRenderOverflow,
MinColumnWidth,
ScrollBarSize,
} from "../lib/constants"
@@ -95,11 +94,11 @@ export const deriveStores = context => {
// Compute the last row index with space to render popovers below it
const minBottom =
- $height - ScrollBarSize * 3 - MaxCellRenderHeight + offset
+ $height - ScrollBarSize * 3 - MaxCellRenderOverflow + offset
const lastIdx = Math.floor(minBottom / $rowHeight)
// Compute the first row index with space to render popovers above it
- const minTop = MaxCellRenderHeight + offset
+ const minTop = MaxCellRenderOverflow + offset
const firstIdx = Math.ceil(minTop / $rowHeight)
// Use the greater of the two indices so that we prefer content below,
@@ -117,7 +116,7 @@ export const deriveStores = context => {
let inversionIdx = $visibleColumns.length
for (let i = $visibleColumns.length - 1; i >= 0; i--, inversionIdx--) {
const rightEdge = $visibleColumns[i].left + $visibleColumns[i].width
- if (rightEdge + MaxCellRenderWidthOverflow <= cutoff) {
+ if (rightEdge + MaxCellRenderOverflow <= cutoff) {
break
}
}
diff --git a/packages/frontend-core/src/constants.js b/packages/frontend-core/src/constants.js
index 95228c3bdc..7c0489d506 100644
--- a/packages/frontend-core/src/constants.js
+++ b/packages/frontend-core/src/constants.js
@@ -4,7 +4,7 @@
export { OperatorOptions, SqlNumberTypeRangeMap } from "@budibase/shared-core"
export { Feature as Features } from "@budibase/types"
import { BpmCorrelationKey } from "@budibase/shared-core"
-import { FieldType, FieldTypeSubtypes } from "@budibase/types"
+import { FieldType, BBReferenceFieldSubType } from "@budibase/types"
// Cookie names
export const Cookies = {
@@ -134,7 +134,7 @@ export const TypeIconMap = {
[FieldType.USER]: "User",
[FieldType.USERS]: "UserGroup",
[FieldType.BB_REFERENCE]: {
- [FieldTypeSubtypes.BB_REFERENCE.USER]: "User",
- [FieldTypeSubtypes.BB_REFERENCE.USERS]: "UserGroup",
+ [BBReferenceFieldSubType.USER]: "User",
+ [BBReferenceFieldSubType.USERS]: "UserGroup",
},
}
diff --git a/packages/frontend-core/src/utils/rows.js b/packages/frontend-core/src/utils/rows.js
index ea43d63734..50f676983d 100644
--- a/packages/frontend-core/src/utils/rows.js
+++ b/packages/frontend-core/src/utils/rows.js
@@ -8,6 +8,10 @@ const isBetterSample = (newValue, oldValue) => {
return true
}
+ if (oldValue != null && newValue == null) {
+ return false
+ }
+
// Don't change type
const oldType = typeof oldValue
const newType = typeof newValue
diff --git a/packages/pro b/packages/pro
index dff7b5a9dd..479879246a 160000
--- a/packages/pro
+++ b/packages/pro
@@ -1 +1 @@
-Subproject commit dff7b5a9dd1fd770f8a48fb8e6df1740be605f18
+Subproject commit 479879246aac5dd3073cc695945c62c41fae5b0e
diff --git a/packages/server/package.json b/packages/server/package.json
index b2ac4e7d43..5e25fd3fc5 100644
--- a/packages/server/package.json
+++ b/packages/server/package.json
@@ -98,7 +98,7 @@
"memorystream": "0.3.1",
"mongodb": "^6.3.0",
"mssql": "10.0.1",
- "mysql2": "3.5.2",
+ "mysql2": "3.9.7",
"node-fetch": "2.6.7",
"object-sizeof": "2.6.1",
"open": "8.4.0",
diff --git a/packages/server/src/api/routes/tests/datasource.spec.ts b/packages/server/src/api/routes/tests/datasource.spec.ts
index d5c0a256a1..761300c37a 100644
--- a/packages/server/src/api/routes/tests/datasource.spec.ts
+++ b/packages/server/src/api/routes/tests/datasource.spec.ts
@@ -9,7 +9,7 @@ import { mocks } from "@budibase/backend-core/tests"
import {
Datasource,
FieldSchema,
- FieldSubtype,
+ BBReferenceFieldSubType,
FieldType,
QueryPreview,
RelationshipType,
@@ -337,7 +337,7 @@ describe("/datasources", () => {
[FieldType.BB_REFERENCE]: {
name: "bb_reference",
type: FieldType.BB_REFERENCE,
- subtype: FieldSubtype.USERS,
+ subtype: BBReferenceFieldSubType.USERS,
},
}
diff --git a/packages/server/src/api/routes/tests/row.spec.ts b/packages/server/src/api/routes/tests/row.spec.ts
index 8e1014f825..5e30c1b4cc 100644
--- a/packages/server/src/api/routes/tests/row.spec.ts
+++ b/packages/server/src/api/routes/tests/row.spec.ts
@@ -13,7 +13,7 @@ import {
DeleteRow,
FieldSchema,
FieldType,
- FieldTypeSubtypes,
+ BBReferenceFieldSubType,
FormulaType,
INTERNAL_TABLE_SOURCE_ID,
NumberFieldMetadata,
@@ -1015,12 +1015,12 @@ describe.each([
user: {
name: "user",
type: FieldType.BB_REFERENCE,
- subtype: FieldTypeSubtypes.BB_REFERENCE.USER,
+ subtype: BBReferenceFieldSubType.USER,
},
users: {
name: "users",
type: FieldType.BB_REFERENCE,
- subtype: FieldTypeSubtypes.BB_REFERENCE.USERS,
+ subtype: BBReferenceFieldSubType.USERS,
},
}),
() => config.createUser(),
diff --git a/packages/server/src/api/routes/tests/search.spec.ts b/packages/server/src/api/routes/tests/search.spec.ts
index 698ea0c10b..931510a88f 100644
--- a/packages/server/src/api/routes/tests/search.spec.ts
+++ b/packages/server/src/api/routes/tests/search.spec.ts
@@ -3,6 +3,7 @@ import { DatabaseName, getDatasource } from "../../../integrations/tests/utils"
import * as setup from "./utilities"
import {
+ AutoFieldSubType,
Datasource,
EmptyFilterOption,
FieldType,
@@ -18,15 +19,16 @@ import _ from "lodash"
jest.unmock("mssql")
describe.each([
- ["internal", undefined],
- ["internal-sqs", 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)],
])("/api/:sourceId/search (%s)", (name, dsProvider) => {
- const isSqs = name === "internal-sqs"
- const isInternal = name === "internal"
+ const isSqs = name === "sqs"
+ const isLucene = name === "lucene"
+ const isInternal = isSqs || isLucene
const config = setup.getConfig()
let envCleanup: (() => void) | undefined
@@ -59,7 +61,9 @@ describe.each([
}
async function createRows(rows: Record
[]) {
- await Promise.all(rows.map(r => config.api.row.save(table._id!, r)))
+ for (const row of rows) {
+ await config.api.row.save(table._id!, row)
+ }
}
class SearchAssertion {
@@ -339,14 +343,14 @@ describe.each([
}).toFindNothing())
// We never implemented half-open ranges in Lucene.
- !isInternal &&
+ !isLucene &&
it("can search using just a low value", () =>
expectQuery({
range: { age: { low: 5 } },
}).toContainExactly([{ age: 10 }]))
// We never implemented half-open ranges in Lucene.
- !isInternal &&
+ !isLucene &&
it("can search using just a high value", () =>
expectQuery({
range: { age: { high: 5 } },
@@ -457,14 +461,14 @@ describe.each([
}).toFindNothing())
// We never implemented half-open ranges in Lucene.
- !isInternal &&
+ !isLucene &&
it("can search using just a low value", () =>
expectQuery({
range: { dob: { low: JAN_5TH } },
}).toContainExactly([{ dob: JAN_10TH }]))
// We never implemented half-open ranges in Lucene.
- !isInternal &&
+ !isLucene &&
it("can search using just a high value", () =>
expectQuery({
range: { dob: { high: JAN_5TH } },
@@ -642,7 +646,7 @@ describe.each([
// Range searches against bigints don't seem to work at all in Lucene, and I
// couldn't figure out why. Given that we're replacing Lucene with SQS,
// we've decided not to spend time on it.
- !isInternal &&
+ !isLucene &&
describe("range", () => {
it("successfully finds a row", () =>
expectQuery({
@@ -675,4 +679,137 @@ describe.each([
}).toContainExactly([{ num: SMALL }, { num: MEDIUM }]))
})
})
+
+ isInternal &&
+ describe("auto", () => {
+ beforeAll(async () => {
+ await createTable({
+ auto: {
+ name: "auto",
+ type: FieldType.AUTO,
+ autocolumn: true,
+ subtype: AutoFieldSubType.AUTO_ID,
+ },
+ })
+ await createRows(new Array(10).fill({}))
+ })
+
+ describe("equal", () => {
+ it("successfully finds a row", () =>
+ expectQuery({ equal: { auto: 1 } }).toContainExactly([{ auto: 1 }]))
+
+ it("fails to find nonexistent row", () =>
+ expectQuery({ equal: { auto: 0 } }).toFindNothing())
+ })
+
+ describe("not equal", () => {
+ it("successfully finds a row", () =>
+ expectQuery({ notEqual: { auto: 1 } }).toContainExactly([
+ { auto: 2 },
+ { auto: 3 },
+ { auto: 4 },
+ { auto: 5 },
+ { auto: 6 },
+ { auto: 7 },
+ { auto: 8 },
+ { auto: 9 },
+ { auto: 10 },
+ ]))
+
+ it("fails to find nonexistent row", () =>
+ expectQuery({ notEqual: { auto: 0 } }).toContainExactly([
+ { auto: 1 },
+ { auto: 2 },
+ { auto: 3 },
+ { auto: 4 },
+ { auto: 5 },
+ { auto: 6 },
+ { auto: 7 },
+ { auto: 8 },
+ { auto: 9 },
+ { auto: 10 },
+ ]))
+ })
+
+ describe("oneOf", () => {
+ it("successfully finds a row", () =>
+ expectQuery({ oneOf: { auto: [1] } }).toContainExactly([{ auto: 1 }]))
+
+ it("fails to find nonexistent row", () =>
+ expectQuery({ oneOf: { auto: [0] } }).toFindNothing())
+ })
+
+ describe("range", () => {
+ it("successfully finds a row", () =>
+ expectQuery({
+ range: { auto: { low: 1, high: 1 } },
+ }).toContainExactly([{ auto: 1 }]))
+
+ it("successfully finds multiple rows", () =>
+ expectQuery({
+ range: { auto: { low: 1, high: 2 } },
+ }).toContainExactly([{ auto: 1 }, { auto: 2 }]))
+
+ it("successfully finds a row with a high bound", () =>
+ expectQuery({
+ range: { auto: { low: 2, high: 2 } },
+ }).toContainExactly([{ auto: 2 }]))
+
+ it("successfully finds no rows", () =>
+ expectQuery({
+ range: { auto: { low: 0, high: 0 } },
+ }).toFindNothing())
+
+ isSqs &&
+ it("can search using just a low value", () =>
+ expectQuery({
+ range: { auto: { low: 9 } },
+ }).toContainExactly([{ auto: 9 }, { auto: 10 }]))
+
+ isSqs &&
+ it("can search using just a high value", () =>
+ expectQuery({
+ range: { auto: { high: 2 } },
+ }).toContainExactly([{ auto: 1 }, { auto: 2 }]))
+ })
+
+ isSqs &&
+ describe("sort", () => {
+ it("sorts ascending", () =>
+ expectSearch({
+ query: {},
+ sort: "auto",
+ sortOrder: SortOrder.ASCENDING,
+ }).toMatchExactly([
+ { auto: 1 },
+ { auto: 2 },
+ { auto: 3 },
+ { auto: 4 },
+ { auto: 5 },
+ { auto: 6 },
+ { auto: 7 },
+ { auto: 8 },
+ { auto: 9 },
+ { auto: 10 },
+ ]))
+
+ it("sorts descending", () =>
+ expectSearch({
+ query: {},
+ sort: "auto",
+ sortOrder: SortOrder.DESCENDING,
+ }).toMatchExactly([
+ { auto: 10 },
+ { auto: 9 },
+ { auto: 8 },
+ { auto: 7 },
+ { auto: 6 },
+ { auto: 5 },
+ { auto: 4 },
+ { auto: 3 },
+ { auto: 2 },
+ { auto: 1 },
+ ]))
+ })
+ })
})
diff --git a/packages/server/src/api/routes/tests/table.spec.ts b/packages/server/src/api/routes/tests/table.spec.ts
index ede1e7af94..9aabffd8b9 100644
--- a/packages/server/src/api/routes/tests/table.spec.ts
+++ b/packages/server/src/api/routes/tests/table.spec.ts
@@ -2,7 +2,7 @@ import { context, events } from "@budibase/backend-core"
import {
AutoFieldSubType,
Datasource,
- FieldSubtype,
+ BBReferenceFieldSubType,
FieldType,
INTERNAL_TABLE_SOURCE_ID,
InternalTable,
@@ -497,7 +497,7 @@ describe.each([
newColumn: {
name: "user column",
type: FieldType.BB_REFERENCE,
- subtype: FieldSubtype.USER,
+ subtype: BBReferenceFieldSubType.USER,
},
})
@@ -562,7 +562,7 @@ describe.each([
newColumn: {
name: "user column",
type: FieldType.BB_REFERENCE,
- subtype: FieldSubtype.USERS,
+ subtype: BBReferenceFieldSubType.USERS,
},
})
@@ -614,7 +614,7 @@ describe.each([
newColumn: {
name: "user column",
type: FieldType.BB_REFERENCE,
- subtype: FieldSubtype.USERS,
+ subtype: BBReferenceFieldSubType.USERS,
},
})
@@ -669,7 +669,7 @@ describe.each([
newColumn: {
name: "user column",
type: FieldType.BB_REFERENCE,
- subtype: FieldSubtype.USERS,
+ subtype: BBReferenceFieldSubType.USERS,
},
})
@@ -728,7 +728,7 @@ describe.each([
newColumn: {
name: "",
type: FieldType.BB_REFERENCE,
- subtype: FieldSubtype.USERS,
+ subtype: BBReferenceFieldSubType.USERS,
},
},
{ status: 400 }
@@ -743,7 +743,7 @@ describe.each([
newColumn: {
name: "_id",
type: FieldType.BB_REFERENCE,
- subtype: FieldSubtype.USERS,
+ subtype: BBReferenceFieldSubType.USERS,
},
},
{ status: 400 }
@@ -758,7 +758,7 @@ describe.each([
newColumn: {
name: "num",
type: FieldType.BB_REFERENCE,
- subtype: FieldSubtype.USERS,
+ subtype: BBReferenceFieldSubType.USERS,
},
},
{ status: 400 }
@@ -772,12 +772,12 @@ describe.each([
oldColumn: {
name: "not a column",
type: FieldType.BB_REFERENCE,
- subtype: FieldSubtype.USERS,
+ subtype: BBReferenceFieldSubType.USERS,
},
newColumn: {
name: "new column",
type: FieldType.BB_REFERENCE,
- subtype: FieldSubtype.USERS,
+ subtype: BBReferenceFieldSubType.USERS,
},
},
{ status: 400 }
diff --git a/packages/server/src/integrations/base/sql.ts b/packages/server/src/integrations/base/sql.ts
index 28b7eb910b..ae3e8e8aea 100644
--- a/packages/server/src/integrations/base/sql.ts
+++ b/packages/server/src/integrations/base/sql.ts
@@ -12,7 +12,7 @@ import SqlTableQueryBuilder from "./sqlTable"
import {
BBReferenceFieldMetadata,
FieldSchema,
- FieldSubtype,
+ BBReferenceFieldSubType,
FieldType,
JsonFieldMetadata,
Operation,
@@ -767,7 +767,7 @@ class SqlQueryBuilder extends SqlTableQueryBuilder {
return (
field.type === FieldType.JSON ||
(field.type === FieldType.BB_REFERENCE &&
- field.subtype === FieldSubtype.USERS)
+ field.subtype === BBReferenceFieldSubType.USERS)
)
}
diff --git a/packages/server/src/integrations/base/sqlTable.ts b/packages/server/src/integrations/base/sqlTable.ts
index 3c55d75b8b..449736a03b 100644
--- a/packages/server/src/integrations/base/sqlTable.ts
+++ b/packages/server/src/integrations/base/sqlTable.ts
@@ -1,6 +1,6 @@
import { Knex, knex } from "knex"
import {
- FieldSubtype,
+ BBReferenceFieldSubType,
FieldType,
NumberFieldMetadata,
Operation,
@@ -64,10 +64,10 @@ function generateSchema(
case FieldType.BB_REFERENCE: {
const subtype = column.subtype
switch (subtype) {
- case FieldSubtype.USER:
+ case BBReferenceFieldSubType.USER:
schema.text(key)
break
- case FieldSubtype.USERS:
+ case BBReferenceFieldSubType.USERS:
schema.json(key)
break
default:
diff --git a/packages/server/src/integrations/tests/utils/index.ts b/packages/server/src/integrations/tests/utils/index.ts
index 5034b5a8db..a54d0ac1a7 100644
--- a/packages/server/src/integrations/tests/utils/index.ts
+++ b/packages/server/src/integrations/tests/utils/index.ts
@@ -65,9 +65,7 @@ export async function rawQuery(ds: Datasource, sql: string): Promise {
}
export async function startContainer(container: GenericContainer) {
- if (process.env.REUSE_CONTAINERS) {
- container = container.withReuse()
- }
+ container = container.withReuse().withLabels({ "com.budibase": "true" })
const startedContainer = await container.start()
diff --git a/packages/server/src/sdk/app/rows/search/tests/utils.spec.ts b/packages/server/src/sdk/app/rows/search/tests/utils.spec.ts
index bf7799402d..18dc4ef3f0 100644
--- a/packages/server/src/sdk/app/rows/search/tests/utils.spec.ts
+++ b/packages/server/src/sdk/app/rows/search/tests/utils.spec.ts
@@ -2,7 +2,7 @@ import { searchInputMapping } from "../utils"
import { db as dbCore } from "@budibase/backend-core"
import {
FieldType,
- FieldTypeSubtypes,
+ BBReferenceFieldSubType,
INTERNAL_TABLE_SOURCE_ID,
RowSearchParams,
Table,
@@ -20,7 +20,7 @@ const tableWithUserCol: Table = {
user: {
name: "user",
type: FieldType.BB_REFERENCE,
- subtype: FieldTypeSubtypes.BB_REFERENCE.USER,
+ subtype: BBReferenceFieldSubType.USER,
},
},
}
@@ -35,7 +35,7 @@ const tableWithUsersCol: Table = {
user: {
name: "user",
type: FieldType.BB_REFERENCE,
- subtype: FieldTypeSubtypes.BB_REFERENCE.USERS,
+ subtype: BBReferenceFieldSubType.USERS,
},
},
}
diff --git a/packages/server/src/sdk/app/rows/search/utils.ts b/packages/server/src/sdk/app/rows/search/utils.ts
index 828925f8b6..fc0c218e71 100644
--- a/packages/server/src/sdk/app/rows/search/utils.ts
+++ b/packages/server/src/sdk/app/rows/search/utils.ts
@@ -3,7 +3,7 @@ import {
Table,
DocumentType,
SEPARATOR,
- FieldSubtype,
+ BBReferenceFieldSubType,
SearchFilters,
SearchIndex,
SearchResponse,
@@ -89,8 +89,8 @@ export function searchInputMapping(table: Table, options: RowSearchParams) {
case FieldType.BB_REFERENCE: {
const subtype = column.subtype
switch (subtype) {
- case FieldSubtype.USER:
- case FieldSubtype.USERS:
+ case BBReferenceFieldSubType.USER:
+ case BBReferenceFieldSubType.USERS:
userColumnMapping(key, options)
break
default:
diff --git a/packages/server/src/sdk/app/tables/internal/sqs.ts b/packages/server/src/sdk/app/tables/internal/sqs.ts
index 51e3f17bca..d10a7d447b 100644
--- a/packages/server/src/sdk/app/tables/internal/sqs.ts
+++ b/packages/server/src/sdk/app/tables/internal/sqs.ts
@@ -33,7 +33,7 @@ const FieldTypeMap: Record = {
[FieldType.LONGFORM]: SQLiteType.TEXT,
[FieldType.NUMBER]: SQLiteType.REAL,
[FieldType.STRING]: SQLiteType.TEXT,
- [FieldType.AUTO]: SQLiteType.TEXT,
+ [FieldType.AUTO]: SQLiteType.REAL,
[FieldType.OPTIONS]: SQLiteType.TEXT,
[FieldType.JSON]: SQLiteType.BLOB,
[FieldType.INTERNAL]: SQLiteType.BLOB,
diff --git a/packages/server/src/sdk/app/tables/migration.ts b/packages/server/src/sdk/app/tables/migration.ts
index e282251bfb..ae47897289 100644
--- a/packages/server/src/sdk/app/tables/migration.ts
+++ b/packages/server/src/sdk/app/tables/migration.ts
@@ -2,7 +2,7 @@ import { BadRequestError, context, db as dbCore } from "@budibase/backend-core"
import {
BBReferenceFieldMetadata,
FieldSchema,
- FieldSubtype,
+ BBReferenceFieldSubType,
InternalTable,
isBBReferenceField,
isRelationshipField,
@@ -96,7 +96,7 @@ function getColumnMigrator(
}
if (oldColumn.relationshipType === RelationshipType.ONE_TO_MANY) {
- if (newColumn.subtype !== FieldSubtype.USER) {
+ if (newColumn.subtype !== BBReferenceFieldSubType.USER) {
throw new BadRequestError(
`Column "${oldColumn.name}" is a one-to-many column but "${newColumn.name}" is not a single user column`
)
@@ -107,7 +107,7 @@ function getColumnMigrator(
oldColumn.relationshipType === RelationshipType.MANY_TO_MANY ||
oldColumn.relationshipType === RelationshipType.MANY_TO_ONE
) {
- if (newColumn.subtype !== FieldSubtype.USERS) {
+ if (newColumn.subtype !== BBReferenceFieldSubType.USERS) {
throw new BadRequestError(
`Column "${oldColumn.name}" is a ${oldColumn.relationshipType} column but "${newColumn.name}" is not a multi user column`
)
diff --git a/packages/server/src/utilities/rowProcessor/bbReferenceProcessor.ts b/packages/server/src/utilities/rowProcessor/bbReferenceProcessor.ts
index a5fbfa981d..0908d6b031 100644
--- a/packages/server/src/utilities/rowProcessor/bbReferenceProcessor.ts
+++ b/packages/server/src/utilities/rowProcessor/bbReferenceProcessor.ts
@@ -1,13 +1,17 @@
import { cache, db as dbCore } from "@budibase/backend-core"
import { utils } from "@budibase/shared-core"
-import { FieldSubtype, DocumentType, SEPARATOR } from "@budibase/types"
+import {
+ BBReferenceFieldSubType,
+ DocumentType,
+ SEPARATOR,
+} from "@budibase/types"
import { InvalidBBRefError } from "./errors"
const ROW_PREFIX = DocumentType.ROW + SEPARATOR
export async function processInputBBReferences(
value: string | string[] | { _id: string } | { _id: string }[],
- subtype: FieldSubtype.USER | FieldSubtype.USERS
+ subtype: BBReferenceFieldSubType.USER | BBReferenceFieldSubType.USERS
): Promise {
let referenceIds: string[] = []
@@ -40,15 +44,18 @@ export async function processInputBBReferences(
})
switch (subtype) {
- case FieldSubtype.USER:
- case FieldSubtype.USERS: {
+ case BBReferenceFieldSubType.USER:
+ case BBReferenceFieldSubType.USERS: {
const { notFoundIds } = await cache.user.getUsers(referenceIds)
if (notFoundIds?.length) {
- throw new InvalidBBRefError(notFoundIds[0], FieldSubtype.USER)
+ throw new InvalidBBRefError(
+ notFoundIds[0],
+ BBReferenceFieldSubType.USER
+ )
}
- if (subtype === FieldSubtype.USERS) {
+ if (subtype === BBReferenceFieldSubType.USERS) {
return referenceIds
}
@@ -61,7 +68,7 @@ export async function processInputBBReferences(
export async function processOutputBBReferences(
value: string | string[],
- subtype: FieldSubtype.USER | FieldSubtype.USERS
+ subtype: BBReferenceFieldSubType.USER | BBReferenceFieldSubType.USERS
) {
if (value === null || value === undefined) {
// Already processed or nothing to process
@@ -72,8 +79,8 @@ export async function processOutputBBReferences(
typeof value === "string" ? value.split(",").filter(id => !!id) : value
switch (subtype) {
- case FieldSubtype.USER:
- case FieldSubtype.USERS: {
+ case BBReferenceFieldSubType.USER:
+ case BBReferenceFieldSubType.USERS: {
const { users } = await cache.user.getUsers(ids)
if (!users.length) {
return undefined
diff --git a/packages/server/src/utilities/rowProcessor/errors.ts b/packages/server/src/utilities/rowProcessor/errors.ts
index 279a528b5f..12b32d098a 100644
--- a/packages/server/src/utilities/rowProcessor/errors.ts
+++ b/packages/server/src/utilities/rowProcessor/errors.ts
@@ -1,7 +1,7 @@
-import { FieldSubtype } from "@budibase/types"
+import { BBReferenceFieldSubType } from "@budibase/types"
export class InvalidBBRefError extends Error {
- constructor(id: string, subtype: FieldSubtype) {
+ constructor(id: string, subtype: BBReferenceFieldSubType) {
super(`Id "${id}" is not valid for the subtype "${subtype}"`)
}
}
diff --git a/packages/server/src/utilities/rowProcessor/tests/bbReferenceProcessor.spec.ts b/packages/server/src/utilities/rowProcessor/tests/bbReferenceProcessor.spec.ts
index e6ceaae323..8d691662fb 100644
--- a/packages/server/src/utilities/rowProcessor/tests/bbReferenceProcessor.spec.ts
+++ b/packages/server/src/utilities/rowProcessor/tests/bbReferenceProcessor.spec.ts
@@ -1,6 +1,6 @@
import _ from "lodash"
import * as backendCore from "@budibase/backend-core"
-import { FieldSubtype, User } from "@budibase/types"
+import { BBReferenceFieldSubType, User } from "@budibase/types"
import {
processInputBBReferences,
processOutputBBReferences,
@@ -63,7 +63,7 @@ describe("bbReferenceProcessor", () => {
const userId = user!._id!
const result = await config.doInTenant(() =>
- processInputBBReferences(userId, FieldSubtype.USER)
+ processInputBBReferences(userId, BBReferenceFieldSubType.USER)
)
expect(result).toEqual(userId)
@@ -76,9 +76,11 @@ describe("bbReferenceProcessor", () => {
await expect(
config.doInTenant(() =>
- processInputBBReferences(userId, FieldSubtype.USER)
+ processInputBBReferences(userId, BBReferenceFieldSubType.USER)
)
- ).rejects.toThrow(new InvalidBBRefError(userId, FieldSubtype.USER))
+ ).rejects.toThrow(
+ new InvalidBBRefError(userId, BBReferenceFieldSubType.USER)
+ )
expect(cacheGetUsersSpy).toHaveBeenCalledTimes(1)
expect(cacheGetUsersSpy).toHaveBeenCalledWith([userId])
})
@@ -88,7 +90,7 @@ describe("bbReferenceProcessor", () => {
const userIdCsv = userIds.join(" , ")
const result = await config.doInTenant(() =>
- processInputBBReferences(userIdCsv, FieldSubtype.USER)
+ processInputBBReferences(userIdCsv, BBReferenceFieldSubType.USER)
)
expect(result).toEqual(userIds.join(","))
@@ -108,16 +110,21 @@ describe("bbReferenceProcessor", () => {
await expect(
config.doInTenant(() =>
- processInputBBReferences(userIdCsv, FieldSubtype.USER)
+ processInputBBReferences(userIdCsv, BBReferenceFieldSubType.USER)
)
- ).rejects.toThrow(new InvalidBBRefError(wrongId, FieldSubtype.USER))
+ ).rejects.toThrow(
+ new InvalidBBRefError(wrongId, BBReferenceFieldSubType.USER)
+ )
})
it("validate valid user object", async () => {
const userId = _.sample(users)!._id!
const result = await config.doInTenant(() =>
- processInputBBReferences({ _id: userId }, FieldSubtype.USER)
+ processInputBBReferences(
+ { _id: userId },
+ BBReferenceFieldSubType.USER
+ )
)
expect(result).toEqual(userId)
@@ -129,7 +136,7 @@ describe("bbReferenceProcessor", () => {
const userIds = _.sampleSize(users, 3).map(x => x._id!)
const result = await config.doInTenant(() =>
- processInputBBReferences(userIds, FieldSubtype.USER)
+ processInputBBReferences(userIds, BBReferenceFieldSubType.USER)
)
expect(result).toEqual(userIds.join(","))
@@ -139,7 +146,7 @@ describe("bbReferenceProcessor", () => {
it("empty strings will return null", async () => {
const result = await config.doInTenant(() =>
- processInputBBReferences("", FieldSubtype.USER)
+ processInputBBReferences("", BBReferenceFieldSubType.USER)
)
expect(result).toEqual(null)
@@ -147,7 +154,7 @@ describe("bbReferenceProcessor", () => {
it("empty arrays will return null", async () => {
const result = await config.doInTenant(() =>
- processInputBBReferences([], FieldSubtype.USER)
+ processInputBBReferences([], BBReferenceFieldSubType.USER)
)
expect(result).toEqual(null)
@@ -157,7 +164,7 @@ describe("bbReferenceProcessor", () => {
const userId = _.sample(users)!._id!
const userMetadataId = backendCore.db.generateUserMetadataID(userId)
const result = await config.doInTenant(() =>
- processInputBBReferences(userMetadataId, FieldSubtype.USER)
+ processInputBBReferences(userMetadataId, BBReferenceFieldSubType.USER)
)
expect(result).toBe(userId)
})
@@ -171,7 +178,7 @@ describe("bbReferenceProcessor", () => {
const userId = user._id!
const result = await config.doInTenant(() =>
- processOutputBBReferences(userId, FieldSubtype.USER)
+ processOutputBBReferences(userId, BBReferenceFieldSubType.USER)
)
expect(result).toEqual([
@@ -195,7 +202,7 @@ describe("bbReferenceProcessor", () => {
const result = await config.doInTenant(() =>
processOutputBBReferences(
[userId1, userId2].join(","),
- FieldSubtype.USER
+ BBReferenceFieldSubType.USER
)
)
diff --git a/packages/server/src/utilities/rowProcessor/tests/inputProcessing.spec.ts b/packages/server/src/utilities/rowProcessor/tests/inputProcessing.spec.ts
index 859a203133..7e808f0d61 100644
--- a/packages/server/src/utilities/rowProcessor/tests/inputProcessing.spec.ts
+++ b/packages/server/src/utilities/rowProcessor/tests/inputProcessing.spec.ts
@@ -2,7 +2,7 @@ import { inputProcessing } from ".."
import { generator, structures } from "@budibase/backend-core/tests"
import {
FieldType,
- FieldTypeSubtypes,
+ BBReferenceFieldSubType,
INTERNAL_TABLE_SOURCE_ID,
Table,
TableSourceType,
@@ -39,7 +39,7 @@ describe("rowProcessor - inputProcessing", () => {
},
user: {
type: FieldType.BB_REFERENCE,
- subtype: FieldTypeSubtypes.BB_REFERENCE.USER,
+ subtype: BBReferenceFieldSubType.USER,
name: "user",
constraints: {
presence: true,
@@ -93,7 +93,7 @@ describe("rowProcessor - inputProcessing", () => {
},
user: {
type: FieldType.BB_REFERENCE,
- subtype: FieldTypeSubtypes.BB_REFERENCE.USER,
+ subtype: BBReferenceFieldSubType.USER,
name: "user",
constraints: {
presence: false,
@@ -135,7 +135,7 @@ describe("rowProcessor - inputProcessing", () => {
},
user: {
type: FieldType.BB_REFERENCE,
- subtype: FieldTypeSubtypes.BB_REFERENCE.USER,
+ subtype: BBReferenceFieldSubType.USER,
name: "user",
constraints: {
presence: false,
diff --git a/packages/server/src/utilities/rowProcessor/tests/outputProcessing.spec.ts b/packages/server/src/utilities/rowProcessor/tests/outputProcessing.spec.ts
index 74d55aff36..b1a20acba5 100644
--- a/packages/server/src/utilities/rowProcessor/tests/outputProcessing.spec.ts
+++ b/packages/server/src/utilities/rowProcessor/tests/outputProcessing.spec.ts
@@ -1,7 +1,6 @@
import {
- FieldSubtype,
FieldType,
- FieldTypeSubtypes,
+ BBReferenceFieldSubType,
INTERNAL_TABLE_SOURCE_ID,
RowAttachment,
Table,
@@ -42,7 +41,7 @@ describe("rowProcessor - outputProcessing", () => {
},
user: {
type: FieldType.BB_REFERENCE,
- subtype: FieldTypeSubtypes.BB_REFERENCE.USER,
+ subtype: BBReferenceFieldSubType.USER,
name: "user",
constraints: {
presence: false,
@@ -69,7 +68,7 @@ describe("rowProcessor - outputProcessing", () => {
).toHaveBeenCalledTimes(1)
expect(bbReferenceProcessor.processOutputBBReferences).toHaveBeenCalledWith(
"123",
- FieldSubtype.USER
+ BBReferenceFieldSubType.USER
)
})
@@ -175,7 +174,7 @@ describe("rowProcessor - outputProcessing", () => {
},
user: {
type: FieldType.BB_REFERENCE,
- subtype: FieldTypeSubtypes.BB_REFERENCE.USER,
+ subtype: BBReferenceFieldSubType.USER,
name: "user",
constraints: {
presence: false,
diff --git a/packages/server/src/utilities/schema.ts b/packages/server/src/utilities/schema.ts
index 4c7f0b7423..40bde42a5d 100644
--- a/packages/server/src/utilities/schema.ts
+++ b/packages/server/src/utilities/schema.ts
@@ -1,6 +1,6 @@
import {
FieldType,
- FieldSubtype,
+ BBReferenceFieldSubType,
TableSchema,
FieldSchema,
Row,
@@ -137,10 +137,10 @@ export function parse(rows: Rows, schema: TableSchema): Rows {
parsedRow[columnName] = undefined
} else {
switch (columnSubtype) {
- case FieldSubtype.USER:
+ case BBReferenceFieldSubType.USER:
parsedRow[columnName] = parsedValues[0]?._id
break
- case FieldSubtype.USERS:
+ case BBReferenceFieldSubType.USERS:
parsedRow[columnName] = parsedValues.map(u => u._id)
break
default:
@@ -164,11 +164,11 @@ export function parse(rows: Rows, schema: TableSchema): Rows {
function isValidBBReference(
columnData: any,
- columnSubtype: FieldSubtype.USER | FieldSubtype.USERS
+ columnSubtype: BBReferenceFieldSubType.USER | BBReferenceFieldSubType.USERS
): boolean {
switch (columnSubtype) {
- case FieldSubtype.USER:
- case FieldSubtype.USERS: {
+ case BBReferenceFieldSubType.USER:
+ case BBReferenceFieldSubType.USERS: {
if (typeof columnData !== "string") {
return false
}
@@ -177,7 +177,10 @@ function isValidBBReference(
return false
}
- if (columnSubtype === FieldSubtype.USER && userArray.length > 1) {
+ if (
+ columnSubtype === BBReferenceFieldSubType.USER &&
+ userArray.length > 1
+ ) {
return false
}
diff --git a/packages/shared-core/src/filters.ts b/packages/shared-core/src/filters.ts
index 0554e0c1e4..05b1efe0fc 100644
--- a/packages/shared-core/src/filters.ts
+++ b/packages/shared-core/src/filters.ts
@@ -1,6 +1,6 @@
import {
Datasource,
- FieldSubtype,
+ BBReferenceFieldSubType,
FieldType,
FormulaType,
SearchFilter,
@@ -22,7 +22,7 @@ const HBS_REGEX = /{{([^{].*?)}}/g
export const getValidOperatorsForType = (
fieldType: {
type: FieldType
- subtype?: FieldSubtype
+ subtype?: BBReferenceFieldSubType
formulaType?: FormulaType
},
field: string,
@@ -68,9 +68,15 @@ export const getValidOperatorsForType = (
ops = numOps
} else if (type === FieldType.FORMULA && formulaType === FormulaType.STATIC) {
ops = stringOps.concat([Op.MoreThan, Op.LessThan])
- } else if (type === FieldType.BB_REFERENCE && subtype == FieldSubtype.USER) {
+ } else if (
+ type === FieldType.BB_REFERENCE &&
+ subtype == BBReferenceFieldSubType.USER
+ ) {
ops = [Op.Equals, Op.NotEquals, Op.Empty, Op.NotEmpty, Op.In]
- } else if (type === FieldType.BB_REFERENCE && subtype == FieldSubtype.USERS) {
+ } else if (
+ type === FieldType.BB_REFERENCE &&
+ subtype == BBReferenceFieldSubType.USERS
+ ) {
ops = [Op.Contains, Op.NotContains, Op.ContainsAny, Op.Empty, Op.NotEmpty]
}
diff --git a/packages/types/src/documents/app/row.ts b/packages/types/src/documents/app/row.ts
index 865ab4ba64..d6a9bb7842 100644
--- a/packages/types/src/documents/app/row.ts
+++ b/packages/types/src/documents/app/row.ts
@@ -124,16 +124,3 @@ export interface Row extends Document {
_viewId?: string
[key: string]: any
}
-
-export enum FieldSubtype {
- USER = "user",
- USERS = "users",
-}
-
-// The 'as' are required for typescript not to type the outputs as generic FieldSubtype
-export const FieldTypeSubtypes = {
- BB_REFERENCE: {
- USER: FieldSubtype.USER as FieldSubtype.USER,
- USERS: FieldSubtype.USERS as FieldSubtype.USERS,
- },
-}
diff --git a/packages/types/src/documents/app/table/constants.ts b/packages/types/src/documents/app/table/constants.ts
index 1d9d14695a..ddf8b5e6ea 100644
--- a/packages/types/src/documents/app/table/constants.ts
+++ b/packages/types/src/documents/app/table/constants.ts
@@ -24,3 +24,8 @@ export enum FormulaType {
STATIC = "static",
DYNAMIC = "dynamic",
}
+
+export enum BBReferenceFieldSubType {
+ USER = "user",
+ USERS = "users",
+}
diff --git a/packages/types/src/documents/app/table/schema.ts b/packages/types/src/documents/app/table/schema.ts
index 63a5876bc0..18fbeae719 100644
--- a/packages/types/src/documents/app/table/schema.ts
+++ b/packages/types/src/documents/app/table/schema.ts
@@ -1,9 +1,10 @@
// all added by grid/table when defining the
// column size, position and whether it can be viewed
-import { FieldSubtype, FieldType } from "../row"
+import { FieldType } from "../row"
import {
AutoFieldSubType,
AutoReason,
+ BBReferenceFieldSubType,
FormulaType,
JsonFieldSubType,
RelationshipType,
@@ -109,7 +110,7 @@ export interface FormulaFieldMetadata extends BaseFieldSchema {
export interface BBReferenceFieldMetadata
extends Omit {
type: FieldType.BB_REFERENCE
- subtype: FieldSubtype.USER | FieldSubtype.USERS
+ subtype: BBReferenceFieldSubType.USER | BBReferenceFieldSubType.USERS
relationshipType?: RelationshipType
}
diff --git a/packages/types/src/sdk/licensing/plan.ts b/packages/types/src/sdk/licensing/plan.ts
index 016caf8c38..af682cbad1 100644
--- a/packages/types/src/sdk/licensing/plan.ts
+++ b/packages/types/src/sdk/licensing/plan.ts
@@ -11,6 +11,7 @@ export enum PlanType {
/** @deprecated */
BUSINESS = "business",
ENTERPRISE_BASIC = "enterprise_basic",
+ ENTERPRISE_BASIC_TRIAL = "enterprise_basic_trial",
ENTERPRISE = "enterprise",
}
diff --git a/scripts/killTestcontainers.sh b/scripts/killTestcontainers.sh
new file mode 100755
index 0000000000..773d01a962
--- /dev/null
+++ b/scripts/killTestcontainers.sh
@@ -0,0 +1,19 @@
+#!/bin/bash
+
+# Find all Docker containers with the label "org.testcontainers=true"
+containers=$(docker ps -q -f "label=org.testcontainers=true")
+
+# Check if there are any containers to stop
+if [ -z "$containers" ]; then
+ echo "No containers with label 'org.testcontainers=true' found."
+else
+ # Stop the containers
+ echo "Stopping containers..."
+ docker stop $containers
+
+ # Remove the containers
+ echo "Removing containers..."
+ docker rm $containers
+
+ echo "Containers have been stopped and removed."
+fi
\ No newline at end of file
diff --git a/scripts/syncProPackage.js b/scripts/syncProPackage.js
deleted file mode 100755
index 14ee222ce7..0000000000
--- a/scripts/syncProPackage.js
+++ /dev/null
@@ -1,41 +0,0 @@
-const fs = require("fs")
-const path = require("path")
-const { execSync } = require("child_process")
-
-let version = "0.0.0"
-const localPro = fs.existsSync("packages/pro/src")
-if (!localPro) {
- version = "latest"
-}
-
-// Get the list of workspaces with mismatched dependencies
-const output = execSync("yarn --silent workspaces info --json", {
- encoding: "utf-8",
-})
-const data = JSON.parse(output)
-
-// Loop through each workspace and update the dependencies
-Object.keys(data).forEach(workspace => {
- // Loop through each dependency and update its version in package.json
- const packageJsonPath = path.join(data[workspace].location, "package.json")
- const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, "utf-8"))
- if (packageJson.version !== "0.0.0") {
- // Don't change if we are not using local versions
- return
- }
-
- let hasChanges = false
-
- if (packageJson.dependencies && packageJson.dependencies["@budibase/pro"]) {
- packageJson.dependencies["@budibase/pro"] = version
- hasChanges = true
- }
-
- // Write changes to package.json if there are any
- if (hasChanges) {
- fs.writeFileSync(
- packageJsonPath,
- JSON.stringify(packageJson, null, 2) + "\n"
- )
- }
-})
diff --git a/yarn.lock b/yarn.lock
index 8580ef9657..d833731db4 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -1988,7 +1988,7 @@
resolved "https://registry.yarnpkg.com/@babel/regjsgen/-/regjsgen-0.8.0.tgz#f0ba69b075e1f05fb2825b7fad991e7adbb18310"
integrity sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==
-"@babel/runtime@^7.10.5", "@babel/runtime@^7.13.10":
+"@babel/runtime@^7.10.5":
version "7.23.9"
resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.23.9.tgz#47791a15e4603bb5f905bc0753801cf21d6345f7"
integrity sha512-0CX6F+BI2s9dkUqr08KFrAIZgNFj75rdBU/DjCyYLIaV/quFjkk6T+EJ2LkZHyZTbEV4L5p97mNkUsHl2wLFAw==
@@ -2002,6 +2002,13 @@
dependencies:
regenerator-runtime "^0.14.0"
+"@babel/runtime@^7.13.10":
+ version "7.24.4"
+ resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.24.4.tgz#de795accd698007a66ba44add6cc86542aff1edd"
+ integrity sha512-dkxf7+hn8mFBwKjs9bvBlArzLVxVbS8usaPUDd5p2a9JCL9tB8OaOVN1isD4+Xyk4ns89/xeOmbQvgdK7IIVdA==
+ 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"
@@ -2046,6 +2053,44 @@
resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39"
integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==
+"@budibase/backend-core@2.23.12":
+ version "0.0.0"
+ dependencies:
+ "@budibase/nano" "10.1.5"
+ "@budibase/pouchdb-replication-stream" "1.2.10"
+ "@budibase/shared-core" "0.0.0"
+ "@budibase/types" "0.0.0"
+ "@govtechsg/passport-openidconnect" "^1.0.2"
+ aws-cloudfront-sign "3.0.2"
+ aws-sdk "2.1030.0"
+ bcrypt "5.1.0"
+ bcryptjs "2.4.3"
+ bull "4.10.1"
+ correlation-id "4.0.0"
+ dd-trace "5.2.0"
+ dotenv "16.0.1"
+ ioredis "5.3.2"
+ joi "17.6.0"
+ jsonwebtoken "9.0.2"
+ koa-passport "^6.0.0"
+ koa-pino-logger "4.0.0"
+ lodash "4.17.21"
+ node-fetch "2.6.7"
+ passport-google-oauth "2.0.0"
+ passport-local "1.0.0"
+ passport-oauth2-refresh "^2.1.0"
+ pino "8.11.0"
+ pino-http "8.3.3"
+ posthog-node "1.3.0"
+ pouchdb "7.3.0"
+ pouchdb-find "7.2.2"
+ redlock "4.2.0"
+ rotating-file-stream "3.1.0"
+ sanitize-s3-objectkey "0.0.1"
+ semver "^7.5.4"
+ tar-fs "2.1.1"
+ uuid "^8.3.2"
+
"@budibase/handlebars-helpers@^0.13.1":
version "0.13.1"
resolved "https://registry.yarnpkg.com/@budibase/handlebars-helpers/-/handlebars-helpers-0.13.1.tgz#d02e73c0df8305cd675e70dc37f8427eb0842080"
@@ -2090,6 +2135,44 @@
pouchdb-promise "^6.0.4"
through2 "^2.0.0"
+"@budibase/pro@npm:@budibase/pro@latest":
+ version "2.23.12"
+ resolved "https://registry.yarnpkg.com/@budibase/pro/-/pro-2.23.12.tgz#b2e813c547a5ed22b5bd86b1158159fe4b918260"
+ integrity sha512-DMtfkrJDSIF9V7AL6brpuWWw7Ot5XxO4YQ32ggmr0264uU9KYsTFvlFXFP3MSF2H+247ZYUouSJU76+XeC13qQ==
+ dependencies:
+ "@budibase/backend-core" "2.23.12"
+ "@budibase/shared-core" "2.23.12"
+ "@budibase/string-templates" "2.23.12"
+ "@budibase/types" "2.23.12"
+ "@koa/router" "8.0.8"
+ bull "4.10.1"
+ joi "17.6.0"
+ jsonwebtoken "9.0.2"
+ lru-cache "^7.14.1"
+ memorystream "^0.3.1"
+ node-fetch "2.6.7"
+ scim-patch "^0.8.1"
+ scim2-parse-filter "^0.2.8"
+
+"@budibase/shared-core@2.23.12":
+ version "0.0.0"
+ dependencies:
+ "@budibase/types" "0.0.0"
+ cron-validate "1.4.5"
+
+"@budibase/string-templates@2.23.12":
+ version "0.0.0"
+ dependencies:
+ "@budibase/handlebars-helpers" "^0.13.1"
+ dayjs "^1.10.8"
+ handlebars "^4.7.8"
+ lodash.clonedeep "^4.5.0"
+
+"@budibase/types@2.23.12":
+ version "0.0.0"
+ dependencies:
+ scim-patch "^0.8.1"
+
"@bull-board/api@5.10.2":
version "5.10.2"
resolved "https://registry.yarnpkg.com/@bull-board/api/-/api-5.10.2.tgz#ae8ff6918b23897bf879a6ead3683f964374c4b3"
@@ -2675,7 +2758,7 @@
"@grpc/proto-loader" "^0.7.0"
"@types/node" ">=12.12.47"
-"@grpc/proto-loader@0.7.10", "@grpc/proto-loader@^0.7.0", "@grpc/proto-loader@^0.7.8":
+"@grpc/proto-loader@0.7.10", "@grpc/proto-loader@^0.7.0":
version "0.7.10"
resolved "https://registry.yarnpkg.com/@grpc/proto-loader/-/proto-loader-0.7.10.tgz#6bf26742b1b54d0a473067743da5d3189d06d720"
integrity sha512-CAqDfoaQ8ykFd9zqBDn4k6iWT9loLAlc2ETmDFS9JCD70gDcnA4L3AFEo2iV7KyAtAAHFW9ftq1Fz+Vsgq80RQ==
@@ -2685,6 +2768,16 @@
protobufjs "^7.2.4"
yargs "^17.7.2"
+"@grpc/proto-loader@^0.7.8":
+ version "0.7.12"
+ resolved "https://registry.yarnpkg.com/@grpc/proto-loader/-/proto-loader-0.7.12.tgz#787b58e3e3771df30b1567c057b6ab89e3a42911"
+ integrity sha512-DCVwMxqYzpUCiDMl7hQ384FqP4T3DbNpXU8pt681l3UWCip1WUiD5JrkImUwCB9a7f2cq4CUTmi5r/xIMRPY1Q==
+ dependencies:
+ lodash.camelcase "^4.3.0"
+ long "^5.0.0"
+ protobufjs "^7.2.4"
+ yargs "^17.7.2"
+
"@hapi/hoek@^9.0.0":
version "9.3.0"
resolved "https://registry.yarnpkg.com/@hapi/hoek/-/hoek-9.3.0.tgz#8368869dcb735be2e7f5cb7647de78e167a251fb"
@@ -4700,17 +4793,17 @@
resolved "https://registry.yarnpkg.com/@spectrum-css/button/-/button-3.0.1.tgz#6db8c3e851baecd0f1c2d88fef37d49d01c6e643"
integrity sha512-YXrBtjIYisk4Vaxnp0RiE4gdElQX04P2mc4Pi2GlQ27dJKlHmufYcF+kAqGdtiyK5yjdN/vKRcC8y13aA4rusA==
-"@spectrum-css/button@^3.0.3":
- version "3.0.3"
- resolved "https://registry.yarnpkg.com/@spectrum-css/button/-/button-3.0.3.tgz#2df1efaab6c7e0b3b06cb4b59e1eae59c7f1fc84"
- integrity sha512-6CnLPqqtaU/PcSSIGeGRi0iFIIxIUByYLKFO6zn5NEUc12KQ28dJ4PLwB6WBa0L8vRoAGlnWWH2ZZweTijbXgg==
-
"@spectrum-css/buttongroup@3.0.2":
version "3.0.2"
resolved "https://registry.yarnpkg.com/@spectrum-css/buttongroup/-/buttongroup-3.0.2.tgz#fd3387973ca3131609e32112de42a1c0400a48d8"
integrity sha512-Wu7B4GJ/SAeVHz9SUGAkeIH8pLaZh4t+w2ykSKOPQIRuK2jCBoudkEClVxviNVwqekccf5XLFXg9GpYF1a3Uaw==
-"@spectrum-css/card@^3.0.3":
+"@spectrum-css/calendar@3.2.7":
+ version "3.2.7"
+ resolved "https://registry.yarnpkg.com/@spectrum-css/calendar/-/calendar-3.2.7.tgz#10fd44176b6afbdf5baf29ce16728baa98b0d844"
+ integrity sha512-e2BGyuXzP+VOv0q855EIgrR+ne7e/EP8AMMuSAWazgq2fPZ4CoJIeLYP3tnniKnj2dlb3Gr1LH+6MPlUXS74RA==
+
+"@spectrum-css/card@3.0.3":
version "3.0.3"
resolved "https://registry.yarnpkg.com/@spectrum-css/card/-/card-3.0.3.tgz#56b2e2da6b80c1583228baa279de7407383bfb6b"
integrity sha512-+oKLUI2a0QmQP9EzySeq/G4FpUkkdaDNbuEbqCj2IkPMc/2v/nwzsPhh1fj2UIghGAiiUwXfPpzax1e8fyhQUg==
@@ -4732,13 +4825,6 @@
dependencies:
"@spectrum-css/vars" "^3.0.2"
-"@spectrum-css/divider@^1.0.3":
- version "1.0.27"
- resolved "https://registry.yarnpkg.com/@spectrum-css/divider/-/divider-1.0.27.tgz#435bf738a65b4eb15c899edf5c536bea22f2d679"
- integrity sha512-hWKPHOEo9lkOGN5zecpVVwVxE3x0SJHQJKDNx1g0xs/P/AthAboK+L1c9Rq29czNfcQ2kUjumi4igzQzcqABMQ==
- dependencies:
- "@spectrum-css/vars" "^8.0.0"
-
"@spectrum-css/dropzone@3.0.2":
version "3.0.2"
resolved "https://registry.yarnpkg.com/@spectrum-css/dropzone/-/dropzone-3.0.2.tgz#34f137851054442b219fed7f32006b93fc5e0bcf"
@@ -4784,11 +4870,6 @@
resolved "https://registry.yarnpkg.com/@spectrum-css/link/-/link-3.1.1.tgz#cb526a2e10b50ef5a7ae29cca7272e2610d597eb"
integrity sha512-Bi88lRhTY7g6nM/ryW1yY4Cji211ZYNtRxkxbV7n2lPvwMAAQtyx0qVD3ru4kTGj/FFVvmPR3XiOE10K13HSNA==
-"@spectrum-css/link@^3.1.3":
- version "3.1.23"
- resolved "https://registry.yarnpkg.com/@spectrum-css/link/-/link-3.1.23.tgz#9d9ff64c41366edbfdb19d04a5deec88bf2ea8fd"
- integrity sha512-CAJQGnGTrTtR4tF1L94ou9Y+c4vnx9d5rWhb3AMzKb2Focqz02xSkTyaCCH7OM/3CwD8TCLOMANon8LcRpGAjA==
-
"@spectrum-css/menu@3.0.1":
version "3.0.1"
resolved "https://registry.yarnpkg.com/@spectrum-css/menu/-/menu-3.0.1.tgz#2a376f991acc24e12ec892bb6b9db2650fc41fbe"
@@ -4876,11 +4957,6 @@
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.1.4":
- version "3.3.15"
- resolved "https://registry.yarnpkg.com/@spectrum-css/tag/-/tag-3.3.15.tgz#971184fd8cb977b85a529f808313851863123278"
- integrity sha512-pF6Wh61Z7hmAy20twIlpjdDuivYj6UPtWIzK7giyJKr/qcn20BjVN2ChIeFB1N+vBamJdLsuQOewv4AJ3+LZ2Q==
-
"@spectrum-css/tags@3.0.2":
version "3.0.2"
resolved "https://registry.yarnpkg.com/@spectrum-css/tags/-/tags-3.0.2.tgz#5bf35fb79c97cd9344de485bd4626ad5b9f07757"
@@ -4911,11 +4987,6 @@
resolved "https://registry.yarnpkg.com/@spectrum-css/typography/-/typography-3.0.1.tgz#957dafd9b18c314fa37a88b549042ba2175f5b3f"
integrity sha512-XyR68K2rIZX3u4j7HhMLOqLVHDJZcapp3XUqgYMzMWccBFleA0qPxKpfRWqVIA5DzTMSIw0wEcZPYKWFZ2e6dA==
-"@spectrum-css/typography@^3.0.2":
- version "3.0.2"
- resolved "https://registry.yarnpkg.com/@spectrum-css/typography/-/typography-3.0.2.tgz#ea3ca0a60e18064527819d48c8c4364cab4fcd38"
- integrity sha512-5ZOLmQe0edzsDMyhghUd4hBb5uxGsFrxzf+WasfcUw9klSfTsRZ09n1BsaaWbgrLjlMQ+EEHS46v5VNo0Ms2CA==
-
"@spectrum-css/underlay@2.0.9":
version "2.0.9"
resolved "https://registry.yarnpkg.com/@spectrum-css/underlay/-/underlay-2.0.9.tgz#fc10f971d1325cc844b727e6260f7217844060e8"
@@ -4936,11 +5007,6 @@
resolved "https://registry.yarnpkg.com/@spectrum-css/vars/-/vars-4.3.1.tgz#d333fa41909f691c8750b5c15ad9ba029df2248e"
integrity sha512-rX6Iasu9BsFMVgEN0vGRPm9dmSxva+IK/uqQAa9HM0lliwqUiFrJxrFXHHpiAgNuux/U4srEJwbSpGzfF+CegQ==
-"@spectrum-css/vars@^8.0.0":
- version "8.0.4"
- resolved "https://registry.yarnpkg.com/@spectrum-css/vars/-/vars-8.0.4.tgz#dcf115551f240b25ba629a3b6c4d3eb1429bee15"
- integrity sha512-3jYj5HYxbVfkR4jLV9l+L3g6jS4R09m0lV+gupqnXWpwcThlP0EOjkCkevu195imoS4pZ/i2iLpd98l4qcTc2Q==
-
"@sveltejs/vite-plugin-svelte@1.4.0":
version "1.4.0"
resolved "https://registry.yarnpkg.com/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-1.4.0.tgz#412a735de489ca731d0c780c2b410f45dd95b392"
@@ -5680,9 +5746,9 @@
integrity sha512-7GgtHCs/QZrBrDzgIJnQtuSvhFSwhyYSI2uafSwZoNt1iOGhEN5fwNrQMjtONyHm9+/LoA4453jH0CMYcr06Pg==
"@types/node@>=8.1.0":
- version "20.11.10"
- resolved "https://registry.yarnpkg.com/@types/node/-/node-20.11.10.tgz#6c3de8974d65c362f82ee29db6b5adf4205462f9"
- integrity sha512-rZEfe/hJSGYmdfX9tvcPMYeYPW2sNl50nsw4jZmRcaG0HIAb0WYEpsB05GOb53vjqpyE9GUhlDQ4jLSoB5q9kg==
+ version "20.12.4"
+ resolved "https://registry.yarnpkg.com/@types/node/-/node-20.12.4.tgz#af5921bd75ccdf3a3d8b3fa75bf3d3359268cd11"
+ integrity sha512-E+Fa9z3wSQpzgYQdYmme5X3OTuejnnTx88A6p6vkkJosR3KBz+HpE3kqNm98VE6cfLFcISx7zW7MsJkH6KwbTw==
dependencies:
undici-types "~5.26.4"
@@ -8126,6 +8192,17 @@ call-bind@^1.0.0, call-bind@^1.0.2, call-bind@^1.0.4, call-bind@^1.0.5:
get-intrinsic "^1.2.1"
set-function-length "^1.1.1"
+call-bind@^1.0.7:
+ version "1.0.7"
+ resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.7.tgz#06016599c40c56498c18769d2730be242b6fa3b9"
+ integrity sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==
+ dependencies:
+ es-define-property "^1.0.0"
+ es-errors "^1.3.0"
+ function-bind "^1.1.2"
+ get-intrinsic "^1.2.4"
+ set-function-length "^1.2.1"
+
call-me-maybe@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/call-me-maybe/-/call-me-maybe-1.0.1.tgz#26d208ea89e37b5cbde60250a15f031c16a4d66b"
@@ -9584,6 +9661,15 @@ define-data-property@^1.0.1, define-data-property@^1.1.0, define-data-property@^
gopd "^1.0.1"
has-property-descriptors "^1.0.0"
+define-data-property@^1.1.4:
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e"
+ integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==
+ dependencies:
+ es-define-property "^1.0.0"
+ es-errors "^1.3.0"
+ gopd "^1.0.1"
+
define-lazy-prop@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz#3f7ae421129bcaaac9bc74905c98a0009ec9ee7f"
@@ -10062,9 +10148,9 @@ dotenv@8.6.0, dotenv@^8.2.0:
integrity sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g==
dotenv@^16.3.1:
- version "16.4.1"
- resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.4.1.tgz#1d9931f1d3e5d2959350d1250efab299561f7f11"
- integrity sha512-CjA3y+Dr3FyFDOAMnxZEGtnW9KBR2M0JvvUtXNW+dYJL5ROWxP9DUHCwgFqpMk0OXCc0ljhaNTr2w/kutYIcHQ==
+ version "16.4.5"
+ resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.4.5.tgz#cdd3b3b604cb327e286b4762e13502f717cb099f"
+ integrity sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==
dotenv@~10.0.0:
version "10.0.0"
@@ -10433,6 +10519,18 @@ es-aggregate-error@^1.0.9:
has-property-descriptors "^1.0.0"
set-function-name "^2.0.1"
+es-define-property@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.0.tgz#c7faefbdff8b2696cf5f46921edfb77cc4ba3845"
+ integrity sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==
+ dependencies:
+ get-intrinsic "^1.2.4"
+
+es-errors@^1.3.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f"
+ integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==
+
es-get-iterator@^1.1.2:
version "1.1.3"
resolved "https://registry.yarnpkg.com/es-get-iterator/-/es-get-iterator-1.1.3.tgz#3ef87523c5d464d41084b2c3c9c214f1199763d6"
@@ -11113,9 +11211,9 @@ fast-xml-parser@4.2.5:
strnum "^1.0.5"
fast-xml-parser@^4.1.3:
- version "4.3.3"
- resolved "https://registry.yarnpkg.com/fast-xml-parser/-/fast-xml-parser-4.3.3.tgz#aeaf5778392329f17168c40c51bcbfec8ff965be"
- integrity sha512-coV/D1MhrShMvU6D0I+VAK3umz6hUaxxhL0yp/9RjfiYUfAv14rDhGQL+PLForhMdr0wq3PiV07WtkkNjJjNHg==
+ version "4.3.6"
+ resolved "https://registry.yarnpkg.com/fast-xml-parser/-/fast-xml-parser-4.3.6.tgz#190f9d99097f0c8f2d3a0e681a10404afca052ff"
+ integrity sha512-M2SovcRxD4+vC493Uc2GZVcZaj66CCJhWurC4viynVSTvrpErCShNcDz1lAho6n9REQKvL/ll4A4/fw6Y9z8nw==
dependencies:
strnum "^1.0.5"
@@ -11445,9 +11543,9 @@ formidable@^2.1.2:
qs "^6.11.0"
fp-ts@^2.5.1:
- version "2.16.2"
- resolved "https://registry.yarnpkg.com/fp-ts/-/fp-ts-2.16.2.tgz#7faa90f6fc2e8cf84c711d2c4e606afe2be9e342"
- integrity sha512-CkqAjnIKFqvo3sCyoBTqgJvF+bHrSik584S9nhTjtBESLx26cbtVMR/T9a6ApChOcSDAaM3JydDmWDUn4EEXng==
+ version "2.16.5"
+ resolved "https://registry.yarnpkg.com/fp-ts/-/fp-ts-2.16.5.tgz#d79b97168aeafcf9612f18bbc017f513ecb20ac9"
+ integrity sha512-N8T8PwMSeTKKtkm9lkj/zSTAnPC/aJIIrQhnHxxkL0KLsRCNUPANksJOlMXxcKKCo7H1ORP3No9EMD+fP0tsdA==
fresh@^0.5.2, fresh@~0.5.2:
version "0.5.2"
@@ -11677,6 +11775,17 @@ get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3, get-intrinsic@
has-symbols "^1.0.3"
hasown "^2.0.0"
+get-intrinsic@^1.2.4:
+ version "1.2.4"
+ resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.4.tgz#e385f5a4b5227d449c3eabbad05494ef0abbeadd"
+ integrity sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==
+ dependencies:
+ es-errors "^1.3.0"
+ function-bind "^1.1.2"
+ has-proto "^1.0.1"
+ has-symbols "^1.0.3"
+ hasown "^2.0.0"
+
get-object@^0.2.0:
version "0.2.0"
resolved "https://registry.yarnpkg.com/get-object/-/get-object-0.2.0.tgz#d92ff7d5190c64530cda0543dac63a3d47fe8c0c"
@@ -12297,6 +12406,13 @@ has-property-descriptors@^1.0.0:
dependencies:
get-intrinsic "^1.1.1"
+has-property-descriptors@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz#963ed7d071dc7bf5f084c5bfbe0d1b6222586854"
+ integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==
+ dependencies:
+ es-define-property "^1.0.0"
+
has-proto@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.1.tgz#1885c1305538958aff469fef37937c22795408e0"
@@ -16141,10 +16257,10 @@ mute-stream@~1.0.0:
resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-1.0.0.tgz#e31bd9fe62f0aed23520aa4324ea6671531e013e"
integrity sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==
-mysql2@3.5.2:
- version "3.5.2"
- resolved "https://registry.yarnpkg.com/mysql2/-/mysql2-3.5.2.tgz#a06050e1514e9ac15711a8b883ffd51cb44b2dc8"
- integrity sha512-cptobmhYkYeTBIFp2c0piw2+gElpioga1rUw5UidHvo8yaHijMZoo8A3zyBVoo/K71f7ZFvrShA9iMIy9dCzCA==
+mysql2@3.9.7:
+ version "3.9.7"
+ resolved "https://registry.yarnpkg.com/mysql2/-/mysql2-3.9.7.tgz#843755daf65b5ef08afe545fe14b8fb62824741a"
+ integrity sha512-KnJT8vYRcNAZv73uf9zpXqNbvBG7DJrs+1nACsjZP1HMJ1TgXEy8wnNilXAn/5i57JizXKtrUtwDB7HxT9DDpw==
dependencies:
denque "^2.1.0"
generate-function "^2.3.1"
@@ -18444,9 +18560,9 @@ pprof-format@^2.0.7:
integrity sha512-1qWaGAzwMpaXJP9opRa23nPnt2Egi7RMNoNBptEE/XwHbcn4fC2b/4U4bKc5arkGkIh2ZabpF2bEb+c5GNHEKA==
preact@^10.19.3:
- version "10.19.3"
- resolved "https://registry.yarnpkg.com/preact/-/preact-10.19.3.tgz#7a7107ed2598a60676c943709ea3efb8aaafa899"
- integrity sha512-nHHTeFVBTHRGxJXKkKu5hT8C/YWBkPso4/Gad6xuj5dbptt9iF9NZr9pHbPhBrnT2klheu7mHTxTZ/LjwJiEiQ==
+ version "10.20.1"
+ resolved "https://registry.yarnpkg.com/preact/-/preact-10.20.1.tgz#1bc598ab630d8612978f7533da45809a8298542b"
+ integrity sha512-JIFjgFg9B2qnOoGiYMVBtrcFxHqn+dNXbq76bVmcaHYJFYR4lW67AOcXgAYQQTDYXDOg/kTZrKPNCdRgJ2UJmw==
prebuild-install@^7.1.1:
version "7.1.1"
@@ -18842,7 +18958,14 @@ 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, qs@^6.11.0, qs@^6.4.0:
+qs@^6.10.3:
+ version "6.12.0"
+ resolved "https://registry.yarnpkg.com/qs/-/qs-6.12.0.tgz#edd40c3b823995946a8a0b1f208669c7a200db77"
+ integrity sha512-trVZiI6RMOkO476zLGaBIzszOdFPnCCXHPG9kn0yuS1uz6xdVxPfZdB3vUig9pxPFDM9BRAgz/YUIVQ1/vuiUg==
+ dependencies:
+ side-channel "^1.0.6"
+
+qs@^6.11.0, qs@^6.4.0:
version "6.11.2"
resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.2.tgz#64bea51f12c1f5da1bc01496f48ffcff7c69d7d9"
integrity sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==
@@ -19924,6 +20047,18 @@ set-function-length@^1.1.1:
gopd "^1.0.1"
has-property-descriptors "^1.0.0"
+set-function-length@^1.2.1:
+ version "1.2.2"
+ resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449"
+ integrity sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==
+ dependencies:
+ define-data-property "^1.1.4"
+ es-errors "^1.3.0"
+ function-bind "^1.1.2"
+ get-intrinsic "^1.2.4"
+ gopd "^1.0.1"
+ has-property-descriptors "^1.0.2"
+
set-function-name@^2.0.0, set-function-name@^2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/set-function-name/-/set-function-name-2.0.1.tgz#12ce38b7954310b9f61faa12701620a0c882793a"
@@ -20015,6 +20150,16 @@ side-channel@^1.0.4:
get-intrinsic "^1.0.2"
object-inspect "^1.9.0"
+side-channel@^1.0.6:
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.6.tgz#abd25fb7cd24baf45466406b1096b7831c9215f2"
+ integrity sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==
+ dependencies:
+ call-bind "^1.0.7"
+ es-errors "^1.3.0"
+ get-intrinsic "^1.2.4"
+ object-inspect "^1.13.1"
+
siginfo@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/siginfo/-/siginfo-2.0.0.tgz#32e76c70b79724e3bb567cb9d543eb858ccfaf30"
@@ -20602,7 +20747,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==
@@ -20692,7 +20846,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==
@@ -20706,6 +20860,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"
@@ -22642,7 +22803,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==
@@ -22660,6 +22821,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"
@@ -23041,9 +23211,9 @@ z-schema@^5.0.1:
commander "^9.4.1"
zeebe-node@^8.2.5:
- version "8.3.1"
- resolved "https://registry.yarnpkg.com/zeebe-node/-/zeebe-node-8.3.1.tgz#e100bf3708464e305305b4efa1ffde53f9786c45"
- integrity sha512-68ascWO3g7g+9WwDzvfa3I9TkLKHku5auEgSINP+k5ktNfsfGW68ELDmEJA+XHZgzvGsdGILZqGRzVd5SC8aaQ==
+ version "8.3.2"
+ resolved "https://registry.yarnpkg.com/zeebe-node/-/zeebe-node-8.3.2.tgz#64d156b715f03f8637054aeedb3d3024b4a09db4"
+ integrity sha512-3/xbiTvhaa668JHtMEwELv5dN6HR7Qw8gzmCdjp3Brj6ekdhROVx8x/0JWKSV3Mx64ac3+eEc+9nB5+ZXcO/bg==
dependencies:
"@grpc/grpc-js" "1.9.7"
"@grpc/proto-loader" "0.7.10"