-
Notifications
You must be signed in to change notification settings - Fork 16
Expand file tree
/
Copy pathbundle.ts
More file actions
100 lines (83 loc) · 3 KB
/
bundle.ts
File metadata and controls
100 lines (83 loc) · 3 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
import Bun, { $ } from 'bun';
const inputDir = './packages/federation-sdk';
const outputDir = './federation-bundle';
function getLocalPackages(packages: string[]) {
const localPackages = new Set();
for (const pkg of packages) {
// eslint-disable-next-line import/no-dynamic-require, @typescript-eslint/no-var-requires
const packageJson = require(`./packages/${pkg}/package.json`);
localPackages.add(packageJson.name);
}
return localPackages;
}
const getDependencies = (pkg: string, type: 'dependencies' | 'devDependencies' | 'peerDependencies') => {
// eslint-disable-next-line import/no-dynamic-require, @typescript-eslint/no-var-requires
const packageJson = require(`./packages/${pkg}/package.json`);
return packageJson[type] ?? {};
};
const getDependenciesFromPackages = (packages: string[], type: 'dependencies' | 'devDependencies' | 'peerDependencies') => {
return packages.reduce((acc, name) => {
// biome-ignore lint/performance/noAccumulatingSpread: <explanation>
return { ...acc, ...getDependencies(name, type) };
}, {});
};
const filterWorkspace = (deps: Record<string, unknown>) =>
Object.fromEntries(Object.entries(deps || {}).filter(([, value]) => typeof value === 'string' && !value.startsWith('workspace:')));
// TODO get list of packages programmatically
const packages = ['core', 'crypto', 'federation-sdk', 'room'];
const localPackagesNames = getLocalPackages(packages);
const packageJson = JSON.parse(await Bun.file(`${inputDir}/package.json`).text());
async function main() {
await $`rm -rf ${outputDir}/dist`;
await $`mkdir -p ${outputDir}/dist`;
await $`cp LICENSE ${outputDir}`;
await $`touch ${outputDir}/yarn.lock`;
const dependencies = getDependenciesFromPackages(packages, 'dependencies');
const devDependencies = getDependenciesFromPackages(packages, 'devDependencies');
const peerDependencies = getDependenciesFromPackages(packages, 'peerDependencies');
await Bun.build({
entrypoints: [`${inputDir}/src/index.ts`],
outdir: `${outputDir}/dist`,
target: 'node',
format: 'cjs',
external: Object.keys(dependencies).filter((dep) => !localPackagesNames.has(dep)),
env: 'disable',
define: {
'process.env.NODE_ENV': '"production"',
},
minify: true,
sourcemap: true,
});
packageJson.dependencies = filterWorkspace({
...packageJson.dependencies,
...dependencies,
});
packageJson.devDependencies = filterWorkspace({
...packageJson.devDependencies,
...devDependencies,
});
packageJson.peerDependencies = filterWorkspace({
...packageJson.peerDependencies,
...peerDependencies,
});
await Bun.file(`${outputDir}/package.json`).write(`${JSON.stringify(packageJson, null, 2)}\n`);
await $`bun run rollup -c`;
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
*/