diff --git a/.gitignore b/.gitignore index 27173a400..5da537591 100644 --- a/.gitignore +++ b/.gitignore @@ -182,4 +182,6 @@ dist .turbo dist -link \ No newline at end of file +link + +federation-bundle/ diff --git a/README.md b/README.md index 0d29e1abd..f55dd56c5 100644 --- a/README.md +++ b/README.md @@ -18,17 +18,13 @@ This project was created using `bun init` in bun v1.0.30. [Bun](https://bun.sh) ## Run locally with Rocket.Chat ### Run at homeserver side + ```shell -bun run build -cd packages/federation-sdk -mkdir -p ./link/ && touch ./link/yarn.lock && jq '.dependencies = {}' package.json > ./link/package.json -bun build ./src/index.ts --outfile ./link/dist/bundle.js --target node --format=cjs -e pino -e mongodb -e zod -e pino-pretty -e @rocket.chat/emitter -e reflect-metadata -e tsyringe -e tweetnacl +bun build bundle:sdk ``` ### Run at Rocket.Chat side + ```shell -yarn link ../homeserver/packages/federation-sdk/link -cd ee/packages/federation-matrix -yarn link ../../../../homeserver/packages/federation-sdk/link -yarn -``` \ No newline at end of file +yarn link ../homeserver/federation-bundle +``` diff --git a/bun.lock b/bun.lock index 7fe341e0d..c67972755 100644 --- a/bun.lock +++ b/bun.lock @@ -61,7 +61,7 @@ "reflect-metadata": "^0.2.2", "tsyringe": "^4.10.0", "tweetnacl": "^1.0.3", - "zod": "^3.22.4", + "zod": "^3.24.1", }, "peerDependencies": { "typescript": "~5.9.2", diff --git a/bundle.ts b/bundle.ts new file mode 100644 index 000000000..19ad4828c --- /dev/null +++ b/bundle.ts @@ -0,0 +1,90 @@ +import Bun, { $ } from 'bun'; + +const inputDir = './packages/federation-sdk'; +const outputDir = './federation-bundle'; + +// get dependencies from all packages +function getAllDependencies() { + const packages = ['core', 'crypto', 'federation-sdk', 'room']; + + const allDependencies = new Set(); + + for (const pkg of packages) { + const packageJson = require(`./packages/${pkg}/package.json`); + + const dependencies = packageJson.dependencies + ? Object.keys(packageJson.dependencies) + : []; + + for (const dep of dependencies) { + allDependencies.add(dep); + } + } + + return Array.from(allDependencies); +} + +async function main() { + await $`rm -rf ${outputDir}/dist`; + await $`mkdir -p ${outputDir}/dist`; + await $`touch ${outputDir}/yarn.lock`; + + const dependencies = getAllDependencies(); + + await Bun.build({ + entrypoints: [`${inputDir}/src/index.ts`], + outdir: `${outputDir}/dist`, + target: 'node', + format: 'cjs', + external: dependencies, + env: 'disable', + define: { + 'process.env.NODE_ENV': '"production"', + }, + minify: true, + sourcemap: true, + }); + + const packageJson = JSON.parse( + await Bun.file(`${inputDir}/package.json`).text(), + ); + + const filterWorkspace = (deps: Record) => + Object.fromEntries( + Object.entries(deps || {}).filter( + ([, value]) => + typeof value === 'string' && !value.startsWith('workspace:'), + ), + ); + + packageJson.dependencies = filterWorkspace(packageJson.dependencies); + packageJson.devDependencies = filterWorkspace(packageJson.devDependencies); + packageJson.peerDependencies = filterWorkspace(packageJson.peerDependencies); + + await Bun.file(`${outputDir}/package.json`).write( + `${JSON.stringify(packageJson, null, 2)}\n`, + ); + + await $`tsc --emitDeclarationOnly -p tsconfig.sdk.types.json`; + + console.log('Bundle complete!'); +} + +await main(); + +/* +bun build ./packages/federation-sdk/src/index.ts \ + --outdir ./packages/federation-bundle/dist-cli \ + --target node \ + --format=cjs \ + -e pino \ + -e mongodb \ + -e zod \ + -e pino-pretty \ + -e @rocket.chat/emitter \ + -e reflect-metadata \ + -e tsyringe \ + -e tweetnacl \ + --production \ + --sourcemap=inline +*/ diff --git a/package.json b/package.json index ca9b33718..f59d679f5 100644 --- a/package.json +++ b/package.json @@ -49,7 +49,7 @@ "lint": "bunx @biomejs/biome lint --diagnostic-level=error", "lint:ci": "bunx @biomejs/biome ci --diagnostic-level=error", "lint:fix": "bunx @biomejs/biome lint --fix", - "tsc": "bunx tsc --noEmit", - "bundle:sdk": "bunx esbuild --bundle --sourcemap --tsconfig=./tsconfig.json --platform=node --allow-overwrite --outfile=packages/federation-sdk/dist/index.js packages/federation-sdk/dist/index.js" + "tsc": "tsc --noEmit", + "bundle:sdk": "bun run bundle.ts" } } diff --git a/packages/federation-sdk/package.json b/packages/federation-sdk/package.json index 6041c8a57..be5373a17 100644 --- a/packages/federation-sdk/package.json +++ b/packages/federation-sdk/package.json @@ -2,13 +2,13 @@ "name": "@rocket.chat/federation-sdk", "version": "0.1.3", "description": "Matrix Federation SDK for server-to-server communication", - "main": "./dist/bundle.js", + "main": "./dist/index.js", "types": "./dist/index.d.ts", "exports": { ".": { "types": "./dist/index.d.ts", - "import": "./dist/bundle.js", - "require": "./dist/bundle.js" + "import": "./dist/index.js", + "require": "./dist/index.js" } }, "scripts": { @@ -24,7 +24,7 @@ "reflect-metadata": "^0.2.2", "tsyringe": "^4.10.0", "tweetnacl": "^1.0.3", - "zod": "^3.22.4" + "zod": "^3.24.1" }, "license": "SEE LICENSE IN LICENSE", "files": ["dist"], diff --git a/tsconfig.sdk.types.json b/tsconfig.sdk.types.json new file mode 100644 index 000000000..6d848ccdd --- /dev/null +++ b/tsconfig.sdk.types.json @@ -0,0 +1,15 @@ +{ + "extends": "./tsconfig.base.json", + "compilerOptions": { + "outDir": "./federation-bundle/dist", + "rootDir": "./packages/federation-sdk/src", + "composite": false, + "verbatimModuleSyntax": false, + "declarationMap": true, + "noEmit": false, + "tsBuildInfoFile": null, + "incremental": false + }, + "include": ["./packages/federation-sdk/src/**/*"], + "exclude": ["node_modules", "dist", "**/*.spec.ts", "**/*.test.ts"] +}