{"version":3,"sources":["../../../bin/release.ts","../../../bin/continuous-integration.ts","../../../bin/find-root.ts","../../../bin/version.ts"],"sourcesContent":["#!/usr/bin/env node\n\n/* eslint-disable @typescript-eslint/no-unsafe-argument, no-console, @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call, @typescript-eslint/restrict-template-expressions */\n\nprocess.on('unhandledRejection', up => {\n  throw up\n})\n\nimport 'dotenv/config'\nimport { execSync } from 'child_process'\nimport { program } from 'commander'\nimport * as fs from 'fs'\nimport moment from 'moment'\nimport * as path from 'path'\nimport { parseTemplate } from 'url-template'\n\nimport { ContinuousIntegration as CI } from './continuous-integration'\n\nimport { pkg, root } from './find-root'\nimport { version } from './version'\n\nprogram\n  .option('-r, --release-message <value>', 'add message to github release')\n  .option('-x, --xpi <value>', 'xpi filename template', '{name}-{version}.xpi')\n  .option('-d, --dry-run', 'dry run', !CI.service)\n  .option('-p, --pre-release', 'release is a pre-release')\n  .option('-t, --tag <value>', 'tag for release', CI.tag)\n  .parse(process.argv)\nconst options = program.opts()\n\nif (options.tag && options.tag !== CI.tag) {\n  console.log('dry-run: tag specified manually, switching to dry-run mode')\n  options.dryRun = true\n}\n\nif (options.releaseMessage?.startsWith('@')) options.releaseMessage = fs.readFileSync(options.releaseMessage.substring(1), 'utf-8')\n\nimport { Octokit } from '@octokit/rest'\nconst octokit = new Octokit({ auth: `token ${process.env.GITHUB_TOKEN}` })\n\nconst [, owner, repo] = pkg.repository.url.match(/:\\/\\/github.com\\/([^/]+)\\/([^.]+)\\.git$/)\n\nconst xpi = parseTemplate(options.xpi).expand({ ...pkg, version: version() })\n\n// eslint-disable-next-line no-magic-numbers\nconst EXPIRE_BUILDS = moment().subtract(7, 'days').toDate().toISOString()\n\nfunction bail(msg, status = 1) {\n  console.log(msg) // eslint-disable-line no-console\n  process.exit(status)\n}\n\nif (options.dryRun) {\n  console.log('Not running on CI service, switching to dry-run mode') // eslint-disable-line no-console\n  CI.branch = execSync('git rev-parse --abbrev-ref HEAD', { encoding: 'utf8' }).trim()\n}\n\nfunction report(msg) {\n  console.log(`${options.dryRun ? 'dry-run: ' : ''}${msg}`) // eslint-disable-line no-console\n}\n\nif (CI.pull_request) bail('Not releasing pull requests', 0)\n\nif (options.tag) {\n  if (`v${pkg.version}` !== options.tag) bail(`Building tag ${options.tag}, but package version is ${pkg.version}`)\n\n  const releaseBranches = ['main', 'master'].concat(pkg.xpi.releaseBranches || [])\n  if (CI.branch && !releaseBranches.includes(CI.branch)) bail(`Building tag ${options.tag}, but branch is ${CI.branch}`)\n}\n\nconst tags = new Set()\nfor (let regex = /(?:^|\\s)(?:#)([a-zA-Z\\d]+)/gm, tag; tag = regex.exec(CI.commit_message);) {\n  tags.add(tag[1])\n}\n\nif (tags.has('norelease')) bail(`Not releasing on ${CI.branch || 'default branch'} because of 'norelease' tag`, 0)\n\nconst issues: Set<number> = new Set(Array.from(tags).map(parseInt).filter(tag => !isNaN(tag)))\nif ((/^((issue|gh)-)?[0-9]+(-[a-z]+)?$/i).exec(CI.branch)) {\n  issues.add(parseInt(CI.branch.replace(/[^0-9]/g, '')))\n}\n\nasync function announce(issue_number, release) {\n  if (tags.has('noannounce')) return\n\n  const issue = (await octokit.issues.get({ owner, repo, issue_number })).data\n  if (issue.locked || issue.state !== 'open') return\n\n  let build\n  let reason = ''\n\n  if (options.tag) {\n    build = `${options.preRelease ? 'pre-' : ''}release ${CI.tag}`\n  }\n  else {\n    build = `test build ${version()}`\n  }\n  const link = `[${build}](https://github.com/${owner}/${repo}/releases/download/${release.data.tag_name}/${pkg.name}-${version()}.xpi)`\n\n  if (!options.tag) {\n    reason = ` (${JSON.stringify(CI.commit_message)})`\n    reason += [\n      '',\n      `Install in Zotero by downloading ${link}, opening the Zotero \"Tools\" menu, selecting \"Plugins\", open the gear menu in the top right, and select \"Install Plugin From File...\".`,\n      'Please test this build and report back whether it fixes the issue, and if not, what the remaining problem is. In the latter case, please also send a new log.',\n    ].join('\\n\\n')\n  }\n\n  const body = `:robot: this is your friendly neighborhood build bot announcing ${link}${reason}`\n\n  report(body)\n  if (options.dryRun) return\n\n  try {\n    await octokit.issues.createComment({ owner, repo, issue_number, body })\n  }\n  catch (error) {\n    report(`Failed to announce '${build}: ${reason}' on ${issue_number}`)\n  }\n\n  if (process.env.GITHUB_ENV) fs.appendFileSync(process.env.GITHUB_ENV, `XPI_RELEASED=${issue_number}\\n`)\n}\n\nasync function uploadAsset(release, asset, contentType) {\n  report(`uploading ${path.basename(asset)} to ${release.data.tag_name}`)\n  if (options.dryRun) return\n\n  const name = path.basename(asset)\n  const exists = (await octokit.repos.listReleaseAssets({ owner, repo, release_id: release.data.id })).data.find(a => a.name === name)\n  if (exists) {\n    if (release.data.tag_name === 'builds') {\n      await octokit.repos.deleteReleaseAsset({ owner, repo, asset_id: exists.id })\n    }\n    else {\n      bail(`failed to upload ${path.basename(asset)} to ${release.data.html_url}: asset exists`)\n    }\n  }\n\n  try {\n    await octokit.repos.uploadReleaseAsset({\n      owner,\n      repo,\n      url: release.data.upload_url,\n      release_id: release.data.id,\n      data: (fs.readFileSync(asset) as unknown as string), // TODO: what is going on here octokit?!\n      headers: {\n        'content-type': contentType,\n        'content-length': fs.statSync(asset).size,\n      },\n      name,\n    })\n  }\n  catch (err) {\n    bail(`failed to upload ${path.basename(asset)} to ${release.data.html_url}: ${err}`)\n  }\n}\n\nasync function getRelease(tag, prerelease) {\n  try {\n    return await octokit.repos.getReleaseByTag({ owner, repo, tag })\n  }\n  catch {\n    try {\n      return await octokit.repos.createRelease({ owner, repo, tag_name: tag, prerelease })\n    }\n    catch (err) {\n      bail(`Could not get release ${tag}: ${err}`)\n      return null\n    }\n  }\n}\n\nasync function update_rdf(releases_tag: string) {\n  const release = await getRelease(releases_tag, false)\n\n  const assets = (await octokit.repos.listReleaseAssets({ owner, repo, release_id: release.data.id })).data\n\n  const updates = {\n    'updates.json': 'application/json',\n  }\n\n  for (const asset of assets) {\n    if (asset.name in updates && updates[asset.name]) {\n      report(`removing ${asset.name} from ${release.data.tag_name}`)\n      // TODO: double asset.id until https://github.com/octokit/rest.js/issues/933 is fixed\n      if (options.dryRun) {\n        report(`update ${asset.name}`)\n      }\n      else {\n        await octokit.repos.deleteReleaseAsset({ owner, repo, asset_id: asset.id })\n      }\n    }\n  }\n  for (const [pointer, mimetype] of Object.entries(updates)) {\n    if (mimetype) await uploadAsset(release, path.join(root, `gen/${pointer}`), mimetype)\n  }\n}\n\nasync function main(): Promise<void> {\n  if (process.env.NIGHTLY === 'true') return\n\n  if (CI.branch === 'l10n_master') {\n    for (const issue of (await octokit.issues.listForRepo({ owner, repo, state: 'open', labels: 'translation' })).data) {\n      issues.add(issue.number)\n    }\n  }\n\n  let release\n  if (options.tag) {\n    // upload XPI\n\n    try {\n      await octokit.repos.getReleaseByTag({ owner, repo, tag: options.tag })\n      if (!options.dryRun) bail(`release ${options.tag} exists, bailing`)\n    }\n    catch (err) { // eslint-disable-line @typescript-eslint/no-unused-vars\n      // actually OK\n    }\n\n    if (options.dryRun) {\n      report(`create release ${options.tag}`)\n      report(`upload asset ${xpi}`)\n    }\n    else {\n      report(`uploading ${xpi} to new release ${CI.tag}`)\n      release = await octokit.repos.createRelease({ owner, repo, tag_name: CI.tag, prerelease: !!options.preRelease, body: options.releaseMessage || '' })\n      await uploadAsset(release, path.join(root, `xpi/${xpi}`), 'application/vnd.zotero.plugin')\n    }\n\n    // RDF update pointer(s)\n    await update_rdf(pkg.xpi.releaseURL.split('/').filter((name: string) => name).reverse()[0])\n  }\n  else if (issues.size) { // only release builds tied to issues\n    release = await getRelease('builds', true)\n\n    for (const asset of release.data.assets || []) {\n      if (asset.name.endsWith('.xpi') && asset.created_at < EXPIRE_BUILDS) {\n        report(`deleting ${asset.name}`)\n        // TODO: double asset.id until https://github.com/octokit/rest.js/issues/933 is fixed\n        if (options.dryRun) {\n          report(`delete asset ${asset.name}`)\n        }\n        else {\n          await octokit.repos.deleteReleaseAsset({ owner, repo, asset_id: asset.id })\n        }\n      }\n    }\n    await uploadAsset(release, path.join(root, `xpi/${xpi}`), 'application/vnd.zotero.plugin')\n  }\n\n  if (process.env.VERBOSE) console.log({ tag: CI.tag, issues, release, tags })\n\n  for (const issue of Array.from(issues)) {\n    await announce(issue, release)\n  }\n}\n\nmain().catch(err => console.log(err))\n","import * as child_process from 'node:child_process'\n\nclass ContinuousIntegrationSingleton {\n  public service = ''\n  public build_number: number\n  public tag = ''\n  public commit_message = ''\n  public branch = ''\n  public pull_request = false\n  public issue = ''\n\n  constructor() {\n    for (const [id, name] of Object.entries({ CIRCLECI: 'Circle', TRAVIS: 'Travis', SEMAPHORE: 'Semaphore', GITHUB_ACTIONS: 'GitHub' })) {\n      if (process.env[id] === 'true') this.service = name\n    }\n\n    switch (this.service) {\n      case 'Circle':\n        this.build_number = this.parseInt(process.env.CIRCLE_BUILD_NUM)\n        try {\n          this.tag = child_process.execSync(`git describe --exact-match ${process.env.CIRCLE_SHA1}`, { stdio: 'pipe' }).toString().trim()\n        }\n        catch (err) {\n          this.tag = null\n        }\n        this.commit_message = child_process.execSync(`git log --format=%B -n 1 ${process.env.CIRCLE_SHA1}`).toString().trim()\n        this.branch = process.env.CIRCLE_BRANCH\n        this.pull_request = !!process.env.CIRCLE_PULL_REQUEST\n        break\n\n      case 'GitHub':\n        this.build_number = this.parseInt(process.env.GITHUB_RUN_NUMBER)\n        this.commit_message = child_process.execSync(`git log --format=%B -n 1 ${process.env.GITHUB_SHA}`).toString().trim()\n        this.pull_request = process.env.GITHUB_EVENT_NAME.startsWith('pull-request')\n\n        if (process.env.GITHUB_HEAD_REF) {\n          this.branch = process.env.GITHUB_HEAD_REF.split('/').pop()\n        }\n        else if (process.env.GITHUB_REF.startsWith('refs/tags/')) {\n          // leave branch undefined when tagged... not great\n          this.tag = process.env.GITHUB_REF.split('/').pop()\n        }\n        else if (process.env.GITHUB_REF.startsWith('refs/heads/')) {\n          this.branch = process.env.GITHUB_REF.split('/').pop()\n        }\n        this.branch = this.branch || ''\n        this.issue = this.branch.match(/^gh-([0-9]+)$/)?.[1] || ''\n        break\n\n      default:\n        if (process.env.CI === 'true') throw new Error(`Unexpected CI service ${this.service}`)\n    }\n  }\n\n  private parseInt(n: number | string): number {\n    if (typeof n === 'number') return n\n    const int = parseInt(n)\n    if (isNaN(int)) throw new Error(`${n} is not an integer`)\n    return int\n  }\n}\n\nexport const ContinuousIntegration = new ContinuousIntegrationSingleton() // eslint-disable-line @typescript-eslint/naming-convention,no-underscore-dangle,id-blacklist,id-match\n","import fs from 'node:fs'\nimport path from 'node:path'\n\nconst folders = process.cwd().split(path.sep)\nconst rootIndex = folders.findIndex((folder: string, i: number) => fs.existsSync(path.join(folders.slice(0, i + 1).join(path.sep), 'package.json')))\nexport const root = (rootIndex > 0 ? folders.slice(0, rootIndex + 1) : folders).join(path.sep)\nconsole.log('project directory:', root)\n\nexport const pkg = JSON.parse(fs.readFileSync(path.join(root, 'package.json'), 'utf-8'))\n","#!/usr/bin/env node\n\nimport fs from 'node:fs'\nimport os from 'node:os'\nimport path from 'node:path'\n\nimport { ContinuousIntegration as CI } from './continuous-integration'\nimport { pkg, root } from './find-root'\n\nexport function version(): string {\n  let $version = pkg.version as string\n\n  if (CI.service && !CI.tag) {\n    $version = `${$version}.${CI.build_number}`\n  }\n  else if (!CI.service) {\n    $version = `${$version}.${os.userInfo().username}.${os.hostname()}`\n  }\n\n  const version_module = path.join(root, 'gen', 'version.cjs')\n  if (!fs.existsSync(path.dirname(version_module))) fs.mkdirSync(path.dirname(version_module))\n  fs.writeFileSync(version_module, `module.exports = { version: ${JSON.stringify($version)} }`)\n  console.log('written version', $version, 'to', version_module)\n  return $version\n}\n\nversion()\n"],"mappings":"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","names":["fs","path","path","fs","import_node_fs","import_node_path","os","path","fs","moment"]}