@@ -716,7 +787,7 @@ watch(
v-if="isVirtualCol(columnObj)"
v-model="row.row[columnObj.title]"
:column="columnObj"
- :active="selected.col === colIndex && selected.row === rowIndex"
+ :active="selectedCell.col === colIndex && selectedCell.row === rowIndex"
:row="row"
@navigate="onNavigate"
/>
@@ -726,10 +797,10 @@ watch(
v-model="row.row[columnObj.title]"
:column="columnObj"
:edit-enabled="
- !!hasEditPermission && !!editEnabled && selected.col === colIndex && selected.row === rowIndex
+ !!hasEditPermission && !!editEnabled && selectedCell.col === colIndex && selectedCell.row === rowIndex
"
:row-index="rowIndex"
- :active="selected.col === colIndex && selected.row === rowIndex"
+ :active="selectedCell.col === colIndex && selectedCell.row === rowIndex"
@update:edit-enabled="editEnabled = $event"
@save="updateOrSaveRow(row, columnObj.title, state)"
@navigate="onNavigate"
@@ -741,7 +812,7 @@ watch(
-
+
+
+
+
diff --git a/packages/nc-gui/components/smartsheet/Kanban.vue b/packages/nc-gui/components/smartsheet/Kanban.vue
index 973d0ed10e..26578fd027 100644
--- a/packages/nc-gui/components/smartsheet/Kanban.vue
+++ b/packages/nc-gui/components/smartsheet/Kanban.vue
@@ -620,7 +620,12 @@ watch(view, async (nextView) => {
/>
-
+
{{ $t('activity.deleteKanbanStack') }}
diff --git a/packages/nc-gui/components/smartsheet/VirtualCell.vue b/packages/nc-gui/components/smartsheet/VirtualCell.vue
index 4ab569fbce..dcf44f2c06 100644
--- a/packages/nc-gui/components/smartsheet/VirtualCell.vue
+++ b/packages/nc-gui/components/smartsheet/VirtualCell.vue
@@ -13,6 +13,7 @@ import {
isHm,
isLookup,
isMm,
+ isQrCode,
isRollup,
provide,
toRef,
@@ -39,7 +40,6 @@ provide(RowInj, row)
provide(CellValueInj, toRef(props, 'modelValue'))
const isForm = inject(IsFormInj, ref(false))
-
function onNavigate(dir: NavigateDir, e: KeyboardEvent) {
emit('navigate', dir)
@@ -58,6 +58,7 @@ function onNavigate(dir: NavigateDir, e: KeyboardEvent) {
+
diff --git a/packages/nc-gui/components/smartsheet/column/EditOrAdd.vue b/packages/nc-gui/components/smartsheet/column/EditOrAdd.vue
index 0eb697dc36..f7a63fe1de 100644
--- a/packages/nc-gui/components/smartsheet/column/EditOrAdd.vue
+++ b/packages/nc-gui/components/smartsheet/column/EditOrAdd.vue
@@ -1,5 +1,5 @@
-
+
diff --git a/packages/nc-gui/components/smartsheet/column/FormulaOptions.vue b/packages/nc-gui/components/smartsheet/column/FormulaOptions.vue
index e5b5ae7000..1ccb069b43 100644
--- a/packages/nc-gui/components/smartsheet/column/FormulaOptions.vue
+++ b/packages/nc-gui/components/smartsheet/column/FormulaOptions.vue
@@ -26,6 +26,8 @@ const props = defineProps<{
const emit = defineEmits(['update:value'])
+const uiTypesNotSupportedInFormulas = [UITypes.QrCode]
+
const vModel = useVModel(props, 'value', emit)
const { setAdditionalValidations, validateInfos, sqlUi, column } = useColumnCreateStoreOrThrow()
@@ -44,7 +46,9 @@ enum JSEPNode {
const meta = inject(MetaInj, ref())
-const columns = computed(() => meta?.value?.columns || [])
+const supportedColumns = computed(
+ () => meta?.value?.columns?.filter((col) => !uiTypesNotSupportedInFormulas.includes(col.uidt as UITypes)) || [],
+)
const validators = {
formula_raw: [
@@ -97,8 +101,8 @@ const suggestionsList = computed(() => {
syntax: formulas[fn].syntax,
examples: formulas[fn].examples,
})),
- ...columns.value
- .filter((c: Record) => {
+ ...supportedColumns.value
+ .filter((c) => {
// skip system LTAR columns
if (c.uidt === UITypes.LinkToAnotherRecord && c.system) return false
// v1 logic? skip the current column
@@ -237,11 +241,7 @@ function validateAgainstMeta(parsedTree: any, errors = new Set(), typeErrors = n
errors = new Set([...errors, ...typeErrors])
} else if (parsedTree.type === JSEPNode.IDENTIFIER) {
- if (
- columns.value
- .filter((c: Record) => !column || column.value?.id !== c.id)
- .every((c: Record) => c.title !== parsedTree.name)
- ) {
+ if (supportedColumns.value.filter((c) => !column || column.value?.id !== c.id).every((c) => c.title !== parsedTree.name)) {
errors.add(`Column '${parsedTree.name}' is not available`)
}
@@ -249,8 +249,8 @@ function validateAgainstMeta(parsedTree: any, errors = new Set(), typeErrors = n
// e.g. formula1 -> formula2 -> formula1 should return circular reference error
// get all formula columns excluding itself
- const formulaPaths = columns.value
- .filter((c: Record) => c.id !== column.value?.id && c.uidt === UITypes.Formula)
+ const formulaPaths = supportedColumns.value
+ .filter((c) => c.id !== column.value?.id && c.uidt === UITypes.Formula)
.reduce((res: Record[], c: Record) => {
// in `formula`, get all the (unique) target neighbours
// i.e. all column id (e.g. cl_xxxxxxxxxxxxxx) with formula type
@@ -258,7 +258,7 @@ function validateAgainstMeta(parsedTree: any, errors = new Set(), typeErrors = n
...new Set(
(c.colOptions.formula.match(/cl_\w{14}/g) || []).filter(
(colId: string) =>
- columns.value.filter((col: ColumnType) => col.id === colId && col.uidt === UITypes.Formula).length,
+ supportedColumns.value.filter((col: ColumnType) => col.id === colId && col.uidt === UITypes.Formula).length,
),
),
]
@@ -269,7 +269,9 @@ function validateAgainstMeta(parsedTree: any, errors = new Set(), typeErrors = n
return res
}, [])
// include target formula column (i.e. the one to be saved if applicable)
- const targetFormulaCol = columns.value.find((c: ColumnType) => c.title === parsedTree.name && c.uidt === UITypes.Formula)
+ const targetFormulaCol = supportedColumns.value.find(
+ (c: ColumnType) => c.title === parsedTree.name && c.uidt === UITypes.Formula,
+ )
if (targetFormulaCol && column.value?.id) {
formulaPaths.push({
@@ -362,7 +364,7 @@ function validateAgainstType(parsedTree: any, expectedType: string, func: any, t
}
}
} else if (parsedTree.type === JSEPNode.IDENTIFIER) {
- const col = columns.value.find((c) => c.title === parsedTree.name)
+ const col = supportedColumns.value.find((c) => c.title === parsedTree.name)
if (col === undefined) {
return
@@ -432,6 +434,7 @@ function validateAgainstType(parsedTree: any, expectedType: string, func: any, t
case UITypes.Button:
case UITypes.Checkbox:
case UITypes.Collaborator:
+ case UITypes.QrCode:
default:
typeErrors.add(`Not supported to reference column '${parsedTree.name}'`)
break
@@ -455,7 +458,7 @@ function getRootDataType(parsedTree: any): any {
if (parsedTree.type === JSEPNode.CALL_EXP) {
return formulas[parsedTree.callee.name].type
} else if (parsedTree.type === JSEPNode.IDENTIFIER) {
- const col = columns.value.find((c) => c.title === parsedTree.name) as Record
+ const col = supportedColumns.value.find((c) => c.title === parsedTree.name) as Record
if (col?.uidt === UITypes.Formula) {
return getRootDataType(jsep(col?.formula_raw))
} else {
@@ -500,6 +503,7 @@ function getRootDataType(parsedTree: any): any {
case UITypes.Button:
case UITypes.Checkbox:
case UITypes.Collaborator:
+ case UITypes.QrCode:
default:
return 'N/A'
}
@@ -561,7 +565,7 @@ function handleInput() {
.complete(wordToComplete.value)
?.sort((x: Record, y: Record) => sortOrder[x.type] - sortOrder[y.type])
if (!isCurlyBracketBalanced()) {
- suggestion.value = suggestion.value.filter((v: Record) => v.type === 'column')
+ suggestion.value = suggestion.value.filter((v) => v.type === 'column')
}
autocomplete.value = !!suggestion.value.length
}
diff --git a/packages/nc-gui/components/smartsheet/column/LookupOptions.vue b/packages/nc-gui/components/smartsheet/column/LookupOptions.vue
index 823bb9b895..1bb039bc7d 100644
--- a/packages/nc-gui/components/smartsheet/column/LookupOptions.vue
+++ b/packages/nc-gui/components/smartsheet/column/LookupOptions.vue
@@ -54,7 +54,9 @@ const columns = $computed(() => {
return []
}
- return metas[selectedTable.id].columns.filter((c: any) => !isSystemColumn(c))
+ return metas[selectedTable.id].columns.filter((c: any) => {
+ return !(isSystemColumn(c) || c.uidt === UITypes.QrCode)
+ })
})
diff --git a/packages/nc-gui/components/smartsheet/column/QrCodeOptions.vue b/packages/nc-gui/components/smartsheet/column/QrCodeOptions.vue
new file mode 100644
index 0000000000..be08672d7a
--- /dev/null
+++ b/packages/nc-gui/components/smartsheet/column/QrCodeOptions.vue
@@ -0,0 +1,68 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/packages/nc-gui/components/smartsheet/expanded-form/Header.vue b/packages/nc-gui/components/smartsheet/expanded-form/Header.vue
index 5141bc8313..a9c5107a66 100644
--- a/packages/nc-gui/components/smartsheet/expanded-form/Header.vue
+++ b/packages/nc-gui/components/smartsheet/expanded-form/Header.vue
@@ -3,6 +3,7 @@ import { message } from 'ant-design-vue'
import type { ViewType } from 'nocodb-sdk'
import {
ReloadRowDataHookInj,
+ isMac,
useExpandedFormStoreOrThrow,
useSmartsheetRowStoreOrThrow,
useSmartsheetStoreOrThrow,
@@ -58,6 +59,19 @@ const copyRecordUrl = () => {
)
message.success('Copied to clipboard')
}
+
+useEventListener(document, 'keydown', async (e: KeyboardEvent) => {
+ const cmdOrCtrl = isMac() ? e.metaKey : e.ctrlKey
+ if (cmdOrCtrl) {
+ switch (e.key) {
+ case 'Enter': {
+ if (isUIAllowed('tableRowUpdate')) {
+ await save()
+ }
+ }
+ }
+ }
+})
diff --git a/packages/nc-gui/components/smartsheet/expanded-form/index.vue b/packages/nc-gui/components/smartsheet/expanded-form/index.vue
index d345b73281..2f1b27ac46 100644
--- a/packages/nc-gui/components/smartsheet/expanded-form/index.vue
+++ b/packages/nc-gui/components/smartsheet/expanded-form/index.vue
@@ -167,7 +167,7 @@ export default {
diff --git a/packages/nc-gui/components/smartsheet/header/Cell.vue b/packages/nc-gui/components/smartsheet/header/Cell.vue
index 18f65533dd..08d4757a48 100644
--- a/packages/nc-gui/components/smartsheet/header/Cell.vue
+++ b/packages/nc-gui/components/smartsheet/header/Cell.vue
@@ -1,5 +1,5 @@
@@ -25,14 +37,25 @@ const editColumnDropdown = ref(false)
:class="{ 'h-full': column, '!text-gray-400': isKanban }"
>
- {{ column.title }}
+ {{ column.title }}
*
-
+
diff --git a/packages/nc-gui/components/smartsheet/header/Menu.vue b/packages/nc-gui/components/smartsheet/header/Menu.vue
index 9f8d9e1d6a..411a3877fe 100644
--- a/packages/nc-gui/components/smartsheet/header/Menu.vue
+++ b/packages/nc-gui/components/smartsheet/header/Menu.vue
@@ -1,27 +1,40 @@
@@ -84,6 +222,53 @@ const setAsPrimaryValue = async () => {
{{ $t('general.edit') }}
+
+
+
+
+
+ Sort Ascending
+
+
+
+
+
+ Sort Descending
+
+
+
+
+
+
+
+ Hide Field
+
+
+
+
+
+
+
+
+ Duplicate
+
+
+
+
+
+ Insert After
+
+
+
+
+
+ Insert before
+
+
+
diff --git a/packages/nc-gui/components/smartsheet/header/VirtualCell.vue b/packages/nc-gui/components/smartsheet/header/VirtualCell.vue
index 329ccac8a5..da12c52f3b 100644
--- a/packages/nc-gui/components/smartsheet/header/VirtualCell.vue
+++ b/packages/nc-gui/components/smartsheet/header/VirtualCell.vue
@@ -1,5 +1,5 @@
@@ -117,7 +129,12 @@ const tooltipMsg = computed(() => {
-
+
{
overlay-class-name="nc-dropdown-edit-column"
>
-
diff --git a/packages/nc-gui/components/smartsheet/header/VirtualCellIcon.ts b/packages/nc-gui/components/smartsheet/header/VirtualCellIcon.ts
index 029543fb48..4d0c960a0c 100644
--- a/packages/nc-gui/components/smartsheet/header/VirtualCellIcon.ts
+++ b/packages/nc-gui/components/smartsheet/header/VirtualCellIcon.ts
@@ -8,10 +8,11 @@ import HMIcon from '~icons/mdi/table-arrow-right'
import BTIcon from '~icons/mdi/table-arrow-left'
import MMIcon from '~icons/mdi/table-network'
import FormulaIcon from '~icons/mdi/math-integral'
+import QrCodeScan from '~icons/mdi/qrcode-scan'
import RollupIcon from '~icons/mdi/movie-roll'
import CountIcon from '~icons/mdi/counter'
import SpecificDBTypeIcon from '~icons/mdi/database-settings'
-import TableColumnPlusBefore from '~icons/mdi/table-column-plus-before'
+import MdiTextSearchVariant from '~icons/mdi/text-search-variant'
const renderIcon = (column: ColumnType, relationColumn?: ColumnType) => {
switch (column.uidt) {
@@ -29,16 +30,18 @@ const renderIcon = (column: ColumnType, relationColumn?: ColumnType) => {
return { icon: SpecificDBTypeIcon, color: 'text-grey' }
case UITypes.Formula:
return { icon: FormulaIcon, color: 'text-grey' }
+ case UITypes.QrCode:
+ return { icon: QrCodeScan, color: 'text-grey' }
case UITypes.Lookup:
switch ((relationColumn?.colOptions as LinkToAnotherRecordType)?.type) {
case RelationTypes.MANY_TO_MANY:
- return { icon: TableColumnPlusBefore, color: 'text-accent' }
+ return { icon: MdiTextSearchVariant, color: 'text-accent' }
case RelationTypes.HAS_MANY:
- return { icon: TableColumnPlusBefore, color: 'text-yellow-500' }
+ return { icon: MdiTextSearchVariant, color: 'text-yellow-500' }
case RelationTypes.BELONGS_TO:
- return { icon: TableColumnPlusBefore, color: 'text-sky-500' }
+ return { icon: MdiTextSearchVariant, color: 'text-sky-500' }
}
- return { icon: TableColumnPlusBefore, color: 'text-grey' }
+ return { icon: MdiTextSearchVariant, color: 'text-grey' }
case UITypes.Rollup:
switch ((relationColumn?.colOptions as LinkToAnotherRecordType)?.type) {
case RelationTypes.MANY_TO_MANY:
diff --git a/packages/nc-gui/components/smartsheet/toolbar/ColumnFilterMenu.vue b/packages/nc-gui/components/smartsheet/toolbar/ColumnFilterMenu.vue
index 18c0d42120..7a154f28b5 100644
--- a/packages/nc-gui/components/smartsheet/toolbar/ColumnFilterMenu.vue
+++ b/packages/nc-gui/components/smartsheet/toolbar/ColumnFilterMenu.vue
@@ -71,13 +71,15 @@ useMenuCloseOnEsc(open)
-
+
diff --git a/packages/nc-gui/components/smartsheet/toolbar/Erd.vue b/packages/nc-gui/components/smartsheet/toolbar/Erd.vue
index ea1b24bc49..2dac0c07bd 100644
--- a/packages/nc-gui/components/smartsheet/toolbar/Erd.vue
+++ b/packages/nc-gui/components/smartsheet/toolbar/Erd.vue
@@ -17,6 +17,7 @@ const selectedView = inject(ActiveViewInj)
(() =>
meta.value?.columns
?.filter((c: ColumnType) => {
- /** ignore hasmany and manytomany relations if it's using within sort menu */
- if (isSort) {
+ if (c.uidt === UITypes.QrCode) {
+ return false
+ } else if (isSort) {
+ /** ignore hasmany and manytomany relations if it's using within sort menu */
return !(
c.uidt === UITypes.LinkToAnotherRecord && (c.colOptions as LinkToAnotherRecordType).type !== RelationTypes.BELONGS_TO
)
- /** ignore virtual fields which are system fields ( mm relation ) */
+ /** ignore virtual fields which are system fields ( mm relation ) and qr code fields */
} else {
- return !c.colOptions || !c.system
+ const isVirtualSystemField = c.colOptions && c.system
+ return !isVirtualSystemField
}
})
.map((c: ColumnType) => ({
diff --git a/packages/nc-gui/components/smartsheet/toolbar/FieldsMenu.vue b/packages/nc-gui/components/smartsheet/toolbar/FieldsMenu.vue
index 07fa87a44d..d2b6eda8cb 100644
--- a/packages/nc-gui/components/smartsheet/toolbar/FieldsMenu.vue
+++ b/packages/nc-gui/components/smartsheet/toolbar/FieldsMenu.vue
@@ -16,6 +16,7 @@ import {
resolveComponent,
useMenuCloseOnEsc,
useNuxtApp,
+ useSmartsheetStoreOrThrow,
useViewColumns,
watch,
} from '#imports'
@@ -46,8 +47,17 @@ const {
hideAll,
saveOrUpdate,
metaColumnById,
+ loadViewColumns,
} = useViewColumns(activeView, meta, () => reloadDataHook.trigger())
+const { eventBus } = useSmartsheetStoreOrThrow()
+
+eventBus.on((event) => {
+ if (event === SmartsheetStoreEvents.FIELD_RELOAD) {
+ loadViewColumns()
+ }
+})
+
watch(
sortedAndFilteredFields,
(v) => {
@@ -56,7 +66,7 @@ watch(
{ immediate: true },
)
-const isAnyFieldHidden = computed(() => filteredFieldList.value?.some((field) => !field.show))
+const numberOfHiddenFields = computed(() => filteredFieldList.value?.filter((field) => !field.show)?.length)
const onMove = (_event: { moved: { newIndex: number } }) => {
// todo : sync with server
@@ -128,7 +138,7 @@ useMenuCloseOnEsc(open)
-
+
diff --git a/packages/nc-gui/components/smartsheet/toolbar/MoreActions.vue b/packages/nc-gui/components/smartsheet/toolbar/MoreActions.vue
index 8a6e9eb7c0..7c2826673a 100644
--- a/packages/nc-gui/components/smartsheet/toolbar/MoreActions.vue
+++ b/packages/nc-gui/components/smartsheet/toolbar/MoreActions.vue
@@ -172,6 +172,7 @@ const exportFile = async (exportType: ExportTypes) => {
isRtlLang(locale.value as any))
reloadDataHook?.trigger())
+eventBus.on((event) => {
+ if (event === SmartsheetStoreEvents.SORT_RELOAD) {
+ loadSorts()
+ }
+})
+
const columns = computed(() => meta.value?.columns || [])
const columnByID = computed(() =>
@@ -54,6 +63,8 @@ useMenuCloseOnEsc(open)
{{ $t('activity.sort') }}
+
+ {{ sorts.length }}
diff --git a/packages/nc-gui/components/smartsheet/toolbar/ViewActions.vue b/packages/nc-gui/components/smartsheet/toolbar/ViewActions.vue
index 8289ff6dde..999ab2efc5 100644
--- a/packages/nc-gui/components/smartsheet/toolbar/ViewActions.vue
+++ b/packages/nc-gui/components/smartsheet/toolbar/ViewActions.vue
@@ -241,6 +241,7 @@ useMenuCloseOnEsc(open)
{
{
{
{
:footer="null"
centered
:visible="show"
+ :class="{ active: show }"
:closable="false"
width="max(50vw, 44rem)"
wrap-class-name="nc-modal-invite-user-and-share-base"
@@ -177,7 +178,7 @@ const emailField = (inputEl: typeof Input) => {
-
+
{{ inviteUrl }}
diff --git a/packages/nc-gui/components/virtual-cell/Formula.vue b/packages/nc-gui/components/virtual-cell/Formula.vue
index 7d25764c04..f0afb25e59 100644
--- a/packages/nc-gui/components/virtual-cell/Formula.vue
+++ b/packages/nc-gui/components/virtual-cell/Formula.vue
@@ -1,7 +1,7 @@
@@ -41,18 +28,16 @@ useSelectedCellKeyupListener(inject(ActiveCellInj, ref(false)), (e: KeyboardEven
ERR!
-
+
{{ result }}
-
-
- Warning: Formula fields should be configured in the field menu dropdown.
+
+ {{ $t('msg.info.computedFieldEditWarning') }}
-
-
- Warning: Computed field - unable to clear text.
+
+ {{ $t('msg.info.computedFieldDeleteWarning') }}
diff --git a/packages/nc-gui/components/virtual-cell/Lookup.vue b/packages/nc-gui/components/virtual-cell/Lookup.vue
index 4ba3a394b3..b358296361 100644
--- a/packages/nc-gui/components/virtual-cell/Lookup.vue
+++ b/packages/nc-gui/components/virtual-cell/Lookup.vue
@@ -78,6 +78,7 @@ provide(CellUrlDisableOverlayInj, ref(true))
const timeout = 3000 // in ms
const showEditWarning = refAutoReset(false, timeout)
+
const showClearWarning = refAutoReset(false, timeout)
useSelectedCellKeyupListener(inject(ActiveCellInj, ref(false)), (e: KeyboardEvent) => {
@@ -85,16 +86,15 @@ useSelectedCellKeyupListener(inject(ActiveCellInj, ref(false)), (e: KeyboardEven
case 'Enter':
showEditWarning.value = true
break
- case 'Delete':
+ default:
showClearWarning.value = true
- break
}
})
-
+
@@ -134,12 +134,10 @@ useSelectedCellKeyupListener(inject(ActiveCellInj, ref(false)), (e: KeyboardEven
-
- Warning: Computed field - unable to edit content.
+ {{ $t('msg.info.computedFieldEditWarning') }}
-
- Warning: Computed field - unable to clear content.
+ {{ $t('msg.info.computedFieldDeleteWarning') }}
diff --git a/packages/nc-gui/components/virtual-cell/QrCode.vue b/packages/nc-gui/components/virtual-cell/QrCode.vue
new file mode 100644
index 0000000000..7dae0c10da
--- /dev/null
+++ b/packages/nc-gui/components/virtual-cell/QrCode.vue
@@ -0,0 +1,54 @@
+
+
+
+
+
+ {{ qrValue }}
+
+
+
+
+ {{ $t('labels.qrCodeValueTooLong') }}
+
+
+
+ {{ $t('msg.warning.nonEditableFields.computedFieldUnableToClear') }}
+
+
+ {{ $t('msg.warning.nonEditableFields.qrFieldsCannotBeDirectlyChanged') }}
+
+
diff --git a/packages/nc-gui/components/virtual-cell/Rollup.vue b/packages/nc-gui/components/virtual-cell/Rollup.vue
index dea3a85e7c..ad77e9578f 100644
--- a/packages/nc-gui/components/virtual-cell/Rollup.vue
+++ b/packages/nc-gui/components/virtual-cell/Rollup.vue
@@ -6,18 +6,10 @@ const value = inject(CellValueInj)
const timeout = 3000 // in ms
const showEditWarning = refAutoReset(false, timeout)
+
const showClearWarning = refAutoReset(false, timeout)
-useSelectedCellKeyupListener(inject(ActiveCellInj, ref(false)), (e: KeyboardEvent) => {
- switch (e.key) {
- case 'Enter':
- showEditWarning.value = true
- break
- case 'Delete':
- showClearWarning.value = true
- break
- }
-})
+useSelectedCellKeyupListener(inject(ActiveCellInj, ref(false)), () => (showClearWarning.value = true))
@@ -28,12 +20,10 @@ useSelectedCellKeyupListener(inject(ActiveCellInj, ref(false)), (e: KeyboardEven
-
- Warning: Computed field - unable to edit content.
+ {{ $t('msg.info.computedFieldEditWarning') }}
-
- Warning: Computed field - unable to clear content.
+ {{ $t('msg.info.computedFieldDeleteWarning') }}
diff --git a/packages/nc-gui/components/virtual-cell/components/ListItems.vue b/packages/nc-gui/components/virtual-cell/components/ListItems.vue
index 147627bc1b..63519f5835 100644
--- a/packages/nc-gui/components/virtual-cell/components/ListItems.vue
+++ b/packages/nc-gui/components/virtual-cell/components/ListItems.vue
@@ -24,6 +24,8 @@ const vModel = useVModel(props, 'modelValue', emit)
const column = inject(ColumnInj)
+const filterQueryRef = ref()
+
const {
childrenExcludedList,
loadChildrenExcludedList,
@@ -141,6 +143,12 @@ useSelectedCellKeyupListener(vModel, (e: KeyboardEvent) => {
}
}
break
+ default: {
+ const el = filterQueryRef.value?.$el
+ if (el) {
+ filterQueryRef.value.$el.focus()
+ }
+ }
}
})
const activeRow = (vNode?: InstanceType ) => {
@@ -151,6 +159,7 @@ const activeRow = (vNode?: InstanceType) => {
) => {
void) => {
+ const addOrUpdate = async (onSuccess: () => void, columnPosition?: Pick) => {
try {
if (!(await validate())) return
- } catch (e) {
+ } catch (e: any) {
const errorMsgs = e.errorFields
?.map((e: any) => e.errors?.join(', '))
.filter(Boolean)
@@ -228,7 +228,7 @@ const [useProvideColumnCreateStore, useColumnCreateStore] = createInjectionState
// };
// }
}
- await $api.dbTableColumn.create(meta.value?.id as string, formState.value)
+ await $api.dbTableColumn.create(meta.value?.id as string, { ...formState.value, ...columnPosition })
/** if LTAR column then force reload related table meta */
if (formState.value.uidt === UITypes.LinkToAnotherRecord && meta.value?.id !== formState.value.childId) {
diff --git a/packages/nc-gui/composables/useMultiSelect/cellRange.ts b/packages/nc-gui/composables/useMultiSelect/cellRange.ts
new file mode 100644
index 0000000000..c059cbfe12
--- /dev/null
+++ b/packages/nc-gui/composables/useMultiSelect/cellRange.ts
@@ -0,0 +1,54 @@
+export interface Cell {
+ row: number | null
+ col: number | null
+}
+
+export class CellRange {
+ _start: Cell | null
+ _end: Cell | null
+
+ constructor(start = null, end = null) {
+ this._start = start
+ this._end = end ?? this._start
+ }
+
+ get start() {
+ return {
+ row: Math.min(this._start?.row ?? NaN, this._end?.row ?? NaN),
+ col: Math.min(this._start?.col ?? NaN, this._end?.col ?? NaN),
+ }
+ }
+
+ get end() {
+ return {
+ row: Math.max(this._start?.row ?? NaN, this._end?.row ?? NaN),
+ col: Math.max(this._start?.col ?? NaN, this._end?.col ?? NaN),
+ }
+ }
+
+ startRange(value: Cell) {
+ if (value == null) {
+ return
+ }
+
+ this._start = value
+ this._end = value
+ }
+
+ endRange(value: Cell) {
+ if (value == null) {
+ return
+ }
+
+ this._end = value
+ }
+
+ clear() {
+ this._start = null
+ this._end = null
+ }
+
+ isEmpty() {
+ return this._start == null || this._end == null
+ }
+}
diff --git a/packages/nc-gui/composables/useMultiSelect/convertCellData.ts b/packages/nc-gui/composables/useMultiSelect/convertCellData.ts
new file mode 100644
index 0000000000..7e4626aeaf
--- /dev/null
+++ b/packages/nc-gui/composables/useMultiSelect/convertCellData.ts
@@ -0,0 +1,83 @@
+import dayjs from 'dayjs'
+import { UITypes } from 'nocodb-sdk'
+
+export default function convertCellData(args: { from: UITypes; to: UITypes; value: any }, isMysql = false) {
+ const { from, to, value } = args
+ if (from === to && ![UITypes.Attachment, UITypes.Date, UITypes.DateTime, UITypes.Time, UITypes.Year].includes(to)) {
+ return value
+ }
+
+ const dateFormat = isMysql ? 'YYYY-MM-DD HH:mm:ss' : 'YYYY-MM-DD HH:mm:ssZ'
+
+ switch (to) {
+ case UITypes.Number: {
+ const parsedNumber = Number(value)
+ if (isNaN(parsedNumber)) {
+ throw new TypeError(`Cannot convert '${value}' to number`)
+ }
+ return parsedNumber
+ }
+ case UITypes.Checkbox:
+ return Boolean(value)
+ case UITypes.Date: {
+ const parsedDate = dayjs(value)
+ if (!parsedDate.isValid()) throw new Error('Not a valid date')
+ return parsedDate.format('YYYY-MM-DD')
+ }
+ case UITypes.DateTime: {
+ const parsedDateTime = dayjs(value)
+ if (!parsedDateTime.isValid()) {
+ throw new Error('Not a valid datetime value')
+ }
+ return parsedDateTime.format(dateFormat)
+ }
+ case UITypes.Time: {
+ let parsedTime = dayjs(value)
+
+ if (!parsedTime.isValid()) {
+ parsedTime = dayjs(value, 'HH:mm:ss')
+ }
+ if (!parsedTime.isValid()) {
+ parsedTime = dayjs(`1999-01-01 ${value}`)
+ }
+ if (!parsedTime.isValid()) {
+ throw new Error('Not a valid time value')
+ }
+ return parsedTime.format(dateFormat)
+ }
+ case UITypes.Year: {
+ if (/^\d+$/.test(value)) {
+ return +value
+ }
+
+ const parsedDate = dayjs(value)
+
+ if (parsedDate.isValid()) {
+ return parsedDate.format('YYYY')
+ }
+
+ throw new Error('Not a valid year value')
+ }
+ case UITypes.Attachment: {
+ let parsedVal
+ try {
+ parsedVal = typeof value === 'string' ? JSON.parse(value) : value
+ parsedVal = Array.isArray(parsedVal) ? parsedVal : [parsedVal]
+ } catch (e) {
+ throw new Error('Invalid attachment data')
+ }
+ if (parsedVal.some((v: any) => v && !(v.url || v.data))) {
+ throw new Error('Invalid attachment data')
+ }
+ return JSON.stringify(parsedVal)
+ }
+ case UITypes.LinkToAnotherRecord:
+ case UITypes.Lookup:
+ case UITypes.Rollup:
+ case UITypes.Formula:
+ case UITypes.QrCode:
+ throw new Error(`Unsupported conversion from ${from} to ${to}`)
+ default:
+ return value
+ }
+}
diff --git a/packages/nc-gui/composables/useMultiSelect/copyValue.ts b/packages/nc-gui/composables/useMultiSelect/copyValue.ts
new file mode 100644
index 0000000000..fec82fb7c9
--- /dev/null
+++ b/packages/nc-gui/composables/useMultiSelect/copyValue.ts
@@ -0,0 +1,29 @@
+import { UITypes } from '../../../nocodb-sdk'
+import type { ColumnType } from '../../../nocodb-sdk'
+import type { Row } from '~/lib'
+
+export const copyTable = async (rows: Row[], cols: ColumnType[]) => {
+ let copyHTML = ''
+ let copyPlainText = ''
+
+ rows.forEach((row) => {
+ let copyRow = ''
+ cols.forEach((col) => {
+ let value = (col.title && row.row[col.title]) ?? ''
+ if (typeof value === 'object') {
+ value = JSON.stringify(value)
+ }
+ copyRow += `${value} | `
+ copyPlainText = `${copyPlainText} ${value} \t`
+ })
+ copyHTML += `${copyRow} `
+ copyPlainText = `${copyPlainText.trim()}\n`
+ })
+ copyHTML += ' '
+ copyPlainText.trim()
+
+ const blobHTML = new Blob([copyHTML], { type: 'text/html' })
+ const blobPlainText = new Blob([copyPlainText], { type: 'text/plain' })
+
+ return navigator.clipboard.write([new ClipboardItem({ [blobHTML.type]: blobHTML, [blobPlainText.type]: blobPlainText })])
+}
diff --git a/packages/nc-gui/composables/useMultiSelect/index.ts b/packages/nc-gui/composables/useMultiSelect/index.ts
index 9b08d29554..dd4e645609 100644
--- a/packages/nc-gui/composables/useMultiSelect/index.ts
+++ b/packages/nc-gui/composables/useMultiSelect/index.ts
@@ -1,124 +1,146 @@
import type { MaybeRef } from '@vueuse/core'
-import { UITypes } from 'nocodb-sdk'
-import { message, reactive, ref, unref, useCopy, useEventListener, useI18n } from '#imports'
-
-interface SelectedBlock {
- row: number | null
- col: number | null
-}
+import type { ColumnType, LinkToAnotherRecordType, TableType } from 'nocodb-sdk'
+import { RelationTypes, UITypes, isVirtualCol } from 'nocodb-sdk'
+import type { Cell } from './cellRange'
+import { CellRange } from './cellRange'
+import convertCellData from './convertCellData'
+import type { Row } from '~/lib'
+import {
+ copyTable,
+ extractPkFromRow,
+ extractSdkResponseErrorMsg,
+ isMac,
+ message,
+ reactive,
+ ref,
+ unref,
+ useCopy,
+ useEventListener,
+ useI18n,
+ useMetas,
+ useProject,
+} from '#imports'
/**
* Utility to help with multi-selecting rows/cells in the smartsheet
*/
export function useMultiSelect(
- fields: MaybeRef,
- data: MaybeRef,
+ _meta: MaybeRef,
+ fields: MaybeRef,
+ data: MaybeRef,
_editEnabled: MaybeRef,
isPkAvail: MaybeRef,
clearCell: Function,
makeEditable: Function,
scrollToActiveCell?: (row?: number | null, col?: number | null) => void,
keyEventHandler?: Function,
+ syncCellData?: Function,
) {
+ const meta = ref(_meta)
+
const { t } = useI18n()
const { copy } = useCopy()
- const editEnabled = ref(_editEnabled)
+ const { getMeta } = useMetas()
- const selected = reactive({ row: null, col: null })
+ const { isMysql } = useProject()
- // save the first and the last column where the mouse is down while the value isSelectedRow is true
- const selectedRows = reactive({ startCol: NaN, endCol: NaN, startRow: NaN, endRow: NaN })
+ let clipboardContext = $ref<{ value: any; uidt: UITypes } | null>(null)
- // calculate the min and the max column where the mouse is down while the value isSelectedRow is true
- const rangeRows = reactive({ minRow: NaN, maxRow: NaN, minCol: NaN, maxCol: NaN })
+ const editEnabled = ref(_editEnabled)
- // check if mouse is down or up false=mouseup and true=mousedown
- let isSelectedBlock = $ref(false)
+ const selectedCell = reactive({ row: null, col: null })
+ const selectedRange = reactive(new CellRange())
+ let isMouseDown = $ref(false)
const columnLength = $computed(() => unref(fields)?.length)
+ async function copyValue(ctx?: Cell) {
+ try {
+ if (!selectedRange.isEmpty()) {
+ const cprows = unref(data).slice(selectedRange.start.row, selectedRange.end.row + 1) // slice the selected rows for copy
+ const cpcols = unref(fields).slice(selectedRange.start.col, selectedRange.end.col + 1) // slice the selected cols for copy
+
+ await copyTable(cprows, cpcols)
+ message.success(t('msg.info.copiedToClipboard'))
+ } else {
+ // if copy was called with context (right click position) - copy value from context
+ // else if there is just one selected cell, copy it's value
+ const cpRow = ctx?.row ?? selectedCell?.row
+ const cpCol = ctx?.col ?? selectedCell?.col
+
+ if (cpRow != null && cpCol != null) {
+ const rowObj = unref(data)[cpRow]
+ const columnObj = unref(fields)[cpCol]
+
+ let textToCopy = (columnObj.title && rowObj.row[columnObj.title]) || ''
+
+ if (columnObj.uidt === UITypes.Checkbox) {
+ textToCopy = !!textToCopy
+ }
+
+ if (typeof textToCopy === 'object') {
+ textToCopy = JSON.stringify(textToCopy)
+ }
+ await copy(textToCopy)
+ message.success(t('msg.info.copiedToClipboard'))
+ }
+ }
+ } catch {
+ message.error(t('msg.error.copyToClipboardError'))
+ }
+ }
+
function selectCell(row: number, col: number) {
- clearRangeRows()
- if (selected.row === row && selected.col === col) return
+ selectedRange.clear()
+ if (selectedCell.row === row && selectedCell.col === col) return
editEnabled.value = false
- selected.row = row
- selected.col = col
+ selectedCell.row = row
+ selectedCell.col = col
}
- function selectBlock(row: number, col: number) {
- // if selected.col and selected.row are null and isSelectedBlock is true that means you are selecting a block
- if (selected.col === null || selected.row === null) {
- if (isSelectedBlock) {
- // save the next value after the selectionStart
- selectedRows.endCol = col
- selectedRows.endRow = row
- }
- } else if (selected.col !== col || selected.row !== row) {
- // if selected.col and selected.row is not null but the selected col and row is not equal at the row and col where the mouse is clicking
- // and isSelectedBlock is true that means you are selecting a block
- if (isSelectedBlock) {
- selected.col = null
- selected.row = null
- // save the next value after the selectionStart
- selectedRows.endCol = col
- selectedRows.endRow = row
- }
+ function endSelectRange(row: number, col: number) {
+ if (!isMouseDown) {
+ return
}
+ selectedCell.row = null
+ selectedCell.col = null
+ selectedRange.endRange({ row, col })
}
- function selectedRange(row: number, col: number) {
- if (
- !isNaN(selectedRows.startRow) &&
- !isNaN(selectedRows.startCol) &&
- !isNaN(selectedRows.endRow) &&
- !isNaN(selectedRows.endCol)
- ) {
- // check if column selection is up or down
- rangeRows.minRow = Math.min(selectedRows.startRow, selectedRows.endRow)
- rangeRows.maxRow = Math.max(selectedRows.startRow, selectedRows.endRow)
- rangeRows.minCol = Math.min(selectedRows.startCol, selectedRows.endCol)
- rangeRows.maxCol = Math.max(selectedRows.startCol, selectedRows.endCol)
-
- // return if the column is in between the selection
- return col >= rangeRows.minCol && col <= rangeRows.maxCol && row >= rangeRows.minRow && row <= rangeRows.maxRow
- } else {
+ function isCellSelected(row: number, col: number) {
+ if (selectedCell?.row === row && selectedCell?.col === col) {
+ return true
+ }
+
+ if (selectedRange.isEmpty()) {
return false
}
+
+ return (
+ col >= selectedRange.start.col &&
+ col <= selectedRange.end.col &&
+ row >= selectedRange.start.row &&
+ row <= selectedRange.end.row
+ )
}
function startSelectRange(event: MouseEvent, row: number, col: number) {
- // if editEnabled but the selected col or the selected row is not equal like the actual row or col, enabled selected multiple rows
- if (unref(editEnabled) && (selected.col !== col || selected.row !== row)) {
- event.preventDefault()
- } else if (!unref(editEnabled)) {
- // if editEnabled is not true, enabled selected multiple rows
- event.preventDefault()
+ // if there was a right click on selected range, don't restart the selection
+ const leftClickButton = 0
+ if (event?.button !== leftClickButton && isCellSelected(row, col)) {
+ return
}
- // clear the selection when the mouse is down
- selectedRows.startCol = NaN
- selectedRows.endCol = NaN
- selectedRows.startRow = NaN
- selectedRows.endRow = NaN
- // asing where the selection start
- selectedRows.startCol = col
- selectedRows.startRow = row
- isSelectedBlock = true
- }
+ if (unref(editEnabled)) {
+ event.preventDefault()
+ return
+ }
- function clearRangeRows() {
- // when the selection starts or ends or when enter/arrow/tab is pressed
- // this clear the previous selection
- rangeRows.minCol = NaN
- rangeRows.maxCol = NaN
- rangeRows.minRow = NaN
- rangeRows.maxRow = NaN
- selectedRows.startRow = NaN
- selectedRows.startCol = NaN
- selectedRows.endRow = NaN
- selectedRows.endCol = NaN
+ isMouseDown = true
+ selectedRange.clear()
+ selectedRange.startRange({ row, col })
}
useEventListener(document, 'mouseup', (e) => {
@@ -127,7 +149,7 @@ export function useMultiSelect(
e.preventDefault()
}
- isSelectedBlock = false
+ isMouseDown = false
})
const onKeyDown = async (e: KeyboardEvent) => {
@@ -136,41 +158,36 @@ export function useMultiSelect(
return true
}
- if (
- !isNaN(selectedRows.startRow) &&
- !isNaN(selectedRows.startCol) &&
- !isNaN(selectedRows.endRow) &&
- !isNaN(selectedRows.endCol)
- ) {
+ if (!selectedRange.isEmpty()) {
// In case the user press tabs or arrows keys
- selected.row = selectedRows.startRow
- selected.col = selectedRows.startCol
+ selectedCell.row = selectedRange.start.row
+ selectedCell.col = selectedRange.start.col
}
- if (selected.row === null || selected.col === null) return
+ if (selectedCell.row === null || selectedCell.col === null) return
/** on tab key press navigate through cells */
switch (e.key) {
case 'Tab':
e.preventDefault()
- clearRangeRows()
+ selectedRange.clear()
if (e.shiftKey) {
- if (selected.col > 0) {
- selected.col--
+ if (selectedCell.col > 0) {
+ selectedCell.col--
editEnabled.value = false
- } else if (selected.row > 0) {
- selected.row--
- selected.col = unref(columnLength) - 1
+ } else if (selectedCell.row > 0) {
+ selectedCell.row--
+ selectedCell.col = unref(columnLength) - 1
editEnabled.value = false
}
} else {
- if (selected.col < unref(columnLength) - 1) {
- selected.col++
+ if (selectedCell.col < unref(columnLength) - 1) {
+ selectedCell.col++
editEnabled.value = false
- } else if (selected.row < unref(data).length - 1) {
- selected.row++
- selected.col = 0
+ } else if (selectedCell.row < unref(data).length - 1) {
+ selectedCell.row++
+ selectedCell.col = 0
editEnabled.value = false
}
}
@@ -179,91 +196,147 @@ export function useMultiSelect(
/** on enter key press make cell editable */
case 'Enter':
e.preventDefault()
- clearRangeRows()
- makeEditable(unref(data)[selected.row], unref(fields)[selected.col])
+ selectedRange.clear()
+ makeEditable(unref(data)[selectedCell.row], unref(fields)[selectedCell.col])
break
/** on delete key press clear cell */
case 'Delete':
e.preventDefault()
- clearRangeRows()
- await clearCell(selected as { row: number; col: number })
+ selectedRange.clear()
+ await clearCell(selectedCell as { row: number; col: number })
break
/** on arrow key press navigate through cells */
case 'ArrowRight':
e.preventDefault()
- clearRangeRows()
- if (selected.col < unref(columnLength) - 1) {
- selected.col++
+ selectedRange.clear()
+ if (selectedCell.col < unref(columnLength) - 1) {
+ selectedCell.col++
scrollToActiveCell?.()
editEnabled.value = false
}
break
case 'ArrowLeft':
- clearRangeRows()
+ selectedRange.clear()
e.preventDefault()
- clearRangeRows()
- if (selected.col > 0) {
- selected.col--
+ if (selectedCell.col > 0) {
+ selectedCell.col--
scrollToActiveCell?.()
editEnabled.value = false
}
break
case 'ArrowUp':
- clearRangeRows()
+ selectedRange.clear()
e.preventDefault()
- clearRangeRows()
- if (selected.row > 0) {
- selected.row--
+ if (selectedCell.row > 0) {
+ selectedCell.row--
scrollToActiveCell?.()
editEnabled.value = false
}
break
case 'ArrowDown':
- clearRangeRows()
+ selectedRange.clear()
e.preventDefault()
- clearRangeRows()
- if (selected.row < unref(data).length - 1) {
- selected.row++
+ if (selectedCell.row < unref(data).length - 1) {
+ selectedCell.row++
scrollToActiveCell?.()
editEnabled.value = false
}
break
default:
{
- const rowObj = unref(data)[selected.row]
-
- const columnObj = unref(fields)[selected.col]
-
- let cptext = '' // variable for save the text to be copy
-
- if (!isNaN(rangeRows.minRow) && !isNaN(rangeRows.maxRow) && !isNaN(rangeRows.minCol) && !isNaN(rangeRows.maxCol)) {
- const cprows = unref(data).slice(rangeRows.minRow, rangeRows.maxRow + 1) // slice the selected rows for copy
-
- const cpcols = unref(fields).slice(rangeRows.minCol, rangeRows.maxCol + 1) // slice the selected cols for copy
-
- cprows.forEach((row) => {
- cpcols.forEach((col) => {
- // todo: JSON stringify the attachment cell and LTAR contents for copy
- // filter attachment cells and LATR cells from copy
- if (col.uidt !== UITypes.Attachment && col.uidt !== UITypes.LinkToAnotherRecord) {
- cptext = `${cptext} ${row.row[col.title]} \t`
- }
- })
-
- cptext = `${cptext.trim()}\n`
- })
-
- cptext.trim()
- } else {
- cptext = rowObj.row[columnObj.title] || ''
- }
-
- if ((!unref(editEnabled) && e.metaKey) || e.ctrlKey) {
+ const rowObj = unref(data)[selectedCell.row]
+
+ const columnObj = unref(fields)[selectedCell.col]
+
+ if (
+ (!unref(editEnabled) ||
+ [
+ UITypes.DateTime,
+ UITypes.Date,
+ UITypes.Year,
+ UITypes.Time,
+ UITypes.Lookup,
+ UITypes.Rollup,
+ UITypes.Formula,
+ UITypes.Attachment,
+ UITypes.Checkbox,
+ UITypes.Rating,
+ ].includes(columnObj.uidt as UITypes)) &&
+ (isMac() ? e.metaKey : e.ctrlKey)
+ ) {
switch (e.keyCode) {
// copy - ctrl/cmd +c
case 67:
- await copy(cptext)
+ // set clipboard context only if single cell selected
+ if (rowObj.row[columnObj.title!]) {
+ clipboardContext = {
+ value: rowObj.row[columnObj.title!],
+ uidt: columnObj.uidt as UITypes,
+ }
+ } else {
+ clipboardContext = null
+ }
+ await copyValue()
break
+ case 86:
+ try {
+ // handle belongs to column
+ if (
+ columnObj.uidt === UITypes.LinkToAnotherRecord &&
+ (columnObj.colOptions as LinkToAnotherRecordType)?.type === RelationTypes.BELONGS_TO
+ ) {
+ if (!clipboardContext || typeof clipboardContext.value !== 'object') {
+ return message.info('Invalid data')
+ }
+ rowObj.row[columnObj.title!] = convertCellData(
+ {
+ value: clipboardContext.value,
+ from: clipboardContext.uidt,
+ to: columnObj.uidt as UITypes,
+ },
+ isMysql.value,
+ )
+ e.preventDefault()
+
+ const foreignKeyColumn = meta.value?.columns?.find(
+ (column: ColumnType) => column.id === (columnObj.colOptions as LinkToAnotherRecordType)?.fk_child_column_id,
+ )
+
+ const relatedTableMeta = await getMeta((columnObj.colOptions as LinkToAnotherRecordType).fk_related_model_id!)
+
+ if (!foreignKeyColumn) return
+
+ rowObj.row[foreignKeyColumn.title!] = extractPkFromRow(
+ clipboardContext.value,
+ (relatedTableMeta as any)!.columns!,
+ )
+
+ return await syncCellData?.({ ...selectedCell, updatedColumnTitle: foreignKeyColumn.title })
+ }
+
+ // if it's a virtual column excluding belongs to cell type skip paste
+ if (isVirtualCol(columnObj)) {
+ return message.info(t('msg.info.pasteNotSupported'))
+ }
+
+ if (clipboardContext) {
+ rowObj.row[columnObj.title!] = convertCellData(
+ {
+ value: clipboardContext.value,
+ from: clipboardContext.uidt,
+ to: columnObj.uidt as UITypes,
+ },
+ isMysql.value,
+ )
+ e.preventDefault()
+ syncCellData?.(selectedCell)
+ } else {
+ clearCell(selectedCell as { row: number; col: number }, true)
+ makeEditable(rowObj, columnObj)
+ }
+ } catch (error: any) {
+ message.error(await extractSdkResponseErrorMsg(error))
+ }
}
}
@@ -277,7 +350,7 @@ export function useMultiSelect(
// Update not allowed for table which doesn't have primary Key
return message.info(t('msg.info.updateNotAllowedWithoutPK'))
}
- if (makeEditable(rowObj, columnObj)) {
+ if (makeEditable(rowObj, columnObj) && columnObj.title) {
rowObj.row[columnObj.title] = ''
}
// editEnabled = true
@@ -291,12 +364,11 @@ export function useMultiSelect(
return {
selectCell,
- selectBlock,
- selectedRange,
- clearRangeRows,
startSelectRange,
- selected,
- selectedRows,
- rangeRows,
+ endSelectRange,
+ clearSelectedRange: selectedRange.clear.bind(selectedRange),
+ copyValue,
+ isCellSelected,
+ selectedCell,
}
}
diff --git a/packages/nc-gui/composables/useSharedView.ts b/packages/nc-gui/composables/useSharedView.ts
index a82a0ae135..c28df9ac7e 100644
--- a/packages/nc-gui/composables/useSharedView.ts
+++ b/packages/nc-gui/composables/useSharedView.ts
@@ -36,7 +36,11 @@ export function useSharedView() {
(meta.value as TableType)?.columns
?.filter(
(f: Record) =>
- f.show && f.uidt !== UITypes.Rollup && f.uidt !== UITypes.Lookup && f.uidt !== UITypes.Formula,
+ f.show &&
+ f.uidt !== UITypes.Rollup &&
+ f.uidt !== UITypes.Lookup &&
+ f.uidt !== UITypes.Formula &&
+ f.uidt !== UITypes.QrCode,
)
.sort((a: Record, b: Record) => a.order - b.order)
.map((c: Record) => ({ ...c, required: !!(c.required || 0) })) ?? [],
diff --git a/packages/nc-gui/composables/useShowNotEditableWarning.ts b/packages/nc-gui/composables/useShowNotEditableWarning.ts
new file mode 100644
index 0000000000..ffeea10cba
--- /dev/null
+++ b/packages/nc-gui/composables/useShowNotEditableWarning.ts
@@ -0,0 +1,21 @@
+const timeout = 3000 // in ms
+
+export default function useShowNotEditableWarning() {
+ const showEditNonEditableFieldWarning = refAutoReset(false, timeout)
+ const showClearNonEditableFieldWarning = refAutoReset(false, timeout)
+
+ const activateShowEditNonEditableFieldWarning = () => (showEditNonEditableFieldWarning.value = true)
+
+ useSelectedCellKeyupListener(inject(ActiveCellInj, ref(false)), (e: KeyboardEvent) => {
+ switch (e.key) {
+ case 'Enter':
+ showEditNonEditableFieldWarning.value = true
+ break
+ case 'Delete':
+ showClearNonEditableFieldWarning.value = true
+ break
+ }
+ })
+
+ return { showEditNonEditableFieldWarning, showClearNonEditableFieldWarning, activateShowEditNonEditableFieldWarning }
+}
diff --git a/packages/nc-gui/composables/useSmartsheetStore.ts b/packages/nc-gui/composables/useSmartsheetStore.ts
index 86d7590307..b4de1ce736 100644
--- a/packages/nc-gui/composables/useSmartsheetStore.ts
+++ b/packages/nc-gui/composables/useSmartsheetStore.ts
@@ -1,7 +1,8 @@
import { ViewTypes } from 'nocodb-sdk'
import type { FilterType, KanbanType, SortType, TableType, ViewType } from 'nocodb-sdk'
import type { Ref } from 'vue'
-import { computed, ref, unref, useFieldQuery, useInjectionState, useNuxtApp, useProject } from '#imports'
+import { computed, ref, unref, useEventBus, useFieldQuery, useInjectionState, useNuxtApp, useProject } from '#imports'
+import type { SmartsheetStoreEvents } from '~/lib'
const [useProvideSmartsheetStore, useSmartsheetStore] = useInjectionState(
(
@@ -19,6 +20,8 @@ const [useProvideSmartsheetStore, useSmartsheetStore] = useInjectionState(
const { search } = useFieldQuery(view)
+ const eventBus = useEventBus(Symbol('SmartsheetStore'))
+
// getters
const isLocked = computed(() => view.value?.lock_type === 'locked')
const isPkAvail = computed(() => (meta.value as TableType)?.columns?.some((c) => c.pk))
@@ -63,6 +66,7 @@ const [useProvideSmartsheetStore, useSmartsheetStore] = useInjectionState(
sorts,
nestedFilters,
isSqlView,
+ eventBus,
}
},
'smartsheet-store',
diff --git a/packages/nc-gui/composables/useViewData.ts b/packages/nc-gui/composables/useViewData.ts
index e8cfce4a2c..aa3c30391e 100644
--- a/packages/nc-gui/composables/useViewData.ts
+++ b/packages/nc-gui/composables/useViewData.ts
@@ -1,5 +1,5 @@
import { UITypes, ViewTypes } from 'nocodb-sdk'
-import type { Api, ColumnType, FormType, GalleryType, PaginatedType, TableType, ViewType } from 'nocodb-sdk'
+import type { Api, ColumnType, FormColumnType, FormType, GalleryType, PaginatedType, TableType, ViewType } from 'nocodb-sdk'
import type { ComputedRef, Ref } from 'vue'
import {
IsPublicInj,
@@ -54,7 +54,7 @@ export function useViewData(
const galleryData = ref()
- const formColumnData = ref()
+ const formColumnData = ref[]>()
const formViewData = ref()
@@ -289,7 +289,13 @@ export function useViewData(
Object.assign(
toUpdate.row,
metaValue!.columns!.reduce>((acc: Record, col: ColumnType) => {
- if (col.uidt === UITypes.Formula || col.uidt === UITypes.Rollup || col.au || col.cdf?.includes(' on update '))
+ if (
+ col.uidt === UITypes.Formula ||
+ col.uidt === UITypes.QrCode ||
+ col.uidt === UITypes.Rollup ||
+ col.au ||
+ col.cdf?.includes(' on update ')
+ )
acc[col.title!] = updatedRowData[col.title!]
return acc
}, {} as Record),
@@ -412,14 +418,14 @@ export function useViewData(
async function loadFormView() {
if (!viewMeta?.value?.id) return
try {
- const { columns, ...view } = (await $api.dbView.formRead(viewMeta.value.id)) as Record
+ const { columns, ...view } = await $api.dbView.formRead(viewMeta.value.id)
- const fieldById = columns.reduce(
+ const fieldById = (columns || []).reduce(
(o: Record, f: Record) => ({
...o,
[f.fk_column_id]: f,
}),
- {},
+ {} as Record,
)
let order = 1
diff --git a/packages/nc-gui/context/index.ts b/packages/nc-gui/context/index.ts
index 21278b9876..5cbff053fa 100644
--- a/packages/nc-gui/context/index.ts
+++ b/packages/nc-gui/context/index.ts
@@ -26,7 +26,7 @@ export const ReloadViewDataHookInj: InjectionKey> = Sy
export const ReloadViewMetaHookInj: InjectionKey> = Symbol('reload-view-meta-injection')
export const ReloadRowDataHookInj: InjectionKey> = Symbol('reload-row-data-injection')
export const OpenNewRecordFormHookInj: InjectionKey> = Symbol('open-new-record-form-injection')
-export const FieldsInj: InjectionKey[> = Symbol('fields-injection')
+export const FieldsInj: InjectionKey][> = Symbol('fields-injection')
export const EditModeInj: InjectionKey][> = Symbol('edit-mode-injection')
export const SharedViewPasswordInj: InjectionKey][> = Symbol('shared-view-password-injection')
export const CellUrlDisableOverlayInj: InjectionKey][> = Symbol('cell-url-disable-url')
diff --git a/packages/nc-gui/lang/ar.json b/packages/nc-gui/lang/ar.json
index 4b065ce319..4b6cd4a2ae 100644
--- a/packages/nc-gui/lang/ar.json
+++ b/packages/nc-gui/lang/ar.json
@@ -241,6 +241,8 @@
"created": "إنشاء",
"sqlOutput": "إخراج SQL",
"addOption": "إضافة خيار",
+ "qrCodeValueColumn": "Column with QR code value",
+ "qrCodeValueTooLong": "Too many characters for a QR code",
"aggregateFunction": "وظيفة التجميع",
"dbCreateIfNotExists": "قاعدة البيانات: إنشاء إذا لم يكن موجودا",
"clientKey": "مفتاح العميل",
@@ -487,6 +489,12 @@
"selectField": "حدد حقل"
},
"msg": {
+ "warning": {
+ "nonEditableFields": {
+ "computedFieldUnableToClear": "Warning: Computed field - unable to clear text",
+ "qrFieldsCannotBeDirectlyChanged": "Warning: QR fields cannot be directly changed."
+ }
+ },
"info": {
"roles": {
"orgCreator": "Creator can create new projects and access any invited project.",
@@ -666,7 +674,8 @@
"parameterKeyCannotBeEmpty": "Parameter key cannot be empty",
"duplicateParameterKeysAreNotAllowed": "Duplicate parameter keys are not allowed",
"fieldRequired": "{value} cannot be empty.",
- "projectNotAccessible": "Project not accessible"
+ "projectNotAccessible": "Project not accessible",
+ "copyToClipboardError": "Failed to copy to clipboard"
},
"toast": {
"exportMetadata": "تصدير البيانات الوصفية للمشروع بنجاح",
@@ -686,6 +695,7 @@
"futureRelease": "قريبا!"
},
"success": {
+ "columnDuplicated": "Column duplicated successfully",
"updatedUIACL": "تم تحديث ACL واجهة المستخدم للجداول بنجاح",
"pluginUninstalled": "تم إلغاء تثبيت الإضافة بنجاح",
"pluginSettingsSaved": "تم حفظ إعدادات الإضافة بنجاح",
diff --git a/packages/nc-gui/lang/bn_IN.json b/packages/nc-gui/lang/bn_IN.json
index aaa7d443f5..75cfb59176 100644
--- a/packages/nc-gui/lang/bn_IN.json
+++ b/packages/nc-gui/lang/bn_IN.json
@@ -241,6 +241,8 @@
"created": "তৈরি",
"sqlOutput": "এসকিউএল আউটপুট",
"addOption": "বিকল্প যোগ করুন",
+ "qrCodeValueColumn": "Column with QR code value",
+ "qrCodeValueTooLong": "Too many characters for a QR code",
"aggregateFunction": "সামগ্রিক ফাংশন",
"dbCreateIfNotExists": "ডাটাবেস: উপস্থিত না থাকলে তৈরি করুন",
"clientKey": "ক্লায়েন্ট কী",
@@ -487,6 +489,12 @@
"selectField": "Select field"
},
"msg": {
+ "warning": {
+ "nonEditableFields": {
+ "computedFieldUnableToClear": "Warning: Computed field - unable to clear text",
+ "qrFieldsCannotBeDirectlyChanged": "Warning: QR fields cannot be directly changed."
+ }
+ },
"info": {
"roles": {
"orgCreator": "Creator can create new projects and access any invited project.",
@@ -666,7 +674,8 @@
"parameterKeyCannotBeEmpty": "Parameter key cannot be empty",
"duplicateParameterKeysAreNotAllowed": "Duplicate parameter keys are not allowed",
"fieldRequired": "{value} cannot be empty.",
- "projectNotAccessible": "Project not accessible"
+ "projectNotAccessible": "Project not accessible",
+ "copyToClipboardError": "Failed to copy to clipboard"
},
"toast": {
"exportMetadata": "প্রকল্প মেটাডেটা সফলভাবে রফতানি করেছে",
@@ -686,6 +695,7 @@
"futureRelease": "শীঘ্রই আসছে!"
},
"success": {
+ "columnDuplicated": "Column duplicated successfully",
"updatedUIACL": "Updated UI ACL for tables successfully",
"pluginUninstalled": "Plugin uninstalled successfully",
"pluginSettingsSaved": "Plugin settings saved successfully",
diff --git a/packages/nc-gui/lang/da.json b/packages/nc-gui/lang/da.json
index 5e07bf3d1f..b91fd1a7dc 100644
--- a/packages/nc-gui/lang/da.json
+++ b/packages/nc-gui/lang/da.json
@@ -241,6 +241,8 @@
"created": "Oprettet",
"sqlOutput": "SQL Output.",
"addOption": "Tilføj option",
+ "qrCodeValueColumn": "Column with QR code value",
+ "qrCodeValueTooLong": "Too many characters for a QR code",
"aggregateFunction": "Aggregate Function.",
"dbCreateIfNotExists": "DATABASE: Opret, hvis ikke eksisterer",
"clientKey": "Klientnøgle",
@@ -487,6 +489,12 @@
"selectField": "Select field"
},
"msg": {
+ "warning": {
+ "nonEditableFields": {
+ "computedFieldUnableToClear": "Warning: Computed field - unable to clear text",
+ "qrFieldsCannotBeDirectlyChanged": "Warning: QR fields cannot be directly changed."
+ }
+ },
"info": {
"roles": {
"orgCreator": "Creator can create new projects and access any invited project.",
@@ -666,7 +674,8 @@
"parameterKeyCannotBeEmpty": "Parameter key cannot be empty",
"duplicateParameterKeysAreNotAllowed": "Duplicate parameter keys are not allowed",
"fieldRequired": "{value} cannot be empty.",
- "projectNotAccessible": "Project not accessible"
+ "projectNotAccessible": "Project not accessible",
+ "copyToClipboardError": "Failed to copy to clipboard"
},
"toast": {
"exportMetadata": "Project Metadata eksporteres med succes",
@@ -686,6 +695,7 @@
"futureRelease": "Kommer snart!"
},
"success": {
+ "columnDuplicated": "Column duplicated successfully",
"updatedUIACL": "Updated UI ACL for tables successfully",
"pluginUninstalled": "Plugin uninstalled successfully",
"pluginSettingsSaved": "Plugin settings saved successfully",
diff --git a/packages/nc-gui/lang/de.json b/packages/nc-gui/lang/de.json
index f3ebb8b4ff..d0bfeb835d 100644
--- a/packages/nc-gui/lang/de.json
+++ b/packages/nc-gui/lang/de.json
@@ -241,6 +241,8 @@
"created": "Erstellt",
"sqlOutput": "SQL-Ausgabe",
"addOption": "Option hinzufügen",
+ "qrCodeValueColumn": "Column with QR code value",
+ "qrCodeValueTooLong": "Too many characters for a QR code",
"aggregateFunction": "Globale Funktion",
"dbCreateIfNotExists": "Datenbank: Erstellen, falls nicht vorhanden",
"clientKey": "Client-Schlüssel",
@@ -487,6 +489,12 @@
"selectField": "Select field"
},
"msg": {
+ "warning": {
+ "nonEditableFields": {
+ "computedFieldUnableToClear": "Warning: Computed field - unable to clear text",
+ "qrFieldsCannotBeDirectlyChanged": "Warning: QR fields cannot be directly changed."
+ }
+ },
"info": {
"roles": {
"orgCreator": "Creator can create new projects and access any invited project.",
@@ -666,7 +674,8 @@
"parameterKeyCannotBeEmpty": "Parameter key cannot be empty",
"duplicateParameterKeysAreNotAllowed": "Duplicate parameter keys are not allowed",
"fieldRequired": "{value} cannot be empty.",
- "projectNotAccessible": "Project not accessible"
+ "projectNotAccessible": "Project not accessible",
+ "copyToClipboardError": "Failed to copy to clipboard"
},
"toast": {
"exportMetadata": "Projektmetadaten erfolgreich exportiert",
@@ -686,6 +695,7 @@
"futureRelease": "Kommt bald!"
},
"success": {
+ "columnDuplicated": "Column duplicated successfully",
"updatedUIACL": "Updated UI ACL for tables successfully",
"pluginUninstalled": "Plugin erfolgreich deinstalliert",
"pluginSettingsSaved": "Plugin-Einstellungen erfolgreich gespeichert",
diff --git a/packages/nc-gui/lang/en.json b/packages/nc-gui/lang/en.json
index bd19e8ad4a..09c4984f1c 100644
--- a/packages/nc-gui/lang/en.json
+++ b/packages/nc-gui/lang/en.json
@@ -199,7 +199,8 @@
"quickImportFrom": "Quick Import From",
"quickImport": "Quick Import",
"advancedSettings": "Advanced Settings",
- "codeSnippet": "Code Snippet"
+ "codeSnippet": "Code Snippet",
+ "keyboardShortcut": "Keyboard Shortcuts"
},
"labels": {
"createdBy": "Created By",
@@ -241,6 +242,8 @@
"created": "Created",
"sqlOutput": "SQL Output",
"addOption": "Add option",
+ "qrCodeValueColumn": "Column with QR code value",
+ "qrCodeValueTooLong": "Too many characters for a QR code",
"aggregateFunction": "Aggregate function",
"dbCreateIfNotExists": "Database : create if not exists",
"clientKey": "Client Key",
@@ -487,7 +490,14 @@
"selectField": "Select field"
},
"msg": {
+ "warning": {
+ "nonEditableFields": {
+ "computedFieldUnableToClear": "Warning: Computed field - unable to clear text",
+ "qrFieldsCannotBeDirectlyChanged": "Warning: QR fields cannot be directly changed."
+ }
+ },
"info": {
+ "pasteNotSupported": "Paste operation is not supported on the active cell",
"roles": {
"orgCreator": "Creator can create new projects and access any invited project.",
"orgViewer": "Viewer is not allowed to create new projects but they can access any invited project."
@@ -605,7 +615,9 @@
"deleteViewConfirmation": "Are you sure you want to delete this view?",
"deleteTableConfirmation": "Do you want to delete the table",
"showM2mTables": "Show M2M Tables",
- "deleteKanbanStackConfirmation": "Deleting this stack will also remove the select option `{stackToBeDeleted}` from the `{groupingField}`. The records will move to the uncategorized stack."
+ "deleteKanbanStackConfirmation": "Deleting this stack will also remove the select option `{stackToBeDeleted}` from the `{groupingField}`. The records will move to the uncategorized stack.",
+ "computedFieldEditWarning": "Computed field: contents are read-only. Use column edit menu to reconfigure",
+ "computedFieldDeleteWarning": "Computed field: contents are read-only. Unable to clear content."
},
"error": {
"searchProject": "Your search for {search} found no results",
@@ -666,7 +678,8 @@
"parameterKeyCannotBeEmpty": "Parameter key cannot be empty",
"duplicateParameterKeysAreNotAllowed": "Duplicate parameter keys are not allowed",
"fieldRequired": "{value} cannot be empty.",
- "projectNotAccessible": "Project not accessible"
+ "projectNotAccessible": "Project not accessible",
+ "copyToClipboardError": "Failed to copy to clipboard"
},
"toast": {
"exportMetadata": "Project metadata exported successfully",
@@ -686,6 +699,7 @@
"futureRelease": "Coming soon!"
},
"success": {
+ "columnDuplicated": "Column duplicated successfully",
"updatedUIACL": "Updated UI ACL for tables successfully",
"pluginUninstalled": "Plugin uninstalled successfully",
"pluginSettingsSaved": "Plugin settings saved successfully",
diff --git a/packages/nc-gui/lang/es.json b/packages/nc-gui/lang/es.json
index 8e98ddc391..0b1aa5c1fa 100644
--- a/packages/nc-gui/lang/es.json
+++ b/packages/nc-gui/lang/es.json
@@ -241,6 +241,8 @@
"created": "Creado",
"sqlOutput": "Salida SQL",
"addOption": "Añadir opción",
+ "qrCodeValueColumn": "Column with QR code value",
+ "qrCodeValueTooLong": "Too many characters for a QR code",
"aggregateFunction": "Función agregada",
"dbCreateIfNotExists": "Base de datos : Crear si no existe",
"clientKey": "Clave de Cliente",
@@ -487,6 +489,12 @@
"selectField": "Select field"
},
"msg": {
+ "warning": {
+ "nonEditableFields": {
+ "computedFieldUnableToClear": "Warning: Computed field - unable to clear text",
+ "qrFieldsCannotBeDirectlyChanged": "Warning: QR fields cannot be directly changed."
+ }
+ },
"info": {
"roles": {
"orgCreator": "Creator can create new projects and access any invited project.",
@@ -666,7 +674,8 @@
"parameterKeyCannotBeEmpty": "Parameter key cannot be empty",
"duplicateParameterKeysAreNotAllowed": "Duplicate parameter keys are not allowed",
"fieldRequired": "{value} cannot be empty.",
- "projectNotAccessible": "Project not accessible"
+ "projectNotAccessible": "Project not accessible",
+ "copyToClipboardError": "Failed to copy to clipboard"
},
"toast": {
"exportMetadata": "Metadatos del proyecto exportados con éxito.",
@@ -686,6 +695,7 @@
"futureRelease": "¡Próximamente!"
},
"success": {
+ "columnDuplicated": "Column duplicated successfully",
"updatedUIACL": "Updated UI ACL for tables successfully",
"pluginUninstalled": "Plugin uninstalled successfully",
"pluginSettingsSaved": "Plugin settings saved successfully",
diff --git a/packages/nc-gui/lang/fa.json b/packages/nc-gui/lang/fa.json
index 5fe34c4a89..a7f85075d3 100644
--- a/packages/nc-gui/lang/fa.json
+++ b/packages/nc-gui/lang/fa.json
@@ -241,6 +241,8 @@
"created": "ایجاد شده",
"sqlOutput": "خروجی SQL",
"addOption": "افزودن گزینه",
+ "qrCodeValueColumn": "Column with QR code value",
+ "qrCodeValueTooLong": "Too many characters for a QR code",
"aggregateFunction": "تابع جمع",
"dbCreateIfNotExists": "پایگاه داده: ایجاد در صورت عدم وجود",
"clientKey": "کلید Client",
@@ -487,6 +489,12 @@
"selectField": "Select field"
},
"msg": {
+ "warning": {
+ "nonEditableFields": {
+ "computedFieldUnableToClear": "Warning: Computed field - unable to clear text",
+ "qrFieldsCannotBeDirectlyChanged": "Warning: QR fields cannot be directly changed."
+ }
+ },
"info": {
"roles": {
"orgCreator": "Creator can create new projects and access any invited project.",
@@ -666,7 +674,8 @@
"parameterKeyCannotBeEmpty": "Parameter key cannot be empty",
"duplicateParameterKeysAreNotAllowed": "Duplicate parameter keys are not allowed",
"fieldRequired": "{value} cannot be empty.",
- "projectNotAccessible": "Project not accessible"
+ "projectNotAccessible": "Project not accessible",
+ "copyToClipboardError": "Failed to copy to clipboard"
},
"toast": {
"exportMetadata": "فراداده پروژه با موفقیت خارج شد",
@@ -686,6 +695,7 @@
"futureRelease": "به زودی!"
},
"success": {
+ "columnDuplicated": "Column duplicated successfully",
"updatedUIACL": "Updated UI ACL for tables successfully",
"pluginUninstalled": "Plugin uninstalled successfully",
"pluginSettingsSaved": "Plugin settings saved successfully",
diff --git a/packages/nc-gui/lang/fi.json b/packages/nc-gui/lang/fi.json
index e19380b494..2f9d29c218 100644
--- a/packages/nc-gui/lang/fi.json
+++ b/packages/nc-gui/lang/fi.json
@@ -241,6 +241,8 @@
"created": "Luotu",
"sqlOutput": "SQL-lähtö",
"addOption": "Lisää vaihtoehto",
+ "qrCodeValueColumn": "Column with QR code value",
+ "qrCodeValueTooLong": "Too many characters for a QR code",
"aggregateFunction": "Kokonaistoiminto",
"dbCreateIfNotExists": "Tietokanta: Luo jos ei ole olemassa",
"clientKey": "Asiakasnäppäin",
@@ -487,6 +489,12 @@
"selectField": "Select field"
},
"msg": {
+ "warning": {
+ "nonEditableFields": {
+ "computedFieldUnableToClear": "Warning: Computed field - unable to clear text",
+ "qrFieldsCannotBeDirectlyChanged": "Warning: QR fields cannot be directly changed."
+ }
+ },
"info": {
"roles": {
"orgCreator": "Creator can create new projects and access any invited project.",
@@ -666,7 +674,8 @@
"parameterKeyCannotBeEmpty": "Parameter key cannot be empty",
"duplicateParameterKeysAreNotAllowed": "Duplicate parameter keys are not allowed",
"fieldRequired": "{value} cannot be empty.",
- "projectNotAccessible": "Project not accessible"
+ "projectNotAccessible": "Project not accessible",
+ "copyToClipboardError": "Failed to copy to clipboard"
},
"toast": {
"exportMetadata": "Project Metadata viedään onnistuneesti",
@@ -686,6 +695,7 @@
"futureRelease": "Tulossa pian!"
},
"success": {
+ "columnDuplicated": "Column duplicated successfully",
"updatedUIACL": "Updated UI ACL for tables successfully",
"pluginUninstalled": "Plugin uninstalled successfully",
"pluginSettingsSaved": "Plugin settings saved successfully",
diff --git a/packages/nc-gui/lang/fr.json b/packages/nc-gui/lang/fr.json
index 188d120826..bac9e43ed7 100644
--- a/packages/nc-gui/lang/fr.json
+++ b/packages/nc-gui/lang/fr.json
@@ -241,6 +241,8 @@
"created": "Créé",
"sqlOutput": "Sortie SQL",
"addOption": "Ajouter une option",
+ "qrCodeValueColumn": "Column with QR code value",
+ "qrCodeValueTooLong": "Too many characters for a QR code",
"aggregateFunction": "Fonction agrégée",
"dbCreateIfNotExists": "Base de données : la créer si elle n'existe pas",
"clientKey": "Clé client",
@@ -487,6 +489,12 @@
"selectField": "Select field"
},
"msg": {
+ "warning": {
+ "nonEditableFields": {
+ "computedFieldUnableToClear": "Warning: Computed field - unable to clear text",
+ "qrFieldsCannotBeDirectlyChanged": "Warning: QR fields cannot be directly changed."
+ }
+ },
"info": {
"roles": {
"orgCreator": "Creator can create new projects and access any invited project.",
@@ -666,7 +674,8 @@
"parameterKeyCannotBeEmpty": "Parameter key cannot be empty",
"duplicateParameterKeysAreNotAllowed": "Duplicate parameter keys are not allowed",
"fieldRequired": "{value} cannot be empty.",
- "projectNotAccessible": "Project not accessible"
+ "projectNotAccessible": "Project not accessible",
+ "copyToClipboardError": "Failed to copy to clipboard"
},
"toast": {
"exportMetadata": "Les métadonnées de projet sont exportées avec succès",
@@ -686,6 +695,7 @@
"futureRelease": "Bientôt disponible !"
},
"success": {
+ "columnDuplicated": "Column duplicated successfully",
"updatedUIACL": "Updated UI ACL for tables successfully",
"pluginUninstalled": "Plugin uninstalled successfully",
"pluginSettingsSaved": "Plugin settings saved successfully",
diff --git a/packages/nc-gui/lang/he.json b/packages/nc-gui/lang/he.json
index f9501712f7..d23891ac25 100644
--- a/packages/nc-gui/lang/he.json
+++ b/packages/nc-gui/lang/he.json
@@ -241,6 +241,8 @@
"created": "נוצר",
"sqlOutput": "פלט SQL",
"addOption": "הוסף אפשרות",
+ "qrCodeValueColumn": "Column with QR code value",
+ "qrCodeValueTooLong": "Too many characters for a QR code",
"aggregateFunction": "פונקציה מצטברת",
"dbCreateIfNotExists": "מסד נתונים: צור אם לא קיים",
"clientKey": "מפתח הלקוח",
@@ -487,6 +489,12 @@
"selectField": "Select field"
},
"msg": {
+ "warning": {
+ "nonEditableFields": {
+ "computedFieldUnableToClear": "Warning: Computed field - unable to clear text",
+ "qrFieldsCannotBeDirectlyChanged": "Warning: QR fields cannot be directly changed."
+ }
+ },
"info": {
"roles": {
"orgCreator": "Creator can create new projects and access any invited project.",
@@ -666,7 +674,8 @@
"parameterKeyCannotBeEmpty": "Parameter key cannot be empty",
"duplicateParameterKeysAreNotAllowed": "Duplicate parameter keys are not allowed",
"fieldRequired": "{value} cannot be empty.",
- "projectNotAccessible": "Project not accessible"
+ "projectNotAccessible": "Project not accessible",
+ "copyToClipboardError": "Failed to copy to clipboard"
},
"toast": {
"exportMetadata": "פרויקט Metadata מיוצא בהצלחה",
@@ -686,6 +695,7 @@
"futureRelease": "בקרוב!"
},
"success": {
+ "columnDuplicated": "Column duplicated successfully",
"updatedUIACL": "Updated UI ACL for tables successfully",
"pluginUninstalled": "Plugin uninstalled successfully",
"pluginSettingsSaved": "Plugin settings saved successfully",
diff --git a/packages/nc-gui/lang/hi.json b/packages/nc-gui/lang/hi.json
index fdd21d3c66..d23e1b8b41 100644
--- a/packages/nc-gui/lang/hi.json
+++ b/packages/nc-gui/lang/hi.json
@@ -241,6 +241,8 @@
"created": "बनाया था",
"sqlOutput": "SQL आउटपुट",
"addOption": "विकल्प जोड़े",
+ "qrCodeValueColumn": "Column with QR code value",
+ "qrCodeValueTooLong": "Too many characters for a QR code",
"aggregateFunction": "कुल समारोह",
"dbCreateIfNotExists": "डेटाबेस: बनाएं यदि मौजूद नहीं है",
"clientKey": "ग्राहक कुंजी",
@@ -487,6 +489,12 @@
"selectField": "Select field"
},
"msg": {
+ "warning": {
+ "nonEditableFields": {
+ "computedFieldUnableToClear": "Warning: Computed field - unable to clear text",
+ "qrFieldsCannotBeDirectlyChanged": "Warning: QR fields cannot be directly changed."
+ }
+ },
"info": {
"roles": {
"orgCreator": "Creator can create new projects and access any invited project.",
@@ -666,7 +674,8 @@
"parameterKeyCannotBeEmpty": "Parameter key cannot be empty",
"duplicateParameterKeysAreNotAllowed": "Duplicate parameter keys are not allowed",
"fieldRequired": "{value} cannot be empty.",
- "projectNotAccessible": "Project not accessible"
+ "projectNotAccessible": "Project not accessible",
+ "copyToClipboardError": "Failed to copy to clipboard"
},
"toast": {
"exportMetadata": "परियोजना मेटाडेटा सफलतापूर्वक निर्यात की गई",
@@ -686,6 +695,7 @@
"futureRelease": "जल्द आ रहा है!"
},
"success": {
+ "columnDuplicated": "Column duplicated successfully",
"updatedUIACL": "Updated UI ACL for tables successfully",
"pluginUninstalled": "Plugin uninstalled successfully",
"pluginSettingsSaved": "Plugin settings saved successfully",
diff --git a/packages/nc-gui/lang/hr.json b/packages/nc-gui/lang/hr.json
index 01cd148906..091cc0e325 100644
--- a/packages/nc-gui/lang/hr.json
+++ b/packages/nc-gui/lang/hr.json
@@ -241,6 +241,8 @@
"created": "Stvoren",
"sqlOutput": "SQL izlaz",
"addOption": "Dodajte opciju",
+ "qrCodeValueColumn": "Column with QR code value",
+ "qrCodeValueTooLong": "Too many characters for a QR code",
"aggregateFunction": "Agregatna funkcija",
"dbCreateIfNotExists": "Baza podataka: stvoriti ako ne postoji",
"clientKey": "Ključ klijenta",
@@ -487,6 +489,12 @@
"selectField": "Select field"
},
"msg": {
+ "warning": {
+ "nonEditableFields": {
+ "computedFieldUnableToClear": "Warning: Computed field - unable to clear text",
+ "qrFieldsCannotBeDirectlyChanged": "Warning: QR fields cannot be directly changed."
+ }
+ },
"info": {
"roles": {
"orgCreator": "Creator can create new projects and access any invited project.",
@@ -666,7 +674,8 @@
"parameterKeyCannotBeEmpty": "Parameter key cannot be empty",
"duplicateParameterKeysAreNotAllowed": "Duplicate parameter keys are not allowed",
"fieldRequired": "{value} cannot be empty.",
- "projectNotAccessible": "Project not accessible"
+ "projectNotAccessible": "Project not accessible",
+ "copyToClipboardError": "Failed to copy to clipboard"
},
"toast": {
"exportMetadata": "Projektni metapodaci su uspješno izvozili",
@@ -686,6 +695,7 @@
"futureRelease": "Dolazi uskoro!"
},
"success": {
+ "columnDuplicated": "Column duplicated successfully",
"updatedUIACL": "Updated UI ACL for tables successfully",
"pluginUninstalled": "Plugin uninstalled successfully",
"pluginSettingsSaved": "Plugin settings saved successfully",
diff --git a/packages/nc-gui/lang/id.json b/packages/nc-gui/lang/id.json
index afe46061b1..1b464d2f64 100644
--- a/packages/nc-gui/lang/id.json
+++ b/packages/nc-gui/lang/id.json
@@ -241,6 +241,8 @@
"created": "Dibuat.",
"sqlOutput": "SQL Output",
"addOption": "Tambahkan opsi",
+ "qrCodeValueColumn": "Column with QR code value",
+ "qrCodeValueTooLong": "Too many characters for a QR code",
"aggregateFunction": "Fungsi agregat.",
"dbCreateIfNotExists": "Basis Data: Buat jika tidak ada",
"clientKey": "Kunci klien",
@@ -487,6 +489,12 @@
"selectField": "Select field"
},
"msg": {
+ "warning": {
+ "nonEditableFields": {
+ "computedFieldUnableToClear": "Warning: Computed field - unable to clear text",
+ "qrFieldsCannotBeDirectlyChanged": "Warning: QR fields cannot be directly changed."
+ }
+ },
"info": {
"roles": {
"orgCreator": "Creator can create new projects and access any invited project.",
@@ -666,7 +674,8 @@
"parameterKeyCannotBeEmpty": "Parameter key cannot be empty",
"duplicateParameterKeysAreNotAllowed": "Duplicate parameter keys are not allowed",
"fieldRequired": "{value} cannot be empty.",
- "projectNotAccessible": "Project not accessible"
+ "projectNotAccessible": "Project not accessible",
+ "copyToClipboardError": "Failed to copy to clipboard"
},
"toast": {
"exportMetadata": "Metadata proyek berhasil diekspor",
@@ -686,6 +695,7 @@
"futureRelease": "Segera akan datang!"
},
"success": {
+ "columnDuplicated": "Column duplicated successfully",
"updatedUIACL": "Updated UI ACL for tables successfully",
"pluginUninstalled": "Plugin uninstalled successfully",
"pluginSettingsSaved": "Plugin settings saved successfully",
diff --git a/packages/nc-gui/lang/it.json b/packages/nc-gui/lang/it.json
index 8714d8618a..da972977ef 100644
--- a/packages/nc-gui/lang/it.json
+++ b/packages/nc-gui/lang/it.json
@@ -241,6 +241,8 @@
"created": "Creato",
"sqlOutput": "Output SQL",
"addOption": "Aggiungi opzione",
+ "qrCodeValueColumn": "Column with QR code value",
+ "qrCodeValueTooLong": "Too many characters for a QR code",
"aggregateFunction": "Aggrega funzione",
"dbCreateIfNotExists": "Database: crea se non esiste",
"clientKey": "Chiave client",
@@ -487,6 +489,12 @@
"selectField": "Select field"
},
"msg": {
+ "warning": {
+ "nonEditableFields": {
+ "computedFieldUnableToClear": "Warning: Computed field - unable to clear text",
+ "qrFieldsCannotBeDirectlyChanged": "Warning: QR fields cannot be directly changed."
+ }
+ },
"info": {
"roles": {
"orgCreator": "Creator can create new projects and access any invited project.",
@@ -666,7 +674,8 @@
"parameterKeyCannotBeEmpty": "Parameter key cannot be empty",
"duplicateParameterKeysAreNotAllowed": "Duplicate parameter keys are not allowed",
"fieldRequired": "{value} cannot be empty.",
- "projectNotAccessible": "Project not accessible"
+ "projectNotAccessible": "Project not accessible",
+ "copyToClipboardError": "Failed to copy to clipboard"
},
"toast": {
"exportMetadata": "Metadati del progetto esportati con successo",
@@ -686,6 +695,7 @@
"futureRelease": "Prossimamente!"
},
"success": {
+ "columnDuplicated": "Column duplicated successfully",
"updatedUIACL": "Updated UI ACL for tables successfully",
"pluginUninstalled": "Plugin uninstalled successfully",
"pluginSettingsSaved": "Plugin settings saved successfully",
diff --git a/packages/nc-gui/lang/ja.json b/packages/nc-gui/lang/ja.json
index b2806c2065..c37e1d9918 100644
--- a/packages/nc-gui/lang/ja.json
+++ b/packages/nc-gui/lang/ja.json
@@ -241,6 +241,8 @@
"created": "作成済",
"sqlOutput": "SQL出力",
"addOption": "オプションを追加",
+ "qrCodeValueColumn": "Column with QR code value",
+ "qrCodeValueTooLong": "Too many characters for a QR code",
"aggregateFunction": "集約関数",
"dbCreateIfNotExists": "データベース:存在しない場合は作成",
"clientKey": "クライアントキー",
@@ -487,6 +489,12 @@
"selectField": "Select field"
},
"msg": {
+ "warning": {
+ "nonEditableFields": {
+ "computedFieldUnableToClear": "Warning: Computed field - unable to clear text",
+ "qrFieldsCannotBeDirectlyChanged": "Warning: QR fields cannot be directly changed."
+ }
+ },
"info": {
"roles": {
"orgCreator": "Creator can create new projects and access any invited project.",
@@ -666,7 +674,8 @@
"parameterKeyCannotBeEmpty": "Parameter key cannot be empty",
"duplicateParameterKeysAreNotAllowed": "Duplicate parameter keys are not allowed",
"fieldRequired": "{value} cannot be empty.",
- "projectNotAccessible": "Project not accessible"
+ "projectNotAccessible": "Project not accessible",
+ "copyToClipboardError": "Failed to copy to clipboard"
},
"toast": {
"exportMetadata": "プロジェクトメタデータは正常にエクスポートされました",
@@ -686,6 +695,7 @@
"futureRelease": "近日公開!"
},
"success": {
+ "columnDuplicated": "Column duplicated successfully",
"updatedUIACL": "Updated UI ACL for tables successfully",
"pluginUninstalled": "Plugin uninstalled successfully",
"pluginSettingsSaved": "Plugin settings saved successfully",
diff --git a/packages/nc-gui/lang/ko.json b/packages/nc-gui/lang/ko.json
index 959693e71e..bdb7fa55d7 100644
--- a/packages/nc-gui/lang/ko.json
+++ b/packages/nc-gui/lang/ko.json
@@ -241,6 +241,8 @@
"created": "생성",
"sqlOutput": "SQL 출력",
"addOption": "옵션 추가",
+ "qrCodeValueColumn": "Column with QR code value",
+ "qrCodeValueTooLong": "Too many characters for a QR code",
"aggregateFunction": "집합 함수",
"dbCreateIfNotExists": "데이터베이스 : 존재하지 않는 경우 생성",
"clientKey": "클라이언트 키",
@@ -487,6 +489,12 @@
"selectField": "Select field"
},
"msg": {
+ "warning": {
+ "nonEditableFields": {
+ "computedFieldUnableToClear": "Warning: Computed field - unable to clear text",
+ "qrFieldsCannotBeDirectlyChanged": "Warning: QR fields cannot be directly changed."
+ }
+ },
"info": {
"roles": {
"orgCreator": "Creator can create new projects and access any invited project.",
@@ -666,7 +674,8 @@
"parameterKeyCannotBeEmpty": "Parameter key cannot be empty",
"duplicateParameterKeysAreNotAllowed": "Duplicate parameter keys are not allowed",
"fieldRequired": "{value} cannot be empty.",
- "projectNotAccessible": "Project not accessible"
+ "projectNotAccessible": "Project not accessible",
+ "copyToClipboardError": "Failed to copy to clipboard"
},
"toast": {
"exportMetadata": "프로젝트 메타 데이터를 성공적으로 내보냈습니다.",
@@ -686,6 +695,7 @@
"futureRelease": "Coming soon!"
},
"success": {
+ "columnDuplicated": "Column duplicated successfully",
"updatedUIACL": "Updated UI ACL for tables successfully",
"pluginUninstalled": "Plugin uninstalled successfully",
"pluginSettingsSaved": "Plugin settings saved successfully",
diff --git a/packages/nc-gui/lang/lv.json b/packages/nc-gui/lang/lv.json
index 0fa407eab1..a094a2dc6a 100644
--- a/packages/nc-gui/lang/lv.json
+++ b/packages/nc-gui/lang/lv.json
@@ -241,6 +241,8 @@
"created": "Izveidots",
"sqlOutput": "SQL izvade",
"addOption": "Pievienot iespēju",
+ "qrCodeValueColumn": "Column with QR code value",
+ "qrCodeValueTooLong": "Too many characters for a QR code",
"aggregateFunction": "Agregācijas funkcija",
"dbCreateIfNotExists": "Datubāze : izveidotm ja neeksistē",
"clientKey": "Klienta atslēga",
@@ -487,6 +489,12 @@
"selectField": "Select field"
},
"msg": {
+ "warning": {
+ "nonEditableFields": {
+ "computedFieldUnableToClear": "Warning: Computed field - unable to clear text",
+ "qrFieldsCannotBeDirectlyChanged": "Warning: QR fields cannot be directly changed."
+ }
+ },
"info": {
"roles": {
"orgCreator": "Creator can create new projects and access any invited project.",
@@ -666,7 +674,8 @@
"parameterKeyCannotBeEmpty": "Parameter key cannot be empty",
"duplicateParameterKeysAreNotAllowed": "Duplicate parameter keys are not allowed",
"fieldRequired": "{value} cannot be empty.",
- "projectNotAccessible": "Project not accessible"
+ "projectNotAccessible": "Project not accessible",
+ "copyToClipboardError": "Failed to copy to clipboard"
},
"toast": {
"exportMetadata": "Projekta metadati eksportēti veiksmīgi",
@@ -686,6 +695,7 @@
"futureRelease": "Drīzumā!"
},
"success": {
+ "columnDuplicated": "Column duplicated successfully",
"updatedUIACL": "Updated UI ACL for tables successfully",
"pluginUninstalled": "Plugin uninstalled successfully",
"pluginSettingsSaved": "Plugin settings saved successfully",
diff --git a/packages/nc-gui/lang/nl.json b/packages/nc-gui/lang/nl.json
index 130f087c3e..936ccc9192 100644
--- a/packages/nc-gui/lang/nl.json
+++ b/packages/nc-gui/lang/nl.json
@@ -241,6 +241,8 @@
"created": "Gemaakt",
"sqlOutput": "SQL Uitvoer",
"addOption": "Optie toevoegen",
+ "qrCodeValueColumn": "Column with QR code value",
+ "qrCodeValueTooLong": "Too many characters for a QR code",
"aggregateFunction": "Geaggregeerde functie",
"dbCreateIfNotExists": "Database: creëer als het niet bestaat",
"clientKey": "Client Key",
@@ -487,6 +489,12 @@
"selectField": "Select field"
},
"msg": {
+ "warning": {
+ "nonEditableFields": {
+ "computedFieldUnableToClear": "Warning: Computed field - unable to clear text",
+ "qrFieldsCannotBeDirectlyChanged": "Warning: QR fields cannot be directly changed."
+ }
+ },
"info": {
"roles": {
"orgCreator": "Creator can create new projects and access any invited project.",
@@ -666,7 +674,8 @@
"parameterKeyCannotBeEmpty": "Parameter key cannot be empty",
"duplicateParameterKeysAreNotAllowed": "Duplicate parameter keys are not allowed",
"fieldRequired": "{value} cannot be empty.",
- "projectNotAccessible": "Project not accessible"
+ "projectNotAccessible": "Project not accessible",
+ "copyToClipboardError": "Failed to copy to clipboard"
},
"toast": {
"exportMetadata": "Project metadata met succes geëxporteerd",
@@ -686,6 +695,7 @@
"futureRelease": "Binnenkort beschikbaar!"
},
"success": {
+ "columnDuplicated": "Column duplicated successfully",
"updatedUIACL": "Updated UI ACL for tables successfully",
"pluginUninstalled": "Plugin uninstalled successfully",
"pluginSettingsSaved": "Plugin settings saved successfully",
diff --git a/packages/nc-gui/lang/no.json b/packages/nc-gui/lang/no.json
index bc4f661903..49f217add9 100644
--- a/packages/nc-gui/lang/no.json
+++ b/packages/nc-gui/lang/no.json
@@ -241,6 +241,8 @@
"created": "Opprettet",
"sqlOutput": "SQL-utgang",
"addOption": "Legg til alternativ",
+ "qrCodeValueColumn": "Column with QR code value",
+ "qrCodeValueTooLong": "Too many characters for a QR code",
"aggregateFunction": "Samlet funksjon",
"dbCreateIfNotExists": "Database: Opprett hvis ikke eksisterer",
"clientKey": "Klientnøkkel",
@@ -487,6 +489,12 @@
"selectField": "Select field"
},
"msg": {
+ "warning": {
+ "nonEditableFields": {
+ "computedFieldUnableToClear": "Warning: Computed field - unable to clear text",
+ "qrFieldsCannotBeDirectlyChanged": "Warning: QR fields cannot be directly changed."
+ }
+ },
"info": {
"roles": {
"orgCreator": "Creator can create new projects and access any invited project.",
@@ -666,7 +674,8 @@
"parameterKeyCannotBeEmpty": "Parameter key cannot be empty",
"duplicateParameterKeysAreNotAllowed": "Duplicate parameter keys are not allowed",
"fieldRequired": "{value} cannot be empty.",
- "projectNotAccessible": "Project not accessible"
+ "projectNotAccessible": "Project not accessible",
+ "copyToClipboardError": "Failed to copy to clipboard"
},
"toast": {
"exportMetadata": "Prosjektmetadata eksporteres vellykket",
@@ -686,6 +695,7 @@
"futureRelease": "Kommer snart!"
},
"success": {
+ "columnDuplicated": "Column duplicated successfully",
"updatedUIACL": "Updated UI ACL for tables successfully",
"pluginUninstalled": "Plugin uninstalled successfully",
"pluginSettingsSaved": "Plugin settings saved successfully",
diff --git a/packages/nc-gui/lang/pl.json b/packages/nc-gui/lang/pl.json
index e089c10f0d..a258e39cc6 100644
--- a/packages/nc-gui/lang/pl.json
+++ b/packages/nc-gui/lang/pl.json
@@ -241,6 +241,8 @@
"created": "Utworzony",
"sqlOutput": "Wyjście SQL.",
"addOption": "Dodaj opcję.",
+ "qrCodeValueColumn": "Column with QR code value",
+ "qrCodeValueTooLong": "Too many characters for a QR code",
"aggregateFunction": "Funkcja kruszywa",
"dbCreateIfNotExists": "Baza danych: Utwórz, jeśli nie istnieje",
"clientKey": "Klucz klienta",
@@ -487,6 +489,12 @@
"selectField": "Wybierz pole"
},
"msg": {
+ "warning": {
+ "nonEditableFields": {
+ "computedFieldUnableToClear": "Warning: Computed field - unable to clear text",
+ "qrFieldsCannotBeDirectlyChanged": "Warning: QR fields cannot be directly changed."
+ }
+ },
"info": {
"roles": {
"orgCreator": "Creator can create new projects and access any invited project.",
@@ -666,7 +674,8 @@
"parameterKeyCannotBeEmpty": "Klucz parametru nie może być pusty",
"duplicateParameterKeysAreNotAllowed": "Zduplikowane klucze parametrów są niedozwolone",
"fieldRequired": "{value} nie może być puste.",
- "projectNotAccessible": "Project not accessible"
+ "projectNotAccessible": "Project not accessible",
+ "copyToClipboardError": "Failed to copy to clipboard"
},
"toast": {
"exportMetadata": "Pomyślnie wyeksportowano metadane projektu",
@@ -686,6 +695,7 @@
"futureRelease": "Wkrótce!"
},
"success": {
+ "columnDuplicated": "Column duplicated successfully",
"updatedUIACL": "Pomyślnie zaktualizowano UI ACL dla tabel",
"pluginUninstalled": "Wtyczka odinstalowana pomyślnie",
"pluginSettingsSaved": "Ustawienia wtyczki zapisane pomyślnie",
diff --git a/packages/nc-gui/lang/pt.json b/packages/nc-gui/lang/pt.json
index 1d340c27c4..07f8c9f863 100644
--- a/packages/nc-gui/lang/pt.json
+++ b/packages/nc-gui/lang/pt.json
@@ -241,6 +241,8 @@
"created": "Criado",
"sqlOutput": "Saída SQL.",
"addOption": "Adicionar opção",
+ "qrCodeValueColumn": "Column with QR code value",
+ "qrCodeValueTooLong": "Too many characters for a QR code",
"aggregateFunction": "Função agregada",
"dbCreateIfNotExists": "Base de Dados : criar se não existir",
"clientKey": "Chave do Cliente",
@@ -487,6 +489,12 @@
"selectField": "Select field"
},
"msg": {
+ "warning": {
+ "nonEditableFields": {
+ "computedFieldUnableToClear": "Warning: Computed field - unable to clear text",
+ "qrFieldsCannotBeDirectlyChanged": "Warning: QR fields cannot be directly changed."
+ }
+ },
"info": {
"roles": {
"orgCreator": "Creator can create new projects and access any invited project.",
@@ -666,7 +674,8 @@
"parameterKeyCannotBeEmpty": "Parameter key cannot be empty",
"duplicateParameterKeysAreNotAllowed": "Duplicate parameter keys are not allowed",
"fieldRequired": "{value} cannot be empty.",
- "projectNotAccessible": "Project not accessible"
+ "projectNotAccessible": "Project not accessible",
+ "copyToClipboardError": "Failed to copy to clipboard"
},
"toast": {
"exportMetadata": "Metadados do projeto exportado com sucesso",
@@ -686,6 +695,7 @@
"futureRelease": "Em breve!"
},
"success": {
+ "columnDuplicated": "Column duplicated successfully",
"updatedUIACL": "Updated UI ACL for tables successfully",
"pluginUninstalled": "Plugin uninstalled successfully",
"pluginSettingsSaved": "Plugin settings saved successfully",
diff --git a/packages/nc-gui/lang/pt_BR.json b/packages/nc-gui/lang/pt_BR.json
index 96e7305f29..d1ce114d00 100644
--- a/packages/nc-gui/lang/pt_BR.json
+++ b/packages/nc-gui/lang/pt_BR.json
@@ -241,6 +241,8 @@
"created": "Criado",
"sqlOutput": "Saída SQL.",
"addOption": "Adicionar opção",
+ "qrCodeValueColumn": "Column with QR code value",
+ "qrCodeValueTooLong": "Too many characters for a QR code",
"aggregateFunction": "Função agregada",
"dbCreateIfNotExists": "Base de Dados : criar se não existir",
"clientKey": "Chave do Cliente",
@@ -487,6 +489,12 @@
"selectField": "Select field"
},
"msg": {
+ "warning": {
+ "nonEditableFields": {
+ "computedFieldUnableToClear": "Warning: Computed field - unable to clear text",
+ "qrFieldsCannotBeDirectlyChanged": "Warning: QR fields cannot be directly changed."
+ }
+ },
"info": {
"roles": {
"orgCreator": "Creator can create new projects and access any invited project.",
@@ -666,7 +674,8 @@
"parameterKeyCannotBeEmpty": "Parameter key cannot be empty",
"duplicateParameterKeysAreNotAllowed": "Duplicate parameter keys are not allowed",
"fieldRequired": "{value} cannot be empty.",
- "projectNotAccessible": "Project not accessible"
+ "projectNotAccessible": "Project not accessible",
+ "copyToClipboardError": "Failed to copy to clipboard"
},
"toast": {
"exportMetadata": "Metadados do projeto exportado com sucesso",
@@ -686,6 +695,7 @@
"futureRelease": "Em breve!"
},
"success": {
+ "columnDuplicated": "Column duplicated successfully",
"updatedUIACL": "Updated UI ACL for tables successfully",
"pluginUninstalled": "Plugin uninstalled successfully",
"pluginSettingsSaved": "Plugin settings saved successfully",
diff --git a/packages/nc-gui/lang/ru.json b/packages/nc-gui/lang/ru.json
index d175e86a89..4fcb7c61e5 100644
--- a/packages/nc-gui/lang/ru.json
+++ b/packages/nc-gui/lang/ru.json
@@ -241,6 +241,8 @@
"created": "Созданный",
"sqlOutput": "Вывод SQL",
"addOption": "Добавить настройку",
+ "qrCodeValueColumn": "Column with QR code value",
+ "qrCodeValueTooLong": "Too many characters for a QR code",
"aggregateFunction": "Агрегатная функция",
"dbCreateIfNotExists": "База данных: создать, если не существует",
"clientKey": "Ключ клиента",
@@ -487,6 +489,12 @@
"selectField": "Select field"
},
"msg": {
+ "warning": {
+ "nonEditableFields": {
+ "computedFieldUnableToClear": "Warning: Computed field - unable to clear text",
+ "qrFieldsCannotBeDirectlyChanged": "Warning: QR fields cannot be directly changed."
+ }
+ },
"info": {
"roles": {
"orgCreator": "Creator can create new projects and access any invited project.",
@@ -666,7 +674,8 @@
"parameterKeyCannotBeEmpty": "Parameter key cannot be empty",
"duplicateParameterKeysAreNotAllowed": "Duplicate parameter keys are not allowed",
"fieldRequired": "{value} cannot be empty.",
- "projectNotAccessible": "Project not accessible"
+ "projectNotAccessible": "Project not accessible",
+ "copyToClipboardError": "Failed to copy to clipboard"
},
"toast": {
"exportMetadata": "Метаданные проекта успешно экспортированы",
@@ -686,6 +695,7 @@
"futureRelease": "Скоро!"
},
"success": {
+ "columnDuplicated": "Column duplicated successfully",
"updatedUIACL": "Updated UI ACL for tables successfully",
"pluginUninstalled": "Plugin uninstalled successfully",
"pluginSettingsSaved": "Plugin settings saved successfully",
diff --git a/packages/nc-gui/lang/sl.json b/packages/nc-gui/lang/sl.json
index 02504f569e..5e841e9057 100644
--- a/packages/nc-gui/lang/sl.json
+++ b/packages/nc-gui/lang/sl.json
@@ -241,6 +241,8 @@
"created": "Ustvarjeno",
"sqlOutput": "SQL izhod",
"addOption": "Dodaj možnost",
+ "qrCodeValueColumn": "Column with QR code value",
+ "qrCodeValueTooLong": "Too many characters for a QR code",
"aggregateFunction": "Agregatna funkcija",
"dbCreateIfNotExists": "Baza podatkov: Ustvari, če ne obstaja",
"clientKey": "Odjemalski ključ",
@@ -487,6 +489,12 @@
"selectField": "Select field"
},
"msg": {
+ "warning": {
+ "nonEditableFields": {
+ "computedFieldUnableToClear": "Warning: Computed field - unable to clear text",
+ "qrFieldsCannotBeDirectlyChanged": "Warning: QR fields cannot be directly changed."
+ }
+ },
"info": {
"roles": {
"orgCreator": "Creator can create new projects and access any invited project.",
@@ -666,7 +674,8 @@
"parameterKeyCannotBeEmpty": "Parameter key cannot be empty",
"duplicateParameterKeysAreNotAllowed": "Duplicate parameter keys are not allowed",
"fieldRequired": "{value} cannot be empty.",
- "projectNotAccessible": "Project not accessible"
+ "projectNotAccessible": "Project not accessible",
+ "copyToClipboardError": "Failed to copy to clipboard"
},
"toast": {
"exportMetadata": "Projekt Metapodatki se je uspešno izvozil",
@@ -686,6 +695,7 @@
"futureRelease": "Prihaja kmalu!"
},
"success": {
+ "columnDuplicated": "Column duplicated successfully",
"updatedUIACL": "Updated UI ACL for tables successfully",
"pluginUninstalled": "Plugin uninstalled successfully",
"pluginSettingsSaved": "Plugin settings saved successfully",
diff --git a/packages/nc-gui/lang/sv.json b/packages/nc-gui/lang/sv.json
index 90c5518c41..11b9fd8605 100644
--- a/packages/nc-gui/lang/sv.json
+++ b/packages/nc-gui/lang/sv.json
@@ -241,6 +241,8 @@
"created": "Skapad",
"sqlOutput": "SQL-utgång",
"addOption": "Lägg till alternativ",
+ "qrCodeValueColumn": "Column with QR code value",
+ "qrCodeValueTooLong": "Too many characters for a QR code",
"aggregateFunction": "Aggregatfunktion",
"dbCreateIfNotExists": "Databas: Skapa om det inte finns",
"clientKey": "Klientnyckel",
@@ -487,6 +489,12 @@
"selectField": "Select field"
},
"msg": {
+ "warning": {
+ "nonEditableFields": {
+ "computedFieldUnableToClear": "Warning: Computed field - unable to clear text",
+ "qrFieldsCannotBeDirectlyChanged": "Warning: QR fields cannot be directly changed."
+ }
+ },
"info": {
"roles": {
"orgCreator": "Creator can create new projects and access any invited project.",
@@ -666,7 +674,8 @@
"parameterKeyCannotBeEmpty": "Parameter key cannot be empty",
"duplicateParameterKeysAreNotAllowed": "Duplicate parameter keys are not allowed",
"fieldRequired": "{value} cannot be empty.",
- "projectNotAccessible": "Project not accessible"
+ "projectNotAccessible": "Project not accessible",
+ "copyToClipboardError": "Failed to copy to clipboard"
},
"toast": {
"exportMetadata": "Projektmetadata exporterades framgångsrikt",
@@ -686,6 +695,7 @@
"futureRelease": "Kommer snart!"
},
"success": {
+ "columnDuplicated": "Column duplicated successfully",
"updatedUIACL": "Updated UI ACL for tables successfully",
"pluginUninstalled": "Plugin uninstalled successfully",
"pluginSettingsSaved": "Plugin settings saved successfully",
diff --git a/packages/nc-gui/lang/th.json b/packages/nc-gui/lang/th.json
index ff5be0bf66..7093527266 100644
--- a/packages/nc-gui/lang/th.json
+++ b/packages/nc-gui/lang/th.json
@@ -241,6 +241,8 @@
"created": "สร้าง",
"sqlOutput": "เอาต์พุต SQL",
"addOption": "เพิ่มตัวเลือก",
+ "qrCodeValueColumn": "Column with QR code value",
+ "qrCodeValueTooLong": "Too many characters for a QR code",
"aggregateFunction": "ฟังก์ชั่นรวม",
"dbCreateIfNotExists": "ฐานข้อมูล: สร้างถ้าไม่มีอยู่",
"clientKey": "รหัสลูกค้า",
@@ -487,6 +489,12 @@
"selectField": "Select field"
},
"msg": {
+ "warning": {
+ "nonEditableFields": {
+ "computedFieldUnableToClear": "Warning: Computed field - unable to clear text",
+ "qrFieldsCannotBeDirectlyChanged": "Warning: QR fields cannot be directly changed."
+ }
+ },
"info": {
"roles": {
"orgCreator": "Creator can create new projects and access any invited project.",
@@ -666,7 +674,8 @@
"parameterKeyCannotBeEmpty": "Parameter key cannot be empty",
"duplicateParameterKeysAreNotAllowed": "Duplicate parameter keys are not allowed",
"fieldRequired": "{value} cannot be empty.",
- "projectNotAccessible": "Project not accessible"
+ "projectNotAccessible": "Project not accessible",
+ "copyToClipboardError": "Failed to copy to clipboard"
},
"toast": {
"exportMetadata": "ข้อมูลเมตาของโครงการส่งออกเรียบร้อยแล้ว",
@@ -686,6 +695,7 @@
"futureRelease": "เร็ว ๆ นี้!"
},
"success": {
+ "columnDuplicated": "Column duplicated successfully",
"updatedUIACL": "Updated UI ACL for tables successfully",
"pluginUninstalled": "Plugin uninstalled successfully",
"pluginSettingsSaved": "Plugin settings saved successfully",
diff --git a/packages/nc-gui/lang/tr.json b/packages/nc-gui/lang/tr.json
index 83ea91fea2..608077484c 100644
--- a/packages/nc-gui/lang/tr.json
+++ b/packages/nc-gui/lang/tr.json
@@ -241,6 +241,8 @@
"created": "Oluşturuldu",
"sqlOutput": "SQL Çıktısı",
"addOption": "Seçenek ekle",
+ "qrCodeValueColumn": "Column with QR code value",
+ "qrCodeValueTooLong": "Too many characters for a QR code",
"aggregateFunction": "Birleştirme fonksiyonu",
"dbCreateIfNotExists": "Veritabanı : yoksa oluştur",
"clientKey": "İstemci Anahtarı",
@@ -487,6 +489,12 @@
"selectField": "Select field"
},
"msg": {
+ "warning": {
+ "nonEditableFields": {
+ "computedFieldUnableToClear": "Warning: Computed field - unable to clear text",
+ "qrFieldsCannotBeDirectlyChanged": "Warning: QR fields cannot be directly changed."
+ }
+ },
"info": {
"roles": {
"orgCreator": "Creator can create new projects and access any invited project.",
@@ -666,7 +674,8 @@
"parameterKeyCannotBeEmpty": "Parameter key cannot be empty",
"duplicateParameterKeysAreNotAllowed": "Duplicate parameter keys are not allowed",
"fieldRequired": "{value} cannot be empty.",
- "projectNotAccessible": "Project not accessible"
+ "projectNotAccessible": "Project not accessible",
+ "copyToClipboardError": "Failed to copy to clipboard"
},
"toast": {
"exportMetadata": "Proje metaverileri başarıyla dışa aktarıldı",
@@ -686,6 +695,7 @@
"futureRelease": "Çok yakında!"
},
"success": {
+ "columnDuplicated": "Column duplicated successfully",
"updatedUIACL": "Updated UI ACL for tables successfully",
"pluginUninstalled": "Plugin uninstalled successfully",
"pluginSettingsSaved": "Plugin settings saved successfully",
diff --git a/packages/nc-gui/lang/uk.json b/packages/nc-gui/lang/uk.json
index 9b24d55df9..6975ae6ea6 100644
--- a/packages/nc-gui/lang/uk.json
+++ b/packages/nc-gui/lang/uk.json
@@ -241,6 +241,8 @@
"created": "Створений",
"sqlOutput": "SQL Output",
"addOption": "Додайте опцію",
+ "qrCodeValueColumn": "Column with QR code value",
+ "qrCodeValueTooLong": "Too many characters for a QR code",
"aggregateFunction": "Сукупна функція",
"dbCreateIfNotExists": "База даних: створити, якщо не існує",
"clientKey": "Клієнтський ключ",
@@ -487,6 +489,12 @@
"selectField": "Select field"
},
"msg": {
+ "warning": {
+ "nonEditableFields": {
+ "computedFieldUnableToClear": "Warning: Computed field - unable to clear text",
+ "qrFieldsCannotBeDirectlyChanged": "Warning: QR fields cannot be directly changed."
+ }
+ },
"info": {
"roles": {
"orgCreator": "Creator can create new projects and access any invited project.",
@@ -666,7 +674,8 @@
"parameterKeyCannotBeEmpty": "Parameter key cannot be empty",
"duplicateParameterKeysAreNotAllowed": "Duplicate parameter keys are not allowed",
"fieldRequired": "{value} cannot be empty.",
- "projectNotAccessible": "Project not accessible"
+ "projectNotAccessible": "Project not accessible",
+ "copyToClipboardError": "Failed to copy to clipboard"
},
"toast": {
"exportMetadata": "Метадані проекту успішно експортується",
@@ -686,6 +695,7 @@
"futureRelease": "Незабаром!"
},
"success": {
+ "columnDuplicated": "Column duplicated successfully",
"updatedUIACL": "Updated UI ACL for tables successfully",
"pluginUninstalled": "Plugin uninstalled successfully",
"pluginSettingsSaved": "Plugin settings saved successfully",
diff --git a/packages/nc-gui/lang/vi.json b/packages/nc-gui/lang/vi.json
index 6a8806bfc0..b6b1130a30 100644
--- a/packages/nc-gui/lang/vi.json
+++ b/packages/nc-gui/lang/vi.json
@@ -241,6 +241,8 @@
"created": "Tạo",
"sqlOutput": "Đầu ra SQL.",
"addOption": "Thêm tùy chọn",
+ "qrCodeValueColumn": "Column with QR code value",
+ "qrCodeValueTooLong": "Too many characters for a QR code",
"aggregateFunction": "Chức năng tổng hợp",
"dbCreateIfNotExists": "Cơ sở dữ liệu: Tạo nếu không tồn tại",
"clientKey": "Khóa khách",
@@ -487,6 +489,12 @@
"selectField": "Select field"
},
"msg": {
+ "warning": {
+ "nonEditableFields": {
+ "computedFieldUnableToClear": "Warning: Computed field - unable to clear text",
+ "qrFieldsCannotBeDirectlyChanged": "Warning: QR fields cannot be directly changed."
+ }
+ },
"info": {
"roles": {
"orgCreator": "Creator can create new projects and access any invited project.",
@@ -666,7 +674,8 @@
"parameterKeyCannotBeEmpty": "Parameter key cannot be empty",
"duplicateParameterKeysAreNotAllowed": "Duplicate parameter keys are not allowed",
"fieldRequired": "{value} cannot be empty.",
- "projectNotAccessible": "Project not accessible"
+ "projectNotAccessible": "Project not accessible",
+ "copyToClipboardError": "Failed to copy to clipboard"
},
"toast": {
"exportMetadata": "Metadata dự án xuất khẩu thành công",
@@ -686,6 +695,7 @@
"futureRelease": "Sắp có!"
},
"success": {
+ "columnDuplicated": "Column duplicated successfully",
"updatedUIACL": "Updated UI ACL for tables successfully",
"pluginUninstalled": "Plugin uninstalled successfully",
"pluginSettingsSaved": "Plugin settings saved successfully",
diff --git a/packages/nc-gui/lang/zh-Hans.json b/packages/nc-gui/lang/zh-Hans.json
index 29841a644a..3258330208 100644
--- a/packages/nc-gui/lang/zh-Hans.json
+++ b/packages/nc-gui/lang/zh-Hans.json
@@ -241,6 +241,8 @@
"created": "创造了",
"sqlOutput": "SQL输出",
"addOption": "添加选项",
+ "qrCodeValueColumn": "Column with QR code value",
+ "qrCodeValueTooLong": "Too many characters for a QR code",
"aggregateFunction": "汇总功能",
"dbCreateIfNotExists": "数据库 : 如果不存在则创建",
"clientKey": "客户端 Key",
@@ -487,6 +489,12 @@
"selectField": "选择字段"
},
"msg": {
+ "warning": {
+ "nonEditableFields": {
+ "computedFieldUnableToClear": "Warning: Computed field - unable to clear text",
+ "qrFieldsCannotBeDirectlyChanged": "Warning: QR fields cannot be directly changed."
+ }
+ },
"info": {
"roles": {
"orgCreator": "Creator can create new projects and access any invited project.",
@@ -666,7 +674,8 @@
"parameterKeyCannotBeEmpty": "参数键不能为空",
"duplicateParameterKeysAreNotAllowed": "不允许重复的参数键",
"fieldRequired": "{value} 不能为空。",
- "projectNotAccessible": "Project not accessible"
+ "projectNotAccessible": "Project not accessible",
+ "copyToClipboardError": "Failed to copy to clipboard"
},
"toast": {
"exportMetadata": "项目元数据成功导出",
@@ -686,6 +695,7 @@
"futureRelease": "即将推出!"
},
"success": {
+ "columnDuplicated": "Column duplicated successfully",
"updatedUIACL": "已成功更新表的 UI ACL",
"pluginUninstalled": "插件卸载成功",
"pluginSettingsSaved": "插件设置保存成功",
diff --git a/packages/nc-gui/lang/zh-Hant.json b/packages/nc-gui/lang/zh-Hant.json
index 708ce4e23e..0655dca4a6 100644
--- a/packages/nc-gui/lang/zh-Hant.json
+++ b/packages/nc-gui/lang/zh-Hant.json
@@ -241,6 +241,8 @@
"created": "已建立",
"sqlOutput": "SQL 輸出",
"addOption": "新增選項",
+ "qrCodeValueColumn": "Column with QR code value",
+ "qrCodeValueTooLong": "Too many characters for a QR code",
"aggregateFunction": "匯總功能",
"dbCreateIfNotExists": "資料庫:不存在則建立",
"clientKey": "用戶端金鑰",
@@ -487,6 +489,12 @@
"selectField": "選擇欄位"
},
"msg": {
+ "warning": {
+ "nonEditableFields": {
+ "computedFieldUnableToClear": "Warning: Computed field - unable to clear text",
+ "qrFieldsCannotBeDirectlyChanged": "Warning: QR fields cannot be directly changed."
+ }
+ },
"info": {
"roles": {
"orgCreator": "建立者可以建立專案與存取任何受邀請的專案",
@@ -666,7 +674,8 @@
"parameterKeyCannotBeEmpty": "Parameter key cannot be empty",
"duplicateParameterKeysAreNotAllowed": "Duplicate parameter keys are not allowed",
"fieldRequired": "{value} cannot be empty.",
- "projectNotAccessible": "Project not accessible"
+ "projectNotAccessible": "Project not accessible",
+ "copyToClipboardError": "Failed to copy to clipboard"
},
"toast": {
"exportMetadata": "專案中繼資料已成功匯出",
@@ -686,6 +695,7 @@
"futureRelease": "即將推出!"
},
"success": {
+ "columnDuplicated": "Column duplicated successfully",
"updatedUIACL": "Updated UI ACL for tables successfully",
"pluginUninstalled": "外掛移除安裝成功",
"pluginSettingsSaved": "外掛設定儲存成功",
diff --git a/packages/nc-gui/layouts/default.vue b/packages/nc-gui/layouts/default.vue
index 669173d8e8..a94eae12b9 100644
--- a/packages/nc-gui/layouts/default.vue
+++ b/packages/nc-gui/layouts/default.vue
@@ -8,7 +8,18 @@ const { te, t } = useI18n()
const { hasSidebar } = useSidebar('nc-left-sidebar')
+const refreshSidebar = ref(false)
+
useTitle(route.meta?.title && te(route.meta.title) ? `${t(route.meta.title)} | NocoDB` : 'NocoDB')
+
+watch(hasSidebar, (val) => {
+ if (!val) {
+ refreshSidebar.value = true
+ nextTick(() => {
+ refreshSidebar.value = false
+ })
+ }
+})
diff --git a/packages/nc-gui/pages/[projectType]/form/[viewId].vue b/packages/nc-gui/pages/[projectType]/form/[viewId].vue
index b94c7df761..7645e223f6 100644
--- a/packages/nc-gui/pages/[projectType]/form/[viewId].vue
+++ b/packages/nc-gui/pages/[projectType]/form/[viewId].vue
@@ -64,6 +64,7 @@ watch(
{
{
/Mac/i.test(navigator.platform)
+export const isDrawerOrModalExist = () => document.querySelector('.ant-modal.active, .ant-drawer-open')
diff --git a/packages/nc-gui/utils/cell.ts b/packages/nc-gui/utils/cell.ts
index 9214578bf2..4b516e7d6d 100644
--- a/packages/nc-gui/utils/cell.ts
+++ b/packages/nc-gui/utils/cell.ts
@@ -46,8 +46,7 @@ export const isAutoSaved = (column: ColumnType) =>
UITypes.Duration,
].includes(column.uidt as UITypes)
-export const isManualSaved = (column: ColumnType) =>
- [UITypes.Currency, UITypes.Year, UITypes.Time].includes(column.uidt as UITypes)
+export const isManualSaved = (column: ColumnType) => [UITypes.Currency].includes(column.uidt as UITypes)
export const isPrimary = (column: ColumnType) => !!column.pv
diff --git a/packages/nc-gui/utils/columnUtils.ts b/packages/nc-gui/utils/columnUtils.ts
index 318f0ffe08..565498e2c6 100644
--- a/packages/nc-gui/utils/columnUtils.ts
+++ b/packages/nc-gui/utils/columnUtils.ts
@@ -1,7 +1,7 @@
import type { ColumnType, LinkToAnotherRecordType } from 'nocodb-sdk'
import { RelationTypes, UITypes } from 'nocodb-sdk'
import LinkVariant from '~icons/mdi/link-variant'
-import TableColumnPlusBefore from '~icons/mdi/table-column-plus-before'
+import QrCodeScan from '~icons/mdi/qrcode-scan'
import FormatColorText from '~icons/mdi/format-color-text'
import TextSubject from '~icons/mdi/text-subject'
import JSONIcon from '~icons/mdi/code-json'
@@ -27,6 +27,7 @@ import MovieRoll from '~icons/mdi/movie-roll'
import CalendarClock from '~icons/mdi/calendar-clock'
import ID from '~icons/mdi/identifier'
import RulerSquareCompass from '~icons/mdi/ruler-square-compass'
+import MdiTextSearchVariant from '~icons/mdi/text-search-variant'
const uiTypes = [
{
@@ -36,7 +37,7 @@ const uiTypes = [
},
{
name: UITypes.Lookup,
- icon: TableColumnPlusBefore,
+ icon: MdiTextSearchVariant,
virtual: 1,
},
{
@@ -125,6 +126,11 @@ const uiTypes = [
name: UITypes.DateTime,
icon: CalendarClock,
},
+ {
+ name: UITypes.QrCode,
+ icon: QrCodeScan,
+ virtual: 1,
+ },
{
name: UITypes.Geometry,
icon: RulerSquareCompass,
@@ -174,4 +180,14 @@ const isColumnRequiredAndNull = (col: ColumnType, row: Record) => {
return isColumnRequired(col) && (row[col.title!] === undefined || row[col.title!] === null)
}
-export { uiTypes, getUIDTIcon, isColumnRequiredAndNull, isColumnRequired, isVirtualColRequired }
+const getUniqueColumnName = (initName: string, columns: ColumnType[]) => {
+ let name = initName
+ let i = 1
+ while (columns.find((c) => c.title === name)) {
+ name = `${initName}_${i}`
+ i++
+ }
+ return name
+}
+
+export { uiTypes, getUIDTIcon, getUniqueColumnName, isColumnRequiredAndNull, isColumnRequired, isVirtualColRequired }
diff --git a/packages/nc-gui/utils/parsers/ExcelTemplateAdapter.ts b/packages/nc-gui/utils/parsers/ExcelTemplateAdapter.ts
index c9048cb724..d3d60b5359 100644
--- a/packages/nc-gui/utils/parsers/ExcelTemplateAdapter.ts
+++ b/packages/nc-gui/utils/parsers/ExcelTemplateAdapter.ts
@@ -132,15 +132,15 @@ export default class ExcelTemplateAdapter extends TemplateGenerator {
if (column.uidt === UITypes.SingleLineText) {
// check for long text
- if (isMultiLineTextType(rows)) {
+ if (isMultiLineTextType(rows, col)) {
column.uidt = UITypes.LongText
}
- if (isEmailType(rows)) {
+ if (isEmailType(rows, col)) {
column.uidt = UITypes.Email
}
- if (isUrlType(rows)) {
+ if (isUrlType(rows, col)) {
column.uidt = UITypes.URL
} else {
const vals = rows
@@ -148,7 +148,7 @@ export default class ExcelTemplateAdapter extends TemplateGenerator {
.map((r: any) => r[col])
.filter((v: any) => v !== null && v !== undefined && v.toString().trim() !== '')
- const checkboxType = isCheckboxType(vals)
+ const checkboxType = isCheckboxType(vals, col)
if (checkboxType.length === 1) {
column.uidt = UITypes.Checkbox
} else {
diff --git a/packages/nc-gui/utils/parsers/parserHelpers.ts b/packages/nc-gui/utils/parsers/parserHelpers.ts
index 7df86117c0..b0759389b6 100644
--- a/packages/nc-gui/utils/parsers/parserHelpers.ts
+++ b/packages/nc-gui/utils/parsers/parserHelpers.ts
@@ -20,11 +20,11 @@ const booleanOptions = [
]
const aggBooleanOptions: any = booleanOptions.reduce((obj, o) => ({ ...obj, ...o }), {})
-const getColVal = (row: any, col = null) => {
+const getColVal = (row: any, col?: number) => {
return row && col ? row[col] : row
}
-export const isCheckboxType: any = (values: [], col = null) => {
+export const isCheckboxType: any = (values: [], col?: number) => {
let options = booleanOptions
for (let i = 0; i < values.length; i++) {
const val = getColVal(values[i], col)
@@ -45,7 +45,7 @@ export const getCheckboxValue = (value: any) => {
return value && aggBooleanOptions[value]
}
-export const isMultiLineTextType = (values: [], col = null) => {
+export const isMultiLineTextType = (values: [], col?: number) => {
return values.some(
(r) => (getColVal(r, col) || '').toString().match(/[\r\n]/) || (getColVal(r, col) || '').toString().length > 255,
)
@@ -107,13 +107,15 @@ export const isDecimalType = (colData: []) =>
return v && parseInt(v) !== +v
})
-export const isEmailType = (colData: []) =>
- colData.some((v: any) => {
+export const isEmailType = (colData: [], col?: number) =>
+ colData.some((r: any) => {
+ const v = getColVal(r, col)
return v && validateEmail(v)
})
-export const isUrlType = (colData: []) =>
- colData.some((v: any) => {
+export const isUrlType = (colData: [], col?: number) =>
+ colData.some((r: any) => {
+ const v = getColVal(r, col)
return v && isValidURL(v)
})
diff --git a/packages/nc-gui/utils/urlUtils.ts b/packages/nc-gui/utils/urlUtils.ts
index e6bf9d8c74..d9d807d446 100644
--- a/packages/nc-gui/utils/urlUtils.ts
+++ b/packages/nc-gui/utils/urlUtils.ts
@@ -1,3 +1,5 @@
+import isURL from 'validator/lib/isURL'
+
export const replaceUrlsWithLink = (text: string): boolean | string => {
if (!text) {
return false
@@ -17,12 +19,8 @@ export const replaceUrlsWithLink = (text: string): boolean | string => {
return found && out
}
-// ref : https://stackoverflow.com/a/5717133
export const isValidURL = (str: string) => {
- const pattern =
- /^(?:(?:https?|ftp):\/\/)?(?:\S+(?::\S*)?@)?(?:(?!(?:10|127)(?:\.\d{1,3}){3})(?!(?:169\.254|192\.168)(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z\u00A1-\uFFFF0-9]-*)*[a-z\u00A1-\uFFFF0-9]+)(?:\.(?:[a-z\u00A1-\uFFFF0-9]-*)*[a-z\u00A1-\uFFFF0-9]+)*(?:\.(?:[a-z\u00A1-\uFFFF]{2,}))\.?)(?::\d{2,5})?(?:[/?#]\S*)?$/i
-
- return pattern.test(str)
+ return isURL(str)
}
export const openLink = (path: string, baseURL?: string, target = '_blank') => {
diff --git a/packages/nc-gui/utils/viewUtils.ts b/packages/nc-gui/utils/viewUtils.ts
index 2be0cb34b0..e197e766ed 100644
--- a/packages/nc-gui/utils/viewUtils.ts
+++ b/packages/nc-gui/utils/viewUtils.ts
@@ -37,3 +37,7 @@ export function applyLanguageDirection(dir: typeof rtl | typeof ltr) {
document.body.classList.add(dir)
document.body.style.direction = dir
}
+
+export function applyNonSelectable() {
+ document.body.classList.add('non-selectable')
+}
diff --git a/packages/nc-gui/utils/virtualCell.ts b/packages/nc-gui/utils/virtualCell.ts
index a0115b8186..c5f705a0ee 100644
--- a/packages/nc-gui/utils/virtualCell.ts
+++ b/packages/nc-gui/utils/virtualCell.ts
@@ -16,4 +16,5 @@ export const isBt = (column: ColumnType) =>
export const isLookup = (column: ColumnType) => column.uidt === UITypes.Lookup
export const isRollup = (column: ColumnType) => column.uidt === UITypes.Rollup
export const isFormula = (column: ColumnType) => column.uidt === UITypes.Formula
+export const isQrCode = (column: ColumnType) => column.uidt === UITypes.QrCode
export const isCount = (column: ColumnType) => column.uidt === UITypes.Count
diff --git a/packages/noco-docs/content/en/getting-started/installation.md b/packages/noco-docs/content/en/getting-started/installation.md
index 2f341aee2a..f019870064 100644
--- a/packages/noco-docs/content/en/getting-started/installation.md
+++ b/packages/noco-docs/content/en/getting-started/installation.md
@@ -509,6 +509,7 @@ It is mandatory to configure `NC_DB` environment variables for production usecas
| NC_S3_ACCESS_KEY | No | For S3 storage plugin - AWS access key credential for accessing resource | | |
| NC_S3_ACCESS_SECRET | No | For S3 storage plugin - AWS access secret credential for accessing resource | | |
| NC_ADMIN_EMAIL | No | For updating/creating super admin with provided email and password | | |
+| NC_ATTACHMENT_FIELD_SIZE | No | For setting the attachment field size(in Bytes) | Defaults to 20MB | |
| NC_ADMIN_PASSWORD | No | For updating/creating super admin with provided email and password. Your password should have at least 8 letters with one uppercase, one number and one special letter(Allowed special chars ]$&+,:;=?@#|'.^*()%!_-" ) | | |
| NODE_OPTIONS | No | For passing Node.js [options](https://nodejs.org/api/cli.html#node_optionsoptions) to instance | | |
| NC_MINIMAL_DBS | No | Create a new SQLite file for each project. All the db files are stored in `nc_minimal_dbs` folder in current working directory. (This option restricts project creation on external sources) | | |
diff --git a/packages/noco-docs/content/en/setup-and-usages/column-types.md b/packages/noco-docs/content/en/setup-and-usages/column-types.md
index bf3f41cac2..afeeaa55c6 100644
--- a/packages/noco-docs/content/en/setup-and-usages/column-types.md
+++ b/packages/noco-docs/content/en/setup-and-usages/column-types.md
@@ -32,6 +32,7 @@ menuTitle: 'Column Types'
|[Duration](#duration)| Duration |
|[Rating](#rating)| Rating |
|[Formula](#formula)| Formula based generated column |
+|[QR Code](#qr-code)| QR Code visualization of another referenced column |
| [Count](#count) | |
|[DateTime](#datetime)| Date & Time selector |
|[CreateTime](#createtime)| |
@@ -267,6 +268,17 @@ N/A
For more about formula, please visit [here](./formulas).
+### QR-Code
+
+Encodes the value of a reference column as QR code. The following column types are supported for the for reference column:
+* Formula
+* Single Line Text
+* Long Text
+* Phone Number
+* URL
+* Email
+
+Since it's a virtual column, the cell content (QR code) cannot be changed directly.
### Count
#### Available Database Types
diff --git a/packages/noco-docs/content/en/setup-and-usages/keyboard-maneuver.md b/packages/noco-docs/content/en/setup-and-usages/keyboard-maneuver.md
new file mode 100644
index 0000000000..74dacdb316
--- /dev/null
+++ b/packages/noco-docs/content/en/setup-and-usages/keyboard-maneuver.md
@@ -0,0 +1,56 @@
+---
+title: 'Keyboard Maneuver'
+description: 'Keyboard shortcuts'
+position: 700
+category: 'Product'
+menuTitle: 'Keyboard Maneuver'
+---
+
+
+## Shortcuts
+| Key | Behaviour |
+|----------:|:------------------------|
+| `ALT` `t` | Insert new table |
+| `ALT` `r` | Insert new row |
+| `ALT` `c` | Insert new column |
+| `ALT` `f` | Toggle fullscreen mode |
+| `ALT` `i` | Invite a member to team |
+| `ALT` `,` | Open `Team & Settings` menu |
+
+
+## Grid view
+| Key | Behaviour |
+|----------------:|:-------------------------------------------------------------------------------------|
+| `⌘` `↑` | Jump to first record in this column (in same page) |
+| `⌘` `↓` | Jump to last record in this column (in same page) |
+| `⌘` `C` | Copy cell contents |
+| `Enter` | Switch cell in focus to EDIT mode; opens modal/picker if cell is associated with one |
+| `Esc` | Exit cell EDIT mode |
+| `Delete` | Clear cell |
+| `Space` | Expand current row |
+| `←` `→` `↑` `↓` | General cell navigation |
+| `Tab` | Move to next cell horizontally; if on last cell, move to next row beginning |
+
+
+## Column type specific
+| Datatype | Key | Behaviour |
+|:----------------------:|------------:|:-----------------------------------|
+| Text / Numerical cells | `←` `→` | Move cursor to the left / right |
+| | `↑` `↓` | Move cursor to the beginning / end |
+| Single Select | `↑` `↓` | Move between options |
+| | `Enter` | Select option |
+| Multi Select | `↑` `↓` | Move between options |
+| | `Enter` | Select / deselect option |
+| DateTime | `Ctrl` `;` | Select current date time |
+| Link | `↑` `↓` | Move between options |
+| | `Enter` | Link current selection |
+| Checkbox | `Enter` | Toggle |
+| Rating | `<0 ~ Max>` | Enter number to toggle rating |
+
+
+## Expanded form
+| Key | Behaviour |
+|------------:|:-------------------------------|
+| `⌘` `Enter` | Save current expanded form item |
+
+
diff --git a/packages/nocodb-sdk/package-lock.json b/packages/nocodb-sdk/package-lock.json
index 39e1788181..7dc7efd1b8 100644
--- a/packages/nocodb-sdk/package-lock.json
+++ b/packages/nocodb-sdk/package-lock.json
@@ -50,6 +50,8 @@
},
"node_modules/@babel/highlight/node_modules/ansi-styles": {
"version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -61,6 +63,8 @@
},
"node_modules/@babel/highlight/node_modules/chalk": {
"version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -74,6 +78,8 @@
},
"node_modules/@babel/highlight/node_modules/color-convert": {
"version": "1.9.3",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
+ "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -82,11 +88,15 @@
},
"node_modules/@babel/highlight/node_modules/color-name": {
"version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+ "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==",
"dev": true,
"license": "MIT"
},
"node_modules/@babel/highlight/node_modules/escape-string-regexp": {
"version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
"dev": true,
"license": "MIT",
"engines": {
@@ -95,6 +105,8 @@
},
"node_modules/@babel/highlight/node_modules/has-flag": {
"version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
"dev": true,
"license": "MIT",
"engines": {
@@ -103,6 +115,8 @@
},
"node_modules/@babel/highlight/node_modules/supports-color": {
"version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -114,171 +128,239 @@
},
"node_modules/@cspell/dict-aws": {
"version": "1.0.14",
+ "resolved": "https://registry.npmjs.org/@cspell/dict-aws/-/dict-aws-1.0.14.tgz",
+ "integrity": "sha512-K21CfB4ZpKYwwDQiPfic2zJA/uxkbsd4IQGejEvDAhE3z8wBs6g6BwwqdVO767M9NgZqc021yAVpr79N5pWe3w==",
"dev": true,
"license": "MIT"
},
"node_modules/@cspell/dict-bash": {
"version": "1.0.18",
+ "resolved": "https://registry.npmjs.org/@cspell/dict-bash/-/dict-bash-1.0.18.tgz",
+ "integrity": "sha512-kJIqQ+FD2TCSgaaP5XLEDgy222+pVWTc+VhveNO++gnTWU3BCVjkD5LjfW7g/CmGONnz+nwXDueWspProaSdJw==",
"dev": true,
"license": "MIT"
},
"node_modules/@cspell/dict-companies": {
"version": "1.0.40",
+ "resolved": "https://registry.npmjs.org/@cspell/dict-companies/-/dict-companies-1.0.40.tgz",
+ "integrity": "sha512-Aw07qiTroqSST2P5joSrC4uOA05zTXzI2wMb+me3q4Davv1D9sCkzXY0TGoC2vzhNv5ooemRi9KATGaBSdU1sw==",
"dev": true,
"license": "MIT"
},
"node_modules/@cspell/dict-cpp": {
"version": "1.1.40",
+ "resolved": "https://registry.npmjs.org/@cspell/dict-cpp/-/dict-cpp-1.1.40.tgz",
+ "integrity": "sha512-sscfB3woNDNj60/yGXAdwNtIRWZ89y35xnIaJVDMk5TPMMpaDvuk0a34iOPIq0g4V+Y8e3RyAg71SH6ADwSjGw==",
"dev": true,
"license": "MIT"
},
"node_modules/@cspell/dict-cryptocurrencies": {
"version": "1.0.10",
+ "resolved": "https://registry.npmjs.org/@cspell/dict-cryptocurrencies/-/dict-cryptocurrencies-1.0.10.tgz",
+ "integrity": "sha512-47ABvDJOkaST/rXipNMfNvneHUzASvmL6K/CbOFpYKfsd0x23Jc9k1yaOC7JAm82XSC/8a7+3Yu+Fk2jVJNnsA==",
"dev": true,
"license": "MIT"
},
"node_modules/@cspell/dict-csharp": {
"version": "1.0.11",
+ "resolved": "https://registry.npmjs.org/@cspell/dict-csharp/-/dict-csharp-1.0.11.tgz",
+ "integrity": "sha512-nub+ZCiTgmT87O+swI+FIAzNwaZPWUGckJU4GN402wBq420V+F4ZFqNV7dVALJrGaWH7LvADRtJxi6cZVHJKeA==",
"dev": true,
"license": "MIT"
},
"node_modules/@cspell/dict-css": {
"version": "1.0.13",
+ "resolved": "https://registry.npmjs.org/@cspell/dict-css/-/dict-css-1.0.13.tgz",
+ "integrity": "sha512-HU8RbFRoGanFH85mT01Ot/Ay48ixr/gG25VPLtdq56QTrmPsw79gxYm/5Qay16eQbpoPIxaj5CAWNam+DX4GbA==",
"dev": true,
"license": "MIT"
},
"node_modules/@cspell/dict-django": {
"version": "1.0.26",
+ "resolved": "https://registry.npmjs.org/@cspell/dict-django/-/dict-django-1.0.26.tgz",
+ "integrity": "sha512-mn9bd7Et1L2zuibc08GVHTiD2Go3/hdjyX5KLukXDklBkq06r+tb0OtKtf1zKodtFDTIaYekGADhNhA6AnKLkg==",
"dev": true,
"license": "MIT"
},
"node_modules/@cspell/dict-dotnet": {
"version": "1.0.32",
+ "resolved": "https://registry.npmjs.org/@cspell/dict-dotnet/-/dict-dotnet-1.0.32.tgz",
+ "integrity": "sha512-9H9vXrgJB4KF8xsyTToXO53cXD33iyfrpT4mhCds+YLUw3P3x3E9myszgJzshnrxYBvQZ+QMII57Qr6SjZVk4Q==",
"dev": true,
"license": "MIT"
},
"node_modules/@cspell/dict-elixir": {
"version": "1.0.26",
+ "resolved": "https://registry.npmjs.org/@cspell/dict-elixir/-/dict-elixir-1.0.26.tgz",
+ "integrity": "sha512-hz1yETUiRJM7yjN3mITSnxcmZaEyaBbyJhpZPpg+cKUil+xhHeZ2wwfbRc83QHGmlqEuDWbdCFqKSpCDJYpYhg==",
"dev": true,
"license": "MIT"
},
"node_modules/@cspell/dict-en_us": {
"version": "1.2.45",
+ "resolved": "https://registry.npmjs.org/@cspell/dict-en_us/-/dict-en_us-1.2.45.tgz",
+ "integrity": "sha512-UPwR4rfiJCxnS+Py+EK9E4AUj3aPZE4p/yBRSHN+5aBQConlI0lLDtMceH5wlupA/sQTU1ERZGPJA9L96jVSyQ==",
"dev": true,
"license": "MIT"
},
"node_modules/@cspell/dict-en-gb": {
"version": "1.1.33",
+ "resolved": "https://registry.npmjs.org/@cspell/dict-en-gb/-/dict-en-gb-1.1.33.tgz",
+ "integrity": "sha512-tKSSUf9BJEV+GJQAYGw5e+ouhEe2ZXE620S7BLKe3ZmpnjlNG9JqlnaBhkIMxKnNFkLY2BP/EARzw31AZnOv4g==",
"dev": true,
"license": "MIT"
},
"node_modules/@cspell/dict-filetypes": {
"version": "1.1.8",
+ "resolved": "https://registry.npmjs.org/@cspell/dict-filetypes/-/dict-filetypes-1.1.8.tgz",
+ "integrity": "sha512-EllahNkhzvLWo0ptwu0l3oEeAJOQSUpZnDfnKRIh6mJVehuSovNHwA9vrdZ8jBUjuqcfaN2e7c32zN0D/qvWJQ==",
"dev": true,
"license": "MIT"
},
"node_modules/@cspell/dict-fonts": {
"version": "1.0.14",
+ "resolved": "https://registry.npmjs.org/@cspell/dict-fonts/-/dict-fonts-1.0.14.tgz",
+ "integrity": "sha512-VhIX+FVYAnqQrOuoFEtya6+H72J82cIicz9QddgknsTqZQ3dvgp6lmVnsQXPM3EnzA8n1peTGpLDwHzT7ociLA==",
"dev": true,
"license": "MIT"
},
"node_modules/@cspell/dict-fullstack": {
"version": "1.0.39",
+ "resolved": "https://registry.npmjs.org/@cspell/dict-fullstack/-/dict-fullstack-1.0.39.tgz",
+ "integrity": "sha512-Mbi+zWdiP9yzL+X4YD9Tgcm5YQ95Ql+Y3vF2LRnOY6g2QWaijTRN1rgksVuxzpFqHi//+bx2uoUb0XEKBYDi8g==",
"dev": true,
"license": "MIT"
},
"node_modules/@cspell/dict-golang": {
"version": "1.1.24",
+ "resolved": "https://registry.npmjs.org/@cspell/dict-golang/-/dict-golang-1.1.24.tgz",
+ "integrity": "sha512-qq3Cjnx2U1jpeWAGJL1GL0ylEhUMqyaR36Xij6Y6Aq4bViCRp+HRRqk0x5/IHHbOrti45h3yy7ii1itRFo+Xkg==",
"dev": true,
"license": "MIT"
},
"node_modules/@cspell/dict-haskell": {
"version": "1.0.13",
+ "resolved": "https://registry.npmjs.org/@cspell/dict-haskell/-/dict-haskell-1.0.13.tgz",
+ "integrity": "sha512-kvl8T84cnYRPpND/P3D86P6WRSqebsbk0FnMfy27zo15L5MLAb3d3MOiT1kW3vEWfQgzUD7uddX/vUiuroQ8TA==",
"dev": true,
"license": "MIT"
},
"node_modules/@cspell/dict-html": {
"version": "1.1.9",
+ "resolved": "https://registry.npmjs.org/@cspell/dict-html/-/dict-html-1.1.9.tgz",
+ "integrity": "sha512-vvnYia0tyIS5Fdoz+gEQm77MGZZE66kOJjuNpIYyRHCXFAhWdYz3SmkRm6YKJSWSvuO+WBJYTKDvkOxSh3Fx/w==",
"dev": true,
"license": "MIT"
},
"node_modules/@cspell/dict-html-symbol-entities": {
"version": "1.0.23",
+ "resolved": "https://registry.npmjs.org/@cspell/dict-html-symbol-entities/-/dict-html-symbol-entities-1.0.23.tgz",
+ "integrity": "sha512-PV0UBgcBFbBLf/m1wfkVMM8w96kvfHoiCGLWO6BR3Q9v70IXoE4ae0+T+f0CkxcEkacMqEQk/I7vuE9MzrjaNw==",
"dev": true,
"license": "MIT"
},
"node_modules/@cspell/dict-java": {
"version": "1.0.23",
+ "resolved": "https://registry.npmjs.org/@cspell/dict-java/-/dict-java-1.0.23.tgz",
+ "integrity": "sha512-LcOg9srYLDoNGd8n3kbfDBlZD+LOC9IVcnFCdua1b/luCHNVmlgBx7e677qPu7olpMYOD5TQIVW2OmM1+/6MFA==",
"dev": true,
"license": "MIT"
},
"node_modules/@cspell/dict-latex": {
"version": "1.0.25",
+ "resolved": "https://registry.npmjs.org/@cspell/dict-latex/-/dict-latex-1.0.25.tgz",
+ "integrity": "sha512-cEgg91Migqcp1SdVV7dUeMxbPDhxdNo6Fgq2eygAXQjIOFK520FFvh/qxyBvW90qdZbIRoU2AJpchyHfGuwZFA==",
"dev": true,
"license": "MIT"
},
"node_modules/@cspell/dict-lorem-ipsum": {
"version": "1.0.22",
+ "resolved": "https://registry.npmjs.org/@cspell/dict-lorem-ipsum/-/dict-lorem-ipsum-1.0.22.tgz",
+ "integrity": "sha512-yqzspR+2ADeAGUxLTfZ4pXvPl7FmkENMRcGDECmddkOiuEwBCWMZdMP5fng9B0Q6j91hQ8w9CLvJKBz10TqNYg==",
"dev": true,
"license": "MIT"
},
"node_modules/@cspell/dict-lua": {
"version": "1.0.16",
+ "resolved": "https://registry.npmjs.org/@cspell/dict-lua/-/dict-lua-1.0.16.tgz",
+ "integrity": "sha512-YiHDt8kmHJ8nSBy0tHzaxiuitYp+oJ66ffCYuFWTNB3//Y0SI4OGHU3omLsQVeXIfCeVrO4DrVvRDoCls9B5zQ==",
"dev": true,
"license": "MIT"
},
"node_modules/@cspell/dict-node": {
"version": "1.0.12",
+ "resolved": "https://registry.npmjs.org/@cspell/dict-node/-/dict-node-1.0.12.tgz",
+ "integrity": "sha512-RPNn/7CSkflAWk0sbSoOkg0ORrgBARUjOW3QjB11KwV1gSu8f5W/ij/S50uIXtlrfoBLqd4OyE04jyON+g/Xfg==",
"dev": true,
"license": "MIT"
},
"node_modules/@cspell/dict-npm": {
"version": "1.0.16",
+ "resolved": "https://registry.npmjs.org/@cspell/dict-npm/-/dict-npm-1.0.16.tgz",
+ "integrity": "sha512-RwkuZGcYBxL3Yux3cSG/IOWGlQ1e9HLCpHeyMtTVGYKAIkFAVUnGrz20l16/Q7zUG7IEktBz5O42kAozrEnqMQ==",
"dev": true,
"license": "MIT"
},
"node_modules/@cspell/dict-php": {
"version": "1.0.25",
+ "resolved": "https://registry.npmjs.org/@cspell/dict-php/-/dict-php-1.0.25.tgz",
+ "integrity": "sha512-RoBIP5MRdByyPaXcznZMfOY1JdCMYPPLua5E9gkq0TJO7bX5mC9hyAKfYBSWVQunZydd82HZixjb5MPkDFU1uw==",
"dev": true,
"license": "MIT"
},
"node_modules/@cspell/dict-powershell": {
"version": "1.0.19",
+ "resolved": "https://registry.npmjs.org/@cspell/dict-powershell/-/dict-powershell-1.0.19.tgz",
+ "integrity": "sha512-zF/raM/lkhXeHf4I43OtK0gP9rBeEJFArscTVwLWOCIvNk21MJcNoTYoaGw+c056+Q+hJL0psGLO7QN+mxYH1A==",
"dev": true,
"license": "MIT"
},
"node_modules/@cspell/dict-python": {
"version": "1.0.38",
+ "resolved": "https://registry.npmjs.org/@cspell/dict-python/-/dict-python-1.0.38.tgz",
+ "integrity": "sha512-KuyOQaby9NID/pn7EkXilpUxjVIvvyLzhr7BPsDS6FcvUE8Yhss6bJowEDHSv6pa+W2387phoqbDf2rTicquAA==",
"dev": true,
"license": "MIT"
},
"node_modules/@cspell/dict-ruby": {
"version": "1.0.15",
+ "resolved": "https://registry.npmjs.org/@cspell/dict-ruby/-/dict-ruby-1.0.15.tgz",
+ "integrity": "sha512-I76hJA///lc1pgmDTGUFHN/O8KLIZIU/8TgIYIGI6Ix/YzSEvWNdQYbANn6JbCynS0X+7IbZ2Ft+QqvmGtIWuA==",
"dev": true,
"license": "MIT"
},
"node_modules/@cspell/dict-rust": {
"version": "1.0.23",
+ "resolved": "https://registry.npmjs.org/@cspell/dict-rust/-/dict-rust-1.0.23.tgz",
+ "integrity": "sha512-lR4boDzs79YD6+30mmiSGAMMdwh7HTBAPUFSB0obR3Kidibfc3GZ+MHWZXay5dxZ4nBKM06vyjtanF9VJ8q1Iw==",
"dev": true,
"license": "MIT"
},
"node_modules/@cspell/dict-scala": {
"version": "1.0.21",
+ "resolved": "https://registry.npmjs.org/@cspell/dict-scala/-/dict-scala-1.0.21.tgz",
+ "integrity": "sha512-5V/R7PRbbminTpPS3ywgdAalI9BHzcEjEj9ug4kWYvBIGwSnS7T6QCFCiu+e9LvEGUqQC+NHgLY4zs1NaBj2vA==",
"dev": true,
"license": "MIT"
},
"node_modules/@cspell/dict-software-terms": {
"version": "1.0.48",
+ "resolved": "https://registry.npmjs.org/@cspell/dict-software-terms/-/dict-software-terms-1.0.48.tgz",
+ "integrity": "sha512-pfF3Ys2gRffu5ElqkH7FQMDMi/iZMyOzpGMb3FSH0PJ2AnRQ5rRNWght1h2L36YxvXl0mWVaFrrfwiOyRIc8ZQ==",
"dev": true,
"license": "MIT"
},
"node_modules/@cspell/dict-typescript": {
"version": "1.0.20",
+ "resolved": "https://registry.npmjs.org/@cspell/dict-typescript/-/dict-typescript-1.0.20.tgz",
+ "integrity": "sha512-yIuGeeZtQA2gqpGefGjZqBl8iGJpIYWz0QzDqsscNi2qfSnLsbjM0RkRbTehM8y9gGGe7xfgUP5adxceJa5Krg==",
"dev": true,
"license": "MIT"
},
"node_modules/@eslint/eslintrc": {
"version": "0.4.3",
+ "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz",
+ "integrity": "sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -298,6 +380,8 @@
},
"node_modules/@eslint/eslintrc/node_modules/ignore": {
"version": "4.0.6",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz",
+ "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==",
"dev": true,
"license": "MIT",
"engines": {
@@ -306,6 +390,8 @@
},
"node_modules/@eslint/eslintrc/node_modules/strip-json-comments": {
"version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
+ "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
"dev": true,
"license": "MIT",
"engines": {
@@ -317,6 +403,8 @@
},
"node_modules/@humanwhocodes/config-array": {
"version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz",
+ "integrity": "sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
@@ -330,11 +418,15 @@
},
"node_modules/@humanwhocodes/object-schema": {
"version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz",
+ "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==",
"dev": true,
"license": "BSD-3-Clause"
},
"node_modules/@nodelib/fs.scandir": {
"version": "2.1.5",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
+ "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -347,6 +439,8 @@
},
"node_modules/@nodelib/fs.stat": {
"version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
+ "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
"dev": true,
"license": "MIT",
"engines": {
@@ -355,6 +449,8 @@
},
"node_modules/@nodelib/fs.walk": {
"version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
+ "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -367,16 +463,22 @@
},
"node_modules/@types/json-schema": {
"version": "7.0.11",
+ "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz",
+ "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==",
"dev": true,
"license": "MIT"
},
"node_modules/@types/json5": {
"version": "0.0.29",
+ "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz",
+ "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==",
"dev": true,
"license": "MIT"
},
"node_modules/@typescript-eslint/eslint-plugin": {
"version": "4.33.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.33.0.tgz",
+ "integrity": "sha512-aINiAxGVdOl1eJyVjaWn/YcVAq4Gi/Yo35qHGCnqbWVz61g39D0h23veY/MA0rFFGfxK7TySg2uwDeNv+JgVpg==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -408,6 +510,8 @@
},
"node_modules/@typescript-eslint/experimental-utils": {
"version": "4.33.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.33.0.tgz",
+ "integrity": "sha512-zeQjOoES5JFjTnAhI5QY7ZviczMzDptls15GFsI6jyUOq0kOf9+WonkhtlIhh0RgHRnqj5gdNxW5j1EvAyYg6Q==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -431,6 +535,8 @@
},
"node_modules/@typescript-eslint/parser": {
"version": "4.33.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.33.0.tgz",
+ "integrity": "sha512-ZohdsbXadjGBSK0/r+d87X0SBmKzOq4/S5nzK6SBgJspFo9/CUDJ7hjayuze+JK7CZQLDMroqytp7pOcFKTxZA==",
"dev": true,
"license": "BSD-2-Clause",
"dependencies": {
@@ -457,6 +563,8 @@
},
"node_modules/@typescript-eslint/scope-manager": {
"version": "4.33.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.33.0.tgz",
+ "integrity": "sha512-5IfJHpgTsTZuONKbODctL4kKuQje/bzBRkwHE8UOZ4f89Zeddg+EGZs8PD8NcN4LdM3ygHWYB3ukPAYjvl/qbQ==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -473,6 +581,8 @@
},
"node_modules/@typescript-eslint/types": {
"version": "4.33.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.33.0.tgz",
+ "integrity": "sha512-zKp7CjQzLQImXEpLt2BUw1tvOMPfNoTAfb8l51evhYbOEEzdWyQNmHWWGPR6hwKJDAi+1VXSBmnhL9kyVTTOuQ==",
"dev": true,
"license": "MIT",
"engines": {
@@ -485,6 +595,8 @@
},
"node_modules/@typescript-eslint/typescript-estree": {
"version": "4.33.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.33.0.tgz",
+ "integrity": "sha512-rkWRY1MPFzjwnEVHsxGemDzqqddw2QbTJlICPD9p9I9LfsO8fdmfQPOX3uKfUaGRDFJbfrtm/sXhVXN4E+bzCA==",
"dev": true,
"license": "BSD-2-Clause",
"dependencies": {
@@ -511,6 +623,8 @@
},
"node_modules/@typescript-eslint/visitor-keys": {
"version": "4.33.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.33.0.tgz",
+ "integrity": "sha512-uqi/2aSz9g2ftcHWf8uLPJA70rUv6yuMW5Bohw+bwcuzaxQIHaKFZCKGoGXIrc9vkTJ3+0txM73K0Hq3d5wgIg==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -539,6 +653,8 @@
},
"node_modules/acorn-jsx": {
"version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
+ "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
"dev": true,
"license": "MIT",
"peerDependencies": {
@@ -547,6 +663,8 @@
},
"node_modules/ajv": {
"version": "6.12.6",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
+ "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -570,6 +688,8 @@
},
"node_modules/ansi-regex": {
"version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
"dev": true,
"license": "MIT",
"engines": {
@@ -578,6 +698,8 @@
},
"node_modules/argparse": {
"version": "1.0.10",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
+ "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -604,11 +726,15 @@
},
"node_modules/array-timsort": {
"version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/array-timsort/-/array-timsort-1.0.3.tgz",
+ "integrity": "sha512-/+3GRL7dDAGEfM6TseQk/U+mi18TU2Ms9I3UlLdUMhz2hbvGNTKdj9xniwXfUqgYhHxRx0+8UnKkvlNwVU+cWQ==",
"dev": true,
"license": "MIT"
},
"node_modules/array-union": {
"version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz",
+ "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==",
"dev": true,
"license": "MIT",
"engines": {
@@ -649,6 +775,8 @@
},
"node_modules/astral-regex": {
"version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz",
+ "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==",
"dev": true,
"license": "MIT",
"engines": {
@@ -657,6 +785,8 @@
},
"node_modules/at-least-node": {
"version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz",
+ "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==",
"dev": true,
"license": "ISC",
"engines": {
@@ -665,6 +795,8 @@
},
"node_modules/axios": {
"version": "0.21.4",
+ "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz",
+ "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==",
"license": "MIT",
"dependencies": {
"follow-redirects": "^1.14.0"
@@ -672,11 +804,15 @@
},
"node_modules/balanced-match": {
"version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
"dev": true,
"license": "MIT"
},
"node_modules/brace-expansion": {
"version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -686,6 +822,8 @@
},
"node_modules/braces": {
"version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
+ "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -697,6 +835,8 @@
},
"node_modules/call-bind": {
"version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
+ "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -709,6 +849,8 @@
},
"node_modules/callsites": {
"version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
+ "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
"dev": true,
"license": "MIT",
"engines": {
@@ -717,6 +859,8 @@
},
"node_modules/chalk": {
"version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -732,6 +876,8 @@
},
"node_modules/chalk/node_modules/ansi-styles": {
"version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -746,6 +892,8 @@
},
"node_modules/color-convert": {
"version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -757,11 +905,15 @@
},
"node_modules/color-name": {
"version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
"dev": true,
"license": "MIT"
},
"node_modules/commander": {
"version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz",
+ "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==",
"dev": true,
"license": "MIT",
"engines": {
@@ -785,11 +937,15 @@
},
"node_modules/concat-map": {
"version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
"dev": true,
"license": "MIT"
},
"node_modules/configstore": {
"version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz",
+ "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==",
"dev": true,
"license": "BSD-2-Clause",
"dependencies": {
@@ -806,11 +962,15 @@
},
"node_modules/core-util-is": {
"version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz",
+ "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==",
"dev": true,
"license": "MIT"
},
"node_modules/cross-spawn": {
"version": "7.0.3",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
+ "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -824,6 +984,8 @@
},
"node_modules/cross-spawn/node_modules/which": {
"version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
"dev": true,
"license": "ISC",
"dependencies": {
@@ -838,6 +1000,8 @@
},
"node_modules/crypto-random-string": {
"version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz",
+ "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==",
"dev": true,
"license": "MIT",
"engines": {
@@ -846,6 +1010,8 @@
},
"node_modules/cspell": {
"version": "4.2.8",
+ "resolved": "https://registry.npmjs.org/cspell/-/cspell-4.2.8.tgz",
+ "integrity": "sha512-eqan8+lCU9bSp8Tl4+SR/ccBnuPyMmp7evck/RlMdFTjLh/s+3vQ5hQyBzbzK8w2MMqL84CymW7BwIOKjpylSg==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -869,6 +1035,8 @@
},
"node_modules/cspell-glob": {
"version": "0.1.25",
+ "resolved": "https://registry.npmjs.org/cspell-glob/-/cspell-glob-0.1.25.tgz",
+ "integrity": "sha512-/XaSHrGBpMJa+duFz3GKOWfrijrfdHT7a/XGgIcq3cymCSpOH+DPho42sl0jLI/hjM+8yv2m8aEoxRT8yVSnlg==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -880,6 +1048,8 @@
},
"node_modules/cspell-io": {
"version": "4.1.7",
+ "resolved": "https://registry.npmjs.org/cspell-io/-/cspell-io-4.1.7.tgz",
+ "integrity": "sha512-V0/tUu9FnIS3v+vAvDT6NNa14Nc/zUNX8+YUUOfFAiDJJTdqefmvcWjOJBIMYBf3wIk9iWLmLbMM+bNHqr7DSQ==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -892,6 +1062,8 @@
},
"node_modules/cspell-lib": {
"version": "4.3.12",
+ "resolved": "https://registry.npmjs.org/cspell-lib/-/cspell-lib-4.3.12.tgz",
+ "integrity": "sha512-yCCb6MoW1K8Tsr/WVEQoO4dfYhH9bCsjQayccb8MlyDaNNuWJHuX+gUGHsZSXSuChSh8PrTWKXJzs13/uM977g==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -946,6 +1118,8 @@
},
"node_modules/cspell-trie-lib": {
"version": "4.2.8",
+ "resolved": "https://registry.npmjs.org/cspell-trie-lib/-/cspell-trie-lib-4.2.8.tgz",
+ "integrity": "sha512-Nt3c0gxOYXIc3/yhALDukpje1BgR6guvlUKWQO2zb0r7qRWpwUw2j2YM4dWbHQeH/3Hx5ei4Braa6cMaiJ5YBw==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -957,6 +1131,8 @@
},
"node_modules/cspell-util-bundle": {
"version": "4.1.11",
+ "resolved": "https://registry.npmjs.org/cspell-util-bundle/-/cspell-util-bundle-4.1.11.tgz",
+ "integrity": "sha512-or3OGKydZs1NwweMIgnA48k8H3F5zK4e5lonjUhpEzLYQZ2nB23decdoqZ8ogFC8pFTA40tZKDsMJ0b+65gX4Q==",
"dev": true,
"license": "MIT",
"engines": {
@@ -965,6 +1141,8 @@
},
"node_modules/debug": {
"version": "4.3.4",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
+ "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -981,11 +1159,15 @@
},
"node_modules/deep-is": {
"version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
+ "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
"dev": true,
"license": "MIT"
},
"node_modules/deepmerge": {
"version": "4.2.2",
+ "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz",
+ "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==",
"dev": true,
"license": "MIT",
"engines": {
@@ -1005,6 +1187,8 @@
},
"node_modules/dir-glob": {
"version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
+ "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -1016,6 +1200,8 @@
},
"node_modules/doctrine": {
"version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
+ "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
@@ -1027,6 +1213,8 @@
},
"node_modules/dot-prop": {
"version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz",
+ "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -1038,11 +1226,15 @@
},
"node_modules/emoji-regex": {
"version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
"dev": true,
"license": "MIT"
},
"node_modules/enquirer": {
"version": "2.3.6",
+ "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz",
+ "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -1054,6 +1246,8 @@
},
"node_modules/error-ex": {
"version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
+ "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -1095,6 +1289,8 @@
},
"node_modules/es-to-primitive": {
"version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz",
+ "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -1111,6 +1307,8 @@
},
"node_modules/eslint": {
"version": "7.32.0",
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz",
+ "integrity": "sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -1167,6 +1365,8 @@
},
"node_modules/eslint-config-prettier": {
"version": "6.15.0",
+ "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-6.15.0.tgz",
+ "integrity": "sha512-a1+kOYLR8wMGustcgAjdydMsQ2A/2ipRPwRKUmfYaSxc9ZPcrku080Ctl6zrZzZNs/U82MjSv+qKREkoq3bJaw==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -1181,6 +1381,8 @@
},
"node_modules/eslint-config-prettier/node_modules/get-stdin": {
"version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-6.0.0.tgz",
+ "integrity": "sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g==",
"dev": true,
"license": "MIT",
"engines": {
@@ -1189,6 +1391,8 @@
},
"node_modules/eslint-import-resolver-node": {
"version": "0.3.6",
+ "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz",
+ "integrity": "sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -1198,6 +1402,8 @@
},
"node_modules/eslint-import-resolver-node/node_modules/debug": {
"version": "3.2.7",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
+ "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -1218,6 +1424,8 @@
},
"node_modules/eslint-module-utils/node_modules/debug": {
"version": "3.2.7",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
+ "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -1237,6 +1445,8 @@
},
"node_modules/eslint-module-utils/node_modules/locate-path": {
"version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz",
+ "integrity": "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -1249,6 +1459,8 @@
},
"node_modules/eslint-module-utils/node_modules/p-limit": {
"version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz",
+ "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -1260,6 +1472,8 @@
},
"node_modules/eslint-module-utils/node_modules/p-locate": {
"version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz",
+ "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -1271,6 +1485,8 @@
},
"node_modules/eslint-module-utils/node_modules/p-try": {
"version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz",
+ "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==",
"dev": true,
"license": "MIT",
"engines": {
@@ -1279,6 +1495,8 @@
},
"node_modules/eslint-module-utils/node_modules/path-exists": {
"version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
+ "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==",
"dev": true,
"license": "MIT",
"engines": {
@@ -1287,6 +1505,8 @@
},
"node_modules/eslint-plugin-eslint-comments": {
"version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-eslint-comments/-/eslint-plugin-eslint-comments-3.2.0.tgz",
+ "integrity": "sha512-0jkOl0hfojIHHmEHgmNdqv4fmh7300NdpA9FFpF7zaoLvB/QeXOGNLIo86oAveJFrfB1p05kC8hpEMHM8DwWVQ==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -1305,6 +1525,8 @@
},
"node_modules/eslint-plugin-eslint-comments/node_modules/escape-string-regexp": {
"version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
"dev": true,
"license": "MIT",
"engines": {
@@ -1313,6 +1535,8 @@
},
"node_modules/eslint-plugin-functional": {
"version": "3.7.2",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-functional/-/eslint-plugin-functional-3.7.2.tgz",
+ "integrity": "sha512-BuWPOeE0nuXYlZjObYOHnYf7G3iG+sysxw84I579MsrH+hy5XdXb2sdabmXQ5z7eFGCg2/DWNbZ/yz5GAgtcUg==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -1341,6 +1565,8 @@
},
"node_modules/eslint-plugin-functional/node_modules/escape-string-regexp": {
"version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
+ "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
"dev": true,
"license": "MIT",
"engines": {
@@ -1378,6 +1604,8 @@
},
"node_modules/eslint-plugin-import/node_modules/debug": {
"version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -1386,6 +1614,8 @@
},
"node_modules/eslint-plugin-import/node_modules/doctrine": {
"version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
+ "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
@@ -1397,6 +1627,8 @@
},
"node_modules/eslint-plugin-import/node_modules/ms": {
"version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
"dev": true,
"license": "MIT"
},
@@ -1422,6 +1654,8 @@
},
"node_modules/eslint-scope": {
"version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz",
+ "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==",
"dev": true,
"license": "BSD-2-Clause",
"dependencies": {
@@ -1434,6 +1668,8 @@
},
"node_modules/eslint-utils": {
"version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz",
+ "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -1451,6 +1687,8 @@
},
"node_modules/eslint-visitor-keys": {
"version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz",
+ "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==",
"dev": true,
"license": "Apache-2.0",
"engines": {
@@ -1459,6 +1697,8 @@
},
"node_modules/eslint/node_modules/@babel/code-frame": {
"version": "7.12.11",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz",
+ "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -1467,6 +1707,8 @@
},
"node_modules/eslint/node_modules/escape-string-regexp": {
"version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
+ "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
"dev": true,
"license": "MIT",
"engines": {
@@ -1478,6 +1720,8 @@
},
"node_modules/eslint/node_modules/eslint-utils": {
"version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz",
+ "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -1492,6 +1736,8 @@
},
"node_modules/eslint/node_modules/eslint-utils/node_modules/eslint-visitor-keys": {
"version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz",
+ "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==",
"dev": true,
"license": "Apache-2.0",
"engines": {
@@ -1500,6 +1746,8 @@
},
"node_modules/eslint/node_modules/ignore": {
"version": "4.0.6",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz",
+ "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==",
"dev": true,
"license": "MIT",
"engines": {
@@ -1508,6 +1756,8 @@
},
"node_modules/eslint/node_modules/strip-json-comments": {
"version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
+ "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
"dev": true,
"license": "MIT",
"engines": {
@@ -1519,6 +1769,8 @@
},
"node_modules/espree": {
"version": "7.3.1",
+ "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz",
+ "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==",
"dev": true,
"license": "BSD-2-Clause",
"dependencies": {
@@ -1532,6 +1784,8 @@
},
"node_modules/espree/node_modules/acorn": {
"version": "7.4.1",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz",
+ "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==",
"dev": true,
"license": "MIT",
"bin": {
@@ -1543,6 +1797,8 @@
},
"node_modules/espree/node_modules/eslint-visitor-keys": {
"version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz",
+ "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==",
"dev": true,
"license": "Apache-2.0",
"engines": {
@@ -1551,6 +1807,8 @@
},
"node_modules/esprima": {
"version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
+ "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
"dev": true,
"license": "BSD-2-Clause",
"bin": {
@@ -1563,6 +1821,8 @@
},
"node_modules/esquery": {
"version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz",
+ "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==",
"dev": true,
"license": "BSD-3-Clause",
"dependencies": {
@@ -1574,6 +1834,8 @@
},
"node_modules/esquery/node_modules/estraverse": {
"version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
+ "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
"dev": true,
"license": "BSD-2-Clause",
"engines": {
@@ -1582,6 +1844,8 @@
},
"node_modules/esrecurse": {
"version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
+ "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
"dev": true,
"license": "BSD-2-Clause",
"dependencies": {
@@ -1593,6 +1857,8 @@
},
"node_modules/esrecurse/node_modules/estraverse": {
"version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
+ "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
"dev": true,
"license": "BSD-2-Clause",
"engines": {
@@ -1601,6 +1867,8 @@
},
"node_modules/estraverse": {
"version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
+ "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
"dev": true,
"license": "BSD-2-Clause",
"engines": {
@@ -1609,6 +1877,8 @@
},
"node_modules/esutils": {
"version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
+ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
"dev": true,
"license": "BSD-2-Clause",
"engines": {
@@ -1617,16 +1887,22 @@
},
"node_modules/fast-deep-equal": {
"version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
+ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
"dev": true,
"license": "MIT"
},
"node_modules/fast-diff": {
"version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz",
+ "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==",
"dev": true,
"license": "Apache-2.0"
},
"node_modules/fast-glob": {
"version": "3.2.11",
+ "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz",
+ "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -1642,16 +1918,22 @@
},
"node_modules/fast-json-stable-stringify": {
"version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
+ "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
"dev": true,
"license": "MIT"
},
"node_modules/fast-levenshtein": {
"version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+ "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==",
"dev": true,
"license": "MIT"
},
"node_modules/fastq": {
"version": "1.13.0",
+ "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz",
+ "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==",
"dev": true,
"license": "ISC",
"dependencies": {
@@ -1660,6 +1942,8 @@
},
"node_modules/file-entry-cache": {
"version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz",
+ "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -1671,6 +1955,8 @@
},
"node_modules/fill-range": {
"version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
+ "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -1682,6 +1968,8 @@
},
"node_modules/flat-cache": {
"version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz",
+ "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -1699,6 +1987,8 @@
},
"node_modules/follow-redirects": {
"version": "1.15.1",
+ "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.1.tgz",
+ "integrity": "sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA==",
"funding": [
{
"type": "individual",
@@ -1717,6 +2007,8 @@
},
"node_modules/fs-extra": {
"version": "9.1.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz",
+ "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -1731,21 +2023,29 @@
},
"node_modules/fs.realpath": {
"version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==",
"dev": true,
"license": "ISC"
},
"node_modules/function-bind": {
"version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
+ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
"dev": true,
"license": "MIT"
},
"node_modules/functional-red-black-tree": {
"version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz",
+ "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==",
"dev": true,
"license": "MIT"
},
"node_modules/gensequence": {
"version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/gensequence/-/gensequence-3.1.1.tgz",
+ "integrity": "sha512-ys3h0hiteRwmY6BsvSttPmkhC0vEQHPJduANBRtH/dlDPZ0UBIb/dXy80IcckXyuQ6LKg+PloRqvGER9IS7F7g==",
"dev": true,
"license": "MIT",
"engines": {
@@ -1767,6 +2067,8 @@
},
"node_modules/get-stdin": {
"version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-8.0.0.tgz",
+ "integrity": "sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg==",
"dev": true,
"license": "MIT",
"engines": {
@@ -1778,6 +2080,8 @@
},
"node_modules/get-symbol-description": {
"version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz",
+ "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -1813,6 +2117,8 @@
},
"node_modules/glob-parent": {
"version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
"dev": true,
"license": "ISC",
"dependencies": {
@@ -1838,6 +2144,8 @@
},
"node_modules/globals/node_modules/type-fest": {
"version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
+ "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
"dev": true,
"license": "(MIT OR CC0-1.0)",
"engines": {
@@ -1849,6 +2157,8 @@
},
"node_modules/globby": {
"version": "11.1.0",
+ "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz",
+ "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -1873,6 +2183,8 @@
},
"node_modules/has": {
"version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
+ "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -1892,6 +2204,8 @@
},
"node_modules/has-flag": {
"version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
"dev": true,
"license": "MIT",
"engines": {
@@ -1900,6 +2214,8 @@
},
"node_modules/has-own-prop": {
"version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/has-own-prop/-/has-own-prop-2.0.0.tgz",
+ "integrity": "sha512-Pq0h+hvsVm6dDEa8x82GnLSYHOzNDt7f0ddFa3FqcQlgzEiptPqL+XrOJNavjOzSYiYWIrgeVYYgGlLmnxwilQ==",
"dev": true,
"license": "MIT",
"engines": {
@@ -1908,6 +2224,8 @@
},
"node_modules/has-symbols": {
"version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
+ "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==",
"dev": true,
"license": "MIT",
"engines": {
@@ -1919,6 +2237,8 @@
},
"node_modules/has-tostringtag": {
"version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz",
+ "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -1933,11 +2253,15 @@
},
"node_modules/hosted-git-info": {
"version": "2.8.9",
+ "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz",
+ "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==",
"dev": true,
"license": "ISC"
},
"node_modules/iconv-lite": {
"version": "0.6.3",
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
+ "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -1949,6 +2273,8 @@
},
"node_modules/ignore": {
"version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz",
+ "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==",
"dev": true,
"license": "MIT",
"engines": {
@@ -1957,6 +2283,8 @@
},
"node_modules/import-fresh": {
"version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
+ "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -1972,6 +2300,8 @@
},
"node_modules/import-fresh/node_modules/resolve-from": {
"version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
+ "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
"dev": true,
"license": "MIT",
"engines": {
@@ -1980,6 +2310,8 @@
},
"node_modules/imurmurhash": {
"version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
+ "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==",
"dev": true,
"license": "MIT",
"engines": {
@@ -1988,6 +2320,8 @@
},
"node_modules/inflight": {
"version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
"dev": true,
"license": "ISC",
"dependencies": {
@@ -1997,11 +2331,15 @@
},
"node_modules/inherits": {
"version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
"dev": true,
"license": "ISC"
},
"node_modules/internal-slot": {
"version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz",
+ "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -2015,11 +2353,15 @@
},
"node_modules/is-arrayish": {
"version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
+ "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==",
"dev": true,
"license": "MIT"
},
"node_modules/is-bigint": {
"version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz",
+ "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -2031,6 +2373,8 @@
},
"node_modules/is-boolean-object": {
"version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz",
+ "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -2046,6 +2390,8 @@
},
"node_modules/is-callable": {
"version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz",
+ "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==",
"dev": true,
"license": "MIT",
"engines": {
@@ -2068,6 +2414,8 @@
},
"node_modules/is-date-object": {
"version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz",
+ "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -2082,6 +2430,8 @@
},
"node_modules/is-extglob": {
"version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
"dev": true,
"license": "MIT",
"engines": {
@@ -2090,6 +2440,8 @@
},
"node_modules/is-fullwidth-code-point": {
"version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
"dev": true,
"license": "MIT",
"engines": {
@@ -2098,6 +2450,8 @@
},
"node_modules/is-glob": {
"version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
+ "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -2109,6 +2463,8 @@
},
"node_modules/is-negative-zero": {
"version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz",
+ "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==",
"dev": true,
"license": "MIT",
"engines": {
@@ -2120,6 +2476,8 @@
},
"node_modules/is-number": {
"version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
"dev": true,
"license": "MIT",
"engines": {
@@ -2142,6 +2500,8 @@
},
"node_modules/is-obj": {
"version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz",
+ "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==",
"dev": true,
"license": "MIT",
"engines": {
@@ -2150,6 +2510,8 @@
},
"node_modules/is-regex": {
"version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz",
+ "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -2173,6 +2535,8 @@
},
"node_modules/is-string": {
"version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz",
+ "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -2187,6 +2551,8 @@
},
"node_modules/is-symbol": {
"version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz",
+ "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -2201,11 +2567,15 @@
},
"node_modules/is-typedarray": {
"version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
+ "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==",
"dev": true,
"license": "MIT"
},
"node_modules/is-weakref": {
"version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz",
+ "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -2217,11 +2587,15 @@
},
"node_modules/isexe": {
"version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
"dev": true,
"license": "ISC"
},
"node_modules/iterable-to-stream": {
"version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/iterable-to-stream/-/iterable-to-stream-1.0.1.tgz",
+ "integrity": "sha512-O62gD5ADMUGtJoOoM9U6LQ7i4byPXUNoHJ6mqsmkQJcom331ZJGDApWgDESWyBMEHEJRjtHozgIiTzYo9RU4UA==",
"dev": true,
"license": "MIT",
"engines": {
@@ -2230,11 +2604,15 @@
},
"node_modules/js-tokens": {
"version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
"dev": true,
"license": "MIT"
},
"node_modules/js-yaml": {
"version": "3.14.1",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
+ "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -2247,6 +2625,8 @@
},
"node_modules/jsep": {
"version": "1.3.6",
+ "resolved": "https://registry.npmjs.org/jsep/-/jsep-1.3.6.tgz",
+ "integrity": "sha512-o7fP1eZVROIChADx7HKiwGRVI0tUqgUUGhaok6DP7cMxpDeparuooREDBDeNk2G5KIB49MBSkRYsCOu4PmZ+1w==",
"license": "MIT",
"engines": {
"node": ">= 10.16.0"
@@ -2254,21 +2634,29 @@
},
"node_modules/json-parse-better-errors": {
"version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz",
+ "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==",
"dev": true,
"license": "MIT"
},
"node_modules/json-schema-traverse": {
"version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
"dev": true,
"license": "MIT"
},
"node_modules/json-stable-stringify-without-jsonify": {
"version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
+ "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==",
"dev": true,
"license": "MIT"
},
"node_modules/json5": {
"version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz",
+ "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -2280,6 +2668,8 @@
},
"node_modules/jsonfile": {
"version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz",
+ "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -2291,6 +2681,8 @@
},
"node_modules/levn": {
"version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
+ "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -2303,16 +2695,22 @@
},
"node_modules/lodash.merge": {
"version": "4.6.2",
+ "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
+ "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
"dev": true,
"license": "MIT"
},
"node_modules/lodash.truncate": {
"version": "4.4.2",
+ "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz",
+ "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==",
"dev": true,
"license": "MIT"
},
"node_modules/lru-cache": {
"version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+ "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
"dev": true,
"license": "ISC",
"dependencies": {
@@ -2324,6 +2722,8 @@
},
"node_modules/make-dir": {
"version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz",
+ "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -2338,6 +2738,8 @@
},
"node_modules/make-dir/node_modules/semver": {
"version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+ "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
"dev": true,
"license": "ISC",
"bin": {
@@ -2346,6 +2748,8 @@
},
"node_modules/memorystream": {
"version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz",
+ "integrity": "sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==",
"dev": true,
"engines": {
"node": ">= 0.10.0"
@@ -2353,6 +2757,8 @@
},
"node_modules/merge2": {
"version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
+ "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
"dev": true,
"license": "MIT",
"engines": {
@@ -2361,6 +2767,8 @@
},
"node_modules/micromatch": {
"version": "4.0.5",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz",
+ "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -2373,6 +2781,8 @@
},
"node_modules/minimatch": {
"version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
"dev": true,
"license": "ISC",
"dependencies": {
@@ -2384,26 +2794,36 @@
},
"node_modules/minimist": {
"version": "1.2.6",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz",
+ "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==",
"dev": true,
"license": "MIT"
},
"node_modules/ms": {
"version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
"dev": true,
"license": "MIT"
},
"node_modules/natural-compare": {
"version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
+ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==",
"dev": true,
"license": "MIT"
},
"node_modules/nice-try": {
"version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz",
+ "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==",
"dev": true,
"license": "MIT"
},
"node_modules/normalize-package-data": {
"version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz",
+ "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==",
"dev": true,
"license": "BSD-2-Clause",
"dependencies": {
@@ -2415,6 +2835,8 @@
},
"node_modules/normalize-package-data/node_modules/semver": {
"version": "5.7.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+ "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
"dev": true,
"license": "ISC",
"bin": {
@@ -2423,6 +2845,8 @@
},
"node_modules/npm-run-all": {
"version": "4.1.5",
+ "resolved": "https://registry.npmjs.org/npm-run-all/-/npm-run-all-4.1.5.tgz",
+ "integrity": "sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -2447,6 +2871,8 @@
},
"node_modules/npm-run-all/node_modules/ansi-styles": {
"version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -2458,6 +2884,8 @@
},
"node_modules/npm-run-all/node_modules/chalk": {
"version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -2471,6 +2899,8 @@
},
"node_modules/npm-run-all/node_modules/color-convert": {
"version": "1.9.3",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
+ "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -2479,11 +2909,15 @@
},
"node_modules/npm-run-all/node_modules/color-name": {
"version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+ "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==",
"dev": true,
"license": "MIT"
},
"node_modules/npm-run-all/node_modules/cross-spawn": {
"version": "6.0.5",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz",
+ "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -2499,6 +2933,8 @@
},
"node_modules/npm-run-all/node_modules/escape-string-regexp": {
"version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
"dev": true,
"license": "MIT",
"engines": {
@@ -2507,6 +2943,8 @@
},
"node_modules/npm-run-all/node_modules/has-flag": {
"version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
"dev": true,
"license": "MIT",
"engines": {
@@ -2515,6 +2953,8 @@
},
"node_modules/npm-run-all/node_modules/load-json-file": {
"version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz",
+ "integrity": "sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -2529,6 +2969,8 @@
},
"node_modules/npm-run-all/node_modules/path-key": {
"version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz",
+ "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==",
"dev": true,
"license": "MIT",
"engines": {
@@ -2537,6 +2979,8 @@
},
"node_modules/npm-run-all/node_modules/path-type": {
"version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz",
+ "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -2548,6 +2992,8 @@
},
"node_modules/npm-run-all/node_modules/pify": {
"version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
+ "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==",
"dev": true,
"license": "MIT",
"engines": {
@@ -2556,6 +3002,8 @@
},
"node_modules/npm-run-all/node_modules/read-pkg": {
"version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz",
+ "integrity": "sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -2569,6 +3017,8 @@
},
"node_modules/npm-run-all/node_modules/semver": {
"version": "5.7.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+ "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
"dev": true,
"license": "ISC",
"bin": {
@@ -2577,6 +3027,8 @@
},
"node_modules/npm-run-all/node_modules/shebang-command": {
"version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
+ "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -2588,6 +3040,8 @@
},
"node_modules/npm-run-all/node_modules/shebang-regex": {
"version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz",
+ "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==",
"dev": true,
"license": "MIT",
"engines": {
@@ -2596,6 +3050,8 @@
},
"node_modules/npm-run-all/node_modules/supports-color": {
"version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -2615,6 +3071,8 @@
},
"node_modules/object-keys": {
"version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
+ "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
"dev": true,
"license": "MIT",
"engines": {
@@ -2640,6 +3098,8 @@
},
"node_modules/object.fromentries": {
"version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.5.tgz",
+ "integrity": "sha512-CAyG5mWQRRiBU57Re4FKoTBjXfDoNwdFVH2Y1tS9PqCsfUTymAohOkEMSG3aRNKmv4lV3O7p1et7c187q6bynw==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -2656,6 +3116,8 @@
},
"node_modules/object.values": {
"version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.5.tgz",
+ "integrity": "sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -2672,6 +3134,8 @@
},
"node_modules/once": {
"version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
"dev": true,
"license": "ISC",
"dependencies": {
@@ -2680,6 +3144,8 @@
},
"node_modules/optionator": {
"version": "0.9.1",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz",
+ "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -2696,6 +3162,8 @@
},
"node_modules/parent-module": {
"version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
+ "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -2707,6 +3175,8 @@
},
"node_modules/parse-json": {
"version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz",
+ "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -2719,6 +3189,8 @@
},
"node_modules/path-is-absolute": {
"version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+ "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==",
"dev": true,
"license": "MIT",
"engines": {
@@ -2727,6 +3199,8 @@
},
"node_modules/path-key": {
"version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
"dev": true,
"license": "MIT",
"engines": {
@@ -2735,11 +3209,15 @@
},
"node_modules/path-parse": {
"version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
+ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
"dev": true,
"license": "MIT"
},
"node_modules/path-type": {
"version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
+ "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
"dev": true,
"license": "MIT",
"engines": {
@@ -2748,6 +3226,8 @@
},
"node_modules/picomatch": {
"version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+ "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
"dev": true,
"license": "MIT",
"engines": {
@@ -2759,6 +3239,8 @@
},
"node_modules/pidtree": {
"version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.3.1.tgz",
+ "integrity": "sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA==",
"dev": true,
"license": "MIT",
"bin": {
@@ -2770,6 +3252,8 @@
},
"node_modules/prelude-ls": {
"version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
+ "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
"dev": true,
"license": "MIT",
"engines": {
@@ -2793,6 +3277,8 @@
},
"node_modules/prettier-linter-helpers": {
"version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz",
+ "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -2804,6 +3290,8 @@
},
"node_modules/progress": {
"version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz",
+ "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==",
"dev": true,
"license": "MIT",
"engines": {
@@ -2812,6 +3300,8 @@
},
"node_modules/queue-microtask": {
"version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
+ "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
"dev": true,
"funding": [
{
@@ -2831,6 +3321,8 @@
},
"node_modules/regexpp": {
"version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz",
+ "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==",
"dev": true,
"license": "MIT",
"engines": {
@@ -2842,6 +3334,8 @@
},
"node_modules/repeat-string": {
"version": "1.6.1",
+ "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
+ "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==",
"dev": true,
"license": "MIT",
"engines": {
@@ -2850,6 +3344,8 @@
},
"node_modules/require-from-string": {
"version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz",
+ "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==",
"dev": true,
"license": "MIT",
"engines": {
@@ -2874,6 +3370,8 @@
},
"node_modules/resolve-from": {
"version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
+ "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
"dev": true,
"license": "MIT",
"engines": {
@@ -2882,6 +3380,8 @@
},
"node_modules/resolve-global": {
"version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-global/-/resolve-global-1.0.0.tgz",
+ "integrity": "sha512-zFa12V4OLtT5XUX/Q4VLvTfBf+Ok0SPc1FNGM/z9ctUdiU618qwKpWnd0CHs3+RqROfyEg/DhuHbMWYqcgljEw==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -2893,6 +3393,8 @@
},
"node_modules/resolve-global/node_modules/global-dirs": {
"version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz",
+ "integrity": "sha512-NknMLn7F2J7aflwFOlGdNIuCDpN3VGoSoB+aap3KABFWbHVn1TCgFC+np23J8W2BiZbjfEw3BFBycSMv1AFblg==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -2904,11 +3406,15 @@
},
"node_modules/resolve-global/node_modules/ini": {
"version": "1.3.8",
+ "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz",
+ "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==",
"dev": true,
"license": "ISC"
},
"node_modules/reusify": {
"version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
+ "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
"dev": true,
"license": "MIT",
"engines": {
@@ -2918,6 +3424,8 @@
},
"node_modules/rimraf": {
"version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
+ "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
"dev": true,
"license": "ISC",
"dependencies": {
@@ -2932,6 +3440,8 @@
},
"node_modules/run-parallel": {
"version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
+ "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
"dev": true,
"funding": [
{
@@ -2954,6 +3464,8 @@
},
"node_modules/safer-buffer": {
"version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
+ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
"dev": true,
"license": "MIT"
},
@@ -2973,6 +3485,8 @@
},
"node_modules/shebang-command": {
"version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+ "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -2984,6 +3498,8 @@
},
"node_modules/shebang-regex": {
"version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
"dev": true,
"license": "MIT",
"engines": {
@@ -2992,11 +3508,15 @@
},
"node_modules/shell-quote": {
"version": "1.7.3",
+ "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.3.tgz",
+ "integrity": "sha512-Vpfqwm4EnqGdlsBFNmHhxhElJYrdfcxPThu+ryKS5J8L/fhAwLazFZtq+S+TWZ9ANj2piSQLGj6NQg+lKPmxrw==",
"dev": true,
"license": "MIT"
},
"node_modules/side-channel": {
"version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz",
+ "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -3010,11 +3530,15 @@
},
"node_modules/signal-exit": {
"version": "3.0.7",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
+ "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
"dev": true,
"license": "ISC"
},
"node_modules/slash": {
"version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
+ "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
"dev": true,
"license": "MIT",
"engines": {
@@ -3023,6 +3547,8 @@
},
"node_modules/spdx-correct": {
"version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz",
+ "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
@@ -3032,11 +3558,15 @@
},
"node_modules/spdx-exceptions": {
"version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz",
+ "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==",
"dev": true,
"license": "CC-BY-3.0"
},
"node_modules/spdx-expression-parse": {
"version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz",
+ "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -3051,11 +3581,15 @@
},
"node_modules/sprintf-js": {
"version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
+ "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==",
"dev": true,
"license": "BSD-3-Clause"
},
"node_modules/string-width": {
"version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -3069,6 +3603,8 @@
},
"node_modules/string.prototype.padend": {
"version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/string.prototype.padend/-/string.prototype.padend-3.1.3.tgz",
+ "integrity": "sha512-jNIIeokznm8SD/TZISQsZKYu7RJyheFNt84DUPrh482GC8RVp2MKqm2O5oBRdGxbDQoXrhhWtPIWQOiy20svUg==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -3109,6 +3645,8 @@
},
"node_modules/strip-ansi": {
"version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -3120,6 +3658,8 @@
},
"node_modules/strip-bom": {
"version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
+ "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==",
"dev": true,
"license": "MIT",
"engines": {
@@ -3128,6 +3668,8 @@
},
"node_modules/supports-color": {
"version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -3139,6 +3681,8 @@
},
"node_modules/supports-preserve-symlinks-flag": {
"version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
+ "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
"dev": true,
"license": "MIT",
"engines": {
@@ -3150,6 +3694,8 @@
},
"node_modules/table": {
"version": "6.8.0",
+ "resolved": "https://registry.npmjs.org/table/-/table-6.8.0.tgz",
+ "integrity": "sha512-s/fitrbVeEyHKFa7mFdkuQMWlH1Wgw/yEXMt5xACT4ZpzWFluehAxRtUUQKPuWhaLAWhFcVx6w3oC8VKaUfPGA==",
"dev": true,
"license": "BSD-3-Clause",
"dependencies": {
@@ -3165,6 +3711,8 @@
},
"node_modules/table/node_modules/ajv": {
"version": "8.11.0",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz",
+ "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -3180,6 +3728,8 @@
},
"node_modules/table/node_modules/ansi-styles": {
"version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -3194,11 +3744,15 @@
},
"node_modules/table/node_modules/json-schema-traverse": {
"version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
+ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
"dev": true,
"license": "MIT"
},
"node_modules/table/node_modules/slice-ansi": {
"version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz",
+ "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -3215,11 +3769,15 @@
},
"node_modules/text-table": {
"version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
+ "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==",
"dev": true,
"license": "MIT"
},
"node_modules/to-regex-range": {
"version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+ "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -3242,11 +3800,15 @@
},
"node_modules/tslib": {
"version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
+ "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
"dev": true,
"license": "0BSD"
},
"node_modules/tsutils": {
"version": "3.21.0",
+ "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz",
+ "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -3261,6 +3823,8 @@
},
"node_modules/type-check": {
"version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
+ "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -3272,6 +3836,8 @@
},
"node_modules/typedarray-to-buffer": {
"version": "3.1.5",
+ "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz",
+ "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -3307,6 +3873,8 @@
},
"node_modules/unique-string": {
"version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz",
+ "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -3318,6 +3886,8 @@
},
"node_modules/universalify": {
"version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz",
+ "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==",
"dev": true,
"license": "MIT",
"engines": {
@@ -3326,6 +3896,8 @@
},
"node_modules/uri-js": {
"version": "4.4.1",
+ "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
+ "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
"dev": true,
"license": "BSD-2-Clause",
"dependencies": {
@@ -3334,6 +3906,8 @@
},
"node_modules/uri-js/node_modules/punycode": {
"version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
+ "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
"dev": true,
"license": "MIT",
"engines": {
@@ -3342,11 +3916,15 @@
},
"node_modules/v8-compile-cache": {
"version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz",
+ "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==",
"dev": true,
"license": "MIT"
},
"node_modules/validate-npm-package-license": {
"version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz",
+ "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
@@ -3356,11 +3934,15 @@
},
"node_modules/vscode-uri": {
"version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.0.3.tgz",
+ "integrity": "sha512-EcswR2S8bpR7fD0YPeS7r2xXExrScVMxg4MedACaWHEtx9ftCF/qHG1xGkolzTPcEmjTavCQgbVzHUIdTMzFGA==",
"dev": true,
"license": "MIT"
},
"node_modules/which": {
"version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
+ "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
"dev": true,
"license": "ISC",
"dependencies": {
@@ -3372,6 +3954,8 @@
},
"node_modules/which-boxed-primitive": {
"version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz",
+ "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -3387,6 +3971,8 @@
},
"node_modules/word-wrap": {
"version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz",
+ "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==",
"dev": true,
"license": "MIT",
"engines": {
@@ -3395,11 +3981,15 @@
},
"node_modules/wrappy": {
"version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
"dev": true,
"license": "ISC"
},
"node_modules/write-file-atomic": {
"version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz",
+ "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==",
"dev": true,
"license": "ISC",
"dependencies": {
@@ -3411,6 +4001,8 @@
},
"node_modules/xdg-basedir": {
"version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz",
+ "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==",
"dev": true,
"license": "MIT",
"engines": {
@@ -3419,6 +4011,8 @@
},
"node_modules/yallist": {
"version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
"dev": true,
"license": "ISC"
}
@@ -3439,6 +4033,8 @@
"dependencies": {
"ansi-styles": {
"version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
"dev": true,
"requires": {
"color-convert": "^1.9.0"
@@ -3446,6 +4042,8 @@
},
"chalk": {
"version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
"dev": true,
"requires": {
"ansi-styles": "^3.2.1",
@@ -3455,6 +4053,8 @@
},
"color-convert": {
"version": "1.9.3",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
+ "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
"dev": true,
"requires": {
"color-name": "1.1.3"
@@ -3462,18 +4062,26 @@
},
"color-name": {
"version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+ "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==",
"dev": true
},
"escape-string-regexp": {
"version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
"dev": true
},
"has-flag": {
"version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
"dev": true
},
"supports-color": {
"version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
"dev": true,
"requires": {
"has-flag": "^3.0.0"
@@ -3483,138 +4091,206 @@
},
"@cspell/dict-aws": {
"version": "1.0.14",
+ "resolved": "https://registry.npmjs.org/@cspell/dict-aws/-/dict-aws-1.0.14.tgz",
+ "integrity": "sha512-K21CfB4ZpKYwwDQiPfic2zJA/uxkbsd4IQGejEvDAhE3z8wBs6g6BwwqdVO767M9NgZqc021yAVpr79N5pWe3w==",
"dev": true
},
"@cspell/dict-bash": {
"version": "1.0.18",
+ "resolved": "https://registry.npmjs.org/@cspell/dict-bash/-/dict-bash-1.0.18.tgz",
+ "integrity": "sha512-kJIqQ+FD2TCSgaaP5XLEDgy222+pVWTc+VhveNO++gnTWU3BCVjkD5LjfW7g/CmGONnz+nwXDueWspProaSdJw==",
"dev": true
},
"@cspell/dict-companies": {
"version": "1.0.40",
+ "resolved": "https://registry.npmjs.org/@cspell/dict-companies/-/dict-companies-1.0.40.tgz",
+ "integrity": "sha512-Aw07qiTroqSST2P5joSrC4uOA05zTXzI2wMb+me3q4Davv1D9sCkzXY0TGoC2vzhNv5ooemRi9KATGaBSdU1sw==",
"dev": true
},
"@cspell/dict-cpp": {
"version": "1.1.40",
+ "resolved": "https://registry.npmjs.org/@cspell/dict-cpp/-/dict-cpp-1.1.40.tgz",
+ "integrity": "sha512-sscfB3woNDNj60/yGXAdwNtIRWZ89y35xnIaJVDMk5TPMMpaDvuk0a34iOPIq0g4V+Y8e3RyAg71SH6ADwSjGw==",
"dev": true
},
"@cspell/dict-cryptocurrencies": {
"version": "1.0.10",
+ "resolved": "https://registry.npmjs.org/@cspell/dict-cryptocurrencies/-/dict-cryptocurrencies-1.0.10.tgz",
+ "integrity": "sha512-47ABvDJOkaST/rXipNMfNvneHUzASvmL6K/CbOFpYKfsd0x23Jc9k1yaOC7JAm82XSC/8a7+3Yu+Fk2jVJNnsA==",
"dev": true
},
"@cspell/dict-csharp": {
"version": "1.0.11",
+ "resolved": "https://registry.npmjs.org/@cspell/dict-csharp/-/dict-csharp-1.0.11.tgz",
+ "integrity": "sha512-nub+ZCiTgmT87O+swI+FIAzNwaZPWUGckJU4GN402wBq420V+F4ZFqNV7dVALJrGaWH7LvADRtJxi6cZVHJKeA==",
"dev": true
},
"@cspell/dict-css": {
"version": "1.0.13",
+ "resolved": "https://registry.npmjs.org/@cspell/dict-css/-/dict-css-1.0.13.tgz",
+ "integrity": "sha512-HU8RbFRoGanFH85mT01Ot/Ay48ixr/gG25VPLtdq56QTrmPsw79gxYm/5Qay16eQbpoPIxaj5CAWNam+DX4GbA==",
"dev": true
},
"@cspell/dict-django": {
"version": "1.0.26",
+ "resolved": "https://registry.npmjs.org/@cspell/dict-django/-/dict-django-1.0.26.tgz",
+ "integrity": "sha512-mn9bd7Et1L2zuibc08GVHTiD2Go3/hdjyX5KLukXDklBkq06r+tb0OtKtf1zKodtFDTIaYekGADhNhA6AnKLkg==",
"dev": true
},
"@cspell/dict-dotnet": {
"version": "1.0.32",
+ "resolved": "https://registry.npmjs.org/@cspell/dict-dotnet/-/dict-dotnet-1.0.32.tgz",
+ "integrity": "sha512-9H9vXrgJB4KF8xsyTToXO53cXD33iyfrpT4mhCds+YLUw3P3x3E9myszgJzshnrxYBvQZ+QMII57Qr6SjZVk4Q==",
"dev": true
},
"@cspell/dict-elixir": {
"version": "1.0.26",
+ "resolved": "https://registry.npmjs.org/@cspell/dict-elixir/-/dict-elixir-1.0.26.tgz",
+ "integrity": "sha512-hz1yETUiRJM7yjN3mITSnxcmZaEyaBbyJhpZPpg+cKUil+xhHeZ2wwfbRc83QHGmlqEuDWbdCFqKSpCDJYpYhg==",
"dev": true
},
"@cspell/dict-en_us": {
"version": "1.2.45",
+ "resolved": "https://registry.npmjs.org/@cspell/dict-en_us/-/dict-en_us-1.2.45.tgz",
+ "integrity": "sha512-UPwR4rfiJCxnS+Py+EK9E4AUj3aPZE4p/yBRSHN+5aBQConlI0lLDtMceH5wlupA/sQTU1ERZGPJA9L96jVSyQ==",
"dev": true
},
"@cspell/dict-en-gb": {
"version": "1.1.33",
+ "resolved": "https://registry.npmjs.org/@cspell/dict-en-gb/-/dict-en-gb-1.1.33.tgz",
+ "integrity": "sha512-tKSSUf9BJEV+GJQAYGw5e+ouhEe2ZXE620S7BLKe3ZmpnjlNG9JqlnaBhkIMxKnNFkLY2BP/EARzw31AZnOv4g==",
"dev": true
},
"@cspell/dict-filetypes": {
"version": "1.1.8",
+ "resolved": "https://registry.npmjs.org/@cspell/dict-filetypes/-/dict-filetypes-1.1.8.tgz",
+ "integrity": "sha512-EllahNkhzvLWo0ptwu0l3oEeAJOQSUpZnDfnKRIh6mJVehuSovNHwA9vrdZ8jBUjuqcfaN2e7c32zN0D/qvWJQ==",
"dev": true
},
"@cspell/dict-fonts": {
"version": "1.0.14",
+ "resolved": "https://registry.npmjs.org/@cspell/dict-fonts/-/dict-fonts-1.0.14.tgz",
+ "integrity": "sha512-VhIX+FVYAnqQrOuoFEtya6+H72J82cIicz9QddgknsTqZQ3dvgp6lmVnsQXPM3EnzA8n1peTGpLDwHzT7ociLA==",
"dev": true
},
"@cspell/dict-fullstack": {
"version": "1.0.39",
+ "resolved": "https://registry.npmjs.org/@cspell/dict-fullstack/-/dict-fullstack-1.0.39.tgz",
+ "integrity": "sha512-Mbi+zWdiP9yzL+X4YD9Tgcm5YQ95Ql+Y3vF2LRnOY6g2QWaijTRN1rgksVuxzpFqHi//+bx2uoUb0XEKBYDi8g==",
"dev": true
},
"@cspell/dict-golang": {
"version": "1.1.24",
+ "resolved": "https://registry.npmjs.org/@cspell/dict-golang/-/dict-golang-1.1.24.tgz",
+ "integrity": "sha512-qq3Cjnx2U1jpeWAGJL1GL0ylEhUMqyaR36Xij6Y6Aq4bViCRp+HRRqk0x5/IHHbOrti45h3yy7ii1itRFo+Xkg==",
"dev": true
},
"@cspell/dict-haskell": {
"version": "1.0.13",
+ "resolved": "https://registry.npmjs.org/@cspell/dict-haskell/-/dict-haskell-1.0.13.tgz",
+ "integrity": "sha512-kvl8T84cnYRPpND/P3D86P6WRSqebsbk0FnMfy27zo15L5MLAb3d3MOiT1kW3vEWfQgzUD7uddX/vUiuroQ8TA==",
"dev": true
},
"@cspell/dict-html": {
"version": "1.1.9",
+ "resolved": "https://registry.npmjs.org/@cspell/dict-html/-/dict-html-1.1.9.tgz",
+ "integrity": "sha512-vvnYia0tyIS5Fdoz+gEQm77MGZZE66kOJjuNpIYyRHCXFAhWdYz3SmkRm6YKJSWSvuO+WBJYTKDvkOxSh3Fx/w==",
"dev": true
},
"@cspell/dict-html-symbol-entities": {
"version": "1.0.23",
+ "resolved": "https://registry.npmjs.org/@cspell/dict-html-symbol-entities/-/dict-html-symbol-entities-1.0.23.tgz",
+ "integrity": "sha512-PV0UBgcBFbBLf/m1wfkVMM8w96kvfHoiCGLWO6BR3Q9v70IXoE4ae0+T+f0CkxcEkacMqEQk/I7vuE9MzrjaNw==",
"dev": true
},
"@cspell/dict-java": {
"version": "1.0.23",
+ "resolved": "https://registry.npmjs.org/@cspell/dict-java/-/dict-java-1.0.23.tgz",
+ "integrity": "sha512-LcOg9srYLDoNGd8n3kbfDBlZD+LOC9IVcnFCdua1b/luCHNVmlgBx7e677qPu7olpMYOD5TQIVW2OmM1+/6MFA==",
"dev": true
},
"@cspell/dict-latex": {
"version": "1.0.25",
+ "resolved": "https://registry.npmjs.org/@cspell/dict-latex/-/dict-latex-1.0.25.tgz",
+ "integrity": "sha512-cEgg91Migqcp1SdVV7dUeMxbPDhxdNo6Fgq2eygAXQjIOFK520FFvh/qxyBvW90qdZbIRoU2AJpchyHfGuwZFA==",
"dev": true
},
"@cspell/dict-lorem-ipsum": {
"version": "1.0.22",
+ "resolved": "https://registry.npmjs.org/@cspell/dict-lorem-ipsum/-/dict-lorem-ipsum-1.0.22.tgz",
+ "integrity": "sha512-yqzspR+2ADeAGUxLTfZ4pXvPl7FmkENMRcGDECmddkOiuEwBCWMZdMP5fng9B0Q6j91hQ8w9CLvJKBz10TqNYg==",
"dev": true
},
"@cspell/dict-lua": {
"version": "1.0.16",
+ "resolved": "https://registry.npmjs.org/@cspell/dict-lua/-/dict-lua-1.0.16.tgz",
+ "integrity": "sha512-YiHDt8kmHJ8nSBy0tHzaxiuitYp+oJ66ffCYuFWTNB3//Y0SI4OGHU3omLsQVeXIfCeVrO4DrVvRDoCls9B5zQ==",
"dev": true
},
"@cspell/dict-node": {
"version": "1.0.12",
+ "resolved": "https://registry.npmjs.org/@cspell/dict-node/-/dict-node-1.0.12.tgz",
+ "integrity": "sha512-RPNn/7CSkflAWk0sbSoOkg0ORrgBARUjOW3QjB11KwV1gSu8f5W/ij/S50uIXtlrfoBLqd4OyE04jyON+g/Xfg==",
"dev": true
},
"@cspell/dict-npm": {
"version": "1.0.16",
+ "resolved": "https://registry.npmjs.org/@cspell/dict-npm/-/dict-npm-1.0.16.tgz",
+ "integrity": "sha512-RwkuZGcYBxL3Yux3cSG/IOWGlQ1e9HLCpHeyMtTVGYKAIkFAVUnGrz20l16/Q7zUG7IEktBz5O42kAozrEnqMQ==",
"dev": true
},
"@cspell/dict-php": {
"version": "1.0.25",
+ "resolved": "https://registry.npmjs.org/@cspell/dict-php/-/dict-php-1.0.25.tgz",
+ "integrity": "sha512-RoBIP5MRdByyPaXcznZMfOY1JdCMYPPLua5E9gkq0TJO7bX5mC9hyAKfYBSWVQunZydd82HZixjb5MPkDFU1uw==",
"dev": true
},
"@cspell/dict-powershell": {
"version": "1.0.19",
+ "resolved": "https://registry.npmjs.org/@cspell/dict-powershell/-/dict-powershell-1.0.19.tgz",
+ "integrity": "sha512-zF/raM/lkhXeHf4I43OtK0gP9rBeEJFArscTVwLWOCIvNk21MJcNoTYoaGw+c056+Q+hJL0psGLO7QN+mxYH1A==",
"dev": true
},
"@cspell/dict-python": {
"version": "1.0.38",
+ "resolved": "https://registry.npmjs.org/@cspell/dict-python/-/dict-python-1.0.38.tgz",
+ "integrity": "sha512-KuyOQaby9NID/pn7EkXilpUxjVIvvyLzhr7BPsDS6FcvUE8Yhss6bJowEDHSv6pa+W2387phoqbDf2rTicquAA==",
"dev": true
},
"@cspell/dict-ruby": {
"version": "1.0.15",
+ "resolved": "https://registry.npmjs.org/@cspell/dict-ruby/-/dict-ruby-1.0.15.tgz",
+ "integrity": "sha512-I76hJA///lc1pgmDTGUFHN/O8KLIZIU/8TgIYIGI6Ix/YzSEvWNdQYbANn6JbCynS0X+7IbZ2Ft+QqvmGtIWuA==",
"dev": true
},
"@cspell/dict-rust": {
"version": "1.0.23",
+ "resolved": "https://registry.npmjs.org/@cspell/dict-rust/-/dict-rust-1.0.23.tgz",
+ "integrity": "sha512-lR4boDzs79YD6+30mmiSGAMMdwh7HTBAPUFSB0obR3Kidibfc3GZ+MHWZXay5dxZ4nBKM06vyjtanF9VJ8q1Iw==",
"dev": true
},
"@cspell/dict-scala": {
"version": "1.0.21",
+ "resolved": "https://registry.npmjs.org/@cspell/dict-scala/-/dict-scala-1.0.21.tgz",
+ "integrity": "sha512-5V/R7PRbbminTpPS3ywgdAalI9BHzcEjEj9ug4kWYvBIGwSnS7T6QCFCiu+e9LvEGUqQC+NHgLY4zs1NaBj2vA==",
"dev": true
},
"@cspell/dict-software-terms": {
"version": "1.0.48",
+ "resolved": "https://registry.npmjs.org/@cspell/dict-software-terms/-/dict-software-terms-1.0.48.tgz",
+ "integrity": "sha512-pfF3Ys2gRffu5ElqkH7FQMDMi/iZMyOzpGMb3FSH0PJ2AnRQ5rRNWght1h2L36YxvXl0mWVaFrrfwiOyRIc8ZQ==",
"dev": true
},
"@cspell/dict-typescript": {
"version": "1.0.20",
+ "resolved": "https://registry.npmjs.org/@cspell/dict-typescript/-/dict-typescript-1.0.20.tgz",
+ "integrity": "sha512-yIuGeeZtQA2gqpGefGjZqBl8iGJpIYWz0QzDqsscNi2qfSnLsbjM0RkRbTehM8y9gGGe7xfgUP5adxceJa5Krg==",
"dev": true
},
"@eslint/eslintrc": {
"version": "0.4.3",
+ "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz",
+ "integrity": "sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==",
"dev": true,
"requires": {
"ajv": "^6.12.4",
@@ -3630,16 +4306,22 @@
"dependencies": {
"ignore": {
"version": "4.0.6",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz",
+ "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==",
"dev": true
},
"strip-json-comments": {
"version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
+ "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
"dev": true
}
}
},
"@humanwhocodes/config-array": {
"version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz",
+ "integrity": "sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==",
"dev": true,
"requires": {
"@humanwhocodes/object-schema": "^1.2.0",
@@ -3649,10 +4331,14 @@
},
"@humanwhocodes/object-schema": {
"version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz",
+ "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==",
"dev": true
},
"@nodelib/fs.scandir": {
"version": "2.1.5",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
+ "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
"dev": true,
"requires": {
"@nodelib/fs.stat": "2.0.5",
@@ -3661,10 +4347,14 @@
},
"@nodelib/fs.stat": {
"version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
+ "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
"dev": true
},
"@nodelib/fs.walk": {
"version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
+ "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
"dev": true,
"requires": {
"@nodelib/fs.scandir": "2.1.5",
@@ -3673,14 +4363,20 @@
},
"@types/json-schema": {
"version": "7.0.11",
+ "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz",
+ "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==",
"dev": true
},
"@types/json5": {
"version": "0.0.29",
+ "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz",
+ "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==",
"dev": true
},
"@typescript-eslint/eslint-plugin": {
"version": "4.33.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.33.0.tgz",
+ "integrity": "sha512-aINiAxGVdOl1eJyVjaWn/YcVAq4Gi/Yo35qHGCnqbWVz61g39D0h23veY/MA0rFFGfxK7TySg2uwDeNv+JgVpg==",
"dev": true,
"requires": {
"@typescript-eslint/experimental-utils": "4.33.0",
@@ -3695,6 +4391,8 @@
},
"@typescript-eslint/experimental-utils": {
"version": "4.33.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.33.0.tgz",
+ "integrity": "sha512-zeQjOoES5JFjTnAhI5QY7ZviczMzDptls15GFsI6jyUOq0kOf9+WonkhtlIhh0RgHRnqj5gdNxW5j1EvAyYg6Q==",
"dev": true,
"requires": {
"@types/json-schema": "^7.0.7",
@@ -3707,6 +4405,8 @@
},
"@typescript-eslint/parser": {
"version": "4.33.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.33.0.tgz",
+ "integrity": "sha512-ZohdsbXadjGBSK0/r+d87X0SBmKzOq4/S5nzK6SBgJspFo9/CUDJ7hjayuze+JK7CZQLDMroqytp7pOcFKTxZA==",
"dev": true,
"requires": {
"@typescript-eslint/scope-manager": "4.33.0",
@@ -3717,6 +4417,8 @@
},
"@typescript-eslint/scope-manager": {
"version": "4.33.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.33.0.tgz",
+ "integrity": "sha512-5IfJHpgTsTZuONKbODctL4kKuQje/bzBRkwHE8UOZ4f89Zeddg+EGZs8PD8NcN4LdM3ygHWYB3ukPAYjvl/qbQ==",
"dev": true,
"requires": {
"@typescript-eslint/types": "4.33.0",
@@ -3725,10 +4427,14 @@
},
"@typescript-eslint/types": {
"version": "4.33.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.33.0.tgz",
+ "integrity": "sha512-zKp7CjQzLQImXEpLt2BUw1tvOMPfNoTAfb8l51evhYbOEEzdWyQNmHWWGPR6hwKJDAi+1VXSBmnhL9kyVTTOuQ==",
"dev": true
},
"@typescript-eslint/typescript-estree": {
"version": "4.33.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.33.0.tgz",
+ "integrity": "sha512-rkWRY1MPFzjwnEVHsxGemDzqqddw2QbTJlICPD9p9I9LfsO8fdmfQPOX3uKfUaGRDFJbfrtm/sXhVXN4E+bzCA==",
"dev": true,
"requires": {
"@typescript-eslint/types": "4.33.0",
@@ -3742,6 +4448,8 @@
},
"@typescript-eslint/visitor-keys": {
"version": "4.33.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.33.0.tgz",
+ "integrity": "sha512-uqi/2aSz9g2ftcHWf8uLPJA70rUv6yuMW5Bohw+bwcuzaxQIHaKFZCKGoGXIrc9vkTJ3+0txM73K0Hq3d5wgIg==",
"dev": true,
"requires": {
"@typescript-eslint/types": "4.33.0",
@@ -3755,11 +4463,15 @@
},
"acorn-jsx": {
"version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
+ "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
"dev": true,
"requires": {}
},
"ajv": {
"version": "6.12.6",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
+ "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
"dev": true,
"requires": {
"fast-deep-equal": "^3.1.1",
@@ -3774,10 +4486,14 @@
},
"ansi-regex": {
"version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
"dev": true
},
"argparse": {
"version": "1.0.10",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
+ "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
"dev": true,
"requires": {
"sprintf-js": "~1.0.2"
@@ -3796,10 +4512,14 @@
},
"array-timsort": {
"version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/array-timsort/-/array-timsort-1.0.3.tgz",
+ "integrity": "sha512-/+3GRL7dDAGEfM6TseQk/U+mi18TU2Ms9I3UlLdUMhz2hbvGNTKdj9xniwXfUqgYhHxRx0+8UnKkvlNwVU+cWQ==",
"dev": true
},
"array-union": {
"version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz",
+ "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==",
"dev": true
},
"array.prototype.flat": {
@@ -3822,24 +4542,34 @@
},
"astral-regex": {
"version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz",
+ "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==",
"dev": true
},
"at-least-node": {
"version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz",
+ "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==",
"dev": true
},
"axios": {
"version": "0.21.4",
+ "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz",
+ "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==",
"requires": {
"follow-redirects": "^1.14.0"
}
},
"balanced-match": {
"version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
"dev": true
},
"brace-expansion": {
"version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
"dev": true,
"requires": {
"balanced-match": "^1.0.0",
@@ -3848,6 +4578,8 @@
},
"braces": {
"version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
+ "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
"dev": true,
"requires": {
"fill-range": "^7.0.1"
@@ -3855,6 +4587,8 @@
},
"call-bind": {
"version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
+ "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
"dev": true,
"requires": {
"function-bind": "^1.1.1",
@@ -3863,10 +4597,14 @@
},
"callsites": {
"version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
+ "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
"dev": true
},
"chalk": {
"version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
"dev": true,
"requires": {
"ansi-styles": "^4.1.0",
@@ -3875,6 +4613,8 @@
"dependencies": {
"ansi-styles": {
"version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
"dev": true,
"requires": {
"color-convert": "^2.0.1"
@@ -3884,6 +4624,8 @@
},
"color-convert": {
"version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
"dev": true,
"requires": {
"color-name": "~1.1.4"
@@ -3891,10 +4633,14 @@
},
"color-name": {
"version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
"dev": true
},
"commander": {
"version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz",
+ "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==",
"dev": true
},
"comment-json": {
@@ -3910,10 +4656,14 @@
},
"concat-map": {
"version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
"dev": true
},
"configstore": {
"version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz",
+ "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==",
"dev": true,
"requires": {
"dot-prop": "^5.2.0",
@@ -3926,10 +4676,14 @@
},
"core-util-is": {
"version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz",
+ "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==",
"dev": true
},
"cross-spawn": {
"version": "7.0.3",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
+ "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
"dev": true,
"requires": {
"path-key": "^3.1.0",
@@ -3939,6 +4693,8 @@
"dependencies": {
"which": {
"version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
"dev": true,
"requires": {
"isexe": "^2.0.0"
@@ -3948,10 +4704,14 @@
},
"crypto-random-string": {
"version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz",
+ "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==",
"dev": true
},
"cspell": {
"version": "4.2.8",
+ "resolved": "https://registry.npmjs.org/cspell/-/cspell-4.2.8.tgz",
+ "integrity": "sha512-eqan8+lCU9bSp8Tl4+SR/ccBnuPyMmp7evck/RlMdFTjLh/s+3vQ5hQyBzbzK8w2MMqL84CymW7BwIOKjpylSg==",
"dev": true,
"requires": {
"chalk": "^4.1.0",
@@ -3968,6 +4728,8 @@
},
"cspell-glob": {
"version": "0.1.25",
+ "resolved": "https://registry.npmjs.org/cspell-glob/-/cspell-glob-0.1.25.tgz",
+ "integrity": "sha512-/XaSHrGBpMJa+duFz3GKOWfrijrfdHT7a/XGgIcq3cymCSpOH+DPho42sl0jLI/hjM+8yv2m8aEoxRT8yVSnlg==",
"dev": true,
"requires": {
"micromatch": "^4.0.2"
@@ -3975,6 +4737,8 @@
},
"cspell-io": {
"version": "4.1.7",
+ "resolved": "https://registry.npmjs.org/cspell-io/-/cspell-io-4.1.7.tgz",
+ "integrity": "sha512-V0/tUu9FnIS3v+vAvDT6NNa14Nc/zUNX8+YUUOfFAiDJJTdqefmvcWjOJBIMYBf3wIk9iWLmLbMM+bNHqr7DSQ==",
"dev": true,
"requires": {
"iconv-lite": "^0.6.2",
@@ -3983,6 +4747,8 @@
},
"cspell-lib": {
"version": "4.3.12",
+ "resolved": "https://registry.npmjs.org/cspell-lib/-/cspell-lib-4.3.12.tgz",
+ "integrity": "sha512-yCCb6MoW1K8Tsr/WVEQoO4dfYhH9bCsjQayccb8MlyDaNNuWJHuX+gUGHsZSXSuChSh8PrTWKXJzs13/uM977g==",
"dev": true,
"requires": {
"@cspell/dict-aws": "^1.0.13",
@@ -4033,6 +4799,8 @@
},
"cspell-trie-lib": {
"version": "4.2.8",
+ "resolved": "https://registry.npmjs.org/cspell-trie-lib/-/cspell-trie-lib-4.2.8.tgz",
+ "integrity": "sha512-Nt3c0gxOYXIc3/yhALDukpje1BgR6guvlUKWQO2zb0r7qRWpwUw2j2YM4dWbHQeH/3Hx5ei4Braa6cMaiJ5YBw==",
"dev": true,
"requires": {
"gensequence": "^3.1.1"
@@ -4040,10 +4808,14 @@
},
"cspell-util-bundle": {
"version": "4.1.11",
+ "resolved": "https://registry.npmjs.org/cspell-util-bundle/-/cspell-util-bundle-4.1.11.tgz",
+ "integrity": "sha512-or3OGKydZs1NwweMIgnA48k8H3F5zK4e5lonjUhpEzLYQZ2nB23decdoqZ8ogFC8pFTA40tZKDsMJ0b+65gX4Q==",
"dev": true
},
"debug": {
"version": "4.3.4",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
+ "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
"dev": true,
"requires": {
"ms": "2.1.2"
@@ -4051,10 +4823,14 @@
},
"deep-is": {
"version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
+ "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
"dev": true
},
"deepmerge": {
"version": "4.2.2",
+ "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz",
+ "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==",
"dev": true
},
"define-properties": {
@@ -4066,6 +4842,8 @@
},
"dir-glob": {
"version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
+ "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==",
"dev": true,
"requires": {
"path-type": "^4.0.0"
@@ -4073,6 +4851,8 @@
},
"doctrine": {
"version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
+ "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
"dev": true,
"requires": {
"esutils": "^2.0.2"
@@ -4080,6 +4860,8 @@
},
"dot-prop": {
"version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz",
+ "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==",
"dev": true,
"requires": {
"is-obj": "^2.0.0"
@@ -4087,10 +4869,14 @@
},
"emoji-regex": {
"version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
"dev": true
},
"enquirer": {
"version": "2.3.6",
+ "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz",
+ "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==",
"dev": true,
"requires": {
"ansi-colors": "^4.1.1"
@@ -4098,6 +4884,8 @@
},
"error-ex": {
"version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
+ "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
"dev": true,
"requires": {
"is-arrayish": "^0.2.1"
@@ -4131,6 +4919,8 @@
},
"es-to-primitive": {
"version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz",
+ "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==",
"dev": true,
"requires": {
"is-callable": "^1.1.4",
@@ -4140,6 +4930,8 @@
},
"eslint": {
"version": "7.32.0",
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz",
+ "integrity": "sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==",
"dev": true,
"requires": {
"@babel/code-frame": "7.12.11",
@@ -4186,6 +4978,8 @@
"dependencies": {
"@babel/code-frame": {
"version": "7.12.11",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz",
+ "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==",
"dev": true,
"requires": {
"@babel/highlight": "^7.10.4"
@@ -4193,10 +4987,14 @@
},
"escape-string-regexp": {
"version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
+ "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
"dev": true
},
"eslint-utils": {
"version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz",
+ "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==",
"dev": true,
"requires": {
"eslint-visitor-keys": "^1.1.0"
@@ -4204,22 +5002,30 @@
"dependencies": {
"eslint-visitor-keys": {
"version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz",
+ "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==",
"dev": true
}
}
},
"ignore": {
"version": "4.0.6",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz",
+ "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==",
"dev": true
},
"strip-json-comments": {
"version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
+ "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
"dev": true
}
}
},
"eslint-config-prettier": {
"version": "6.15.0",
+ "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-6.15.0.tgz",
+ "integrity": "sha512-a1+kOYLR8wMGustcgAjdydMsQ2A/2ipRPwRKUmfYaSxc9ZPcrku080Ctl6zrZzZNs/U82MjSv+qKREkoq3bJaw==",
"dev": true,
"requires": {
"get-stdin": "^6.0.0"
@@ -4227,12 +5033,16 @@
"dependencies": {
"get-stdin": {
"version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-6.0.0.tgz",
+ "integrity": "sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g==",
"dev": true
}
}
},
"eslint-import-resolver-node": {
"version": "0.3.6",
+ "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz",
+ "integrity": "sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw==",
"dev": true,
"requires": {
"debug": "^3.2.7",
@@ -4241,6 +5051,8 @@
"dependencies": {
"debug": {
"version": "3.2.7",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
+ "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
"dev": true,
"requires": {
"ms": "^2.1.1"
@@ -4258,6 +5070,8 @@
"dependencies": {
"debug": {
"version": "3.2.7",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
+ "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
"dev": true,
"requires": {
"ms": "^2.1.1"
@@ -4272,6 +5086,8 @@
},
"locate-path": {
"version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz",
+ "integrity": "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==",
"dev": true,
"requires": {
"p-locate": "^2.0.0",
@@ -4280,6 +5096,8 @@
},
"p-limit": {
"version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz",
+ "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==",
"dev": true,
"requires": {
"p-try": "^1.0.0"
@@ -4287,6 +5105,8 @@
},
"p-locate": {
"version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz",
+ "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==",
"dev": true,
"requires": {
"p-limit": "^1.1.0"
@@ -4294,16 +5114,22 @@
},
"p-try": {
"version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz",
+ "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==",
"dev": true
},
"path-exists": {
"version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
+ "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==",
"dev": true
}
}
},
"eslint-plugin-eslint-comments": {
"version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-eslint-comments/-/eslint-plugin-eslint-comments-3.2.0.tgz",
+ "integrity": "sha512-0jkOl0hfojIHHmEHgmNdqv4fmh7300NdpA9FFpF7zaoLvB/QeXOGNLIo86oAveJFrfB1p05kC8hpEMHM8DwWVQ==",
"dev": true,
"requires": {
"escape-string-regexp": "^1.0.5",
@@ -4312,12 +5138,16 @@
"dependencies": {
"escape-string-regexp": {
"version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
"dev": true
}
}
},
"eslint-plugin-functional": {
"version": "3.7.2",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-functional/-/eslint-plugin-functional-3.7.2.tgz",
+ "integrity": "sha512-BuWPOeE0nuXYlZjObYOHnYf7G3iG+sysxw84I579MsrH+hy5XdXb2sdabmXQ5z7eFGCg2/DWNbZ/yz5GAgtcUg==",
"dev": true,
"requires": {
"@typescript-eslint/experimental-utils": "^4.9.1",
@@ -4329,6 +5159,8 @@
"dependencies": {
"escape-string-regexp": {
"version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
+ "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
"dev": true
}
}
@@ -4354,6 +5186,8 @@
"dependencies": {
"debug": {
"version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
"dev": true,
"requires": {
"ms": "2.0.0"
@@ -4361,6 +5195,8 @@
},
"doctrine": {
"version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
+ "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
"dev": true,
"requires": {
"esutils": "^2.0.2"
@@ -4368,6 +5204,8 @@
},
"ms": {
"version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
"dev": true
}
}
@@ -4381,6 +5219,8 @@
},
"eslint-scope": {
"version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz",
+ "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==",
"dev": true,
"requires": {
"esrecurse": "^4.3.0",
@@ -4389,6 +5229,8 @@
},
"eslint-utils": {
"version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz",
+ "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==",
"dev": true,
"requires": {
"eslint-visitor-keys": "^2.0.0"
@@ -4396,10 +5238,14 @@
},
"eslint-visitor-keys": {
"version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz",
+ "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==",
"dev": true
},
"espree": {
"version": "7.3.1",
+ "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz",
+ "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==",
"dev": true,
"requires": {
"acorn": "^7.4.0",
@@ -4409,20 +5255,28 @@
"dependencies": {
"acorn": {
"version": "7.4.1",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz",
+ "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==",
"dev": true
},
"eslint-visitor-keys": {
"version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz",
+ "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==",
"dev": true
}
}
},
"esprima": {
"version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
+ "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
"dev": true
},
"esquery": {
"version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz",
+ "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==",
"dev": true,
"requires": {
"estraverse": "^5.1.0"
@@ -4430,12 +5284,16 @@
"dependencies": {
"estraverse": {
"version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
+ "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
"dev": true
}
}
},
"esrecurse": {
"version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
+ "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
"dev": true,
"requires": {
"estraverse": "^5.2.0"
@@ -4443,28 +5301,40 @@
"dependencies": {
"estraverse": {
"version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
+ "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
"dev": true
}
}
},
"estraverse": {
"version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
+ "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
"dev": true
},
"esutils": {
"version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
+ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
"dev": true
},
"fast-deep-equal": {
"version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
+ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
"dev": true
},
"fast-diff": {
"version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz",
+ "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==",
"dev": true
},
"fast-glob": {
"version": "3.2.11",
+ "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz",
+ "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==",
"dev": true,
"requires": {
"@nodelib/fs.stat": "^2.0.2",
@@ -4476,14 +5346,20 @@
},
"fast-json-stable-stringify": {
"version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
+ "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
"dev": true
},
"fast-levenshtein": {
"version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+ "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==",
"dev": true
},
"fastq": {
"version": "1.13.0",
+ "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz",
+ "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==",
"dev": true,
"requires": {
"reusify": "^1.0.4"
@@ -4491,6 +5367,8 @@
},
"file-entry-cache": {
"version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz",
+ "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==",
"dev": true,
"requires": {
"flat-cache": "^3.0.4"
@@ -4498,6 +5376,8 @@
},
"fill-range": {
"version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
+ "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
"dev": true,
"requires": {
"to-regex-range": "^5.0.1"
@@ -4505,6 +5385,8 @@
},
"flat-cache": {
"version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz",
+ "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==",
"dev": true,
"requires": {
"flatted": "^3.1.0",
@@ -4516,10 +5398,14 @@
"dev": true
},
"follow-redirects": {
- "version": "1.15.1"
+ "version": "1.15.1",
+ "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.1.tgz",
+ "integrity": "sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA=="
},
"fs-extra": {
"version": "9.1.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz",
+ "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==",
"dev": true,
"requires": {
"at-least-node": "^1.0.0",
@@ -4530,18 +5416,26 @@
},
"fs.realpath": {
"version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==",
"dev": true
},
"function-bind": {
"version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
+ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
"dev": true
},
"functional-red-black-tree": {
"version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz",
+ "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==",
"dev": true
},
"gensequence": {
"version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/gensequence/-/gensequence-3.1.1.tgz",
+ "integrity": "sha512-ys3h0hiteRwmY6BsvSttPmkhC0vEQHPJduANBRtH/dlDPZ0UBIb/dXy80IcckXyuQ6LKg+PloRqvGER9IS7F7g==",
"dev": true
},
"get-intrinsic": {
@@ -4555,10 +5449,14 @@
},
"get-stdin": {
"version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-8.0.0.tgz",
+ "integrity": "sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg==",
"dev": true
},
"get-symbol-description": {
"version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz",
+ "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==",
"dev": true,
"requires": {
"call-bind": "^1.0.2",
@@ -4581,6 +5479,8 @@
},
"glob-parent": {
"version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
"dev": true,
"requires": {
"is-glob": "^4.0.1"
@@ -4595,12 +5495,16 @@
"dependencies": {
"type-fest": {
"version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
+ "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
"dev": true
}
}
},
"globby": {
"version": "11.1.0",
+ "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz",
+ "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==",
"dev": true,
"requires": {
"array-union": "^2.1.0",
@@ -4617,6 +5521,8 @@
},
"has": {
"version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
+ "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
"dev": true,
"requires": {
"function-bind": "^1.1.1"
@@ -4628,18 +5534,26 @@
},
"has-flag": {
"version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
"dev": true
},
"has-own-prop": {
"version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/has-own-prop/-/has-own-prop-2.0.0.tgz",
+ "integrity": "sha512-Pq0h+hvsVm6dDEa8x82GnLSYHOzNDt7f0ddFa3FqcQlgzEiptPqL+XrOJNavjOzSYiYWIrgeVYYgGlLmnxwilQ==",
"dev": true
},
"has-symbols": {
"version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
+ "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==",
"dev": true
},
"has-tostringtag": {
"version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz",
+ "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==",
"dev": true,
"requires": {
"has-symbols": "^1.0.2"
@@ -4647,10 +5561,14 @@
},
"hosted-git-info": {
"version": "2.8.9",
+ "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz",
+ "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==",
"dev": true
},
"iconv-lite": {
"version": "0.6.3",
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
+ "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
"dev": true,
"requires": {
"safer-buffer": ">= 2.1.2 < 3.0.0"
@@ -4658,10 +5576,14 @@
},
"ignore": {
"version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz",
+ "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==",
"dev": true
},
"import-fresh": {
"version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
+ "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==",
"dev": true,
"requires": {
"parent-module": "^1.0.0",
@@ -4670,16 +5592,22 @@
"dependencies": {
"resolve-from": {
"version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
+ "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
"dev": true
}
}
},
"imurmurhash": {
"version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
+ "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==",
"dev": true
},
"inflight": {
"version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
"dev": true,
"requires": {
"once": "^1.3.0",
@@ -4688,10 +5616,14 @@
},
"inherits": {
"version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
"dev": true
},
"internal-slot": {
"version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz",
+ "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==",
"dev": true,
"requires": {
"get-intrinsic": "^1.1.0",
@@ -4701,10 +5633,14 @@
},
"is-arrayish": {
"version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
+ "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==",
"dev": true
},
"is-bigint": {
"version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz",
+ "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==",
"dev": true,
"requires": {
"has-bigints": "^1.0.1"
@@ -4712,6 +5648,8 @@
},
"is-boolean-object": {
"version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz",
+ "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==",
"dev": true,
"requires": {
"call-bind": "^1.0.2",
@@ -4720,6 +5658,8 @@
},
"is-callable": {
"version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz",
+ "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==",
"dev": true
},
"is-core-module": {
@@ -4731,6 +5671,8 @@
},
"is-date-object": {
"version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz",
+ "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==",
"dev": true,
"requires": {
"has-tostringtag": "^1.0.0"
@@ -4738,14 +5680,20 @@
},
"is-extglob": {
"version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
"dev": true
},
"is-fullwidth-code-point": {
"version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
"dev": true
},
"is-glob": {
"version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
+ "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
"dev": true,
"requires": {
"is-extglob": "^2.1.1"
@@ -4753,10 +5701,14 @@
},
"is-negative-zero": {
"version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz",
+ "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==",
"dev": true
},
"is-number": {
"version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
"dev": true
},
"is-number-object": {
@@ -4768,10 +5720,14 @@
},
"is-obj": {
"version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz",
+ "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==",
"dev": true
},
"is-regex": {
"version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz",
+ "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==",
"dev": true,
"requires": {
"call-bind": "^1.0.2",
@@ -4784,6 +5740,8 @@
},
"is-string": {
"version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz",
+ "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==",
"dev": true,
"requires": {
"has-tostringtag": "^1.0.0"
@@ -4791,6 +5749,8 @@
},
"is-symbol": {
"version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz",
+ "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==",
"dev": true,
"requires": {
"has-symbols": "^1.0.2"
@@ -4798,10 +5758,14 @@
},
"is-typedarray": {
"version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
+ "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==",
"dev": true
},
"is-weakref": {
"version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz",
+ "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==",
"dev": true,
"requires": {
"call-bind": "^1.0.2"
@@ -4809,18 +5773,26 @@
},
"isexe": {
"version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
"dev": true
},
"iterable-to-stream": {
"version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/iterable-to-stream/-/iterable-to-stream-1.0.1.tgz",
+ "integrity": "sha512-O62gD5ADMUGtJoOoM9U6LQ7i4byPXUNoHJ6mqsmkQJcom331ZJGDApWgDESWyBMEHEJRjtHozgIiTzYo9RU4UA==",
"dev": true
},
"js-tokens": {
"version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
"dev": true
},
"js-yaml": {
"version": "3.14.1",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
+ "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
"dev": true,
"requires": {
"argparse": "^1.0.7",
@@ -4828,22 +5800,32 @@
}
},
"jsep": {
- "version": "1.3.6"
+ "version": "1.3.6",
+ "resolved": "https://registry.npmjs.org/jsep/-/jsep-1.3.6.tgz",
+ "integrity": "sha512-o7fP1eZVROIChADx7HKiwGRVI0tUqgUUGhaok6DP7cMxpDeparuooREDBDeNk2G5KIB49MBSkRYsCOu4PmZ+1w=="
},
"json-parse-better-errors": {
"version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz",
+ "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==",
"dev": true
},
"json-schema-traverse": {
"version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
"dev": true
},
"json-stable-stringify-without-jsonify": {
"version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
+ "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==",
"dev": true
},
"json5": {
"version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz",
+ "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
"dev": true,
"requires": {
"minimist": "^1.2.0"
@@ -4851,6 +5833,8 @@
},
"jsonfile": {
"version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz",
+ "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==",
"dev": true,
"requires": {
"graceful-fs": "^4.1.6",
@@ -4859,6 +5843,8 @@
},
"levn": {
"version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
+ "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
"dev": true,
"requires": {
"prelude-ls": "^1.2.1",
@@ -4867,14 +5853,20 @@
},
"lodash.merge": {
"version": "4.6.2",
+ "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
+ "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
"dev": true
},
"lodash.truncate": {
"version": "4.4.2",
+ "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz",
+ "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==",
"dev": true
},
"lru-cache": {
"version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+ "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
"dev": true,
"requires": {
"yallist": "^4.0.0"
@@ -4882,6 +5874,8 @@
},
"make-dir": {
"version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz",
+ "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==",
"dev": true,
"requires": {
"semver": "^6.0.0"
@@ -4889,20 +5883,28 @@
"dependencies": {
"semver": {
"version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+ "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
"dev": true
}
}
},
"memorystream": {
"version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz",
+ "integrity": "sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==",
"dev": true
},
"merge2": {
"version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
+ "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
"dev": true
},
"micromatch": {
"version": "4.0.5",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz",
+ "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==",
"dev": true,
"requires": {
"braces": "^3.0.2",
@@ -4911,6 +5913,8 @@
},
"minimatch": {
"version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
"dev": true,
"requires": {
"brace-expansion": "^1.1.7"
@@ -4918,22 +5922,32 @@
},
"minimist": {
"version": "1.2.6",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz",
+ "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==",
"dev": true
},
"ms": {
"version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
"dev": true
},
"natural-compare": {
"version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
+ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==",
"dev": true
},
"nice-try": {
"version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz",
+ "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==",
"dev": true
},
"normalize-package-data": {
"version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz",
+ "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==",
"dev": true,
"requires": {
"hosted-git-info": "^2.1.4",
@@ -4944,12 +5958,16 @@
"dependencies": {
"semver": {
"version": "5.7.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+ "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
"dev": true
}
}
},
"npm-run-all": {
"version": "4.1.5",
+ "resolved": "https://registry.npmjs.org/npm-run-all/-/npm-run-all-4.1.5.tgz",
+ "integrity": "sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ==",
"dev": true,
"requires": {
"ansi-styles": "^3.2.1",
@@ -4965,6 +5983,8 @@
"dependencies": {
"ansi-styles": {
"version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
"dev": true,
"requires": {
"color-convert": "^1.9.0"
@@ -4972,6 +5992,8 @@
},
"chalk": {
"version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
"dev": true,
"requires": {
"ansi-styles": "^3.2.1",
@@ -4981,6 +6003,8 @@
},
"color-convert": {
"version": "1.9.3",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
+ "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
"dev": true,
"requires": {
"color-name": "1.1.3"
@@ -4988,10 +6012,14 @@
},
"color-name": {
"version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+ "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==",
"dev": true
},
"cross-spawn": {
"version": "6.0.5",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz",
+ "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==",
"dev": true,
"requires": {
"nice-try": "^1.0.4",
@@ -5003,14 +6031,20 @@
},
"escape-string-regexp": {
"version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
"dev": true
},
"has-flag": {
"version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
"dev": true
},
"load-json-file": {
"version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz",
+ "integrity": "sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==",
"dev": true,
"requires": {
"graceful-fs": "^4.1.2",
@@ -5021,10 +6055,14 @@
},
"path-key": {
"version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz",
+ "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==",
"dev": true
},
"path-type": {
"version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz",
+ "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==",
"dev": true,
"requires": {
"pify": "^3.0.0"
@@ -5032,10 +6070,14 @@
},
"pify": {
"version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
+ "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==",
"dev": true
},
"read-pkg": {
"version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz",
+ "integrity": "sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==",
"dev": true,
"requires": {
"load-json-file": "^4.0.0",
@@ -5045,10 +6087,14 @@
},
"semver": {
"version": "5.7.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+ "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
"dev": true
},
"shebang-command": {
"version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
+ "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==",
"dev": true,
"requires": {
"shebang-regex": "^1.0.0"
@@ -5056,10 +6102,14 @@
},
"shebang-regex": {
"version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz",
+ "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==",
"dev": true
},
"supports-color": {
"version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
"dev": true,
"requires": {
"has-flag": "^3.0.0"
@@ -5073,6 +6123,8 @@
},
"object-keys": {
"version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
+ "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
"dev": true
},
"object.assign": {
@@ -5087,6 +6139,8 @@
},
"object.fromentries": {
"version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.5.tgz",
+ "integrity": "sha512-CAyG5mWQRRiBU57Re4FKoTBjXfDoNwdFVH2Y1tS9PqCsfUTymAohOkEMSG3aRNKmv4lV3O7p1et7c187q6bynw==",
"dev": true,
"requires": {
"call-bind": "^1.0.2",
@@ -5096,6 +6150,8 @@
},
"object.values": {
"version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.5.tgz",
+ "integrity": "sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg==",
"dev": true,
"requires": {
"call-bind": "^1.0.2",
@@ -5105,6 +6161,8 @@
},
"once": {
"version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
"dev": true,
"requires": {
"wrappy": "1"
@@ -5112,6 +6170,8 @@
},
"optionator": {
"version": "0.9.1",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz",
+ "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==",
"dev": true,
"requires": {
"deep-is": "^0.1.3",
@@ -5124,6 +6184,8 @@
},
"parent-module": {
"version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
+ "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
"dev": true,
"requires": {
"callsites": "^3.0.0"
@@ -5131,6 +6193,8 @@
},
"parse-json": {
"version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz",
+ "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==",
"dev": true,
"requires": {
"error-ex": "^1.3.1",
@@ -5139,30 +6203,44 @@
},
"path-is-absolute": {
"version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+ "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==",
"dev": true
},
"path-key": {
"version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
"dev": true
},
"path-parse": {
"version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
+ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
"dev": true
},
"path-type": {
"version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
+ "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
"dev": true
},
"picomatch": {
"version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+ "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
"dev": true
},
"pidtree": {
"version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.3.1.tgz",
+ "integrity": "sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA==",
"dev": true
},
"prelude-ls": {
"version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
+ "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
"dev": true
},
"prettier": {
@@ -5173,6 +6251,8 @@
},
"prettier-linter-helpers": {
"version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz",
+ "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==",
"dev": true,
"requires": {
"fast-diff": "^1.1.2"
@@ -5180,22 +6260,32 @@
},
"progress": {
"version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz",
+ "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==",
"dev": true
},
"queue-microtask": {
"version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
+ "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
"dev": true
},
"regexpp": {
"version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz",
+ "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==",
"dev": true
},
"repeat-string": {
"version": "1.6.1",
+ "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
+ "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==",
"dev": true
},
"require-from-string": {
"version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz",
+ "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==",
"dev": true
},
"resolve": {
@@ -5209,10 +6299,14 @@
},
"resolve-from": {
"version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
+ "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
"dev": true
},
"resolve-global": {
"version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-global/-/resolve-global-1.0.0.tgz",
+ "integrity": "sha512-zFa12V4OLtT5XUX/Q4VLvTfBf+Ok0SPc1FNGM/z9ctUdiU618qwKpWnd0CHs3+RqROfyEg/DhuHbMWYqcgljEw==",
"dev": true,
"requires": {
"global-dirs": "^0.1.1"
@@ -5220,6 +6314,8 @@
"dependencies": {
"global-dirs": {
"version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz",
+ "integrity": "sha512-NknMLn7F2J7aflwFOlGdNIuCDpN3VGoSoB+aap3KABFWbHVn1TCgFC+np23J8W2BiZbjfEw3BFBycSMv1AFblg==",
"dev": true,
"requires": {
"ini": "^1.3.4"
@@ -5227,16 +6323,22 @@
},
"ini": {
"version": "1.3.8",
+ "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz",
+ "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==",
"dev": true
}
}
},
"reusify": {
"version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
+ "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
"dev": true
},
"rimraf": {
"version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
+ "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
"dev": true,
"requires": {
"glob": "^7.1.3"
@@ -5244,6 +6346,8 @@
},
"run-parallel": {
"version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
+ "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
"dev": true,
"requires": {
"queue-microtask": "^1.2.2"
@@ -5251,6 +6355,8 @@
},
"safer-buffer": {
"version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
+ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
"dev": true
},
"semver": {
@@ -5262,6 +6368,8 @@
},
"shebang-command": {
"version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+ "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
"dev": true,
"requires": {
"shebang-regex": "^3.0.0"
@@ -5269,14 +6377,20 @@
},
"shebang-regex": {
"version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
"dev": true
},
"shell-quote": {
"version": "1.7.3",
+ "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.3.tgz",
+ "integrity": "sha512-Vpfqwm4EnqGdlsBFNmHhxhElJYrdfcxPThu+ryKS5J8L/fhAwLazFZtq+S+TWZ9ANj2piSQLGj6NQg+lKPmxrw==",
"dev": true
},
"side-channel": {
"version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz",
+ "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==",
"dev": true,
"requires": {
"call-bind": "^1.0.0",
@@ -5286,14 +6400,20 @@
},
"signal-exit": {
"version": "3.0.7",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
+ "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
"dev": true
},
"slash": {
"version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
+ "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
"dev": true
},
"spdx-correct": {
"version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz",
+ "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==",
"dev": true,
"requires": {
"spdx-expression-parse": "^3.0.0",
@@ -5302,10 +6422,14 @@
},
"spdx-exceptions": {
"version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz",
+ "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==",
"dev": true
},
"spdx-expression-parse": {
"version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz",
+ "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==",
"dev": true,
"requires": {
"spdx-exceptions": "^2.1.0",
@@ -5318,10 +6442,14 @@
},
"sprintf-js": {
"version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
+ "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==",
"dev": true
},
"string-width": {
"version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
"dev": true,
"requires": {
"emoji-regex": "^8.0.0",
@@ -5331,6 +6459,8 @@
},
"string.prototype.padend": {
"version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/string.prototype.padend/-/string.prototype.padend-3.1.3.tgz",
+ "integrity": "sha512-jNIIeokznm8SD/TZISQsZKYu7RJyheFNt84DUPrh482GC8RVp2MKqm2O5oBRdGxbDQoXrhhWtPIWQOiy20svUg==",
"dev": true,
"requires": {
"call-bind": "^1.0.2",
@@ -5356,6 +6486,8 @@
},
"strip-ansi": {
"version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
"dev": true,
"requires": {
"ansi-regex": "^5.0.1"
@@ -5363,10 +6495,14 @@
},
"strip-bom": {
"version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
+ "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==",
"dev": true
},
"supports-color": {
"version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
"dev": true,
"requires": {
"has-flag": "^4.0.0"
@@ -5374,10 +6510,14 @@
},
"supports-preserve-symlinks-flag": {
"version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
+ "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
"dev": true
},
"table": {
"version": "6.8.0",
+ "resolved": "https://registry.npmjs.org/table/-/table-6.8.0.tgz",
+ "integrity": "sha512-s/fitrbVeEyHKFa7mFdkuQMWlH1Wgw/yEXMt5xACT4ZpzWFluehAxRtUUQKPuWhaLAWhFcVx6w3oC8VKaUfPGA==",
"dev": true,
"requires": {
"ajv": "^8.0.1",
@@ -5389,6 +6529,8 @@
"dependencies": {
"ajv": {
"version": "8.11.0",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz",
+ "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==",
"dev": true,
"requires": {
"fast-deep-equal": "^3.1.1",
@@ -5399,6 +6541,8 @@
},
"ansi-styles": {
"version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
"dev": true,
"requires": {
"color-convert": "^2.0.1"
@@ -5406,10 +6550,14 @@
},
"json-schema-traverse": {
"version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
+ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
"dev": true
},
"slice-ansi": {
"version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz",
+ "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==",
"dev": true,
"requires": {
"ansi-styles": "^4.0.0",
@@ -5421,10 +6569,14 @@
},
"text-table": {
"version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
+ "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==",
"dev": true
},
"to-regex-range": {
"version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+ "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
"dev": true,
"requires": {
"is-number": "^7.0.0"
@@ -5442,10 +6594,14 @@
},
"tslib": {
"version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
+ "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
"dev": true
},
"tsutils": {
"version": "3.21.0",
+ "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz",
+ "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==",
"dev": true,
"requires": {
"tslib": "^1.8.1"
@@ -5453,6 +6609,8 @@
},
"type-check": {
"version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
+ "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
"dev": true,
"requires": {
"prelude-ls": "^1.2.1"
@@ -5460,6 +6618,8 @@
},
"typedarray-to-buffer": {
"version": "3.1.5",
+ "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz",
+ "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==",
"dev": true,
"requires": {
"is-typedarray": "^1.0.0"
@@ -5483,6 +6643,8 @@
},
"unique-string": {
"version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz",
+ "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==",
"dev": true,
"requires": {
"crypto-random-string": "^2.0.0"
@@ -5490,10 +6652,14 @@
},
"universalify": {
"version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz",
+ "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==",
"dev": true
},
"uri-js": {
"version": "4.4.1",
+ "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
+ "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
"dev": true,
"requires": {
"punycode": "^2.1.0"
@@ -5501,16 +6667,22 @@
"dependencies": {
"punycode": {
"version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
+ "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
"dev": true
}
}
},
"v8-compile-cache": {
"version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz",
+ "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==",
"dev": true
},
"validate-npm-package-license": {
"version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz",
+ "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==",
"dev": true,
"requires": {
"spdx-correct": "^3.0.0",
@@ -5519,10 +6691,14 @@
},
"vscode-uri": {
"version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.0.3.tgz",
+ "integrity": "sha512-EcswR2S8bpR7fD0YPeS7r2xXExrScVMxg4MedACaWHEtx9ftCF/qHG1xGkolzTPcEmjTavCQgbVzHUIdTMzFGA==",
"dev": true
},
"which": {
"version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
+ "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
"dev": true,
"requires": {
"isexe": "^2.0.0"
@@ -5530,6 +6706,8 @@
},
"which-boxed-primitive": {
"version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz",
+ "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==",
"dev": true,
"requires": {
"is-bigint": "^1.0.1",
@@ -5541,14 +6719,20 @@
},
"word-wrap": {
"version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz",
+ "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==",
"dev": true
},
"wrappy": {
"version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
"dev": true
},
"write-file-atomic": {
"version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz",
+ "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==",
"dev": true,
"requires": {
"imurmurhash": "^0.1.4",
@@ -5559,10 +6743,14 @@
},
"xdg-basedir": {
"version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz",
+ "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==",
"dev": true
},
"yallist": {
"version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
"dev": true
}
}
diff --git a/packages/nocodb-sdk/src/index.ts b/packages/nocodb-sdk/src/index.ts
index 56408b54bc..cc60bc8476 100644
--- a/packages/nocodb-sdk/src/index.ts
+++ b/packages/nocodb-sdk/src/index.ts
@@ -1,6 +1,7 @@
export * from './lib/XcUIBuilder';
export * from './lib/XcNotification';
export * from './lib/Api';
+export * from './lib/columnRules';
export * from './lib/sqlUi';
export * from './lib/globals';
export * from './lib/helperFunctions';
diff --git a/packages/nocodb-sdk/src/lib/Api.ts b/packages/nocodb-sdk/src/lib/Api.ts
index 8388bb2f4e..56e72d2705 100644
--- a/packages/nocodb-sdk/src/lib/Api.ts
+++ b/packages/nocodb-sdk/src/lib/Api.ts
@@ -571,91 +571,109 @@ export interface HookLogType {
updated_at?: string;
}
-export type ColumnReqType =
- | {
- uidt?:
- | 'ID'
- | 'SingleLineText'
- | 'LongText'
- | 'Attachment'
- | 'Checkbox'
- | 'MultiSelect'
- | 'SingleSelect'
- | 'Collaborator'
- | 'Date'
- | 'Year'
- | 'Time'
- | 'PhoneNumber'
- | 'Email'
- | 'URL'
- | 'Number'
- | 'Decimal'
- | 'Currency'
- | 'Percent'
- | 'Duration'
- | 'Rating'
- | 'Count'
- | 'DateTime'
- | 'CreateTime'
- | 'LastModifiedTime'
- | 'AutoNumber'
- | 'Geometry'
- | 'JSON'
- | 'SpecificDBType'
- | 'Barcode'
- | 'Button';
- id?: string;
- base_id?: string;
- fk_model_id?: string;
- title?: string;
- dt?: string;
- np?: string;
- ns?: string;
- clen?: string | number;
- cop?: string;
- pk?: boolean;
- pv?: boolean;
- rqd?: boolean;
- column_name?: string;
- un?: boolean;
- ct?: string;
- ai?: boolean;
- unique?: boolean;
- cdf?: string;
- cc?: string;
- csn?: string;
- dtx?: string;
- dtxp?: string;
- dtxs?: string;
- au?: boolean;
- ''?: string;
- }
- | {
- uidt: 'LinkToAnotherRecord';
- title: string;
- parentId: string;
- childId: string;
- type: 'hm' | 'bt' | 'mm';
- }
- | {
- uidt?: 'Rollup';
- title?: string;
- fk_relation_column_id?: string;
- fk_rollup_column_id?: string;
- rollup_function?: string;
- }
- | {
- uidt?: 'Lookup';
- title?: string;
- fk_relation_column_id?: string;
- fk_lookup_column_id?: string;
- }
- | {
- uidt?: string;
- formula_raw?: string;
- formula?: string;
- title?: string;
- };
+export interface NormalColumnRequestType {
+ uidt?:
+ | 'ID'
+ | 'SingleLineText'
+ | 'LongText'
+ | 'Attachment'
+ | 'Checkbox'
+ | 'MultiSelect'
+ | 'SingleSelect'
+ | 'Collaborator'
+ | 'Date'
+ | 'Year'
+ | 'Time'
+ | 'PhoneNumber'
+ | 'Email'
+ | 'URL'
+ | 'Number'
+ | 'Decimal'
+ | 'Currency'
+ | 'Percent'
+ | 'Duration'
+ | 'Rating'
+ | 'Count'
+ | 'DateTime'
+ | 'CreateTime'
+ | 'LastModifiedTime'
+ | 'AutoNumber'
+ | 'Geometry'
+ | 'JSON'
+ | 'SpecificDBType'
+ | 'Barcode'
+ | 'Button';
+ id?: string;
+ base_id?: string;
+ fk_model_id?: string;
+ title?: string;
+ dt?: string;
+ np?: string;
+ ns?: string;
+ clen?: string | number;
+ cop?: string;
+ pk?: boolean;
+ pv?: boolean;
+ rqd?: boolean;
+ column_name?: string;
+ un?: boolean;
+ ct?: string;
+ ai?: boolean;
+ unique?: boolean;
+ cdf?: string;
+ cc?: string;
+ csn?: string;
+ dtx?: string;
+ dtxp?: string;
+ dtxs?: string;
+ au?: boolean;
+}
+
+export interface LinkToAnotherColumnReqType {
+ uidt: 'LinkToAnotherRecord';
+ title: string;
+ virtual?: boolean;
+ parentId: string;
+ childId: string;
+ type: 'hm' | 'bt' | 'mm';
+}
+
+export interface RollupColumnReqType {
+ uidt?: 'Rollup';
+ title?: string;
+ fk_relation_column_id?: string;
+ fk_rollup_column_id?: string;
+ rollup_function?: string;
+}
+
+export interface LookupColumnReqType {
+ uidt?: 'Lookup';
+ title?: string;
+ fk_relation_column_id?: string;
+ fk_lookup_column_id?: string;
+}
+
+export interface FormulaColumnReqType {
+ uidt?: string;
+ formula_raw?: string;
+ formula?: string;
+ title?: string;
+}
+
+export type ColumnReqType = (
+ | NormalColumnRequestType
+ | LinkToAnotherColumnReqType
+ | RollupColumnReqType
+ | FormulaColumnReqType
+ | LookupColumnReqType
+) & {
+ column_name?: string;
+ title?: string;
+ column_order?: {
+ view_id?: string;
+ order?: number;
+ };
+};
export interface UserInfoType {
id?: string;
@@ -2600,7 +2618,13 @@ export class Api<
* @request POST:/api/v1/db/meta/views/{viewId}/sorts
* @response `200` `void` OK
*/
- create: (viewId: string, data: SortType, params: RequestParams = {}) =>
+ create: (
+ viewId: string,
+ data: SortType & {
+ push_to_top?: boolean;
+ },
+ params: RequestParams = {}
+ ) =>
this.request({
path: `/api/v1/db/meta/views/${viewId}/sorts`,
method: 'POST',
diff --git a/packages/nocodb-sdk/src/lib/UITypes.ts b/packages/nocodb-sdk/src/lib/UITypes.ts
index d2834416fe..e8d069bf81 100644
--- a/packages/nocodb-sdk/src/lib/UITypes.ts
+++ b/packages/nocodb-sdk/src/lib/UITypes.ts
@@ -35,6 +35,7 @@ enum UITypes {
JSON = 'JSON',
SpecificDBType = 'SpecificDBType',
Barcode = 'Barcode',
+ QrCode = 'QrCode',
Button = 'Button',
}
@@ -50,6 +51,7 @@ export function isVirtualCol(
// UITypes.SpecificDBType,
UITypes.LinkToAnotherRecord,
UITypes.Formula,
+ UITypes.QrCode,
UITypes.Rollup,
UITypes.Lookup,
// UITypes.Count,
diff --git a/packages/nocodb-sdk/src/lib/columnRules/QrCodeRules.ts b/packages/nocodb-sdk/src/lib/columnRules/QrCodeRules.ts
new file mode 100644
index 0000000000..1d02ae702f
--- /dev/null
+++ b/packages/nocodb-sdk/src/lib/columnRules/QrCodeRules.ts
@@ -0,0 +1,10 @@
+import UITypes from '../UITypes';
+
+export const AllowedColumnTypesForQrCode = [
+ UITypes.Formula,
+ UITypes.SingleLineText,
+ UITypes.LongText,
+ UITypes.PhoneNumber,
+ UITypes.URL,
+ UITypes.Email,
+];
diff --git a/packages/nocodb-sdk/src/lib/columnRules/index.ts b/packages/nocodb-sdk/src/lib/columnRules/index.ts
new file mode 100644
index 0000000000..30acec12c9
--- /dev/null
+++ b/packages/nocodb-sdk/src/lib/columnRules/index.ts
@@ -0,0 +1 @@
+export * from './QrCodeRules';
diff --git a/packages/nocodb/package-lock.json b/packages/nocodb/package-lock.json
index 5586097908..7514a69aeb 100644
--- a/packages/nocodb/package-lock.json
+++ b/packages/nocodb/package-lock.json
@@ -14712,9 +14712,9 @@
}
},
"node_modules/terser": {
- "version": "5.14.1",
- "resolved": "https://registry.npmjs.org/terser/-/terser-5.14.1.tgz",
- "integrity": "sha512-+ahUAE+iheqBTDxXhTisdA8hgvbEG1hHOQ9xmNjeUJSoi6DU/gMrKNcfZjHkyY6Alnuyc+ikYJaxxfHkT3+WuQ==",
+ "version": "5.15.1",
+ "resolved": "https://registry.npmjs.org/terser/-/terser-5.15.1.tgz",
+ "integrity": "sha512-K1faMUvpm/FBxjBXud0LWVAGxmvoPbZbfTCYbSgaaYQaIXI3/TdI7a7ZGA73Zrou6Q8Zmz3oeUTsp/dj+ag2Xw==",
"dev": true,
"dependencies": {
"@jridgewell/source-map": "^0.3.2",
@@ -17138,9 +17138,9 @@
}
},
"node_modules/webpack/node_modules/terser": {
- "version": "4.8.0",
- "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.0.tgz",
- "integrity": "sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw==",
+ "version": "4.8.1",
+ "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.1.tgz",
+ "integrity": "sha512-4GnLC0x667eJG0ewJTa6z/yXrbLGv80D9Ru6HIpCQmO+Q4PfEtBFi0ObSckqwL6VyQv/7ENJieXHo2ANmdQwgw==",
"dev": true,
"dependencies": {
"commander": "^2.20.0",
@@ -29218,9 +29218,9 @@
}
},
"terser": {
- "version": "5.14.1",
- "resolved": "https://registry.npmjs.org/terser/-/terser-5.14.1.tgz",
- "integrity": "sha512-+ahUAE+iheqBTDxXhTisdA8hgvbEG1hHOQ9xmNjeUJSoi6DU/gMrKNcfZjHkyY6Alnuyc+ikYJaxxfHkT3+WuQ==",
+ "version": "5.15.1",
+ "resolved": "https://registry.npmjs.org/terser/-/terser-5.15.1.tgz",
+ "integrity": "sha512-K1faMUvpm/FBxjBXud0LWVAGxmvoPbZbfTCYbSgaaYQaIXI3/TdI7a7ZGA73Zrou6Q8Zmz3oeUTsp/dj+ag2Xw==",
"dev": true,
"requires": {
"@jridgewell/source-map": "^0.3.2",
@@ -30824,9 +30824,9 @@
}
},
"terser": {
- "version": "4.8.0",
- "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.0.tgz",
- "integrity": "sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw==",
+ "version": "4.8.1",
+ "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.1.tgz",
+ "integrity": "sha512-4GnLC0x667eJG0ewJTa6z/yXrbLGv80D9Ru6HIpCQmO+Q4PfEtBFi0ObSckqwL6VyQv/7ENJieXHo2ANmdQwgw==",
"dev": true,
"requires": {
"commander": "^2.20.0",
diff --git a/packages/nocodb/src/lib/constants/index.ts b/packages/nocodb/src/lib/constants/index.ts
index e52388f60a..c2fdcb32cf 100644
--- a/packages/nocodb/src/lib/constants/index.ts
+++ b/packages/nocodb/src/lib/constants/index.ts
@@ -1,2 +1,4 @@
export const NC_LICENSE_KEY = 'nc-license-key';
export const NC_APP_SETTINGS = 'nc-app-settings';
+export const NC_ATTACHMENT_FIELD_SIZE =
+ +process.env['NC_ATTACHMENT_FIELD_SIZE'] || 20 * 1024 * 1024; // 20 MB
diff --git a/packages/nocodb/src/lib/db/sql-client/lib/KnexClient.ts b/packages/nocodb/src/lib/db/sql-client/lib/KnexClient.ts
index 78270235c7..2d17336b59 100644
--- a/packages/nocodb/src/lib/db/sql-client/lib/KnexClient.ts
+++ b/packages/nocodb/src/lib/db/sql-client/lib/KnexClient.ts
@@ -5,7 +5,8 @@ import Debug from '../../util/Debug';
import Emit from '../../util/emit';
import Result from '../../util/Result';
-import lodash from 'lodash';
+import findIndex from 'lodash/findIndex';
+import find from 'lodash/find';
import fs from 'fs';
import { promisify } from 'util';
import jsonfile from 'jsonfile';
@@ -685,7 +686,7 @@ class KnexClient extends SqlClient {
}
_isColumnForeignKey(tableObj, cn) {
- if (lodash.findIndex(tableObj.foreignKeys, { cn: cn }) === -1) {
+ if (findIndex(tableObj.foreignKeys, { cn: cn }) === -1) {
return false;
}
return true;
@@ -699,7 +700,7 @@ class KnexClient extends SqlClient {
) {
if (tableObj.primaryKeys.length > 1) {
if (
- lodash.findIndex(tableObj.primaryKeys, {
+ findIndex(tableObj.primaryKeys, {
cn: columnObj.cn,
}) > 0
) {
@@ -763,7 +764,7 @@ class KnexClient extends SqlClient {
if (tableObj.primaryKeys.length) {
const dt = this.getKnexDataTypeMock(pk.ct);
- const col = lodash.find(tableObj.columns, {
+ const col = find(tableObj.columns, {
cn: pk.cn,
});
@@ -778,7 +779,7 @@ class KnexClient extends SqlClient {
let max1 = 10000;
let searchFrom = 0;
- let foundIndex = lodash.findIndex(
+ let foundIndex = findIndex(
tableObj.columns,
{ ck: 'UNI' },
searchFrom
@@ -798,7 +799,7 @@ class KnexClient extends SqlClient {
}
searchFrom = foundIndex;
- foundIndex = lodash.findIndex(
+ foundIndex = findIndex(
tableObj.columns,
{ ck: 'UNI' },
searchFrom + 1
@@ -807,7 +808,7 @@ class KnexClient extends SqlClient {
let max2 = 10000;
searchFrom = 0;
- foundIndex = lodash.findIndex(tableObj.columns, { ck: 'MUL' }, searchFrom);
+ foundIndex = findIndex(tableObj.columns, { ck: 'MUL' }, searchFrom);
while (foundIndex !== -1) {
const col = tableObj.columns[foundIndex];
@@ -823,7 +824,7 @@ class KnexClient extends SqlClient {
}
searchFrom = foundIndex;
- foundIndex = lodash.findIndex(
+ foundIndex = findIndex(
tableObj.columns,
{ ck: 'MUL' },
searchFrom + 1
@@ -1895,7 +1896,7 @@ class KnexClient extends SqlClient {
// let downQuery = "";
//
// for (let i = 0; i < args.columns.length; ++i) {
- // const oldColumn = lodash.find(originalColumns, {
+ // const oldColumn = find(originalColumns, {
// cn: args.columns[i].cno
// });
//
@@ -2046,7 +2047,7 @@ class KnexClient extends SqlClient {
pkUpdate(table, args.columns, args.originalColumns);
} else {
for (let i = 0; i < args.columns.length; ++i) {
- const column = lodash.find(originalColumns, {
+ const column = find(originalColumns, {
cn: args.columns[i].cno,
});
@@ -2090,7 +2091,7 @@ class KnexClient extends SqlClient {
pkUpdate(table, args.columns, args.originalColumns);
} else {
for (let i = 0; i < args.columns.length; ++i) {
- const column = lodash.find(originalColumns, {
+ const column = find(originalColumns, {
cn: args.columns[i].cno,
});
if (args.columns[i].altered & 8) {
@@ -2124,7 +2125,7 @@ class KnexClient extends SqlClient {
pkUpdate(table, args.columns, args.originalColumns);
} else {
for (let i = 0; i < args.columns.length; ++i) {
- const column = lodash.find(originalColumns, {
+ const column = find(originalColumns, {
cn: args.columns[i].cno,
});
if (args.columns[i].altered & 8) {
diff --git a/packages/nocodb/src/lib/db/sql-client/lib/mssql/MssqlClient.ts b/packages/nocodb/src/lib/db/sql-client/lib/mssql/MssqlClient.ts
index 14c3af08be..27feafb56b 100644
--- a/packages/nocodb/src/lib/db/sql-client/lib/mssql/MssqlClient.ts
+++ b/packages/nocodb/src/lib/db/sql-client/lib/mssql/MssqlClient.ts
@@ -4,7 +4,7 @@ import knex from 'knex';
import KnexClient from '../KnexClient';
import Debug from '../../../util/Debug';
import Result from '../../../util/Result';
-import lodash from 'lodash';
+import find from 'lodash/find';
const log = new Debug('MssqlClient');
@@ -1964,7 +1964,7 @@ class MssqlClient extends KnexClient {
let downQuery = '';
for (let i = 0; i < args.columns.length; ++i) {
- const oldColumn = lodash.find(originalColumns, {
+ const oldColumn = find(originalColumns, {
cn: args.columns[i].cno,
});
diff --git a/packages/nocodb/src/lib/db/sql-client/lib/mysql/MysqlClient.ts b/packages/nocodb/src/lib/db/sql-client/lib/mysql/MysqlClient.ts
index 06fa275e63..bb5c56e338 100644
--- a/packages/nocodb/src/lib/db/sql-client/lib/mysql/MysqlClient.ts
+++ b/packages/nocodb/src/lib/db/sql-client/lib/mysql/MysqlClient.ts
@@ -1,6 +1,8 @@
import knex from 'knex';
-import lodash from 'lodash';
+import isEmpty from 'lodash/isEmpty';
+import mapKeys from 'lodash/mapKeys';
+import find from 'lodash/find';
import Debug from '../../../util/Debug';
import Emit from '../../../util/emit';
import Result from '../../../util/Result';
@@ -551,7 +553,7 @@ class MysqlClient extends KnexClient {
);
if (response.length === 2) {
result.data.list = response[0].map((v) =>
- lodash.mapKeys(v, (_, k) => k.toLowerCase())
+ mapKeys(v, (_, k) => k.toLowerCase())
);
} else {
log.debug('Unknown response for schemaList:', result.data.list.length);
@@ -620,7 +622,7 @@ class MysqlClient extends KnexClient {
for (let i = 0; i < response[0].length; ++i) {
const column: any = {};
- response[0][i] = lodash.mapKeys(response[0][i], (_v, k) =>
+ response[0][i] = mapKeys(response[0][i], (_v, k) =>
k.toLowerCase()
);
@@ -753,7 +755,7 @@ class MysqlClient extends KnexClient {
for (let i = 0; i < response[0].length; ++i) {
let index = response[0][i];
- index = lodash.mapKeys(index, function (_v, k) {
+ index = mapKeys(index, function (_v, k) {
return k.toLowerCase();
});
index.cn = index.column_name;
@@ -810,7 +812,7 @@ class MysqlClient extends KnexClient {
for (let i = 0; i < response[0].length; ++i) {
let index = response[0][i];
- index = lodash.mapKeys(index, function (_v, k) {
+ index = mapKeys(index, function (_v, k) {
return k.toLowerCase();
});
indexes.push(index);
@@ -868,7 +870,7 @@ class MysqlClient extends KnexClient {
for (let i = 0; i < response[0].length; ++i) {
let relation = response[0][i];
- relation = lodash.mapKeys(relation, function (_v, k) {
+ relation = mapKeys(relation, function (_v, k) {
return k.toLowerCase();
});
relations.push(relation);
@@ -923,7 +925,7 @@ class MysqlClient extends KnexClient {
for (let i = 0; i < response[0].length; ++i) {
let relation = response[0][i];
- relation = lodash.mapKeys(relation, function (_v, k) {
+ relation = mapKeys(relation, function (_v, k) {
return k.toLowerCase();
});
relations.push(relation);
@@ -985,7 +987,7 @@ class MysqlClient extends KnexClient {
for (let i = 0; i < response[0].length; ++i) {
let trigger = response[0][i];
- trigger = lodash.mapKeys(trigger, function (_v, k) {
+ trigger = mapKeys(trigger, function (_v, k) {
return k.toLowerCase();
});
trigger.trigger_name = trigger.trigger;
@@ -1040,7 +1042,7 @@ class MysqlClient extends KnexClient {
for (let i = 0; i < response[0].length; ++i) {
let fn = response[0][i];
- fn = lodash.mapKeys(fn, function (_v, k) {
+ fn = mapKeys(fn, function (_v, k) {
return k.toLowerCase();
});
fn.function_name = fn.name;
@@ -1099,7 +1101,7 @@ class MysqlClient extends KnexClient {
for (let i = 0; i < response[0].length; ++i) {
let procedure = response[0][i];
- procedure = lodash.mapKeys(procedure, function (_v, k) {
+ procedure = mapKeys(procedure, function (_v, k) {
return k.toLowerCase();
});
procedure.procedure_name = procedure.name;
@@ -1205,7 +1207,7 @@ class MysqlClient extends KnexClient {
for (let i = 0; i < response[0].length; ++i) {
let _function = response[0][i];
- _function = lodash.mapKeys(_function, function (_v, k) {
+ _function = mapKeys(_function, function (_v, k) {
return k.toLowerCase();
});
@@ -1259,7 +1261,7 @@ class MysqlClient extends KnexClient {
for (let i = 0; i < response[0].length; ++i) {
let procedure = response[0][i];
- procedure = lodash.mapKeys(procedure, function (_v, k) {
+ procedure = mapKeys(procedure, function (_v, k) {
return k.toLowerCase();
});
@@ -1311,7 +1313,7 @@ class MysqlClient extends KnexClient {
for (let i = 0; i < response[0].length; ++i) {
let view = response[0][i];
- view = lodash.mapKeys(view, function (_v, k) {
+ view = mapKeys(view, function (_v, k) {
return k.toLowerCase();
});
@@ -1847,7 +1849,7 @@ class MysqlClient extends KnexClient {
*/
async _getQuery(args) {
try {
- if (lodash.isEmpty(this._version)) {
+ if (isEmpty(this._version)) {
const result = await this.version();
this._version = result.data.object;
log.debug(
@@ -2085,7 +2087,7 @@ class MysqlClient extends KnexClient {
let downQuery = '';
for (let i = 0; i < args.columns.length; ++i) {
- const oldColumn = lodash.find(originalColumns, {
+ const oldColumn = find(originalColumns, {
cn: args.columns[i].cno,
});
diff --git a/packages/nocodb/src/lib/db/sql-client/lib/oracle/OracleClient.ts b/packages/nocodb/src/lib/db/sql-client/lib/oracle/OracleClient.ts
index 990ecf94e7..34779ebbe8 100644
--- a/packages/nocodb/src/lib/db/sql-client/lib/oracle/OracleClient.ts
+++ b/packages/nocodb/src/lib/db/sql-client/lib/oracle/OracleClient.ts
@@ -1,9 +1,9 @@
import knex from 'knex';
-import _ from 'lodash';
import KnexClient from '../KnexClient';
import Debug from '../../../util/Debug';
import Result from '../../../util/Result';
-import lodash from 'lodash';
+import mapKeys from 'lodash/mapKeys';
+import find from 'lodash/find';
const log = new Debug('OracleClient');
@@ -127,7 +127,7 @@ class OracleClient extends KnexClient {
result.data.object = {};
let versionDetails = rows[0];
- versionDetails = _.mapKeys(versionDetails, (_v, k) => k.toLowerCase());
+ versionDetails = mapKeys(versionDetails, (_v, k) => k.toLowerCase());
const version = versionDetails.version.split('.');
result.data.object.version = versionDetails.version;
result.data.object.primary = version[0];
@@ -399,7 +399,7 @@ class OracleClient extends KnexClient {
);
for (let i = 0; i < rows.length; i++) {
let el = rows[i];
- el = _.mapKeys(el, (_v, k) => k.toLowerCase());
+ el = mapKeys(el, (_v, k) => k.toLowerCase());
rows[i] = el;
}
@@ -431,7 +431,7 @@ class OracleClient extends KnexClient {
);
for (let i = 0; i < rows.length; i++) {
let el = rows[i];
- el = _.mapKeys(el, (_v, k) => k.toLowerCase());
+ el = mapKeys(el, (_v, k) => k.toLowerCase());
rows[i] = el;
}
@@ -567,7 +567,7 @@ class OracleClient extends KnexClient {
for (let i = 0; i < response.length; i++) {
let el = response[i];
- el = _.mapKeys(el, (_v, k) => k.toLowerCase());
+ el = mapKeys(el, (_v, k) => k.toLowerCase());
el.np = el.data_precision;
el.pk = el.ck === 'P';
el.nrqd = el.nrqd === 'Y';
@@ -639,7 +639,7 @@ class OracleClient extends KnexClient {
for (let i = 0; i < response.length; i++) {
let el = response[i];
- el = _.mapKeys(el, (_v, k) => k.toLowerCase());
+ el = mapKeys(el, (_v, k) => k.toLowerCase());
el.table = el.tn;
el.non_unique = el.uniqueness === 'NONUNIQUE' ? 1 : 0;
el.non_unique_original = el.uniqueness === 'NONUNIQUE' ? 1 : 0;
@@ -686,7 +686,7 @@ class OracleClient extends KnexClient {
for (let i = 0; i < response.length; i++) {
let el = response[i];
- el = _.mapKeys(el, (_v, k) => k.toLowerCase());
+ el = mapKeys(el, (_v, k) => k.toLowerCase());
el.table = el.tn;
if (el.cst === 'P') el.cst = 'Primary Key';
if (el.cst === 'U') el.cst = 'Unique';
@@ -758,7 +758,7 @@ class OracleClient extends KnexClient {
for (let i = 0; i < response.length; i++) {
let el = response[i];
- el = _.mapKeys(el, (_v, k) => k.toLowerCase());
+ el = mapKeys(el, (_v, k) => k.toLowerCase());
el.rtn = el.r_table_name;
el.rcn = el.r_column_name;
el.non_unique = el.uniqueness === 'NONUNIQUE';
@@ -811,7 +811,7 @@ class OracleClient extends KnexClient {
for (let i = 0; i < response.length; i++) {
let el = response[i];
- el = _.mapKeys(el, (_v, k) => k.toLowerCase());
+ el = mapKeys(el, (_v, k) => k.toLowerCase());
el.rtn = el.r_table_name;
el.rcn = el.r_column_name;
el.non_unique = el.uniqueness === 'NONUNIQUE';
@@ -862,7 +862,7 @@ class OracleClient extends KnexClient {
for (let i = 0; i < response.length; i++) {
let el = response[i];
- el = _.mapKeys(el, (_v, k) => k.toLowerCase());
+ el = mapKeys(el, (_v, k) => k.toLowerCase());
el.trigger = el.trigger_name;
el.table = el.object_name;
el.event = el.triggering_event;
@@ -910,7 +910,7 @@ class OracleClient extends KnexClient {
for (let i = 0; i < response.length; i++) {
let el = response[i];
- el = _.mapKeys(el, (_v, k) => k.toLowerCase());
+ el = mapKeys(el, (_v, k) => k.toLowerCase());
el.function_name = el.object_name;
el.type = el.object_type;
response[i] = el;
@@ -956,7 +956,7 @@ class OracleClient extends KnexClient {
for (let i = 0; i < response.length; i++) {
let el = response[i];
- el = _.mapKeys(el, (_v, k) => k.toLowerCase());
+ el = mapKeys(el, (_v, k) => k.toLowerCase());
el.procedure_name = el.object_name;
el.type = el.object_type;
response[i] = el;
@@ -996,7 +996,7 @@ class OracleClient extends KnexClient {
for (let i = 0; i < response.length; i++) {
let el = response[i];
- el = _.mapKeys(el, (_v, k) => k.toLowerCase());
+ el = mapKeys(el, (_v, k) => k.toLowerCase());
el.view_name = el.object_name;
response[i] = el;
}
@@ -1038,7 +1038,7 @@ class OracleClient extends KnexClient {
let script = '';
for (let i = 0; i < response.length; i++) {
let el = response[i];
- el = _.mapKeys(el, (_v, k) => k.toLowerCase());
+ el = mapKeys(el, (_v, k) => k.toLowerCase());
el.function_name = el.name;
response[i] = el;
script += el.text;
@@ -1084,7 +1084,7 @@ class OracleClient extends KnexClient {
let script = '';
for (let i = 0; i < response.length; i++) {
let el = response[i];
- el = _.mapKeys(el, (_v, k) => k.toLowerCase());
+ el = mapKeys(el, (_v, k) => k.toLowerCase());
el.procedure_name = el.name;
response[i] = el;
script += el.text;
@@ -1124,7 +1124,7 @@ class OracleClient extends KnexClient {
for (let i = 0; i < response.length; i++) {
let el = response[i];
- el = _.mapKeys(el, (_v, k) => k.toLowerCase());
+ el = mapKeys(el, (_v, k) => k.toLowerCase());
el.view_name = el.object_name;
el.view_definition = el.text;
response[i] = el;
@@ -1157,7 +1157,7 @@ class OracleClient extends KnexClient {
for (let i = 0; i < response.length; i++) {
let el = response[i];
- el = _.mapKeys(el, (_v, k) => k.toLowerCase());
+ el = mapKeys(el, (_v, k) => k.toLowerCase());
el.trigger = el.trigger_name;
el.table = el.object_name;
el.event = el.triggering_event;
@@ -1622,7 +1622,7 @@ class OracleClient extends KnexClient {
let downQuery = '';
for (let i = 0; i < args.columns.length; ++i) {
- const oldColumn = lodash.find(originalColumns, {
+ const oldColumn = find(originalColumns, {
cn: args.columns[i].cno,
});
diff --git a/packages/nocodb/src/lib/db/sql-client/lib/pg/PgClient.ts b/packages/nocodb/src/lib/db/sql-client/lib/pg/PgClient.ts
index 29e1d422a3..90e0ec9b1d 100644
--- a/packages/nocodb/src/lib/db/sql-client/lib/pg/PgClient.ts
+++ b/packages/nocodb/src/lib/db/sql-client/lib/pg/PgClient.ts
@@ -1,12 +1,13 @@
import { nanoid } from 'nanoid';
import knex from 'knex';
-import _ from 'lodash';
import KnexClient from '../KnexClient';
import Debug from '../../../util/Debug';
import Result from '../../../util/Result';
import queries from './pg.queries';
-import lodash from 'lodash';
+import isEmpty from 'lodash/isEmpty';
+import mapKeys from 'lodash/mapKeys';
+import find from 'lodash/find';
const log = new Debug('PGClient');
class PGClient extends KnexClient {
@@ -1429,7 +1430,7 @@ class PGClient extends KnexClient {
if (response.length === 2) {
for (let i = 0; i < response[0].length; ++i) {
let procedure = response[0][i];
- procedure = _.mapKeys(procedure, (_v, k) => k.toLowerCase());
+ procedure = mapKeys(procedure, (_v, k) => k.toLowerCase());
procedure.create_procedure = procedure['create procedure'];
rows.push(procedure);
}
@@ -1642,7 +1643,7 @@ class PGClient extends KnexClient {
*/
async _getQuery(args) {
try {
- if (_.isEmpty(this._version)) {
+ if (isEmpty(this._version)) {
const result = await this.version();
this._version = result.data.object;
log.debug(
@@ -2204,7 +2205,7 @@ class PGClient extends KnexClient {
let downQuery = '';
for (let i = 0; i < args.columns.length; ++i) {
- const oldColumn = lodash.find(originalColumns, {
+ const oldColumn = find(originalColumns, {
cn: args.columns[i].cno,
});
diff --git a/packages/nocodb/src/lib/db/sql-client/lib/sqlite/SqliteClient.ts b/packages/nocodb/src/lib/db/sql-client/lib/sqlite/SqliteClient.ts
index 6fa8d075fe..2e77a44df0 100644
--- a/packages/nocodb/src/lib/db/sql-client/lib/sqlite/SqliteClient.ts
+++ b/packages/nocodb/src/lib/db/sql-client/lib/sqlite/SqliteClient.ts
@@ -5,8 +5,12 @@ import KnexClient from '../KnexClient';
import Debug from '../../../util/Debug';
import Result from '../../../util/Result';
import queries from './sqlite.queries';
-import lodash from 'lodash';
-import _ from 'lodash';
+import isEmpty from 'lodash/isEmpty';
+import mapKeys from 'lodash/mapKeys';
+import find from 'lodash/find';
+import { customAlphabet } from 'nanoid';
+
+const nanoid = customAlphabet('1234567890abcdefghijklmnopqrstuvwxyz_', 6);
const log = new Debug('SqliteClient');
@@ -678,7 +682,7 @@ class SqliteClient extends KnexClient {
for (let i = 0; i < response[0].length; ++i) {
let fn = response[0][i];
- fn = _.mapKeys(fn, function (_v, k) {
+ fn = mapKeys(fn, function (_v, k) {
return k.toLowerCase();
});
fn.function_name = fn.name;
@@ -732,7 +736,7 @@ class SqliteClient extends KnexClient {
for (let i = 0; i < response[0].length; ++i) {
let procedure = response[0][i];
- procedure = _.mapKeys(procedure, function (_v, k) {
+ procedure = mapKeys(procedure, function (_v, k) {
return k.toLowerCase();
});
procedure.procedure_name = procedure.name;
@@ -816,7 +820,7 @@ class SqliteClient extends KnexClient {
for (let i = 0; i < response[0].length; ++i) {
let _function = response[0][i];
- _function = _.mapKeys(_function, function (_v, k) {
+ _function = mapKeys(_function, function (_v, k) {
return k.toLowerCase();
});
@@ -868,7 +872,7 @@ class SqliteClient extends KnexClient {
for (let i = 0; i < response[0].length; ++i) {
let procedure = response[0][i];
- procedure = _.mapKeys(procedure, function (_v, k) {
+ procedure = mapKeys(procedure, function (_v, k) {
return k.toLowerCase();
});
@@ -1031,7 +1035,7 @@ class SqliteClient extends KnexClient {
*/
async _getQuery(args) {
try {
- if (_.isEmpty(this._version)) {
+ if (isEmpty(this._version)) {
const result = await this.version();
this._version = result.data.object;
log.debug(
@@ -1491,11 +1495,11 @@ class SqliteClient extends KnexClient {
let downQuery = '';
for (let i = 0; i < args.columns.length; ++i) {
- const oldColumn = lodash.find(originalColumns, {
+ const oldColumn = find(originalColumns, {
cn: args.columns[i].cno,
});
- if (args.columns[i].altered & 4) {
+ if (!args.columns[i].pk && args.columns[i].altered & 4) {
// col remove
upQuery += this.alterTableRemoveColumn(
args.table,
@@ -1544,15 +1548,46 @@ class SqliteClient extends KnexClient {
}
}
- upQuery += this.alterTablePK(
- args.columns,
- args.originalColumns,
- upQuery,
- this.sqlClient
- );
- //downQuery += alterTablePK(args.originalColumns, args.columns, downQuery);
+ const pkQuery = this.alterTablePK(args.columns, args.originalColumns, upQuery);
- await this.sqlClient.raw(upQuery);
+ await this.sqlClient.raw('PRAGMA foreign_keys = OFF;');
+ await this.sqlClient.raw('PRAGMA legacy_alter_table = ON;');
+
+ const trx = await this.sqlClient.transaction();
+
+ try {
+ const queries = upQuery.split(';');
+ for (let i = 0; i < queries.length; i++) {
+ if (queries[i].trim() !== '') {
+ await trx.raw(queries[i]);
+ }
+ }
+
+ if (pkQuery) {
+ await trx.schema.alterTable(args.table, (table) => {
+ for (const pk of pkQuery.oldPks.filter((el) => !pkQuery.newPks.includes(el))) {
+ table.dropPrimary(pk);
+ }
+
+ for (const pk of pkQuery.dropPks) {
+ table.dropColumn(pk);
+ }
+
+ if (pkQuery.newPks.length) {
+ table.primary(pkQuery.newPks);
+ }
+ });
+ }
+
+ await trx.commit();
+ } catch (e) {
+ await trx.rollback();
+ log.ppe(e, _func);
+ throw e;
+ } finally {
+ await this.sqlClient.raw('PRAGMA foreign_keys = ON;');
+ await this.sqlClient.raw('PRAGMA legacy_alter_table = OFF;');
+ }
console.log(upQuery);
@@ -1861,50 +1896,61 @@ class SqliteClient extends KnexClient {
return result;
}
- alterTablePK(n, o, _existingQuery, createTable = false) {
- const numOfPksInOriginal = [];
- const numOfPksInNew = [];
- let pksChanged = 0;
+ createTablePK(n, _existingQuery) {
+ const newPks = [];
+
+ for (let i = 0; i < n.length; ++i) {
+ if (n[i].pk) {
+ if (n[i].altered !== 4) newPks.push(n[i].cn);
+ }
+ }
+
+ let query = '';
+ if (newPks.length) {
+ query += this.genQuery(`, PRIMARY KEY(??)`, [newPks]);
+ }
+
+ return query;
+ }
+
+ alterTablePK(n, o, _existingQuery) {
+ const newPks = [];
+ const oldPks = [];
+ const dropPks = [];
+ let pksChanged = false;
for (let i = 0; i < n.length; ++i) {
if (n[i].pk) {
- if (n[i].altered !== 4) numOfPksInNew.push(n[i].cn);
+ if (n[i].altered !== 4) {
+ newPks.push(n[i].cn);
+ } else {
+ dropPks.push(n[i].cn);
+ }
+ pksChanged = true;
}
}
for (let i = 0; i < o.length; ++i) {
if (o[i].pk) {
- numOfPksInOriginal.push(o[i].cn);
+ oldPks.push(o[i].cn);
}
}
- if (numOfPksInNew.length === numOfPksInOriginal.length) {
- for (let i = 0; i < numOfPksInNew.length; ++i) {
- if (numOfPksInOriginal[i] !== numOfPksInNew[i]) {
- pksChanged = 1;
- break;
- }
+ if (newPks.length === oldPks.length) {
+ if (newPks.every((pk) => oldPks.includes(pk)) && dropPks.length === 0) {
+ pksChanged = false;
}
- } else {
- pksChanged = numOfPksInNew.length - numOfPksInOriginal.length;
}
- let query = '';
- if (!numOfPksInNew.length && !numOfPksInOriginal.length) {
- // do nothing
- } else if (pksChanged) {
- query += numOfPksInOriginal.length ? ',DROP PRIMARY KEY' : '';
-
- if (numOfPksInNew.length) {
- if (createTable) {
- query += this.genQuery(`, PRIMARY KEY(??)`, [numOfPksInNew]);
- } else {
- query += this.genQuery(`, ADD PRIMARY KEY(??)`, [numOfPksInNew]);
- }
+ if (pksChanged) {
+ return {
+ newPks,
+ oldPks,
+ dropPks,
}
+ } else {
+ return false;
}
-
- return query;
}
alterTableRemoveColumn(t, n, _o, existingQuery) {
@@ -1937,7 +1983,7 @@ class SqliteClient extends KnexClient {
query += this.createTableColumn(table, args.columns[i], null, query);
}
- query += this.alterTablePK(args.columns, [], query, true);
+ query += this.createTablePK(args.columns, query);
query = this.genQuery(`CREATE TABLE ?? (${query});`, [args.tn]);
@@ -1950,19 +1996,32 @@ class SqliteClient extends KnexClient {
const defaultValue = getDefaultValue(n);
let shouldSanitize = true;
if (change === 2) {
- query += this.genQuery(
- `ALTER TABLE ?? RENAME COLUMN ?? TO ??`,
- [t, o.cn, n.cn],
+ const suffix = nanoid();
+
+ let backupOldColumnQuery = this.genQuery(
+ `ALTER TABLE ?? RENAME COLUMN ?? TO ??;`,
+ [t, o.cn, `${o.cno}_nc_${suffix}`],
shouldSanitize
);
+
+ let addNewColumnQuery = ''
+ addNewColumnQuery += this.genQuery(` ADD ?? ${n.dt}`, [n.cn], shouldSanitize);
+ addNewColumnQuery += n.dtxp && n.dt !== 'text' ? `(${n.dtxp})` : '';
+ addNewColumnQuery += n.cdf ? ` DEFAULT ${n.cdf}` : !n.rqd ? ' ' : ` DEFAULT ''`;
+ addNewColumnQuery += n.rqd ? ` NOT NULL` : ' ';
+ addNewColumnQuery = this.genQuery(`ALTER TABLE ?? ${addNewColumnQuery};`, [t], shouldSanitize);
+
+ let updateNewColumnQuery = this.genQuery(`UPDATE ?? SET ?? = ??;`, [t, n.cn, `${o.cno}_nc_${suffix}`], shouldSanitize);
+
+ let dropOldColumnQuery = this.genQuery(`ALTER TABLE ?? DROP COLUMN ??;`, [t, `${o.cno}_nc_${suffix}`], shouldSanitize);
+
+ query = `${backupOldColumnQuery}${addNewColumnQuery}${updateNewColumnQuery}${dropOldColumnQuery}`;
} else if (change === 0) {
query = existingQuery ? ',' : '';
query += this.genQuery(`?? ${n.dt}`, [n.cn], shouldSanitize);
query += n.dtxp && n.dt !== 'text' ? `(${n.dtxp})` : '';
query += n.cdf
- ? n.cdf.includes(',')
- ? ` DEFAULT ('${n.cdf}')`
- : ` DEFAULT ${n.cdf}`
+ ? ` DEFAULT ${n.cdf}`
: ' ';
query += n.rqd ? ` NOT NULL` : ' ';
} else if (change === 1) {
@@ -1970,10 +2029,8 @@ class SqliteClient extends KnexClient {
query += this.genQuery(` ADD ?? ${n.dt}`, [n.cn], shouldSanitize);
query += n.dtxp && n.dt !== 'text' ? `(${n.dtxp})` : '';
query += n.cdf
- ? n.cdf.includes(',')
- ? ` DEFAULT ('${n.cdf}')`
- : ` DEFAULT ${n.cdf}`
- : ' ';
+ ? ` DEFAULT ${n.cdf}`
+ : !n.rqd ? ' ' : ` DEFAULT ''`;
query += n.rqd ? ` NOT NULL` : ' ';
query = this.genQuery(`ALTER TABLE ?? ${query};`, [t], shouldSanitize);
} else {
diff --git a/packages/nocodb/src/lib/db/sql-data-mapper/lib/sql/BaseModelSqlv2.ts b/packages/nocodb/src/lib/db/sql-data-mapper/lib/sql/BaseModelSqlv2.ts
index ffd0f5e765..429252ae59 100644
--- a/packages/nocodb/src/lib/db/sql-data-mapper/lib/sql/BaseModelSqlv2.ts
+++ b/packages/nocodb/src/lib/db/sql-data-mapper/lib/sql/BaseModelSqlv2.ts
@@ -44,6 +44,7 @@ import { NcError } from '../../../../meta/helpers/catchError';
import { customAlphabet } from 'nanoid';
import DOMPurify from 'isomorphic-dompurify';
import { sanitize, unsanitize } from './helpers/sanitize';
+import QrCodeColumn from '../../../../models/QrCodeColumn';
const GROUP_COL = '__nc_group_id';
@@ -1210,6 +1211,19 @@ class BaseModelSqlv2 {
});
}
+ private async getSelectQueryBuilderForFormula(column: Column) {
+ const formula = await column.getColOptions();
+ if (formula.error) throw new Error(`Formula error: ${formula.error}`);
+ const selectQb = await formulaQueryBuilderv2(
+ formula.formula,
+ null,
+ this.dbDriver,
+ this.model
+ );
+
+ return selectQb;
+ }
+
async getProto() {
if (this._proto) {
return this._proto;
@@ -1424,24 +1438,54 @@ class BaseModelSqlv2 {
case 'LinkToAnotherRecord':
case 'Lookup':
break;
+ case 'QrCode': {
+ const qrCodeColumn = await column.getColOptions();
+ const qrValueColumn = await Column.get({
+ colId: qrCodeColumn.fk_qr_value_column_id,
+ });
+
+ // If the referenced value cannot be found: cancel current iteration
+ if (qrValueColumn == null) {
+ break;
+ }
+
+ switch (qrValueColumn.uidt) {
+ case UITypes.Formula:
+ try {
+ const selectQb = await this.getSelectQueryBuilderForFormula(
+ qrValueColumn
+ );
+ qb.select({
+ [column.column_name]: selectQb.builder,
+ });
+ } catch {
+ continue;
+ }
+ break;
+ default: {
+ qb.select({ [column.column_name]: qrValueColumn.column_name });
+ break;
+ }
+ }
+
+ break;
+ }
case 'Formula':
{
- const formula = await column.getColOptions();
- if (formula.error) continue;
- const selectQb = await formulaQueryBuilderv2(
- formula.formula,
- null,
- this.dbDriver,
- this.model
- // this.aliasToColumn
- );
- // todo: verify syntax of as ? / ??
- qb.select(
- this.dbDriver.raw(`?? as ??`, [
- selectQb.builder,
- sanitize(column.title),
- ])
- );
+ try {
+ const selectQb = await this.getSelectQueryBuilderForFormula(
+ column
+ );
+ // todo: verify syntax of as ? / ??
+ qb.select(
+ this.dbDriver.raw(`?? as ??`, [
+ selectQb.builder,
+ sanitize(column.title),
+ ])
+ );
+ } catch {
+ continue;
+ }
}
break;
case 'Rollup':
@@ -2172,6 +2216,7 @@ class BaseModelSqlv2 {
f.uidt !== UITypes.Rollup &&
f.uidt !== UITypes.Lookup &&
f.uidt !== UITypes.Formula &&
+ f.uidt !== UITypes.QrCode &&
f.uidt !== UITypes.SpecificDBType
)
.sort(
diff --git a/packages/nocodb/src/lib/db/sql-data-mapper/lib/sql/formulaQueryBuilderFromString.ts b/packages/nocodb/src/lib/db/sql-data-mapper/lib/sql/formulaQueryBuilderFromString.ts
index 99f2fcaf80..929186eaa2 100644
--- a/packages/nocodb/src/lib/db/sql-data-mapper/lib/sql/formulaQueryBuilderFromString.ts
+++ b/packages/nocodb/src/lib/db/sql-data-mapper/lib/sql/formulaQueryBuilderFromString.ts
@@ -136,6 +136,11 @@ export default function formulaQueryBuilder(
type: 'CallExpression',
arguments: [pt.left],
};
+ pt.right = {
+ callee: { name: 'FLOAT' },
+ type: 'CallExpression',
+ arguments: [pt.right],
+ };
}
const query = knex.raw(
diff --git a/packages/nocodb/src/lib/db/sql-data-mapper/lib/sql/formulav2/formulaQueryBuilderv2.ts b/packages/nocodb/src/lib/db/sql-data-mapper/lib/sql/formulav2/formulaQueryBuilderv2.ts
index c4bb68c98b..0c382ea3b4 100644
--- a/packages/nocodb/src/lib/db/sql-data-mapper/lib/sql/formulav2/formulaQueryBuilderv2.ts
+++ b/packages/nocodb/src/lib/db/sql-data-mapper/lib/sql/formulav2/formulaQueryBuilderv2.ts
@@ -646,6 +646,11 @@ export default async function formulaQueryBuilderv2(
type: 'CallExpression',
arguments: [pt.left],
};
+ pt.right = {
+ callee: { name: 'FLOAT' },
+ type: 'CallExpression',
+ arguments: [pt.right],
+ };
}
pt.left.fnName = pt.left.fnName || 'ARITH';
pt.right.fnName = pt.right.fnName || 'ARITH';
diff --git a/packages/nocodb/src/lib/db/sql-data-mapper/lib/sql/functionMappings/mysql.ts b/packages/nocodb/src/lib/db/sql-data-mapper/lib/sql/functionMappings/mysql.ts
index 9aedd96097..1419ca36e9 100644
--- a/packages/nocodb/src/lib/db/sql-data-mapper/lib/sql/functionMappings/mysql.ts
+++ b/packages/nocodb/src/lib/db/sql-data-mapper/lib/sql/functionMappings/mysql.ts
@@ -36,7 +36,7 @@ const mysql2 = {
MID: 'SUBSTR',
FLOAT: (args: MapFnArgs) => {
return args.knex
- .raw(`CAST(${args.fn(args.pt.arguments[0])} as DOUBLE)${args.colAlias}`)
+ .raw(`CAST(CAST(${args.fn(args.pt.arguments[0])} as CHAR) AS DOUBLE)${args.colAlias}`)
.wrap('(', ')');
},
DATEADD: ({ fn, knex, pt, colAlias }: MapFnArgs) => {
diff --git a/packages/nocodb/src/lib/meta/NcMetaMgr.ts b/packages/nocodb/src/lib/meta/NcMetaMgr.ts
index 789279dde6..b44d3df03c 100644
--- a/packages/nocodb/src/lib/meta/NcMetaMgr.ts
+++ b/packages/nocodb/src/lib/meta/NcMetaMgr.ts
@@ -41,6 +41,7 @@ import { defaultConnectionConfig } from '../utils/NcConfigFactory';
import xcMetaDiff from './handlers/xcMetaDiff';
import { UITypes } from 'nocodb-sdk';
import { Tele } from 'nc-help';
+import { NC_ATTACHMENT_FIELD_SIZE } from '../constants';
const randomID = customAlphabet('1234567890abcdefghijklmnopqrstuvwxyz_', 10);
const XC_PLUGIN_DET = 'XC_PLUGIN_DET';
@@ -132,6 +133,9 @@ export default class NcMetaMgr {
storage: multer.diskStorage({
// dest: path.join(this.config.toolDir, 'uploads')
}),
+ limits: {
+ fieldSize: NC_ATTACHMENT_FIELD_SIZE,
+ },
});
// router.post(this.config.dashboardPath, upload.single('file'));
router.post(this.config.dashboardPath, upload.any());
diff --git a/packages/nocodb/src/lib/meta/NcMetaMgrv2.ts b/packages/nocodb/src/lib/meta/NcMetaMgrv2.ts
index 371b353427..596249036f 100644
--- a/packages/nocodb/src/lib/meta/NcMetaMgrv2.ts
+++ b/packages/nocodb/src/lib/meta/NcMetaMgrv2.ts
@@ -11,6 +11,7 @@ import NcPluginMgr from '../v1-legacy/plugins/NcPluginMgr';
import NcMetaIO from './NcMetaIO';
import { defaultConnectionConfig } from '../utils/NcConfigFactory';
import ncCreateLookup from './handlersv2/ncCreateLookup';
+import { NC_ATTACHMENT_FIELD_SIZE } from '../constants';
// import ncGetMeta from './handlersv2/ncGetMeta';
export default class NcMetaMgrv2 {
@@ -71,6 +72,9 @@ export default class NcMetaMgrv2 {
storage: multer.diskStorage({
// dest: path.join(this.config.toolDir, 'uploads')
}),
+ limits: {
+ fieldSize: NC_ATTACHMENT_FIELD_SIZE,
+ },
});
// router.post(this.config.dashboardPath, upload.single('file'));
router.post(this.config.dashboardPath, upload.any());
diff --git a/packages/nocodb/src/lib/meta/api/attachmentApis.ts b/packages/nocodb/src/lib/meta/api/attachmentApis.ts
index 8af6ebfa46..4eb3f7597e 100644
--- a/packages/nocodb/src/lib/meta/api/attachmentApis.ts
+++ b/packages/nocodb/src/lib/meta/api/attachmentApis.ts
@@ -9,6 +9,7 @@ import { Tele } from 'nc-help';
import ncMetaAclMw from '../helpers/ncMetaAclMw';
import catchError from '../helpers/catchError';
import NcPluginMgrv2 from '../helpers/NcPluginMgrv2';
+import { NC_ATTACHMENT_FIELD_SIZE } from '../../constants';
// const storageAdapter = new Local();
export async function upload(req: Request, res: Response) {
@@ -151,6 +152,9 @@ router.post(
'/api/v1/db/storage/upload',
multer({
storage: multer.diskStorage({}),
+ limits: {
+ fieldSize: NC_ATTACHMENT_FIELD_SIZE,
+ },
}).any(),
ncMetaAclMw(upload, 'upload')
);
diff --git a/packages/nocodb/src/lib/meta/api/columnApis.ts b/packages/nocodb/src/lib/meta/api/columnApis.ts
index 9ce86881c4..00551e639f 100644
--- a/packages/nocodb/src/lib/meta/api/columnApis.ts
+++ b/packages/nocodb/src/lib/meta/api/columnApis.ts
@@ -15,9 +15,13 @@ import {
import {
AuditOperationSubTypes,
AuditOperationTypes,
+ ColumnReqType,
isVirtualCol,
+ LinkToAnotherColumnReqType,
LinkToAnotherRecordType,
+ LookupColumnReqType,
RelationTypes,
+ RollupColumnReqType,
substituteColumnAliasWithIdInFormula,
substituteColumnIdWithAliasInFormula,
TableType,
@@ -96,7 +100,10 @@ async function createHmAndBtColumn(
}
}
-export async function columnAdd(req: Request, res: Response) {
+export async function columnAdd(
+ req: Request,
+ res: Response
+) {
const table = await Model.getWithInfo({
id: req.params.tableId,
});
@@ -121,7 +128,7 @@ export async function columnAdd(req: Request, res: Response) {
NcError.badRequest('Duplicate column alias');
}
- let colBody = req.body;
+ let colBody: any = req.body;
switch (colBody.uidt) {
case UITypes.Rollup:
{
@@ -137,7 +144,7 @@ export async function columnAdd(req: Request, res: Response) {
const relation = await (
await Column.get({
- colId: req.body.fk_relation_column_id,
+ colId: (req.body as RollupColumnReqType).fk_relation_column_id,
})
).getColOptions();
@@ -163,7 +170,8 @@ export async function columnAdd(req: Request, res: Response) {
const relatedTable = await relatedColumn.getModel();
if (
!(await relatedTable.getColumns()).find(
- (c) => c.id === req.body.fk_rollup_column_id
+ (c) =>
+ c.id === (req.body as RollupColumnReqType).fk_rollup_column_id
)
)
throw new Error('Rollup column not found in related table');
@@ -183,7 +191,7 @@ export async function columnAdd(req: Request, res: Response) {
const relation = await (
await Column.get({
- colId: req.body.fk_relation_column_id,
+ colId: (req.body as LookupColumnReqType).fk_relation_column_id,
})
).getColOptions();
@@ -209,7 +217,8 @@ export async function columnAdd(req: Request, res: Response) {
const relatedTable = await relatedColumn.getModel();
if (
!(await relatedTable.getColumns()).find(
- (c) => c.id === req.body.fk_lookup_column_id
+ (c) =>
+ c.id === (req.body as LookupColumnReqType).fk_lookup_column_id
)
)
throw new Error('Lookup column not found in related table');
@@ -227,14 +236,21 @@ export async function columnAdd(req: Request, res: Response) {
validateParams(['parentId', 'childId', 'type'], req.body);
// get parent and child models
- const parent = await Model.getWithInfo({ id: req.body.parentId });
- const child = await Model.getWithInfo({ id: req.body.childId });
+ const parent = await Model.getWithInfo({
+ id: (req.body as LinkToAnotherColumnReqType).parentId,
+ });
+ const child = await Model.getWithInfo({
+ id: (req.body as LinkToAnotherColumnReqType).childId,
+ });
let childColumn: Column;
const sqlMgr = await ProjectMgrv2.getSqlMgr({
id: base.project_id,
});
- if (req.body.type === 'hm' || req.body.type === 'bt') {
+ if (
+ (req.body as LinkToAnotherColumnReqType).type === 'hm' ||
+ (req.body as LinkToAnotherColumnReqType).type === 'bt'
+ ) {
// populate fk column name
const fkColName = getUniqueColumnName(
await child.getColumns(),
@@ -285,7 +301,7 @@ export async function columnAdd(req: Request, res: Response) {
childColumn = await Column.get({ colId: id });
// ignore relation creation if virtual
- if (!req.body.virtual) {
+ if (!(req.body as LinkToAnotherColumnReqType).virtual) {
// create relation
await sqlMgr.sqlOpPlus(base, 'relationCreate', {
childColumn: fkColName,
@@ -315,11 +331,11 @@ export async function columnAdd(req: Request, res: Response) {
child,
parent,
childColumn,
- req.body.type,
- req.body.title,
- req.body.virtual
+ (req.body as LinkToAnotherColumnReqType).type as RelationTypes,
+ (req.body as LinkToAnotherColumnReqType).title,
+ (req.body as LinkToAnotherColumnReqType).virtual
);
- } else if (req.body.type === 'mm') {
+ } else if ((req.body as LinkToAnotherColumnReqType).type === 'mm') {
const aTn = `${project?.prefix ?? ''}_nc_m2m_${randomID()}`;
const aTnAlias = aTn;
@@ -378,7 +394,7 @@ export async function columnAdd(req: Request, res: Response) {
columns: associateTableCols,
});
- if (!req.body.virtual) {
+ if (!(req.body as LinkToAnotherColumnReqType).virtual) {
const rel1Args = {
...req.body,
childTable: aTn,
@@ -412,7 +428,7 @@ export async function columnAdd(req: Request, res: Response) {
childCol,
null,
null,
- req.body.virtual,
+ (req.body as LinkToAnotherColumnReqType).virtual,
true
);
await createHmAndBtColumn(
@@ -421,7 +437,7 @@ export async function columnAdd(req: Request, res: Response) {
parentCol,
null,
null,
- req.body.virtual,
+ (req.body as LinkToAnotherColumnReqType).virtual,
true
);
@@ -490,6 +506,12 @@ export async function columnAdd(req: Request, res: Response) {
Tele.emit('evt', { evt_type: 'relation:created' });
break;
+ case UITypes.QrCode:
+ await Column.insert({
+ ...colBody,
+ fk_model_id: table.id,
+ });
+ break;
case UITypes.Formula:
colBody.formula = await substituteColumnAliasWithIdInFormula(
colBody.formula_raw || colBody.formula,
@@ -715,11 +737,17 @@ export async function columnUpdate(req: Request, res: Response) {
UITypes.Rollup,
UITypes.LinkToAnotherRecord,
UITypes.Formula,
+ UITypes.QrCode,
UITypes.ForeignKey,
].includes(column.uidt)
) {
if (column.uidt === colBody.uidt) {
- if (column.uidt === UITypes.Formula) {
+ if (column.uidt === UITypes.QrCode) {
+ await Column.update(column.id, {
+ ...column,
+ ...colBody,
+ });
+ } else if (column.uidt === UITypes.Formula) {
colBody.formula = await substituteColumnAliasWithIdInFormula(
colBody.formula_raw || colBody.formula,
table.columns
@@ -745,6 +773,7 @@ export async function columnUpdate(req: Request, res: Response) {
UITypes.Rollup,
UITypes.LinkToAnotherRecord,
UITypes.Formula,
+ UITypes.QrCode,
UITypes.ForeignKey,
].includes(colBody.uidt)
) {
@@ -1430,6 +1459,7 @@ export async function columnDelete(req: Request, res: Response) {
switch (column.uidt) {
case UITypes.Lookup:
case UITypes.Rollup:
+ case UITypes.QrCode:
case UITypes.Formula:
await Column.delete(req.params.columnId);
break;
diff --git a/packages/nocodb/src/lib/meta/api/index.ts b/packages/nocodb/src/lib/meta/api/index.ts
index ee1d8ab7fc..28ee746356 100644
--- a/packages/nocodb/src/lib/meta/api/index.ts
+++ b/packages/nocodb/src/lib/meta/api/index.ts
@@ -55,6 +55,7 @@ import importApis from './sync/importApis';
import syncSourceApis from './sync/syncSourceApis';
const clients: { [id: string]: Socket } = {};
+const jobs: { [id: string]: { last_message: any } } = {};
export default function (router: Router, server) {
initStrategies(router);
@@ -138,9 +139,16 @@ export default function (router: Router, server) {
socket.on('event', (args) => {
Tele.event({ ...args, id });
});
+ socket.on('subscribe', (room) => {
+ if (room in jobs) {
+ socket.join(room)
+ socket.emit('job')
+ socket.emit('progress', jobs[room].last_message)
+ }
+ })
});
- importApis(router, clients);
+ importApis(router, io, jobs);
}
function getHash(str) {
diff --git a/packages/nocodb/src/lib/meta/api/publicApis/publicDataApis.ts b/packages/nocodb/src/lib/meta/api/publicApis/publicDataApis.ts
index 90eaddeabf..862f2f849f 100644
--- a/packages/nocodb/src/lib/meta/api/publicApis/publicDataApis.ts
+++ b/packages/nocodb/src/lib/meta/api/publicApis/publicDataApis.ts
@@ -18,6 +18,7 @@ import slash from 'slash';
import { sanitizeUrlPath } from '../attachmentApis';
import getAst from '../../../db/sql-data-mapper/lib/sql/helpers/getAst';
import { getColumnByIdOrName } from '../dataApis/helpers';
+import { NC_ATTACHMENT_FIELD_SIZE } from '../../../constants';
export async function dataList(req: Request, res: Response) {
try {
@@ -451,6 +452,9 @@ router.post(
'/api/v1/db/public/shared-view/:sharedViewUuid/rows',
multer({
storage: multer.diskStorage({}),
+ limits: {
+ fieldSize: NC_ATTACHMENT_FIELD_SIZE,
+ },
}).any(),
catchError(dataInsert)
);
diff --git a/packages/nocodb/src/lib/meta/api/sortApis.ts b/packages/nocodb/src/lib/meta/api/sortApis.ts
index 6e40501bbb..60cb02953e 100644
--- a/packages/nocodb/src/lib/meta/api/sortApis.ts
+++ b/packages/nocodb/src/lib/meta/api/sortApis.ts
@@ -4,7 +4,7 @@ import Model from '../../models/Model';
import { Tele } from 'nc-help';
// @ts-ignore
import { PagedResponseImpl } from '../helpers/PagedResponse';
-import { SortListType, TableReqType, TableType } from 'nocodb-sdk';
+import { SortListType, SortType, TableType } from 'nocodb-sdk';
// @ts-ignore
import ProjectMgrv2 from '../../db/sql-mgr/v2/ProjectMgrv2';
// @ts-ignore
@@ -28,11 +28,11 @@ export async function sortList(
}
// @ts-ignore
-export async function sortCreate(req: Request, res) {
+export async function sortCreate(req: Request, res) {
const sort = await Sort.insert({
...req.body,
fk_view_id: req.params.viewId,
- });
+ } as Sort);
Tele.emit('evt', { evt_type: 'sort:created' });
res.json(sort);
}
diff --git a/packages/nocodb/src/lib/meta/api/sync/helpers/readAndProcessData.ts b/packages/nocodb/src/lib/meta/api/sync/helpers/readAndProcessData.ts
index 5fe7f76b5d..ad004205d1 100644
--- a/packages/nocodb/src/lib/meta/api/sync/helpers/readAndProcessData.ts
+++ b/packages/nocodb/src/lib/meta/api/sync/helpers/readAndProcessData.ts
@@ -4,7 +4,7 @@ import EntityMap from './EntityMap';
const BULK_DATA_BATCH_SIZE = 500;
const ASSOC_BULK_DATA_BATCH_SIZE = 1000;
-const BULK_PARALLEL_PROCESS = 100;
+const BULK_PARALLEL_PROCESS = 5;
async function readAllData({
table,
diff --git a/packages/nocodb/src/lib/meta/api/sync/importApis.ts b/packages/nocodb/src/lib/meta/api/sync/importApis.ts
index 15ae1b5e63..fd73736fa4 100644
--- a/packages/nocodb/src/lib/meta/api/sync/importApis.ts
+++ b/packages/nocodb/src/lib/meta/api/sync/importApis.ts
@@ -1,8 +1,8 @@
import { Request, Router } from 'express';
// import { Queue } from 'bullmq';
// import axios from 'axios';
-import catchError from '../../helpers/catchError';
-import { Socket } from 'socket.io';
+import catchError, { NcError } from '../../helpers/catchError';
+import { Server } from 'socket.io';
import NocoJobs from '../../../jobs/NocoJobs';
import job, { AirtableSyncConfig } from './helpers/job';
import SyncSource from '../../../models/SyncSource';
@@ -17,17 +17,25 @@ enum SyncStatus {
FAILED = 'FAILED',
}
-export default (router: Router, clients: { [id: string]: Socket }) => {
+export default (router: Router, sv: Server, jobs: { [id: string]: { last_message: any } }) => {
// add importer job handler and progress notification job handler
NocoJobs.jobsMgr.addJobWorker(AIRTABLE_IMPORT_JOB, job);
NocoJobs.jobsMgr.addJobWorker(
AIRTABLE_PROGRESS_JOB,
({ payload, progress }) => {
- clients?.[payload?.id]?.emit('progress', {
+ sv.to(payload?.id).emit('progress', {
msg: progress?.msg,
level: progress?.level,
status: progress?.status,
});
+
+ if (payload?.id in jobs) {
+ jobs[payload?.id].last_message = {
+ msg: progress?.msg,
+ level: progress?.level,
+ status: progress?.status,
+ };
+ }
}
);
@@ -49,6 +57,7 @@ export default (router: Router, clients: { [id: string]: Socket }) => {
status: SyncStatus.COMPLETED,
},
});
+ delete jobs[payload?.id];
});
NocoJobs.jobsMgr.addFailureCbk(AIRTABLE_IMPORT_JOB, (payload, error: any) => {
NocoJobs.jobsMgr.add(AIRTABLE_PROGRESS_JOB, {
@@ -58,6 +67,7 @@ export default (router: Router, clients: { [id: string]: Socket }) => {
status: SyncStatus.FAILED,
},
});
+ delete jobs[payload?.id];
});
router.post(
@@ -73,6 +83,10 @@ export default (router: Router, clients: { [id: string]: Socket }) => {
router.post(
'/api/v1/db/meta/syncs/:syncId/trigger',
catchError(async (req: Request, res) => {
+ if (req.params.syncId in jobs) {
+ NcError.badRequest('Sync already in progress');
+ }
+
const syncSource = await SyncSource.get(req.params.syncId);
const user = await syncSource.getUser();
@@ -90,12 +104,26 @@ export default (router: Router, clients: { [id: string]: Socket }) => {
}
NocoJobs.jobsMgr.add(AIRTABLE_IMPORT_JOB, {
- id: req.query.id,
+ id: req.params.syncId,
...(syncSource?.details || {}),
projectId: syncSource.project_id,
authToken: token,
baseURL,
});
+ jobs[req.params.syncId] = {
+ last_message: {
+ msg: 'Sync started'
+ }
+ };
+ res.json({});
+ })
+ );
+ router.post(
+ '/api/v1/db/meta/syncs/:syncId/abort',
+ catchError(async (req: Request, res) => {
+ if (req.params.syncId in jobs) {
+ delete jobs[req.params.syncId];
+ }
res.json({});
})
);
diff --git a/packages/nocodb/src/lib/migrations/XcMigrationSourcev2.ts b/packages/nocodb/src/lib/migrations/XcMigrationSourcev2.ts
index 152343f484..280825dddc 100644
--- a/packages/nocodb/src/lib/migrations/XcMigrationSourcev2.ts
+++ b/packages/nocodb/src/lib/migrations/XcMigrationSourcev2.ts
@@ -9,6 +9,7 @@ import * as nc_018_add_meta_in_view from './v2/nc_018_add_meta_in_view';
import * as nc_019_add_meta_in_meta_tables from './v2/nc_019_add_meta_in_meta_tables';
import * as nc_020_kanban_view from './v2/nc_020_kanban_view';
import * as nc_021_add_fields_in_token from './v2/nc_021_add_fields_in_token';
+import * as nc_022_qr_code_column_type from './v2/nc_022_qr_code_column_type';
// Create a custom migration source class
export default class XcMigrationSourcev2 {
@@ -29,6 +30,7 @@ export default class XcMigrationSourcev2 {
'nc_019_add_meta_in_meta_tables',
'nc_020_kanban_view',
'nc_021_add_fields_in_token',
+ 'nc_022_qr_code_column_type',
]);
}
@@ -60,6 +62,8 @@ export default class XcMigrationSourcev2 {
return nc_020_kanban_view;
case 'nc_021_add_fields_in_token':
return nc_021_add_fields_in_token;
+ case 'nc_022_qr_code_column_type':
+ return nc_022_qr_code_column_type;
}
}
}
diff --git a/packages/nocodb/src/lib/migrations/v2/nc_022_qr_code_column_type.ts b/packages/nocodb/src/lib/migrations/v2/nc_022_qr_code_column_type.ts
new file mode 100644
index 0000000000..e205c29fa5
--- /dev/null
+++ b/packages/nocodb/src/lib/migrations/v2/nc_022_qr_code_column_type.ts
@@ -0,0 +1,26 @@
+import { MetaTable } from '../../utils/globals';
+import { Knex } from 'knex';
+
+const up = async (knex: Knex) => {
+ await knex.schema.createTable(MetaTable.COL_QRCODE, (table) => {
+ table.string('id', 20).primary().notNullable();
+
+ table.string('fk_column_id', 20);
+ table.foreign('fk_column_id').references(`${MetaTable.COLUMNS}.id`);
+
+ table.string('fk_qr_value_column_id', 20);
+ table
+ .foreign('fk_qr_value_column_id')
+ .references(`${MetaTable.COLUMNS}.id`);
+
+ table.boolean('deleted');
+ table.float('order');
+ table.timestamps(true, true);
+ });
+};
+
+const down = async (knex: Knex) => {
+ await knex.schema.dropTable(MetaTable.COL_QRCODE);
+};
+
+export { up, down };
diff --git a/packages/nocodb/src/lib/models/Column.ts b/packages/nocodb/src/lib/models/Column.ts
index a235bbedcc..76007e800a 100644
--- a/packages/nocodb/src/lib/models/Column.ts
+++ b/packages/nocodb/src/lib/models/Column.ts
@@ -5,7 +5,7 @@ import RollupColumn from './RollupColumn';
import SelectOption from './SelectOption';
import Model from './Model';
import NocoCache from '../cache/NocoCache';
-import { ColumnType, UITypes } from 'nocodb-sdk';
+import { ColumnReqType, AllowedColumnTypesForQrCode, ColumnType, UITypes } from 'nocodb-sdk';
import {
CacheDelDirection,
CacheGetType,
@@ -18,6 +18,7 @@ import Sort from './Sort';
import Filter from './Filter';
import addFormulaErrorIfMissingColumn from '../meta/helpers/addFormulaErrorIfMissingColumn';
import { NcError } from '../meta/helpers/catchError';
+import QrCodeColumn from './QrCodeColumn';
export default class Column implements ColumnType {
public fk_model_id: string;
@@ -73,7 +74,7 @@ export default class Column implements ColumnType {
[key: string]: any;
fk_model_id: string;
uidt: UITypes | string;
- },
+ } & Pick,
ncMeta = Noco.ncMeta
) {
if (!column.fk_model_id) NcError.badRequest('Missing model id');
@@ -129,7 +130,6 @@ export default class Column implements ColumnType {
}
if (!column.uidt) throw new Error('UI Datatype not found');
- const order = 1;
const row = await ncMeta.metaInsert2(
null, //column.project_id || column.base_id,
null, //column.db_alias,
@@ -151,8 +151,8 @@ export default class Column implements ColumnType {
{
fk_column_id: row.id,
fk_model_id: column.fk_model_id,
- order,
show: true,
+ column_order: column.column_order,
},
ncMeta
);
@@ -219,6 +219,16 @@ export default class Column implements ColumnType {
);
break;
}
+ case UITypes.QrCode: {
+ await QrCodeColumn.insert(
+ {
+ fk_column_id: colId,
+ fk_qr_value_column_id: column.fk_qr_value_column_id,
+ },
+ ncMeta
+ );
+ break;
+ }
case UITypes.Formula: {
await FormulaColumn.insert(
{
@@ -395,6 +405,9 @@ export default class Column implements ColumnType {
case UITypes.Formula:
res = await FormulaColumn.read(this.id, ncMeta);
break;
+ case UITypes.QrCode:
+ res = await QrCodeColumn.read(this.id, ncMeta);
+ break;
// default:
// res = await DbColumn.read(this.id);
// break;
@@ -557,6 +570,21 @@ export default class Column implements ColumnType {
// todo: or instead of delete reset related foreign key value to null and handle in BaseModel
+ // get qr code columns and delete
+ {
+ const qrCodeCols = await ncMeta.metaList2(
+ null,
+ null,
+ MetaTable.COL_QRCODE,
+ {
+ condition: { fk_qr_value_column_id: id },
+ }
+ );
+ for (const qrCodeCol of qrCodeCols) {
+ await Column.delete(qrCodeCol.fk_column_id, ncMeta);
+ }
+ }
+
// get lookup columns and delete
{
let lookups = await NocoCache.getList(CacheScope.COL_LOOKUP, [id]);
@@ -691,6 +719,10 @@ export default class Column implements ColumnType {
colOptionTableName = MetaTable.COL_FORMULA;
cacheScopeName = CacheScope.COL_FORMULA;
break;
+ case UITypes.QrCode:
+ colOptionTableName = MetaTable.COL_QRCODE;
+ cacheScopeName = CacheScope.COL_QRCODE;
+ break;
}
if (colOptionTableName && cacheScopeName) {
@@ -855,6 +887,18 @@ export default class Column implements ColumnType {
);
break;
}
+ case UITypes.QrCode: {
+ await ncMeta.metaDelete(null, null, MetaTable.COL_QRCODE, {
+ fk_column_id: colId,
+ });
+
+ await NocoCache.deepDel(
+ CacheScope.COL_QRCODE,
+ `${CacheScope.COL_QRCODE}:${colId}`,
+ CacheDelDirection.CHILD_TO_PARENT
+ );
+ break;
+ }
case UITypes.MultiSelect:
case UITypes.SingleSelect: {
@@ -904,6 +948,21 @@ export default class Column implements ColumnType {
else updateObj.validate = JSON.stringify(column.validate);
}
+ // get qr code columns and delete if target type is not supported by QR code column type
+ if (!AllowedColumnTypesForQrCode.includes(updateObj.uidt)) {
+ const qrCodeCols = await ncMeta.metaList2(
+ null,
+ null,
+ MetaTable.COL_QRCODE,
+ {
+ condition: { fk_qr_value_column_id: colId },
+ }
+ );
+ for (const qrCodeCol of qrCodeCols) {
+ await Column.delete(qrCodeCol.fk_column_id, ncMeta);
+ }
+ }
+
// get existing cache
const key = `${CacheScope.COLUMN}:${colId}`;
let o = await NocoCache.get(key, CacheGetType.TYPE_OBJECT);
diff --git a/packages/nocodb/src/lib/models/GridViewColumn.ts b/packages/nocodb/src/lib/models/GridViewColumn.ts
index f00bee3ea2..4d0215e9d3 100644
--- a/packages/nocodb/src/lib/models/GridViewColumn.ts
+++ b/packages/nocodb/src/lib/models/GridViewColumn.ts
@@ -70,9 +70,11 @@ export default class GridViewColumn implements GridColumnType {
const insertObj = {
fk_view_id: column.fk_view_id,
fk_column_id: column.fk_column_id,
- order: await ncMeta.metaGetNextOrder(MetaTable.GRID_VIEW_COLUMNS, {
- fk_view_id: column.fk_view_id,
- }),
+ order:
+ column?.order ??
+ (await ncMeta.metaGetNextOrder(MetaTable.GRID_VIEW_COLUMNS, {
+ fk_view_id: column.fk_view_id,
+ })),
show: column.show,
project_id: column.project_id,
base_id: column.base_id,
diff --git a/packages/nocodb/src/lib/models/QrCodeColumn.ts b/packages/nocodb/src/lib/models/QrCodeColumn.ts
new file mode 100644
index 0000000000..0dc39f8d2d
--- /dev/null
+++ b/packages/nocodb/src/lib/models/QrCodeColumn.ts
@@ -0,0 +1,67 @@
+import Noco from '../Noco';
+import { CacheGetType, CacheScope, MetaTable } from '../utils/globals';
+import NocoCache from '../cache/NocoCache';
+import { extractProps } from '../meta/helpers/extractProps';
+
+export default class QrCodeColumn {
+ fk_column_id: string;
+ fk_qr_value_column_id: string;
+
+ constructor(data: Partial) {
+ Object.assign(this, data);
+ }
+
+ public static async insert(
+ data: Partial,
+ ncMeta = Noco.ncMeta
+ ) {
+ await ncMeta.metaInsert2(null, null, MetaTable.COL_QRCODE, {
+ fk_column_id: data.fk_column_id,
+ fk_qr_value_column_id: data.fk_qr_value_column_id,
+ });
+
+ return this.read(data.fk_column_id, ncMeta);
+ }
+ public static async read(columnId: string, ncMeta = Noco.ncMeta) {
+ let column =
+ columnId &&
+ (await NocoCache.get(
+ `${CacheScope.COL_QRCODE}:${columnId}`,
+ CacheGetType.TYPE_OBJECT
+ ));
+ if (!column) {
+ column = await ncMeta.metaGet2(
+ null, //,
+ null, //model.db_alias,
+ MetaTable.COL_QRCODE,
+ { fk_column_id: columnId }
+ );
+ await NocoCache.set(`${CacheScope.COL_QRCODE}:${columnId}`, column);
+ }
+
+ return column ? new QrCodeColumn(column) : null;
+ }
+
+ id: string;
+
+ static async update(
+ id: string,
+ qrCode: Partial,
+ ncMeta = Noco.ncMeta
+ ) {
+ const updateObj = extractProps(qrCode, [
+ 'fk_column_id',
+ 'fk_qr_value_column_id',
+ ]);
+ // get existing cache
+ const key = `${CacheScope.COL_QRCODE}:${id}`;
+ let o = await NocoCache.get(key, CacheGetType.TYPE_OBJECT);
+ if (o) {
+ o = { ...o, ...updateObj };
+ // set cache
+ await NocoCache.set(key, o);
+ }
+ // set meta
+ await ncMeta.metaUpdate(null, null, MetaTable.COL_QRCODE, updateObj, id);
+ }
+}
diff --git a/packages/nocodb/src/lib/models/Sort.ts b/packages/nocodb/src/lib/models/Sort.ts
index fff83923a9..355ca6a725 100644
--- a/packages/nocodb/src/lib/models/Sort.ts
+++ b/packages/nocodb/src/lib/models/Sort.ts
@@ -34,18 +34,22 @@ export default class Sort {
});
}
- public static async insert(sortObj: Partial, ncMeta = Noco.ncMeta) {
+ public static async insert(
+ sortObj: Partial & { push_to_top?: boolean },
+ ncMeta = Noco.ncMeta
+ ) {
// todo: implement a generic function
- const order =
- (+(
- await ncMeta
- .knex(MetaTable.SORT)
- .max('order', { as: 'order' })
- .where({
- fk_view_id: sortObj.fk_view_id,
- })
- .first()
- )?.order || 0) + 1;
+ const order = sortObj.push_to_top
+ ? 1
+ : (+(
+ await ncMeta
+ .knex(MetaTable.SORT)
+ .max('order', { as: 'order' })
+ .where({
+ fk_view_id: sortObj.fk_view_id,
+ })
+ .first()
+ )?.order || 0) + 1;
const insertObj = {
id: sortObj.id,
@@ -62,20 +66,39 @@ export default class Sort {
insertObj.base_id = model.base_id;
}
- const row = await ncMeta.metaInsert2(null, null, MetaTable.SORT, insertObj);
-
- await NocoCache.appendToList(
- CacheScope.SORT,
- [sortObj.fk_view_id],
- `${CacheScope.SORT}:${row.id}`
- );
-
- await NocoCache.appendToList(
- CacheScope.SORT,
- [sortObj.fk_column_id],
- `${CacheScope.SORT}:${row.id}`
- );
+ // increment existing order
+ if (sortObj.push_to_top) {
+ await ncMeta
+ .knex(MetaTable.SORT)
+ .where({
+ fk_view_id: sortObj.fk_view_id,
+ })
+ .increment('order', 1);
+ }
+ const row = await ncMeta.metaInsert2(null, null, MetaTable.SORT, insertObj);
+ if (sortObj.push_to_top) {
+ // todo: delete cache
+ const sortList = await ncMeta.metaList2(null, null, MetaTable.SORT, {
+ condition: { fk_view_id: sortObj.fk_view_id },
+ orderBy: {
+ order: 'asc',
+ },
+ });
+ await NocoCache.setList(CacheScope.SORT, [sortObj.fk_view_id], sortList);
+ } else {
+ await NocoCache.appendToList(
+ CacheScope.SORT,
+ [sortObj.fk_view_id],
+ `${CacheScope.SORT}:${row.id}`
+ );
+
+ await NocoCache.appendToList(
+ CacheScope.SORT,
+ [sortObj.fk_column_id],
+ `${CacheScope.SORT}:${row.id}`
+ );
+ }
return this.get(row.id, ncMeta);
}
diff --git a/packages/nocodb/src/lib/models/View.ts b/packages/nocodb/src/lib/models/View.ts
index 3e79eb0bba..d608010fe9 100644
--- a/packages/nocodb/src/lib/models/View.ts
+++ b/packages/nocodb/src/lib/models/View.ts
@@ -13,7 +13,13 @@ import GalleryView from './GalleryView';
import GridViewColumn from './GridViewColumn';
import Sort from './Sort';
import Filter from './Filter';
-import { isSystemColumn, UITypes, ViewType, ViewTypes } from 'nocodb-sdk';
+import {
+ ColumnReqType,
+ isSystemColumn,
+ UITypes,
+ ViewType,
+ ViewTypes,
+} from 'nocodb-sdk';
import GalleryViewColumn from './GalleryViewColumn';
import FormViewColumn from './FormViewColumn';
import KanbanViewColumn from './KanbanViewColumn';
@@ -442,9 +448,9 @@ export default class View implements ViewType {
param: {
fk_column_id: any;
fk_model_id: any;
- order;
+ order?: number;
show;
- },
+ } & Pick,
ncMeta = Noco.ncMeta
) {
const insertObj = {
@@ -456,33 +462,21 @@ export default class View implements ViewType {
const views = await this.list(param.fk_model_id, ncMeta);
for (const view of views) {
+ const modifiedInsertObj = { ...insertObj, fk_view_id: view.id };
+
+ if (param.column_order?.view_id === view.id) {
+ modifiedInsertObj.order = param.column_order?.order;
+ }
+
switch (view.type) {
case ViewTypes.GRID:
- await GridViewColumn.insert(
- {
- ...insertObj,
- fk_view_id: view.id,
- },
- ncMeta
- );
+ await GridViewColumn.insert(modifiedInsertObj, ncMeta);
break;
case ViewTypes.GALLERY:
- await GalleryViewColumn.insert(
- {
- ...insertObj,
- fk_view_id: view.id,
- },
- ncMeta
- );
+ await GalleryViewColumn.insert(modifiedInsertObj, ncMeta);
break;
case ViewTypes.KANBAN:
- await KanbanViewColumn.insert(
- {
- ...insertObj,
- fk_view_id: view.id,
- },
- ncMeta
- );
+ await KanbanViewColumn.insert(modifiedInsertObj, ncMeta);
break;
}
}
diff --git a/packages/nocodb/src/lib/services/test/TestResetService/resetMysqlSakilaProject.ts b/packages/nocodb/src/lib/services/test/TestResetService/resetMysqlSakilaProject.ts
index b50438487a..b010579522 100644
--- a/packages/nocodb/src/lib/services/test/TestResetService/resetMysqlSakilaProject.ts
+++ b/packages/nocodb/src/lib/services/test/TestResetService/resetMysqlSakilaProject.ts
@@ -71,11 +71,13 @@ const isSakilaMysqlToBeReset = async (
return true;
}
- if (!project) return false;
+ if (!project) return true;
const audits = await Audit.projectAuditList(project.id, {});
- return audits?.length > 0;
+ // todo: Will be fixed in the data resetting revamp
+ console.log(`audits:resetMysqlSakilaProject:${parallelId}`, audits?.length);
+ return true;
};
const resetSakilaMysql = async (
diff --git a/packages/nocodb/src/lib/utils/globals.ts b/packages/nocodb/src/lib/utils/globals.ts
index 7cb0609081..ea037b1f10 100644
--- a/packages/nocodb/src/lib/utils/globals.ts
+++ b/packages/nocodb/src/lib/utils/globals.ts
@@ -10,6 +10,7 @@ export enum MetaTable {
COL_LOOKUP = 'nc_col_lookup_v2',
COL_ROLLUP = 'nc_col_rollup_v2',
COL_FORMULA = 'nc_col_formula_v2',
+ COL_QRCODE = 'nc_col_qrcode_v2',
FILTER_EXP = 'nc_filter_exp_v2',
// HOOK_FILTER_EXP = 'nc_hook_filter_exp_v2',
SORT = 'nc_sort_v2',
@@ -112,6 +113,7 @@ export enum CacheScope {
COL_LOOKUP = 'colLookup',
COL_ROLLUP = 'colRollup',
COL_FORMULA = 'colFormula',
+ COL_QRCODE = 'colQRCode',
FILTER_EXP = 'filterExp',
SORT = 'sort',
SHARED_VIEW = 'sharedView',
diff --git a/packages/nocodb/src/lib/v1-legacy/plugins/adapters/storage/Local.ts b/packages/nocodb/src/lib/v1-legacy/plugins/adapters/storage/Local.ts
index edcc20b385..48b695b878 100644
--- a/packages/nocodb/src/lib/v1-legacy/plugins/adapters/storage/Local.ts
+++ b/packages/nocodb/src/lib/v1-legacy/plugins/adapters/storage/Local.ts
@@ -6,7 +6,7 @@ import mkdirp from 'mkdirp';
import { IStorageAdapterV2, XcFile } from 'nc-plugin';
import NcConfigFactory from '../../../../utils/NcConfigFactory';
-import request from 'request';
+import axios from 'axios';
export default class Local implements IStorageAdapterV2 {
constructor() {}
@@ -27,37 +27,36 @@ export default class Local implements IStorageAdapterV2 {
async fileCreateByUrl(key: string, url: string): Promise {
const destPath = path.join(NcConfigFactory.getToolDir(), ...key.split('/'));
return new Promise((resolve, reject) => {
- mkdirp.sync(path.dirname(destPath));
- const file = fs.createWriteStream(destPath);
- const sendReq = request.get(url);
-
- // verify response code
- sendReq.on('response', (response) => {
- if (response.statusCode !== 200) {
- return reject('Response status was ' + response.statusCode);
- }
-
- sendReq.pipe(file);
- });
-
- // close() is async, call cb after close completes
- file.on('finish', () => {
- file.close((err) => {
- if (err) {
- return reject(err);
- }
- resolve(null);
+ axios.get((url), { responseType: "stream", headers: {
+ "accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9",
+ "accept-language": "en-US,en;q=0.9",
+ "cache-control": "no-cache",
+ "pragma": "no-cache",
+ "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36",
+ "origin": "https://www.airtable.com/",
+ } })
+ .then(response => {
+ mkdirp.sync(path.dirname(destPath));
+ const file = fs.createWriteStream(destPath);
+ // close() is async, call cb after close completes
+ file.on('finish', () => {
+ file.close((err) => {
+ if (err) {
+ return reject(err);
+ }
+ resolve(null);
+ });
});
- });
- // check for request errors
- sendReq.on('error', (err) => {
- fs.unlink(destPath, () => reject(err.message)); // delete the (partial) file and then return the error
- });
+ file.on('error', (err) => {
+ // Handle errors
+ fs.unlink(destPath, () => reject(err.message)); // delete the (partial) file and then return the error
+ });
- file.on('error', (err) => {
- // Handle errors
- fs.unlink(destPath, () => reject(err.message)); // delete the (partial) file and then return the error
+ response.data.pipe(file);
+ })
+ .catch((err) => {
+ reject(err.message)
});
});
}
diff --git a/packages/nocodb/tests/unit/factory/column.ts b/packages/nocodb/tests/unit/factory/column.ts
index 2cc0d6e3cf..c2843f070a 100644
--- a/packages/nocodb/tests/unit/factory/column.ts
+++ b/packages/nocodb/tests/unit/factory/column.ts
@@ -9,35 +9,37 @@ import Project from '../../../src/lib/models/Project';
import View from '../../../src/lib/models/View';
import { isSqlite } from '../init/db';
-const defaultColumns = function(context) {
+const defaultColumns = function (context) {
return [
- {
- column_name: 'id',
- title: 'Id',
- uidt: 'ID',
- },
- {
- column_name: 'title',
- title: 'Title',
- uidt: 'SingleLineText',
- },
- {
- cdf: 'CURRENT_TIMESTAMP',
- column_name: 'created_at',
- title: 'CreatedAt',
- dtxp: '',
- dtxs: '',
- uidt: 'DateTime',
- },
- {
- cdf: isSqlite(context) ? 'CURRENT_TIMESTAMP': 'CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP',
- column_name: 'updated_at',
- title: 'UpdatedAt',
- dtxp: '',
- dtxs: '',
- uidt: 'DateTime',
- },
-]
+ {
+ column_name: 'id',
+ title: 'Id',
+ uidt: 'ID',
+ },
+ {
+ column_name: 'title',
+ title: 'Title',
+ uidt: 'SingleLineText',
+ },
+ {
+ cdf: 'CURRENT_TIMESTAMP',
+ column_name: 'created_at',
+ title: 'CreatedAt',
+ dtxp: '',
+ dtxs: '',
+ uidt: 'DateTime',
+ },
+ {
+ cdf: isSqlite(context)
+ ? 'CURRENT_TIMESTAMP'
+ : 'CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP',
+ column_name: 'updated_at',
+ title: 'UpdatedAt',
+ dtxp: '',
+ dtxs: '',
+ uidt: 'DateTime',
+ },
+ ];
};
const createColumn = async (context, table, columnAttr) => {
@@ -152,6 +154,36 @@ const createLookupColumn = async (
return lookupColumn;
};
+const createQrCodeColumn = async (
+ context,
+ {
+ title,
+ table,
+ referencedQrValueTableColumnTitle,
+ }: {
+ title: string;
+ table: Model;
+ referencedQrValueTableColumnTitle: string;
+ }
+) => {
+ const referencedQrValueTableColumnId = await table
+ .getColumns()
+ .then(
+ (cols) =>
+ cols.find(
+ (column) => column.title == referencedQrValueTableColumnTitle
+ )['id']
+ );
+
+ const qrCodeColumn = await createColumn(context, table, {
+ title: title,
+ uidt: UITypes.QrCode,
+ column_name: title,
+ fk_qr_value_column_id: referencedQrValueTableColumnId,
+ });
+ return qrCodeColumn;
+};
+
const createLtarColumn = async (
context,
{
@@ -178,26 +210,30 @@ const createLtarColumn = async (
return ltarColumn;
};
-const updateViewColumn = async (context, {view, column, attr}: {column: Column, view: View, attr: any}) => {
+const updateViewColumn = async (
+ context,
+ { view, column, attr }: { column: Column; view: View; attr: any }
+) => {
const res = await request(context.app)
- .patch(`/api/v1/db/meta/views/${view.id}/columns/${column.id}`)
- .set('xc-auth', context.token)
- .send({
- ...attr,
- });
+ .patch(`/api/v1/db/meta/views/${view.id}/columns/${column.id}`)
+ .set('xc-auth', context.token)
+ .send({
+ ...attr,
+ });
- const updatedColumn: FormViewColumn | GridViewColumn | GalleryViewColumn = (await view.getColumns()).find(
- (column) => column.id === column.id
- )!;
+ const updatedColumn: FormViewColumn | GridViewColumn | GalleryViewColumn = (
+ await view.getColumns()
+ ).find((column) => column.id === column.id)!;
return updatedColumn;
-}
+};
export {
defaultColumns,
createColumn,
+ createQrCodeColumn,
createRollupColumn,
createLookupColumn,
createLtarColumn,
- updateViewColumn
+ updateViewColumn,
};
diff --git a/packages/nocodb/tests/unit/rest/index.test.ts b/packages/nocodb/tests/unit/rest/index.test.ts
index 05ef09c84a..b95637a096 100644
--- a/packages/nocodb/tests/unit/rest/index.test.ts
+++ b/packages/nocodb/tests/unit/rest/index.test.ts
@@ -2,6 +2,7 @@ import 'mocha';
import authTests from './tests/auth.test';
import orgTests from './tests/org.test';
import projectTests from './tests/project.test';
+import columnTypeSpecificTests from './tests/columnTypeSpecific.test';
import tableTests from './tests/table.test';
import tableRowTests from './tests/tableRow.test';
import viewRowTests from './tests/viewRow.test';
@@ -13,6 +14,7 @@ function restTests() {
tableTests();
tableRowTests();
viewRowTests();
+ columnTypeSpecificTests();
}
export default function () {
diff --git a/packages/nocodb/tests/unit/rest/tests/columnTypeSpecific.test.ts b/packages/nocodb/tests/unit/rest/tests/columnTypeSpecific.test.ts
new file mode 100644
index 0000000000..ab24ffe70c
--- /dev/null
+++ b/packages/nocodb/tests/unit/rest/tests/columnTypeSpecific.test.ts
@@ -0,0 +1,96 @@
+import 'mocha';
+import init from '../../init';
+import { createProject, createSakilaProject } from '../../factory/project';
+import request from 'supertest';
+import { UITypes } from 'nocodb-sdk';
+import { createQrCodeColumn, createColumn } from '../../factory/column';
+import { getTable } from '../../factory/table';
+import Model from '../../../../src/lib/models/Model';
+import Project from '../../../../src/lib/models/Project';
+import { expect } from 'chai';
+import Column from '../../../../src/lib/models/Column';
+import { title } from 'process';
+
+function columnTypeSpecificTests() {
+ let context;
+ let project: Project;
+ let sakilaProject: Project;
+ let customerTable: Model;
+ let qrValueReferenceColumn: Column;
+
+ const qrValueReferenceColumnTitle = 'Qr Value Column';
+ const qrCodeReferenceColumnTitle = 'Qr Code Column';
+
+ beforeEach(async function () {
+ context = await init();
+
+ sakilaProject = await createSakilaProject(context);
+ project = await createProject(context);
+
+ customerTable = await getTable({
+ project: sakilaProject,
+ name: 'customer',
+ });
+ });
+
+ describe('Qr Code Column', () => {
+ beforeEach(async function () {
+ qrValueReferenceColumn = await createColumn(context, customerTable, {
+ title: qrValueReferenceColumnTitle,
+ uidt: UITypes.SingleLineText,
+ table_name: customerTable.table_name,
+ column_name: title,
+ });
+ });
+ describe('adding a QR code column which references another column ', async () => {
+ beforeEach(async function () {
+ await createQrCodeColumn(context, {
+ title: qrCodeReferenceColumnTitle,
+ table: customerTable,
+ referencedQrValueTableColumnTitle: qrValueReferenceColumnTitle,
+ });
+ });
+ it('delivers the same cell values as the referenced column', async () => {
+ const resp = await request(context.app)
+ .get(`/api/v1/db/data/noco/${sakilaProject.id}/${customerTable.id}`)
+ .set('xc-auth', context.token)
+ .expect(200);
+ expect(resp.body.list[0][qrValueReferenceColumnTitle]).to.eql(
+ resp.body.list[0][qrCodeReferenceColumnTitle]
+ );
+ expect(
+ resp.body.list.map((row) => row[qrValueReferenceColumnTitle])
+ ).to.eql(resp.body.list.map((row) => row[qrCodeReferenceColumnTitle]));
+ });
+
+ it('gets deleted if the referenced column gets deleted', async () => {
+ // delete referenced value column
+ const columnsBeforeReferencedColumnDeleted =
+ await customerTable.getColumns();
+
+ expect(
+ columnsBeforeReferencedColumnDeleted.some(
+ (col) => col['title'] === qrCodeReferenceColumnTitle
+ )
+ ).to.eq(true);
+
+ const response = await request(context.app)
+ .delete(`/api/v1/db/meta/columns/${qrValueReferenceColumn.id}`)
+ .set('xc-auth', context.token)
+ .send({});
+
+ const columnsAfterReferencedColumnDeleted =
+ await customerTable.getColumns();
+ expect(
+ columnsAfterReferencedColumnDeleted.some(
+ (col) => col['title'] === qrCodeReferenceColumnTitle
+ )
+ ).to.eq(false);
+ });
+ });
+ });
+}
+
+export default function () {
+ describe('Column types specific behavior', columnTypeSpecificTests);
+}
diff --git a/scripts/sdk/swagger.json b/scripts/sdk/swagger.json
index 5116c33b62..1a05f3cbd1 100644
--- a/scripts/sdk/swagger.json
+++ b/scripts/sdk/swagger.json
@@ -2286,7 +2286,19 @@
"content": {
"application/json": {
"schema": {
- "$ref": "#/components/schemas/Sort"
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/Sort"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "push_to_top": {
+ "type": "boolean"
+ }
+ }
+ }
+ ]
}
}
}
@@ -8957,213 +8969,254 @@
}
}
},
- "ColumnReq": {
- "oneOf": [
- {
- "properties": {
- "uidt": {
- "type": "string",
- "enum": [
- "ID",
- "SingleLineText",
- "LongText",
- "Attachment",
- "Checkbox",
- "MultiSelect",
- "SingleSelect",
- "Collaborator",
- "Date",
- "Year",
- "Time",
- "PhoneNumber",
- "Email",
- "URL",
- "Number",
- "Decimal",
- "Currency",
- "Percent",
- "Duration",
- "Rating",
- "Count",
- "DateTime",
- "CreateTime",
- "LastModifiedTime",
- "AutoNumber",
- "Geometry",
- "JSON",
- "SpecificDBType",
- "Barcode",
- "Button"
- ]
- },
- "id": {
- "type": "string"
- },
- "base_id": {
- "type": "string"
- },
- "fk_model_id": {
- "type": "string"
- },
- "title": {
- "type": "string"
- },
- "dt": {
- "type": "string"
- },
- "np": {
- "type": "string"
- },
- "ns": {
- "type": "string"
- },
- "clen": {
- "type": [
- "string",
- "integer"
- ]
- },
- "cop": {
- "type": "string"
- },
- "pk": {
- "type": "boolean"
- },
- "pv": {
- "type": "boolean"
- },
- "rqd": {
- "type": "boolean"
- },
- "column_name": {
- "type": "string"
- },
- "un": {
- "type": "boolean"
- },
- "ct": {
- "type": "string"
- },
- "ai": {
- "type": "boolean"
- },
- "unique": {
- "type": "boolean"
- },
- "cdf": {
- "type": "string"
- },
- "cc": {
- "type": "string"
- },
- "csn": {
- "type": "string"
- },
- "dtx": {
- "type": "string"
- },
- "dtxp": {
- "type": "string"
- },
- "dtxs": {
- "type": "string"
- },
- "au": {
- "type": "boolean"
- },
- "": {
- "type": "string"
- }
- }
+ "NormalColumnRequest": {
+ "properties": {
+ "uidt": {
+ "type": "string",
+ "enum": [
+ "ID",
+ "SingleLineText",
+ "LongText",
+ "Attachment",
+ "Checkbox",
+ "MultiSelect",
+ "SingleSelect",
+ "Collaborator",
+ "Date",
+ "Year",
+ "Time",
+ "PhoneNumber",
+ "Email",
+ "URL",
+ "Number",
+ "Decimal",
+ "Currency",
+ "Percent",
+ "Duration",
+ "Rating",
+ "Count",
+ "DateTime",
+ "CreateTime",
+ "LastModifiedTime",
+ "AutoNumber",
+ "Geometry",
+ "JSON",
+ "SpecificDBType",
+ "Barcode",
+ "Button"
+ ]
},
- {
- "properties": {
- "uidt": {
- "type": "string",
- "enum": [
- "LinkToAnotherRecord"
- ]
- },
- "title": {
- "type": "string"
- },
- "parentId": {
- "type": "string"
- },
- "childId": {
- "type": "string"
- },
- "type": {
- "type": "string",
- "enum": [
- "hm",
- "bt",
- "mm"
- ]
- }
- },
- "required": [
- "uidt",
- "title",
- "parentId",
- "childId",
- "type"
+ "id": {
+ "type": "string"
+ },
+ "base_id": {
+ "type": "string"
+ },
+ "fk_model_id": {
+ "type": "string"
+ },
+ "title": {
+ "type": "string"
+ },
+ "dt": {
+ "type": "string"
+ },
+ "np": {
+ "type": "string"
+ },
+ "ns": {
+ "type": "string"
+ },
+ "clen": {
+ "type": [
+ "string",
+ "integer"
]
},
- {
- "properties": {
- "uidt": {
- "type": "string",
- "enum": [
- "Rollup"
- ]
- },
- "title": {
- "type": "string"
- },
- "fk_relation_column_id": {
- "type": "string"
- },
- "fk_rollup_column_id": {
- "type": "string"
- },
- "rollup_function": {
- "type": "string"
- }
- }
+ "cop": {
+ "type": "string"
},
+ "pk": {
+ "type": "boolean"
+ },
+ "pv": {
+ "type": "boolean"
+ },
+ "rqd": {
+ "type": "boolean"
+ },
+ "column_name": {
+ "type": "string"
+ },
+ "un": {
+ "type": "boolean"
+ },
+ "ct": {
+ "type": "string"
+ },
+ "ai": {
+ "type": "boolean"
+ },
+ "unique": {
+ "type": "boolean"
+ },
+ "cdf": {
+ "type": "string"
+ },
+ "cc": {
+ "type": "string"
+ },
+ "csn": {
+ "type": "string"
+ },
+ "dtx": {
+ "type": "string"
+ },
+ "dtxp": {
+ "type": "string"
+ },
+ "dtxs": {
+ "type": "string"
+ },
+ "au": {
+ "type": "boolean"
+ }
+ }
+ },
+ "LinkToAnotherColumnReq": {
+ "properties": {
+ "uidt": {
+ "type": "string",
+ "enum": [
+ "LinkToAnotherRecord"
+ ]
+ },
+ "title": {
+ "type": "string"
+ },
+ "virtual": {
+ "type": "boolean"
+ },
+ "parentId": {
+ "type": "string"
+ },
+ "childId": {
+ "type": "string"
+ },
+ "type": {
+ "type": "string",
+ "enum": [
+ "hm",
+ "bt",
+ "mm"
+ ]
+ }
+ },
+ "required": [
+ "uidt",
+ "title",
+ "parentId",
+ "childId",
+ "type"
+ ]
+ },
+ "RollupColumnReq": {
+ "properties": {
+ "uidt": {
+ "type": "string",
+ "enum": [
+ "Rollup"
+ ]
+ },
+ "title": {
+ "type": "string"
+ },
+ "fk_relation_column_id": {
+ "type": "string"
+ },
+ "fk_rollup_column_id": {
+ "type": "string"
+ },
+ "rollup_function": {
+ "type": "string"
+ }
+ }
+ },
+ "LookupColumnReq": {
+ "properties": {
+ "uidt": {
+ "type": "string",
+ "enum": [
+ "Lookup"
+ ]
+ },
+ "title": {
+ "type": "string"
+ },
+ "fk_relation_column_id": {
+ "type": "string"
+ },
+ "fk_lookup_column_id": {
+ "type": "string"
+ }
+ }
+ },
+ "FormulaColumnReq": {
+ "properties": {
+ "uidt": {
+ "type": "string"
+ },
+ "formula_raw": {
+ "type": "string"
+ },
+ "formula": {
+ "type": "string"
+ },
+ "title": {
+ "type": "string"
+ }
+ }
+ },
+ "ColumnReq": {
+ "allOf": [
{
- "properties": {
- "uidt": {
- "type": "string",
- "enum": [
- "Lookup"
- ]
+ "oneOf": [
+ {
+ "$ref": "#/components/schemas/NormalColumnRequest"
},
- "title": {
- "type": "string"
+ {
+ "$ref": "#/components/schemas/LinkToAnotherColumnReq"
},
- "fk_relation_column_id": {
- "type": "string"
+ {
+ "$ref": "#/components/schemas/RollupColumnReq"
},
- "fk_lookup_column_id": {
- "type": "string"
+ {
+ "$ref": "#/components/schemas/FormulaColumnReq"
+ },
+ {
+ "$ref": "#/components/schemas/LookupColumnReq"
}
- }
+ ]
},
{
+ "type": "object",
"properties": {
- "uidt": {
- "type": "string"
- },
- "formula_raw": {
- "type": "string"
- },
- "formula": {
+ "column_name": {
"type": "string"
},
"title": {
"type": "string"
+ },
+ "column_order": {
+ "type": "object",
+ "properties": {
+ "view_id": {
+ "type": "string"
+ },
+ "order": {
+ "type": "integer"
+ }
+ }
}
}
}
diff --git a/tests/playwright/.gitignore b/tests/playwright/.gitignore
index 63c301ee05..3e0dc550b2 100644
--- a/tests/playwright/.gitignore
+++ b/tests/playwright/.gitignore
@@ -3,6 +3,7 @@ node_modules/
/playwright-report/
/playwright-report copy/
/playwright-report-quick/
+/playwright-report-stress/
/playwright/.cache/
.env
output
diff --git a/tests/playwright/fixtures/sampleFiles/sampleImage.jpeg b/tests/playwright/fixtures/sampleFiles/sampleImage.jpeg
new file mode 100644
index 0000000000..9e88102c07
Binary files /dev/null and b/tests/playwright/fixtures/sampleFiles/sampleImage.jpeg differ
diff --git a/tests/playwright/pages/Base.ts b/tests/playwright/pages/Base.ts
index 043c04e614..4aeed1e144 100644
--- a/tests/playwright/pages/Base.ts
+++ b/tests/playwright/pages/Base.ts
@@ -84,4 +84,12 @@ export default abstract class BasePage {
async getClipboardText() {
return await this.rootPage.evaluate(() => navigator.clipboard.readText());
}
+
+ async os() {
+ return await this.rootPage.evaluate(() => navigator.platform);
+ }
+
+ async isMacOs() {
+ return (await this.os()).includes('Mac');
+ }
}
diff --git a/tests/playwright/pages/Dashboard/ExpandedForm/index.ts b/tests/playwright/pages/Dashboard/ExpandedForm/index.ts
index 05ba80d9c7..cc6dc16cde 100644
--- a/tests/playwright/pages/Dashboard/ExpandedForm/index.ts
+++ b/tests/playwright/pages/Dashboard/ExpandedForm/index.ts
@@ -93,9 +93,11 @@ export class ExpandedFormPage extends BasePage {
await this.rootPage.locator('[data-testid="grid-load-spinner"]').waitFor({ state: 'hidden' });
}
- async verify({ header, url }: { header: string; url: string }) {
+ async verify({ header, url }: { header: string; url?: string }) {
await expect(this.get().locator(`.nc-expanded-form-header`).last()).toContainText(header);
- await expect.poll(() => this.rootPage.url()).toContain(url);
+ if (url) {
+ await expect.poll(() => this.rootPage.url()).toContain(url);
+ }
}
async escape() {
diff --git a/tests/playwright/pages/Dashboard/Form/index.ts b/tests/playwright/pages/Dashboard/Form/index.ts
index 2f44e06a5d..b04ac3326f 100644
--- a/tests/playwright/pages/Dashboard/Form/index.ts
+++ b/tests/playwright/pages/Dashboard/Form/index.ts
@@ -7,6 +7,7 @@ export class FormPage extends BasePage {
readonly dashboard: DashboardPage;
readonly toolbar: ToolbarPage;
+ // todo: All the locator should be private
readonly addAllButton: Locator;
readonly removeAllButton: Locator;
readonly submitButton: Locator;
diff --git a/tests/playwright/pages/Dashboard/Grid/Column/index.ts b/tests/playwright/pages/Dashboard/Grid/Column/index.ts
index ec9e4cc908..1116e886e5 100644
--- a/tests/playwright/pages/Dashboard/Grid/Column/index.ts
+++ b/tests/playwright/pages/Dashboard/Grid/Column/index.ts
@@ -17,10 +17,19 @@ export class ColumnPageObject extends BasePage {
return this.rootPage.locator('form[data-testid="add-or-edit-column"]');
}
+ private getColumnHeader(title: string) {
+ return this.grid.get().locator(`th[data-title="${title}"]`);
+ }
+
+ async clickColumnHeader({ title }: { title: string }) {
+ await this.getColumnHeader(title).click();
+ }
+
async create({
title,
type = 'SingleLineText',
formula = '',
+ qrCodeValueColumnTitle = '',
childTable = '',
childColumn = '',
relationType = '',
@@ -30,6 +39,7 @@ export class ColumnPageObject extends BasePage {
title: string;
type?: string;
formula?: string;
+ qrCodeValueColumnTitle?: string;
childTable?: string;
childColumn?: string;
relationType?: string;
@@ -70,6 +80,14 @@ export class ColumnPageObject extends BasePage {
case 'Formula':
await this.get().locator('.nc-formula-input').fill(formula);
break;
+ case 'QrCode':
+ await this.get().locator('.ant-select-single').nth(1).click();
+ await this.rootPage
+ .locator(`.ant-select-item`, {
+ hasText: qrCodeValueColumnTitle,
+ })
+ .click();
+ break;
case 'Lookup':
await this.get().locator('.ant-select-single').nth(1).click();
await this.rootPage
@@ -137,11 +155,22 @@ export class ColumnPageObject extends BasePage {
await this.get().locator('.ant-select-selection-search-input[aria-expanded="true"]').fill(type);
// Select column type
- await this.rootPage.locator(`text=${type}`).nth(1).click();
+ await this.rootPage.locator('.rc-virtual-list-holder-inner > div').locator(`text="${type}"`).click();
+ }
+
+ async changeReferencedColumnForQrCode({ titleOfReferencedColumn }: { titleOfReferencedColumn: string }) {
+ await this.get().locator('.nc-qr-code-value-column-select .ant-select-single').click();
+ await this.rootPage
+ .locator(`.ant-select-item`, {
+ hasText: titleOfReferencedColumn,
+ })
+ .click();
+
+ await this.save();
}
async delete({ title }: { title: string }) {
- await this.grid.get().locator(`th[data-title="${title}"] >> svg.ant-dropdown-trigger`).click();
+ await this.getColumnHeader(title).locator('svg.ant-dropdown-trigger').click();
// await this.rootPage.locator('li[role="menuitem"]:has-text("Delete")').waitFor();
await this.rootPage.locator('li[role="menuitem"]:has-text("Delete")').click();
@@ -162,7 +191,7 @@ export class ColumnPageObject extends BasePage {
formula?: string;
format?: string;
}) {
- await this.grid.get().locator(`th[data-title="${title}"] .nc-ui-dt-dropdown`).click();
+ await this.getColumnHeader(title).locator('.nc-ui-dt-dropdown').click();
await this.rootPage.locator('li[role="menuitem"]:has-text("Edit")').click();
await this.get().waitFor({ state: 'visible' });
@@ -201,9 +230,9 @@ export class ColumnPageObject extends BasePage {
async verify({ title, isVisible = true }: { title: string; isVisible?: boolean }) {
if (!isVisible) {
- return await expect(await this.rootPage.locator(`th[data-title="${title}"]`)).not.toBeVisible();
+ return await expect(this.getColumnHeader(title)).not.toBeVisible();
}
- await await expect(this.rootPage.locator(`th[data-title="${title}"]`)).toContainText(title);
+ await expect(this.getColumnHeader(title)).toContainText(title);
}
async verifyRoleAccess(param: { role: string }) {
diff --git a/tests/playwright/pages/Dashboard/Grid/index.ts b/tests/playwright/pages/Dashboard/Grid/index.ts
index ef5f73ffa6..66a85bee3b 100644
--- a/tests/playwright/pages/Dashboard/Grid/index.ts
+++ b/tests/playwright/pages/Dashboard/Grid/index.ts
@@ -5,11 +5,13 @@ import { CellPageObject } from '../common/Cell';
import { ColumnPageObject } from './Column';
import { ToolbarPage } from '../common/Toolbar';
import { ProjectMenuObject } from '../common/ProjectMenu';
+import { QrCodeOverlay } from '../QrCodeOverlay';
export class GridPage extends BasePage {
readonly dashboard: DashboardPage;
readonly addNewTableButton: Locator;
readonly dashboardPage: DashboardPage;
+ readonly qrCodeOverlay: QrCodeOverlay;
readonly column: ColumnPageObject;
readonly cell: CellPageObject;
readonly toolbar: ToolbarPage;
@@ -19,6 +21,7 @@ export class GridPage extends BasePage {
super(dashboardPage.rootPage);
this.dashboard = dashboardPage;
this.addNewTableButton = dashboardPage.get().locator('.nc-add-new-table');
+ this.qrCodeOverlay = new QrCodeOverlay(this);
this.column = new ColumnPageObject(this);
this.cell = new CellPageObject(this);
this.toolbar = new ToolbarPage(this);
@@ -111,7 +114,11 @@ export class GridPage extends BasePage {
await this.waitForResponse({
uiAction: clickOnColumnHeaderToSave,
requestUrlPathToMatch: 'api/v1/db/data/noco',
- httpMethodsToMatch: ['PATCH'],
+ httpMethodsToMatch: [
+ 'PATCH',
+ // since edit row on an empty row will emit POST request
+ 'POST',
+ ],
responseJsonMatcher: resJson => resJson?.[columnHeader] === value,
});
} else {
diff --git a/tests/playwright/pages/Dashboard/QrCodeOverlay/index.ts b/tests/playwright/pages/Dashboard/QrCodeOverlay/index.ts
new file mode 100644
index 0000000000..7c34a45aec
--- /dev/null
+++ b/tests/playwright/pages/Dashboard/QrCodeOverlay/index.ts
@@ -0,0 +1,27 @@
+import { expect } from '@playwright/test';
+import BasePage from '../../Base';
+import { FormPage } from '../Form';
+import { GalleryPage } from '../Gallery';
+import { GridPage } from '../Grid';
+import { KanbanPage } from '../Kanban';
+
+export class QrCodeOverlay extends BasePage {
+ constructor(parent: GridPage | GalleryPage | KanbanPage | FormPage) {
+ super(parent.rootPage);
+ }
+
+ get() {
+ return this.rootPage.locator(`.nc-qr-code-large`);
+ }
+
+ async verifyQrValueLabel(expectedValue: string) {
+ const foundQrValueLabelText = await this.get()
+ .locator('[data-testid="nc-qr-code-large-value-label"]')
+ .textContent();
+ await expect(foundQrValueLabelText).toContain(expectedValue);
+ }
+
+ async clickCloseButton() {
+ await this.get().locator('.ant-modal-close-x').click();
+ }
+}
diff --git a/tests/playwright/pages/Dashboard/Settings/Teams.ts b/tests/playwright/pages/Dashboard/Settings/Teams.ts
index 26a42a5cf7..581bc5d698 100644
--- a/tests/playwright/pages/Dashboard/Settings/Teams.ts
+++ b/tests/playwright/pages/Dashboard/Settings/Teams.ts
@@ -28,10 +28,11 @@ export class TeamsPage extends BasePage {
return this.rootPage.getByTestId('nc-share-base-sub-modal');
}
- async invite({ email, role }: { email: string; role: string }) {
+ async invite({ email, role, skipOpeningModal }: { email: string; role: string; skipOpeningModal?: boolean }) {
email = this.prefixEmail(email);
- await this.inviteTeamBtn.click();
+ if (!skipOpeningModal) await this.inviteTeamBtn.click();
+
await this.inviteTeamModal.locator(`input[placeholder="E-mail"]`).fill(email);
await this.inviteTeamModal.locator(`.nc-user-roles`).click();
const userRoleModal = this.rootPage.locator(`.nc-dropdown-user-role`);
@@ -78,6 +79,10 @@ export class TeamsPage extends BasePage {
return await this.getSharedBaseSubModal().locator(`.nc-url:visible`).textContent();
}
+ async getInvitationUrl() {
+ return await this.rootPage.getByTestId('invite-modal-invitation-url').textContent();
+ }
+
async sharedBaseActions({ action }: { action: string }) {
const actionMenu = ['reload', 'copy url', 'open tab', 'copy embed code'];
const index = actionMenu.indexOf(action);
diff --git a/tests/playwright/pages/Dashboard/TreeView.ts b/tests/playwright/pages/Dashboard/TreeView.ts
index 6b07007ba8..25efc080bc 100644
--- a/tests/playwright/pages/Dashboard/TreeView.ts
+++ b/tests/playwright/pages/Dashboard/TreeView.ts
@@ -20,6 +20,18 @@ export class TreeViewPage extends BasePage {
return this.dashboard.get().locator('.nc-treeview-container');
}
+ async isVisible() {
+ return await this.get().isVisible();
+ }
+
+ async verifyVisibility({ isVisible }: { isVisible: boolean }) {
+ if (isVisible) {
+ await expect(this.get()).toBeVisible();
+ } else {
+ await expect(this.get()).not.toBeVisible();
+ }
+ }
+
async focusTable({ title }: { title: string }) {
await this.get().locator(`.nc-project-tree-tbl-${title}`).focus();
}
@@ -43,8 +55,8 @@ export class TreeViewPage extends BasePage {
await this.dashboard.waitForTabRender({ title, mode });
}
- async createTable({ title }: { title: string }) {
- await this.get().locator('.nc-add-new-table').click();
+ async createTable({ title, skipOpeningModal }: { title: string; skipOpeningModal?: boolean }) {
+ if (!skipOpeningModal) await this.get().locator('.nc-add-new-table').click();
await this.dashboard.get().locator('.nc-modal-table-create').locator('.ant-modal-body').waitFor();
@@ -63,13 +75,13 @@ export class TreeViewPage extends BasePage {
async verifyTable({ title, index, exists = true }: { title: string; index?: number; exists?: boolean }) {
if (exists) {
- await expect(this.get().locator(`.nc-project-tree-tbl-${title}`)).toBeVisible();
+ await expect(this.get().getByTestId(`tree-view-table-${title}`)).toHaveCount(1);
if (index) {
- await expect(await this.get().locator('.nc-tbl-title').nth(index)).toHaveText(title);
+ await expect(this.get().locator('.nc-tbl-title').nth(index)).toHaveText(title);
}
} else {
- await expect(this.get().locator(`.nc-project-tree-tbl-${title}`)).toHaveCount(0);
+ await expect(this.get().getByTestId(`tree-view-table-${title}`)).toHaveCount(0);
}
}
diff --git a/tests/playwright/pages/Dashboard/ViewSidebar/index.ts b/tests/playwright/pages/Dashboard/ViewSidebar/index.ts
index cf75e34dc7..cf2791ce1b 100644
--- a/tests/playwright/pages/Dashboard/ViewSidebar/index.ts
+++ b/tests/playwright/pages/Dashboard/ViewSidebar/index.ts
@@ -23,6 +23,18 @@ export class ViewSidebarPage extends BasePage {
return this.dashboard.get().locator('.nc-view-sidebar');
}
+ async isVisible() {
+ return await this.get().isVisible();
+ }
+
+ async verifyVisibility({ isVisible }: { isVisible: boolean }) {
+ if (isVisible) {
+ await expect(this.get()).toBeVisible();
+ } else {
+ await expect(this.get()).not.toBeVisible();
+ }
+ }
+
private async createView({ title, locator }: { title: string; locator: Locator }) {
await locator.click();
await this.rootPage.locator('input[id="form_item_title"]:visible').fill(title);
diff --git a/tests/playwright/pages/Dashboard/common/Cell/DateCell.ts b/tests/playwright/pages/Dashboard/common/Cell/DateCell.ts
new file mode 100644
index 0000000000..d1996afca4
--- /dev/null
+++ b/tests/playwright/pages/Dashboard/common/Cell/DateCell.ts
@@ -0,0 +1,35 @@
+import { CellPageObject } from '.';
+import BasePage from '../../../Base';
+
+export class DateCellPageObject extends BasePage {
+ readonly cell: CellPageObject;
+
+ constructor(cell: CellPageObject) {
+ super(cell.rootPage);
+ this.cell = cell;
+ }
+
+ get({ index, columnHeader }: { index?: number; columnHeader: string }) {
+ return this.cell.get({ index, columnHeader });
+ }
+
+ async open({ index, columnHeader }: { index: number; columnHeader: string }) {
+ await this.cell.dblclick({
+ index,
+ columnHeader,
+ });
+ }
+
+ async selectDate({
+ // date in format `YYYY-MM-DD`
+ date,
+ }: {
+ date: string;
+ }) {
+ await this.rootPage.locator(`td[title="${date}"]`).click();
+ }
+
+ async close() {
+ await this.rootPage.keyboard.press('Escape');
+ }
+}
diff --git a/tests/playwright/pages/Dashboard/common/Cell/index.ts b/tests/playwright/pages/Dashboard/common/Cell/index.ts
index 41b4216620..ca04a11b83 100644
--- a/tests/playwright/pages/Dashboard/common/Cell/index.ts
+++ b/tests/playwright/pages/Dashboard/common/Cell/index.ts
@@ -6,6 +6,7 @@ import { SelectOptionCellPageObject } from './SelectOptionCell';
import { SharedFormPage } from '../../../SharedForm';
import { CheckboxCellPageObject } from './CheckboxCell';
import { RatingCellPageObject } from './RatingCell';
+import { DateCellPageObject } from './DateCell';
export class CellPageObject extends BasePage {
readonly parent: GridPage | SharedFormPage;
@@ -13,6 +14,8 @@ export class CellPageObject extends BasePage {
readonly attachment: AttachmentCellPageObject;
readonly checkbox: CheckboxCellPageObject;
readonly rating: RatingCellPageObject;
+ readonly date: DateCellPageObject;
+
constructor(parent: GridPage | SharedFormPage) {
super(parent.rootPage);
this.parent = parent;
@@ -20,6 +23,7 @@ export class CellPageObject extends BasePage {
this.attachment = new AttachmentCellPageObject(this);
this.checkbox = new CheckboxCellPageObject(this);
this.rating = new RatingCellPageObject(this);
+ this.date = new DateCellPageObject(this);
}
get({ index, columnHeader }: { index?: number; columnHeader: string }): Locator {
@@ -30,8 +34,12 @@ export class CellPageObject extends BasePage {
}
}
- async click({ index, columnHeader }: { index: number; columnHeader: string }) {
- return await this.get({ index, columnHeader }).click();
+ async click(
+ { index, columnHeader }: { index: number; columnHeader: string },
+ ...options: Parameters
+ ) {
+ await this.get({ index, columnHeader }).click(...options);
+ await (await this.get({ index, columnHeader }).elementHandle()).waitForElementState('stable');
}
async dblclick({ index, columnHeader }: { index?: number; columnHeader: string }) {
@@ -60,6 +68,14 @@ export class CellPageObject extends BasePage {
await this.get({ index, columnHeader }).locator('.nc-action-icon.nc-plus').click();
}
+ async verifyCellActiveSelected({ index, columnHeader }: { index: number; columnHeader: string }) {
+ await expect(this.get({ index, columnHeader })).toHaveClass(/active/);
+ }
+
+ async verifyCellEditable({ index, columnHeader }: { index: number; columnHeader: string }) {
+ await this.get({ index, columnHeader }).isEditable();
+ }
+
async verify({ index, columnHeader, value }: { index: number; columnHeader: string; value: string | string[] }) {
const _verify = async text => {
await expect
@@ -82,6 +98,32 @@ export class CellPageObject extends BasePage {
}
}
+ async verifyQrCodeCell({
+ index,
+ columnHeader,
+ expectedSrcValue,
+ }: {
+ index: number;
+ columnHeader: string;
+ expectedSrcValue: string;
+ }) {
+ const _verify = async expectedQrCodeImgSrc => {
+ await expect
+ .poll(async () => {
+ const qrCell = await this.get({
+ index,
+ columnHeader,
+ });
+ const qrImg = await qrCell.getByRole('img');
+ const qrImgSrc = await qrImg.getAttribute('src');
+ return qrImgSrc;
+ })
+ .toEqual(expectedQrCodeImgSrc);
+ };
+
+ await _verify(expectedSrcValue);
+ }
+
// todo: Improve param names (i.e value => values)
// verifyVirtualCell
// : virtual relational cell- HM, BT, MM
@@ -144,4 +186,13 @@ export class CellPageObject extends BasePage {
param.role === 'creator' || param.role === 'editor' ? 1 : 0
);
}
+
+ async copyToClipboard(
+ { index, columnHeader }: { index: number; columnHeader: string },
+ ...clickOptions: Parameters
+ ) {
+ await this.get({ index, columnHeader }).click(...clickOptions);
+
+ await this.get({ index, columnHeader }).press('Control+C');
+ }
}
diff --git a/tests/playwright/pages/SharedForm/index.ts b/tests/playwright/pages/SharedForm/index.ts
index 6aa548a9af..0079bde67d 100644
--- a/tests/playwright/pages/SharedForm/index.ts
+++ b/tests/playwright/pages/SharedForm/index.ts
@@ -16,7 +16,7 @@ export class SharedFormPage extends BasePage {
async submit() {
await this.waitForResponse({
- uiAction: this.get().locator('[data-testid="shared-form-submit-button"]').click(),
+ uiAction: this.get().getByTestId('shared-form-submit-button').click(),
httpMethodsToMatch: ['POST'],
requestUrlPathToMatch: '/rows',
});
diff --git a/tests/playwright/scripts/stressTestNewlyAddedTest.js b/tests/playwright/scripts/stressTestNewlyAddedTest.js
new file mode 100644
index 0000000000..63dfa8d76b
--- /dev/null
+++ b/tests/playwright/scripts/stressTestNewlyAddedTest.js
@@ -0,0 +1,37 @@
+// eslint-disable-next-line no-undef
+const util = require('util');
+// eslint-disable-next-line no-undef
+const exec = util.promisify(require('child_process').exec);
+// Get items from `git diff develop'
+
+void (async () => {
+ const { stdout: allFileNames } = await exec('git diff --name-only origin/develop');
+ // return if no changed file ends with .js
+ const testFilesInChangedFiles = allFileNames
+ .split('\n')
+ .filter(fileName => fileName.endsWith('.spec.ts'))
+ .filter(fileName => fileName.startsWith('+')); // Only get newly added files
+ if (testFilesInChangedFiles.length === 0) {
+ console.log('No test file changed, skipping stress test');
+ return;
+ }
+
+ const { stdout } = await exec(`git diff origin/develop -- **/*.spec.ts | grep test\\( | cat`);
+ // eslint-disable-next-line no-undef
+ const dbType = process.env.E2E_DB_TYPE;
+
+ // get test names which is in the form of `+ test('test name', () => {'
+ const testNames = stdout
+ .match(/\+ {2}test\('(.*)',/g)
+ // extract test name by removing `+ test('` and `',*`
+ .map(testName => testName.replace("test('", '').trimEnd().slice(0, -2).slice(1, testName.length).trim());
+ console.log({ dbType, testNames });
+
+ // run all the tests by title using regex with exact match
+ const { stdout: pwStdout } = await exec(
+ `PLAYWRIGHT_HTML_REPORT=playwright-report-stress E2E_DB_TYPE=${dbType} npx playwright test --repeat-each=2 --workers=2 -g "${testNames.join(
+ '|'
+ )}"`
+ );
+ console.log('pwStdout:', pwStdout);
+})();
diff --git a/tests/playwright/tests/columnAttachments.spec.ts b/tests/playwright/tests/columnAttachments.spec.ts
index 475c07fb14..f4ef56049e 100644
--- a/tests/playwright/tests/columnAttachments.spec.ts
+++ b/tests/playwright/tests/columnAttachments.spec.ts
@@ -31,6 +31,15 @@ test.describe('Attachment column', () => {
columnHeader: 'testAttach',
});
}
+ await dashboard.grid.cell.attachment.addFile({
+ index: 7,
+ columnHeader: 'testAttach',
+ filePath: `${process.cwd()}/fixtures/sampleFiles/sampleImage.jpeg`,
+ });
+ await dashboard.grid.cell.attachment.verifyFile({
+ index: 7,
+ columnHeader: 'testAttach',
+ });
await dashboard.viewSidebar.createFormView({
title: 'Form 1',
diff --git a/tests/playwright/tests/columnQrCode.spec.ts b/tests/playwright/tests/columnQrCode.spec.ts
new file mode 100644
index 0000000000..fb91ba5982
--- /dev/null
+++ b/tests/playwright/tests/columnQrCode.spec.ts
@@ -0,0 +1,151 @@
+import { test } from '@playwright/test';
+import { DashboardPage } from '../pages/Dashboard';
+import setup from '../setup';
+import { GridPage } from '../pages/Dashboard/Grid';
+
+type ExpectedQrCodeData = {
+ referencedValue: string;
+ base64EncodedSrc: string;
+};
+
+test.describe('Virtual Columns', () => {
+ let dashboard: DashboardPage;
+ let grid: GridPage;
+ let context: any;
+
+ test.beforeEach(async ({ page }) => {
+ context = await setup({ page });
+ dashboard = new DashboardPage(page, context.project);
+ grid = dashboard.grid;
+ });
+
+ test.describe('QrCode Column', () => {
+ async function qrCodeColumnVerify(qrColumnTitle: string, expectedQrCodeData: ExpectedQrCodeData[]) {
+ for (let i = 0; i < expectedQrCodeData.length; i++) {
+ await grid.cell.verifyQrCodeCell({
+ index: i,
+ columnHeader: qrColumnTitle,
+ expectedSrcValue: expectedQrCodeData[i].base64EncodedSrc,
+ });
+ }
+ }
+ test('creation, showing, updating value and change qr column title and reference column', async () => {
+ // Add qr code column referencing the City column
+ // and compare the base64 encoded codes/src attributes for the first 3 rows.
+ // Column data from City table (Sakila DB)
+ /**
+ * City LastUpdate Address List Country
+ * A Corua (La Corua) 2006-02-15 04:45:25 939 Probolinggo Loop Spain
+ * Abha 2006-02-15 04:45:25 733 Mandaluyong Place Saudi Arabia
+ * Abu Dhabi 2006-02-15 04:45:25 535 Ahmadnagar Manor United Arab Emirates
+ */
+ const expectedQrCodeCellValues: ExpectedQrCodeData[] = [
+ {
+ referencedValue: 'A Corua (La Corua)',
+ base64EncodedSrc:
+ 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAJYAAACWCAYAAAA8AXHiAAAAAXNSR0IArs4c6QAAB+dJREFUeF7tne2W2jAMBZf3f2h66Om2TTB4ciMlLMz+RZHlq7Esm4+9XK/X65d/KlCswEWwihXV3W8FBEsQWhQQrBZZdSpYMtCigGC1yKpTwZKBFgUEq0VWnQqWDLQoIFgtsupUsGSgRQHBapFVp4IlAy0KCFaLrDoVLBloUUCwWmTVqWDJQIsCgtUiq04FSwZaFCgF63K5tARJna4/ZT2KJ/kkNplX4vfRvMh4VJOtdlXzECygPEl0VUJu4ZDxQNiRSdU8BAvITxJdlRDBGiSEJADkMTZxK4yl+/tg1QJprVhVQY7kIv0TAZ3EmI6Vgr4ej8SYItU1lmCBr1UK1nZsBUuwFtRUVUfBEizB+l+BdHtaF3WyQtOx7LG2b6HDJ0gjSBpqknySbDKtJB7i92bTCVYS92gRkZzR+S4WfuVvN5AguwQZJZIIksRD/AoW2QugkoK1FMqKBcGZmQmWYH0rcPipMNl6SG+Qbj1VvRq5xKWbw5kLlMY4LTLv3GMRaIjNTMRHrxNAUiC7FqhgDT6ik/Q0grX8qJNgCdbmQkpaCsESLMGa3ZjPFCIrrfIei6zapMcZzZPMjdjMNHykT9oHzsZ761PhbPK319MeS7CeqytYYEslJzcCsRUrVImU1WSl062AbGHrqVmx3uRUGDJ791gKRNX4VYCSapgsGDpPUgyor0UvffQFaRIkET9t3l8xnq5kEx2rID68x3rFRFbEVFlBBWuVkTMFsWJly6MrZ1asLB+tPV9Xst9mKyzKGXbT9V4h2eaqbB7drWERdhr+iB5r5xw3Py5YmyW7e0CwBhoKlmDtV0CwDtEwHaS1eU+DSp+zYqXK/XvuJbfC/dOq9UDePiJvFxGbUeQJ6LUKnOettGKdN43xyIJ1XkYEa/AVe3KPlEBLriTOQ6F2ZMESrFqi/ngrBevIlU7UIL0RaVZJdSI9Fol5dEGaxkh6vHVMZCwyD8EKf22GiJsmiSzQ9fhkmyULJI35Lp6jPzaTTI48QytGVdIE67kCViwr1oIQKxYoGfZY14VKpPK/NViAmbvfnqJNLxE3HX/2HOmDRvMg2zz1PevNBKvxmmAGyO31JAE0+QR+cuIjMSY9J9HnJXssEni6zZGkpePPnhOsmUIPXif0dyb27PFnsgnWTKEdrxOwkhI+2p7IWGQqVfGQsTp7RTIPGuPMrnQrnA2WNqYjv2T1C9ZSOcEK75ZIQ0vgX9uQhBDQ6dhdWzqZB41xZmfFmikET4CCtRRSsAQLKLDd5HCwtoeY/9QQ7c1mMZGrjZmPR6+T7enIXjGdx/o5wQJKChYQaWUiWEAzwQIiCdb2f4guWC8GVtVJifYYZ143VPVzIz9VYBM/pOcjmLVuhYK1vToKFsBWsAQLYLLdRLAEazs14AnBEiyASY0JbcRno5FGlPYrd5d7q5/oJmMRm9mctlyiVum4HvNHNO+veFIiwiVvAgvWMtutp0LBeq2tkFRMsvCIH8EaqGTFIug8t2kFi/QBZIUQP7dpJr6SZ0ZjVR1UaJUnl8FkbvsRGnsQrMYPFVYllkBLbLogGi6Gyq/Yz05XVae0LaenWUwk+SRpxCZNLPFNbNLxk+esWFashJvpM4IlWFNIEoNSsJLTFNkeaZmnTf5MKNIYJxeLaXxku57N6fY6Gb9srMoeS7AmR/DBP90kQJQlG4xfNpZg3afWikVwP/Aey4plxfpWoLTHIpxX7fNVfsiFZLo9kBiJZp026dxmMQnWQCFSeWfC0maZ+Om0EayVuqQapKIJ1n6UrVhWrP0UjTSsPBWSCKsqTZUfe6zl75SSHBKbwysWCarKhlyspjZVF6Sd23XVlp7kQ7AGl4ZH3mMJVoLtyc+k1Uiw9ifOimXF2k/RKzTvLbN44NSKtfzMfbrtJjkrrVjkpJYESZ+p2sLIPJIkEdBHF6ud3wBKDiEkH4IF/hHBSEjBeo6XYAnWgpBkwQzvAisvSMkWQspoauNWmCr377kfAVZVkOR2/GZDwOqyoTFW9TRkEZO5VsWz9tO6FQrW/JvQqUaCtb86Dz2QE9aRNlaspQJWrPCClFSapKrQdZj4Tp6h8bgVrk6BVVXNinVyxSKrhjSUBIh4tYFvs5AY71Zx4Dedw+gws8fX1mcP3woFa2uKcnuyXefenz8pWAN9quC3YhVhSz5YVpU0t8J50qxYE43om7BdF4LJYkgvbG/PJQuUQETmQfzMkf76euutsEpI4mckNgGdLJrUJtmKBSu8fzryNCdYpLYBm6SEA7fDn4AkPRapNGSFEj9WrA+6xyJACNYSCKIHKQYf12OR7YkIl2ypI78p/MlzpMoncx/Oq/PzWKTpJBOhfgg0xIbEJFgffEFKVihZ+QS0dAsh49OFNYOd6EHmSmzcCovevxOsk5t3QjuxqVp9VX6OjLmyVyNxJzaHV6wkSCpkUjUEqyojVqyFAoIlWC1ACJZgCdYTBtLTZQ9WzW9CdwX9yG/VHRXxk9hQPchbY2tfBCwyftKnHn5BSiZSaUOSTcYjfhIbMvbNRrBWSlWtGpqAtR1JNvFN/CQ2ZGzBGqgkWEtR0m3FikWXoHYfp0DpBenHqeeEHyogWMLRooBgtciqU8GSgRYFBKtFVp0Klgy0KCBYLbLqVLBkoEUBwWqRVaeCJQMtCghWi6w6FSwZaFFAsFpk1algyUCLAoLVIqtOBUsGWhQQrBZZdfoLEHv21d0Jl6gAAAAASUVORK5CYII=',
+ },
+ {
+ referencedValue: 'Abha',
+ base64EncodedSrc:
+ 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAJYAAACWCAYAAAA8AXHiAAAAAXNSR0IArs4c6QAABx9JREFUeF7tndF22zgMROv//+j0xE2PbYW0ZghAMuy7zyAIDi5BkHK6l6+vr68//IcCyQpcACtZUdxdFQAsQChRALBKZMUpYMFAiQKAVSIrTgELBkoUAKwSWXEKWDBQogBglciKU8CCgRIFAKtEVpwCFgyUKABYJbLiFLBgoEQBwCqRFaeABQMlCgBWiaw4BSwYKFEAsEpkxSlgwUCJAiVgXS6XkmBXnc7+XmQUp/q3JeoanblX15cxTl23OhdgbZRSBQas54gBFmBdFVA3FBXrTgHnOFIFpmJRsaa7kR7rBoe6oV6uYmUHPlugA4tju52vomK9okYqSL/0qfhL6EjCVhfyf5wzt2MLWF5mDmveX3E3AhZHobxdHFgcWyqWnIKrIRXrhZ4bXrGqezjdrAELsHq/YzlvSeouGfl0jrfIzS4y9npUDD57qeuJ6OPMrc4zsju9YqkJGgWvJiIKtTqPGqOT3Gx9nLkB604BtRLMBFbhUBPuQB0BWI0bsITtoibCSa6aIMB6niCOwkSAVSidqqECXDG3IM3U5KPBUoVTj1fVDrBU5Td2UYHVaaNHoTqPuh7VDrBU5QHrqgBg3UDgKBQ2jwqMaudASI9VfOVXm1MnuQJTViVy5lZtAashWNlJU2GhYqlbummPBVi3xGV/AP/oHguwAGtYO6PPDYAFWIC10JY4n7Le7ihc0OvpEKeBHjmKVDH15uo079n6HDX36T1WtnCAta9oVKP9GT78p8lUrDfusRT6HZvobuQodNSe23IUCm9wEanPbKBncUc3n6LHYWApwVTZRJOrJkK1mzXQVetX/La9FSqLq7IBrH1lAWtfo18WgLUvGmDtawRYiRotuLoOocfaKBf5TESPdROzBKxVyjuNU58lso+YLhoB1mKmAOu5cIAFWIsKAFaNcOI/Oc5RWCL/+zrlKKRildANWCeA5Vy7R+GpSSshZuBUPc6cuCM+1ScRRx81HtVnSfMOWPvyq4lUtXSgHkWnxrO/sn8WgCUopYruJDfik4p1lzRVyCvt4o1LYCLFRI3diTviE7AAawo2YKXs+XgVUnepmrBZZYzMo/ZDZ8+dlNKnbkp6rIqbXiThMwVUELLtACsRbaf/UG8tasIBKzGRoisq1kaoSGV0QFdts+1ELsJmgAVYYYiGrc/Z//evyBGpVpeZcup450KwnctZnxpPpFVwtIgQV1Kx1PIdfbOKJOJ7bnU8YPmIAdZGM2dTKHJTsRSVRBsnOY7w2+nViuOUfyd2RQ5nfZH1RMbOqreyvumNmx7rURrAiuB0G3vYUZgT7qMXtfeZVQ11l0fsKtY9vIUZ31dV3SKxA9Zij5Vd2SJJdC9BgLWjtioQFWut0kdgp2JRsSL8TMcCFmD1Bks9tpxVOlf5kV+1KVfHRmNXNVL7O0cfdW51jYdVrOzA3YZVhUNNRnQ9KhzqDTCySd7yHUvdAarAjr9IMgDrudJULKHHUqudAzUVy1HrxzYimjOdemzNfFKxbspEK/BW45KK5cBxpq0K5lEAZm9IdX1teqwzYXHmVoUHLEfVf7ZULEEzwBJE2vaqFb9u8MM4ZwQVix6rhDzAAizAWlBA3ThtmndnQQt62UNmV+lInJG+y17AZoA6d/YTghN3SfMeSZgTvGoLWKpSeXaAtailWjUW3T8dps5NxapQ/84nFatY4IF7Ktai5mrVWHRPxRopkP1pwkmOM7dju40h2kceAaZTqbOPzcMqVnbgM9gcWBxbwHK2d9EnnUjCvPB/WztzO7aA5WWGiiW8EanHvSM9R6Gj1o9tpBIsTPcwxJnbsaVieZk5vWJFmmB110eb2OwYv1Ok+oysUZ3jO57sHhiwhKPQSdB2XztQj2oCYN2p4hwx2UmLzq0mUj0YAEtVSrCLJleY4mqiQuAkV/UZiZGjUFVvYwdYN0EcqDkKd4ADrH2w1D2b3Sqo80btaN5Pat7VxAEWzfuQleg1HrAAC7DuGaj4Kx16LHqsj+6xRiVGPXoqjriITzXuWW8XmXuo4ydXLMDKq6xbLalYwhuc+r6k3vRmD6SRqkHFWkykmlynv6NiUbHkGxdgOXXzjcFak2E+KgqWWsXUY8s5otTvlKqdo626HtXn6T2WGqhqB1iqUo92gLWjG2AB1poCgCX/XMgRmIoFWIB1z0D2jpjxxVHo1Kk3uBWuLTdnlPNjO3UDVAAcWe3LxXPUJ52IaNGxgBVV0B9/2HODH1reCMDK01L1BFgbpTgKVXSe2wEWYOWQtPFSAlZJpDhtpQBgtUpXn2ABq0+uWkUKWK3S1SdYwOqTq1aRAlardPUJFrD65KpVpIDVKl19ggWsPrlqFSlgtUpXn2ABq0+uWkUKWK3S1SdYwOqTq1aRAlardPUJFrD65KpVpIDVKl19ggWsPrlqFSlgtUpXn2ABq0+uWkUKWK3S1SfYvxJkkcY9Vq0GAAAAAElFTkSuQmCC',
+ },
+ {
+ referencedValue: 'Abu Dhabi',
+ base64EncodedSrc:
+ 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAJYAAACWCAYAAAA8AXHiAAAAAXNSR0IArs4c6QAABtpJREFUeF7tndt22zoMBev//+icZXf12FYka7ZA6JJMn8HbYARStN3cvr6+vv74TwKDCdwUazBRu3sQUCxFaCGgWC1Y7VSxdKCFgGK1YLVTxdKBFgKK1YLVThVLB1oIKFYLVjtVLB1oIaBYLVjtVLF0oIWAYrVgtVPF0oEWAorVgtVOFUsHWggoVgtWO1UsHWghoFgtWO1UsXSghUCLWLfbrWWyWztd+r0Inedc+0rb+zpo+61rTtuN/k2NYoEMKBaANAlRLMBMsQAkxXoSoNuRYinWLAHPWOtiXPaMNXriS6jmqlAiFq1O1fUk81zXIovYY+zdzljVRFB0CTQaS+PoHJfeCs/IKFnTa6xiTchZsbaq9N5OsRTrQWB0tVQsxVIsUqST8xCNpXFkfv9iOvqk4+8x9uEVi94lzUGrnocqY9MkdryR7jU2HWcuTrEq9EBbxQKQaEhSaitVw4r1OSNVqWm+rVgTAhWpKfRqcitzrI5N16hYivUgkOwoW+X61WcsCq0jEbRPK9ZLlii0paeHJrx6xqLjJOsZ3adiKRZ1KtqOFEuxFOvVgY7/5z3ZOkY/kcnY1IQj+xzNx8M7yHr1jFVJGpjeI6T6yl+ZY3VsukavG7xuiM53inXA+Y5Cr1YNK9YByXUr/Kx3VWr68LgVuhX+nq2w8lTMPikzv8KufjvyyLfC0Xx+zVvhaHBXkaBjnpTlHmMf/lkhhUHjOqBdpc8jGU3HViyQDcUCkKbn16Nv3vMpf25xFQk65klZ7jH2bhWLLrojrvraTRNB45YO0B1rp31WX3AO2wrpAjviFGudqmKtM/oWoVjr0BRrnZFiDWS0oatHE89YE3KVj4k8Yz1htoi11fIztEvkOMN8zzoHxZrevzR8JHTW5HfOS7EUq8UvxVIsxWohoFgtWK1YinUdsapvVpWv43ZQGn0FcZ8jvZCkLKvM6Hwo35aKRWEsTbIKiS6exikWJdV8j6VYL4AX/q4QrRCUZfVhpPOhilmxACkrFoA0Paue8ftY1acvx/C5hWLlRE9ZseaWQbeEHMF7CzoOlb/6zQq6Hjpv2l81TrE2Xjco1mf1FEuxqsVptr1iKZZiTQmMfkW+90/PKm6FJ98KqwmaLo+Ksdfl7BXkv7MYPc/Dt0LFynci+vBQtooFckChW7HeCVixVuRSrCcgKxaoRPSJUizFehBInirg3/BDaMeb4tKZhrKgHzEt8aIPKeG9eKQ4+rNCCpMusgMarYLJWipyVNp2HNTncnOZt0LFehJQrBcbkg9jqURzcVasdXodjL7dJ7oVrifCrXCd0S5iJdOgSaN9ju6v676rsp3RilM981Hmu52xkgmNFmF0f4qVZPPlqqNjK0ymMlqE0f0pVpJNxdpG66VVss3Qlwzap1shSN/oCjO6PysWSOJMSMs91rap7N/qChWCzrFKj1ZBOo5iAVIUeiJBR59gKYshdD50DMUCpCh0xTrR4R3ktS2EiqBYeQqsWICZYgFIkxDFAswUC0DaQyy6xeTT3dYi+QC8IhFtm6yiwrJjPnTuLRWrAoNOPIlTrITWmFjFmnCkT/kVLmLpWsao9N6LYilWh1f+ZYopVfqUW7E++7hbxaIJqz4+ScKT2Oq8pu3p2JW4ZM6j86NYG7fCJGlzsRVhKl8SXJq3Yq1klCbs3k0SWxXJijWA4BUSpljvibZiWbFmf5RbvTv8cWJVgNCzRvWCtKMCV9Y992yNFqO6cR1+eK8AVqxn+hVr8igoVrU2/G2vWIr1IFB5oNwKXwgk5xz6DLsVuhUulurKk9sh1mipaX/JdkaZHbk9enhPMr9SgWnCq7ffdBzFak7ukdtwsjQqgmJd8IxFRaDbMO3PrRCQSi4U6dNH34TONjbA9X+IFav5YxWaDFo1aMI6rgH2Ok9RZtX50HF+9eF9DlKlglLoHdteMjat/pU+FWtCT7EqOj3bKpZiPQgkxwWinmIp1s8Ui9ifxCRvhUm/01i6ZY6uBF0vGKPneXjFqiSXHr5HQ0uSe+TYCdvR81SshP5LrBXrMzjFUizPWMQBz1iE0vcYt8IVbor1y8TattwxrarfbqBPMz13JfdG9EGhcWOIrvey2xlrfSp9EYrVx3apZ8UCzK1YANL0ornjT54kW0I+5byFFStnVm1hxQIErVgA0h4VK5+GLX4agZaK9dMguZ6cgGLlzGwBCCgWgGRITkCxcma2AAQUC0AyJCegWDkzWwACigUgGZITUKycmS0AAcUCkAzJCShWzswWgIBiAUiG5AQUK2dmC0BAsQAkQ3ICipUzswUgoFgAkiE5AcXKmdkCEFAsAMmQnIBi5cxsAQgoFoBkSE7gPxlL8reNvNsfAAAAAElFTkSuQmCC',
+ },
+ ];
+
+ // close 'Team & Auth' tab
+ await dashboard.closeTab({ title: 'Team & Auth' });
+
+ await dashboard.treeView.openTable({ title: 'City' });
+
+ await grid.column.create({
+ title: 'QrCode1',
+ type: 'QrCode',
+ qrCodeValueColumnTitle: 'City',
+ });
+
+ await qrCodeColumnVerify('QrCode1', expectedQrCodeCellValues);
+
+ // Clicking on qr code in first row and expect it shows a
+ // popup with an enlarged version of the qr code
+ await grid.cell.get({ columnHeader: 'QrCode1', index: 0 }).click();
+ const qrGridOverlay = grid.qrCodeOverlay;
+ await qrGridOverlay.verifyQrValueLabel(expectedQrCodeCellValues[0].referencedValue);
+ await qrGridOverlay.clickCloseButton();
+
+ // Change the value in the referenced column, first row
+ // and expect respective QR changes accordingly
+ await grid.cell.fillText({ columnHeader: 'City', index: 0, text: 'Hamburg' });
+ const expectedQrCodeCellValuesAfterCityNameChange = [
+ {
+ referencedValue: 'Hamburg',
+ base64EncodedSrc:
+ 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAJYAAACWCAYAAAA8AXHiAAAAAXNSR0IArs4c6QAAB1FJREFUeF7tndF2GjEMRMP/f3R6IG1ZNms08kjeQG6fZUseXcuyCeXy+fn5+cE/FChW4AJYxYoy3U0BwAKEFgUAq0VWJgUsGGhRALBaZGVSwIKBFgUAq0VWJgUsGGhRALBaZGVSwIKBFgUAq0VWJgUsGGhRALBaZGVSwIKBFgUAq0VWJgUsGGhRALBaZGVSwIKBFgUAq0VWJgUsGGhRoAWsy+XSEuzspO73RZz1jHw7c87q8Gycq9F+bsASsuRAAFiCwKqJkwjVR8bO3Y3OegArk6nA1klEYRj/pwKsWFVXI47CWONvFs5GoWJNCD4acpSI6h1R4VsF5ih2d43ueCddK3wva94B6xGFFcmt2HyzAAOWoBwVSxBpZwJYgmaAJYgEWHcF6LHuWlS3KlQsYTNSsQSRflrFUqvG0dLOTLjbfKvjq/W56qj6zuO0OQ06/n+sTODVwmV8Hwmnjlft3JtZtT6AJWwXKtZzkTKPs2/XY1XvyDMrSSY5apzV+lCxqFg3BQBrA4K6GzuEy/hWeyyB8ZsJFYvmfchKR4VQAVZ7Rhd0d/Mp/k9/x6pOpCtadTzcChUMRZtMcqsTmfGtVhJx2RyF23aId6xHbKpBp2Kp21Kwy1SN6kR2+Fabctc3PVYAlyuwwO7wFtbhG7DUjHArTL0RARZgpT5gVY9hwAIswNow8Ks/K8zvhecjMj3Wmb5fJc5ZjU5/IJ0N3L3GV/u9zpeBJWNbHesK34BVmLVMwjK2hSEOLy1qH6nGAliqUoJdBpaMreA6ZbLCN2ClUlLX361I7pntwjKwCvOXnsq9HakQqHajfiy9sMIBL3sUFmqQngqwYskAK9bomwVgxaIBVqwRYBVqNDHV181z1Z/NzAZYMY6KFav4EhUrXsbPtVA/P1RXUJ0w1e/Zdi0V6+xFOf4By1HvPhawdjoCFmDVKABYPTp2NO8tkS6alIpVIzRHIRWrhqS9jh0Vy/1oQ/1SgWPnqplZo+PL8TOqvituqi0VKyOGaltt5yT79gB48LMuHQlz/ADWLstOJXISkYHtFfwAFmANmXYABizAAizluMhc2dW+ZNXOdfwo2vyzUTWqbgtGMap5UNe4rHl3F+QkPHMkOH5U0UfN/9F4wNqoou7G6xB1pzgJB6wYeTUP8UxfFlQs4YG0WnQqloqnkByOwkcF1KrOUVh4FKrHnpqcyf3xdJiT8Ew8q9ZYXZV/5FEIWHf0AIuK1fIxD2ABFmBtGVj11w2Z5p2jkKMw04fKtg5YmSZU9SMHnjBUfat2R64z73eJ0CXTluZd8vzESBVTtRu5csc761R9q3aAJWRDFVO1A6xHBTJVXUjXoQkVayfLCtGvLtVNodpRsYQtoIqp2lGx3rhiue8x6kv3EUTuV+yFvXAzyYDu6LGqqqrrPqyWHc8NmbKsBg9Yd6UAa0ONs0Ov0wAWYB3fEg6+1aJWK8Ba3yNlcsNRuFMg0xMpQmfmcyo4R6GSjRNtnOSql4TM67caj9MWjKp/dRp+5DtW9SIzzw2O70zCM7b7mJyxgOVkWByrVghxutQFw4HDGQtYajYNO8AyxAuGchQWapupJBlbjsLCJK2YiorVp3JLxapOmLv8zPXcid2pQu4a3fEZjRRfgCW8bSlCjppiB1TVb4UdYE2omBHNAYGKdU8OFYuKdVMgs/mUvQ1YgPXaYFXviNGuyXxep+y8jJ/MfM6x6Wq5QqNlFcsVQ03aCtGusTi9mNvou1qu0AiwVGILj0zAKhTd3WVqKCt2IxUrzgYVK9bo0IKj8Llwp4PlJEhtgN0vU6gxqvGMUqKOV6u/GvdLPzdkkqsWETcR6rGpJkiNB7DUDAuNLWDFYqpgUrE2WgIWYMUKBBbqEePertwdrsbJUZhH4lc370dyqbDlpX4cofrpgFo9Sp01ApbRH1rCi78eBlgbldXdePZRSMVytgbvWKk/CclsCictqh8qFhUrxRlgpeT6MlZFO/soVOOsthtJ6lSnTJrU9WTm3Nv+6uZdFbjaDrAmkVUTQcWKnyCOUuA+F2TyM4nAul//ereXd/dxVr2RAtYLNu/qzq224yicrINqIianfzrM9e2OV9e0ws/oMuAepcoaT2/elSAzNm7C3PFqrCv8AJaaDcHOTZg7Xggx/SSjzvntyj/47zmpWBOKumC449WQV/ihYqnZEOzchLnjhRCpWKpISgleUX5H72IZ34A1m/Xdm1zHDwioH03ULCGeJfOG5rxPZaCs1kiNe6RWZvPFin+seyBVgumyAaxYWcCKNfpmAVixaIAVawRYfxXIHLeABViHCvyKHmsi9wx5MwVaPtJ5M41YzoQCgDUhGkNiBQAr1giLCQUAa0I0hsQKAFasERYTCgDWhGgMiRUArFgjLCYUAKwJ0RgSKwBYsUZYTCgAWBOiMSRWALBijbCYUACwJkRjSKwAYMUaYTGhAGBNiMaQWAHAijXCYkIBwJoQjSGxAoAVa4TFhAKANSEaQ2IFACvWCIsJBf4ABVN/xpCpplAAAAAASUVORK5CYII=',
+ },
+ ...expectedQrCodeCellValues.slice(1),
+ ];
+ await qrCodeColumnVerify('QrCode1', expectedQrCodeCellValuesAfterCityNameChange);
+
+ // Change the QR Code column title
+ await grid.column.openEdit({ title: 'QrCode1' });
+ await grid.column.fillTitle({ title: 'QrCode1 Renamed' });
+ await grid.column.save({ isUpdated: true });
+ await qrCodeColumnVerify('QrCode1 Renamed', expectedQrCodeCellValuesAfterCityNameChange);
+
+ // Change the referenced column title
+ await grid.column.openEdit({ title: 'City' });
+ await grid.column.fillTitle({ title: 'City Renamed' });
+ await grid.column.save({ isUpdated: true });
+ await qrCodeColumnVerify('QrCode1 Renamed', expectedQrCodeCellValuesAfterCityNameChange);
+
+ // Change to another referenced column
+ await grid.column.create({ title: 'New City Column' });
+ await grid.cell.fillText({ columnHeader: 'New City Column', index: 0, text: 'Hamburg' });
+ await grid.column.openEdit({ title: 'QrCode1 Renamed' });
+ await grid.column.changeReferencedColumnForQrCode({ titleOfReferencedColumn: 'New City Column' });
+
+ await qrCodeColumnVerify('QrCode1 Renamed', [
+ {
+ referencedValue: 'Hamburg',
+ base64EncodedSrc:
+ 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAJYAAACWCAYAAAA8AXHiAAAAAXNSR0IArs4c6QAAB1FJREFUeF7tndF2GjEMRMP/f3R6IG1ZNms08kjeQG6fZUseXcuyCeXy+fn5+cE/FChW4AJYxYoy3U0BwAKEFgUAq0VWJgUsGGhRALBaZGVSwIKBFgUAq0VWJgUsGGhRALBaZGVSwIKBFgUAq0VWJgUsGGhRALBaZGVSwIKBFgUAq0VWJgUsGGhRALBaZGVSwIKBFgUAq0VWJgUsGGhRoAWsy+XSEuzspO73RZz1jHw7c87q8Gycq9F+bsASsuRAAFiCwKqJkwjVR8bO3Y3OegArk6nA1klEYRj/pwKsWFVXI47CWONvFs5GoWJNCD4acpSI6h1R4VsF5ih2d43ueCddK3wva94B6xGFFcmt2HyzAAOWoBwVSxBpZwJYgmaAJYgEWHcF6LHuWlS3KlQsYTNSsQSRflrFUqvG0dLOTLjbfKvjq/W56qj6zuO0OQ06/n+sTODVwmV8Hwmnjlft3JtZtT6AJWwXKtZzkTKPs2/XY1XvyDMrSSY5apzV+lCxqFg3BQBrA4K6GzuEy/hWeyyB8ZsJFYvmfchKR4VQAVZ7Rhd0d/Mp/k9/x6pOpCtadTzcChUMRZtMcqsTmfGtVhJx2RyF23aId6xHbKpBp2Kp21Kwy1SN6kR2+Fabctc3PVYAlyuwwO7wFtbhG7DUjHArTL0RARZgpT5gVY9hwAIswNow8Ks/K8zvhecjMj3Wmb5fJc5ZjU5/IJ0N3L3GV/u9zpeBJWNbHesK34BVmLVMwjK2hSEOLy1qH6nGAliqUoJdBpaMreA6ZbLCN2ClUlLX361I7pntwjKwCvOXnsq9HakQqHajfiy9sMIBL3sUFmqQngqwYskAK9bomwVgxaIBVqwRYBVqNDHV181z1Z/NzAZYMY6KFav4EhUrXsbPtVA/P1RXUJ0w1e/Zdi0V6+xFOf4By1HvPhawdjoCFmDVKABYPTp2NO8tkS6alIpVIzRHIRWrhqS9jh0Vy/1oQ/1SgWPnqplZo+PL8TOqvituqi0VKyOGaltt5yT79gB48LMuHQlz/ADWLstOJXISkYHtFfwAFmANmXYABizAAizluMhc2dW+ZNXOdfwo2vyzUTWqbgtGMap5UNe4rHl3F+QkPHMkOH5U0UfN/9F4wNqoou7G6xB1pzgJB6wYeTUP8UxfFlQs4YG0WnQqloqnkByOwkcF1KrOUVh4FKrHnpqcyf3xdJiT8Ew8q9ZYXZV/5FEIWHf0AIuK1fIxD2ABFmBtGVj11w2Z5p2jkKMw04fKtg5YmSZU9SMHnjBUfat2R64z73eJ0CXTluZd8vzESBVTtRu5csc761R9q3aAJWRDFVO1A6xHBTJVXUjXoQkVayfLCtGvLtVNodpRsYQtoIqp2lGx3rhiue8x6kv3EUTuV+yFvXAzyYDu6LGqqqrrPqyWHc8NmbKsBg9Yd6UAa0ONs0Ov0wAWYB3fEg6+1aJWK8Ba3yNlcsNRuFMg0xMpQmfmcyo4R6GSjRNtnOSql4TM67caj9MWjKp/dRp+5DtW9SIzzw2O70zCM7b7mJyxgOVkWByrVghxutQFw4HDGQtYajYNO8AyxAuGchQWapupJBlbjsLCJK2YiorVp3JLxapOmLv8zPXcid2pQu4a3fEZjRRfgCW8bSlCjppiB1TVb4UdYE2omBHNAYGKdU8OFYuKdVMgs/mUvQ1YgPXaYFXviNGuyXxep+y8jJ/MfM6x6Wq5QqNlFcsVQ03aCtGusTi9mNvou1qu0AiwVGILj0zAKhTd3WVqKCt2IxUrzgYVK9bo0IKj8Llwp4PlJEhtgN0vU6gxqvGMUqKOV6u/GvdLPzdkkqsWETcR6rGpJkiNB7DUDAuNLWDFYqpgUrE2WgIWYMUKBBbqEePertwdrsbJUZhH4lc370dyqbDlpX4cofrpgFo9Sp01ApbRH1rCi78eBlgbldXdePZRSMVytgbvWKk/CclsCictqh8qFhUrxRlgpeT6MlZFO/soVOOsthtJ6lSnTJrU9WTm3Nv+6uZdFbjaDrAmkVUTQcWKnyCOUuA+F2TyM4nAul//ereXd/dxVr2RAtYLNu/qzq224yicrINqIianfzrM9e2OV9e0ws/oMuAepcoaT2/elSAzNm7C3PFqrCv8AJaaDcHOTZg7Xggx/SSjzvntyj/47zmpWBOKumC449WQV/ihYqnZEOzchLnjhRCpWKpISgleUX5H72IZ34A1m/Xdm1zHDwioH03ULCGeJfOG5rxPZaCs1kiNe6RWZvPFin+seyBVgumyAaxYWcCKNfpmAVixaIAVawRYfxXIHLeABViHCvyKHmsi9wx5MwVaPtJ5M41YzoQCgDUhGkNiBQAr1giLCQUAa0I0hsQKAFasERYTCgDWhGgMiRUArFgjLCYUAKwJ0RgSKwBYsUZYTCgAWBOiMSRWALBijbCYUACwJkRjSKwAYMUaYTGhAGBNiMaQWAHAijXCYkIBwJoQjSGxAoAVa4TFhAKANSEaQ2IFACvWCIsJBf4ABVN/xpCpplAAAAAASUVORK5CYII=',
+ },
+ ]);
+
+ await dashboard.closeTab({ title: 'City' });
+ });
+
+ test('deletion of the QR column: directly and indirectly when the reference value column is deleted', async () => {
+ // close 'Team & Auth' tab
+ await dashboard.closeTab({ title: 'Team & Auth' });
+
+ await dashboard.treeView.openTable({ title: 'City' });
+
+ await grid.column.create({ title: 'column_name_a' });
+ await grid.column.verify({ title: 'column_name_a' });
+ await grid.column.create({
+ title: 'QrCode2',
+ type: 'QrCode',
+ qrCodeValueColumnTitle: 'column_name_a',
+ });
+ await grid.column.verify({ title: 'QrCode2', isVisible: true });
+ await grid.column.delete({ title: 'QrCode2' });
+ await grid.column.verify({ title: 'QrCode2', isVisible: false });
+
+ await grid.column.create({
+ title: 'QrCode2',
+ type: 'QrCode',
+ qrCodeValueColumnTitle: 'column_name_a',
+ });
+ await grid.column.verify({ title: 'QrCode2', isVisible: true });
+ await grid.column.delete({ title: 'column_name_a' });
+ await grid.column.verify({ title: 'QrCode2', isVisible: false });
+
+ await dashboard.closeTab({ title: 'City' });
+ });
+ });
+});
diff --git a/tests/playwright/tests/gridOperations.spec.ts b/tests/playwright/tests/gridOperations.spec.ts
new file mode 100644
index 0000000000..d05b9fcc54
--- /dev/null
+++ b/tests/playwright/tests/gridOperations.spec.ts
@@ -0,0 +1,117 @@
+import { expect, test } from '@playwright/test';
+import { DashboardPage } from '../pages/Dashboard';
+import setup from '../setup';
+
+test.describe('Grid operations', () => {
+ let dashboard: DashboardPage;
+ let context: any;
+
+ test.beforeEach(async ({ page }) => {
+ context = await setup({ page });
+ dashboard = new DashboardPage(page, context.project);
+ });
+
+ test('Clipboard support', async () => {
+ // close 'Team & Auth' tab
+ await dashboard.closeTab({ title: 'Team & Auth' });
+
+ await dashboard.treeView.createTable({ title: 'Sheet1' });
+
+ await dashboard.grid.column.create({
+ title: 'Number',
+ type: 'Number',
+ });
+ await dashboard.grid.column.create({
+ title: 'Checkbox',
+ type: 'Checkbox',
+ });
+ await dashboard.grid.column.create({
+ title: 'Date',
+ type: 'Date',
+ });
+ await dashboard.grid.column.create({
+ title: 'Attachment',
+ type: 'Attachment',
+ });
+
+ await dashboard.grid.addNewRow({
+ index: 0,
+ });
+ await dashboard.grid.cell.click({
+ index: 0,
+ columnHeader: 'Number',
+ });
+ await dashboard.grid.cell.fillText({
+ index: 0,
+ columnHeader: 'Number',
+ text: '123',
+ });
+ await dashboard.grid.cell.click({
+ index: 0,
+ columnHeader: 'Checkbox',
+ });
+
+ const today = new Date().toISOString().slice(0, 10);
+ await dashboard.grid.cell.date.open({
+ index: 0,
+ columnHeader: 'Date',
+ });
+ await dashboard.grid.cell.date.selectDate({
+ date: today,
+ });
+ await dashboard.grid.cell.date.close();
+
+ await dashboard.grid.cell.attachment.addFile({
+ index: 0,
+ columnHeader: 'Attachment',
+ filePath: `${process.cwd()}/fixtures/sampleFiles/1.json`,
+ });
+
+ await dashboard.grid.cell.copyToClipboard({
+ index: 0,
+ columnHeader: 'Title',
+ });
+ expect(await dashboard.grid.cell.getClipboardText()).toBe('Row 0');
+
+ await dashboard.grid.cell.copyToClipboard({
+ index: 0,
+ columnHeader: 'Number',
+ });
+ expect(await dashboard.grid.cell.getClipboardText()).toBe('123');
+
+ await dashboard.grid.cell.copyToClipboard(
+ {
+ index: 0,
+ columnHeader: 'Checkbox',
+ },
+ { position: { x: 1, y: 1 } }
+ );
+ await new Promise(resolve => setTimeout(resolve, 5000));
+ expect(await dashboard.grid.cell.getClipboardText()).toBe('true');
+
+ await dashboard.grid.cell.click({
+ index: 0,
+ columnHeader: 'Checkbox',
+ });
+ await dashboard.grid.cell.copyToClipboard(
+ {
+ index: 0,
+ columnHeader: 'Checkbox',
+ },
+ { position: { x: 1, y: 1 } }
+ );
+ expect(await dashboard.grid.cell.getClipboardText()).toBe('false');
+
+ await dashboard.grid.cell.copyToClipboard({
+ index: 0,
+ columnHeader: 'Date',
+ });
+ expect(await dashboard.grid.cell.getClipboardText()).toBe(today);
+
+ await dashboard.grid.cell.copyToClipboard({
+ index: 0,
+ columnHeader: 'Attachment',
+ });
+ // expect(await dashboard.grid.cell.getClipboardText()).toBe('1.json');
+ });
+});
diff --git a/tests/playwright/tests/keyboardShortcuts.spec.ts b/tests/playwright/tests/keyboardShortcuts.spec.ts
new file mode 100644
index 0000000000..168bbe948c
--- /dev/null
+++ b/tests/playwright/tests/keyboardShortcuts.spec.ts
@@ -0,0 +1,104 @@
+import { expect, test } from '@playwright/test';
+import { DashboardPage } from '../pages/Dashboard';
+import { GridPage } from '../pages/Dashboard/Grid';
+import setup from '../setup';
+
+test.describe('Verify shortcuts', () => {
+ let dashboard: DashboardPage, grid: GridPage;
+ let context: any;
+
+ test.beforeEach(async ({ page }) => {
+ context = await setup({ page });
+ dashboard = new DashboardPage(page, context.project);
+ grid = dashboard.grid;
+ });
+
+ test('Verify shortcuts', async ({ page }) => {
+ await dashboard.treeView.openTable({ title: 'Country' });
+ // create new table
+ await page.keyboard.press('Alt+t');
+ await dashboard.treeView.createTable({ title: 'New Table', skipOpeningModal: true });
+ await dashboard.treeView.verifyTable({ title: 'New Table' });
+
+ // create new row
+ await grid.column.clickColumnHeader({ title: 'Title' });
+ await page.waitForTimeout(2000);
+ await page.keyboard.press('Alt+r');
+ await grid.editRow({ index: 0, value: 'New Row' });
+ await grid.verifyRowCount({ count: 1 });
+
+ // create new column
+ await page.keyboard.press('Alt+c');
+ await grid.column.fillTitle({ title: 'New Column' });
+ await grid.column.save();
+ await grid.column.verify({ title: 'New Column' });
+
+ // fullscreen
+ await page.keyboard.press('Alt+f');
+ await dashboard.treeView.verifyVisibility({
+ isVisible: false,
+ });
+ await dashboard.viewSidebar.verifyVisibility({
+ isVisible: false,
+ });
+ await page.keyboard.press('Alt+f');
+ await dashboard.treeView.verifyVisibility({
+ isVisible: true,
+ });
+ await dashboard.viewSidebar.verifyVisibility({
+ isVisible: true,
+ });
+
+ // invite team member
+ await page.keyboard.press('Alt+i');
+ await dashboard.settings.teams.invite({
+ email: 'new@example.com',
+ role: 'editor',
+ skipOpeningModal: true,
+ });
+ const url = await dashboard.settings.teams.getInvitationUrl();
+ // await dashboard.settings.teams.closeInvite();
+ expect(url).toContain('signup');
+ await page.waitForTimeout(1000);
+ await dashboard.settings.teams.closeInvite();
+
+ // Cmd + Right arrow
+ await dashboard.treeView.openTable({ title: 'Country' });
+ await page.waitForTimeout(1500);
+ await grid.cell.click({ index: 0, columnHeader: 'Country' });
+ await page.waitForTimeout(1500);
+ await page.keyboard.press((await grid.isMacOs()) ? 'Meta+ArrowRight' : 'Control+ArrowRight');
+ await grid.cell.verifyCellActiveSelected({ index: 0, columnHeader: 'City List' });
+
+ // Cmd + Right arrow
+ await page.keyboard.press((await grid.isMacOs()) ? 'Meta+ArrowLeft' : 'Control+ArrowLeft');
+ await grid.cell.verifyCellActiveSelected({ index: 0, columnHeader: 'Country' });
+
+ // Cmd + up arrow
+ await grid.cell.click({ index: 24, columnHeader: 'Country' });
+ await page.keyboard.press((await grid.isMacOs()) ? 'Meta+ArrowUp' : 'Control+ArrowUp');
+ await grid.cell.verifyCellActiveSelected({ index: 0, columnHeader: 'Country' });
+
+ // Cmd + down arrow
+ await page.keyboard.press((await grid.isMacOs()) ? 'Meta+ArrowDown' : 'Control+ArrowDown');
+ await grid.cell.verifyCellActiveSelected({ index: 24, columnHeader: 'Country' });
+
+ // Enter to edit and Esc to cancel
+ await grid.cell.click({ index: 0, columnHeader: 'Country' });
+ await page.keyboard.press('Enter');
+ await page.keyboard.type('New');
+ await page.keyboard.press('Escape');
+ await grid.cell.verify({ index: 0, columnHeader: 'Country', value: 'AfghanistanNew' });
+
+ // Space to open expanded row and Meta + Space to save
+ await grid.cell.click({ index: 1, columnHeader: 'Country' });
+ await page.keyboard.press('Space');
+ await dashboard.expandedForm.verify({
+ header: 'Algeria',
+ });
+ await dashboard.expandedForm.fillField({ columnTitle: 'Country', value: 'NewAlgeria' });
+ await page.keyboard.press((await grid.isMacOs()) ? 'Meta+Enter' : 'Control+Enter');
+ await page.waitForTimeout(2000);
+ await grid.cell.verify({ index: 1, columnHeader: 'Country', value: 'NewAlgeria' });
+ });
+});
diff --git a/tests/playwright/tests/tableColumnOperation.spec.ts b/tests/playwright/tests/tableColumnOperation.spec.ts
index 8042af8ebe..6c921d3b6b 100644
--- a/tests/playwright/tests/tableColumnOperation.spec.ts
+++ b/tests/playwright/tests/tableColumnOperation.spec.ts
@@ -36,25 +36,13 @@ test.describe('Table Column Operations', () => {
columnTitle: 'Title',
value: 'value_a',
});
- await dashboard.expandedForm.save({ saveAndExitMode: true });
+ await dashboard.expandedForm.save();
await grid.cell.verify({
index: 0,
columnHeader: 'Title',
value: 'value_a',
});
- await grid.openExpandedRow({ index: 0 });
- await dashboard.expandedForm.fillField({
- columnTitle: 'Title',
- value: 'value_a_a',
- });
- await dashboard.expandedForm.save({ saveAndExitMode: false });
- await grid.cell.verify({
- index: 0,
- columnHeader: 'Title',
- value: 'value_a_a',
- });
-
await grid.deleteRow(0);
await grid.verifyRowDoesNotExist({ index: 0 });
diff --git a/tests/playwright/tests/viewForm.spec.ts b/tests/playwright/tests/viewForm.spec.ts
index 2f96356f9b..734f73bfc0 100644
--- a/tests/playwright/tests/viewForm.spec.ts
+++ b/tests/playwright/tests/viewForm.spec.ts
@@ -3,6 +3,7 @@ import { DashboardPage } from '../pages/Dashboard';
import { SettingTab } from '../pages/Dashboard/Settings';
import setup from '../setup';
import { FormPage } from '../pages/Dashboard/Form';
+import { SharedFormPage } from '../pages/SharedForm';
// todo: Move most of the ui actions to page object and await on the api response
test.describe('Form view', () => {
@@ -201,4 +202,32 @@ test.describe('Form view', () => {
});
await dashboard.settings.close();
});
+
+ test('Form share, verify attachment file', async () => {
+ await dashboard.treeView.createTable({ title: 'New' });
+
+ await dashboard.grid.column.create({
+ title: 'Attachment',
+ type: 'Attachment',
+ });
+
+ await dashboard.viewSidebar.createFormView({ title: 'NewForm' });
+ await dashboard.form.toolbar.clickShareView();
+ const formLink = await dashboard.form.toolbar.shareView.getShareLink();
+
+ await dashboard.rootPage.goto(formLink);
+
+ const sharedForm = new SharedFormPage(dashboard.rootPage);
+ await sharedForm.cell.attachment.addFile({
+ columnHeader: 'Attachment',
+ filePath: `${process.cwd()}/fixtures/sampleFiles/sampleImage.jpeg`,
+ });
+ await sharedForm.cell.fillText({
+ columnHeader: 'Title',
+ text: 'Text',
+ });
+
+ await sharedForm.submit();
+ await sharedForm.verifySuccessMessage();
+ });
});
diff --git a/tests/playwright/tests/viewKanban.spec.ts b/tests/playwright/tests/viewKanban.spec.ts
index b220e1e2d9..1bbb31e7e8 100644
--- a/tests/playwright/tests/viewKanban.spec.ts
+++ b/tests/playwright/tests/viewKanban.spec.ts
@@ -19,6 +19,10 @@ test.describe('View', () => {
// close 'Team & Auth' tab
await dashboard.closeTab({ title: 'Team & Auth' });
await dashboard.treeView.openTable({ title: 'Film' });
+
+ if (isSqlite(context)) {
+ await dashboard.treeView.deleteTable({ title: 'FilmList' });
+ }
if (isPg(context)) {
// Since these view depend on the Ratings column of the Film table
| |