feat: Add @n8n/extension-sdk package (no-changelog) (#14291)

This commit is contained in:
Alex Grozav
2025-03-31 16:13:42 +03:00
committed by GitHub
parent a00cd4b2ac
commit d6331195b8
18 changed files with 244 additions and 1 deletions

24
packages/@n8n/extension-sdk/.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 @@
# @n8n/plugin-sdk

View File

@@ -0,0 +1,46 @@
{
"name": "@n8n/extension-sdk",
"version": "0.1.0",
"type": "module",
"files": [
"dist",
"LICENSE",
"README.md"
],
"exports": {
"./backend": {
"types": "./dist/backend/index.d.ts",
"import": "./dist/backend/index.js",
"require": "./dist/backend/index.cjs"
},
"./frontend": {
"types": "./dist/frontend/index.d.ts",
"import": "./dist/frontend/index.js",
"require": "./dist/frontend/index.cjs"
},
"./*": "./*"
},
"scripts": {
"clean": "rimraf dist",
"dev": "tsup --watch",
"typecheck:frontend": "vue-tsc --noEmit --project tsconfig.frontend.json",
"typecheck:backend": "tsc --noEmit --project tsconfig.backend.json",
"build": "pnpm \"/^typecheck:.+/\" && pnpm clean && tsup",
"preview": "vite preview"
},
"peerDependencies": {
"vue": "catalog:frontend",
"vue-router": "catalog:frontend"
},
"devDependencies": {
"@n8n/typescript-config": "workspace:*",
"@vitejs/plugin-vue": "catalog:frontend",
"@vue/tsconfig": "catalog:frontend",
"rimraf": "catalog:",
"vite": "catalog:frontend",
"vue": "catalog:frontend",
"vue-router": "catalog:frontend",
"vue-tsc": "catalog:frontend"
},
"license": "https://docs.n8n.io/sustainable-use-license/"
}

View File

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

View File

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

View File

@@ -0,0 +1,7 @@
export type BackendModuleContext = {};
export type BackendModuleSetupFn = (context: BackendModule) => void;
export type BackendModule = {
setup: BackendModuleSetupFn;
};

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,13 @@
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 = {
setup: FrontendModuleSetupFn;
};

View File

View File

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

View File

@@ -0,0 +1,7 @@
{
"extends": "@n8n/typescript-config/tsconfig.common.json",
"compilerOptions": {
"tsBuildInfoFile": "./node_modules/.tmp/tsconfig.backend.tsbuildinfo"
},
"include": ["src/backend/**/*.ts"]
}

View File

@@ -0,0 +1,7 @@
{
"extends": "@vue/tsconfig/tsconfig.dom.json",
"compilerOptions": {
"tsBuildInfoFile": "./node_modules/.tmp/tsconfig.frontend.tsbuildinfo"
},
"include": ["src/frontend/**/*.ts", "src/frontend/**/*.vue"]
}

View File

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

View File

@@ -0,0 +1,32 @@
import { defineConfig } from 'tsup';
export default defineConfig([
{
clean: true,
entry: [
'src/backend/**/*.ts',
'!src/backend/**/*.test.ts',
'!src/backend/**/*.d.ts',
'!src/backend/__tests__**/*',
],
outDir: 'dist/backend',
format: ['cjs', 'esm'],
dts: true,
sourcemap: true,
tsconfig: 'tsconfig.backend.json',
},
{
clean: true,
entry: [
'src/frontend/**/*.ts',
'!src/frontend/**/*.test.ts',
'!src/frontend/**/*.d.ts',
'!src/frontend/__tests__**/*',
],
outDir: 'dist/frontend',
format: ['cjs', 'esm'],
dts: true,
sourcemap: true,
tsconfig: 'tsconfig.frontend.json',
},
]);

87
pnpm-lock.yaml generated
View File

@@ -63,6 +63,9 @@ catalogs:
reflect-metadata: reflect-metadata:
specifier: 0.2.2 specifier: 0.2.2
version: 0.2.2 version: 0.2.2
rimraf:
specifier: ^6.0.1
version: 6.0.1
tsup: tsup:
specifier: ^8.4.0 specifier: ^8.4.0
version: 8.4.0 version: 8.4.0
@@ -444,6 +447,33 @@ importers:
specifier: ^9.4.2 specifier: ^9.4.2
version: 9.4.2(eslint@8.57.0) version: 9.4.2(eslint@8.57.0)
packages/@n8n/extension-sdk:
devDependencies:
'@n8n/typescript-config':
specifier: workspace:*
version: link:../typescript-config
'@vitejs/plugin-vue':
specifier: catalog:frontend
version: 5.2.1(vite@6.2.1(@types/node@18.16.16)(jiti@1.21.0)(sass@1.64.1)(terser@5.16.1))(vue@3.5.13(typescript@5.8.2))
'@vue/tsconfig':
specifier: catalog:frontend
version: 0.7.0(typescript@5.8.2)(vue@3.5.13(typescript@5.8.2))
rimraf:
specifier: 'catalog:'
version: 6.0.1
vite:
specifier: catalog:frontend
version: 6.2.1(@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.8.2)
vue-router:
specifier: catalog:frontend
version: 4.5.0(vue@3.5.13(typescript@5.8.2))
vue-tsc:
specifier: ^2.2.8
version: 2.2.8(patch_hash=e2aee939ccac8a57fe449bfd92bedd8117841579526217bc39aca26c6b8c317f)(typescript@5.8.2)
packages/@n8n/imap: packages/@n8n/imap:
dependencies: dependencies:
iconv-lite: iconv-lite:
@@ -8866,6 +8896,11 @@ packages:
resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==}
hasBin: true hasBin: true
glob@11.0.1:
resolution: {integrity: sha512-zrQDm8XPnYEKawJScsnM0QzobJxlT/kHOOlRTio8IH/GrmxRE5fjllkzdaHclIuNjUQTJYH2xHNIGfdpJkDJUw==}
engines: {node: 20 || >=22}
hasBin: true
glob@7.2.3: glob@7.2.3:
resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==}
deprecated: Glob versions prior to v9 are no longer supported deprecated: Glob versions prior to v9 are no longer supported
@@ -9474,6 +9509,10 @@ packages:
jackspeak@3.4.3: jackspeak@3.4.3:
resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==}
jackspeak@4.1.0:
resolution: {integrity: sha512-9DDdhb5j6cpeitCbvLO7n7J4IxnbM6hoF6O1g4HQ5TfhvvKN8ywDM7668ZhMHRqVmxqhps/F6syWK2KcPxYlkw==}
engines: {node: 20 || >=22}
jake@10.8.5: jake@10.8.5:
resolution: {integrity: sha512-sVpxYeuAhWt0OTWITwT98oyV0GsXyMlXCF+3L1SuafBVUIr/uILGRB+NqwkzhgXKvoJpDIpQvqkUALgdmQsQxw==} resolution: {integrity: sha512-sVpxYeuAhWt0OTWITwT98oyV0GsXyMlXCF+3L1SuafBVUIr/uILGRB+NqwkzhgXKvoJpDIpQvqkUALgdmQsQxw==}
engines: {node: '>=10'} engines: {node: '>=10'}
@@ -10168,6 +10207,10 @@ packages:
resolution: {integrity: sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==} resolution: {integrity: sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==}
engines: {node: 14 || >=16.14} engines: {node: 14 || >=16.14}
lru-cache@11.1.0:
resolution: {integrity: sha512-QIXZUBJUx+2zHUdQujWejBkcD9+cs94tLn0+YL8UrCh+D5sCXZ4c7LaEH48pNwRY3MLDgqUFyhlCyjJPf1WP0A==}
engines: {node: 20 || >=22}
lru-cache@4.1.5: lru-cache@4.1.5:
resolution: {integrity: sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==} resolution: {integrity: sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==}
@@ -10369,6 +10412,10 @@ packages:
minimalistic-assert@1.0.1: minimalistic-assert@1.0.1:
resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==}
minimatch@10.0.1:
resolution: {integrity: sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==}
engines: {node: 20 || >=22}
minimatch@3.0.8: minimatch@3.0.8:
resolution: {integrity: sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==} resolution: {integrity: sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==}
@@ -11164,6 +11211,10 @@ packages:
resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==}
engines: {node: '>=16 || 14 >=14.18'} engines: {node: '>=16 || 14 >=14.18'}
path-scurry@2.0.0:
resolution: {integrity: sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==}
engines: {node: 20 || >=22}
path-to-regexp@0.1.10: path-to-regexp@0.1.10:
resolution: {integrity: sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w==} resolution: {integrity: sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w==}
@@ -11981,6 +12032,11 @@ packages:
engines: {node: '>=14'} engines: {node: '>=14'}
hasBin: true hasBin: true
rimraf@6.0.1:
resolution: {integrity: sha512-9dkvaxAsk/xNXSJzMgFqqMCuFgt2+KsOFek3TMLfo8NCPfWpBmqwyNn5Y+NX56QUYfCtsyhF3ayiboEoUmJk/A==}
engines: {node: 20 || >=22}
hasBin: true
rndm@1.2.0: rndm@1.2.0:
resolution: {integrity: sha512-fJhQQI5tLrQvYIYFpOnFinzv9dwmR7hRnUz1XqP3OJ1jIweTNOd6aTO4jwQSgcBSFUB+/KHJxuGneime+FdzOw==} resolution: {integrity: sha512-fJhQQI5tLrQvYIYFpOnFinzv9dwmR7hRnUz1XqP3OJ1jIweTNOd6aTO4jwQSgcBSFUB+/KHJxuGneime+FdzOw==}
@@ -19360,7 +19416,7 @@ snapshots:
'@vue/shared': 3.5.13 '@vue/shared': 3.5.13
estree-walker: 2.0.2 estree-walker: 2.0.2
magic-string: 0.30.17 magic-string: 0.30.17
postcss: 8.4.49 postcss: 8.5.3
source-map-js: 1.2.1 source-map-js: 1.2.1
'@vue/compiler-ssr@3.5.13': '@vue/compiler-ssr@3.5.13':
@@ -22323,6 +22379,15 @@ snapshots:
package-json-from-dist: 1.0.0 package-json-from-dist: 1.0.0
path-scurry: 1.11.1 path-scurry: 1.11.1
glob@11.0.1:
dependencies:
foreground-child: 3.1.1
jackspeak: 4.1.0
minimatch: 10.0.1
minipass: 7.1.2
package-json-from-dist: 1.0.0
path-scurry: 2.0.0
glob@7.2.3: glob@7.2.3:
dependencies: dependencies:
fs.realpath: 1.0.0 fs.realpath: 1.0.0
@@ -23046,6 +23111,10 @@ snapshots:
optionalDependencies: optionalDependencies:
'@pkgjs/parseargs': 0.11.0 '@pkgjs/parseargs': 0.11.0
jackspeak@4.1.0:
dependencies:
'@isaacs/cliui': 8.0.2
jake@10.8.5: jake@10.8.5:
dependencies: dependencies:
async: 3.2.4 async: 3.2.4
@@ -23957,6 +24026,8 @@ snapshots:
lru-cache@10.2.2: {} lru-cache@10.2.2: {}
lru-cache@11.1.0: {}
lru-cache@4.1.5: lru-cache@4.1.5:
dependencies: dependencies:
pseudomap: 1.0.2 pseudomap: 1.0.2
@@ -24155,6 +24226,10 @@ snapshots:
minimalistic-assert@1.0.1: {} minimalistic-assert@1.0.1: {}
minimatch@10.0.1:
dependencies:
brace-expansion: 2.0.1
minimatch@3.0.8: minimatch@3.0.8:
dependencies: dependencies:
brace-expansion: 1.1.11 brace-expansion: 1.1.11
@@ -25225,6 +25300,11 @@ snapshots:
lru-cache: 10.2.2 lru-cache: 10.2.2
minipass: 7.1.2 minipass: 7.1.2
path-scurry@2.0.0:
dependencies:
lru-cache: 11.1.0
minipass: 7.1.2
path-to-regexp@0.1.10: {} path-to-regexp@0.1.10: {}
path-to-regexp@8.2.0: {} path-to-regexp@8.2.0: {}
@@ -26116,6 +26196,11 @@ snapshots:
dependencies: dependencies:
glob: 10.3.3 glob: 10.3.3
rimraf@6.0.1:
dependencies:
glob: 11.0.1
package-json-from-dist: 1.0.0
rndm@1.2.0: {} rndm@1.2.0: {}
rollup@4.35.0: rollup@4.35.0:

View File

@@ -24,6 +24,7 @@ catalog:
nanoid: 3.3.8 nanoid: 3.3.8
picocolors: 1.0.1 picocolors: 1.0.1
reflect-metadata: 0.2.2 reflect-metadata: 0.2.2
rimraf: ^6.0.1
tsup: ^8.4.0 tsup: ^8.4.0
uuid: 10.0.0 uuid: 10.0.0
xml2js: 0.6.2 xml2js: 0.6.2