From d6331195b80c6b279c9fee6ae9bfcddb3b3744a9 Mon Sep 17 00:00:00 2001 From: Alex Grozav Date: Mon, 31 Mar 2025 16:13:42 +0300 Subject: [PATCH] feat: Add `@n8n/extension-sdk` package (no-changelog) (#14291) --- packages/@n8n/extension-sdk/.gitignore | 24 +++++ packages/@n8n/extension-sdk/LICENSE | 1 + packages/@n8n/extension-sdk/README.md | 1 + packages/@n8n/extension-sdk/package.json | 46 ++++++++++ .../@n8n/extension-sdk/src/backend/define.ts | 5 ++ .../@n8n/extension-sdk/src/backend/index.ts | 2 + .../@n8n/extension-sdk/src/backend/types.ts | 7 ++ .../@n8n/extension-sdk/src/frontend/define.ts | 5 ++ .../@n8n/extension-sdk/src/frontend/index.ts | 2 + .../@n8n/extension-sdk/src/frontend/types.ts | 13 +++ packages/@n8n/extension-sdk/src/index.ts | 0 packages/@n8n/extension-sdk/src/shims.d.ts | 1 + .../@n8n/extension-sdk/tsconfig.backend.json | 7 ++ .../@n8n/extension-sdk/tsconfig.frontend.json | 7 ++ packages/@n8n/extension-sdk/tsconfig.json | 4 + packages/@n8n/extension-sdk/tsup.config.ts | 32 +++++++ pnpm-lock.yaml | 87 ++++++++++++++++++- pnpm-workspace.yaml | 1 + 18 files changed, 244 insertions(+), 1 deletion(-) create mode 100644 packages/@n8n/extension-sdk/.gitignore create mode 100644 packages/@n8n/extension-sdk/LICENSE create mode 100644 packages/@n8n/extension-sdk/README.md create mode 100644 packages/@n8n/extension-sdk/package.json create mode 100644 packages/@n8n/extension-sdk/src/backend/define.ts create mode 100644 packages/@n8n/extension-sdk/src/backend/index.ts create mode 100644 packages/@n8n/extension-sdk/src/backend/types.ts create mode 100644 packages/@n8n/extension-sdk/src/frontend/define.ts create mode 100644 packages/@n8n/extension-sdk/src/frontend/index.ts create mode 100644 packages/@n8n/extension-sdk/src/frontend/types.ts create mode 100644 packages/@n8n/extension-sdk/src/index.ts create mode 100644 packages/@n8n/extension-sdk/src/shims.d.ts create mode 100644 packages/@n8n/extension-sdk/tsconfig.backend.json create mode 100644 packages/@n8n/extension-sdk/tsconfig.frontend.json create mode 100644 packages/@n8n/extension-sdk/tsconfig.json create mode 100644 packages/@n8n/extension-sdk/tsup.config.ts diff --git a/packages/@n8n/extension-sdk/.gitignore b/packages/@n8n/extension-sdk/.gitignore new file mode 100644 index 0000000000..a547bf36d8 --- /dev/null +++ b/packages/@n8n/extension-sdk/.gitignore @@ -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? diff --git a/packages/@n8n/extension-sdk/LICENSE b/packages/@n8n/extension-sdk/LICENSE new file mode 100644 index 0000000000..54129160b9 --- /dev/null +++ b/packages/@n8n/extension-sdk/LICENSE @@ -0,0 +1 @@ +See LICENSE.md in the root of this repository for more information. diff --git a/packages/@n8n/extension-sdk/README.md b/packages/@n8n/extension-sdk/README.md new file mode 100644 index 0000000000..866d1153e9 --- /dev/null +++ b/packages/@n8n/extension-sdk/README.md @@ -0,0 +1 @@ +# @n8n/plugin-sdk diff --git a/packages/@n8n/extension-sdk/package.json b/packages/@n8n/extension-sdk/package.json new file mode 100644 index 0000000000..cba09a6a22 --- /dev/null +++ b/packages/@n8n/extension-sdk/package.json @@ -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/" +} diff --git a/packages/@n8n/extension-sdk/src/backend/define.ts b/packages/@n8n/extension-sdk/src/backend/define.ts new file mode 100644 index 0000000000..e55d3605fe --- /dev/null +++ b/packages/@n8n/extension-sdk/src/backend/define.ts @@ -0,0 +1,5 @@ +import type { BackendModule } from './types.ts'; + +export function defineBackendModule(module: BackendModule): BackendModule { + return module; +} diff --git a/packages/@n8n/extension-sdk/src/backend/index.ts b/packages/@n8n/extension-sdk/src/backend/index.ts new file mode 100644 index 0000000000..73af88fb2b --- /dev/null +++ b/packages/@n8n/extension-sdk/src/backend/index.ts @@ -0,0 +1,2 @@ +export * from './define'; +export * from './types'; diff --git a/packages/@n8n/extension-sdk/src/backend/types.ts b/packages/@n8n/extension-sdk/src/backend/types.ts new file mode 100644 index 0000000000..48eceeb7db --- /dev/null +++ b/packages/@n8n/extension-sdk/src/backend/types.ts @@ -0,0 +1,7 @@ +export type BackendModuleContext = {}; + +export type BackendModuleSetupFn = (context: BackendModule) => void; + +export type BackendModule = { + setup: BackendModuleSetupFn; +}; diff --git a/packages/@n8n/extension-sdk/src/frontend/define.ts b/packages/@n8n/extension-sdk/src/frontend/define.ts new file mode 100644 index 0000000000..c88169560f --- /dev/null +++ b/packages/@n8n/extension-sdk/src/frontend/define.ts @@ -0,0 +1,5 @@ +import type { FrontendModule } from './types.ts'; + +export function defineFrontendModule(module: FrontendModule): FrontendModule { + return module; +} diff --git a/packages/@n8n/extension-sdk/src/frontend/index.ts b/packages/@n8n/extension-sdk/src/frontend/index.ts new file mode 100644 index 0000000000..73af88fb2b --- /dev/null +++ b/packages/@n8n/extension-sdk/src/frontend/index.ts @@ -0,0 +1,2 @@ +export * from './define'; +export * from './types'; diff --git a/packages/@n8n/extension-sdk/src/frontend/types.ts b/packages/@n8n/extension-sdk/src/frontend/types.ts new file mode 100644 index 0000000000..d5e8f7a32b --- /dev/null +++ b/packages/@n8n/extension-sdk/src/frontend/types.ts @@ -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; +}; diff --git a/packages/@n8n/extension-sdk/src/index.ts b/packages/@n8n/extension-sdk/src/index.ts new file mode 100644 index 0000000000..e69de29bb2 diff --git a/packages/@n8n/extension-sdk/src/shims.d.ts b/packages/@n8n/extension-sdk/src/shims.d.ts new file mode 100644 index 0000000000..11f02fe2a0 --- /dev/null +++ b/packages/@n8n/extension-sdk/src/shims.d.ts @@ -0,0 +1 @@ +/// diff --git a/packages/@n8n/extension-sdk/tsconfig.backend.json b/packages/@n8n/extension-sdk/tsconfig.backend.json new file mode 100644 index 0000000000..1258e5fd84 --- /dev/null +++ b/packages/@n8n/extension-sdk/tsconfig.backend.json @@ -0,0 +1,7 @@ +{ + "extends": "@n8n/typescript-config/tsconfig.common.json", + "compilerOptions": { + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.backend.tsbuildinfo" + }, + "include": ["src/backend/**/*.ts"] +} diff --git a/packages/@n8n/extension-sdk/tsconfig.frontend.json b/packages/@n8n/extension-sdk/tsconfig.frontend.json new file mode 100644 index 0000000000..7c6c3f3add --- /dev/null +++ b/packages/@n8n/extension-sdk/tsconfig.frontend.json @@ -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"] +} diff --git a/packages/@n8n/extension-sdk/tsconfig.json b/packages/@n8n/extension-sdk/tsconfig.json new file mode 100644 index 0000000000..b1d8a661a9 --- /dev/null +++ b/packages/@n8n/extension-sdk/tsconfig.json @@ -0,0 +1,4 @@ +{ + "files": ["./src/index.ts"], + "references": [{ "path": "./tsconfig.backend.json" }, { "path": "./tsconfig.frontend.json" }] +} diff --git a/packages/@n8n/extension-sdk/tsup.config.ts b/packages/@n8n/extension-sdk/tsup.config.ts new file mode 100644 index 0000000000..7c0d8a58b1 --- /dev/null +++ b/packages/@n8n/extension-sdk/tsup.config.ts @@ -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', + }, +]); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a62cd485cc..0f53572e00 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -63,6 +63,9 @@ catalogs: reflect-metadata: specifier: 0.2.2 version: 0.2.2 + rimraf: + specifier: ^6.0.1 + version: 6.0.1 tsup: specifier: ^8.4.0 version: 8.4.0 @@ -444,6 +447,33 @@ importers: specifier: ^9.4.2 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: dependencies: iconv-lite: @@ -8866,6 +8896,11 @@ packages: resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} hasBin: true + glob@11.0.1: + resolution: {integrity: sha512-zrQDm8XPnYEKawJScsnM0QzobJxlT/kHOOlRTio8IH/GrmxRE5fjllkzdaHclIuNjUQTJYH2xHNIGfdpJkDJUw==} + engines: {node: 20 || >=22} + hasBin: true + glob@7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} deprecated: Glob versions prior to v9 are no longer supported @@ -9474,6 +9509,10 @@ packages: jackspeak@3.4.3: 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: resolution: {integrity: sha512-sVpxYeuAhWt0OTWITwT98oyV0GsXyMlXCF+3L1SuafBVUIr/uILGRB+NqwkzhgXKvoJpDIpQvqkUALgdmQsQxw==} engines: {node: '>=10'} @@ -10168,6 +10207,10 @@ packages: resolution: {integrity: sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==} 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: resolution: {integrity: sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==} @@ -10369,6 +10412,10 @@ packages: minimalistic-assert@1.0.1: 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: resolution: {integrity: sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==} @@ -11164,6 +11211,10 @@ packages: resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} 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: resolution: {integrity: sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w==} @@ -11981,6 +12032,11 @@ packages: engines: {node: '>=14'} hasBin: true + rimraf@6.0.1: + resolution: {integrity: sha512-9dkvaxAsk/xNXSJzMgFqqMCuFgt2+KsOFek3TMLfo8NCPfWpBmqwyNn5Y+NX56QUYfCtsyhF3ayiboEoUmJk/A==} + engines: {node: 20 || >=22} + hasBin: true + rndm@1.2.0: resolution: {integrity: sha512-fJhQQI5tLrQvYIYFpOnFinzv9dwmR7hRnUz1XqP3OJ1jIweTNOd6aTO4jwQSgcBSFUB+/KHJxuGneime+FdzOw==} @@ -19360,7 +19416,7 @@ snapshots: '@vue/shared': 3.5.13 estree-walker: 2.0.2 magic-string: 0.30.17 - postcss: 8.4.49 + postcss: 8.5.3 source-map-js: 1.2.1 '@vue/compiler-ssr@3.5.13': @@ -22323,6 +22379,15 @@ snapshots: package-json-from-dist: 1.0.0 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: dependencies: fs.realpath: 1.0.0 @@ -23046,6 +23111,10 @@ snapshots: optionalDependencies: '@pkgjs/parseargs': 0.11.0 + jackspeak@4.1.0: + dependencies: + '@isaacs/cliui': 8.0.2 + jake@10.8.5: dependencies: async: 3.2.4 @@ -23957,6 +24026,8 @@ snapshots: lru-cache@10.2.2: {} + lru-cache@11.1.0: {} + lru-cache@4.1.5: dependencies: pseudomap: 1.0.2 @@ -24155,6 +24226,10 @@ snapshots: minimalistic-assert@1.0.1: {} + minimatch@10.0.1: + dependencies: + brace-expansion: 2.0.1 + minimatch@3.0.8: dependencies: brace-expansion: 1.1.11 @@ -25225,6 +25300,11 @@ snapshots: lru-cache: 10.2.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@8.2.0: {} @@ -26116,6 +26196,11 @@ snapshots: dependencies: glob: 10.3.3 + rimraf@6.0.1: + dependencies: + glob: 11.0.1 + package-json-from-dist: 1.0.0 + rndm@1.2.0: {} rollup@4.35.0: diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index ab6741d366..8e083b85f9 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -24,6 +24,7 @@ catalog: nanoid: 3.3.8 picocolors: 1.0.1 reflect-metadata: 0.2.2 + rimraf: ^6.0.1 tsup: ^8.4.0 uuid: 10.0.0 xml2js: 0.6.2