-
+
{
type="secondary"
:size="isMobileMode ? 'medium' : 'small'"
class="!text-brand-500"
- @click="
- () => {
- expandedFormRow = {}
- expandedFormDlg = true
- }
- "
+ @click="addNewRecord"
>
{{ $t('activity.newRecord') }}
@@ -344,6 +384,15 @@ const onClick = (refRow: any, id: string) => {
:row-id="extractPkFromRow(expandedFormRow, relatedTableMeta.columns as ColumnType[])"
:state="newRowState"
use-meta-fields
+ :close-after-save="isExpandedFormCloseAfterSave"
+ :new-record-header="
+ isExpandedFormCloseAfterSave
+ ? $t('activity.tableNameCreateNewRecord', {
+ tableName: relatedTableMeta?.title,
+ })
+ : undefined
+ "
+ @created-record="onCreatedRecord"
/>
diff --git a/packages/nc-gui/components/webhook/CallLog.vue b/packages/nc-gui/components/webhook/CallLog.vue
index 9dbe8c3922..806904c4ad 100644
--- a/packages/nc-gui/components/webhook/CallLog.vue
+++ b/packages/nc-gui/components/webhook/CallLog.vue
@@ -89,7 +89,7 @@ onBeforeMount(async () => {
For additional configuration options, please refer the documentation
- here.
+ here.
diff --git a/packages/nc-gui/components/webhook/Drawer.vue b/packages/nc-gui/components/webhook/Drawer.vue
index 99682dc2a9..aa7bccf79a 100644
--- a/packages/nc-gui/components/webhook/Drawer.vue
+++ b/packages/nc-gui/components/webhook/Drawer.vue
@@ -50,6 +50,7 @@ async function addHook() {
href="https://angel.co/company/nocodb"
target="_blank"
size="large"
+ rel="noopener noreferrer"
>
🚀 {{ $t('labels.weAreHiring') }}! 🚀
diff --git a/packages/nc-gui/components/webhook/Editor.vue b/packages/nc-gui/components/webhook/Editor.vue
index fcd9b9a152..65628703e0 100644
--- a/packages/nc-gui/components/webhook/Editor.vue
+++ b/packages/nc-gui/components/webhook/Editor.vue
@@ -783,7 +783,7 @@ onMounted(async () => {
-
+
{{ $t('labels.docReference') }}
diff --git a/packages/nc-gui/components/workspace/Menu.vue b/packages/nc-gui/components/workspace/Menu.vue
index e0cb18bb26..0c8b9c2fc4 100644
--- a/packages/nc-gui/components/workspace/Menu.vue
+++ b/packages/nc-gui/components/workspace/Menu.vue
@@ -7,7 +7,12 @@
data-testid="nc-workspace-menu"
class="flex items-center nc-workspace-menu overflow-hidden py-1.25 pr-0.25 justify-center w-full ml-2"
>
-
+
diff --git a/packages/nc-gui/components/workspace/ProjectList.vue b/packages/nc-gui/components/workspace/ProjectList.vue
index e3dc21002e..09e3d72128 100644
--- a/packages/nc-gui/components/workspace/ProjectList.vue
+++ b/packages/nc-gui/components/workspace/ProjectList.vue
@@ -14,10 +14,10 @@ import {
storeToRefs,
useBases,
useGlobal,
+ useNuxtApp,
useRoles,
useWorkspace,
} from '#imports'
-import { useNuxtApp } from '#app'
const workspaceStore = useWorkspace()
diff --git a/packages/nc-gui/composables/useColumnCreateStore.ts b/packages/nc-gui/composables/useColumnCreateStore.ts
index cb7b634259..f01bde2160 100644
--- a/packages/nc-gui/composables/useColumnCreateStore.ts
+++ b/packages/nc-gui/composables/useColumnCreateStore.ts
@@ -50,6 +50,8 @@ const [useProvideColumnCreateStore, useColumnCreateStore] = createInjectionState
const sqlUi = ref(meta.value?.source_id ? sqlUis.value[meta.value?.source_id] : Object.values(sqlUis.value)[0])
+ const { activeView } = storeToRefs(useViewsStore())
+
const isEdit = computed(() => !!column?.value?.id)
const isMysql = computed(() => isMysqlFunc(meta.value?.source_id ? meta.value?.source_id : Object.keys(sqlUis.value)[0]))
@@ -275,7 +277,11 @@ const [useProvideColumnCreateStore, useColumnCreateStore] = createInjectionState
// };
// }
}
- await $api.dbTableColumn.create(meta.value?.id as string, { ...formState.value, ...columnPosition })
+ await $api.dbTableColumn.create(meta.value?.id as string, {
+ ...formState.value,
+ ...columnPosition,
+ view_id: activeView.value!.id as string,
+ })
/** if LTAR column then force reload related table meta */
if (isLinksOrLTAR(formState.value) && meta.value?.id !== formState.value.childId) {
diff --git a/packages/nc-gui/composables/useData.ts b/packages/nc-gui/composables/useData.ts
index fa9c7475ab..aa80b9d185 100644
--- a/packages/nc-gui/composables/useData.ts
+++ b/packages/nc-gui/composables/useData.ts
@@ -91,7 +91,7 @@ export function useData(args: {
base?.value.id as string,
metaValue?.id as string,
viewMetaValue?.id as string,
- insertObj,
+ { ...insertObj, ...(ltarState || {}) },
)
if (!undo) {
diff --git a/packages/nc-gui/composables/useExpandedFormStore.ts b/packages/nc-gui/composables/useExpandedFormStore.ts
index ae26808fe9..fc42da3bf5 100644
--- a/packages/nc-gui/composables/useExpandedFormStore.ts
+++ b/packages/nc-gui/composables/useExpandedFormStore.ts
@@ -180,7 +180,10 @@ const [useProvideExpandedFormStore, useExpandedFormStore] = useInjectionState((m
if (missingRequiredColumns.size) return
- data = await $api.dbTableRow.create('noco', base.value.id as string, meta.value.id, insertObj)
+ data = await $api.dbTableRow.create('noco', base.value.id as string, meta.value.id, {
+ ...insertObj,
+ ...(ltarState || {}),
+ })
Object.assign(row.value, {
row: data,
diff --git a/packages/nc-gui/composables/useGlobal/actions.ts b/packages/nc-gui/composables/useGlobal/actions.ts
index a22a3dcb05..cedd15643d 100644
--- a/packages/nc-gui/composables/useGlobal/actions.ts
+++ b/packages/nc-gui/composables/useGlobal/actions.ts
@@ -1,8 +1,7 @@
import { getActivePinia } from 'pinia'
import type { Actions, AppInfo, State } from './types'
import type { NcProjectType } from '#imports'
-import { message, useNuxtApp } from '#imports'
-import { navigateTo } from '#app'
+import { message, navigateTo, useNuxtApp } from '#imports'
export function useGlobalActions(state: State): Actions {
const setIsMobileMode = (isMobileMode: boolean) => {
diff --git a/packages/nc-gui/composables/useGlobal/index.ts b/packages/nc-gui/composables/useGlobal/index.ts
index 349434afdd..1e538b016d 100644
--- a/packages/nc-gui/composables/useGlobal/index.ts
+++ b/packages/nc-gui/composables/useGlobal/index.ts
@@ -16,7 +16,7 @@ export * from './types'
*
* @example
* ```js
- * import { useNuxtApp } from '#app'
+ * import { useNuxtApp } from '#imports'
*
* const { $state } = useNuxtApp()
*
diff --git a/packages/nc-gui/composables/useGlobal/state.ts b/packages/nc-gui/composables/useGlobal/state.ts
index eaaf413932..4fab0a5c72 100644
--- a/packages/nc-gui/composables/useGlobal/state.ts
+++ b/packages/nc-gui/composables/useGlobal/state.ts
@@ -67,6 +67,7 @@ export function useGlobalState(storageKey = 'nocodb-gui-v2'): State {
latestRelease: null,
hiddenRelease: null,
isMobileMode: null,
+ lastOpenedWorkspaceId: null,
}
/** saves a reactive state, any change to these values will write/delete to localStorage */
diff --git a/packages/nc-gui/composables/useGlobal/types.ts b/packages/nc-gui/composables/useGlobal/types.ts
index 8549fd2e01..f7e640cd7c 100644
--- a/packages/nc-gui/composables/useGlobal/types.ts
+++ b/packages/nc-gui/composables/useGlobal/types.ts
@@ -9,6 +9,10 @@ export interface AppInfo {
authType: 'jwt' | 'none'
connectToExternalDB: boolean
defaultLimit: number
+ defaultGroupByLimit: {
+ limitGroup: number
+ limitRecord: number
+ }
firstUser: boolean
githubAuthEnabled: boolean
googleAuthEnabled: boolean
@@ -44,6 +48,7 @@ export interface StoredState {
latestRelease: string | null
hiddenRelease: string | null
isMobileMode: boolean | null
+ lastOpenedWorkspaceId: string | null
}
export type State = ToRefs
> & {
diff --git a/packages/nc-gui/composables/useMultiSelect/index.ts b/packages/nc-gui/composables/useMultiSelect/index.ts
index 17625b9f93..78e24195cd 100644
--- a/packages/nc-gui/composables/useMultiSelect/index.ts
+++ b/packages/nc-gui/composables/useMultiSelect/index.ts
@@ -114,6 +114,8 @@ export function useMultiSelect(
if (typeof textToCopy === 'object') {
textToCopy = JSON.stringify(textToCopy)
+ } else {
+ textToCopy = textToCopy.toString()
}
if (columnObj.uidt === UITypes.Formula) {
diff --git a/packages/nc-gui/composables/useSmartsheetStore.ts b/packages/nc-gui/composables/useSmartsheetStore.ts
index 81763fdbb7..9f26b9de5c 100644
--- a/packages/nc-gui/composables/useSmartsheetStore.ts
+++ b/packages/nc-gui/composables/useSmartsheetStore.ts
@@ -15,7 +15,7 @@ const [useProvideSmartsheetStore, useSmartsheetStore] = useInjectionState(
) => {
const { $api } = useNuxtApp()
- const { activeView: view } = storeToRefs(useViewsStore())
+ const { activeView: view, activeNestedFilters, activeSorts } = storeToRefs(useViewsStore())
const baseStore = useBase()
@@ -57,6 +57,26 @@ const [useProvideSmartsheetStore, useSmartsheetStore] = useInjectionState(
const sorts = ref(unref(initialSorts) ?? [])
const nestedFilters = ref(unref(initialFilters) ?? [])
+ watch(
+ sorts,
+ () => {
+ activeSorts.value = sorts.value
+ },
+ {
+ immediate: true,
+ },
+ )
+
+ watch(
+ nestedFilters,
+ () => {
+ activeNestedFilters.value = nestedFilters.value
+ },
+ {
+ immediate: true,
+ },
+ )
+
return {
view,
meta,
diff --git a/packages/nc-gui/composables/useTableNew.ts b/packages/nc-gui/composables/useTableNew.ts
index 4f8865c9fe..d514116769 100644
--- a/packages/nc-gui/composables/useTableNew.ts
+++ b/packages/nc-gui/composables/useTableNew.ts
@@ -113,17 +113,29 @@ export function useTableNew(param: { onTableCreate?: (tableMeta: TableType) => v
}
const sqlUi = await basesStore.getSqlUi(baseId, sourceId)
+ const source = bases.value.get(baseId)?.sources?.find((s) => s.id === sourceId)
if (!sqlUi) return
- const columns = sqlUi?.getNewTableColumns().filter((col: ColumnType) => {
- if (col.column_name === 'id' && table.columns.includes('id_ag')) {
- Object.assign(col, sqlUi?.getDataTypeForUiType({ uidt: UITypes.ID }, 'AG'))
- col.dtxp = sqlUi?.getDefaultLengthForDatatype(col.dt)
- col.dtxs = sqlUi?.getDefaultScaleForDatatype(col.dt)
- return true
- }
- return table.columns.includes(col.column_name!)
- })
+ const columns = sqlUi
+ ?.getNewTableColumns()
+ .filter((col: ColumnType) => {
+ if (col.column_name === 'id' && table.columns.includes('id_ag')) {
+ Object.assign(col, sqlUi?.getDataTypeForUiType({ uidt: UITypes.ID }, 'AG'))
+ col.dtxp = sqlUi?.getDefaultLengthForDatatype(col.dt)
+ col.dtxs = sqlUi?.getDefaultScaleForDatatype(col.dt)
+ return true
+ }
+ return table.columns.includes(col.column_name!)
+ })
+ .map((column) => {
+ if (!source) return column
+
+ if (source.inflection_column !== 'camelize') {
+ column.title = column.column_name
+ }
+
+ return column
+ })
try {
const tableMeta = await $api.source.tableCreate(baseId, sourceId!, {
diff --git a/packages/nc-gui/composables/useViewGroupBy.ts b/packages/nc-gui/composables/useViewGroupBy.ts
index 55bcfc4358..809578dd1c 100644
--- a/packages/nc-gui/composables/useViewGroupBy.ts
+++ b/packages/nc-gui/composables/useViewGroupBy.ts
@@ -6,6 +6,8 @@ import type { Group, GroupNestedIn, Row } from '#imports'
export const useViewGroupBy = (view: Ref, where?: ComputedRef) => {
const { api } = useApi()
+ const { appInfo } = useGlobal()
+
const { base } = storeToRefs(useBase())
const { sharedView, fetchSharedViewData } = useSharedView()
@@ -42,7 +44,13 @@ export const useViewGroupBy = (view: Ref, where?: Computed
const reloadViewDataHook = inject(ReloadViewDataHookInj, createEventHook())
- const groupByLimit = 10
+ const groupByGroupLimit = computed(() => {
+ return appInfo.value.defaultGroupByLimit?.limitGroup || 10
+ })
+
+ const groupByRecordLimit = computed(() => {
+ return appInfo.value.defaultGroupByLimit?.limitRecord || 10
+ })
const rootGroup = ref({
key: 'root',
@@ -50,7 +58,7 @@ export const useViewGroupBy = (view: Ref, where?: Computed
count: 0,
column: {} as any,
nestedIn: [],
- paginationData: { page: 1, pageSize: groupByLimit },
+ paginationData: { page: 1, pageSize: groupByGroupLimit.value },
nested: true,
children: [],
root: true,
@@ -64,7 +72,7 @@ export const useViewGroupBy = (view: Ref, where?: Computed
groupWrapper.paginationData.page = page
await loadGroups(
{
- offset: (page - 1) * (groupWrapper.paginationData.pageSize || groupByLimit),
+ offset: (page - 1) * (groupWrapper.paginationData.pageSize || groupByGroupLimit.value),
} as any,
groupWrapper,
)
@@ -172,8 +180,8 @@ export const useViewGroupBy = (view: Ref, where?: Computed
const response = !isPublic.value
? await api.dbViewRow.groupBy('noco', base.value.id, view.value.fk_model_id, view.value.id, {
- offset: ((group.paginationData.page ?? 0) - 1) * (group.paginationData.pageSize ?? groupByLimit),
- limit: group.paginationData.pageSize ?? groupByLimit,
+ offset: ((group.paginationData.page ?? 0) - 1) * (group.paginationData.pageSize ?? groupByGroupLimit.value),
+ limit: group.paginationData.pageSize ?? groupByGroupLimit.value,
...params,
...(isUIAllowed('sortSync') ? {} : { sortArrJson: JSON.stringify(sorts.value) }),
...(isUIAllowed('filterSync') ? {} : { filterArrJson: JSON.stringify(nestedFilters.value) }),
@@ -182,8 +190,8 @@ export const useViewGroupBy = (view: Ref, where?: Computed
column_name: groupby.column.title,
} as any)
: await api.public.dataGroupBy(sharedView.value!.uuid!, {
- offset: ((group.paginationData.page ?? 0) - 1) * (group.paginationData.pageSize ?? groupByLimit),
- limit: group.paginationData.pageSize ?? groupByLimit,
+ offset: ((group.paginationData.page ?? 0) - 1) * (group.paginationData.pageSize ?? groupByGroupLimit.value),
+ limit: group.paginationData.pageSize ?? groupByGroupLimit.value,
...params,
where: nestedWhere,
sort: `${groupby.sort === 'desc' ? '-' : ''}${groupby.column.title}`,
@@ -198,7 +206,7 @@ export const useViewGroupBy = (view: Ref, where?: Computed
)
if (keyExists) {
keyExists.count += +curr.count
- keyExists.paginationData = { page: 1, pageSize: groupByLimit, totalRows: keyExists.count }
+ keyExists.paginationData = { page: 1, pageSize: groupByGroupLimit.value, totalRows: keyExists.count }
return acc
}
if (groupby.column.title && groupby.column.uidt) {
@@ -216,7 +224,11 @@ export const useViewGroupBy = (view: Ref, where?: Computed
column_uidt: groupby.column.uidt,
},
],
- paginationData: { page: 1, pageSize: groupByLimit, totalRows: +curr.count },
+ paginationData: {
+ page: 1,
+ pageSize: group!.nestedIn.length < groupBy.value.length - 1 ? groupByGroupLimit.value : groupByRecordLimit.value,
+ totalRows: +curr.count,
+ },
nested: group!.nestedIn.length < groupBy.value.length - 1,
})
}
@@ -244,7 +256,7 @@ export const useViewGroupBy = (view: Ref, where?: Computed
// clear rest of the children
group.children = group.children.filter((c) => tempList.find((t) => t.key === c.key))
- if (group.count <= (group.paginationData.pageSize ?? groupByLimit)) {
+ if (group.count <= (group.paginationData.pageSize ?? groupByGroupLimit.value)) {
group.children.sort((a, b) => {
const orderA = tempList.findIndex((t) => t.key === a.key)
const orderB = tempList.findIndex((t) => t.key === b.key)
@@ -268,14 +280,14 @@ export const useViewGroupBy = (view: Ref, where?: Computed
if (group.children && !force) return
if (!group.paginationData) {
- group.paginationData = { page: 1, pageSize: groupByLimit }
+ group.paginationData = { page: 1, pageSize: groupByRecordLimit.value }
}
const nestedWhere = calculateNestedWhere(group.nestedIn, where?.value)
const query = {
- offset: ((group.paginationData.page ?? 0) - 1) * (group.paginationData.pageSize ?? groupByLimit),
- limit: group.paginationData.pageSize ?? groupByLimit,
+ offset: ((group.paginationData.page ?? 0) - 1) * (group.paginationData.pageSize ?? groupByRecordLimit.value),
+ limit: group.paginationData.pageSize ?? groupByRecordLimit.value,
where: `${nestedWhere}`,
}
@@ -294,7 +306,7 @@ export const useViewGroupBy = (view: Ref, where?: Computed
const loadGroupPage = async (group: Group, p: number) => {
if (!group.paginationData) {
- group.paginationData = { page: 1, pageSize: groupByLimit }
+ group.paginationData = { page: 1, pageSize: groupByRecordLimit.value }
}
group.paginationData.page = p
await loadGroupData(group, true)
@@ -331,7 +343,7 @@ export const useViewGroupBy = (view: Ref, where?: Computed
() => groupBy.value.length,
async () => {
if (groupBy.value.length > 0) {
- rootGroup.value.paginationData = { page: 1, pageSize: groupByLimit }
+ rootGroup.value.paginationData = { page: 1, pageSize: groupByGroupLimit.value }
rootGroup.value.column = {} as any
await loadGroups()
refreshNested()
diff --git a/packages/nc-gui/helpers/parsers/JSONUrlTemplateAdapter.ts b/packages/nc-gui/helpers/parsers/JSONUrlTemplateAdapter.ts
index 19a76ef0de..d3624532ce 100644
--- a/packages/nc-gui/helpers/parsers/JSONUrlTemplateAdapter.ts
+++ b/packages/nc-gui/helpers/parsers/JSONUrlTemplateAdapter.ts
@@ -1,6 +1,6 @@
import type { Api } from 'nocodb-sdk'
import JSONTemplateAdapter from './JSONTemplateAdapter'
-// import { useNuxtApp } from '#app'
+// import { useNuxtApp } from '#imports'
export default class JSONUrlTemplateAdapter extends JSONTemplateAdapter {
url: string
diff --git a/packages/nc-gui/lang/en.json b/packages/nc-gui/lang/en.json
index d21206d79b..837f801730 100644
--- a/packages/nc-gui/lang/en.json
+++ b/packages/nc-gui/lang/en.json
@@ -69,6 +69,7 @@
"hex": "Hex",
"clear": "Clear",
"slack": "Slack",
+ "comment": "Comment",
"microsoftTeams": "Microsoft Teams",
"discord": "Discord",
"matterMost": "Mattermost",
@@ -87,6 +88,7 @@
"action": "Action",
"insert": "Insert",
"delete": "Delete",
+ "deleteEntity": "Delete {entity}",
"bulkInsert": "Bulk Insert",
"bulkDelete": "Bulk Delete",
"bulkUpdate": "Bulk Update",
@@ -342,9 +344,9 @@
"createBase": "Create Base",
"myProject": "My Bases",
"formTitle": "Form Title",
- "collabView": "Collaborative View",
- "lockedView": "Locked View",
- "personalView": "Personal View",
+ "collaborative": "Collaborative",
+ "locked": "Locked",
+ "personal": "Personal",
"appStore": "App Store",
"teamAndAuth": "Team & Auth",
"rolesUserMgmt": "Roles & Users Management",
@@ -409,9 +411,11 @@
}
},
"labels": {
+ "downloadData": "Download Data",
"noToken": "No Token",
"tokenLimit": "Only one token per user is allowed",
"duplicateAttachment": "File with name {filename} already attached",
+ "viewIdColon": "VIEW ID: {viewId}",
"toAddress": "To Address",
"subject": "Subject",
"body": "Body",
@@ -419,6 +423,7 @@
"headerName": "Header Name",
"icon": "Icon",
"max": "Max",
+ "idColon": "Id:",
"copiedRecordURL": "Copied Record URL",
"copyRecordURL": "Copy Record URL",
"duplicateRecord": "Duplicate record",
@@ -443,7 +448,10 @@
"inUI": "in UI Dashboard",
"projectSettings": "Base Settings",
"clickToHide": "Click to hide",
+ "clickToDownload": "Click to download",
"forRole": "for role",
+ "clickToCopyViewID": "Click to copy View ID",
+ "viewMode": "View Mode",
"searchUsers": "Search Users",
"superAdmin": "Super Admin",
"allTables": "All Tables",
@@ -619,6 +627,8 @@
"newFormLoaded": "New form will be loaded after"
},
"activity": {
+ "openInANewTab": "Open in a new tab",
+ "copyIFrameCode": "Copy IFrame code",
"onCondition": "On Condition",
"bulkDownload": "Bulk Download",
"attachFile": "Attach File",
@@ -703,6 +713,8 @@
"inviteTeam": "Invite Team",
"inviteUser": "Invite User",
"inviteToken": "Invite Token",
+ "linkedRecords": "Linked Records",
+ "addNewLink": "Add New Link",
"newUser": "New User",
"editUser": "Edit user",
"deleteUser": "Remove user from base",
@@ -738,8 +750,8 @@
"deleteSelectedRow": "Delete Selected Records",
"importExcel": "Import Excel",
"importCSV": "Import CSV",
- "downloadCSV": "Download as CSV",
- "downloadExcel": "Download as XLSX",
+ "downloadCSV": "Download CSV",
+ "downloadExcel": "Download Excel",
"uploadCSV": "Upload CSV",
"import": "Import",
"importMetadata": "Import Metadata",
@@ -753,9 +765,10 @@
"fillByCodeScan": "Fill by scan",
"listSharedView": "Shared View List",
"ListView": "Views List",
- "copyView": "Copy view",
- "renameView": "Rename view",
- "deleteView": "Delete view",
+ "copyView": "Copy View",
+ "renameView": "Rename View",
+ "uploadData": "Upload Data",
+ "deleteView": "Delete View",
"createGrid": "Create Grid View",
"createGallery": "Create Gallery View",
"createCalendar": "Create Calendar View",
@@ -788,6 +801,9 @@
"linkRecord": "Link record",
"addNewRecord": "Add new record",
"newRecord": "New record",
+ "tableNameCreateNewRecord": "{tableName}: Create new record",
+ "gotSavedLinkedSuccessfully": "{tableName} '{recordTitle}' got saved & linked successfully",
+ "recordCreatedLinked": "Record Created & Linked",
"useConnectionUrl": "Use Connection URL",
"toggleCommentsDraw": "Toggle comments draw",
"expandRecord": "Expand Record",
@@ -901,6 +917,7 @@
"key": "Key"
},
"msg": {
+ "clickToCopyFieldId": "Click to copy Field Id",
"enterPassword": "Enter password",
"bySigningUp": "By signing up, you agree to the",
"subscribeToOurWeeklyNewsletter": "Subscribe to our weekly newsletter",
@@ -992,6 +1009,7 @@
"createWebhookMsg2": "Create web-hooks to power you automations,",
"createWebhookMsg3": "Get notified as soon as there are changes in your data",
"areYouSureUWantTo": "Are you sure you want to delete the following",
+ "areYouSureUWantToDeleteLabel": "Are you sure you want to {deleteLabel} the following",
"idColumnRequired": "ID field is required, you can rename this later if required.",
"length59Required": "The length exceeds the max 59 characters",
"noNewNotifications": "You have no new notifications",
@@ -1007,7 +1025,8 @@
},
"nonEditableFields": {
"computedFieldUnableToClear": "Warning: Computed field - unable to clear text",
- "qrFieldsCannotBeDirectlyChanged": "Warning: QR fields cannot be directly changed."
+ "qrFieldsCannotBeDirectlyChanged": "Warning: QR fields cannot be directly changed.",
+ "barcodeFieldsCannotBeDirectlyChanged": "Warning: Barcode fields cannot be directly changed."
},
"duplicateProject": "Are you sure you want to duplicate the base?",
"duplicateTable": "Are you sure you want to duplicate the table?"
@@ -1178,6 +1197,7 @@
"nameMinLength": "Name must be at least 2 characters long",
"nameMaxLength": "Name must be at most 60 characters long",
"viewNameRequired": "View name is required",
+ "nameMaxLength256": "Name must be at most 256 characters long",
"viewNameUnique": "View name should be unique",
"searchProject": "Your search for {search} found no results",
"invalidChar": "Invalid character in folder path.",
diff --git a/packages/nc-gui/middleware/auth.global.ts b/packages/nc-gui/middleware/auth.global.ts
index 3ab3d1cf50..42b9e4140d 100644
--- a/packages/nc-gui/middleware/auth.global.ts
+++ b/packages/nc-gui/middleware/auth.global.ts
@@ -133,11 +133,13 @@ async function tryGoogleAuth(api: Api, signIn: Actions['signIn']) {
authProvider = 'oidc'
}
+ // `extra` prop is used in our cloud implementation, so we are keeping it
const {
data: { token, extra },
} = await api.instance.post(`/auth/${authProvider}/genTokenByCode${window.location.search}`)
- extraProps = extra
+ // if extra prop is null/undefined set it as an empty object as fallback
+ extraProps = extra || {}
signIn(token)
} catch (e: any) {
@@ -148,7 +150,7 @@ async function tryGoogleAuth(api: Api, signIn: Actions['signIn']) {
window.history.pushState(
'object',
document.title,
- `${extraProps.continueAfterSignIn ? `${newURL}#/?continueAfterSignIn=${extraProps.continueAfterSignIn}` : newURL}`,
+ `${extraProps?.continueAfterSignIn ? `${newURL}#/?continueAfterSignIn=${extraProps.continueAfterSignIn}` : newURL}`,
)
window.location.reload()
}
diff --git a/packages/nc-gui/package.json b/packages/nc-gui/package.json
index e2ab6cf13e..61da5c0484 100644
--- a/packages/nc-gui/package.json
+++ b/packages/nc-gui/package.json
@@ -143,7 +143,7 @@
"eslint-config-prettier": "^8.8.0",
"eslint-plugin-prettier": "^4.2.1",
"happy-dom": "^6.0.3",
- "nuxt": "^3.6.5",
+ "nuxt": "^3.8.1",
"nuxt-windicss": "^2.6.1",
"prettier": "^2.7.1",
"sass": "^1.63.4",
diff --git a/packages/nc-gui/pages/account/index.vue b/packages/nc-gui/pages/account/index.vue
index 86ddb9104a..50d88086d5 100644
--- a/packages/nc-gui/pages/account/index.vue
+++ b/packages/nc-gui/pages/account/index.vue
@@ -104,7 +104,7 @@ const logout = async () => {
- Users
+ {{ $t('objects.users') }}
diff --git a/packages/nc-gui/pages/signup/[[token]].vue b/packages/nc-gui/pages/signup/[[token]].vue
index 6cd3a43d63..e08aedc34a 100644
--- a/packages/nc-gui/pages/signup/[[token]].vue
+++ b/packages/nc-gui/pages/signup/[[token]].vue
@@ -238,7 +238,7 @@ onMounted(async () => {
diff --git a/packages/nc-gui/plugins/a.dayjs.ts b/packages/nc-gui/plugins/a.dayjs.ts
index eecbf09832..ee2f7b3314 100644
--- a/packages/nc-gui/plugins/a.dayjs.ts
+++ b/packages/nc-gui/plugins/a.dayjs.ts
@@ -1,10 +1,11 @@
-import { extend } from 'dayjs'
+import dayjs, { extend } from 'dayjs'
import relativeTime from 'dayjs/plugin/relativeTime.js'
import customParseFormat from 'dayjs/plugin/customParseFormat.js'
import duration from 'dayjs/plugin/duration.js'
import utc from 'dayjs/plugin/utc.js'
import weekday from 'dayjs/plugin/weekday.js'
import timezone from 'dayjs/plugin/timezone.js'
+import updateLocale from 'dayjs/plugin/updateLocale'
import { defineNuxtPlugin } from '#imports'
export default defineNuxtPlugin(() => {
@@ -14,4 +15,8 @@ export default defineNuxtPlugin(() => {
extend(duration)
extend(weekday)
extend(timezone)
+ extend(updateLocale)
+ dayjs.updateLocale('en', {
+ weekStart: 1,
+ })
})
diff --git a/packages/nc-gui/plugins/state.ts b/packages/nc-gui/plugins/state.ts
index 0bd042af0b..d5cab7b35d 100644
--- a/packages/nc-gui/plugins/state.ts
+++ b/packages/nc-gui/plugins/state.ts
@@ -6,7 +6,7 @@ import { loadLocaleMessages, setI18nLanguage } from '~/plugins/a.i18n'
*
* @example
* ```js
- * import { useNuxtApp } from '#app'
+ * import { useNuxtApp } from '#imports'
*
* const { $state } = useNuxtApp()
*
diff --git a/packages/nc-gui/store/config.ts b/packages/nc-gui/store/config.ts
index 5c8cbcaa9b..77696a6cea 100644
--- a/packages/nc-gui/store/config.ts
+++ b/packages/nc-gui/store/config.ts
@@ -13,6 +13,9 @@ export const useConfigStore = defineStore('configStore', () => {
const isViewPortMobile = () => width.value < MAX_WIDTH_FOR_MOBILE_MODE
+ // When set to true expanded form will auto focus on comment input and state will be set to false after focussing
+ const isExpandedFormCommentMode = ref(false)
+
const isMobileMode = ref(isViewPortMobile())
const projectPageTab = ref<'allTable' | 'collaborator' | 'data-source'>('allTable')
@@ -67,6 +70,7 @@ export const useConfigStore = defineStore('configStore', () => {
isViewPortMobile,
handleSidebarOpenOnMobileForNonViews,
projectPageTab,
+ isExpandedFormCommentMode,
}
})
diff --git a/packages/nc-gui/store/sidebar.ts b/packages/nc-gui/store/sidebar.ts
index 9bad365ce1..7f0e5ee2bd 100644
--- a/packages/nc-gui/store/sidebar.ts
+++ b/packages/nc-gui/store/sidebar.ts
@@ -42,6 +42,16 @@ export const useSidebarStore = defineStore('sidebarStore', () => {
const leftSidebarWidth = computed(() => (width.value * mobileNormalizedSidebarSize.value) / 100)
+ const nonHiddenMobileSidebarSize = computed(() => {
+ if (isMobileMode.value) {
+ return 100
+ }
+
+ return leftSideBarSize.value.current ?? leftSideBarSize.value.old
+ })
+
+ const nonHiddenLeftSidebarWidth = computed(() => (width.value * nonHiddenMobileSidebarSize.value) / 100)
+
return {
isLeftSidebarOpen,
isRightSidebarOpen,
@@ -50,6 +60,7 @@ export const useSidebarStore = defineStore('sidebarStore', () => {
leftSidebarState,
leftSidebarWidth,
mobileNormalizedSidebarSize,
+ nonHiddenLeftSidebarWidth,
}
})
diff --git a/packages/nc-gui/store/views.ts b/packages/nc-gui/store/views.ts
index a6f9547025..ce3ca8855a 100644
--- a/packages/nc-gui/store/views.ts
+++ b/packages/nc-gui/store/views.ts
@@ -1,4 +1,4 @@
-import type { ViewType, ViewTypes } from 'nocodb-sdk'
+import type { FilterType, SortType, ViewType, ViewTypes } from 'nocodb-sdk'
import { acceptHMRUpdate, defineStore } from 'pinia'
import type { ViewPageType } from '~/lib'
@@ -41,6 +41,12 @@ export const useViewsStore = defineStore('viewsStore', () => {
},
})
+ // Both are synced with `useSmartsheetStore` state
+ // Sort of active view
+ const activeSorts = ref
([])
+ // Filters of active view (used for local filters)
+ const activeNestedFilters = ref([])
+
const isViewsLoading = ref(true)
const isViewDataLoading = ref(true)
const isPublic = computed(() => route.value.meta?.public)
@@ -304,6 +310,8 @@ export const useViewsStore = defineStore('viewsStore', () => {
navigateToView,
changeView,
removeFromRecentViews,
+ activeSorts,
+ activeNestedFilters,
}
})
diff --git a/packages/nc-gui/utils/svgToPng.ts b/packages/nc-gui/utils/svgToPng.ts
new file mode 100644
index 0000000000..88329efb61
--- /dev/null
+++ b/packages/nc-gui/utils/svgToPng.ts
@@ -0,0 +1,69 @@
+function copyStylesInline(destinationNode: any, sourceNode: any) {
+ const containerElements = ['svg', 'g']
+ for (let cd = 0; cd < destinationNode.childNodes.length; cd++) {
+ const child = destinationNode.childNodes[cd]
+ if (containerElements.includes(child.tagName)) {
+ copyStylesInline(child, sourceNode.childNodes[cd])
+ continue
+ }
+
+ const style = sourceNode.childNodes[cd].currentStyle || window.getComputedStyle(sourceNode.childNodes[cd])
+ if (style === 'undefined' || style == null) continue
+ for (let st = 0; st < style.length; st++) {
+ child.style.setProperty(style[st], style.getPropertyValue(style[st]))
+ }
+ }
+}
+
+function triggerDownload(imgURI: string, fileName: string) {
+ const evt = new MouseEvent('click', {
+ view: window,
+ bubbles: false,
+ cancelable: true,
+ })
+ const a = document.createElement('a')
+ a.setAttribute('download', fileName)
+ a.setAttribute('href', imgURI)
+ a.setAttribute('target', '_blank')
+ a.setAttribute('rel', 'noopener,noreferrer')
+ a.dispatchEvent(evt)
+}
+
+function downloadSvg(svg: SVGGraphicsElement, fileName: string) {
+ const copy = svg.cloneNode(true)
+
+ copyStylesInline(copy, svg)
+
+ const canvas = document.createElement('canvas')
+ const bbox = svg.getBBox()
+ canvas.width = bbox.width
+ canvas.height = bbox.height
+
+ const ctx = canvas.getContext('2d')!
+ ctx.clearRect(0, 0, bbox.width, bbox.height)
+
+ const data = new XMLSerializer().serializeToString(copy)
+ const DOMURL = window.URL || window.webkitURL || window
+ const img = new Image()
+ const svgBlob = new Blob([data], { type: 'image/svg+xml;charset=utf-8' })
+ const url = DOMURL.createObjectURL(svgBlob)
+
+ img.onload = function () {
+ ctx.drawImage(img, 0, 0)
+ DOMURL.revokeObjectURL(url)
+ if (typeof navigator !== 'undefined' && navigator.msSaveOrOpenBlob) {
+ const blob = canvas.msToBlob()
+ navigator.msSaveOrOpenBlob(blob, fileName)
+ } else {
+ const imgURI = canvas.toDataURL('image/png').replace('image/png', 'image/octet-stream')
+ triggerDownload(imgURI, fileName)
+ }
+ console.log(canvas)
+
+ // TODO: Somehow canvas dom element is getting deleted
+ // document.removeChild(canvas)
+ }
+ img.src = url
+}
+
+export { downloadSvg }
diff --git a/packages/nc-gui/utils/urlUtils.ts b/packages/nc-gui/utils/urlUtils.ts
index 2f0a071849..5fb19860d2 100644
--- a/packages/nc-gui/utils/urlUtils.ts
+++ b/packages/nc-gui/utils/urlUtils.ts
@@ -13,6 +13,7 @@ export const replaceUrlsWithLink = (text: string): boolean | string => {
a.textContent = url
a.setAttribute('href', url)
a.setAttribute('target', '_blank')
+ a.setAttribute('rel', 'noopener,noreferrer')
return a.outerHTML
})
@@ -25,5 +26,5 @@ export const isValidURL = (str: string) => {
export const openLink = (path: string, baseURL?: string, target = '_blank') => {
const url = new URL(path, baseURL)
- window.open(url.href, target)
+ window.open(url.href, target, 'noopener,noreferrer')
}
diff --git a/packages/noco-docs/docs/020.getting-started/050.self-hosted/020.environment-variables.md b/packages/noco-docs/docs/020.getting-started/050.self-hosted/020.environment-variables.md
index 2b43efa81e..a22ba523a1 100644
--- a/packages/noco-docs/docs/020.getting-started/050.self-hosted/020.environment-variables.md
+++ b/packages/noco-docs/docs/020.getting-started/050.self-hosted/020.environment-variables.md
@@ -22,6 +22,8 @@ For production use-cases, it is **recommended** to configure
| NC_AUTH_JWT_SECRET | JWT secret used for auth and storing other secrets | A random secret will be generated |
| PORT | For setting app running port | `8080` |
| DB_QUERY_LIMIT_DEFAULT | Pagination limit | 25 |
+| DB_QUERY_LIMIT_GROUP_BY_GROUP | Group per page limit | 10 |
+| DB_QUERY_LIMIT_GROUP_BY_RECORD | Record per group limit | 10 |
| DB_QUERY_LIMIT_MAX | Maximum allowed pagination limit | 1000 |
| DB_QUERY_LIMIT_MIN | Minimum allowed pagination limit | 1 |
| NC_TOOL_DIR | App directory to keep metadata and app related files | Defaults to current working directory. In docker maps to `/usr/app/data/` for mounting volume. |
diff --git a/packages/nocodb-sdk/src/lib/Api.ts b/packages/nocodb-sdk/src/lib/Api.ts
index 722bbb1cc5..8ceba0f9b1 100644
--- a/packages/nocodb-sdk/src/lib/Api.ts
+++ b/packages/nocodb-sdk/src/lib/Api.ts
@@ -504,6 +504,7 @@ export type ColumnReqType = (
view_id?: string;
};
title: string;
+ view_id?: string;
};
/**
@@ -5745,6 +5746,53 @@ export class Api<
...params,
}),
+ /**
+ * @description Duplicate a column
+ *
+ * @tags DB Table
+ * @name DuplicateColumn
+ * @summary Duplicate Column
+ * @request POST:/api/v1/db/meta/duplicate/{baseId}/column/{columnId}
+ * @response `200` `{
+ name?: string,
+ id?: string,
+
+}` OK
+ * @response `400` `{
+ \** @example BadRequest [Error]: *\
+ msg: string,
+
+}`
+ */
+ duplicateColumn: (
+ baseId: IdType,
+ columnId: IdType,
+ data: {
+ options?: {
+ excludeData?: boolean;
+ };
+ extra?: object;
+ },
+ params: RequestParams = {}
+ ) =>
+ this.request<
+ {
+ name?: string;
+ id?: string;
+ },
+ {
+ /** @example BadRequest [Error]: */
+ msg: string;
+ }
+ >({
+ path: `/api/v1/db/meta/duplicate/${baseId}/column/${columnId}`,
+ method: 'POST',
+ body: data,
+ type: ContentType.Json,
+ format: 'json',
+ ...params,
+ }),
+
/**
* @description Update the order of the given Table
*
diff --git a/packages/nocodb/src/Noco.ts b/packages/nocodb/src/Noco.ts
index a10c00647d..b93af0c52d 100644
--- a/packages/nocodb/src/Noco.ts
+++ b/packages/nocodb/src/Noco.ts
@@ -9,7 +9,7 @@ import dotenv from 'dotenv';
import { IoAdapter } from '@nestjs/platform-socket.io';
import requestIp from 'request-ip';
import cookieParser from 'cookie-parser';
-import { Logger } from '@nestjs/common';
+import type { INestApplication } from '@nestjs/common';
import type { MetaService } from '~/meta/meta.service';
import type { IEventEmitter } from '~/modules/event-emitter/event-emitter.interface';
import type { Express } from 'express';
@@ -21,17 +21,16 @@ import { isEE } from '~/utils';
dotenv.config();
export default class Noco {
- private static _this: Noco;
- private static ee: boolean;
+ protected static _this: Noco;
+ protected static ee: boolean;
public static readonly env: string = '_noco';
- private static _httpServer: http.Server;
- private static _server: Express;
- private static logger = new Logger(Noco.name);
+ protected static _httpServer: http.Server;
+ protected static _server: Express;
public static get dashboardUrl(): string {
const siteUrl = `http://localhost:${process.env.PORT || 8080}`;
- return `${siteUrl}${Noco._this?.config?.dashboardPath}`;
+ return `${siteUrl}${this._this?.config?.dashboardPath}`;
}
public static config: any;
@@ -43,8 +42,8 @@ export default class Noco {
public readonly metaMgrv2: any;
public env: string;
- private config: any;
- private requestContext: any;
+ protected config: any;
+ protected requestContext: any;
constructor() {
process.env.PORT = process.env.PORT || '8080';
@@ -82,77 +81,79 @@ export default class Noco {
}
public static getConfig(): any {
- return Noco.config;
+ return this.config;
}
public static isEE(): boolean {
- return Noco.ee || process.env.NC_CLOUD === 'true';
+ return this.ee || process.env.NC_CLOUD === 'true';
}
public static async loadEEState(): Promise {
try {
- return (Noco.ee = isEE);
+ return (this.ee = isEE);
} catch {}
- return (Noco.ee = false);
+ return (this.ee = false);
}
static async init(param: any, httpServer: http.Server, server: Express) {
- const nestApp = await NestFactory.create(AppModule);
+ const nestApp = await NestFactory.create(AppModule, {
+ bufferLogs: true,
+ });
+ this.initCustomLogger(nestApp);
+ nestApp.flushLogs();
if (process.env.NC_WORKER_CONTAINER === 'true') {
if (!process.env.NC_REDIS_URL) {
throw new Error('NC_REDIS_URL is required');
}
process.env.NC_DISABLE_TELE = 'true';
+ }
- nestApp.init();
- } else {
- nestApp.useWebSocketAdapter(new IoAdapter(httpServer));
-
- this._httpServer = nestApp.getHttpAdapter().getInstance();
- this._server = server;
+ nestApp.useWebSocketAdapter(new IoAdapter(httpServer));
- nestApp.use(requestIp.mw());
- nestApp.use(cookieParser());
+ this._httpServer = nestApp.getHttpAdapter().getInstance();
+ this._server = server;
- nestApp.useWebSocketAdapter(new IoAdapter(httpServer));
+ nestApp.use(requestIp.mw());
+ nestApp.use(cookieParser());
- nestApp.use(
- express.json({ limit: process.env.NC_REQUEST_BODY_SIZE || '50mb' }),
- );
+ nestApp.useWebSocketAdapter(new IoAdapter(httpServer));
- await nestApp.init();
+ nestApp.use(
+ express.json({ limit: process.env.NC_REQUEST_BODY_SIZE || '50mb' }),
+ );
- const dashboardPath = process.env.NC_DASHBOARD_URL ?? '/dashboard';
- server.use(NcToolGui.expressMiddleware(dashboardPath));
- server.use(express.static(path.join(__dirname, 'public')));
+ await nestApp.init();
- if (dashboardPath !== '/' && dashboardPath !== '') {
- server.get('/', (_req, res) => res.redirect(dashboardPath));
- }
+ const dashboardPath = process.env.NC_DASHBOARD_URL ?? '/dashboard';
+ server.use(NcToolGui.expressMiddleware(dashboardPath));
+ server.use(express.static(path.join(__dirname, 'public')));
- return nestApp.getHttpAdapter().getInstance();
+ if (dashboardPath !== '/' && dashboardPath !== '') {
+ server.get('/', (_req, res) => res.redirect(dashboardPath));
}
+
+ return nestApp.getHttpAdapter().getInstance();
}
public static get httpServer(): http.Server {
- return Noco._httpServer;
+ return this._httpServer;
}
public static get server(): Express {
- return Noco._server;
+ return this._server;
}
public static async initJwt(): Promise {
if (this.config?.auth?.jwt) {
if (!this.config.auth.jwt.secret) {
let secret = (
- await Noco._ncMeta.metaGet('', '', MetaTable.STORE, {
+ await this._ncMeta.metaGet('', '', MetaTable.STORE, {
key: 'nc_auth_jwt_secret',
})
)?.value;
if (!secret) {
- await Noco._ncMeta.metaInsert('', '', MetaTable.STORE, {
+ await this._ncMeta.metaInsert('', '', MetaTable.STORE, {
key: 'nc_auth_jwt_secret',
value: (secret = uuidv4()),
});
@@ -167,16 +168,20 @@ export default class Noco {
}
}
let serverId = (
- await Noco._ncMeta.metaGet('', '', MetaTable.STORE, {
+ await this._ncMeta.metaGet('', '', MetaTable.STORE, {
key: 'nc_server_id',
})
)?.value;
if (!serverId) {
- await Noco._ncMeta.metaInsert('', '', MetaTable.STORE, {
+ await this._ncMeta.metaInsert('', '', MetaTable.STORE, {
key: 'nc_server_id',
value: (serverId = T.id),
});
}
process.env.NC_SERVER_UUID = serverId;
}
+
+ protected static initCustomLogger(_nestApp: INestApplication) {
+ // setup custom logger for nestjs if needed
+ }
}
diff --git a/packages/nocodb/src/controllers/api-tokens.controller.ts b/packages/nocodb/src/controllers/api-tokens.controller.ts
index 2d76a190eb..3549f388d9 100644
--- a/packages/nocodb/src/controllers/api-tokens.controller.ts
+++ b/packages/nocodb/src/controllers/api-tokens.controller.ts
@@ -6,9 +6,10 @@ import {
HttpCode,
Param,
Post,
- Request,
+ Req,
UseGuards,
} from '@nestjs/common';
+import { Request } from 'express';
import { GlobalGuard } from '~/guards/global/global.guard';
import { PagedResponseImpl } from '~/helpers/PagedResponse';
import { ApiTokensService } from '~/services/api-tokens.service';
@@ -25,7 +26,7 @@ export class ApiTokensController {
'/api/v2/meta/bases/:baseId/api-tokens',
])
@Acl('baseApiTokenList')
- async apiTokenList(@Request() req) {
+ async apiTokenList(@Req() req: Request) {
return new PagedResponseImpl(
await this.apiTokensService.apiTokenList({ userId: req['user'].id }),
);
@@ -37,10 +38,11 @@ export class ApiTokensController {
])
@HttpCode(200)
@Acl('baseApiTokenCreate')
- async apiTokenCreate(@Request() req, @Body() body) {
+ async apiTokenCreate(@Req() req: Request, @Body() body) {
return await this.apiTokensService.apiTokenCreate({
tokenBody: body,
userId: req['user'].id,
+ req,
});
}
@@ -49,10 +51,11 @@ export class ApiTokensController {
'/api/v2/meta/bases/:baseId/api-tokens/:token',
])
@Acl('baseApiTokenDelete')
- async apiTokenDelete(@Request() req, @Param('token') token: string) {
+ async apiTokenDelete(@Req() req: Request, @Param('token') token: string) {
return await this.apiTokensService.apiTokenDelete({
token,
user: req['user'],
+ req,
});
}
}
diff --git a/packages/nocodb/src/controllers/attachments-secure.controller.ts b/packages/nocodb/src/controllers/attachments-secure.controller.ts
index 5a3d6b07e7..e19b300077 100644
--- a/packages/nocodb/src/controllers/attachments-secure.controller.ts
+++ b/packages/nocodb/src/controllers/attachments-secure.controller.ts
@@ -6,8 +6,8 @@ import {
HttpCode,
Param,
Post,
- Request,
- Response,
+ Req,
+ Res,
UploadedFiles,
UseGuards,
UseInterceptors,
@@ -15,8 +15,8 @@ import {
import hash from 'object-hash';
import moment from 'moment';
import { AnyFilesInterceptor } from '@nestjs/platform-express';
-import { Response as ResponseType } from 'express';
-import type { Request as RequestType } from 'express';
+import { Response } from 'express';
+import type { Request } from 'express';
import type { AttachmentReqType, FileType } from 'nocodb-sdk';
import { GlobalGuard } from '~/guards/global/global.guard';
import { AttachmentsService } from '~/services/attachments.service';
@@ -34,13 +34,14 @@ export class AttachmentsSecureController {
@UseInterceptors(UploadAllowedInterceptor, AnyFilesInterceptor())
async upload(
@UploadedFiles() files: Array,
- @Request() req: RequestType & { user: { id: string } },
+ @Req() req: Request & { user: { id: string } },
) {
const path = `${moment().format('YYYY/MM/DD')}/${hash(req.user.id)}`;
const attachments = await this.attachmentsService.upload({
files: files,
path: path,
+ req,
});
return attachments;
@@ -52,23 +53,21 @@ export class AttachmentsSecureController {
@UseGuards(MetaApiLimiterGuard, GlobalGuard)
async uploadViaURL(
@Body() body: Array,
- @Request() req: RequestType & { user: { id: string } },
+ @Req() req: Request & { user: { id: string } },
) {
const path = `${moment().format('YYYY/MM/DD')}/${hash(req.user.id)}`;
const attachments = await this.attachmentsService.uploadViaURL({
urls: body,
path,
+ req,
});
return attachments;
}
@Get('/dltemp/:param(*)')
- async fileReadv3(
- @Param('param') param: string,
- @Response() res: ResponseType,
- ) {
+ async fileReadv3(@Param('param') param: string, @Res() res: Response) {
try {
const fpath = await PresignedUrl.getPath(`dltemp/${param}`);
diff --git a/packages/nocodb/src/controllers/attachments.controller.ts b/packages/nocodb/src/controllers/attachments.controller.ts
index 5070ef19dd..00a471e1e5 100644
--- a/packages/nocodb/src/controllers/attachments.controller.ts
+++ b/packages/nocodb/src/controllers/attachments.controller.ts
@@ -7,14 +7,14 @@ import {
Param,
Post,
Query,
- Request,
- Response,
+ Req,
+ Res,
UploadedFiles,
UseGuards,
UseInterceptors,
} from '@nestjs/common';
import { AnyFilesInterceptor } from '@nestjs/platform-express';
-import { Request as RequestType, Response as ResponseType } from 'express';
+import { Request, Response } from 'express';
import type { AttachmentReqType, FileType } from 'nocodb-sdk';
import { UploadAllowedInterceptor } from '~/interceptors/is-upload-allowed/is-upload-allowed.interceptor';
import { GlobalGuard } from '~/guards/global/global.guard';
@@ -30,13 +30,11 @@ export class AttachmentsController {
@Post(['/api/v1/db/storage/upload', '/api/v2/storage/upload'])
@HttpCode(200)
@UseInterceptors(UploadAllowedInterceptor, AnyFilesInterceptor())
- async upload(
- @UploadedFiles() files: Array,
- @Request() req: RequestType,
- ) {
+ async upload(@UploadedFiles() files: Array, @Req() req: Request) {
const attachments = await this.attachmentsService.upload({
files: files,
path: req.query?.path?.toString(),
+ req,
});
return attachments;
@@ -49,10 +47,12 @@ export class AttachmentsController {
async uploadViaURL(
@Body() body: Array,
@Query('path') path: string,
+ @Req() req: Request,
) {
const attachments = await this.attachmentsService.uploadViaURL({
urls: body,
path,
+ req,
});
return attachments;
@@ -62,10 +62,7 @@ export class AttachmentsController {
// , getCacheMiddleware(), catchError(fileRead));
@Get('/download/:filename(*)')
// This route will match any URL that starts with
- async fileRead(
- @Param('filename') filename: string,
- @Response() res: ResponseType,
- ) {
+ async fileRead(@Param('filename') filename: string, @Res() res: Response) {
try {
const file = await this.attachmentsService.getFile({
path: path.join('nc', 'uploads', filename),
@@ -84,7 +81,7 @@ export class AttachmentsController {
@Param('param1') param1: string,
@Param('param2') param2: string,
@Param('filename') filename: string,
- @Response() res: ResponseType,
+ @Res() res: Response,
) {
try {
const file = await this.attachmentsService.getFile({
@@ -104,10 +101,7 @@ export class AttachmentsController {
}
@Get('/dltemp/:param(*)')
- async fileReadv3(
- @Param('param') param: string,
- @Response() res: ResponseType,
- ) {
+ async fileReadv3(@Param('param') param: string, @Res() res: Response) {
try {
const fpath = await PresignedUrl.getPath(`dltemp/${param}`);
diff --git a/packages/nocodb/src/controllers/audits.controller.ts b/packages/nocodb/src/controllers/audits.controller.ts
index 1e21690de8..64791f5928 100644
--- a/packages/nocodb/src/controllers/audits.controller.ts
+++ b/packages/nocodb/src/controllers/audits.controller.ts
@@ -7,9 +7,10 @@ import {
Patch,
Post,
Query,
- Request,
+ Req,
UseGuards,
} from '@nestjs/common';
+import { Request } from 'express';
import { GlobalGuard } from '~/guards/global/global.guard';
import { PagedResponseImpl } from '~/helpers/PagedResponse';
import { AuditsService } from '~/services/audits.service';
@@ -24,7 +25,7 @@ export class AuditsController {
@Post(['/api/v1/db/meta/audits/comments', '/api/v2/meta/audits/comments'])
@HttpCode(200)
@Acl('commentRow')
- async commentRow(@Request() req) {
+ async commentRow(@Req() req: Request) {
return await this.auditsService.commentRow({
user: (req as any).user,
body: req.body,
@@ -46,7 +47,7 @@ export class AuditsController {
@Get(['/api/v1/db/meta/audits/comments', '/api/v2/meta/audits/comments'])
@Acl('commentList')
- async commentList(@Request() req) {
+ async commentList(@Req() req: Request) {
return new PagedResponseImpl(
await this.auditsService.commentList({ query: req.query }),
);
@@ -59,7 +60,7 @@ export class AuditsController {
@Acl('commentUpdate')
async commentUpdate(
@Param('auditId') auditId: string,
- @Request() req,
+ @Req() req: Request,
@Body() body: any,
) {
return await this.auditsService.commentUpdate({
@@ -74,14 +75,14 @@ export class AuditsController {
'/api/v2/meta/bases/:baseId/audits/',
])
@Acl('auditList')
- async auditList(@Request() req, @Param('baseId') baseId: string) {
+ async auditList(@Req() req: Request, @Param('baseId') baseId: string) {
return new PagedResponseImpl(
await this.auditsService.auditList({
query: req.query,
baseId,
}),
{
- count: this.auditsService.auditCount({ baseId }),
+ count: await this.auditsService.auditCount({ baseId }),
...req.query,
},
);
diff --git a/packages/nocodb/src/controllers/auth/auth.controller.ts b/packages/nocodb/src/controllers/auth/auth.controller.ts
index 3b5c7c1e01..70a7a7d269 100644
--- a/packages/nocodb/src/controllers/auth/auth.controller.ts
+++ b/packages/nocodb/src/controllers/auth/auth.controller.ts
@@ -5,10 +5,11 @@ import {
HttpCode,
Param,
Post,
- Request,
- Response,
+ Req,
+ Res,
UseGuards,
} from '@nestjs/common';
+import { Request, Response } from 'express';
import { AuthGuard } from '@nestjs/passport';
import { ConfigService } from '@nestjs/config';
import { extractRolesObj } from 'nocodb-sdk';
@@ -41,7 +42,7 @@ export class AuthController {
])
@UseGuards(PublicApiLimiterGuard)
@HttpCode(200)
- async signup(@Request() req: any, @Response() res: any): Promise {
+ async signup(@Req() req: Request, @Res() res: Response): Promise {
if (this.config.get('auth', { infer: true }).disableEmailAuth) {
NcError.forbidden('Email authentication is disabled');
}
@@ -61,7 +62,7 @@ export class AuthController {
])
@UseGuards(PublicApiLimiterGuard)
@HttpCode(200)
- async refreshToken(@Request() req: any, @Response() res: any): Promise {
+ async refreshToken(@Req() req: Request, @Res() res: Response): Promise {
res.json(
await this.usersService.refreshToken({
body: req.body,
@@ -78,18 +79,18 @@ export class AuthController {
])
@UseGuards(PublicApiLimiterGuard, AuthGuard('local'))
@HttpCode(200)
- async signin(@Request() req, @Response() res) {
+ async signin(@Req() req: Request, @Res() res: Response) {
if (this.config.get('auth', { infer: true }).disableEmailAuth) {
NcError.forbidden('Email authentication is disabled');
}
await this.setRefreshToken({ req, res });
- res.json(await this.usersService.login(req.user));
+ res.json(await this.usersService.login(req.user, req));
}
@UseGuards(GlobalGuard)
@Post('/api/v1/auth/user/signout')
@HttpCode(200)
- async signOut(@Request() req, @Response() res): Promise {
+ async signOut(@Req() req: Request, @Res() res: Response): Promise {
if (!(req as any).isAuthenticated()) {
NcError.forbidden('Not allowed');
}
@@ -104,9 +105,9 @@ export class AuthController {
@Post(`/auth/google/genTokenByCode`)
@HttpCode(200)
@UseGuards(PublicApiLimiterGuard, AuthGuard('google'))
- async googleSignin(@Request() req, @Response() res) {
+ async googleSignin(@Req() req: Request, @Res() res: Response) {
await this.setRefreshToken({ req, res });
- res.json(await this.usersService.login(req.user));
+ res.json(await this.usersService.login(req.user, req));
}
@Get('/auth/google')
@@ -117,7 +118,7 @@ export class AuthController {
@Get(['/auth/user/me', '/api/v1/db/auth/user/me', '/api/v1/auth/user/me'])
@UseGuards(MetaApiLimiterGuard, GlobalGuard)
- async me(@Request() req) {
+ async me(@Req() req: Request) {
const user = {
...req.user,
roles: extractRolesObj(req.user.roles),
@@ -137,7 +138,7 @@ export class AuthController {
scope: 'org',
})
@HttpCode(200)
- async passwordChange(@Request() req: any): Promise {
+ async passwordChange(@Req() req: Request): Promise {
if (!(req as any).isAuthenticated()) {
NcError.forbidden('Not allowed');
}
@@ -158,7 +159,7 @@ export class AuthController {
])
@UseGuards(PublicApiLimiterGuard)
@HttpCode(200)
- async passwordForgot(@Request() req: any): Promise {
+ async passwordForgot(@Req() req: Request): Promise {
await this.usersService.passwordForgot({
siteUrl: (req as any).ncSiteUrl,
body: req.body,
@@ -190,7 +191,7 @@ export class AuthController {
@UseGuards(PublicApiLimiterGuard)
@HttpCode(200)
async passwordReset(
- @Request() req: any,
+ @Req() req: Request,
@Param('tokenId') tokenId: string,
@Body() body: any,
): Promise {
@@ -210,7 +211,7 @@ export class AuthController {
@UseGuards(PublicApiLimiterGuard)
@HttpCode(200)
async emailVerification(
- @Request() req: any,
+ @Req() req: Request,
@Param('tokenId') tokenId: string,
): Promise {
await this.usersService.emailVerification({
@@ -227,8 +228,8 @@ export class AuthController {
])
@UseGuards(PublicApiLimiterGuard)
async renderPasswordReset(
- @Request() req: any,
- @Response() res: any,
+ @Req() req: Request,
+ @Res() res: Response,
@Param('tokenId') tokenId: string,
): Promise {
try {
diff --git a/packages/nocodb/src/controllers/base-users.controller.ts b/packages/nocodb/src/controllers/base-users.controller.ts
index b32bae2ebe..4fdb903970 100644
--- a/packages/nocodb/src/controllers/base-users.controller.ts
+++ b/packages/nocodb/src/controllers/base-users.controller.ts
@@ -7,9 +7,10 @@ import {
Param,
Patch,
Post,
- Request,
+ Req,
UseGuards,
} from '@nestjs/common';
+import { Request } from 'express';
import { ProjectUserReqType } from 'nocodb-sdk';
import { GlobalGuard } from '~/guards/global/global.guard';
import { BaseUsersService } from '~/services/base-users/base-users.service';
@@ -27,7 +28,7 @@ export class BaseUsersController {
'/api/v2/meta/bases/:baseId/users',
])
@Acl('userList')
- async userList(@Param('baseId') baseId: string, @Request() req) {
+ async userList(@Param('baseId') baseId: string, @Req() req: Request) {
return {
users: await this.baseUsersService.userList({
baseId,
@@ -44,7 +45,7 @@ export class BaseUsersController {
@Acl('userInvite')
async userInvite(
@Param('baseId') baseId: string,
- @Request() req,
+ @Req() req: Request,
@Body() body: ProjectUserReqType,
): Promise {
// todo: move this to a service
@@ -66,7 +67,7 @@ export class BaseUsersController {
async baseUserUpdate(
@Param('baseId') baseId: string,
@Param('userId') userId: string,
- @Request() req,
+ @Req() req: Request,
@Body()
body: ProjectUserReqType & {
base_id: string;
@@ -91,7 +92,7 @@ export class BaseUsersController {
async baseUserDelete(
@Param('baseId') baseId: string,
@Param('userId') userId: string,
- @Request() req,
+ @Req() req: Request,
): Promise {
await this.baseUsersService.baseUserDelete({
baseId,
@@ -112,7 +113,7 @@ export class BaseUsersController {
async baseUserInviteResend(
@Param('baseId') baseId: string,
@Param('userId') userId: string,
- @Request() req,
+ @Req() req: Request,
@Body() body: ProjectUserReqType,
): Promise {
await this.baseUsersService.baseUserInviteResend({
@@ -133,7 +134,7 @@ export class BaseUsersController {
@Acl('baseUserMetaUpdate')
async baseUserMetaUpdate(
@Param('baseId') baseId: string,
- @Request() req,
+ @Req() req: Request,
@Body() body: ProjectUserReqType,
): Promise {
return await this.baseUsersService.baseUserMetaUpdate({
diff --git a/packages/nocodb/src/controllers/bases.controller.ts b/packages/nocodb/src/controllers/bases.controller.ts
index d90b3dc5d2..3128fc0015 100644
--- a/packages/nocodb/src/controllers/bases.controller.ts
+++ b/packages/nocodb/src/controllers/bases.controller.ts
@@ -8,9 +8,10 @@ import {
Patch,
Post,
Query,
- Request,
+ Req,
UseGuards,
} from '@nestjs/common';
+import { Request } from 'express';
import isDocker from 'is-docker';
import { ProjectReqType } from 'nocodb-sdk';
import type { BaseType } from 'nocodb-sdk';
@@ -32,7 +33,7 @@ export class BasesController {
scope: 'org',
})
@Get(['/api/v1/db/meta/projects/', '/api/v2/meta/bases/'])
- async list(@Query() queryParams: Record, @Request() req) {
+ async list(@Query() queryParams: Record, @Req() req: Request) {
const bases = await this.projectsService.baseList({
user: req.user,
query: queryParams,
@@ -76,12 +77,13 @@ export class BasesController {
async baseUpdate(
@Param('baseId') baseId: string,
@Body() body: Record,
- @Request() req,
+ @Req() req: Request,
) {
const base = await this.projectsService.baseUpdate({
baseId,
base: body,
user: req.user,
+ req,
});
return base;
@@ -89,10 +91,11 @@ export class BasesController {
@Acl('baseDelete')
@Delete(['/api/v1/db/meta/projects/:baseId', '/api/v2/meta/bases/:baseId'])
- async baseDelete(@Param('baseId') baseId: string, @Request() req) {
+ async baseDelete(@Param('baseId') baseId: string, @Req() req: Request) {
const deleted = await this.projectsService.baseSoftDelete({
baseId,
user: req.user,
+ req,
});
return deleted;
@@ -103,9 +106,10 @@ export class BasesController {
})
@Post(['/api/v1/db/meta/projects', '/api/v2/meta/bases'])
@HttpCode(200)
- async baseCreate(@Body() baseBody: ProjectReqType, @Request() req) {
+ async baseCreate(@Body() baseBody: ProjectReqType, @Req() req: Request) {
const base = await this.projectsService.baseCreate({
base: baseBody,
+ req,
user: req['user'],
});
diff --git a/packages/nocodb/src/controllers/bulk-data-alias.controller.ts b/packages/nocodb/src/controllers/bulk-data-alias.controller.ts
index 90cbd51c28..740979667d 100644
--- a/packages/nocodb/src/controllers/bulk-data-alias.controller.ts
+++ b/packages/nocodb/src/controllers/bulk-data-alias.controller.ts
@@ -6,10 +6,11 @@ import {
Param,
Patch,
Post,
- Request,
- Response,
+ Req,
+ Res,
UseGuards,
} from '@nestjs/common';
+import { Request, Response } from 'express';
import { GlobalGuard } from '~/guards/global/global.guard';
import { BulkDataAliasService } from '~/services/bulk-data-alias.service';
import { Acl } from '~/middlewares/extract-ids/extract-ids.middleware';
@@ -24,8 +25,8 @@ export class BulkDataAliasController {
@HttpCode(200)
@Acl('bulkDataInsert')
async bulkDataInsert(
- @Request() req,
- @Response() res,
+ @Req() req: Request,
+ @Res() res: Response,
@Param('baseName') baseName: string,
@Param('tableName') tableName: string,
@Body() body: any,
@@ -43,7 +44,7 @@ export class BulkDataAliasController {
@Patch(['/api/v1/db/data/bulk/:orgs/:baseName/:tableName'])
@Acl('bulkDataUpdate')
async bulkDataUpdate(
- @Request() req,
+ @Req() req: Request,
@Param('baseName') baseName: string,
@Param('tableName') tableName: string,
@Body() body: any,
@@ -60,7 +61,7 @@ export class BulkDataAliasController {
@Patch(['/api/v1/db/data/bulk/:orgs/:baseName/:tableName/all'])
@Acl('bulkDataUpdateAll')
async bulkDataUpdateAll(
- @Request() req,
+ @Req() req: Request,
@Param('baseName') baseName: string,
@Param('tableName') tableName: string,
@Body() body: any,
@@ -77,7 +78,7 @@ export class BulkDataAliasController {
@Delete(['/api/v1/db/data/bulk/:orgs/:baseName/:tableName'])
@Acl('bulkDataDelete')
async bulkDataDelete(
- @Request() req,
+ @Req() req: Request,
@Param('baseName') baseName: string,
@Param('tableName') tableName: string,
@Body() body: any,
@@ -95,7 +96,7 @@ export class BulkDataAliasController {
@Delete(['/api/v1/db/data/bulk/:orgs/:baseName/:tableName/all'])
@Acl('bulkDataDeleteAll')
async bulkDataDeleteAll(
- @Request() req,
+ @Req() req: Request,
@Param('baseName') baseName: string,
@Param('tableName') tableName: string,
) {
diff --git a/packages/nocodb/src/controllers/columns.controller.ts b/packages/nocodb/src/controllers/columns.controller.ts
index deccc874e9..d27ace33ce 100644
--- a/packages/nocodb/src/controllers/columns.controller.ts
+++ b/packages/nocodb/src/controllers/columns.controller.ts
@@ -7,9 +7,10 @@ import {
Param,
Patch,
Post,
- Request,
+ Req,
UseGuards,
} from '@nestjs/common';
+import { Request } from 'express';
import { ColumnReqType } from 'nocodb-sdk';
import type { Column } from '~/models';
import { GlobalGuard } from '~/guards/global/global.guard';
@@ -31,7 +32,7 @@ export class ColumnsController {
async columnAdd(
@Param('tableId') tableId: string,
@Body() body: ColumnReqType,
- @Request() req: any,
+ @Req() req: Request,
) {
return await this.columnsService.columnAdd({
tableId,
@@ -49,7 +50,7 @@ export class ColumnsController {
async columnUpdate(
@Param('columnId') columnId: string,
@Body() body: ColumnReqType,
- @Request() req: any,
+ @Req() req: Request,
) {
return await this.columnsService.columnUpdate({
columnId: columnId,
@@ -64,7 +65,7 @@ export class ColumnsController {
'/api/v2/meta/columns/:columnId',
])
@Acl('columnDelete')
- async columnDelete(@Param('columnId') columnId: string, @Request() req: any) {
+ async columnDelete(@Param('columnId') columnId: string, @Req() req: Request) {
return await this.columnsService.columnDelete({
columnId,
req,
@@ -113,7 +114,7 @@ export class ColumnsController {
column: Partial;
}[];
},
- @Request() req: any,
+ @Req() req: Request,
) {
return await this.columnsService.columnBulk(tableId, body, req);
}
diff --git a/packages/nocodb/src/controllers/data-alias-export.controller.ts b/packages/nocodb/src/controllers/data-alias-export.controller.ts
index 0193b21292..4d94ada8ae 100644
--- a/packages/nocodb/src/controllers/data-alias-export.controller.ts
+++ b/packages/nocodb/src/controllers/data-alias-export.controller.ts
@@ -1,4 +1,5 @@
-import { Controller, Get, Request, Response, UseGuards } from '@nestjs/common';
+import { Controller, Get, Req, Res, UseGuards } from '@nestjs/common';
+import { Request, Response } from 'express';
import * as XLSX from 'xlsx';
import { GlobalGuard } from '~/guards/global/global.guard';
import { DatasService } from '~/services/datas.service';
@@ -17,7 +18,7 @@ export class DataAliasExportController {
'/api/v1/db/data/:orgs/:baseName/:tableName/views/:viewName/export/excel',
])
@Acl('exportExcel')
- async excelDataExport(@Request() req, @Response() res) {
+ async excelDataExport(@Req() req: Request, @Res() res: Response) {
const { model, view } =
await this.datasService.getViewAndModelFromRequestByAliasOrId(req);
let targetView = view;
@@ -44,7 +45,7 @@ export class DataAliasExportController {
'/api/v1/db/data/:orgs/:baseName/:tableName/export/csv',
])
@Acl('exportCsv')
- async csvDataExport(@Request() req, @Response() res) {
+ async csvDataExport(@Req() req: Request, @Res() res: Response) {
const { model, view } =
await this.datasService.getViewAndModelFromRequestByAliasOrId(req);
let targetView = view;
diff --git a/packages/nocodb/src/controllers/data-alias-nested.controller.ts b/packages/nocodb/src/controllers/data-alias-nested.controller.ts
index 616ac033ee..3807d2478f 100644
--- a/packages/nocodb/src/controllers/data-alias-nested.controller.ts
+++ b/packages/nocodb/src/controllers/data-alias-nested.controller.ts
@@ -5,9 +5,10 @@ import {
HttpCode,
Param,
Post,
- Request,
+ Req,
UseGuards,
} from '@nestjs/common';
+import { Request } from 'express';
import { DataAliasNestedService } from '~/services/data-alias-nested.service';
import { GlobalGuard } from '~/guards/global/global.guard';
import { Acl } from '~/middlewares/extract-ids/extract-ids.middleware';
@@ -22,7 +23,7 @@ export class DataAliasNestedController {
@Get(['/api/v1/db/data/:orgs/:baseName/:tableName/:rowId/mm/:columnName'])
@Acl('mmList')
async mmList(
- @Request() req,
+ @Req() req: Request,
@Param('columnName') columnName: string,
@Param('rowId') rowId: string,
@Param('baseName') baseName: string,
@@ -42,7 +43,7 @@ export class DataAliasNestedController {
])
@Acl('mmExcludedList')
async mmExcludedList(
- @Request() req,
+ @Req() req: Request,
@Param('columnName') columnName: string,
@Param('rowId') rowId: string,
@Param('baseName') baseName: string,
@@ -62,7 +63,7 @@ export class DataAliasNestedController {
])
@Acl('hmExcludedList')
async hmExcludedList(
- @Request() req,
+ @Req() req: Request,
@Param('columnName') columnName: string,
@Param('rowId') rowId: string,
@Param('baseName') baseName: string,
@@ -82,7 +83,7 @@ export class DataAliasNestedController {
])
@Acl('btExcludedList')
async btExcludedList(
- @Request() req,
+ @Req() req: Request,
@Param('columnName') columnName: string,
@Param('rowId') rowId: string,
@Param('baseName') baseName: string,
@@ -102,7 +103,7 @@ export class DataAliasNestedController {
@Get(['/api/v1/db/data/:orgs/:baseName/:tableName/:rowId/hm/:columnName'])
@Acl('hmList')
async hmList(
- @Request() req,
+ @Req() req: Request,
@Param('columnName') columnName: string,
@Param('rowId') rowId: string,
@Param('baseName') baseName: string,
@@ -122,7 +123,7 @@ export class DataAliasNestedController {
])
@Acl('relationDataRemove')
async relationDataRemove(
- @Request() req,
+ @Req() req: Request,
@Param('columnName') columnName: string,
@Param('rowId') rowId: string,
@Param('baseName') baseName: string,
@@ -148,7 +149,7 @@ export class DataAliasNestedController {
@Acl('relationDataAdd')
@HttpCode(200)
async relationDataAdd(
- @Request() req,
+ @Req() req: Request,
@Param('columnName') columnName: string,
@Param('rowId') rowId: string,
@Param('baseName') baseName: string,
diff --git a/packages/nocodb/src/controllers/data-alias.controller.ts b/packages/nocodb/src/controllers/data-alias.controller.ts
index 24f70fab92..a1228605d1 100644
--- a/packages/nocodb/src/controllers/data-alias.controller.ts
+++ b/packages/nocodb/src/controllers/data-alias.controller.ts
@@ -8,10 +8,11 @@ import {
Patch,
Post,
Query,
- Request,
- Response,
+ Req,
+ Res,
UseGuards,
} from '@nestjs/common';
+import { Request, Response } from 'express';
import { GlobalGuard } from '~/guards/global/global.guard';
import { parseHrtimeToMilliSeconds } from '~/helpers';
import { Acl } from '~/middlewares/extract-ids/extract-ids.middleware';
@@ -30,8 +31,8 @@ export class DataAliasController {
])
@Acl('dataList')
async dataList(
- @Request() req,
- @Response() res,
+ @Req() req: Request,
+ @Res() res: Response,
@Param('baseName') baseName: string,
@Param('tableName') tableName: string,
@Param('viewName') viewName: string,
@@ -62,7 +63,7 @@ export class DataAliasController {
])
@Acl('dataFindOne')
async dataFindOne(
- @Request() req,
+ @Req() req: Request,
@Param('baseName') baseName: string,
@Param('tableName') tableName: string,
@Param('viewName') viewName: string,
@@ -81,7 +82,7 @@ export class DataAliasController {
])
@Acl('dataGroupBy')
async dataGroupBy(
- @Request() req,
+ @Req() req: Request,
@Param('baseName') baseName: string,
@Param('tableName') tableName: string,
@Param('viewName') viewName: string,
@@ -100,8 +101,8 @@ export class DataAliasController {
])
@Acl('dataCount')
async dataCount(
- @Request() req,
- @Response() res,
+ @Req() req: Request,
+ @Res() res: Response,
@Param('baseName') baseName: string,
@Param('tableName') tableName: string,
@Param('viewName') viewName: string,
@@ -123,7 +124,7 @@ export class DataAliasController {
@HttpCode(200)
@Acl('dataInsert')
async dataInsert(
- @Request() req,
+ @Req() req: Request,
@Param('baseName') baseName: string,
@Param('tableName') tableName: string,
@Param('viewName') viewName: string,
@@ -146,7 +147,7 @@ export class DataAliasController {
])
@Acl('dataUpdate')
async dataUpdate(
- @Request() req,
+ @Req() req: Request,
@Param('baseName') baseName: string,
@Param('tableName') tableName: string,
@Param('viewName') viewName: string,
@@ -170,7 +171,7 @@ export class DataAliasController {
])
@Acl('dataDelete')
async dataDelete(
- @Request() req,
+ @Req() req: Request,
@Param('baseName') baseName: string,
@Param('tableName') tableName: string,
@Param('viewName') viewName: string,
@@ -191,7 +192,7 @@ export class DataAliasController {
])
@Acl('dataRead')
async dataRead(
- @Request() req,
+ @Req() req: Request,
@Param('baseName') baseName: string,
@Param('tableName') tableName: string,
@Param('viewName') viewName: string,
@@ -216,8 +217,8 @@ export class DataAliasController {
])
@Acl('dataExist')
async dataExist(
- @Request() req,
- @Response() res,
+ @Req() req: Request,
+ @Res() res: Response,
@Param('baseName') baseName: string,
@Param('tableName') tableName: string,
@Param('viewName') viewName: string,
@@ -242,8 +243,8 @@ export class DataAliasController {
])
@Acl('groupedDataList')
async groupedDataList(
- @Request() req,
- @Response() res,
+ @Req() req: Request,
+ @Res() res: Response,
@Param('baseName') baseName: string,
@Param('tableName') tableName: string,
@Param('viewName') viewName: string,
diff --git a/packages/nocodb/src/controllers/data-table.controller.ts b/packages/nocodb/src/controllers/data-table.controller.ts
index 9a4e16d0f8..e15bb39ffb 100644
--- a/packages/nocodb/src/controllers/data-table.controller.ts
+++ b/packages/nocodb/src/controllers/data-table.controller.ts
@@ -8,10 +8,11 @@ import {
Patch,
Post,
Query,
- Request,
- Response,
+ Req,
+ Res,
UseGuards,
} from '@nestjs/common';
+import { Request, Response } from 'express';
import { Acl } from '~/middlewares/extract-ids/extract-ids.middleware';
import { DataTableService } from '~/services/data-table.service';
import { parseHrtimeToMilliSeconds } from '~/helpers';
@@ -27,8 +28,8 @@ export class DataTableController {
@Get('/api/v2/tables/:modelId/records')
@Acl('dataList')
async dataList(
- @Request() req,
- @Response() res,
+ @Req() req: Request,
+ @Res() res: Response,
@Param('modelId') modelId: string,
@Query('viewId') viewId: string,
) {
@@ -46,8 +47,8 @@ export class DataTableController {
@Get(['/api/v2/tables/:modelId/records/count'])
@Acl('dataCount')
async dataCount(
- @Request() req,
- @Response() res,
+ @Req() req: Request,
+ @Res() res: Response,
@Param('modelId') modelId: string,
@Query('viewId') viewId: string,
) {
@@ -64,7 +65,7 @@ export class DataTableController {
@HttpCode(200)
@Acl('dataInsert')
async dataInsert(
- @Request() req,
+ @Req() req: Request,
@Param('modelId') modelId: string,
@Query('viewId') viewId: string,
@Body() body: any,
@@ -80,7 +81,7 @@ export class DataTableController {
@Patch(['/api/v2/tables/:modelId/records'])
@Acl('dataUpdate')
async dataUpdate(
- @Request() req,
+ @Req() req: Request,
@Param('modelId') modelId: string,
@Query('viewId') viewId: string,
@Param('rowId') _rowId: string,
@@ -96,7 +97,7 @@ export class DataTableController {
@Delete(['/api/v2/tables/:modelId/records'])
@Acl('dataDelete')
async dataDelete(
- @Request() req,
+ @Req() req: Request,
@Param('modelId') modelId: string,
@Query('viewId') viewId: string,
@Param('rowId') _rowId: string,
@@ -112,7 +113,7 @@ export class DataTableController {
@Get(['/api/v2/tables/:modelId/records/:rowId'])
@Acl('dataRead')
async dataRead(
- @Request() req,
+ @Req() req: Request,
@Param('modelId') modelId: string,
@Query('viewId') viewId: string,
@Param('rowId') rowId: string,
@@ -128,7 +129,7 @@ export class DataTableController {
@Get(['/api/v2/tables/:modelId/links/:columnId/records/:rowId'])
@Acl('nestedDataList')
async nestedDataList(
- @Request() req,
+ @Req() req: Request,
@Param('modelId') modelId: string,
@Query('viewId') viewId: string,
@Param('columnId') columnId: string,
@@ -146,7 +147,7 @@ export class DataTableController {
@Post(['/api/v2/tables/:modelId/links/:columnId/records/:rowId'])
@Acl('nestedDataLink')
async nestedLink(
- @Request() req,
+ @Req() req: Request,
@Param('modelId') modelId: string,
@Query('viewId') viewId: string,
@Param('columnId') columnId: string,
@@ -168,7 +169,7 @@ export class DataTableController {
@Delete(['/api/v2/tables/:modelId/links/:columnId/records/:rowId'])
@Acl('nestedDataUnlink')
async nestedUnlink(
- @Request() req,
+ @Req() req: Request,
@Param('modelId') modelId: string,
@Query('viewId') viewId: string,
@Param('columnId') columnId: string,
diff --git a/packages/nocodb/src/controllers/datas.controller.ts b/packages/nocodb/src/controllers/datas.controller.ts
index 4c55980dae..49c51a676c 100644
--- a/packages/nocodb/src/controllers/datas.controller.ts
+++ b/packages/nocodb/src/controllers/datas.controller.ts
@@ -7,9 +7,10 @@ import {
Param,
Patch,
Post,
- Request,
+ Req,
UseGuards,
} from '@nestjs/common';
+import { Request } from 'express';
import { GlobalGuard } from '~/guards/global/global.guard';
import { DatasService } from '~/services/datas.service';
import { Acl } from '~/middlewares/extract-ids/extract-ids.middleware';
@@ -22,7 +23,7 @@ export class DatasController {
@Get('/data/:viewId/')
@Acl('dataList')
- async dataList(@Request() req, @Param('viewId') viewId: string) {
+ async dataList(@Req() req: Request, @Param('viewId') viewId: string) {
return await this.datasService.dataListByViewId({
viewId: viewId,
query: req.query,
@@ -32,7 +33,7 @@ export class DatasController {
@Get('/data/:viewId/:rowId/mm/:colId')
@Acl('mmList')
async mmList(
- @Request() req,
+ @Req() req: Request,
@Param('viewId') viewId: string,
@Param('colId') colId: string,
@Param('rowId') rowId: string,
@@ -48,7 +49,7 @@ export class DatasController {
@Get('/data/:viewId/:rowId/mm/:colId/exclude')
@Acl('mmExcludedList')
async mmExcludedList(
- @Request() req,
+ @Req() req: Request,
@Param('viewId') viewId: string,
@Param('colId') colId: string,
@Param('rowId') rowId: string,
@@ -64,7 +65,7 @@ export class DatasController {
@Get('/data/:viewId/:rowId/hm/:colId/exclude')
@Acl('hmExcludedList')
async hmExcludedList(
- @Request() req,
+ @Req() req: Request,
@Param('viewId') viewId: string,
@Param('colId') colId: string,
@Param('rowId') rowId: string,
@@ -80,7 +81,7 @@ export class DatasController {
@Get('/data/:viewId/:rowId/bt/:colId/exclude')
@Acl('btExcludedList')
async btExcludedList(
- @Request() req,
+ @Req() req: Request,
@Param('viewId') viewId: string,
@Param('colId') colId: string,
@Param('rowId') rowId: string,
@@ -96,7 +97,7 @@ export class DatasController {
@Get('/data/:viewId/:rowId/hm/:colId')
@Acl('hmList')
async hmList(
- @Request() req,
+ @Req() req: Request,
@Param('viewId') viewId: string,
@Param('colId') colId: string,
@Param('rowId') rowId: string,
@@ -112,7 +113,7 @@ export class DatasController {
@Get('/data/:viewId/:rowId')
@Acl('dataRead')
async dataRead(
- @Request() req,
+ @Req() req: Request,
@Param('viewId') viewId: string,
@Param('rowId') rowId: string,
) {
@@ -127,7 +128,7 @@ export class DatasController {
@HttpCode(200)
@Acl('dataInsert')
async dataInsert(
- @Request() req,
+ @Req() req: Request,
@Param('viewId') viewId: string,
@Body() body: any,
) {
@@ -141,7 +142,7 @@ export class DatasController {
@Patch('/data/:viewId/:rowId')
@Acl('dataUpdate')
async dataUpdate(
- @Request() req,
+ @Req() req: Request,
@Param('viewId') viewId: string,
@Param('rowId') rowId: string,
@Body() body: any,
@@ -157,7 +158,7 @@ export class DatasController {
@Delete('/data/:viewId/:rowId')
@Acl('dataDelete')
async dataDelete(
- @Request() req,
+ @Req() req: Request,
@Param('viewId') viewId: string,
@Param('rowId') rowId: string,
) {
@@ -171,7 +172,7 @@ export class DatasController {
@Delete('/data/:viewId/:rowId/:relationType/:colId/:childId')
@Acl('relationDataDelete')
async relationDataDelete(
- @Request() req,
+ @Req() req: Request,
@Param('viewId') viewId: string,
@Param('rowId') rowId: string,
@Param('relationType') relationType: string,
@@ -193,7 +194,7 @@ export class DatasController {
@HttpCode(200)
@Acl('relationDataAdd')
async relationDataAdd(
- @Request() req,
+ @Req() req: Request,
@Param('viewId') viewId: string,
@Param('rowId') rowId: string,
@Param('relationType') relationType: string,
diff --git a/packages/nocodb/src/controllers/filters.controller.ts b/packages/nocodb/src/controllers/filters.controller.ts
index ceac2d4ebe..3de7aa9009 100644
--- a/packages/nocodb/src/controllers/filters.controller.ts
+++ b/packages/nocodb/src/controllers/filters.controller.ts
@@ -10,6 +10,7 @@ import {
Req,
UseGuards,
} from '@nestjs/common';
+import { Request } from 'express';
import { FilterReqType } from 'nocodb-sdk';
import { GlobalGuard } from '~/guards/global/global.guard';
import { PagedResponseImpl } from '~/helpers/PagedResponse';
@@ -44,12 +45,13 @@ export class FiltersController {
async filterCreate(
@Param('viewId') viewId: string,
@Body() body: FilterReqType,
- @Req() req,
+ @Req() req: Request,
) {
const filter = await this.filtersService.filterCreate({
filter: body,
viewId: viewId,
user: req.user,
+ req,
});
return filter;
}
@@ -63,12 +65,13 @@ export class FiltersController {
async hookFilterCreate(
@Param('hookId') hookId: string,
@Body() body: FilterReqType,
- @Req() req,
+ @Req() req: Request,
) {
const filter = await this.filtersService.hookFilterCreate({
filter: body,
hookId,
user: req.user,
+ req,
});
return filter;
}
@@ -100,12 +103,13 @@ export class FiltersController {
async filterUpdate(
@Param('filterId') filterId: string,
@Body() body: FilterReqType,
- @Req() req,
+ @Req() req: Request,
) {
const filter = await this.filtersService.filterUpdate({
filterId: filterId,
filter: body,
user: req.user,
+ req,
});
return filter;
}
@@ -115,8 +119,9 @@ export class FiltersController {
'/api/v2/meta/filters/:filterId',
])
@Acl('filterDelete')
- async filterDelete(@Param('filterId') filterId: string, @Req() _req) {
+ async filterDelete(@Param('filterId') filterId: string, @Req() req: Request) {
const filter = await this.filtersService.filterDelete({
+ req,
filterId,
});
return filter;
diff --git a/packages/nocodb/src/controllers/form-columns.controller.ts b/packages/nocodb/src/controllers/form-columns.controller.ts
index 2e2542411a..865ddf765e 100644
--- a/packages/nocodb/src/controllers/form-columns.controller.ts
+++ b/packages/nocodb/src/controllers/form-columns.controller.ts
@@ -1,4 +1,5 @@
-import { Body, Controller, Param, Patch, UseGuards } from '@nestjs/common';
+import { Body, Controller, Param, Patch, Req, UseGuards } from '@nestjs/common';
+import { Request } from 'express';
import { GlobalGuard } from '~/guards/global/global.guard';
import { FormColumnsService } from '~/services/form-columns.service';
import { Acl } from '~/middlewares/extract-ids/extract-ids.middleware';
@@ -19,10 +20,13 @@ export class FormColumnsController {
async columnUpdate(
@Param('formViewColumnId') formViewColumnId: string,
@Body() formViewColumnbody: FormColumnUpdateReqType,
+
+ @Req() req: Request,
) {
return await this.formColumnsService.columnUpdate({
formViewColumnId,
formViewColumn: formViewColumnbody,
+ req,
});
}
}
diff --git a/packages/nocodb/src/controllers/forms.controller.ts b/packages/nocodb/src/controllers/forms.controller.ts
index 23aaa6b2f8..bbf2d65cdd 100644
--- a/packages/nocodb/src/controllers/forms.controller.ts
+++ b/packages/nocodb/src/controllers/forms.controller.ts
@@ -9,6 +9,7 @@ import {
Req,
UseGuards,
} from '@nestjs/common';
+import { Request } from 'express';
import { ViewCreateReqType } from 'nocodb-sdk';
import { GlobalGuard } from '~/guards/global/global.guard';
import { FormsService } from '~/services/forms.service';
@@ -38,12 +39,13 @@ export class FormsController {
async formViewCreate(
@Param('tableId') tableId: string,
@Body() body: ViewCreateReqType,
- @Req() req: any,
+ @Req() req: Request,
) {
const view = await this.formsService.formViewCreate({
body,
tableId,
user: req.user,
+ req,
});
return view;
}
@@ -52,10 +54,15 @@ export class FormsController {
'/api/v2/meta/forms/:formViewId',
])
@Acl('formViewUpdate')
- async formViewUpdate(@Param('formViewId') formViewId: string, @Body() body) {
+ async formViewUpdate(
+ @Param('formViewId') formViewId: string,
+ @Body() body,
+ @Req() req: Request,
+ ) {
return await this.formsService.formViewUpdate({
formViewId,
form: body,
+ req,
});
}
}
diff --git a/packages/nocodb/src/controllers/galleries.controller.ts b/packages/nocodb/src/controllers/galleries.controller.ts
index 4caf0c0a7a..c9440b3cfe 100644
--- a/packages/nocodb/src/controllers/galleries.controller.ts
+++ b/packages/nocodb/src/controllers/galleries.controller.ts
@@ -9,6 +9,7 @@ import {
Req,
UseGuards,
} from '@nestjs/common';
+import { Request } from 'express';
import { GalleryUpdateReqType, ViewCreateReqType } from 'nocodb-sdk';
import { GlobalGuard } from '~/guards/global/global.guard';
import { GalleriesService } from '~/services/galleries.service';
@@ -40,12 +41,13 @@ export class GalleriesController {
async galleryViewCreate(
@Param('tableId') tableId: string,
@Body() body: ViewCreateReqType,
- @Req() req: any,
+ @Req() req: Request,
) {
return await this.galleriesService.galleryViewCreate({
gallery: body,
// todo: sanitize
tableId,
+ req,
user: req.user,
});
}
@@ -58,10 +60,13 @@ export class GalleriesController {
async galleryViewUpdate(
@Param('galleryViewId') galleryViewId: string,
@Body() body: GalleryUpdateReqType,
+
+ @Req() req: Request,
) {
return await this.galleriesService.galleryViewUpdate({
galleryViewId,
gallery: body,
+ req,
});
}
}
diff --git a/packages/nocodb/src/controllers/grid-columns.controller.ts b/packages/nocodb/src/controllers/grid-columns.controller.ts
index c29f6db4c6..fe307a85ff 100644
--- a/packages/nocodb/src/controllers/grid-columns.controller.ts
+++ b/packages/nocodb/src/controllers/grid-columns.controller.ts
@@ -1,4 +1,12 @@
-import { Body, Controller, Get, Param, Patch, UseGuards } from '@nestjs/common';
+import {
+ Body,
+ Controller,
+ Get,
+ Param,
+ Patch,
+ Req,
+ UseGuards,
+} from '@nestjs/common';
import { GridColumnReqType } from 'nocodb-sdk';
import { GlobalGuard } from '~/guards/global/global.guard';
import { GridColumnsService } from '~/services/grid-columns.service';
@@ -28,10 +36,13 @@ export class GridColumnsController {
async gridColumnUpdate(
@Param('gridViewColumnId') gridViewColumnId: string,
@Body() body: GridColumnReqType,
+
+ @Req() req: Request,
) {
return this.gridColumnsService.gridColumnUpdate({
gridViewColumnId,
grid: body,
+ req,
});
}
}
diff --git a/packages/nocodb/src/controllers/grids.controller.ts b/packages/nocodb/src/controllers/grids.controller.ts
index 4b78624498..8c819f7fc1 100644
--- a/packages/nocodb/src/controllers/grids.controller.ts
+++ b/packages/nocodb/src/controllers/grids.controller.ts
@@ -28,20 +28,26 @@ export class GridsController {
async gridViewCreate(
@Param('tableId') tableId: string,
@Body() body: ViewCreateReqType,
- @Req() _req: any,
+ @Req() req: Request,
) {
const view = await this.gridsService.gridViewCreate({
grid: body,
tableId,
+ req,
});
return view;
}
@Patch(['/api/v1/db/meta/grids/:viewId', '/api/v2/meta/grids/:viewId'])
@Acl('gridViewUpdate')
- async gridViewUpdate(@Param('viewId') viewId: string, @Body() body) {
+ async gridViewUpdate(
+ @Param('viewId') viewId: string,
+ @Body() body,
+ @Req() req: Request,
+ ) {
return await this.gridsService.gridViewUpdate({
viewId,
grid: body,
+ req,
});
}
}
diff --git a/packages/nocodb/src/controllers/hooks.controller.ts b/packages/nocodb/src/controllers/hooks.controller.ts
index f724f53f5d..ef3e951d4a 100644
--- a/packages/nocodb/src/controllers/hooks.controller.ts
+++ b/packages/nocodb/src/controllers/hooks.controller.ts
@@ -7,9 +7,10 @@ import {
Param,
Patch,
Post,
- Request,
+ Req,
UseGuards,
} from '@nestjs/common';
+import { Request } from 'express';
import { HookReqType, HookTestReqType } from 'nocodb-sdk';
import type { HookType } from 'nocodb-sdk';
import { GlobalGuard } from '~/guards/global/global.guard';
@@ -41,24 +42,30 @@ export class HooksController {
async hookCreate(
@Param('tableId') tableId: string,
@Body() body: HookReqType,
+ @Req() req: Request,
) {
const hook = await this.hooksService.hookCreate({
hook: body,
tableId,
+ req,
});
return hook;
}
@Delete(['/api/v1/db/meta/hooks/:hookId', '/api/v2/meta/hooks/:hookId'])
@Acl('hookDelete')
- async hookDelete(@Param('hookId') hookId: string) {
- return await this.hooksService.hookDelete({ hookId });
+ async hookDelete(@Param('hookId') hookId: string, @Req() req: Request) {
+ return await this.hooksService.hookDelete({ hookId, req });
}
@Patch(['/api/v1/db/meta/hooks/:hookId', '/api/v2/meta/hooks/:hookId'])
@Acl('hookUpdate')
- async hookUpdate(@Param('hookId') hookId: string, @Body() body: HookReqType) {
- return await this.hooksService.hookUpdate({ hookId, hook: body });
+ async hookUpdate(
+ @Param('hookId') hookId: string,
+ @Body() body: HookReqType,
+ @Req() req: Request,
+ ) {
+ return await this.hooksService.hookUpdate({ hookId, hook: body, req });
}
@Post([
@@ -67,7 +74,7 @@ export class HooksController {
])
@HttpCode(200)
@Acl('hookTest')
- async hookTest(@Body() body: HookTestReqType, @Request() req: any) {
+ async hookTest(@Body() body: HookTestReqType, @Req() req: Request) {
try {
await this.hooksService.hookTest({
hookTest: {
@@ -78,6 +85,7 @@ export class HooksController {
},
},
tableId: req.params.tableId,
+ req,
});
return { msg: 'The hook has been tested successfully' };
} catch (e) {
@@ -108,7 +116,7 @@ export class HooksController {
'/api/v2/meta/hooks/:hookId/logs',
])
@Acl('hookLogList')
- async hookLogList(@Param('hookId') hookId: string, @Request() req: any) {
+ async hookLogList(@Param('hookId') hookId: string, @Req() req: Request) {
return new PagedResponseImpl(
await this.hooksService.hookLogList({
query: req.query,
diff --git a/packages/nocodb/src/controllers/kanbans.controller.ts b/packages/nocodb/src/controllers/kanbans.controller.ts
index b1fd2957c1..656bf59905 100644
--- a/packages/nocodb/src/controllers/kanbans.controller.ts
+++ b/packages/nocodb/src/controllers/kanbans.controller.ts
@@ -9,6 +9,7 @@ import {
Req,
UseGuards,
} from '@nestjs/common';
+import { Request } from 'express';
import { ViewCreateReqType } from 'nocodb-sdk';
import { GlobalGuard } from '~/guards/global/global.guard';
import { KanbansService } from '~/services/kanbans.service';
@@ -40,12 +41,13 @@ export class KanbansController {
async kanbanViewCreate(
@Param('tableId') tableId: string,
@Body() body: ViewCreateReqType,
- @Req() req: any,
+ @Req() req: Request,
) {
return await this.kanbansService.kanbanViewCreate({
tableId,
kanban: body,
user: req.user,
+ req,
});
}
@@ -57,10 +59,13 @@ export class KanbansController {
async kanbanViewUpdate(
@Param('kanbanViewId') kanbanViewId: string,
@Body() body,
+
+ @Req() req: Request,
) {
return await this.kanbansService.kanbanViewUpdate({
kanbanViewId,
kanban: body,
+ req,
});
}
}
diff --git a/packages/nocodb/src/controllers/maps.controller.ts b/packages/nocodb/src/controllers/maps.controller.ts
index b73522bc15..7131125e89 100644
--- a/packages/nocodb/src/controllers/maps.controller.ts
+++ b/packages/nocodb/src/controllers/maps.controller.ts
@@ -9,6 +9,7 @@ import {
Req,
UseGuards,
} from '@nestjs/common';
+import { Request } from 'express';
import { MapUpdateReqType, ViewCreateReqType } from 'nocodb-sdk';
import { GlobalGuard } from '~/guards/global/global.guard';
import { MapsService } from '~/services/maps.service';
@@ -35,12 +36,13 @@ export class MapsController {
async mapViewCreate(
@Param('tableId') tableId: string,
@Body() body: ViewCreateReqType,
- @Req() req: any,
+ @Req() req: Request,
) {
const view = await this.mapsService.mapViewCreate({
tableId,
map: body,
user: req.user,
+ req,
});
return view;
}
@@ -50,10 +52,13 @@ export class MapsController {
async mapViewUpdate(
@Param('mapViewId') mapViewId: string,
@Body() body: MapUpdateReqType,
+
+ @Req() req: Request,
) {
return await this.mapsService.mapViewUpdate({
mapViewId: mapViewId,
map: body,
+ req,
});
}
}
diff --git a/packages/nocodb/src/controllers/model-visibilities.controller.ts b/packages/nocodb/src/controllers/model-visibilities.controller.ts
index 67c44eb6ef..4e84697409 100644
--- a/packages/nocodb/src/controllers/model-visibilities.controller.ts
+++ b/packages/nocodb/src/controllers/model-visibilities.controller.ts
@@ -6,6 +6,7 @@ import {
Param,
Post,
Query,
+ Req,
UseGuards,
} from '@nestjs/common';
import { GlobalGuard } from '~/guards/global/global.guard';
@@ -29,10 +30,12 @@ export class ModelVisibilitiesController {
async xcVisibilityMetaSetAll(
@Param('baseId') baseId: string,
@Body() body: any,
+ @Req() req: Request,
) {
await this.modelVisibilitiesService.xcVisibilityMetaSetAll({
visibilityRule: body,
baseId,
+ req,
});
return { msg: 'UI ACL has been created successfully' };
diff --git a/packages/nocodb/src/controllers/notifications.controller.ts b/packages/nocodb/src/controllers/notifications.controller.ts
index ae2adf0c37..73247a217f 100644
--- a/packages/nocodb/src/controllers/notifications.controller.ts
+++ b/packages/nocodb/src/controllers/notifications.controller.ts
@@ -7,9 +7,10 @@ import {
Param,
Patch,
Post,
- Request,
+ Req,
UseGuards,
} from '@nestjs/common';
+import { Request } from 'express';
import { NotificationsService } from '~/services/notifications.service';
import { GlobalGuard } from '~/guards/global/global.guard';
import { extractProps } from '~/helpers/extractProps';
@@ -22,7 +23,7 @@ export class NotificationsController {
@Get('/api/v1/notifications')
// @Acl('notificationList')
- async notificationList(@Request() req) {
+ async notificationList(@Req() req: Request) {
return this.notificationsService.notificationList({
user: req.user,
is_deleted: false,
@@ -36,7 +37,7 @@ export class NotificationsController {
async notificationUpdate(
@Param('notificationId') notificationId,
@Body() body,
- @Request() req,
+ @Req() req: Request,
) {
return this.notificationsService.notificationUpdate({
notificationId,
@@ -47,7 +48,7 @@ export class NotificationsController {
@Post('/api/v1/notifications/mark-all-read')
@HttpCode(200)
- async markAllRead(@Request() req) {
+ async markAllRead(@Req() req: Request) {
return this.notificationsService.markAllRead({
user: req.user,
});
@@ -57,7 +58,7 @@ export class NotificationsController {
// @Acl('notificationDelete')
async notificationDelete(
@Param('notificationId') notificationId,
- @Request() req,
+ @Req() req: Request,
) {
return this.notificationsService.notificationUpdate({
notificationId,
diff --git a/packages/nocodb/src/controllers/org-tokens.controller.ts b/packages/nocodb/src/controllers/org-tokens.controller.ts
index e226af7805..49540aef0c 100644
--- a/packages/nocodb/src/controllers/org-tokens.controller.ts
+++ b/packages/nocodb/src/controllers/org-tokens.controller.ts
@@ -6,9 +6,10 @@ import {
HttpCode,
Param,
Post,
- Request,
+ Req,
UseGuards,
} from '@nestjs/common';
+import { Request } from 'express';
import { ApiTokenReqType } from 'nocodb-sdk';
import { AuthGuard } from '@nestjs/passport';
import { getConditionalHandler } from '~/helpers/getHandler';
@@ -30,7 +31,7 @@ export class OrgTokensController {
scope: 'org',
blockApiTokenAccess: true,
})
- async apiTokenList(@Request() req) {
+ async apiTokenList(@Req() req: Request) {
return await getConditionalHandler(
this.orgTokensService.apiTokenList,
this.orgTokensEeService.apiTokenListEE,
@@ -46,10 +47,11 @@ export class OrgTokensController {
scope: 'org',
blockApiTokenAccess: true,
})
- async apiTokenCreate(@Request() req, @Body() body: ApiTokenReqType) {
+ async apiTokenCreate(@Req() req: Request, @Body() body: ApiTokenReqType) {
return await this.orgTokensService.apiTokenCreate({
apiToken: body,
user: req['user'],
+ req,
});
}
@@ -59,10 +61,11 @@ export class OrgTokensController {
// allowedRoles: [OrgUserRoles.SUPER],
blockApiTokenAccess: true,
})
- async apiTokenDelete(@Request() req, @Param('token') token: string) {
+ async apiTokenDelete(@Req() req: Request, @Param('token') token: string) {
await this.orgTokensService.apiTokenDelete({
token,
user: req['user'],
+ req,
});
}
}
diff --git a/packages/nocodb/src/controllers/org-users.controller.ts b/packages/nocodb/src/controllers/org-users.controller.ts
index 58f5e70dcc..f7410f4039 100644
--- a/packages/nocodb/src/controllers/org-users.controller.ts
+++ b/packages/nocodb/src/controllers/org-users.controller.ts
@@ -7,9 +7,10 @@ import {
Param,
Patch,
Post,
- Request,
+ Req,
UseGuards,
} from '@nestjs/common';
+import { Request } from 'express';
import { OrgUserRoles } from 'nocodb-sdk';
import { GlobalGuard } from '~/guards/global/global.guard';
import { PagedResponseImpl } from '~/helpers/PagedResponse';
@@ -29,7 +30,7 @@ export class OrgUsersController {
allowedRoles: [OrgUserRoles.SUPER_ADMIN],
blockApiTokenAccess: true,
})
- async userList(@Request() req) {
+ async userList(@Req() req: Request) {
return new PagedResponseImpl(
await this.orgUsersService.userList({
query: req.query,
@@ -75,7 +76,7 @@ export class OrgUsersController {
allowedRoles: [OrgUserRoles.SUPER_ADMIN],
blockApiTokenAccess: true,
})
- async userAdd(@Body() body, @Request() req) {
+ async userAdd(@Body() body, @Req() req: Request) {
const result = await this.orgUsersService.userAdd({
user: req.body,
req,
@@ -104,7 +105,7 @@ export class OrgUsersController {
blockApiTokenAccess: true,
})
async userInviteResend(
- @Request() req,
+ @Req() req: Request,
@Param('userId') userId: string,
): Promise {
await this.orgUsersService.userInviteResend({
@@ -122,7 +123,7 @@ export class OrgUsersController {
allowedRoles: [OrgUserRoles.SUPER_ADMIN],
blockApiTokenAccess: true,
})
- async generateResetUrl(@Request() req, @Param('userId') userId: string) {
+ async generateResetUrl(@Req() req: Request, @Param('userId') userId: string) {
const result = await this.orgUsersService.generateResetUrl({
siteUrl: req.ncSiteUrl,
userId,
diff --git a/packages/nocodb/src/controllers/plugins.controller.ts b/packages/nocodb/src/controllers/plugins.controller.ts
index 3a8e4c4bc7..aa7f7ba620 100644
--- a/packages/nocodb/src/controllers/plugins.controller.ts
+++ b/packages/nocodb/src/controllers/plugins.controller.ts
@@ -6,6 +6,7 @@ import {
Param,
Patch,
Post,
+ Req,
UseGuards,
} from '@nestjs/common';
import { GlobalGuard } from '~/guards/global/global.guard';
@@ -47,8 +48,8 @@ export class PluginsController {
@Acl('pluginTest', {
scope: 'org',
})
- async pluginTest(@Body() body: any) {
- return await this.pluginsService.pluginTest({ body: body });
+ async pluginTest(@Body() body: any, @Req() req: Request) {
+ return await this.pluginsService.pluginTest({ body: body, req });
}
@Get(['/api/v1/db/meta/plugins/:pluginId', '/api/v2/meta/plugins/:pluginId'])
@@ -66,10 +67,15 @@ export class PluginsController {
@Acl('pluginUpdate', {
scope: 'org',
})
- async pluginUpdate(@Body() body: any, @Param('pluginId') pluginId: string) {
+ async pluginUpdate(
+ @Body() body: any,
+ @Param('pluginId') pluginId: string,
+ @Req() req: Request,
+ ) {
const plugin = await this.pluginsService.pluginUpdate({
pluginId: pluginId,
plugin: body,
+ req,
});
return plugin;
}
diff --git a/packages/nocodb/src/controllers/public-datas.controller.ts b/packages/nocodb/src/controllers/public-datas.controller.ts
index b17abc7e74..187e8ecbdd 100644
--- a/packages/nocodb/src/controllers/public-datas.controller.ts
+++ b/packages/nocodb/src/controllers/public-datas.controller.ts
@@ -4,10 +4,11 @@ import {
HttpCode,
Param,
Post,
- Request,
+ Req,
UseGuards,
UseInterceptors,
} from '@nestjs/common';
+import { Request } from 'express';
import { AnyFilesInterceptor } from '@nestjs/platform-express';
import { PublicDatasService } from '~/services/public-datas.service';
import { PublicApiLimiterGuard } from '~/guards/public-api-limiter.guard';
@@ -22,7 +23,7 @@ export class PublicDatasController {
'/api/v2/public/shared-view/:sharedViewUuid/rows',
])
async dataList(
- @Request() req,
+ @Req() req: Request,
@Param('sharedViewUuid') sharedViewUuid: string,
) {
const pagedResponse = await this.publicDatasService.dataList({
@@ -38,7 +39,7 @@ export class PublicDatasController {
'/api/v2/public/shared-view/:sharedViewUuid/groupby',
])
async dataGroupBy(
- @Request() req,
+ @Req() req: Request,
@Param('sharedViewUuid') sharedViewUuid: string,
) {
return await this.publicDatasService.dataGroupBy({
@@ -53,7 +54,7 @@ export class PublicDatasController {
'/api/v2/public/shared-view/:sharedViewUuid/group/:columnId',
])
async groupedDataList(
- @Request() req,
+ @Req() req: Request,
@Param('sharedViewUuid') sharedViewUuid: string,
@Param('columnId') columnId: string,
) {
@@ -73,7 +74,7 @@ export class PublicDatasController {
@HttpCode(200)
@UseInterceptors(AnyFilesInterceptor())
async dataInsert(
- @Request() req,
+ @Req() req: Request,
@Param('sharedViewUuid') sharedViewUuid: string,
) {
const insertResult = await this.publicDatasService.dataInsert({
@@ -81,7 +82,7 @@ export class PublicDatasController {
password: req.headers?.['xc-password'] as string,
body: req.body?.data,
siteUrl: (req as any).ncSiteUrl,
- files: req.files,
+ files: req.files as any[],
});
return insertResult;
@@ -92,7 +93,7 @@ export class PublicDatasController {
'/api/v2/public/shared-view/:sharedViewUuid/nested/:columnId',
])
async relDataList(
- @Request() req,
+ @Req() req: Request,
@Param('sharedViewUuid') sharedViewUuid: string,
@Param('columnId') columnId: string,
) {
@@ -111,7 +112,7 @@ export class PublicDatasController {
'/api/v2/public/shared-view/:sharedViewUuid/rows/:rowId/mm/:columnId',
])
async publicMmList(
- @Request() req,
+ @Req() req: Request,
@Param('sharedViewUuid') sharedViewUuid: string,
@Param('rowId') rowId: string,
@Param('columnId') columnId: string,
@@ -131,7 +132,7 @@ export class PublicDatasController {
'/api/v2/public/shared-view/:sharedViewUuid/rows/:rowId/hm/:columnId',
])
async publicHmList(
- @Request() req,
+ @Req() req: Request,
@Param('sharedViewUuid') sharedViewUuid: string,
@Param('rowId') rowId: string,
@Param('columnId') columnId: string,
diff --git a/packages/nocodb/src/controllers/public-metas.controller.ts b/packages/nocodb/src/controllers/public-metas.controller.ts
index 1aab81d353..f9bf2b67e5 100644
--- a/packages/nocodb/src/controllers/public-metas.controller.ts
+++ b/packages/nocodb/src/controllers/public-metas.controller.ts
@@ -1,4 +1,5 @@
-import { Controller, Get, Param, Request, UseGuards } from '@nestjs/common';
+import { Controller, Get, Param, Req, UseGuards } from '@nestjs/common';
+import { Request } from 'express';
import { PublicMetasService } from '~/services/public-metas.service';
import { PublicApiLimiterGuard } from '~/guards/public-api-limiter.guard';
@@ -12,7 +13,7 @@ export class PublicMetasController {
'/api/v2/public/shared-view/:sharedViewUuid/meta',
])
async viewMetaGet(
- @Request() req,
+ @Req() req: Request,
@Param('sharedViewUuid') sharedViewUuid: string,
) {
return await this.publicMetasService.viewMetaGet({
diff --git a/packages/nocodb/src/controllers/shared-bases.controller.ts b/packages/nocodb/src/controllers/shared-bases.controller.ts
index 8974b7a4bf..0466974170 100644
--- a/packages/nocodb/src/controllers/shared-bases.controller.ts
+++ b/packages/nocodb/src/controllers/shared-bases.controller.ts
@@ -7,9 +7,10 @@ import {
Param,
Patch,
Post,
- Request,
+ Req,
UseGuards,
} from '@nestjs/common';
+import { Request } from 'express';
import { GlobalGuard } from '~/guards/global/global.guard';
import { SharedBasesService } from '~/services/shared-bases.service';
import { Acl } from '~/middlewares/extract-ids/extract-ids.middleware';
@@ -27,7 +28,7 @@ export class SharedBasesController {
@HttpCode(200)
@Acl('createSharedBaseLink')
async createSharedBaseLink(
- @Request() req,
+ @Req() req: Request,
@Body() body: any,
@Param('baseId') baseId: string,
): Promise {
@@ -36,6 +37,7 @@ export class SharedBasesController {
roles: body?.roles,
password: body?.password,
siteUrl: req.ncSiteUrl,
+ req,
});
return sharedBase;
@@ -47,7 +49,7 @@ export class SharedBasesController {
])
@Acl('updateSharedBaseLink')
async updateSharedBaseLink(
- @Request() req,
+ @Req() req: Request,
@Body() body: any,
@Param('baseId') baseId: string,
): Promise {
@@ -56,6 +58,7 @@ export class SharedBasesController {
roles: body?.roles,
password: body?.password,
siteUrl: req.ncSiteUrl,
+ req,
});
return sharedBase;
@@ -66,9 +69,13 @@ export class SharedBasesController {
'/api/v2/meta/bases/:baseId/shared',
])
@Acl('disableSharedBaseLink')
- async disableSharedBaseLink(@Param('baseId') baseId: string): Promise {
+ async disableSharedBaseLink(
+ @Param('baseId') baseId: string,
+ @Req() req: Request,
+ ): Promise {
const sharedBase = await this.sharedBasesService.disableSharedBaseLink({
baseId,
+ req,
});
return sharedBase;
@@ -80,7 +87,7 @@ export class SharedBasesController {
])
@Acl('getSharedBaseLink')
async getSharedBaseLink(
- @Request() req,
+ @Req() req: Request,
@Param('baseId') baseId: string,
): Promise {
const sharedBase = await this.sharedBasesService.getSharedBaseLink({
diff --git a/packages/nocodb/src/controllers/sorts.controller.ts b/packages/nocodb/src/controllers/sorts.controller.ts
index 3935b11589..6311b7416c 100644
--- a/packages/nocodb/src/controllers/sorts.controller.ts
+++ b/packages/nocodb/src/controllers/sorts.controller.ts
@@ -44,11 +44,12 @@ export class SortsController {
async sortCreate(
@Param('viewId') viewId: string,
@Body() body: SortReqType,
- @Req() _req,
+ @Req() req: Request,
) {
const sort = await this.sortsService.sortCreate({
sort: body,
viewId,
+ req,
});
return sort;
}
@@ -67,20 +68,22 @@ export class SortsController {
async sortUpdate(
@Param('sortId') sortId: string,
@Body() body: SortReqType,
- @Req() _req,
+ @Req() req: Request,
) {
const sort = await this.sortsService.sortUpdate({
sortId,
sort: body,
+ req,
});
return sort;
}
@Delete(['/api/v1/db/meta/sorts/:sortId', '/api/v2/meta/sorts/:sortId'])
@Acl('sortDelete')
- async sortDelete(@Param('sortId') sortId: string, @Req() _req) {
+ async sortDelete(@Param('sortId') sortId: string, @Req() req: Request) {
const sort = await this.sortsService.sortDelete({
sortId,
+ req,
});
return sort;
}
diff --git a/packages/nocodb/src/controllers/sources.controller.ts b/packages/nocodb/src/controllers/sources.controller.ts
index 46480ba4f0..6413e7be3b 100644
--- a/packages/nocodb/src/controllers/sources.controller.ts
+++ b/packages/nocodb/src/controllers/sources.controller.ts
@@ -1,4 +1,13 @@
-import { Body, Controller, Get, Param, Patch, UseGuards } from '@nestjs/common';
+import {
+ Body,
+ Controller,
+ Get,
+ Param,
+ Patch,
+ Req,
+ UseGuards,
+} from '@nestjs/common';
+import { Request } from 'express';
import { BaseReqType } from 'nocodb-sdk';
import { GlobalGuard } from '~/guards/global/global.guard';
import { PagedResponseImpl } from '~/helpers/PagedResponse';
@@ -37,11 +46,13 @@ export class SourcesController {
@Param('sourceId') sourceId: string,
@Param('baseId') baseId: string,
@Body() body: BaseReqType,
+ @Req() req: Request,
) {
const source = await this.sourcesService.baseUpdate({
sourceId,
source: body,
baseId,
+ req,
});
return source;
diff --git a/packages/nocodb/src/controllers/sync.controller.ts b/packages/nocodb/src/controllers/sync.controller.ts
index 2587a26510..6885e09dd4 100644
--- a/packages/nocodb/src/controllers/sync.controller.ts
+++ b/packages/nocodb/src/controllers/sync.controller.ts
@@ -48,7 +48,7 @@ export class SyncController {
async syncCreate(
@Param('baseId') baseId: string,
@Body() body: any,
- @Req() req,
+ @Req() req: Request,
@Param('sourceId') sourceId?: string,
) {
return await this.syncService.syncCreate({
@@ -56,23 +56,30 @@ export class SyncController {
sourceId: sourceId,
userId: (req as any).user.id,
syncPayload: body,
+ req,
});
}
@Delete(['/api/v1/db/meta/syncs/:syncId', '/api/v2/meta/syncs/:syncId'])
@Acl('syncSourceDelete')
- async syncDelete(@Param('syncId') syncId: string) {
+ async syncDelete(@Param('syncId') syncId: string, @Req() req: Request) {
return await this.syncService.syncDelete({
syncId: syncId,
+ req,
});
}
@Patch(['/api/v1/db/meta/syncs/:syncId', '/api/v2/meta/syncs/:syncId'])
@Acl('syncSourceUpdate')
- async syncUpdate(@Param('syncId') syncId: string, @Body() body: any) {
+ async syncUpdate(
+ @Param('syncId') syncId: string,
+ @Body() body: any,
+ @Req() req: Request,
+ ) {
return await this.syncService.syncUpdate({
syncId: syncId,
syncPayload: body,
+ req,
});
}
}
diff --git a/packages/nocodb/src/controllers/tables.controller.ts b/packages/nocodb/src/controllers/tables.controller.ts
index 311da32a69..e77b741aa9 100644
--- a/packages/nocodb/src/controllers/tables.controller.ts
+++ b/packages/nocodb/src/controllers/tables.controller.ts
@@ -93,6 +93,7 @@ export class TablesController {
table: body,
baseId: req.ncProjectId,
user: req.ncProjectId,
+ req,
});
return { msg: 'The table has been updated successfully' };
}
diff --git a/packages/nocodb/src/controllers/utils.controller.ts b/packages/nocodb/src/controllers/utils.controller.ts
index 5530f9bd9e..8725b0af18 100644
--- a/packages/nocodb/src/controllers/utils.controller.ts
+++ b/packages/nocodb/src/controllers/utils.controller.ts
@@ -6,9 +6,10 @@ import {
Get,
HttpCode,
Post,
- Request,
+ Req,
UseGuards,
} from '@nestjs/common';
+import { Request } from 'express';
import { GlobalGuard } from '~/guards/global/global.guard';
import { UtilsService } from '~/services/utils.service';
import { Acl } from '~/middlewares/extract-ids/extract-ids.middleware';
@@ -48,7 +49,7 @@ export class UtilsController {
scope: 'org',
})
@HttpCode(200)
- async testConnection(@Body() body: any, @Request() _req: any) {
+ async testConnection(@Body() body: any, @Req() _req: Request) {
body.pool = {
min: 0,
max: 1,
@@ -63,7 +64,7 @@ export class UtilsController {
'/api/v2/meta/nocodb/info',
'/api/v1/meta/nocodb/info',
])
- async appInfo(@Request() req) {
+ async appInfo(@Req() req: Request) {
return await this.utilsService.appInfo({
req: {
ncSiteUrl: (req as any).ncSiteUrl,
diff --git a/packages/nocodb/src/controllers/view-columns.controller.ts b/packages/nocodb/src/controllers/view-columns.controller.ts
index 4366699cd8..95b1de089c 100644
--- a/packages/nocodb/src/controllers/view-columns.controller.ts
+++ b/packages/nocodb/src/controllers/view-columns.controller.ts
@@ -6,6 +6,7 @@ import {
Param,
Patch,
Post,
+ Req,
UseGuards,
} from '@nestjs/common';
import { ViewColumnReqType } from 'nocodb-sdk';
@@ -42,10 +43,12 @@ export class ViewColumnsController {
async columnAdd(
@Param('viewId') viewId: string,
@Body() body: ViewColumnReqType,
+ @Req() req: Request,
) {
const viewColumn = await this.viewColumnsService.columnAdd({
viewId,
column: body,
+ req,
});
return viewColumn;
}
@@ -59,11 +62,13 @@ export class ViewColumnsController {
@Param('viewId') viewId: string,
@Param('columnId') columnId: string,
@Body() body: ViewColumnReqType,
+ @Req() req: Request,
) {
const result = await this.viewColumnsService.columnUpdate({
viewId,
columnId,
column: body,
+ req,
});
return result;
}
diff --git a/packages/nocodb/src/controllers/views.controller.ts b/packages/nocodb/src/controllers/views.controller.ts
index cb9e1865d1..d7d4d7a112 100644
--- a/packages/nocodb/src/controllers/views.controller.ts
+++ b/packages/nocodb/src/controllers/views.controller.ts
@@ -8,9 +8,10 @@ import {
Patch,
Post,
Query,
- Request,
+ Req,
UseGuards,
} from '@nestjs/common';
+import { Request } from 'express';
import { ViewUpdateReqType } from 'nocodb-sdk';
import { PagedResponseImpl } from '~/helpers/PagedResponse';
import { GlobalGuard } from '~/guards/global/global.guard';
@@ -28,7 +29,7 @@ export class ViewsController {
'/api/v2/meta/tables/:tableId/views',
])
@Acl('viewList')
- async viewList(@Param('tableId') tableId: string, @Request() req) {
+ async viewList(@Param('tableId') tableId: string, @Req() req: Request) {
return new PagedResponseImpl(
await this.viewsService.viewList({
tableId,
@@ -42,22 +43,24 @@ export class ViewsController {
async viewUpdate(
@Param('viewId') viewId: string,
@Body() body: ViewUpdateReqType,
- @Request() req,
+ @Req() req: Request,
) {
const result = await this.viewsService.viewUpdate({
viewId,
view: body,
user: req.user,
+ req,
});
return result;
}
@Delete(['/api/v1/db/meta/views/:viewId', '/api/v2/meta/views/:viewId'])
@Acl('viewDelete')
- async viewDelete(@Param('viewId') viewId: string, @Request() req) {
+ async viewDelete(@Param('viewId') viewId: string, @Req() req: Request) {
const result = await this.viewsService.viewDelete({
viewId,
user: req.user,
+ req,
});
return result;
}
@@ -99,8 +102,8 @@ export class ViewsController {
])
@HttpCode(200)
@Acl('shareView')
- async shareView(@Param('viewId') viewId: string, @Request() req) {
- return await this.viewsService.shareView({ viewId, user: req.user });
+ async shareView(@Param('viewId') viewId: string, @Req() req: Request) {
+ return await this.viewsService.shareView({ viewId, user: req.user, req });
}
@Get([
@@ -124,12 +127,13 @@ export class ViewsController {
async shareViewUpdate(
@Param('viewId') viewId: string,
@Body() body: ViewUpdateReqType,
- @Request() req,
+ @Req() req: Request,
) {
return await this.viewsService.shareViewUpdate({
viewId,
sharedView: body,
user: req.user,
+ req,
});
}
@@ -138,7 +142,11 @@ export class ViewsController {
'/api/v2/meta/views/:viewId/share',
])
@Acl('shareViewDelete')
- async shareViewDelete(@Param('viewId') viewId: string, @Request() req) {
- return await this.viewsService.shareViewDelete({ viewId, user: req.user });
+ async shareViewDelete(@Param('viewId') viewId: string, @Req() req: Request) {
+ return await this.viewsService.shareViewDelete({
+ viewId,
+ user: req.user,
+ req,
+ });
}
}
diff --git a/packages/nocodb/src/db/BaseModelSqlv2.ts b/packages/nocodb/src/db/BaseModelSqlv2.ts
index 9c10f14941..27f59ded05 100644
--- a/packages/nocodb/src/db/BaseModelSqlv2.ts
+++ b/packages/nocodb/src/db/BaseModelSqlv2.ts
@@ -1,5 +1,4 @@
import autoBind from 'auto-bind';
-
import groupBy from 'lodash/groupBy';
import DataLoader from 'dataloader';
import dayjs from 'dayjs';
@@ -20,8 +19,8 @@ import Validator from 'validator';
import { customAlphabet } from 'nanoid';
import DOMPurify from 'isomorphic-dompurify';
import { v4 as uuidv4 } from 'uuid';
-import type LookupColumn from '~/models/LookupColumn';
import type { Knex } from 'knex';
+import type LookupColumn from '~/models/LookupColumn';
import type { XKnex } from '~/db/CustomKnex';
import type {
XcFilter,
@@ -167,7 +166,7 @@ class BaseModelSqlv2 {
let data;
try {
- data = (await this.execAndParse(qb))?.[0];
+ data = await this.execAndParse(qb, null, { first: true });
} catch (e) {
if (validateFormula || !haveFormulaColumn(await this.model.getColumns()))
throw e;
@@ -196,7 +195,7 @@ class BaseModelSqlv2 {
return false;
}
qb.where(_wherePk(pks, id)).first();
- return !!(await qb);
+ return !!(await this.execAndParse(qb, null, { raw: true, first: true }));
}
// todo: add support for sortArrJson
@@ -242,7 +241,7 @@ class BaseModelSqlv2 {
let data;
try {
- data = await qb.first();
+ data = await this.execAndParse(qb, null, { first: true });
} catch (e) {
if (validateFormula || !haveFormulaColumn(await this.model.getColumns()))
throw e;
@@ -267,10 +266,20 @@ class BaseModelSqlv2 {
sort?: string | string[];
fieldsSet?: Set;
} = {},
- ignoreViewFilterAndSort = false,
- validateFormula = false,
- throwErrorIfInvalidParams = false,
+ options: {
+ ignoreViewFilterAndSort?: boolean;
+ ignorePagination?: boolean;
+ validateFormula?: boolean;
+ throwErrorIfInvalidParams?: boolean;
+ } = {},
): Promise {
+ const {
+ ignoreViewFilterAndSort = false,
+ ignorePagination = false,
+ validateFormula = false,
+ throwErrorIfInvalidParams = false,
+ } = options;
+
const { where, fields, ...rest } = this._getListArgs(args as any);
const qb = this.dbDriver(this.tnPath);
@@ -361,7 +370,7 @@ class BaseModelSqlv2 {
qb.orderBy('created_at');
}
- if (!ignoreViewFilterAndSort) applyPaginate(qb, rest);
+ if (!ignorePagination) applyPaginate(qb, rest);
const proto = await this.getProto();
let data;
@@ -372,7 +381,11 @@ class BaseModelSqlv2 {
if (validateFormula || !haveFormulaColumn(await this.model.getColumns()))
throw e;
console.log(e);
- return this.list(args, ignoreViewFilterAndSort, true);
+ return this.list(args, {
+ ignoreViewFilterAndSort,
+ ignorePagination,
+ validateFormula: true,
+ });
}
return data?.map((d) => {
d.__proto__ = proto;
@@ -454,10 +467,8 @@ class BaseModelSqlv2 {
sql = unsanitize(qb.toQuery());
}
- const res = (await this.dbDriver.raw(sql)) as any;
-
- return (this.isPg || this.isSnowflake ? res.rows[0] : res[0][0] ?? res[0])
- .count;
+ return (await this.execAndParse(sql, null, { raw: true, first: true }))
+ ?.count;
}
async groupByAndAggregate(
@@ -518,7 +529,7 @@ class BaseModelSqlv2 {
qb.orderBy(args.sortBy.column_name, args.sortBy.direction);
}
applyPaginate(qb, rest);
- return await qb;
+ return await this.execAndParse(qb);
}
async groupBy(args: {
@@ -659,14 +670,17 @@ class BaseModelSqlv2 {
qb,
);
- if (!sorts)
- sorts = args.sortArr?.length
- ? args.sortArr
- : await Sort.list({ viewId: this.viewId });
+ if (!sorts) {
+ if (args.sortArr?.length) {
+ sorts = args.sortArr;
+ } else if (this.viewId) {
+ sorts = await Sort.list({ viewId: this.viewId });
+ }
+ }
// if sort is provided filter out the group by columns sort and apply
// since we are grouping by the column and applying sort on any other column is not required
- for (const sort of sorts) {
+ for (const sort of sorts || []) {
if (!groupByColumns[sort.fk_column_id]) {
continue;
}
@@ -682,7 +696,7 @@ class BaseModelSqlv2 {
qb.groupBy(...groupBySelectors);
applyPaginate(qb, rest);
- return await qb;
+ return await this.execAndParse(qb);
}
async groupByCount(args: {
@@ -821,7 +835,8 @@ class BaseModelSqlv2 {
.count('*', { as: 'count' })
.from(qb.as('groupby'));
- return (await qbP.first())?.count;
+ return (await this.execAndParse(qbP, null, { raw: true, first: true }))
+ ?.count;
}
async multipleHmList(
@@ -949,22 +964,26 @@ class BaseModelSqlv2 {
const childTn = this.getTnPath(childTable);
const parentTn = this.getTnPath(parentTable);
- const children = await this.dbDriver.unionAll(
- ids.map((p) => {
- const query = this.dbDriver(childTn)
- .count(`${chilCol?.column_name} as count`)
- .whereIn(
- chilCol.column_name,
- this.dbDriver(parentTn)
- .select(parentCol.column_name)
- // .where(parentTable.primaryKey.cn, p)
- .where(_wherePk(parentTable.primaryKeys, p)),
- )
- .first();
+ const children = await this.execAndParse(
+ this.dbDriver.unionAll(
+ ids.map((p) => {
+ const query = this.dbDriver(childTn)
+ .count(`${chilCol?.column_name} as count`)
+ .whereIn(
+ chilCol.column_name,
+ this.dbDriver(parentTn)
+ .select(parentCol.column_name)
+ // .where(parentTable.primaryKey.cn, p)
+ .where(_wherePk(parentTable.primaryKeys, p)),
+ )
+ .first();
- return this.isSqlite ? this.dbDriver.select().from(query) : query;
- }),
- !this.isSqlite,
+ return this.isSqlite ? this.dbDriver.select().from(query) : query;
+ }),
+ !this.isSqlite,
+ ),
+ null,
+ { raw: true },
);
return children.map(({ count }) => count);
@@ -1071,7 +1090,8 @@ class BaseModelSqlv2 {
await conditionV2(this, filterObj, query);
- return (await query.first())?.count;
+ return (await this.execAndParse(query, null, { raw: true, first: true }))
+ ?.count;
} catch (e) {
console.log(e);
throw e;
@@ -1251,22 +1271,26 @@ class BaseModelSqlv2 {
.count(`${vtn}.${vcn}`, { as: 'count' });
// await childModel.selectObject({ qb });
- const children = await this.dbDriver.unionAll(
- parentIds.map((id) => {
- const query = qb
- .clone()
- .whereIn(
- `${vtn}.${vcn}`,
- this.dbDriver(parentTn)
- .select(cn)
- // .where(parentTable.primaryKey.cn, id)
- .where(_wherePk(parentTable.primaryKeys, id)),
- )
- .select(this.dbDriver.raw('? as ??', [id, GROUP_COL]));
- // this._paginateAndSort(query, { sort, limit, offset }, null, true);
- return this.isSqlite ? this.dbDriver.select().from(query) : query;
- }),
- !this.isSqlite,
+ const children = await this.execAndParse(
+ this.dbDriver.unionAll(
+ parentIds.map((id) => {
+ const query = qb
+ .clone()
+ .whereIn(
+ `${vtn}.${vcn}`,
+ this.dbDriver(parentTn)
+ .select(cn)
+ // .where(parentTable.primaryKey.cn, id)
+ .where(_wherePk(parentTable.primaryKeys, id)),
+ )
+ .select(this.dbDriver.raw('? as ??', [id, GROUP_COL]));
+ // this._paginateAndSort(query, { sort, limit, offset }, null, true);
+ return this.isSqlite ? this.dbDriver.select().from(query) : query;
+ }),
+ !this.isSqlite,
+ ),
+ null,
+ { raw: true },
);
const gs = groupBy(children, GROUP_COL);
@@ -1314,7 +1338,8 @@ class BaseModelSqlv2 {
const filterObj = extractFilterFromXwhere(where, aliasColObjMap);
await conditionV2(this, filterObj, qb);
- return (await qb.first())?.count;
+ return (await this.execAndParse(qb, null, { raw: true, first: true }))
+ ?.count;
}
// todo: naming & optimizing
@@ -1365,7 +1390,8 @@ class BaseModelSqlv2 {
const filterObj = extractFilterFromXwhere(where, aliasColObjMap);
await conditionV2(this, filterObj, qb);
- return (await qb.first())?.count;
+ return (await this.execAndParse(qb, null, { raw: true, first: true }))
+ ?.count;
}
// todo: naming & optimizing
@@ -1488,7 +1514,8 @@ class BaseModelSqlv2 {
await conditionV2(this, filterObj, qb);
- return (await qb.first())?.count;
+ return (await this.execAndParse(qb, null, { raw: true, first: true }))
+ ?.count;
}
// todo: naming & optimizing
@@ -1603,7 +1630,8 @@ class BaseModelSqlv2 {
const filterObj = extractFilterFromXwhere(where, aliasColObjMap);
await conditionV2(this, filterObj, qb);
- return (await qb.first())?.count;
+ return (await this.execAndParse(qb, null, { raw: true, first: true }))
+ ?.count;
}
// todo: naming & optimizing
@@ -1737,28 +1765,35 @@ class BaseModelSqlv2 {
(await column.getColOptions()) as LinkToAnotherRecordColumn;
if (colOptions?.type === 'hm') {
- const listLoader = new DataLoader(async (ids: string[]) => {
- if (ids.length > 1) {
- const data = await this.multipleHmList(
- {
- colId: column.id,
- ids,
- },
- (listLoader as any).args,
- );
- return ids.map((id: string) => (data[id] ? data[id] : []));
- } else {
- return [
- await this.hmList(
+ const listLoader = new DataLoader(
+ async (ids: string[]) => {
+ if (ids.length > 1) {
+ const data = await this.multipleHmList(
{
colId: column.id,
- id: ids[0],
+ ids,
},
(listLoader as any).args,
- ),
- ];
- }
- });
+ );
+ return ids.map((id: string) =>
+ data[id] ? data[id] : [],
+ );
+ } else {
+ return [
+ await this.hmList(
+ {
+ colId: column.id,
+ id: ids[0],
+ },
+ (listLoader as any).args,
+ ),
+ ];
+ }
+ },
+ {
+ cache: false,
+ },
+ );
const self: BaseModelSqlv2 = this;
proto[
@@ -1772,29 +1807,34 @@ class BaseModelSqlv2 {
);
};
} else if (colOptions.type === 'mm') {
- const listLoader = new DataLoader(async (ids: string[]) => {
- if (ids?.length > 1) {
- const data = await this.multipleMmList(
- {
- parentIds: ids,
- colId: column.id,
- },
- (listLoader as any).args,
- );
-
- return data;
- } else {
- return [
- await this.mmList(
+ const listLoader = new DataLoader(
+ async (ids: string[]) => {
+ if (ids?.length > 1) {
+ const data = await this.multipleMmList(
{
- parentId: ids[0],
+ parentIds: ids,
colId: column.id,
},
(listLoader as any).args,
- ),
- ];
- }
- });
+ );
+
+ return data;
+ } else {
+ return [
+ await this.mmList(
+ {
+ parentId: ids[0],
+ colId: column.id,
+ },
+ (listLoader as any).args,
+ ),
+ ];
+ }
+ },
+ {
+ cache: false,
+ },
+ );
const self: BaseModelSqlv2 = this;
proto[
@@ -1822,55 +1862,65 @@ class BaseModelSqlv2 {
// it takes individual keys and callback is invoked with an array of values and we can get the
// result for all those together and return the value in the same order as in the array
// this way all parents data extracted together
- const readLoader = new DataLoader(async (_ids: string[]) => {
- // handle binary(16) foreign keys
- const ids = _ids.map((id) => {
- if (pCol.ct !== 'binary(16)') return id;
-
- // Cast the id to string.
- const idAsString = id + '';
- // Check if the id is a UUID and the column is binary(16)
- const isUUIDBinary16 =
- idAsString.length === 36 || idAsString.length === 32;
- // If the id is a UUID and the column is binary(16), convert the id to a Buffer. Otherwise, return null to indicate that the id is not a UUID.
- const idAsUUID = isUUIDBinary16
- ? idAsString.length === 32
- ? idAsString.replace(
- /(.{8})(.{4})(.{4})(.{4})(.{12})/,
- '$1-$2-$3-$4-$5',
- )
- : idAsString
- : null;
-
- return idAsUUID
- ? Buffer.from(idAsUUID.replace(/-/g, ''), 'hex')
- : id;
- });
-
- const data = await (
- await Model.getBaseModelSQL({
- id: pCol.fk_model_id,
- dbDriver: this.dbDriver,
- })
- ).list(
- {
- fieldsSet: (readLoader as any).args?.fieldsSet,
- filterArr: [
- new Filter({
- id: null,
- fk_column_id: pCol.id,
- fk_model_id: pCol.fk_model_id,
- value: ids as any[],
- comparison_op: 'in',
- }),
- ],
- },
- true,
- );
+ const readLoader = new DataLoader(
+ async (_ids: string[]) => {
+ // handle binary(16) foreign keys
+ const ids = _ids.map((id) => {
+ if (pCol.ct !== 'binary(16)') return id;
+
+ // Cast the id to string.
+ const idAsString = id + '';
+ // Check if the id is a UUID and the column is binary(16)
+ const isUUIDBinary16 =
+ idAsString.length === 36 || idAsString.length === 32;
+ // If the id is a UUID and the column is binary(16), convert the id to a Buffer. Otherwise, return null to indicate that the id is not a UUID.
+ const idAsUUID = isUUIDBinary16
+ ? idAsString.length === 32
+ ? idAsString.replace(
+ /(.{8})(.{4})(.{4})(.{4})(.{12})/,
+ '$1-$2-$3-$4-$5',
+ )
+ : idAsString
+ : null;
+
+ return idAsUUID
+ ? Buffer.from(idAsUUID.replace(/-/g, ''), 'hex')
+ : id;
+ });
+
+ const data = await (
+ await Model.getBaseModelSQL({
+ id: pCol.fk_model_id,
+ dbDriver: this.dbDriver,
+ })
+ ).list(
+ {
+ fieldsSet: (readLoader as any).args?.fieldsSet,
+ filterArr: [
+ new Filter({
+ id: null,
+ fk_column_id: pCol.id,
+ fk_model_id: pCol.fk_model_id,
+ value: ids as any[],
+ comparison_op: 'in',
+ }),
+ ],
+ },
+ {
+ ignoreViewFilterAndSort: true,
+ ignorePagination: true,
+ },
+ );
- const groupedList = groupBy(data, pCol.title);
- return _ids.map(async (id: string) => groupedList?.[id]?.[0]);
- });
+ const groupedList = groupBy(data, pCol.title);
+ return _ids.map(
+ async (id: string) => groupedList?.[id]?.[0],
+ );
+ },
+ {
+ cache: false,
+ },
+ );
// defining BelongsTo read resolver method
proto[column.title] = async function (args?: any) {
@@ -2099,7 +2149,7 @@ class BaseModelSqlv2 {
aliasToColumnBuilder,
);
qb.select({
- [column.column_name]: selectQb.builder,
+ [column.title]: selectQb.builder,
});
} catch {
continue;
@@ -2107,7 +2157,7 @@ class BaseModelSqlv2 {
break;
default: {
qb.select({
- [column.column_name]: barcodeValueColumn.column_name,
+ [column.title]: barcodeValueColumn.column_name,
});
break;
}
@@ -2239,16 +2289,24 @@ class BaseModelSqlv2 {
if (this.isSqlite) {
// sqlite doesnt return id after insert
id = (
- await this.dbDriver(this.tnPath)
- .select(ai.column_name)
- .max(ai.column_name, { as: 'id' })
- )[0].id;
+ await this.execAndParse(
+ this.dbDriver(this.tnPath)
+ .select(ai.column_name)
+ .max(ai.column_name, { as: '__nc_ai_id' }),
+ null,
+ { raw: true, first: true },
+ )
+ )?.__nc_ai_id;
} else if (this.isSnowflake) {
id = (
- (await this.dbDriver(this.tnPath).max(ai.column_name, {
- as: 'id',
- })) as any
- )[0].id;
+ await this.execAndParse(
+ this.dbDriver(this.tnPath).max(ai.column_name, {
+ as: 'id',
+ }),
+ null,
+ { raw: true, first: true },
+ )
+ ).id;
}
response = await this.readByPk(
id,
@@ -2382,23 +2440,31 @@ class BaseModelSqlv2 {
let cnt = 0;
if (colOptions.type === RelationTypes.HAS_MANY) {
cnt = +(
- await this.dbDriver(this.getTnPath(childModel.table_name))
- .count(childColumn.column_name, { as: 'cnt' })
- .where(childColumn.column_name, rowId)
- )[0].cnt;
+ await this.execAndParse(
+ this.dbDriver(this.getTnPath(childModel.table_name))
+ .count(childColumn.column_name, { as: 'cnt' })
+ .where(childColumn.column_name, rowId),
+ null,
+ { raw: true, first: true },
+ )
+ ).cnt;
} else if (colOptions.type === RelationTypes.MANY_TO_MANY) {
const mmModel = await colOptions.getMMModel();
const mmChildColumn = await colOptions.getMMChildColumn();
cnt = +(
- await this.dbDriver(this.getTnPath(mmModel.table_name))
- .where(
- `${this.getTnPath(mmModel.table_name)}.${
- mmChildColumn.column_name
- }`,
- rowId,
- )
- .count(mmChildColumn.column_name, { as: 'cnt' })
- )[0].cnt;
+ await this.execAndParse(
+ this.dbDriver(this.getTnPath(mmModel.table_name))
+ .where(
+ `${this.getTnPath(mmModel.table_name)}.${
+ mmChildColumn.column_name
+ }`,
+ rowId,
+ )
+ .count(mmChildColumn.column_name, { as: 'cnt' }),
+ null,
+ { first: true },
+ )
+ ).cnt;
}
if (cnt) {
res.push(
@@ -2531,71 +2597,15 @@ class BaseModelSqlv2 {
);
let rowId = null;
- const postInsertOps = [];
const nestedCols = (await this.model.getColumns()).filter((c) =>
isLinksOrLTAR(c),
);
-
- for (const col of nestedCols) {
- if (col.title in data) {
- const colOptions =
- await col.getColOptions();
-
- // parse data if it's JSON string
- const nestedData =
- typeof data[col.title] === 'string'
- ? JSON.parse(data[col.title])
- : data[col.title];
-
- switch (colOptions.type) {
- case RelationTypes.BELONGS_TO:
- {
- const childCol = await colOptions.getChildColumn();
- const parentCol = await colOptions.getParentColumn();
- insertObj[childCol.column_name] = nestedData?.[parentCol.title];
- }
- break;
- case RelationTypes.HAS_MANY:
- {
- const childCol = await colOptions.getChildColumn();
- const childModel = await childCol.getModel();
- await childModel.getColumns();
-
- postInsertOps.push(async () => {
- await this.dbDriver(this.getTnPath(childModel.table_name))
- .update({
- [childCol.column_name]: rowId,
- })
- .whereIn(
- childModel.primaryKey.column_name,
- nestedData?.map((r) => r[childModel.primaryKey.title]),
- );
- });
- }
- break;
- case RelationTypes.MANY_TO_MANY: {
- postInsertOps.push(async () => {
- const parentModel = await colOptions
- .getParentColumn()
- .then((c) => c.getModel());
- await parentModel.getColumns();
- const parentMMCol = await colOptions.getMMParentColumn();
- const childMMCol = await colOptions.getMMChildColumn();
- const mmModel = await colOptions.getMMModel();
-
- const rows = nestedData.map((r) => ({
- [parentMMCol.column_name]: r[parentModel.primaryKey.title],
- [childMMCol.column_name]: rowId,
- }));
- await this.dbDriver(this.getTnPath(mmModel.table_name)).insert(
- rows,
- );
- });
- }
- }
- }
- }
+ const postInsertOps = await this.prepareNestedLinkQb({
+ nestedCols,
+ data,
+ insertObj,
+ });
await this.validate(insertObj);
@@ -2608,59 +2618,90 @@ class BaseModelSqlv2 {
query.returning(
`${this.model.primaryKey.column_name} as ${this.model.primaryKey.title}`,
);
- response = await query;
+ response = await this.execAndParse(query);
}
const ai = this.model.columns.find((c) => c.ai);
- if (
+
+ let ag: Column;
+ if (!ai) ag = this.model.columns.find((c) => c.meta?.ag);
+
+ // handle if autogenerated primary key is used
+ if (ag) {
+ if (!response) await this.execAndParse(query);
+ response = await this.readByPk(
+ data[ag.title],
+ false,
+ {},
+ { ignoreView: true, getHiddenColumn: true },
+ );
+ } else if (
!response ||
(typeof response?.[0] !== 'object' && response?.[0] !== null)
) {
- let id;
if (response?.length) {
- id = response[0];
+ rowId = response[0];
} else {
- id = (await query)[0];
+ rowId = await this.execAndParse(query, null, {
+ raw: true,
+ first: true,
+ });
+ if (this.isMySQL) {
+ rowId = rowId?.insertId;
+ }
}
if (ai) {
if (this.isSqlite) {
// sqlite doesnt return id after insert
- id = (
- await this.dbDriver(this.tnPath)
- .select(ai.column_name)
- .max(ai.column_name, { as: 'id' })
- )[0].id;
+ rowId = (
+ await this.execAndParse(
+ this.dbDriver(this.tnPath)
+ .select(ai.column_name)
+ .max(ai.column_name, { as: '__nc_ai_id' }),
+ null,
+ {
+ raw: true,
+ first: true,
+ },
+ )
+ )?.__nc_ai_id;
} else if (this.isSnowflake) {
- id = (
- (await this.dbDriver(this.tnPath).max(ai.column_name, {
- as: 'id',
- })) as any
- ).rows[0].id;
+ rowId = (
+ await this.execAndParse(
+ this.dbDriver(this.tnPath).max(ai.column_name, {
+ as: 'id',
+ }),
+ null,
+ { raw: true, first: true },
+ )
+ )?.id;
}
- response = await this.readByPk(
- id,
- false,
- {},
- { ignoreView: true, getHiddenColumn: true },
- );
+ // response = await this.readByPk(
+ // id,
+ // false,
+ // {},
+ // { ignoreView: true, getHiddenColumn: true },
+ // );
} else {
response = data;
}
} else if (ai) {
+ rowId = Array.isArray(response)
+ ? response?.[0]?.[ai.title]
+ : response?.[ai.title];
+ }
+
+ await Promise.all(postInsertOps.map((f) => f(rowId)));
+
+ if (rowId !== null && rowId !== undefined) {
response = await this.readByPk(
- Array.isArray(response)
- ? response?.[0]?.[ai.title]
- : response?.[ai.title],
+ rowId,
+ false,
+ {},
+ { ignoreView: true, getHiddenColumn: true },
);
}
- response = Array.isArray(response) ? response[0] : response;
- if (response)
- rowId =
- response[this.model.primaryKey.title] ||
- response[this.model.primaryKey.column_name];
-
- await Promise.all(postInsertOps.map((f) => f()));
await this.afterInsert(response, this.dbDriver, cookie);
@@ -2671,6 +2712,94 @@ class BaseModelSqlv2 {
}
}
+ private async prepareNestedLinkQb({
+ nestedCols,
+ data,
+ insertObj,
+ }: {
+ nestedCols: Column[];
+ data: Record;
+ insertObj: Record;
+ }) {
+ const postInsertOps: ((rowId: any, trx?: any) => Promise)[] = [];
+ for (const col of nestedCols) {
+ if (col.title in data) {
+ const colOptions = await col.getColOptions();
+
+ // parse data if it's JSON string
+ let nestedData;
+ try {
+ nestedData =
+ typeof data[col.title] === 'string'
+ ? JSON.parse(data[col.title])
+ : data[col.title];
+ } catch {
+ continue;
+ }
+ switch (colOptions.type) {
+ case RelationTypes.BELONGS_TO:
+ {
+ if (typeof nestedData !== 'object') continue;
+ const childCol = await colOptions.getChildColumn();
+ const parentCol = await colOptions.getParentColumn();
+ insertObj[childCol.column_name] = nestedData?.[parentCol.title];
+ }
+ break;
+ case RelationTypes.HAS_MANY:
+ {
+ if (!Array.isArray(nestedData)) continue;
+ const childCol = await colOptions.getChildColumn();
+ const childModel = await childCol.getModel();
+ await childModel.getColumns();
+
+ postInsertOps.push(
+ async (
+ rowId,
+ // todo: use transaction type
+ trx: any = this.dbDriver,
+ ) => {
+ await trx(this.getTnPath(childModel.table_name))
+ .update({
+ [childCol.column_name]: rowId,
+ })
+ .whereIn(
+ childModel.primaryKey.column_name,
+ nestedData?.map((r) => r[childModel.primaryKey.title]),
+ );
+ },
+ );
+ }
+ break;
+ case RelationTypes.MANY_TO_MANY: {
+ if (!Array.isArray(nestedData)) continue;
+ postInsertOps.push(
+ async (
+ rowId,
+ // todo: use transaction type
+ trx: any = this.dbDriver,
+ ) => {
+ const parentModel = await colOptions
+ .getParentColumn()
+ .then((c) => c.getModel());
+ await parentModel.getColumns();
+ const parentMMCol = await colOptions.getMMParentColumn();
+ const childMMCol = await colOptions.getMMChildColumn();
+ const mmModel = await colOptions.getMMModel();
+
+ const rows = nestedData.map((r) => ({
+ [parentMMCol.column_name]: r[parentModel.primaryKey.title],
+ [childMMCol.column_name]: rowId,
+ }));
+ await trx(this.getTnPath(mmModel.table_name)).insert(rows);
+ },
+ );
+ }
+ }
+ }
+ }
+ return postInsertOps;
+ }
+
async bulkInsert(
datas: any[],
{
@@ -2695,8 +2824,13 @@ class BaseModelSqlv2 {
try {
// TODO: ag column handling for raw bulk insert
const insertDatas = raw ? datas : [];
+ let postInsertOps: ((rowId: any, trx?: any) => Promise)[] = [];
if (!raw) {
+ const nestedCols = (await this.model.getColumns()).filter((c) =>
+ isLinksOrLTAR(c),
+ );
+
await this.model.getColumns();
for (const d of datas) {
@@ -2823,6 +2957,15 @@ class BaseModelSqlv2 {
await this.prepareAttachmentData(insertObj);
+ // prepare nested link data for insert only if it is single record insertion
+ if (isSingleRecordInsertion) {
+ postInsertOps = await this.prepareNestedLinkQb({
+ nestedCols,
+ data: d,
+ insertObj,
+ });
+ }
+
insertDatas.push(insertObj);
}
}
@@ -2864,10 +3007,13 @@ class BaseModelSqlv2 {
}
} else {
response =
- this.isPg || this.isMssql
+ !raw && (this.isPg || this.isMssql)
? await trx
.batchInsert(this.tnPath, insertDatas, chunkSize)
- .returning(this.model.primaryKey?.column_name)
+ .returning({
+ [this.model.primaryKey?.title]:
+ this.model.primaryKey?.column_name,
+ })
: await trx.batchInsert(this.tnPath, insertDatas, chunkSize);
}
@@ -2879,6 +3025,12 @@ class BaseModelSqlv2 {
}
}
+ // insert nested link data for single record insertion
+ if (isSingleRecordInsertion) {
+ const rowId = response[0][this.model.primaryKey?.title];
+ await Promise.all(postInsertOps.map((f) => f(rowId, trx)));
+ }
+
await trx.commit();
if (!raw && !skip_hooks) {
@@ -3044,9 +3196,20 @@ class BaseModelSqlv2 {
await conditionV2(this, conditionObj, qb);
+ count = (
+ await this.execAndParse(
+ qb.clone().count('*', { as: 'count' }),
+ null,
+ {
+ raw: true,
+ first: true,
+ },
+ )
+ )?.count;
+
qb.update(updateData);
- count = (await qb) as any;
+ await this.execAndParse(qb, null, { raw: true });
}
await this.afterBulkUpdate(null, count, this.dbDriver, cookie, true);
@@ -3606,6 +3769,12 @@ class BaseModelSqlv2 {
const childTn = this.getTnPath(childTable);
const parentTn = this.getTnPath(parentTable);
+ const prevData = await this.readByPk(
+ rowId,
+ false,
+ {},
+ { ignoreView: true, getHiddenColumn: true },
+ );
switch (colOptions.type) {
case RelationTypes.MANY_TO_MANY:
@@ -3627,52 +3796,68 @@ class BaseModelSqlv2 {
.where(_wherePk(childTable.primaryKeys, rowId))
.first();
- await this.dbDriver.raw(
- `INSERT INTO ?? (??, ??) SELECT (${parentPK.toQuery()}), (${childPK.toQuery()})`,
- [vTn, vParentCol.column_name, vChildCol.column_name],
+ await this.execAndParse(
+ this.dbDriver.raw(
+ `INSERT INTO ?? (??, ??) SELECT (${parentPK.toQuery()}), (${childPK.toQuery()})`,
+ [vTn, vParentCol.column_name, vChildCol.column_name],
+ ) as any,
+ null,
+ { raw: true },
);
} else {
- await this.dbDriver(vTn).insert({
- [vParentCol.column_name]: this.dbDriver(parentTn)
- .select(parentColumn.column_name)
- .where(_wherePk(parentTable.primaryKeys, childId))
- .first(),
- [vChildCol.column_name]: this.dbDriver(childTn)
- .select(childColumn.column_name)
- .where(_wherePk(childTable.primaryKeys, rowId))
- .first(),
- });
+ await this.execAndParse(
+ this.dbDriver(vTn).insert({
+ [vParentCol.column_name]: this.dbDriver(parentTn)
+ .select(parentColumn.column_name)
+ .where(_wherePk(parentTable.primaryKeys, childId))
+ .first(),
+ [vChildCol.column_name]: this.dbDriver(childTn)
+ .select(childColumn.column_name)
+ .where(_wherePk(childTable.primaryKeys, rowId))
+ .first(),
+ }),
+ null,
+ { raw: true },
+ );
}
}
break;
case RelationTypes.HAS_MANY:
{
- await this.dbDriver(childTn)
- .update({
- [childColumn.column_name]: this.dbDriver.from(
- this.dbDriver(parentTn)
- .select(parentColumn.column_name)
- .where(_wherePk(parentTable.primaryKeys, rowId))
- .first()
- .as('___cn_alias'),
- ),
- })
- .where(_wherePk(childTable.primaryKeys, childId));
+ await this.execAndParse(
+ this.dbDriver(childTn)
+ .update({
+ [childColumn.column_name]: this.dbDriver.from(
+ this.dbDriver(parentTn)
+ .select(parentColumn.column_name)
+ .where(_wherePk(parentTable.primaryKeys, rowId))
+ .first()
+ .as('___cn_alias'),
+ ),
+ })
+ .where(_wherePk(childTable.primaryKeys, childId)),
+ null,
+ { raw: true },
+ );
}
break;
case RelationTypes.BELONGS_TO:
{
- await this.dbDriver(childTn)
- .update({
- [childColumn.column_name]: this.dbDriver.from(
- this.dbDriver(parentTn)
- .select(parentColumn.column_name)
- .where(_wherePk(parentTable.primaryKeys, childId))
- .first()
- .as('___cn_alias'),
- ),
- })
- .where(_wherePk(childTable.primaryKeys, rowId));
+ await this.execAndParse(
+ this.dbDriver(childTn)
+ .update({
+ [childColumn.column_name]: this.dbDriver.from(
+ this.dbDriver(parentTn)
+ .select(parentColumn.column_name)
+ .where(_wherePk(parentTable.primaryKeys, childId))
+ .first()
+ .as('___cn_alias'),
+ ),
+ })
+ .where(_wherePk(childTable.primaryKeys, rowId)),
+ null,
+ { raw: true },
+ );
}
break;
}
@@ -3683,7 +3868,7 @@ class BaseModelSqlv2 {
{},
{ ignoreView: true, getHiddenColumn: true },
);
- await this.afterInsert(response, this.dbDriver, cookie);
+ await this.afterUpdate(prevData, response, this.dbDriver, cookie);
await this.afterAddChild(rowId, childId, cookie);
}
@@ -3750,44 +3935,56 @@ class BaseModelSqlv2 {
const vTn = this.getTnPath(vTable);
- await this.dbDriver(vTn)
- .where({
- [vParentCol.column_name]: this.dbDriver(parentTn)
- .select(parentColumn.column_name)
- .where(_wherePk(parentTable.primaryKeys, childId))
- .first(),
- [vChildCol.column_name]: this.dbDriver(childTn)
- .select(childColumn.column_name)
- .where(_wherePk(childTable.primaryKeys, rowId))
- .first(),
- })
- .delete();
+ await this.execAndParse(
+ this.dbDriver(vTn)
+ .where({
+ [vParentCol.column_name]: this.dbDriver(parentTn)
+ .select(parentColumn.column_name)
+ .where(_wherePk(parentTable.primaryKeys, childId))
+ .first(),
+ [vChildCol.column_name]: this.dbDriver(childTn)
+ .select(childColumn.column_name)
+ .where(_wherePk(childTable.primaryKeys, rowId))
+ .first(),
+ })
+ .delete(),
+ null,
+ { raw: true },
+ );
}
break;
case RelationTypes.HAS_MANY:
{
- await this.dbDriver(childTn)
- // .where({
- // [childColumn.cn]: this.dbDriver(parentTable.tn)
- // .select(parentColumn.cn)
- // .where(parentTable.primaryKey.cn, rowId)
- // .first()
- // })
- .where(_wherePk(childTable.primaryKeys, childId))
- .update({ [childColumn.column_name]: null });
+ await this.execAndParse(
+ this.dbDriver(childTn)
+ // .where({
+ // [childColumn.cn]: this.dbDriver(parentTable.tn)
+ // .select(parentColumn.cn)
+ // .where(parentTable.primaryKey.cn, rowId)
+ // .first()
+ // })
+ .where(_wherePk(childTable.primaryKeys, childId))
+ .update({ [childColumn.column_name]: null }),
+ null,
+ { raw: true },
+ );
}
break;
case RelationTypes.BELONGS_TO:
{
- await this.dbDriver(childTn)
- // .where({
- // [childColumn.cn]: this.dbDriver(parentTable.tn)
- // .select(parentColumn.cn)
- // .where(parentTable.primaryKey.cn, childId)
- // .first()
- // })
- .where(_wherePk(childTable.primaryKeys, rowId))
- .update({ [childColumn.column_name]: null });
+ await this.execAndParse(
+ this.dbDriver(childTn)
+ // .where({
+ // [childColumn.cn]: this.dbDriver(parentTable.tn)
+ // .select(parentColumn.cn)
+ // .where(parentTable.primaryKey.cn, childId)
+ // .first()
+ // })
+ .where(_wherePk(childTable.primaryKeys, rowId))
+ .update({ [childColumn.column_name]: null }),
+ null,
+ { raw: true },
+ );
}
break;
}
@@ -3854,9 +4051,11 @@ class BaseModelSqlv2 {
} else {
groupingValues = new Set(
(
- await this.dbDriver(this.tnPath)
- .select(column.column_name)
- .distinct()
+ await this.execAndParse(
+ this.dbDriver(this.tnPath).select(column.column_name).distinct(),
+ null,
+ { raw: true },
+ )
).map((row) => row[column.column_name]),
);
groupingValues.add(null);
@@ -4055,13 +4254,36 @@ class BaseModelSqlv2 {
columns: [new Column({ ...column, title: 'key' })],
});
- return await qb;
+ return await this.execAndParse(qb);
}
- protected async execAndParse(qb: Knex.QueryBuilder, childTable?: Model) {
- let query = qb.toQuery();
+ public async execAndParse(
+ qb: Knex.QueryBuilder | string,
+ childTable?: Model,
+ options: {
+ skipDateConversion?: boolean;
+ skipAttachmentConversion?: boolean;
+ raw?: boolean; // alias for skipDateConversion and skipAttachmentConversion
+ first?: boolean;
+ } = {
+ skipDateConversion: false,
+ skipAttachmentConversion: false,
+ raw: false,
+ first: false,
+ },
+ ) {
+ if (options.raw) {
+ options.skipDateConversion = true;
+ options.skipAttachmentConversion = true;
+ }
+
+ if (options.first && typeof qb !== 'string') {
+ qb = qb.limit(1);
+ }
+
+ let query = typeof qb === 'string' ? qb : qb.toQuery();
if (!this.isPg && !this.isMssql && !this.isSnowflake) {
- query = unsanitize(qb.toQuery());
+ query = unsanitize(query);
} else {
query = sanitize(query);
}
@@ -4076,10 +4298,18 @@ class BaseModelSqlv2 {
: await this.dbDriver.raw(query);
// update attachment fields
- data = await this.convertAttachmentType(data, childTable);
+ if (!options.skipAttachmentConversion) {
+ data = await this.convertAttachmentType(data, childTable);
+ }
// update date time fields
- data = this.convertDateFormat(data, childTable);
+ if (!options.skipDateConversion) {
+ data = this.convertDateFormat(data, childTable);
+ }
+
+ if (options.first) {
+ return data?.[0];
+ }
return data;
}
@@ -4358,7 +4588,7 @@ class BaseModelSqlv2 {
}
async addLinks({
- cookie: _cookie,
+ cookie,
childIds,
colId,
rowId,
@@ -4374,9 +4604,12 @@ class BaseModelSqlv2 {
if (!column || !isLinksOrLTAR(column))
NcError.notFound(`Link column ${colId} not found`);
- const row = await this.dbDriver(this.tnPath)
- .where(await this._wherePk(rowId))
- .first();
+ const row = await this.readByPk(
+ rowId,
+ false,
+ {},
+ { ignoreView: true, getHiddenColumn: true },
+ );
// validate rowId
if (!row) {
@@ -4473,7 +4706,9 @@ class BaseModelSqlv2 {
}
// todo: use bulk insert
- await this.dbDriver(vTn).insert(insertData);
+ await this.execAndParse(this.dbDriver(vTn).insert(insertData), null, {
+ raw: true,
+ });
}
break;
case RelationTypes.HAS_MANY:
@@ -4543,7 +4778,7 @@ class BaseModelSqlv2 {
: childIds,
);
}
- await updateQb;
+ await this.execAndParse(updateQb, null, { raw: true });
}
break;
case RelationTypes.BELONGS_TO:
@@ -4564,29 +4799,40 @@ class BaseModelSqlv2 {
}
}
- await this.dbDriver(childTn)
- .update({
- [childColumn.column_name]: this.dbDriver.from(
- this.dbDriver(parentTn)
- .select(parentColumn.column_name)
- .where(_wherePk(parentTable.primaryKeys, childIds[0]))
- // .whereIn(parentTable.primaryKey.column_name, childIds)
- .first()
- .as('___cn_alias'),
- ),
- })
- .where(_wherePk(childTable.primaryKeys, rowId));
+ await this.execAndParse(
+ this.dbDriver(childTn)
+ .update({
+ [childColumn.column_name]: this.dbDriver.from(
+ this.dbDriver(parentTn)
+ .select(parentColumn.column_name)
+ .where(_wherePk(parentTable.primaryKeys, childIds[0]))
+ // .whereIn(parentTable.primaryKey.column_name, childIds)
+ .first()
+ .as('___cn_alias'),
+ ),
+ })
+ .where(_wherePk(childTable.primaryKeys, rowId)),
+ null,
+ { raw: true },
+ );
}
break;
}
- // const response = await this.readByPk(rowId);
- // await this.afterInsert(response, this.dbDriver, cookie);
- // await this.afterAddChild(rowId, childId, cookie);
+ const updatedRow = await this.readByPk(
+ rowId,
+ false,
+ {},
+ { ignoreView: true, getHiddenColumn: true },
+ );
+ await this.afterUpdate(row, updatedRow, this.dbDriver, cookie);
+ for (const childId of childIds) {
+ await this.afterAddChild(rowId, childId, cookie);
+ }
}
async removeLinks({
- cookie: _cookie,
+ cookie,
childIds,
colId,
rowId,
@@ -4602,9 +4848,12 @@ class BaseModelSqlv2 {
if (!column || !isLinksOrLTAR(column))
NcError.notFound(`Link column ${colId} not found`);
- const row = await this.dbDriver(this.tnPath)
- .where(await this._wherePk(rowId))
- .first();
+ const row = await this.readByPk(
+ rowId,
+ false,
+ {},
+ { ignoreView: true, getHiddenColumn: true },
+ );
// validate rowId
if (!row) {
@@ -4697,7 +4946,7 @@ class BaseModelSqlv2 {
)
: childIds,
);
- await delQb;
+ await this.execAndParse(delQb, null, { raw: true });
}
break;
case RelationTypes.HAS_MANY:
@@ -4743,7 +4992,11 @@ class BaseModelSqlv2 {
);
}
- await childRowsQb.update({ [childColumn.column_name]: null });
+ await this.execAndParse(
+ childRowsQb.update({ [childColumn.column_name]: null }),
+ null,
+ { raw: true },
+ );
}
break;
case RelationTypes.BELONGS_TO:
@@ -4769,23 +5022,34 @@ class BaseModelSqlv2 {
}
}
- await this.dbDriver(childTn)
- // .where({
- // [childColumn.cn]: this.dbDriver(parentTable.tn)
- // .select(parentColumn.cn)
- // .where(parentTable.primaryKey.cn, childId)
- // .first()
- // })
- // .where(_wherePk(childTable.primaryKeys, rowId))
- .where(childTable.primaryKey.column_name, rowId)
- .update({ [childColumn.column_name]: null });
+ await this.execAndParse(
+ this.dbDriver(childTn)
+ // .where({
+ // [childColumn.cn]: this.dbDriver(parentTable.tn)
+ // .select(parentColumn.cn)
+ // .where(parentTable.primaryKey.cn, childId)
+ // .first()
+ // })
+ // .where(_wherePk(childTable.primaryKeys, rowId))
+ .where(childTable.primaryKey.column_name, rowId)
+ .update({ [childColumn.column_name]: null }),
+ null,
+ { raw: true },
+ );
}
break;
}
- // const newData = await this.readByPk(rowId);
- // await this.afterUpdate(prevData, newData, this.dbDriver, cookie);
- // await this.afterRemoveChild(rowId, childIds, cookie);
+ const updatedRow = await this.readByPk(
+ rowId,
+ false,
+ {},
+ { ignoreView: true, getHiddenColumn: true },
+ );
+ await this.afterUpdate(row, updatedRow, this.dbDriver, cookie);
+ for (const childId of childIds) {
+ await this.afterRemoveChild(rowId, childId, cookie);
+ }
}
async btRead(
@@ -4800,9 +5064,11 @@ class BaseModelSqlv2 {
(c) => c.id === colId,
);
- const row = await this.dbDriver(this.tnPath)
- .where(await this._wherePk(id))
- .first();
+ const row = await this.execAndParse(
+ this.dbDriver(this.tnPath).where(await this._wherePk(id)),
+ null,
+ { raw: true, first: true },
+ );
// validate rowId
if (!row) {
@@ -4840,7 +5106,9 @@ class BaseModelSqlv2 {
await parentModel.selectObject({ qb, fieldsSet: args.fieldSet });
- const parent = (await this.execAndParse(qb, childTable))?.[0];
+ const parent = await this.execAndParse(qb, childTable, {
+ first: true,
+ });
const proto = await parentModel.getProto();
@@ -5024,6 +5292,29 @@ export function extractCondition(
[logicOp, alias, op, value] =
str.match(/(?:~(and|or|not))?\((.*?),(\w+)\)/)?.slice(1) || [];
}
+
+ // handle isblank and isnotblank filter format
+ switch (op) {
+ case 'is':
+ if (value === 'blank') {
+ op = 'blank';
+ value = undefined;
+ } else if (value === 'notblank') {
+ op = 'notblank';
+ value = undefined;
+ }
+ break;
+ case 'isblank':
+ case 'is_blank':
+ op = 'blank';
+ break;
+ case 'isnotblank':
+ case 'is_not_blank':
+ case 'is_notblank':
+ op = 'notblank';
+ break;
+ }
+
let sub_op = null;
if (aliasColObjMap[alias]) {
diff --git a/packages/nocodb/src/db/CustomKnex.ts b/packages/nocodb/src/db/CustomKnex.ts
index 11264c026f..077d158c1a 100644
--- a/packages/nocodb/src/db/CustomKnex.ts
+++ b/packages/nocodb/src/db/CustomKnex.ts
@@ -1020,7 +1020,10 @@ function parseNestedCondition(obj, qb, pKey?, table?, tableAlias?) {
type CustomKnex = Knex;
-function CustomKnex(arg: string | Knex.Config | any): CustomKnex {
+function CustomKnex(
+ arg: string | Knex.Config | any,
+ extDb?: any,
+): CustomKnex {
// sqlite does not support inserting default values and knex fires a warning without this flag
if (arg?.client === 'sqlite3') {
arg.useNullAsDefault = true;
@@ -1065,6 +1068,14 @@ function CustomKnex(arg: string | Knex.Config | any): CustomKnex {
return arg?.searchPath?.[0];
},
},
+ extDb: {
+ enumerable: true,
+ value: extDb,
+ },
+ isExternal: {
+ enumerable: false,
+ value: !!extDb && process.env.NC_DISABLE_MUX !== 'true',
+ },
});
/**
diff --git a/packages/nocodb/src/db/conditionV2.ts b/packages/nocodb/src/db/conditionV2.ts
index 664741dcc4..04441a8021 100644
--- a/packages/nocodb/src/db/conditionV2.ts
+++ b/packages/nocodb/src/db/conditionV2.ts
@@ -257,9 +257,13 @@ const parseConditionV2 = async (
)(selectQb);
return (qbP: Knex.QueryBuilder) => {
- if (filter.comparison_op in negatedMapping)
- qbP.whereNotIn(childColumn.column_name, selectQb);
- else qbP.whereIn(childColumn.column_name, selectQb);
+ if (filter.comparison_op in negatedMapping) {
+ qbP.where((qb) =>
+ qb
+ .whereNotIn(childColumn.column_name, selectQb)
+ .orWhereNull(childColumn.column_name),
+ );
+ } else qbP.whereIn(childColumn.column_name, selectQb);
};
} else if (colOptions.type === RelationTypes.MANY_TO_MANY) {
const mmModel = await colOptions.getMMModel();
@@ -337,7 +341,11 @@ const parseConditionV2 = async (
return (qbP: Knex.QueryBuilder) => {
if (filter.comparison_op in negatedMapping)
- qbP.whereNotIn(childColumn.column_name, selectQb);
+ qbP.where((qb) =>
+ qbP
+ .whereNotIn(childColumn.column_name, selectQb)
+ .orWhereNull(childColumn.column_name),
+ );
else qbP.whereIn(childColumn.column_name, selectQb);
};
}
@@ -954,7 +962,11 @@ async function generateLookupCondition(
return (qbP: Knex.QueryBuilder) => {
if (filter.comparison_op in negatedMapping)
- qbP.whereNotIn(childColumn.column_name, qb);
+ qbP.where((qb1) =>
+ qb1
+ .whereNotIn(childColumn.column_name, qb)
+ .orWhereNull(childColumn.column_name),
+ );
else qbP.whereIn(childColumn.column_name, qb);
};
} else if (relationColumnOptions.type === RelationTypes.MANY_TO_MANY) {
@@ -992,7 +1004,11 @@ async function generateLookupCondition(
return (qbP: Knex.QueryBuilder) => {
if (filter.comparison_op in negatedMapping)
- qbP.whereNotIn(childColumn.column_name, qb);
+ qbP.where((qb1) =>
+ qb1
+ .whereNotIn(childColumn.column_name, qb)
+ .orWhereNull(childColumn.column_name),
+ );
else qbP.whereIn(childColumn.column_name, qb);
};
}
diff --git a/packages/nocodb/src/db/formulav2/formulaQueryBuilderv2.ts b/packages/nocodb/src/db/formulav2/formulaQueryBuilderv2.ts
index 6aae965b6c..0ff26c0eb5 100644
--- a/packages/nocodb/src/db/formulav2/formulaQueryBuilderv2.ts
+++ b/packages/nocodb/src/db/formulav2/formulaQueryBuilderv2.ts
@@ -949,9 +949,13 @@ export default async function formulaQueryBuilderv2(
try {
// dry run qb.builder to see if it will break the grid view or not
// if so, set formula error and show empty selectQb instead
- await knex(baseModelSqlv2.getTnPath(model, tableAlias))
- .select(knex.raw(`?? as ??`, [qb.builder, '__dry_run_alias']))
- .as('dry-run-only');
+ await baseModelSqlv2.execAndParse(
+ knex(baseModelSqlv2.getTnPath(model, tableAlias))
+ .select(knex.raw(`?? as ??`, [qb.builder, '__dry_run_alias']))
+ .as('dry-run-only'),
+ null,
+ { raw: true },
+ );
// if column is provided, i.e. formula has been created
if (column) {
diff --git a/packages/nocodb/src/db/sql-client/lib/KnexClient.ts b/packages/nocodb/src/db/sql-client/lib/KnexClient.ts
index bf700c33cf..f617f5b981 100644
--- a/packages/nocodb/src/db/sql-client/lib/KnexClient.ts
+++ b/packages/nocodb/src/db/sql-client/lib/KnexClient.ts
@@ -1157,7 +1157,7 @@ class KnexClient extends SqlClient {
migrationInit(_args) {}
async selectAll(tn) {
- return await this.sqlClient(tn).select();
+ return await this.sqlClient.raw(this.sqlClient(tn).select().toQuery());
}
/**
@@ -1180,15 +1180,19 @@ class KnexClient extends SqlClient {
const result = new Result();
try {
- const countResult = await this.sqlClient(args.tn).count();
+ const countResult = await this.sqlClient.raw(
+ this.sqlClient(args.tn).count().toQuery(),
+ );
result.data.count = Object.values(countResult[0])[0];
const query = this.sqlClient(args.tn)
.select()
.limit(size)
.offset((page - 1) * size);
if (orderBy && orderBy.length)
- result.data.list = await query.orderBy(orderBy);
- else result.data.list = await query;
+ result.data.list = await this.sqlClient.raw(
+ query.orderBy(orderBy).toQuery(),
+ );
+ else result.data.list = await this.sqlClient.raw(query.toQuery());
} catch (e) {
console.log(e);
result.data.list = [];
@@ -1226,26 +1230,32 @@ class KnexClient extends SqlClient {
// Todo: error handling
async insert(args) {
const { tn, data } = args;
- const res = await this.sqlClient(tn).insert(data);
+ const res = await this.sqlClient.raw(
+ this.sqlClient(tn).insert(data).toQuery(),
+ );
log.debug(res);
return res;
}
async update(args) {
const { tn, data, whereConditions } = args;
- const res = await this.sqlClient(tn).where(whereConditions).update(data);
+ const res = await this.sqlClient.raw(
+ this.sqlClient(tn).where(whereConditions).update(data).toQuery(),
+ );
return res;
}
async delete(args) {
const { tn, whereConditions } = args;
- const res = await this.sqlClient(tn).where(whereConditions).del();
+ const res = await this.sqlClient.raw(
+ this.sqlClient(tn).where(whereConditions).del().toQuery(),
+ );
log.debug(res);
return res;
}
async remove(tn, where) {
- await this.sqlClient(tn).del().where(where);
+ await this.sqlClient.raw(this.sqlClient(tn).del().where(where).toQuery());
}
hasTable(_tn) {}
@@ -1712,31 +1722,36 @@ class KnexClient extends SqlClient {
args.sqlClient = this.sqlClient;
/** ************** create table *************** */
- await this.sqlClient.schema.createTable(args.table, function (table) {
- const multiplePks = [];
- const columns = JSON.parse(JSON.stringify(args.columns));
-
- // copy PKs to new array and set PK metadata to false in original columns
- for (let i = 0; i < columns.length; ++i) {
- if (columns[i].pk) {
- multiplePks.push(i);
- columns[i].pk = false;
- columns[i].ai = false;
- }
- }
+ const query = this.sqlClient.schema.createTable(
+ args.table,
+ function (table) {
+ const multiplePks = [];
+ const columns = JSON.parse(JSON.stringify(args.columns));
- if (multiplePks.length > 1) {
+ // copy PKs to new array and set PK metadata to false in original columns
for (let i = 0; i < columns.length; ++i) {
- columnCreate(args.sqlClient, table, columns[i]);
+ if (columns[i].pk) {
+ multiplePks.push(i);
+ columns[i].pk = false;
+ columns[i].ai = false;
+ }
}
- createPks(table, args.columns, multiplePks);
- } else {
- for (let i = 0; i < args.columns.length; ++i) {
- columnCreate(args.sqlClient, table, args.columns[i]);
+ if (multiplePks.length > 1) {
+ for (let i = 0; i < columns.length; ++i) {
+ columnCreate(args.sqlClient, table, columns[i]);
+ }
+
+ createPks(table, args.columns, multiplePks);
+ } else {
+ for (let i = 0; i < args.columns.length; ++i) {
+ columnCreate(args.sqlClient, table, args.columns[i]);
+ }
}
- }
- });
+ },
+ );
+
+ await this.sqlClient.raw(query.toQuery());
/** ************** create up & down statements *************** */
const upStatement = this.sqlClient.schema
@@ -1799,7 +1814,9 @@ class KnexClient extends SqlClient {
args.table = args.tn;
/** ************** create table *************** */
- await this.sqlClient.schema.renameTable(args.tn_old, args.tn);
+ await this.sqlClient.raw(
+ this.sqlClient.schema.renameTable(args.tn_old, args.tn).toQuery(),
+ );
/** ************** create up & down statements *************** */
const upStatement =
@@ -2013,41 +2030,46 @@ class KnexClient extends SqlClient {
/** ************** END : has PK changed *************** */
/** ************** update table *************** */
- await this.sqlClient.schema.alterTable(args.table, function (table) {
- if (pksChanged) {
- pkUpdate(table, args.columns, args.originalColumns);
- } else {
- for (let i = 0; i < args.columns.length; ++i) {
- const column = find(originalColumns, {
- cn: args.columns[i].cno,
- });
-
- if (args.columns[i].altered & 8) {
- // TODO: If a column is getting renamed then
- // any change to column data type
- // or changes to other columns are ignored
- renamed = true;
- renamedUpDownStatement = renameColumn(
- args.sqlClient,
- args.connectionConfig,
- table,
- column,
- args.columns[i],
- );
- result.data.object = renamedUpDownStatement;
- } else if (args.columns[i].altered & 4) {
- // col remove
- removeColumn(table, args.columns[i], column);
- } else if (args.columns[i].altered & 2) {
- // col edit
- columnUpdate(args.sqlClient, table, args.columns[i], column);
- } else if (args.columns[i].altered & 1) {
- // col addition
- columnUpdate(args.sqlClient, table, args.columns[i], null);
+ const query = this.sqlClient.schema.alterTable(
+ args.table,
+ function (table) {
+ if (pksChanged) {
+ pkUpdate(table, args.columns, args.originalColumns);
+ } else {
+ for (let i = 0; i < args.columns.length; ++i) {
+ const column = find(originalColumns, {
+ cn: args.columns[i].cno,
+ });
+
+ if (args.columns[i].altered & 8) {
+ // TODO: If a column is getting renamed then
+ // any change to column data type
+ // or changes to other columns are ignored
+ renamed = true;
+ renamedUpDownStatement = renameColumn(
+ args.sqlClient,
+ args.connectionConfig,
+ table,
+ column,
+ args.columns[i],
+ );
+ result.data.object = renamedUpDownStatement;
+ } else if (args.columns[i].altered & 4) {
+ // col remove
+ removeColumn(table, args.columns[i], column);
+ } else if (args.columns[i].altered & 2) {
+ // col edit
+ columnUpdate(args.sqlClient, table, args.columns[i], column);
+ } else if (args.columns[i].altered & 1) {
+ // col addition
+ columnUpdate(args.sqlClient, table, args.columns[i], null);
+ }
}
}
- }
- });
+ },
+ );
+
+ await this.sqlClient.raw(query.toQuery());
// log.debug('after column change', r);
@@ -2199,7 +2221,9 @@ class KnexClient extends SqlClient {
this.emit(`Success : ${upStatement}`);
/** ************** drop tn *************** */
- await this.sqlClient.schema.dropTable(args.tn);
+ await this.sqlClient.raw(
+ this.sqlClient.schema.dropTable(args.tn).toQuery(),
+ );
/** ************** return files *************** */
result.data.object = {
@@ -2234,7 +2258,7 @@ class KnexClient extends SqlClient {
args.table = args.tn;
// s = await this.sqlClient.schema.index(Object.keys(args.columns));
- await this.sqlClient.schema.table(args.table, function (table) {
+ const query = this.sqlClient.schema.table(args.table, function (table) {
if (args.non_unique) {
table.index(args.columns, indexName);
} else {
@@ -2242,6 +2266,8 @@ class KnexClient extends SqlClient {
}
});
+ await this.sqlClient.raw(query.toQuery());
+
const upStatement =
this.querySeparator() +
this.sqlClient.schema
@@ -2305,7 +2331,7 @@ class KnexClient extends SqlClient {
args.table = args.tn;
// s = await this.sqlClient.schema.index(Object.keys(args.columns));
- await this.sqlClient.schema.table(args.table, function (table) {
+ const query = this.sqlClient.schema.table(args.table, function (table) {
if (args.non_unique_original) {
table.dropIndex(args.columns, indexName);
} else {
@@ -2313,6 +2339,8 @@ class KnexClient extends SqlClient {
}
});
+ await this.sqlClient.raw(query.toQuery());
+
const upStatement =
this.querySeparator() +
this.sqlClient.schema
@@ -2385,7 +2413,7 @@ class KnexClient extends SqlClient {
},
);
- await upQb;
+ await this.sqlClient.raw(upQb.toQuery());
const upStatement = this.querySeparator() + upQb.toQuery();
@@ -2444,9 +2472,14 @@ class KnexClient extends SqlClient {
try {
// const self = this;
- await this.sqlClient.schema.table(args.childTable, function (table) {
- table.dropForeign(args.childColumn, foreignKeyName);
- });
+ const query = this.sqlClient.schema.table(
+ args.childTable,
+ function (table) {
+ table.dropForeign(args.childColumn, foreignKeyName);
+ },
+ );
+
+ await this.sqlClient.raw(query.toQuery());
const upStatement =
this.querySeparator() +
@@ -2456,16 +2489,19 @@ class KnexClient extends SqlClient {
})
.toQuery();
- const downStatement =
- this.querySeparator() +
- (await this.sqlClient.schema
- .table(args.childTable, function (table) {
- table
- .foreign(args.childColumn, foreignKeyName)
- .references(args.parentColumn)
- .on(args.parentTable);
- })
- .toQuery());
+ const downQuery = this.sqlClient.schema.table(
+ args.childTable,
+ function (table) {
+ table
+ .foreign(args.childColumn, foreignKeyName)
+ .references(args.parentColumn)
+ .on(args.parentTable);
+ },
+ );
+
+ await this.sqlClient.raw(downQuery.toQuery());
+
+ const downStatement = this.querySeparator() + downQuery.toQuery();
// let files = this.evolutionFilesCreate(args, upStatement, downStatement);
//
diff --git a/packages/nocodb/src/db/sql-client/lib/mysql/MysqlClient.ts b/packages/nocodb/src/db/sql-client/lib/mysql/MysqlClient.ts
index 4b5726d170..3aaa794ee4 100644
--- a/packages/nocodb/src/db/sql-client/lib/mysql/MysqlClient.ts
+++ b/packages/nocodb/src/db/sql-client/lib/mysql/MysqlClient.ts
@@ -355,20 +355,26 @@ class MysqlClient extends KnexClient {
try {
/** ************** START : create _evolution table if not exists *************** */
- const exists = await this.sqlClient.schema.hasTable(args.tn);
+ const exists = await this.sqlClient.raw(
+ this.sqlClient.schema.hasTable(args.tn).toQuery(),
+ );
if (!exists) {
- await this.sqlClient.schema.createTable(args.tn, function (table) {
- table.increments();
- table.string('title').notNullable();
- table.string('titleDown').nullable();
- table.string('description').nullable();
- table.integer('batch').nullable();
- table.string('checksum').nullable();
- table.integer('status').nullable();
- table.dateTime('created');
- table.timestamps();
- });
+ await this.sqlClient.raw(
+ this.sqlClient.schema
+ .createTable(args.tn, function (table) {
+ table.increments();
+ table.string('title').notNullable();
+ table.string('titleDown').nullable();
+ table.string('description').nullable();
+ table.integer('batch').nullable();
+ table.string('checksum').nullable();
+ table.integer('status').nullable();
+ table.dateTime('created');
+ table.timestamps();
+ })
+ .toQuery(),
+ );
log.debug('Table created:', `${args.tn}`);
} else {
log.debug(`${args.tn} tables exists`);
@@ -411,7 +417,9 @@ class MysqlClient extends KnexClient {
log.api(`${func}:args:`, args);
try {
- const response = await this.sqlClient.schema.hasTable(args.tn);
+ const response = await this.sqlClient.raw(
+ this.sqlClient.schema.hasTable(args.tn).toQuery(),
+ );
result.data.value = response;
} catch (e) {
log.ppe(e, func);
@@ -2205,7 +2213,9 @@ class MysqlClient extends KnexClient {
this.emit(`Success : ${upStatement}`);
/** ************** drop table_name *************** */
- await this.sqlClient.schema.dropTable(args.table_name);
+ await this.sqlClient.raw(
+ this.sqlClient.schema.dropTable(args.table_name).toQuery(),
+ );
/** ************** return files *************** */
result.data.object = {
diff --git a/packages/nocodb/src/db/sql-client/lib/pg/PgClient.ts b/packages/nocodb/src/db/sql-client/lib/pg/PgClient.ts
index cefce1e6cb..c2d6e8f7a9 100644
--- a/packages/nocodb/src/db/sql-client/lib/pg/PgClient.ts
+++ b/packages/nocodb/src/db/sql-client/lib/pg/PgClient.ts
@@ -575,19 +575,20 @@ class PGClient extends KnexClient {
);
if (exists.rows.length === 0) {
- const data = await this.sqlClient.schema.createTable(
- args.tn,
- function (table) {
- table.increments();
- table.string('title').notNullable();
- table.string('titleDown').nullable();
- table.string('description').nullable();
- table.integer('batch').nullable();
- table.string('checksum').nullable();
- table.integer('status').nullable();
- table.dateTime('created');
- table.timestamps();
- },
+ const data = await this.sqlClient.raw(
+ this.sqlClient.schema
+ .createTable(args.tn, function (table) {
+ table.increments();
+ table.string('title').notNullable();
+ table.string('titleDown').nullable();
+ table.string('description').nullable();
+ table.integer('batch').nullable();
+ table.string('checksum').nullable();
+ table.integer('status').nullable();
+ table.dateTime('created');
+ table.timestamps();
+ })
+ .toQuery(),
);
log.debug('Table created:', `${args.tn}`, data);
} else {
@@ -890,7 +891,7 @@ class PGClient extends KnexClient {
// column['unique'] = response.rows[i]['cst'].indexOf('UNIQUE') === -1 ? false : true;
column.cdf = response.rows[i].cdf
- ? response.rows[i].cdf.replace(/::\w+$/, '').replace(/^'|'$/g, '')
+ ? response.rows[i].cdf.replace(/::[\w ]+$/, '').replace(/^'|'$/g, '')
: response.rows[i].cdf;
// todo : need to find column comment
@@ -1039,11 +1040,12 @@ class PGClient extends KnexClient {
try {
// const self = this;
- await this.sqlClient.schema.table(
- args.childTableWithSchema,
- function (table) {
- table.dropForeign(args.childColumn, foreignKeyName);
- },
+ await this.sqlClient.raw(
+ this.sqlClient.schema
+ .table(args.childTableWithSchema, function (table) {
+ table.dropForeign(args.childColumn, foreignKeyName);
+ })
+ .toQuery(),
);
const upStatement =
@@ -1056,14 +1058,14 @@ class PGClient extends KnexClient {
const downStatement =
this.querySeparator() +
- (await this.sqlClient.schema
+ this.sqlClient.schema
.table(args.childTableWithSchema, function (table) {
table
.foreign(args.childColumn, foreignKeyName)
.references(args.parentColumn)
.on(args.parentTableWithSchema);
})
- .toQuery());
+ .toQuery();
result.data.object = {
upStatement: [{ sql: upStatement }],
@@ -2507,9 +2509,8 @@ class PGClient extends KnexClient {
relationsList = relationsList.data.list;
for (const relation of relationsList) {
- downQuery +=
- this.querySeparator() +
- (await this.sqlClient.schema
+ const query = this.sqlClient.raw(
+ this.sqlClient.schema
.table(relation.tn, function (table) {
table = table
.foreign(relation.cn, null)
@@ -2523,7 +2524,12 @@ class PGClient extends KnexClient {
table.onDelete(relation.dr);
}
})
- .toQuery());
+ .toQuery(),
+ );
+
+ downQuery += this.querySeparator() + query;
+
+ await query;
}
let indexList: any = await this.indexList(args);
@@ -2565,7 +2571,9 @@ class PGClient extends KnexClient {
this.emit(`Success : ${upStatement}`);
/** ************** drop tn *************** */
- await this.sqlClient.schema.dropTable(args.tn);
+ await this.sqlClient.raw(
+ this.sqlClient.schema.dropTable(args.tn).toQuery(),
+ );
/** ************** return files *************** */
result.data.object = {
@@ -2989,9 +2997,13 @@ class PGClient extends KnexClient {
args.table = args.tn;
/** ************** create table *************** */
- await this.sqlClient.schema.renameTable(
- this.sqlClient.raw('??.??', [this.schema, args.tn_old]),
- args.tn,
+ await this.sqlClient.raw(
+ this.sqlClient.schema
+ .renameTable(
+ this.sqlClient.raw('??.??', [this.schema, args.tn_old]),
+ args.tn,
+ )
+ .toQuery(),
);
/** ************** create up & down statements *************** */
diff --git a/packages/nocodb/src/filters/global-exception/global-exception.filter.ts b/packages/nocodb/src/filters/global-exception/global-exception.filter.ts
index 9c40d418ef..bb191405dc 100644
--- a/packages/nocodb/src/filters/global-exception/global-exception.filter.ts
+++ b/packages/nocodb/src/filters/global-exception/global-exception.filter.ts
@@ -43,10 +43,10 @@ export class GlobalExceptionFilter implements ExceptionFilter {
exception instanceof ThrottlerException
)
)
- this.logger.error(exception.message, exception.stack);
+ this.logError(exception, request);
if (exception instanceof ThrottlerException) {
- this.logger.log(
+ this.logger.warn(
`${exception.message}, Path : ${request.path}, Workspace ID : ${
(request as any).ncWorkspaceId
}, Project ID : ${(request as any).ncProjectId}`,
@@ -118,4 +118,8 @@ export class GlobalExceptionFilter implements ExceptionFilter {
protected captureException(exception: any, _request: any) {
this.sentryClient?.instance().captureException(exception);
}
+
+ protected logError(exception: any, _request: any) {
+ this.logger.error(exception.message, exception.stack);
+ }
}
diff --git a/packages/nocodb/src/guards/global/global.guard.ts b/packages/nocodb/src/guards/global/global.guard.ts
index c0dc6e8ce2..8a4a93365c 100644
--- a/packages/nocodb/src/guards/global/global.guard.ts
+++ b/packages/nocodb/src/guards/global/global.guard.ts
@@ -2,6 +2,7 @@ import { Injectable } from '@nestjs/common';
import { AuthGuard } from '@nestjs/passport';
import { lastValueFrom, Observable } from 'rxjs';
import { extractRolesObj } from 'nocodb-sdk';
+import type { Request } from 'express';
import type { ExecutionContext } from '@nestjs/common';
import { JwtStrategy } from '~/strategies/jwt.strategy';
@@ -75,7 +76,7 @@ export class GlobalGuard extends AuthGuard(['jwt']) {
}
private async authenticate(
- req: any,
+ req: Request,
user: any = {
roles: {
guest: true,
diff --git a/packages/nocodb/src/helpers/catchError.ts b/packages/nocodb/src/helpers/catchError.ts
index 289727f7d9..0cb8109447 100644
--- a/packages/nocodb/src/helpers/catchError.ts
+++ b/packages/nocodb/src/helpers/catchError.ts
@@ -1,3 +1,4 @@
+import type { NextFunction, Request, Response } from 'express';
import type { ErrorObject } from 'ajv';
export enum DBError {
@@ -384,9 +385,9 @@ export function extractDBError(error): {
}
export default function (
- requestHandler: (req: any, res: any, next?: any) => any,
+ requestHandler: (req: Request, res: Response, next?: NextFunction) => any,
) {
- return async function (req: any, res: any, next: any) {
+ return async function (req: Request, res: Response, next?: NextFunction) {
try {
return await requestHandler(req, res, next);
} catch (e) {
diff --git a/packages/nocodb/src/helpers/columnHelpers.ts b/packages/nocodb/src/helpers/columnHelpers.ts
index 66192845d4..898ffa1f88 100644
--- a/packages/nocodb/src/helpers/columnHelpers.ts
+++ b/packages/nocodb/src/helpers/columnHelpers.ts
@@ -35,6 +35,7 @@ export async function createHmAndBtColumn(
isSystemCol = false,
columnMeta = null,
isLinks = false,
+ colExtra?: any,
) {
// save bt column
{
@@ -59,6 +60,7 @@ export async function createHmAndBtColumn(
system: isSystemCol || parent.id === child.id,
fk_col_name: fkColName,
fk_index_name: fkColName,
+ ...(type === 'bt' ? colExtra : {}),
});
}
// save hm column
@@ -85,6 +87,7 @@ export async function createHmAndBtColumn(
fk_col_name: fkColName,
fk_index_name: fkColName,
meta,
+ ...(type === 'hm' ? colExtra : {}),
});
}
}
@@ -264,7 +267,7 @@ export async function populateRollupForLTAR({
}
export const sanitizeColumnName = (name: string) => {
- const columnName = name.replace(/\W+/g, '_').trim();
+ const columnName = name.replace(/\W/g, '_');
// if column name only contains _ then return as 'field'
if (/^_+$/.test(columnName)) return 'field';
diff --git a/packages/nocodb/src/helpers/exportImportHelpers.ts b/packages/nocodb/src/helpers/exportImportHelpers.ts
index e6cb18b00a..fcc722e4e2 100644
--- a/packages/nocodb/src/helpers/exportImportHelpers.ts
+++ b/packages/nocodb/src/helpers/exportImportHelpers.ts
@@ -46,7 +46,7 @@ export function reverseGet(map: Map, vl: string) {
return undefined;
}
-export function withoutId(obj: any) {
+export function withoutId(obj: any): any {
const { id, ...rest } = obj;
return rest;
}
diff --git a/packages/nocodb/src/helpers/extractLimitAndOffset.ts b/packages/nocodb/src/helpers/extractLimitAndOffset.ts
index ac5243152d..d995d14bc0 100644
--- a/packages/nocodb/src/helpers/extractLimitAndOffset.ts
+++ b/packages/nocodb/src/helpers/extractLimitAndOffset.ts
@@ -4,6 +4,11 @@ export const defaultLimitConfig = {
limitMax: Math.max(+process.env.DB_QUERY_LIMIT_MAX || 1000, 1),
};
+export const defaultGroupByLimitConfig = {
+ limitGroup: Math.max(+process.env.DB_QUERY_LIMIT_GROUP_BY_GROUP || 10, 1),
+ limitRecord: Math.max(+process.env.DB_QUERY_LIMIT_GROUP_BY_RECORD || 10, 1),
+};
+
export function extractLimitAndOffset(
args: {
limit?: number | string;
diff --git a/packages/nocodb/src/helpers/webhookHelpers.ts b/packages/nocodb/src/helpers/webhookHelpers.ts
index 6ce9fa32a5..ad437476aa 100644
--- a/packages/nocodb/src/helpers/webhookHelpers.ts
+++ b/packages/nocodb/src/helpers/webhookHelpers.ts
@@ -413,14 +413,14 @@ export async function invokeWebhook(
}
} catch (e) {
if (e.response) {
- logger.log({
+ logger.error({
data: e.response.data,
status: e.response.status,
url: e.response.config?.url,
message: e.message,
});
} else {
- logger.log(e.message, e.stack);
+ logger.error(e.message, e.stack);
}
if (['ERROR', 'ALL'].includes(process.env.NC_AUTOMATION_LOG_LEVEL)) {
hookLog = {
diff --git a/packages/nocodb/src/interface/Jobs.ts b/packages/nocodb/src/interface/Jobs.ts
index 93a1127af0..0086bc1eb7 100644
--- a/packages/nocodb/src/interface/Jobs.ts
+++ b/packages/nocodb/src/interface/Jobs.ts
@@ -1,12 +1,13 @@
export const JOBS_QUEUE = 'jobs';
export enum JobTypes {
- DuplicateBase = 'duplicate-source',
+ DuplicateBase = 'duplicate-base',
DuplicateModel = 'duplicate-model',
+ DuplicateColumn = 'duplicate-column',
AtImport = 'at-import',
MetaSync = 'meta-sync',
- BaseCreate = 'base-create',
- BaseDelete = 'base-delete',
+ SourceCreate = 'source-create',
+ SourceDelete = 'source-delete',
UpdateModelStat = 'update-model-stat',
UpdateWsStat = 'update-ws-stats',
UpdateSrcStat = 'update-source-stat',
@@ -26,3 +27,14 @@ export enum JobEvents {
STATUS = 'job.status',
LOG = 'job.log',
}
+
+export enum InstanceTypes {
+ PRIMARY = 'primary',
+ WORKER = 'worker',
+}
+
+export enum WorkerCommands {
+ RESUME_LOCAL = 'resumeLocal',
+ PAUSE_LOCAL = 'pauseLocal',
+ RESET = 'reset',
+}
diff --git a/packages/nocodb/src/interface/config.ts b/packages/nocodb/src/interface/config.ts
index 6b10a0382e..57498647a5 100644
--- a/packages/nocodb/src/interface/config.ts
+++ b/packages/nocodb/src/interface/config.ts
@@ -1,6 +1,9 @@
+import type { UserType } from 'nocodb-sdk';
+import type { ReqId } from 'pino-http';
import type { Handler } from 'express';
import type * as e from 'express';
import type { Knex } from 'knex';
+import type { User } from '~/models';
export interface Route {
path: string;
@@ -319,3 +322,12 @@ export interface AppConfig {
mainSubDomain: string;
dashboardPath: string;
}
+
+export interface NcRequest {
+ id?: ReqId;
+ user?: UserType | User;
+ ncWorkspaceId?: string;
+ ncProjectId?: string;
+ headers?: Record | IncomingHttpHeaders;
+ clientIp?: string;
+}
diff --git a/packages/nocodb/src/models/Column.ts b/packages/nocodb/src/models/Column.ts
index 7fcabb551d..484ae6579b 100644
--- a/packages/nocodb/src/models/Column.ts
+++ b/packages/nocodb/src/models/Column.ts
@@ -99,6 +99,7 @@ export default class Column implements ColumnType {
[key: string]: any;
fk_model_id: string;
uidt: UITypes | string;
+ view_id?: string;
} & Pick,
ncMeta = Noco.ncMeta,
) {
@@ -185,7 +186,7 @@ export default class Column implements ColumnType {
{
fk_column_id: row.id,
fk_model_id: column.fk_model_id,
- show: true,
+ show: !column.view_id,
column_order: column.column_order,
},
ncMeta,
@@ -196,6 +197,27 @@ export default class Column implements ColumnType {
`${column.fk_model_id}:default:*`,
);
+ if (column.view_id) {
+ const viewColId = await View.getViewColumnId(
+ {
+ viewId: column.view_id,
+ colId: row.id,
+ },
+ ncMeta,
+ );
+
+ if (viewColId) {
+ await View.updateColumn(
+ column.view_id,
+ viewColId,
+ {
+ show: true,
+ },
+ ncMeta,
+ );
+ }
+ }
+
return col;
}
diff --git a/packages/nocodb/src/models/Model.ts b/packages/nocodb/src/models/Model.ts
index 0a3acd11cd..ebe5ad416e 100644
--- a/packages/nocodb/src/models/Model.ts
+++ b/packages/nocodb/src/models/Model.ts
@@ -121,6 +121,7 @@ export default class Model implements TableType {
'order',
'type',
'id',
+ 'meta',
]);
insertObj.mm = !!insertObj.mm;
@@ -380,12 +381,13 @@ export default class Model implements TableType {
viewId?: string;
dbDriver: XKnex;
model?: Model;
+ extractDefaultView?: boolean;
},
ncMeta = Noco.ncMeta,
): Promise {
const model = args?.model || (await this.get(args.id, ncMeta));
- if (!args?.viewId) {
+ if (!args?.viewId && args.extractDefaultView) {
const view = await View.getDefaultView(model.id, ncMeta);
args.viewId = view.id;
}
diff --git a/packages/nocodb/src/models/Source.ts b/packages/nocodb/src/models/Source.ts
index 2ad9ba8679..3b9dd09108 100644
--- a/packages/nocodb/src/models/Source.ts
+++ b/packages/nocodb/src/models/Source.ts
@@ -80,15 +80,15 @@ export default class Source implements SourceType {
insertObj,
);
+ // call before reorder to update cache
+ const returnBase = await this.get(id, false, ncMeta);
+
await NocoCache.appendToList(
CacheScope.BASE,
[source.baseId],
`${CacheScope.BASE}:${id}`,
);
- // call before reorder to update cache
- const returnBase = await this.get(id, false, ncMeta);
-
await this.reorderBases(source.baseId);
return returnBase;
@@ -101,6 +101,7 @@ export default class Source implements SourceType {
skipReorder?: boolean;
meta?: any;
deleted?: boolean;
+ fk_sql_executor_id?: string;
},
ncMeta = Noco.ncMeta,
) {
@@ -108,12 +109,6 @@ export default class Source implements SourceType {
if (!oldBase) NcError.badRequest('Wrong source id!');
- await NocoCache.deepDel(
- CacheScope.BASE,
- `${CacheScope.BASE}:${sourceId}`,
- CacheDelDirection.CHILD_TO_PARENT,
- );
-
const updateObj = extractProps(source, [
'alias',
'config',
@@ -125,6 +120,7 @@ export default class Source implements SourceType {
'enabled',
'meta',
'deleted',
+ 'fk_sql_executor_id',
]);
if (updateObj.config) {
@@ -151,17 +147,14 @@ export default class Source implements SourceType {
oldBase.id,
);
- await NocoCache.appendToList(
- CacheScope.BASE,
- [source.baseId],
- `${CacheScope.BASE}:${oldBase.id}`,
- );
+ await NocoCache.del(`${CacheScope.BASE}:${sourceId}`);
// call before reorder to update cache
const returnBase = await this.get(oldBase.id, false, ncMeta);
- if (!source.skipReorder)
+ if (!source.skipReorder && source.order && source.order !== oldBase.order) {
await this.reorderBases(source.baseId, returnBase.id, ncMeta);
+ }
return returnBase;
}
@@ -312,12 +305,6 @@ export default class Source implements SourceType {
// update order for sources
for (const [i, b] of Object.entries(sources)) {
- await NocoCache.deepDel(
- CacheScope.BASE,
- `${CacheScope.BASE}:${b.id}`,
- CacheDelDirection.CHILD_TO_PARENT,
- );
-
b.order = parseInt(i) + 1;
await ncMeta.metaUpdate(
@@ -330,12 +317,6 @@ export default class Source implements SourceType {
b.id,
);
- await NocoCache.appendToList(
- CacheScope.BASE,
- [b.base_id],
- `${CacheScope.BASE}:${b.id}`,
- );
-
await NocoCache.set(`${CacheScope.BASE}:${b.id}`, b);
}
}
diff --git a/packages/nocodb/src/models/View.ts b/packages/nocodb/src/models/View.ts
index 521968b815..51e06faeef 100644
--- a/packages/nocodb/src/models/View.ts
+++ b/packages/nocodb/src/models/View.ts
@@ -680,6 +680,64 @@ export default class View implements ViewType {
return (this.columns = await View.getColumns(this.id, ncMeta));
}
+ static async getViewColumnId(
+ {
+ viewId,
+ colId,
+ }: {
+ viewId: string;
+ colId: string;
+ },
+ ncMeta = Noco.ncMeta,
+ ) {
+ const view = await this.get(viewId);
+ if (!view) return undefined;
+
+ let tableName;
+ let cacheScope;
+ switch (view.type) {
+ case ViewTypes.GRID:
+ tableName = MetaTable.GRID_VIEW_COLUMNS;
+ cacheScope = CacheScope.GRID_VIEW_COLUMN;
+
+ break;
+ case ViewTypes.GALLERY:
+ tableName = MetaTable.GALLERY_VIEW_COLUMNS;
+ cacheScope = CacheScope.GALLERY_VIEW_COLUMN;
+
+ break;
+ case ViewTypes.MAP:
+ tableName = MetaTable.MAP_VIEW_COLUMNS;
+ cacheScope = CacheScope.MAP_VIEW_COLUMN;
+
+ break;
+ case ViewTypes.FORM:
+ tableName = MetaTable.FORM_VIEW_COLUMNS;
+ cacheScope = CacheScope.FORM_VIEW_COLUMN;
+
+ break;
+ case ViewTypes.KANBAN:
+ tableName = MetaTable.KANBAN_VIEW_COLUMNS;
+ cacheScope = CacheScope.KANBAN_VIEW_COLUMN;
+
+ break;
+ }
+
+ const key = `${cacheScope}:viewColumnId:${colId}`;
+ const o = await NocoCache.get(key, CacheGetType.TYPE_STRING);
+ if (o) return o;
+
+ const viewColumn = await ncMeta.metaGet2(null, null, tableName, {
+ fk_view_id: viewId,
+ fk_column_id: colId,
+ });
+ if (!viewColumn) return undefined;
+
+ await NocoCache.set(key, viewColumn.id);
+
+ return viewColumn.id;
+ }
+
static async updateColumn(
viewId: string,
colId: string,
diff --git a/packages/nocodb/src/modules/jobs/fallback/fallback-queue.service.ts b/packages/nocodb/src/modules/jobs/fallback/fallback-queue.service.ts
index b921bf3415..6ffd6fe796 100644
--- a/packages/nocodb/src/modules/jobs/fallback/fallback-queue.service.ts
+++ b/packages/nocodb/src/modules/jobs/fallback/fallback-queue.service.ts
@@ -68,6 +68,10 @@ export class QueueService {
this: this.duplicateProcessor,
fn: this.duplicateProcessor.duplicateModel,
},
+ [JobTypes.DuplicateColumn]: {
+ this: this.duplicateProcessor,
+ fn: this.duplicateProcessor.duplicateColumn,
+ },
[JobTypes.AtImport]: {
this: this.atImportProcessor,
fn: this.atImportProcessor.job,
@@ -76,11 +80,11 @@ export class QueueService {
this: this.metaSyncProcessor,
fn: this.metaSyncProcessor.job,
},
- [JobTypes.BaseCreate]: {
+ [JobTypes.SourceCreate]: {
this: this.sourceCreateProcessor,
fn: this.sourceCreateProcessor.job,
},
- [JobTypes.BaseDelete]: {
+ [JobTypes.SourceDelete]: {
this: this.sourceDeleteProcessor,
fn: this.sourceDeleteProcessor.job,
},
diff --git a/packages/nocodb/src/modules/jobs/fallback/jobs.service.ts b/packages/nocodb/src/modules/jobs/fallback/jobs.service.ts
index 978f3d3d03..594e806a8e 100644
--- a/packages/nocodb/src/modules/jobs/fallback/jobs.service.ts
+++ b/packages/nocodb/src/modules/jobs/fallback/jobs.service.ts
@@ -48,4 +48,12 @@ export class JobsService {
return job;
}
+
+ async resumeQueue() {
+ await this.fallbackQueueService.queue.start();
+ }
+
+ async pauseQueue() {
+ await this.fallbackQueueService.queue.pause();
+ }
}
diff --git a/packages/nocodb/src/modules/jobs/jobs.controller.ts b/packages/nocodb/src/modules/jobs/jobs.controller.ts
index f5a2cdeb4c..7d371f9821 100644
--- a/packages/nocodb/src/modules/jobs/jobs.controller.ts
+++ b/packages/nocodb/src/modules/jobs/jobs.controller.ts
@@ -4,14 +4,16 @@ import {
HttpCode,
Inject,
Post,
- Request,
- Response,
+ Req,
+ Res,
UseGuards,
} from '@nestjs/common';
+import { Request } from 'express';
import { OnEvent } from '@nestjs/event-emitter';
import { customAlphabet } from 'nanoid';
import { ModuleRef } from '@nestjs/core';
import { JobsRedisService } from './redis/jobs-redis.service';
+import type { Response } from 'express';
import type { OnModuleInit } from '@nestjs/common';
import { JobStatus } from '~/interface/Jobs';
import { JobEvents } from '~/interface/Jobs';
@@ -46,8 +48,8 @@ export class JobsController implements OnModuleInit {
@Post('/jobs/listen')
@HttpCode(200)
async listen(
- @Response() res,
- @Request() req,
+ @Res() res: Response & { resId?: string },
+ @Req() req: Request,
@Body() body: { _mid: number; data: { id: string } },
) {
const { _mid = 0, data } = body;
@@ -134,7 +136,7 @@ export class JobsController implements OnModuleInit {
res.on('close', () => {
if (jobId && this.jobRooms[jobId]?.listeners) {
this.jobRooms[jobId].listeners = this.jobRooms[jobId].listeners.filter(
- (r) => r.resId !== res.resId,
+ (r) => r.resId !== (res as any).resId,
);
}
});
diff --git a/packages/nocodb/src/modules/jobs/jobs/at-import/at-import.controller.ts b/packages/nocodb/src/modules/jobs/jobs/at-import/at-import.controller.ts
index 43ca11e6aa..129a75036a 100644
--- a/packages/nocodb/src/modules/jobs/jobs/at-import/at-import.controller.ts
+++ b/packages/nocodb/src/modules/jobs/jobs/at-import/at-import.controller.ts
@@ -3,9 +3,10 @@ import {
HttpCode,
Inject,
Post,
- Request,
+ Req,
UseGuards,
} from '@nestjs/common';
+import { Request } from 'express';
import { GlobalGuard } from '~/guards/global/global.guard';
import { Acl } from '~/middlewares/extract-ids/extract-ids.middleware';
import { SyncSource } from '~/models';
@@ -24,7 +25,7 @@ export class AtImportController {
])
@Acl('airtableImport')
@HttpCode(200)
- async triggerSync(@Request() req) {
+ async triggerSync(@Req() req: Request) {
const jobs = await this.jobsService.jobList();
const fnd = jobs.find((j) => j.data.syncId === req.params.syncId);
@@ -53,6 +54,11 @@ export class AtImportController {
authToken: '',
baseURL,
user: user,
+ req: {
+ user: req.user,
+ clientIp: req.clientIp,
+ headers: req.headers,
+ },
});
return { id: job.id };
@@ -64,7 +70,7 @@ export class AtImportController {
])
@Acl('airtableImport')
@HttpCode(200)
- async abortImport(@Request() _) {
+ async abortImport() {
return {};
}
}
diff --git a/packages/nocodb/src/modules/jobs/jobs/at-import/at-import.processor.ts b/packages/nocodb/src/modules/jobs/jobs/at-import/at-import.processor.ts
index e723a08b60..b4a96b1ad1 100644
--- a/packages/nocodb/src/modules/jobs/jobs/at-import/at-import.processor.ts
+++ b/packages/nocodb/src/modules/jobs/jobs/at-import/at-import.processor.ts
@@ -680,6 +680,7 @@ export class AtImportProcessor {
viewId: view.list[0].id,
view: { title: aTbl_grid.name },
user: syncDB.user,
+ req: {},
});
recordPerfStats(_perfStart, 'dbView.update');
@@ -1527,6 +1528,7 @@ export class AtImportProcessor {
size: attachment.size,
mimetype: attachment.type,
})),
+ req: {},
});
} catch (e) {
console.log(e);
@@ -1569,6 +1571,7 @@ export class AtImportProcessor {
ncCreatedProjectSchema = await this.basesService.baseCreate({
base: { title: projName },
user: { id: syncDB.user.id },
+ req: {},
});
recordPerfStats(_perfStart, 'base.create');
@@ -1619,6 +1622,7 @@ export class AtImportProcessor {
title: viewName,
},
user: syncDB.user,
+ req: {},
});
recordPerfStats(_perfStart, 'dbView.galleryCreate');
@@ -1685,6 +1689,7 @@ export class AtImportProcessor {
tableId: tblId,
body: formData,
user: syncDB.user,
+ req: {},
});
recordPerfStats(_perfStart, 'dbView.formCreate');
@@ -1764,6 +1769,7 @@ export class AtImportProcessor {
grid: {
title: viewName,
},
+ req: {},
});
recordPerfStats(_perfStart, 'dbView.gridCreate');
@@ -2140,6 +2146,7 @@ export class AtImportProcessor {
viewId: viewId,
filter: ncFilters[i],
user: syncDB.user,
+ req: {},
});
recordPerfStats(_perfStart, 'dbTableFilter.create');
@@ -2218,6 +2225,7 @@ export class AtImportProcessor {
group_by_sort:
ncGroup[i].direction === 'ascending' ? 'asc' : 'desc',
},
+ req: {},
});
} catch (e) {
// ignore
@@ -2239,6 +2247,7 @@ export class AtImportProcessor {
fk_column_id: columnId,
direction: s.sortSet[i].ascending ? 'asc' : 'desc',
},
+ req: {},
});
recordPerfStats(_perfStart, 'dbTableSort.create');
}
@@ -2303,6 +2312,7 @@ export class AtImportProcessor {
show: false,
order: j + 1 + c.length,
},
+ req: {},
});
recordPerfStats(_perfStart, 'dbViewColumn.update');
}
@@ -2330,6 +2340,7 @@ export class AtImportProcessor {
await this.formColumnsService.columnUpdate({
formViewColumnId: ncViewColumnId,
formViewColumn: formData,
+ req: {},
});
recordPerfStats(_perfStart, 'dbView.formColumnUpdate');
}
@@ -2339,6 +2350,7 @@ export class AtImportProcessor {
viewId: viewId,
columnId: ncViewColumnId,
column: configData,
+ req: {},
});
recordPerfStats(_perfStart, 'dbViewColumn.update');
}
diff --git a/packages/nocodb/src/modules/jobs/jobs/export-import/duplicate.controller.ts b/packages/nocodb/src/modules/jobs/jobs/export-import/duplicate.controller.ts
index 51da20e28a..863989c980 100644
--- a/packages/nocodb/src/modules/jobs/jobs/export-import/duplicate.controller.ts
+++ b/packages/nocodb/src/modules/jobs/jobs/export-import/duplicate.controller.ts
@@ -5,14 +5,15 @@ import {
Inject,
Param,
Post,
- Request,
+ Req,
UseGuards,
} from '@nestjs/common';
+import { Request } from 'express';
import { ProjectStatus } from 'nocodb-sdk';
import { GlobalGuard } from '~/guards/global/global.guard';
import { Acl } from '~/middlewares/extract-ids/extract-ids.middleware';
import { BasesService } from '~/services/bases.service';
-import { Base, Model, Source } from '~/models';
+import { Base, Column, Model, Source } from '~/models';
import { generateUniqueName } from '~/helpers/exportImportHelpers';
import { JobTypes } from '~/interface/Jobs';
import { MetaApiLimiterGuard } from '~/guards/meta-api-limiter.guard';
@@ -34,7 +35,7 @@ export class DuplicateController {
scope: 'org',
})
public async duplicateSharedBase(
- @Request() req,
+ @Req() req: Request,
@Param('workspaceId') _workspaceId: string,
@Param('sharedBaseId') sharedBaseId: string,
@Body()
@@ -72,6 +73,7 @@ export class DuplicateController {
...(body.base || {}),
},
user: { id: req.user.id },
+ req,
});
const job = await this.jobsService.add(JobTypes.DuplicateBase, {
@@ -86,6 +88,7 @@ export class DuplicateController {
req: {
user: req.user,
clientIp: req.clientIp,
+ headers: req.headers,
},
});
@@ -99,7 +102,7 @@ export class DuplicateController {
@HttpCode(200)
@Acl('duplicateBase')
async duplicateBase(
- @Request() req,
+ @Req() req: Request,
@Param('baseId') baseId: string,
@Param('sourceId') sourceId?: string,
@Body()
@@ -141,6 +144,7 @@ export class DuplicateController {
...(body.base || {}),
},
user: { id: req.user.id },
+ req,
});
const job = await this.jobsService.add(JobTypes.DuplicateBase, {
@@ -151,6 +155,7 @@ export class DuplicateController {
req: {
user: req.user,
clientIp: req.clientIp,
+ headers: req.headers,
},
});
@@ -164,7 +169,7 @@ export class DuplicateController {
@HttpCode(200)
@Acl('duplicateModel')
async duplicateModel(
- @Request() req,
+ @Req() req: Request,
@Param('baseId') baseId: string,
@Param('modelId') modelId?: string,
@Body()
@@ -206,6 +211,63 @@ export class DuplicateController {
req: {
user: req.user,
clientIp: req.clientIp,
+ headers: req.headers,
+ },
+ });
+
+ return { id: job.id };
+ }
+
+ @Post([
+ '/api/v1/db/meta/duplicate/:baseId/column/:columnId',
+ '/api/v2/meta/duplicate/:baseId/column/:columnId',
+ ])
+ @HttpCode(200)
+ @Acl('duplicateColumn')
+ async duplicateColumn(
+ @Req() req: Request,
+ @Param('baseId') baseId: string,
+ @Param('columnId') columnId?: string,
+ @Body()
+ body?: {
+ options?: {
+ excludeData?: boolean;
+ };
+ extra?: any;
+ },
+ ) {
+ const base = await Base.get(baseId);
+
+ if (!base) {
+ throw new Error(`Base not found for id '${baseId}'`);
+ }
+
+ const column = await Column.get({
+ source_id: base.id,
+ colId: columnId,
+ });
+
+ if (!column) {
+ throw new Error(`Column not found!`);
+ }
+
+ const model = await Model.get(column.fk_model_id);
+
+ if (!model) {
+ throw new Error(`Model not found!`);
+ }
+
+ const job = await this.jobsService.add(JobTypes.DuplicateColumn, {
+ baseId: base.id,
+ sourceId: column.source_id,
+ modelId: model.id,
+ columnId: column.id,
+ options: body.options || {},
+ extra: body.extra || {},
+ req: {
+ user: req.user,
+ clientIp: req.clientIp,
+ headers: req.headers,
},
});
diff --git a/packages/nocodb/src/modules/jobs/jobs/export-import/duplicate.processor.ts b/packages/nocodb/src/modules/jobs/jobs/export-import/duplicate.processor.ts
index dc7898facd..34c0da3e59 100644
--- a/packages/nocodb/src/modules/jobs/jobs/export-import/duplicate.processor.ts
+++ b/packages/nocodb/src/modules/jobs/jobs/export-import/duplicate.processor.ts
@@ -6,8 +6,12 @@ import debug from 'debug';
import { isLinksOrLTAR } from 'nocodb-sdk';
import { Base, Column, Model, Source } from '~/models';
import { BasesService } from '~/services/bases.service';
-import { findWithIdentifier } from '~/helpers/exportImportHelpers';
+import {
+ findWithIdentifier,
+ generateUniqueName,
+} from '~/helpers/exportImportHelpers';
import { BulkDataAliasService } from '~/services/bulk-data-alias.service';
+import { ColumnsService } from '~/services/columns.service';
import { JOBS_QUEUE, JobTypes } from '~/interface/Jobs';
import { elapsedTime, initTime } from '~/modules/jobs/helpers';
import { ExportService } from '~/modules/jobs/jobs/export-import/export.service';
@@ -22,6 +26,7 @@ export class DuplicateProcessor {
private readonly importService: ImportService,
private readonly projectsService: BasesService,
private readonly bulkDataService: BulkDataAliasService,
+ private readonly columnsService: ColumnsService,
) {}
@Process(JobTypes.DuplicateBase)
@@ -104,12 +109,14 @@ export class DuplicateProcessor {
status: null,
},
user: req.user,
+ req,
});
} catch (e) {
if (dupProject?.id) {
await this.projectsService.baseSoftDelete({
baseId: dupProject.id,
user: req.user,
+ req,
});
}
throw e;
@@ -225,6 +232,164 @@ export class DuplicateProcessor {
return await Model.get(findWithIdentifier(idMap, sourceModel.id));
}
+ @Process(JobTypes.DuplicateColumn)
+ async duplicateColumn(job: Job) {
+ this.debugLog(`job started for ${job.id} (${JobTypes.DuplicateColumn})`);
+
+ const hrTime = initTime();
+
+ const { baseId, sourceId, columnId, extra, req, options } = job.data;
+
+ const excludeData = options?.excludeData || false;
+
+ const base = await Base.get(baseId);
+
+ const sourceColumn = await Column.get({
+ source_id: sourceId,
+ colId: columnId,
+ });
+
+ const user = (req as any).user;
+
+ const source = await Source.get(sourceColumn.source_id);
+
+ const models = (await source.getModels()).filter(
+ (m) => !m.mm && m.type === 'table',
+ );
+
+ const sourceModel = models.find((m) => m.id === sourceColumn.fk_model_id);
+
+ const columns = await sourceModel.getColumns();
+
+ const title = generateUniqueName(
+ `${sourceColumn.title} copy`,
+ columns.map((p) => p.title),
+ );
+
+ const relatedModelIds = [sourceColumn]
+ .filter((col) => isLinksOrLTAR(col))
+ .map((col) => col.colOptions.fk_related_model_id)
+ .filter((id) => id);
+
+ const relatedModels = models.filter((m) => relatedModelIds.includes(m.id));
+
+ const exportedModel = (
+ await this.exportService.serializeModels({
+ modelIds: [sourceModel.id],
+ excludeData,
+ excludeHooks: true,
+ excludeViews: true,
+ })
+ )[0];
+
+ elapsedTime(
+ hrTime,
+ `serialize model schema for ${sourceModel.id}`,
+ 'duplicateColumn',
+ );
+
+ if (!exportedModel) {
+ throw new Error(`Export failed for model '${sourceModel.id}'`);
+ }
+
+ exportedModel.model.columns = exportedModel.model.columns.filter((c) =>
+ c.id.includes(columnId),
+ );
+
+ if (exportedModel.model.columns.length !== 1) {
+ throw new Error(`There was an error duplicating column!`);
+ }
+
+ const replacedColumn = exportedModel.model.columns.find((c) =>
+ c.id.includes(columnId),
+ );
+
+ // save old default value
+ const oldCdf = replacedColumn.cdf;
+
+ replacedColumn.title = title;
+ replacedColumn.column_name = title.toLowerCase().replace(/ /g, '_');
+
+ // remove default value to avoid filling existing empty rows
+ replacedColumn.cdf = null;
+
+ Object.assign(replacedColumn, extra);
+
+ const idMap = await this.importService.importModels({
+ baseId,
+ sourceId: source.id,
+ data: [exportedModel],
+ user,
+ req,
+ externalModels: relatedModels,
+ existingModel: sourceModel,
+ });
+
+ elapsedTime(hrTime, 'import model schema', 'duplicateColumn');
+
+ if (!idMap) {
+ throw new Error(`Import failed for model '${sourceModel.id}'`);
+ }
+
+ if (!excludeData) {
+ const fields: Record = {};
+
+ fields[sourceModel.id] = [sourceModel.primaryKey.id];
+ fields[sourceModel.id].push(columnId);
+
+ for (const md of relatedModels) {
+ const bts = md.columns
+ .filter(
+ (c) =>
+ isLinksOrLTAR(c) &&
+ c.colOptions.type === 'bt' &&
+ c.colOptions.fk_related_model_id === sourceModel.id,
+ )
+ .map((c) => c.id);
+
+ if (bts.length > 0) {
+ fields[md.id] = [md.primaryKey.id];
+ fields[md.id].push(...bts);
+ }
+ }
+
+ await this.importModelsData({
+ idMap,
+ sourceProject: base,
+ sourceModels: [],
+ destProject: base,
+ destBase: source,
+ hrTime,
+ modelFieldIds: fields,
+ externalModels: [sourceModel, ...relatedModels],
+ });
+
+ elapsedTime(hrTime, 'import model data', 'duplicateColumn');
+ }
+
+ const destColumn = await Column.get({
+ source_id: base.id,
+ colId: findWithIdentifier(idMap, sourceColumn.id),
+ });
+
+ // update cdf
+ await this.columnsService.columnUpdate({
+ columnId: findWithIdentifier(idMap, sourceColumn.id),
+ column: {
+ ...destColumn,
+ cdf: oldCdf,
+ },
+ user: req.user,
+ });
+
+ this.debugLog(`job completed for ${job.id} (${JobTypes.DuplicateModel})`);
+
+ return await Column.get({
+ source_id: base.id,
+ colId: findWithIdentifier(idMap, sourceColumn.id),
+ });
+ }
+
async importModelsData(param: {
idMap: Map;
sourceProject: Base;
@@ -393,13 +558,17 @@ export class DuplicateProcessor {
if (chunk.length > 1000) {
parser.pause();
try {
- await this.bulkDataService.bulkDataUpdate({
- baseName: destProject.id,
- tableName: model.id,
- body: chunk,
- cookie: null,
- raw: true,
- });
+ // remove empty rows (only pk is present)
+ chunk = chunk.filter((r) => Object.keys(r).length > 1);
+ if (chunk.length > 0) {
+ await this.bulkDataService.bulkDataUpdate({
+ baseName: destProject.id,
+ tableName: model.id,
+ body: chunk,
+ cookie: null,
+ raw: true,
+ });
+ }
} catch (e) {
this.debugLog(e);
}
@@ -412,13 +581,17 @@ export class DuplicateProcessor {
complete: async () => {
if (chunk.length > 0) {
try {
- await this.bulkDataService.bulkDataUpdate({
- baseName: destProject.id,
- tableName: model.id,
- body: chunk,
- cookie: null,
- raw: true,
- });
+ // remove empty rows (only pk is present)
+ chunk = chunk.filter((r) => Object.keys(r).length > 1);
+ if (chunk.length > 0) {
+ await this.bulkDataService.bulkDataUpdate({
+ baseName: destProject.id,
+ tableName: model.id,
+ body: chunk,
+ cookie: null,
+ raw: true,
+ });
+ }
} catch (e) {
this.debugLog(e);
}
@@ -431,6 +604,14 @@ export class DuplicateProcessor {
if (error) throw error;
+ handledLinks = await this.importService.importLinkFromCsvStream({
+ idMap,
+ linkStream,
+ destProject,
+ destBase,
+ handledLinks,
+ });
+
elapsedTime(
hrTime,
`map existing links to ${model.title}`,
diff --git a/packages/nocodb/src/modules/jobs/jobs/export-import/export.service.ts b/packages/nocodb/src/modules/jobs/jobs/export-import/export.service.ts
index 28a49df122..c34ae99cf0 100644
--- a/packages/nocodb/src/modules/jobs/jobs/export-import/export.service.ts
+++ b/packages/nocodb/src/modules/jobs/jobs/export-import/export.service.ts
@@ -118,6 +118,8 @@ export class ExportService {
case 'fk_relation_column_id':
case 'fk_lookup_column_id':
case 'fk_rollup_column_id':
+ case 'fk_qr_value_column_id':
+ case 'fk_barcode_value_column_id':
column.colOptions[k] = idMap.get(v as string);
break;
case 'options':
@@ -141,6 +143,19 @@ export class ExportService {
}
}
}
+
+ // pg default value fix
+ if (source.type === 'pg') {
+ if (column.cdf) {
+ // check if column.cdf has unmatched single quotes
+ const matches = column.cdf.match(/'/g);
+ if (matches && matches.length % 2 !== 0) {
+ // if so remove after last single quote
+ const lastQuoteIndex = column.cdf.lastIndexOf("'");
+ column.cdf = column.cdf.substring(0, lastQuoteIndex);
+ }
+ }
+ }
}
for (const view of model.views) {
@@ -393,9 +408,13 @@ export class ExportService {
.map((c) => c.title)
.join(',');
- const mmColumns = model.columns.filter(
- (col) => isLinksOrLTAR(col) && col.colOptions?.type === 'mm',
- );
+ const mmColumns = param._fieldIds
+ ? model.columns
+ .filter((c) => param._fieldIds?.includes(c.id))
+ .filter((col) => isLinksOrLTAR(col) && col.colOptions?.type === 'mm')
+ : model.columns.filter(
+ (col) => isLinksOrLTAR(col) && col.colOptions?.type === 'mm',
+ );
const hasLink = mmColumns.length > 0;
@@ -562,6 +581,7 @@ export class ExportService {
view,
query: { limit, offset, fields },
baseModel,
+ ignoreViewFilterAndSort: true,
})
.then((result) => {
try {
@@ -610,6 +630,7 @@ export class ExportService {
view,
query: { limit, offset, fields },
baseModel,
+ ignoreViewFilterAndSort: true,
})
.then((result) => {
try {
diff --git a/packages/nocodb/src/modules/jobs/jobs/export-import/import.service.ts b/packages/nocodb/src/modules/jobs/jobs/export-import/import.service.ts
index 43d34032e8..6d62efa5cc 100644
--- a/packages/nocodb/src/modules/jobs/jobs/export-import/import.service.ts
+++ b/packages/nocodb/src/modules/jobs/jobs/export-import/import.service.ts
@@ -2,11 +2,12 @@ import { UITypes, ViewTypes } from 'nocodb-sdk';
import { Injectable } from '@nestjs/common';
import papaparse from 'papaparse';
import debug from 'debug';
-import { isLinksOrLTAR } from 'nocodb-sdk';
+import { isLinksOrLTAR, isVirtualCol } from 'nocodb-sdk';
import { elapsedTime, initTime } from '../../helpers';
import type { Readable } from 'stream';
import type { UserType, ViewCreateReqType } from 'nocodb-sdk';
import type { LinkToAnotherRecordColumn, User, View } from '~/models';
+import type { NcRequest } from '~/interface/config';
import {
findWithIdentifier,
generateUniqueName,
@@ -64,8 +65,9 @@ export class ImportService {
data:
| { models: { model: any; views: any[]; hooks?: any[] }[] }
| { model: any; views: any[]; hooks?: any[] }[];
- req: any;
+ req: NcRequest;
externalModels?: Model[];
+ existingModel?: Model;
}) {
const hrTime = initTime();
@@ -92,6 +94,10 @@ export class ImportService {
param.data = Array.isArray(param.data) ? param.data : param.data.models;
+ // allow existing model to be linked
+ if (param.existingModel)
+ param.externalModels = [param.existingModel, ...param.externalModels];
+
// allow existing models to be linked
if (param.externalModels) {
for (const model of param.externalModels) {
@@ -126,52 +132,73 @@ export class ImportService {
const modelData = data.model;
const reducedColumnSet = modelData.columns.filter(
- (a) =>
- !isLinksOrLTAR(a) &&
- a.uidt !== UITypes.Lookup &&
- a.uidt !== UITypes.Rollup &&
- a.uidt !== UITypes.Formula &&
- a.uidt !== UITypes.ForeignKey,
+ (a) => !isVirtualCol(a) && a.uidt !== UITypes.ForeignKey,
);
// create table with static columns
- const table = await this.tablesService.tableCreate({
- baseId: base.id,
- sourceId: source.id,
- user: param.user,
- table: withoutId({
- ...modelData,
- columns: reducedColumnSet.map((a) => withoutId(a)),
- }),
- });
+ const table =
+ param.existingModel ||
+ (await this.tablesService.tableCreate({
+ baseId: base.id,
+ sourceId: source.id,
+ user: param.user,
+ table: withoutId({
+ ...modelData,
+ columns: reducedColumnSet.map((a) => withoutId(a)),
+ }),
+ }));
idMap.set(modelData.id, table.id);
- // map column id's with new created column id's
- for (const col of table.columns) {
- const colRef = modelData.columns.find(
- (a) => sanitizeColumnName(a.column_name) === col.column_name,
- );
- idMap.set(colRef.id, col.id);
-
- // setval for auto increment column in pg
- if (source.type === 'pg') {
- if (modelData.pgSerialLastVal) {
- if (col.ai) {
- const baseModel = await Model.getBaseModelSQL({
- id: table.id,
- viewId: null,
- dbDriver: await NcConnectionMgrv2.get(source),
- });
- const sqlClient = await NcConnectionMgrv2.getSqlClient(source);
- await sqlClient.raw(
- `SELECT setval(pg_get_serial_sequence('??', ?), ?);`,
- [
- baseModel.getTnPath(table.table_name),
- col.column_name,
- modelData.pgSerialLastVal,
- ],
- );
+ if (param.existingModel) {
+ if (reducedColumnSet.length) {
+ for (const col of reducedColumnSet) {
+ const freshModelData = await this.columnsService.columnAdd({
+ tableId: getIdOrExternalId(getParentIdentifier(col.id)),
+ column: withoutId({
+ ...col,
+ }) as any,
+ req: param.req,
+ user: param.user,
+ });
+
+ for (const nColumn of freshModelData.columns) {
+ if (nColumn.title === col.title) {
+ idMap.set(col.id, nColumn.id);
+ break;
+ }
+ }
+ }
+ }
+ } else {
+ // map column id's with new created column id's
+ for (const col of table.columns) {
+ const colRef = modelData.columns.find(
+ (a) =>
+ a.column_name &&
+ sanitizeColumnName(a.column_name) === col.column_name,
+ );
+ idMap.set(colRef.id, col.id);
+
+ // setval for auto increment column in pg
+ if (source.type === 'pg') {
+ if (modelData.pgSerialLastVal) {
+ if (col.ai) {
+ const baseModel = await Model.getBaseModelSQL({
+ id: table.id,
+ viewId: null,
+ dbDriver: await NcConnectionMgrv2.get(source),
+ });
+ const sqlClient = await NcConnectionMgrv2.getSqlClient(source);
+ await sqlClient.raw(
+ `SELECT setval(pg_get_serial_sequence('??', ?), ?);`,
+ [
+ baseModel.getTnPath(table.table_name),
+ col.column_name,
+ modelData.pgSerialLastVal,
+ ],
+ );
+ }
}
}
}
@@ -391,7 +418,7 @@ export class ImportService {
ur: colOptions.ur,
dr: colOptions.dr,
},
- }),
+ }) as any,
req: param.req,
user: param.user,
});
@@ -508,7 +535,7 @@ export class ImportService {
ur: colOptions.ur,
dr: colOptions.dr,
},
- }),
+ }) as any,
req: param.req,
user: param.user,
});
@@ -630,7 +657,7 @@ export class ImportService {
ur: colOptions.ur,
dr: colOptions.dr,
},
- }),
+ }) as any,
req: param.req,
user: param.user,
});
@@ -737,7 +764,9 @@ export class ImportService {
(a) =>
a.uidt === UITypes.Lookup ||
a.uidt === UITypes.Rollup ||
- a.uidt === UITypes.Formula,
+ a.uidt === UITypes.Formula ||
+ a.uidt === UITypes.QrCode ||
+ a.uidt === UITypes.Barcode,
),
);
}
@@ -763,6 +792,12 @@ export class ImportService {
);
}
}
+ if (col.colOptions?.fk_qr_value_column_id) {
+ relatedColIds.push(col.colOptions.fk_qr_value_column_id);
+ }
+ if (col.colOptions?.fk_barcode_value_column_id) {
+ relatedColIds.push(col.colOptions.fk_barcode_value_column_id);
+ }
// find the last related column in the sorted array
let fnd = undefined;
@@ -801,7 +836,7 @@ export class ImportService {
colOptions.fk_relation_column_id,
),
},
- }),
+ }) as any,
req: param.req,
user: param.user,
});
@@ -827,7 +862,7 @@ export class ImportService {
),
rollup_function: colOptions.rollup_function,
},
- }),
+ }) as any,
req: param.req,
user: param.user,
});
@@ -846,7 +881,50 @@ export class ImportService {
...{
formula_raw: colOptions.formula_raw,
},
- }),
+ }) as any,
+ req: param.req,
+ user: param.user,
+ });
+
+ for (const nColumn of freshModelData.columns) {
+ if (nColumn.title === col.title) {
+ idMap.set(col.id, nColumn.id);
+ break;
+ }
+ }
+ } else if (col.uidt === UITypes.QrCode) {
+ const freshModelData = await this.columnsService.columnAdd({
+ tableId: getIdOrExternalId(getParentIdentifier(col.id)),
+ column: withoutId({
+ ...flatCol,
+ ...{
+ fk_qr_value_column_id: getIdOrExternalId(
+ colOptions.fk_qr_value_column_id,
+ ),
+ },
+ }) as any,
+ req: param.req,
+ user: param.user,
+ });
+
+ for (const nColumn of freshModelData.columns) {
+ if (nColumn.title === col.title) {
+ idMap.set(col.id, nColumn.id);
+ break;
+ }
+ }
+ } else if (col.uidt === UITypes.Barcode) {
+ flatCol.validate = null;
+ const freshModelData = await this.columnsService.columnAdd({
+ tableId: getIdOrExternalId(getParentIdentifier(col.id)),
+ column: withoutId({
+ ...flatCol,
+ ...{
+ fk_barcode_value_column_id: getIdOrExternalId(
+ colOptions.fk_barcode_value_column_id,
+ ),
+ },
+ }) as any,
req: param.req,
user: param.user,
});
@@ -864,6 +942,8 @@ export class ImportService {
// create views
for (const data of param.data) {
+ if (param.existingModel) break;
+
const modelData = data.model;
const viewsData = data.views;
@@ -883,6 +963,7 @@ export class ImportService {
viewData,
table.views,
param.user,
+ param.req,
);
if (!vw) continue;
@@ -901,6 +982,7 @@ export class ImportService {
fk_parent_id: getIdOrExternalId(fl.fk_parent_id),
}),
user: param.user,
+ req: param.req,
});
idMap.set(fl.id, fg.id);
@@ -914,6 +996,7 @@ export class ImportService {
...sr,
fk_column_id: getIdOrExternalId(sr.fk_column_id),
}),
+ req: param.req,
});
}
@@ -934,6 +1017,7 @@ export class ImportService {
show: fcl.show,
order: fcl.order,
},
+ req: param.req,
});
}
@@ -950,6 +1034,7 @@ export class ImportService {
grid: {
...withoutNull(rest),
},
+ req: param.req,
});
}
break;
@@ -965,6 +1050,7 @@ export class ImportService {
formViewColumn: {
...withoutNull(rest),
},
+ req: param.req,
});
}
break;
@@ -981,6 +1067,7 @@ export class ImportService {
order: view.order,
},
user: param.user,
+ req: param.req,
});
}
}
@@ -990,6 +1077,7 @@ export class ImportService {
// create hooks
for (const data of param.data) {
+ if (param.existingModel) break;
if (!data?.hooks) break;
const modelData = data.model;
const hookData = data.hooks;
@@ -1007,7 +1095,8 @@ export class ImportService {
tableId: table.id,
hook: {
...hookData,
- },
+ } as any,
+ req: param.req,
});
if (!hk) continue;
@@ -1024,6 +1113,7 @@ export class ImportService {
fk_parent_id: getIdOrExternalId(fl.fk_parent_id),
}),
user: param.user,
+ req: param.req,
});
idMap.set(fl.id, fg.id);
@@ -1042,6 +1132,7 @@ export class ImportService {
vw: Partial,
views: View[],
user: UserType,
+ req: NcRequest,
): Promise {
if (vw.is_default) {
const view = views.find((a) => a.is_default);
@@ -1051,6 +1142,7 @@ export class ImportService {
await this.gridsService.gridViewUpdate({
viewId: view.id,
grid: gridData,
+ req,
});
}
}
@@ -1062,12 +1154,14 @@ export class ImportService {
const gview = await this.gridsService.gridViewCreate({
tableId: md.id,
grid: vw as ViewCreateReqType,
+ req,
});
const gridData = withoutNull(vw.view);
if (gridData) {
await this.gridsService.gridViewUpdate({
viewId: gview.id,
grid: gridData,
+ req,
});
}
return gview;
@@ -1077,12 +1171,14 @@ export class ImportService {
tableId: md.id,
body: vw as ViewCreateReqType,
user,
+ req,
});
const formData = withoutNull(vw.view);
if (formData) {
await this.formsService.formViewUpdate({
formViewId: fview.id,
form: formData,
+ req,
});
}
return fview;
@@ -1092,6 +1188,7 @@ export class ImportService {
tableId: md.id,
gallery: vw as ViewCreateReqType,
user,
+ req,
});
const galleryData = withoutNull(vw.view);
if (galleryData) {
@@ -1105,6 +1202,7 @@ export class ImportService {
await this.galleriesService.galleryViewUpdate({
galleryViewId: glview.id,
gallery: galleryData,
+ req,
});
}
return glview;
@@ -1114,6 +1212,7 @@ export class ImportService {
tableId: md.id,
kanban: vw as ViewCreateReqType,
user,
+ req,
});
const kanbanData = withoutNull(vw.view);
if (kanbanData) {
@@ -1159,6 +1258,7 @@ export class ImportService {
await this.kanbansService.kanbanViewUpdate({
kanbanViewId: kview.id,
kanban: kanbanData,
+ req,
});
}
return kview;
@@ -1178,7 +1278,7 @@ export class ImportService {
url?: string;
file?: any;
};
- req: any;
+ req: NcRequest;
}) {
const hrTime = initTime();
diff --git a/packages/nocodb/src/modules/jobs/jobs/meta-sync/meta-sync.controller.ts b/packages/nocodb/src/modules/jobs/jobs/meta-sync/meta-sync.controller.ts
index 6e377ffdae..061cab7467 100644
--- a/packages/nocodb/src/modules/jobs/jobs/meta-sync/meta-sync.controller.ts
+++ b/packages/nocodb/src/modules/jobs/jobs/meta-sync/meta-sync.controller.ts
@@ -4,9 +4,10 @@ import {
Inject,
Param,
Post,
- Request,
+ Req,
UseGuards,
} from '@nestjs/common';
+import { Request } from 'express';
import { GlobalGuard } from '~/guards/global/global.guard';
import { Acl } from '~/middlewares/extract-ids/extract-ids.middleware';
import { NcError } from '~/helpers/catchError';
@@ -24,7 +25,7 @@ export class MetaSyncController {
])
@HttpCode(200)
@Acl('metaDiffSync')
- async metaDiffSync(@Param('baseId') baseId: string, @Request() req) {
+ async metaDiffSync(@Param('baseId') baseId: string, @Req() req: Request) {
const jobs = await this.jobsService.jobList();
const fnd = jobs.find(
(j) => j.name === JobTypes.MetaSync && j.data.baseId === baseId,
@@ -38,6 +39,11 @@ export class MetaSyncController {
baseId,
sourceId: 'all',
user: req.user,
+ req: {
+ user: req.user,
+ clientIp: req.clientIp,
+ headers: req.headers,
+ },
});
return { id: job.id };
@@ -52,7 +58,7 @@ export class MetaSyncController {
async baseMetaDiffSync(
@Param('baseId') baseId: string,
@Param('sourceId') sourceId: string,
- @Request() req,
+ @Req() req: Request,
) {
const jobs = await this.jobsService.jobList();
const fnd = jobs.find(
@@ -70,6 +76,11 @@ export class MetaSyncController {
baseId,
sourceId,
user: req.user,
+ req: {
+ user: req.user,
+ clientIp: req.clientIp,
+ headers: req.headers,
+ },
});
return { id: job.id };
diff --git a/packages/nocodb/src/modules/jobs/jobs/meta-sync/meta-sync.processor.ts b/packages/nocodb/src/modules/jobs/jobs/meta-sync/meta-sync.processor.ts
index cd3dc0145c..df403e1c00 100644
--- a/packages/nocodb/src/modules/jobs/jobs/meta-sync/meta-sync.processor.ts
+++ b/packages/nocodb/src/modules/jobs/jobs/meta-sync/meta-sync.processor.ts
@@ -1,6 +1,7 @@
import debug from 'debug';
import { Process, Processor } from '@nestjs/bull';
import { Job } from 'bull';
+import type { NcRequest } from '~/interface/config';
import { JOBS_QUEUE, JobTypes } from '~/interface/Jobs';
import { MetaDiffsService } from '~/services/meta-diffs.service';
@@ -18,14 +19,19 @@ export class MetaSyncProcessor {
baseId: string;
sourceId: string;
user: any;
+ req: NcRequest;
} = job.data;
if (info.sourceId === 'all') {
- await this.metaDiffsService.metaDiffSync({ baseId: info.baseId });
+ await this.metaDiffsService.metaDiffSync({
+ baseId: info.baseId,
+ req: info.req,
+ });
} else {
await this.metaDiffsService.baseMetaDiffSync({
baseId: info.baseId,
sourceId: info.sourceId,
+ req: info.req,
});
}
diff --git a/packages/nocodb/src/modules/jobs/jobs/source-create/source-create.controller.ts b/packages/nocodb/src/modules/jobs/jobs/source-create/source-create.controller.ts
index b3f3523bfb..8f13b67c86 100644
--- a/packages/nocodb/src/modules/jobs/jobs/source-create/source-create.controller.ts
+++ b/packages/nocodb/src/modules/jobs/jobs/source-create/source-create.controller.ts
@@ -5,8 +5,10 @@ import {
Inject,
Param,
Post,
+ Req,
UseGuards,
} from '@nestjs/common';
+import { Request } from 'express';
import { BaseReqType } from 'nocodb-sdk';
import { GlobalGuard } from '~/guards/global/global.guard';
import { Acl } from '~/middlewares/extract-ids/extract-ids.middleware';
@@ -25,10 +27,14 @@ export class SourceCreateController {
])
@HttpCode(200)
@Acl('baseCreate')
- async baseCreate(@Param('baseId') baseId: string, @Body() body: BaseReqType) {
+ async baseCreate(
+ @Param('baseId') baseId: string,
+ @Body() body: BaseReqType,
+ @Req() req: Request,
+ ) {
const jobs = await this.jobsService.jobList();
const fnd = jobs.find(
- (j) => j.name === JobTypes.BaseCreate && j.data.baseId === baseId,
+ (j) => j.name === JobTypes.SourceCreate && j.data.baseId === baseId,
);
if (fnd) {
@@ -37,9 +43,14 @@ export class SourceCreateController {
);
}
- const job = await this.jobsService.add(JobTypes.BaseCreate, {
+ const job = await this.jobsService.add(JobTypes.SourceCreate, {
baseId,
source: body,
+ req: {
+ user: req.user,
+ clientIp: req.clientIp,
+ headers: req.headers,
+ },
});
return { id: job.id };
diff --git a/packages/nocodb/src/modules/jobs/jobs/source-create/source-create.processor.ts b/packages/nocodb/src/modules/jobs/jobs/source-create/source-create.processor.ts
index e535965154..cd5b9bfdac 100644
--- a/packages/nocodb/src/modules/jobs/jobs/source-create/source-create.processor.ts
+++ b/packages/nocodb/src/modules/jobs/jobs/source-create/source-create.processor.ts
@@ -14,11 +14,11 @@ export class SourceCreateProcessor {
private readonly jobsLogService: JobsLogService,
) {}
- @Process(JobTypes.BaseCreate)
+ @Process(JobTypes.SourceCreate)
async job(job: Job) {
this.debugLog(`job started for ${job.id}`);
- const { baseId, source } = job.data;
+ const { baseId, source, req } = job.data;
const logBasic = (log) => {
this.jobsLogService.sendLog(job, { message: log });
@@ -29,6 +29,7 @@ export class SourceCreateProcessor {
baseId,
source,
logger: logBasic,
+ req,
});
if (createdBase.isMeta()) {
diff --git a/packages/nocodb/src/modules/jobs/jobs/source-delete/source-delete.controller.ts b/packages/nocodb/src/modules/jobs/jobs/source-delete/source-delete.controller.ts
index ea07deebcf..c6ec323938 100644
--- a/packages/nocodb/src/modules/jobs/jobs/source-delete/source-delete.controller.ts
+++ b/packages/nocodb/src/modules/jobs/jobs/source-delete/source-delete.controller.ts
@@ -1,4 +1,12 @@
-import { Controller, Delete, Inject, Param, UseGuards } from '@nestjs/common';
+import {
+ Controller,
+ Delete,
+ Inject,
+ Param,
+ Req,
+ UseGuards,
+} from '@nestjs/common';
+import { Request } from 'express';
import { GlobalGuard } from '~/guards/global/global.guard';
import { Acl } from '~/middlewares/extract-ids/extract-ids.middleware';
import { NcError } from '~/helpers/catchError';
@@ -19,10 +27,10 @@ export class SourceDeleteController {
'/api/v2/meta/bases/:baseId/sources/:sourceId',
])
@Acl('baseDelete')
- async baseDelete(@Param('sourceId') sourceId: string) {
+ async baseDelete(@Param('sourceId') sourceId: string, @Req() req: Request) {
const jobs = await this.jobsService.jobList();
const fnd = jobs.find(
- (j) => j.name === JobTypes.BaseDelete && j.data.sourceId === sourceId,
+ (j) => j.name === JobTypes.SourceDelete && j.data.sourceId === sourceId,
);
if (fnd) {
@@ -31,8 +39,13 @@ export class SourceDeleteController {
await this.sourcesService.baseSoftDelete({ sourceId });
- const job = await this.jobsService.add(JobTypes.BaseDelete, {
+ const job = await this.jobsService.add(JobTypes.SourceDelete, {
sourceId,
+ req: {
+ user: req.user,
+ clientIp: req.clientIp,
+ headers: req.headers,
+ },
});
return { id: job.id };
diff --git a/packages/nocodb/src/modules/jobs/jobs/source-delete/source-delete.processor.ts b/packages/nocodb/src/modules/jobs/jobs/source-delete/source-delete.processor.ts
index 03a481d85f..6547bc2d22 100644
--- a/packages/nocodb/src/modules/jobs/jobs/source-delete/source-delete.processor.ts
+++ b/packages/nocodb/src/modules/jobs/jobs/source-delete/source-delete.processor.ts
@@ -10,14 +10,15 @@ export class SourceDeleteProcessor {
constructor(private readonly sourcesService: SourcesService) {}
- @Process(JobTypes.BaseDelete)
+ @Process(JobTypes.SourceDelete)
async job(job: Job) {
this.debugLog(`job started for ${job.id}`);
- const { sourceId } = job.data;
+ const { sourceId, req } = job.data;
await this.sourcesService.baseDelete({
sourceId,
+ req,
});
this.debugLog(`job completed for ${job.id}`);
diff --git a/packages/nocodb/src/modules/jobs/redis/jobs-redis.service.ts b/packages/nocodb/src/modules/jobs/redis/jobs-redis.service.ts
index 5d50947b9e..7673206d16 100644
--- a/packages/nocodb/src/modules/jobs/redis/jobs-redis.service.ts
+++ b/packages/nocodb/src/modules/jobs/redis/jobs-redis.service.ts
@@ -1,5 +1,6 @@
import { Injectable } from '@nestjs/common';
import Redis from 'ioredis';
+import { InstanceTypes } from '~/interface/Jobs';
@Injectable()
export class JobsRedisService {
@@ -7,9 +8,28 @@ export class JobsRedisService {
private redisSubscriber: Redis;
private unsubscribeCallbacks: { [key: string]: () => void } = {};
+ public primaryCallbacks: { [key: string]: () => void } = {};
+ public workerCallbacks: { [key: string]: () => void } = {};
+
constructor() {
this.redisClient = new Redis(process.env.NC_REDIS_JOB_URL);
this.redisSubscriber = new Redis(process.env.NC_REDIS_JOB_URL);
+
+ if (process.env.NC_WORKER_CONTAINER === 'true') {
+ this.redisSubscriber.subscribe(InstanceTypes.WORKER);
+ } else {
+ this.redisSubscriber.subscribe(InstanceTypes.PRIMARY);
+ }
+
+ const onMessage = (channel, message) => {
+ if (channel === InstanceTypes.WORKER) {
+ this.workerCallbacks[message] && this.workerCallbacks[message]();
+ } else if (channel === InstanceTypes.PRIMARY) {
+ this.primaryCallbacks[message] && this.primaryCallbacks[message]();
+ }
+ };
+
+ this.redisSubscriber.on('message', onMessage);
}
publish(channel: string, message: string | any) {
@@ -47,4 +67,20 @@ export class JobsRedisService {
delete this.unsubscribeCallbacks[channel];
}
}
+
+ workerCount(): Promise {
+ return new Promise((resolve, reject) => {
+ this.redisClient.publish(
+ InstanceTypes.WORKER,
+ 'count',
+ (error, numberOfSubscribers) => {
+ if (error) {
+ reject(0);
+ } else {
+ resolve(numberOfSubscribers);
+ }
+ },
+ );
+ });
+ }
}
diff --git a/packages/nocodb/src/modules/jobs/redis/jobs.service.ts b/packages/nocodb/src/modules/jobs/redis/jobs.service.ts
index 5e3dcb14a2..d13bb165ac 100644
--- a/packages/nocodb/src/modules/jobs/redis/jobs.service.ts
+++ b/packages/nocodb/src/modules/jobs/redis/jobs.service.ts
@@ -1,32 +1,52 @@
import { InjectQueue } from '@nestjs/bull';
-import { Injectable } from '@nestjs/common';
+import { Injectable, Logger } from '@nestjs/common';
import { Queue } from 'bull';
import type { OnModuleInit } from '@nestjs/common';
-import { JOBS_QUEUE, JobStatus } from '~/interface/Jobs';
+import { JOBS_QUEUE, JobStatus, WorkerCommands } from '~/interface/Jobs';
+import { JobsRedisService } from '~/modules/jobs/redis/jobs-redis.service';
@Injectable()
export class JobsService implements OnModuleInit {
- constructor(@InjectQueue(JOBS_QUEUE) protected readonly jobsQueue: Queue) {}
+ protected logger = new Logger(JobsService.name);
+
+ constructor(
+ @InjectQueue(JOBS_QUEUE) public readonly jobsQueue: Queue,
+ protected readonly jobsRedisService: JobsRedisService,
+ ) {}
// pause primary instance queue
async onModuleInit() {
if (process.env.NC_WORKER_CONTAINER !== 'true') {
- // await this.jobsQueue.pause(true);
+ await this.jobsQueue.pause(true);
+ } else {
+ this.jobsRedisService.workerCallbacks[WorkerCommands.RESUME_LOCAL] =
+ async () => {
+ this.logger.log('Resuming local queue');
+ await this.jobsQueue.resume(true);
+ };
+ this.jobsRedisService.workerCallbacks[WorkerCommands.PAUSE_LOCAL] =
+ async () => {
+ this.logger.log('Pausing local queue');
+ await this.jobsQueue.pause(true);
+ };
}
}
async add(name: string, data: any) {
- // resume primary instance queue if there is no worker
- /* const workerCount = (await this.jobsQueue.getWorkers()).length;
- const localWorkerPaused = await this.jobsQueue.isPaused(true);
+ // if NC_WORKER_CONTAINER is false, then skip dynamic queue pause/resume
+ if (process.env.NC_WORKER_CONTAINER !== 'false') {
+ // resume primary instance queue if there is no worker
+ const workerCount = await this.jobsRedisService.workerCount();
+ const localWorkerPaused = await this.jobsQueue.isPaused(true);
- // if there is no worker and primary instance queue is paused, resume it
- // if there is any worker and primary instance queue is not paused, pause it
- if (workerCount === 1 && localWorkerPaused) {
- await this.jobsQueue.resume(true);
- } else if (workerCount > 1 && !localWorkerPaused) {
- await this.jobsQueue.pause(true);
- } */
+ // if there is no worker and primary instance queue is paused, resume it
+ // if there is any worker and primary instance queue is not paused, pause it
+ if (workerCount === 0 && localWorkerPaused) {
+ await this.jobsQueue.resume(true);
+ } else if (workerCount > 0 && !localWorkerPaused) {
+ await this.jobsQueue.pause(true);
+ }
+ }
const job = await this.jobsQueue.add(name, data);
@@ -72,4 +92,14 @@ export class JobsService implements OnModuleInit {
return job;
}
+
+ async resumeQueue() {
+ this.logger.log('Resuming global queue');
+ await this.jobsQueue.resume();
+ }
+
+ async pauseQueue() {
+ this.logger.log('Pausing global queue');
+ await this.jobsQueue.pause();
+ }
}
diff --git a/packages/nocodb/src/modules/metas/metas.module.ts b/packages/nocodb/src/modules/metas/metas.module.ts
index 31db12c9d1..d11e812fea 100644
--- a/packages/nocodb/src/modules/metas/metas.module.ts
+++ b/packages/nocodb/src/modules/metas/metas.module.ts
@@ -184,6 +184,7 @@ export const metaModuleMetadata = {
MetaDiffsService,
BasesService,
SourcesService,
+ UtilsService,
],
};
diff --git a/packages/nocodb/src/run/cloud.ts b/packages/nocodb/src/run/cloud.ts
index 8f428139c4..bfcc4174a4 100644
--- a/packages/nocodb/src/run/cloud.ts
+++ b/packages/nocodb/src/run/cloud.ts
@@ -18,12 +18,8 @@ server.use(
server.set('view engine', 'ejs');
(async () => {
- if (process.env.NC_WORKER_CONTAINER === 'true') {
- await Noco.init({}, null, null);
- } else {
- const httpServer = server.listen(process.env.PORT || 8080, async () => {
- console.log(`App started successfully.\nVisit -> ${Noco.dashboardUrl}`);
- server.use(await Noco.init({}, httpServer, server));
- });
- }
+ const httpServer = server.listen(process.env.PORT || 8080, async () => {
+ console.log(`App started successfully.\nVisit -> ${Noco.dashboardUrl}`);
+ server.use(await Noco.init({}, httpServer, server));
+ });
})().catch((e) => console.log(e));
diff --git a/packages/nocodb/src/run/docker.ts b/packages/nocodb/src/run/docker.ts
index f80a313eb2..b413d1efa8 100644
--- a/packages/nocodb/src/run/docker.ts
+++ b/packages/nocodb/src/run/docker.ts
@@ -28,11 +28,7 @@ process.env[`DEBUG`] = 'xc*';
// })().catch((e) => console.log(e));
(async () => {
- if (process.env.NC_WORKER_CONTAINER === 'true') {
- await Noco.init({}, null, null);
- } else {
- const httpServer = server.listen(process.env.PORT || 8080, async () => {
- server.use(await Noco.init({}, httpServer, server));
- });
- }
+ const httpServer = server.listen(process.env.PORT || 8080, async () => {
+ server.use(await Noco.init({}, httpServer, server));
+ });
})().catch((e) => console.log(e));
diff --git a/packages/nocodb/src/run/dockerEntry.ts b/packages/nocodb/src/run/dockerEntry.ts
index 9ac361d24d..c0f4cbaa0e 100644
--- a/packages/nocodb/src/run/dockerEntry.ts
+++ b/packages/nocodb/src/run/dockerEntry.ts
@@ -13,11 +13,7 @@ server.use(cors());
server.set('view engine', 'ejs');
(async () => {
- if (process.env.NC_WORKER_CONTAINER === 'true') {
- await Noco.init({}, null, null);
- } else {
- const httpServer = server.listen(process.env.PORT || 8080, async () => {
- server.use(await Noco.init({}, httpServer, server));
- });
- }
+ const httpServer = server.listen(process.env.PORT || 8080, async () => {
+ server.use(await Noco.init({}, httpServer, server));
+ });
})().catch((e) => console.log(e));
diff --git a/packages/nocodb/src/run/dockerRunMysql.ts b/packages/nocodb/src/run/dockerRunMysql.ts
index d1b8cd2954..91ee249bf2 100644
--- a/packages/nocodb/src/run/dockerRunMysql.ts
+++ b/packages/nocodb/src/run/dockerRunMysql.ts
@@ -31,11 +31,7 @@ process.env[`NC_DB`] = `mysql2://localhost:3306?u=root&p=password&d=${metaDb}`;
// process.env[`DEBUG`] = 'xc*';
(async () => {
- if (process.env.NC_WORKER_CONTAINER === 'true') {
- await Noco.init({}, null, null);
- } else {
- const httpServer = server.listen(process.env.PORT || 8080, async () => {
- server.use(await Noco.init({}, httpServer, server));
- });
- }
+ const httpServer = server.listen(process.env.PORT || 8080, async () => {
+ server.use(await Noco.init({}, httpServer, server));
+ });
})().catch((e) => console.log(e));
diff --git a/packages/nocodb/src/run/dockerRunPG.ts b/packages/nocodb/src/run/dockerRunPG.ts
index e47e73af9c..e18b7d66af 100644
--- a/packages/nocodb/src/run/dockerRunPG.ts
+++ b/packages/nocodb/src/run/dockerRunPG.ts
@@ -30,11 +30,7 @@ process.env[`NC_DB`] = `pg://localhost:5432?u=postgres&p=password&d=${metaDb}`;
// process.env[`DEBUG`] = 'xc*';
(async () => {
- if (process.env.NC_WORKER_CONTAINER === 'true') {
- await Noco.init({}, null, null);
- } else {
- const httpServer = server.listen(process.env.PORT || 8080, async () => {
- server.use(await Noco.init({}, httpServer, server));
- });
- }
+ const httpServer = server.listen(process.env.PORT || 8080, async () => {
+ server.use(await Noco.init({}, httpServer, server));
+ });
})().catch((e) => console.log(e));
diff --git a/packages/nocodb/src/run/dockerRunPG_CyQuick.ts b/packages/nocodb/src/run/dockerRunPG_CyQuick.ts
index f0585c8b2a..f48965ce6f 100644
--- a/packages/nocodb/src/run/dockerRunPG_CyQuick.ts
+++ b/packages/nocodb/src/run/dockerRunPG_CyQuick.ts
@@ -24,11 +24,7 @@ process.env[
//process.env[`DEBUG`] = 'xc*';
(async () => {
- if (process.env.NC_WORKER_CONTAINER === 'true') {
- await Noco.init({}, null, null);
- } else {
- const httpServer = server.listen(process.env.PORT || 8080, async () => {
- server.use(await Noco.init({}, httpServer, server));
- });
- }
+ const httpServer = server.listen(process.env.PORT || 8080, async () => {
+ server.use(await Noco.init({}, httpServer, server));
+ });
})().catch((e) => console.log(e));
diff --git a/packages/nocodb/src/run/local.ts b/packages/nocodb/src/run/local.ts
index 660c932d25..049f64b5d8 100644
--- a/packages/nocodb/src/run/local.ts
+++ b/packages/nocodb/src/run/local.ts
@@ -17,12 +17,8 @@ server.use(
server.set('view engine', 'ejs');
(async () => {
- if (process.env.NC_WORKER_CONTAINER === 'true') {
- await Noco.init({}, null, null);
- } else {
- const httpServer = server.listen(process.env.PORT || 8080, async () => {
- console.log(`App started successfully.\nVisit -> ${Noco.dashboardUrl}`);
- server.use(await Noco.init({}, httpServer, server));
- });
- }
+ const httpServer = server.listen(process.env.PORT || 8080, async () => {
+ console.log(`App started successfully.\nVisit -> ${Noco.dashboardUrl}`);
+ server.use(await Noco.init({}, httpServer, server));
+ });
})().catch((e) => console.log(e));
diff --git a/packages/nocodb/src/run/testDocker.ts b/packages/nocodb/src/run/testDocker.ts
index 6391c75dec..bd9f2bc36c 100644
--- a/packages/nocodb/src/run/testDocker.ts
+++ b/packages/nocodb/src/run/testDocker.ts
@@ -26,57 +26,65 @@ process.env[`DEBUG`] = 'xc*';
process.env[`NC_ALLOW_LOCAL_HOOKS`] = 'true';
(async () => {
- const httpServer = server.listen(process.env.PORT || 8080, async () => {
- server.use(await Noco.init({}, httpServer, server));
+ if (process.env.NC_WORKER_CONTAINER === 'true') {
+ const httpServer = server.listen(process.env.PORT || 8080, async () => {
+ server.use(await Noco.init({}, httpServer, server));
+ });
+ } else {
+ const httpServer = server.listen(process.env.PORT || 8080, async () => {
+ server.use(await Noco.init({}, httpServer, server));
- let admin_response;
- if (!(await User.getByEmail('user@nocodb.com'))) {
- admin_response = await axios.post(
- `http://localhost:${process.env.PORT || 8080}/api/v1/auth/user/signup`,
- {
- email: 'user@nocodb.com',
- password: 'Password123.',
- },
- );
- console.log(admin_response.data);
- }
-
- for (let i = 0; i < 4; i++) {
- if (!(await User.getByEmail(`user-${i}@nocodb.com`))) {
- const response = await axios.post(
+ let admin_response;
+ if (!(await User.getByEmail('user@nocodb.com'))) {
+ admin_response = await axios.post(
`http://localhost:${
process.env.PORT || 8080
}/api/v1/auth/user/signup`,
{
- email: `user-${i}@nocodb.com`,
+ email: 'user@nocodb.com',
password: 'Password123.',
},
);
- console.log(response.data);
+ console.log(admin_response.data);
+ }
- const user = await axios.get(
- `http://localhost:${process.env.PORT || 8080}/api/v1/auth/user/me`,
- {
- headers: {
- 'xc-auth': response.data.token,
+ for (let i = 0; i < 4; i++) {
+ if (!(await User.getByEmail(`user-${i}@nocodb.com`))) {
+ const response = await axios.post(
+ `http://localhost:${
+ process.env.PORT || 8080
+ }/api/v1/auth/user/signup`,
+ {
+ email: `user-${i}@nocodb.com`,
+ password: 'Password123.',
},
- },
- );
+ );
+ console.log(response.data);
- const response2 = await axios.patch(
- `http://localhost:${process.env.PORT || 8080}/api/v1/users/${
- user.data.id
- }`,
- { roles: 'org-level-creator' },
- {
- headers: {
- 'xc-auth': admin_response.data.token,
+ const user = await axios.get(
+ `http://localhost:${process.env.PORT || 8080}/api/v1/auth/user/me`,
+ {
+ headers: {
+ 'xc-auth': response.data.token,
+ },
},
- },
- );
+ );
+
+ const response2 = await axios.patch(
+ `http://localhost:${process.env.PORT || 8080}/api/v1/users/${
+ user.data.id
+ }`,
+ { roles: 'org-level-creator' },
+ {
+ headers: {
+ 'xc-auth': admin_response.data.token,
+ },
+ },
+ );
- console.log(response2.data);
+ console.log(response2.data);
+ }
}
- }
- });
+ });
+ }
})().catch((e) => console.log(e));
diff --git a/packages/nocodb/src/schema/swagger.json b/packages/nocodb/src/schema/swagger.json
index 88ea466c72..09247f5a6f 100644
--- a/packages/nocodb/src/schema/swagger.json
+++ b/packages/nocodb/src/schema/swagger.json
@@ -4589,6 +4589,96 @@
]
}
},
+ "/api/v1/db/meta/duplicate/{baseId}/column/{columnId}": {
+ "post": {
+ "summary": "Duplicate Column",
+ "operationId": "duplicate-column",
+ "responses": {
+ "200": {
+ "description": "OK",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string"
+ },
+ "id": {
+ "type": "string"
+ }
+ }
+ }
+ }
+ }
+ },
+ "400": {
+ "$ref": "#/components/responses/BadRequest"
+ }
+ },
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "options": {
+ "type": "object",
+ "properties": {
+ "excludeData": {
+ "type": "boolean",
+ "required": false
+ }
+ }
+ },
+ "extra": {
+ "type": "object"
+ }
+ }
+ },
+ "examples": {
+ "Example 1": {
+ "value": {
+ "excludeData": true
+ }
+ }
+ }
+ }
+ }
+ },
+ "tags": [
+ "DB Table"
+ ],
+ "description": "Duplicate a column",
+ "parameters": [
+ {
+ "$ref": "#/components/parameters/xc-auth"
+ },
+ {
+ "schema": {
+ "$ref": "#/components/schemas/Id",
+ "example": "p_124hhlkbeasewh",
+ "type": "string"
+ },
+ "name": "baseId",
+ "in": "path",
+ "required": true,
+ "description": "Unique Base ID"
+ },
+ {
+ "schema": {
+ "$ref": "#/components/schemas/Id",
+ "example": "md_124hhlkbeasewh",
+ "type": "string"
+ },
+ "name": "columnId",
+ "in": "path",
+ "required": true,
+ "description": "Unique Column ID"
+ }
+ ]
+ }
+ },
"/api/v1/db/meta/projects/{baseId}/{sourceId}/tables": {
"parameters": [
{
@@ -17427,6 +17517,9 @@
"maxLength": 255,
"minLength": 1,
"type": "string"
+ },
+ "view_id": {
+ "type": "string"
}
},
"required": [
@@ -20586,10 +20679,13 @@
],
"properties": {
"currentPassword": {
+ "minLength": 8,
+ "maxLength": 128,
"type": "string"
},
"newPassword": {
"minLength": 8,
+ "maxLength": 128,
"type": "string"
}
},
@@ -20638,6 +20734,7 @@
"description": "New password",
"example": "newpassword",
"minLength": 8,
+ "maxLength": 128,
"type": "string"
}
},
@@ -21658,6 +21755,7 @@
"description": "Password of the user",
"example": "password123456789",
"minLength": 8,
+ "maxLength": 128,
"type": "string"
},
"firstname": {
diff --git a/packages/nocodb/src/services/api-tokens.service.ts b/packages/nocodb/src/services/api-tokens.service.ts
index 8f644b0d78..caed7622a7 100644
--- a/packages/nocodb/src/services/api-tokens.service.ts
+++ b/packages/nocodb/src/services/api-tokens.service.ts
@@ -2,6 +2,7 @@ import { Injectable } from '@nestjs/common';
import { AppEvents, extractRolesObj, OrgUserRoles } from 'nocodb-sdk';
import type { User } from '~/models';
import type { ApiTokenReqType } from 'nocodb-sdk';
+import type { NcRequest } from '~/interface/config';
import { AppHooksService } from '~/services/app-hooks/app-hooks.service';
import { NcError } from '~/helpers/catchError';
import { validatePayload } from '~/helpers';
@@ -14,7 +15,11 @@ export class ApiTokensService {
async apiTokenList(param: { userId: string }) {
return await ApiToken.list(param.userId);
}
- async apiTokenCreate(param: { userId: string; tokenBody: ApiTokenReqType }) {
+ async apiTokenCreate(param: {
+ userId: string;
+ tokenBody: ApiTokenReqType;
+ req: NcRequest;
+ }) {
validatePayload(
'swagger.json#/components/schemas/ApiTokenReq',
param.tokenBody,
@@ -23,6 +28,7 @@ export class ApiTokensService {
this.appHooksService.emit(AppEvents.API_TOKEN_CREATE, {
userId: param.userId,
tokenBody: param.tokenBody,
+ req: param.req,
});
return await ApiToken.insert({
@@ -31,7 +37,7 @@ export class ApiTokensService {
});
}
- async apiTokenDelete(param: { token; user: User }) {
+ async apiTokenDelete(param: { token; user: User; req: NcRequest }) {
const apiToken = await ApiToken.getByToken(param.token);
if (
!extractRolesObj(param.user.roles)[OrgUserRoles.SUPER_ADMIN] &&
@@ -43,6 +49,7 @@ export class ApiTokensService {
this.appHooksService.emit(AppEvents.API_TOKEN_DELETE, {
userId: param.user?.id,
token: param.token,
+ req: param.req,
});
// todo: verify token belongs to the user
diff --git a/packages/nocodb/src/services/app-hooks-listener.service.ts b/packages/nocodb/src/services/app-hooks-listener.service.ts
index 570e8587f2..f39135495e 100644
--- a/packages/nocodb/src/services/app-hooks-listener.service.ts
+++ b/packages/nocodb/src/services/app-hooks-listener.service.ts
@@ -8,13 +8,8 @@ import { T } from 'nc-help';
import type { AuditType } from 'nocodb-sdk';
import type { OnModuleDestroy, OnModuleInit } from '@nestjs/common';
import type {
- ApiCreatedEvent,
ColumnEvent,
- FilterEvent,
- MetaDiffEvent,
OrgUserInviteEvent,
- PluginEvent,
- ProjectCreateEvent,
ProjectInviteEvent,
ProjectUserResendInviteEvent,
ProjectUserUpdateEvent,
@@ -25,7 +20,6 @@ import type {
UserPasswordResetEvent,
UserSigninEvent,
UserSignupEvent,
- ViewEvent,
} from '~/services/app-hooks/interfaces';
import { Audit } from '~/models';
import { TelemetryService } from '~/services/telemetry.service';
@@ -143,33 +137,6 @@ export class AppHooksListenerService implements OnModuleInit, OnModuleDestroy {
});
}
break;
- case AppEvents.SHARED_VIEW_DELETE:
- this.telemetryService.sendEvent({ evt_type: 'sharedView:deleted' });
- break;
- case AppEvents.SHARED_VIEW_CREATE:
- this.telemetryService.sendEvent({
- evt_type: 'sharedView:generated-link',
- });
- break;
- case AppEvents.SHARED_VIEW_UPDATE:
- this.telemetryService.sendEvent({ evt_type: 'sharedView:updated' });
- break;
- case AppEvents.VIEW_UPDATE:
- {
- const param = data as ViewEvent;
-
- this.telemetryService.sendEvent({
- evt_type: 'vtable:updated',
- show_as: param.view.type ?? param.showAs,
- });
- }
- break;
- case AppEvents.VIEW_DELETE:
- this.telemetryService.sendEvent({ evt_type: 'vtable:deleted' });
- break;
- case AppEvents.TABLE_UPDATE:
- this.telemetryService.sendEvent({ evt_type: 'table:updated' });
- break;
case AppEvents.TABLE_CREATE:
{
const param = data as TableEvent;
@@ -182,8 +149,6 @@ export class AppHooksListenerService implements OnModuleInit, OnModuleDestroy {
description: `Table ${param.table.table_name} with alias ${param.table.title} has been created`,
ip: param.ip,
});
-
- this.telemetryService.sendEvent({ evt_type: 'table:created' });
}
break;
@@ -200,8 +165,6 @@ export class AppHooksListenerService implements OnModuleInit, OnModuleDestroy {
description: `Deleted ${table.type} ${table.table_name} with alias ${table.title} `,
ip,
});
-
- this.telemetryService.sendEvent({ evt_type: 'table:deleted' });
}
break;
case AppEvents.COLUMN_UPDATE:
@@ -217,8 +180,6 @@ export class AppHooksListenerService implements OnModuleInit, OnModuleDestroy {
description: `The column ${column.column_name} with alias ${column.title} from table ${table.table_name} has been updated`,
ip,
});
-
- this.telemetryService.sendEvent({ evt_type: 'column:updated' });
}
break;
case AppEvents.COLUMN_CREATE:
@@ -232,8 +193,6 @@ export class AppHooksListenerService implements OnModuleInit, OnModuleDestroy {
description: `The column ${column.column_name} with alias ${column.title} from table ${table.table_name} has been created`,
ip,
});
-
- this.telemetryService.sendEvent({ evt_type: 'column:created' });
}
break;
case AppEvents.COLUMN_DELETE:
@@ -248,7 +207,6 @@ export class AppHooksListenerService implements OnModuleInit, OnModuleDestroy {
description: `The column ${column.column_name} with alias ${column.title} from table ${table.table_name} has been deleted`,
ip,
});
- this.telemetryService.sendEvent({ evt_type: 'column:deleted' });
}
break;
@@ -305,214 +263,6 @@ export class AppHooksListenerService implements OnModuleInit, OnModuleDestroy {
});
}
break;
- case AppEvents.FILTER_CREATE:
- {
- const param = data as FilterEvent;
- this.telemetryService.sendEvent({
- evt_type: param.hook ? 'hookFilter:created' : 'filter:created',
- });
- }
- break;
- case AppEvents.FILTER_DELETE:
- {
- this.telemetryService.sendEvent({ evt_type: 'filter:deleted' });
- }
- break;
- case AppEvents.FILTER_UPDATE:
- {
- this.telemetryService.sendEvent({ evt_type: 'filter:updated' });
- }
- break;
- case AppEvents.SORT_CREATE:
- {
- this.telemetryService.sendEvent({ evt_type: 'sort:created' });
- }
- break;
- case AppEvents.SORT_DELETE:
- {
- this.telemetryService.sendEvent({ evt_type: 'sort:deleted' });
- }
- break;
- case AppEvents.SORT_UPDATE:
- {
- this.telemetryService.sendEvent({ evt_type: 'sort:updated' });
- }
- break;
- case AppEvents.VIEW_COLUMN_CREATE:
- {
- this.telemetryService.sendEvent({ evt_type: 'viewColumn:inserted' });
- }
- break;
- case AppEvents.VIEW_COLUMN_UPDATE:
- {
- this.telemetryService.sendEvent({ evt_type: 'viewColumn:updated' });
- }
- break;
- case AppEvents.RELATION_CREATE:
- {
- this.telemetryService.sendEvent({ evt_type: 'relation:created' });
- }
- break;
- case AppEvents.RELATION_DELETE:
- {
- this.telemetryService.sendEvent({ evt_type: 'relation:deleted' });
- }
- break;
- case AppEvents.API_TOKEN_CREATE:
- {
- this.telemetryService.sendEvent({ evt_type: 'apiToken:created' });
- }
- break;
- case AppEvents.API_TOKEN_DELETE:
- {
- this.telemetryService.sendEvent({ evt_type: 'apiToken:deleted' });
- }
- break;
- case AppEvents.PLUGIN_TEST:
- {
- this.telemetryService.sendEvent({ evt_type: 'plugin:tested' });
- }
- break;
- case AppEvents.PLUGIN_INSTALL:
- {
- const { plugin } = data as PluginEvent;
- this.telemetryService.sendEvent({
- evt_type: 'plugin:installed',
- title: plugin.title,
- });
- }
- break;
- case AppEvents.PLUGIN_UNINSTALL:
- {
- const { plugin } = data as PluginEvent;
- this.telemetryService.sendEvent({
- evt_type: 'plugin:uninstalled',
- title: plugin.title,
- });
- }
- break;
-
- case AppEvents.SHARED_BASE_GENERATE_LINK:
- {
- this.telemetryService.sendEvent({
- evt_type: 'sharedBase:generated-link',
- });
- }
- break;
- case AppEvents.SHARED_BASE_DELETE_LINK:
- {
- this.telemetryService.sendEvent({
- evt_type: 'sharedBase:generated-link',
- });
- }
- break;
- case AppEvents.BASE_UPDATE:
- {
- this.telemetryService.sendEvent({
- evt_type: 'source:updated',
- });
- }
- break;
- case AppEvents.BASE_DELETE:
- {
- this.telemetryService.sendEvent({ evt_type: 'source:deleted' });
- }
- break;
- case AppEvents.BASE_CREATE:
- {
- this.telemetryService.sendEvent({
- evt_type: 'source:created',
- });
- }
- break;
- case AppEvents.ATTACHMENT_UPLOAD:
- {
- this.telemetryService.sendEvent({
- evt_type: 'image:uploaded',
- type: data?.type,
- });
- }
- break;
- case AppEvents.WEBHOOK_CREATE:
- this.telemetryService.sendEvent({ evt_type: 'webhooks:created' });
- break;
- case AppEvents.WEBHOOK_DELETE:
- this.telemetryService.sendEvent({ evt_type: 'webhooks:deleted' });
- break;
- case AppEvents.WEBHOOK_UPDATE:
- this.telemetryService.sendEvent({ evt_type: 'webhooks:updated' });
- break;
- case AppEvents.FORM_COLUMN_UPDATE:
- this.telemetryService.sendEvent({ evt_type: 'formViewColumn:updated' });
- break;
- case AppEvents.SYNC_SOURCE_CREATE:
- this.telemetryService.sendEvent({ evt_type: 'syncSource:created' });
- break;
- case AppEvents.SYNC_SOURCE_DELETE:
- this.telemetryService.sendEvent({ evt_type: 'syncSource:deleted' });
- break;
- case AppEvents.VIEW_CREATE:
- {
- const param = data as ViewEvent;
- this.telemetryService.sendEvent({
- evt_type: 'vtable:created',
- show_as: param.showAs,
- });
- }
- break;
- case AppEvents.GRID_COLUMN_UPDATE:
- this.telemetryService.sendEvent({ evt_type: 'gridViewColumn:updated' });
- break;
- case AppEvents.WEBHOOK_TEST:
- this.telemetryService.sendEvent({ evt_type: 'webhooks:tested' });
- break;
- case AppEvents.PROJECT_CREATE:
- {
- const { xcdb } = data as ProjectCreateEvent;
- this.telemetryService.sendEvent({
- evt_type: 'base:created',
- xcdb,
- });
-
- this.telemetryService.sendEvent({ evt_type: 'base:rest' });
- }
- break;
- case AppEvents.PROJECT_DELETE:
- this.telemetryService.sendEvent({ evt_type: 'base:deleted' });
- break;
- case AppEvents.PROJECT_UPDATE:
- this.telemetryService.sendEvent({ evt_type: 'base:update' });
- break;
- case AppEvents.UI_ACL_UPDATE:
- this.telemetryService.sendEvent({ evt_type: 'uiAcl:updated' });
- break;
- case AppEvents.META_DIFF_SYNC:
- {
- const param = data as MetaDiffEvent;
-
- if (param.source) {
- this.telemetryService.sendEvent({
- evt_type: 'baseMetaDiff:synced',
- });
- } else {
- this.telemetryService.sendEvent({ evt_type: 'metaDiff:synced' });
- }
- }
- break;
-
- case AppEvents.ORG_API_TOKEN_DELETE:
- this.telemetryService.sendEvent({ evt_type: 'org:apiToken:deleted' });
- break;
- case AppEvents.ORG_API_TOKEN_CREATE:
- this.telemetryService.sendEvent({ evt_type: 'org:apiToken:created' });
- break;
- case AppEvents.APIS_CREATED:
- {
- const _param = data as ApiCreatedEvent;
- // todo: add to telemetry
- // T.emit('evt_api_created', param.info);
- }
- break;
}
}
diff --git a/packages/nocodb/src/services/app-hooks/interfaces.ts b/packages/nocodb/src/services/app-hooks/interfaces.ts
index 2556f9b2b2..ee2013f535 100644
--- a/packages/nocodb/src/services/app-hooks/interfaces.ts
+++ b/packages/nocodb/src/services/app-hooks/interfaces.ts
@@ -17,14 +17,19 @@ import type {
ViewType,
} from 'nocodb-sdk';
-export interface ProjectInviteEvent {
+export interface NcBaseEvent extends NcBaseEvent {
+ req: NcRequest;
+ clientId?: string;
+}
+
+export interface ProjectInviteEvent extends NcBaseEvent {
base: BaseType;
user: UserType;
invitedBy: UserType;
ip?: string;
}
-export interface ProjectUserUpdateEvent {
+export interface ProjectUserUpdateEvent extends NcBaseEvent {
base: BaseType;
user: UserType;
baseUser: ProjectUserReqType;
@@ -32,7 +37,7 @@ export interface ProjectUserUpdateEvent {
ip?: string;
}
-export interface ProjectUserResendInviteEvent {
+export interface ProjectUserResendInviteEvent extends NcBaseEvent {
base: BaseType;
user: UserType;
baseUser: ProjectUserReqType;
@@ -40,82 +45,82 @@ export interface ProjectUserResendInviteEvent {
ip?: string;
}
-export interface ProjectCreateEvent {
+export interface ProjectCreateEvent extends NcBaseEvent {
base: BaseType;
user: UserType;
xcdb: boolean;
}
-export interface ProjectUpdateEvent {
+export interface ProjectUpdateEvent extends NcBaseEvent {
base: BaseType;
user: UserType;
}
-export interface ProjectDeleteEvent {
+export interface ProjectDeleteEvent extends NcBaseEvent {
base: BaseType;
user: UserType;
}
-export interface WelcomeEvent {
+export interface WelcomeEvent extends NcBaseEvent {
user: UserType;
}
-export interface UserSignupEvent {
+export interface UserSignupEvent extends NcBaseEvent {
user: UserType;
ip?: string;
}
-export interface UserSigninEvent {
+export interface UserSigninEvent extends NcBaseEvent {
user: UserType;
ip?: string;
auditDescription?: string;
}
-export interface ApiCreatedEvent {
+export interface ApiCreatedEvent extends NcBaseEvent {
info: any;
}
-export interface UserPasswordChangeEvent {
+export interface UserPasswordChangeEvent extends NcBaseEvent {
user: UserType;
ip?: string;
}
-export interface UserPasswordForgotEvent {
+export interface UserPasswordForgotEvent extends NcBaseEvent {
user: UserType;
ip?: string;
}
-export interface UserPasswordResetEvent {
+export interface UserPasswordResetEvent extends NcBaseEvent {
user: UserType;
ip?: string;
}
-export interface UserEmailVerificationEvent {
+export interface UserEmailVerificationEvent extends NcBaseEvent {
user: UserType;
ip?: string;
}
-export interface TableEvent {
+export interface TableEvent extends NcBaseEvent {
table: TableType;
user: UserType;
ip?: string;
}
-export interface ViewEvent {
+export interface ViewEvent extends NcBaseEvent {
view: ViewType;
user?: UserType;
ip?: string;
showAs?: string;
}
-export interface FilterEvent {
+export interface FilterEvent extends NcBaseEvent {
filter: FilterType;
ip?: string;
hook?: HookType;
view?: ViewType;
}
-export interface ColumnEvent {
+export interface ColumnEvent extends NcBaseEvent {
table: TableType;
oldColumn?: ColumnType;
column: ColumnType;
@@ -123,75 +128,75 @@ export interface ColumnEvent {
ip?: string;
}
-export interface SortEvent {
+export interface SortEvent extends NcBaseEvent {
sort: SortType;
ip?: string;
}
-export interface OrgUserInviteEvent {
+export interface OrgUserInviteEvent extends NcBaseEvent {
invitedBy: UserType;
user: UserType;
count?: number;
ip?: string;
}
-export interface ViewColumnEvent {
+export interface ViewColumnEvent extends NcBaseEvent {
// todo: type
viewColumn: any;
}
-export interface RelationEvent {
+export interface RelationEvent extends NcBaseEvent {
column: ColumnType;
}
-export interface WebhookEvent {
+export interface WebhookEvent extends NcBaseEvent {
hook: HookType;
}
-export interface ApiTokenCreateEvent {
+export interface ApiTokenCreateEvent extends NcBaseEvent {
userId: string;
tokenBody: ApiTokenReqType;
}
-export interface ApiTokenDeleteEvent {
+export interface ApiTokenDeleteEvent extends NcBaseEvent {
userId: string;
token: string;
}
-export interface PluginTestEvent {
+export interface PluginTestEvent extends NcBaseEvent {
testBody: PluginTestReqType;
}
-export interface PluginEvent {
+export interface PluginEvent extends NcBaseEvent {
plugin: PluginType;
}
-export interface SharedBaseEvent {
+export interface SharedBaseEvent extends NcBaseEvent {
link?: string;
base?: BaseType;
}
-export interface BaseEvent {
+export interface BaseEvent extends NcBaseEvent {
source: SourceType;
}
-export interface AttachmentEvent {
+export interface AttachmentEvent extends NcBaseEvent {
type: 'url' | 'file';
}
-export interface FormColumnEvent {}
+export interface FormColumnEvent extends NcBaseEvent {}
-export interface GridColumnEvent {}
+export interface GridColumnEvent extends NcBaseEvent {}
-export interface MetaDiffEvent {
+export interface MetaDiffEvent extends NcBaseEvent {
base: BaseType;
source?: SourceType;
}
-export interface UIAclEvent {
+export interface UIAclEvent extends NcBaseEvent {
base: BaseType;
}
-export interface SyncSourceEvent {
+export interface SyncSourceEvent extends NcBaseEvent {
syncSource: Partial;
}
diff --git a/packages/nocodb/src/services/attachments.service.ts b/packages/nocodb/src/services/attachments.service.ts
index c53526a453..ead5f4c4bb 100644
--- a/packages/nocodb/src/services/attachments.service.ts
+++ b/packages/nocodb/src/services/attachments.service.ts
@@ -4,6 +4,7 @@ import { Injectable } from '@nestjs/common';
import { nanoid } from 'nanoid';
import slash from 'slash';
import type { AttachmentReqType, FileType } from 'nocodb-sdk';
+import type { NcRequest } from '~/interface/config';
import { AppHooksService } from '~/services/app-hooks/app-hooks.service';
import NcPluginMgrv2 from '~/helpers/NcPluginMgrv2';
import Local from '~/plugins/storage/Local';
@@ -15,7 +16,7 @@ import { utf8ify } from '~/helpers/stringHelpers';
export class AttachmentsService {
constructor(private readonly appHooksService: AppHooksService) {}
- async upload(param: { path?: string; files: FileType[] }) {
+ async upload(param: { path?: string; files: FileType[]; req: NcRequest }) {
// TODO: add getAjvValidatorMw
const filePath = this.sanitizeUrlPath(
param.path?.toString()?.split('/') || [''],
@@ -83,12 +84,17 @@ export class AttachmentsService {
this.appHooksService.emit(AppEvents.ATTACHMENT_UPLOAD, {
type: 'file',
+ req: param.req,
});
return attachments;
}
- async uploadViaURL(param: { path?: string; urls: AttachmentReqType[] }) {
+ async uploadViaURL(param: {
+ path?: string;
+ urls: AttachmentReqType[];
+ req: NcRequest;
+ }) {
// TODO: add getAjvValidatorMw
const filePath = this.sanitizeUrlPath(
param?.path?.toString()?.split('/') || [''],
@@ -133,6 +139,7 @@ export class AttachmentsService {
this.appHooksService.emit(AppEvents.ATTACHMENT_UPLOAD, {
type: 'url',
+ req: param.req,
});
return attachments;
}
diff --git a/packages/nocodb/src/services/base-users/base-users.service.ts b/packages/nocodb/src/services/base-users/base-users.service.ts
index c916b96711..b7d7899523 100644
--- a/packages/nocodb/src/services/base-users/base-users.service.ts
+++ b/packages/nocodb/src/services/base-users/base-users.service.ts
@@ -10,6 +10,7 @@ import { v4 as uuidv4 } from 'uuid';
import * as ejs from 'ejs';
import validator from 'validator';
import type { ProjectUserReqType, UserType } from 'nocodb-sdk';
+import type { NcRequest } from '~/interface/config';
import NocoCache from '~/cache/NocoCache';
import { validatePayload } from '~/helpers';
import Noco from '~/Noco';
@@ -47,7 +48,7 @@ export class BaseUsersService {
async userInvite(param: {
baseId: string;
baseUser: ProjectUserReqType;
- req: any;
+ req: NcRequest;
}): Promise {
validatePayload(
'swagger.json#/components/schemas/ProjectUserReq',
@@ -128,6 +129,7 @@ export class BaseUsersService {
user,
invitedBy: param.req.user,
ip: param.req.clientIp,
+ req: param.req,
});
const cachedUser = await NocoCache.get(
@@ -165,6 +167,7 @@ export class BaseUsersService {
user,
invitedBy: param.req.user,
ip: param.req.clientIp,
+ req: param.req,
});
// in case of single user check for smtp failure
@@ -271,6 +274,7 @@ export class BaseUsersService {
updatedBy: param.req.user,
ip: param.req.clientIp,
baseUser: param.baseUser,
+ req: param.req,
});
return {
@@ -356,6 +360,7 @@ export class BaseUsersService {
invitedBy: param.req.user,
ip: param.req.clientIp,
baseUser: param.baseUser,
+ req: param.req,
});
return true;
diff --git a/packages/nocodb/src/services/bases.service.ts b/packages/nocodb/src/services/bases.service.ts
index 6e5706f77e..a9cadcb7ee 100644
--- a/packages/nocodb/src/services/bases.service.ts
+++ b/packages/nocodb/src/services/bases.service.ts
@@ -13,6 +13,7 @@ import type {
ProjectUpdateReqType,
UserType,
} from 'nocodb-sdk';
+import type { NcRequest } from '~/interface/config';
import { AppHooksService } from '~/services/app-hooks/app-hooks.service';
import { populateMeta, validatePayload } from '~/helpers';
import { NcError } from '~/helpers/catchError';
@@ -36,7 +37,7 @@ export class BasesService {
) {}
async baseList(param: {
- user: { id: string; roles: Record };
+ user: { id: string; roles?: string | Record };
query?: any;
}) {
const bases = extractRolesObj(param.user?.roles)[OrgUserRoles.SUPER_ADMIN]
@@ -63,6 +64,7 @@ export class BasesService {
baseId: string;
base: ProjectUpdateReqType;
user: UserType;
+ req: NcRequest;
}) {
validatePayload(
'swagger.json#/components/schemas/ProjectUpdateReq',
@@ -84,6 +86,7 @@ export class BasesService {
this.appHooksService.emit(AppEvents.PROJECT_UPDATE, {
base,
user: param.user,
+ req: param.req,
});
return result;
@@ -99,7 +102,7 @@ export class BasesService {
}
}
- async baseSoftDelete(param: { baseId: any; user: UserType }) {
+ async baseSoftDelete(param: { baseId: any; user: UserType; req: NcRequest }) {
const base = await Base.getWithInfo(param.baseId);
if (!base) {
@@ -111,12 +114,13 @@ export class BasesService {
this.appHooksService.emit(AppEvents.PROJECT_DELETE, {
base,
user: param.user,
+ req: param.req,
});
return true;
}
- async baseCreate(param: { base: ProjectReqType; user: any }) {
+ async baseCreate(param: { base: ProjectReqType; user: any; req: NcRequest }) {
validatePayload('swagger.json#/components/schemas/ProjectReq', param.base);
const baseId = await this.metaService.genNanoid(MetaTable.PROJECT);
@@ -205,6 +209,7 @@ export class BasesService {
this.appHooksService.emit(AppEvents.APIS_CREATED, {
info,
+ req: param.req,
});
delete source.config;
@@ -215,18 +220,20 @@ export class BasesService {
base,
user: param.user,
xcdb: !baseBody.external,
+ req: param.req,
});
return base;
}
- async createDefaultBase(param: { user: UserType }) {
+ async createDefaultBase(param: { user: UserType; req: NcRequest }) {
const base = await this.baseCreate({
base: {
title: 'Getting Started',
type: 'database',
} as any,
user: param.user,
+ req: param.req,
});
const sqlUI = SqlUiFactory.create({ client: base.sources[0].type });
diff --git a/packages/nocodb/src/services/columns.service.ts b/packages/nocodb/src/services/columns.service.ts
index 7fa6c50786..569433d55a 100644
--- a/packages/nocodb/src/services/columns.service.ts
+++ b/packages/nocodb/src/services/columns.service.ts
@@ -21,6 +21,7 @@ import type {
import type CustomKnex from '~/db/CustomKnex';
import type SqlClient from '~/db/sql-client/lib/SqlClient';
import type { BaseModelSqlv2 } from '~/db/BaseModelSqlv2';
+import type { NcRequest } from '~/interface/config';
import { AppHooksService } from '~/services/app-hooks/app-hooks.service';
import formulaQueryBuilderv2 from '~/db/formulav2/formulaQueryBuilderv2';
import ProjectMgrv2 from '~/db/sql-mgr/v2/ProjectMgrv2';
@@ -123,6 +124,11 @@ export class ColumnsService {
param.column.column_name = sanitizeColumnName(param.column.column_name);
}
+ // trim leading and trailing spaces from column title as knex trim them by default
+ if (param.column.title) {
+ param.column.title = param.column.title.trim();
+ }
+
if (param.column.column_name) {
// - 5 is a buffer for suffix
let colName = param.column.column_name.slice(0, mxColumnLength - 5);
@@ -292,7 +298,7 @@ export class ColumnsService {
) {
// MultiSelect to SingleSelect
if (driverType === 'mysql' || driverType === 'mysql2') {
- await dbDriver.raw(
+ await sqlClient.raw(
`UPDATE ?? SET ?? = SUBSTRING_INDEX(??, ',', 1) WHERE ?? LIKE '%,%';`,
[
baseModel.getTnPath(table.table_name),
@@ -302,13 +308,13 @@ export class ColumnsService {
],
);
} else if (driverType === 'pg') {
- await dbDriver.raw(`UPDATE ?? SET ?? = split_part(??, ',', 1);`, [
+ await sqlClient.raw(`UPDATE ?? SET ?? = split_part(??, ',', 1);`, [
baseModel.getTnPath(table.table_name),
column.column_name,
column.column_name,
]);
} else if (driverType === 'mssql') {
- await dbDriver.raw(
+ await sqlClient.raw(
`UPDATE ?? SET ?? = LEFT(cast(?? as varchar(max)), CHARINDEX(',', ??) - 1) WHERE CHARINDEX(',', ??) > 0;`,
[
baseModel.getTnPath(table.table_name),
@@ -319,7 +325,7 @@ export class ColumnsService {
],
);
} else if (driverType === 'sqlite3') {
- await dbDriver.raw(
+ await sqlClient.raw(
`UPDATE ?? SET ?? = substr(??, 1, instr(??, ',') - 1) WHERE ?? LIKE '%,%';`,
[
baseModel.getTnPath(table.table_name),
@@ -350,12 +356,10 @@ export class ColumnsService {
}),
);
- const data = await baseModel.execAndParse(
- dbDriver.raw('SELECT DISTINCT ?? FROM ??', [
- column.column_name,
- baseModel.getTnPath(table.table_name),
- ]),
- );
+ const data = await sqlClient.raw('SELECT DISTINCT ?? FROM ??', [
+ column.column_name,
+ baseModel.getTnPath(table.table_name),
+ ]);
if (data.length) {
const existingOptions = colBody.colOptions.options.map(
@@ -534,7 +538,7 @@ export class ColumnsService {
}
if (column.uidt === UITypes.SingleSelect) {
if (driverType === 'mssql') {
- await dbDriver.raw(`UPDATE ?? SET ?? = NULL WHERE ?? LIKE ?`, [
+ await sqlClient.raw(`UPDATE ?? SET ?? = NULL WHERE ?? LIKE ?`, [
baseModel.getTnPath(table.table_name),
column.column_name,
column.column_name,
@@ -550,7 +554,7 @@ export class ColumnsService {
} else if (column.uidt === UITypes.MultiSelect) {
if (driverType === 'mysql' || driverType === 'mysql2') {
if (colBody.dt === 'set') {
- await dbDriver.raw(
+ await sqlClient.raw(
`UPDATE ?? SET ?? = TRIM(BOTH ',' FROM REPLACE(CONCAT(',', ??, ','), CONCAT(',', ?, ','), ',')) WHERE FIND_IN_SET(?, ??)`,
[
baseModel.getTnPath(table.table_name),
@@ -562,7 +566,7 @@ export class ColumnsService {
],
);
} else {
- await dbDriver.raw(
+ await sqlClient.raw(
`UPDATE ?? SET ?? = TRIM(BOTH ',' FROM REPLACE(CONCAT(',', ??, ','), CONCAT(',', ?, ','), ','))`,
[
baseModel.getTnPath(table.table_name),
@@ -573,7 +577,7 @@ export class ColumnsService {
);
}
} else if (driverType === 'pg') {
- await dbDriver.raw(
+ await sqlClient.raw(
`UPDATE ?? SET ?? = array_to_string(array_remove(string_to_array(??, ','), ?), ',')`,
[
baseModel.getTnPath(table.table_name),
@@ -583,7 +587,7 @@ export class ColumnsService {
],
);
} else if (driverType === 'mssql') {
- await dbDriver.raw(
+ await sqlClient.raw(
`UPDATE ?? SET ?? = substring(replace(concat(',', ??, ','), concat(',', ?, ','), ','), 2, len(replace(concat(',', ??, ','), concat(',', ?, ','), ',')) - 2)`,
[
baseModel.getTnPath(table.table_name),
@@ -595,7 +599,7 @@ export class ColumnsService {
],
);
} else if (driverType === 'sqlite3') {
- await dbDriver.raw(
+ await sqlClient.raw(
`UPDATE ?? SET ?? = TRIM(REPLACE(',' || ?? || ',', ',' || ? || ',', ','), ',')`,
[
baseModel.getTnPath(table.table_name),
@@ -715,7 +719,7 @@ export class ColumnsService {
if (column.uidt === UITypes.SingleSelect) {
if (driverType === 'mssql') {
- await dbDriver.raw(`UPDATE ?? SET ?? = ? WHERE ?? LIKE ?`, [
+ await sqlClient.raw(`UPDATE ?? SET ?? = ? WHERE ?? LIKE ?`, [
baseModel.getTnPath(table.table_name),
column.column_name,
newOp.title,
@@ -732,7 +736,7 @@ export class ColumnsService {
} else if (column.uidt === UITypes.MultiSelect) {
if (driverType === 'mysql' || driverType === 'mysql2') {
if (colBody.dt === 'set') {
- await dbDriver.raw(
+ await sqlClient.raw(
`UPDATE ?? SET ?? = TRIM(BOTH ',' FROM REPLACE(CONCAT(',', ??, ','), CONCAT(',', ?, ','), CONCAT(',', ?, ','))) WHERE FIND_IN_SET(?, ??)`,
[
baseModel.getTnPath(table.table_name),
@@ -745,7 +749,7 @@ export class ColumnsService {
],
);
} else {
- await dbDriver.raw(
+ await sqlClient.raw(
`UPDATE ?? SET ?? = TRIM(BOTH ',' FROM REPLACE(CONCAT(',', ??, ','), CONCAT(',', ?, ','), CONCAT(',', ?, ',')))`,
[
baseModel.getTnPath(table.table_name),
@@ -757,7 +761,7 @@ export class ColumnsService {
);
}
} else if (driverType === 'pg') {
- await dbDriver.raw(
+ await sqlClient.raw(
`UPDATE ?? SET ?? = array_to_string(array_replace(string_to_array(??, ','), ?, ?), ',')`,
[
baseModel.getTnPath(table.table_name),
@@ -768,7 +772,7 @@ export class ColumnsService {
],
);
} else if (driverType === 'mssql') {
- await dbDriver.raw(
+ await sqlClient.raw(
`UPDATE ?? SET ?? = substring(replace(concat(',', ??, ','), concat(',', ?, ','), concat(',', ?, ',')), 2, len(replace(concat(',', ??, ','), concat(',', ?, ','), concat(',', ?, ','))) - 2)`,
[
baseModel.getTnPath(table.table_name),
@@ -782,7 +786,7 @@ export class ColumnsService {
],
);
} else if (driverType === 'sqlite3') {
- await dbDriver.raw(
+ await sqlClient.raw(
`UPDATE ?? SET ?? = TRIM(REPLACE(',' || ?? || ',', ',' || ? || ',', ',' || ? || ','), ',')`,
[
baseModel.getTnPath(table.table_name),
@@ -801,7 +805,7 @@ export class ColumnsService {
const newOp = ch.def_option;
if (column.uidt === UITypes.SingleSelect) {
if (driverType === 'mssql') {
- await dbDriver.raw(`UPDATE ?? SET ?? = ? WHERE ?? LIKE ?`, [
+ await sqlClient.raw(`UPDATE ?? SET ?? = ? WHERE ?? LIKE ?`, [
baseModel.getTnPath(table.table_name),
column.column_name,
newOp.title,
@@ -818,7 +822,7 @@ export class ColumnsService {
} else if (column.uidt === UITypes.MultiSelect) {
if (driverType === 'mysql' || driverType === 'mysql2') {
if (colBody.dt === 'set') {
- await dbDriver.raw(
+ await sqlClient.raw(
`UPDATE ?? SET ?? = TRIM(BOTH ',' FROM REPLACE(CONCAT(',', ??, ','), CONCAT(',', ?, ','), CONCAT(',', ?, ','))) WHERE FIND_IN_SET(?, ??)`,
[
baseModel.getTnPath(table.table_name),
@@ -831,7 +835,7 @@ export class ColumnsService {
],
);
} else {
- await dbDriver.raw(
+ await sqlClient.raw(
`UPDATE ?? SET ?? = TRIM(BOTH ',' FROM REPLACE(CONCAT(',', ??, ','), CONCAT(',', ?, ','), CONCAT(',', ?, ',')))`,
[
baseModel.getTnPath(table.table_name),
@@ -845,7 +849,7 @@ export class ColumnsService {
);
}
} else if (driverType === 'pg') {
- await dbDriver.raw(
+ await sqlClient.raw(
`UPDATE ?? SET ?? = array_to_string(array_replace(string_to_array(??, ','), ?, ?), ',')`,
[
baseModel.getTnPath(table.table_name),
@@ -856,7 +860,7 @@ export class ColumnsService {
],
);
} else if (driverType === 'mssql') {
- await dbDriver.raw(
+ await sqlClient.raw(
`UPDATE ?? SET ?? = substring(replace(concat(',', ??, ','), concat(',', ?, ','), concat(',', ?, ',')), 2, len(replace(concat(',', ??, ','), concat(',', ?, ','), concat(',', ?, ','))) - 2)`,
[
baseModel.getTnPath(table.table_name),
@@ -870,7 +874,7 @@ export class ColumnsService {
],
);
} else if (driverType === 'sqlite3') {
- await dbDriver.raw(
+ await sqlClient.raw(
`UPDATE ?? SET ?? = TRIM(REPLACE(',' || ?? || ',', ',' || ? || ',', ',' || ? || ','), ',')`,
[
baseModel.getTnPath(table.table_name),
@@ -1014,6 +1018,7 @@ export class ColumnsService {
column,
user: param.req?.user,
ip: param.req?.clientIp,
+ req: param.req,
});
return table;
@@ -1029,7 +1034,7 @@ export class ColumnsService {
}
async columnAdd(param: {
- req: any;
+ req: NcRequest;
tableId: string;
column: ColumnReqType;
user: UserType;
@@ -1066,6 +1071,11 @@ export class ColumnsService {
param.column.column_name = sanitizeColumnName(param.column.column_name);
}
+ // trim leading and trailing spaces from column title as knex trim them by default
+ if (param.column.title) {
+ param.column.title = param.column.title.trim();
+ }
+
if (param.column.column_name) {
// - 5 is a buffer for suffix
let colName = param.column.column_name.slice(0, mxColumnLength - 5);
@@ -1117,6 +1127,12 @@ export class ColumnsService {
}
let colBody: any = param.column;
+
+ const colExtra = {
+ view_id: colBody.view_id,
+ column_order: colBody.column_order,
+ };
+
switch (colBody.uidt) {
case UITypes.Rollup:
{
@@ -1141,7 +1157,13 @@ export class ColumnsService {
case UITypes.Links:
case UITypes.LinkToAnotherRecord:
- await this.createLTARColumn({ ...param, source, base, reuse });
+ await this.createLTARColumn({
+ ...param,
+ source,
+ base,
+ reuse,
+ colExtra,
+ });
this.appHooksService.emit(AppEvents.RELATION_DELETE, {
column: {
@@ -1150,6 +1172,7 @@ export class ColumnsService {
base_id: base.id,
source_id: source.id,
},
+ req: param.req,
});
break;
@@ -1410,6 +1433,7 @@ export class ColumnsService {
},
user: param.req?.user,
ip: param.req?.clientIp,
+ req: param.req,
});
return table;
@@ -1590,6 +1614,7 @@ export class ColumnsService {
}
this.appHooksService.emit(AppEvents.RELATION_DELETE, {
column,
+ req: param.req,
});
break;
case UITypes.ForeignKey: {
@@ -1651,6 +1676,7 @@ export class ColumnsService {
column,
user: param.req?.user,
ip: param.req?.clientIp,
+ req: param.req,
});
return table;
@@ -1804,6 +1830,7 @@ export class ColumnsService {
source: Source;
base: Base;
reuse?: ReusableParams;
+ colExtra?: any;
}) {
validateParams(['parentId', 'childId', 'type'], param.column);
@@ -1823,7 +1850,9 @@ export class ColumnsService {
id: param.source.base_id,
}),
);
- const isLinks = param.column.uidt === UITypes.Links;
+ const isLinks =
+ param.column.uidt === UITypes.Links ||
+ (param.column as LinkToAnotherColumnReqType).type === 'bt';
// if xcdb base then treat as virtual relation to avoid creating foreign key
if (param.source.isMeta()) {
@@ -1927,6 +1956,7 @@ export class ColumnsService {
null,
param.column['meta'],
isLinks,
+ param.colExtra,
);
} else if ((param.column as LinkToAnotherColumnReqType).type === 'mm') {
const aTn = `${param.base?.prefix ?? ''}_nc_m2m_${randomID()}`;
@@ -2032,6 +2062,9 @@ export class ColumnsService {
foreignKeyName1,
(param.column as LinkToAnotherColumnReqType).virtual,
true,
+ null,
+ false,
+ param.colExtra,
);
await createHmAndBtColumn(
assocModel,
@@ -2042,6 +2075,9 @@ export class ColumnsService {
foreignKeyName2,
(param.column as LinkToAnotherColumnReqType).virtual,
true,
+ null,
+ false,
+ param.colExtra,
);
await Column.insert({
@@ -2094,6 +2130,9 @@ export class ColumnsService {
plural: param.column['meta']?.plural || pluralize(child.title),
singular: param.column['meta']?.singular || singularize(child.title),
},
+
+ // column_order and view_id if provided
+ ...param.colExtra,
});
// todo: create index for virtual relations as well
@@ -2189,7 +2228,7 @@ export class ColumnsService {
column: Partial;
}[];
},
- req: any,
+ req: NcRequest,
) {
// TODO validatePayload
diff --git a/packages/nocodb/src/services/datas.service.ts b/packages/nocodb/src/services/datas.service.ts
index fbbc4ee5db..1b9b886e2d 100644
--- a/packages/nocodb/src/services/datas.service.ts
+++ b/packages/nocodb/src/services/datas.service.ts
@@ -78,7 +78,7 @@ export class DatasService {
dbDriver: await NcConnectionMgrv2.get(source),
});
- return await baseModel.insert(param.body, null, param.cookie);
+ return await baseModel.nestedInsert(param.body, null, param.cookie);
}
async dataUpdate(
@@ -134,8 +134,9 @@ export class DatasService {
query: any;
baseModel?: BaseModelSqlv2;
throwErrorIfInvalidParams?: boolean;
+ ignoreViewFilterAndSort?: boolean;
}) {
- const { model, view, query = {} } = param;
+ const { model, view, query = {}, ignoreViewFilterAndSort = false } = param;
const source = await Source.get(model.source_id);
@@ -163,24 +164,22 @@ export class DatasService {
} catch (e) {}
const [count, data] = await Promise.all([
- baseModel.count(listArgs),
+ baseModel.count(listArgs, false, param.throwErrorIfInvalidParams),
(async () => {
let data = [];
try {
data = await nocoExecute(
ast,
- await baseModel.list(
- listArgs,
- false,
- false,
- param.throwErrorIfInvalidParams,
- ),
+ await baseModel.list(listArgs, {
+ ignoreViewFilterAndSort,
+ throwErrorIfInvalidParams: param.throwErrorIfInvalidParams,
+ }),
{},
listArgs,
);
} catch (e) {
if (e instanceof NcBaseError) throw e;
- this.logger.log(e);
+ this.logger.error(e);
NcError.internalServerError(
'Please check server log for more details',
);
diff --git a/packages/nocodb/src/services/filters.service.ts b/packages/nocodb/src/services/filters.service.ts
index f64c5875a4..168bcfa7a7 100644
--- a/packages/nocodb/src/services/filters.service.ts
+++ b/packages/nocodb/src/services/filters.service.ts
@@ -1,6 +1,7 @@
import { Injectable } from '@nestjs/common';
import { AppEvents } from 'nocodb-sdk';
import type { FilterReqType, UserType } from 'nocodb-sdk';
+import type { NcRequest } from '~/interface/config';
import { AppHooksService } from '~/services/app-hooks/app-hooks.service';
import { validatePayload } from '~/helpers';
import { NcError } from '~/helpers/catchError';
@@ -14,6 +15,7 @@ export class FiltersService {
filter: FilterReqType;
hookId: any;
user: UserType;
+ req: NcRequest;
}) {
validatePayload('swagger.json#/components/schemas/FilterReq', param.filter);
@@ -31,6 +33,7 @@ export class FiltersService {
this.appHooksService.emit(AppEvents.FILTER_CREATE, {
filter,
hook,
+ req: param.req,
});
return filter;
}
@@ -39,7 +42,7 @@ export class FiltersService {
return Filter.rootFilterListByHook({ hookId: param.hookId });
}
- async filterDelete(param: { filterId: string }) {
+ async filterDelete(param: { filterId: string; req: NcRequest }) {
const filter = await Filter.get(param.filterId);
if (!filter) {
@@ -50,6 +53,7 @@ export class FiltersService {
this.appHooksService.emit(AppEvents.FILTER_DELETE, {
filter,
+ req: param.req,
});
return true;
@@ -59,6 +63,7 @@ export class FiltersService {
filter: FilterReqType;
viewId: string;
user: UserType;
+ req: NcRequest;
}) {
validatePayload('swagger.json#/components/schemas/FilterReq', param.filter);
@@ -72,6 +77,7 @@ export class FiltersService {
this.appHooksService.emit(AppEvents.FILTER_CREATE, {
filter,
view,
+ req: param.req,
});
return filter;
@@ -81,6 +87,7 @@ export class FiltersService {
filter: FilterReqType;
filterId: string;
user: UserType;
+ req: NcRequest;
}) {
validatePayload('swagger.json#/components/schemas/FilterReq', param.filter);
@@ -94,6 +101,7 @@ export class FiltersService {
this.appHooksService.emit(AppEvents.FILTER_UPDATE, {
filter,
+ req: param.req,
});
return res;
diff --git a/packages/nocodb/src/services/form-columns.service.ts b/packages/nocodb/src/services/form-columns.service.ts
index 45c6e20c1a..0811314b3d 100644
--- a/packages/nocodb/src/services/form-columns.service.ts
+++ b/packages/nocodb/src/services/form-columns.service.ts
@@ -1,5 +1,6 @@
import { Injectable } from '@nestjs/common';
import { AppEvents } from 'nocodb-sdk';
+import type { NcRequest } from '~/interface/config';
import { AppHooksService } from '~/services/app-hooks/app-hooks.service';
import { validatePayload } from '~/helpers';
import { FormViewColumn } from '~/models';
@@ -12,6 +13,7 @@ export class FormColumnsService {
formViewColumnId: string;
// todo: replace with FormColumnReq
formViewColumn: FormViewColumn;
+ req: NcRequest;
}) {
validatePayload(
'swagger.json#/components/schemas/FormColumnReq',
@@ -23,7 +25,9 @@ export class FormColumnsService {
param.formViewColumn,
);
- this.appHooksService.emit(AppEvents.FORM_COLUMN_UPDATE, {});
+ this.appHooksService.emit(AppEvents.FORM_COLUMN_UPDATE, {
+ req: param.req,
+ });
return res;
}
diff --git a/packages/nocodb/src/services/forms.service.ts b/packages/nocodb/src/services/forms.service.ts
index ad961c2c9e..31cdb7ec21 100644
--- a/packages/nocodb/src/services/forms.service.ts
+++ b/packages/nocodb/src/services/forms.service.ts
@@ -5,6 +5,7 @@ import type {
UserType,
ViewCreateReqType,
} from 'nocodb-sdk';
+import type { NcRequest } from '~/interface/config';
import { AppHooksService } from '~/services/app-hooks/app-hooks.service';
import { validatePayload } from '~/helpers';
import { NcError } from '~/helpers/catchError';
@@ -23,6 +24,7 @@ export class FormsService {
tableId: string;
body: ViewCreateReqType;
user: UserType;
+ req: NcRequest;
}) {
validatePayload(
'swagger.json#/components/schemas/ViewCreateReq',
@@ -39,17 +41,23 @@ export class FormsService {
this.appHooksService.emit(AppEvents.VIEW_CREATE, {
view,
showAs: 'form',
+ req: param.req,
});
this.appHooksService.emit(AppEvents.VIEW_CREATE, {
user: param.user,
view,
+ req: param.req,
});
return view;
}
- async formViewUpdate(param: { formViewId: string; form: FormUpdateReqType }) {
+ async formViewUpdate(param: {
+ formViewId: string;
+ form: FormUpdateReqType;
+ req: NcRequest;
+ }) {
validatePayload(
'swagger.json#/components/schemas/FormUpdateReq',
param.form,
@@ -65,6 +73,7 @@ export class FormsService {
this.appHooksService.emit(AppEvents.VIEW_UPDATE, {
view,
showAs: 'form',
+ req: param.req,
});
return res;
diff --git a/packages/nocodb/src/services/galleries.service.ts b/packages/nocodb/src/services/galleries.service.ts
index 50b782c67f..32406ca4c4 100644
--- a/packages/nocodb/src/services/galleries.service.ts
+++ b/packages/nocodb/src/services/galleries.service.ts
@@ -5,6 +5,7 @@ import type {
UserType,
ViewCreateReqType,
} from 'nocodb-sdk';
+import type { NcRequest } from '~/interface/config';
import { AppHooksService } from '~/services/app-hooks/app-hooks.service';
import { validatePayload } from '~/helpers';
import { NcError } from '~/helpers/catchError';
@@ -22,6 +23,8 @@ export class GalleriesService {
tableId: string;
gallery: ViewCreateReqType;
user: UserType;
+
+ req: NcRequest;
}) {
validatePayload(
'swagger.json#/components/schemas/ViewCreateReq',
@@ -38,6 +41,7 @@ export class GalleriesService {
this.appHooksService.emit(AppEvents.VIEW_CREATE, {
view,
showAs: 'gallery',
+ req: param.req,
});
return view;
}
@@ -45,6 +49,7 @@ export class GalleriesService {
async galleryViewUpdate(param: {
galleryViewId: string;
gallery: GalleryUpdateReqType;
+ req: NcRequest;
}) {
validatePayload(
'swagger.json#/components/schemas/GalleryUpdateReq',
@@ -62,6 +67,7 @@ export class GalleriesService {
this.appHooksService.emit(AppEvents.VIEW_UPDATE, {
view,
showAs: 'gallery',
+ req: param.req,
});
return res;
diff --git a/packages/nocodb/src/services/grid-columns.service.ts b/packages/nocodb/src/services/grid-columns.service.ts
index b42f9c4ce9..e72f23472c 100644
--- a/packages/nocodb/src/services/grid-columns.service.ts
+++ b/packages/nocodb/src/services/grid-columns.service.ts
@@ -1,6 +1,7 @@
import { Injectable } from '@nestjs/common';
import { AppEvents } from 'nocodb-sdk';
import type { GridColumnReqType } from 'nocodb-sdk';
+import type { NcRequest } from '~/interface/config';
import { AppHooksService } from '~/services/app-hooks/app-hooks.service';
import { validatePayload } from '~/helpers';
import { GridViewColumn } from '~/models';
@@ -16,6 +17,7 @@ export class GridColumnsService {
async gridColumnUpdate(param: {
gridViewColumnId: string;
grid: GridColumnReqType;
+ req: NcRequest;
}) {
validatePayload(
'swagger.json#/components/schemas/GridColumnReq',
@@ -24,7 +26,9 @@ export class GridColumnsService {
const res = await GridViewColumn.update(param.gridViewColumnId, param.grid);
- this.appHooksService.emit(AppEvents.GRID_COLUMN_UPDATE, {});
+ this.appHooksService.emit(AppEvents.GRID_COLUMN_UPDATE, {
+ req: param.req,
+ });
return res;
}
diff --git a/packages/nocodb/src/services/grids.service.ts b/packages/nocodb/src/services/grids.service.ts
index ec7bcc5008..9c616e209d 100644
--- a/packages/nocodb/src/services/grids.service.ts
+++ b/packages/nocodb/src/services/grids.service.ts
@@ -1,6 +1,7 @@
import { Injectable } from '@nestjs/common';
import { AppEvents, ViewTypes } from 'nocodb-sdk';
import type { GridUpdateReqType, ViewCreateReqType } from 'nocodb-sdk';
+import type { NcRequest } from '~/interface/config';
import { AppHooksService } from '~/services/app-hooks/app-hooks.service';
import { validatePayload } from '~/helpers';
import { NcError } from '~/helpers/catchError';
@@ -10,7 +11,11 @@ import { GridView, View } from '~/models';
export class GridsService {
constructor(private readonly appHooksService: AppHooksService) {}
- async gridViewCreate(param: { tableId: string; grid: ViewCreateReqType }) {
+ async gridViewCreate(param: {
+ tableId: string;
+ grid: ViewCreateReqType;
+ req: NcRequest;
+ }) {
validatePayload(
'swagger.json#/components/schemas/ViewCreateReq',
param.grid,
@@ -26,16 +31,17 @@ export class GridsService {
this.appHooksService.emit(AppEvents.VIEW_CREATE, {
view,
showAs: 'grid',
- });
-
- this.appHooksService.emit(AppEvents.VIEW_CREATE, {
- view,
+ req: param.req,
});
return view;
}
- async gridViewUpdate(param: { viewId: string; grid: GridUpdateReqType }) {
+ async gridViewUpdate(param: {
+ viewId: string;
+ grid: GridUpdateReqType;
+ req: NcRequest;
+ }) {
validatePayload(
'swagger.json#/components/schemas/GridUpdateReq',
param.grid,
@@ -52,6 +58,7 @@ export class GridsService {
this.appHooksService.emit(AppEvents.VIEW_UPDATE, {
view,
showAs: 'map',
+ req: param.req,
});
return res;
diff --git a/packages/nocodb/src/services/hooks.service.ts b/packages/nocodb/src/services/hooks.service.ts
index 787b470c96..cca803a0ae 100644
--- a/packages/nocodb/src/services/hooks.service.ts
+++ b/packages/nocodb/src/services/hooks.service.ts
@@ -1,6 +1,7 @@
import { Injectable } from '@nestjs/common';
import { AppEvents } from 'nocodb-sdk';
import type { HookReqType, HookTestReqType, HookType } from 'nocodb-sdk';
+import type { NcRequest } from '~/interface/config';
import { AppHooksService } from '~/services/app-hooks/app-hooks.service';
import { validatePayload } from '~/helpers';
import { NcError } from '~/helpers/catchError';
@@ -37,7 +38,11 @@ export class HooksService {
return await HookLog.list({ fk_hook_id: param.hookId }, param.query);
}
- async hookCreate(param: { tableId: string; hook: HookReqType }) {
+ async hookCreate(param: {
+ tableId: string;
+ hook: HookReqType;
+ req: NcRequest;
+ }) {
validatePayload('swagger.json#/components/schemas/HookReq', param.hook);
this.validateHookPayload(param.hook.notification);
@@ -49,12 +54,13 @@ export class HooksService {
this.appHooksService.emit(AppEvents.WEBHOOK_CREATE, {
hook,
+ req: param.req,
});
return hook;
}
- async hookDelete(param: { hookId: string }) {
+ async hookDelete(param: { hookId: string; req: NcRequest }) {
const hook = await Hook.get(param.hookId);
if (!hook) {
@@ -64,11 +70,16 @@ export class HooksService {
await Hook.delete(param.hookId);
this.appHooksService.emit(AppEvents.WEBHOOK_DELETE, {
hook,
+ req: param.req,
});
return true;
}
- async hookUpdate(param: { hookId: string; hook: HookReqType }) {
+ async hookUpdate(param: {
+ hookId: string;
+ hook: HookReqType;
+ req: NcRequest;
+ }) {
validatePayload('swagger.json#/components/schemas/HookReq', param.hook);
const hook = await Hook.get(param.hookId);
@@ -86,12 +97,17 @@ export class HooksService {
...hook,
...param.hook,
},
+ req: param.req,
});
return res;
}
- async hookTest(param: { tableId: string; hookTest: HookTestReqType }) {
+ async hookTest(param: {
+ tableId: string;
+ hookTest: HookTestReqType;
+ req: NcRequest;
+ }) {
validatePayload(
'swagger.json#/components/schemas/HookTestReq',
param.hookTest,
@@ -122,6 +138,7 @@ export class HooksService {
} finally {
this.appHooksService.emit(AppEvents.WEBHOOK_TEST, {
hook,
+ req: param.req,
});
}
diff --git a/packages/nocodb/src/services/kanbans.service.ts b/packages/nocodb/src/services/kanbans.service.ts
index 899de923d4..c21880792d 100644
--- a/packages/nocodb/src/services/kanbans.service.ts
+++ b/packages/nocodb/src/services/kanbans.service.ts
@@ -5,6 +5,7 @@ import type {
UserType,
ViewCreateReqType,
} from 'nocodb-sdk';
+import type { NcRequest } from '~/interface/config';
import { AppHooksService } from '~/services/app-hooks/app-hooks.service';
import { validatePayload } from '~/helpers';
import { NcError } from '~/helpers/catchError';
@@ -22,6 +23,7 @@ export class KanbansService {
tableId: string;
kanban: ViewCreateReqType;
user: UserType;
+ req: NcRequest;
}) {
validatePayload(
'swagger.json#/components/schemas/ViewCreateReq',
@@ -39,6 +41,8 @@ export class KanbansService {
view,
showAs: 'kanban',
user: param.user,
+
+ req: param.req,
});
return view;
@@ -47,6 +51,7 @@ export class KanbansService {
async kanbanViewUpdate(param: {
kanbanViewId: string;
kanban: KanbanUpdateReqType;
+ req: NcRequest;
}) {
validatePayload(
'swagger.json#/components/schemas/KanbanUpdateReq',
@@ -64,6 +69,7 @@ export class KanbansService {
this.appHooksService.emit(AppEvents.VIEW_UPDATE, {
view,
showAs: 'kanban',
+ req: param.req,
});
return res;
diff --git a/packages/nocodb/src/services/maps.service.ts b/packages/nocodb/src/services/maps.service.ts
index 7b5c0ea20b..1ea51a41f3 100644
--- a/packages/nocodb/src/services/maps.service.ts
+++ b/packages/nocodb/src/services/maps.service.ts
@@ -1,6 +1,7 @@
import { Injectable } from '@nestjs/common';
import { AppEvents, ViewTypes } from 'nocodb-sdk';
import type { MapUpdateReqType, UserType, ViewCreateReqType } from 'nocodb-sdk';
+import type { NcRequest } from '~/interface/config';
import { AppHooksService } from '~/services/app-hooks/app-hooks.service';
import { validatePayload } from '~/helpers';
import { NcError } from '~/helpers/catchError';
@@ -18,6 +19,7 @@ export class MapsService {
tableId: string;
map: ViewCreateReqType;
user: UserType;
+ req: NcRequest;
}) {
validatePayload(
'swagger.json#/components/schemas/ViewCreateReq',
@@ -33,12 +35,18 @@ export class MapsService {
this.appHooksService.emit(AppEvents.VIEW_CREATE, {
view,
showAs: 'map',
+
+ req: param.req,
});
return view;
}
- async mapViewUpdate(param: { mapViewId: string; map: MapUpdateReqType }) {
+ async mapViewUpdate(param: {
+ mapViewId: string;
+ map: MapUpdateReqType;
+ req: NcRequest;
+ }) {
validatePayload('swagger.json#/components/schemas/MapUpdateReq', param.map);
const view = await View.get(param.mapViewId);
@@ -52,6 +60,7 @@ export class MapsService {
this.appHooksService.emit(AppEvents.VIEW_UPDATE, {
view,
showAs: 'map',
+ req: param.req,
});
return res;
diff --git a/packages/nocodb/src/services/meta-diffs.service.ts b/packages/nocodb/src/services/meta-diffs.service.ts
index d2043b0840..fa3c572b16 100644
--- a/packages/nocodb/src/services/meta-diffs.service.ts
+++ b/packages/nocodb/src/services/meta-diffs.service.ts
@@ -882,7 +882,7 @@ export class MetaDiffsService {
await this.extractAndGenerateManyToManyRelations(await source.getModels());
}
- async metaDiffSync(param: { baseId: string }) {
+ async metaDiffSync(param: { baseId: string; req: any }) {
const base = await Base.getWithInfo(param.baseId);
for (const source of base.sources) {
await this.syncBaseMeta(base, source);
@@ -890,12 +890,17 @@ export class MetaDiffsService {
this.appHooksService.emit(AppEvents.META_DIFF_SYNC, {
base,
+ req: param.req,
});
return true;
}
- async baseMetaDiffSync(param: { baseId: string; sourceId: string }) {
+ async baseMetaDiffSync(param: {
+ baseId: string;
+ sourceId: string;
+ req: any;
+ }) {
const base = await Base.getWithInfo(param.baseId);
const source = await Source.get(param.sourceId);
@@ -904,6 +909,7 @@ export class MetaDiffsService {
this.appHooksService.emit(AppEvents.META_DIFF_SYNC, {
base,
source,
+ req: param.req,
});
return true;
diff --git a/packages/nocodb/src/services/model-visibilities.service.ts b/packages/nocodb/src/services/model-visibilities.service.ts
index 001a35bf53..71db96f994 100644
--- a/packages/nocodb/src/services/model-visibilities.service.ts
+++ b/packages/nocodb/src/services/model-visibilities.service.ts
@@ -1,6 +1,7 @@
import { Injectable } from '@nestjs/common';
import { AppEvents } from 'nocodb-sdk';
import type { VisibilityRuleReqType } from 'nocodb-sdk';
+import type { NcRequest } from '~/interface/config';
import { AppHooksService } from '~/services/app-hooks/app-hooks.service';
import { validatePayload } from '~/helpers';
import { NcError } from '~/helpers/catchError';
@@ -13,6 +14,7 @@ export class ModelVisibilitiesService {
async xcVisibilityMetaSetAll(param: {
visibilityRule: VisibilityRuleReqType;
baseId: string;
+ req: NcRequest;
}) {
validatePayload(
'swagger.json#/components/schemas/VisibilityRuleReq',
@@ -58,6 +60,7 @@ export class ModelVisibilitiesService {
}
this.appHooksService.emit(AppEvents.UI_ACL_UPDATE, {
base,
+ req: param.req,
});
return true;
diff --git a/packages/nocodb/src/services/notifications.service.ts b/packages/nocodb/src/services/notifications.service.ts
index 58f1ac3b50..864d7481df 100644
--- a/packages/nocodb/src/services/notifications.service.ts
+++ b/packages/nocodb/src/services/notifications.service.ts
@@ -6,6 +6,7 @@ import type {
} from '~/services/app-hooks/interfaces';
import type { OnModuleDestroy, OnModuleInit } from '@nestjs/common';
import type { UserType } from 'nocodb-sdk';
+import type { NcRequest } from '~/interface/config';
import { AppHooksService } from '~/services/app-hooks/app-hooks.service';
import { NcError } from '~/helpers/catchError';
import { PagedResponseImpl } from '~/helpers/PagedResponse';
@@ -15,8 +16,11 @@ import { Notification } from '~/models';
export class NotificationsService implements OnModuleInit, OnModuleDestroy {
constructor(protected readonly appHooks: AppHooksService) {}
- protected async insertNotification(insertData: Partial) {
- this.appHooks.emit('notification' as any, insertData);
+ protected async insertNotification(
+ insertData: Partial,
+ req: NcRequest,
+ ) {
+ this.appHooks.emit('notification' as any, { ...insertData, req } as any);
await Notification.insert(insertData);
}
@@ -28,32 +32,39 @@ export class NotificationsService implements OnModuleInit, OnModuleDestroy {
event: AppEvents;
data: any;
}) {
+ const { req } = data;
switch (event) {
case AppEvents.PROJECT_INVITE:
{
const { base, user, invitedBy } = data as ProjectInviteEvent;
- await this.insertNotification({
- fk_user_id: user.id,
- type: AppEvents.PROJECT_INVITE,
- body: {
- id: base.id,
- title: base.title,
- type: base.type,
- invited_by: invitedBy.email,
+ await this.insertNotification(
+ {
+ fk_user_id: user.id,
+ type: AppEvents.PROJECT_INVITE,
+ body: {
+ id: base.id,
+ title: base.title,
+ type: base.type,
+ invited_by: invitedBy.email,
+ },
},
- });
+ req,
+ );
}
break;
case AppEvents.WELCOME:
{
- const { user } = data as WelcomeEvent;
+ const { user, req } = data as WelcomeEvent;
- await this.insertNotification({
- fk_user_id: user.id,
- type: AppEvents.WELCOME,
- body: {},
- });
+ await this.insertNotification(
+ {
+ fk_user_id: user.id,
+ type: AppEvents.WELCOME,
+ body: {},
+ },
+ req,
+ );
}
break;
}
diff --git a/packages/nocodb/src/services/org-tokens.service.ts b/packages/nocodb/src/services/org-tokens.service.ts
index bb53169be7..a0d499220b 100644
--- a/packages/nocodb/src/services/org-tokens.service.ts
+++ b/packages/nocodb/src/services/org-tokens.service.ts
@@ -2,6 +2,7 @@ import { Injectable } from '@nestjs/common';
import { AppEvents, extractRolesObj, OrgUserRoles } from 'nocodb-sdk';
import type { User } from '~/models';
import type { ApiTokenReqType } from 'nocodb-sdk';
+import type { NcRequest } from '~/interface/config';
import { AppHooksService } from '~/services/app-hooks/app-hooks.service';
import { validatePayload } from '~/helpers';
import { NcError } from '~/helpers/catchError';
@@ -35,7 +36,11 @@ export class OrgTokensService {
);
}
- async apiTokenCreate(param: { user: User; apiToken: ApiTokenReqType }) {
+ async apiTokenCreate(param: {
+ user: User;
+ apiToken: ApiTokenReqType;
+ req: NcRequest;
+ }) {
validatePayload(
'swagger.json#/components/schemas/ApiTokenReq',
param.apiToken,
@@ -49,12 +54,14 @@ export class OrgTokensService {
this.appHooksService.emit(AppEvents.ORG_API_TOKEN_CREATE, {
tokenBody: param.apiToken,
userId: param.user?.id,
+
+ req: param.req,
});
return apiToken;
}
- async apiTokenDelete(param: { user: User; token: string }) {
+ async apiTokenDelete(param: { user: User; token: string; req: NcRequest }) {
const fk_user_id = param.user.id;
const apiToken = await ApiToken.getByToken(param.token);
if (
@@ -68,6 +75,7 @@ export class OrgTokensService {
this.appHooksService.emit(AppEvents.ORG_API_TOKEN_DELETE, {
token: param.token,
userId: param.user?.id,
+ req: param['req'],
});
return res;
diff --git a/packages/nocodb/src/services/org-users.service.ts b/packages/nocodb/src/services/org-users.service.ts
index 996c6646a1..bfa8f694fe 100644
--- a/packages/nocodb/src/services/org-users.service.ts
+++ b/packages/nocodb/src/services/org-users.service.ts
@@ -8,6 +8,7 @@ import {
import { v4 as uuidv4 } from 'uuid';
import validator from 'validator';
import type { UserType } from 'nocodb-sdk';
+import type { NcRequest } from '~/interface/config';
import { AppHooksService } from '~/services/app-hooks/app-hooks.service';
import { BaseUsersService } from '~/services/base-users/base-users.service';
import { NC_APP_SETTINGS } from '~/constants';
@@ -91,7 +92,7 @@ export class OrgUsersService {
async userAdd(param: {
user: UserType;
// todo: refactor
- req: any;
+ req: NcRequest;
}) {
validatePayload('swagger.json#/components/schemas/OrgUserReq', param.user);
@@ -148,6 +149,7 @@ export class OrgUsersService {
user,
count,
ip: param.req.clientIp,
+ req: param.req,
});
// in case of single user check for smtp failure
@@ -192,7 +194,10 @@ export class OrgUsersService {
NcError.notImplemented();
}
- async userInviteResend(param: { userId: string; req: any }): Promise {
+ async userInviteResend(param: {
+ userId: string;
+ req: NcRequest;
+ }): Promise {
const user = await User.get(param.userId);
if (!user) {
@@ -232,6 +237,7 @@ export class OrgUsersService {
invitedBy: param.req.user,
user,
ip: param.req.clientIp,
+ req: param.req,
});
return true;
diff --git a/packages/nocodb/src/services/plugins.service.ts b/packages/nocodb/src/services/plugins.service.ts
index 1d834f5067..9ee7e7d17e 100644
--- a/packages/nocodb/src/services/plugins.service.ts
+++ b/packages/nocodb/src/services/plugins.service.ts
@@ -1,6 +1,7 @@
import { Injectable } from '@nestjs/common';
import { AppEvents } from 'nocodb-sdk';
import type { PluginTestReqType, PluginType } from 'nocodb-sdk';
+import type { NcRequest } from '~/interface/config';
import { AppHooksService } from '~/services/app-hooks/app-hooks.service';
import { validatePayload } from '~/helpers';
import NcPluginMgrv2 from '~/helpers/NcPluginMgrv2';
@@ -14,7 +15,7 @@ export class PluginsService {
return await Plugin.list();
}
- async pluginTest(param: { body: PluginTestReqType }) {
+ async pluginTest(param: { body: PluginTestReqType; req: NcRequest }) {
validatePayload(
'swagger.json#/components/schemas/PluginTestReq',
param.body,
@@ -22,6 +23,7 @@ export class PluginsService {
this.appHooksService.emit(AppEvents.PLUGIN_TEST, {
testBody: param.body,
+ req: param.req,
});
return await NcPluginMgrv2.test(param.body);
}
@@ -29,7 +31,11 @@ export class PluginsService {
async pluginRead(param: { pluginId: string }) {
return await Plugin.get(param.pluginId);
}
- async pluginUpdate(param: { pluginId: string; plugin: PluginType }) {
+ async pluginUpdate(param: {
+ pluginId: string;
+ plugin: PluginType;
+ req: NcRequest;
+ }) {
validatePayload('swagger.json#/components/schemas/PluginReq', param.plugin);
const plugin = await Plugin.update(param.pluginId, param.plugin);
@@ -38,6 +44,7 @@ export class PluginsService {
plugin.active ? AppEvents.PLUGIN_INSTALL : AppEvents.PLUGIN_UNINSTALL,
{
plugin,
+ req: param.req,
},
);
diff --git a/packages/nocodb/src/services/shared-bases.service.ts b/packages/nocodb/src/services/shared-bases.service.ts
index fe4f9c6df7..057f1992dd 100644
--- a/packages/nocodb/src/services/shared-bases.service.ts
+++ b/packages/nocodb/src/services/shared-bases.service.ts
@@ -2,7 +2,7 @@ import { Injectable } from '@nestjs/common';
import { AppEvents } from 'nocodb-sdk';
import { v4 as uuidv4 } from 'uuid';
import { ConfigService } from '@nestjs/config';
-import type { AppConfig } from '~/interface/config';
+import type { AppConfig, NcRequest } from '~/interface/config';
import { AppHooksService } from '~/services/app-hooks/app-hooks.service';
import { validatePayload } from '~/helpers';
import { NcError } from '~/helpers/catchError';
@@ -25,6 +25,8 @@ export class SharedBasesService {
roles: string;
password: string;
siteUrl: string;
+
+ req: NcRequest;
}): Promise {
validatePayload('swagger.json#/components/schemas/SharedBaseReq', param);
@@ -61,6 +63,7 @@ export class SharedBasesService {
this.appHooksService.emit(AppEvents.SHARED_BASE_GENERATE_LINK, {
link: data.url,
base,
+ req: param.req,
});
return data;
@@ -71,6 +74,7 @@ export class SharedBasesService {
roles: string;
password: string;
siteUrl: string;
+ req: NcRequest;
}): Promise {
validatePayload('swagger.json#/components/schemas/SharedBaseReq', param);
@@ -106,6 +110,7 @@ export class SharedBasesService {
this.appHooksService.emit(AppEvents.SHARED_BASE_GENERATE_LINK, {
link: data.url,
base,
+ req: param.req,
});
return data;
}
@@ -125,7 +130,10 @@ export class SharedBasesService {
return `${siteUrl}${config.dashboardPath}#/base/${base.uuid}`;
}
- async disableSharedBaseLink(param: { baseId: string }): Promise {
+ async disableSharedBaseLink(param: {
+ baseId: string;
+ req: NcRequest;
+ }): Promise {
const base = await Base.get(param.baseId);
if (!base) {
@@ -139,6 +147,7 @@ export class SharedBasesService {
this.appHooksService.emit(AppEvents.SHARED_BASE_DELETE_LINK, {
base,
+ req: param.req,
});
return { uuid: null };
}
diff --git a/packages/nocodb/src/services/sorts.service.ts b/packages/nocodb/src/services/sorts.service.ts
index fa7c4457a1..1443dc4826 100644
--- a/packages/nocodb/src/services/sorts.service.ts
+++ b/packages/nocodb/src/services/sorts.service.ts
@@ -1,6 +1,7 @@
import { Injectable } from '@nestjs/common';
import { AppEvents } from 'nocodb-sdk';
import type { SortReqType } from 'nocodb-sdk';
+import type { NcRequest } from '~/interface/config';
import { AppHooksService } from '~/services/app-hooks/app-hooks.service';
import { validatePayload } from '~/helpers';
import { NcError } from '~/helpers/catchError';
@@ -14,7 +15,7 @@ export class SortsService {
return Sort.get(param.sortId);
}
- async sortDelete(param: { sortId: string }) {
+ async sortDelete(param: { sortId: string; req: NcRequest }) {
const sort = await Sort.get(param.sortId);
if (!sort) {
@@ -25,11 +26,12 @@ export class SortsService {
this.appHooksService.emit(AppEvents.SORT_CREATE, {
sort,
+ req: param.req,
});
return true;
}
- async sortUpdate(param: { sortId: any; sort: SortReqType }) {
+ async sortUpdate(param: { sortId: any; sort: SortReqType; req: NcRequest }) {
validatePayload('swagger.json#/components/schemas/SortReq', param.sort);
const sort = await Sort.get(param.sortId);
@@ -42,12 +44,14 @@ export class SortsService {
this.appHooksService.emit(AppEvents.SORT_UPDATE, {
sort,
+
+ req: param.req,
});
return res;
}
- async sortCreate(param: { viewId: any; sort: SortReqType }) {
+ async sortCreate(param: { viewId: any; sort: SortReqType; req: NcRequest }) {
validatePayload('swagger.json#/components/schemas/SortReq', param.sort);
const sort = await Sort.insert({
@@ -57,6 +61,7 @@ export class SortsService {
this.appHooksService.emit(AppEvents.SORT_CREATE, {
sort,
+ req: param.req,
});
return sort;
diff --git a/packages/nocodb/src/services/sources.service.ts b/packages/nocodb/src/services/sources.service.ts
index 441c6d1fd1..9c96d25c3b 100644
--- a/packages/nocodb/src/services/sources.service.ts
+++ b/packages/nocodb/src/services/sources.service.ts
@@ -1,6 +1,7 @@
import { Injectable } from '@nestjs/common';
import { AppEvents } from 'nocodb-sdk';
import type { BaseReqType } from 'nocodb-sdk';
+import type { NcRequest } from '~/interface/config';
import { AppHooksService } from '~/services/app-hooks/app-hooks.service';
import { populateMeta, validatePayload } from '~/helpers';
import { populateRollupColumnAndHideLTAR } from '~/helpers/populateMeta';
@@ -24,6 +25,7 @@ export class SourcesService {
sourceId: string;
source: BaseReqType;
baseId: string;
+ req: NcRequest;
}) {
validatePayload('swagger.json#/components/schemas/BaseReq', param.source);
@@ -40,6 +42,7 @@ export class SourcesService {
this.appHooksService.emit(AppEvents.BASE_UPDATE, {
source,
+ req: param.req,
});
return source;
@@ -51,12 +54,13 @@ export class SourcesService {
return sources;
}
- async baseDelete(param: { sourceId: string }) {
+ async baseDelete(param: { sourceId: string; req: NcRequest }) {
try {
const source = await Source.get(param.sourceId, true);
await source.delete();
this.appHooksService.emit(AppEvents.BASE_DELETE, {
source,
+ req: param.req,
});
} catch (e) {
NcError.badRequest(e);
@@ -78,6 +82,7 @@ export class SourcesService {
baseId: string;
source: BaseReqType;
logger?: (message: string) => void;
+ req: NcRequest;
}) {
validatePayload('swagger.json#/components/schemas/BaseReq', param.source);
@@ -103,12 +108,14 @@ export class SourcesService {
this.appHooksService.emit(AppEvents.APIS_CREATED, {
info,
+ req: param.req,
});
delete source.config;
this.appHooksService.emit(AppEvents.BASE_CREATE, {
source,
+ req: param.req,
});
return source;
diff --git a/packages/nocodb/src/services/sync.service.ts b/packages/nocodb/src/services/sync.service.ts
index 3e617b65d8..19ce24a740 100644
--- a/packages/nocodb/src/services/sync.service.ts
+++ b/packages/nocodb/src/services/sync.service.ts
@@ -1,5 +1,6 @@
import { Injectable } from '@nestjs/common';
import { AppEvents } from 'nocodb-sdk';
+import type { NcRequest } from '~/interface/config';
import { AppHooksService } from '~/services/app-hooks/app-hooks.service';
import { NcError } from '~/helpers/catchError';
import { PagedResponseImpl } from '~/helpers/PagedResponse';
@@ -20,6 +21,7 @@ export class SyncService {
sourceId?: string;
userId: string;
syncPayload: Partial;
+ req: NcRequest;
}) {
const base = await Base.getWithInfo(param.baseId);
@@ -32,12 +34,13 @@ export class SyncService {
this.appHooksService.emit(AppEvents.SYNC_SOURCE_CREATE, {
syncSource: sync,
+ req: param.req,
});
return sync;
}
- async syncDelete(param: { syncId: string }) {
+ async syncDelete(param: { syncId: string; req: NcRequest }) {
const syncSource = await SyncSource.get(param.syncId);
if (!syncSource) {
@@ -48,6 +51,7 @@ export class SyncService {
this.appHooksService.emit(AppEvents.SYNC_SOURCE_DELETE, {
syncSource,
+ req: param.req,
});
return res;
}
@@ -55,6 +59,7 @@ export class SyncService {
async syncUpdate(param: {
syncId: string;
syncPayload: Partial;
+ req: NcRequest;
}) {
const syncSource = await SyncSource.get(param.syncId);
@@ -66,6 +71,8 @@ export class SyncService {
this.appHooksService.emit(AppEvents.SYNC_SOURCE_UPDATE, {
syncSource,
+
+ req: param.req,
});
return res;
diff --git a/packages/nocodb/src/services/tables.service.ts b/packages/nocodb/src/services/tables.service.ts
index e09e240d53..1e1f43b2e1 100644
--- a/packages/nocodb/src/services/tables.service.ts
+++ b/packages/nocodb/src/services/tables.service.ts
@@ -18,6 +18,7 @@ import type {
TableReqType,
UserType,
} from 'nocodb-sdk';
+import type { NcRequest } from '~/interface/config';
import { AppHooksService } from '~/services/app-hooks/app-hooks.service';
import ProjectMgrv2 from '~/db/sql-mgr/v2/ProjectMgrv2';
import { NcError } from '~/helpers/catchError';
@@ -43,6 +44,7 @@ export class TablesService {
table: TableReqType & { base_id?: string };
baseId?: string;
user: UserType;
+ req: NcRequest;
}) {
const model = await Model.get(param.tableId);
@@ -145,6 +147,7 @@ export class TablesService {
this.appHooksService.emit(AppEvents.TABLE_UPDATE, {
table: model,
user: param.user,
+ req: param.req,
});
return true;
@@ -225,6 +228,7 @@ export class TablesService {
table,
user: param.user,
ip: param.req?.clientIp,
+ req: param.req,
});
result = await table.delete(ncMeta);
@@ -487,7 +491,7 @@ export class TablesService {
system?: boolean;
}
> = (
- await sqlClient.columnList({
+ await sqlMgr.sqlOpPlus(source, 'columnList', {
tn: tableCreatePayLoad.table_name,
schema: source.getConfig()?.schema,
})
@@ -528,6 +532,7 @@ export class TablesService {
table: result,
user: param.user,
ip: param.req?.clientIp,
+ req: param.req,
});
return result;
diff --git a/packages/nocodb/src/services/users/users.service.ts b/packages/nocodb/src/services/users/users.service.ts
index 8fb8196336..a87d3f595f 100644
--- a/packages/nocodb/src/services/users/users.service.ts
+++ b/packages/nocodb/src/services/users/users.service.ts
@@ -13,6 +13,7 @@ import type {
SignUpReqType,
UserType,
} from 'nocodb-sdk';
+import type { NcRequest } from '~/interface/config';
import { genJwt, setTokenCookie } from '~/services/users/helpers';
import { NC_APP_SETTINGS } from '~/constants';
import { AppHooksService } from '~/services/app-hooks/app-hooks.service';
@@ -91,11 +92,13 @@ export class UsersService {
salt,
password,
email_verification_token,
+ req,
}: {
email: string;
salt: any;
password;
email_verification_token;
+ req: NcRequest;
}) {
this.validateEmailPattern(email);
@@ -137,7 +140,7 @@ export class UsersService {
// if first user and super admin, create a base
if (isFirstUser && process.env.NC_CLOUD !== 'true') {
// todo: update swagger type
- (user as any).createdProject = await this.createDefaultProject(user);
+ (user as any).createdProject = await this.createDefaultProject(user, req);
}
// todo: update swagger type
@@ -147,7 +150,7 @@ export class UsersService {
async passwordChange(param: {
body: PasswordChangeReqType;
user: UserType;
- req: any;
+ req: NcRequest;
}): Promise {
validatePayload(
'swagger.json#/components/schemas/PasswordChangeReq',
@@ -191,6 +194,7 @@ export class UsersService {
this.appHooksService.emit(AppEvents.USER_PASSWORD_CHANGE, {
user: user,
ip: param.req?.clientIp,
+ req: param.req,
});
return true;
@@ -199,7 +203,7 @@ export class UsersService {
async passwordForgot(param: {
body: PasswordForgotReqType;
siteUrl: string;
- req: any;
+ req: NcRequest;
}): Promise {
validatePayload(
'swagger.json#/components/schemas/PasswordForgotReq',
@@ -247,6 +251,7 @@ export class UsersService {
this.appHooksService.emit(AppEvents.USER_PASSWORD_FORGOT, {
user: user,
ip: param.req?.clientIp,
+ req: param.req,
});
} else {
return NcError.badRequest('Your email has not been registered.');
@@ -275,7 +280,7 @@ export class UsersService {
async passwordReset(param: {
body: PasswordResetReqType;
token: string;
- req: any;
+ req: NcRequest;
}): Promise {
validatePayload(
'swagger.json#/components/schemas/PasswordResetReq',
@@ -319,6 +324,7 @@ export class UsersService {
this.appHooksService.emit(AppEvents.USER_PASSWORD_RESET, {
user: user,
ip: param.req?.clientIp,
+ req: param.req,
});
return true;
@@ -327,7 +333,7 @@ export class UsersService {
async emailVerification(param: {
token: string;
// todo: exclude
- req: any;
+ req: NcRequest;
}): Promise {
const { token, req } = param;
@@ -348,6 +354,7 @@ export class UsersService {
this.appHooksService.emit(AppEvents.USER_EMAIL_VERIFICATION, {
user: user,
ip: req?.clientIp,
+ req,
});
return true;
@@ -459,6 +466,7 @@ export class UsersService {
salt,
password,
email_verification_token,
+ req: param.req,
});
createdProject = _createdProject;
}
@@ -497,18 +505,21 @@ export class UsersService {
this.appHooksService.emit(AppEvents.USER_SIGNUP, {
user: user,
ip: param.req?.clientIp,
+ req: param.req,
});
this.appHooksService.emit(AppEvents.WELCOME, {
user,
+ req: param.req,
});
- return { ...(await this.login(user)), createdProject };
+ return { ...(await this.login(user, param.req)), createdProject };
}
- async login(user: UserType & { provider?: string }) {
+ async login(user: UserType & { provider?: string }, req: any) {
this.appHooksService.emit(AppEvents.USER_SIGNIN, {
user,
+ req,
});
return {
token: genJwt(user, Noco.getConfig()),
@@ -535,10 +546,11 @@ export class UsersService {
param.res.clearCookie('refresh_token');
}
- private async createDefaultProject(user: User) {
+ private async createDefaultProject(user: User, req: any) {
// create new base for user
const base = await this.basesService.createDefaultBase({
user,
+ req,
});
return base;
diff --git a/packages/nocodb/src/services/utils.service.ts b/packages/nocodb/src/services/utils.service.ts
index 85a28bb1ff..9cd676aef3 100644
--- a/packages/nocodb/src/services/utils.service.ts
+++ b/packages/nocodb/src/services/utils.service.ts
@@ -14,7 +14,10 @@ import NcConnectionMgrv2 from '~/utils/common/NcConnectionMgrv2';
import { MetaTable } from '~/utils/globals';
import { jdbcToXcConfig } from '~/utils/nc-config/helpers';
import { packageVersion } from '~/utils/packageVersion';
-import { defaultLimitConfig } from '~/helpers/extractLimitAndOffset';
+import {
+ defaultGroupByLimitConfig,
+ defaultLimitConfig,
+} from '~/helpers/extractLimitAndOffset';
const versionCache = {
releaseVersion: null,
@@ -395,6 +398,7 @@ export class UtilsService {
Math.min(defaultLimitConfig.limitDefault, defaultLimitConfig.limitMax),
defaultLimitConfig.limitMin,
),
+ defaultGroupByLimit: defaultGroupByLimitConfig,
timezone: defaultConnectionConfig.timezone,
ncMin: !!process.env.NC_MIN,
teleEnabled: process.env.NC_DISABLE_TELE !== 'true',
diff --git a/packages/nocodb/src/services/view-columns.service.ts b/packages/nocodb/src/services/view-columns.service.ts
index aa4b53710d..333ebfbba5 100644
--- a/packages/nocodb/src/services/view-columns.service.ts
+++ b/packages/nocodb/src/services/view-columns.service.ts
@@ -1,6 +1,7 @@
import { Injectable } from '@nestjs/common';
import { AppEvents } from 'nocodb-sdk';
import type { ViewColumnReqType, ViewColumnUpdateReqType } from 'nocodb-sdk';
+import type { NcRequest } from '~/interface/config';
import { AppHooksService } from '~/services/app-hooks/app-hooks.service';
import { validatePayload } from '~/helpers';
import { View } from '~/models';
@@ -12,7 +13,11 @@ export class ViewColumnsService {
async columnList(param: { viewId: string }) {
return await View.getColumns(param.viewId, undefined);
}
- async columnAdd(param: { viewId: string; column: ViewColumnReqType }) {
+ async columnAdd(param: {
+ viewId: string;
+ column: ViewColumnReqType;
+ req: NcRequest;
+ }) {
validatePayload(
'swagger.json#/components/schemas/ViewColumnReq',
param.column,
@@ -28,6 +33,7 @@ export class ViewColumnsService {
);
this.appHooksService.emit(AppEvents.VIEW_COLUMN_CREATE, {
viewColumn,
+ req: param.req,
});
return viewColumn;
@@ -37,6 +43,7 @@ export class ViewColumnsService {
viewId: string;
columnId: string;
column: ViewColumnUpdateReqType;
+ req: NcRequest;
}) {
validatePayload(
'swagger.json#/components/schemas/ViewColumnUpdateReq',
@@ -51,6 +58,7 @@ export class ViewColumnsService {
this.appHooksService.emit(AppEvents.VIEW_COLUMN_UPDATE, {
viewColumn: param.column,
+ req: param.req,
});
return result;
diff --git a/packages/nocodb/src/services/views.service.ts b/packages/nocodb/src/services/views.service.ts
index c94a70b8d1..7cb0ab0a21 100644
--- a/packages/nocodb/src/services/views.service.ts
+++ b/packages/nocodb/src/services/views.service.ts
@@ -5,6 +5,7 @@ import type {
UserType,
ViewUpdateReqType,
} from 'nocodb-sdk';
+import type { NcRequest } from '~/interface/config';
import { AppHooksService } from '~/services/app-hooks/app-hooks.service';
import { validatePayload } from '~/helpers';
import { NcError } from '~/helpers/catchError';
@@ -69,8 +70,8 @@ export class ViewsService {
async viewList(param: {
tableId: string;
user: {
- roles: Record;
- base_roles: Record;
+ roles?: Record | string;
+ base_roles?: Record;
};
}) {
const model = await Model.get(param.tableId);
@@ -91,7 +92,7 @@ export class ViewsService {
return filteredViewList;
}
- async shareView(param: { viewId: string; user: UserType }) {
+ async shareView(param: { viewId: string; user: UserType; req: NcRequest }) {
const res = await View.share(param.viewId);
const view = await View.get(param.viewId);
@@ -103,6 +104,7 @@ export class ViewsService {
this.appHooksService.emit(AppEvents.SHARED_VIEW_CREATE, {
user: param.user,
view,
+ req: param.req,
});
return res;
@@ -112,6 +114,7 @@ export class ViewsService {
viewId: string;
view: ViewUpdateReqType;
user: UserType;
+ req: NcRequest;
}) {
validatePayload(
'swagger.json#/components/schemas/ViewUpdateReq',
@@ -132,11 +135,13 @@ export class ViewsService {
...param.view,
},
user: param.user,
+
+ req: param.req,
});
return result;
}
- async viewDelete(param: { viewId: string; user: UserType }) {
+ async viewDelete(param: { viewId: string; user: UserType; req: NcRequest }) {
const view = await View.get(param.viewId);
if (!view) {
@@ -148,6 +153,7 @@ export class ViewsService {
this.appHooksService.emit(AppEvents.VIEW_DELETE, {
view,
user: param.user,
+ req: param.req,
});
return true;
@@ -157,6 +163,7 @@ export class ViewsService {
viewId: string;
sharedView: SharedViewReqType;
user: UserType;
+ req: NcRequest;
}) {
validatePayload(
'swagger.json#/components/schemas/SharedViewReq',
@@ -174,12 +181,17 @@ export class ViewsService {
this.appHooksService.emit(AppEvents.SHARED_VIEW_UPDATE, {
user: param.user,
view,
+ req: param.req,
});
return result;
}
- async shareViewDelete(param: { viewId: string; user: UserType }) {
+ async shareViewDelete(param: {
+ viewId: string;
+ user: UserType;
+ req: NcRequest;
+ }) {
const view = await View.get(param.viewId);
if (!view) {
@@ -190,6 +202,7 @@ export class ViewsService {
this.appHooksService.emit(AppEvents.SHARED_VIEW_DELETE, {
user: param.user,
view,
+ req: param.req,
});
return true;
diff --git a/packages/nocodb/src/strategies/authtoken.strategy/authtoken.strategy.ts b/packages/nocodb/src/strategies/authtoken.strategy/authtoken.strategy.ts
index 6c0446a354..26327d8887 100644
--- a/packages/nocodb/src/strategies/authtoken.strategy/authtoken.strategy.ts
+++ b/packages/nocodb/src/strategies/authtoken.strategy/authtoken.strategy.ts
@@ -2,13 +2,14 @@ import { Injectable } from '@nestjs/common';
import { PassportStrategy } from '@nestjs/passport';
import { extractRolesObj, ProjectRoles } from 'nocodb-sdk';
import { Strategy } from 'passport-custom';
+import type { Request } from 'express';
import { ApiToken, BaseUser, User } from '~/models';
import { sanitiseUserObj } from '~/utils';
@Injectable()
export class AuthTokenStrategy extends PassportStrategy(Strategy, 'authtoken') {
// eslint-disable-next-line @typescript-eslint/ban-types
- async validate(req: any, callback: Function) {
+ async validate(req: Request, callback: Function) {
try {
let user;
if (req.headers['xc-token']) {
diff --git a/packages/nocodb/src/strategies/base-view.strategy/base-view.strategy.ts b/packages/nocodb/src/strategies/base-view.strategy/base-view.strategy.ts
index 6f301465b4..022fc3b67b 100644
--- a/packages/nocodb/src/strategies/base-view.strategy/base-view.strategy.ts
+++ b/packages/nocodb/src/strategies/base-view.strategy/base-view.strategy.ts
@@ -2,12 +2,13 @@ import { Injectable, UnauthorizedException } from '@nestjs/common';
import { PassportStrategy } from '@nestjs/passport';
import { Strategy } from 'passport-custom';
import { extractRolesObj } from 'nocodb-sdk';
+import type { Request } from 'express';
import { Base } from '~/models';
@Injectable()
export class BaseViewStrategy extends PassportStrategy(Strategy, 'base-view') {
// eslint-disable-next-line @typescript-eslint/ban-types
- async validate(req: any, callback: Function) {
+ async validate(req: Request, callback: Function) {
try {
let user;
if (req.headers['xc-shared-base-id']) {
diff --git a/packages/nocodb/src/strategies/google.strategy/google.strategy.ts b/packages/nocodb/src/strategies/google.strategy/google.strategy.ts
index 3a4e568a68..f7eaea5b73 100644
--- a/packages/nocodb/src/strategies/google.strategy/google.strategy.ts
+++ b/packages/nocodb/src/strategies/google.strategy/google.strategy.ts
@@ -3,6 +3,7 @@ import { Injectable, Optional } from '@nestjs/common';
import { PassportStrategy } from '@nestjs/passport';
import { Strategy } from 'passport-google-oauth20';
import bcrypt from 'bcryptjs';
+import type { Request } from 'express';
import type { VerifyCallback } from 'passport-google-oauth20';
import type { FactoryProvider } from '@nestjs/common/interfaces/modules/provider.interface';
import Noco from '~/Noco';
@@ -20,7 +21,7 @@ export class GoogleStrategy extends PassportStrategy(Strategy, 'google') {
}
async validate(
- req: any,
+ req: Request,
accessToken: string,
refreshToken: string,
profile: any,
@@ -53,6 +54,7 @@ export class GoogleStrategy extends PassportStrategy(Strategy, 'google') {
email: profile.emails[0].value,
password: '',
salt,
+ req,
});
return done(null, sanitiseUserObj(user));
}
@@ -71,7 +73,7 @@ export class GoogleStrategy extends PassportStrategy(Strategy, 'google') {
return params;
}
- async authenticate(req: any, options?: any): Promise {
+ async authenticate(req: Request, options?: any): Promise {
const googlePlugin = await Plugin.getPluginByTitle('Google');
if (googlePlugin && googlePlugin.input) {
diff --git a/packages/nocodb/src/types/express.d.ts b/packages/nocodb/src/types/express.d.ts
new file mode 100644
index 0000000000..dc68aac2cc
--- /dev/null
+++ b/packages/nocodb/src/types/express.d.ts
@@ -0,0 +1,14 @@
+import type { UserType } from 'nocodb-sdk';
+declare module 'express-serve-static-core' {
+ interface Request {
+ ncWorkspaceId?: string;
+ ncProjectId?: string;
+ user: UserType & {
+ base_roles?: Record;
+ workspace_roles?: Record;
+ provider?: string;
+ };
+ ncSiteUrl: string;
+ clientIp: string;
+ }
+}
diff --git a/packages/nocodb/src/utils/acl.ts b/packages/nocodb/src/utils/acl.ts
index d570b8584f..a261ac6120 100644
--- a/packages/nocodb/src/utils/acl.ts
+++ b/packages/nocodb/src/utils/acl.ts
@@ -116,6 +116,7 @@ const permissionScopes = {
'bulkDataDeleteAll',
'relationDataRemove',
'relationDataAdd',
+ 'duplicateColumn',
// Base API Tokens
'baseApiTokenList',
diff --git a/packages/nocodb/tests/unit/factory/row.ts b/packages/nocodb/tests/unit/factory/row.ts
index 286c0bed9f..3d0140ac5a 100644
--- a/packages/nocodb/tests/unit/factory/row.ts
+++ b/packages/nocodb/tests/unit/factory/row.ts
@@ -232,7 +232,7 @@ const listRow = async ({
const ignorePagination = !options;
- return await baseModel.list(options, ignorePagination);
+ return await baseModel.list(options, { ignorePagination });
};
const getOneRow = async (
diff --git a/packages/nocodb/tests/unit/rest/tests/groupby.test.ts b/packages/nocodb/tests/unit/rest/tests/groupby.test.ts
index b4bf578603..8c61ece1ca 100644
--- a/packages/nocodb/tests/unit/rest/tests/groupby.test.ts
+++ b/packages/nocodb/tests/unit/rest/tests/groupby.test.ts
@@ -7,7 +7,7 @@ import { listRow } from '../../factory/row';
import { getTable } from '../../factory/table';
import { getView, updateView } from '../../factory/view';
import init from '../../init';
-import type { Column, Model, Base, View } from '../../../../src/models';
+import type { Base, Column, Model, View } from '../../../../src/models';
import 'mocha';
function groupByTests() {
@@ -226,7 +226,9 @@ function groupByTests() {
],
});
const response = await request(context.app)
- .get(`/api/v1/db/data/noco/${sakilaProject.id}/${filmTable.id}/groupby`)
+ .get(
+ `/api/v1/db/data/noco/${sakilaProject.id}/${filmTable.id}/views/${filmView.id}/groupby`,
+ )
.set('xc-auth', context.token)
.query({
column_name: _lengthColumn.column_name,
diff --git a/packages/nocodb/tests/unit/test_meta.db b/packages/nocodb/tests/unit/test_meta.db
index 767c6c59c5..f348c5026b 100644
Binary files a/packages/nocodb/tests/unit/test_meta.db and b/packages/nocodb/tests/unit/test_meta.db differ
diff --git a/packages/nocodb/tests/unit/tsconfig.ee.json b/packages/nocodb/tests/unit/tsconfig.ee.json
index 5fb5d10896..adf6aeec5e 100644
--- a/packages/nocodb/tests/unit/tsconfig.ee.json
+++ b/packages/nocodb/tests/unit/tsconfig.ee.json
@@ -50,11 +50,12 @@
"dom"
],
"types": [
- "mocha", "node"
+ "mocha",
+ "node"
],
"typeRoots": [
- "node_modules/@types",
- "src/types"
+ "../../src/types",
+ "../../node_modules/@types"
]
},
"parserOptions": {
diff --git a/packages/nocodb/tests/unit/tsconfig.json b/packages/nocodb/tests/unit/tsconfig.json
index 0685f510ab..377a5d6e71 100644
--- a/packages/nocodb/tests/unit/tsconfig.json
+++ b/packages/nocodb/tests/unit/tsconfig.json
@@ -50,18 +50,14 @@
"dom"
],
"types": [
- "mocha", "node"
+ "mocha",
+ "node"
],
"typeRoots": [
- "node_modules/@types",
- "src/types"
+ "../../src/types",
+ "../../node_modules/@types"
]
},
- "parserOptions": {
- "sourceType": "module",
- "tsconfigRootDir": "./",
- "project": "./tsconfig.json"
- },
"include": [
"./tests/**/**/**.ts",
"./tests/**/**.ts"
diff --git a/packages/nocodb/tsconfig.json b/packages/nocodb/tsconfig.json
index c9121c8022..a9f79b3ffb 100644
--- a/packages/nocodb/tsconfig.json
+++ b/packages/nocodb/tsconfig.json
@@ -1,6 +1,8 @@
{
"ts-node": {
- "require": ["tsconfig-paths/register"]
+ "require": [
+ "tsconfig-paths/register"
+ ]
},
"compilerOptions": {
"module": "commonjs",
@@ -23,9 +25,19 @@
"resolveJsonModule": true,
"esModuleInterop": true,
"paths": {
- "src/*": ["./src/*"],
- "~/*": ["./src/*"],
- "@/*": ["./src/*"]
- }
+ "src/*": [
+ "./src/*"
+ ],
+ "~/*": [
+ "./src/*"
+ ],
+ "@/*": [
+ "./src/*"
+ ]
+ },
+ "typeRoots": [
+ "./src/types",
+ "./node_modules/@types"
+ ]
}
}
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index d4f6b9fa1c..d439c03ca0 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -29,37 +29,37 @@ importers:
dependencies:
'@braks/revue-draggable':
specifier: ^0.4.3
- version: 0.4.3(vue@3.3.7)
+ version: 0.4.3(vue@3.3.8)
'@ckpack/vue-color':
specifier: ^1.2.0
- version: 1.2.0(vue@3.3.7)
+ version: 1.2.0(vue@3.3.8)
'@iconify/vue':
specifier: ^4.1.1
- version: 4.1.1(vue@3.3.7)
+ version: 4.1.1(vue@3.3.8)
'@pinia/nuxt':
specifier: ^0.4.11
- version: 0.4.11(vue@3.3.7)
+ version: 0.4.11(vue@3.3.8)
'@vue-flow/additional-components':
specifier: ^1.2.0
- version: 1.2.0(@vue-flow/core@1.3.0)(vue@3.3.7)
+ version: 1.2.0(@vue-flow/core@1.3.0)(vue@3.3.8)
'@vue-flow/core':
specifier: ^1.3.0
- version: 1.3.0(vue@3.3.7)
+ version: 1.3.0(vue@3.3.8)
'@vuelidate/core':
specifier: ^2.0.0-alpha.44
- version: 2.0.0-alpha.44(vue@3.3.7)
+ version: 2.0.0-alpha.44(vue@3.3.8)
'@vuelidate/validators':
specifier: ^2.0.0-alpha.31
- version: 2.0.0-alpha.31(vue@3.3.7)
+ version: 2.0.0-alpha.31(vue@3.3.8)
'@vueuse/core':
specifier: ^10.2.1
- version: 10.2.1(vue@3.3.7)
+ version: 10.2.1(vue@3.3.8)
'@vueuse/integrations':
specifier: ^10.2.1
- version: 10.2.1(fuse.js@6.6.2)(jwt-decode@3.1.2)(qrcode@1.5.1)(sortablejs@1.15.0)(vue@3.3.7)
+ version: 10.2.1(fuse.js@6.6.2)(jwt-decode@3.1.2)(qrcode@1.5.1)(sortablejs@1.15.0)(vue@3.3.8)
ant-design-vue:
specifier: ^3.2.11
- version: 3.2.11(vue@3.3.7)
+ version: 3.2.11(vue@3.3.8)
chart.js:
specifier: ^4.3.0
version: 4.3.0
@@ -80,7 +80,7 @@ importers:
version: 1.1.9
emoji-mart-vue-fast:
specifier: ^15.0.0
- version: 15.0.0(vue@3.3.7)
+ version: 15.0.0(vue@3.3.8)
file-saver:
specifier: ^2.0.5
version: 2.0.5
@@ -125,7 +125,7 @@ importers:
version: 1.0.2
pinia:
specifier: ^2.1.4
- version: 2.1.4(vue@3.3.7)
+ version: 2.1.4(vue@3.3.8)
qrcode:
specifier: ^1.5.1
version: 1.5.1
@@ -161,22 +161,22 @@ importers:
version: 1.0.3
vue-chartjs:
specifier: ^5.2.0
- version: 5.2.0(chart.js@4.3.0)(vue@3.3.7)
+ version: 5.2.0(chart.js@4.3.0)(vue@3.3.8)
vue-dompurify-html:
specifier: ^3.0.0
- version: 3.0.0(vue@3.3.7)
+ version: 3.0.0(vue@3.3.8)
vue-github-button:
specifier: ^3.1.0
version: 3.1.0
vue-i18n:
specifier: ^9.2.2
- version: 9.2.2(vue@3.3.7)
+ version: 9.2.2(vue@3.3.8)
vue-qrcode-reader:
specifier: 3.1.0-vue3-compatibility.2
version: 3.1.0-vue3-compatibility.2
vue3-calendar-heatmap:
specifier: ^2.0.0
- version: 2.0.0(vue@3.3.7)
+ version: 2.0.0(vue@3.3.8)
vue3-contextmenu:
specifier: ^0.2.12
version: 0.2.12
@@ -185,10 +185,10 @@ importers:
version: 1.0.5(@interactjs/core@1.10.18)(@interactjs/utils@1.10.18)
vue3-text-clamp:
specifier: ^0.1.1
- version: 0.1.1(resize-detector@0.3.0)(vue@3.3.7)
+ version: 0.1.1(resize-detector@0.3.0)(vue@3.3.8)
vuedraggable:
specifier: ^4.1.0
- version: 4.1.0(vue@3.3.7)
+ version: 4.1.0(vue@3.3.8)
xlsx:
specifier: ^0.18.5
version: 0.18.5
@@ -318,10 +318,10 @@ importers:
version: 3.2.37
'@vue/test-utils':
specifier: ^2.0.2
- version: 2.0.2(vue@3.3.7)
+ version: 2.0.2(vue@3.3.8)
'@vueuse/nuxt':
specifier: ^10.2.1
- version: 10.2.1(nuxt@3.6.5)(vue@3.3.7)
+ version: 10.2.1(nuxt@3.8.1)(vue@3.3.8)
'@windicss/plugin-animations':
specifier: ^1.0.9
version: 1.0.9
@@ -344,8 +344,8 @@ importers:
specifier: ^6.0.3
version: 6.0.3
nuxt:
- specifier: ^3.6.5
- version: 3.6.5(@types/node@20.3.1)(eslint@8.33.0)(sass@1.63.4)
+ specifier: ^3.8.1
+ version: 3.8.1(eslint@8.33.0)(sass@1.63.4)(vite@4.4.9)
nuxt-windicss:
specifier: ^2.6.1
version: 2.6.1(vite@4.4.9)
@@ -363,7 +363,7 @@ importers:
version: 0.14.15(@vue/compiler-sfc@3.2.37)
unplugin-vue-components:
specifier: ^0.22.12
- version: 0.22.12(vue@3.3.7)
+ version: 0.22.12(vue@3.3.8)
vite-plugin-monaco-editor:
specifier: ^1.1.0
version: 1.1.0(monaco-editor@0.33.0)
@@ -1122,14 +1122,14 @@ packages:
resolution: {integrity: sha512-4QBZg8ccyC6LPIRii7A0bZUk3+lEDCLnhB+FVsflGdcWPPmV+j3fire4AwwoqHV/BibgvBmR9ZIo4s867smv+g==}
dev: false
- /@ant-design/icons-vue@6.1.0(vue@3.3.7):
+ /@ant-design/icons-vue@6.1.0(vue@3.3.8):
resolution: {integrity: sha512-EX6bYm56V+ZrKN7+3MT/ubDkvJ5rK/O2t380WFRflDcVFgsvl3NLH7Wxeau6R8DbrO5jWR6DSTC3B6gYFp77AA==}
peerDependencies:
vue: latest
dependencies:
'@ant-design/colors': 6.0.0
'@ant-design/icons-svg': 4.3.1
- vue: 3.3.7
+ vue: 3.3.8
dev: false
/@antfu/eslint-config-basic@0.26.0(@typescript-eslint/parser@5.62.0)(eslint@8.33.0):
@@ -2845,6 +2845,14 @@ packages:
'@babel/highlight': 7.22.10
chalk: 2.4.2
+ /@babel/code-frame@7.22.13:
+ resolution: {integrity: sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/highlight': 7.22.20
+ chalk: 2.4.2
+ dev: true
+
/@babel/compat-data@7.22.9:
resolution: {integrity: sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ==}
engines: {node: '>=6.9.0'}
@@ -2871,6 +2879,29 @@ packages:
transitivePeerDependencies:
- supports-color
+ /@babel/core@7.23.2:
+ resolution: {integrity: sha512-n7s51eWdaWZ3vGT2tD4T7J6eJs3QoBXydv7vkUM06Bf1cbVD2Kc2UrkzhiQwobfV7NwOnQXYL7UBJ5VPU+RGoQ==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@ampproject/remapping': 2.2.1
+ '@babel/code-frame': 7.22.13
+ '@babel/generator': 7.23.0
+ '@babel/helper-compilation-targets': 7.22.15
+ '@babel/helper-module-transforms': 7.23.0(@babel/core@7.23.2)
+ '@babel/helpers': 7.23.2
+ '@babel/parser': 7.23.0
+ '@babel/template': 7.22.15
+ '@babel/traverse': 7.23.2
+ '@babel/types': 7.23.0
+ convert-source-map: 2.0.0
+ debug: 4.3.4(supports-color@8.1.1)
+ gensync: 1.0.0-beta.2
+ json5: 2.2.3
+ semver: 6.3.1
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
/@babel/generator@7.22.10:
resolution: {integrity: sha512-79KIf7YiWjjdZ81JnLujDRApWtl7BxTqWD88+FFdQEIOG8LJ0etDOM7CXuIgGJa55sGOwZVwuEsaLEm0PJ5/+A==}
engines: {node: '>=6.9.0'}
@@ -2880,6 +2911,16 @@ packages:
'@jridgewell/trace-mapping': 0.3.19
jsesc: 2.5.2
+ /@babel/generator@7.23.0:
+ resolution: {integrity: sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/types': 7.23.0
+ '@jridgewell/gen-mapping': 0.3.3
+ '@jridgewell/trace-mapping': 0.3.19
+ jsesc: 2.5.2
+ dev: true
+
/@babel/helper-annotate-as-pure@7.22.5:
resolution: {integrity: sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==}
engines: {node: '>=6.9.0'}
@@ -2897,6 +2938,17 @@ packages:
lru-cache: 5.1.1
semver: 6.3.1
+ /@babel/helper-compilation-targets@7.22.15:
+ resolution: {integrity: sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/compat-data': 7.22.9
+ '@babel/helper-validator-option': 7.22.15
+ browserslist: 4.21.10
+ lru-cache: 5.1.1
+ semver: 6.3.1
+ dev: true
+
/@babel/helper-create-class-features-plugin@7.22.11(@babel/core@7.22.11):
resolution: {integrity: sha512-y1grdYL4WzmUDBRGK0pDbIoFd7UZKoDurDzWEoNMYoj1EL+foGRQNyPWDcC+YyegN5y1DUsFFmzjGijB3nSVAQ==}
engines: {node: '>=6.9.0'}
@@ -2915,6 +2967,29 @@ packages:
semver: 6.3.1
dev: true
+ /@babel/helper-create-class-features-plugin@7.22.15(@babel/core@7.23.2):
+ resolution: {integrity: sha512-jKkwA59IXcvSaiK2UN45kKwSC9o+KuoXsBDvHvU/7BecYIp8GQ2UwrVvFgJASUT+hBnwJx6MhvMCuMzwZZ7jlg==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0
+ dependencies:
+ '@babel/core': 7.23.2
+ '@babel/helper-annotate-as-pure': 7.22.5
+ '@babel/helper-environment-visitor': 7.22.5
+ '@babel/helper-function-name': 7.22.5
+ '@babel/helper-member-expression-to-functions': 7.23.0
+ '@babel/helper-optimise-call-expression': 7.22.5
+ '@babel/helper-replace-supers': 7.22.20(@babel/core@7.23.2)
+ '@babel/helper-skip-transparent-expression-wrappers': 7.22.5
+ '@babel/helper-split-export-declaration': 7.22.6
+ semver: 6.3.1
+ dev: true
+
+ /@babel/helper-environment-visitor@7.22.20:
+ resolution: {integrity: sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==}
+ engines: {node: '>=6.9.0'}
+ dev: true
+
/@babel/helper-environment-visitor@7.22.5:
resolution: {integrity: sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==}
engines: {node: '>=6.9.0'}
@@ -2926,6 +3001,14 @@ packages:
'@babel/template': 7.22.5
'@babel/types': 7.22.11
+ /@babel/helper-function-name@7.23.0:
+ resolution: {integrity: sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/template': 7.22.15
+ '@babel/types': 7.23.0
+ dev: true
+
/@babel/helper-hoist-variables@7.22.5:
resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==}
engines: {node: '>=6.9.0'}
@@ -2939,6 +3022,20 @@ packages:
'@babel/types': 7.22.11
dev: true
+ /@babel/helper-member-expression-to-functions@7.23.0:
+ resolution: {integrity: sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/types': 7.23.0
+ dev: true
+
+ /@babel/helper-module-imports@7.22.15:
+ resolution: {integrity: sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/types': 7.23.0
+ dev: true
+
/@babel/helper-module-imports@7.22.5:
resolution: {integrity: sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==}
engines: {node: '>=6.9.0'}
@@ -2958,6 +3055,20 @@ packages:
'@babel/helper-split-export-declaration': 7.22.6
'@babel/helper-validator-identifier': 7.22.5
+ /@babel/helper-module-transforms@7.23.0(@babel/core@7.23.2):
+ resolution: {integrity: sha512-WhDWw1tdrlT0gMgUJSlX0IQvoO1eN279zrAUbVB+KpV2c3Tylz8+GnKOLllCS6Z/iZQEyVYxhZVUdPTqs2YYPw==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0
+ dependencies:
+ '@babel/core': 7.23.2
+ '@babel/helper-environment-visitor': 7.22.20
+ '@babel/helper-module-imports': 7.22.15
+ '@babel/helper-simple-access': 7.22.5
+ '@babel/helper-split-export-declaration': 7.22.6
+ '@babel/helper-validator-identifier': 7.22.20
+ dev: true
+
/@babel/helper-optimise-call-expression@7.22.5:
resolution: {integrity: sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==}
engines: {node: '>=6.9.0'}
@@ -2970,6 +3081,18 @@ packages:
engines: {node: '>=6.9.0'}
dev: true
+ /@babel/helper-replace-supers@7.22.20(@babel/core@7.23.2):
+ resolution: {integrity: sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0
+ dependencies:
+ '@babel/core': 7.23.2
+ '@babel/helper-environment-visitor': 7.22.20
+ '@babel/helper-member-expression-to-functions': 7.23.0
+ '@babel/helper-optimise-call-expression': 7.22.5
+ dev: true
+
/@babel/helper-replace-supers@7.22.9(@babel/core@7.22.11):
resolution: {integrity: sha512-LJIKvvpgPOPUThdYqcX6IXRuIcTkcAub0IaDRGCZH0p5GPUp7PhRU9QVgFcDDd51BaPkk77ZjqFwh6DZTAEmGg==}
engines: {node: '>=6.9.0'}
@@ -3005,10 +3128,20 @@ packages:
resolution: {integrity: sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==}
engines: {node: '>=6.9.0'}
+ /@babel/helper-validator-identifier@7.22.20:
+ resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==}
+ engines: {node: '>=6.9.0'}
+ dev: true
+
/@babel/helper-validator-identifier@7.22.5:
resolution: {integrity: sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==}
engines: {node: '>=6.9.0'}
+ /@babel/helper-validator-option@7.22.15:
+ resolution: {integrity: sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==}
+ engines: {node: '>=6.9.0'}
+ dev: true
+
/@babel/helper-validator-option@7.22.5:
resolution: {integrity: sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==}
engines: {node: '>=6.9.0'}
@@ -3023,6 +3156,17 @@ packages:
transitivePeerDependencies:
- supports-color
+ /@babel/helpers@7.23.2:
+ resolution: {integrity: sha512-lzchcp8SjTSVe/fPmLwtWVBFC7+Tbn8LGHDVfDp9JGxpAY5opSaEFgt8UQvrnECWOTdji2mOWMz1rOhkHscmGQ==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/template': 7.22.15
+ '@babel/traverse': 7.23.2
+ '@babel/types': 7.23.0
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
/@babel/highlight@7.22.10:
resolution: {integrity: sha512-78aUtVcT7MUscr0K5mIEnkwxPE0MaxkR5RxRwuHaQ+JuU5AmTPhY+do2mdzVTnIJJpyBglql2pehuBIWHug+WQ==}
engines: {node: '>=6.9.0'}
@@ -3031,6 +3175,15 @@ packages:
chalk: 2.4.2
js-tokens: 4.0.0
+ /@babel/highlight@7.22.20:
+ resolution: {integrity: sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/helper-validator-identifier': 7.22.20
+ chalk: 2.4.2
+ js-tokens: 4.0.0
+ dev: true
+
/@babel/parser@7.22.11:
resolution: {integrity: sha512-R5zb8eJIBPJriQtbH/htEQy4k7E2dHWlD2Y2VT07JCzwYZHBxV5ZYtM0UhXSNMT74LyxuM+b1jdL7pSesXbC/g==}
engines: {node: '>=6.0.0'}
@@ -3046,6 +3199,20 @@ packages:
dependencies:
'@babel/types': 7.22.11
+ /@babel/plugin-proposal-decorators@7.23.2(@babel/core@7.23.2):
+ resolution: {integrity: sha512-eR0gJQc830fJVGz37oKLvt9W9uUIQSAovUl0e9sJ3YeO09dlcoBVYD3CLrjCj4qHdXmfiyTyFt8yeQYSN5fxLg==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.23.2
+ '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.23.2)
+ '@babel/helper-plugin-utils': 7.22.5
+ '@babel/helper-replace-supers': 7.22.20(@babel/core@7.23.2)
+ '@babel/helper-split-export-declaration': 7.22.6
+ '@babel/plugin-syntax-decorators': 7.22.10(@babel/core@7.23.2)
+ dev: true
+
/@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.22.11):
resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==}
peerDependencies:
@@ -3073,6 +3240,26 @@ packages:
'@babel/helper-plugin-utils': 7.22.5
dev: true
+ /@babel/plugin-syntax-decorators@7.22.10(@babel/core@7.23.2):
+ resolution: {integrity: sha512-z1KTVemBjnz+kSEilAsI4lbkPOl5TvJH7YDSY1CTIzvLWJ+KHXp+mRe8VPmfnyvqOPqar1V2gid2PleKzRUstQ==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.23.2
+ '@babel/helper-plugin-utils': 7.22.5
+ dev: true
+
+ /@babel/plugin-syntax-import-attributes@7.22.5(@babel/core@7.23.2):
+ resolution: {integrity: sha512-KwvoWDeNKPETmozyFE0P2rOLqh39EoQHNjqizrI5B8Vt0ZNS7M56s7dAiAqbYfiAYOuIzIh96z3iR2ktgu3tEg==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.23.2
+ '@babel/helper-plugin-utils': 7.22.5
+ dev: true
+
/@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.22.11):
resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==}
peerDependencies:
@@ -3082,6 +3269,15 @@ packages:
'@babel/helper-plugin-utils': 7.22.5
dev: true
+ /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.23.2):
+ resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.23.2
+ '@babel/helper-plugin-utils': 7.22.5
+ dev: true
+
/@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.22.11):
resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==}
peerDependencies:
@@ -3101,6 +3297,16 @@ packages:
'@babel/helper-plugin-utils': 7.22.5
dev: true
+ /@babel/plugin-syntax-jsx@7.22.5(@babel/core@7.23.2):
+ resolution: {integrity: sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.23.2
+ '@babel/helper-plugin-utils': 7.22.5
+ dev: true
+
/@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.22.11):
resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==}
peerDependencies:
@@ -3175,6 +3381,16 @@ packages:
'@babel/helper-plugin-utils': 7.22.5
dev: true
+ /@babel/plugin-syntax-typescript@7.22.5(@babel/core@7.23.2):
+ resolution: {integrity: sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.23.2
+ '@babel/helper-plugin-utils': 7.22.5
+ dev: true
+
/@babel/plugin-transform-typescript@7.22.11(@babel/core@7.22.11):
resolution: {integrity: sha512-0E4/L+7gfvHub7wsbTv03oRtD69X31LByy44fGmFzbZScpupFByMcgCJ0VbBTkzyjSJKuRoGN8tcijOWKTmqOA==}
engines: {node: '>=6.9.0'}
@@ -3188,6 +3404,19 @@ packages:
'@babel/plugin-syntax-typescript': 7.22.5(@babel/core@7.22.11)
dev: true
+ /@babel/plugin-transform-typescript@7.22.15(@babel/core@7.23.2):
+ resolution: {integrity: sha512-1uirS0TnijxvQLnlv5wQBwOX3E1wCFX7ITv+9pBV2wKEk4K+M5tqDaoNXnTH8tjEIYHLO98MwiTWO04Ggz4XuA==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.23.2
+ '@babel/helper-annotate-as-pure': 7.22.5
+ '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.23.2)
+ '@babel/helper-plugin-utils': 7.22.5
+ '@babel/plugin-syntax-typescript': 7.22.5(@babel/core@7.23.2)
+ dev: true
+
/@babel/runtime@7.22.11:
resolution: {integrity: sha512-ee7jVNlWN09+KftVOu9n7S8gQzD/Z6hN/I8VBRXW4P1+Xe7kJGXMwu8vds4aGIMHZnNbdpSWCfZZtinytpcAvA==}
engines: {node: '>=6.9.0'}
@@ -3199,6 +3428,15 @@ packages:
resolution: {integrity: sha512-Od5EnOR/gvwwvLCaJCypkVW6C9PitK2tu/aHb+ZpPnwkVidmlJ+7jUf8YLm9BrNILfT9P8etZq/t6r1IrFauQw==}
engines: {node: '>=6.9.0'}
+ /@babel/template@7.22.15:
+ resolution: {integrity: sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/code-frame': 7.22.13
+ '@babel/parser': 7.23.0
+ '@babel/types': 7.23.0
+ dev: true
+
/@babel/template@7.22.5:
resolution: {integrity: sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==}
engines: {node: '>=6.9.0'}
@@ -3224,6 +3462,24 @@ packages:
transitivePeerDependencies:
- supports-color
+ /@babel/traverse@7.23.2:
+ resolution: {integrity: sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/code-frame': 7.22.13
+ '@babel/generator': 7.23.0
+ '@babel/helper-environment-visitor': 7.22.20
+ '@babel/helper-function-name': 7.23.0
+ '@babel/helper-hoist-variables': 7.22.5
+ '@babel/helper-split-export-declaration': 7.22.6
+ '@babel/parser': 7.23.0
+ '@babel/types': 7.23.0
+ debug: 4.3.4(supports-color@8.1.1)
+ globals: 11.12.0
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
/@babel/types@7.22.11:
resolution: {integrity: sha512-siazHiGuZRz9aB9NpHy9GOs9xiQPKnMzgdr493iI1M67vRXpnEq8ZOOKzezC5q7zwuQ6sDhdSp4SD9ixKSqKZg==}
engines: {node: '>=6.9.0'}
@@ -3232,6 +3488,15 @@ packages:
'@babel/helper-validator-identifier': 7.22.5
to-fast-properties: 2.0.0
+ /@babel/types@7.23.0:
+ resolution: {integrity: sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/helper-string-parser': 7.22.5
+ '@babel/helper-validator-identifier': 7.22.20
+ to-fast-properties: 2.0.0
+ dev: true
+
/@bcoe/v8-coverage@0.2.3:
resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==}
dev: true
@@ -3241,7 +3506,7 @@ packages:
engines: {node: '>=8.9'}
dev: false
- /@braks/revue-draggable@0.4.3(vue@3.3.7):
+ /@braks/revue-draggable@0.4.3(vue@3.3.8):
resolution: {integrity: sha512-wmsfNHJQgSX0HFA726r+cm6ixYs+z/KLxfg1cx6xZ1PBGeZsuQCACdNdoKckyr/IH8FgIbBoIH0/6QiSbW3tEQ==}
peerDependencies:
'@vue/composition-api': ^1.0.0-rc.1
@@ -3250,12 +3515,12 @@ packages:
'@vue/composition-api':
optional: true
dependencies:
- '@vueuse/core': 7.7.1(vue@3.3.7)
- vue: 3.3.7
- vue-demi: 0.14.6(vue@3.3.7)
+ '@vueuse/core': 7.7.1(vue@3.3.8)
+ vue: 3.3.8
+ vue-demi: 0.14.6(vue@3.3.8)
dev: false
- /@ckpack/vue-color@1.2.0(vue@3.3.7):
+ /@ckpack/vue-color@1.2.0(vue@3.3.8):
resolution: {integrity: sha512-c9X82nppYjSxjlITO6jdLLdt9HoyZzqEWpqDL2V6NJd859d6GCh/2AHeRXk+37uRJ1UdTkCuty93WOEqja8quw==}
engines: {node: '>=12'}
peerDependencies:
@@ -3264,7 +3529,7 @@ packages:
'@ctrl/tinycolor': 3.6.1
lodash-es: 4.17.21
material-colors: 1.2.6
- vue: 3.3.7
+ vue: 3.3.8
dev: false
/@clickhouse/client@0.0.14:
@@ -3460,15 +3725,6 @@ packages:
rollup-plugin-node-polyfills: 0.2.1
dev: true
- /@esbuild/android-arm64@0.17.19:
- resolution: {integrity: sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==}
- engines: {node: '>=12'}
- cpu: [arm64]
- os: [android]
- requiresBuild: true
- dev: true
- optional: true
-
/@esbuild/android-arm64@0.18.20:
resolution: {integrity: sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==}
engines: {node: '>=12'}
@@ -3487,10 +3743,10 @@ packages:
dev: true
optional: true
- /@esbuild/android-arm@0.17.19:
- resolution: {integrity: sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A==}
+ /@esbuild/android-arm64@0.19.5:
+ resolution: {integrity: sha512-5d1OkoJxnYQfmC+Zd8NBFjkhyCNYwM4n9ODrycTFY6Jk1IGiZ+tjVJDDSwDt77nK+tfpGP4T50iMtVi4dEGzhQ==}
engines: {node: '>=12'}
- cpu: [arm]
+ cpu: [arm64]
os: [android]
requiresBuild: true
dev: true
@@ -3514,10 +3770,10 @@ packages:
dev: true
optional: true
- /@esbuild/android-x64@0.17.19:
- resolution: {integrity: sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww==}
+ /@esbuild/android-arm@0.19.5:
+ resolution: {integrity: sha512-bhvbzWFF3CwMs5tbjf3ObfGqbl/17ict2/uwOSfr3wmxDE6VdS2GqY/FuzIPe0q0bdhj65zQsvqfArI9MY6+AA==}
engines: {node: '>=12'}
- cpu: [x64]
+ cpu: [arm]
os: [android]
requiresBuild: true
dev: true
@@ -3541,11 +3797,11 @@ packages:
dev: true
optional: true
- /@esbuild/darwin-arm64@0.17.19:
- resolution: {integrity: sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg==}
+ /@esbuild/android-x64@0.19.5:
+ resolution: {integrity: sha512-9t+28jHGL7uBdkBjL90QFxe7DVA+KGqWlHCF8ChTKyaKO//VLuoBricQCgwhOjA1/qOczsw843Fy4cbs4H3DVA==}
engines: {node: '>=12'}
- cpu: [arm64]
- os: [darwin]
+ cpu: [x64]
+ os: [android]
requiresBuild: true
dev: true
optional: true
@@ -3568,10 +3824,10 @@ packages:
dev: true
optional: true
- /@esbuild/darwin-x64@0.17.19:
- resolution: {integrity: sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw==}
+ /@esbuild/darwin-arm64@0.19.5:
+ resolution: {integrity: sha512-mvXGcKqqIqyKoxq26qEDPHJuBYUA5KizJncKOAf9eJQez+L9O+KfvNFu6nl7SCZ/gFb2QPaRqqmG0doSWlgkqw==}
engines: {node: '>=12'}
- cpu: [x64]
+ cpu: [arm64]
os: [darwin]
requiresBuild: true
dev: true
@@ -3595,11 +3851,11 @@ packages:
dev: true
optional: true
- /@esbuild/freebsd-arm64@0.17.19:
- resolution: {integrity: sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ==}
+ /@esbuild/darwin-x64@0.19.5:
+ resolution: {integrity: sha512-Ly8cn6fGLNet19s0X4unjcniX24I0RqjPv+kurpXabZYSXGM4Pwpmf85WHJN3lAgB8GSth7s5A0r856S+4DyiA==}
engines: {node: '>=12'}
- cpu: [arm64]
- os: [freebsd]
+ cpu: [x64]
+ os: [darwin]
requiresBuild: true
dev: true
optional: true
@@ -3622,10 +3878,10 @@ packages:
dev: true
optional: true
- /@esbuild/freebsd-x64@0.17.19:
- resolution: {integrity: sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ==}
+ /@esbuild/freebsd-arm64@0.19.5:
+ resolution: {integrity: sha512-GGDNnPWTmWE+DMchq1W8Sd0mUkL+APvJg3b11klSGUDvRXh70JqLAO56tubmq1s2cgpVCSKYywEiKBfju8JztQ==}
engines: {node: '>=12'}
- cpu: [x64]
+ cpu: [arm64]
os: [freebsd]
requiresBuild: true
dev: true
@@ -3649,11 +3905,11 @@ packages:
dev: true
optional: true
- /@esbuild/linux-arm64@0.17.19:
- resolution: {integrity: sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg==}
+ /@esbuild/freebsd-x64@0.19.5:
+ resolution: {integrity: sha512-1CCwDHnSSoA0HNwdfoNY0jLfJpd7ygaLAp5EHFos3VWJCRX9DMwWODf96s9TSse39Br7oOTLryRVmBoFwXbuuQ==}
engines: {node: '>=12'}
- cpu: [arm64]
- os: [linux]
+ cpu: [x64]
+ os: [freebsd]
requiresBuild: true
dev: true
optional: true
@@ -3676,10 +3932,10 @@ packages:
dev: true
optional: true
- /@esbuild/linux-arm@0.17.19:
- resolution: {integrity: sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA==}
+ /@esbuild/linux-arm64@0.19.5:
+ resolution: {integrity: sha512-o3vYippBmSrjjQUCEEiTZ2l+4yC0pVJD/Dl57WfPwwlvFkrxoSO7rmBZFii6kQB3Wrn/6GwJUPLU5t52eq2meA==}
engines: {node: '>=12'}
- cpu: [arm]
+ cpu: [arm64]
os: [linux]
requiresBuild: true
dev: true
@@ -3703,10 +3959,10 @@ packages:
dev: true
optional: true
- /@esbuild/linux-ia32@0.17.19:
- resolution: {integrity: sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==}
+ /@esbuild/linux-arm@0.19.5:
+ resolution: {integrity: sha512-lrWXLY/vJBzCPC51QN0HM71uWgIEpGSjSZZADQhq7DKhPcI6NH1IdzjfHkDQws2oNpJKpR13kv7/pFHBbDQDwQ==}
engines: {node: '>=12'}
- cpu: [ia32]
+ cpu: [arm]
os: [linux]
requiresBuild: true
dev: true
@@ -3730,10 +3986,10 @@ packages:
dev: true
optional: true
- /@esbuild/linux-loong64@0.17.19:
- resolution: {integrity: sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ==}
+ /@esbuild/linux-ia32@0.19.5:
+ resolution: {integrity: sha512-MkjHXS03AXAkNp1KKkhSKPOCYztRtK+KXDNkBa6P78F8Bw0ynknCSClO/ztGszILZtyO/lVKpa7MolbBZ6oJtQ==}
engines: {node: '>=12'}
- cpu: [loong64]
+ cpu: [ia32]
os: [linux]
requiresBuild: true
dev: true
@@ -3757,10 +4013,10 @@ packages:
dev: true
optional: true
- /@esbuild/linux-mips64el@0.17.19:
- resolution: {integrity: sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A==}
+ /@esbuild/linux-loong64@0.19.5:
+ resolution: {integrity: sha512-42GwZMm5oYOD/JHqHska3Jg0r+XFb/fdZRX+WjADm3nLWLcIsN27YKtqxzQmGNJgu0AyXg4HtcSK9HuOk3v1Dw==}
engines: {node: '>=12'}
- cpu: [mips64el]
+ cpu: [loong64]
os: [linux]
requiresBuild: true
dev: true
@@ -3784,10 +4040,10 @@ packages:
dev: true
optional: true
- /@esbuild/linux-ppc64@0.17.19:
- resolution: {integrity: sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg==}
+ /@esbuild/linux-mips64el@0.19.5:
+ resolution: {integrity: sha512-kcjndCSMitUuPJobWCnwQ9lLjiLZUR3QLQmlgaBfMX23UEa7ZOrtufnRds+6WZtIS9HdTXqND4yH8NLoVVIkcg==}
engines: {node: '>=12'}
- cpu: [ppc64]
+ cpu: [mips64el]
os: [linux]
requiresBuild: true
dev: true
@@ -3811,10 +4067,10 @@ packages:
dev: true
optional: true
- /@esbuild/linux-riscv64@0.17.19:
- resolution: {integrity: sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA==}
+ /@esbuild/linux-ppc64@0.19.5:
+ resolution: {integrity: sha512-yJAxJfHVm0ZbsiljbtFFP1BQKLc8kUF6+17tjQ78QjqjAQDnhULWiTA6u0FCDmYT1oOKS9PzZ2z0aBI+Mcyj7Q==}
engines: {node: '>=12'}
- cpu: [riscv64]
+ cpu: [ppc64]
os: [linux]
requiresBuild: true
dev: true
@@ -3838,10 +4094,10 @@ packages:
dev: true
optional: true
- /@esbuild/linux-s390x@0.17.19:
- resolution: {integrity: sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q==}
+ /@esbuild/linux-riscv64@0.19.5:
+ resolution: {integrity: sha512-5u8cIR/t3gaD6ad3wNt1MNRstAZO+aNyBxu2We8X31bA8XUNyamTVQwLDA1SLoPCUehNCymhBhK3Qim1433Zag==}
engines: {node: '>=12'}
- cpu: [s390x]
+ cpu: [riscv64]
os: [linux]
requiresBuild: true
dev: true
@@ -3865,10 +4121,10 @@ packages:
dev: true
optional: true
- /@esbuild/linux-x64@0.17.19:
- resolution: {integrity: sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==}
+ /@esbuild/linux-s390x@0.19.5:
+ resolution: {integrity: sha512-Z6JrMyEw/EmZBD/OFEFpb+gao9xJ59ATsoTNlj39jVBbXqoZm4Xntu6wVmGPB/OATi1uk/DB+yeDPv2E8PqZGw==}
engines: {node: '>=12'}
- cpu: [x64]
+ cpu: [s390x]
os: [linux]
requiresBuild: true
dev: true
@@ -3892,11 +4148,11 @@ packages:
dev: true
optional: true
- /@esbuild/netbsd-x64@0.17.19:
- resolution: {integrity: sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q==}
+ /@esbuild/linux-x64@0.19.5:
+ resolution: {integrity: sha512-psagl+2RlK1z8zWZOmVdImisMtrUxvwereIdyJTmtmHahJTKb64pAcqoPlx6CewPdvGvUKe2Jw+0Z/0qhSbG1A==}
engines: {node: '>=12'}
cpu: [x64]
- os: [netbsd]
+ os: [linux]
requiresBuild: true
dev: true
optional: true
@@ -3919,11 +4175,11 @@ packages:
dev: true
optional: true
- /@esbuild/openbsd-x64@0.17.19:
- resolution: {integrity: sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g==}
+ /@esbuild/netbsd-x64@0.19.5:
+ resolution: {integrity: sha512-kL2l+xScnAy/E/3119OggX8SrWyBEcqAh8aOY1gr4gPvw76la2GlD4Ymf832UCVbmuWeTf2adkZDK+h0Z/fB4g==}
engines: {node: '>=12'}
cpu: [x64]
- os: [openbsd]
+ os: [netbsd]
requiresBuild: true
dev: true
optional: true
@@ -3946,11 +4202,11 @@ packages:
dev: true
optional: true
- /@esbuild/sunos-x64@0.17.19:
- resolution: {integrity: sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg==}
+ /@esbuild/openbsd-x64@0.19.5:
+ resolution: {integrity: sha512-sPOfhtzFufQfTBgRnE1DIJjzsXukKSvZxloZbkJDG383q0awVAq600pc1nfqBcl0ice/WN9p4qLc39WhBShRTA==}
engines: {node: '>=12'}
cpu: [x64]
- os: [sunos]
+ os: [openbsd]
requiresBuild: true
dev: true
optional: true
@@ -3973,11 +4229,11 @@ packages:
dev: true
optional: true
- /@esbuild/win32-arm64@0.17.19:
- resolution: {integrity: sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag==}
+ /@esbuild/sunos-x64@0.19.5:
+ resolution: {integrity: sha512-dGZkBXaafuKLpDSjKcB0ax0FL36YXCvJNnztjKV+6CO82tTYVDSH2lifitJ29jxRMoUhgkg9a+VA/B03WK5lcg==}
engines: {node: '>=12'}
- cpu: [arm64]
- os: [win32]
+ cpu: [x64]
+ os: [sunos]
requiresBuild: true
dev: true
optional: true
@@ -4000,10 +4256,10 @@ packages:
dev: true
optional: true
- /@esbuild/win32-ia32@0.17.19:
- resolution: {integrity: sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw==}
+ /@esbuild/win32-arm64@0.19.5:
+ resolution: {integrity: sha512-dWVjD9y03ilhdRQ6Xig1NWNgfLtf2o/STKTS+eZuF90fI2BhbwD6WlaiCGKptlqXlURVB5AUOxUj09LuwKGDTg==}
engines: {node: '>=12'}
- cpu: [ia32]
+ cpu: [arm64]
os: [win32]
requiresBuild: true
dev: true
@@ -4027,10 +4283,10 @@ packages:
dev: true
optional: true
- /@esbuild/win32-x64@0.17.19:
- resolution: {integrity: sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA==}
+ /@esbuild/win32-ia32@0.19.5:
+ resolution: {integrity: sha512-4liggWIA4oDgUxqpZwrDhmEfAH4d0iljanDOK7AnVU89T6CzHon/ony8C5LeOdfgx60x5cnQJFZwEydVlYx4iw==}
engines: {node: '>=12'}
- cpu: [x64]
+ cpu: [ia32]
os: [win32]
requiresBuild: true
dev: true
@@ -4054,6 +4310,15 @@ packages:
dev: true
optional: true
+ /@esbuild/win32-x64@0.19.5:
+ resolution: {integrity: sha512-czTrygUsB/jlM8qEW5MD8bgYU2Xg14lo6kBDXW6HdxKjh8M5PzETGiSHaz9MtbXBYDloHNUAUW2tMiKW4KM9Mw==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [win32]
+ requiresBuild: true
+ dev: true
+ optional: true
+
/@eslint-community/eslint-utils@4.4.0(eslint@8.33.0):
resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
@@ -4441,13 +4706,13 @@ packages:
- supports-color
dev: true
- /@iconify/vue@4.1.1(vue@3.3.7):
+ /@iconify/vue@4.1.1(vue@3.3.8):
resolution: {integrity: sha512-RL85Bm/DAe8y6rT6pux7D2FJSiUEM/TPfyK7GrbAOfTSwrhvwJW+S5yijdGcmtXouA8MtuH9C7l4hiSE4mLMjg==}
peerDependencies:
vue: latest
dependencies:
'@iconify/types': 2.0.0
- vue: 3.3.7
+ vue: 3.3.8
dev: false
/@interactjs/actions@1.10.18(@interactjs/core@1.10.18)(@interactjs/utils@1.10.18):
@@ -4563,7 +4828,7 @@ packages:
magic-string: 0.30.5
mlly: 1.4.1
source-map-js: 1.0.2
- vue-i18n: 9.2.2(vue@3.3.7)
+ vue-i18n: 9.2.2(vue@3.3.8)
yaml-eslint-parser: 0.3.2
dev: true
@@ -4623,7 +4888,7 @@ packages:
dependencies:
'@intlify/bundle-utils': 7.0.2(vue-i18n@9.2.2)
'@intlify/shared': 9.3.0-beta.24
- '@rollup/pluginutils': 5.0.4(rollup@3.28.1)
+ '@rollup/pluginutils': 5.0.4(rollup@3.29.4)
'@vue/compiler-sfc': 3.3.4
debug: 4.3.4(supports-color@8.1.1)
fast-glob: 3.3.1
@@ -4633,7 +4898,7 @@ packages:
picocolors: 1.0.0
source-map-js: 1.0.2
unplugin: 1.4.0
- vue-i18n: 9.2.2(vue@3.3.7)
+ vue-i18n: 9.2.2(vue@3.3.8)
transitivePeerDependencies:
- rollup
- supports-color
@@ -4953,6 +5218,18 @@ packages:
resolution: {integrity: sha512-fuscdXJ9G1qb7W8VdHi+IwRqij3lBkosAm4ydQtEmbY58OzHXqQhvlxqEkoz0yssNVn38bcpRWgA9PP+OGoisw==}
dev: false
+ /@kwsites/file-exists@1.1.1:
+ resolution: {integrity: sha512-m9/5YGR18lIwxSFDwfE3oA7bWuq9kdau6ugN4H2rJeyhFQZcG9AgSHkQtSD15a8WvTgfz9aikZMrKPHvbpqFiw==}
+ dependencies:
+ debug: 4.3.4(supports-color@8.1.1)
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /@kwsites/promise-deferred@1.1.1:
+ resolution: {integrity: sha512-GaHYm+c0O9MjZRu0ongGBRbinu8gVAMd2UZjji6jVmqKtZluZnptXGWhz1E8j8D2HJ3f/yMxKAUC0b+57wncIw==}
+ dev: true
+
/@lerna/child-process@7.0.2:
resolution: {integrity: sha512-15lMrNBL/pvREMJPSfIPieaBtyyapDco/TNjALLEL53JGzO9g8rj5PipfE9h5ILx8aq/GaP17XCh209aVCun/w==}
engines: {node: ^14.17.0 || >=16.0.0}
@@ -5457,11 +5734,11 @@ packages:
typescript: 5.2.2
dev: true
- /@netlify/functions@2.0.2:
- resolution: {integrity: sha512-goWRtaIPUK/q47qLYtfGGj7HgJIRaT0snw7zZ0yeoNTfQfCRwQwvRrMAsXkCsCtq2N2Oo81L26SpkMxEQMk9hg==}
+ /@netlify/functions@2.3.0:
+ resolution: {integrity: sha512-E3kzXPWMP/r1rAWhjTaXcaOT47dhEvg/eQUJjRLhD9Zzp0WqkdynHr+bqff4rFNv6tuXrtFZrpbPJFKHH0c0zw==}
engines: {node: '>=14.0.0'}
dependencies:
- '@netlify/serverless-functions-api': 1.7.3
+ '@netlify/serverless-functions-api': 1.9.0
is-promise: 4.0.0
dev: true
@@ -5470,8 +5747,8 @@ packages:
engines: {node: ^14.16.0 || >=16.0.0}
dev: true
- /@netlify/serverless-functions-api@1.7.3:
- resolution: {integrity: sha512-n6/7cJlSWvvbBlUOEAbkGyEld80S6KbG/ldQI9OhLfe1lTatgKmrTNIgqVNpaWpUdTgP2OHWFjmFBzkxxBWs5w==}
+ /@netlify/serverless-functions-api@1.9.0:
+ resolution: {integrity: sha512-Jq4uk1Mwa5vyxImupJYXPP+I5yYcp3PtguvXtJRutKdm9DPALXfZVtCQzBWMNdZiqVWCM3La9hvaBsPjSMfeug==}
engines: {node: ^14.18.0 || >=16.0.0}
dependencies:
'@netlify/node-cookies': 0.1.0
@@ -5496,6 +5773,19 @@ packages:
'@nodelib/fs.scandir': 2.1.5
fastq: 1.15.0
+ /@npmcli/agent@2.2.0:
+ resolution: {integrity: sha512-2yThA1Es98orMkpSLVqlDZAMPK3jHJhifP2gnNUdk1754uZ8yI5c+ulCoVG+WlntQA6MzhrURMXjSd9Z7dJ2/Q==}
+ engines: {node: ^16.14.0 || >=18.0.0}
+ dependencies:
+ agent-base: 7.1.0
+ http-proxy-agent: 7.0.0
+ https-proxy-agent: 7.0.2
+ lru-cache: 10.0.1
+ socks-proxy-agent: 8.0.2
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
/@npmcli/fs@1.1.1:
resolution: {integrity: sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ==}
requiresBuild: true
@@ -5527,6 +5817,22 @@ packages:
- bluebird
dev: true
+ /@npmcli/git@5.0.3:
+ resolution: {integrity: sha512-UZp9NwK+AynTrKvHn5k3KviW/hA5eENmFsu3iAPe7sWRt0lFUdsY/wXIYjpDFe7cdSNwOIzbObfwgt6eL5/2zw==}
+ engines: {node: ^16.14.0 || >=18.0.0}
+ dependencies:
+ '@npmcli/promise-spawn': 7.0.0
+ lru-cache: 10.0.1
+ npm-pick-manifest: 9.0.0
+ proc-log: 3.0.0
+ promise-inflight: 1.0.1
+ promise-retry: 2.0.1
+ semver: 7.5.4
+ which: 4.0.0
+ transitivePeerDependencies:
+ - bluebird
+ dev: true
+
/@npmcli/installed-package-contents@2.0.2:
resolution: {integrity: sha512-xACzLPhnfD51GKvTOOuNX2/V4G4mz9/1I2MfDoye9kBM3RYe5g2YbscsaGoTlaWqkxeiapBWyseULVKpSVHtKQ==}
engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
@@ -5558,6 +5864,13 @@ packages:
which: 3.0.1
dev: true
+ /@npmcli/promise-spawn@7.0.0:
+ resolution: {integrity: sha512-wBqcGsMELZna0jDblGd7UXgOby45TQaMWmbFwWX+SEotk4HV6zG2t6rT9siyLhPk4P6YYqgfL1UO8nMWDBVJXQ==}
+ engines: {node: ^16.14.0 || >=18.0.0}
+ dependencies:
+ which: 4.0.0
+ dev: true
+
/@npmcli/run-script@6.0.2:
resolution: {integrity: sha512-NCcr1uQo1k5U+SYlnIrbAh3cxy+OQT1VtqiAbxdymSlptbzBb62AjH2xXgjNCoP073hoa1CfCAcwoZ8k96C4nA==}
engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
@@ -5571,6 +5884,19 @@ packages:
- supports-color
dev: true
+ /@npmcli/run-script@7.0.2:
+ resolution: {integrity: sha512-Omu0rpA8WXvcGeY6DDzyRoY1i5DkCBkzyJ+m2u7PD6quzb0TvSqdIPOkTn8ZBOj7LbbcbMfZ3c5skwSu6m8y2w==}
+ engines: {node: ^16.14.0 || >=18.0.0}
+ dependencies:
+ '@npmcli/node-gyp': 3.0.0
+ '@npmcli/promise-spawn': 7.0.0
+ node-gyp: 10.0.1
+ read-package-json-fast: 3.0.2
+ which: 4.0.0
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
/@nrwl/devkit@16.7.4(nx@16.7.4):
resolution: {integrity: sha512-Gt2q3cqDWzGP1woavGIo4bl8g9YaXic/Xfsl7qPq0LHJedLj49p1vXetB0wawkavSE2MTyo7yDh6YDK/38XoLw==}
dependencies:
@@ -5614,15 +5940,115 @@ packages:
transitivePeerDependencies:
- '@apollo/subgraph'
- bufferutil
- - class-transformer
- - class-validator
- - graphql
- - ts-morph
+ - class-transformer
+ - class-validator
+ - graphql
+ - ts-morph
+ - utf-8-validate
+ dev: false
+
+ /@nuxt/devalue@2.0.2:
+ resolution: {integrity: sha512-GBzP8zOc7CGWyFQS6dv1lQz8VVpz5C2yRszbXufwG/9zhStTIH50EtD87NmWbTMwXDvZLNg8GIpb1UFdH93JCA==}
+ dev: true
+
+ /@nuxt/devtools-kit@1.0.0(nuxt@3.8.1)(vite@4.4.9):
+ resolution: {integrity: sha512-cNloBepQYCBW6x/ctfCvyYRZudxhfgh5w5JDswpCzn7KXmm8U6abG2jyT0FXIaceW1d5QYMpGCN1RUw24wSvOA==}
+ peerDependencies:
+ nuxt: ^3.7.4
+ vite: '*'
+ dependencies:
+ '@nuxt/kit': 3.8.1
+ '@nuxt/schema': 3.8.1
+ execa: 7.2.0
+ nuxt: 3.8.1(eslint@8.33.0)(sass@1.63.4)(vite@4.4.9)
+ vite: 4.4.9(@types/node@20.3.1)(sass@1.63.4)
+ transitivePeerDependencies:
+ - rollup
+ - supports-color
+ dev: true
+
+ /@nuxt/devtools-wizard@1.0.0:
+ resolution: {integrity: sha512-9OeZM2/Y4VuI06gdlDjmYM8yUzdfnywy4t2u2VAEfA2Lk7vk3U1lYn51IAqr+Gits9tp/Q9OiktMWmPLLNGgFw==}
+ hasBin: true
+ dependencies:
+ consola: 3.2.3
+ diff: 5.1.0
+ execa: 7.2.0
+ global-dirs: 3.0.1
+ magicast: 0.3.0
+ pathe: 1.1.1
+ pkg-types: 1.0.3
+ prompts: 2.4.2
+ rc9: 2.1.1
+ semver: 7.5.4
+ dev: true
+
+ /@nuxt/devtools@1.0.0(nuxt@3.8.1)(vite@4.4.9):
+ resolution: {integrity: sha512-pM5AvystXlFPYOsGbH8PBxEYkttiEWHsZnGw660iMw8QedB6mAweT21XX9LDS69cqnRY5uTFqVOmO9Y4EYL3hg==}
+ hasBin: true
+ peerDependencies:
+ nuxt: ^3.7.4
+ vite: '*'
+ dependencies:
+ '@antfu/utils': 0.7.6
+ '@nuxt/devtools-kit': 1.0.0(nuxt@3.8.1)(vite@4.4.9)
+ '@nuxt/devtools-wizard': 1.0.0
+ '@nuxt/kit': 3.8.1
+ birpc: 0.2.14
+ consola: 3.2.3
+ destr: 2.0.2
+ error-stack-parser-es: 0.1.1
+ execa: 7.2.0
+ fast-glob: 3.3.1
+ flatted: 3.2.9
+ get-port-please: 3.1.1
+ global-dirs: 3.0.1
+ h3: 1.8.2
+ hookable: 5.5.3
+ image-meta: 0.1.1
+ is-installed-globally: 0.4.0
+ launch-editor: 2.6.1
+ local-pkg: 0.5.0
+ magicast: 0.3.0
+ nitropack: 2.7.2
+ nuxt: 3.8.1(eslint@8.33.0)(sass@1.63.4)(vite@4.4.9)
+ nypm: 0.3.3
+ ofetch: 1.3.3
+ ohash: 1.1.3
+ pacote: 17.0.4
+ pathe: 1.1.1
+ perfect-debounce: 1.0.0
+ pkg-types: 1.0.3
+ rc9: 2.1.1
+ scule: 1.0.0
+ semver: 7.5.4
+ simple-git: 3.20.0
+ sirv: 2.0.3
+ unimport: 3.4.0(rollup@3.29.4)
+ vite: 4.4.9(@types/node@20.3.1)(sass@1.63.4)
+ vite-plugin-inspect: 0.7.41(@nuxt/kit@3.8.1)(vite@4.4.9)
+ vite-plugin-vue-inspector: 4.0.0(vite@4.4.9)
+ which: 3.0.1
+ ws: 8.14.2
+ transitivePeerDependencies:
+ - '@azure/app-configuration'
+ - '@azure/cosmos'
+ - '@azure/data-tables'
+ - '@azure/identity'
+ - '@azure/keyvault-secrets'
+ - '@azure/storage-blob'
+ - '@capacitor/preferences'
+ - '@planetscale/database'
+ - '@upstash/redis'
+ - '@vercel/kv'
+ - bluebird
+ - bufferutil
+ - encoding
+ - idb-keyval
+ - rollup
+ - supports-color
- utf-8-validate
- dev: false
-
- /@nuxt/devalue@2.0.2:
- resolution: {integrity: sha512-GBzP8zOc7CGWyFQS6dv1lQz8VVpz5C2yRszbXufwG/9zhStTIH50EtD87NmWbTMwXDvZLNg8GIpb1UFdH93JCA==}
+ - xml2js
dev: true
/@nuxt/image-edge@1.0.0-rc.1-28217290.de85e17:
@@ -5666,18 +6092,18 @@ packages:
scule: 1.0.0
semver: 7.5.4
unctx: 2.3.1
- unimport: 3.2.0(rollup@3.28.1)
+ unimport: 3.2.0
untyped: 1.4.0
transitivePeerDependencies:
- rollup
- supports-color
dev: true
- /@nuxt/kit@3.6.5:
- resolution: {integrity: sha512-uBI5I2Zx6sk+vRHU+nBmifwxg/nyXCGZ1g5hUKrUfgv1ZfiKB8JkN5T9iRoduDOaqbwM6XSnEl1ja73iloDcrw==}
+ /@nuxt/kit@3.7.0:
+ resolution: {integrity: sha512-bsPRb2NTLHRacjyybhhA3pZFIqo2pxB6bcP4FQDuzlGzVTI5PtJzbfNpkmQC7q+LZt8K0pNlxKVGisDvZctk6w==}
engines: {node: ^14.18.0 || >=16.10.0}
dependencies:
- '@nuxt/schema': 3.6.5
+ '@nuxt/schema': 3.7.0
c12: 1.4.2
consola: 3.2.3
defu: 6.1.2
@@ -5691,39 +6117,40 @@ packages:
pkg-types: 1.0.3
scule: 1.0.0
semver: 7.5.4
+ ufo: 1.3.0
unctx: 2.3.1
- unimport: 3.2.0(rollup@3.28.1)
+ unimport: 3.2.0
untyped: 1.4.0
transitivePeerDependencies:
- rollup
- supports-color
- dev: true
- /@nuxt/kit@3.7.0:
- resolution: {integrity: sha512-bsPRb2NTLHRacjyybhhA3pZFIqo2pxB6bcP4FQDuzlGzVTI5PtJzbfNpkmQC7q+LZt8K0pNlxKVGisDvZctk6w==}
+ /@nuxt/kit@3.8.1:
+ resolution: {integrity: sha512-DrhG1Z85iH68QOTkgfb0HVfM2g7+CfcMWrFWMDwck9ofyM2RXQUZyfmvMedwBnui1AjjpgpLO9078yZM+RqNUg==}
engines: {node: ^14.18.0 || >=16.10.0}
dependencies:
- '@nuxt/schema': 3.7.0
- c12: 1.4.2
+ '@nuxt/schema': 3.8.1
+ c12: 1.5.1
consola: 3.2.3
- defu: 6.1.2
+ defu: 6.1.3
globby: 13.2.2
hash-sum: 2.0.0
ignore: 5.2.4
- jiti: 1.19.3
+ jiti: 1.21.0
knitwork: 1.0.0
- mlly: 1.4.1
+ mlly: 1.4.2
pathe: 1.1.1
pkg-types: 1.0.3
scule: 1.0.0
semver: 7.5.4
- ufo: 1.3.0
+ ufo: 1.3.1
unctx: 2.3.1
- unimport: 3.2.0(rollup@3.28.1)
+ unimport: 3.4.0(rollup@3.29.4)
untyped: 1.4.0
transitivePeerDependencies:
- rollup
- supports-color
+ dev: true
/@nuxt/schema@3.4.0:
resolution: {integrity: sha512-i04UuprxtMaBK1qCaAupJEIkUUJDt6vyMpBTJ0aajAxehL6O6xV3xqHB5iqDBmtOWlsRL8vGM+M/E/5E+lKuPg==}
@@ -5740,17 +6167,18 @@ packages:
scule: 1.0.0
std-env: 3.4.3
ufo: 1.3.0
- unimport: 3.2.0(rollup@3.28.1)
+ unimport: 3.2.0
untyped: 1.4.0
transitivePeerDependencies:
- rollup
- supports-color
dev: true
- /@nuxt/schema@3.6.5:
- resolution: {integrity: sha512-UPUnMB0W5TZ/Pi1fiF71EqIsPlj8LGZqzhSf8wOeh538KHwxbA9r7cuvEUU92eXRksOZaylbea3fJxZWhOITVw==}
+ /@nuxt/schema@3.7.0:
+ resolution: {integrity: sha512-fNRAubny1x6rIibm/HcacnEGeAQri/FkJ5ei24aY4YjQ12+xDfi7bljfFr6C2+CrEGc1beYd4OQcUqXqEpz5+g==}
engines: {node: ^14.18.0 || >=16.10.0}
dependencies:
+ '@nuxt/ui-templates': 1.3.1
defu: 6.1.2
hookable: 5.5.3
pathe: 1.1.1
@@ -5758,50 +6186,47 @@ packages:
postcss-import-resolver: 2.0.0
std-env: 3.4.3
ufo: 1.3.0
- unimport: 3.2.0(rollup@3.28.1)
+ unimport: 3.2.0
untyped: 1.4.0
transitivePeerDependencies:
- rollup
- supports-color
- dev: true
- /@nuxt/schema@3.7.0:
- resolution: {integrity: sha512-fNRAubny1x6rIibm/HcacnEGeAQri/FkJ5ei24aY4YjQ12+xDfi7bljfFr6C2+CrEGc1beYd4OQcUqXqEpz5+g==}
+ /@nuxt/schema@3.8.1:
+ resolution: {integrity: sha512-fSaWRcI/2mUskfTZTGSnH6Ny0x05CRzylbVn6WFV0d6UEKIVy42Qd6n+h7yoFfp4cq4nji6u16PT4SqS1DEhsw==}
engines: {node: ^14.18.0 || >=16.10.0}
dependencies:
'@nuxt/ui-templates': 1.3.1
- defu: 6.1.2
+ consola: 3.2.3
+ defu: 6.1.3
hookable: 5.5.3
pathe: 1.1.1
pkg-types: 1.0.3
- postcss-import-resolver: 2.0.0
std-env: 3.4.3
- ufo: 1.3.0
- unimport: 3.2.0(rollup@3.28.1)
+ ufo: 1.3.1
+ unimport: 3.4.0(rollup@3.29.4)
untyped: 1.4.0
transitivePeerDependencies:
- rollup
- supports-color
+ dev: true
- /@nuxt/telemetry@2.4.1:
- resolution: {integrity: sha512-Cj+4sXjO5pZNW2sX7Y+djYpf4pZwgYF3rV/YHLWIOq9nAjo2UcDXjh1z7qnhkoUkvJN3lHnvhnCNhfAioe6k/A==}
+ /@nuxt/telemetry@2.5.2:
+ resolution: {integrity: sha512-kZ+rWq/5MZonMhp8KGFI5zMaR2VsiWpnlkOLJIuIX2WoJl0DkHvtxCtuFq2erAqMVruWLpKU+tgMC+1cno/QmA==}
hasBin: true
dependencies:
- '@nuxt/kit': 3.7.0
- chalk: 5.3.0
+ '@nuxt/kit': 3.8.1
ci-info: 3.8.0
consola: 3.2.3
create-require: 1.1.1
- defu: 6.1.2
- destr: 2.0.1
+ defu: 6.1.3
+ destr: 2.0.2
dotenv: 16.3.1
- fs-extra: 11.1.1
git-url-parse: 13.1.0
is-docker: 3.0.0
- jiti: 1.19.3
+ jiti: 1.21.0
mri: 1.2.0
nanoid: 4.0.2
- node-fetch: 3.3.2
ofetch: 1.3.3
parse-git-config: 3.0.0
pathe: 1.1.1
@@ -5815,52 +6240,51 @@ packages:
/@nuxt/ui-templates@1.3.1:
resolution: {integrity: sha512-5gc02Pu1HycOVUWJ8aYsWeeXcSTPe8iX8+KIrhyEtEoOSkY0eMBuo0ssljB8wALuEmepv31DlYe5gpiRwkjESA==}
- /@nuxt/vite-builder@3.6.5(@types/node@20.3.1)(eslint@8.33.0)(sass@1.63.4)(vue@3.3.7):
- resolution: {integrity: sha512-pwSpt257ApCp3XWUs8vrC7X9QHeHUv5PbbIR3+5w0n5f95XPNOQWDJa2fTPX/H6oaRJCPYAsBPqiQhQ7qW/NZQ==}
+ /@nuxt/vite-builder@3.8.1(eslint@8.33.0)(sass@1.63.4)(vue@3.3.8):
+ resolution: {integrity: sha512-Ot/twGONxj22T9U4bxp771ibKVFlZxIiYDHY/e6mZsE4Blc0efKo6MzPPPo0W4/tXQbtKKEq41uINN3dMI3mag==}
engines: {node: ^14.18.0 || >=16.10.0}
peerDependencies:
vue: latest
dependencies:
- '@nuxt/kit': 3.6.5
- '@rollup/plugin-replace': 5.0.2(rollup@3.28.1)
- '@vitejs/plugin-vue': 4.3.3(vite@4.3.9)(vue@3.3.7)
- '@vitejs/plugin-vue-jsx': 3.0.2(vite@4.3.9)(vue@3.3.7)
- autoprefixer: 10.4.15(postcss@8.4.31)
+ '@nuxt/kit': 3.8.1
+ '@rollup/plugin-replace': 5.0.5(rollup@3.29.4)
+ '@vitejs/plugin-vue': 4.4.0(vite@4.5.0)(vue@3.3.8)
+ '@vitejs/plugin-vue-jsx': 3.0.2(vite@4.5.0)(vue@3.3.8)
+ autoprefixer: 10.4.16(postcss@8.4.31)
clear: 0.1.0
consola: 3.2.3
cssnano: 6.0.1(postcss@8.4.31)
- defu: 6.1.2
- esbuild: 0.18.20
+ defu: 6.1.3
+ esbuild: 0.19.5
escape-string-regexp: 5.0.0
estree-walker: 3.0.3
externality: 1.0.2
fs-extra: 11.1.1
- get-port-please: 3.0.2
- h3: 1.8.1
+ get-port-please: 3.1.1
+ h3: 1.8.2
knitwork: 1.0.0
magic-string: 0.30.5
- mlly: 1.4.1
+ mlly: 1.4.2
ohash: 1.1.3
pathe: 1.1.1
perfect-debounce: 1.0.0
pkg-types: 1.0.3
postcss: 8.4.31
- postcss-import: 15.1.0(postcss@8.4.31)
- postcss-url: 10.1.3(postcss@8.4.31)
- rollup-plugin-visualizer: 5.9.2(rollup@3.28.1)
+ rollup-plugin-visualizer: 5.9.2(rollup@3.29.4)
std-env: 3.4.3
strip-literal: 1.3.0
- ufo: 1.3.0
- unplugin: 1.4.0
- vite: 4.3.9(@types/node@20.3.1)(sass@1.63.4)
- vite-node: 0.33.0(@types/node@20.3.1)(sass@1.63.4)
- vite-plugin-checker: 0.6.2(eslint@8.33.0)(vite@4.3.9)
- vue: 3.3.7
- vue-bundle-renderer: 1.0.3
+ ufo: 1.3.1
+ unplugin: 1.5.0
+ vite: 4.5.0(sass@1.63.4)
+ vite-node: 0.33.0(sass@1.63.4)
+ vite-plugin-checker: 0.6.2(eslint@8.33.0)(vite@4.5.0)
+ vue: 3.3.8
+ vue-bundle-renderer: 2.0.0
transitivePeerDependencies:
- '@types/node'
- eslint
- less
+ - lightningcss
- meow
- optionator
- rollup
@@ -6278,11 +6702,11 @@ packages:
'@parcel/watcher-win32-x64': 2.3.0
dev: true
- /@pinia/nuxt@0.4.11(vue@3.3.7):
+ /@pinia/nuxt@0.4.11(vue@3.3.8):
resolution: {integrity: sha512-bhuNFngJpmBCdAqWguezNJ/oJFR7wvKieqiZrmmdmPR07XjsidAw8RLXHMZE9kUm32M9E6T057OBbG/22jERTg==}
dependencies:
'@nuxt/kit': 3.7.0
- pinia: 2.1.4(vue@3.3.7)
+ pinia: 2.1.4(vue@3.3.8)
transitivePeerDependencies:
- '@vue/composition-api'
- rollup
@@ -6333,122 +6757,123 @@ packages:
'@iconify/iconify': 3.1.1
dev: true
- /@rollup/plugin-alias@5.0.0(rollup@3.28.1):
- resolution: {integrity: sha512-l9hY5chSCjuFRPsnRm16twWBiSApl2uYFLsepQYwtBuAxNMQ/1dJqADld40P0Jkqm65GRTLy/AC6hnpVebtLsA==}
+ /@rollup/plugin-alias@5.0.1(rollup@3.29.4):
+ resolution: {integrity: sha512-JObvbWdOHoMy9W7SU0lvGhDtWq9PllP5mjpAy+TUslZG/WzOId9u80Hsqq1vCUn9pFJ0cxpdcnAv+QzU2zFH3Q==}
engines: {node: '>=14.0.0'}
peerDependencies:
- rollup: ^1.20.0||^2.0.0||^3.0.0
+ rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0
peerDependenciesMeta:
rollup:
optional: true
dependencies:
- rollup: 3.28.1
+ rollup: 3.29.4
slash: 4.0.0
dev: true
- /@rollup/plugin-commonjs@25.0.4(rollup@3.28.1):
- resolution: {integrity: sha512-L92Vz9WUZXDnlQQl3EwbypJR4+DM2EbsO+/KOcEkP4Mc6Ct453EeDB2uH9lgRwj4w5yflgNpq9pHOiY8aoUXBQ==}
+ /@rollup/plugin-commonjs@25.0.7(rollup@3.29.4):
+ resolution: {integrity: sha512-nEvcR+LRjEjsaSsc4x3XZfCCvZIaSMenZu/OiwOKGN2UhQpAYI7ru7czFvyWbErlpoGjnSX3D5Ch5FcMA3kRWQ==}
engines: {node: '>=14.0.0'}
peerDependencies:
- rollup: ^2.68.0||^3.0.0
+ rollup: ^2.68.0||^3.0.0||^4.0.0
peerDependenciesMeta:
rollup:
optional: true
dependencies:
- '@rollup/pluginutils': 5.0.4(rollup@3.28.1)
+ '@rollup/pluginutils': 5.0.5(rollup@3.29.4)
commondir: 1.0.1
estree-walker: 2.0.2
glob: 8.1.0
is-reference: 1.2.1
- magic-string: 0.27.0
- rollup: 3.28.1
+ magic-string: 0.30.5
+ rollup: 3.29.4
dev: true
- /@rollup/plugin-inject@5.0.3(rollup@3.28.1):
- resolution: {integrity: sha512-411QlbL+z2yXpRWFXSmw/teQRMkXcAAC8aYTemc15gwJRpvEVDQwoe+N/HTFD8RFG8+88Bme9DK2V9CVm7hJdA==}
+ /@rollup/plugin-inject@5.0.5(rollup@3.29.4):
+ resolution: {integrity: sha512-2+DEJbNBoPROPkgTDNe8/1YXWcqxbN5DTjASVIOx8HS+pITXushyNiBV56RB08zuptzz8gT3YfkqriTBVycepg==}
engines: {node: '>=14.0.0'}
peerDependencies:
- rollup: ^1.20.0||^2.0.0||^3.0.0
+ rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0
peerDependenciesMeta:
rollup:
optional: true
dependencies:
- '@rollup/pluginutils': 5.0.4(rollup@3.28.1)
+ '@rollup/pluginutils': 5.0.5(rollup@3.29.4)
estree-walker: 2.0.2
- magic-string: 0.27.0
- rollup: 3.28.1
+ magic-string: 0.30.5
+ rollup: 3.29.4
dev: true
- /@rollup/plugin-json@6.0.0(rollup@3.28.1):
- resolution: {integrity: sha512-i/4C5Jrdr1XUarRhVu27EEwjt4GObltD7c+MkCIpO2QIbojw8MUs+CCTqOphQi3Qtg1FLmYt+l+6YeoIf51J7w==}
+ /@rollup/plugin-json@6.0.1(rollup@3.29.4):
+ resolution: {integrity: sha512-RgVfl5hWMkxN1h/uZj8FVESvPuBJ/uf6ly6GTj0GONnkfoBN5KC0MSz+PN2OLDgYXMhtG0mWpTrkiOjoxAIevw==}
engines: {node: '>=14.0.0'}
peerDependencies:
- rollup: ^1.20.0||^2.0.0||^3.0.0
+ rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0
peerDependenciesMeta:
rollup:
optional: true
dependencies:
- '@rollup/pluginutils': 5.0.4(rollup@3.28.1)
- rollup: 3.28.1
+ '@rollup/pluginutils': 5.0.5(rollup@3.29.4)
+ rollup: 3.29.4
dev: true
- /@rollup/plugin-node-resolve@15.2.1(rollup@3.28.1):
- resolution: {integrity: sha512-nsbUg588+GDSu8/NS8T4UAshO6xeaOfINNuXeVHcKV02LJtoRaM1SiOacClw4kws1SFiNhdLGxlbMY9ga/zs/w==}
+ /@rollup/plugin-node-resolve@15.2.3(rollup@3.29.4):
+ resolution: {integrity: sha512-j/lym8nf5E21LwBT4Df1VD6hRO2L2iwUeUmP7litikRsVp1H6NWx20NEp0Y7su+7XGc476GnXXc4kFeZNGmaSQ==}
engines: {node: '>=14.0.0'}
peerDependencies:
- rollup: ^2.78.0||^3.0.0
+ rollup: ^2.78.0||^3.0.0||^4.0.0
peerDependenciesMeta:
rollup:
optional: true
dependencies:
- '@rollup/pluginutils': 5.0.4(rollup@3.28.1)
+ '@rollup/pluginutils': 5.0.5(rollup@3.29.4)
'@types/resolve': 1.20.2
deepmerge: 4.3.1
is-builtin-module: 3.2.1
is-module: 1.0.0
resolve: 1.22.4
- rollup: 3.28.1
+ rollup: 3.29.4
dev: true
- /@rollup/plugin-replace@5.0.2(rollup@3.28.1):
- resolution: {integrity: sha512-M9YXNekv/C/iHHK+cvORzfRYfPbq0RDD8r0G+bMiTXjNGKulPnCT9O3Ss46WfhI6ZOCgApOP7xAdmCQJ+U2LAA==}
+ /@rollup/plugin-replace@5.0.5(rollup@3.29.4):
+ resolution: {integrity: sha512-rYO4fOi8lMaTg/z5Jb+hKnrHHVn8j2lwkqwyS4kTRhKyWOLf2wST2sWXr4WzWiTcoHTp2sTjqUbqIj2E39slKQ==}
engines: {node: '>=14.0.0'}
peerDependencies:
- rollup: ^1.20.0||^2.0.0||^3.0.0
+ rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0
peerDependenciesMeta:
rollup:
optional: true
dependencies:
- '@rollup/pluginutils': 5.0.4(rollup@3.28.1)
- magic-string: 0.27.0
- rollup: 3.28.1
+ '@rollup/pluginutils': 5.0.5(rollup@3.29.4)
+ magic-string: 0.30.5
+ rollup: 3.29.4
dev: true
- /@rollup/plugin-terser@0.4.3(rollup@3.28.1):
- resolution: {integrity: sha512-EF0oejTMtkyhrkwCdg0HJ0IpkcaVg1MMSf2olHb2Jp+1mnLM04OhjpJWGma4HobiDTF0WCyViWuvadyE9ch2XA==}
+ /@rollup/plugin-terser@0.4.4(rollup@3.29.4):
+ resolution: {integrity: sha512-XHeJC5Bgvs8LfukDwWZp7yeqin6ns8RTl2B9avbejt6tZqsqvVoWI7ZTQrcNsfKEDWBTnTxM8nMDkO2IFFbd0A==}
engines: {node: '>=14.0.0'}
peerDependencies:
- rollup: ^2.x || ^3.x
+ rollup: ^2.0.0||^3.0.0||^4.0.0
peerDependenciesMeta:
rollup:
optional: true
dependencies:
- rollup: 3.28.1
+ rollup: 3.29.4
serialize-javascript: 6.0.1
smob: 1.4.0
terser: 5.19.2
dev: true
- /@rollup/plugin-wasm@6.1.3(rollup@3.28.1):
- resolution: {integrity: sha512-7ItTTeyauE6lwdDtQWceEHZ9+txbi4RRy0mYPFn9BW7rD7YdgBDu7HTHsLtHrRzJc313RM/1m6GKgV3np/aEaw==}
+ /@rollup/plugin-wasm@6.2.2(rollup@3.29.4):
+ resolution: {integrity: sha512-gpC4R1G9Ni92ZIRTexqbhX7U+9estZrbhP+9SRb0DW9xpB9g7j34r+J2hqrcW/lRI7dJaU84MxZM0Rt82tqYPQ==}
engines: {node: '>=14.0.0'}
peerDependencies:
- rollup: ^1.20.0||^2.0.0||^3.0.0
+ rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0
peerDependenciesMeta:
rollup:
optional: true
dependencies:
- rollup: 3.28.1
+ '@rollup/pluginutils': 5.0.5(rollup@3.29.4)
+ rollup: 3.29.4
dev: true
/@rollup/pluginutils@4.2.1:
@@ -6459,7 +6884,7 @@ packages:
picomatch: 2.3.1
dev: true
- /@rollup/pluginutils@5.0.4(rollup@3.28.1):
+ /@rollup/pluginutils@5.0.4(rollup@3.29.4):
resolution: {integrity: sha512-0KJnIoRI8A+a1dqOYLxH8vBf8bphDmty5QvIm2hqm7oFCFYKCAZWWd2hXgMibaPsNDhI0AtpYfQZJG47pt/k4g==}
engines: {node: '>=14.0.0'}
peerDependencies:
@@ -6471,7 +6896,22 @@ packages:
'@types/estree': 1.0.1
estree-walker: 2.0.2
picomatch: 2.3.1
- rollup: 3.28.1
+ rollup: 3.29.4
+
+ /@rollup/pluginutils@5.0.5(rollup@3.29.4):
+ resolution: {integrity: sha512-6aEYR910NyP73oHiJglti74iRyOwgFU4x3meH/H8OJx6Ry0j6cOVZ5X/wTvub7G7Ao6qaHBEaNsV3GLJkSsF+Q==}
+ engines: {node: '>=14.0.0'}
+ peerDependencies:
+ rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0
+ peerDependenciesMeta:
+ rollup:
+ optional: true
+ dependencies:
+ '@types/estree': 1.0.1
+ estree-walker: 2.0.2
+ picomatch: 2.3.1
+ rollup: 3.29.4
+ dev: true
/@sentry/core@6.3.5:
resolution: {integrity: sha512-VR2ibDy33mryD0mT6d9fGhKjdNzS2FSwwZPe9GvmNOjkyjly/oV91BKVoYJneCqOeq8fyj2lvkJGKuupdJNDqg==}
@@ -6582,6 +7022,13 @@ packages:
'@sigstore/protobuf-specs': 0.2.1
dev: true
+ /@sigstore/bundle@2.1.0:
+ resolution: {integrity: sha512-89uOo6yh/oxaU8AeOUnVrTdVMcGk9Q1hJa7Hkvalc6G3Z3CupWk4Xe9djSgJm9fMkH69s0P0cVHUoKSOemLdng==}
+ engines: {node: ^16.14.0 || >=18.0.0}
+ dependencies:
+ '@sigstore/protobuf-specs': 0.2.1
+ dev: true
+
/@sigstore/protobuf-specs@0.2.1:
resolution: {integrity: sha512-XTWVxnWJu+c1oCshMLwnKvz8ZQJJDVOlciMfgpJBQbThVjKTCG8dwyhgLngBD2KN0ap9F/gOV8rFDEx8uh7R2A==}
engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
@@ -6598,6 +7045,17 @@ packages:
- supports-color
dev: true
+ /@sigstore/sign@2.2.0:
+ resolution: {integrity: sha512-AAbmnEHDQv6CSfrWA5wXslGtzLPtAtHZleKOgxdQYvx/s76Fk6T6ZVt7w2IGV9j1UrFeBocTTQxaXG2oRrDhYA==}
+ engines: {node: ^16.14.0 || >=18.0.0}
+ dependencies:
+ '@sigstore/bundle': 2.1.0
+ '@sigstore/protobuf-specs': 0.2.1
+ make-fetch-happen: 13.0.0
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
/@sigstore/tuf@1.0.3:
resolution: {integrity: sha512-2bRovzs0nJZFlCN3rXirE4gwxCn97JNjMmwpecqlbgV9WcxX7WRuIrgzx/X7Ib7MYRbyUTpBYE0s2x6AmZXnlg==}
engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
@@ -6608,6 +7066,16 @@ packages:
- supports-color
dev: true
+ /@sigstore/tuf@2.2.0:
+ resolution: {integrity: sha512-KKATZ5orWfqd9ZG6MN8PtCIx4eevWSuGRKQvofnWXRpyMyUEpmrzg5M5BrCpjM+NfZ0RbNGOh5tCz/P2uoRqOA==}
+ engines: {node: ^16.14.0 || >=18.0.0}
+ dependencies:
+ '@sigstore/protobuf-specs': 0.2.1
+ tuf-js: 2.1.0
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
/@simonwep/pickr@1.8.2:
resolution: {integrity: sha512-/l5w8BIkrpP6n1xsetx9MWPWlU6OblN5YgZZphxan0Tq4BByTCETL6lyIeY8lagalS2Nbt4F2W034KHLIiunKA==}
dependencies:
@@ -7506,6 +7974,11 @@ packages:
engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
dev: true
+ /@tufjs/canonical-json@2.0.0:
+ resolution: {integrity: sha512-yVtV8zsdo8qFHe+/3kw81dSLyF7D576A5cCFCi4X7B39tWT7SekaEFUnvnWJHz+9qO7qJTah1JbrDjWKqFtdWA==}
+ engines: {node: ^16.14.0 || >=18.0.0}
+ dev: true
+
/@tufjs/models@1.0.4:
resolution: {integrity: sha512-qaGV9ltJP0EO25YfFUPhxRVK0evXFIAGicsVXuRim4Ed9cjPxYhNnNJ49SFmbeLgtxpslIkX317IgpfcHPVj/A==}
engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
@@ -7514,6 +7987,14 @@ packages:
minimatch: 9.0.3
dev: true
+ /@tufjs/models@2.0.0:
+ resolution: {integrity: sha512-c8nj8BaOExmZKO2DXhDfegyhSGcG9E/mPN3U13L+/PsoWm1uaGiHHjxqSHQiasDBQwDA3aHuw9+9spYAP1qvvg==}
+ engines: {node: ^16.14.0 || >=18.0.0}
+ dependencies:
+ '@tufjs/canonical-json': 2.0.0
+ minimatch: 9.0.3
+ dev: true
+
/@types/babel__core@7.20.1:
resolution: {integrity: sha512-aACu/U/omhdk15O4Nfb+fHgH/z3QsfQzpnvRZhYhThms83ZnAOZz7zZAWO7mn2yyNQaA4xTO8GLK3uqFU4bYYw==}
dependencies:
@@ -7698,8 +8179,8 @@ packages:
/@types/http-errors@2.0.1:
resolution: {integrity: sha512-/K3ds8TRAfBvi5vfjuz8y6+GiAYBZ0x4tXv1Av6CWBWn0IlADc+ZX9pMq7oU0fNQPnBwIZl3rmeLp6SBApbxSQ==}
- /@types/http-proxy@1.17.11:
- resolution: {integrity: sha512-HC8G7c1WmaF2ekqpnFq626xd3Zz0uvaqFmBJNRZCGEZCXkvSdJoNFn/8Ygbd9fKNQj8UzLdCETaI0UWPAjK7IA==}
+ /@types/http-proxy@1.17.14:
+ resolution: {integrity: sha512-SSrD0c1OQzlFX7pGu1eXxSEjemej64aaNPRhhVYUGqXh0BtldAAx37MG8btcumvpgKyZp1F5Gn3JkktdxiFv6w==}
dependencies:
'@types/node': 20.3.1
dev: true
@@ -7927,7 +8408,7 @@ packages:
/@types/splitpanes@2.2.1:
resolution: {integrity: sha512-H5BgO6UdJRzz5ddRzuGvLBiPSPEuuHXb5ET+7avLLrEx1uc7f5Ut5oLMDQsfvGtHBBAFczt1QNYuDf27wHbvDQ==}
dependencies:
- vue: 3.3.7
+ vue: 3.3.8
transitivePeerDependencies:
- typescript
dev: true
@@ -7978,7 +8459,7 @@ packages:
/@types/vue-barcode-reader@0.0.0:
resolution: {integrity: sha512-yngQhd35qGjCxMXWIqsAtF7qmxe0qUYRVd9qW5I/CcRPWDdBpqVkHnQSh6ro5BIBl3NQ3ppky7kMKS4pr+XwCQ==}
dependencies:
- vue: 3.3.7
+ vue: 3.3.8
transitivePeerDependencies:
- typescript
dev: true
@@ -8399,43 +8880,43 @@ packages:
eslint-visitor-keys: 3.4.3
dev: true
- /@unhead/dom@1.3.9:
- resolution: {integrity: sha512-bTbPFjXjmk8MC0cBC+7Bgf0Mcw62gsE2XqOhMH/qQo6NP4vR2XGxqy054Y7MGurznR1JVAqxUiU3cR/oxWFk3g==}
+ /@unhead/dom@1.8.3:
+ resolution: {integrity: sha512-rPj9PiRTDf+Qy7tSK/UCGxwKfsOOQ+YniANxQy9v2AhWsDy2amW7kbfgR9fVaSlOFdpsyuh2wLCbMcyj9Wn0Jw==}
dependencies:
- '@unhead/schema': 1.3.9
- '@unhead/shared': 1.3.9
+ '@unhead/schema': 1.8.3
+ '@unhead/shared': 1.8.3
dev: true
- /@unhead/schema@1.3.9:
- resolution: {integrity: sha512-iIa0dczd2qTOxwYZbVR+iAKdlELnLTlKSFsN/YuJ/33sRi5VFa9D8TDBEPLec9gpcjB/bH0FhERfR4bb4UbRuA==}
+ /@unhead/schema@1.8.3:
+ resolution: {integrity: sha512-3XbcJzdlyLr/RV2TKaygI21YorlU6XPgHn/MoWjQvH4PYiHkH8PtTGg8Je6k3gvcUURSiDfucFKaGEYdJXAVqQ==}
dependencies:
hookable: 5.5.3
- zhead: 2.0.10
+ zhead: 2.2.4
dev: true
- /@unhead/shared@1.3.9:
- resolution: {integrity: sha512-lBXK1gzsg3XOnsOgYUVTT2RKOvM+AB0myDXkwQb0jsJB3Tc1qVOSz9JAOR+ZGrosSr7+Iv91+Fu/0E+knxaj2Q==}
+ /@unhead/shared@1.8.3:
+ resolution: {integrity: sha512-E1knEiAO0iENLzZd+LjWA4mUp8JRaSxo5V0vMjSENyf5hSVB/SxAVjDPmTIelLY7KrP5mJrNMen2ZmQrr/AZJw==}
dependencies:
- '@unhead/schema': 1.3.9
+ '@unhead/schema': 1.8.3
dev: true
- /@unhead/ssr@1.3.9:
- resolution: {integrity: sha512-FTt4IQOAxHiSfRM7IoJJiFnUEBH8CG5zkJOQ/LydG19QpYa9/AGOi4xvngeCr++1as51p2hWoRO6gPxSRhV8cA==}
+ /@unhead/ssr@1.8.3:
+ resolution: {integrity: sha512-GSTkUCL4qymGkPU8BXiV74Epj0yyXJgmfTSJ3EqalpQTYyJHl910Mq2oDWk7Xyl5lHBrz2Bn0lzNXfSkS7Ao0Q==}
dependencies:
- '@unhead/schema': 1.3.9
- '@unhead/shared': 1.3.9
+ '@unhead/schema': 1.8.3
+ '@unhead/shared': 1.8.3
dev: true
- /@unhead/vue@1.3.9(vue@3.3.7):
- resolution: {integrity: sha512-rVAsRLBc+3Y//NRmr7vmRs5yhIf65jYSvcj0V5DtDfDwql7BbGgc3VIIEvY0+EjLQuNsS5kxwm78LSPCIl/3Xw==}
+ /@unhead/vue@1.8.3(vue@3.3.8):
+ resolution: {integrity: sha512-sj/1VosMreUQXd68rn5jDLdpgFVdN0mKrjW/8eZMWbomZkzbzs7FxyRUApd584xNjFVdtyWrTepmrNSKmEwKgg==}
peerDependencies:
vue: latest
dependencies:
- '@unhead/schema': 1.3.9
- '@unhead/shared': 1.3.9
+ '@unhead/schema': 1.8.3
+ '@unhead/shared': 1.8.3
hookable: 5.5.3
- unhead: 1.3.9
- vue: 3.3.7
+ unhead: 1.8.3
+ vue: 3.3.8
dev: true
/@unocss/astro@0.51.12(vite@4.4.9):
@@ -8455,7 +8936,7 @@ packages:
hasBin: true
dependencies:
'@ampproject/remapping': 2.2.1
- '@rollup/pluginutils': 5.0.4(rollup@3.28.1)
+ '@rollup/pluginutils': 5.0.4(rollup@3.29.4)
'@unocss/config': 0.51.12
'@unocss/core': 0.51.12
'@unocss/preset-uno': 0.51.12
@@ -8638,7 +9119,7 @@ packages:
vite: ^2.9.0 || ^3.0.0-0 || ^4.0.0
dependencies:
'@ampproject/remapping': 2.2.1
- '@rollup/pluginutils': 5.0.4(rollup@3.28.1)
+ '@rollup/pluginutils': 5.0.4(rollup@3.29.4)
'@unocss/config': 0.51.12
'@unocss/core': 0.51.12
'@unocss/inspector': 0.51.12
@@ -8658,7 +9139,7 @@ packages:
webpack: ^4 || ^5
dependencies:
'@ampproject/remapping': 2.2.1
- '@rollup/pluginutils': 5.0.4(rollup@3.28.1)
+ '@rollup/pluginutils': 5.0.4(rollup@3.29.4)
'@unocss/config': 0.51.12
'@unocss/core': 0.51.12
chokidar: 3.5.3
@@ -8671,14 +9152,14 @@ packages:
- rollup
dev: true
- /@vercel/nft@0.23.1:
- resolution: {integrity: sha512-NE0xSmGWVhgHF1OIoir71XAd0W0C1UE3nzFyhpFiMr3rVhetww7NvM1kc41trBsPG37Bh+dE5FYCTMzM/gBu0w==}
- engines: {node: '>=14'}
+ /@vercel/nft@0.24.3:
+ resolution: {integrity: sha512-IyBdIxmFAeGZnEfMgt4QrGK7XX4lWazlQj34HEi9dw04/WeDBJ7r1yaOIO5tTf9pbfvwUFodj9b0H+NDGGoOMg==}
+ engines: {node: '>=16'}
hasBin: true
dependencies:
'@mapbox/node-pre-gyp': 1.0.11
'@rollup/pluginutils': 4.2.1
- acorn: 8.10.0
+ acorn: 8.11.2
async-sema: 3.1.1
bindings: 1.5.0
estree-walker: 2.0.2
@@ -8692,7 +9173,7 @@ packages:
- supports-color
dev: true
- /@vitejs/plugin-vue-jsx@3.0.2(vite@4.3.9)(vue@3.3.7):
+ /@vitejs/plugin-vue-jsx@3.0.2(vite@4.5.0)(vue@3.3.8):
resolution: {integrity: sha512-obF26P2Z4Ogy3cPp07B4VaW6rpiu0ue4OT2Y15UxT5BZZ76haUY9guOsZV3uWh/I6xc+VeiW+ZVabRE82FyzWw==}
engines: {node: ^14.18.0 || >=16.0.0}
peerDependencies:
@@ -8702,21 +9183,21 @@ packages:
'@babel/core': 7.22.11
'@babel/plugin-transform-typescript': 7.22.11(@babel/core@7.22.11)
'@vue/babel-plugin-jsx': 1.1.5(@babel/core@7.22.11)
- vite: 4.3.9(@types/node@20.3.1)(sass@1.63.4)
- vue: 3.3.7
+ vite: 4.5.0(sass@1.63.4)
+ vue: 3.3.8
transitivePeerDependencies:
- supports-color
dev: true
- /@vitejs/plugin-vue@4.3.3(vite@4.3.9)(vue@3.3.7):
- resolution: {integrity: sha512-ssxyhIAZqB0TrpUg6R0cBpCuMk9jTIlO1GNSKKQD6S8VjnXi6JXKfUXjSsxey9IwQiaRGsO1WnW9Rkl1L6AJVw==}
+ /@vitejs/plugin-vue@4.4.0(vite@4.5.0)(vue@3.3.8):
+ resolution: {integrity: sha512-xdguqb+VUwiRpSg+nsc2HtbAUSGak25DXYvpQQi4RVU1Xq1uworyoH/md9Rfd8zMmPR/pSghr309QNcftUVseg==}
engines: {node: ^14.18.0 || >=16.0.0}
peerDependencies:
vite: ^4.0.0
vue: latest
dependencies:
- vite: 4.3.9(@types/node@20.3.1)(sass@1.63.4)
- vue: 3.3.7
+ vite: 4.5.0(sass@1.63.4)
+ vue: 3.3.8
dev: true
/@vitest/expect@0.30.1:
@@ -8764,7 +9245,7 @@ packages:
pretty-format: 27.5.1
dev: true
- /@vue-flow/additional-components@1.2.0(@vue-flow/core@1.3.0)(vue@3.3.7):
+ /@vue-flow/additional-components@1.2.0(@vue-flow/core@1.3.0)(vue@3.3.8):
resolution: {integrity: sha512-a5F2y0WdPxaxTAcN7mSYVZ6A2kDSxenp+YwMt/2ldFRmCIP4jCbXEsTZfcpUe5zhlehfbyTTYbEw03w3YW24aA==}
peerDependencies:
'@vue-flow/core': ^1.0.0
@@ -8772,28 +9253,28 @@ packages:
dependencies:
'@types/d3-selection': 3.0.6
'@types/d3-zoom': 3.0.4
- '@vue-flow/core': 1.3.0(vue@3.3.7)
+ '@vue-flow/core': 1.3.0(vue@3.3.8)
d3-selection: 3.0.0
d3-zoom: 3.0.0
- vue: 3.3.7
+ vue: 3.3.8
dev: false
- /@vue-flow/core@1.3.0(vue@3.3.7):
+ /@vue-flow/core@1.3.0(vue@3.3.8):
resolution: {integrity: sha512-hitjBy8RTw8gixcgJ9sjfZWyI6KNyKp4ffxTz/O4ZN/7TMwunEdc3cFHuU7R6J1OEhZ+HnlMRGrXmzXiIfdJow==}
peerDependencies:
vue: latest
dependencies:
- '@vueuse/core': 9.13.0(vue@3.3.7)
+ '@vueuse/core': 9.13.0(vue@3.3.8)
d3-drag: 3.0.0
d3-selection: 3.0.0
d3-zoom: 3.0.0
- vue: 3.3.7
+ vue: 3.3.8
transitivePeerDependencies:
- '@vue/composition-api'
dev: false
- /@vue-macros/common@1.7.2(vue@3.3.7):
- resolution: {integrity: sha512-0/2A4kWLTCNEx+DDQKLvs7zXpfjgAbGBZ58SIvDN1DjGXhG4WaIUZtgMqzA6bvc5dNN7RaOatZYubkVumwmjWA==}
+ /@vue-macros/common@1.8.0(vue@3.3.8):
+ resolution: {integrity: sha512-auDJJzE0z3uRe3867e0DsqcseKImktNf5ojCZgUKqiVxb2yTlwlgOVAYCgoep9oITqxkXQymSvFeKhedi8PhaA==}
engines: {node: '>=16.14.0'}
peerDependencies:
vue: latest
@@ -8801,13 +9282,13 @@ packages:
vue:
optional: true
dependencies:
- '@babel/types': 7.22.11
- '@rollup/pluginutils': 5.0.4(rollup@3.28.1)
+ '@babel/types': 7.23.0
+ '@rollup/pluginutils': 5.0.4(rollup@3.29.4)
'@vue/compiler-sfc': 3.3.7
- ast-kit: 0.10.0
+ ast-kit: 0.11.2
local-pkg: 0.4.3
magic-string-ast: 0.3.0
- vue: 3.3.7
+ vue: 3.3.8
transitivePeerDependencies:
- rollup
dev: true
@@ -8835,7 +9316,26 @@ packages:
- supports-color
dev: true
- /@vue/compat@3.3.4(vue@3.3.7):
+ /@vue/babel-plugin-jsx@1.1.5(@babel/core@7.23.2):
+ resolution: {integrity: sha512-nKs1/Bg9U1n3qSWnsHhCVQtAzI6aQXqua8j/bZrau8ywT1ilXQbK4FwEJGmU8fV7tcpuFvWmmN7TMmV1OBma1g==}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.23.2
+ '@babel/helper-module-imports': 7.22.5
+ '@babel/plugin-syntax-jsx': 7.22.5(@babel/core@7.23.2)
+ '@babel/template': 7.22.5
+ '@babel/traverse': 7.22.11
+ '@babel/types': 7.22.11
+ '@vue/babel-helper-vue-transform-on': 1.1.5
+ camelcase: 6.3.0
+ html-tags: 3.3.1
+ svg-tags: 1.0.0
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /@vue/compat@3.3.4(vue@3.3.8):
resolution: {integrity: sha512-VwAsPqUqRJVxeLQPUC03Sa5d+T8UG2Qv4VItq74KmNvtQlRXICpa/sqq12BcyBB4Tz1U5paOEZxWCUoXkrZ9QQ==}
peerDependencies:
vue: latest
@@ -8843,7 +9343,7 @@ packages:
'@babel/parser': 7.23.0
estree-walker: 2.0.2
source-map-js: 1.0.2
- vue: 3.3.7
+ vue: 3.3.8
dev: false
/@vue/compiler-core@3.2.37:
@@ -8871,6 +9371,15 @@ packages:
'@vue/shared': 3.3.7
estree-walker: 2.0.2
source-map-js: 1.0.2
+ dev: true
+
+ /@vue/compiler-core@3.3.8:
+ resolution: {integrity: sha512-hN/NNBUECw8SusQvDSqqcVv6gWq8L6iAktUR0UF3vGu2OhzRqcOiAno0FmBJWwxhYEXRlQJT5XnoKsVq1WZx4g==}
+ dependencies:
+ '@babel/parser': 7.23.0
+ '@vue/shared': 3.3.8
+ estree-walker: 2.0.2
+ source-map-js: 1.0.2
/@vue/compiler-dom@3.2.37:
resolution: {integrity: sha512-yxJLH167fucHKxaqXpYk7x8z7mMEnXOw3G2q62FTkmsvNxu4FQSu5+3UMb+L7fjKa26DEzhrmCxAgFLLIzVfqQ==}
@@ -8891,6 +9400,13 @@ packages:
dependencies:
'@vue/compiler-core': 3.3.7
'@vue/shared': 3.3.7
+ dev: true
+
+ /@vue/compiler-dom@3.3.8:
+ resolution: {integrity: sha512-+PPtv+p/nWDd0AvJu3w8HS0RIm/C6VGBIRe24b9hSyNWOAPEUosFZ5diwawwP8ip5sJ8n0Pe87TNNNHnvjs0FQ==}
+ dependencies:
+ '@vue/compiler-core': 3.3.8
+ '@vue/shared': 3.3.8
/@vue/compiler-sfc@3.2.37:
resolution: {integrity: sha512-+7i/2+9LYlpqDv+KTtWhOZH+pa8/HnX/905MdVmAcI/mPQOBwkHHIzrsEsucyOIZQYMkXUiTkmZq5am/NyXKkg==}
@@ -8935,6 +9451,21 @@ packages:
magic-string: 0.30.5
postcss: 8.4.31
source-map-js: 1.0.2
+ dev: true
+
+ /@vue/compiler-sfc@3.3.8:
+ resolution: {integrity: sha512-WMzbUrlTjfYF8joyT84HfwwXo+8WPALuPxhy+BZ6R4Aafls+jDBnSz8PDz60uFhuqFbl3HxRfxvDzrUf3THwpA==}
+ dependencies:
+ '@babel/parser': 7.23.0
+ '@vue/compiler-core': 3.3.8
+ '@vue/compiler-dom': 3.3.8
+ '@vue/compiler-ssr': 3.3.8
+ '@vue/reactivity-transform': 3.3.8
+ '@vue/shared': 3.3.8
+ estree-walker: 2.0.2
+ magic-string: 0.30.5
+ postcss: 8.4.31
+ source-map-js: 1.0.2
/@vue/compiler-ssr@3.2.37:
resolution: {integrity: sha512-7mQJD7HdXxQjktmsWp/J67lThEIcxLemz1Vb5I6rYJHR5vI+lON3nPGOH3ubmbvYGt8xEUaAr1j7/tIFWiEOqw==}
@@ -8955,6 +9486,13 @@ packages:
dependencies:
'@vue/compiler-dom': 3.3.7
'@vue/shared': 3.3.7
+ dev: true
+
+ /@vue/compiler-ssr@3.3.8:
+ resolution: {integrity: sha512-hXCqQL/15kMVDBuoBYpUnSYT8doDNwsjvm3jTefnXr+ytn294ySnT8NlsFHmTgKNjwpuFy7XVV8yTeLtNl/P6w==}
+ dependencies:
+ '@vue/compiler-dom': 3.3.8
+ '@vue/shared': 3.3.8
/@vue/devtools-api@6.5.0:
resolution: {integrity: sha512-o9KfBeaBmCKl10usN4crU53fYtC1r7jJwdGKjPT24t348rHxgfpZ0xL3Xm/gLUYnc0oTp8LAmrxOeLyu6tbk2Q==}
@@ -8987,33 +9525,43 @@ packages:
'@vue/shared': 3.3.7
estree-walker: 2.0.2
magic-string: 0.30.5
+ dev: true
+
+ /@vue/reactivity-transform@3.3.8:
+ resolution: {integrity: sha512-49CvBzmZNtcHua0XJ7GdGifM8GOXoUMOX4dD40Y5DxI3R8OUhMlvf2nvgUAcPxaXiV5MQQ1Nwy09ADpnLQUqRw==}
+ dependencies:
+ '@babel/parser': 7.23.0
+ '@vue/compiler-core': 3.3.8
+ '@vue/shared': 3.3.8
+ estree-walker: 2.0.2
+ magic-string: 0.30.5
- /@vue/reactivity@3.3.7:
- resolution: {integrity: sha512-cZNVjWiw00708WqT0zRpyAgduG79dScKEPYJXq2xj/aMtk3SKvL3FBt2QKUlh6EHBJ1m8RhBY+ikBUzwc7/khg==}
+ /@vue/reactivity@3.3.8:
+ resolution: {integrity: sha512-ctLWitmFBu6mtddPyOKpHg8+5ahouoTCRtmAHZAXmolDtuZXfjL2T3OJ6DL6ezBPQB1SmMnpzjiWjCiMYmpIuw==}
dependencies:
- '@vue/shared': 3.3.7
+ '@vue/shared': 3.3.8
- /@vue/runtime-core@3.3.7:
- resolution: {integrity: sha512-LHq9du3ubLZFdK/BP0Ysy3zhHqRfBn80Uc+T5Hz3maFJBGhci1MafccnL3rpd5/3wVfRHAe6c+PnlO2PAavPTQ==}
+ /@vue/runtime-core@3.3.8:
+ resolution: {integrity: sha512-qurzOlb6q26KWQ/8IShHkMDOuJkQnQcTIp1sdP4I9MbCf9FJeGVRXJFr2mF+6bXh/3Zjr9TDgURXrsCr9bfjUw==}
dependencies:
- '@vue/reactivity': 3.3.7
- '@vue/shared': 3.3.7
+ '@vue/reactivity': 3.3.8
+ '@vue/shared': 3.3.8
- /@vue/runtime-dom@3.3.7:
- resolution: {integrity: sha512-PFQU1oeJxikdDmrfoNQay5nD4tcPNYixUBruZzVX/l0eyZvFKElZUjW4KctCcs52nnpMGO6UDK+jF5oV4GT5Lw==}
+ /@vue/runtime-dom@3.3.8:
+ resolution: {integrity: sha512-Noy5yM5UIf9UeFoowBVgghyGGPIDPy1Qlqt0yVsUdAVbqI8eeMSsTqBtauaEoT2UFXUk5S64aWVNJN4MJ2vRdA==}
dependencies:
- '@vue/runtime-core': 3.3.7
- '@vue/shared': 3.3.7
+ '@vue/runtime-core': 3.3.8
+ '@vue/shared': 3.3.8
csstype: 3.1.2
- /@vue/server-renderer@3.3.7(vue@3.3.7):
- resolution: {integrity: sha512-UlpKDInd1hIZiNuVVVvLgxpfnSouxKQOSE2bOfQpBuGwxRV/JqqTCyyjXUWiwtVMyeRaZhOYYqntxElk8FhBhw==}
+ /@vue/server-renderer@3.3.8(vue@3.3.8):
+ resolution: {integrity: sha512-zVCUw7RFskvPuNlPn/8xISbrf0zTWsTSdYTsUTN1ERGGZGVnRxM2QZ3x1OR32+vwkkCm0IW6HmJ49IsPm7ilLg==}
peerDependencies:
vue: latest
dependencies:
- '@vue/compiler-ssr': 3.3.7
- '@vue/shared': 3.3.7
- vue: 3.3.7
+ '@vue/compiler-ssr': 3.3.8
+ '@vue/shared': 3.3.8
+ vue: 3.3.8
/@vue/shared@3.2.37:
resolution: {integrity: sha512-4rSJemR2NQIo9Klm1vabqWjD8rs/ZaJSzMxkMNeJS6lHiUjjUeYFbooN19NgFjztubEKh3WlZUeOLVdbbUWHsw==}
@@ -9025,45 +9573,49 @@ packages:
/@vue/shared@3.3.7:
resolution: {integrity: sha512-N/tbkINRUDExgcPTBvxNkvHGu504k8lzlNQRITVnm6YjOjwa4r0nnbd4Jb01sNpur5hAllyRJzSK5PvB9PPwRg==}
+ dev: true
+
+ /@vue/shared@3.3.8:
+ resolution: {integrity: sha512-8PGwybFwM4x8pcfgqEQFy70NaQxASvOC5DJwLQfpArw1UDfUXrJkdxD3BhVTMS+0Lef/TU7YO0Jvr0jJY8T+mw==}
- /@vue/test-utils@2.0.2(vue@3.3.7):
+ /@vue/test-utils@2.0.2(vue@3.3.8):
resolution: {integrity: sha512-E2P4oXSaWDqTZNbmKZFVLrNN/siVN78YkEqs7pHryWerrlZR9bBFLWdJwRoguX45Ru6HxIflzKl4vQvwRMwm5g==}
peerDependencies:
vue: latest
dependencies:
- vue: 3.3.7
+ vue: 3.3.8
dev: true
- /@vuelidate/core@2.0.0-alpha.44(vue@3.3.7):
+ /@vuelidate/core@2.0.0-alpha.44(vue@3.3.8):
resolution: {integrity: sha512-3DlCe3E0RRXbB+OfPacUetKhLmXzmnjeHkzjnbkc03p06mKm6h9pXR5pd6Mv4s4tus4sieuKDb2YWNmKK6rQeA==}
dependencies:
- vue-demi: 0.13.11(vue@3.3.7)
+ vue-demi: 0.13.11(vue@3.3.8)
transitivePeerDependencies:
- '@vue/composition-api'
- vue
dev: false
- /@vuelidate/validators@2.0.0-alpha.31(vue@3.3.7):
+ /@vuelidate/validators@2.0.0-alpha.31(vue@3.3.8):
resolution: {integrity: sha512-+MFA9nZ7Y9zCpq383/voPDk/hiAmu6KqiJJhLOYB/FmrUPVoyKnuKnI9Bwiq8ok9GZlVkI8BnIrKPKGj9QpwiQ==}
dependencies:
- vue-demi: 0.13.11(vue@3.3.7)
+ vue-demi: 0.13.11(vue@3.3.8)
transitivePeerDependencies:
- '@vue/composition-api'
- vue
dev: false
- /@vueuse/core@10.2.1(vue@3.3.7):
+ /@vueuse/core@10.2.1(vue@3.3.8):
resolution: {integrity: sha512-c441bfMbkAwTNwVRHQ0zdYZNETK//P84rC01aP2Uy/aRFCiie9NE/k9KdIXbno0eDYP5NPUuWv0aA/I4Unr/7w==}
dependencies:
'@types/web-bluetooth': 0.0.17
'@vueuse/metadata': 10.2.1
- '@vueuse/shared': 10.2.1(vue@3.3.7)
- vue-demi: 0.14.5(vue@3.3.7)
+ '@vueuse/shared': 10.2.1(vue@3.3.8)
+ vue-demi: 0.14.5(vue@3.3.8)
transitivePeerDependencies:
- '@vue/composition-api'
- vue
- /@vueuse/core@7.7.1(vue@3.3.7):
+ /@vueuse/core@7.7.1(vue@3.3.8):
resolution: {integrity: sha512-PRRgbATMpoeUmkCEBtUeJgOwtew8s+4UsEd+Pm7MhkjL2ihCNrSqxNVtM6NFE4uP2sWnkGcZpCjPuNSxowJ1Ow==}
peerDependencies:
'@vue/composition-api': ^1.1.0
@@ -9074,24 +9626,24 @@ packages:
vue:
optional: true
dependencies:
- '@vueuse/shared': 7.7.1(vue@3.3.7)
- vue: 3.3.7
- vue-demi: 0.14.6(vue@3.3.7)
+ '@vueuse/shared': 7.7.1(vue@3.3.8)
+ vue: 3.3.8
+ vue-demi: 0.14.6(vue@3.3.8)
dev: false
- /@vueuse/core@9.13.0(vue@3.3.7):
+ /@vueuse/core@9.13.0(vue@3.3.8):
resolution: {integrity: sha512-pujnclbeHWxxPRqXWmdkKV5OX4Wk4YeK7wusHqRwU0Q7EFusHoqNA/aPhB6KCh9hEqJkLAJo7bb0Lh9b+OIVzw==}
dependencies:
'@types/web-bluetooth': 0.0.16
'@vueuse/metadata': 9.13.0
- '@vueuse/shared': 9.13.0(vue@3.3.7)
- vue-demi: 0.14.6(vue@3.3.7)
+ '@vueuse/shared': 9.13.0(vue@3.3.8)
+ vue-demi: 0.14.6(vue@3.3.8)
transitivePeerDependencies:
- '@vue/composition-api'
- vue
dev: false
- /@vueuse/integrations@10.2.1(fuse.js@6.6.2)(jwt-decode@3.1.2)(qrcode@1.5.1)(sortablejs@1.15.0)(vue@3.3.7):
+ /@vueuse/integrations@10.2.1(fuse.js@6.6.2)(jwt-decode@3.1.2)(qrcode@1.5.1)(sortablejs@1.15.0)(vue@3.3.8):
resolution: {integrity: sha512-FDP5lni+z9FjHE9H3xuvwSjoRV9U8jmDvJpmHPCBjUgPGYRynwb60eHWXCFJXLUtb4gSIHy0e+iaEbrKdalCkQ==}
peerDependencies:
async-validator: '*'
@@ -9132,13 +9684,13 @@ packages:
universal-cookie:
optional: true
dependencies:
- '@vueuse/core': 10.2.1(vue@3.3.7)
- '@vueuse/shared': 10.2.1(vue@3.3.7)
+ '@vueuse/core': 10.2.1(vue@3.3.8)
+ '@vueuse/shared': 10.2.1(vue@3.3.8)
fuse.js: 6.6.2
jwt-decode: 3.1.2
qrcode: 1.5.1
sortablejs: 1.15.0
- vue-demi: 0.14.5(vue@3.3.7)
+ vue-demi: 0.14.5(vue@3.3.8)
transitivePeerDependencies:
- '@vue/composition-api'
- vue
@@ -9151,17 +9703,17 @@ packages:
resolution: {integrity: sha512-gdU7TKNAUVlXXLbaF+ZCfte8BjRJQWPCa2J55+7/h+yDtzw3vOoGQDRXzI6pyKyo6bXFT5/QoPE4hAknExjRLQ==}
dev: false
- /@vueuse/nuxt@10.2.1(nuxt@3.6.5)(vue@3.3.7):
+ /@vueuse/nuxt@10.2.1(nuxt@3.8.1)(vue@3.3.8):
resolution: {integrity: sha512-01iDXnjZFDaGZnEL0nvlmSTNV0EG6WY+VSFyWnBji9lbxdQwOn4DHvLou3ePe8ipaoQVtY58WcL0OHIFa4+fBA==}
peerDependencies:
nuxt: ^3.0.0
dependencies:
'@nuxt/kit': 3.7.0
- '@vueuse/core': 10.2.1(vue@3.3.7)
+ '@vueuse/core': 10.2.1(vue@3.3.8)
'@vueuse/metadata': 10.2.1
local-pkg: 0.4.3
- nuxt: 3.6.5(@types/node@20.3.1)(eslint@8.33.0)(sass@1.63.4)
- vue-demi: 0.14.5(vue@3.3.7)
+ nuxt: 3.8.1(eslint@8.33.0)(sass@1.63.4)(vite@4.4.9)
+ vue-demi: 0.14.5(vue@3.3.8)
transitivePeerDependencies:
- '@vue/composition-api'
- rollup
@@ -9169,15 +9721,15 @@ packages:
- vue
dev: true
- /@vueuse/shared@10.2.1(vue@3.3.7):
+ /@vueuse/shared@10.2.1(vue@3.3.8):
resolution: {integrity: sha512-QWHq2bSuGptkcxx4f4M/fBYC3Y8d3M2UYyLsyzoPgEoVzJURQ0oJeWXu79OiLlBb8gTKkqe4mO85T/sf39mmiw==}
dependencies:
- vue-demi: 0.14.6(vue@3.3.7)
+ vue-demi: 0.14.6(vue@3.3.8)
transitivePeerDependencies:
- '@vue/composition-api'
- vue
- /@vueuse/shared@7.7.1(vue@3.3.7):
+ /@vueuse/shared@7.7.1(vue@3.3.8):
resolution: {integrity: sha512-rN2qd22AUl7VdBxihagWyhUNHCyVk9IpvBTTfHoLH9G7rGE552X1f+zeCfehuno0zXif13jPw+icW/wn2a0rnQ==}
peerDependencies:
'@vue/composition-api': ^1.1.0
@@ -9188,14 +9740,14 @@ packages:
vue:
optional: true
dependencies:
- vue: 3.3.7
- vue-demi: 0.14.6(vue@3.3.7)
+ vue: 3.3.8
+ vue-demi: 0.14.6(vue@3.3.8)
dev: false
- /@vueuse/shared@9.13.0(vue@3.3.7):
+ /@vueuse/shared@9.13.0(vue@3.3.8):
resolution: {integrity: sha512-UrnhU+Cnufu4S6JLCPZnkWh0WwZGUp72ktOF2DFptMlOs3TOdVv8xJN53zhHGARmVOsz5KqOls09+J1NR6sBKw==}
dependencies:
- vue-demi: 0.14.6(vue@3.3.7)
+ vue-demi: 0.14.6(vue@3.3.8)
transitivePeerDependencies:
- '@vue/composition-api'
- vue
@@ -9454,6 +10006,11 @@ packages:
/abbrev@1.1.1:
resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==}
+ /abbrev@2.0.0:
+ resolution: {integrity: sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==}
+ engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
+ dev: true
+
/abort-controller@3.0.0:
resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==}
engines: {node: '>=6.5'}
@@ -9512,6 +10069,11 @@ packages:
engines: {node: '>=0.4.0'}
hasBin: true
+ /acorn@8.11.2:
+ resolution: {integrity: sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==}
+ engines: {node: '>=0.4.0'}
+ hasBin: true
+
/add-stream@1.0.0:
resolution: {integrity: sha512-qQLMr+8o0WC4FZGQTcJiKBVC59JylcPSrTtk6usvmIDFUOCKegapy1VHQwRbFMOFyb/inzUVqHs+eMYKDM1YeQ==}
dev: true
@@ -9544,7 +10106,6 @@ packages:
debug: 4.3.4(supports-color@8.1.1)
transitivePeerDependencies:
- supports-color
- dev: false
/agentkeepalive@4.5.0:
resolution: {integrity: sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==}
@@ -9688,14 +10249,14 @@ packages:
engines: {node: '>=12'}
dev: true
- /ant-design-vue@3.2.11(vue@3.3.7):
+ /ant-design-vue@3.2.11(vue@3.3.8):
resolution: {integrity: sha512-QKCAcOY5EJF0PepiVGA4X5PzUetYUvG5qALmA+2TON40pc2+brOEiVTwr3kjF9N+f7q4MpyiLPu4pIErwoajOQ==}
engines: {node: '>=12.22.0'}
peerDependencies:
vue: latest
dependencies:
'@ant-design/colors': 6.0.0
- '@ant-design/icons-vue': 6.1.0(vue@3.3.7)
+ '@ant-design/icons-vue': 6.1.0(vue@3.3.8)
'@babel/runtime': 7.22.11
'@ctrl/tinycolor': 3.6.1
'@simonwep/pickr': 1.8.2
@@ -9709,8 +10270,8 @@ packages:
resize-observer-polyfill: 1.5.1
scroll-into-view-if-needed: 2.2.31
shallow-equal: 1.2.1
- vue: 3.3.7
- vue-types: 3.0.2(vue@3.3.7)
+ vue: 3.3.8
+ vue-types: 3.0.2(vue@3.3.8)
warning: 4.0.3
dev: false
@@ -9760,19 +10321,16 @@ packages:
lodash.union: 4.6.0
normalize-path: 3.0.0
readable-stream: 2.3.8
+ dev: false
- /archiver-utils@3.0.3:
- resolution: {integrity: sha512-fXzpEZTKgBJMWy0eUT0/332CAQnJ27OJd7sGcvNZzxS2Yzg7iITivMhXOm+zUTO4vT8ZqlPCqiaLPmB8qWhWRA==}
- engines: {node: '>= 10'}
+ /archiver-utils@4.0.1:
+ resolution: {integrity: sha512-Q4Q99idbvzmgCTEAAhi32BkOyq8iVI5EwdO0PmBDSGIzzjYNdcFn7Q7k3OzbLy4kLUPXfJtG6fO2RjftXbobBg==}
+ engines: {node: '>= 12.0.0'}
dependencies:
- glob: 7.2.3
+ glob: 8.1.0
graceful-fs: 4.2.11
lazystream: 1.0.1
- lodash.defaults: 4.2.0
- lodash.difference: 4.5.0
- lodash.flatten: 4.4.0
- lodash.isplainobject: 4.0.6
- lodash.union: 4.6.0
+ lodash: 4.17.21
normalize-path: 3.0.0
readable-stream: 3.6.2
dev: true
@@ -9790,17 +10348,17 @@ packages:
zip-stream: 4.1.0
dev: false
- /archiver@6.0.0:
- resolution: {integrity: sha512-EPGa+bYaxaMiCT8DCbEDqFz8IjeBSExrJzyUOJx2FBkFJ/OZzJuso3lMSk901M50gMqXxTQcumlGajOFlXhVhw==}
+ /archiver@6.0.1:
+ resolution: {integrity: sha512-CXGy4poOLBKptiZH//VlWdFuUC1RESbdZjGjILwBuZ73P7WkAUN0htfSfBq/7k6FRFlpu7bg4JOkj1vU9G6jcQ==}
engines: {node: '>= 12.0.0'}
dependencies:
- archiver-utils: 3.0.3
+ archiver-utils: 4.0.1
async: 3.2.4
buffer-crc32: 0.2.13
readable-stream: 3.6.2
readdir-glob: 1.1.3
- tar-stream: 2.2.0
- zip-stream: 4.1.0
+ tar-stream: 3.1.6
+ zip-stream: 5.0.1
dev: true
/are-we-there-yet@2.0.0:
@@ -9975,23 +10533,36 @@ packages:
resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==}
dev: true
- /ast-kit@0.10.0:
- resolution: {integrity: sha512-8y01XClpURgvxTJmM4AY2oHa1B/6iysALB9yJM1j4ak3Z2ZsnU0ewjDZzqOHdbNdit6hC0DGZNrBqNuCrv51fQ==}
+ /ast-kit@0.11.2:
+ resolution: {integrity: sha512-Q0DjXK4ApbVoIf9GLyCo252tUH44iTnD/hiJ2TQaJeydYWSpKk0sI34+WMel8S9Wt5pbLgG02oJ+gkgX5DV3sQ==}
engines: {node: '>=16.14.0'}
dependencies:
'@babel/parser': 7.23.0
- '@rollup/pluginutils': 5.0.4(rollup@3.28.1)
+ '@rollup/pluginutils': 5.0.4(rollup@3.29.4)
pathe: 1.1.1
transitivePeerDependencies:
- rollup
dev: true
- /ast-walker-scope@0.4.2:
- resolution: {integrity: sha512-vdCU9JvpsrxWxvJiRHAr8If8cu07LWJXDPhkqLiP4ErbN1fu/mK623QGmU4Qbn2Nq4Mx0vR/Q017B6+HcHg1aQ==}
+ /ast-kit@0.9.5:
+ resolution: {integrity: sha512-kbL7ERlqjXubdDd+szuwdlQ1xUxEz9mCz1+m07ftNVStgwRb2RWw+U6oKo08PAvOishMxiqz1mlJyLl8yQx2Qg==}
engines: {node: '>=16.14.0'}
dependencies:
'@babel/parser': 7.23.0
- '@babel/types': 7.22.11
+ '@rollup/pluginutils': 5.0.4(rollup@3.29.4)
+ pathe: 1.1.1
+ transitivePeerDependencies:
+ - rollup
+ dev: true
+
+ /ast-walker-scope@0.5.0:
+ resolution: {integrity: sha512-NsyHMxBh4dmdEHjBo1/TBZvCKxffmZxRYhmclfu0PP6Aftre47jOHYaYaNqJcV0bxihxFXhDkzLHUwHc0ocd0Q==}
+ engines: {node: '>=16.14.0'}
+ dependencies:
+ '@babel/parser': 7.23.0
+ ast-kit: 0.9.5
+ transitivePeerDependencies:
+ - rollup
dev: true
/astral-regex@2.0.0:
@@ -10034,16 +10605,16 @@ packages:
engines: {node: '>=8'}
dev: false
- /autoprefixer@10.4.15(postcss@8.4.31):
- resolution: {integrity: sha512-KCuPB8ZCIqFdA4HwKXsvz7j6gvSDNhDP7WnUjBleRkKjPdvCmHFuQ77ocavI8FT6NdvlBnE2UFr2H4Mycn8Vew==}
+ /autoprefixer@10.4.16(postcss@8.4.31):
+ resolution: {integrity: sha512-7vd3UC6xKp0HLfua5IjZlcXvGAGy7cBAXTg2lyQ/8WpNhd6SiZ8Be+xm3FyBSYJx5GKcpRCzBh7RH4/0dnY+uQ==}
engines: {node: ^10 || ^12 || >=14}
hasBin: true
peerDependencies:
postcss: ^8.1.0
dependencies:
browserslist: 4.21.10
- caniuse-lite: 1.0.30001524
- fraction.js: 4.2.1
+ caniuse-lite: 1.0.30001561
+ fraction.js: 4.3.7
normalize-range: 0.1.2
picocolors: 1.0.0
postcss: 8.4.31
@@ -10166,7 +10737,6 @@ packages:
resolution: {integrity: sha512-fpWrvyVHEKyeEvbKZTVOeZF3VSKKWtJxFIxX/jaVPf+cLbGUSitjb49pHLqPV2BUNNZ0LcoeEGfE/YCpyDYHIw==}
requiresBuild: true
dev: true
- optional: true
/babel-jest@29.6.4(@babel/core@7.22.11):
resolution: {integrity: sha512-meLj23UlSLddj6PC+YTOFRgDAtjnZom8w/ACsrx0gtPtv5cJZk0A5Unk5bV4wixD7XaPCN1fQvpww8czkZURmw==}
@@ -10296,7 +10866,6 @@ packages:
/big-integer@1.6.51:
resolution: {integrity: sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==}
engines: {node: '>=0.6'}
- dev: false
/big.js@5.2.2:
resolution: {integrity: sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==}
@@ -10324,6 +10893,10 @@ packages:
file-uri-to-path: 1.0.0
dev: true
+ /birpc@0.2.14:
+ resolution: {integrity: sha512-37FHE8rqsYM5JEKCnXFyHpBCzvgHEExwVVTq+nUmloInU7l8ezD1TpOhKpS8oe1DTYFqEK27rFZVKG43oTqXRA==}
+ dev: true
+
/bl@4.1.0:
resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==}
dependencies:
@@ -10437,6 +11010,13 @@ packages:
wrap-ansi: 7.0.0
dev: false
+ /bplist-parser@0.2.0:
+ resolution: {integrity: sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw==}
+ engines: {node: '>= 5.10.0'}
+ dependencies:
+ big-integer: 1.6.51
+ dev: true
+
/brace-expansion@1.1.11:
resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==}
dependencies:
@@ -10567,6 +11147,13 @@ packages:
- supports-color
dev: false
+ /bundle-name@3.0.0:
+ resolution: {integrity: sha512-PKA4BeSvBpQKQ8iPOGCSiell+N8P+Tf1DlwqmYhpe2gAhKPHn8EYOxVT+ShuGmhg8lN8XiSlS80yiExKXrURlw==}
+ engines: {node: '>=12'}
+ dependencies:
+ run-applescript: 5.0.0
+ dev: true
+
/busboy@1.6.0:
resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==}
engines: {node: '>=10.16.0'}
@@ -10599,6 +11186,24 @@ packages:
transitivePeerDependencies:
- supports-color
+ /c12@1.5.1:
+ resolution: {integrity: sha512-BWZRJgDEveT8uI+cliCwvYSSSSvb4xKoiiu5S0jaDbKBopQLQF7E+bq9xKk1pTcG+mUa3yXuFO7bD9d8Lr9Xxg==}
+ dependencies:
+ chokidar: 3.5.3
+ defu: 6.1.3
+ dotenv: 16.3.1
+ giget: 1.1.3
+ jiti: 1.21.0
+ mlly: 1.4.2
+ ohash: 1.1.3
+ pathe: 1.1.1
+ perfect-debounce: 1.0.0
+ pkg-types: 1.0.3
+ rc9: 2.1.1
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
/cac@6.7.14:
resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==}
engines: {node: '>=8'}
@@ -10649,6 +11254,24 @@ packages:
unique-filename: 3.0.0
dev: true
+ /cacache@18.0.0:
+ resolution: {integrity: sha512-I7mVOPl3PUCeRub1U8YoGz2Lqv9WOBpobZ8RyWFXmReuILz+3OAyTa5oH3QPdtKZD7N0Yk00aLfzn0qvp8dZ1w==}
+ engines: {node: ^16.14.0 || >=18.0.0}
+ dependencies:
+ '@npmcli/fs': 3.1.0
+ fs-minipass: 3.0.3
+ glob: 10.3.3
+ lru-cache: 10.0.1
+ minipass: 7.0.3
+ minipass-collect: 1.0.2
+ minipass-flush: 1.0.5
+ minipass-pipeline: 1.2.4
+ p-map: 4.0.0
+ ssri: 10.0.5
+ tar: 6.1.15
+ unique-filename: 3.0.0
+ dev: true
+
/call-bind@1.0.2:
resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==}
dependencies:
@@ -10699,6 +11322,10 @@ packages:
/caniuse-lite@1.0.30001524:
resolution: {integrity: sha512-Jj917pJtYg9HSJBF95HVX3Cdr89JUyLT4IZ8SvM5aDRni95swKgYi3TgYLH5hnGfPE/U1dg6IfZ50UsIlLkwSA==}
+ /caniuse-lite@1.0.30001561:
+ resolution: {integrity: sha512-NTt0DNoKe958Q0BE0j0c1V9jbUzhBxHIEJy7asmGrpE0yG63KTV7PLHPnK2E1O9RsQrQ081I3NLuXGS6zht3cw==}
+ dev: true
+
/caseless@0.12.0:
resolution: {integrity: sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==}
@@ -10873,6 +11500,12 @@ packages:
consola: 3.2.3
dev: true
+ /citty@0.1.4:
+ resolution: {integrity: sha512-Q3bK1huLxzQrvj7hImJ7Z1vKYJRPQCDnd0EjXfHMidcjecGOMuLrmuQmtWmFkuKLcMThlGh1yCKG8IEc6VeNXQ==}
+ dependencies:
+ consola: 3.2.3
+ dev: true
+
/cjs-module-lexer@1.2.3:
resolution: {integrity: sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==}
dev: true
@@ -11208,6 +11841,17 @@ packages:
crc32-stream: 4.0.2
normalize-path: 3.0.0
readable-stream: 3.6.2
+ dev: false
+
+ /compress-commons@5.0.1:
+ resolution: {integrity: sha512-MPh//1cERdLtqwO3pOFLeXtpuai0Y2WCd5AhtKxznqM7WtaMYaOEMSgn45d9D10sIHSfIKE603HlOp8OPGrvag==}
+ engines: {node: '>= 12.0.0'}
+ dependencies:
+ crc-32: 1.2.2
+ crc32-stream: 5.0.0
+ normalize-path: 3.0.0
+ readable-stream: 3.6.2
+ dev: true
/compressible@2.0.18:
resolution: {integrity: sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==}
@@ -11485,6 +12129,15 @@ packages:
dependencies:
crc-32: 1.2.2
readable-stream: 3.6.2
+ dev: false
+
+ /crc32-stream@5.0.0:
+ resolution: {integrity: sha512-B0EPa1UK+qnpBZpG+7FgPCu0J2ETLpXq09o9BkLkEAhdB6Z61Qo4pJ3JYu0c+Qi+/SAL7QThqnzS06pmSSyZaw==}
+ engines: {node: '>= 12.0.0'}
+ dependencies:
+ crc-32: 1.2.2
+ readable-stream: 3.6.2
+ dev: true
/create-require@1.1.1:
resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==}
@@ -11781,10 +12434,6 @@ packages:
/csstype@3.1.2:
resolution: {integrity: sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==}
- /cuint@0.2.2:
- resolution: {integrity: sha512-d4ZVpCW31eWwCMe1YT3ur7mUDnTXbgwyzaL320DrcRT45rfjYxkt5QWLrmOJ+/UEAI2+fQgKe/fCjR8l4TpRgw==}
- dev: true
-
/d3-array@3.2.4:
resolution: {integrity: sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==}
engines: {node: '>=12'}
@@ -11906,11 +12555,6 @@ packages:
assert-plus: 1.0.0
dev: false
- /data-uri-to-buffer@4.0.1:
- resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==}
- engines: {node: '>= 12'}
- dev: true
-
/data-urls@4.0.0:
resolution: {integrity: sha512-/mMTei/JXPqvFqQtfyTowxmJVwr2PVAeCcDxyFf6LhoOu/09TX2OX3kb2wzi4DMXcfj4OItwDOnhl5oziPnT6g==}
engines: {node: '>=14'}
@@ -12060,6 +12704,24 @@ packages:
engines: {node: '>=0.10.0'}
dev: true
+ /default-browser-id@3.0.0:
+ resolution: {integrity: sha512-OZ1y3y0SqSICtE8DE4S8YOE9UZOJ8wO16fKWVP5J1Qz42kV9jcnMVFrEE/noXb/ss3Q4pZIH79kxofzyNNtUNA==}
+ engines: {node: '>=12'}
+ dependencies:
+ bplist-parser: 0.2.0
+ untildify: 4.0.0
+ dev: true
+
+ /default-browser@4.0.0:
+ resolution: {integrity: sha512-wX5pXO1+BrhMkSbROFsyxUm0i/cJEScyNhA4PPxc41ICuv05ZZB/MX28s8aZx6xjmatvebIapF6hLEKEcpneUA==}
+ engines: {node: '>=14.16'}
+ dependencies:
+ bundle-name: 3.0.0
+ default-browser-id: 3.0.0
+ execa: 7.2.0
+ titleize: 3.0.0
+ dev: true
+
/default-user-agent@1.0.0:
resolution: {integrity: sha512-bDF7bg6OSNcSwFWPu4zYKpVkJZQYVrAANMYB8bc9Szem1D0yKdm4sa/rOCs2aC9+2GMqQ7KnwtZRvDhmLF0dXw==}
engines: {node: '>= 0.10.0'}
@@ -12077,6 +12739,11 @@ packages:
resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==}
engines: {node: '>=8'}
+ /define-lazy-prop@3.0.0:
+ resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==}
+ engines: {node: '>=12'}
+ dev: true
+
/define-properties@1.2.0:
resolution: {integrity: sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==}
engines: {node: '>= 0.4'}
@@ -12087,6 +12754,9 @@ packages:
/defu@6.1.2:
resolution: {integrity: sha512-+uO4+qr7msjNNWKYPHqN/3+Dx3NFkmIzayk2L1MyZQlvgZb/J1A0fo410dpKrN2SnqFjt8n4JL8fDJE0wIgjFQ==}
+ /defu@6.1.3:
+ resolution: {integrity: sha512-Vy2wmG3NTkmHNg/kzpuvHhkqeIx3ODWqasgCRbKtbXEN0G+HpEEv9BtJLp7ZG1CZloFaC41Ah3ZFbq7aqCqMeQ==}
+
/delayed-stream@1.0.0:
resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==}
engines: {node: '>=0.4.0'}
@@ -12120,6 +12790,10 @@ packages:
/destr@2.0.1:
resolution: {integrity: sha512-M1Ob1zPSIvlARiJUkKqvAZ3VAqQY6Jcuth/pBKQ2b1dX/Qx0OnJ8Vux6J2H5PTMQeRzWrrbTu70VxBfv/OPDJA==}
+ /destr@2.0.2:
+ resolution: {integrity: sha512-65AlobnZMiCET00KaFFjUefxDX0khFA/E4myqZ7a6Sq1yZtR8+FVIvilVX66vF2uobSumxooYZChiRPCKNqhmg==}
+ dev: true
+
/destroy@1.2.0:
resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==}
engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16}
@@ -12171,6 +12845,11 @@ packages:
engines: {node: '>=0.3.1'}
dev: true
+ /diff@5.1.0:
+ resolution: {integrity: sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==}
+ engines: {node: '>=0.3.1'}
+ dev: true
+
/digest-header@1.1.0:
resolution: {integrity: sha512-glXVh42vz40yZb9Cq2oMOt70FIoWiv+vxNvdKdU8CwjLad25qHM3trLxhl9bVjdr6WaslIXhWpn0NO8T/67Qjg==}
engines: {node: '>= 8.0.0'}
@@ -12362,14 +13041,14 @@ packages:
engines: {node: '>=10'}
dev: false
- /emoji-mart-vue-fast@15.0.0(vue@3.3.7):
+ /emoji-mart-vue-fast@15.0.0(vue@3.3.8):
resolution: {integrity: sha512-3BzkDrs60JyT00dLHMAxWKbpFhbyaW9C+q1AjtqGovSxTu8TC2mYAGsvTmXNYKm39IRRAS56v92TihOcB98IsQ==}
peerDependencies:
vue: latest
dependencies:
'@babel/runtime': 7.22.11
core-js: 3.32.1
- vue: 3.3.7
+ vue: 3.3.8
dev: false
/emoji-regex@8.0.0:
@@ -12533,6 +13212,10 @@ packages:
is-arrayish: 0.2.1
dev: true
+ /error-stack-parser-es@0.1.1:
+ resolution: {integrity: sha512-g/9rfnvnagiNf+DRMHEVGuGuIBlCIMDFoTA616HaP2l9PlCjGjVhD98PNbVSJvmK4TttqT5mV5tInMhoFgi+aA==}
+ dev: true
+
/es-abstract@1.22.1:
resolution: {integrity: sha512-ioRRcXMO6OFyRpyzV3kE1IIBd4WG5/kltnzdxSCqoP8CMGs/Li+M1uF5o7lOkZVFjDs+NLesthnF66Pg/0q0Lw==}
engines: {node: '>= 0.4'}
@@ -12639,36 +13322,6 @@ packages:
resolution: {integrity: sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==}
dev: false
- /esbuild@0.17.19:
- resolution: {integrity: sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==}
- engines: {node: '>=12'}
- hasBin: true
- requiresBuild: true
- optionalDependencies:
- '@esbuild/android-arm': 0.17.19
- '@esbuild/android-arm64': 0.17.19
- '@esbuild/android-x64': 0.17.19
- '@esbuild/darwin-arm64': 0.17.19
- '@esbuild/darwin-x64': 0.17.19
- '@esbuild/freebsd-arm64': 0.17.19
- '@esbuild/freebsd-x64': 0.17.19
- '@esbuild/linux-arm': 0.17.19
- '@esbuild/linux-arm64': 0.17.19
- '@esbuild/linux-ia32': 0.17.19
- '@esbuild/linux-loong64': 0.17.19
- '@esbuild/linux-mips64el': 0.17.19
- '@esbuild/linux-ppc64': 0.17.19
- '@esbuild/linux-riscv64': 0.17.19
- '@esbuild/linux-s390x': 0.17.19
- '@esbuild/linux-x64': 0.17.19
- '@esbuild/netbsd-x64': 0.17.19
- '@esbuild/openbsd-x64': 0.17.19
- '@esbuild/sunos-x64': 0.17.19
- '@esbuild/win32-arm64': 0.17.19
- '@esbuild/win32-ia32': 0.17.19
- '@esbuild/win32-x64': 0.17.19
- dev: true
-
/esbuild@0.18.20:
resolution: {integrity: sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==}
engines: {node: '>=12'}
@@ -12729,6 +13382,36 @@ packages:
'@esbuild/win32-x64': 0.19.2
dev: true
+ /esbuild@0.19.5:
+ resolution: {integrity: sha512-bUxalY7b1g8vNhQKdB24QDmHeY4V4tw/s6Ak5z+jJX9laP5MoQseTOMemAr0gxssjNcH0MCViG8ONI2kksvfFQ==}
+ engines: {node: '>=12'}
+ hasBin: true
+ requiresBuild: true
+ optionalDependencies:
+ '@esbuild/android-arm': 0.19.5
+ '@esbuild/android-arm64': 0.19.5
+ '@esbuild/android-x64': 0.19.5
+ '@esbuild/darwin-arm64': 0.19.5
+ '@esbuild/darwin-x64': 0.19.5
+ '@esbuild/freebsd-arm64': 0.19.5
+ '@esbuild/freebsd-x64': 0.19.5
+ '@esbuild/linux-arm': 0.19.5
+ '@esbuild/linux-arm64': 0.19.5
+ '@esbuild/linux-ia32': 0.19.5
+ '@esbuild/linux-loong64': 0.19.5
+ '@esbuild/linux-mips64el': 0.19.5
+ '@esbuild/linux-ppc64': 0.19.5
+ '@esbuild/linux-riscv64': 0.19.5
+ '@esbuild/linux-s390x': 0.19.5
+ '@esbuild/linux-x64': 0.19.5
+ '@esbuild/netbsd-x64': 0.19.5
+ '@esbuild/openbsd-x64': 0.19.5
+ '@esbuild/sunos-x64': 0.19.5
+ '@esbuild/win32-arm64': 0.19.5
+ '@esbuild/win32-ia32': 0.19.5
+ '@esbuild/win32-x64': 0.19.5
+ dev: true
+
/escalade@3.1.1:
resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==}
engines: {node: '>=6'}
@@ -13500,6 +14183,21 @@ packages:
strip-final-newline: 3.0.0
dev: true
+ /execa@8.0.1:
+ resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==}
+ engines: {node: '>=16.17'}
+ dependencies:
+ cross-spawn: 7.0.3
+ get-stream: 8.0.1
+ human-signals: 5.0.0
+ is-stream: 3.0.0
+ merge-stream: 2.0.0
+ npm-run-path: 5.1.0
+ onetime: 6.0.0
+ signal-exit: 4.1.0
+ strip-final-newline: 3.0.0
+ dev: true
+
/exit-on-epipe@1.0.1:
resolution: {integrity: sha512-h2z5mrROTxce56S+pnvAV890uu7ls7f1kEvVGJbw1OlFH3/mlJ5bkXu0KRyW94v37zzHPiUd55iLn3DA7TjWpw==}
engines: {node: '>=0.8'}
@@ -13640,9 +14338,9 @@ packages:
resolution: {integrity: sha512-LyExtJWKxtgVzmgtEHyQtLFpw1KFhQphF9nTG8TpAIVkiI/xQ3FJh75tRFLYl4hkn7BNIIdLJInuDAavX35pMw==}
dependencies:
enhanced-resolve: 5.15.0
- mlly: 1.4.1
+ mlly: 1.4.2
pathe: 1.1.1
- ufo: 1.3.0
+ ufo: 1.3.1
dev: true
/extract-zip@2.0.1:
@@ -13679,7 +14377,6 @@ packages:
resolution: {integrity: sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==}
requiresBuild: true
dev: true
- optional: true
/fast-glob@3.2.12:
resolution: {integrity: sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==}
@@ -13795,14 +14492,6 @@ packages:
tmp: 0.0.33
dev: false
- /fetch-blob@3.2.0:
- resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==}
- engines: {node: ^12.20 || >= 14.13}
- dependencies:
- node-domexception: 1.0.0
- web-streams-polyfill: 3.2.1
- dev: true
-
/figures@3.2.0:
resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==}
engines: {node: '>=8'}
@@ -13904,6 +14593,10 @@ packages:
resolution: {integrity: sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==}
dev: true
+ /flatted@3.2.9:
+ resolution: {integrity: sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==}
+ dev: true
+
/fn.name@1.1.0:
resolution: {integrity: sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==}
dev: false
@@ -14014,13 +14707,6 @@ packages:
combined-stream: 1.0.8
mime-types: 2.1.35
- /formdata-polyfill@4.0.10:
- resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==}
- engines: {node: '>=12.20.0'}
- dependencies:
- fetch-blob: 3.2.0
- dev: true
-
/formidable@2.1.2:
resolution: {integrity: sha512-CM3GuJ57US06mlpQ47YcunuUZ9jpm8Vx+P2CGt2j7HpgkKZO/DJYQ0Bobim8G6PFQmK5lOqOOdUXboU+h73A4g==}
dependencies:
@@ -14046,8 +14732,8 @@ packages:
resolution: {integrity: sha512-w/XBfkibaTl3YDqASwfDUqkna4Z2p9cFSr1aHDt0WoMTECnRfBOv2WArlZILlqgWlmdIlALXGpM2AOhEk5W3IA==}
engines: {node: '>=0.8'}
- /fraction.js@4.2.1:
- resolution: {integrity: sha512-/KxoyCnPM0GwYI4NN0Iag38Tqt+od3/mLuguepLgCAKPn0ZhC544nssAW0tG2/00zXEYl9W+7hwAIpLHo6Oc7Q==}
+ /fraction.js@4.3.7:
+ resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==}
dev: true
/fresh@0.5.2:
@@ -14316,6 +15002,10 @@ packages:
resolution: {integrity: sha512-c14cAITf0E+uqdxGALvyYHwOL7UsnWcv3oDtgDAZksiVSGN87xlWVUWGZcmWQU3cICdaOxT+6LdQzUfK2ei1SA==}
dev: true
+ /get-port-please@3.1.1:
+ resolution: {integrity: sha512-3UBAyM3u4ZBVYDsxOQfJDxEa6XTbpBDrOjp4mf7ExFRt5BKs/QywQQiJsh2B+hxcZLSapWqCRvElUe8DnKcFHA==}
+ dev: true
+
/get-port@3.2.0:
resolution: {integrity: sha512-x5UJKlgeUiNT8nyo/AcnwLnZuZNcSjSw0kogRB+Whd1fjjFq4B1hySFxSFWWSn4mIBzg3sRNUDFYc4g5gjPoLg==}
engines: {node: '>=4'}
@@ -14356,6 +15046,11 @@ packages:
engines: {node: '>=10'}
dev: true
+ /get-stream@8.0.1:
+ resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==}
+ engines: {node: '>=16'}
+ dev: true
+
/get-symbol-description@1.0.0:
resolution: {integrity: sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==}
engines: {node: '>= 0.4'}
@@ -14387,6 +15082,21 @@ packages:
transitivePeerDependencies:
- supports-color
+ /giget@1.1.3:
+ resolution: {integrity: sha512-zHuCeqtfgqgDwvXlR84UNgnJDuUHQcNI5OqWqFxxuk2BshuKbYhJWdxBsEo4PvKqoGh23lUAIvBNpChMLv7/9Q==}
+ hasBin: true
+ dependencies:
+ colorette: 2.0.20
+ defu: 6.1.3
+ https-proxy-agent: 7.0.2
+ mri: 1.2.0
+ node-fetch-native: 1.4.0
+ pathe: 1.1.1
+ tar: 6.2.0
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
/git-config-path@2.0.0:
resolution: {integrity: sha512-qc8h1KIQbJpp+241id3GuAtkdyJ+IK+LIVtkiFTRKRrmddDzs3SI9CvP1QYmWBFvm1I/PWRwj//of8bgAc0ltA==}
engines: {node: '>=4'}
@@ -14465,6 +15175,18 @@ packages:
resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==}
dev: true
+ /glob@10.3.10:
+ resolution: {integrity: sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==}
+ engines: {node: '>=16 || 14 >=14.17'}
+ hasBin: true
+ dependencies:
+ foreground-child: 3.1.1
+ jackspeak: 2.3.6
+ minimatch: 9.0.3
+ minipass: 7.0.3
+ path-scurry: 1.10.1
+ dev: true
+
/glob@10.3.3:
resolution: {integrity: sha512-92vPiMb/iqpmEgsOoIDvTjc50wf9CCCvMzsi6W0JLPeUKE8TWP1a73PgqSrqy7iAZxaSD1YdzU7QZR5LF51MJw==}
engines: {node: '>=16 || 14 >=14.17'}
@@ -14547,6 +15269,13 @@ packages:
ini: 1.3.8
dev: true
+ /global-dirs@3.0.1:
+ resolution: {integrity: sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==}
+ engines: {node: '>=10'}
+ dependencies:
+ ini: 2.0.0
+ dev: true
+
/globals@11.12.0:
resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==}
engines: {node: '>=4'}
@@ -14760,6 +15489,19 @@ packages:
unenv: 1.7.4
dev: true
+ /h3@1.8.2:
+ resolution: {integrity: sha512-1Ca0orJJlCaiFY68BvzQtP2lKLk46kcLAxVM8JgYbtm2cUg6IY7pjpYgWMwUvDO9QI30N5JAukOKoT8KD3Q0PQ==}
+ dependencies:
+ cookie-es: 1.0.0
+ defu: 6.1.3
+ destr: 2.0.2
+ iron-webcrypto: 0.10.1
+ radix3: 1.1.0
+ ufo: 1.3.1
+ uncrypto: 0.1.3
+ unenv: 1.7.4
+ dev: true
+
/handlebars@4.7.6:
resolution: {integrity: sha512-1f2BACcBfiwAfStCKZNrUCgqNZkGsAT7UM3kkYtXuLo0KnaVfjKOyf7PRzB6++aK9STyT1Pd2ZCPe3EGOXleXA==}
engines: {node: '>=0.4.7'}
@@ -14918,6 +15660,13 @@ packages:
lru-cache: 7.18.3
dev: true
+ /hosted-git-info@7.0.1:
+ resolution: {integrity: sha512-+K84LB1DYwMHoHSgaOY/Jfhw3ucPmSET5v98Ke/HdNSw4a0UktWzyW1mjhjpuxxTqOOsfWT/7iVshHmVZ4IpOA==}
+ engines: {node: ^16.14.0 || >=18.0.0}
+ dependencies:
+ lru-cache: 10.0.1
+ dev: true
+
/html-encoding-sniffer@3.0.0:
resolution: {integrity: sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==}
engines: {node: '>=12'}
@@ -14994,6 +15743,16 @@ packages:
transitivePeerDependencies:
- supports-color
+ /http-proxy-agent@7.0.0:
+ resolution: {integrity: sha512-+ZT+iBxVUQ1asugqnD6oWoRiS25AkjNfG085dKJGtGxkdwLQrMKU5wJr2bOOFAXzKcTuqq+7fZlTMgG3SRfIYQ==}
+ engines: {node: '>= 14'}
+ dependencies:
+ agent-base: 7.1.0
+ debug: 4.3.4(supports-color@8.1.1)
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
/http-response-object@3.0.2:
resolution: {integrity: sha512-bqX0XTF6fnXSQcEJ2Iuyr75yVakyjIDCqroJQ/aHfSdlM743Cwqoi2nDYMzLGWUcuTWGWy8AAvOKXTfiv6q9RA==}
dependencies:
@@ -15032,7 +15791,6 @@ packages:
debug: 4.3.4(supports-color@8.1.1)
transitivePeerDependencies:
- supports-color
- dev: false
/httpsnippet@2.0.0(mkdirp@2.1.3):
resolution: {integrity: sha512-Hb2ttfB5OhasYxwChZ8QKpYX3v4plNvwMaMulUIC7M3RHRDf1Op6EMp47LfaU2sgQgfvo5spWK4xRAirMEisrg==}
@@ -15053,8 +15811,8 @@ packages:
- supports-color
dev: false
- /httpxy@0.1.4:
- resolution: {integrity: sha512-ArXKNWhU5taozl6fFnu01M9HiInAqSOw4mUp+7DY/zbTHPmS8JBqH0IC3VLovRBd9b8ZE03ztemcxzeWT6pCoA==}
+ /httpxy@0.1.5:
+ resolution: {integrity: sha512-hqLDO+rfststuyEUTWObQK6zHEEmZ/kaIP2/zclGGZn6X8h/ESTWg+WKecQ/e5k4nPswjzZD+q2VqZIbr15CoQ==}
dev: true
/human-signals@1.1.1:
@@ -15077,6 +15835,11 @@ packages:
engines: {node: '>=14.18.0'}
dev: true
+ /human-signals@5.0.0:
+ resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==}
+ engines: {node: '>=16.17.0'}
+ dev: true
+
/humanize-ms@1.2.1:
resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==}
dependencies:
@@ -15193,6 +15956,11 @@ packages:
resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==}
dev: true
+ /ini@2.0.0:
+ resolution: {integrity: sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==}
+ engines: {node: '>=10'}
+ dev: true
+
/init-package-json@5.0.0:
resolution: {integrity: sha512-kBhlSheBfYmq3e0L1ii+VKe3zBTLL5lDCDWR+f9dLmEGSB3MqLlMlsolubSsyI88Bg6EA+BIMlomAnQ1SwgQBw==}
engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
@@ -15396,6 +16164,10 @@ packages:
dev: true
optional: true
+ /iron-webcrypto@0.10.1:
+ resolution: {integrity: sha512-QGOS8MRMnj/UiOa+aMIgfyHcvkhqNUsUxb1XzskENvbo+rEfp6TOwqd1KPuDzXC4OnGHcMSVxDGRoilqB8ViqA==}
+ dev: true
+
/iron-webcrypto@0.8.0:
resolution: {integrity: sha512-gScdcWHjTGclCU15CIv2r069NoQrys1UeUFFfaO1hL++ytLHkVw7N5nXJmFf3J2LEDMz1PkrvC0m62JEeu1axQ==}
dev: true
@@ -15573,6 +16345,22 @@ packages:
- supports-color
dev: true
+ /is-inside-container@1.0.0:
+ resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==}
+ engines: {node: '>=14.16'}
+ hasBin: true
+ dependencies:
+ is-docker: 3.0.0
+ dev: true
+
+ /is-installed-globally@0.4.0:
+ resolution: {integrity: sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==}
+ engines: {node: '>=10'}
+ dependencies:
+ global-dirs: 3.0.1
+ is-path-inside: 3.0.3
+ dev: true
+
/is-interactive@1.0.0:
resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==}
engines: {node: '>=8'}
@@ -15809,6 +16597,11 @@ packages:
/isexe@2.0.0:
resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==}
+ /isexe@3.1.1:
+ resolution: {integrity: sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==}
+ engines: {node: '>=16'}
+ dev: true
+
/iso639-codes@1.0.1:
resolution: {integrity: sha512-jdTSv8yn6D7GODDrRtuWG7y3du3aoa+ki5H8h/Y48/NleNAd7Fw/M2niTTLXGH4QnqhJ98hg1JMQtP9csQ31Lg==}
engines: {node: '>=8'}
@@ -15938,6 +16731,15 @@ packages:
'@pkgjs/parseargs': 0.11.0
dev: true
+ /jackspeak@2.3.6:
+ resolution: {integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==}
+ engines: {node: '>=14'}
+ dependencies:
+ '@isaacs/cliui': 8.0.2
+ optionalDependencies:
+ '@pkgjs/parseargs': 0.11.0
+ dev: true
+
/jake@10.8.7:
resolution: {integrity: sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w==}
engines: {node: '>=10'}
@@ -16373,6 +17175,10 @@ packages:
resolution: {integrity: sha512-5eEbBDQT/jF1xg6l36P+mWGGoH9Spuy0PCdSr2dtWRDGC6ph/w9ZCL4lmESW8f8F7MwT3XKescfP0wnZWAKL9w==}
hasBin: true
+ /jiti@1.21.0:
+ resolution: {integrity: sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==}
+ hasBin: true
+
/jmespath@0.16.0:
resolution: {integrity: sha512-9FzQjJ7MATs1tSpnco1K6ayiYE3figslrXA72G2HQ/n76RzvYlofyi5QM+iX4YRs/pu3yzxlVQSST23+dMDknw==}
engines: {node: '>= 0.6.0'}
@@ -16746,6 +17552,13 @@ packages:
resolution: {integrity: sha512-v4pxOBEQVN1WBTfB1crhTtxzNLZU9HPWgadlwzWKISJtt6Ku/CnpBrwVy+jFv8StjxsPfwPFzO0CMwdZLJ0/BA==}
dev: false
+ /launch-editor@2.6.1:
+ resolution: {integrity: sha512-eB/uXmFVpY4zezmGp5XtU21kwo7GBbKB+EQ+UZeWtGb9yAM5xt/Evk+lYH3eRNAtId+ej4u7TYPFZ07w4s7rRw==}
+ dependencies:
+ picocolors: 1.0.0
+ shell-quote: 1.8.1
+ dev: true
+
/lazystream@1.0.1:
resolution: {integrity: sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==}
engines: {node: '>= 0.6.3'}
@@ -16970,6 +17783,29 @@ packages:
uqr: 0.1.2
dev: true
+ /listhen@1.5.5:
+ resolution: {integrity: sha512-LXe8Xlyh3gnxdv4tSjTjscD1vpr/2PRpzq8YIaMJgyKzRG8wdISlWVWnGThJfHnlJ6hmLt2wq1yeeix0TEbuoA==}
+ hasBin: true
+ dependencies:
+ '@parcel/watcher': 2.3.0
+ '@parcel/watcher-wasm': 2.3.0
+ citty: 0.1.4
+ clipboardy: 3.0.0
+ consola: 3.2.3
+ defu: 6.1.3
+ get-port-please: 3.1.1
+ h3: 1.8.2
+ http-shutdown: 1.2.2
+ jiti: 1.21.0
+ mlly: 1.4.2
+ node-forge: 1.3.1
+ pathe: 1.1.1
+ std-env: 3.4.3
+ ufo: 1.3.1
+ untun: 0.1.2
+ uqr: 0.1.2
+ dev: true
+
/listr2@4.0.5:
resolution: {integrity: sha512-juGHV1doQdpNT3GSTs9IUN43QJb7KHdF9uqg7Vufs/tG9VTzpFphqF4pm/ICdAABGQxsyNn9CiYA3StkI6jpwA==}
engines: {node: '>=12'}
@@ -17027,6 +17863,14 @@ packages:
resolution: {integrity: sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==}
engines: {node: '>=14'}
+ /local-pkg@0.5.0:
+ resolution: {integrity: sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg==}
+ engines: {node: '>=14'}
+ dependencies:
+ mlly: 1.4.2
+ pkg-types: 1.0.3
+ dev: true
+
/locale-codes@1.3.1:
resolution: {integrity: sha512-C7fxGkU4jAuHqavtKj4IhSD2yPEzChFMRfNHjzwIAz9JTbYHtBJDcQQgmJDezBogk9/vvgS7chKMhpVEKavk5A==}
engines: {node: '>=8'}
@@ -17074,9 +17918,11 @@ packages:
/lodash.difference@4.5.0:
resolution: {integrity: sha512-dS2j+W26TQ7taQBGN8Lbbq04ssV3emRw4NY58WErlTO29pIqS0HmoT5aJ9+TUQ1N3G+JOZSji4eugsWwGp9yPA==}
+ dev: false
/lodash.flatten@4.4.0:
resolution: {integrity: sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==}
+ dev: false
/lodash.includes@4.3.0:
resolution: {integrity: sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==}
@@ -17103,6 +17949,7 @@ packages:
/lodash.isplainobject@4.0.6:
resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==}
+ dev: false
/lodash.isstring@4.0.1:
resolution: {integrity: sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==}
@@ -17139,6 +17986,7 @@ packages:
/lodash.union@4.6.0:
resolution: {integrity: sha512-c4pB2CdGrGdjMKYLA+XiRDO7Y0PRQbm/Gzg8qMj+QH+pFVAoTp5sBpO0odL3FjoPCGjK96p6qsP+yQoiLoOBcw==}
+ dev: false
/lodash.uniq@4.5.0:
resolution: {integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==}
@@ -17285,6 +18133,14 @@ packages:
dependencies:
'@jridgewell/sourcemap-codec': 1.4.15
+ /magicast@0.3.0:
+ resolution: {integrity: sha512-ZsEzw35h7xYoFlWHIyxU6zmH4sdwzdmY0DY4s/Lie/qKimeijz2jRw8/OV2248kt/y6FbvoTvGRKyB7y/Mpx8w==}
+ dependencies:
+ '@babel/parser': 7.23.0
+ '@babel/types': 7.23.0
+ source-map-js: 1.0.2
+ dev: true
+
/mailersend@1.1.0:
resolution: {integrity: sha512-hqUkm76n8WEqytoLnQ5woHI5eCN7b4o98zpru7ehoSCUL+Dek8nhMV6h4i4gfaSwOyv8kf9InEzkWsauqrF2WA==}
dependencies:
@@ -17341,6 +18197,25 @@ packages:
- supports-color
dev: true
+ /make-fetch-happen@13.0.0:
+ resolution: {integrity: sha512-7ThobcL8brtGo9CavByQrQi+23aIfgYU++wg4B87AIS8Rb2ZBt/MEaDqzA00Xwv/jUjAjYkLHjVolYuTLKda2A==}
+ engines: {node: ^16.14.0 || >=18.0.0}
+ dependencies:
+ '@npmcli/agent': 2.2.0
+ cacache: 18.0.0
+ http-cache-semantics: 4.1.1
+ is-lambda: 1.0.1
+ minipass: 7.0.3
+ minipass-fetch: 3.0.4
+ minipass-flush: 1.0.5
+ minipass-pipeline: 1.2.4
+ negotiator: 0.6.3
+ promise-retry: 2.0.1
+ ssri: 10.0.5
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
/make-fetch-happen@9.1.0:
resolution: {integrity: sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg==}
engines: {node: '>= 10'}
@@ -17522,12 +18397,6 @@ packages:
engines: {node: '>=4'}
hasBin: true
- /mime@2.5.2:
- resolution: {integrity: sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg==}
- engines: {node: '>=4.0.0'}
- hasBin: true
- dev: true
-
/mime@2.6.0:
resolution: {integrity: sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==}
engines: {node: '>=4.0.0'}
@@ -17570,12 +18439,6 @@ packages:
brace-expansion: 1.1.11
dev: true
- /minimatch@3.0.8:
- resolution: {integrity: sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==}
- dependencies:
- brace-expansion: 1.1.11
- dev: true
-
/minimatch@3.1.2:
resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==}
dependencies:
@@ -17768,6 +18631,14 @@ packages:
pkg-types: 1.0.3
ufo: 1.3.0
+ /mlly@1.4.2:
+ resolution: {integrity: sha512-i/Ykufi2t1EZ6NaPLdfnZk2AX8cs0d+mTzVKuPfqPKPatxLApaBoxJQ9x1/uckXtrS/U5oisPMDkNs0yQTaBRg==}
+ dependencies:
+ acorn: 8.11.2
+ pathe: 1.1.1
+ pkg-types: 1.0.3
+ ufo: 1.3.1
+
/mocha@10.1.0:
resolution: {integrity: sha512-vUF7IYxEoN7XhQpFLxQAEMtE4W91acW4B6En9l97MwE9stL1A9gusXfoHZCLVHDUJ/7V5+lbCM6yMqzo5vNymg==}
engines: {node: '>= 14.0.0'}
@@ -18121,73 +18992,78 @@ packages:
resolution: {integrity: sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==}
dev: true
- /nitropack@2.6.2:
- resolution: {integrity: sha512-gzbxLIhCoQrK+NrgW5Szuo6zzFEU/bqoohimyJ8IkETI3MXlYtLphlW/UVE8pv8UQ0IJ2HzxFpZ7Ldd0+bQ35A==}
+ /nitropack@2.7.2:
+ resolution: {integrity: sha512-6vQbGdBNR20N8wTChzIQUZQmNVhWVDrjUdpOYD68u2hlyUiJembth2fQuoWw3KlsoNYWFvcyqL9X3DPjjnoEUQ==}
engines: {node: ^16.11.0 || >=17.0.0}
hasBin: true
+ peerDependencies:
+ xml2js: ^0.6.2
+ peerDependenciesMeta:
+ xml2js:
+ optional: true
dependencies:
'@cloudflare/kv-asset-handler': 0.3.0
- '@netlify/functions': 2.0.2
- '@rollup/plugin-alias': 5.0.0(rollup@3.28.1)
- '@rollup/plugin-commonjs': 25.0.4(rollup@3.28.1)
- '@rollup/plugin-inject': 5.0.3(rollup@3.28.1)
- '@rollup/plugin-json': 6.0.0(rollup@3.28.1)
- '@rollup/plugin-node-resolve': 15.2.1(rollup@3.28.1)
- '@rollup/plugin-replace': 5.0.2(rollup@3.28.1)
- '@rollup/plugin-terser': 0.4.3(rollup@3.28.1)
- '@rollup/plugin-wasm': 6.1.3(rollup@3.28.1)
- '@rollup/pluginutils': 5.0.4(rollup@3.28.1)
- '@types/http-proxy': 1.17.11
- '@vercel/nft': 0.23.1
- archiver: 6.0.0
- c12: 1.4.2
+ '@netlify/functions': 2.3.0
+ '@rollup/plugin-alias': 5.0.1(rollup@3.29.4)
+ '@rollup/plugin-commonjs': 25.0.7(rollup@3.29.4)
+ '@rollup/plugin-inject': 5.0.5(rollup@3.29.4)
+ '@rollup/plugin-json': 6.0.1(rollup@3.29.4)
+ '@rollup/plugin-node-resolve': 15.2.3(rollup@3.29.4)
+ '@rollup/plugin-replace': 5.0.5(rollup@3.29.4)
+ '@rollup/plugin-terser': 0.4.4(rollup@3.29.4)
+ '@rollup/plugin-wasm': 6.2.2(rollup@3.29.4)
+ '@rollup/pluginutils': 5.0.5(rollup@3.29.4)
+ '@types/http-proxy': 1.17.14
+ '@vercel/nft': 0.24.3
+ archiver: 6.0.1
+ c12: 1.5.1
chalk: 5.3.0
chokidar: 3.5.3
- citty: 0.1.3
+ citty: 0.1.4
consola: 3.2.3
cookie-es: 1.0.0
- defu: 6.1.2
- destr: 2.0.1
+ defu: 6.1.3
+ destr: 2.0.2
dot-prop: 8.0.2
- esbuild: 0.19.2
+ esbuild: 0.19.5
escape-string-regexp: 5.0.0
etag: 1.8.1
fs-extra: 11.1.1
globby: 13.2.2
gzip-size: 7.0.0
- h3: 1.8.1
+ h3: 1.8.2
hookable: 5.5.3
- httpxy: 0.1.4
+ httpxy: 0.1.5
is-primitive: 3.0.1
- jiti: 1.19.3
+ jiti: 1.21.0
klona: 2.0.6
knitwork: 1.0.0
- listhen: 1.4.3
+ listhen: 1.5.5
magic-string: 0.30.5
mime: 3.0.0
- mlly: 1.4.1
+ mlly: 1.4.2
mri: 1.2.0
- node-fetch-native: 1.4.0
+ node-fetch-native: 1.4.1
ofetch: 1.3.3
ohash: 1.1.3
- openapi-typescript: 6.5.3
+ openapi-typescript: 6.7.0
pathe: 1.1.1
perfect-debounce: 1.0.0
pkg-types: 1.0.3
pretty-bytes: 6.1.1
radix3: 1.1.0
- rollup: 3.28.1
- rollup-plugin-visualizer: 5.9.2(rollup@3.28.1)
+ rollup: 3.29.4
+ rollup-plugin-visualizer: 5.9.2(rollup@3.29.4)
scule: 1.0.0
semver: 7.5.4
serve-placeholder: 2.0.1
serve-static: 1.15.0
std-env: 3.4.3
- ufo: 1.3.0
+ ufo: 1.3.1
uncrypto: 0.1.3
unctx: 2.3.1
unenv: 1.7.4
- unimport: 3.2.0(rollup@3.28.1)
+ unimport: 3.4.0(rollup@3.29.4)
unstorage: 1.9.0
transitivePeerDependencies:
- '@azure/app-configuration'
@@ -18242,11 +19118,6 @@ packages:
requiresBuild: true
dev: true
- /node-domexception@1.0.0:
- resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==}
- engines: {node: '>=10.5.0'}
- dev: true
-
/node-emoji@1.11.0:
resolution: {integrity: sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==}
dependencies:
@@ -18256,6 +19127,10 @@ packages:
/node-fetch-native@1.4.0:
resolution: {integrity: sha512-F5kfEj95kX8tkDhUCYdV8dg3/8Olx/94zB8+ZNthFs6Bz31UpUi8Xh40TN3thLwXgrwXry1pEg9lJ++tLWTcqA==}
+ /node-fetch-native@1.4.1:
+ resolution: {integrity: sha512-NsXBU0UgBxo2rQLOeWNZqS3fvflWePMECr8CoSWoSTqCqGbVVsvl9vZu1HfQicYN0g5piV9Gh8RTEvo/uP752w==}
+ dev: true
+
/node-fetch@2.6.7:
resolution: {integrity: sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==}
engines: {node: 4.x || >=6.0.0}
@@ -18279,15 +19154,6 @@ packages:
dependencies:
whatwg-url: 5.0.0
- /node-fetch@3.3.2:
- resolution: {integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==}
- engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
- dependencies:
- data-uri-to-buffer: 4.0.1
- fetch-blob: 3.2.0
- formdata-polyfill: 4.0.10
- dev: true
-
/node-forge@1.3.1:
resolution: {integrity: sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==}
engines: {node: '>= 6.13.0'}
@@ -18304,6 +19170,25 @@ packages:
hasBin: true
dev: true
+ /node-gyp@10.0.1:
+ resolution: {integrity: sha512-gg3/bHehQfZivQVfqIyy8wTdSymF9yTyP4CJifK73imyNMU8AIGQE2pUa7dNWfmMeG9cDVF2eehiRMv0LC1iAg==}
+ engines: {node: ^16.14.0 || >=18.0.0}
+ hasBin: true
+ dependencies:
+ env-paths: 2.2.1
+ exponential-backoff: 3.1.1
+ glob: 10.3.10
+ graceful-fs: 4.2.11
+ make-fetch-happen: 13.0.0
+ nopt: 7.2.0
+ proc-log: 3.0.0
+ semver: 7.5.4
+ tar: 6.1.15
+ which: 4.0.0
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
/node-gyp@8.4.1:
resolution: {integrity: sha512-olTJRgUtAb/hOXG0E93wZDs5YiJlgbXxTwQAFHyNlRsXQnYzUaF2aGgujZbw+hR8aF4ZG/rST57bWMWD16jr9w==}
engines: {node: '>= 10.12.0'}
@@ -18416,6 +19301,14 @@ packages:
abbrev: 1.1.1
dev: true
+ /nopt@7.2.0:
+ resolution: {integrity: sha512-CVDtwCdhYIvnAzFoJ6NJ6dX3oga9/HyciQDnG1vQDjSLMeKLJ4A93ZqYKDrgYSr1FBY5/hMYC+2VCi24pgpkGA==}
+ engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
+ hasBin: true
+ dependencies:
+ abbrev: 2.0.0
+ dev: true
+
/normalize-package-data@2.5.0:
resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==}
dependencies:
@@ -18445,6 +19338,16 @@ packages:
validate-npm-package-license: 3.0.4
dev: true
+ /normalize-package-data@6.0.0:
+ resolution: {integrity: sha512-UL7ELRVxYBHBgYEtZCXjxuD5vPxnmvMGq0jp/dGPKKrN7tfsBh2IY7TlJ15WWwdjRWD3RJbnsygUurTK3xkPkg==}
+ engines: {node: ^16.14.0 || >=18.0.0}
+ dependencies:
+ hosted-git-info: 7.0.1
+ is-core-module: 2.13.0
+ semver: 7.5.4
+ validate-npm-package-license: 3.0.4
+ dev: true
+
/normalize-path@3.0.0:
resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==}
engines: {node: '>=0.10.0'}
@@ -18493,6 +19396,16 @@ packages:
validate-npm-package-name: 5.0.0
dev: true
+ /npm-package-arg@11.0.1:
+ resolution: {integrity: sha512-M7s1BD4NxdAvBKUPqqRW957Xwcl/4Zvo8Aj+ANrzvIPzGJZElrH7Z//rSaec2ORcND6FHHLnZeY8qgTpXDMFQQ==}
+ engines: {node: ^16.14.0 || >=18.0.0}
+ dependencies:
+ hosted-git-info: 7.0.1
+ proc-log: 3.0.0
+ semver: 7.5.4
+ validate-npm-package-name: 5.0.0
+ dev: true
+
/npm-package-arg@8.1.1:
resolution: {integrity: sha512-CsP95FhWQDwNqiYS+Q0mZ7FAEDytDZAkNxQqea6IaAFJTAY9Lhhqyl0irU/6PMc7BGfUmnsbHcqxJD7XuVM/rg==}
engines: {node: '>=10'}
@@ -18513,8 +19426,15 @@ packages:
npm-normalize-package-bin: 1.0.1
dev: true
- /npm-packlist@7.0.4:
- resolution: {integrity: sha512-d6RGEuRrNS5/N84iglPivjaJPxhDbZmlbTwTDX2IbcRHG5bZCdtysYMhwiPvcF4GisXHGn7xsxv+GQ7T/02M5Q==}
+ /npm-packlist@7.0.4:
+ resolution: {integrity: sha512-d6RGEuRrNS5/N84iglPivjaJPxhDbZmlbTwTDX2IbcRHG5bZCdtysYMhwiPvcF4GisXHGn7xsxv+GQ7T/02M5Q==}
+ engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
+ dependencies:
+ ignore-walk: 6.0.3
+ dev: true
+
+ /npm-packlist@8.0.0:
+ resolution: {integrity: sha512-ErAGFB5kJUciPy1mmx/C2YFbvxoJ0QJ9uwkCZOeR6CqLLISPZBOiFModAbSXnjjlwW5lOhuhXva+fURsSGJqyw==}
engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
dependencies:
ignore-walk: 6.0.3
@@ -18530,6 +19450,16 @@ packages:
semver: 7.5.4
dev: true
+ /npm-pick-manifest@9.0.0:
+ resolution: {integrity: sha512-VfvRSs/b6n9ol4Qb+bDwNGUXutpy76x6MARw/XssevE0TnctIKcmklJZM5Z7nqs5z5aW+0S63pgCNbpkUNNXBg==}
+ engines: {node: ^16.14.0 || >=18.0.0}
+ dependencies:
+ npm-install-checks: 6.2.0
+ npm-normalize-package-bin: 3.0.1
+ npm-package-arg: 11.0.1
+ semver: 7.5.4
+ dev: true
+
/npm-registry-fetch@14.0.5:
resolution: {integrity: sha512-kIDMIo4aBm6xg7jOttupWZamsZRkAqMqwqqbVXnUqstY5+tapvv6bkH/qMR76jdgV+YljEUCyWx3hRYMrJiAgA==}
engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
@@ -18545,6 +19475,21 @@ packages:
- supports-color
dev: true
+ /npm-registry-fetch@16.1.0:
+ resolution: {integrity: sha512-PQCELXKt8Azvxnt5Y85GseQDJJlglTFM9L9U9gkv2y4e9s0k3GVDdOx3YoB6gm2Do0hlkzC39iCGXby+Wve1Bw==}
+ engines: {node: ^16.14.0 || >=18.0.0}
+ dependencies:
+ make-fetch-happen: 13.0.0
+ minipass: 7.0.3
+ minipass-fetch: 3.0.4
+ minipass-json-stream: 1.0.1
+ minizlib: 2.1.2
+ npm-package-arg: 11.0.1
+ proc-log: 3.0.0
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
/npm-run-all@4.1.5:
resolution: {integrity: sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ==}
engines: {node: '>= 4'}
@@ -18598,8 +19543,8 @@ packages:
boolbase: 1.0.0
dev: true
- /nuxi@3.6.5:
- resolution: {integrity: sha512-4XEXYz71UiWWiKC1/cJCzqRSUEImYRmjcvKpSsBKMU58ALYVSx5KIoas5SwLO8tEKO5BS4DAe4u7MYix7hfuHQ==}
+ /nuxi@3.9.1:
+ resolution: {integrity: sha512-4R4tcC2uQ5QCnHxyKoX5nZm/YUesCcQM3bZBKYU/8ZWrWjK6aPG6Q5zOQG1aLPkAotyahNsqtSiU/CrRoenEgA==}
engines: {node: ^14.18.0 || >=16.10.0}
hasBin: true
optionalDependencies:
@@ -18630,8 +19575,8 @@ packages:
- vite
dev: true
- /nuxt@3.6.5(@types/node@20.3.1)(eslint@8.33.0)(sass@1.63.4):
- resolution: {integrity: sha512-0A7V8B1HrIXX9IlqPc2w+5ZPXi+7MYa9QVhtuGYuLvjRKoSFANhCoMPRP6pKdoxigM1MBxhLue2VmHA/VbtJCw==}
+ /nuxt@3.8.1(eslint@8.33.0)(sass@1.63.4)(vite@4.4.9):
+ resolution: {integrity: sha512-RSGO56Gv0x2f6AXWw4o4GoBaVdsD0qkPCjrX7Ud/jzH3cRJoyYMPuq/9AOLvf2o1ecZWl39j5elqJ4QHmggyOA==}
engines: {node: ^14.18.0 || >=16.10.0}
hasBin: true
peerDependencies:
@@ -18640,60 +19585,64 @@ packages:
peerDependenciesMeta:
'@parcel/watcher':
optional: true
+ '@types/node':
+ optional: true
dependencies:
'@nuxt/devalue': 2.0.2
- '@nuxt/kit': 3.6.5
- '@nuxt/schema': 3.6.5
- '@nuxt/telemetry': 2.4.1
+ '@nuxt/devtools': 1.0.0(nuxt@3.8.1)(vite@4.4.9)
+ '@nuxt/kit': 3.8.1
+ '@nuxt/schema': 3.8.1
+ '@nuxt/telemetry': 2.5.2
'@nuxt/ui-templates': 1.3.1
- '@nuxt/vite-builder': 3.6.5(@types/node@20.3.1)(eslint@8.33.0)(sass@1.63.4)(vue@3.3.7)
- '@types/node': 20.3.1
- '@unhead/ssr': 1.3.9
- '@unhead/vue': 1.3.9(vue@3.3.7)
- '@vue/shared': 3.3.4
- acorn: 8.10.0
- c12: 1.4.2
+ '@nuxt/vite-builder': 3.8.1(eslint@8.33.0)(sass@1.63.4)(vue@3.3.8)
+ '@unhead/dom': 1.8.3
+ '@unhead/ssr': 1.8.3
+ '@unhead/vue': 1.8.3(vue@3.3.8)
+ '@vue/shared': 3.3.8
+ acorn: 8.11.2
+ c12: 1.5.1
chokidar: 3.5.3
cookie-es: 1.0.0
- defu: 6.1.2
- destr: 2.0.1
+ defu: 6.1.3
+ destr: 2.0.2
devalue: 4.3.2
- esbuild: 0.18.20
+ esbuild: 0.19.5
escape-string-regexp: 5.0.0
estree-walker: 3.0.3
fs-extra: 11.1.1
globby: 13.2.2
- h3: 1.8.1
+ h3: 1.8.2
hookable: 5.5.3
- jiti: 1.19.3
+ jiti: 1.21.0
klona: 2.0.6
knitwork: 1.0.0
- local-pkg: 0.4.3
- magic-string: 0.30.3
- mlly: 1.4.1
- nitropack: 2.6.2
- nuxi: 3.6.5
- nypm: 0.2.2
+ magic-string: 0.30.5
+ mlly: 1.4.2
+ nitropack: 2.7.2
+ nuxi: 3.9.1
+ nypm: 0.3.3
ofetch: 1.3.3
ohash: 1.1.3
pathe: 1.1.1
perfect-debounce: 1.0.0
- prompts: 2.4.2
+ pkg-types: 1.0.3
+ radix3: 1.1.0
scule: 1.0.0
+ std-env: 3.4.3
strip-literal: 1.3.0
- ufo: 1.3.0
- ultrahtml: 1.3.0
+ ufo: 1.3.1
+ ultrahtml: 1.5.2
uncrypto: 0.1.3
unctx: 2.3.1
unenv: 1.7.4
- unimport: 3.2.0(rollup@3.28.1)
- unplugin: 1.4.0
- unplugin-vue-router: 0.6.4(vue-router@4.2.4)(vue@3.3.7)
+ unimport: 3.4.0(rollup@3.29.4)
+ unplugin: 1.5.0
+ unplugin-vue-router: 0.7.0(vue-router@4.2.5)(vue@3.3.8)
untyped: 1.4.0
- vue: 3.3.7
- vue-bundle-renderer: 1.0.3
+ vue: 3.3.8
+ vue-bundle-renderer: 2.0.0
vue-devtools-stub: 0.1.0
- vue-router: 4.2.4(vue@3.3.7)
+ vue-router: 4.2.5(vue@3.3.8)
transitivePeerDependencies:
- '@azure/app-configuration'
- '@azure/cosmos'
@@ -18705,10 +19654,13 @@ packages:
- '@planetscale/database'
- '@upstash/redis'
- '@vercel/kv'
+ - bluebird
+ - bufferutil
- encoding
- eslint
- idb-keyval
- less
+ - lightningcss
- meow
- optionator
- rollup
@@ -18719,9 +19671,12 @@ packages:
- supports-color
- terser
- typescript
+ - utf-8-validate
+ - vite
- vls
- vti
- vue-tsc
+ - xml2js
dev: true
/nwsapi@2.2.7:
@@ -18791,11 +19746,15 @@ packages:
- debug
dev: true
- /nypm@0.2.2:
- resolution: {integrity: sha512-O7bumfWgUXlJefT1Y41SF4vsCvzeUYmnKABuOKStheCObzrkWPDmqJc+RJVU+57oFu9bITcrUq8sKFIHgjCnTg==}
+ /nypm@0.3.3:
+ resolution: {integrity: sha512-FHoxtTscAE723e80d2M9cJRb4YVjL82Ra+ZV+YqC6rfNZUWahi+ZhPF+krnR+bdMvibsfHCtgKXnZf5R6kmEPA==}
engines: {node: ^14.16.0 || >=16.10.0}
+ hasBin: true
dependencies:
- execa: 7.2.0
+ citty: 0.1.4
+ execa: 8.0.1
+ pathe: 1.1.1
+ ufo: 1.3.1
dev: true
/oauth-sign@0.9.0:
@@ -18886,9 +19845,9 @@ packages:
/ofetch@1.3.3:
resolution: {integrity: sha512-s1ZCMmQWXy4b5K/TW9i/DtiN8Ku+xCiHcjQ6/J/nDdssirrQNOoB165Zu8EqLMA2lln1JUth9a0aW9Ap2ctrUg==}
dependencies:
- destr: 2.0.1
+ destr: 2.0.2
node-fetch-native: 1.4.0
- ufo: 1.3.0
+ ufo: 1.3.1
dev: true
/ohash@1.1.3:
@@ -18952,8 +19911,18 @@ packages:
is-docker: 2.2.1
is-wsl: 2.2.0
- /openapi-typescript@6.5.3:
- resolution: {integrity: sha512-iVOgf1wf/6R73Cg9wcxMAD/P3+/TJ8HQruLyv3WRDu29Pwnmp7ZUJ897Kb401jW7Ao/L4JjisropHQJW62BXtA==}
+ /open@9.1.0:
+ resolution: {integrity: sha512-OS+QTnw1/4vrf+9hh1jc1jnYjzSG4ttTBB8UxOwAnInG3Uo4ssetzC1ihqaIHjLJnA5GGlRl6QlZXOTQhRBUvg==}
+ engines: {node: '>=14.16'}
+ dependencies:
+ default-browser: 4.0.0
+ define-lazy-prop: 3.0.0
+ is-inside-container: 1.0.0
+ is-wsl: 2.2.0
+ dev: true
+
+ /openapi-typescript@6.7.0:
+ resolution: {integrity: sha512-eoUfJwhnMEug7euZ1dATG7iRiDVsEROwdPkhLUDiaFjcClV4lzft9F0Ii0fYjULCPNIiWiFi0BqMpSxipuvAgQ==}
hasBin: true
dependencies:
ansi-colors: 4.1.3
@@ -19163,6 +20132,34 @@ packages:
- supports-color
dev: true
+ /pacote@17.0.4:
+ resolution: {integrity: sha512-eGdLHrV/g5b5MtD5cTPyss+JxOlaOloSMG3UwPMAvL8ywaLJ6beONPF40K4KKl/UI6q5hTKCJq5rCu8tkF+7Dg==}
+ engines: {node: ^16.14.0 || >=18.0.0}
+ hasBin: true
+ dependencies:
+ '@npmcli/git': 5.0.3
+ '@npmcli/installed-package-contents': 2.0.2
+ '@npmcli/promise-spawn': 7.0.0
+ '@npmcli/run-script': 7.0.2
+ cacache: 18.0.0
+ fs-minipass: 3.0.3
+ minipass: 7.0.3
+ npm-package-arg: 11.0.1
+ npm-packlist: 8.0.0
+ npm-pick-manifest: 9.0.0
+ npm-registry-fetch: 16.1.0
+ proc-log: 3.0.0
+ promise-retry: 2.0.1
+ read-package-json: 7.0.0
+ read-package-json-fast: 3.0.2
+ sigstore: 2.1.0
+ ssri: 10.0.5
+ tar: 6.1.15
+ transitivePeerDependencies:
+ - bluebird
+ - supports-color
+ dev: true
+
/papaparse@5.4.0:
resolution: {integrity: sha512-ZBQABWG09p+u8rFoJVl/GhgxZ5zy9Zh1Lu/LVc7VX5T4nljjC14/YTcpebYwqP218B9X307eBOP7Tuhoqv7v7w==}
dev: false
@@ -19520,7 +20517,7 @@ packages:
engines: {node: '>=10'}
dev: true
- /pinia@2.1.4(vue@3.3.7):
+ /pinia@2.1.4(vue@3.3.8):
resolution: {integrity: sha512-vYlnDu+Y/FXxv1ABo1vhjC+IbqvzUdiUC3sfDRrRyY2CQSrqqaa+iiHmqtARFxJVqWQMCJfXx1PBvFs9aJVLXQ==}
peerDependencies:
'@vue/composition-api': ^1.4.0
@@ -19533,8 +20530,8 @@ packages:
optional: true
dependencies:
'@vue/devtools-api': 6.5.0
- vue: 3.3.7
- vue-demi: 0.14.5(vue@3.3.7)
+ vue: 3.3.8
+ vue-demi: 0.14.5(vue@3.3.8)
dev: false
/pinkie-promise@1.0.0:
@@ -19565,7 +20562,7 @@ packages:
resolution: {integrity: sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==}
dependencies:
jsonc-parser: 3.2.0
- mlly: 1.4.1
+ mlly: 1.4.2
pathe: 1.1.1
/playwright-core@1.38.0:
@@ -19680,18 +20677,6 @@ packages:
dependencies:
enhanced-resolve: 4.5.0
- /postcss-import@15.1.0(postcss@8.4.31):
- resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==}
- engines: {node: '>=14.0.0'}
- peerDependencies:
- postcss: ^8.0.0
- dependencies:
- postcss: 8.4.31
- postcss-value-parser: 4.2.0
- read-cache: 1.0.0
- resolve: 1.22.4
- dev: true
-
/postcss-merge-longhand@6.0.0(postcss@8.4.31):
resolution: {integrity: sha512-4VSfd1lvGkLTLYcxFuISDtWUfFS4zXe0FpF149AyziftPFQIWxjvFSKhA4MIxMe4XM3yTDgQMbSNgzIVxChbIg==}
engines: {node: ^14 || ^16 || >=18.0}
@@ -19911,19 +20896,6 @@ packages:
postcss-selector-parser: 6.0.13
dev: true
- /postcss-url@10.1.3(postcss@8.4.31):
- resolution: {integrity: sha512-FUzyxfI5l2tKmXdYc6VTu3TWZsInayEKPbiyW+P6vmmIrrb4I6CGX0BFoewgYHLK+oIL5FECEK02REYRpBvUCw==}
- engines: {node: '>=10'}
- peerDependencies:
- postcss: ^8.0.0
- dependencies:
- make-dir: 3.1.0
- mime: 2.5.2
- minimatch: 3.0.8
- postcss: 8.4.31
- xxhashjs: 0.2.2
- dev: true
-
/postcss-value-parser@4.2.0:
resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==}
dev: true
@@ -20231,7 +21203,6 @@ packages:
resolution: {integrity: sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==}
requiresBuild: true
dev: true
- optional: true
/quick-lru@4.0.1:
resolution: {integrity: sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==}
@@ -20330,6 +21301,16 @@ packages:
npm-normalize-package-bin: 3.0.1
dev: true
+ /read-package-json@7.0.0:
+ resolution: {integrity: sha512-uL4Z10OKV4p6vbdvIXB+OzhInYtIozl/VxUBPgNkBuUi2DeRonnuspmaVAMcrkmfjKGNmRndyQAbE7/AmzGwFg==}
+ engines: {node: ^16.14.0 || >=18.0.0}
+ dependencies:
+ glob: 10.3.3
+ json-parse-even-better-errors: 3.0.0
+ normalize-package-data: 6.0.0
+ npm-normalize-package-bin: 3.0.1
+ dev: true
+
/read-pkg-up@3.0.0:
resolution: {integrity: sha512-YFzFrVvpC6frF1sz8psoHDBGF7fLPc+llq/8NB43oagqWkx8ar5zYtsTORtOjw9W2RHLpWP+zTWwBvf1bCmcSw==}
engines: {node: '>=4'}
@@ -20741,7 +21722,7 @@ packages:
- supports-color
dev: true
- /rollup-plugin-visualizer@5.9.2(rollup@3.28.1):
+ /rollup-plugin-visualizer@5.9.2(rollup@3.29.4):
resolution: {integrity: sha512-waHktD5mlWrYFrhOLbti4YgQCn1uR24nYsNuXxg7LkPH8KdTXVWR9DNY1WU0QqokyMixVXJS4J04HNrVTMP01A==}
engines: {node: '>=14'}
hasBin: true
@@ -20753,7 +21734,7 @@ packages:
dependencies:
open: 8.4.2
picomatch: 2.3.1
- rollup: 3.28.1
+ rollup: 3.29.4
source-map: 0.7.4
yargs: 17.7.2
dev: true
@@ -20770,6 +21751,14 @@ packages:
hasBin: true
optionalDependencies:
fsevents: 2.3.3
+ dev: true
+
+ /rollup@3.29.4:
+ resolution: {integrity: sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw==}
+ engines: {node: '>=14.18.0', npm: '>=8.0.0'}
+ hasBin: true
+ optionalDependencies:
+ fsevents: 2.3.3
/rootpath@0.1.2:
resolution: {integrity: sha512-R3wLbuAYejpxQjL/SjXo1Cjv4wcJECnMRT/FlcCfTwCBhaji9rWaRCoVEQ1SPiTJ4kKK+yh+bZLAV7SCafoDDw==}
@@ -20786,6 +21775,13 @@ packages:
sdp: 2.12.0
dev: false
+ /run-applescript@5.0.0:
+ resolution: {integrity: sha512-XcT5rBksx1QdIhlFOCtgZkB99ZEouFZ1E2Kc2LHqNW13U3/74YGdkQRmThTwxy4QIyookibDKYZOPqX//6BlAg==}
+ engines: {node: '>=12'}
+ dependencies:
+ execa: 5.1.1
+ dev: true
+
/run-async@2.4.1:
resolution: {integrity: sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==}
engines: {node: '>=0.12.0'}
@@ -20971,7 +21967,7 @@ packages:
/serve-placeholder@2.0.1:
resolution: {integrity: sha512-rUzLlXk4uPFnbEaIz3SW8VISTxMuONas88nYWjAWaM2W9VDbt9tyFOr3lq8RhVOFrT3XISoBw8vni5una8qMnQ==}
dependencies:
- defu: 6.1.2
+ defu: 6.1.3
dev: true
/serve-static@1.15.0:
@@ -21096,6 +22092,18 @@ packages:
- supports-color
dev: true
+ /sigstore@2.1.0:
+ resolution: {integrity: sha512-kPIj+ZLkyI3QaM0qX8V/nSsweYND3W448pwkDgS6CQ74MfhEkIR8ToK5Iyx46KJYRjseVcD3Rp9zAmUAj6ZjPw==}
+ engines: {node: ^16.14.0 || >=18.0.0}
+ dependencies:
+ '@sigstore/bundle': 2.1.0
+ '@sigstore/protobuf-specs': 0.2.1
+ '@sigstore/sign': 2.2.0
+ '@sigstore/tuf': 2.2.0
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
/simple-concat@1.0.1:
resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==}
requiresBuild: true
@@ -21112,6 +22120,16 @@ packages:
dev: true
optional: true
+ /simple-git@3.20.0:
+ resolution: {integrity: sha512-ozK8tl2hvLts8ijTs18iFruE+RoqmC/mqZhjs/+V7gS5W68JpJ3+FCTmLVqmR59MaUQ52MfGQuWsIqfsTbbJ0Q==}
+ dependencies:
+ '@kwsites/file-exists': 1.1.1
+ '@kwsites/promise-deferred': 1.1.1
+ debug: 4.3.4(supports-color@8.1.1)
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
/simple-lru-cache@0.0.2:
resolution: {integrity: sha512-uEv/AFO0ADI7d99OHDmh1QfYzQk/izT1vCmu/riQfh7qjBVUUgRT87E5s5h7CxWCA/+YoZerykpEthzVrW3LIw==}
dev: false
@@ -21343,6 +22361,17 @@ packages:
- supports-color
dev: true
+ /socks-proxy-agent@8.0.2:
+ resolution: {integrity: sha512-8zuqoLv1aP/66PHF5TqwJ7Czm3Yv32urJQHrVyhD7mmA6d61Zv8cIXQYPTWwmg6qlupnPvs/QKDmfa4P/qct2g==}
+ engines: {node: '>= 14'}
+ dependencies:
+ agent-base: 7.1.0
+ debug: 4.3.4(supports-color@8.1.1)
+ socks: 2.7.1
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
/socks@2.7.1:
resolution: {integrity: sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==}
engines: {node: '>= 10.13.0', npm: '>= 3.0.0'}
@@ -21604,7 +22633,6 @@ packages:
fast-fifo: 1.3.2
queue-tick: 1.0.1
dev: true
- optional: true
/string-argv@0.3.2:
resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==}
@@ -21972,7 +23000,6 @@ packages:
fast-fifo: 1.3.2
streamx: 2.15.1
dev: true
- optional: true
/tar@6.1.11:
resolution: {integrity: sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==}
@@ -21997,6 +23024,18 @@ packages:
mkdirp: 1.0.4
yallist: 4.0.0
+ /tar@6.2.0:
+ resolution: {integrity: sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ==}
+ engines: {node: '>=10'}
+ dependencies:
+ chownr: 2.0.0
+ fs-minipass: 2.1.0
+ minipass: 5.0.0
+ minizlib: 2.1.2
+ mkdirp: 1.0.4
+ yallist: 4.0.0
+ dev: true
+
/tarn@3.0.2:
resolution: {integrity: sha512-51LAVKUSZSVfI05vjPESNc5vwqqZpbXCsU+/+wxlOrUjk2SnFTt97v9ZgQrD4YmxYW1Px6w2KjaDitCfkvgxMQ==}
engines: {node: '>=8.0.0'}
@@ -22246,6 +23285,11 @@ packages:
'@popperjs/core': 2.11.8
dev: false
+ /titleize@3.0.0:
+ resolution: {integrity: sha512-KxVu8EYHDPBdUYdKZdKtU2aj2XfEx9AfjXxE/Aj0vT06w2icA09Vus1rh6eSu1y01akYg6BjIK/hxyLJINoMLQ==}
+ engines: {node: '>=12'}
+ dev: true
+
/tmp@0.0.33:
resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==}
engines: {node: '>=0.6.0'}
@@ -22559,6 +23603,17 @@ packages:
- supports-color
dev: true
+ /tuf-js@2.1.0:
+ resolution: {integrity: sha512-eD7YPPjVlMzdggrOeE8zwoegUaG/rt6Bt3jwoQPunRiNVzgcCE009UDFJKJjG+Gk9wFu6W/Vi+P5d/5QpdD9jA==}
+ engines: {node: ^16.14.0 || >=18.0.0}
+ dependencies:
+ '@tufjs/models': 2.0.0
+ debug: 4.3.4(supports-color@8.1.1)
+ make-fetch-happen: 13.0.0
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
/tunnel-agent@0.6.0:
resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==}
dependencies:
@@ -22701,6 +23756,9 @@ packages:
/ufo@1.3.0:
resolution: {integrity: sha512-bRn3CsoojyNStCZe0BG0Mt4Nr/4KF+rhFlnNXybgqt5pXHNFRlqinSoQaTrGyzE4X8aHplSb+TorH+COin9Yxw==}
+ /ufo@1.3.1:
+ resolution: {integrity: sha512-uY/99gMLIOlJPwATcMVYfqDSxUR9//AUcgZMzwfSTJPDKzA1S8mX4VLqa+fiAtveraQUBCz4FFcwVZBGbwBXIw==}
+
/uglify-js@3.17.4:
resolution: {integrity: sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==}
engines: {node: '>=0.8.0'}
@@ -22718,8 +23776,8 @@ packages:
dependencies:
'@lukeed/csprng': 1.1.0
- /ultrahtml@1.3.0:
- resolution: {integrity: sha512-xmXvE8tC8t4PVqy0/g1fe7H9USY/Brr425q4dD/0QbQMQit7siCtb06+SCqE4GfU24nwsZz8Th1g7L7mm1lL5g==}
+ /ultrahtml@1.5.2:
+ resolution: {integrity: sha512-qh4mBffhlkiXwDAOxvSGxhL0QEQsTbnP9BozOK3OYPEGvPvdWzvAUaXNtUSMdNsKDtuyjEbyVUPFZ52SSLhLqw==}
dev: true
/unbox-primitive@1.0.2:
@@ -22751,10 +23809,10 @@ packages:
/unctx@2.3.1:
resolution: {integrity: sha512-PhKke8ZYauiqh3FEMVNm7ljvzQiph0Mt3GBRve03IJm7ukfaON2OBK795tLwhbyfzknuRRkW0+Ze+CQUmzOZ+A==}
dependencies:
- acorn: 8.10.0
+ acorn: 8.11.2
estree-walker: 3.0.3
magic-string: 0.30.5
- unplugin: 1.4.0
+ unplugin: 1.5.0
/undefsafe@2.0.5:
resolution: {integrity: sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==}
@@ -22771,7 +23829,7 @@ packages:
resolution: {integrity: sha512-fjYsXYi30It0YCQYqLOcT6fHfMXsBr2hw9XC7ycf8rTG7Xxpe3ZssiqUnD0khrjiZEmkBXWLwm42yCSCH46fMw==}
dependencies:
consola: 3.2.3
- defu: 6.1.2
+ defu: 6.1.3
mime: 3.0.0
node-fetch-native: 1.4.0
pathe: 1.1.1
@@ -22788,19 +23846,19 @@ packages:
resolution: {integrity: sha512-F9p7yYCn6cIW9El1zi0HI6vqpeIvBsr3dSuRO6Xuppb1u5rXpCPmMvLSyECLhybr9isec8Ohl0hPekMVrEinDA==}
dev: false
- /unhead@1.3.9:
- resolution: {integrity: sha512-vzWZJW8l6dlNM5egJs3c7NMHWZ+iw2x7jCZtU2rrhwFINlKCaA3J42fvOeDxx6t5QR9dfZ96HF2AeNlCcPT+bQ==}
+ /unhead@1.8.3:
+ resolution: {integrity: sha512-2/5NJs7nY1MgCkUNuyevALM9nSgGp2loRv5QPhYyZXUPdF+F76CpKvkqATEOEJ/1yDzWjCaWrNh4u5lS6BEioA==}
dependencies:
- '@unhead/dom': 1.3.9
- '@unhead/schema': 1.3.9
- '@unhead/shared': 1.3.9
+ '@unhead/dom': 1.8.3
+ '@unhead/schema': 1.8.3
+ '@unhead/shared': 1.8.3
hookable: 5.5.3
dev: true
- /unimport@3.2.0(rollup@3.28.1):
+ /unimport@3.2.0:
resolution: {integrity: sha512-9buxPxkNwxwxAlH/RfOFHxtQTUrlmBGi9Ai9HezY2yYbkoOhgJTYPI6+WqxI1EZphoM9cw1SHoCFRkXSb8/fjQ==}
dependencies:
- '@rollup/pluginutils': 5.0.4(rollup@3.28.1)
+ '@rollup/pluginutils': 5.0.4(rollup@3.29.4)
escape-string-regexp: 5.0.0
fast-glob: 3.3.1
local-pkg: 0.4.3
@@ -22814,6 +23872,24 @@ packages:
transitivePeerDependencies:
- rollup
+ /unimport@3.4.0(rollup@3.29.4):
+ resolution: {integrity: sha512-M/lfFEgufIT156QAr/jWHLUn55kEmxBBiQsMxvRSIbquwmeJEyQYgshHDEvQDWlSJrVOOTAgnJ3FvlsrpGkanA==}
+ dependencies:
+ '@rollup/pluginutils': 5.0.4(rollup@3.29.4)
+ escape-string-regexp: 5.0.0
+ fast-glob: 3.3.1
+ local-pkg: 0.4.3
+ magic-string: 0.30.5
+ mlly: 1.4.2
+ pathe: 1.1.1
+ pkg-types: 1.0.3
+ scule: 1.0.0
+ strip-literal: 1.3.0
+ unplugin: 1.5.0
+ transitivePeerDependencies:
+ - rollup
+ dev: true
+
/unique-filename@1.1.1:
resolution: {integrity: sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==}
requiresBuild: true
@@ -22953,7 +24029,7 @@ packages:
- supports-color
dev: true
- /unplugin-vue-components@0.22.12(vue@3.3.7):
+ /unplugin-vue-components@0.22.12(vue@3.3.8):
resolution: {integrity: sha512-FxyzsuBvMCYPIk+8cgscGBQ345tvwVu+qY5IhE++eorkyvA4Z1TiD/HCiim+Kbqozl10i4K+z+NCa2WO2jexRA==}
engines: {node: '>=14'}
peerDependencies:
@@ -22964,7 +24040,7 @@ packages:
optional: true
dependencies:
'@antfu/utils': 0.7.6
- '@rollup/pluginutils': 5.0.4(rollup@3.28.1)
+ '@rollup/pluginutils': 5.0.4(rollup@3.29.4)
chokidar: 3.5.3
debug: 4.3.4(supports-color@8.1.1)
fast-glob: 3.3.1
@@ -22973,34 +24049,34 @@ packages:
minimatch: 5.1.6
resolve: 1.22.4
unplugin: 1.4.0
- vue: 3.3.7
+ vue: 3.3.8
transitivePeerDependencies:
- rollup
- supports-color
dev: true
- /unplugin-vue-router@0.6.4(vue-router@4.2.4)(vue@3.3.7):
- resolution: {integrity: sha512-9THVhhtbVFxbsIibjK59oPwMI1UCxRWRPX7azSkTUABsxovlOXJys5SJx0kd/0oKIqNJuYgkRfAgPuO77SqCOg==}
+ /unplugin-vue-router@0.7.0(vue-router@4.2.5)(vue@3.3.8):
+ resolution: {integrity: sha512-ddRreGq0t5vlSB7OMy4e4cfU1w2AwBQCwmvW3oP/0IHQiokzbx4hd3TpwBu3eIAFVuhX2cwNQwp1U32UybTVCw==}
peerDependencies:
vue-router: ^4.1.0
peerDependenciesMeta:
vue-router:
optional: true
dependencies:
- '@babel/types': 7.22.11
- '@rollup/pluginutils': 5.0.4(rollup@3.28.1)
- '@vue-macros/common': 1.7.2(vue@3.3.7)
- ast-walker-scope: 0.4.2
+ '@babel/types': 7.23.0
+ '@rollup/pluginutils': 5.0.4(rollup@3.29.4)
+ '@vue-macros/common': 1.8.0(vue@3.3.8)
+ ast-walker-scope: 0.5.0
chokidar: 3.5.3
fast-glob: 3.3.1
json5: 2.2.3
local-pkg: 0.4.3
- mlly: 1.4.1
+ mlly: 1.4.2
pathe: 1.1.1
scule: 1.0.0
- unplugin: 1.4.0
- vue-router: 4.2.4(vue@3.3.7)
- yaml: 2.3.1
+ unplugin: 1.5.0
+ vue-router: 4.2.5(vue@3.3.8)
+ yaml: 2.3.4
transitivePeerDependencies:
- rollup
- vue
@@ -23014,6 +24090,14 @@ packages:
webpack-sources: 3.2.3
webpack-virtual-modules: 0.5.0
+ /unplugin@1.5.0:
+ resolution: {integrity: sha512-9ZdRwbh/4gcm1JTOkp9lAkIDrtOyOxgHmY7cjuwI8L/2RTikMcVG25GsZwNAgRuap3iDw2jeq7eoqtAsz5rW3A==}
+ dependencies:
+ acorn: 8.11.2
+ chokidar: 3.5.3
+ webpack-sources: 3.2.3
+ webpack-virtual-modules: 0.5.0
+
/unstorage@1.9.0:
resolution: {integrity: sha512-VpD8ZEYc/le8DZCrny3bnqKE4ZjioQxBRnWE+j5sGNvziPjeDlaS1NaFFHzl/kkXaO3r7UaF8MGQrs14+1B4pQ==}
peerDependencies:
@@ -23054,19 +24138,24 @@ packages:
dependencies:
anymatch: 3.1.3
chokidar: 3.5.3
- destr: 2.0.1
- h3: 1.8.1
+ destr: 2.0.2
+ h3: 1.8.2
ioredis: 5.3.2
- listhen: 1.4.3
+ listhen: 1.5.5
lru-cache: 10.0.1
mri: 1.2.0
- node-fetch-native: 1.4.0
+ node-fetch-native: 1.4.1
ofetch: 1.3.3
- ufo: 1.3.0
+ ufo: 1.3.1
transitivePeerDependencies:
- supports-color
dev: true
+ /untildify@4.0.0:
+ resolution: {integrity: sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==}
+ engines: {node: '>=8'}
+ dev: true
+
/untun@0.1.2:
resolution: {integrity: sha512-wLAMWvxfqyTiBODA1lg3IXHQtjggYLeTK7RnSfqtOXixWJ3bAa2kK/HHmOOg19upteqO3muLvN6O/icbyQY33Q==}
hasBin: true
@@ -23084,8 +24173,8 @@ packages:
'@babel/core': 7.22.11
'@babel/standalone': 7.22.12
'@babel/types': 7.22.11
- defu: 6.1.2
- jiti: 1.19.3
+ defu: 6.1.3
+ jiti: 1.21.0
mri: 1.2.0
scule: 1.0.0
transitivePeerDependencies:
@@ -23297,20 +24386,21 @@ packages:
- terser
dev: true
- /vite-node@0.33.0(@types/node@20.3.1)(sass@1.63.4):
+ /vite-node@0.33.0(sass@1.63.4):
resolution: {integrity: sha512-19FpHYbwWWxDr73ruNahC+vtEdza52kA90Qb3La98yZ0xULqV8A5JLNPUff0f5zID4984tW7l3DH2przTJUZSw==}
engines: {node: '>=v14.18.0'}
hasBin: true
dependencies:
cac: 6.7.14
debug: 4.3.4(supports-color@8.1.1)
- mlly: 1.4.1
+ mlly: 1.4.2
pathe: 1.1.1
picocolors: 1.0.0
- vite: 4.3.9(@types/node@20.3.1)(sass@1.63.4)
+ vite: 4.5.0(sass@1.63.4)
transitivePeerDependencies:
- '@types/node'
- less
+ - lightningcss
- sass
- stylus
- sugarss
@@ -23318,7 +24408,7 @@ packages:
- terser
dev: true
- /vite-plugin-checker@0.6.2(eslint@8.33.0)(vite@4.3.9):
+ /vite-plugin-checker@0.6.2(eslint@8.33.0)(vite@4.5.0):
resolution: {integrity: sha512-YvvvQ+IjY09BX7Ab+1pjxkELQsBd4rPhWNw8WLBeFVxu/E7O+n6VYAqNsKdK/a2luFlX/sMpoWdGFfg4HvwdJQ==}
engines: {node: '>=14.16'}
peerDependencies:
@@ -23363,13 +24453,38 @@ packages:
semver: 7.5.4
strip-ansi: 6.0.1
tiny-invariant: 1.3.1
- vite: 4.3.9(@types/node@20.3.1)(sass@1.63.4)
+ vite: 4.5.0(sass@1.63.4)
vscode-languageclient: 7.0.0
vscode-languageserver: 7.0.0
vscode-languageserver-textdocument: 1.0.8
vscode-uri: 3.0.7
dev: true
+ /vite-plugin-inspect@0.7.41(@nuxt/kit@3.8.1)(vite@4.4.9):
+ resolution: {integrity: sha512-gASdFRO4CHDQF8qAk9LZEJyzlIJM4bFvDn7hz0e2r1PS6uq+yukd8+jHctOAbvCceQoTS5iDAgd4/mWcGWYoMw==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@nuxt/kit': '*'
+ vite: ^3.1.0 || ^4.0.0 || ^5.0.0-0
+ peerDependenciesMeta:
+ '@nuxt/kit':
+ optional: true
+ dependencies:
+ '@antfu/utils': 0.7.6
+ '@nuxt/kit': 3.8.1
+ '@rollup/pluginutils': 5.0.5(rollup@3.29.4)
+ debug: 4.3.4(supports-color@8.1.1)
+ error-stack-parser-es: 0.1.1
+ fs-extra: 11.1.1
+ open: 9.1.0
+ picocolors: 1.0.0
+ sirv: 2.0.3
+ vite: 4.4.9(@types/node@20.3.1)(sass@1.63.4)
+ transitivePeerDependencies:
+ - rollup
+ - supports-color
+ dev: true
+
/vite-plugin-monaco-editor@1.1.0(monaco-editor@0.33.0):
resolution: {integrity: sha512-IvtUqZotrRoVqwT0PBBDIZPNraya3BxN/bfcNfnxZ5rkJiGcNtO5eAOWWSgT7zullIAEqQwxMU83yL9J5k7gww==}
peerDependencies:
@@ -23393,6 +24508,25 @@ packages:
- supports-color
dev: true
+ /vite-plugin-vue-inspector@4.0.0(vite@4.4.9):
+ resolution: {integrity: sha512-xNjMbRj3YrebuuInTvlC8ghPtzT+3LjMIQPeeR/5CaFd+WcbA9wBnECZmlcP3GITCVED0SxGmTyoJ3iVKsK4vQ==}
+ peerDependencies:
+ vite: ^3.0.0-0 || ^4.0.0-0
+ dependencies:
+ '@babel/core': 7.23.2
+ '@babel/plugin-proposal-decorators': 7.23.2(@babel/core@7.23.2)
+ '@babel/plugin-syntax-import-attributes': 7.22.5(@babel/core@7.23.2)
+ '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.23.2)
+ '@babel/plugin-transform-typescript': 7.22.15(@babel/core@7.23.2)
+ '@vue/babel-plugin-jsx': 1.1.5(@babel/core@7.23.2)
+ '@vue/compiler-dom': 3.3.7
+ kolorist: 1.8.0
+ magic-string: 0.30.5
+ vite: 4.4.9(@types/node@20.3.1)(sass@1.63.4)
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
/vite-plugin-windicss@1.9.1(vite@4.4.9):
resolution: {integrity: sha512-CWm1b/tXVCJTbEGn4oB8B7Gev9xDuY9k4E/KiJqDuLYspBUFQyZKPF2mSZ3DfNdojsfqgzxu9ervqvlb9jJ7fw==}
peerDependencies:
@@ -23407,13 +24541,14 @@ packages:
- supports-color
dev: true
- /vite@4.3.9(@types/node@20.3.1)(sass@1.63.4):
- resolution: {integrity: sha512-qsTNZjO9NoJNW7KnOrgYwczm0WctJ8m/yqYAMAK9Lxt4SoySUfS5S8ia9K7JHpa3KEeMfyF8LoJ3c5NeBJy6pg==}
+ /vite@4.4.9(@types/node@20.3.1)(sass@1.63.4):
+ resolution: {integrity: sha512-2mbUn2LlUmNASWwSCNSJ/EG2HuSRTnVNaydp6vMCm5VIqJsjMfbIWtbH2kDuwUVW5mMUKKZvGPX/rqeqVvv1XA==}
engines: {node: ^14.18.0 || >=16.0.0}
hasBin: true
peerDependencies:
'@types/node': '>= 14'
less: '*'
+ lightningcss: ^1.21.0
sass: '*'
stylus: '*'
sugarss: '*'
@@ -23423,6 +24558,8 @@ packages:
optional: true
less:
optional: true
+ lightningcss:
+ optional: true
sass:
optional: true
stylus:
@@ -23433,7 +24570,7 @@ packages:
optional: true
dependencies:
'@types/node': 20.3.1
- esbuild: 0.17.19
+ esbuild: 0.18.20
postcss: 8.4.31
rollup: 3.28.1
sass: 1.63.4
@@ -23441,8 +24578,8 @@ packages:
fsevents: 2.3.3
dev: true
- /vite@4.4.9(@types/node@20.3.1)(sass@1.63.4):
- resolution: {integrity: sha512-2mbUn2LlUmNASWwSCNSJ/EG2HuSRTnVNaydp6vMCm5VIqJsjMfbIWtbH2kDuwUVW5mMUKKZvGPX/rqeqVvv1XA==}
+ /vite@4.5.0(sass@1.63.4):
+ resolution: {integrity: sha512-ulr8rNLA6rkyFAlVWw2q5YJ91v098AFQ2R0PRFwPzREXOUJQPtFUG0t+/ZikhaOCDqFoDhN6/v8Sq0o4araFAw==}
engines: {node: ^14.18.0 || >=16.0.0}
hasBin: true
peerDependencies:
@@ -23469,7 +24606,6 @@ packages:
terser:
optional: true
dependencies:
- '@types/node': 20.3.1
esbuild: 0.18.20
postcss: 8.4.31
rollup: 3.28.1
@@ -23611,23 +24747,23 @@ packages:
'@zxing/library': 0.19.3
dev: false
- /vue-bundle-renderer@1.0.3:
- resolution: {integrity: sha512-EfjX+5TTUl70bki9hPuVp+54JiZOvFIfoWBcfXsSwLzKEiDYyHNi5iX8srnqLIv3YRnvxgbntdcG1WPq0MvffQ==}
+ /vue-bundle-renderer@2.0.0:
+ resolution: {integrity: sha512-oYATTQyh8XVkUWe2kaKxhxKVuuzK2Qcehe+yr3bGiaQAhK3ry2kYE4FWOfL+KO3hVFwCdLmzDQTzYhTi9C+R2A==}
dependencies:
- ufo: 1.3.0
+ ufo: 1.3.1
dev: true
- /vue-chartjs@5.2.0(chart.js@4.3.0)(vue@3.3.7):
+ /vue-chartjs@5.2.0(chart.js@4.3.0)(vue@3.3.8):
resolution: {integrity: sha512-d3zpKmGZr2OWHQ1xmxBcAn5ShTG917+/UCLaSpaCDDqT0U7DBsvFzTs69ZnHCgKoXT55GZDW8YEj9Av+dlONLA==}
peerDependencies:
chart.js: ^4.1.1
vue: latest
dependencies:
chart.js: 4.3.0
- vue: 3.3.7
+ vue: 3.3.8
dev: false
- /vue-demi@0.13.11(vue@3.3.7):
+ /vue-demi@0.13.11(vue@3.3.8):
resolution: {integrity: sha512-IR8HoEEGM65YY3ZJYAjMlKygDQn25D5ajNFNoKh9RSDMQtlzCxtfQjdQgv9jjK+m3377SsJXY8ysq8kLCZL25A==}
engines: {node: '>=12'}
hasBin: true
@@ -23639,10 +24775,10 @@ packages:
'@vue/composition-api':
optional: true
dependencies:
- vue: 3.3.7
+ vue: 3.3.8
dev: false
- /vue-demi@0.14.5(vue@3.3.7):
+ /vue-demi@0.14.5(vue@3.3.8):
resolution: {integrity: sha512-o9NUVpl/YlsGJ7t+xuqJKx8EBGf1quRhCiT6D/J0pfwmk9zUwYkC7yrF4SZCe6fETvSM3UNL2edcbYrSyc4QHA==}
engines: {node: '>=12'}
hasBin: true
@@ -23654,9 +24790,9 @@ packages:
'@vue/composition-api':
optional: true
dependencies:
- vue: 3.3.7
+ vue: 3.3.8
- /vue-demi@0.14.6(vue@3.3.7):
+ /vue-demi@0.14.6(vue@3.3.8):
resolution: {integrity: sha512-8QA7wrYSHKaYgUxDA5ZC24w+eHm3sYCbp0EzcDwKqN3p6HqtTCGR/GVsPyZW92unff4UlcSh++lmqDWN3ZIq4w==}
engines: {node: '>=12'}
hasBin: true
@@ -23668,19 +24804,19 @@ packages:
'@vue/composition-api':
optional: true
dependencies:
- vue: 3.3.7
+ vue: 3.3.8
/vue-devtools-stub@0.1.0:
resolution: {integrity: sha512-RutnB7X8c5hjq39NceArgXg28WZtZpGc3+J16ljMiYnFhKvd8hITxSWQSQ5bvldxMDU6gG5mkxl1MTQLXckVSQ==}
dev: true
- /vue-dompurify-html@3.0.0(vue@3.3.7):
+ /vue-dompurify-html@3.0.0(vue@3.3.8):
resolution: {integrity: sha512-S6PMeJU7S3w0TnxMWWd4iydc7oPdOER1GmW9rsgiRwHvcw+nUi2v6BgERcFBULlM+x6PXsfu5P/Rm4reVvWH5A==}
peerDependencies:
vue: latest
dependencies:
dompurify: 2.4.7
- vue: 3.3.7
+ vue: 3.3.8
dev: false
/vue-eslint-parser@9.3.1(eslint@8.33.0):
@@ -23707,7 +24843,7 @@ packages:
github-buttons: 2.27.0
dev: false
- /vue-i18n@9.2.2(vue@3.3.7):
+ /vue-i18n@9.2.2(vue@3.3.8):
resolution: {integrity: sha512-yswpwtj89rTBhegUAv9Mu37LNznyu3NpyLQmozF3i1hYOhwpG8RjcjIFIIfnu+2MDZJGSZPXaKWvnQA71Yv9TQ==}
engines: {node: '>= 14'}
peerDependencies:
@@ -23717,48 +24853,48 @@ packages:
'@intlify/shared': 9.2.2
'@intlify/vue-devtools': 9.2.2
'@vue/devtools-api': 6.5.0
- vue: 3.3.7
+ vue: 3.3.8
/vue-qrcode-reader@3.1.0-vue3-compatibility.2:
resolution: {integrity: sha512-tGu2zmPGSi9SJR08Yl2favix0vs5SgXudGXdwW2KxcvlU9jfsX9FAYkuaifyiq3CgxKijwRxA/YJpS0Yl9PMfw==}
dependencies:
- '@vue/compat': 3.3.4(vue@3.3.7)
+ '@vue/compat': 3.3.4(vue@3.3.8)
barcode-detector: 1.0.4
callforth: 0.3.1
core-js: 3.32.1
- vue: 3.3.7
+ vue: 3.3.8
webrtc-adapter: 7.7.0
transitivePeerDependencies:
- typescript
dev: false
- /vue-router@4.2.4(vue@3.3.7):
- resolution: {integrity: sha512-9PISkmaCO02OzPVOMq2w82ilty6+xJmQrarYZDkjZBfl4RvYAlt4PKnEX21oW4KTtWfa9OuO/b3qk1Od3AEdCQ==}
+ /vue-router@4.2.5(vue@3.3.8):
+ resolution: {integrity: sha512-DIUpKcyg4+PTQKfFPX88UWhlagBEBEfJ5A8XDXRJLUnZOvcpMF8o/dnL90vpVkGaPbjvXazV/rC1qBKrZlFugw==}
peerDependencies:
vue: latest
dependencies:
'@vue/devtools-api': 6.5.0
- vue: 3.3.7
+ vue: 3.3.8
dev: true
- /vue-types@3.0.2(vue@3.3.7):
+ /vue-types@3.0.2(vue@3.3.8):
resolution: {integrity: sha512-IwUC0Aq2zwaXqy74h4WCvFCUtoV0iSWr0snWnE9TnU18S66GAQyqQbRf2qfJtUuiFsBf6qp0MEwdonlwznlcrw==}
engines: {node: '>=10.15.0'}
peerDependencies:
vue: latest
dependencies:
is-plain-object: 3.0.1
- vue: 3.3.7
+ vue: 3.3.8
dev: false
- /vue3-calendar-heatmap@2.0.0(vue@3.3.7):
+ /vue3-calendar-heatmap@2.0.0(vue@3.3.8):
resolution: {integrity: sha512-BchyC33WiZryYatFINj3LWqgyE6X82Huzf7abA23tsF/IbaRZVwZzie8SmGaYvezEBiPXhJogQ3dtxIuXFjkBw==}
engines: {node: '>=12'}
peerDependencies:
vue: latest
dependencies:
tippy.js: 6.3.7
- vue: 3.3.7
+ vue: 3.3.8
dev: false
/vue3-contextmenu@0.2.12:
@@ -23766,7 +24902,7 @@ packages:
dependencies:
core-js: 3.32.1
mitt: 2.1.0
- vue: 3.3.7
+ vue: 3.3.8
transitivePeerDependencies:
- typescript
dev: false
@@ -23788,37 +24924,37 @@ packages:
- '@interactjs/utils'
dev: false
- /vue3-text-clamp@0.1.1(resize-detector@0.3.0)(vue@3.3.7):
+ /vue3-text-clamp@0.1.1(resize-detector@0.3.0)(vue@3.3.8):
resolution: {integrity: sha512-l/30RvXLkw50axAjswAK1DmvbUc5Oyhq9GkvD98p8pykrLkIajRi3evVsMnahMBK0O7+EGIK9RbIOKPyRfuw7w==}
peerDependencies:
resize-detector: ^0.3.0
vue: latest
dependencies:
resize-detector: 0.3.0
- vue: 3.3.7
+ vue: 3.3.8
dev: false
- /vue@3.3.7:
- resolution: {integrity: sha512-YEMDia1ZTv1TeBbnu6VybatmSteGOS3A3YgfINOfraCbf85wdKHzscD6HSS/vB4GAtI7sa1XPX7HcQaJ1l24zA==}
+ /vue@3.3.8:
+ resolution: {integrity: sha512-5VSX/3DabBikOXMsxzlW8JyfeLKlG9mzqnWgLQLty88vdZL7ZJgrdgBOmrArwxiLtmS+lNNpPcBYqrhE6TQW5w==}
peerDependencies:
typescript: latest
peerDependenciesMeta:
typescript:
optional: true
dependencies:
- '@vue/compiler-dom': 3.3.7
- '@vue/compiler-sfc': 3.3.7
- '@vue/runtime-dom': 3.3.7
- '@vue/server-renderer': 3.3.7(vue@3.3.7)
- '@vue/shared': 3.3.7
+ '@vue/compiler-dom': 3.3.8
+ '@vue/compiler-sfc': 3.3.8
+ '@vue/runtime-dom': 3.3.8
+ '@vue/server-renderer': 3.3.8(vue@3.3.8)
+ '@vue/shared': 3.3.8
- /vuedraggable@4.1.0(vue@3.3.7):
+ /vuedraggable@4.1.0(vue@3.3.8):
resolution: {integrity: sha512-FU5HCWBmsf20GpP3eudURW3WdWTKIbEIQxh9/8GE806hydR9qZqRRxRE3RjqX7PkuLuMQG/A7n3cfj9rCEchww==}
peerDependencies:
vue: latest
dependencies:
sortablejs: 1.14.0
- vue: 3.3.7
+ vue: 3.3.8
dev: false
/w3c-xmlserializer@4.0.0:
@@ -23858,11 +24994,6 @@ packages:
resolution: {integrity: sha512-lNR9aAefbGPpHO7AEnY0hCFjz1eTkWCXYvkTRrTHs9qv8zJp+SkVYpzfLIFXQQiG3tVvbNFQgVg2bQS8YGgxyw==}
dev: false
- /web-streams-polyfill@3.2.1:
- resolution: {integrity: sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q==}
- engines: {node: '>= 8'}
- dev: true
-
/webfinger@0.4.2:
resolution: {integrity: sha512-PvvQ/k74HkC3q5G7bGu4VYeKDt3ePZMzT5qFPtEnOL8eyIU1/06OtDn9X5vlkQ23BlegA3eN89rDLiYUife3xQ==}
engines: {node: '>=0.8.x'}
@@ -24162,6 +25293,14 @@ packages:
isexe: 2.0.0
dev: true
+ /which@4.0.0:
+ resolution: {integrity: sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==}
+ engines: {node: ^16.13.0 || >=18.0.0}
+ hasBin: true
+ dependencies:
+ isexe: 3.1.1
+ dev: true
+
/why-is-node-running@2.2.2:
resolution: {integrity: sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA==}
engines: {node: '>=8'}
@@ -24420,6 +25559,19 @@ packages:
optional: true
dev: false
+ /ws@8.14.2:
+ resolution: {integrity: sha512-wEBG1ftX4jcglPxgFCMJmZ2PLtSbJ2Peg6TmpJFTbe9GZYOQCDPdMYu/Tm0/bGZkw8paZnJY45J4K2PZrLYq8g==}
+ engines: {node: '>=10.0.0'}
+ peerDependencies:
+ bufferutil: ^4.0.1
+ utf-8-validate: '>=5.0.2'
+ peerDependenciesMeta:
+ bufferutil:
+ optional: true
+ utf-8-validate:
+ optional: true
+ dev: true
+
/ws@8.2.3:
resolution: {integrity: sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA==}
engines: {node: '>=10.0.0'}
@@ -24550,12 +25702,6 @@ packages:
resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==}
engines: {node: '>=0.4'}
- /xxhashjs@0.2.2:
- resolution: {integrity: sha512-AkTuIuVTET12tpsVIQo+ZU6f/qDmKuRUcjaqR+OIvm+aCBsZ95i7UVY5WJ9TMsSaZ0DA2WxoZ4acu0sPH+OKAw==}
- dependencies:
- cuint: 0.2.2
- dev: true
-
/y18n@4.0.3:
resolution: {integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==}
dev: false
@@ -24598,6 +25744,11 @@ packages:
engines: {node: '>= 14'}
dev: true
+ /yaml@2.3.4:
+ resolution: {integrity: sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==}
+ engines: {node: '>= 14'}
+ dev: true
+
/yargs-parser@18.1.3:
resolution: {integrity: sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==}
engines: {node: '>=6'}
@@ -24690,8 +25841,8 @@ packages:
engines: {node: '>=12.20'}
dev: true
- /zhead@2.0.10:
- resolution: {integrity: sha512-irug8fXNKjqazkA27cFQs7C6/ZD3qNiEzLC56kDyzQART/Z9GMGfg8h2i6fb9c8ZWnIx/QgOgFJxK3A/CYHG0g==}
+ /zhead@2.2.4:
+ resolution: {integrity: sha512-8F0OI5dpWIA5IGG5NHUg9staDwz/ZPxZtvGVf01j7vHqSyZ0raHY+78atOVxRqb73AotX22uV1pXt3gYSstGag==}
dev: true
/zip-stream@4.1.0:
@@ -24701,3 +25852,13 @@ packages:
archiver-utils: 2.1.0
compress-commons: 4.1.1
readable-stream: 3.6.2
+ dev: false
+
+ /zip-stream@5.0.1:
+ resolution: {integrity: sha512-UfZ0oa0C8LI58wJ+moL46BDIMgCQbnsb+2PoiJYtonhBsMh2bq1eRBVkvjfVsqbEHd9/EgKPUuL9saSSsec8OA==}
+ engines: {node: '>= 12.0.0'}
+ dependencies:
+ archiver-utils: 4.0.1
+ compress-commons: 5.0.1
+ readable-stream: 3.6.2
+ dev: true
diff --git a/tests/playwright/pages/Dashboard/Grid/Column/index.ts b/tests/playwright/pages/Dashboard/Grid/Column/index.ts
index 7094a79f11..b77c868b30 100644
--- a/tests/playwright/pages/Dashboard/Grid/Column/index.ts
+++ b/tests/playwright/pages/Dashboard/Grid/Column/index.ts
@@ -329,12 +329,14 @@ export class ColumnPageObject extends BasePage {
await this.rootPage.locator('.nc-more-options').click();
}
- async duplicateColumn({ title, expectedTitle = `${title}_copy` }: { title: string; expectedTitle?: string }) {
+ async duplicateColumn({ title, expectedTitle = `${title} copy` }: { title: string; expectedTitle?: string }) {
await this.grid.get().locator(`th[data-title="${title}"] .nc-ui-dt-dropdown`).click();
await this.rootPage.locator('li[role="menuitem"]:has-text("Duplicate"):visible').click();
+ await this.rootPage.locator('.nc-modal-column-duplicate .nc-button:has-text("Confirm"):visible').click();
+
// await this.verifyToast({ message: 'Column duplicated successfully' });
- await this.grid.get().locator(`th[data-title="${expectedTitle}"]`).waitFor({ state: 'visible' });
+ await this.grid.get().locator(`th[data-title="${expectedTitle}"]`).waitFor({ state: 'visible', timeout: 10000 });
}
async hideColumn({ title, isDisplayValue = false }: { title: string; isDisplayValue?: boolean }) {
diff --git a/tests/playwright/pages/Dashboard/ProjectView/Metadata.ts b/tests/playwright/pages/Dashboard/ProjectView/Metadata.ts
index fb821c4897..cbddf82810 100644
--- a/tests/playwright/pages/Dashboard/ProjectView/Metadata.ts
+++ b/tests/playwright/pages/Dashboard/ProjectView/Metadata.ts
@@ -18,7 +18,7 @@ export class MetaDataPage extends BasePage {
// todo: Remove this wait
await this.rootPage.waitForTimeout(100);
// await this.get().locator(`.animate-spin`).waitFor({state: 'visible'});
- await this.get().locator(`.animate-spin`).waitFor({ state: 'detached' });
+ await this.get().locator(`.animate-spin`).waitFor({ state: 'detached', timeout: 10000 });
}
async close() {
@@ -32,7 +32,7 @@ export class MetaDataPage extends BasePage {
await this.get().locator(`button:has-text("Sync Now")`).click();
await this.verifyToast({ message: 'Table metadata recreated successfully' });
await this.get().locator(`.animate-spin`).waitFor({ state: 'visible' });
- await this.get().locator(`.animate-spin`).waitFor({ state: 'detached' });
+ await this.get().locator(`.animate-spin`).waitFor({ state: 'detached', timeout: 10000 });
}
async verifyRow({ index, model, state }: { index: number; model: string; state: string }) {
diff --git a/tests/playwright/pages/Dashboard/common/Cell/index.ts b/tests/playwright/pages/Dashboard/common/Cell/index.ts
index c24c5da97e..1e35e1622a 100644
--- a/tests/playwright/pages/Dashboard/common/Cell/index.ts
+++ b/tests/playwright/pages/Dashboard/common/Cell/index.ts
@@ -381,25 +381,25 @@ export class CellPageObject extends BasePage {
async verifyRoleAccess(param: { role: string }) {
const role = param.role.toLowerCase();
- const count = role === 'creator' || role === 'editor' || role === 'owner' ? 1 : 0;
+ const isEditAccess = role === 'creator' || role === 'editor' || role === 'owner';
// normal text cell
const cell = this.get({ index: 0, columnHeader: 'Country' });
// editable cell
await cell.dblclick();
- await expect(cell.locator(`input`)).toHaveCount(count);
+ await expect(cell.locator(`input`)).toHaveCount(isEditAccess ? 1 : 0);
// press escape to close the input
await cell.press('Escape');
await cell.press('Escape');
await cell.click({ button: 'right', clickCount: 1 });
- await expect(this.rootPage.locator(`.nc-dropdown-grid-context-menu:visible`)).toHaveCount(count);
+ await expect(this.rootPage.locator(`.nc-dropdown-grid-context-menu:visible`)).toHaveCount(1);
// virtual cell
const vCell = this.get({ index: 0, columnHeader: 'Cities' });
await vCell.hover();
// in-cell add
- await expect(vCell.locator('.nc-action-icon.nc-plus:visible')).toHaveCount(count);
+ await expect(vCell.locator('.nc-action-icon.nc-plus:visible')).toHaveCount(isEditAccess ? 1 : 0);
// virtual cell link text
const linkText = await getTextExcludeIconText(vCell);
diff --git a/tests/playwright/pages/Dashboard/common/Toolbar/Actions/index.ts b/tests/playwright/pages/Dashboard/common/Toolbar/Actions/index.ts
index 1efd54edbf..25d9e74fae 100644
--- a/tests/playwright/pages/Dashboard/common/Toolbar/Actions/index.ts
+++ b/tests/playwright/pages/Dashboard/common/Toolbar/Actions/index.ts
@@ -13,7 +13,7 @@ export class ToolbarActionsPage extends BasePage {
}
get() {
- return this.rootPage.locator(`[data-testid="toolbar-actions"]`);
+ return this.rootPage.locator(`[data-id="toolbar-actions"]`);
}
// todo: use enum
@@ -22,6 +22,6 @@ export class ToolbarActionsPage extends BasePage {
}
async clickDownloadSubmenu(label: string) {
- await this.rootPage.locator(`div[class="nc-base-menu-item"]:has-text("${label}")`).first().click();
+ await this.rootPage.locator(`div.nc-base-menu-item:has-text("${label}")`).first().click();
}
}
diff --git a/tests/playwright/pages/Dashboard/common/Toolbar/ViewMenu.ts b/tests/playwright/pages/Dashboard/common/Toolbar/ViewMenu.ts
index 09c4abe126..477713a47a 100644
--- a/tests/playwright/pages/Dashboard/common/Toolbar/ViewMenu.ts
+++ b/tests/playwright/pages/Dashboard/common/Toolbar/ViewMenu.ts
@@ -12,7 +12,7 @@ export class ToolbarViewMenuPage extends BasePage {
constructor(toolbar: ToolbarPage) {
super(toolbar.rootPage);
this.toolbar = toolbar;
- this.viewsMenuBtn = this.toolbar.get().locator(`.nc-actions-menu-btn`);
+ this.viewsMenuBtn = this.rootPage.locator('.nc-view-context-btn');
}
get() {
@@ -89,12 +89,12 @@ export class ToolbarViewMenuPage extends BasePage {
await this.get().locator(`.ant-dropdown-menu-title-content:has-text("${menu}")`).first().click();
if (subMenu) {
// for CSV download, pass locator instead of clicking it here
- if (subMenu === 'Download as CSV') {
+ if (subMenu === 'Download CSV') {
await this.verifyDownloadAsCSV({
downloadLocator: this.rootPage.locator(`.ant-dropdown-menu-title-content:has-text("${subMenu}")`).last(),
expectedDataFile: verificationInfo?.verificationFile ?? './fixtures/expectedBaseDownloadData.txt',
});
- } else if (subMenu === 'Download as XLSX') {
+ } else if (subMenu === 'Download Excel') {
await this.verifyDownloadAsXLSX({
downloadLocator: this.rootPage.locator(`.ant-dropdown-menu-title-content:has-text("${subMenu}")`).last(),
expectedDataFile: verificationInfo?.verificationFile ?? './fixtures/expectedBaseDownloadData.txt',
@@ -104,12 +104,12 @@ export class ToolbarViewMenuPage extends BasePage {
}
switch (subMenu) {
- case 'Download as CSV':
+ case 'Download CSV':
await this.verifyToast({
message: 'Successfully exported all table data',
});
break;
- case 'Download as XLSX':
+ case 'Download Excel':
await this.verifyToast({
message: 'Successfully exported all table data',
});
diff --git a/tests/playwright/pages/Dashboard/common/Toolbar/index.ts b/tests/playwright/pages/Dashboard/common/Toolbar/index.ts
index 434f0a215b..ca4376fdb9 100644
--- a/tests/playwright/pages/Dashboard/common/Toolbar/index.ts
+++ b/tests/playwright/pages/Dashboard/common/Toolbar/index.ts
@@ -65,7 +65,7 @@ export class ToolbarPage extends BasePage {
async clickActions() {
const menuOpen = await this.actions.get().isVisible();
- await this.get().locator(`button.nc-actions-menu-btn`).click();
+ await this.rootPage.locator(`div.nc-view-context-btn`).click();
// Wait for the menu to close
if (menuOpen) await this.fields.get().waitFor({ state: 'hidden' });
@@ -206,8 +206,8 @@ export class ToolbarPage extends BasePage {
const menuItems = {
creator: ['Download', 'Upload'],
editor: ['Download', 'Upload'],
- commenter: ['Download as CSV', 'Download as XLSX'],
- viewer: ['Download as CSV', 'Download as XLSX'],
+ commenter: ['Download CSV', 'Download Excel'],
+ viewer: ['Download CSV', 'Download Excel'],
};
const vMenu = this.rootPage.locator('.nc-dropdown-actions-menu:visible');
for (const item of menuItems[param.role.toLowerCase()]) {
diff --git a/tests/playwright/tests/db/columns/columnAttachments.spec.ts b/tests/playwright/tests/db/columns/columnAttachments.spec.ts
index fac8ef6c4b..c7c95bbbbe 100644
--- a/tests/playwright/tests/db/columns/columnAttachments.spec.ts
+++ b/tests/playwright/tests/db/columns/columnAttachments.spec.ts
@@ -97,7 +97,7 @@ test.describe('Attachment column', () => {
await dashboard.grid.toolbar.actions.click('Download');
const csvFileData: string = await dashboard.downloadAndGetFile({
- downloadUIAction: dashboard.grid.toolbar.actions.clickDownloadSubmenu('Download as CSV'),
+ downloadUIAction: dashboard.grid.toolbar.actions.clickDownloadSubmenu('Download CSV'),
});
const csvArray = csvFileData.split('\r\n');
const columns = csvArray[0];
diff --git a/tests/playwright/tests/db/columns/columnMenuOperations.spec.ts b/tests/playwright/tests/db/columns/columnMenuOperations.spec.ts
index 1cd6e26ff3..98f0069f93 100644
--- a/tests/playwright/tests/db/columns/columnMenuOperations.spec.ts
+++ b/tests/playwright/tests/db/columns/columnMenuOperations.spec.ts
@@ -70,7 +70,7 @@ test.describe('Column menu operations', () => {
});
await dashboard.grid.column.duplicateColumn({
title,
- expectedTitle: `${title}_copy_1`,
+ expectedTitle: `${title} copy_1`,
});
}
await dashboard.closeTab({ title: 'Film' });
diff --git a/tests/playwright/tests/db/features/metaSync.spec.ts b/tests/playwright/tests/db/features/metaSync.spec.ts
index 7e342abfdf..61517f1fbd 100644
--- a/tests/playwright/tests/db/features/metaSync.spec.ts
+++ b/tests/playwright/tests/db/features/metaSync.spec.ts
@@ -43,7 +43,7 @@ test.describe('Meta sync', () => {
await dbExec(`CREATE TABLE table2 (id INT NOT NULL, col1 INT NULL, PRIMARY KEY (id))`);
await metaData.clickReload();
- await dashboard.rootPage.waitForTimeout(1000);
+ await dashboard.rootPage.waitForTimeout(5000);
await metaData.verifyRow({
index: isPg(context) ? 21 : 16,
diff --git a/tests/playwright/tests/db/general/viewMenu.spec.ts b/tests/playwright/tests/db/general/viewMenu.spec.ts
index 96bd5c1cdc..ca3ef4fbae 100644
--- a/tests/playwright/tests/db/general/viewMenu.spec.ts
+++ b/tests/playwright/tests/db/general/viewMenu.spec.ts
@@ -23,8 +23,8 @@ test.describe('Grid view locked', () => {
// enable view lock
await dashboard.grid.toolbar.viewsMenu.click({
- menu: 'Collaborative View',
- subMenu: 'Locked View',
+ menu: 'Collaborative',
+ subMenu: 'Locked',
});
// verify view lock
@@ -32,8 +32,8 @@ test.describe('Grid view locked', () => {
// enable collaborative view
await dashboard.grid.toolbar.viewsMenu.click({
- menu: 'Locked View',
- subMenu: 'Collaborative View',
+ menu: 'Locked',
+ subMenu: 'Collaborative',
});
await dashboard.grid.verifyCollaborativeMode();
@@ -52,7 +52,7 @@ test.describe('Grid view locked', () => {
await dashboard.grid.toolbar.viewsMenu.click({
menu: 'Download',
- subMenu: 'Download as CSV',
+ subMenu: 'Download CSV',
verificationInfo: {
verificationFile: isPg(context) ? './fixtures/expectedBaseDownloadDataPg.txt' : null,
},
@@ -72,7 +72,7 @@ test.describe('Grid view locked', () => {
await dashboard.grid.toolbar.viewsMenu.click({
menu: 'Download',
- subMenu: 'Download as XLSX',
+ subMenu: 'Download Excel',
verificationInfo: {
verificationFile: isPg(context) ? './fixtures/expectedBaseDownloadDataPg.txt' : null,
},
diff --git a/tests/playwright/tests/db/views/viewGridShare.spec.ts b/tests/playwright/tests/db/views/viewGridShare.spec.ts
index 8cb454c9bf..0b0f588837 100644
--- a/tests/playwright/tests/db/views/viewGridShare.spec.ts
+++ b/tests/playwright/tests/db/views/viewGridShare.spec.ts
@@ -247,7 +247,7 @@ test.describe('Shared view', () => {
// verify download
await sharedPage.grid.toolbar.clickDownload(
- 'Download as CSV',
+ 'Download CSV',
isSqlite(context) || isPg(context) ? 'expectedDataSqlite.txt' : 'expectedData.txt'
);
});