Merge branch 'master' into feat/row-action-view-security
This commit is contained in:
commit
1be8289677
|
@ -240,7 +240,7 @@ jobs:
|
||||||
|
|
||||||
any_commit=$(git log --no-merges $base_commit_excluding_merges...$pro_commit)
|
any_commit=$(git log --no-merges $base_commit_excluding_merges...$pro_commit)
|
||||||
|
|
||||||
if [ -n "$any_commit" ]; then
|
if [ -n "$any_commit" ] && [ "$base_commit" != "$pro_commit" ]; then
|
||||||
echo $any_commit
|
echo $any_commit
|
||||||
|
|
||||||
echo "An error occurred: <error_message>"
|
echo "An error occurred: <error_message>"
|
||||||
|
|
|
@ -22,6 +22,7 @@ jobs:
|
||||||
env:
|
env:
|
||||||
PAYLOAD_BRANCH: ${{ github.head_ref }}
|
PAYLOAD_BRANCH: ${{ github.head_ref }}
|
||||||
PAYLOAD_PR_NUMBER: ${{ github.event.pull_request.number }}
|
PAYLOAD_PR_NUMBER: ${{ github.event.pull_request.number }}
|
||||||
|
PAYLOAD_LICENSE_TYPE: "free"
|
||||||
with:
|
with:
|
||||||
repository: budibase/budibase-deploys
|
repository: budibase/budibase-deploys
|
||||||
event: featurebranch-qa-deploy
|
event: featurebranch-qa-deploy
|
||||||
|
|
|
@ -329,7 +329,7 @@ brace-expansion@^1.1.7:
|
||||||
balanced-match "^1.0.0"
|
balanced-match "^1.0.0"
|
||||||
concat-map "0.0.1"
|
concat-map "0.0.1"
|
||||||
|
|
||||||
braces@^3.0.1, braces@~3.0.2:
|
braces@^3.0.3, braces@~3.0.2:
|
||||||
version "3.0.3"
|
version "3.0.3"
|
||||||
resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789"
|
resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789"
|
||||||
integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==
|
integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==
|
||||||
|
@ -1201,12 +1201,12 @@ merge2@^1.3.0, merge2@^1.4.1:
|
||||||
integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==
|
integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==
|
||||||
|
|
||||||
micromatch@^4.0.4:
|
micromatch@^4.0.4:
|
||||||
version "4.0.4"
|
version "4.0.8"
|
||||||
resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.4.tgz#896d519dfe9db25fce94ceb7a500919bf881ebf9"
|
resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.8.tgz#d66fa18f3a47076789320b9b1af32bd86d9fa202"
|
||||||
integrity sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==
|
integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==
|
||||||
dependencies:
|
dependencies:
|
||||||
braces "^3.0.1"
|
braces "^3.0.3"
|
||||||
picomatch "^2.2.3"
|
picomatch "^2.3.1"
|
||||||
|
|
||||||
minimatch@^3.0.4, minimatch@^3.1.2:
|
minimatch@^3.0.4, minimatch@^3.1.2:
|
||||||
version "3.1.2"
|
version "3.1.2"
|
||||||
|
@ -1422,7 +1422,7 @@ picocolors@^1.0.0:
|
||||||
resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c"
|
resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c"
|
||||||
integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==
|
integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==
|
||||||
|
|
||||||
picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3:
|
picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1:
|
||||||
version "2.3.1"
|
version "2.3.1"
|
||||||
resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42"
|
resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42"
|
||||||
integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==
|
integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
{
|
{
|
||||||
"$schema": "node_modules/lerna/schemas/lerna-schema.json",
|
"$schema": "node_modules/lerna/schemas/lerna-schema.json",
|
||||||
"version": "2.31.3",
|
"version": "2.31.4",
|
||||||
"npmClient": "yarn",
|
"npmClient": "yarn",
|
||||||
"packages": [
|
"packages": [
|
||||||
"packages/*",
|
"packages/*",
|
||||||
|
|
|
@ -266,6 +266,6 @@ export class FlagSet<V extends Flag<any>, T extends { [key: string]: V }> {
|
||||||
// All of the machinery in this file is to make sure that flags have their
|
// All of the machinery in this file is to make sure that flags have their
|
||||||
// default values set correctly and their types flow through the system.
|
// default values set correctly and their types flow through the system.
|
||||||
export const flags = new FlagSet({
|
export const flags = new FlagSet({
|
||||||
DEFAULT_VALUES: Flag.boolean(false),
|
DEFAULT_VALUES: Flag.boolean(env.isDev()),
|
||||||
SQS: Flag.boolean(false),
|
SQS: Flag.boolean(env.isDev()),
|
||||||
})
|
})
|
||||||
|
|
|
@ -15,7 +15,15 @@ export async function saveTenantInfo(tenantInfo: TenantInfo) {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
export async function getTenantInfo(tenantId: string): Promise<TenantInfo> {
|
export async function getTenantInfo(
|
||||||
const db = getTenantDB(tenantId)
|
tenantId: string
|
||||||
return db.get("tenant_info")
|
): Promise<TenantInfo | undefined> {
|
||||||
|
try {
|
||||||
|
const db = getTenantDB(tenantId)
|
||||||
|
const tenantInfo = (await db.get("tenant_info")) as TenantInfo
|
||||||
|
delete tenantInfo.owner.password
|
||||||
|
return tenantInfo
|
||||||
|
} catch {
|
||||||
|
return undefined
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,10 +6,11 @@
|
||||||
export let onEdit
|
export let onEdit
|
||||||
export let allowSelectRows = false
|
export let allowSelectRows = false
|
||||||
export let allowEditRows = false
|
export let allowEditRows = false
|
||||||
|
export let data
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<div>
|
<div>
|
||||||
{#if allowSelectRows}
|
{#if allowSelectRows && data.__selectable !== false}
|
||||||
<Checkbox value={selected} />
|
<Checkbox value={selected} />
|
||||||
{/if}
|
{/if}
|
||||||
{#if allowEditRows}
|
{#if allowEditRows}
|
||||||
|
|
|
@ -43,6 +43,8 @@
|
||||||
export let showHeaderBorder = true
|
export let showHeaderBorder = true
|
||||||
export let placeholderText = "No rows found"
|
export let placeholderText = "No rows found"
|
||||||
export let snippets = []
|
export let snippets = []
|
||||||
|
export let defaultSortColumn
|
||||||
|
export let defaultSortOrder = "Ascending"
|
||||||
|
|
||||||
const dispatch = createEventDispatcher()
|
const dispatch = createEventDispatcher()
|
||||||
|
|
||||||
|
@ -162,6 +164,8 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
const sortRows = (rows, sortColumn, sortOrder) => {
|
const sortRows = (rows, sortColumn, sortOrder) => {
|
||||||
|
sortColumn = sortColumn ?? defaultSortColumn
|
||||||
|
sortOrder = sortOrder ?? defaultSortOrder
|
||||||
if (!sortColumn || !sortOrder || disableSorting) {
|
if (!sortColumn || !sortOrder || disableSorting) {
|
||||||
return rows
|
return rows
|
||||||
}
|
}
|
||||||
|
@ -259,7 +263,10 @@
|
||||||
if (select) {
|
if (select) {
|
||||||
// Add any rows which are not already in selected rows
|
// Add any rows which are not already in selected rows
|
||||||
rows.forEach(row => {
|
rows.forEach(row => {
|
||||||
if (selectedRows.findIndex(x => x._id === row._id) === -1) {
|
if (
|
||||||
|
row.__selectable !== false &&
|
||||||
|
selectedRows.findIndex(x => x._id === row._id) === -1
|
||||||
|
) {
|
||||||
selectedRows.push(row)
|
selectedRows.push(row)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
@ -396,6 +403,9 @@
|
||||||
class:noBorderCheckbox={!showHeaderBorder}
|
class:noBorderCheckbox={!showHeaderBorder}
|
||||||
class="spectrum-Table-cell spectrum-Table-cell--divider spectrum-Table-cell--edit"
|
class="spectrum-Table-cell spectrum-Table-cell--divider spectrum-Table-cell--edit"
|
||||||
on:click={e => {
|
on:click={e => {
|
||||||
|
if (row.__selectable === false) {
|
||||||
|
return
|
||||||
|
}
|
||||||
toggleSelectRow(row)
|
toggleSelectRow(row)
|
||||||
e.stopPropagation()
|
e.stopPropagation()
|
||||||
}}
|
}}
|
||||||
|
|
|
@ -57,6 +57,7 @@ export const getBindableProperties = (asset, componentId) => {
|
||||||
const stateBindings = getStateBindings()
|
const stateBindings = getStateBindings()
|
||||||
const selectedRowsBindings = getSelectedRowsBindings(asset)
|
const selectedRowsBindings = getSelectedRowsBindings(asset)
|
||||||
const roleBindings = getRoleBindings()
|
const roleBindings = getRoleBindings()
|
||||||
|
const embedBindings = getEmbedBindings()
|
||||||
return [
|
return [
|
||||||
...contextBindings,
|
...contextBindings,
|
||||||
...urlBindings,
|
...urlBindings,
|
||||||
|
@ -65,6 +66,7 @@ export const getBindableProperties = (asset, componentId) => {
|
||||||
...deviceBindings,
|
...deviceBindings,
|
||||||
...selectedRowsBindings,
|
...selectedRowsBindings,
|
||||||
...roleBindings,
|
...roleBindings,
|
||||||
|
...embedBindings,
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -813,6 +815,25 @@ export const getActionBindings = (actions, actionId) => {
|
||||||
return bindings
|
return bindings
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets all device bindings for embeds.
|
||||||
|
*/
|
||||||
|
const getEmbedBindings = () => {
|
||||||
|
let bindings = []
|
||||||
|
const safeEmbed = makePropSafe("embed")
|
||||||
|
|
||||||
|
bindings = [
|
||||||
|
{
|
||||||
|
type: "context",
|
||||||
|
runtimeBinding: `${safeEmbed}`,
|
||||||
|
readableBinding: `ParentWindow`,
|
||||||
|
category: "Embed",
|
||||||
|
icon: "DistributeVertically",
|
||||||
|
},
|
||||||
|
]
|
||||||
|
return bindings
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets the schema for a certain datasource plus.
|
* Gets the schema for a certain datasource plus.
|
||||||
* The options which can be passed in are:
|
* The options which can be passed in are:
|
||||||
|
|
|
@ -7,10 +7,22 @@ import {
|
||||||
FIELDS,
|
FIELDS,
|
||||||
isAutoColumnUserRelationship,
|
isAutoColumnUserRelationship,
|
||||||
} from "constants/backend"
|
} from "constants/backend"
|
||||||
|
import { isEnabled } from "helpers/featureFlags"
|
||||||
|
|
||||||
export function getAutoColumnInformation(enabled = true) {
|
export function getAutoColumnInformation(enabled = true) {
|
||||||
let info = {}
|
let info = {}
|
||||||
for (let [key, subtype] of Object.entries(AUTO_COLUMN_SUB_TYPES)) {
|
for (const [key, subtype] of Object.entries(AUTO_COLUMN_SUB_TYPES)) {
|
||||||
|
// Because it's possible to replicate the functionality of CREATED_AT and
|
||||||
|
// CREATED_BY columns, we disable their creation when the DEFAULT_VALUES
|
||||||
|
// feature flag is enabled.
|
||||||
|
if (isEnabled("DEFAULT_VALUES")) {
|
||||||
|
if (
|
||||||
|
subtype === AUTO_COLUMN_SUB_TYPES.CREATED_AT ||
|
||||||
|
subtype === AUTO_COLUMN_SUB_TYPES.CREATED_BY
|
||||||
|
) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
}
|
||||||
info[subtype] = { enabled, name: AUTO_COLUMN_DISPLAY_NAMES[key] }
|
info[subtype] = { enabled, name: AUTO_COLUMN_DISPLAY_NAMES[key] }
|
||||||
}
|
}
|
||||||
return info
|
return info
|
||||||
|
|
|
@ -49,7 +49,7 @@
|
||||||
right: 0;
|
right: 0;
|
||||||
left: 0;
|
left: 0;
|
||||||
bottom: 0;
|
bottom: 0;
|
||||||
z-index: 999;
|
z-index: 9000;
|
||||||
position: absolute;
|
position: absolute;
|
||||||
background: rgba(255, 255, 255, 0.1);
|
background: rgba(255, 255, 255, 0.1);
|
||||||
display: flex;
|
display: flex;
|
||||||
|
|
|
@ -85,7 +85,7 @@
|
||||||
let popoverAnchor
|
let popoverAnchor
|
||||||
let searchTerm = ""
|
let searchTerm = ""
|
||||||
let popover
|
let popover
|
||||||
let user
|
let user, tenantOwner
|
||||||
let loaded = false
|
let loaded = false
|
||||||
|
|
||||||
$: internalGroups = $groups?.filter(g => !g?.scimInfo?.isSync)
|
$: internalGroups = $groups?.filter(g => !g?.scimInfo?.isSync)
|
||||||
|
@ -104,6 +104,7 @@
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
$: globalRole = users.getUserRole(user)
|
$: globalRole = users.getUserRole(user)
|
||||||
|
$: isTenantOwner = tenantOwner?.email && tenantOwner.email === user?.email
|
||||||
|
|
||||||
const getAvailableApps = (appList, privileged, roles) => {
|
const getAvailableApps = (appList, privileged, roles) => {
|
||||||
let availableApps = appList.slice()
|
let availableApps = appList.slice()
|
||||||
|
@ -205,6 +206,7 @@
|
||||||
if (!user?._id) {
|
if (!user?._id) {
|
||||||
$goto("./")
|
$goto("./")
|
||||||
}
|
}
|
||||||
|
tenantOwner = await users.tenantOwner($auth.tenantId)
|
||||||
}
|
}
|
||||||
|
|
||||||
async function toggleFlags(detail) {
|
async function toggleFlags(detail) {
|
||||||
|
@ -268,9 +270,11 @@
|
||||||
Force password reset
|
Force password reset
|
||||||
</MenuItem>
|
</MenuItem>
|
||||||
{/if}
|
{/if}
|
||||||
<MenuItem on:click={deleteModal.show} icon="Delete">
|
{#if !isTenantOwner}
|
||||||
Delete
|
<MenuItem on:click={deleteModal.show} icon="Delete">
|
||||||
</MenuItem>
|
Delete
|
||||||
|
</MenuItem>
|
||||||
|
{/if}
|
||||||
</ActionMenu>
|
</ActionMenu>
|
||||||
</div>
|
</div>
|
||||||
{/if}
|
{/if}
|
||||||
|
@ -310,9 +314,11 @@
|
||||||
<Label size="L">Role</Label>
|
<Label size="L">Role</Label>
|
||||||
<Select
|
<Select
|
||||||
placeholder={null}
|
placeholder={null}
|
||||||
disabled={!sdk.users.isAdmin($auth.user)}
|
disabled={!sdk.users.isAdmin($auth.user) || isTenantOwner}
|
||||||
value={globalRole}
|
value={isTenantOwner ? "owner" : globalRole}
|
||||||
options={Constants.BudibaseRoleOptions}
|
options={isTenantOwner
|
||||||
|
? Constants.ExtendedBudibaseRoleOptions
|
||||||
|
: Constants.BudibaseRoleOptions}
|
||||||
on:change={updateUserRole}
|
on:change={updateUserRole}
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
|
|
||||||
export let row
|
export let row
|
||||||
|
|
||||||
$: role = Constants.BudibaseRoleOptions.find(
|
$: role = Constants.ExtendedBudibaseRoleOptions.find(
|
||||||
x => x.value === users.getUserRole(row)
|
x => x.value === users.getUserRole(row)
|
||||||
)
|
)
|
||||||
$: value = role?.label || "Not available"
|
$: value = role?.label || "Not available"
|
||||||
|
|
|
@ -52,6 +52,7 @@
|
||||||
|
|
||||||
let groupsLoaded = !$licensing.groupsEnabled || $groups?.length
|
let groupsLoaded = !$licensing.groupsEnabled || $groups?.length
|
||||||
let enrichedUsers = []
|
let enrichedUsers = []
|
||||||
|
let tenantOwner
|
||||||
let createUserModal,
|
let createUserModal,
|
||||||
inviteConfirmationModal,
|
inviteConfirmationModal,
|
||||||
onboardingTypeModal,
|
onboardingTypeModal,
|
||||||
|
@ -70,6 +71,7 @@
|
||||||
]
|
]
|
||||||
let userData = []
|
let userData = []
|
||||||
let invitesLoaded = false
|
let invitesLoaded = false
|
||||||
|
let tenantOwnerLoaded = false
|
||||||
let pendingInvites = []
|
let pendingInvites = []
|
||||||
let parsedInvites = []
|
let parsedInvites = []
|
||||||
|
|
||||||
|
@ -98,8 +100,14 @@
|
||||||
$: pendingSchema = getPendingSchema(schema)
|
$: pendingSchema = getPendingSchema(schema)
|
||||||
$: userData = []
|
$: userData = []
|
||||||
$: inviteUsersResponse = { successful: [], unsuccessful: [] }
|
$: inviteUsersResponse = { successful: [], unsuccessful: [] }
|
||||||
$: {
|
$: setEnrichedUsers($fetch.rows, tenantOwnerLoaded)
|
||||||
enrichedUsers = $fetch.rows?.map(user => {
|
|
||||||
|
const setEnrichedUsers = async rows => {
|
||||||
|
if (!tenantOwnerLoaded) {
|
||||||
|
enrichedUsers = []
|
||||||
|
return
|
||||||
|
}
|
||||||
|
enrichedUsers = rows?.map(user => {
|
||||||
let userGroups = []
|
let userGroups = []
|
||||||
$groups.forEach(group => {
|
$groups.forEach(group => {
|
||||||
if (group.users) {
|
if (group.users) {
|
||||||
|
@ -110,15 +118,21 @@
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
user.tenantOwnerEmail = tenantOwner?.email
|
||||||
|
const role = Constants.ExtendedBudibaseRoleOptions.find(
|
||||||
|
x => x.value === users.getUserRole(user)
|
||||||
|
)
|
||||||
return {
|
return {
|
||||||
...user,
|
...user,
|
||||||
name: user.firstName ? user.firstName + " " + user.lastName : "",
|
name: user.firstName ? user.firstName + " " + user.lastName : "",
|
||||||
userGroups,
|
userGroups,
|
||||||
|
__selectable:
|
||||||
|
role.value === Constants.BudibaseRoles.Owner ? false : undefined,
|
||||||
apps: [...new Set(Object.keys(user.roles))],
|
apps: [...new Set(Object.keys(user.roles))],
|
||||||
|
access: role.sortOrder,
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
const getPendingSchema = tblSchema => {
|
const getPendingSchema = tblSchema => {
|
||||||
if (!tblSchema) {
|
if (!tblSchema) {
|
||||||
return {}
|
return {}
|
||||||
|
@ -302,6 +316,8 @@
|
||||||
groupsLoaded = true
|
groupsLoaded = true
|
||||||
pendingInvites = await users.getInvites()
|
pendingInvites = await users.getInvites()
|
||||||
invitesLoaded = true
|
invitesLoaded = true
|
||||||
|
tenantOwner = await users.tenantOwner($auth.tenantId)
|
||||||
|
tenantOwnerLoaded = true
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
notifications.error("Error fetching user group data")
|
notifications.error("Error fetching user group data")
|
||||||
}
|
}
|
||||||
|
@ -376,6 +392,7 @@
|
||||||
allowSelectRows={!readonly}
|
allowSelectRows={!readonly}
|
||||||
{customRenderers}
|
{customRenderers}
|
||||||
loading={!$fetch.loaded || !groupsLoaded}
|
loading={!$fetch.loaded || !groupsLoaded}
|
||||||
|
defaultSortColumn={"access"}
|
||||||
/>
|
/>
|
||||||
|
|
||||||
<div class="pagination">
|
<div class="pagination">
|
||||||
|
|
|
@ -198,7 +198,7 @@ export const createLicensingStore = () => {
|
||||||
}, {})
|
}, {})
|
||||||
}
|
}
|
||||||
const monthlyMetrics = getMetrics(
|
const monthlyMetrics = getMetrics(
|
||||||
["dayPasses", "queries", "automations"],
|
["queries", "automations"],
|
||||||
license.quotas.usage.monthly,
|
license.quotas.usage.monthly,
|
||||||
usage.monthly.current
|
usage.monthly.current
|
||||||
)
|
)
|
||||||
|
|
|
@ -128,8 +128,15 @@ export function createUsersStore() {
|
||||||
return await API.removeAppBuilder({ userId, appId })
|
return await API.removeAppBuilder({ userId, appId })
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async function getTenantOwner(tenantId) {
|
||||||
|
const tenantInfo = await API.getTenantInfo({ tenantId })
|
||||||
|
return tenantInfo?.owner
|
||||||
|
}
|
||||||
|
|
||||||
const getUserRole = user => {
|
const getUserRole = user => {
|
||||||
if (sdk.users.isAdmin(user)) {
|
if (user && user.email === user.tenantOwnerEmail) {
|
||||||
|
return Constants.BudibaseRoles.Owner
|
||||||
|
} else if (sdk.users.isAdmin(user)) {
|
||||||
return Constants.BudibaseRoles.Admin
|
return Constants.BudibaseRoles.Admin
|
||||||
} else if (sdk.users.isBuilder(user)) {
|
} else if (sdk.users.isBuilder(user)) {
|
||||||
return Constants.BudibaseRoles.Developer
|
return Constants.BudibaseRoles.Developer
|
||||||
|
@ -169,6 +176,7 @@ export function createUsersStore() {
|
||||||
save: refreshUsage(save),
|
save: refreshUsage(save),
|
||||||
bulkDelete: refreshUsage(bulkDelete),
|
bulkDelete: refreshUsage(bulkDelete),
|
||||||
delete: refreshUsage(del),
|
delete: refreshUsage(del),
|
||||||
|
tenantOwner: getTenantOwner,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -42,6 +42,7 @@
|
||||||
import FreeFooter from "components/FreeFooter.svelte"
|
import FreeFooter from "components/FreeFooter.svelte"
|
||||||
import MaintenanceScreen from "components/MaintenanceScreen.svelte"
|
import MaintenanceScreen from "components/MaintenanceScreen.svelte"
|
||||||
import SnippetsProvider from "./context/SnippetsProvider.svelte"
|
import SnippetsProvider from "./context/SnippetsProvider.svelte"
|
||||||
|
import EmbedProvider from "./context/EmbedProvider.svelte"
|
||||||
|
|
||||||
// Provide contexts
|
// Provide contexts
|
||||||
setContext("sdk", SDK)
|
setContext("sdk", SDK)
|
||||||
|
@ -160,116 +161,119 @@
|
||||||
{#if $environmentStore.maintenance.length > 0}
|
{#if $environmentStore.maintenance.length > 0}
|
||||||
<MaintenanceScreen maintenanceList={$environmentStore.maintenance} />
|
<MaintenanceScreen maintenanceList={$environmentStore.maintenance} />
|
||||||
{:else}
|
{:else}
|
||||||
<DeviceBindingsProvider>
|
<EmbedProvider>
|
||||||
<UserBindingsProvider>
|
<DeviceBindingsProvider>
|
||||||
<StateBindingsProvider>
|
<UserBindingsProvider>
|
||||||
<RowSelectionProvider>
|
<StateBindingsProvider>
|
||||||
<QueryParamsProvider>
|
<RowSelectionProvider>
|
||||||
<SnippetsProvider>
|
<QueryParamsProvider>
|
||||||
<!-- Settings bar can be rendered outside of device preview -->
|
<SnippetsProvider>
|
||||||
<!-- Key block needs to be outside the if statement or it breaks -->
|
<!-- Settings bar can be rendered outside of device preview -->
|
||||||
{#key $builderStore.selectedComponentId}
|
<!-- Key block needs to be outside the if statement or it breaks -->
|
||||||
{#if $builderStore.inBuilder}
|
{#key $builderStore.selectedComponentId}
|
||||||
<SettingsBar />
|
{#if $builderStore.inBuilder}
|
||||||
{/if}
|
<SettingsBar />
|
||||||
{/key}
|
|
||||||
|
|
||||||
<!-- Clip boundary for selection indicators -->
|
|
||||||
<div
|
|
||||||
id="clip-root"
|
|
||||||
class:preview={$builderStore.inBuilder}
|
|
||||||
class:tablet-preview={$builderStore.previewDevice ===
|
|
||||||
"tablet"}
|
|
||||||
class:mobile-preview={$builderStore.previewDevice ===
|
|
||||||
"mobile"}
|
|
||||||
>
|
|
||||||
<!-- Actual app -->
|
|
||||||
<div id="app-root">
|
|
||||||
{#if showDevTools}
|
|
||||||
<DevToolsHeader />
|
|
||||||
{/if}
|
{/if}
|
||||||
|
{/key}
|
||||||
|
|
||||||
<div id="app-body">
|
<!-- Clip boundary for selection indicators -->
|
||||||
{#if permissionError}
|
<div
|
||||||
<div class="error">
|
id="clip-root"
|
||||||
<Layout justifyItems="center" gap="S">
|
class:preview={$builderStore.inBuilder}
|
||||||
<!-- eslint-disable-next-line svelte/no-at-html-tags -->
|
class:tablet-preview={$builderStore.previewDevice ===
|
||||||
{@html ErrorSVG}
|
"tablet"}
|
||||||
<Heading size="L">
|
class:mobile-preview={$builderStore.previewDevice ===
|
||||||
You don't have permission to use this app
|
"mobile"}
|
||||||
</Heading>
|
>
|
||||||
<Body size="S">
|
<!-- Actual app -->
|
||||||
Ask your administrator to grant you access
|
<div id="app-root">
|
||||||
</Body>
|
{#if showDevTools}
|
||||||
</Layout>
|
<DevToolsHeader />
|
||||||
</div>
|
|
||||||
{:else if !$screenStore.activeLayout}
|
|
||||||
<div class="error">
|
|
||||||
<Layout justifyItems="center" gap="S">
|
|
||||||
<!-- eslint-disable-next-line svelte/no-at-html-tags -->
|
|
||||||
{@html ErrorSVG}
|
|
||||||
<Heading size="L">
|
|
||||||
Something went wrong rendering your app
|
|
||||||
</Heading>
|
|
||||||
<Body size="S">
|
|
||||||
Get in touch with support if this issue persists
|
|
||||||
</Body>
|
|
||||||
</Layout>
|
|
||||||
</div>
|
|
||||||
{:else if embedNoScreens}
|
|
||||||
<div class="error">
|
|
||||||
<Layout justifyItems="center" gap="S">
|
|
||||||
<!-- eslint-disable-next-line svelte/no-at-html-tags -->
|
|
||||||
{@html ErrorSVG}
|
|
||||||
<Heading size="L">
|
|
||||||
This Budibase app is not publicly accessible
|
|
||||||
</Heading>
|
|
||||||
</Layout>
|
|
||||||
</div>
|
|
||||||
{:else}
|
|
||||||
<CustomThemeWrapper>
|
|
||||||
{#key $screenStore.activeLayout._id}
|
|
||||||
<Component
|
|
||||||
isLayout
|
|
||||||
instance={$screenStore.activeLayout.props}
|
|
||||||
/>
|
|
||||||
{/key}
|
|
||||||
|
|
||||||
<!-- Layers on top of app -->
|
|
||||||
<NotificationDisplay />
|
|
||||||
<ConfirmationDisplay />
|
|
||||||
<PeekScreenDisplay />
|
|
||||||
</CustomThemeWrapper>
|
|
||||||
{/if}
|
{/if}
|
||||||
|
|
||||||
{#if showDevTools}
|
<div id="app-body">
|
||||||
<DevTools />
|
{#if permissionError}
|
||||||
|
<div class="error">
|
||||||
|
<Layout justifyItems="center" gap="S">
|
||||||
|
<!-- eslint-disable-next-line svelte/no-at-html-tags -->
|
||||||
|
{@html ErrorSVG}
|
||||||
|
<Heading size="L">
|
||||||
|
You don't have permission to use this app
|
||||||
|
</Heading>
|
||||||
|
<Body size="S">
|
||||||
|
Ask your administrator to grant you access
|
||||||
|
</Body>
|
||||||
|
</Layout>
|
||||||
|
</div>
|
||||||
|
{:else if !$screenStore.activeLayout}
|
||||||
|
<div class="error">
|
||||||
|
<Layout justifyItems="center" gap="S">
|
||||||
|
<!-- eslint-disable-next-line svelte/no-at-html-tags -->
|
||||||
|
{@html ErrorSVG}
|
||||||
|
<Heading size="L">
|
||||||
|
Something went wrong rendering your app
|
||||||
|
</Heading>
|
||||||
|
<Body size="S">
|
||||||
|
Get in touch with support if this issue
|
||||||
|
persists
|
||||||
|
</Body>
|
||||||
|
</Layout>
|
||||||
|
</div>
|
||||||
|
{:else if embedNoScreens}
|
||||||
|
<div class="error">
|
||||||
|
<Layout justifyItems="center" gap="S">
|
||||||
|
<!-- eslint-disable-next-line svelte/no-at-html-tags -->
|
||||||
|
{@html ErrorSVG}
|
||||||
|
<Heading size="L">
|
||||||
|
This Budibase app is not publicly accessible
|
||||||
|
</Heading>
|
||||||
|
</Layout>
|
||||||
|
</div>
|
||||||
|
{:else}
|
||||||
|
<CustomThemeWrapper>
|
||||||
|
{#key $screenStore.activeLayout._id}
|
||||||
|
<Component
|
||||||
|
isLayout
|
||||||
|
instance={$screenStore.activeLayout.props}
|
||||||
|
/>
|
||||||
|
{/key}
|
||||||
|
|
||||||
|
<!-- Layers on top of app -->
|
||||||
|
<NotificationDisplay />
|
||||||
|
<ConfirmationDisplay />
|
||||||
|
<PeekScreenDisplay />
|
||||||
|
</CustomThemeWrapper>
|
||||||
|
{/if}
|
||||||
|
|
||||||
|
{#if showDevTools}
|
||||||
|
<DevTools />
|
||||||
|
{/if}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{#if !$builderStore.inBuilder && $featuresStore.logoEnabled}
|
||||||
|
<FreeFooter />
|
||||||
{/if}
|
{/if}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{#if !$builderStore.inBuilder && $featuresStore.logoEnabled}
|
<!-- Preview and dev tools utilities -->
|
||||||
<FreeFooter />
|
{#if $appStore.isDevApp}
|
||||||
|
<SelectionIndicator />
|
||||||
|
{/if}
|
||||||
|
{#if $builderStore.inBuilder || $devToolsStore.allowSelection}
|
||||||
|
<HoverIndicator />
|
||||||
|
{/if}
|
||||||
|
{#if $builderStore.inBuilder}
|
||||||
|
<DNDHandler />
|
||||||
|
<GridDNDHandler />
|
||||||
{/if}
|
{/if}
|
||||||
</div>
|
</div>
|
||||||
|
</SnippetsProvider>
|
||||||
<!-- Preview and dev tools utilities -->
|
</QueryParamsProvider>
|
||||||
{#if $appStore.isDevApp}
|
</RowSelectionProvider>
|
||||||
<SelectionIndicator />
|
</StateBindingsProvider>
|
||||||
{/if}
|
</UserBindingsProvider>
|
||||||
{#if $builderStore.inBuilder || $devToolsStore.allowSelection}
|
</DeviceBindingsProvider>
|
||||||
<HoverIndicator />
|
</EmbedProvider>
|
||||||
{/if}
|
|
||||||
{#if $builderStore.inBuilder}
|
|
||||||
<DNDHandler />
|
|
||||||
<GridDNDHandler />
|
|
||||||
{/if}
|
|
||||||
</div>
|
|
||||||
</SnippetsProvider>
|
|
||||||
</QueryParamsProvider>
|
|
||||||
</RowSelectionProvider>
|
|
||||||
</StateBindingsProvider>
|
|
||||||
</UserBindingsProvider>
|
|
||||||
</DeviceBindingsProvider>
|
|
||||||
{/if}
|
{/if}
|
||||||
</div>
|
</div>
|
||||||
<KeyboardManager />
|
<KeyboardManager />
|
||||||
|
|
|
@ -0,0 +1,43 @@
|
||||||
|
<script>
|
||||||
|
import Provider from "./Provider.svelte"
|
||||||
|
import { onMount } from "svelte"
|
||||||
|
|
||||||
|
let data = {}
|
||||||
|
|
||||||
|
function extractDomainFromUrl(url) {
|
||||||
|
const { hostname } = new URL(url)
|
||||||
|
const parts = hostname.split(".")
|
||||||
|
const tld = parts.slice(-2).join(".")
|
||||||
|
return tld
|
||||||
|
}
|
||||||
|
|
||||||
|
function handleMessage(event) {
|
||||||
|
if (event.data?.type !== "bb-parent-window-event") {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// Validate the event origin to ensure it's coming from a trusted source
|
||||||
|
// Allow different subdomains but must match TLD
|
||||||
|
const appOrigin = extractDomainFromUrl(window.location.origin)
|
||||||
|
const eventOrigin = extractDomainFromUrl(event.origin)
|
||||||
|
|
||||||
|
if (appOrigin === eventOrigin) {
|
||||||
|
data = event.data
|
||||||
|
} else {
|
||||||
|
console.error(
|
||||||
|
`Embedded budibase app domain ${appOrigin} does not match origin of event ${eventOrigin}.
|
||||||
|
Top level domains must match`
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
onMount(() => {
|
||||||
|
window.addEventListener("message", handleMessage)
|
||||||
|
|
||||||
|
return () => window.removeEventListener("message", handleMessage)
|
||||||
|
})
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<Provider key="embed" {data}>
|
||||||
|
<slot />
|
||||||
|
</Provider>
|
|
@ -295,4 +295,10 @@ export const buildUserEndpoints = API => ({
|
||||||
url: `/api/global/users/${userId}/app/${appId}/builder`,
|
url: `/api/global/users/${userId}/app/${appId}/builder`,
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
|
|
||||||
|
getTenantInfo: async ({ tenantId }) => {
|
||||||
|
return await API.get({
|
||||||
|
url: `/api/global/tenant/${tenantId}`,
|
||||||
|
})
|
||||||
|
},
|
||||||
})
|
})
|
||||||
|
|
|
@ -41,6 +41,7 @@ export const BudibaseRoles = {
|
||||||
Developer: "developer",
|
Developer: "developer",
|
||||||
Creator: "creator",
|
Creator: "creator",
|
||||||
Admin: "admin",
|
Admin: "admin",
|
||||||
|
Owner: "owner",
|
||||||
}
|
}
|
||||||
|
|
||||||
export const BudibaseRoleOptionsOld = [
|
export const BudibaseRoleOptionsOld = [
|
||||||
|
@ -54,18 +55,28 @@ export const BudibaseRoleOptions = [
|
||||||
label: "Account admin",
|
label: "Account admin",
|
||||||
value: BudibaseRoles.Admin,
|
value: BudibaseRoles.Admin,
|
||||||
subtitle: "Has full access to all apps and settings in your account",
|
subtitle: "Has full access to all apps and settings in your account",
|
||||||
|
sortOrder: 1,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: "Creator",
|
label: "Creator",
|
||||||
value: BudibaseRoles.Creator,
|
value: BudibaseRoles.Creator,
|
||||||
subtitle: "Can create and edit apps they have access to",
|
subtitle: "Can create and edit apps they have access to",
|
||||||
|
sortOrder: 2,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: "App user",
|
label: "App user",
|
||||||
value: BudibaseRoles.AppUser,
|
value: BudibaseRoles.AppUser,
|
||||||
subtitle: "Can only use published apps they have access to",
|
subtitle: "Can only use published apps they have access to",
|
||||||
|
sortOrder: 3,
|
||||||
},
|
},
|
||||||
]
|
]
|
||||||
|
export const ExtendedBudibaseRoleOptions = [
|
||||||
|
{
|
||||||
|
label: "Account holder",
|
||||||
|
value: BudibaseRoles.Owner,
|
||||||
|
sortOrder: 0,
|
||||||
|
},
|
||||||
|
].concat(BudibaseRoleOptions)
|
||||||
|
|
||||||
export const PlanType = {
|
export const PlanType = {
|
||||||
FREE: "free",
|
FREE: "free",
|
||||||
|
|
|
@ -1 +1 @@
|
||||||
Subproject commit d926494cc54e31441637180a745d0df7156a5120
|
Subproject commit a4d1d15d9ce6ac3deedb2e42625c90ba32756758
|
|
@ -47,7 +47,6 @@ async function init() {
|
||||||
HTTP_LOGGING: "0",
|
HTTP_LOGGING: "0",
|
||||||
VERSION: "0.0.0+local",
|
VERSION: "0.0.0+local",
|
||||||
PASSWORD_MIN_LENGTH: "1",
|
PASSWORD_MIN_LENGTH: "1",
|
||||||
TENANT_FEATURE_FLAGS: "*:SQS",
|
|
||||||
}
|
}
|
||||||
|
|
||||||
config = { ...config, ...existingConfig }
|
config = { ...config, ...existingConfig }
|
||||||
|
|
|
@ -159,7 +159,7 @@ describe("run misc tests", () => {
|
||||||
const rowThree = rows.find(row => row.e === 3)
|
const rowThree = rows.find(row => row.e === 3)
|
||||||
expect(rowThree.a).toEqual("9")
|
expect(rowThree.a).toEqual("9")
|
||||||
expect(rowThree.f).toEqual(["Two", "Four"])
|
expect(rowThree.f).toEqual(["Two", "Four"])
|
||||||
expect(rowThree.g).toEqual(null)
|
expect(rowThree.g).toEqual(undefined)
|
||||||
|
|
||||||
const rowFour = rows.find(row => row.e === 4)
|
const rowFour = rows.find(row => row.e === 4)
|
||||||
expect(rowFour.a).toEqual("13")
|
expect(rowFour.a).toEqual("13")
|
||||||
|
|
|
@ -95,9 +95,11 @@ describe.each([
|
||||||
let envCleanup: (() => void) | undefined
|
let envCleanup: (() => void) | undefined
|
||||||
|
|
||||||
beforeAll(async () => {
|
beforeAll(async () => {
|
||||||
await withCoreEnv({ TENANT_FEATURE_FLAGS: "*SQS" }, () => config.init())
|
await withCoreEnv({ TENANT_FEATURE_FLAGS: "*:SQS" }, () => config.init())
|
||||||
if (isSqs) {
|
if (isLucene) {
|
||||||
envCleanup = setCoreEnv({ TENANT_FEATURE_FLAGS: "*SQS" })
|
envCleanup = setCoreEnv({ TENANT_FEATURE_FLAGS: "*:!SQS" })
|
||||||
|
} else if (isSqs) {
|
||||||
|
envCleanup = setCoreEnv({ TENANT_FEATURE_FLAGS: "*:SQS" })
|
||||||
}
|
}
|
||||||
|
|
||||||
if (dsProvider) {
|
if (dsProvider) {
|
||||||
|
|
|
@ -68,7 +68,11 @@ describe.each([
|
||||||
|
|
||||||
beforeAll(async () => {
|
beforeAll(async () => {
|
||||||
await withCoreEnv({ TENANT_FEATURE_FLAGS: "*:SQS" }, () => config.init())
|
await withCoreEnv({ TENANT_FEATURE_FLAGS: "*:SQS" }, () => config.init())
|
||||||
if (isSqs) {
|
if (isLucene) {
|
||||||
|
envCleanup = setCoreEnv({
|
||||||
|
TENANT_FEATURE_FLAGS: "*:!SQS",
|
||||||
|
})
|
||||||
|
} else if (isSqs) {
|
||||||
envCleanup = setCoreEnv({
|
envCleanup = setCoreEnv({
|
||||||
TENANT_FEATURE_FLAGS: "*:SQS",
|
TENANT_FEATURE_FLAGS: "*:SQS",
|
||||||
})
|
})
|
||||||
|
|
|
@ -35,7 +35,7 @@ const { basicTable } = setup.structures
|
||||||
const ISO_REGEX_PATTERN = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{3}Z$/
|
const ISO_REGEX_PATTERN = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{3}Z$/
|
||||||
|
|
||||||
describe.each([
|
describe.each([
|
||||||
["internal", undefined],
|
["sqs", undefined],
|
||||||
[DatabaseName.POSTGRES, getDatasource(DatabaseName.POSTGRES)],
|
[DatabaseName.POSTGRES, getDatasource(DatabaseName.POSTGRES)],
|
||||||
[DatabaseName.MYSQL, getDatasource(DatabaseName.MYSQL)],
|
[DatabaseName.MYSQL, getDatasource(DatabaseName.MYSQL)],
|
||||||
[DatabaseName.SQL_SERVER, getDatasource(DatabaseName.SQL_SERVER)],
|
[DatabaseName.SQL_SERVER, getDatasource(DatabaseName.SQL_SERVER)],
|
||||||
|
@ -290,7 +290,7 @@ describe.each([
|
||||||
expected._rev = expect.stringMatching(/^2-.+/)
|
expected._rev = expect.stringMatching(/^2-.+/)
|
||||||
}
|
}
|
||||||
|
|
||||||
expect(updatedTable).toEqual(expected)
|
expect(updatedTable).toEqual(expect.objectContaining(expected))
|
||||||
|
|
||||||
const persistedTable = await config.api.table.get(updatedTable._id!)
|
const persistedTable = await config.api.table.get(updatedTable._id!)
|
||||||
expected = {
|
expected = {
|
||||||
|
@ -304,7 +304,7 @@ describe.each([
|
||||||
if (isInternal) {
|
if (isInternal) {
|
||||||
expected._rev = expect.stringMatching(/^2-.+/)
|
expected._rev = expect.stringMatching(/^2-.+/)
|
||||||
}
|
}
|
||||||
expect(persistedTable).toEqual(expected)
|
expect(persistedTable).toEqual(expect.objectContaining(expected))
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
|
@ -687,7 +687,7 @@ describe.each([
|
||||||
basicTable(datasource, { name: generator.guid() })
|
basicTable(datasource, { name: generator.guid() })
|
||||||
)
|
)
|
||||||
const res = await config.api.table.get(table._id!)
|
const res = await config.api.table.get(table._id!)
|
||||||
expect(res).toEqual(table)
|
expect(res).toEqual(expect.objectContaining(table))
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
|
@ -727,10 +727,12 @@ describe.each([
|
||||||
body: { message: `Table ${testTable._id} deleted.` },
|
body: { message: `Table ${testTable._id} deleted.` },
|
||||||
})
|
})
|
||||||
expect(events.table.deleted).toHaveBeenCalledTimes(1)
|
expect(events.table.deleted).toHaveBeenCalledTimes(1)
|
||||||
expect(events.table.deleted).toHaveBeenCalledWith({
|
expect(events.table.deleted).toHaveBeenCalledWith(
|
||||||
...testTable,
|
expect.objectContaining({
|
||||||
tableId: testTable._id,
|
...testTable,
|
||||||
})
|
tableId: testTable._id,
|
||||||
|
})
|
||||||
|
)
|
||||||
})
|
})
|
||||||
|
|
||||||
it("deletes linked references to the table after deletion", async () => {
|
it("deletes linked references to the table after deletion", async () => {
|
||||||
|
|
|
@ -444,7 +444,10 @@ describe("/views", () => {
|
||||||
|
|
||||||
assertJsonExport(res)
|
assertJsonExport(res)
|
||||||
expect(events.table.exported).toHaveBeenCalledTimes(1)
|
expect(events.table.exported).toHaveBeenCalledTimes(1)
|
||||||
expect(events.table.exported).toHaveBeenCalledWith(table, "json")
|
expect(events.table.exported).toHaveBeenCalledWith(
|
||||||
|
expect.objectContaining(table),
|
||||||
|
"json"
|
||||||
|
)
|
||||||
})
|
})
|
||||||
|
|
||||||
it("should be able to export a table as CSV", async () => {
|
it("should be able to export a table as CSV", async () => {
|
||||||
|
@ -454,7 +457,10 @@ describe("/views", () => {
|
||||||
|
|
||||||
assertCSVExport(res)
|
assertCSVExport(res)
|
||||||
expect(events.table.exported).toHaveBeenCalledTimes(1)
|
expect(events.table.exported).toHaveBeenCalledTimes(1)
|
||||||
expect(events.table.exported).toHaveBeenCalledWith(table, "csv")
|
expect(events.table.exported).toHaveBeenCalledWith(
|
||||||
|
expect.objectContaining(table),
|
||||||
|
"csv"
|
||||||
|
)
|
||||||
})
|
})
|
||||||
|
|
||||||
it("should be able to export a view as JSON", async () => {
|
it("should be able to export a view as JSON", async () => {
|
||||||
|
|
|
@ -97,7 +97,11 @@ describe.each([
|
||||||
await withCoreEnv({ TENANT_FEATURE_FLAGS: isSqs ? "*:SQS" : "" }, () =>
|
await withCoreEnv({ TENANT_FEATURE_FLAGS: isSqs ? "*:SQS" : "" }, () =>
|
||||||
config.init()
|
config.init()
|
||||||
)
|
)
|
||||||
if (isSqs) {
|
if (isLucene) {
|
||||||
|
envCleanup = setCoreEnv({
|
||||||
|
TENANT_FEATURE_FLAGS: "*:!SQS",
|
||||||
|
})
|
||||||
|
} else if (isSqs) {
|
||||||
envCleanup = setCoreEnv({
|
envCleanup = setCoreEnv({
|
||||||
TENANT_FEATURE_FLAGS: "*:SQS",
|
TENANT_FEATURE_FLAGS: "*:SQS",
|
||||||
})
|
})
|
||||||
|
|
|
@ -45,7 +45,11 @@ describe.each([
|
||||||
config.init()
|
config.init()
|
||||||
)
|
)
|
||||||
|
|
||||||
if (isSqs) {
|
if (isLucene) {
|
||||||
|
envCleanup = setCoreEnv({
|
||||||
|
TENANT_FEATURE_FLAGS: "*:!SQS",
|
||||||
|
})
|
||||||
|
} else if (isSqs) {
|
||||||
envCleanup = setCoreEnv({
|
envCleanup = setCoreEnv({
|
||||||
TENANT_FEATURE_FLAGS: "*:SQS",
|
TENANT_FEATURE_FLAGS: "*:SQS",
|
||||||
})
|
})
|
||||||
|
|
|
@ -37,6 +37,19 @@ export type ViewUIFieldMetadata = UIFieldMetadata & {
|
||||||
readonly?: boolean
|
readonly?: boolean
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export enum CalculationType {
|
||||||
|
SUM = "sum",
|
||||||
|
AVG = "avg",
|
||||||
|
COUNT = "count",
|
||||||
|
MIN = "min",
|
||||||
|
MAX = "max",
|
||||||
|
}
|
||||||
|
|
||||||
|
export type ViewCalculationFieldMetadata = ViewUIFieldMetadata & {
|
||||||
|
calculationType: CalculationType
|
||||||
|
field: string
|
||||||
|
}
|
||||||
|
|
||||||
export interface ViewV2 {
|
export interface ViewV2 {
|
||||||
version: 2
|
version: 2
|
||||||
id: string
|
id: string
|
||||||
|
@ -49,7 +62,7 @@ export interface ViewV2 {
|
||||||
order?: SortOrder
|
order?: SortOrder
|
||||||
type?: SortType
|
type?: SortType
|
||||||
}
|
}
|
||||||
schema?: Record<string, ViewUIFieldMetadata>
|
schema?: Record<string, ViewUIFieldMetadata | ViewCalculationFieldMetadata>
|
||||||
}
|
}
|
||||||
|
|
||||||
export type ViewSchema = ViewCountOrSumSchema | ViewStatisticsSchema
|
export type ViewSchema = ViewCountOrSumSchema | ViewStatisticsSchema
|
||||||
|
|
|
@ -30,7 +30,6 @@ async function init() {
|
||||||
HTTP_LOGGING: "0",
|
HTTP_LOGGING: "0",
|
||||||
VERSION: "0.0.0+local",
|
VERSION: "0.0.0+local",
|
||||||
PASSWORD_MIN_LENGTH: "1",
|
PASSWORD_MIN_LENGTH: "1",
|
||||||
TENANT_FEATURE_FLAGS: "*:SQS",
|
|
||||||
}
|
}
|
||||||
|
|
||||||
config = { ...config, ...existingConfig }
|
config = { ...config, ...existingConfig }
|
||||||
|
|
|
@ -54,6 +54,17 @@ export const save = async (ctx: UserCtx<User, SaveUserResponse>) => {
|
||||||
const currentUserId = ctx.user?._id
|
const currentUserId = ctx.user?._id
|
||||||
const requestUser = ctx.request.body
|
const requestUser = ctx.request.body
|
||||||
|
|
||||||
|
// Do not allow the account holder role to be changed
|
||||||
|
const tenantInfo = await tenancy.getTenantInfo(requestUser.tenantId)
|
||||||
|
if (tenantInfo?.owner.email === requestUser.email) {
|
||||||
|
if (
|
||||||
|
requestUser.admin?.global !== true ||
|
||||||
|
requestUser.builder?.global !== true
|
||||||
|
) {
|
||||||
|
throw Error("Cannot set role of account holder")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
const user = await userSdk.db.save(requestUser, { currentUserId })
|
const user = await userSdk.db.save(requestUser, { currentUserId })
|
||||||
|
|
||||||
ctx.body = {
|
ctx.body = {
|
||||||
|
|
|
@ -1,36 +1,11 @@
|
||||||
import Router from "@koa/router"
|
import Router from "@koa/router"
|
||||||
import Joi from "joi"
|
|
||||||
import { auth } from "@budibase/backend-core"
|
|
||||||
import * as controller from "../../controllers/global/tenant"
|
import * as controller from "../../controllers/global/tenant"
|
||||||
import cloudRestricted from "../../../middleware/cloudRestricted"
|
import cloudRestricted from "../../../middleware/cloudRestricted"
|
||||||
|
|
||||||
const router: Router = new Router()
|
const router: Router = new Router()
|
||||||
const OPTIONAL_STRING = Joi.string().optional().allow(null).allow("")
|
|
||||||
|
|
||||||
function buildTenantInfoValidation() {
|
|
||||||
return auth.joiValidator.body(
|
|
||||||
Joi.object({
|
|
||||||
owner: Joi.object({
|
|
||||||
email: Joi.string().required(),
|
|
||||||
password: OPTIONAL_STRING,
|
|
||||||
ssoId: OPTIONAL_STRING,
|
|
||||||
givenName: OPTIONAL_STRING,
|
|
||||||
familyName: OPTIONAL_STRING,
|
|
||||||
budibaseUserId: OPTIONAL_STRING,
|
|
||||||
}).required(),
|
|
||||||
hosting: Joi.string().required(),
|
|
||||||
tenantId: Joi.string().required(),
|
|
||||||
}).required()
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
router
|
router
|
||||||
.post(
|
.post("/api/global/tenant", cloudRestricted, controller.save)
|
||||||
"/api/global/tenant",
|
|
||||||
cloudRestricted,
|
|
||||||
buildTenantInfoValidation(),
|
|
||||||
controller.save
|
|
||||||
)
|
|
||||||
.get("/api/global/tenant/:id", controller.get)
|
.get("/api/global/tenant/:id", controller.get)
|
||||||
|
|
||||||
export default router
|
export default router
|
||||||
|
|
|
@ -17,7 +17,9 @@ describe.each(["lucene", "sql"])("/api/global/auditlogs (%s)", method => {
|
||||||
let envCleanup: (() => void) | undefined
|
let envCleanup: (() => void) | undefined
|
||||||
|
|
||||||
beforeAll(async () => {
|
beforeAll(async () => {
|
||||||
if (method === "sql") {
|
if (method === "lucene") {
|
||||||
|
envCleanup = setCoreEnv({ TENANT_FEATURE_FLAGS: "*:!SQS" })
|
||||||
|
} else if (method === "sql") {
|
||||||
envCleanup = setCoreEnv({ TENANT_FEATURE_FLAGS: "*:SQS" })
|
envCleanup = setCoreEnv({ TENANT_FEATURE_FLAGS: "*:SQS" })
|
||||||
}
|
}
|
||||||
await config.beforeAll()
|
await config.beforeAll()
|
||||||
|
|
|
@ -412,6 +412,28 @@ describe("/api/global/users", () => {
|
||||||
expect(events.user.permissionBuilderRemoved).toHaveBeenCalledTimes(1)
|
expect(events.user.permissionBuilderRemoved).toHaveBeenCalledTimes(1)
|
||||||
})
|
})
|
||||||
|
|
||||||
|
it("should not be able to update an account holder user to a basic user", async () => {
|
||||||
|
const accountHolderUser = await config.createUser(
|
||||||
|
structures.users.adminUser()
|
||||||
|
)
|
||||||
|
jest.clearAllMocks()
|
||||||
|
tenancy.getTenantInfo = jest.fn().mockImplementation(() => ({
|
||||||
|
owner: {
|
||||||
|
email: accountHolderUser.email,
|
||||||
|
},
|
||||||
|
}))
|
||||||
|
|
||||||
|
accountHolderUser.admin!.global = false
|
||||||
|
accountHolderUser.builder!.global = false
|
||||||
|
|
||||||
|
await config.api.users.saveUser(accountHolderUser, 400)
|
||||||
|
|
||||||
|
expect(events.user.created).not.toHaveBeenCalled()
|
||||||
|
expect(events.user.updated).not.toHaveBeenCalled()
|
||||||
|
expect(events.user.permissionAdminRemoved).not.toHaveBeenCalled()
|
||||||
|
expect(events.user.permissionBuilderRemoved).not.toHaveBeenCalled()
|
||||||
|
})
|
||||||
|
|
||||||
it("should be able to update an builder user to a basic user", async () => {
|
it("should be able to update an builder user to a basic user", async () => {
|
||||||
const user = await config.createUser(structures.users.builderUser())
|
const user = await config.createUser(structures.users.builderUser())
|
||||||
jest.clearAllMocks()
|
jest.clearAllMocks()
|
||||||
|
|
238
yarn.lock
238
yarn.lock
|
@ -2003,9 +2003,9 @@
|
||||||
regenerator-runtime "^0.14.0"
|
regenerator-runtime "^0.14.0"
|
||||||
|
|
||||||
"@babel/runtime@^7.13.10":
|
"@babel/runtime@^7.13.10":
|
||||||
version "7.25.0"
|
version "7.25.6"
|
||||||
resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.25.0.tgz#3af9a91c1b739c569d5d80cc917280919c544ecb"
|
resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.25.6.tgz#9afc3289f7184d8d7f98b099884c26317b9264d2"
|
||||||
integrity sha512-7dRy4DwXwtzBrPbZflqxnvfxLF8kdZXPkhymtDeFoFqE6ldzjQFgYTtYIFARcLEYDrqfBfYcZt1WqFxRoyC9Rw==
|
integrity sha512-VBj9MYyDb9tuLq7yzqjgzt6Q+IBQLrGZfdjOekyEirZPHxXWoTSGUTMrpsfi58Up73d13NfYLv8HT9vmznjzhQ==
|
||||||
dependencies:
|
dependencies:
|
||||||
regenerator-runtime "^0.14.0"
|
regenerator-runtime "^0.14.0"
|
||||||
|
|
||||||
|
@ -2200,9 +2200,9 @@
|
||||||
"@bull-board/api" "5.10.2"
|
"@bull-board/api" "5.10.2"
|
||||||
|
|
||||||
"@camunda8/sdk@^8.5.3":
|
"@camunda8/sdk@^8.5.3":
|
||||||
version "8.6.10"
|
version "8.6.12"
|
||||||
resolved "https://registry.yarnpkg.com/@camunda8/sdk/-/sdk-8.6.10.tgz#61fdadc6bc89a234648ba4bc622b0db10f283de9"
|
resolved "https://registry.yarnpkg.com/@camunda8/sdk/-/sdk-8.6.12.tgz#8a210359cd9873b9e1750dcde45e62045409cc17"
|
||||||
integrity sha512-FzSoLYd0yFFElC2G3NX93GnP7r53uQDR+6njV1EEAGPhz4QQfZeEW07vMNZ9BFeNn5jhtv9IWmHdHxYwJxxmcw==
|
integrity sha512-dQNw9rMCrL0hJezjAeCAJWMyhuV/ouizP21UzgG9Edqnj/od9ko9XQjEd/AuSj9VMEEQ+bt40mBMnZszbISONg==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@grpc/grpc-js" "1.10.9"
|
"@grpc/grpc-js" "1.10.9"
|
||||||
"@grpc/proto-loader" "0.7.13"
|
"@grpc/proto-loader" "0.7.13"
|
||||||
|
@ -2650,10 +2650,10 @@
|
||||||
resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.10.0.tgz#548f6de556857c8bb73bbee70c35dc82a2e74d63"
|
resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.10.0.tgz#548f6de556857c8bb73bbee70c35dc82a2e74d63"
|
||||||
integrity sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==
|
integrity sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==
|
||||||
|
|
||||||
"@eslint/config-array@^0.17.1":
|
"@eslint/config-array@^0.18.0":
|
||||||
version "0.17.1"
|
version "0.18.0"
|
||||||
resolved "https://registry.yarnpkg.com/@eslint/config-array/-/config-array-0.17.1.tgz#d9b8b8b6b946f47388f32bedfd3adf29ca8f8910"
|
resolved "https://registry.yarnpkg.com/@eslint/config-array/-/config-array-0.18.0.tgz#37d8fe656e0d5e3dbaea7758ea56540867fd074d"
|
||||||
integrity sha512-BlYOpej8AQ8Ev9xVqroV7a02JK3SkBAaN9GfMMH9W6Ch8FlQlkjGw4Ir7+FgYwfirivAf4t+GtzuAxqfukmISA==
|
integrity sha512-fTxvnS1sRMu3+JjXwJG0j/i4RT9u4qJ+lqS/yCGap4lH4zZGzQ7tu+xZqQmcMZq5OBZDL4QRxQzRjkWcGt8IVw==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@eslint/object-schema" "^2.1.4"
|
"@eslint/object-schema" "^2.1.4"
|
||||||
debug "^4.3.1"
|
debug "^4.3.1"
|
||||||
|
@ -2694,10 +2694,10 @@
|
||||||
resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.57.0.tgz#a5417ae8427873f1dd08b70b3574b453e67b5f7f"
|
resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.57.0.tgz#a5417ae8427873f1dd08b70b3574b453e67b5f7f"
|
||||||
integrity sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==
|
integrity sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==
|
||||||
|
|
||||||
"@eslint/js@9.9.0", "@eslint/js@^9.7.0":
|
"@eslint/js@9.9.1", "@eslint/js@^9.7.0":
|
||||||
version "9.9.0"
|
version "9.9.1"
|
||||||
resolved "https://registry.yarnpkg.com/@eslint/js/-/js-9.9.0.tgz#d8437adda50b3ed4401964517b64b4f59b0e2638"
|
resolved "https://registry.yarnpkg.com/@eslint/js/-/js-9.9.1.tgz#4a97e85e982099d6c7ee8410aacb55adaa576f06"
|
||||||
integrity sha512-hhetes6ZHP3BlXLxmd8K2SNgkhNSi+UcecbnwWKwpP7kyi/uC75DJ1lOOBO3xrC4jyojtGE3YxKZPHfk4yrgug==
|
integrity sha512-xIDQRsfg5hNBqHz04H1R3scSVwmI+KUbqjsQKHKQ1DAUSaUjYPReZZmS/5PNiKu1fUvzDd6H7DEDKACSEhu+TQ==
|
||||||
|
|
||||||
"@eslint/object-schema@^2.1.4":
|
"@eslint/object-schema@^2.1.4":
|
||||||
version "2.1.4"
|
version "2.1.4"
|
||||||
|
@ -4208,160 +4208,160 @@
|
||||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.18.0.tgz#bbd0e616b2078cd2d68afc9824d1fadb2f2ffd27"
|
resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.18.0.tgz#bbd0e616b2078cd2d68afc9824d1fadb2f2ffd27"
|
||||||
integrity sha512-Tya6xypR10giZV1XzxmH5wr25VcZSncG0pZIjfePT0OVBvqNEurzValetGNarVrGiq66EBVAFn15iYX4w6FKgQ==
|
integrity sha512-Tya6xypR10giZV1XzxmH5wr25VcZSncG0pZIjfePT0OVBvqNEurzValetGNarVrGiq66EBVAFn15iYX4w6FKgQ==
|
||||||
|
|
||||||
"@rollup/rollup-android-arm-eabi@4.21.0":
|
"@rollup/rollup-android-arm-eabi@4.21.2":
|
||||||
version "4.21.0"
|
version "4.21.2"
|
||||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.21.0.tgz#d941173f82f9b041c61b0dc1a2a91dcd06e4b31e"
|
resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.21.2.tgz#0412834dc423d1ff7be4cb1fc13a86a0cd262c11"
|
||||||
integrity sha512-WTWD8PfoSAJ+qL87lE7votj3syLavxunWhzCnx3XFxFiI/BA/r3X7MUM8dVrH8rb2r4AiO8jJsr3ZjdaftmnfA==
|
integrity sha512-fSuPrt0ZO8uXeS+xP3b+yYTCBUd05MoSp2N/MFOgjhhUhMmchXlpTQrTpI8T+YAwAQuK7MafsCOxW7VrPMrJcg==
|
||||||
|
|
||||||
"@rollup/rollup-android-arm64@4.18.0":
|
"@rollup/rollup-android-arm64@4.18.0":
|
||||||
version "4.18.0"
|
version "4.18.0"
|
||||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.18.0.tgz#97255ef6384c5f73f4800c0de91f5f6518e21203"
|
resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.18.0.tgz#97255ef6384c5f73f4800c0de91f5f6518e21203"
|
||||||
integrity sha512-avCea0RAP03lTsDhEyfy+hpfr85KfyTctMADqHVhLAF3MlIkq83CP8UfAHUssgXTYd+6er6PaAhx/QGv4L1EiA==
|
integrity sha512-avCea0RAP03lTsDhEyfy+hpfr85KfyTctMADqHVhLAF3MlIkq83CP8UfAHUssgXTYd+6er6PaAhx/QGv4L1EiA==
|
||||||
|
|
||||||
"@rollup/rollup-android-arm64@4.21.0":
|
"@rollup/rollup-android-arm64@4.21.2":
|
||||||
version "4.21.0"
|
version "4.21.2"
|
||||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.21.0.tgz#7e7157c8543215245ceffc445134d9e843ba51c0"
|
resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.21.2.tgz#baf1a014b13654f3b9e835388df9caf8c35389cb"
|
||||||
integrity sha512-a1sR2zSK1B4eYkiZu17ZUZhmUQcKjk2/j9Me2IDjk1GHW7LB5Z35LEzj9iJch6gtUfsnvZs1ZNyDW2oZSThrkA==
|
integrity sha512-xGU5ZQmPlsjQS6tzTTGwMsnKUtu0WVbl0hYpTPauvbRAnmIvpInhJtgjj3mcuJpEiuUw4v1s4BimkdfDWlh7gA==
|
||||||
|
|
||||||
"@rollup/rollup-darwin-arm64@4.18.0":
|
"@rollup/rollup-darwin-arm64@4.18.0":
|
||||||
version "4.18.0"
|
version "4.18.0"
|
||||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.18.0.tgz#b6dd74e117510dfe94541646067b0545b42ff096"
|
resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.18.0.tgz#b6dd74e117510dfe94541646067b0545b42ff096"
|
||||||
integrity sha512-IWfdwU7KDSm07Ty0PuA/W2JYoZ4iTj3TUQjkVsO/6U+4I1jN5lcR71ZEvRh52sDOERdnNhhHU57UITXz5jC1/w==
|
integrity sha512-IWfdwU7KDSm07Ty0PuA/W2JYoZ4iTj3TUQjkVsO/6U+4I1jN5lcR71ZEvRh52sDOERdnNhhHU57UITXz5jC1/w==
|
||||||
|
|
||||||
"@rollup/rollup-darwin-arm64@4.21.0":
|
"@rollup/rollup-darwin-arm64@4.21.2":
|
||||||
version "4.21.0"
|
version "4.21.2"
|
||||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.21.0.tgz#f0a18a4fc8dc6eb1e94a51fa2adb22876f477947"
|
resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.21.2.tgz#0a2c364e775acdf1172fe3327662eec7c46e55b1"
|
||||||
integrity sha512-zOnKWLgDld/svhKO5PD9ozmL6roy5OQ5T4ThvdYZLpiOhEGY+dp2NwUmxK0Ld91LrbjrvtNAE0ERBwjqhZTRAA==
|
integrity sha512-99AhQ3/ZMxU7jw34Sq8brzXqWH/bMnf7ZVhvLk9QU2cOepbQSVTns6qoErJmSiAvU3InRqC2RRZ5ovh1KN0d0Q==
|
||||||
|
|
||||||
"@rollup/rollup-darwin-x64@4.18.0":
|
"@rollup/rollup-darwin-x64@4.18.0":
|
||||||
version "4.18.0"
|
version "4.18.0"
|
||||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.18.0.tgz#e07d76de1cec987673e7f3d48ccb8e106d42c05c"
|
resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.18.0.tgz#e07d76de1cec987673e7f3d48ccb8e106d42c05c"
|
||||||
integrity sha512-n2LMsUz7Ynu7DoQrSQkBf8iNrjOGyPLrdSg802vk6XT3FtsgX6JbE8IHRvposskFm9SNxzkLYGSq9QdpLYpRNA==
|
integrity sha512-n2LMsUz7Ynu7DoQrSQkBf8iNrjOGyPLrdSg802vk6XT3FtsgX6JbE8IHRvposskFm9SNxzkLYGSq9QdpLYpRNA==
|
||||||
|
|
||||||
"@rollup/rollup-darwin-x64@4.21.0":
|
"@rollup/rollup-darwin-x64@4.21.2":
|
||||||
version "4.21.0"
|
version "4.21.2"
|
||||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.21.0.tgz#34b7867613e5cc42d2b85ddc0424228cc33b43f0"
|
resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.21.2.tgz#a972db75890dfab8df0da228c28993220a468c42"
|
||||||
integrity sha512-7doS8br0xAkg48SKE2QNtMSFPFUlRdw9+votl27MvT46vo44ATBmdZdGysOevNELmZlfd+NEa0UYOA8f01WSrg==
|
integrity sha512-ZbRaUvw2iN/y37x6dY50D8m2BnDbBjlnMPotDi/qITMJ4sIxNY33HArjikDyakhSv0+ybdUxhWxE6kTI4oX26w==
|
||||||
|
|
||||||
"@rollup/rollup-linux-arm-gnueabihf@4.18.0":
|
"@rollup/rollup-linux-arm-gnueabihf@4.18.0":
|
||||||
version "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"
|
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==
|
integrity sha512-C/zbRYRXFjWvz9Z4haRxcTdnkPt1BtCkz+7RtBSuNmKzMzp3ZxdM28Mpccn6pt28/UWUCTXa+b0Mx1k3g6NOMA==
|
||||||
|
|
||||||
"@rollup/rollup-linux-arm-gnueabihf@4.21.0":
|
"@rollup/rollup-linux-arm-gnueabihf@4.21.2":
|
||||||
version "4.21.0"
|
version "4.21.2"
|
||||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.21.0.tgz#422b19ff9ae02b05d3395183d1d43b38c7c8be0b"
|
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.21.2.tgz#1609d0630ef61109dd19a278353e5176d92e30a1"
|
||||||
integrity sha512-pWJsfQjNWNGsoCq53KjMtwdJDmh/6NubwQcz52aEwLEuvx08bzcy6tOUuawAOncPnxz/3siRtd8hiQ32G1y8VA==
|
integrity sha512-ztRJJMiE8nnU1YFcdbd9BcH6bGWG1z+jP+IPW2oDUAPxPjo9dverIOyXz76m6IPA6udEL12reYeLojzW2cYL7w==
|
||||||
|
|
||||||
"@rollup/rollup-linux-arm-musleabihf@4.18.0":
|
"@rollup/rollup-linux-arm-musleabihf@4.18.0":
|
||||||
version "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"
|
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.18.0.tgz#53618b92e6ffb642c7b620e6e528446511330549"
|
||||||
integrity sha512-l3m9ewPgjQSXrUMHg93vt0hYCGnrMOcUpTz6FLtbwljo2HluS4zTXFy2571YQbisTnfTKPZ01u/ukJdQTLGh9A==
|
integrity sha512-l3m9ewPgjQSXrUMHg93vt0hYCGnrMOcUpTz6FLtbwljo2HluS4zTXFy2571YQbisTnfTKPZ01u/ukJdQTLGh9A==
|
||||||
|
|
||||||
"@rollup/rollup-linux-arm-musleabihf@4.21.0":
|
"@rollup/rollup-linux-arm-musleabihf@4.21.2":
|
||||||
version "4.21.0"
|
version "4.21.2"
|
||||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.21.0.tgz#568aa29195ef6fc57ec6ed3f518923764406a8ee"
|
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.21.2.tgz#3c1dca5f160aa2e79e4b20ff6395eab21804f266"
|
||||||
integrity sha512-efRIANsz3UHZrnZXuEvxS9LoCOWMGD1rweciD6uJQIx2myN3a8Im1FafZBzh7zk1RJ6oKcR16dU3UPldaKd83w==
|
integrity sha512-flOcGHDZajGKYpLV0JNc0VFH361M7rnV1ee+NTeC/BQQ1/0pllYcFmxpagltANYt8FYf9+kL6RSk80Ziwyhr7w==
|
||||||
|
|
||||||
"@rollup/rollup-linux-arm64-gnu@4.18.0":
|
"@rollup/rollup-linux-arm64-gnu@4.18.0":
|
||||||
version "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"
|
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.18.0.tgz#99a7ba5e719d4f053761a698f7b52291cefba577"
|
||||||
integrity sha512-rJ5D47d8WD7J+7STKdCUAgmQk49xuFrRi9pZkWoRD1UeSMakbcepWXPF8ycChBoAqs1pb2wzvbY6Q33WmN2ftw==
|
integrity sha512-rJ5D47d8WD7J+7STKdCUAgmQk49xuFrRi9pZkWoRD1UeSMakbcepWXPF8ycChBoAqs1pb2wzvbY6Q33WmN2ftw==
|
||||||
|
|
||||||
"@rollup/rollup-linux-arm64-gnu@4.21.0":
|
"@rollup/rollup-linux-arm64-gnu@4.21.2":
|
||||||
version "4.21.0"
|
version "4.21.2"
|
||||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.21.0.tgz#22309c8bcba9a73114f69165c72bc94b2fbec085"
|
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.21.2.tgz#c2fe376e8b04eafb52a286668a8df7c761470ac7"
|
||||||
integrity sha512-ZrPhydkTVhyeGTW94WJ8pnl1uroqVHM3j3hjdquwAcWnmivjAwOYjTEAuEDeJvGX7xv3Z9GAvrBkEzCgHq9U1w==
|
integrity sha512-69CF19Kp3TdMopyteO/LJbWufOzqqXzkrv4L2sP8kfMaAQ6iwky7NoXTp7bD6/irKgknDKM0P9E/1l5XxVQAhw==
|
||||||
|
|
||||||
"@rollup/rollup-linux-arm64-musl@4.18.0":
|
"@rollup/rollup-linux-arm64-musl@4.18.0":
|
||||||
version "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"
|
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.18.0.tgz#f53db99a45d9bc00ce94db8a35efa7c3c144a58c"
|
||||||
integrity sha512-be6Yx37b24ZwxQ+wOQXXLZqpq4jTckJhtGlWGZs68TgdKXJgw54lUUoFYrg6Zs/kjzAQwEwYbp8JxZVzZLRepQ==
|
integrity sha512-be6Yx37b24ZwxQ+wOQXXLZqpq4jTckJhtGlWGZs68TgdKXJgw54lUUoFYrg6Zs/kjzAQwEwYbp8JxZVzZLRepQ==
|
||||||
|
|
||||||
"@rollup/rollup-linux-arm64-musl@4.21.0":
|
"@rollup/rollup-linux-arm64-musl@4.21.2":
|
||||||
version "4.21.0"
|
version "4.21.2"
|
||||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.21.0.tgz#c93c388af6d33f082894b8a60839d7265b2b9bc5"
|
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.21.2.tgz#e62a4235f01e0f66dbba587c087ca6db8008ec80"
|
||||||
integrity sha512-cfaupqd+UEFeURmqNP2eEvXqgbSox/LHOyN9/d2pSdV8xTrjdg3NgOFJCtc1vQ/jEke1qD0IejbBfxleBPHnPw==
|
integrity sha512-48pD/fJkTiHAZTnZwR0VzHrao70/4MlzJrq0ZsILjLW/Ab/1XlVUStYyGt7tdyIiVSlGZbnliqmult/QGA2O2w==
|
||||||
|
|
||||||
"@rollup/rollup-linux-powerpc64le-gnu@4.18.0":
|
"@rollup/rollup-linux-powerpc64le-gnu@4.18.0":
|
||||||
version "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"
|
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==
|
integrity sha512-hNVMQK+qrA9Todu9+wqrXOHxFiD5YmdEi3paj6vP02Kx1hjd2LLYR2eaN7DsEshg09+9uzWi2W18MJDlG0cxJA==
|
||||||
|
|
||||||
"@rollup/rollup-linux-powerpc64le-gnu@4.21.0":
|
"@rollup/rollup-linux-powerpc64le-gnu@4.21.2":
|
||||||
version "4.21.0"
|
version "4.21.2"
|
||||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.21.0.tgz#493c5e19e395cf3c6bd860c7139c8a903dea72b4"
|
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.21.2.tgz#24b3457e75ee9ae5b1c198bd39eea53222a74e54"
|
||||||
integrity sha512-ZKPan1/RvAhrUylwBXC9t7B2hXdpb/ufeu22pG2psV7RN8roOfGurEghw1ySmX/CmDDHNTDDjY3lo9hRlgtaHg==
|
integrity sha512-cZdyuInj0ofc7mAQpKcPR2a2iu4YM4FQfuUzCVA2u4HI95lCwzjoPtdWjdpDKyHxI0UO82bLDoOaLfpZ/wviyQ==
|
||||||
|
|
||||||
"@rollup/rollup-linux-riscv64-gnu@4.18.0":
|
"@rollup/rollup-linux-riscv64-gnu@4.18.0":
|
||||||
version "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"
|
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.18.0.tgz#8ed09c1d1262ada4c38d791a28ae0fea28b80cc9"
|
||||||
integrity sha512-ROCM7i+m1NfdrsmvwSzoxp9HFtmKGHEqu5NNDiZWQtXLA8S5HBCkVvKAxJ8U+CVctHwV2Gb5VUaK7UAkzhDjlg==
|
integrity sha512-ROCM7i+m1NfdrsmvwSzoxp9HFtmKGHEqu5NNDiZWQtXLA8S5HBCkVvKAxJ8U+CVctHwV2Gb5VUaK7UAkzhDjlg==
|
||||||
|
|
||||||
"@rollup/rollup-linux-riscv64-gnu@4.21.0":
|
"@rollup/rollup-linux-riscv64-gnu@4.21.2":
|
||||||
version "4.21.0"
|
version "4.21.2"
|
||||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.21.0.tgz#a2eab4346fbe5909165ce99adb935ba30c9fb444"
|
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.21.2.tgz#38edfba9620fe2ca8116c97e02bd9f2d606bde09"
|
||||||
integrity sha512-H1eRaCwd5E8eS8leiS+o/NqMdljkcb1d6r2h4fKSsCXQilLKArq6WS7XBLDu80Yz+nMqHVFDquwcVrQmGr28rg==
|
integrity sha512-RL56JMT6NwQ0lXIQmMIWr1SW28z4E4pOhRRNqwWZeXpRlykRIlEpSWdsgNWJbYBEWD84eocjSGDu/XxbYeCmwg==
|
||||||
|
|
||||||
"@rollup/rollup-linux-s390x-gnu@4.18.0":
|
"@rollup/rollup-linux-s390x-gnu@4.18.0":
|
||||||
version "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"
|
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==
|
integrity sha512-0UyyRHyDN42QL+NbqevXIIUnKA47A+45WyasO+y2bGJ1mhQrfrtXUpTxCOrfxCR4esV3/RLYyucGVPiUsO8xjg==
|
||||||
|
|
||||||
"@rollup/rollup-linux-s390x-gnu@4.21.0":
|
"@rollup/rollup-linux-s390x-gnu@4.21.2":
|
||||||
version "4.21.0"
|
version "4.21.2"
|
||||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.21.0.tgz#0bc49a79db4345d78d757bb1b05e73a1b42fa5c3"
|
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.21.2.tgz#a3bfb8bc5f1e802f8c76cff4a4be2e9f9ac36a18"
|
||||||
integrity sha512-zJ4hA+3b5tu8u7L58CCSI0A9N1vkfwPhWd/puGXwtZlsB5bTkwDNW/+JCU84+3QYmKpLi+XvHdmrlwUwDA6kqw==
|
integrity sha512-PMxkrWS9z38bCr3rWvDFVGD6sFeZJw4iQlhrup7ReGmfn7Oukrr/zweLhYX6v2/8J6Cep9IEA/SmjXjCmSbrMQ==
|
||||||
|
|
||||||
"@rollup/rollup-linux-x64-gnu@4.18.0":
|
"@rollup/rollup-linux-x64-gnu@4.18.0":
|
||||||
version "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"
|
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.18.0.tgz#1a7481137a54740bee1ded4ae5752450f155d942"
|
||||||
integrity sha512-xuglR2rBVHA5UsI8h8UbX4VJ470PtGCf5Vpswh7p2ukaqBGFTnsfzxUBetoWBWymHMxbIG0Cmx7Y9qDZzr648w==
|
integrity sha512-xuglR2rBVHA5UsI8h8UbX4VJ470PtGCf5Vpswh7p2ukaqBGFTnsfzxUBetoWBWymHMxbIG0Cmx7Y9qDZzr648w==
|
||||||
|
|
||||||
"@rollup/rollup-linux-x64-gnu@4.21.0":
|
"@rollup/rollup-linux-x64-gnu@4.21.2":
|
||||||
version "4.21.0"
|
version "4.21.2"
|
||||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.21.0.tgz#4fd36a6a41f3406d8693321b13d4f9b7658dd4b9"
|
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.21.2.tgz#0dadf34be9199fcdda44b5985a086326344f30ad"
|
||||||
integrity sha512-e2hrvElFIh6kW/UNBQK/kzqMNY5mO+67YtEh9OA65RM5IJXYTWiXjX6fjIiPaqOkBthYF1EqgiZ6OXKcQsM0hg==
|
integrity sha512-B90tYAUoLhU22olrafY3JQCFLnT3NglazdwkHyxNDYF/zAxJt5fJUB/yBoWFoIQ7SQj+KLe3iL4BhOMa9fzgpw==
|
||||||
|
|
||||||
"@rollup/rollup-linux-x64-musl@4.18.0":
|
"@rollup/rollup-linux-x64-musl@4.18.0":
|
||||||
version "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"
|
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==
|
integrity sha512-LKaqQL9osY/ir2geuLVvRRs+utWUNilzdE90TpyoX0eNqPzWjRm14oMEE+YLve4k/NAqCdPkGYDaDF5Sw+xBfg==
|
||||||
|
|
||||||
"@rollup/rollup-linux-x64-musl@4.21.0":
|
"@rollup/rollup-linux-x64-musl@4.21.2":
|
||||||
version "4.21.0"
|
version "4.21.2"
|
||||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.21.0.tgz#10ebb13bd4469cbad1a5d9b073bd27ec8a886200"
|
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.21.2.tgz#7b7deddce240400eb87f2406a445061b4fed99a8"
|
||||||
integrity sha512-1vvmgDdUSebVGXWX2lIcgRebqfQSff0hMEkLJyakQ9JQUbLDkEaMsPTLOmyccyC6IJ/l3FZuJbmrBw/u0A0uCQ==
|
integrity sha512-7twFizNXudESmC9oneLGIUmoHiiLppz/Xs5uJQ4ShvE6234K0VB1/aJYU3f/4g7PhssLGKBVCC37uRkkOi8wjg==
|
||||||
|
|
||||||
"@rollup/rollup-win32-arm64-msvc@4.18.0":
|
"@rollup/rollup-win32-arm64-msvc@4.18.0":
|
||||||
version "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"
|
resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.18.0.tgz#ed6603e93636a96203c6915be4117245c1bd2daf"
|
||||||
integrity sha512-7J6TkZQFGo9qBKH0pk2cEVSRhJbL6MtfWxth7Y5YmZs57Pi+4x6c2dStAUvaQkHQLnEQv1jzBUW43GvZW8OFqA==
|
integrity sha512-7J6TkZQFGo9qBKH0pk2cEVSRhJbL6MtfWxth7Y5YmZs57Pi+4x6c2dStAUvaQkHQLnEQv1jzBUW43GvZW8OFqA==
|
||||||
|
|
||||||
"@rollup/rollup-win32-arm64-msvc@4.21.0":
|
"@rollup/rollup-win32-arm64-msvc@4.21.2":
|
||||||
version "4.21.0"
|
version "4.21.2"
|
||||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.21.0.tgz#2fef1a90f1402258ef915ae5a94cc91a5a1d5bfc"
|
resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.21.2.tgz#a0ca0c5149c2cfb26fab32e6ba3f16996fbdb504"
|
||||||
integrity sha512-s5oFkZ/hFcrlAyBTONFY1TWndfyre1wOMwU+6KCpm/iatybvrRgmZVM+vCFwxmC5ZhdlgfE0N4XorsDpi7/4XQ==
|
integrity sha512-9rRero0E7qTeYf6+rFh3AErTNU1VCQg2mn7CQcI44vNUWM9Ze7MSRS/9RFuSsox+vstRt97+x3sOhEey024FRQ==
|
||||||
|
|
||||||
"@rollup/rollup-win32-ia32-msvc@4.18.0":
|
"@rollup/rollup-win32-ia32-msvc@4.18.0":
|
||||||
version "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"
|
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==
|
integrity sha512-Txjh+IxBPbkUB9+SXZMpv+b/vnTEtFyfWZgJ6iyCmt2tdx0OF5WhFowLmnh8ENGNpfUlUZkdI//4IEmhwPieNg==
|
||||||
|
|
||||||
"@rollup/rollup-win32-ia32-msvc@4.21.0":
|
"@rollup/rollup-win32-ia32-msvc@4.21.2":
|
||||||
version "4.21.0"
|
version "4.21.2"
|
||||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.21.0.tgz#a18ad47a95c5f264defb60acdd8c27569f816fc1"
|
resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.21.2.tgz#aae2886beec3024203dbb5569db3a137bc385f8e"
|
||||||
integrity sha512-G9+TEqRnAA6nbpqyUqgTiopmnfgnMkR3kMukFBDsiyy23LZvUCpiUwjTRx6ezYCjJODXrh52rBR9oXvm+Fp5wg==
|
integrity sha512-5rA4vjlqgrpbFVVHX3qkrCo/fZTj1q0Xxpg+Z7yIo3J2AilW7t2+n6Q8Jrx+4MrYpAnjttTYF8rr7bP46BPzRw==
|
||||||
|
|
||||||
"@rollup/rollup-win32-x64-msvc@4.18.0":
|
"@rollup/rollup-win32-x64-msvc@4.18.0":
|
||||||
version "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"
|
resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.18.0.tgz#5d694d345ce36b6ecf657349e03eb87297e68da4"
|
||||||
integrity sha512-UOo5FdvOL0+eIVTgS4tIdbW+TtnBLWg1YBCcU2KWM7nuNwRz9bksDX1bekJJCpu25N1DVWaCwnT39dVQxzqS8g==
|
integrity sha512-UOo5FdvOL0+eIVTgS4tIdbW+TtnBLWg1YBCcU2KWM7nuNwRz9bksDX1bekJJCpu25N1DVWaCwnT39dVQxzqS8g==
|
||||||
|
|
||||||
"@rollup/rollup-win32-x64-msvc@4.21.0":
|
"@rollup/rollup-win32-x64-msvc@4.21.2":
|
||||||
version "4.21.0"
|
version "4.21.2"
|
||||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.21.0.tgz#20c09cf44dcb082140cc7f439dd679fe4bba3375"
|
resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.21.2.tgz#e4291e3c1bc637083f87936c333cdbcad22af63b"
|
||||||
integrity sha512-2jsCDZwtQvRhejHLfZ1JY6w6kEuEtfF9nzYsZxzSlNVKDX+DpsDJ+Rbjkm74nvg2rdx0gwBS+IMdvwJuq3S9pQ==
|
integrity sha512-6UUxd0+SKomjdzuAcp+HAmxw1FlGBnl1v2yEPSabtx4lBfdXHDVsW7+lQkgz9cNFJGY3AWR7+V8P5BqkD9L9nA==
|
||||||
|
|
||||||
"@roxi/routify@2.18.0":
|
"@roxi/routify@2.18.0":
|
||||||
version "2.18.0"
|
version "2.18.0"
|
||||||
|
@ -5564,9 +5564,9 @@
|
||||||
"@types/node" "*"
|
"@types/node" "*"
|
||||||
|
|
||||||
"@types/eslint@*":
|
"@types/eslint@*":
|
||||||
version "9.6.0"
|
version "9.6.1"
|
||||||
resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-9.6.0.tgz#51d4fe4d0316da9e9f2c80884f2c20ed5fb022ff"
|
resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-9.6.1.tgz#d5795ad732ce81715f27f75da913004a56751584"
|
||||||
integrity sha512-gi6WQJ7cHRgZxtkQEoyHMppPjq9Kxo5Tjn2prSKDSmZrCz8TZ3jSRCeTJm+WoM+oB0WG37bRqLzaaU3q7JypGg==
|
integrity sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@types/estree" "*"
|
"@types/estree" "*"
|
||||||
"@types/json-schema" "*"
|
"@types/json-schema" "*"
|
||||||
|
@ -5879,9 +5879,9 @@
|
||||||
integrity sha512-7GgtHCs/QZrBrDzgIJnQtuSvhFSwhyYSI2uafSwZoNt1iOGhEN5fwNrQMjtONyHm9+/LoA4453jH0CMYcr06Pg==
|
integrity sha512-7GgtHCs/QZrBrDzgIJnQtuSvhFSwhyYSI2uafSwZoNt1iOGhEN5fwNrQMjtONyHm9+/LoA4453jH0CMYcr06Pg==
|
||||||
|
|
||||||
"@types/node@>=8.1.0":
|
"@types/node@>=8.1.0":
|
||||||
version "22.4.2"
|
version "22.5.1"
|
||||||
resolved "https://registry.yarnpkg.com/@types/node/-/node-22.4.2.tgz#55fefb1c3dba2ecd7eb76738c6b80da75760523f"
|
resolved "https://registry.yarnpkg.com/@types/node/-/node-22.5.1.tgz#de01dce265f6b99ed32b295962045d10b5b99560"
|
||||||
integrity sha512-nAvM3Ey230/XzxtyDcJ+VjvlzpzoHwLsF7JaDRfoI0ytO0mVheerNmM45CtA0yOILXwXXxOrcUWH3wltX+7PSw==
|
integrity sha512-KkHsxej0j9IW1KKOOAA/XBA0z08UFSrRQHErzEfA3Vgq57eXIMYboIlHJuYIfd+lwCQjtKqUu3UnmKbtUc9yRw==
|
||||||
dependencies:
|
dependencies:
|
||||||
undici-types "~6.19.2"
|
undici-types "~6.19.2"
|
||||||
|
|
||||||
|
@ -6219,9 +6219,9 @@
|
||||||
"@types/node" "*"
|
"@types/node" "*"
|
||||||
|
|
||||||
"@types/server-destroy@^1.0.1":
|
"@types/server-destroy@^1.0.1":
|
||||||
version "1.0.3"
|
version "1.0.4"
|
||||||
resolved "https://registry.yarnpkg.com/@types/server-destroy/-/server-destroy-1.0.3.tgz#2460932ea3a02a70ec99669c8f40ff089a5b8a2b"
|
resolved "https://registry.yarnpkg.com/@types/server-destroy/-/server-destroy-1.0.4.tgz#bd94af933e73e04795042edf38af267ddebd4e98"
|
||||||
integrity sha512-Qq0fn70C7TLDG1W9FCblKufNWW1OckQ41dVKV2Dku5KdZF7bexezG4e2WBaBKhdwL3HZ+cYCEIKwg2BRgzrWmA==
|
integrity sha512-+x8oAQ4Xp1wtDi2Hlmi7gUNXZNVhB5EoSQpi0qEmINdDN5Ab724WLGAalEdT1SudVY/NzMhbfZO7vU+klT0R+A==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@types/node" "*"
|
"@types/node" "*"
|
||||||
|
|
||||||
|
@ -7878,7 +7878,7 @@ brace-expansion@^2.0.1:
|
||||||
dependencies:
|
dependencies:
|
||||||
balanced-match "^1.0.0"
|
balanced-match "^1.0.0"
|
||||||
|
|
||||||
braces@^3.0.2, braces@~3.0.2:
|
braces@^3.0.3, braces@~3.0.2:
|
||||||
version "3.0.3"
|
version "3.0.3"
|
||||||
resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789"
|
resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789"
|
||||||
integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==
|
integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==
|
||||||
|
@ -10972,15 +10972,15 @@ eslint@^8.52.0, eslint@^8.56.0:
|
||||||
text-table "^0.2.0"
|
text-table "^0.2.0"
|
||||||
|
|
||||||
eslint@^9.7.0:
|
eslint@^9.7.0:
|
||||||
version "9.9.0"
|
version "9.9.1"
|
||||||
resolved "https://registry.yarnpkg.com/eslint/-/eslint-9.9.0.tgz#8d214e69ae4debeca7ae97daebbefe462072d975"
|
resolved "https://registry.yarnpkg.com/eslint/-/eslint-9.9.1.tgz#147ac9305d56696fb84cf5bdecafd6517ddc77ec"
|
||||||
integrity sha512-JfiKJrbx0506OEerjK2Y1QlldtBxkAlLxT5OEcRF8uaQ86noDe2k31Vw9rnSWv+MXZHj7OOUV/dA0AhdLFcyvA==
|
integrity sha512-dHvhrbfr4xFQ9/dq+jcVneZMyRYLjggWjk6RVsIiHsP8Rz6yZ8LvZ//iU4TrZF+SXWG+JkNF2OyiZRvzgRDqMg==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@eslint-community/eslint-utils" "^4.2.0"
|
"@eslint-community/eslint-utils" "^4.2.0"
|
||||||
"@eslint-community/regexpp" "^4.11.0"
|
"@eslint-community/regexpp" "^4.11.0"
|
||||||
"@eslint/config-array" "^0.17.1"
|
"@eslint/config-array" "^0.18.0"
|
||||||
"@eslint/eslintrc" "^3.1.0"
|
"@eslint/eslintrc" "^3.1.0"
|
||||||
"@eslint/js" "9.9.0"
|
"@eslint/js" "9.9.1"
|
||||||
"@humanwhocodes/module-importer" "^1.0.1"
|
"@humanwhocodes/module-importer" "^1.0.1"
|
||||||
"@humanwhocodes/retry" "^0.3.0"
|
"@humanwhocodes/retry" "^0.3.0"
|
||||||
"@nodelib/fs.walk" "^1.2.8"
|
"@nodelib/fs.walk" "^1.2.8"
|
||||||
|
@ -15914,11 +15914,11 @@ methods@^1.1.2:
|
||||||
integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==
|
integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==
|
||||||
|
|
||||||
micromatch@^4.0.4, micromatch@^4.0.5:
|
micromatch@^4.0.4, micromatch@^4.0.5:
|
||||||
version "4.0.5"
|
version "4.0.8"
|
||||||
resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6"
|
resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.8.tgz#d66fa18f3a47076789320b9b1af32bd86d9fa202"
|
||||||
integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==
|
integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==
|
||||||
dependencies:
|
dependencies:
|
||||||
braces "^3.0.2"
|
braces "^3.0.3"
|
||||||
picomatch "^2.3.1"
|
picomatch "^2.3.1"
|
||||||
|
|
||||||
miller-rabin@^4.0.0:
|
miller-rabin@^4.0.0:
|
||||||
|
@ -18394,9 +18394,9 @@ posthog-js@^1.118.0:
|
||||||
preact "^10.19.3"
|
preact "^10.19.3"
|
||||||
|
|
||||||
posthog-js@^1.13.4:
|
posthog-js@^1.13.4:
|
||||||
version "1.157.2"
|
version "1.160.0"
|
||||||
resolved "https://registry.yarnpkg.com/posthog-js/-/posthog-js-1.157.2.tgz#dc2515818ead408aefb900e90c535fb57beb1f59"
|
resolved "https://registry.yarnpkg.com/posthog-js/-/posthog-js-1.160.0.tgz#ad686f3c161c7dc2ba716281b5cef94c64ce41b1"
|
||||||
integrity sha512-ATYKGs+Q51u26nHHhrhWNh1whqFm7j/rwQQYw+y6/YzNmRlo+YsqrGZji9nqXb9/4fo0ModDr+ZmuOI3hKkUXA==
|
integrity sha512-K/RRgmPYIpP69nnveCJfkclb8VU+R+jsgqlrKaLGsM5CtQM9g01WOzAiT3u36WLswi58JiFMXgJtECKQuoqTgQ==
|
||||||
dependencies:
|
dependencies:
|
||||||
fflate "^0.4.8"
|
fflate "^0.4.8"
|
||||||
preact "^10.19.3"
|
preact "^10.19.3"
|
||||||
|
@ -19817,28 +19817,28 @@ rollup@^3.27.1:
|
||||||
fsevents "~2.3.2"
|
fsevents "~2.3.2"
|
||||||
|
|
||||||
rollup@^4.20.0:
|
rollup@^4.20.0:
|
||||||
version "4.21.0"
|
version "4.21.2"
|
||||||
resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.21.0.tgz#28db5f5c556a5180361d35009979ccc749560b9d"
|
resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.21.2.tgz#f41f277a448d6264e923dd1ea179f0a926aaf9b7"
|
||||||
integrity sha512-vo+S/lfA2lMS7rZ2Qoubi6I5hwZwzXeUIctILZLbHI+laNtvhhOIon2S1JksA5UEDQ7l3vberd0fxK44lTYjbQ==
|
integrity sha512-e3TapAgYf9xjdLvKQCkQTnbTKd4a6jwlpQSJJFokHGaX2IVjoEqkIIhiQfqsi0cdwlOD+tQGuOd5AJkc5RngBw==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@types/estree" "1.0.5"
|
"@types/estree" "1.0.5"
|
||||||
optionalDependencies:
|
optionalDependencies:
|
||||||
"@rollup/rollup-android-arm-eabi" "4.21.0"
|
"@rollup/rollup-android-arm-eabi" "4.21.2"
|
||||||
"@rollup/rollup-android-arm64" "4.21.0"
|
"@rollup/rollup-android-arm64" "4.21.2"
|
||||||
"@rollup/rollup-darwin-arm64" "4.21.0"
|
"@rollup/rollup-darwin-arm64" "4.21.2"
|
||||||
"@rollup/rollup-darwin-x64" "4.21.0"
|
"@rollup/rollup-darwin-x64" "4.21.2"
|
||||||
"@rollup/rollup-linux-arm-gnueabihf" "4.21.0"
|
"@rollup/rollup-linux-arm-gnueabihf" "4.21.2"
|
||||||
"@rollup/rollup-linux-arm-musleabihf" "4.21.0"
|
"@rollup/rollup-linux-arm-musleabihf" "4.21.2"
|
||||||
"@rollup/rollup-linux-arm64-gnu" "4.21.0"
|
"@rollup/rollup-linux-arm64-gnu" "4.21.2"
|
||||||
"@rollup/rollup-linux-arm64-musl" "4.21.0"
|
"@rollup/rollup-linux-arm64-musl" "4.21.2"
|
||||||
"@rollup/rollup-linux-powerpc64le-gnu" "4.21.0"
|
"@rollup/rollup-linux-powerpc64le-gnu" "4.21.2"
|
||||||
"@rollup/rollup-linux-riscv64-gnu" "4.21.0"
|
"@rollup/rollup-linux-riscv64-gnu" "4.21.2"
|
||||||
"@rollup/rollup-linux-s390x-gnu" "4.21.0"
|
"@rollup/rollup-linux-s390x-gnu" "4.21.2"
|
||||||
"@rollup/rollup-linux-x64-gnu" "4.21.0"
|
"@rollup/rollup-linux-x64-gnu" "4.21.2"
|
||||||
"@rollup/rollup-linux-x64-musl" "4.21.0"
|
"@rollup/rollup-linux-x64-musl" "4.21.2"
|
||||||
"@rollup/rollup-win32-arm64-msvc" "4.21.0"
|
"@rollup/rollup-win32-arm64-msvc" "4.21.2"
|
||||||
"@rollup/rollup-win32-ia32-msvc" "4.21.0"
|
"@rollup/rollup-win32-ia32-msvc" "4.21.2"
|
||||||
"@rollup/rollup-win32-x64-msvc" "4.21.0"
|
"@rollup/rollup-win32-x64-msvc" "4.21.2"
|
||||||
fsevents "~2.3.2"
|
fsevents "~2.3.2"
|
||||||
|
|
||||||
rollup@^4.9.4, rollup@^4.9.6:
|
rollup@^4.9.4, rollup@^4.9.6:
|
||||||
|
|
Loading…
Reference in New Issue