diff --git a/package.json b/package.json index b54eca07..d5b0bf13 100644 --- a/package.json +++ b/package.json @@ -35,6 +35,7 @@ "nyc": "^15.1.0", "rimraf": "^3.0.2", "dotenv-flow": "^3.2.0", - "glob": "^8.0.1" + "glob": "^8.0.1", + "semver": "^7.3.7" } } diff --git a/packages/core/package.json b/packages/core/package.json index 13274433..0c891fcd 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -20,6 +20,7 @@ "dependencies": { "@types/node": "^15.12.1", "@types/events": "^3.0.0", + "@types/long": "^4.0.2", "@mtcute/tl": "workspace:143.0.0", "@mtcute/tl-runtime": "workspace:^1.0.0", "big-integer": "1.6.48", @@ -28,7 +29,6 @@ }, "devDependencies": { "@types/ws": "^7.4.1", - "@types/long": "^4.0.2", "ws": "^7.4.4" } } diff --git a/packages/tl/scripts/fetch-api.ts b/packages/tl/scripts/fetch-api.ts index 7de1d631..382ef0a2 100644 --- a/packages/tl/scripts/fetch-api.ts +++ b/packages/tl/scripts/fetch-api.ts @@ -28,6 +28,7 @@ import { getCachedDocumentation, } from './documentation' import { packTlSchema } from './schema' +import { bumpVersion } from '../../../scripts/version' const README_MD_FILE = join(__dirname, '../README.md') const PACKAGE_JSON_FILE = join(__dirname, '../package.json') @@ -144,36 +145,7 @@ async function updatePackageVersion( packageJson.version = versionStr await writeFile(PACKAGE_JSON_FILE, JSON.stringify(packageJson, null, 4)) - console.log('Updating dependant packages...') - - for (const dir of await readdir(PACKAGES_DIR, { withFileTypes: true })) { - if (!dir.isDirectory()) continue - - const pkgFile = join(PACKAGES_DIR, dir.name, 'package.json') - - let pkg - try { - pkg = JSON.parse(await readFile(pkgFile, 'utf8')) - } catch (e: any) { - if (e.code === 'ENOENT') continue - throw e - } - - if (pkg.dependencies && '@mtcute/tl' in pkg.dependencies) { - pkg.dependencies['@mtcute/tl'] = 'workspace:' + versionStr - } - - if (pkg.devDependencies && '@mtcute/tl' in pkg.devDependencies) { - pkg.devDependencies['@mtcute/tl'] = 'workspace:' + versionStr - } - - await writeFile(pkgFile, JSON.stringify(pkg, null, 4) + '\n') - } - - // because i am fucking dumb and have adhd and always forget it lol - console.log( - 'Done! Please make sure packages compile before committing and pushing' - ) + bumpVersion('tl', versionStr) } async function overrideInt53(schema: TlFullSchema): Promise { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a1d13851..41413263 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -22,6 +22,7 @@ importers: nyc: ^15.1.0 prettier: ^2.6.2 rimraf: ^3.0.2 + semver: ^7.3.7 ts-node: ^10.7.0 typedoc: ^0.22.15 typescript: ^4.6.4 @@ -45,6 +46,7 @@ importers: nyc: 15.1.0 prettier: 2.6.2 rimraf: 3.0.2 + semver: 7.3.7 ts-node: 10.7.0_mocf6w6juzjyi26vrxr4oqpfq4 typedoc: 0.22.15_typescript@4.6.4 typescript: 4.6.4 @@ -53,7 +55,7 @@ importers: specifiers: '@mtcute/core': workspace:^1.0.0 '@mtcute/file-id': workspace:^1.0.0 - '@mtcute/tl': workspace:142.0.0 + '@mtcute/tl': workspace:143.0.0 '@types/long': ^4.0.1 '@types/node': ^15.12.1 eager-async-pool: ^1.0.0 @@ -71,7 +73,7 @@ importers: packages/core: specifiers: - '@mtcute/tl': workspace:142.0.0 + '@mtcute/tl': workspace:143.0.0 '@mtcute/tl-runtime': workspace:^1.0.0 '@types/events': ^3.0.0 '@types/long': ^4.0.2 @@ -85,12 +87,12 @@ importers: '@mtcute/tl': link:../tl '@mtcute/tl-runtime': link:../tl-runtime '@types/events': 3.0.0 + '@types/long': 4.0.2 '@types/node': 15.14.9 big-integer: 1.6.48 events: 3.2.0 long: 4.0.0 devDependencies: - '@types/long': 4.0.2 '@types/ws': 7.4.7 ws: 7.5.7 @@ -107,7 +109,7 @@ importers: specifiers: '@mtcute/client': workspace:^1.0.0 '@mtcute/core': workspace:^1.0.0 - '@mtcute/tl': workspace:142.0.0 + '@mtcute/tl': workspace:143.0.0 events: ^3.2.0 dependencies: '@mtcute/client': link:../client @@ -118,7 +120,7 @@ importers: packages/file-id: specifiers: '@mtcute/core': workspace:^1.0.0 - '@mtcute/tl': workspace:142.0.0 + '@mtcute/tl': workspace:143.0.0 '@mtcute/tl-runtime': workspace:^1.0.0 '@types/long': ^4.0.1 long: ^4.0.0 @@ -133,7 +135,7 @@ importers: packages/html-parser: specifiers: '@mtcute/client': workspace:^1.0.0 - '@mtcute/tl': workspace:142.0.0 + '@mtcute/tl': workspace:143.0.0 '@types/long': ^4.0.1 htmlparser2: ^6.0.1 long: ^4.0.0 @@ -154,7 +156,7 @@ importers: packages/markdown-parser: specifiers: '@mtcute/client': workspace:^1.0.0 - '@mtcute/tl': workspace:142.0.0 + '@mtcute/tl': workspace:143.0.0 '@types/long': ^4.0.1 long: ^4.0.0 dependencies: @@ -426,6 +428,8 @@ packages: resolution: {integrity: sha512-vqUSBLP8dQHFPdPi9bc5GK9vRkYHJ49fsZdtoJ8EQ8ibpwk5rPKfvNIwChB0KVXcIjcepEBBd2VHC5r9Gy8ueg==} engines: {node: '>=6.0.0'} hasBin: true + dependencies: + '@babel/types': 7.17.0 dev: true /@babel/template/7.16.7: @@ -1084,6 +1088,8 @@ packages: ssri: 9.0.0 tar: 6.1.11 unique-filename: 1.1.1 + transitivePeerDependencies: + - bluebird dev: false /caching-transform/4.0.0: @@ -2352,6 +2358,7 @@ packages: socks-proxy-agent: 6.2.0 ssri: 9.0.0 transitivePeerDependencies: + - bluebird - supports-color dev: false @@ -2572,6 +2579,7 @@ packages: tar: 6.1.11 which: 2.0.2 transitivePeerDependencies: + - bluebird - supports-color dev: false @@ -2864,6 +2872,11 @@ packages: /promise-inflight/1.0.1: resolution: {integrity: sha1-mEcocL8igTL8vdhoEputEsPAKeM=} + peerDependencies: + bluebird: '*' + peerDependenciesMeta: + bluebird: + optional: true dev: false /promise-retry/2.0.1: diff --git a/scripts/version.d.ts b/scripts/version.d.ts new file mode 100644 index 00000000..c6b59903 --- /dev/null +++ b/scripts/version.d.ts @@ -0,0 +1 @@ +export declare function bumpVersion(packageName: string, version: string): void diff --git a/scripts/version.js b/scripts/version.js new file mode 100644 index 00000000..392b2028 --- /dev/null +++ b/scripts/version.js @@ -0,0 +1,127 @@ +const fs = require('fs') +const path = require('path') +const semver = require('semver') + +function bumpVersion(packageName, version) { + const packageJsons = fs + .readdirSync(path.join(__dirname, '../packages')) + .filter((s) => !s.startsWith('.')) + .map((name) => { + try { + return JSON.parse( + fs.readFileSync( + path.join(__dirname, '../packages', name, 'package.json'), + 'utf-8' + ) + ) + } catch (e) { + if (e.code !== 'ENOENT') throw e + return null + } + }) + .filter(Boolean) + const packageJsonChanged = new Set() + +// i am pretty fucking sure there is a better way to do this, but whatever +// im tired as fuck and hadnt had sleep for a while + + const newVersions = { [packageName]: version } + let hadChanges = true + while (hadChanges) { + hadChanges = false + + packageJsons.forEach((json) => { + if (!json.name.startsWith('@mtcute/')) return + const pkgName = json.name.slice(8) + + function check(deps) { + if (!deps) return + + Object.keys(deps).forEach((depName) => { + if (!depName.startsWith('@mtcute/')) return + + const depVersionRange = deps[depName].replace(/^workspace:/, '') + depName = depName.slice(8) + + if ( + newVersions[depName] && + !newVersions[pkgName] && + !semver.satisfies(newVersions[depName], depVersionRange) + ) { + newVersions[pkgName] = semver.inc(json.version, 'patch') + hadChanges = true + } + }) + } + + check(json.dependencies) + check(json.devDependencies) + check(json.peerDependencies) + check(json.optionalDependencies) + }) + } + + Object.keys(newVersions).forEach((pkgName) => { + packageJsonChanged.add(pkgName) + + const version = newVersions[pkgName] + console.log(`updated ${pkgName} to ${version}`) + + for (const json of packageJsons) { + if (json.name === `@mtcute/${pkgName}`) continue + + function updateDependencies(obj) { + if (!obj) return + Object.keys(obj).forEach((depName) => { + if (!depName.startsWith('@mtcute/')) return + + const depVersionRange = obj[depName].replace(/^workspace:/, '') + depName = depName.slice(8) + + if ( + depName === pkgName && + !semver.satisfies(version, depVersionRange) + ) { + obj[depName] = `workspace:^${version}` + console.log(` - updated dependency ${depName} at ${json.name}`) + packageJsonChanged.add(json.name.slice(8)) + } + }) + } + + updateDependencies(json.dependencies) + updateDependencies(json.devDependencies) + updateDependencies(json.peerDependencies) + updateDependencies(json.optionalDependencies) + } + }) + + console.log('changed package.json in:', packageJsonChanged) + + packageJsonChanged.forEach((name) => { + const json = packageJsons.find((json) => json.name === `@mtcute/${name}`) + if (!json) return + + fs.writeFileSync( + path.join(__dirname, '../packages', name, 'package.json'), + JSON.stringify(json, null, 4) + ) + }) + + console.log('Done!') + // because i am fucking dumb and have adhd and always forget it lol + console.log('Now run `pnpm i` and make sure everything compiles.') +} + +if (require.main === module) { + const packageName = process.argv[2] + const version = process.argv[3] + if (!packageName || !version) { + console.log('Usage: version.js ') + process.exit(0) + } + + bumpVersion(packageName, version) +} + +module.exports = { bumpVersion }