Browse Source

Nc feat: add delimiters and encoding option in csv export and import extension (#9830)

* feat(nc-gui): add separator option in csv export extension

* fix(nc-gui): add delimiter option in csv export and import extension

* fix(nc-gui): add auto detect option in select input instead on giving checkbox to enable

* fix(nc-gui): add encoding option in csv import

* fix(nc-gui): add encoding option in csv export

* fix(nc-gui): csv import extension encoding issue and also add all supported charset

* fix(nocodb-sdk): udpate csv import export charset exports

* feat: encoding for export stream

* fix(nc-gui): use same char set for import & export csv

* fix(nc-gui): csv import, export encoding ui changes

* fix(nc-gui): change classnames

* chore(nc-gui): lint

* fix(nc-gui): export import extension optimization

* fix(nc-gui): reduce extension select input size to 32px

* chore(nocodb): install iconv-lite

---------

Co-authored-by: mertmit <mertmit99@gmail.com>
pull/9892/head
Ramesh Mane 4 days ago committed by GitHub
parent
commit
79fd651059
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
  1. 278
      packages/nc-gui/extensions/data-exporter/index.vue
  2. 154
      packages/nocodb-sdk/src/lib/import-export-data.ts
  3. 1
      packages/nocodb-sdk/src/lib/index.ts
  4. 1
      packages/nocodb/package.json
  5. 13
      packages/nocodb/src/controllers/attachments.controller.ts
  6. 3
      packages/nocodb/src/interface/Jobs.ts
  7. 10
      packages/nocodb/src/models/PresignedUrl.ts
  8. 14
      packages/nocodb/src/modules/jobs/jobs/data-export/data-export.processor.ts
  9. 75
      pnpm-lock.yaml

278
packages/nc-gui/extensions/data-exporter/index.vue

@ -1,6 +1,6 @@
<script setup lang="ts">
import dayjs from 'dayjs'
import { type ViewType, ViewTypes } from 'nocodb-sdk'
import { SupportedExportCharset, type ViewType, ViewTypes, charsetOptions, csvColumnSeparatorOptions } from 'nocodb-sdk'
const jobStatusTooltip = {
[JobStatus.COMPLETED]: 'Export successful',
@ -60,7 +60,12 @@ const exportedFiles = computed(() => {
const exportPayload = ref<{
tableId?: string
viewId?: string
}>({})
delimiter?: string
encoding?: SupportedExportCharset
}>({
delimiter: ',',
encoding: SupportedExportCharset['utf-8'],
})
const tableList = computed(() => {
return tables.value.map((table) => {
@ -94,6 +99,10 @@ const reloadViews = async () => {
}
}
const saveChanges = async () => {
await extension.value.kvStore.set('exportPayload', exportPayload.value)
}
const onTableSelect = async (tableId?: string) => {
if (!tableId) {
exportPayload.value.tableId = activeTableId.value
@ -107,12 +116,12 @@ const onTableSelect = async (tableId?: string) => {
exportPayload.value.viewId = views.value.find((view) => view.is_default)?.id
}
await extension.value.kvStore.set('exportPayload', exportPayload.value)
await saveChanges()
}
const onViewSelect = async (viewId: string) => {
exportPayload.value.viewId = viewId
await extension.value.kvStore.set('exportPayload', exportPayload.value)
await saveChanges()
}
const isExporting = ref(false)
@ -123,7 +132,11 @@ async function exportDataAsync() {
isExporting.value = true
const jobData = await $api.export.data(exportPayload.value.viewId, 'csv', { extension_id: extension.value.id })
const jobData = await $api.export.data(exportPayload.value.viewId, 'csv', {
extension_id: extension.value.id,
delimiter: exportPayload.value.delimiter,
encoding: exportPayload.value.encoding,
})
jobList.value.unshift(jobData)
$poller.subscribe(
@ -235,6 +248,9 @@ eventBus.on(async (event, payload) => {
onMounted(async () => {
exportPayload.value = extension.value.kvStore.get('exportPayload') || {}
exportPayload.value.delimiter = exportPayload.value.delimiter || ','
exportPayload.value.encoding = exportPayload.value.encoding || SupportedExportCharset['utf-8']
deletedExports.value = extension.value.kvStore.get('deletedExports') || []
await reloadViews()
@ -256,107 +272,166 @@ onMounted(async () => {
}"
>
<div
class="p-3 flex items-center justify-between gap-2.5 flex-wrap"
class="p-3 flex flex-col gap-3"
:class="{
'bg-white': fullscreen,
}"
>
<div
class="nc-data-exporter-select-wrapper flex-1 flex items-center border-1 border-nc-border-gray-medium rounded-lg relative shadow-default"
:class="{
'max-w-[min(400px,calc(100%-131px))]': isExporting && !fullscreen && width > 425,
'max-w-[min(400px,calc(100%_-_87px))]': !isExporting && !fullscreen && width > 425,
'max-w-full': width <= 425,
'max-w-[474px]': fullscreen,
}"
>
<a-form-item
class="!my-0"
:class="{
'flex-1 max-w-[237px]': fullscreen,
'min-w-1/2 max-w-[200px]': !fullscreen,
}"
>
<NcSelect
v-model:value="exportPayload.tableId"
placeholder="-select table-"
:disabled="isExporting"
class="nc-data-exporter-table-select nc-select-shadow"
:filter-option="filterOption"
dropdown-class-name="w-[250px]"
show-search
size="large"
@change="onTableSelect"
>
<a-select-option v-for="table of tableList" :key="table.label" :value="table.value">
<div class="w-full flex items-center gap-2">
<div class="min-w-5 flex items-center justify-center">
<GeneralTableIcon :meta="{ meta: table.meta }" class="text-gray-500" />
<div v-if="fullscreen" class="flex items-center gap-3 max-w-full">
<div class="flex flex-col gap-2 w-[calc(50%_-_6px)]">
<div>Separator</div>
<a-form-item class="!my-0 flex-1">
<NcSelect
v-model:value="exportPayload.delimiter"
placeholder="-select separator-"
:disabled="isExporting"
class="nc-data-exporter-separator nc-select-shadow"
dropdown-class-name="w-[180px]"
@change="saveChanges"
>
<a-select-option v-for="delimiter of csvColumnSeparatorOptions" :key="delimiter.value" :value="delimiter.value">
<div class="w-full flex items-center gap-2">
<NcTooltip class="flex-1 truncate" show-on-truncate-only>
<template #title>{{ delimiter.label }}</template>
<span>{{ delimiter.label }}</span>
</NcTooltip>
<component
:is="iconMap.check"
v-if="exportPayload.delimiter === delimiter.value"
id="nc-selected-item-icon"
class="flex-none text-primary w-4 h-4"
/>
</div>
<NcTooltip class="flex-1 truncate" show-on-truncate-only>
<template #title>{{ table.label }}</template>
<span>{{ table.label }}</span>
</NcTooltip>
<component
:is="iconMap.check"
v-if="exportPayload.tableId === table.value"
id="nc-selected-item-icon"
class="flex-none text-primary w-4 h-4"
/>
</div>
</a-select-option>
</NcSelect>
</a-form-item>
<a-form-item
class="!my-0"
</a-select-option>
</NcSelect>
</a-form-item>
</div>
<div class="flex flex-col gap-2 w-[calc(50%_-_6px)]">
<div class="min-w-[65px]">Encoding</div>
<a-form-item class="!my-0 flex-1">
<NcSelect
v-model:value="exportPayload.encoding"
placeholder="-select encoding-"
class="nc-data-exporter-encoding nc-select-shadow"
dropdown-class-name="w-[190px]"
:filter-option="filterOption"
show-search
@change="saveChanges"
>
<a-select-option v-for="encoding of charsetOptions" :key="encoding.label" :value="encoding.value">
<div class="w-full flex items-center gap-2">
<NcTooltip class="flex-1 truncate" show-on-truncate-only>
<template #title>{{ encoding.label }}</template>
<span>{{ encoding.label }}</span>
</NcTooltip>
<component
:is="iconMap.check"
v-if="exportPayload.encoding === encoding.value"
id="nc-selected-item-icon"
class="flex-none text-primary w-4 h-4"
/>
</div>
</a-select-option>
</NcSelect>
</a-form-item>
</div>
</div>
<div class="flex items-center justify-between gap-2.5 flex-wrap">
<div
class="nc-data-exporter-select-wrapper flex-1 flex items-center border-1 border-nc-border-gray-medium rounded-lg relative shadow-default"
:class="{
'flex-1 max-w-[237px]': fullscreen,
'min-w-1/2 max-w-[200px]': !fullscreen,
'max-w-[min(350px,calc(100%-124px))]': isExporting && !fullscreen && width > 325,
'max-w-[min(350px,calc(100%_-_76px))]': !isExporting && !fullscreen && width > 325,
'max-w-full': width <= 325,
'max-w-[480px]': fullscreen,
}"
>
<NcSelect
v-model:value="exportPayload.viewId"
placeholder="-select view-"
:disabled="isExporting"
class="nc-data-exporter-view-select nc-select-shadow"
dropdown-class-name="w-[250px]"
:filter-option="filterOption"
show-search
size="large"
placement="bottomRight"
@change="onViewSelect"
<a-form-item
class="!my-0"
:class="{
'flex-1 max-w-[240px]': fullscreen,
'min-w-1/2 max-w-[175px]': !fullscreen,
}"
>
<a-select-option v-for="view of viewList" :key="view.label" :value="view.value">
<div class="w-full flex items-center gap-2">
<div class="min-w-5 flex items-center justify-center">
<GeneralViewIcon :meta="{ meta: view.meta, type: view.type }" class="flex-none text-gray-500" />
<NcSelect
v-model:value="exportPayload.tableId"
placeholder="-select table-"
:disabled="isExporting"
class="nc-data-exporter-table-select nc-select-shadow"
:filter-option="filterOption"
dropdown-class-name="w-[250px]"
show-search
@change="onTableSelect"
>
<a-select-option v-for="table of tableList" :key="table.label" :value="table.value">
<div class="w-full flex items-center gap-2">
<div class="min-w-5 flex items-center justify-center">
<GeneralTableIcon :meta="{ meta: table.meta }" class="text-gray-500" />
</div>
<NcTooltip class="flex-1 truncate" show-on-truncate-only>
<template #title>{{ table.label }}</template>
<span>{{ table.label }}</span>
</NcTooltip>
<component
:is="iconMap.check"
v-if="exportPayload.tableId === table.value"
id="nc-selected-item-icon"
class="flex-none text-primary w-4 h-4"
/>
</div>
<NcTooltip class="flex-1 truncate" show-on-truncate-only>
<template #title>{{ view.label }}</template>
<span>{{ view.label }}</span>
</NcTooltip>
<component
:is="iconMap.check"
v-if="exportPayload.viewId === view.value"
id="nc-selected-item-icon"
class="flex-none text-primary w-4 h-4"
/>
</div> </a-select-option
></NcSelect>
</a-form-item>
</div>
<div class="flex-none flex justify-end">
<NcTooltip class="flex" placement="topRight" :disabled="!isExporting">
<template #title> The CSV file is being prepared in the background. You'll be notified once it's ready. </template>
<NcButton
:disabled="!exportPayload?.viewId || isExporting"
:loading="isExporting"
size="medium"
@click="exportDataAsync"
>{{ isExporting ? 'Generating' : 'Export' }}</NcButton
</a-select-option>
</NcSelect>
</a-form-item>
<a-form-item
class="!my-0"
:class="{
'flex-1 max-w-[240px]': fullscreen,
'min-w-1/2 max-w-[175px]': !fullscreen,
}"
>
</NcTooltip>
<NcSelect
v-model:value="exportPayload.viewId"
placeholder="-select view-"
:disabled="isExporting"
class="nc-data-exporter-view-select nc-select-shadow"
dropdown-class-name="w-[250px]"
:filter-option="filterOption"
show-search
placement="bottomRight"
@change="onViewSelect"
>
<a-select-option v-for="view of viewList" :key="view.label" :value="view.value">
<div class="w-full flex items-center gap-2">
<div class="min-w-5 flex items-center justify-center">
<GeneralViewIcon :meta="{ meta: view.meta, type: view.type }" class="flex-none text-gray-500" />
</div>
<NcTooltip class="flex-1 truncate" show-on-truncate-only>
<template #title>{{ view.label }}</template>
<span>{{ view.label }}</span>
</NcTooltip>
<component
:is="iconMap.check"
v-if="exportPayload.viewId === view.value"
id="nc-selected-item-icon"
class="flex-none text-primary w-4 h-4"
/>
</div> </a-select-option
></NcSelect>
</a-form-item>
</div>
<div class="flex-none flex justify-end">
<NcTooltip class="flex" placement="topRight" :disabled="!isExporting">
<template #title> The CSV file is being prepared in the background. You'll be notified once it's ready. </template>
<NcButton
:disabled="!exportPayload?.viewId || isExporting"
:loading="isExporting"
size="small"
@click="exportDataAsync"
>{{ isExporting ? 'Generating' : 'Export' }}</NcButton
>
</NcTooltip>
</div>
</div>
</div>
<div
@ -523,6 +598,13 @@ onMounted(async () => {
}
}
:deep(.nc-data-exporter-separator.ant-select),
:deep(.nc-data-exporter-encoding.ant-select) {
.ant-select-selector {
@apply !rounded-lg h-8;
}
}
.data-exporter-body {
@apply flex-1 overflow-hidden;
}
@ -536,11 +618,5 @@ onMounted(async () => {
<style lang="scss">
.nc-nc-data-exporter .extension-content {
@apply !p-0;
&.fullscreen {
.extension-header {
@apply !border-b-transparent;
}
}
}
</style>

154
packages/nocodb-sdk/src/lib/import-export-data.ts

@ -0,0 +1,154 @@
export enum SupportedExportCharset {
'utf-8' = 'utf-8',
'iso-8859-6' = 'iso-8859-6',
'windows-1256' = 'windows-1256',
'iso-8859-4' = 'iso-8859-4',
'windows-1257' = 'windows-1257',
'iso-8859-14' = 'iso-8859-14',
'iso-8859-2' = 'iso-8859-2',
'windows-1250' = 'windows-1250',
'gbk' = 'gbk',
'gb18030' = 'gb18030',
'big5' = 'big5',
'koi8-r' = 'koi8-r',
'koi8-u' = 'koi8-u',
'iso-8859-5' = 'iso-8859-5',
'windows-1251' = 'windows-1251',
'x-mac-cyrillic' = 'x-mac-cyrillic',
'iso-8859-7' = 'iso-8859-7',
'windows-1253' = 'windows-1253',
'iso-8859-8' = 'iso-8859-8',
'windows-1255' = 'windows-1255',
'euc-jp' = 'euc-jp',
'iso-2022-jp' = 'iso-2022-jp',
'shift-jis' = 'shift-jis',
'euc-kr' = 'euc-kr',
'macintosh' = 'macintosh',
'iso-8859-10' = 'iso-8859-10',
'iso-8859-16' = 'iso-8859-16',
'windows-874' = 'windows-874',
'windows-1254' = 'windows-1254',
'windows-1258' = 'windows-1258',
'iso-8859-1' = 'iso-8859-1',
'windows-1252' = 'windows-1252',
'iso-8859-3' = 'iso-8859-3',
}
export const charsetOptions = [
{ label: 'Unicode (UTF-8)', value: SupportedExportCharset['utf-8'] },
{ label: 'Arabic (ISO-8859-6)', value: SupportedExportCharset['iso-8859-6'] },
{
label: 'Arabic (Windows-1256)',
value: SupportedExportCharset['windows-1256'],
},
{ label: 'Baltic (ISO-8859-4)', value: SupportedExportCharset['iso-8859-4'] },
{
label: 'Baltic (windows-1257)',
value: SupportedExportCharset['windows-1257'],
},
{
label: 'Celtic (ISO-8859-14)',
value: SupportedExportCharset['iso-8859-14'],
},
{
label: 'Central European (ISO-8859-2)',
value: SupportedExportCharset['iso-8859-2'],
},
{
label: 'Central European (Windows-1250)',
value: SupportedExportCharset['windows-1250'],
},
{ label: 'Chinese, Simplified (GBK)', value: SupportedExportCharset['gbk'] },
{ label: 'Chinese (GB18030)', value: SupportedExportCharset['gb18030'] },
{
label: 'Chinese Traditional (Big5)',
value: SupportedExportCharset['big5'],
},
{ label: 'Cyrillic (KOI8-R)', value: SupportedExportCharset['koi8-r'] },
{ label: 'Cyrillic (KOI8-U)', value: SupportedExportCharset['koi8-u'] },
{
label: 'Cyrillic (ISO-8859-5)',
value: SupportedExportCharset['iso-8859-5'],
},
{
label: 'Cyrillic (Windows-1251)',
value: SupportedExportCharset['windows-1251'],
},
{
label: 'Cyrillic Mac OS (x-mac-cyrillic)',
value: SupportedExportCharset['x-mac-cyrillic'],
},
{ label: 'Greek (ISO-8859-7)', value: SupportedExportCharset['iso-8859-7'] },
{
label: 'Greek (Windows-1253)',
value: SupportedExportCharset['windows-1253'],
},
{ label: 'Hebrew (ISO-8859-8)', value: SupportedExportCharset['iso-8859-8'] },
{
label: 'Hebrew (Windows-1255)',
value: SupportedExportCharset['windows-1255'],
},
{ label: 'Japanese (EUC-JP)', value: SupportedExportCharset['euc-jp'] },
{
label: 'Japanese (ISO-2022-JP)',
value: SupportedExportCharset['iso-2022-jp'],
},
{ label: 'Japanese (Shift-JIS)', value: SupportedExportCharset['shift-jis'] },
{ label: 'Korean (EUC-KR)', value: SupportedExportCharset['euc-kr'] },
{ label: 'Macintosh', value: SupportedExportCharset['macintosh'] },
{
label: 'Nordic (ISO-8859-10)',
value: SupportedExportCharset['iso-8859-10'],
},
{
label: 'South-Eastern European (ISO-8859-16)',
value: SupportedExportCharset['iso-8859-16'],
},
{ label: 'Thai (Windows-874)', value: SupportedExportCharset['windows-874'] },
{
label: 'Turkish (Windows-1254)',
value: SupportedExportCharset['windows-1254'],
},
{
label: 'Vietnamese (Windows-1258)',
value: SupportedExportCharset['windows-1258'],
},
{
label: 'Western European (ISO-8859-1)',
value: SupportedExportCharset['iso-8859-1'],
},
{
label: 'Western European (Windows-1252)',
value: SupportedExportCharset['windows-1252'],
},
{
label: 'Latin 3 (ISO-8859-3)',
value: SupportedExportCharset['iso-8859-3'],
},
];
export enum CsvColumnSeparator {
',' = ',',
';' = ';',
'|' = '|',
'tab' = '\t',
}
export const csvColumnSeparatorOptions = [
{
label: ',',
value: CsvColumnSeparator[','],
},
{
label: ';',
value: CsvColumnSeparator[';'],
},
{
label: '|',
value: CsvColumnSeparator['|'],
},
{
label: '<Tab>',
value: CsvColumnSeparator['tab'],
},
];

1
packages/nocodb-sdk/src/lib/index.ts

@ -36,3 +36,4 @@ export * from '~/lib/filterHelpers';
export * from '~/lib/errorUtils';
export * from '~/lib/formBuilder';
export * from '~/lib/ai';
export * from '~/lib/import-export-data';

1
packages/nocodb/package.json

@ -102,6 +102,7 @@
"glob": "^10.4.5",
"handlebars": "^4.7.8",
"html-to-json-parser": "^2.0.1",
"iconv-lite": "^0.6.3",
"import-fresh": "^3.3.0",
"inflection": "^1.13.4",
"ioredis": "^5.4.1",

13
packages/nocodb/src/controllers/attachments.controller.ts

@ -168,6 +168,7 @@ export class AttachmentsController {
let queryResponseContentType = null;
let queryResponseContentDisposition = null;
let queryResponseContentEncoding = null;
if (queryHelper.length > 1) {
const query = new URLSearchParams(queryHelper[1]);
@ -175,6 +176,7 @@ export class AttachmentsController {
queryResponseContentDisposition = query.get(
'ResponseContentDisposition',
);
queryResponseContentEncoding = query.get('ResponseContentEncoding');
}
const targetParam = param.split('/')[2];
@ -191,12 +193,23 @@ export class AttachmentsController {
if (queryResponseContentType) {
res.setHeader('Content-Type', queryResponseContentType);
if (queryResponseContentEncoding) {
res.setHeader(
'Content-Type',
`${queryResponseContentType}; charset=${queryResponseContentEncoding}`,
);
}
}
if (queryResponseContentDisposition) {
res.setHeader('Content-Disposition', queryResponseContentDisposition);
}
if (queryResponseContentEncoding) {
res.setHeader('Content-Encoding', queryResponseContentEncoding);
}
res.sendFile(file.path);
} catch (e) {
res.status(404).send('Not found');

3
packages/nocodb/src/interface/Jobs.ts

@ -1,4 +1,4 @@
import type { AttachmentResType, PublicAttachmentScope, UserType } from 'nocodb-sdk';
import type { AttachmentResType, PublicAttachmentScope, SupportedExportCharset, UserType } from 'nocodb-sdk';
import type { NcContext, NcRequest } from '~/interface/config';
export const JOBS_QUEUE = 'jobs';
@ -152,6 +152,7 @@ export interface DataExportJobData extends JobData {
options?: {
delimiter?: string;
extension_id?: string;
encoding?: SupportedExportCharset;
};
modelId: string;
viewId: string;

10
packages/nocodb/src/models/PresignedUrl.ts

@ -96,6 +96,7 @@ export default class PresignedUrl {
filename?: string;
preview?: boolean;
mimetype?: string;
encoding?: string;
},
ncMeta = Noco.ncMeta,
) {
@ -109,6 +110,7 @@ export default class PresignedUrl {
expireSeconds = DEFAULT_EXPIRE_SECONDS,
filename,
mimetype,
encoding,
} = param;
const preview = param.preview
@ -152,6 +154,14 @@ export default class PresignedUrl {
if (mimetype) {
pathParameters.ResponseContentType = mimetype;
if (encoding) {
pathParameters.ResponseContentType = `${mimetype}; charset=${encoding}`;
}
}
if (encoding) {
pathParameters.ResponseContentEncoding = encoding;
}
// append query params to the cache path

14
packages/nocodb/src/modules/jobs/jobs/data-export/data-export.processor.ts

@ -1,5 +1,6 @@
import { Readable } from 'stream';
import path from 'path';
import iconv from 'iconv-lite';
import { Injectable, Logger } from '@nestjs/common';
import moment from 'moment';
import type { Job } from 'bull';
@ -61,10 +62,19 @@ export class DataExportProcessor {
dataStream.setEncoding('utf8');
const encodedStream =
options?.encoding &&
options.encoding !== 'utf-8' &&
iconv.encodingExists(options.encoding)
? dataStream
.pipe(iconv.decodeStream('utf-8'))
.pipe(iconv.encodeStream(options?.encoding || 'utf-8'))
: dataStream;
let error = null;
const uploadFilePromise = (storageAdapter as any)
.fileCreateByStream(destPath, dataStream)
.fileCreateByStream(destPath, encodedStream)
.catch((e) => {
this.logger.error(e);
error = e;
@ -96,6 +106,7 @@ export class DataExportProcessor {
expireSeconds: 3 * 60 * 60, // 3 hours
preview: false,
mimetype: 'text/csv',
encoding: options?.encoding || 'utf-8',
});
} else {
url = await PresignedUrl.getSignedUrl({
@ -104,6 +115,7 @@ export class DataExportProcessor {
expireSeconds: 3 * 60 * 60, // 3 hours
preview: false,
mimetype: 'text/csv',
encoding: options?.encoding || 'utf-8',
});
}

75
pnpm-lock.yaml

@ -600,7 +600,7 @@ importers:
version: 3.1.2
'@nestjs/bull':
specifier: ^10.0.1
version: 10.0.1(@nestjs/common@10.3.8(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1))(@nestjs/core@10.3.8)(bull@4.12.5)
version: 10.0.1(@nestjs/common@10.3.8(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1))(@nestjs/core@10.3.8(@nestjs/common@10.3.8(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1))(@nestjs/platform-express@10.3.8)(@nestjs/websockets@10.3.8)(encoding@0.1.13)(reflect-metadata@0.2.1)(rxjs@7.8.1))(bull@4.12.5)
'@nestjs/common':
specifier: ^10.3.8
version: 10.3.8(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1)
@ -612,7 +612,7 @@ importers:
version: 10.3.8(@nestjs/common@10.3.8(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1))(@nestjs/platform-express@10.3.8)(@nestjs/websockets@10.3.8)(encoding@0.1.13)(reflect-metadata@0.2.1)(rxjs@7.8.1)
'@nestjs/event-emitter':
specifier: ^2.0.4
version: 2.0.4(@nestjs/common@10.3.8(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1))(@nestjs/core@10.3.8)
version: 2.0.4(@nestjs/common@10.3.8(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1))(@nestjs/core@10.3.8(@nestjs/common@10.3.8(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1))(@nestjs/platform-express@10.3.8)(@nestjs/websockets@10.3.8)(encoding@0.1.13)(reflect-metadata@0.2.1)(rxjs@7.8.1))
'@nestjs/passport':
specifier: ^10.0.3
version: 10.0.3(@nestjs/common@10.3.8(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1))(passport@0.7.0)
@ -624,13 +624,13 @@ importers:
version: 10.3.8(@nestjs/common@10.3.8(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1))(@nestjs/websockets@10.3.8)(rxjs@7.8.1)
'@nestjs/throttler':
specifier: ^5.1.2
version: 5.1.2(@nestjs/common@10.3.8(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1))(@nestjs/core@10.3.8)(reflect-metadata@0.2.1)
version: 5.1.2(@nestjs/common@10.3.8(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1))(@nestjs/core@10.3.8(@nestjs/common@10.3.8(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1))(@nestjs/platform-express@10.3.8)(@nestjs/websockets@10.3.8)(encoding@0.1.13)(reflect-metadata@0.2.1)(rxjs@7.8.1))(reflect-metadata@0.2.1)
'@nestjs/websockets':
specifier: ^10.3.8
version: 10.3.8(@nestjs/common@10.3.8(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1))(@nestjs/core@10.3.8)(@nestjs/platform-socket.io@10.3.8)(reflect-metadata@0.2.1)(rxjs@7.8.1)
'@ntegral/nestjs-sentry':
specifier: ^4.0.1
version: 4.0.1(@nestjs/common@10.3.8(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1))(@nestjs/core@10.3.8)(@sentry/hub@7.113.0)(@sentry/node@6.19.7)(class-validator@0.14.1)(graphql@16.9.0)(reflect-metadata@0.2.1)(rimraf@5.0.7)(rxjs@7.8.1)
version: 4.0.1(@nestjs/common@10.3.8(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1))(@nestjs/core@10.3.8(@nestjs/common@10.3.8(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1))(@nestjs/platform-express@10.3.8)(@nestjs/websockets@10.3.8)(encoding@0.1.13)(reflect-metadata@0.2.1)(rxjs@7.8.1))(@sentry/hub@7.113.0)(@sentry/node@6.19.7)(class-validator@0.14.1)(graphql@16.9.0)(reflect-metadata@0.2.1)(rimraf@5.0.7)(rxjs@7.8.1)
'@sentry/node':
specifier: ^6.19.7
version: 6.19.7
@ -736,6 +736,9 @@ importers:
html-to-json-parser:
specifier: ^2.0.1
version: 2.0.1
iconv-lite:
specifier: ^0.6.3
version: 0.6.3
import-fresh:
specifier: ^3.3.0
version: 3.3.0
@ -810,7 +813,7 @@ importers:
version: 0.258.2
nestjs-throttler-storage-redis:
specifier: ^0.4.4
version: 0.4.4(@nestjs/common@10.3.8(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1))(@nestjs/core@10.3.8)(@nestjs/throttler@5.1.2(@nestjs/common@10.3.8(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1))(@nestjs/core@10.3.8)(reflect-metadata@0.2.1))(ioredis@5.4.1)(reflect-metadata@0.2.1)
version: 0.4.4(@nestjs/common@10.3.8(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1))(@nestjs/core@10.3.8(@nestjs/common@10.3.8(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1))(@nestjs/platform-express@10.3.8)(@nestjs/websockets@10.3.8)(encoding@0.1.13)(reflect-metadata@0.2.1)(rxjs@7.8.1))(@nestjs/throttler@5.1.2(@nestjs/common@10.3.8(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1))(@nestjs/core@10.3.8(@nestjs/common@10.3.8(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1))(@nestjs/platform-express@10.3.8)(@nestjs/websockets@10.3.8)(encoding@0.1.13)(reflect-metadata@0.2.1)(rxjs@7.8.1))(reflect-metadata@0.2.1))(ioredis@5.4.1)(reflect-metadata@0.2.1)
nocodb-sdk:
specifier: workspace:^
version: link:../nocodb-sdk
@ -907,13 +910,13 @@ importers:
devDependencies:
'@nestjs/cli':
specifier: ^10.3.2
version: 10.3.2(webpack-cli@5.1.4)
version: 10.3.2(webpack-cli@5.1.4(webpack@5.90.1))
'@nestjs/schematics':
specifier: ^10.1.1
version: 10.1.1(chokidar@3.6.0)(typescript@5.4.5)
'@nestjs/testing':
specifier: ^10.3.8
version: 10.3.8(@nestjs/common@10.3.8(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1))(@nestjs/core@10.3.8)(@nestjs/platform-express@10.3.8)
version: 10.3.8(@nestjs/common@10.3.8(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1))(@nestjs/core@10.3.8(@nestjs/common@10.3.8(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1))(@nestjs/platform-express@10.3.8)(@nestjs/websockets@10.3.8)(encoding@0.1.13)(reflect-metadata@0.2.1)(rxjs@7.8.1))(@nestjs/platform-express@10.3.8(@nestjs/common@10.3.8(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1))(@nestjs/core@10.3.8))
'@nestjsplus/dyn-schematics':
specifier: ^1.0.12
version: 1.0.12
@ -958,7 +961,7 @@ importers:
version: 4.4.1
copy-webpack-plugin:
specifier: ^11.0.0
version: 11.0.0(webpack@5.90.1)
version: 11.0.0(webpack@5.90.1(webpack-cli@5.1.4))
cross-env:
specifier: ^7.0.3
version: 7.0.3
@ -1000,10 +1003,10 @@ importers:
version: 6.3.4
ts-jest:
specifier: 29.1.2
version: 29.1.2(@babel/core@7.24.3)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.24.3))(jest@29.7.0(@types/node@20.11.30)(ts-node@10.9.2(@swc/wasm@1.5.25)(@types/node@20.11.30)(typescript@5.4.5)))(typescript@5.4.5)
version: 29.1.2(@babel/core@7.24.3)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.24.3))(jest@29.7.0)(typescript@5.4.5)
ts-loader:
specifier: ^9.5.1
version: 9.5.1(typescript@5.4.5)(webpack@5.90.1)
version: 9.5.1(typescript@5.4.5)(webpack@5.90.1(webpack-cli@5.1.4))
ts-node:
specifier: ^10.9.2
version: 10.9.2(@swc/wasm@1.5.25)(@types/node@20.11.30)(typescript@5.4.5)
@ -1070,7 +1073,7 @@ importers:
version: 5.0.7
ts-jest:
specifier: ^29.1.2
version: 29.1.2(@babel/core@7.24.3)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.24.3))(jest@29.7.0(@types/node@20.11.30)(ts-node@10.9.2(@swc/wasm@1.5.25)(@types/node@20.11.30)(typescript@5.4.5)))(typescript@5.4.5)
version: 29.1.2(@babel/core@7.24.3)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.24.3))(jest@29.7.0)(typescript@5.4.5)
tsc-alias:
specifier: ^1.8.10
version: 1.8.10
@ -17898,21 +17901,21 @@ snapshots:
outvariant: 1.4.2
strict-event-emitter: 0.5.1
'@nestjs/bull-shared@10.0.1(@nestjs/common@10.3.8(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1))(@nestjs/core@10.3.8)':
'@nestjs/bull-shared@10.0.1(@nestjs/common@10.3.8(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1))(@nestjs/core@10.3.8(@nestjs/common@10.3.8(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1))(@nestjs/platform-express@10.3.8)(@nestjs/websockets@10.3.8)(encoding@0.1.13)(reflect-metadata@0.2.1)(rxjs@7.8.1))':
dependencies:
'@nestjs/common': 10.3.8(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1)
'@nestjs/core': 10.3.8(@nestjs/common@10.3.8(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1))(@nestjs/platform-express@10.3.8)(@nestjs/websockets@10.3.8)(encoding@0.1.13)(reflect-metadata@0.2.1)(rxjs@7.8.1)
tslib: 2.6.0
'@nestjs/bull@10.0.1(@nestjs/common@10.3.8(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1))(@nestjs/core@10.3.8)(bull@4.12.5)':
'@nestjs/bull@10.0.1(@nestjs/common@10.3.8(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1))(@nestjs/core@10.3.8(@nestjs/common@10.3.8(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1))(@nestjs/platform-express@10.3.8)(@nestjs/websockets@10.3.8)(encoding@0.1.13)(reflect-metadata@0.2.1)(rxjs@7.8.1))(bull@4.12.5)':
dependencies:
'@nestjs/bull-shared': 10.0.1(@nestjs/common@10.3.8(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1))(@nestjs/core@10.3.8)
'@nestjs/bull-shared': 10.0.1(@nestjs/common@10.3.8(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1))(@nestjs/core@10.3.8(@nestjs/common@10.3.8(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1))(@nestjs/platform-express@10.3.8)(@nestjs/websockets@10.3.8)(encoding@0.1.13)(reflect-metadata@0.2.1)(rxjs@7.8.1))
'@nestjs/common': 10.3.8(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1)
'@nestjs/core': 10.3.8(@nestjs/common@10.3.8(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1))(@nestjs/platform-express@10.3.8)(@nestjs/websockets@10.3.8)(encoding@0.1.13)(reflect-metadata@0.2.1)(rxjs@7.8.1)
bull: 4.12.5
tslib: 2.6.0
'@nestjs/cli@10.3.2(webpack-cli@5.1.4)':
'@nestjs/cli@10.3.2(webpack-cli@5.1.4(webpack@5.90.1))':
dependencies:
'@angular-devkit/core': 17.1.2(chokidar@3.6.0)
'@angular-devkit/schematics': 17.1.2(chokidar@3.6.0)
@ -17922,7 +17925,7 @@ snapshots:
chokidar: 3.6.0
cli-table3: 0.6.3
commander: 4.1.1
fork-ts-checker-webpack-plugin: 9.0.2(typescript@5.4.5)(webpack@5.90.1)
fork-ts-checker-webpack-plugin: 9.0.2(typescript@5.4.5)(webpack@5.90.1(webpack-cli@5.1.4))
glob: 10.3.10
inquirer: 8.2.6
node-emoji: 1.11.0
@ -17977,13 +17980,13 @@ snapshots:
transitivePeerDependencies:
- encoding
'@nestjs/event-emitter@2.0.4(@nestjs/common@10.3.8(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1))(@nestjs/core@10.3.8)':
'@nestjs/event-emitter@2.0.4(@nestjs/common@10.3.8(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1))(@nestjs/core@10.3.8(@nestjs/common@10.3.8(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1))(@nestjs/platform-express@10.3.8)(@nestjs/websockets@10.3.8)(encoding@0.1.13)(reflect-metadata@0.2.1)(rxjs@7.8.1))':
dependencies:
'@nestjs/common': 10.3.8(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1)
'@nestjs/core': 10.3.8(@nestjs/common@10.3.8(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1))(@nestjs/platform-express@10.3.8)(@nestjs/websockets@10.3.8)(encoding@0.1.13)(reflect-metadata@0.2.1)(rxjs@7.8.1)
eventemitter2: 6.4.9
'@nestjs/graphql@12.0.11(@nestjs/common@10.3.8(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1))(@nestjs/core@10.3.8)(class-validator@0.14.1)(graphql@16.9.0)(reflect-metadata@0.2.1)':
'@nestjs/graphql@12.0.11(@nestjs/common@10.3.8(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1))(@nestjs/core@10.3.8(@nestjs/common@10.3.8(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1))(@nestjs/platform-express@10.3.8)(@nestjs/websockets@10.3.8)(encoding@0.1.13)(reflect-metadata@0.2.1)(rxjs@7.8.1))(class-validator@0.14.1)(graphql@16.9.0)(reflect-metadata@0.2.1)':
dependencies:
'@graphql-tools/merge': 9.0.0(graphql@16.9.0)
'@graphql-tools/schema': 10.0.0(graphql@16.9.0)
@ -18058,7 +18061,7 @@ snapshots:
transitivePeerDependencies:
- chokidar
'@nestjs/testing@10.3.8(@nestjs/common@10.3.8(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1))(@nestjs/core@10.3.8)(@nestjs/platform-express@10.3.8)':
'@nestjs/testing@10.3.8(@nestjs/common@10.3.8(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1))(@nestjs/core@10.3.8(@nestjs/common@10.3.8(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1))(@nestjs/platform-express@10.3.8)(@nestjs/websockets@10.3.8)(encoding@0.1.13)(reflect-metadata@0.2.1)(rxjs@7.8.1))(@nestjs/platform-express@10.3.8(@nestjs/common@10.3.8(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1))(@nestjs/core@10.3.8))':
dependencies:
'@nestjs/common': 10.3.8(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1)
'@nestjs/core': 10.3.8(@nestjs/common@10.3.8(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1))(@nestjs/platform-express@10.3.8)(@nestjs/websockets@10.3.8)(encoding@0.1.13)(reflect-metadata@0.2.1)(rxjs@7.8.1)
@ -18066,7 +18069,7 @@ snapshots:
optionalDependencies:
'@nestjs/platform-express': 10.3.8(@nestjs/common@10.3.8(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1))(@nestjs/core@10.3.8)
'@nestjs/throttler@5.1.2(@nestjs/common@10.3.8(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1))(@nestjs/core@10.3.8)(reflect-metadata@0.2.1)':
'@nestjs/throttler@5.1.2(@nestjs/common@10.3.8(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1))(@nestjs/core@10.3.8(@nestjs/common@10.3.8(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1))(@nestjs/platform-express@10.3.8)(@nestjs/websockets@10.3.8)(encoding@0.1.13)(reflect-metadata@0.2.1)(rxjs@7.8.1))(reflect-metadata@0.2.1)':
dependencies:
'@nestjs/common': 10.3.8(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1)
'@nestjs/core': 10.3.8(@nestjs/common@10.3.8(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1))(@nestjs/platform-express@10.3.8)(@nestjs/websockets@10.3.8)(encoding@0.1.13)(reflect-metadata@0.2.1)(rxjs@7.8.1)
@ -18242,7 +18245,7 @@ snapshots:
- '@swc/core'
- debug
'@ntegral/nestjs-sentry@4.0.1(@nestjs/common@10.3.8(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1))(@nestjs/core@10.3.8)(@sentry/hub@7.113.0)(@sentry/node@6.19.7)(class-validator@0.14.1)(graphql@16.9.0)(reflect-metadata@0.2.1)(rimraf@5.0.7)(rxjs@7.8.1)':
'@ntegral/nestjs-sentry@4.0.1(@nestjs/common@10.3.8(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1))(@nestjs/core@10.3.8(@nestjs/common@10.3.8(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1))(@nestjs/platform-express@10.3.8)(@nestjs/websockets@10.3.8)(encoding@0.1.13)(reflect-metadata@0.2.1)(rxjs@7.8.1))(@sentry/hub@7.113.0)(@sentry/node@6.19.7)(class-validator@0.14.1)(graphql@16.9.0)(reflect-metadata@0.2.1)(rimraf@5.0.7)(rxjs@7.8.1)':
dependencies:
'@nestjs/common': 10.3.8(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1)
'@nestjs/core': 10.3.8(@nestjs/common@10.3.8(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1))(@nestjs/platform-express@10.3.8)(@nestjs/websockets@10.3.8)(encoding@0.1.13)(reflect-metadata@0.2.1)(rxjs@7.8.1)
@ -18252,7 +18255,7 @@ snapshots:
rimraf: 5.0.7
rxjs: 7.8.1
optionalDependencies:
'@nestjs/graphql': 12.0.11(@nestjs/common@10.3.8(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1))(@nestjs/core@10.3.8)(class-validator@0.14.1)(graphql@16.9.0)(reflect-metadata@0.2.1)
'@nestjs/graphql': 12.0.11(@nestjs/common@10.3.8(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1))(@nestjs/core@10.3.8(@nestjs/common@10.3.8(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1))(@nestjs/platform-express@10.3.8)(@nestjs/websockets@10.3.8)(encoding@0.1.13)(reflect-metadata@0.2.1)(rxjs@7.8.1))(class-validator@0.14.1)(graphql@16.9.0)(reflect-metadata@0.2.1)
transitivePeerDependencies:
- '@apollo/subgraph'
- bufferutil
@ -22046,17 +22049,17 @@ snapshots:
'@webassemblyjs/ast': 1.12.1
'@xtuc/long': 4.2.2
'@webpack-cli/configtest@2.1.1(webpack-cli@5.1.4)(webpack@5.90.1)':
'@webpack-cli/configtest@2.1.1(webpack-cli@5.1.4(webpack@5.90.1))(webpack@5.90.1(webpack-cli@5.1.4))':
dependencies:
webpack: 5.90.1(webpack-cli@5.1.4)
webpack-cli: 5.1.4(webpack@5.90.1)
'@webpack-cli/info@2.0.2(webpack-cli@5.1.4)(webpack@5.90.1)':
'@webpack-cli/info@2.0.2(webpack-cli@5.1.4(webpack@5.90.1))(webpack@5.90.1(webpack-cli@5.1.4))':
dependencies:
webpack: 5.90.1(webpack-cli@5.1.4)
webpack-cli: 5.1.4(webpack@5.90.1)
'@webpack-cli/serve@2.0.5(webpack-cli@5.1.4)(webpack@5.90.1)':
'@webpack-cli/serve@2.0.5(webpack-cli@5.1.4(webpack@5.90.1))(webpack@5.90.1(webpack-cli@5.1.4))':
dependencies:
webpack: 5.90.1(webpack-cli@5.1.4)
webpack-cli: 5.1.4(webpack@5.90.1)
@ -23461,7 +23464,7 @@ snapshots:
cookiejar@2.1.4: {}
copy-webpack-plugin@11.0.0(webpack@5.90.1):
copy-webpack-plugin@11.0.0(webpack@5.90.1(webpack-cli@5.1.4)):
dependencies:
fast-glob: 3.3.1
glob-parent: 6.0.2
@ -25443,7 +25446,7 @@ snapshots:
forever-agent@0.6.1: {}
fork-ts-checker-webpack-plugin@9.0.2(typescript@5.4.5)(webpack@5.90.1):
fork-ts-checker-webpack-plugin@9.0.2(typescript@5.4.5)(webpack@5.90.1(webpack-cli@5.1.4)):
dependencies:
'@babel/code-frame': 7.24.2
chalk: 4.1.2
@ -28613,11 +28616,11 @@ snapshots:
nested-error-stacks@2.1.1: {}
nestjs-throttler-storage-redis@0.4.4(@nestjs/common@10.3.8(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1))(@nestjs/core@10.3.8)(@nestjs/throttler@5.1.2(@nestjs/common@10.3.8(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1))(@nestjs/core@10.3.8)(reflect-metadata@0.2.1))(ioredis@5.4.1)(reflect-metadata@0.2.1):
nestjs-throttler-storage-redis@0.4.4(@nestjs/common@10.3.8(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1))(@nestjs/core@10.3.8(@nestjs/common@10.3.8(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1))(@nestjs/platform-express@10.3.8)(@nestjs/websockets@10.3.8)(encoding@0.1.13)(reflect-metadata@0.2.1)(rxjs@7.8.1))(@nestjs/throttler@5.1.2(@nestjs/common@10.3.8(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1))(@nestjs/core@10.3.8(@nestjs/common@10.3.8(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1))(@nestjs/platform-express@10.3.8)(@nestjs/websockets@10.3.8)(encoding@0.1.13)(reflect-metadata@0.2.1)(rxjs@7.8.1))(reflect-metadata@0.2.1))(ioredis@5.4.1)(reflect-metadata@0.2.1):
dependencies:
'@nestjs/common': 10.3.8(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1)
'@nestjs/core': 10.3.8(@nestjs/common@10.3.8(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1))(@nestjs/platform-express@10.3.8)(@nestjs/websockets@10.3.8)(encoding@0.1.13)(reflect-metadata@0.2.1)(rxjs@7.8.1)
'@nestjs/throttler': 5.1.2(@nestjs/common@10.3.8(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1))(@nestjs/core@10.3.8)(reflect-metadata@0.2.1)
'@nestjs/throttler': 5.1.2(@nestjs/common@10.3.8(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1))(@nestjs/core@10.3.8(@nestjs/common@10.3.8(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1))(@nestjs/platform-express@10.3.8)(@nestjs/websockets@10.3.8)(encoding@0.1.13)(reflect-metadata@0.2.1)(rxjs@7.8.1))(reflect-metadata@0.2.1)
ioredis: 5.4.1
reflect-metadata: 0.2.1
@ -31828,7 +31831,7 @@ snapshots:
optionalDependencies:
esbuild: 0.20.2
terser-webpack-plugin@5.3.10(webpack@5.90.1):
terser-webpack-plugin@5.3.10(webpack@5.90.1(webpack-cli@5.1.4)):
dependencies:
'@jridgewell/trace-mapping': 0.3.25
jest-worker: 27.5.1
@ -31956,7 +31959,7 @@ snapshots:
ts-custom-error@3.3.1: {}
ts-jest@29.1.2(@babel/core@7.24.3)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.24.3))(jest@29.7.0(@types/node@20.11.30)(ts-node@10.9.2(@swc/wasm@1.5.25)(@types/node@20.11.30)(typescript@5.4.5)))(typescript@5.4.5):
ts-jest@29.1.2(@babel/core@7.24.3)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.24.3))(jest@29.7.0)(typescript@5.4.5):
dependencies:
bs-logger: 0.2.6
fast-json-stable-stringify: 2.1.0
@ -31973,7 +31976,7 @@ snapshots:
'@jest/types': 29.6.3
babel-jest: 29.7.0(@babel/core@7.24.3)
ts-loader@9.5.1(typescript@5.4.5)(webpack@5.90.1):
ts-loader@9.5.1(typescript@5.4.5)(webpack@5.90.1(webpack-cli@5.1.4)):
dependencies:
chalk: 4.1.2
enhanced-resolve: 5.15.0
@ -33141,9 +33144,9 @@ snapshots:
webpack-cli@5.1.4(webpack@5.90.1):
dependencies:
'@discoveryjs/json-ext': 0.5.7
'@webpack-cli/configtest': 2.1.1(webpack-cli@5.1.4)(webpack@5.90.1)
'@webpack-cli/info': 2.0.2(webpack-cli@5.1.4)(webpack@5.90.1)
'@webpack-cli/serve': 2.0.5(webpack-cli@5.1.4)(webpack@5.90.1)
'@webpack-cli/configtest': 2.1.1(webpack-cli@5.1.4(webpack@5.90.1))(webpack@5.90.1(webpack-cli@5.1.4))
'@webpack-cli/info': 2.0.2(webpack-cli@5.1.4(webpack@5.90.1))(webpack@5.90.1(webpack-cli@5.1.4))
'@webpack-cli/serve': 2.0.5(webpack-cli@5.1.4(webpack@5.90.1))(webpack@5.90.1(webpack-cli@5.1.4))
colorette: 2.0.20
commander: 10.0.1
cross-spawn: 7.0.3
@ -33194,7 +33197,7 @@ snapshots:
neo-async: 2.6.2
schema-utils: 3.3.0
tapable: 2.2.1
terser-webpack-plugin: 5.3.10(webpack@5.90.1)
terser-webpack-plugin: 5.3.10(webpack@5.90.1(webpack-cli@5.1.4))
watchpack: 2.4.0
webpack-sources: 3.2.3
optionalDependencies:

Loading…
Cancel
Save