Browse Source

Merge pull request #6599 from nocodb/nc-feat/filter-agent

feat: filter agent
pull/6615/head
mertmit 1 year ago committed by GitHub
parent
commit
44bfa0ee38
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 3
      packages/noco-docs/docs/020.getting-started/020.environment-variables.md
  2. 1
      packages/nocodb/package.json
  3. 3
      packages/nocodb/src/app.module.ts
  4. 222
      packages/nocodb/src/controllers/test/TestResetService/index.ts
  5. 102
      packages/nocodb/src/controllers/test/TestResetService/resetMetaSakilaSqliteProject.ts
  6. 200
      packages/nocodb/src/controllers/test/TestResetService/resetMysqlSakilaProject.ts
  7. 191
      packages/nocodb/src/controllers/test/TestResetService/resetPgSakilaProject.ts
  8. 21
      packages/nocodb/src/controllers/test/test.controller.spec.ts
  9. 20
      packages/nocodb/src/controllers/test/test.controller.ts
  10. 20
      packages/nocodb/src/helpers/webhookHelpers.ts
  11. 9
      packages/nocodb/src/modules/test/test.module.ts
  12. 6
      packages/nocodb/src/plugins/backblaze/Backblaze.ts
  13. 7
      packages/nocodb/src/plugins/discord/Discord.ts
  14. 6
      packages/nocodb/src/plugins/gcs/Gcs.ts
  15. 6
      packages/nocodb/src/plugins/linode/LinodeObjectStorage.ts
  16. 7
      packages/nocodb/src/plugins/mattermost/Mattermost.ts
  17. 6
      packages/nocodb/src/plugins/mino/Minio.ts
  18. 6
      packages/nocodb/src/plugins/ovhCloud/OvhCloud.ts
  19. 6
      packages/nocodb/src/plugins/s3/S3.ts
  20. 6
      packages/nocodb/src/plugins/scaleway/ScalewayObjectStorage.ts
  21. 7
      packages/nocodb/src/plugins/slack/Slack.ts
  22. 6
      packages/nocodb/src/plugins/spaces/Spaces.ts
  23. 3
      packages/nocodb/src/plugins/storage/Local.ts
  24. 7
      packages/nocodb/src/plugins/teams/Teams.ts
  25. 6
      packages/nocodb/src/plugins/upcloud/UpoCloud.ts
  26. 6
      packages/nocodb/src/plugins/vultr/Vultr.ts
  27. 1
      packages/nocodb/src/run/testDocker.ts
  28. 7
      packages/nocodb/src/services/utils.service.ts
  29. 190
      pnpm-lock.yaml

3
packages/noco-docs/docs/020.getting-started/020.environment-variables.md

