{
  "version": 3,
  "sources": ["../../../bin/make-manifest.ts", "../../../build.ts", "../../../bin/continuous-integration.ts", "../../../bin/find-root.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 { version } from '../build'\nimport { pkg, root } from './find-root'\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 = msg.attributes.find((candidate: FTL.Attribute) => candidate.id.type === 'Identifier' && candidate.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", "#!/usr/bin/env node\n\nimport os from 'node:os'\n\nimport { ContinuousIntegration as CI } from './bin/continuous-integration'\nimport { pkg } from './bin/find-root'\n\nexport let version = ''\nexport let release = Boolean(CI.tag)\n\nexport function buildNumber(n = 4) {\n  version = pkg.version as string\n\n  if (!release && CI.service) {\n    version += '.' + `${CI.build_number % (10 ** n)}`.padStart(n, '0') // assuming you are not outputting thousands of builds a week\n  }\n  else if (!release) {\n    version += `.${os.userInfo().username}.${os.hostname()}`\n  }\n}\n\nbuildNumber()\n", "import * as child_process from 'node:child_process'\n\nclass ContinuousIntegrationSingleton {\n  public service = ''\n  public build_number = 0\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(this.env('CIRCLE_BUILD_NUM'))\n        try {\n          const sha = this.env('CIRCLE_SHA1')\n          this.tag = child_process.execSync(`git describe --exact-match ${sha}`, { stdio: 'pipe' }).toString().trim()\n        }\n        catch (err) {\n          this.tag = ''\n        }\n        this.commit_message = child_process.execSync(`git log --format=%B -n 1 ${this.env('CIRCLE_SHA1')}`).toString().trim()\n        this.branch = this.env('CIRCLE_BRANCH')\n        this.pull_request = !!process.env.CIRCLE_PULL_REQUEST\n        break\n\n      case 'GitHub':\n        this.build_number = this.parseInt(this.env('GITHUB_RUN_NUMBER'))\n        this.commit_message = child_process.execSync(`git log --format=%B -n 1 ${this.env('GITHUB_SHA')}`).toString().trim()\n        this.pull_request = this.env('GITHUB_EVENT_NAME').startsWith('pull-request')\n\n        const githubRef = this.env('GITHUB_REF')\n\n        if (process.env.GITHUB_HEAD_REF) {\n          this.branch = process.env.GITHUB_HEAD_REF.split('/').pop() || ''\n        }\n        else if (githubRef.startsWith('refs/tags/')) {\n          // leave branch undefined when tagged... not great\n          this.tag = githubRef.split('/').pop() || ''\n        }\n        else if (githubRef.startsWith('refs/heads/')) {\n          this.branch = githubRef.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 env(name: string): string {\n    const value = process.env[name]\n    if (!value) throw new Error(`${name} is not set`)\n    return value\n  }\n\n  private parseInt(n: number | string | undefined): number {\n    if (typeof n === 'undefined') throw new Error('missing integer value')\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"],
  "mappings": "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",
  "names": ["fs", "path", "path", "fs", "os", "glob", "msg", "basename"]
}
