From 4c42304a79b195788b90366bc35e9f498ad164ed Mon Sep 17 00:00:00 2001 From: Alina Sireneva Date: Thu, 2 Nov 2023 21:23:17 +0300 Subject: [PATCH] build: extracted custom build config to packages themselves --- .eslintrc.js | 2 +- packages/client/build.config.cjs | 17 ++++ packages/core/build.config.cjs | 10 ++ packages/create-bot/build.config.cjs | 6 ++ packages/crypto-node/build.config.cjs | 19 ++++ packages/node/build.config.cjs | 1 + packages/tl/build.config.cjs | 26 +++++ scripts/build-package.js | 132 ++++++++------------------ 8 files changed, 120 insertions(+), 93 deletions(-) create mode 100644 packages/client/build.config.cjs create mode 100644 packages/core/build.config.cjs create mode 100644 packages/create-bot/build.config.cjs create mode 100644 packages/crypto-node/build.config.cjs create mode 100644 packages/node/build.config.cjs create mode 100644 packages/tl/build.config.cjs diff --git a/.eslintrc.js b/.eslintrc.js index d7ac74ba..8d4d63e4 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -226,7 +226,7 @@ module.exports = { }, }, { - files: ['**/scripts/**', '*.spec.ts', 'packages/create-*/**'], + files: ['**/scripts/**', '*.spec.ts', 'packages/create-*/**', '**/build.config.cjs'], rules: { 'no-console': 'off', 'no-restricted-imports': 'off', diff --git a/packages/client/build.config.cjs b/packages/client/build.config.cjs new file mode 100644 index 00000000..765f901f --- /dev/null +++ b/packages/client/build.config.cjs @@ -0,0 +1,17 @@ +module.exports = ({ fs, path, outDir }) => ({ + esmOnlyDirectives: true, + final() { + function fixClient(file) { + // make TelegramClient a class, not an interface + const dTsContent = fs.readFileSync(path.join(outDir, file), 'utf8') + + fs.writeFileSync( + path.join(outDir, file), + dTsContent.replace('export interface TelegramClient', 'export class TelegramClient'), + ) + } + + fixClient('esm/client.d.ts') + fixClient('cjs/client.d.ts') + }, +}) diff --git a/packages/core/build.config.cjs b/packages/core/build.config.cjs new file mode 100644 index 00000000..a112453f --- /dev/null +++ b/packages/core/build.config.cjs @@ -0,0 +1,10 @@ +module.exports = ({ path, transformFile, packageDir, outDir }) => ({ + esmOnlyDirectives: true, + final() { + const version = require(path.join(packageDir, 'package.json')).version + const replaceVersion = (content) => content.replace('%VERSION%', version) + + transformFile(path.join(outDir, 'cjs/network/network-manager.js'), replaceVersion) + transformFile(path.join(outDir, 'esm/network/network-manager.js'), replaceVersion) + }, +}) diff --git a/packages/create-bot/build.config.cjs b/packages/create-bot/build.config.cjs new file mode 100644 index 00000000..43ca88df --- /dev/null +++ b/packages/create-bot/build.config.cjs @@ -0,0 +1,6 @@ +module.exports = ({ fs, path, packageDir, outDir }) => ({ + buildCjs: false, + final() { + fs.cpSync(path.join(packageDir, 'template'), path.join(outDir, 'template'), { recursive: true }) + }, +}) diff --git a/packages/crypto-node/build.config.cjs b/packages/crypto-node/build.config.cjs new file mode 100644 index 00000000..345c178f --- /dev/null +++ b/packages/crypto-node/build.config.cjs @@ -0,0 +1,19 @@ +module.exports = ({ fs, path, packageDir, outDir }) => ({ + final() { + // copy native sources and binding.gyp file + + fs.cpSync(path.join(packageDir, 'lib'), path.join(outDir, 'lib'), { recursive: true }) + + const bindingGyp = fs.readFileSync(path.join(packageDir, 'binding.gyp'), 'utf8') + fs.writeFileSync( + path.join(outDir, 'binding.gyp'), + bindingGyp + // replace paths to crypto + .replace(/"\.\.\/crypto/g, '"crypto'), + ) + + // for some unknown fucking reason ts doesn't do this + fs.copyFileSync(path.join(packageDir, 'src/native.cjs'), path.join(outDir, 'cjs/native.cjs')) + fs.copyFileSync(path.join(packageDir, 'src/native.cjs'), path.join(outDir, 'esm/native.cjs')) + }, +}) diff --git a/packages/node/build.config.cjs b/packages/node/build.config.cjs new file mode 100644 index 00000000..3b96657a --- /dev/null +++ b/packages/node/build.config.cjs @@ -0,0 +1 @@ +module.exports = () => ({ esmOnlyDirectives: true }) diff --git a/packages/tl/build.config.cjs b/packages/tl/build.config.cjs new file mode 100644 index 00000000..ab0d41d8 --- /dev/null +++ b/packages/tl/build.config.cjs @@ -0,0 +1,26 @@ +module.exports = ({ fs, path, outDir, packageDir }) => ({ + buildTs: false, + buildCjs: false, + final() { + // create package by copying all the needed files + const files = [ + 'binary/reader.d.ts', + 'binary/reader.js', + 'binary/rsa-keys.d.ts', + 'binary/rsa-keys.js', + 'binary/writer.d.ts', + 'binary/writer.js', + 'index.d.ts', + 'index.js', + 'raw-errors.json', + 'mtp-schema.json', + 'api-schema.json', + ] + + fs.mkdirSync(path.join(outDir, 'binary'), { recursive: true }) + + for (const f of files) { + fs.copyFileSync(path.join(packageDir, f), path.join(outDir, f)) + } + }, +}) diff --git a/scripts/build-package.js b/scripts/build-package.js index f368a4f3..4aa645a2 100644 --- a/scripts/build-package.js +++ b/scripts/build-package.js @@ -9,86 +9,15 @@ if (process.argv.length < 3) { } const packageDir = path.join(__dirname, '../packages', process.argv[2]) -const BUILD_CONFIGS = { - tl: { - buildTs: false, - buildCjs: false, - customScript(packageDir, outDir) { - // create package by copying all the needed files - const files = [ - 'binary/reader.d.ts', - 'binary/reader.js', - 'binary/rsa-keys.d.ts', - 'binary/rsa-keys.js', - 'binary/writer.d.ts', - 'binary/writer.js', - 'index.d.ts', - 'index.js', - 'raw-errors.json', - 'mtp-schema.json', - 'api-schema.json', - ] +const outDir = path.join(packageDir, 'dist') - fs.mkdirSync(path.join(outDir, 'binary'), { recursive: true }) +function exec(cmd, params) { + cp.execSync(cmd, { cwd: packageDir, stdio: 'inherit', ...params }) +} - for (const f of files) { - fs.copyFileSync(path.join(packageDir, f), path.join(outDir, f)) - } - }, - }, - core: { - esmOnlyDirectives: true, - customScript(packageDir, outDir) { - const version = require(path.join(packageDir, 'package.json')).version - const replaceVersion = (content) => content.replace('%VERSION%', version) - - transformFile(path.join(outDir, 'cjs/network/network-manager.js'), replaceVersion) - transformFile(path.join(outDir, 'esm/network/network-manager.js'), replaceVersion) - }, - }, - client: { - esmOnlyDirectives: true, - customScript(packageDir, outDir) { - function fixClient(file) { - // make TelegramClient a class, not an interface - const dTsContent = fs.readFileSync(path.join(outDir, file), 'utf8') - - fs.writeFileSync( - path.join(outDir, file), - dTsContent.replace('export interface TelegramClient', 'export class TelegramClient'), - ) - } - - fixClient('esm/client.d.ts') - fixClient('cjs/client.d.ts') - }, - }, - 'crypto-node': { - customScript(packageDir, outDir) { - // copy native sources and binding.gyp file - - fs.cpSync(path.join(packageDir, 'lib'), path.join(outDir, 'lib'), { recursive: true }) - - const bindingGyp = fs.readFileSync(path.join(packageDir, 'binding.gyp'), 'utf8') - fs.writeFileSync( - path.join(outDir, 'binding.gyp'), - bindingGyp - // replace paths to crypto - .replace(/"\.\.\/crypto/g, '"crypto'), - ) - - // for some unknown fucking reason ts doesn't do this - fs.copyFileSync(path.join(packageDir, 'src/native.cjs'), path.join(outDir, 'cjs/native.cjs')) - fs.copyFileSync(path.join(packageDir, 'src/native.cjs'), path.join(outDir, 'esm/native.cjs')) - }, - }, - node: { esmOnlyDirectives: true }, - 'create-bot': { - buildCjs: false, - customScript(packageDir, outDir) { - fs.cpSync(path.join(packageDir, 'template'), path.join(outDir, 'template'), { recursive: true }) - }, - }, +function transformFile(file, transform) { + const content = fs.readFileSync(file, 'utf8') + fs.writeFileSync(file, transform(content)) } const buildConfig = { @@ -97,10 +26,38 @@ const buildConfig = { removeReferenceComments: true, replaceSrcImports: true, esmOnlyDirectives: false, - customScript: () => {}, - ...BUILD_CONFIGS[process.argv[2]], + before: () => {}, + final: () => {}, + ...(() => { + let config + + try { + config = require(path.join(packageDir, 'build.config.cjs')) + } catch (e) { + return {} + } + + console.log('[i] Using custom build config') + + if (typeof config === 'function') { + config = config({ + fs, + path, + exec, + transformFile, + packageDir, + outDir, + }) + } + + console.log(config) + + return config + })(), } +console.log(buildConfig) + function buildPackageJson() { const pkgJson = JSON.parse(fs.readFileSync(path.join(packageDir, 'package.json'), 'utf-8')) @@ -160,21 +117,12 @@ function buildPackageJson() { fs.writeFileSync(path.join(packageDir, 'dist/package.json'), JSON.stringify(pkgJson, null, 2)) } -function exec(cmd) { - cp.execSync(cmd, { cwd: packageDir, stdio: 'inherit' }) -} - -function transformFile(file, transform) { - const content = fs.readFileSync(file, 'utf8') - fs.writeFileSync(file, transform(content)) -} - -const outDir = path.join(packageDir, 'dist') - // clean fs.rmSync(path.join(outDir), { recursive: true, force: true }) fs.mkdirSync(path.join(outDir), { recursive: true }) +buildConfig.before() + if (buildConfig.buildTs) { console.log('[i] Building typescript...') exec('pnpm exec tsc --build', { cwd: packageDir, stdio: 'inherit' }) @@ -262,6 +210,6 @@ fs.cpSync(path.join(__dirname, '../LICENSE'), path.join(outDir, 'LICENSE')) fs.writeFileSync(path.join(outDir, '.npmignore'), '*.tsbuildinfo\n') -buildConfig.customScript(packageDir, outDir) +buildConfig.final() console.log('[v] Done!')