diff --git a/.npmignore b/.npmignore index 517ba0bd..03030ba5 100644 --- a/.npmignore +++ b/.npmignore @@ -42,6 +42,7 @@ lib/test/ docs/ /.idea/ .vscode/ +bin/ build/ fixtures/ coverage/ diff --git a/README.md b/README.md index 1fa8ad41..b2e9f02f 100644 --- a/README.md +++ b/README.md @@ -168,6 +168,16 @@ Xterm.js follows a monthly release cycle roughly. All current and past releases are available on this repo's [Releases page](https://github.com/sourcelair/xterm.js/releases), you can view the [high-level roadmap on the wiki](https://github.com/xtermjs/xterm.js/wiki/Roadmap) and see what we're working on now by looking through [Milestones](https://github.com/sourcelair/xterm.js/milestones). +### Beta builds + +Our CI releases beta builds to npm for every change that goes into master, install the latest beta build with: + +``` +npm install -S xterm@beta +``` + +These should generally be stable but some bugs may slip in, we recommend using the beta build primarily to test out new features and for verifying bug fixes. + ## Contributing You can read the [guide on the wiki](https://github.com/xtermjs/xterm.js/wiki/Contributing) to learn how to contribute and setup xterm.js for development. diff --git a/azure-pipelines.yml b/azure-pipelines.yml index a26bd3d8..db74a4ea 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -66,3 +66,28 @@ jobs: - script: | yarn lint displayName: 'Lint' + +- job: Release + dependsOn: + - Linux + - macOS + - Windows + condition: and(succeeded(), eq(variables['Build.SourceBranch'], 'refs/heads/master')) + pool: + vmImage: 'ubuntu-16.04' + steps: + - task: NodeTool@0 + inputs: + versionSpec: '8.x' + displayName: 'Install Node.js' + - task: geeklearningio.gl-vsts-tasks-yarn.yarn-installer-task.YarnInstaller@2 + inputs: + versionSpec: "1.9.4" + displayName: 'Install Yarn' + - script: | + yarn + BUILD_DIR=dist npm run build + displayName: 'Install dependencies and build' + - script: | + NPM_AUTH_TOKEN="$(NPM_AUTH_TOKEN)" node ./bin/publish.js + displayName: 'Publish to npm' diff --git a/bin/publish.js b/bin/publish.js new file mode 100644 index 00000000..ec7bf173 --- /dev/null +++ b/bin/publish.js @@ -0,0 +1,50 @@ +/** + * Copyright (c) 2019 The xterm.js authors. All rights reserved. + * @license MIT + */ + +const cp = require('child_process'); +const fs = require('fs'); +const path = require('path'); +const packageJson = require('../package.json'); + +// Setup auth +fs.writeFileSync(`${process.env['HOME']}/.npmrc`, `//registry.npmjs.org/:_authToken=${process.env['NPM_AUTH_TOKEN']}`); + +// Get the version +const tag = 'beta' +const nextVersion = getNextVersion(tag); +console.log(`Publishing version: ${nextVersion}`); + +// Set the version in package.json +const packageJsonFile = path.resolve(__dirname, '..', 'package.json'); +packageJson.version = nextVersion; +fs.writeFileSync(packageJsonFile, JSON.stringify(packageJson, null, 2)); + +// Publish +const result = cp.spawn('npm', ['publish', '--tag', tag], { + stdio: 'inherit' +}); +result.on('exit', code => process.exit(code)); + +function getNextVersion(tag) { + if (!/^[0-9]+\.[0-9]+\.[0-9]+$/.exec(packageJson.version)) { + console.error('The package.json version must be of the form x.y.z'); + process.exit(1); + } + const stableVersion = packageJson.version.split('.'); + const nextStableVersion = `${stableVersion[0]}.${parseInt(stableVersion[1]) + 1}.${stableVersion[2]}`; + const publishedVersions = getPublishedVersions(nextStableVersion, tag); + if (publishedVersions.length === 0) { + return `${packageJson.version}-${tag}1`; + } + const latestPublishedVersion = publishedVersions.sort((a, b) => b.localeCompare(a))[0]; + const latestTagVersion = parseInt(latestPublishedVersion.substr(latestPublishedVersion.search(/[0-9]+$/)), 10); + return `${nextStableVersion}-${tag}${latestTagVersion + 1}`; +} + +function getPublishedVersions(version, tag) { + const versionsProcess = cp.spawnSync('npm', ['view', 'xterm', 'versions', '--json']); + const versionsJson = JSON.parse(versionsProcess.stdout); + return versionsJson.filter(v => !v.search(new RegExp(`${version}-${tag}[0-9]+`))); +} diff --git a/package.json b/package.json index 539b96da..d58a6a5d 100644 --- a/package.json +++ b/package.json @@ -61,4 +61,4 @@ "coveralls": "nyc report --reporter=text-lcov | coveralls", "watch": "tsc -b -w ./src/tsconfig.all.json --preserveWatchOutput" } -} +} \ No newline at end of file