{"version":3,"sources":["../../../bin/make-manifest.ts","../../../bin/find-root.ts","../../../bin/version.ts","../../../bin/continuous-integration.ts"],"sourcesContent":["/* eslint-disable no-console, @typescript-eslint/no-unsafe-argument, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-assignment, @typescript-eslint/restrict-template-expressions, no-magic-numbers */\n\nimport * as FTL from '@fluent/syntax'\nimport * as fs from 'fs'\nimport { globSync as glob } from 'glob'\nimport * as path from 'path'\nimport { parseTemplate } from 'url-template'\n\nimport { pkg, root } from './find-root'\nimport { version } from './version'\n\nif (!pkg.id) (pkg.id as string) = `${pkg.name}@${pkg.author.email.replace(/.*@/, '')}`.toLowerCase()\nif (pkg.xpi) Object.assign(pkg, pkg.xpi)\n\npkg.version = version()\n\nif (pkg.updateLink) pkg.updateLink = parseTemplate(pkg.updateLink).expand({ version: pkg.version })\npkg.updateURL = `${pkg.xpi.releaseURL}update.rdf`\n\nconst translations = glob(path.join(root, 'locale/*/*.ftl'))\nfor (const translation of translations) {\n  const locale = path.basename(path.dirname(translation))\n\n  const ftl: FTL.Resource = FTL.parse(fs.readFileSync(translation, 'utf-8'), {})\n  const body: FTL.Entry[] = ftl.body || []\n  const msg: FTL.Message = body.find((msg: FTL.Entry) => msg.type === 'Message' && msg.id.type === 'Identifier' && msg.id.name === 'xpi') as FTL.Message\n  if (!msg) continue\n  const attr: FTL.Attribute = msg.attributes.find((attr: FTL.Attribute) => attr.id.type === 'Identifier' && attr.id.name === 'description')\n  if (!attr) continue\n  const description = attr.value.elements.filter((e: FTL.PatternElement) => e.type === 'TextElement').map((e: FTL.PatternElement) => e.value as string).join('')\n  if (!description) continue\n\n  if (locale === 'en-US') {\n    pkg.description = description\n  }\n  else {\n    pkg.localizedDescriptions = pkg.localizedDescriptions || {}\n    pkg.localizedDescriptions[locale] = description\n  }\n}\n\nconst options_and_vars = { minVersion: '7.0.32', maxVersion: '9.*', ...pkg, pretty: true }\ntry {\n  Object.assign(options_and_vars, JSON.parse(fs.readFileSync(path.join(root, 'schema', 'supported.json'), 'utf8')))\n}\ncatch {\n  // ignore\n}\n\nconsole.log('generating updates.json')\nfs.writeFileSync(\n  path.join(root, 'gen/updates.json'),\n  JSON.stringify(\n    {\n      addons: {\n        [pkg.id]: {\n          updates: [\n            {\n              version: options_and_vars.version,\n              update_link: options_and_vars.updateLink,\n              applications: {\n                zotero: {\n                  strict_min_version: options_and_vars.minVersion,\n                  strict_max_version: options_and_vars.maxVersion,\n                },\n              },\n            },\n          ],\n        },\n      },\n    },\n    null,\n    2,\n  ),\n)\n\nlet icons: { small: string; big?: string }[] = []\nif (typeof pkg.xpi?.iconURL === 'string') icons.push({ small: pkg.xpi.iconURL.replace(/^chrome:\\/\\/[^/]+\\//, '') })\n\nconst basename = pkg.id.replace(/@.*/, '')\nfor (const icon of [`content/skin/${basename}.png`, `skin/${basename}.png`, `${basename}.png`, 'icon.png']) {\n  icons.push({ small: icon })\n  icons.push({ small: icon.replace('/zotero-', '/') })\n}\nicons.push(...icons.map(icon => ({ small: icon.small.replace(/[.](svg|png)$/, ext => ({ '.svg': '.png', '.png': '.svg' }[ext] || ext)) })))\nicons = icons.filter(icon => fs.existsSync(path.join(root, ...icon.small.split('/'))))\nicons = icons.map(icon => ({ ...icon, big: icon.small.endsWith('.svg') ? icon.small : icon.small.replace(/([.][^.]+)$/, '@2x$1') }))\nif (icons.length) {\n  const { small, big } = icons[0]\n  options_and_vars.icons = {\n    48: small,\n    96: fs.existsSync(path.join(root, ...big!.split('/'))) ? big : small,\n  }\n}\n\nconsole.log('generating manifest.json')\nfs.writeFileSync(\n  path.join(root, 'build/manifest.json'),\n  JSON.stringify(\n    {\n      manifest_version: 2,\n      name: options_and_vars.name,\n      version: options_and_vars.version,\n      description: options_and_vars.description,\n      icons: options_and_vars.icons,\n      applications: {\n        zotero: {\n          id: options_and_vars.id,\n          update_url: options_and_vars.updateURL.replace('/update.rdf', '/updates.json'),\n          strict_min_version: options_and_vars.minVersion,\n          strict_max_version: options_and_vars.maxVersion,\n        },\n      },\n    },\n    null,\n    2,\n  ),\n)\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","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"],"mappings":"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","names":["fs","path","path","fs","import_node_fs","import_node_path","os","path","fs","glob","msg","attr","basename"]}