From 4594f22b3b4c2fe587eb7e242ab72596dd96662c Mon Sep 17 00:00:00 2001 From: Yordis Prieto Date: Tue, 28 May 2024 11:24:12 -0400 Subject: [PATCH] feat: add @zitadel/node pkg --- packages/zitadel-client2/package.json | 2 +- packages/zitadel-node/.eslintrc.cjs | 5 +++ packages/zitadel-node/package.json | 42 +++++++++++++++++++ packages/zitadel-node/src/index.ts | 35 ++++++++++++++++ packages/zitadel-node/tsconfig.json | 5 +++ packages/zitadel-node/tsup.config.ts | 13 ++++++ packages/zitadel-node/turbo.json | 11 +++++ pnpm-lock.yaml | 59 +++++++++++++++++++++++++-- 8 files changed, 167 insertions(+), 5 deletions(-) create mode 100644 packages/zitadel-node/.eslintrc.cjs create mode 100644 packages/zitadel-node/package.json create mode 100644 packages/zitadel-node/src/index.ts create mode 100644 packages/zitadel-node/tsconfig.json create mode 100644 packages/zitadel-node/tsup.config.ts create mode 100644 packages/zitadel-node/turbo.json diff --git a/packages/zitadel-client2/package.json b/packages/zitadel-client2/package.json index 98770c1b..e82cf2e4 100644 --- a/packages/zitadel-client2/package.json +++ b/packages/zitadel-client2/package.json @@ -45,7 +45,7 @@ }, "dependencies": { "@zitadel/proto": "workspace:*", - "@bufbuild/protobuf": "^1.8.0", + "@bufbuild/protobuf": "^1.9.0", "@connectrpc/connect": "^1.4.0" }, "devDependencies": { diff --git a/packages/zitadel-node/.eslintrc.cjs b/packages/zitadel-node/.eslintrc.cjs new file mode 100644 index 00000000..51720b7c --- /dev/null +++ b/packages/zitadel-node/.eslintrc.cjs @@ -0,0 +1,5 @@ +module.exports = { + root: true, + // TODO: React is not used in the server package + extends: ["zitadel"], +}; diff --git a/packages/zitadel-node/package.json b/packages/zitadel-node/package.json new file mode 100644 index 00000000..6ed0d04e --- /dev/null +++ b/packages/zitadel-node/package.json @@ -0,0 +1,42 @@ +{ + "name": "@zitadel/node", + "version": "0.0.0", + "type": "module", + "sideEffects": false, + "license": "MIT", + "exports": { + ".": { + "import": "./dist/index.js", + "require": "./dist/index.cjs", + "types": "./dist/index.d.ts" + } + }, + "files": [ + "dist/**" + ], + "publishConfig": { + "access": "public" + }, + "scripts": { + "build": "tsup", + "test": "pnpm test:unit", + "test:watch": "pnpm test:unit:watch", + "test:unit": "vitest", + "test:unit:watch": "vitest --watch", + "dev": "tsup --watch", + "lint": "eslint \"src/**/*.ts*\"", + "clean": "rm -rf .turbo && rm -rf node_modules && rm -rf dist && rm -rf src/proto" + }, + "peerDependencies": { + "@zitadel/client2": "workspace:*" + }, + "dependencies": { + "@connectrpc/connect-node": "^1.4.0", + "jose": "^5.3.0" + }, + "devDependencies": { + "@zitadel/client2": "workspace:*", + "@zitadel/tsconfig": "workspace:*", + "eslint-config-zitadel": "workspace:*" + } +} diff --git a/packages/zitadel-node/src/index.ts b/packages/zitadel-node/src/index.ts new file mode 100644 index 00000000..99bd262f --- /dev/null +++ b/packages/zitadel-node/src/index.ts @@ -0,0 +1,35 @@ +import { NewAuthorizationBearerInterceptor } from "@zitadel/client2"; +import { + createGrpcWebTransport, + GrpcTransportOptions, +} from "@connectrpc/connect-node"; +import { importPKCS8, SignJWT } from "jose"; + +/** + * Create a server transport with the given token and configuration options. + * @param token + * @param opts + */ +export function createServerTransport( + token: string, + opts: GrpcTransportOptions, +) { + return createGrpcWebTransport({ + ...opts, + interceptors: [ + ...(opts.interceptors || []), + NewAuthorizationBearerInterceptor(token), + ], + }); +} + +export async function newSystemToken() { + return await new SignJWT({}) + .setProtectedHeader({ alg: "RS256" }) + .setIssuedAt() + .setExpirationTime("1h") + .setIssuer(process.env.ZITADEL_SYSTEM_API_USERID ?? "") + .setSubject(process.env.ZITADEL_SYSTEM_API_USERID ?? "") + .setAudience(process.env.ZITADEL_ISSUER ?? "") + .sign(await importPKCS8(process.env.ZITADEL_SYSTEM_API_KEY ?? "", "RS256")); +} diff --git a/packages/zitadel-node/tsconfig.json b/packages/zitadel-node/tsconfig.json new file mode 100644 index 00000000..5f0ea691 --- /dev/null +++ b/packages/zitadel-node/tsconfig.json @@ -0,0 +1,5 @@ +{ + "extends": "@zitadel/tsconfig/tsup.json", + "include": ["./src/**/*"], + "exclude": ["dist", "build", "node_modules"] +} diff --git a/packages/zitadel-node/tsup.config.ts b/packages/zitadel-node/tsup.config.ts new file mode 100644 index 00000000..b978211b --- /dev/null +++ b/packages/zitadel-node/tsup.config.ts @@ -0,0 +1,13 @@ +import { defineConfig, Options } from "tsup"; + +export default defineConfig((options: Options) => ({ + treeshake: false, + splitting: true, + entry: ["src/index.ts"], + format: ["esm", "cjs"], + dts: true, + minify: false, + clean: true, + sourcemap: true, + ...options, +})); diff --git a/packages/zitadel-node/turbo.json b/packages/zitadel-node/turbo.json new file mode 100644 index 00000000..0b70bfa8 --- /dev/null +++ b/packages/zitadel-node/turbo.json @@ -0,0 +1,11 @@ +{ + "extends": [ + "//" + ], + "pipeline": { + "build": { + "outputs": ["dist/**"], + "dependsOn": ["@zitadel/client2#build"] + } + } +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 51e52a69..a7fda764 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -239,7 +239,7 @@ importers: packages/zitadel-client2: dependencies: '@bufbuild/protobuf': - specifier: ^1.8.0 + specifier: ^1.9.0 version: 1.9.0 '@connectrpc/connect': specifier: ^1.4.0 @@ -289,6 +289,25 @@ importers: specifier: workspace:* version: link:../zitadel-tailwind-config + packages/zitadel-node: + dependencies: + '@connectrpc/connect-node': + specifier: ^1.4.0 + version: 1.4.0(@bufbuild/protobuf@1.9.0)(@connectrpc/connect@1.4.0(@bufbuild/protobuf@1.9.0)) + jose: + specifier: ^5.3.0 + version: 5.3.0 + devDependencies: + '@zitadel/client2': + specifier: workspace:* + version: link:../zitadel-client2 + '@zitadel/tsconfig': + specifier: workspace:* + version: link:../zitadel-tsconfig + eslint-config-zitadel: + specifier: workspace:* + version: link:../eslint-config-zitadel + packages/zitadel-prettier-config: {} packages/zitadel-proto: @@ -672,6 +691,13 @@ packages: resolution: {integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==, tarball: https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz} engines: {node: '>=0.1.90'} + '@connectrpc/connect-node@1.4.0': + resolution: {integrity: sha512-0ANnrr6SvsjevsWEgdzHy7BaHkluZyS6s4xNoVt7RBHFR5V/kT9lPokoIbYUOU9JHzdRgTaS3x5595mwUsu15g==, tarball: https://registry.npmjs.org/@connectrpc/connect-node/-/connect-node-1.4.0.tgz} + engines: {node: '>=16.0.0'} + peerDependencies: + '@bufbuild/protobuf': ^1.4.2 + '@connectrpc/connect': 1.4.0 + '@connectrpc/connect@1.4.0': resolution: {integrity: sha512-vZeOkKaAjyV4+RH3+rJZIfDFJAfr+7fyYr6sLDKbYX3uuTVszhFe9/YKf5DNqrDb5cKdKVlYkGn6DTDqMitAnA==, tarball: https://registry.npmjs.org/@connectrpc/connect/-/connect-1.4.0.tgz} peerDependencies: @@ -978,6 +1004,10 @@ packages: resolution: {integrity: sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==, tarball: https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@fastify/busboy@2.1.1': + resolution: {integrity: sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==, tarball: https://registry.npmjs.org/@fastify/busboy/-/busboy-2.1.1.tgz} + engines: {node: '>=14'} + '@grpc/grpc-js@1.8.13': resolution: {integrity: sha512-iY3jsdfbc0ARoCLFvbvUB8optgyb0r1XLPb142u+QtgBcKJYkCIFt3Fd/881KqjLYWjsBJF57N3b8Eop9NDfUA==} engines: {node: ^8.13.0 || >=10.10.0} @@ -1052,7 +1082,7 @@ packages: resolution: {integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==, tarball: https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz} '@jridgewell/sourcemap-codec@1.4.15': - resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==, tarball: https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz} '@jridgewell/trace-mapping@0.3.18': resolution: {integrity: sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==, tarball: https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz} @@ -3063,6 +3093,9 @@ packages: jose@4.13.1: resolution: {integrity: sha512-MSJQC5vXco5Br38mzaQKiq9mwt7lwj2eXpgpRyQYNHYt2lq1PjkWa7DLXX0WVcQLE9HhMh3jPiufS7fhJf+CLQ==} + jose@5.3.0: + resolution: {integrity: sha512-IChe9AtAE79ru084ow8jzkN2lNrG3Ntfiv65Cvj9uOCE2m5LNsdHG+9EbxWxAoWRF9TgDOqLN5jm08++owDVRg==, tarball: https://registry.npmjs.org/jose/-/jose-5.3.0.tgz} + joycon@3.1.1: resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} engines: {node: '>=10'} @@ -3591,7 +3624,7 @@ packages: engines: {node: '>=6'} p-limit@3.1.0: - resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==, tarball: https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz} engines: {node: '>=10'} p-limit@5.0.0: @@ -4557,7 +4590,7 @@ packages: engines: {node: '>= 0.8.0'} type-detect@4.0.8: - resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} + resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==, tarball: https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz} engines: {node: '>=4'} type-fest@0.13.1: @@ -4629,6 +4662,10 @@ packages: undefsafe@2.0.5: resolution: {integrity: sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==} + undici@5.28.4: + resolution: {integrity: sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g==, tarball: https://registry.npmjs.org/undici/-/undici-5.28.4.tgz} + engines: {node: '>=14.0'} + universalify@0.1.2: resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} engines: {node: '>= 4.0.0'} @@ -5317,6 +5354,12 @@ snapshots: '@colors/colors@1.5.0': optional: true + '@connectrpc/connect-node@1.4.0(@bufbuild/protobuf@1.9.0)(@connectrpc/connect@1.4.0(@bufbuild/protobuf@1.9.0))': + dependencies: + '@bufbuild/protobuf': 1.9.0 + '@connectrpc/connect': 1.4.0(@bufbuild/protobuf@1.9.0) + undici: 5.28.4 + '@connectrpc/connect@1.4.0(@bufbuild/protobuf@1.9.0)': dependencies: '@bufbuild/protobuf': 1.9.0 @@ -5510,6 +5553,8 @@ snapshots: '@eslint/js@8.57.0': {} + '@fastify/busboy@2.1.1': {} + '@grpc/grpc-js@1.8.13': dependencies: '@grpc/proto-loader': 0.7.6 @@ -7953,6 +7998,8 @@ snapshots: jose@4.13.1: {} + jose@5.3.0: {} + joycon@3.1.1: {} js-base64@3.7.5: {} @@ -9745,6 +9792,10 @@ snapshots: undefsafe@2.0.5: {} + undici@5.28.4: + dependencies: + '@fastify/busboy': 2.1.1 + universalify@0.1.2: {} universalify@0.2.0: {}