import esMain from 'es-main'; import yargs from 'yargs'; import {Octokit} from '@octokit/rest'; import {basename} from 'node:path'; import {hideBin} from 'yargs/helpers'; import {readFile, stat} from 'node:fs/promises'; /** * @typedef {Object} Options * @property {string} token The bearer token. * @property {string} tag The tag. * @property {boolean} draft Create a draft release. * @property {boolean} notes Generate release notes. * @property {string} site Path to zip archive with site contents. * @property {string} legacy Path to zip archive with legacy build. */ const owner = 'openlayers'; const repo = 'openlayers'; /** * Create a release. * @param {Options} options The release options. */ async function createRelease(options) { const client = new Octokit({ auth: options.token, }); const response = await client.rest.repos.createRelease({ owner, repo, tag_name: options.tag, generate_release_notes: options.notes, draft: options.draft, }); await uploadAsset( client, response.data, options.site, 'Examples and docs (zip)' ); await uploadAsset( client, response.data, options.legacy, 'Legacy build (zip)' ); } async function uploadAsset(client, release, assetPath, label) { const name = basename(assetPath); const stats = await stat(assetPath); const data = await readFile(assetPath); await client.rest.repos.uploadReleaseAsset({ url: release.upload_url, name, label, headers: { 'content-type': 'application/zip', 'content-length': stats.size, }, data, }); } if (esMain(import.meta)) { const options = yargs(hideBin(process.argv)) .option('token', { describe: 'The token for auth', type: 'string', }) .demandOption('token') .option('tag', { describe: 'The release tag (e.g. v7.0.0)', type: 'string', }) .demandOption('tag') .option('legacy-zip', { describe: 'Path to the archive with the legacy build', type: 'string', }) .demandOption('legacy') .option('site-zip', { describe: 'Path to the archive with the site contents', type: 'string', }) .demandOption('site') .option('draft', { describe: 'Create a draft release', type: 'boolean', default: true, }) .option('notes', { describe: 'Generate release notes', type: 'boolean', default: true, }) .parse(); createRelease(options).catch((err) => { process.stderr.write(`${err.stack}\n`, () => process.exit(1)); }); }