diff --git a/common/scripts/bump.js b/common/scripts/bump.js index 81b2630821..f28908d3db 100755 --- a/common/scripts/bump.js +++ b/common/scripts/bump.js @@ -4,97 +4,46 @@ const repo = '@hcengineering' const packages = {} const pathes = {} -const shouldPublishPackages = new Set() -const packageDependencies = {} -const bumpedPackages = new Set() const jsons = {} -const updatedPackages = new Set() function fillPackages (config) { for (const package of config.projects) { + if (!package.name.startsWith(repo)) continue + packages[package.name] = { version: package.version, - path: package.path, - shouldPublish: package.shouldPublish - } - if (package.shouldPublish) { - shouldPublishPackages.add(package.name) + path: package.path } pathes[package.path] = package.name + + const file = package.path + '/package.json' + const raw = fs.readFileSync(file) + jsons[package.name] = JSON.parse(raw) } } -function getChangedPackages (changedFiles) { - let changedPackages = [] - for (const changedFile of changedFiles) { - const filePath = changedFile.split('/') - const changedFileRoot = `${filePath[0]}/${filePath[1]}` - const changedPackage = pathes[changedFileRoot] - if (changedPackage !== undefined && !changedPackages.includes(changedPackage)) { - changedPackages.push(changedPackage) - } - } - return changedPackages -} +function bumpPackage (name, newVersion) { + const json = jsons[name] -function buildDependencyTree () { - for (const name in packages) { - const package = packages[name] - const file = package.path + '/package.json' - const raw = fs.readFileSync(file) - const json = JSON.parse(raw) - jsons[name] = json - const dependencies = json.dependencies - for (const dependency in dependencies) { - if (dependency.startsWith(repo)) { - const set = packageDependencies[dependency] ?? new Set() - set.add(name) - packageDependencies[dependency] = set + json.version = newVersion + if (typeof json.dependencies === 'object') { + for (const [dependency] of Object.entries(json.dependencies)) { + if (packages[dependency] !== undefined) { + json.dependencies[dependency] = `^${newVersion}` } } } } -function getNewVersion (json) { - const version = json.version.split('.') - const patch = version[2] - const newPatch = Number(patch) + 1 - return `${version[0]}.${version[1]}.${newPatch}` -} - -function isNeedBump (name) { - if (shouldPublishPackages.has(name)) return true - for (const dependency in packageDependencies[name] ?? []) { - const res = isNeedBump(dependency) - if (res) return true - } - return false -} - -function bumpPackage (name, dependency, depVersion) { - let json = jsons[name] - if (!bumpedPackages.has(name) && isNeedBump(name)) { - const newVersion = getNewVersion(json) - json.version = newVersion - bumpedPackages.add(name) - updatedPackages.add(name) - } - if (dependency !== undefined && depVersion !== undefined) { - if (json.dependencies[dependency] !== `^${depVersion}`) { - json.dependencies[dependency] = `^${depVersion}` - updatedPackages.add(name) - } - } - if (bumpedPackages.has(name)) { - for (const dep of packageDependencies[name] ?? []) { - bumpPackage(dep, name, json.version) - } - } +function shouldPublish (name) { + const json = jsons[name] + return json !== undefined && json.repository !== undefined } function publish (name) { const package = packages[name] try { + console.log('publishing', name) execSync(`cd ${package.path} && npm publish && cd ../..`, { encoding: 'utf-8' }) } catch (err) { console.log(err) @@ -104,39 +53,37 @@ function publish (name) { function main () { const args = process.argv + const version = args[2] + if (version === undefined || version === '') { + console.log('usage: node bump.js ') + return + } + + console.log('bump version ...', version) + const config = JSON.parse(execSync('rush list -p --json', { encoding: 'utf-8' })) fillPackages(config) - buildDependencyTree() - let changedPackages = [] - if (args[2] === '-p') { - changedPackages = args[3].split(',').map((p) => `${repo}/${p}`) - } else if (args[2] === '-all') { - changedPackages = Object.keys(packages) - } else { - const tag = execSync(`git describe --tags --abbrev=0`, { encoding: 'utf-8' }) - const diff = execSync(`git diff ${tag} --name-only --diff-filter=ACMR | sed 's| |\\ |g\'`, { encoding: 'utf-8' }) - const changedFiles = diff.split('\n') - changedPackages = getChangedPackages(changedFiles) + const packageNames = Object.keys(packages) + for (const packageName of packageNames) { + bumpPackage(packageName, version) } - for (const packageName of changedPackages) { - bumpPackage(packageName) - } - - for (const packageName of updatedPackages) { + for (const packageName of packageNames) { const package = packages[packageName] const file = package.path + '/package.json' const res = JSON.stringify(jsons[packageName], undefined, 2) fs.writeFileSync(file, res + '\n') } - for (const packageName of bumpedPackages) { - if (shouldPublishPackages.has(packageName)) { + for (const packageName of packageNames) { + if (shouldPublish(packageName)) { publish(packageName) } } + + console.log('... done') } -main () \ No newline at end of file +main ()