@ -62,5 +62,6 @@ For production usecases, it is **recommended** to configure
| NC_MINIMAL_DBS | 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) | |
| NC_DISABLE_AUDIT | Disable Audit Log | `false` |
| NC_AUTOMATION_LOG_LEVEL | Possible Values: `OFF`, `ERROR`, `ALL`. See [Webhooks](/developer-resources/webhooks#call-log) for details. | `OFF` |
| NC_SECURE_ATTACHMENTS | Allow accessing attachments only through presigned urls. To enable secure set value as `true` any other value treated as false. (⚠ this will make existing links inaccessible ⚠) | `false` |
| NC_SECURE_ATTACHMENTS | Allow accessing attachments only through presigned urls. To enable set value as `true` any other value treated as false. (⚠ this will make existing links inaccessible ⚠) | `false` |
| NC_ATTACHMENT_EXPIRE_SECONDS | How many seconds before expiring presigned attachment urls. (Attachments will expire in at least set seconds and at most 10mins after set time) | 7200 (2 hours) |
| NC_ALLOW_LOCAL_HOOKS | To enable set value as `true` any other value treated as false. (⚠ this will allow webhooks to call local links which can raise security issues ⚠) | `false` |

1
packages/nocodb/package.json

@ -154,6 +154,7 @@
"pg": "^8.10.0",
"redlock": "^5.0.0-beta.2",
"reflect-metadata": "^0.1.13",
"request-filtering-agent": "^1.1.2",
"request-ip": "^2.1.3",
"rmdir": "^1.2.0",
"rxjs": "^7.2.0",

3
packages/nocodb/src/app.module.ts

@ -10,7 +10,6 @@ import { GuiMiddleware } from '~/middlewares/gui/gui.middleware';
import { DatasModule } from '~/modules/datas/datas.module';
import { EventEmitterModule } from '~/modules/event-emitter/event-emitter.module';
import { AuthService } from '~/services/auth.service';
import { TestModule } from '~/modules/test/test.module';
import { GlobalModule } from '~/modules/global/global.module';
import { LocalStrategy } from '~/strategies/local.strategy';
import { AuthTokenStrategy } from '~/strategies/authtoken.strategy/authtoken.strategy';
@ -31,7 +30,6 @@ export const ceModuleConfig = {
GlobalModule,
UsersModule,
AuthModule,
...(process.env['PLAYWRIGHT_TEST'] === 'true' ? [TestModule] : []),
MetasModule,
DatasModule,
EventEmitterModule,
@ -41,7 +39,6 @@ export const ceModuleConfig = {
load: [() => appConfig],
isGlobal: true,
}),
TestModule,
],
providers: [
AuthService,

222
packages/nocodb/src/controllers/test/TestResetService/index.ts

@ -1,222 +0,0 @@
import axios from 'axios';
import resetPgSakilaProject from './resetPgSakilaProject';
import resetMysqlSakilaProject from './resetMysqlSakilaProject';
import resetMetaSakilaSqliteProject from './resetMetaSakilaSqliteProject';
import type ApiToken from '~/models/ApiToken';
import Base from '~/models/Base';
// import NcConnectionMgrv2 from '~/utils/common/NcConnectionMgrv2';
import Noco from '~/Noco';
import User from '~/models/User';
import NocoCache from '~/cache/NocoCache';
import { CacheDelDirection, CacheScope, MetaTable } from '~/utils/globals';
import BaseUser from '~/models/BaseUser';
const workerStatus = {};
const loginRootUser = async () => {
const response = await axios.post(
'http://localhost:8080/api/v1/auth/user/signin',
{ email: 'user@nocodb.com', password: 'Password123.' },
);
return response.data.token;
};
const baseTitleByType = {
sqlite: 'sampleREST',
mysql: 'externalREST',
pg: 'pgExtREST',
};
export class TestResetService {
private readonly parallelId;
// todo: Hack to resolve issue with pg resetting
private readonly workerId;
private readonly dbType;
private readonly isEmptyProject: boolean;
constructor({
parallelId,
dbType,
isEmptyProject,
workerId,
}: {
parallelId: string;
dbType: string;
isEmptyProject: boolean;
workerId: string;
}) {
this.parallelId = parallelId;
this.dbType = dbType;
this.isEmptyProject = isEmptyProject;
this.workerId = workerId;
}
async process() {
try {
// console.log(
// `earlier workerStatus: parrelledId: ${this.parallelId}:`,
// workerStatus[this.parallelId]
// );
// wait till previous worker is done
while (workerStatus[this.parallelId] === 'processing') {
console.log(
`waiting for previous worker to finish parrelelId:${this.parallelId}`,
);
await new Promise((resolve) => setTimeout(resolve, 1000));
}
workerStatus[this.parallelId] = 'processing';
const token = await loginRootUser();
const { base } = await this.resetProject({
token,
dbType: this.dbType,
parallelId: this.parallelId,
workerId: this.workerId,
});
try {
await removeAllProjectCreatedByTheTest(this.parallelId);
await removeAllPrefixedUsersExceptSuper(this.parallelId);
await removeAllTokensCreatedByTheTest(this.parallelId);
} catch (e) {
console.log(`Error in cleaning up base: ${this.parallelId}`, e);
}
workerStatus[this.parallelId] = 'completed';
return { token, base };
} catch (e) {
console.error('TestResetService:process', e);
workerStatus[this.parallelId] = 'errored';
return { error: e };
}
}
async resetProject({
token,
dbType,
parallelId,
workerId,
}: {
token: string;
dbType: string;
parallelId: string;
workerId: string;
}) {
const title = `${baseTitleByType[dbType]}${parallelId}`;
const base: Base | undefined = await Base.getByTitle(title);
if (base) {
await this.removeProjectUsersFromCache(base);
// Kludge: Soft reset to support PG as root DB in PW tests
// Revisit to fix this later
// const sources = await base.getBases();
//
// for (const base of sources) {
// await NcConnectionMgrv2.deleteAwait(base);
// await base.delete(Noco.ncMeta, { force: true });
// }
//
// await Base.delete(base.id);
await Base.softDelete(base.id);
}
if (dbType == 'sqlite') {
await resetMetaSakilaSqliteProject({
token,
title,
parallelId,
isEmptyProject: this.isEmptyProject,
});
} else if (dbType == 'mysql') {
await resetMysqlSakilaProject({
token,
title,
parallelId,
oldProject: base,
isEmptyProject: this.isEmptyProject,
});
} else if (dbType == 'pg') {
await resetPgSakilaProject({
token,
title,
parallelId: workerId,
oldProject: base,
isEmptyProject: this.isEmptyProject,
});
}
return {
base: await Base.getByTitle(title),
};
}
// todo: Remove this once user deletion improvement PR is merged
removeProjectUsersFromCache = async (base: Base) => {
const baseUsers = await BaseUser.getUsersList({
base_id: base.id,
limit: 1000,
offset: 0,
});
for (const baseUser of baseUsers) {
try {
const user: User = (await User.get(baseUser.id)) as any;
await NocoCache.del(`${CacheScope.PROJECT_USER}:${base.id}:${user.id}`);
} catch (e) {
console.error('removeProjectUsersFromCache', e);
}
}
};
}
const removeAllProjectCreatedByTheTest = async (parallelId: string) => {
const bases = await Base.list({});
for (const base of bases) {
if (base.title.startsWith(`nc_test_${parallelId}_`)) {
await Base.delete(base.id);
}
}
};
const removeAllPrefixedUsersExceptSuper = async (parallelId: string) => {
const users = (await User.list()).filter(
(user) => !user.roles.includes('super'),
);
for (const user of users) {
if (user.email.startsWith(`nc_test_${parallelId}_`)) {
await NocoCache.del(`${CacheScope.USER}:${user.email}`);
await User.delete(user.id);
}
}
};
const removeAllTokensCreatedByTheTest = async (parallelId: string) => {
const tokens: ApiToken[] = await Noco.ncMeta.metaList(
null,
null,
MetaTable.API_TOKENS,
);
for (const token of tokens) {
if (token.description.startsWith(`nc_test_${parallelId}`)) {
await NocoCache.deepDel(
CacheScope.API_TOKEN,
`${CacheScope.API_TOKEN}:${token.token}`,
CacheDelDirection.CHILD_TO_PARENT,
);
await Noco.ncMeta.metaDelete(null, null, MetaTable.API_TOKENS, {
token: token.token,
});
}
}
};

102
packages/nocodb/src/controllers/test/TestResetService/resetMetaSakilaSqliteProject.ts

@ -1,102 +0,0 @@
import { promises as fs } from 'fs';
import path from 'path';
import axios from 'axios';
import type { AxiosResponse } from 'axios';
const sqliteFilePath = (parallelId: string) => {
const rootDir = process.cwd();
return `${rootDir}/test_sakila_${parallelId}.db`;
};
const sakilaProjectConfig = (title: string, parallelId: string) => ({
title,
sources: [
{
type: 'sqlite3',
config: {
client: 'sqlite3',
connection: {
client: 'sqlite3',
connection: {
filename: sqliteFilePath(parallelId),
database: 'test_sakila',
multipleStatements: true,
},
},
},
inflection_column: 'camelize',
inflection_table: 'camelize',
},
],
external: true,
});
const resetMetaSakilaSqliteProject = async ({
parallelId,
token,
title,
isEmptyProject,
}: {
parallelId: string;
token: string;
title: string;
isEmptyProject: boolean;
}) => {
await deleteSqliteFileIfExists(parallelId);
if (!isEmptyProject) await seedSakilaSqliteFile(parallelId);
await createProject(token, title, parallelId, isEmptyProject);
};
const createProject = async (
token: string,
title: string,
parallelId: string,
isEmptyProject: boolean,
) => {
let response: AxiosResponse;
if (isEmptyProject) {
response = await axios.post(
'http://localhost:8080/api/v1/meta/bases/',
{ title },
{
headers: {
'xc-auth': token,
},
},
);
} else {
response = await axios.post(
'http://localhost:8080/api/v1/meta/bases/',
sakilaProjectConfig(title, parallelId),
{
headers: {
'xc-auth': token,
},
},
);
}
if (response.status !== 200) {
console.error('Error creating base', response.data);
}
return response.data;
};
const deleteSqliteFileIfExists = async (parallelId: string) => {
if (await fs.stat(sqliteFilePath(parallelId)).catch(() => null)) {
await fs.unlink(sqliteFilePath(parallelId));
}
};
const seedSakilaSqliteFile = async (parallelId: string) => {
const testsDir = path.join(process.cwd(), 'tests');
await fs.copyFile(
`${testsDir}/sqlite-sakila-db/sakila.db`,
sqliteFilePath(parallelId),
);
};
export default resetMetaSakilaSqliteProject;

200
packages/nocodb/src/controllers/test/TestResetService/resetMysqlSakilaProject.ts

@ -1,200 +0,0 @@
import { promises as fs } from 'fs';
import path from 'path';
import axios from 'axios';
import { knex } from 'knex';
import type { Knex } from 'knex';
import type Base from '~/models/Base';
import Audit from '~/models/Audit';
const config = {
client: 'mysql2',
connection: {
host: 'localhost',
port: 3306,
user: 'root',
password: 'password',
database: 'sakila',
multipleStatements: true,
dateStrings: true,
},
};
const extMysqlProject = (title, parallelId) => ({
title,
sources: [
{
type: 'mysql2',
config: {
client: 'mysql2',
connection: {
host: 'localhost',
port: '3306',
user: 'root',
password: 'password',
database: `test_sakila_${parallelId}`,
},
},
inflection_column: 'camelize',
inflection_table: 'camelize',
},
],
external: true,
});
const isSakilaMysqlToBeReset = async (
knex: Knex,
parallelId: string,
base?: Base,
) => {
const tablesInDbInfo: Array<any> = await knex.raw(
`SELECT table_name FROM information_schema.tables WHERE table_schema = 'test_sakila_${parallelId}'`,
);
const nonMetaTablesInDb = tablesInDbInfo[0]
.map((t) => t['TABLE_NAME'])
.filter((table) => table !== 'nc_evolutions');
const mysqlSakilaTablesAndViews = [
...mysqlSakilaTables,
...mysqlSakilaSqlViews,
];
if (
nonMetaTablesInDb.length === 0 ||
// If there are sakila tables
!nonMetaTablesInDb.includes(`actor`) ||
// If there are no pg sakila tables in tables in db
!(
nonMetaTablesInDb.length === mysqlSakilaTablesAndViews.length &&
nonMetaTablesInDb.every((t) => mysqlSakilaTablesAndViews.includes(t))
)
) {
return true;
}
if (!base) return true;
const audits = await Audit.baseAuditList(base.id, {});
// todo: Will be fixed in the data resetting revamp
console.log(`audits:resetMysqlSakilaProject:${parallelId}`, audits?.length);
return true;
};
const resetSakilaMysql = async (
knex: Knex,
parallelId: string,
isEmptyProject: boolean,
) => {
const testsDir = path.join(process.cwd(), '/tests');
try {
await knex.raw(`DROP DATABASE test_sakila_${parallelId}`);
} catch (e) {
console.log('Error dropping db', e);
}
await knex.raw(`CREATE DATABASE test_sakila_${parallelId}`);
if (isEmptyProject) return;
const trx = await knex.transaction();
try {
const schemaFile = await fs.readFile(
`${testsDir}/mysql-sakila-db/03-test-sakila-schema.sql`,
);
const dataFile = await fs.readFile(
`${testsDir}/mysql-sakila-db/04-test-sakila-data.sql`,
);
await trx.raw(
schemaFile
.toString()
.replace(/test_sakila/g, `test_sakila_${parallelId}`),
);
await trx.raw(
dataFile.toString().replace(/test_sakila/g, `test_sakila_${parallelId}`),
);
await trx.commit();
} catch (e) {
console.log('Error resetting mysql db', e);
await trx.rollback(e);
}
};
const resetMysqlSakilaProject = async ({
token,
title,
parallelId,
oldProject,
isEmptyProject,
}: {
token: string;
title: string;
parallelId: string;
oldProject?: Base | undefined;
isEmptyProject: boolean;
}) => {
const nc_knex = knex(config);
try {
await nc_knex.raw(`USE test_sakila_${parallelId}`);
} catch (e) {
await nc_knex.raw(`CREATE DATABASE test_sakila_${parallelId}`);
await nc_knex.raw(`USE test_sakila_${parallelId}`);
}
if (
isEmptyProject ||
(await isSakilaMysqlToBeReset(nc_knex, parallelId, oldProject))
) {
await resetSakilaMysql(nc_knex, parallelId, isEmptyProject);
}
const response = await axios.post(
'http://localhost:8080/api/v1/meta/bases/',
extMysqlProject(title, parallelId),
{
headers: {
'xc-auth': token,
},
},
);
if (response.status !== 200) {
console.error('Error creating base', response.data);
}
await nc_knex.destroy();
};
const mysqlSakilaTables = [
'actor',
'address',
'category',
'city',
'country',
'customer',
'film',
'film_text',
'film_actor',
'film_category',
'inventory',
'language',
'payment',
'rental',
'staff',
'store',
];
const mysqlSakilaSqlViews = [
'actor_info',
'customer_list',
'film_list',
'nicer_but_slower_film_list',
'sales_by_film_category',
'sales_by_store',
'staff_list',
];
export default resetMysqlSakilaProject;

191
packages/nocodb/src/controllers/test/TestResetService/resetPgSakilaProject.ts

@ -1,191 +0,0 @@
import { promises as fs } from 'fs';
import path from 'path';
import axios from 'axios';
import { knex } from 'knex';
import type Base from '~/models/Base';
import Audit from '~/models/Audit';
const config = {
client: 'pg',
connection: {
host: 'localhost',
port: 5432,
user: 'postgres',
password: 'password',
database: 'postgres',
multipleStatements: true,
},
searchPath: ['public', 'information_schema'],
pool: { min: 0, max: 5 },
};
const extMysqlProject = (title, parallelId) => ({
title,
sources: [
{
type: 'pg',
config: {
client: 'pg',
connection: {
host: 'localhost',
port: '5432',
user: 'postgres',
password: 'password',
database: `sakila_${parallelId}`,
},
searchPath: ['public'],
},
inflection_column: 'camelize',
inflection_table: 'camelize',
},
],
external: true,
});
const isSakilaPgToBeReset = async (parallelId: string, base?: Base) => {
const sakilaKnex = knex(sakilaKnexConfig(parallelId));
const tablesInDb: Array<string> = (
await sakilaKnex.raw(
`SELECT * FROM information_schema.tables WHERE table_schema = 'public'`,
)
).rows.map((row) => row.table_name);
await sakilaKnex.destroy();
const nonMetaTablesInDb = tablesInDb.filter(
(table) => table !== 'nc_evolutions',
);
const pgSakilaTablesAndViews = [...pgSakilaTables, ...pgSakilaSqlViews];
if (
tablesInDb.length === 0 ||
// If there are sakila tables
!tablesInDb.includes(`actor`) ||
// If there are no pg sakila tables in tables in db
!(
nonMetaTablesInDb.length === pgSakilaTablesAndViews.length &&
nonMetaTablesInDb.every((t) => pgSakilaTablesAndViews.includes(t))
)
) {
return true;
}
if (!base) return false;
const audits = await Audit.baseAuditList(base.id, {});
return audits?.length > 0;
};
const resetSakilaPg = async (parallelId: string, isEmptyProject: boolean) => {
const testsDir = path.join(process.cwd(), '/tests');
if (isEmptyProject) return;
try {
const sakilaKnex = knex(sakilaKnexConfig(parallelId));
const schemaFile = await fs.readFile(
`${testsDir}/pg-sakila-db/01-postgres-sakila-schema.sql`,
);
await sakilaKnex.raw(schemaFile.toString());
const trx = await sakilaKnex.transaction();
const dataFile = await fs.readFile(
`${testsDir}/pg-sakila-db/02-postgres-sakila-insert-data.sql`,
);
await trx.raw(dataFile.toString());
await trx.commit();
await sakilaKnex.destroy();
} catch (e) {
console.error(`Error resetting pg sakila db: Worker ${parallelId}`);
throw Error(`Error resetting pg sakila db: Worker ${parallelId}`);
}
};
const sakilaKnexConfig = (parallelId: string) => ({
...config,
connection: {
...config.connection,
database: `sakila_${parallelId}`,
},
});
const resetPgSakilaProject = async ({
token,
title,
parallelId,
oldProject,
isEmptyProject,
}: {
token: string;
title: string;
parallelId: string;
oldProject?: Base | undefined;
isEmptyProject: boolean;
}) => {
const pgknex = knex(config);
try {
await pgknex.raw(`CREATE DATABASE sakila_${parallelId}`);
} catch (e) {}
if (isEmptyProject || (await isSakilaPgToBeReset(parallelId, oldProject))) {
await pgknex.raw(`DROP DATABASE IF EXISTS sakila_${parallelId}`);
await pgknex.raw(`CREATE DATABASE sakila_${parallelId}`);
await pgknex.destroy();
await resetSakilaPg(parallelId, isEmptyProject);
}
const response = await axios.post(
'http://localhost:8080/api/v1/meta/bases/',
extMysqlProject(title, parallelId),
{
headers: {
'xc-auth': token,
},
},
);
if (response.status !== 200) {
console.error('Error creating base', response.data);
throw new Error(response.data);
}
};
const pgSakilaTables = [
'country',
'city',
'actor',
'film_actor',
'category',
'film_category',
'language',
'film',
'payment_p2007_01',
'payment_p2007_02',
'payment_p2007_03',
'payment_p2007_04',
'payment_p2007_05',
'payment_p2007_06',
'payment',
'customer',
'inventory',
'rental',
'address',
'staff',
'store',
];
const pgSakilaSqlViews = [
'actor_info',
'customer_list',
'film_list',
'nicer_but_slower_film_list',
'sales_by_film_category',
'sales_by_store',
'staff_list',
];
export default resetPgSakilaProject;

21
packages/nocodb/src/controllers/test/test.controller.spec.ts

@ -1,21 +0,0 @@
import { Test } from '@nestjs/testing';
import { TestService } from '../../modules/test/test.service';
import { TestController } from './test.controller';
import type { TestingModule } from '@nestjs/testing';
describe('TestController', () => {
let controller: TestController;
beforeEach(async () => {
const module: TestingModule = await Test.createTestingModule({
controllers: [TestController],
providers: [TestService],
}).compile();
controller = module.get<TestController>(TestController);
});
it('should be defined', () => {
expect(controller).toBeDefined();
});
});

20
packages/nocodb/src/controllers/test/test.controller.ts

@ -1,20 +0,0 @@
import { Controller, HttpCode, Post, Req } from '@nestjs/common';
import { TestResetService } from '~/controllers/test/TestResetService';
@Controller()
export class TestController {
constructor() {}
@Post('/api/v1/meta/test/reset')
@HttpCode(200)
async reset(@Req() req) {
const service = new TestResetService({
parallelId: req.body.parallelId,
dbType: req.body.dbType,
isEmptyProject: req.body.isEmptyProject,
workerId: req.body.workerId,
});
return await service.process();
}
}

20
packages/nocodb/src/helpers/webhookHelpers.ts

@ -1,5 +1,7 @@
import Handlebars from 'handlebars';
import { v4 as uuidv4 } from 'uuid';
import axios from 'axios';
import { useAgent } from 'request-filtering-agent';
import NcPluginMgrv2 from './NcPluginMgrv2';
import type { Column, FormView, Hook, Model, View } from '~/models';
import type { HookLogType } from 'nocodb-sdk';
@ -176,13 +178,13 @@ export async function handleHttpWebHook(
user,
prevData,
newData,
) {
): Promise<any> {
const req = axiosRequestMake(
apiMeta,
user,
constructWebHookData(hook, model, view, prevData, newData),
);
return require('axios')(req);
return axios(req);
}
export function axiosRequestMake(_apiMeta, _user, data) {
@ -219,6 +221,8 @@ export function axiosRequestMake(_apiMeta, _user, data) {
}
}
apiMeta.response = {};
const url = parseBody(apiMeta.path, data);
const req = {
params: apiMeta.parameters
? apiMeta.parameters.reduce((paramsObj, param) => {
@ -228,7 +232,7 @@ export function axiosRequestMake(_apiMeta, _user, data) {
return paramsObj;
}, {})
: {},
url: parseBody(apiMeta.path, data),
url: url,
method: apiMeta.method,
data: apiMeta.body,
headers: apiMeta.headers
@ -240,6 +244,16 @@ export function axiosRequestMake(_apiMeta, _user, data) {
}, {})
: {},
withCredentials: true,
...(process.env.NC_ALLOW_LOCAL_HOOKS !== 'true'
? {
httpAgent: useAgent(url, {
stopPortScanningByUrlRedirection: true,
}),
httpsAgent: useAgent(url, {
stopPortScanningByUrlRedirection: true,
}),
}
: {}),
};
return req;
}

