feat: add n8n front end module system

This commit is contained in:
Alex Grozav 2025-01-28 16:12:58 +02:00
parent 663dfb48de
commit d94aea4372
35 changed files with 475 additions and 66 deletions

View file

@ -18,6 +18,8 @@
"test:dev": "vitest --silent=false"
},
"dependencies": {
"@n8n/module-common": "workspace:*",
"@n8n/module-example": "workspace:*",
"@codemirror/autocomplete": "^6.16.0",
"@codemirror/commands": "^6.5.0",
"@codemirror/lang-javascript": "^6.2.2",

View file

@ -30,6 +30,8 @@ import { createPinia, PiniaVuePlugin } from 'pinia';
import { JsPlumbPlugin } from '@/plugins/jsplumb';
import { ChartJSPlugin } from '@/plugins/chartjs';
import { SentryPlugin } from '@/plugins/sentry';
import { registerModule } from '@/modules';
import { FrontEndModuleContext } from '@n8n/module-common';
const pinia = createPinia();
@ -47,6 +49,19 @@ app.use(router);
app.use(i18nInstance);
app.use(ChartJSPlugin);
const defaultModules = [import('@n8n/module-example')];
const moduleContext: FrontEndModuleContext = {
app,
registerRoute: () => {},
};
for (const module of defaultModules) {
await module.then(({ frontEndModule }) => {
registerModule(frontEndModule, moduleContext);
});
}
app.mount('#app');
if (!import.meta.env.PROD) {

View file

@ -0,0 +1,8 @@
import type { FrontEndModule, FrontEndModuleContext } from '@n8n/module-common/frontend/types';
export const modules: FrontEndModule[] = [];
export function registerModule(module: FrontEndModule, context: FrontEndModuleContext) {
modules.push(module);
module.setup(context);
}

View file

@ -21,7 +21,9 @@
"n8n-design-system": ["../design-system/src/main.ts"],
"n8n-design-system/*": ["../design-system/src/*"],
"@n8n/chat/*": ["../@n8n/chat/src/*"],
"@n8n/api-types*": ["../@n8n/api-types/src*"]
"@n8n/api-types*": ["../@n8n/api-types/src*"],
"@n8n/module-common*": ["../modules/common/src*"],
"@n8n/module-example*": ["../modules/example/src*"]
},
"lib": ["esnext", "dom", "dom.iterable", "scripthost"],
// TODO: remove all options below this line

View file

@ -36,6 +36,14 @@ const alias = [
find: /^@n8n\/chat\//,
replacement: resolve(__dirname, '..', '@n8n', 'chat', 'src') + '/',
},
{
find: /^@n8n\/module-common$/,
replacement: resolve(__dirname, '..', 'modules', 'common', 'src', 'index.ts'),
},
{
find: /^@n8n\/module-example$/,
replacement: resolve(__dirname, '..', 'modules', 'example', 'src', 'index.ts'),
},
...['orderBy', 'camelCase', 'cloneDeep', 'startCase'].map((name) => ({
find: new RegExp(`^lodash.${name}$`, 'i'),
replacement: `lodash-es/${name}`,

24
packages/modules/common/.gitignore vendored Normal file
View file

@ -0,0 +1,24 @@
# Logs
logs
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*
pnpm-debug.log*
lerna-debug.log*
node_modules
dist
dist-ssr
*.local
# Editor directories and files
.vscode/*
!.vscode/extensions.json
.idea
.DS_Store
*.suo
*.ntvs*
*.njsproj
*.sln
*.sw?

View file

@ -0,0 +1 @@
See LICENSE.md in the root of this repository for more information.

View file

@ -0,0 +1,3 @@
# @n8n/module-front-end
@TODO: Write a description here

View file

@ -0,0 +1,13 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<link rel="icon" type="image/svg+xml" href="/vite.svg" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Vite + Vue + TS</title>
</head>
<body>
<div id="app"></div>
<script type="module" src="/src/main.ts"></script>
</body>
</html>

View file

@ -0,0 +1,39 @@
{
"name": "@n8n/module-common",
"version": "0.0.0",
"type": "module",
"files": [
"dist",
"LICENSE",
"README.md"
],
"types": "./dist/n8n-module-common.d.ts",
"main": "./dist/n8n-module-common.umd.cjs",
"module": "./dist/n8n-module-common.js",
"exports": {
".": {
"types": "./dist/n8n-module-common.d.ts",
"import": "./dist/n8n-module-common.js",
"require": "./dist/n8n-module-common.umd.cjs"
},
"./*": "./*"
},
"scripts": {
"dev": "vite",
"build": "vue-tsc -b && vite build",
"preview": "vite preview"
},
"peerDependencies": {
"vue": "catalog:frontend",
"vue-router": "catalog:frontend"
},
"devDependencies": {
"@vitejs/plugin-vue": "catalog:frontend",
"@vue/tsconfig": "catalog:frontend",
"typescript": "~5.6.2",
"vite": "catalog:frontend",
"vue": "catalog:frontend",
"vue-router": "catalog:frontend",
"vue-tsc": "catalog:frontend"
}
}

View file

@ -0,0 +1,5 @@
import type { FrontEndModule } from './types.ts';
export function defineFrontEndModule(module: FrontEndModule): FrontEndModule {
return module;
}

View file

@ -0,0 +1,2 @@
export * from './define';
export * from './types';

View file

@ -0,0 +1,14 @@
import type { RouteRecordRaw } from 'vue-router';
import type { App } from 'vue';
export type FrontEndModuleContext = {
app: App;
defineRoutes: (routes: RouteRecordRaw[]) => void;
};
export type FrontEndModuleSetupFn = (context: FrontEndModuleContext) => void;
export type FrontEndModule = {
name: string;
setup: FrontEndModuleSetupFn;
};

View file

@ -0,0 +1 @@
/// <reference types="vite/client" />

View file

@ -0,0 +1,2 @@
export * from './backend';
export * from './frontend';

View file

@ -0,0 +1,12 @@
{
"extends": "@vue/tsconfig/tsconfig.dom.json",
"compilerOptions": {
"tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo",
"strict": true,
"noUnusedLocals": true,
"noUnusedParameters": true,
"noFallthroughCasesInSwitch": true,
"noUncheckedSideEffectImports": true
},
"include": ["src/backend/**/*.ts", "src/backend/**/*.tsx", "src/backend/**/*.vue"]
}

View file

@ -0,0 +1,12 @@
{
"extends": "@vue/tsconfig/tsconfig.dom.json",
"compilerOptions": {
"tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo",
"strict": true,
"noUnusedLocals": true,
"noUnusedParameters": true,
"noFallthroughCasesInSwitch": true,
"noUncheckedSideEffectImports": true
},
"include": ["src/frontend/**/*.ts", "src/frontend/**/*.tsx", "src/frontend/**/*.vue"]
}

View file

@ -0,0 +1,8 @@
{
"files": ["./src/index.ts"],
"references": [
{ "path": "./tsconfig.backend.json" },
{ "path": "./tsconfig.frontend.json" },
{ "path": "./tsconfig.vite.json" }
]
}

View file

@ -0,0 +1,20 @@
{
"compilerOptions": {
"tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo",
"target": "ES2022",
"lib": ["ES2023"],
"module": "ESNext",
"skipLibCheck": true,
"moduleResolution": "bundler",
"allowImportingTsExtensions": true,
"isolatedModules": true,
"moduleDetection": "force",
"noEmit": true,
"strict": true,
"noUnusedLocals": true,
"noUnusedParameters": true,
"noFallthroughCasesInSwitch": true,
"noUncheckedSideEffectImports": true
},
"include": ["vite.config.ts"]
}

View file

@ -0,0 +1,33 @@
import { resolve } from 'path';
import { defineConfig } from 'vite';
import vue from '@vitejs/plugin-vue';
import dts from 'vite-plugin-dts';
import { configDefaults as vitestConfig } from 'vitest/config';
const cwd = process.cwd();
export default defineConfig({
plugins: [vue(), dts({ rollupTypes: true })],
build: {
lib: {
entry: resolve(cwd, 'src', 'index.ts'),
name: 'n8nModuleCommon',
fileName: 'n8n-module-common',
},
rollupOptions: {
external: ['vue'],
output: {
globals: {
vue: 'Vue',
},
},
},
},
test: {
globals: true,
environment: 'jsdom',
setupFiles: ['src/__tests__/setup.ts'],
include: ['src/**/*.spec.{ts,tsx}'],
exclude: vitestConfig.exclude,
},
});

24
packages/modules/example/.gitignore vendored Normal file
View file

@ -0,0 +1,24 @@
# Logs
logs
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*
pnpm-debug.log*
lerna-debug.log*
node_modules
dist
dist-ssr
*.local
# Editor directories and files
.vscode/*
!.vscode/extensions.json
.idea
.DS_Store
*.suo
*.ntvs*
*.njsproj
*.sln
*.sw?

View file

@ -0,0 +1 @@
See LICENSE.md in the root of this repository for more information.

View file

@ -0,0 +1,3 @@
# @n8n/module-front-end
@TODO: Write a description here

View file

@ -0,0 +1,13 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<link rel="icon" type="image/svg+xml" href="/vite.svg" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Vite + Vue + TS</title>
</head>
<body>
<div id="app"></div>
<script type="module" src="/src/main.ts"></script>
</body>
</html>

View file

@ -0,0 +1,40 @@
{
"name": "@n8n/module-example",
"version": "0.0.0",
"type": "module",
"files": [
"dist",
"LICENSE",
"README.md"
],
"types": "./dist/n8n-module-example.d.ts",
"main": "./dist/n8n-module-example.umd.cjs",
"module": "./dist/n8n-module-example.js",
"exports": {
".": {
"types": "./dist/n8n-module-example.d.ts",
"import": "./dist/n8n-module-example.js",
"require": "./dist/n8n-module-example.umd.cjs"
},
"./*": "./*"
},
"scripts": {
"dev": "vite",
"build": "vue-tsc -b && vite build",
"preview": "vite preview"
},
"peerDependencies": {
"vue": "catalog:frontend"
},
"dependencies": {
"@n8n/module-common": "workspace:*"
},
"devDependencies": {
"@vitejs/plugin-vue": "catalog:frontend",
"@vue/tsconfig": "catalog:frontend",
"typescript": "~5.6.2",
"vite": "catalog:frontend",
"vue": "catalog:frontend",
"vue-tsc": "catalog:frontend"
}
}

View file

@ -0,0 +1,9 @@
import { defineFrontEndModule } from '@n8n/module-common';
export const frontEndModule = defineFrontEndModule({
name: 'example',
setup: (context) => {
console.log('registered example', context);
// defineRoutes([]);
},
});

View file

@ -0,0 +1 @@
/// <reference types="vite/client" />

View file

@ -0,0 +1 @@
export * from './frontend';

View file

@ -0,0 +1,15 @@
{
"extends": "@vue/tsconfig/tsconfig.dom.json",
"compilerOptions": {
"tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo",
"paths": {
"@n8n/module-common*": ["../common/src*"]
},
"strict": true,
"noUnusedLocals": true,
"noUnusedParameters": true,
"noFallthroughCasesInSwitch": true,
"noUncheckedSideEffectImports": true
},
"include": ["src/frontend/**/*.ts", "src/frontend/**/*.tsx", "src/frontend/**/*.vue"]
}

View file

@ -0,0 +1,4 @@
{
"files": ["./src/index.ts"],
"references": [{ "path": "./tsconfig.frontend.json" }, { "path": "./tsconfig.vite.json" }]
}

View file

@ -0,0 +1,20 @@
{
"compilerOptions": {
"tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo",
"target": "ES2022",
"lib": ["ES2023"],
"module": "ESNext",
"skipLibCheck": true,
"moduleResolution": "bundler",
"allowImportingTsExtensions": true,
"isolatedModules": true,
"moduleDetection": "force",
"noEmit": true,
"strict": true,
"noUnusedLocals": true,
"noUnusedParameters": true,
"noFallthroughCasesInSwitch": true,
"noUncheckedSideEffectImports": true
},
"include": ["vite.config.ts"]
}

View file

@ -0,0 +1,33 @@
import { resolve } from 'path';
import { defineConfig } from 'vite';
import vue from '@vitejs/plugin-vue';
import dts from 'vite-plugin-dts';
import { configDefaults as vitestConfig } from 'vitest/config';
const cwd = process.cwd();
export default defineConfig({
plugins: [vue(), dts({ rollupTypes: true })],
build: {
lib: {
entry: resolve(cwd, 'src', 'index.ts'),
name: 'n8nModuleExample',
fileName: 'n8n-module-example',
},
rollupOptions: {
external: ['vue'],
output: {
globals: {
vue: 'Vue',
},
},
},
},
test: {
globals: true,
environment: 'jsdom',
setupFiles: ['src/__tests__/setup.ts'],
include: ['src/**/*.spec.{ts,tsx}'],
exclude: vitestConfig.exclude,
},
});

View file

@ -85,6 +85,9 @@ catalogs:
'@vitest/coverage-v8':
specifier: ^3.0.2
version: 3.0.2
'@vue/tsconfig':
specifier: ^0.7.0
version: 0.7.0
highlight.js:
specifier: ^11.8.0
version: 11.9.0
@ -1429,6 +1432,12 @@ importers:
'@n8n/codemirror-lang-sql':
specifier: ^1.0.2
version: 1.0.2(@codemirror/view@6.26.3)(@lezer/common@1.1.0)
'@n8n/module-common':
specifier: workspace:*
version: link:../modules/common
'@n8n/module-example':
specifier: workspace:*
version: link:../modules/example
'@n8n/permissions':
specifier: workspace:*
version: link:../@n8n/permissions
@ -1647,6 +1656,55 @@ importers:
specifier: ^2.1.10
version: 2.1.10(patch_hash=z2iuqlt7ype4qnrwd5eymeecl4)(typescript@5.7.2)
packages/modules/common:
devDependencies:
'@vitejs/plugin-vue':
specifier: catalog:frontend
version: 5.2.1(vite@6.0.2(@types/node@18.16.16)(jiti@1.21.0)(sass@1.64.1)(terser@5.16.1))(vue@3.5.13(typescript@5.7.2))
'@vue/tsconfig':
specifier: catalog:frontend
version: 0.7.0(typescript@5.7.2)(vue@3.5.13(typescript@5.7.2))
typescript:
specifier: ^5.7.2
version: 5.7.2
vite:
specifier: catalog:frontend
version: 6.0.2(@types/node@18.16.16)(jiti@1.21.0)(sass@1.64.1)(terser@5.16.1)
vue:
specifier: catalog:frontend
version: 3.5.13(typescript@5.7.2)
vue-router:
specifier: catalog:frontend
version: 4.5.0(vue@3.5.13(typescript@5.7.2))
vue-tsc:
specifier: ^2.1.10
version: 2.1.10(patch_hash=z2iuqlt7ype4qnrwd5eymeecl4)(typescript@5.7.2)
packages/modules/example:
dependencies:
'@n8n/module-common':
specifier: workspace:*
version: link:../common
devDependencies:
'@vitejs/plugin-vue':
specifier: catalog:frontend
version: 5.2.1(vite@6.0.2(@types/node@18.16.16)(jiti@1.21.0)(sass@1.64.1)(terser@5.16.1))(vue@3.5.13(typescript@5.7.2))
'@vue/tsconfig':
specifier: catalog:frontend
version: 0.7.0(typescript@5.7.2)(vue@3.5.13(typescript@5.7.2))
typescript:
specifier: ^5.7.2
version: 5.7.2
vite:
specifier: catalog:frontend
version: 6.0.2(@types/node@18.16.16)(jiti@1.21.0)(sass@1.64.1)(terser@5.16.1)
vue:
specifier: catalog:frontend
version: 3.5.13(typescript@5.7.2)
vue-tsc:
specifier: ^2.1.10
version: 2.1.10(patch_hash=z2iuqlt7ype4qnrwd5eymeecl4)(typescript@5.7.2)
packages/node-dev:
dependencies:
'@n8n/di':
@ -2534,10 +2592,6 @@ packages:
resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==}
engines: {node: '>=6.9.0'}
'@babel/helper-string-parser@7.24.8':
resolution: {integrity: sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==}
engines: {node: '>=6.9.0'}
'@babel/helper-string-parser@7.25.9':
resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==}
engines: {node: '>=6.9.0'}
@ -2546,10 +2600,6 @@ packages:
resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==}
engines: {node: '>=6.9.0'}
'@babel/helper-validator-identifier@7.24.7':
resolution: {integrity: sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==}
engines: {node: '>=6.9.0'}
'@babel/helper-validator-identifier@7.25.9':
resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==}
engines: {node: '>=6.9.0'}
@ -2578,16 +2628,6 @@ packages:
resolution: {integrity: sha512-2YnuOp4HAk2BsBrJJvYCbItHx0zWscI1C3zgWkz+wDyD9I7GIVrfnLyrR4Y1VR+7p+chAEcrgRQYZAGIKMV7vQ==}
engines: {node: '>=6.9.0'}
'@babel/parser@7.25.6':
resolution: {integrity: sha512-trGdfBdbD0l1ZPmcJ83eNxB9rbEax4ALFTF7fN386TMYbeCQbyme5cOEXQhbGXKebwGaB/J52w1mrklMcbgy6Q==}
engines: {node: '>=6.0.0'}
hasBin: true
'@babel/parser@7.26.2':
resolution: {integrity: sha512-DWMCZH9WA4Maitz2q21SRKHo9QXZxkDsbNZoVD62gusNtNBBqDg9i7uOhASfTfIGNzW+O+r7+jAlM8dwphcJKQ==}
engines: {node: '>=6.0.0'}
hasBin: true
'@babel/parser@7.26.3':
resolution: {integrity: sha512-WJ/CvmY8Mea8iDXo6a7RK2wbmJITT5fN3BEkRuFlxVyNx8jOKIIhmC4fSkTcPcf8JyavbBwIe6OpiCOBXt/IcA==}
engines: {node: '>=6.0.0'}
@ -3051,14 +3091,6 @@ packages:
resolution: {integrity: sha512-yTmc8J+Sj8yLzwr4PD5Xb/WF3bOYu2C2OoSZPzbuqRm4n98XirsbzaX+GloeO376UnSYIYJ4NCanwV5/ugZkwA==}
engines: {node: '>=6.9.0'}
'@babel/types@7.25.6':
resolution: {integrity: sha512-/l42B1qxpG6RdfYf343Uw1vmDjeNhneUXtzhojE7pDgfpEypmRhI6j1kr17XCVv4Cgl9HdAiQY2x0GwKm7rWCw==}
engines: {node: '>=6.9.0'}
'@babel/types@7.26.0':
resolution: {integrity: sha512-Z/yiTPj+lDVnF7lWeKCIJzaIkI0vYO87dMpZ4bg4TDrFe4XXLFWL1TbXU27gBP3QccxV9mZICCrnjnYlJjXHOA==}
engines: {node: '>=6.9.0'}
'@babel/types@7.26.3':
resolution: {integrity: sha512-vN5p+1kl59GVKMvTHt55NzzmYVxprfJD+ql7U9NFIfKCBkYE55LYtS+WtPlaYOyzydrKI8Nezd+aZextrd+FMA==}
engines: {node: '>=6.9.0'}
@ -6371,6 +6403,17 @@ packages:
'@vue/test-utils@2.4.6':
resolution: {integrity: sha512-FMxEjOpYNYiFe0GkaHsnJPXFHxQ6m4t8vI/ElPGpMWxZKpmRvQ33OIrvRXemy6yha03RxhOlQuy+gZMC3CQSow==}
'@vue/tsconfig@0.7.0':
resolution: {integrity: sha512-ku2uNz5MaZ9IerPPUyOHzyjhXoX2kVJaVf7hL315DC17vS6IiZRmmCPfggNbU16QTvM80+uYYy3eYJB59WCtvg==}
peerDependencies:
typescript: ^5.7.2
vue: ^3.4.0
peerDependenciesMeta:
typescript:
optional: true
vue:
optional: true
'@vueuse/components@10.11.0':
resolution: {integrity: sha512-ZvLZI23d5ZAtva5fGyYh/jQtZO8l+zJ5tAXyYNqHJZkq1o5yWyqZhENvSv5mfDmN5IuAOp4tq02mRmX/ipFGcg==}
@ -12603,10 +12646,6 @@ packages:
tmpl@1.0.5:
resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==}
to-fast-properties@2.0.0:
resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==}
engines: {node: '>=4'}
to-regex-range@5.0.1:
resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==}
engines: {node: '>=8.0'}
@ -14793,10 +14832,10 @@ snapshots:
'@babel/helper-compilation-targets': 7.25.9
'@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.0)
'@babel/helpers': 7.26.0
'@babel/parser': 7.26.2
'@babel/parser': 7.26.3
'@babel/template': 7.25.9
'@babel/traverse': 7.26.3
'@babel/types': 7.26.0
'@babel/types': 7.26.3
convert-source-map: 2.0.0
debug: 4.3.7
gensync: 1.0.0-beta.2
@ -14829,7 +14868,7 @@ snapshots:
'@babel/helper-annotate-as-pure@7.25.9':
dependencies:
'@babel/types': 7.26.0
'@babel/types': 7.26.3
'@babel/helper-compilation-targets@7.23.6':
dependencies:
@ -14903,7 +14942,7 @@ snapshots:
'@babel/helper-module-imports@7.25.9':
dependencies:
'@babel/traverse': 7.26.3
'@babel/types': 7.26.0
'@babel/types': 7.26.3
transitivePeerDependencies:
- supports-color
@ -14958,7 +14997,7 @@ snapshots:
'@babel/helper-skip-transparent-expression-wrappers@7.25.9':
dependencies:
'@babel/traverse': 7.26.3
'@babel/types': 7.26.0
'@babel/types': 7.26.3
transitivePeerDependencies:
- supports-color
@ -14966,14 +15005,10 @@ snapshots:
dependencies:
'@babel/types': 7.26.3
'@babel/helper-string-parser@7.24.8': {}
'@babel/helper-string-parser@7.25.9': {}
'@babel/helper-validator-identifier@7.22.20': {}
'@babel/helper-validator-identifier@7.24.7': {}
'@babel/helper-validator-identifier@7.25.9': {}
'@babel/helper-validator-option@7.23.5': {}
@ -15003,19 +15038,11 @@ snapshots:
'@babel/highlight@7.24.6':
dependencies:
'@babel/helper-validator-identifier': 7.24.7
'@babel/helper-validator-identifier': 7.25.9
chalk: 2.4.2
js-tokens: 4.0.0
picocolors: 1.1.1
'@babel/parser@7.25.6':
dependencies:
'@babel/types': 7.25.6
'@babel/parser@7.26.2':
dependencies:
'@babel/types': 7.26.3
'@babel/parser@7.26.3':
dependencies:
'@babel/types': 7.26.3
@ -15543,7 +15570,7 @@ snapshots:
dependencies:
'@babel/core': 7.26.0
'@babel/helper-plugin-utils': 7.25.9
'@babel/types': 7.26.0
'@babel/types': 7.26.3
esutils: 2.0.3
'@babel/runtime@7.24.7':
@ -15589,17 +15616,6 @@ snapshots:
transitivePeerDependencies:
- supports-color
'@babel/types@7.25.6':
dependencies:
'@babel/helper-string-parser': 7.24.8
'@babel/helper-validator-identifier': 7.24.7
to-fast-properties: 2.0.0
'@babel/types@7.26.0':
dependencies:
'@babel/helper-string-parser': 7.25.9
'@babel/helper-validator-identifier': 7.25.9
'@babel/types@7.26.3':
dependencies:
'@babel/helper-string-parser': 7.25.9
@ -19384,7 +19400,7 @@ snapshots:
'@vue/compiler-core@3.5.13':
dependencies:
'@babel/parser': 7.25.6
'@babel/parser': 7.26.3
'@vue/shared': 3.5.13
entities: 4.5.0
estree-walker: 2.0.2
@ -19403,7 +19419,7 @@ snapshots:
'@vue/compiler-ssr': 3.5.13
'@vue/shared': 3.5.13
estree-walker: 2.0.2
magic-string: 0.30.14
magic-string: 0.30.17
postcss: 8.4.49
source-map-js: 1.2.1
@ -19488,6 +19504,11 @@ snapshots:
js-beautify: 1.14.9
vue-component-type-helpers: 2.2.0
'@vue/tsconfig@0.7.0(typescript@5.7.2)(vue@3.5.13(typescript@5.7.2))':
optionalDependencies:
typescript: 5.7.2
vue: 3.5.13(typescript@5.7.2)
'@vueuse/components@10.11.0(vue@3.5.13(typescript@5.7.2))':
dependencies:
'@vueuse/core': 10.11.0(vue@3.5.13(typescript@5.7.2))
@ -23486,7 +23507,7 @@ snapshots:
'@babel/generator': 7.22.9
'@babel/plugin-syntax-jsx': 7.18.6(@babel/core@7.24.0)
'@babel/plugin-syntax-typescript': 7.20.0(@babel/core@7.24.0)
'@babel/types': 7.25.6
'@babel/types': 7.26.3
'@jest/expect-utils': 29.6.2
'@jest/transform': 29.6.2
'@jest/types': 29.6.1
@ -27257,8 +27278,6 @@ snapshots:
tmpl@1.0.5: {}
to-fast-properties@2.0.0: {}
to-regex-range@5.0.1:
dependencies:
is-number: 7.0.0

View file

@ -1,5 +1,6 @@
packages:
- packages/*
- packages/modules/**/*
- packages/@n8n/*
- packages/@n8n_io/*
- cypress
@ -34,6 +35,7 @@ catalogs:
frontend:
'@vitest/coverage-v8': ^3.0.2
'@vitejs/plugin-vue': ^5.2.1
'@vue/tsconfig': ^0.7.0
'@sentry/vue': ^8.33.1
vite: ^6.0.2
vitest: ^3.0.2