9
packages/nocodb/src/modules/test/test.module.ts

@ -1,9 +0,0 @@
import { Module } from '@nestjs/common';
import { TestController } from '~/controllers/test/test.controller';
@Module({
controllers: [
...(process.env.NC_WORKER_CONTAINER !== 'true' ? [TestController] : []),
],
})
export class TestModule {}

6
packages/nocodb/src/plugins/backblaze/Backblaze.ts

@ -2,6 +2,7 @@ import fs from 'fs';
import { promisify } from 'util';
import AWS from 'aws-sdk';
import axios from 'axios';
import { useAgent } from 'request-filtering-agent';
import type { IStorageAdapterV2, XcFile } from 'nc-plugin';
import type { Readable } from 'stream';
import { generateTempFilePath, waitForStreamClose } from '~/utils/pluginUtils';
@ -50,7 +51,10 @@ export default class Backblaze implements IStorageAdapterV2 {
return new Promise((resolve, reject) => {
axios
.get(url)
.get(url, {
httpAgent: useAgent(url, { stopPortScanningByUrlRedirection: true }),
httpsAgent: useAgent(url, { stopPortScanningByUrlRedirection: true }),
})
.then((response) => {
uploadParams.Body = response.data;
uploadParams.Key = key;

7
packages/nocodb/src/plugins/discord/Discord.ts

@ -1,4 +1,5 @@
import axios from 'axios';
import { useAgent } from 'request-filtering-agent';
import type { IWebhookNotificationAdapter } from 'nc-plugin';
export default class Discord implements IWebhookNotificationAdapter {
@ -11,6 +12,12 @@ export default class Discord implements IWebhookNotificationAdapter {
try {
return await axios.post(webhook_url, {
content,
httpAgent: useAgent(webhook_url, {
stopPortScanningByUrlRedirection: true,
}),
httpsAgent: useAgent(webhook_url, {
stopPortScanningByUrlRedirection: true,
}),
});
} catch (e) {
console.log(e);

6
packages/nocodb/src/plugins/gcs/Gcs.ts

@ -2,6 +2,7 @@ import fs from 'fs';
import { promisify } from 'util';
import { Storage } from '@google-cloud/storage';
import axios from 'axios';
import { useAgent } from 'request-filtering-agent';
import type { IStorageAdapterV2, XcFile } from 'nc-plugin';
import type { Readable } from 'stream';
import type { StorageOptions } from '@google-cloud/storage';
@ -106,7 +107,10 @@ export default class Gcs implements IStorageAdapterV2 {
fileCreateByUrl(destPath: string, url: string): Promise<any> {
return new Promise((resolve, reject) => {
axios
.get(url)
.get(url, {
httpAgent: useAgent(url, { stopPortScanningByUrlRedirection: true }),
httpsAgent: useAgent(url, { stopPortScanningByUrlRedirection: true }),
})
.then((response) => {
this.storageClient
.bucket(this.bucketName)

6
packages/nocodb/src/plugins/linode/LinodeObjectStorage.ts

@ -2,6 +2,7 @@ import fs from 'fs';
import { promisify } from 'util';
import AWS from 'aws-sdk';
import axios from 'axios';
import { useAgent } from 'request-filtering-agent';
import type { IStorageAdapterV2, XcFile } from 'nc-plugin';
import type { Readable } from 'stream';
import { generateTempFilePath, waitForStreamClose } from '~/utils/pluginUtils';
@ -49,7 +50,10 @@ export default class LinodeObjectStorage implements IStorageAdapterV2 {
};
return new Promise((resolve, reject) => {
axios
.get(url)
.get(url, {
httpAgent: useAgent(url, { stopPortScanningByUrlRedirection: true }),
httpsAgent: useAgent(url, { stopPortScanningByUrlRedirection: true }),
})
.then((response) => {
uploadParams.Body = response.data;
uploadParams.Key = key;

7
packages/nocodb/src/plugins/mattermost/Mattermost.ts

@ -1,4 +1,5 @@
import axios from 'axios';
import { useAgent } from 'request-filtering-agent';
import type { IWebhookNotificationAdapter } from 'nc-plugin';
export default class Mattermost implements IWebhookNotificationAdapter {
@ -11,6 +12,12 @@ export default class Mattermost implements IWebhookNotificationAdapter {
try {
return await axios.post(webhook_url, {
text,
httpAgent: useAgent(webhook_url, {
stopPortScanningByUrlRedirection: true,
}),
httpsAgent: useAgent(webhook_url, {
stopPortScanningByUrlRedirection: true,
}),
});
} catch (e) {
console.log(e);

6
packages/nocodb/src/plugins/mino/Minio.ts

@ -2,6 +2,7 @@ import fs from 'fs';
import { promisify } from 'util';
import { Client as MinioClient } from 'minio';
import axios from 'axios';
import { useAgent } from 'request-filtering-agent';
import type { IStorageAdapterV2, XcFile } from 'nc-plugin';
import type { Readable } from 'stream';
import { generateTempFilePath, waitForStreamClose } from '~/utils/pluginUtils';
@ -96,7 +97,10 @@ export default class Minio implements IStorageAdapterV2 {
};
return new Promise((resolve, reject) => {
axios
.get(url)
.get(url, {
httpAgent: useAgent(url, { stopPortScanningByUrlRedirection: true }),
httpsAgent: useAgent(url, { stopPortScanningByUrlRedirection: true }),
})
.then((response) => {
uploadParams.Body = response.data;
uploadParams.Key = key;

6
packages/nocodb/src/plugins/ovhCloud/OvhCloud.ts

@ -2,6 +2,7 @@ import fs from 'fs';
import { promisify } from 'util';
import AWS from 'aws-sdk';
import axios from 'axios';
import { useAgent } from 'request-filtering-agent';
import type { IStorageAdapterV2, XcFile } from 'nc-plugin';
import type { Readable } from 'stream';
import { generateTempFilePath, waitForStreamClose } from '~/utils/pluginUtils';
@ -49,7 +50,10 @@ export default class OvhCloud implements IStorageAdapterV2 {
};
return new Promise((resolve, reject) => {
axios
.get(url)
.get(url, {
httpAgent: useAgent(url, { stopPortScanningByUrlRedirection: true }),
httpsAgent: useAgent(url, { stopPortScanningByUrlRedirection: true }),
})
.then((response) => {
uploadParams.Body = response.data;
uploadParams.Key = key;

6
packages/nocodb/src/plugins/s3/S3.ts

@ -3,6 +3,7 @@ import { promisify } from 'util';
import { GetObjectCommand, S3 as S3Client } from '@aws-sdk/client-s3';
import { getSignedUrl } from '@aws-sdk/s3-request-presigner';
import axios from 'axios';
import { useAgent } from 'request-filtering-agent';
import type { IStorageAdapterV2, XcFile } from 'nc-plugin';
import type { Readable } from 'stream';
import { generateTempFilePath, waitForStreamClose } from '~/utils/pluginUtils';
@ -56,7 +57,10 @@ export default class S3 implements IStorageAdapterV2 {
};
return new Promise((resolve, reject) => {
axios
.get(url)
.get(url, {
httpAgent: useAgent(url, { stopPortScanningByUrlRedirection: true }),
httpsAgent: useAgent(url, { stopPortScanningByUrlRedirection: true }),
})
.then((response) => {
uploadParams.Body = response.data;
uploadParams.Key = key;

6
packages/nocodb/src/plugins/scaleway/ScalewayObjectStorage.ts

@ -2,6 +2,7 @@ import fs from 'fs';
import { promisify } from 'util';
import AWS from 'aws-sdk';
import axios from 'axios';
import { useAgent } from 'request-filtering-agent';
import type { IStorageAdapterV2, XcFile } from 'nc-plugin';
import type { Readable } from 'stream';
import { generateTempFilePath, waitForStreamClose } from '~/utils/pluginUtils';
@ -99,7 +100,10 @@ export default class ScalewayObjectStorage implements IStorageAdapterV2 {
};
return new Promise((resolve, reject) => {
axios
.get(url)
.get(url, {
httpAgent: useAgent(url, { stopPortScanningByUrlRedirection: true }),
httpsAgent: useAgent(url, { stopPortScanningByUrlRedirection: true }),
})
.then((response) => {
uploadParams.Body = response.data;
uploadParams.Key = key;

7
packages/nocodb/src/plugins/slack/Slack.ts

@ -1,4 +1,5 @@
import axios from 'axios';
import { useAgent } from 'request-filtering-agent';
import type { IWebhookNotificationAdapter } from 'nc-plugin';
export default class Slack implements IWebhookNotificationAdapter {
@ -11,6 +12,12 @@ export default class Slack implements IWebhookNotificationAdapter {
try {
return await axios.post(webhook_url, {
text,
httpAgent: useAgent(webhook_url, {
stopPortScanningByUrlRedirection: true,
}),
httpsAgent: useAgent(webhook_url, {
stopPortScanningByUrlRedirection: true,
}),
});
} catch (e) {
console.log(e);

6
packages/nocodb/src/plugins/spaces/Spaces.ts

@ -2,6 +2,7 @@ import fs from 'fs';
import { promisify } from 'util';
import AWS from 'aws-sdk';
import axios from 'axios';
import { useAgent } from 'request-filtering-agent';
import type { IStorageAdapterV2, XcFile } from 'nc-plugin';
import type { Readable } from 'stream';
import { generateTempFilePath, waitForStreamClose } from '~/utils/pluginUtils';
@ -49,7 +50,10 @@ export default class Spaces implements IStorageAdapterV2 {
};
return new Promise((resolve, reject) => {
axios
.get(url)
.get(url, {
httpAgent: useAgent(url, { stopPortScanningByUrlRedirection: true }),
httpsAgent: useAgent(url, { stopPortScanningByUrlRedirection: true }),
})
.then((response) => {
uploadParams.Body = response.data;
uploadParams.Key = key;

3
packages/nocodb/src/plugins/storage/Local.ts

@ -3,6 +3,7 @@ import path from 'path';
import { promisify } from 'util';
import mkdirp from 'mkdirp';
import axios from 'axios';
import { useAgent } from 'request-filtering-agent';
import type { IStorageAdapterV2, XcFile } from 'nc-plugin';
import type { Readable } from 'stream';
import { NcError } from '~/helpers/catchError';
@ -40,6 +41,8 @@ export default class Local implements IStorageAdapterV2 {
'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/',
},
httpAgent: useAgent(url, { stopPortScanningByUrlRedirection: true }),
httpsAgent: useAgent(url, { stopPortScanningByUrlRedirection: true }),
})
.then(async (response) => {
await mkdirp(path.dirname(destPath));

7
packages/nocodb/src/plugins/teams/Teams.ts

@ -1,4 +1,5 @@
import axios from 'axios';
import { useAgent } from 'request-filtering-agent';
import type { IWebhookNotificationAdapter } from 'nc-plugin';
export default class Teams implements IWebhookNotificationAdapter {
@ -11,6 +12,12 @@ export default class Teams implements IWebhookNotificationAdapter {
try {
return await axios.post(webhook_url, {
Text,
httpAgent: useAgent(webhook_url, {
stopPortScanningByUrlRedirection: true,
}),
httpsAgent: useAgent(webhook_url, {
stopPortScanningByUrlRedirection: true,
}),
});
} catch (e) {
console.log(e);

6
packages/nocodb/src/plugins/upcloud/UpoCloud.ts

@ -2,6 +2,7 @@ import fs from 'fs';
import { promisify } from 'util';
import AWS from 'aws-sdk';
import axios from 'axios';
import { useAgent } from 'request-filtering-agent';
import type { IStorageAdapterV2, XcFile } from 'nc-plugin';
import type { Readable } from 'stream';
import { generateTempFilePath, waitForStreamClose } from '~/utils/pluginUtils';
@ -49,7 +50,10 @@ export default class UpoCloud implements IStorageAdapterV2 {
};
return new Promise((resolve, reject) => {
axios
.get(url)
.get(url, {
httpAgent: useAgent(url, { stopPortScanningByUrlRedirection: true }),
httpsAgent: useAgent(url, { stopPortScanningByUrlRedirection: true }),
})
.then((response) => {
uploadParams.Body = response.data;
uploadParams.Key = key;

6
packages/nocodb/src/plugins/vultr/Vultr.ts

@ -2,6 +2,7 @@ import fs from 'fs';
import { promisify } from 'util';
import AWS from 'aws-sdk';
import axios from 'axios';
import { useAgent } from 'request-filtering-agent';
import type { IStorageAdapterV2, XcFile } from 'nc-plugin';
import type { Readable } from 'stream';
import { generateTempFilePath, waitForStreamClose } from '~/utils/pluginUtils';
@ -49,7 +50,10 @@ export default class Vultr implements IStorageAdapterV2 {
};
return new Promise((resolve, reject) => {
axios
.get(url)
.get(url, {
httpAgent: useAgent(url, { stopPortScanningByUrlRedirection: true }),
httpsAgent: useAgent(url, { stopPortScanningByUrlRedirection: true }),
})
.then((response) => {
uploadParams.Body = response.data;
uploadParams.Key = key;

1
packages/nocodb/src/run/testDocker.ts

@ -23,6 +23,7 @@ server.use(
server.set('view engine', 'ejs');
process.env[`DEBUG`] = 'xc*';
process.env[`NC_ALLOW_LOCAL_HOOKS`] = 'true';
(async () => {
const httpServer = server.listen(process.env.PORT || 8080, async () => {

7
packages/nocodb/src/services/utils.service.ts

@ -3,6 +3,7 @@ import axios from 'axios';
import { compareVersions, validate } from 'compare-versions';
import { ViewTypes } from 'nocodb-sdk';
import { ConfigService } from '@nestjs/config';
import { useAgent } from 'request-filtering-agent';
import type { AppConfig } from '~/interface/config';
import { NC_ATTACHMENT_FIELD_SIZE } from '~/constants';
import SqlMgrv2 from '~/db/sql-mgr/v2/SqlMgrv2';
@ -152,6 +153,12 @@ export class UtilsService {
: {},
responseType: apiMeta.responseType || 'json',
withCredentials: true,
httpAgent: useAgent(apiMeta.url, {
stopPortScanningByUrlRedirection: true,
}),
httpsAgent: useAgent(apiMeta.url, {
stopPortScanningByUrlRedirection: true,
}),
};
const data = await axios(_req);
return data?.data;

190
pnpm-lock.yaml

@ -38,7 +38,7 @@ importers:
version: 4.1.1(vue@3.3.4)
'@pinia/nuxt':
specifier: ^0.4.11
version: 0.4.11(typescript@5.2.2)(vue@3.3.4)
version: 0.4.11(vue@3.3.4)
'@vue-flow/additional-components':
specifier: ^1.2.0
version: 1.2.0(@vue-flow/core@1.3.0)(vue@3.3.4)
@ -122,7 +122,7 @@ importers:
version: 1.0.2
pinia:
specifier: ^2.1.4
version: 2.1.4(typescript@5.2.2)(vue@3.3.4)
version: 2.1.4(vue@3.3.4)
qrcode:
specifier: ^1.5.1
version: 1.5.1
@ -192,7 +192,7 @@ importers:
devDependencies:
'@antfu/eslint-config':
specifier: ^0.26.0
version: 0.26.0(eslint@8.33.0)(typescript@5.2.2)
version: 0.26.0(eslint@8.33.0)
'@esbuild-plugins/node-modules-polyfill':
specifier: ^0.2.2
version: 0.2.2(esbuild@0.19.2)
@ -342,7 +342,7 @@ importers:
version: 6.0.3
nuxt:
specifier: ^3.6.5
version: 3.6.5(@types/node@20.3.1)(eslint@8.33.0)(sass@1.63.4)(typescript@5.2.2)
version: 3.6.5(@types/node@20.3.1)(eslint@8.33.0)(sass@1.63.4)
nuxt-windicss:
specifier: ^2.6.1
version: 2.6.1(vite@4.4.9)
@ -354,7 +354,7 @@ importers:
version: 1.63.4
ts-loader:
specifier: ^9.4.4
version: 9.4.4(typescript@5.2.2)(webpack@5.88.2)
version: 9.4.4(webpack@5.88.2)
unplugin-icons:
specifier: ^0.14.15
version: 0.14.15(@vue/compiler-sfc@3.2.37)
@ -703,6 +703,9 @@ importers:
reflect-metadata:
specifier: ^0.1.13
version: 0.1.13
request-filtering-agent:
specifier: ^1.1.2
version: 1.1.2
request-ip:
specifier: ^2.1.3
version: 2.1.3
@ -1113,20 +1116,20 @@ packages:
/@ant-design/icons-vue@6.1.0(vue@3.3.4):
resolution: {integrity: sha512-EX6bYm56V+ZrKN7+3MT/ubDkvJ5rK/O2t380WFRflDcVFgsvl3NLH7Wxeau6R8DbrO5jWR6DSTC3B6gYFp77AA==}
peerDependencies:
vue: '>=3.0.3'
vue: latest
dependencies:
'@ant-design/colors': 6.0.0
'@ant-design/icons-svg': 4.3.1
vue: 3.3.4
dev: false
/@antfu/eslint-config-basic@0.26.0(@typescript-eslint/parser@5.62.0)(eslint@8.33.0)(typescript@5.2.2):
/@antfu/eslint-config-basic@0.26.0(@typescript-eslint/parser@5.62.0)(eslint@8.33.0):
resolution: {integrity: sha512-l/Omn5HuI3VgHPGJ13pqdGEdF7D7HSzN85KF0HaR/jm24QzL2kkFeZJuglv+YSXyVDI1eAbzF52TlJUz1cxqzQ==}
peerDependencies:
eslint: '>=7.4.0'
dependencies:
eslint: 8.33.0
eslint-plugin-antfu: 0.26.0(eslint@8.33.0)(typescript@5.2.2)
eslint-plugin-antfu: 0.26.0(eslint@8.33.0)
eslint-plugin-eslint-comments: 3.2.0(eslint@8.33.0)
eslint-plugin-html: 7.1.0
eslint-plugin-import: 2.28.1(@typescript-eslint/parser@5.62.0)(eslint@8.33.0)
@ -1146,12 +1149,12 @@ packages:
- typescript
dev: true
/@antfu/eslint-config-react@0.26.0(eslint@8.33.0)(typescript@5.2.2):
/@antfu/eslint-config-react@0.26.0(eslint@8.33.0):
resolution: {integrity: sha512-QkRhzivKAtTVtLMFXt7Sl+hBM/LCAU+EUpIxTqw/h0uufYmzIrbdVwkxPntZaXl5p/qLZqQOZG3Iu7oek+MNeA==}
peerDependencies:
eslint: '>=7.4.0'
dependencies:
'@antfu/eslint-config-ts': 0.26.0(eslint@8.33.0)(typescript@5.2.2)
'@antfu/eslint-config-ts': 0.26.0(eslint@8.33.0)
eslint: 8.33.0
eslint-plugin-react: 7.33.2(eslint@8.33.0)
transitivePeerDependencies:
@ -1161,29 +1164,28 @@ packages:
- typescript
dev: true
/@antfu/eslint-config-ts@0.26.0(eslint@8.33.0)(typescript@5.2.2):
/@antfu/eslint-config-ts@0.26.0(eslint@8.33.0):
resolution: {integrity: sha512-LnJgBP+XAsGijfmjAZk6BDxlt7UYGiXyCIviLDgg8bmPaLAX3I+i0wmj9DwhDIYeXForeP/Io+dBT63k5BheBw==}
peerDependencies:
eslint: '>=7.4.0'
typescript: '>=3.9'
typescript: latest
dependencies:
'@antfu/eslint-config-basic': 0.26.0(@typescript-eslint/parser@5.62.0)(eslint@8.33.0)(typescript@5.2.2)
'@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.33.0)(typescript@5.2.2)
'@typescript-eslint/parser': 5.62.0(eslint@8.33.0)(typescript@5.2.2)
'@antfu/eslint-config-basic': 0.26.0(@typescript-eslint/parser@5.62.0)(eslint@8.33.0)
'@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.33.0)
'@typescript-eslint/parser': 5.62.0(eslint@8.33.0)
eslint: 8.33.0
typescript: 5.2.2
transitivePeerDependencies:
- eslint-import-resolver-typescript
- eslint-import-resolver-webpack
- supports-color
dev: true
/@antfu/eslint-config-vue@0.26.0(eslint@8.33.0)(typescript@5.2.2):
/@antfu/eslint-config-vue@0.26.0(eslint@8.33.0):
resolution: {integrity: sha512-a4ov8vzOzV5WPBSXIwg1oDnpSEOaxpvqz9cZK/lwqDsS+tk2QAI6yfcxwbhMIDUy3pA3u9B62K9tP+9HhqncIw==}
peerDependencies:
eslint: '>=7.4.0'
dependencies:
'@antfu/eslint-config-ts': 0.26.0(eslint@8.33.0)(typescript@5.2.2)
'@antfu/eslint-config-ts': 0.26.0(eslint@8.33.0)
eslint: 8.33.0
eslint-plugin-vue: 9.17.0(eslint@8.33.0)
transitivePeerDependencies:
@ -1193,15 +1195,15 @@ packages:
- typescript
dev: true
/@antfu/eslint-config@0.26.0(eslint@8.33.0)(typescript@5.2.2):
/@antfu/eslint-config@0.26.0(eslint@8.33.0):
resolution: {integrity: sha512-3f+JKBYPZZot5cdS4gkZxuiytUTfHWhsKS1UmNhqEn11G5BmzYSu1LRf0K/n10hb/u+GUtZJwKAovu6qnQBM9w==}
peerDependencies:
eslint: '>=7.4.0'
dependencies:
'@antfu/eslint-config-react': 0.26.0(eslint@8.33.0)(typescript@5.2.2)
'@antfu/eslint-config-vue': 0.26.0(eslint@8.33.0)(typescript@5.2.2)
'@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.33.0)(typescript@5.2.2)
'@typescript-eslint/parser': 5.62.0(eslint@8.33.0)(typescript@5.2.2)
'@antfu/eslint-config-react': 0.26.0(eslint@8.33.0)
'@antfu/eslint-config-vue': 0.26.0(eslint@8.33.0)
'@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.33.0)
'@typescript-eslint/parser': 5.62.0(eslint@8.33.0)
eslint: 8.33.0
eslint-plugin-eslint-comments: 3.2.0(eslint@8.33.0)
eslint-plugin-html: 7.1.0
@ -3226,7 +3228,7 @@ packages:
resolution: {integrity: sha512-wmsfNHJQgSX0HFA726r+cm6ixYs+z/KLxfg1cx6xZ1PBGeZsuQCACdNdoKckyr/IH8FgIbBoIH0/6QiSbW3tEQ==}
peerDependencies:
'@vue/composition-api': ^1.0.0-rc.1
vue: ^2.0.0 || >=3.0.5
vue: latest
peerDependenciesMeta:
'@vue/composition-api':
optional: true
@ -3240,7 +3242,7 @@ packages:
resolution: {integrity: sha512-c9X82nppYjSxjlITO6jdLLdt9HoyZzqEWpqDL2V6NJd859d6GCh/2AHeRXk+37uRJ1UdTkCuty93WOEqja8quw==}
engines: {node: '>=12'}
peerDependencies:
vue: ^3.2.0
vue: latest
dependencies:
'@ctrl/tinycolor': 3.6.1
lodash-es: 4.17.21
@ -4377,7 +4379,7 @@ packages:
/@iconify/vue@4.1.1(vue@3.3.4):
resolution: {integrity: sha512-RL85Bm/DAe8y6rT6pux7D2FJSiUEM/TPfyK7GrbAOfTSwrhvwJW+S5yijdGcmtXouA8MtuH9C7l4hiSE4mLMjg==}
peerDependencies:
vue: '>=3'
vue: latest
dependencies:
'@iconify/types': 2.0.0
vue: 3.3.4
@ -5229,7 +5231,7 @@ packages:
/@nestjs/schematics@10.0.1(chokidar@3.5.3)(typescript@5.2.2):
resolution: {integrity: sha512-buxpYtSwOmWyf0nUJWJCkCkYITwbOfIEKHTnGS7sDbcfaajrOFXb5pPAGD2E1CUb3C1+NkQIURPKzs0IouZTQg==}
peerDependencies:
typescript: '>=4.8.2'
typescript: latest
dependencies:
'@angular-devkit/core': 16.1.0(chokidar@3.5.3)
'@angular-devkit/schematics': 16.1.0(chokidar@3.5.3)
@ -5653,11 +5655,11 @@ packages:
/@nuxt/ui-templates@1.3.1:
resolution: {integrity: sha512-5gc02Pu1HycOVUWJ8aYsWeeXcSTPe8iX8+KIrhyEtEoOSkY0eMBuo0ssljB8wALuEmepv31DlYe5gpiRwkjESA==}
/@nuxt/vite-builder@3.6.5(@types/node@20.3.1)(eslint@8.33.0)(sass@1.63.4)(typescript@5.2.2)(vue@3.3.4):
/@nuxt/vite-builder@3.6.5(@types/node@20.3.1)(eslint@8.33.0)(sass@1.63.4)(vue@3.3.4):
resolution: {integrity: sha512-pwSpt257ApCp3XWUs8vrC7X9QHeHUv5PbbIR3+5w0n5f95XPNOQWDJa2fTPX/H6oaRJCPYAsBPqiQhQ7qW/NZQ==}
engines: {node: ^14.18.0 || >=16.10.0}
peerDependencies:
vue: ^3.3.4
vue: latest
dependencies:
'@nuxt/kit': 3.6.5
'@rollup/plugin-replace': 5.0.2(rollup@3.28.1)
@ -5692,7 +5694,7 @@ packages:
unplugin: 1.4.0
vite: 4.3.9(@types/node@20.3.1)(sass@1.63.4)
vite-node: 0.33.0(@types/node@20.3.1)(sass@1.63.4)
vite-plugin-checker: 0.6.2(eslint@8.33.0)(typescript@5.2.2)(vite@4.3.9)
vite-plugin-checker: 0.6.2(eslint@8.33.0)(vite@4.3.9)
vue: 3.3.4
vue-bundle-renderer: 1.0.3
transitivePeerDependencies:
@ -6116,11 +6118,11 @@ packages:
'@parcel/watcher-win32-x64': 2.3.0
dev: true
/@pinia/nuxt@0.4.11(typescript@5.2.2)(vue@3.3.4):
/@pinia/nuxt@0.4.11(vue@3.3.4):
resolution: {integrity: sha512-bhuNFngJpmBCdAqWguezNJ/oJFR7wvKieqiZrmmdmPR07XjsidAw8RLXHMZE9kUm32M9E6T057OBbG/22jERTg==}
dependencies:
'@nuxt/kit': 3.7.0
pinia: 2.1.4(typescript@5.2.2)(vue@3.3.4)
pinia: 2.1.4(vue@3.3.4)
transitivePeerDependencies:
- '@vue/composition-api'
- rollup
@ -7810,7 +7812,7 @@ packages:
dev: false
optional: true
/@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.33.0)(typescript@5.2.2):
/@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.33.0):
resolution: {integrity: sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
peerDependencies:
@ -7822,7 +7824,7 @@ packages:
optional: true
dependencies:
'@eslint-community/regexpp': 4.8.0
'@typescript-eslint/parser': 5.62.0(eslint@8.33.0)(typescript@5.2.2)
'@typescript-eslint/parser': 5.62.0(eslint@8.33.0)
'@typescript-eslint/scope-manager': 5.62.0
'@typescript-eslint/type-utils': 5.62.0(eslint@8.33.0)(typescript@5.2.2)
'@typescript-eslint/utils': 5.62.0(eslint@8.33.0)(typescript@5.2.2)
@ -7833,7 +7835,6 @@ packages:
natural-compare-lite: 1.4.0
semver: 7.5.4
tsutils: 3.21.0(typescript@5.2.2)
typescript: 5.2.2
transitivePeerDependencies:
- supports-color
dev: true
@ -7897,7 +7898,7 @@ packages:
- supports-color
dev: true
/@typescript-eslint/parser@5.62.0(eslint@8.33.0)(typescript@5.2.2):
/@typescript-eslint/parser@5.62.0(eslint@8.33.0):
resolution: {integrity: sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
peerDependencies:
@ -7912,7 +7913,6 @@ packages:
'@typescript-eslint/typescript-estree': 5.62.0(typescript@5.2.2)
debug: 4.3.4(supports-color@8.1.1)
eslint: 8.33.0
typescript: 5.2.2
transitivePeerDependencies:
- supports-color
dev: true
@ -8233,7 +8233,7 @@ packages:
/@unhead/vue@1.3.9(vue@3.3.4):
resolution: {integrity: sha512-rVAsRLBc+3Y//NRmr7vmRs5yhIf65jYSvcj0V5DtDfDwql7BbGgc3VIIEvY0+EjLQuNsS5kxwm78LSPCIl/3Xw==}
peerDependencies:
vue: '>=2.7 || >=3'
vue: latest
dependencies:
'@unhead/schema': 1.3.9
'@unhead/shared': 1.3.9
@ -8501,7 +8501,7 @@ packages:
engines: {node: ^14.18.0 || >=16.0.0}
peerDependencies:
vite: ^4.0.0
vue: ^3.0.0
vue: latest
dependencies:
'@babel/core': 7.22.11
'@babel/plugin-transform-typescript': 7.22.11(@babel/core@7.22.11)
@ -8517,7 +8517,7 @@ packages:
engines: {node: ^14.18.0 || >=16.0.0}
peerDependencies:
vite: ^4.0.0
vue: ^3.2.25
vue: latest
dependencies:
vite: 4.3.9(@types/node@20.3.1)(sass@1.63.4)
vue: 3.3.4
@ -8572,7 +8572,7 @@ packages:
resolution: {integrity: sha512-a5F2y0WdPxaxTAcN7mSYVZ6A2kDSxenp+YwMt/2ldFRmCIP4jCbXEsTZfcpUe5zhlehfbyTTYbEw03w3YW24aA==}
peerDependencies:
'@vue-flow/core': ^1.0.0
vue: ^3.2.37
vue: latest
dependencies:
'@types/d3-selection': 3.0.6
'@types/d3-zoom': 3.0.4
@ -8585,7 +8585,7 @@ packages:
/@vue-flow/core@1.3.0(vue@3.3.4):
resolution: {integrity: sha512-hitjBy8RTw8gixcgJ9sjfZWyI6KNyKp4ffxTz/O4ZN/7TMwunEdc3cFHuU7R6J1OEhZ+HnlMRGrXmzXiIfdJow==}
peerDependencies:
vue: ^3.2.25
vue: latest
dependencies:
'@vueuse/core': 9.13.0(vue@3.3.4)
d3-drag: 3.0.0
@ -8600,7 +8600,7 @@ packages:
resolution: {integrity: sha512-0/2A4kWLTCNEx+DDQKLvs7zXpfjgAbGBZ58SIvDN1DjGXhG4WaIUZtgMqzA6bvc5dNN7RaOatZYubkVumwmjWA==}
engines: {node: '>=16.14.0'}
peerDependencies:
vue: ^2.7.0 || ^3.2.25
vue: latest
peerDependenciesMeta:
vue:
optional: true
@ -8642,7 +8642,7 @@ packages:
/@vue/compat@3.3.4(vue@3.3.4):
resolution: {integrity: sha512-VwAsPqUqRJVxeLQPUC03Sa5d+T8UG2Qv4VItq74KmNvtQlRXICpa/sqq12BcyBB4Tz1U5paOEZxWCUoXkrZ9QQ==}
peerDependencies:
vue: 3.3.4
vue: latest
dependencies:
'@babel/parser': 7.22.11
estree-walker: 2.0.2
@ -8765,7 +8765,7 @@ packages:
/@vue/server-renderer@3.3.4(vue@3.3.4):
resolution: {integrity: sha512-Q6jDDzR23ViIb67v+vM1Dqntu+HUexQcsWKhhQa4ARVzxOY2HbC7QRW/ggkDBd5BU+uM1sV6XOAP0b216o34JQ==}
peerDependencies:
vue: 3.3.4
vue: latest
dependencies:
'@vue/compiler-ssr': 3.3.4
'@vue/shared': 3.3.4
@ -8781,7 +8781,7 @@ packages:
/@vue/test-utils@2.0.2(vue@3.3.4):
resolution: {integrity: sha512-E2P4oXSaWDqTZNbmKZFVLrNN/siVN78YkEqs7pHryWerrlZR9bBFLWdJwRoguX45Ru6HxIflzKl4vQvwRMwm5g==}
peerDependencies:
vue: ^3.0.1
vue: latest
dependencies:
vue: 3.3.4
dev: true
@ -8819,7 +8819,7 @@ packages:
resolution: {integrity: sha512-PRRgbATMpoeUmkCEBtUeJgOwtew8s+4UsEd+Pm7MhkjL2ihCNrSqxNVtM6NFE4uP2sWnkGcZpCjPuNSxowJ1Ow==}
peerDependencies:
'@vue/composition-api': ^1.1.0
vue: ^2.6.0 || ^3.2.0
vue: latest
peerDependenciesMeta:
'@vue/composition-api':
optional: true
@ -8912,7 +8912,7 @@ packages:
'@vueuse/core': 10.2.1(vue@3.3.4)
'@vueuse/metadata': 10.2.1
local-pkg: 0.4.3
nuxt: 3.6.5(@types/node@20.3.1)(eslint@8.33.0)(sass@1.63.4)(typescript@5.2.2)
nuxt: 3.6.5(@types/node@20.3.1)(eslint@8.33.0)(sass@1.63.4)
vue-demi: 0.14.5(vue@3.3.4)
transitivePeerDependencies:
- '@vue/composition-api'
@ -8933,7 +8933,7 @@ packages:
resolution: {integrity: sha512-rN2qd22AUl7VdBxihagWyhUNHCyVk9IpvBTTfHoLH9G7rGE552X1f+zeCfehuno0zXif13jPw+icW/wn2a0rnQ==}
peerDependencies:
'@vue/composition-api': ^1.1.0
vue: ^2.6.0 || ^3.2.0
vue: latest
peerDependenciesMeta:
'@vue/composition-api':
optional: true
@ -9444,7 +9444,7 @@ packages:
resolution: {integrity: sha512-QKCAcOY5EJF0PepiVGA4X5PzUetYUvG5qALmA+2TON40pc2+brOEiVTwr3kjF9N+f7q4MpyiLPu4pIErwoajOQ==}
engines: {node: '>=12.22.0'}
peerDependencies:
vue: '>=3.2.0'
vue: latest
dependencies:
'@ant-design/colors': 6.0.0
'@ant-design/icons-vue': 6.1.0(vue@3.3.4)
@ -12107,7 +12107,7 @@ packages:
/emoji-mart-vue-fast@15.0.0(vue@3.3.4):
resolution: {integrity: sha512-3BzkDrs60JyT00dLHMAxWKbpFhbyaW9C+q1AjtqGovSxTu8TC2mYAGsvTmXNYKm39IRRAS56v92TihOcB98IsQ==}
peerDependencies:
vue: '>2.0.0'
vue: latest
dependencies:
'@babel/runtime': 7.22.11
core-js: 3.32.1
@ -12558,7 +12558,7 @@ packages:
eslint-import-resolver-webpack:
optional: true
dependencies:
'@typescript-eslint/parser': 5.62.0(eslint@8.33.0)(typescript@5.2.2)
'@typescript-eslint/parser': 5.62.0(eslint@8.33.0)
debug: 3.2.7(supports-color@5.5.0)
eslint: 8.33.0
eslint-import-resolver-node: 0.3.9
@ -12624,7 +12624,7 @@ packages:
- supports-color
dev: true
/eslint-plugin-antfu@0.26.0(eslint@8.33.0)(typescript@5.2.2):
/eslint-plugin-antfu@0.26.0(eslint@8.33.0):
resolution: {integrity: sha512-hc5Bb6EH6zM/Vjy0scOQydlG9I1DDocG4AikyUfqjSFneWv6eNItej9LHYTXEGc0iGosCysNS4tPUAPuhBHkCA==}
dependencies:
'@typescript-eslint/utils': 5.62.0(eslint@8.33.0)(typescript@5.2.2)
@ -12661,7 +12661,7 @@ packages:
engines: {node: '>=16.10.0'}
peerDependencies:
eslint: ^8.0.0
typescript: '>=4.0.2'
typescript: latest
peerDependenciesMeta:
typescript:
optional: true
@ -12760,7 +12760,7 @@ packages:
'@typescript-eslint/parser':
optional: true
dependencies:
'@typescript-eslint/parser': 5.62.0(eslint@8.33.0)(typescript@5.2.2)
'@typescript-eslint/parser': 5.62.0(eslint@8.33.0)
array-includes: 3.1.6
array.prototype.findlastindex: 1.2.2
array.prototype.flat: 1.3.1
@ -13674,7 +13674,7 @@ packages:
resolution: {integrity: sha512-mX3qW3idpueT2klaQXBzrIM/pHw+T0B/V9KHEvNrqijTq9NFnMZU6oreVxDYcf33P8a5cW+67PjodNHthGnNVg==}
engines: {node: '>=12.13.0', yarn: '>=1.0.0'}
peerDependencies:
typescript: '>3.6.0'
typescript: latest
webpack: ^5.11.0
dependencies:
'@babel/code-frame': 7.22.10
@ -15071,6 +15071,11 @@ packages:
resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==}
engines: {node: '>= 0.10'}
/ipaddr.js@2.1.0:
resolution: {integrity: sha512-LlbxQ7xKzfBusov6UMi4MFpEg0m+mAm9xyNGEduwXMEDuf4WfzB/RZwMVYEd7IKGvh4IUkEXYxtAVu9T3OelJQ==}
engines: {node: '>= 10'}
dev: false
/ipx@1.2.0:
resolution: {integrity: sha512-FkEP56C08HdlqlWKm3pMhatywPtDBTlePTdzskksCR1+7xnB6fQs6pXOTXPTG5i+gGPgCOxbNMUSZEH/DQcWDA==}
hasBin: true
@ -15259,7 +15264,7 @@ packages:
resolution: {integrity: sha512-DDx04RjLpGNT4vtF49vGW5CECP6lAx8SL2keq99ogIxwLvJPBvgThdhb43ED5uYO4nq0kZ51tMj7VdCCQgdZ5Q==}
peerDependencies:
eslint: '*'
typescript: '>=4.7.4'
typescript: latest
dependencies:
'@typescript-eslint/type-utils': 5.62.0(eslint@8.33.0)(typescript@5.2.2)
eslint: 8.33.0
@ -18312,7 +18317,7 @@ packages:
- vite
dev: true
/nuxt@3.6.5(@types/node@20.3.1)(eslint@8.33.0)(sass@1.63.4)(typescript@5.2.2):
/nuxt@3.6.5(@types/node@20.3.1)(eslint@8.33.0)(sass@1.63.4):
resolution: {integrity: sha512-0A7V8B1HrIXX9IlqPc2w+5ZPXi+7MYa9QVhtuGYuLvjRKoSFANhCoMPRP6pKdoxigM1MBxhLue2VmHA/VbtJCw==}
engines: {node: ^14.18.0 || >=16.10.0}
hasBin: true
@ -18328,7 +18333,7 @@ packages:
'@nuxt/schema': 3.6.5
'@nuxt/telemetry': 2.4.1
'@nuxt/ui-templates': 1.3.1
'@nuxt/vite-builder': 3.6.5(@types/node@20.3.1)(eslint@8.33.0)(sass@1.63.4)(typescript@5.2.2)(vue@3.3.4)
'@nuxt/vite-builder': 3.6.5(@types/node@20.3.1)(eslint@8.33.0)(sass@1.63.4)(vue@3.3.4)
'@types/node': 20.3.1
'@unhead/ssr': 1.3.9
'@unhead/vue': 1.3.9(vue@3.3.4)
@ -19202,12 +19207,12 @@ packages:
engines: {node: '>=10'}
dev: true
/pinia@2.1.4(typescript@5.2.2)(vue@3.3.4):
/pinia@2.1.4(vue@3.3.4):
resolution: {integrity: sha512-vYlnDu+Y/FXxv1ABo1vhjC+IbqvzUdiUC3sfDRrRyY2CQSrqqaa+iiHmqtARFxJVqWQMCJfXx1PBvFs9aJVLXQ==}
peerDependencies:
'@vue/composition-api': ^1.4.0
typescript: '>=4.4.4'
vue: ^2.6.14 || ^3.3.0
typescript: latest
vue: latest
peerDependenciesMeta:
'@vue/composition-api':
optional: true
@ -19215,7 +19220,6 @@ packages:
optional: true
dependencies:
'@vue/devtools-api': 6.5.0
typescript: 5.2.2
vue: 3.3.4
vue-demi: 0.14.5(vue@3.3.4)
dev: false
@ -20181,6 +20185,12 @@ packages:
engines: {node: '>=0.10'}
dev: true
/request-filtering-agent@1.1.2:
resolution: {integrity: sha512-v6uYIoey6rhe+nQXB5rlYEWJI+5SrnvM72XGeLUsykzu2omOEPoW4QmzEH+8/sheK4M/hwQ85L7aPj1cTJfPLg==}
dependencies:
ipaddr.js: 2.1.0
dev: false
/request-ip@2.1.3:
resolution: {integrity: sha512-J3qdE/IhVM3BXkwMIVO4yFrvhJlU3H7JH16+6yHucadT4fePnR8dyh+vEs6FIx0S2x5TCt2ptiPfHcn0sqhbYQ==}
dependencies:
@ -21990,7 +22000,7 @@ packages:
resolution: {integrity: sha512-Cbu4nIqnEdd+THNEsBdkolnOXhg0I8XteoHaEKgvsxpsbWda4IsUut2c187HxywQCvveojow0Dgw/amxtSKVkQ==}
engines: {node: '>=16.13.0'}
peerDependencies:
typescript: '>=4.2.0'
typescript: latest
dependencies:
typescript: 5.2.2
dev: true
@ -22010,7 +22020,7 @@ packages:
babel-jest: ^29.0.0
esbuild: '*'
jest: ^29.0.0
typescript: '>=4.3'
typescript: latest
peerDependenciesMeta:
'@babel/core':
optional: true
@ -22038,7 +22048,7 @@ packages:
resolution: {integrity: sha512-MLukxDHBl8OJ5Dk3y69IsKVFRA/6MwzEqBgh+OXMPB/OD01KQuWPFd1WAQP8a5PeSCAxfnkhiuWqfmFJzJQt9w==}
engines: {node: '>=12.0.0'}
peerDependencies:
typescript: '*'
typescript: latest
webpack: ^5.0.0
dependencies:
chalk: 4.1.2
@ -22046,6 +22056,20 @@ packages:
micromatch: 4.0.5
semver: 7.5.4
typescript: 5.2.2
webpack: 5.88.2(webpack-cli@5.1.4)
dev: true
/ts-loader@9.4.4(webpack@5.88.2):
resolution: {integrity: sha512-MLukxDHBl8OJ5Dk3y69IsKVFRA/6MwzEqBgh+OXMPB/OD01KQuWPFd1WAQP8a5PeSCAxfnkhiuWqfmFJzJQt9w==}
engines: {node: '>=12.0.0'}
peerDependencies:
typescript: latest
webpack: ^5.0.0
dependencies:
chalk: 4.1.2
enhanced-resolve: 5.15.0
micromatch: 4.0.5
semver: 7.5.4
webpack: 5.88.2(esbuild@0.19.2)
dev: true
@ -22070,7 +22094,7 @@ packages:
'@swc/core': '>=1.2.50'
'@swc/wasm': '>=1.2.50'
'@types/node': '*'
typescript: '>=2.7'
typescript: latest
peerDependenciesMeta:
'@swc/core':
optional: true
@ -22160,7 +22184,7 @@ packages:
resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==}
engines: {node: '>= 6'}
peerDependencies:
typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta'
typescript: latest
dependencies:
tslib: 1.14.1
typescript: 5.2.2
@ -22318,6 +22342,7 @@ packages:
resolution: {integrity: sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==}
engines: {node: '>=14.17'}
hasBin: true
dev: true
/ufo@1.3.0:
resolution: {integrity: sha512-bRn3CsoojyNStCZe0BG0Mt4Nr/4KF+rhFlnNXybgqt5pXHNFRlqinSoQaTrGyzE4X8aHplSb+TorH+COin9Yxw==}
@ -22579,7 +22604,7 @@ packages:
engines: {node: '>=14'}
peerDependencies:
'@babel/parser': ^7.15.8
vue: 2 || 3
vue: latest
peerDependenciesMeta:
'@babel/parser':
optional: true
@ -22932,7 +22957,7 @@ packages:
- terser
dev: true
/vite-plugin-checker@0.6.2(eslint@8.33.0)(typescript@5.2.2)(vite@4.3.9):
/vite-plugin-checker@0.6.2(eslint@8.33.0)(vite@4.3.9):
resolution: {integrity: sha512-YvvvQ+IjY09BX7Ab+1pjxkELQsBd4rPhWNw8WLBeFVxu/E7O+n6VYAqNsKdK/a2luFlX/sMpoWdGFfg4HvwdJQ==}
engines: {node: '>=14.16'}
peerDependencies:
@ -22940,7 +22965,7 @@ packages:
meow: ^9.0.0
optionator: ^0.9.1
stylelint: '>=13'
typescript: '*'
typescript: latest
vite: '>=2.0.0'
vls: '*'
vti: '*'
@ -22977,7 +23002,6 @@ packages:
semver: 7.5.4
strip-ansi: 6.0.1
tiny-invariant: 1.3.1
typescript: 5.2.2
vite: 4.3.9(@types/node@20.3.1)(sass@1.63.4)
vscode-languageclient: 7.0.0
vscode-languageserver: 7.0.0
@ -23236,7 +23260,7 @@ packages:
resolution: {integrity: sha512-d3zpKmGZr2OWHQ1xmxBcAn5ShTG917+/UCLaSpaCDDqT0U7DBsvFzTs69ZnHCgKoXT55GZDW8YEj9Av+dlONLA==}
peerDependencies:
chart.js: ^4.1.1
vue: ^3.0.0-0 || ^2.7.0
vue: latest
dependencies:
chart.js: 4.3.0
vue: 3.3.4
@ -23249,7 +23273,7 @@ packages:
requiresBuild: true
peerDependencies:
'@vue/composition-api': ^1.0.0-rc.1
vue: ^3.0.0-0 || ^2.6.0
vue: latest
peerDependenciesMeta:
'@vue/composition-api':
optional: true
@ -23264,7 +23288,7 @@ packages:
requiresBuild: true
peerDependencies:
'@vue/composition-api': ^1.0.0-rc.1
vue: ^3.0.0-0 || ^2.6.0
vue: latest
peerDependenciesMeta:
'@vue/composition-api':
optional: true
@ -23278,7 +23302,7 @@ packages:
requiresBuild: true
peerDependencies:
'@vue/composition-api': ^1.0.0-rc.1
vue: ^3.0.0-0 || ^2.6.0
vue: latest
peerDependenciesMeta:
'@vue/composition-api':
optional: true
@ -23292,7 +23316,7 @@ packages:
/vue-dompurify-html@3.0.0(vue@3.3.4):
resolution: {integrity: sha512-S6PMeJU7S3w0TnxMWWd4iydc7oPdOER1GmW9rsgiRwHvcw+nUi2v6BgERcFBULlM+x6PXsfu5P/Rm4reVvWH5A==}
peerDependencies:
vue: ^3.0.0
vue: latest
dependencies:
dompurify: 2.4.7
vue: 3.3.4
@ -23326,7 +23350,7 @@ packages:
resolution: {integrity: sha512-yswpwtj89rTBhegUAv9Mu37LNznyu3NpyLQmozF3i1hYOhwpG8RjcjIFIIfnu+2MDZJGSZPXaKWvnQA71Yv9TQ==}
engines: {node: '>= 14'}
peerDependencies:
vue: ^3.0.0
vue: latest
dependencies:
'@intlify/core-base': 9.2.2
'@intlify/shared': 9.2.2
@ -23348,7 +23372,7 @@ packages:
/vue-router@4.2.4(vue@3.3.4):
resolution: {integrity: sha512-9PISkmaCO02OzPVOMq2w82ilty6+xJmQrarYZDkjZBfl4RvYAlt4PKnEX21oW4KTtWfa9OuO/b3qk1Od3AEdCQ==}
peerDependencies:
vue: ^3.2.0
vue: latest
dependencies:
'@vue/devtools-api': 6.5.0
vue: 3.3.4
@ -23358,7 +23382,7 @@ packages:
resolution: {integrity: sha512-IwUC0Aq2zwaXqy74h4WCvFCUtoV0iSWr0snWnE9TnU18S66GAQyqQbRf2qfJtUuiFsBf6qp0MEwdonlwznlcrw==}
engines: {node: '>=10.15.0'}
peerDependencies:
vue: ^3.0.0
vue: latest
dependencies:
is-plain-object: 3.0.1
vue: 3.3.4
@ -23368,7 +23392,7 @@ packages:
resolution: {integrity: sha512-BchyC33WiZryYatFINj3LWqgyE6X82Huzf7abA23tsF/IbaRZVwZzie8SmGaYvezEBiPXhJogQ3dtxIuXFjkBw==}
engines: {node: '>=12'}
peerDependencies:
vue: ^3.2.24
vue: latest
dependencies:
tippy.js: 6.3.7
vue: 3.3.4
@ -23403,7 +23427,7 @@ packages:
resolution: {integrity: sha512-l/30RvXLkw50axAjswAK1DmvbUc5Oyhq9GkvD98p8pykrLkIajRi3evVsMnahMBK0O7+EGIK9RbIOKPyRfuw7w==}
peerDependencies:
resize-detector: ^0.3.0
vue: ^3.2.37
vue: latest
dependencies:
resize-detector: 0.3.0
vue: 3.3.4
@ -23421,7 +23445,7 @@ packages:
/vuedraggable@4.1.0(vue@3.3.4):
resolution: {integrity: sha512-FU5HCWBmsf20GpP3eudURW3WdWTKIbEIQxh9/8GE806hydR9qZqRRxRE3RjqX7PkuLuMQG/A7n3cfj9rCEchww==}
peerDependencies:
vue: ^3.0.1
vue: latest
dependencies:
sortablejs: 1.14.0
vue: 3.3.4

Loading…
Cancel
Save