zotero-plugin 7.0.10 → 7.0.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/bin/branches.cjs.map +1 -1
- package/dist/cjs/bin/copy-assets.cjs.map +1 -1
- package/dist/cjs/bin/fetch-log.cjs +9 -9
- package/dist/cjs/bin/fetch-log.cjs.map +1 -1
- package/dist/cjs/bin/keypair.cjs.map +1 -1
- package/dist/cjs/bin/link.cjs.map +1 -1
- package/dist/cjs/bin/make-dirs.cjs.map +1 -1
- package/dist/cjs/bin/make-manifest.cjs.map +1 -1
- package/dist/cjs/bin/release.cjs.map +1 -1
- package/dist/cjs/bin/version.cjs.map +1 -1
- package/dist/cjs/bin/zipup.cjs.map +1 -1
- package/dist/cjs/debug-log.cjs +1 -1
- package/dist/cjs/debug-log.cjs.map +1 -1
- package/dist/esm/bin/branches.js.map +1 -1
- package/dist/esm/bin/copy-assets.js.map +1 -1
- package/dist/esm/bin/fetch-log.js +9 -9
- package/dist/esm/bin/fetch-log.js.map +1 -1
- package/dist/esm/bin/keypair.js.map +1 -1
- package/dist/esm/bin/link.js.map +1 -1
- package/dist/esm/bin/make-dirs.js.map +1 -1
- package/dist/esm/bin/make-manifest.js.map +1 -1
- package/dist/esm/bin/release.js.map +1 -1
- package/dist/esm/bin/version.js.map +1 -1
- package/dist/esm/bin/zipup.js.map +1 -1
- package/dist/esm/debug-log.js +1 -1
- package/dist/esm/debug-log.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../bin/branches.ts","../../../bin/find-root.ts"],"sourcesContent":["#!/usr/bin/env node\n\n/* eslint-disable no-console, @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call */\n\nprocess.on('unhandledRejection', up => {\n throw up\n})\n\nimport 'dotenv/config'\nimport * as path from 'path'\n\nimport { Octokit } from '@octokit/rest'\nconst octokit = new Octokit({ auth: `token ${process.env.GITHUB_TOKEN}` })\n\
|
|
1
|
+
{"version":3,"sources":["../../../bin/branches.ts","../../../bin/find-root.ts"],"sourcesContent":["#!/usr/bin/env node\n\n/* eslint-disable no-console, @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call */\n\nprocess.on('unhandledRejection', up => {\n throw up\n})\n\nimport 'dotenv/config'\nimport * as path from 'path'\n\nimport { Octokit } from '@octokit/rest'\nconst octokit = new Octokit({ auth: `token ${process.env.GITHUB_TOKEN}` })\n\nimport { pkg, root } from './find-root'\n\nconst [, owner, repo] = pkg.repository.url.match(/:\\/\\/github.com\\/([^/]+)\\/([^.]+)\\.git$/)\n\nasync function main() {\n const branches = await octokit.repos.listBranches({ owner, repo })\n\n for (const branch of branches.data) {\n if (/^[0-9]+$/.exec(branch.name)) {\n const issue = await octokit.issues.get({ owner, repo, issue_number: parseInt(branch.name) })\n if (issue.data.state !== 'open') console.log(branch.name, issue.data.state) // eslint-disable-line no-console\n }\n else if (!['master', 'main', 'gh-pages'].includes(branch.name)) {\n console.log(branch.name)\n }\n }\n}\n\nmain().catch(err => console.log(err))\n","import fs from 'fs'\nimport path from '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":";;;;;;;;;;;;;;;;;;;;;;;;;AAQA,oBAAO;AAGP,kBAAwB;;;ACXxB,gBAAe;AACf,kBAAiB;AAEjB,IAAM,UAAU,QAAQ,IAAI,EAAE,MAAM,YAAAA,QAAK,GAAG;AAC5C,IAAM,YAAY,QAAQ,UAAU,CAAC,QAAgB,MAAc,UAAAC,QAAG,WAAW,YAAAD,QAAK,KAAK,QAAQ,MAAM,GAAG,IAAI,CAAC,EAAE,KAAK,YAAAA,QAAK,GAAG,GAAG,cAAc,CAAC,CAAC;AAC5I,IAAM,QAAQ,YAAY,IAAI,QAAQ,MAAM,GAAG,YAAY,CAAC,IAAI,SAAS,KAAK,YAAAA,QAAK,GAAG;AAC7F,QAAQ,IAAI,sBAAsB,IAAI;AAE/B,IAAM,MAAM,KAAK,MAAM,UAAAC,QAAG,aAAa,YAAAD,QAAK,KAAK,MAAM,cAAc,GAAG,OAAO,CAAC;;;ADJvF,QAAQ,GAAG,sBAAsB,QAAM;AACrC,QAAM;AACR,CAAC;AAMD,IAAM,UAAU,IAAI,oBAAQ,EAAE,MAAM,SAAS,QAAQ,IAAI,YAAY,GAAG,CAAC;AAIzE,IAAM,CAAC,EAAE,OAAO,IAAI,IAAI,IAAI,WAAW,IAAI,MAAM,yCAAyC;AAE1F,eAAe,OAAO;AACpB,QAAM,WAAW,MAAM,QAAQ,MAAM,aAAa,EAAE,OAAO,KAAK,CAAC;AAEjE,aAAW,UAAU,SAAS,MAAM;AAClC,QAAI,WAAW,KAAK,OAAO,IAAI,GAAG;AAChC,YAAM,QAAQ,MAAM,QAAQ,OAAO,IAAI,EAAE,OAAO,MAAM,cAAc,SAAS,OAAO,IAAI,EAAE,CAAC;AAC3F,UAAI,MAAM,KAAK,UAAU,OAAQ,SAAQ,IAAI,OAAO,MAAM,MAAM,KAAK,KAAK;AAAA,IAC5E,WACS,CAAC,CAAC,UAAU,QAAQ,UAAU,EAAE,SAAS,OAAO,IAAI,GAAG;AAC9D,cAAQ,IAAI,OAAO,IAAI;AAAA,IACzB;AAAA,EACF;AACF;AAEA,KAAK,EAAE,MAAM,SAAO,QAAQ,IAAI,GAAG,CAAC;","names":["path","fs"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../bin/copy-assets.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport fs from 'fs-extra'\nimport path from 'path'\n\
|
|
1
|
+
{"version":3,"sources":["../../../bin/copy-assets.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport fs from 'fs-extra'\nimport path from 'path'\n\nimport { root } from './find-root'\n\nfunction allow(file) {\n switch (path.basename(file)) {\n case '.DS_Store':\n return false\n }\n\n switch (path.extname(file).toLowerCase()) {\n case '.json':\n case '.ts':\n case '.peggy':\n case '.pug':\n return false\n }\n\n return true\n}\n\nconsole.log('copying assets')\n\nfunction shouldCopy(dir) {\n return fs.existsSync(dir) && !fs.existsSync(path.join(dir, '.nomedia'))\n}\n\nexport function copy() {\n for (const dir of ['defaults', 'content', 'skin', 'locale', 'resource', 'chrome.manifest', 'chrome']) {\n if (!shouldCopy(dir)) continue\n\n fs.copySync(dir, path.join('build', dir), {\n filter(src) {\n if (dir !== 'chrome.manifest' && dir !== 'resource' && !allow(src)) return false\n if (fs.lstatSync(src).isFile()) console.log(' ', src)\n return true\n },\n })\n }\n\n if (shouldCopy('client')) {\n fs.copySync('client', 'build', {\n filter(src) {\n if (fs.lstatSync(src).isFile()) console.log(' ', src)\n return true\n },\n })\n }\n}\n\ncopy()\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAEA,sBAAe;AACf,kBAAiB;AAIjB,SAAS,MAAM,MAAM;AACnB,UAAQ,YAAAA,QAAK,SAAS,IAAI,GAAG;AAAA,IAC3B,KAAK;AACH,aAAO;AAAA,EACX;AAEA,UAAQ,YAAAA,QAAK,QAAQ,IAAI,EAAE,YAAY,GAAG;AAAA,IACxC,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,EACX;AAEA,SAAO;AACT;AAEA,QAAQ,IAAI,gBAAgB;AAE5B,SAAS,WAAW,KAAK;AACvB,SAAO,gBAAAC,QAAG,WAAW,GAAG,KAAK,CAAC,gBAAAA,QAAG,WAAW,YAAAD,QAAK,KAAK,KAAK,UAAU,CAAC;AACxE;AAEO,SAAS,OAAO;AACrB,aAAW,OAAO,CAAC,YAAY,WAAW,QAAQ,UAAU,YAAY,mBAAmB,QAAQ,GAAG;AACpG,QAAI,CAAC,WAAW,GAAG,EAAG;AAEtB,oBAAAC,QAAG,SAAS,KAAK,YAAAD,QAAK,KAAK,SAAS,GAAG,GAAG;AAAA,MACxC,OAAO,KAAK;AACV,YAAI,QAAQ,qBAAqB,QAAQ,cAAc,CAAC,MAAM,GAAG,EAAG,QAAO;AAC3E,YAAI,gBAAAC,QAAG,UAAU,GAAG,EAAE,OAAO,EAAG,SAAQ,IAAI,KAAK,GAAG;AACpD,eAAO;AAAA,MACT;AAAA,IACF,CAAC;AAAA,EACH;AAEA,MAAI,WAAW,QAAQ,GAAG;AACxB,oBAAAA,QAAG,SAAS,UAAU,SAAS;AAAA,MAC7B,OAAO,KAAK;AACV,YAAI,gBAAAA,QAAG,UAAU,GAAG,EAAE,OAAO,EAAG,SAAQ,IAAI,KAAK,GAAG;AACpD,eAAO;AAAA,MACT;AAAA,IACF,CAAC;AAAA,EACH;AACF;AAEA,KAAK;","names":["path","fs"]}
|
|
@@ -33,15 +33,6 @@ var import_path2 = __toESM(require("path"), 1);
|
|
|
33
33
|
var import_keyring = require("@napi-rs/keyring");
|
|
34
34
|
var import_prompts = __toESM(require("prompts"), 1);
|
|
35
35
|
|
|
36
|
-
// bin/find-root.ts
|
|
37
|
-
var import_fs = __toESM(require("fs"), 1);
|
|
38
|
-
var import_path = __toESM(require("path"), 1);
|
|
39
|
-
var folders = process.cwd().split(import_path.default.sep);
|
|
40
|
-
var rootIndex = folders.findIndex((folder, i) => import_fs.default.existsSync(import_path.default.join(folders.slice(0, i + 1).join(import_path.default.sep), "package.json")));
|
|
41
|
-
var root = (rootIndex > 0 ? folders.slice(0, rootIndex + 1) : folders).join(import_path.default.sep);
|
|
42
|
-
console.log("project directory:", root);
|
|
43
|
-
var pkg = JSON.parse(import_fs.default.readFileSync(import_path.default.join(root, "package.json"), "utf-8"));
|
|
44
|
-
|
|
45
36
|
// bin/crypto.ts
|
|
46
37
|
var import_crypto = __toESM(require("crypto"), 1);
|
|
47
38
|
function decrypt({ ciphertext, iv, tag, salt, iterations, keyLength, algorithm }, passphrase) {
|
|
@@ -53,6 +44,15 @@ function decrypt({ ciphertext, iv, tag, salt, iterations, keyLength, algorithm }
|
|
|
53
44
|
return decrypted;
|
|
54
45
|
}
|
|
55
46
|
|
|
47
|
+
// bin/find-root.ts
|
|
48
|
+
var import_fs = __toESM(require("fs"), 1);
|
|
49
|
+
var import_path = __toESM(require("path"), 1);
|
|
50
|
+
var folders = process.cwd().split(import_path.default.sep);
|
|
51
|
+
var rootIndex = folders.findIndex((folder, i) => import_fs.default.existsSync(import_path.default.join(folders.slice(0, i + 1).join(import_path.default.sep), "package.json")));
|
|
52
|
+
var root = (rootIndex > 0 ? folders.slice(0, rootIndex + 1) : folders).join(import_path.default.sep);
|
|
53
|
+
console.log("project directory:", root);
|
|
54
|
+
var pkg = JSON.parse(import_fs.default.readFileSync(import_path.default.join(root, "package.json"), "utf-8"));
|
|
55
|
+
|
|
56
56
|
// bin/fetch-log.ts
|
|
57
57
|
async function getPassphrase(service, account) {
|
|
58
58
|
const entry = new import_keyring.Entry(service, account);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../bin/fetch-log.ts","../../../bin/find-root.ts","../../../bin/crypto.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { Command } from 'commander'\nimport crypto from 'crypto'\nimport fs from 'fs'\nimport StreamZip from 'node-stream-zip'\nimport { Readable } from 'node:stream'\nimport { finished } from 'node:stream/promises'\nimport path from 'path'\n\nimport { Entry as KeyRingEntry } from '@napi-rs/keyring'\nimport prompts from 'prompts'\n\n// @ts-expect-error TS2835\nimport { pkg } from './find-root'\n// @ts-expect-error TS2835\nimport { decrypt } from './crypto'\n\nasync function getPassphrase(service, account): Promise<string> {\n const entry = new KeyRingEntry(service, account)\n let passphrase = entry.getPassword()\n if (!passphrase) {\n const response = await prompts({\n type: 'password',\n name: 'passphrase',\n message: `Enter a passphrase to decrypt your private key for ${service} ${account}:`,\n })\n entry.setPassword(passphrase = response.passphrase)\n }\n return passphrase\n}\n\nconst oops = (...args) => {\n console.error(...args)\n process.exit(1)\n}\n\nconst program = new Command()\nprogram\n .description('A script to generate and store an RSA key pair in an encrypted file.')\n .option('-p, --private <path>', 'Path for the encrypted private key .pem.json file', 'private.pem.json')\n .argument('<debug log id>', 'debug log ID to fetch')\n .parse(process.argv)\nconst options = program.opts()\nconst args = program.args\n\nif (!args.length) oops('No log ID')\n\nlet m = args[0].match(/^(?<key>[a-z0-9]+)-(?<host>[^-]+)-(?<remote>[^.]+)(?<tags>.*)$/i)\nif (!m) oops(args[0], 'is not a valid log ID')\n\nif (m.groups.host !== '0x0') oops('Unexpected debug log host', m.groups.host)\n\noptions.encrypted = m.groups.tags.split('.').includes('enc')\noptions.zip = path.join('logs', `${m.groups.key}.zip`)\noptions.url = `https://0x0.st/${m.groups.remote}.zip`\n\nif (options.encrypted) {\n if (!options.private) oops('No private key provided')\n if (!fs.existsSync(options.private)) oops('Private key', options.private, 'does not exist')\n if (!fs.existsSync('package.json')) oops('package.json does not exist in the current directory')\n}\n\nconst logs = path.join('logs', m.groups!.key)\nconsole.log(options.url, '=>', logs)\nif (!fs.existsSync(logs)) {\n fs.mkdirSync(logs, { recursive: true })\n}\n\nasync function main() {\n try {\n const response = await fetch(options.url, {\n method: 'GET',\n headers: {\n 'User-Agent': `Zotero plugin log fetcher ${pkg.version}`,\n Accept: '*/*',\n },\n })\n if (!response.ok) oops(`Failed to download: ${response.statusText}`)\n\n const readable = Readable.fromWeb(response.body as any)\n const download = fs.createWriteStream(options.zip)\n await finished(readable.pipe(download))\n\n let privateKey\n if (options.encrypted) {\n const passphrase = await getPassphrase(`${pkg.name} Zotero plugin`, 'debug-log')\n privateKey = decrypt(JSON.parse(fs.readFileSync(options.private, 'utf-8')), passphrase)\n }\n\n const zipfile = new StreamZip.async({ file: options.zip })\n let decryptionKey: Buffer\n const fileEntries: Record<string, { filename: string; contents?: string; iv?: string; encrypted?: boolean }> = {}\n for (const entry of Object.values(await zipfile.entries())) {\n if (entry.isDirectory) continue\n\n const m = entry.name.match(/(?<filename>.+)\\.(?<type>key|enc|iv)$/i)\n let filename = m?.groups!.filename || entry.name\n const type = (m?.groups!.type || '').toLowerCase()\n\n if (type && !options.encrypted) oops('unexpected', type, 'file in non-encrypted log')\n\n if (type === 'key') {\n decryptionKey = crypto.privateDecrypt({\n key: privateKey,\n padding: crypto.constants.RSA_PKCS1_OAEP_PADDING,\n oaepHash: 'sha256',\n }, await zipfile.entryData(entry.name))\n }\n else {\n const key = filename.toLowerCase()\n const f = fileEntries[key] = fileEntries[key] || { filename }\n f[type === 'iv' ? 'iv' : 'contents'] = entry.name\n if (type) f.encrypted = true\n }\n }\n\n if (options.encrypted && !decryptionKey) oops('no key file found')\n\n for (const entry of Object.values(fileEntries)) {\n if (!entry.contents) oops('no contents for', entry.filename)\n if (entry.encrypted && !entry.iv) oops('no iv for', entry.filename)\n\n const data = await zipfile.entryData(entry.contents)\n const target = path.join('logs', entry.filename)\n\n if (entry.iv) {\n const iv = await zipfile.entryData(entry.iv)\n const tag = data.slice(-16)\n const ciphertext = data.slice(0, -16)\n const decipher = crypto.createDecipheriv('aes-256-gcm', decryptionKey, iv)\n decipher.setAuthTag(tag)\n const decrypted = Buffer.concat([decipher.update(ciphertext), decipher.final()])\n fs.writeFileSync(target, decrypted)\n }\n else {\n fs.writeFileSync(target, data)\n }\n }\n }\n finally {\n if (fs.existsSync(options.zip)) fs.unlinkSync(options.zip)\n }\n}\n\nmain().catch(err => {\n oops(err.message)\n})\n","import fs from 'fs'\nimport path from '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","import crypto from 'crypto'\n\nexport type Encrypted = {\n ciphertext: string\n iv: string\n tag: string\n salt: string\n iterations: number\n keyLength: number\n algorithm: 'aes-256-gcm'\n}\n\nexport function encrypt(plaintext: string, passphrase: string): Encrypted {\n const salt = crypto.randomBytes(16)\n const iterations = 100000\n const keyLength = 32\n const algorithm = 'aes-256-gcm'\n\n const key = crypto.pbkdf2Sync(passphrase, salt, iterations, keyLength, 'sha256')\n const iv = crypto.randomBytes(12)\n\n const cipher = crypto.createCipheriv(algorithm, key, iv)\n\n let ciphertext = cipher.update(plaintext, 'utf8', 'base64')\n ciphertext += cipher.final('base64')\n\n const tag = cipher.getAuthTag()\n\n return {\n ciphertext,\n iv: iv.toString('base64'),\n tag: tag.toString('base64'),\n salt: salt.toString('base64'),\n iterations,\n keyLength,\n algorithm,\n }\n}\n\nexport function decrypt({ ciphertext, iv, tag, salt, iterations, keyLength, algorithm }: Encrypted, passphrase: string): string {\n const key = crypto.pbkdf2Sync(passphrase, Buffer.from(salt, 'base64'), iterations, keyLength, 'sha256')\n const decipher = crypto.createDecipheriv(algorithm, key, Buffer.from(iv, 'base64'))\n decipher.setAuthTag(Buffer.from(tag, 'base64'))\n let decrypted = decipher.update(ciphertext, 'base64', 'utf8')\n decrypted += decipher.final('utf8')\n return decrypted\n}\n"],"mappings":"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","names":["import_crypto","import_fs","import_path","path","fs","crypto","KeyRingEntry","prompts","args","path","fs","StreamZip","m","crypto"]}
|
|
1
|
+
{"version":3,"sources":["../../../bin/fetch-log.ts","../../../bin/crypto.ts","../../../bin/find-root.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { Command } from 'commander'\nimport crypto from 'crypto'\nimport fs from 'fs'\nimport StreamZip from 'node-stream-zip'\nimport { Readable } from 'node:stream'\nimport { finished } from 'node:stream/promises'\nimport path from 'path'\n\nimport { Entry as KeyRingEntry } from '@napi-rs/keyring'\nimport prompts from 'prompts'\n\nimport { decrypt } from './crypto'\nimport { pkg } from './find-root'\n\nasync function getPassphrase(service, account): Promise<string> {\n const entry = new KeyRingEntry(service, account)\n let passphrase = entry.getPassword()\n if (!passphrase) {\n const response = await prompts({\n type: 'password',\n name: 'passphrase',\n message: `Enter a passphrase to decrypt your private key for ${service} ${account}:`,\n })\n entry.setPassword(passphrase = response.passphrase)\n }\n return passphrase\n}\n\nconst oops = (...args) => {\n console.error(...args)\n process.exit(1)\n}\n\nconst program = new Command()\nprogram\n .description('A script to generate and store an RSA key pair in an encrypted file.')\n .option('-p, --private <path>', 'Path for the encrypted private key .pem.json file', 'private.pem.json')\n .argument('<debug log id>', 'debug log ID to fetch')\n .parse(process.argv)\nconst options = program.opts()\nconst args = program.args\n\nif (!args.length) oops('No log ID')\n\nlet m = args[0].match(/^(?<key>[a-z0-9]+)-(?<host>[^-]+)-(?<remote>[^.]+)(?<tags>.*)$/i)\nif (!m) oops(args[0], 'is not a valid log ID')\n\nif (m.groups.host !== '0x0') oops('Unexpected debug log host', m.groups.host)\n\noptions.encrypted = m.groups.tags.split('.').includes('enc')\noptions.zip = path.join('logs', `${m.groups.key}.zip`)\noptions.url = `https://0x0.st/${m.groups.remote}.zip`\n\nif (options.encrypted) {\n if (!options.private) oops('No private key provided')\n if (!fs.existsSync(options.private)) oops('Private key', options.private, 'does not exist')\n if (!fs.existsSync('package.json')) oops('package.json does not exist in the current directory')\n}\n\nconst logs = path.join('logs', m.groups!.key)\nconsole.log(options.url, '=>', logs)\nif (!fs.existsSync(logs)) {\n fs.mkdirSync(logs, { recursive: true })\n}\n\nasync function main() {\n try {\n const response = await fetch(options.url, {\n method: 'GET',\n headers: {\n 'User-Agent': `Zotero plugin log fetcher ${pkg.version}`,\n Accept: '*/*',\n },\n })\n if (!response.ok) oops(`Failed to download: ${response.statusText}`)\n\n const readable = Readable.fromWeb(response.body as any)\n const download = fs.createWriteStream(options.zip)\n await finished(readable.pipe(download))\n\n let privateKey\n if (options.encrypted) {\n const passphrase = await getPassphrase(`${pkg.name} Zotero plugin`, 'debug-log')\n privateKey = decrypt(JSON.parse(fs.readFileSync(options.private, 'utf-8')), passphrase)\n }\n\n const zipfile = new StreamZip.async({ file: options.zip })\n let decryptionKey: Buffer\n const fileEntries: Record<string, { filename: string; contents?: string; iv?: string; encrypted?: boolean }> = {}\n for (const entry of Object.values(await zipfile.entries())) {\n if (entry.isDirectory) continue\n\n const m = entry.name.match(/(?<filename>.+)\\.(?<type>key|enc|iv)$/i)\n let filename = m?.groups!.filename || entry.name\n const type = (m?.groups!.type || '').toLowerCase()\n\n if (type && !options.encrypted) oops('unexpected', type, 'file in non-encrypted log')\n\n if (type === 'key') {\n decryptionKey = crypto.privateDecrypt({\n key: privateKey,\n padding: crypto.constants.RSA_PKCS1_OAEP_PADDING,\n oaepHash: 'sha256',\n }, await zipfile.entryData(entry.name))\n }\n else {\n const key = filename.toLowerCase()\n const f = fileEntries[key] = fileEntries[key] || { filename }\n f[type === 'iv' ? 'iv' : 'contents'] = entry.name\n if (type) f.encrypted = true\n }\n }\n\n if (options.encrypted && !decryptionKey) oops('no key file found')\n\n for (const entry of Object.values(fileEntries)) {\n if (!entry.contents) oops('no contents for', entry.filename)\n if (entry.encrypted && !entry.iv) oops('no iv for', entry.filename)\n\n const data = await zipfile.entryData(entry.contents)\n const target = path.join('logs', entry.filename)\n\n if (entry.iv) {\n const iv = await zipfile.entryData(entry.iv)\n const tag = data.slice(-16)\n const ciphertext = data.slice(0, -16)\n const decipher = crypto.createDecipheriv('aes-256-gcm', decryptionKey, iv)\n decipher.setAuthTag(tag)\n const decrypted = Buffer.concat([decipher.update(ciphertext), decipher.final()])\n fs.writeFileSync(target, decrypted)\n }\n else {\n fs.writeFileSync(target, data)\n }\n }\n }\n finally {\n if (fs.existsSync(options.zip)) fs.unlinkSync(options.zip)\n }\n}\n\nmain().catch(err => {\n oops(err.message)\n})\n","import crypto from 'crypto'\n\nexport type Encrypted = {\n ciphertext: string\n iv: string\n tag: string\n salt: string\n iterations: number\n keyLength: number\n algorithm: 'aes-256-gcm'\n}\n\nexport function encrypt(plaintext: string, passphrase: string): Encrypted {\n const salt = crypto.randomBytes(16)\n const iterations = 100000\n const keyLength = 32\n const algorithm = 'aes-256-gcm'\n\n const key = crypto.pbkdf2Sync(passphrase, salt, iterations, keyLength, 'sha256')\n const iv = crypto.randomBytes(12)\n\n const cipher = crypto.createCipheriv(algorithm, key, iv)\n\n let ciphertext = cipher.update(plaintext, 'utf8', 'base64')\n ciphertext += cipher.final('base64')\n\n const tag = cipher.getAuthTag()\n\n return {\n ciphertext,\n iv: iv.toString('base64'),\n tag: tag.toString('base64'),\n salt: salt.toString('base64'),\n iterations,\n keyLength,\n algorithm,\n }\n}\n\nexport function decrypt({ ciphertext, iv, tag, salt, iterations, keyLength, algorithm }: Encrypted, passphrase: string): string {\n const key = crypto.pbkdf2Sync(passphrase, Buffer.from(salt, 'base64'), iterations, keyLength, 'sha256')\n const decipher = crypto.createDecipheriv(algorithm, key, Buffer.from(iv, 'base64'))\n decipher.setAuthTag(Buffer.from(tag, 'base64'))\n let decrypted = decipher.update(ciphertext, 'base64', 'utf8')\n decrypted += decipher.final('utf8')\n return decrypted\n}\n","import fs from 'fs'\nimport path from '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":["import_crypto","import_fs","import_path","crypto","path","fs","KeyRingEntry","prompts","args","path","fs","StreamZip","m","crypto"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../bin/keypair.ts","../../../bin/crypto.ts"],"sourcesContent":["#!/usr/bin/env node\n\n// This script generates an RSA key pair and encrypts the private key using GPG with a symmetric key.\n// You must have the 'gpg' command-line tool installed on your system.\n// (e.g., `brew install gpg` on macOS, `sudo apt-get install gnupg` on Debian/Ubuntu).\n\nimport { Command } from 'commander'\nimport crypto from 'crypto'\nimport { stat, writeFile } from 'fs/promises'\nimport { resolve } from 'path'\nimport prompts from 'prompts'\n\
|
|
1
|
+
{"version":3,"sources":["../../../bin/keypair.ts","../../../bin/crypto.ts"],"sourcesContent":["#!/usr/bin/env node\n\n// This script generates an RSA key pair and encrypts the private key using GPG with a symmetric key.\n// You must have the 'gpg' command-line tool installed on your system.\n// (e.g., `brew install gpg` on macOS, `sudo apt-get install gnupg` on Debian/Ubuntu).\n\nimport { Command } from 'commander'\nimport crypto from 'crypto'\nimport { stat, writeFile } from 'fs/promises'\nimport { resolve } from 'path'\nimport prompts from 'prompts'\n\nimport { encrypt } from './crypto'\n\nimport { config as dotenvConfig } from 'dotenv'\ndotenvConfig({ quiet: true, override: true })\n\nconst program = new Command()\nprogram\n .description('A script to generate and store an RSA key pair in an encrypted file.')\n .option('-p, --public <path>', 'Path for the public key .pem file', 'public.pem')\n .option('--private <path>', 'Path for the encrypted private key .pem.json file', 'private.pem.json')\n .option('-r, --replace', 'Replace existing files', false)\n .parse(process.argv)\nconst options = program.opts()\n\nasync function main() {\n try {\n const publicKeyPath = resolve(options.public)\n const encryptedKeyPath = resolve(options.private)\n\n if (!publicKeyPath.endsWith('.pem')) {\n console.error('Public key file must have a .pem extension.')\n process.exit(1)\n }\n if (!encryptedKeyPath.endsWith('.pem.json')) {\n console.error('Encrypted key file must have a .pem.json extension.')\n process.exit(1)\n }\n\n const fileExists = async (path: string) => {\n try {\n await stat(path)\n return true\n }\n catch (e: any) {\n if (e.code === 'ENOENT') {\n return false\n }\n throw e\n }\n }\n\n if (await fileExists(publicKeyPath) && !options.replace) {\n console.error(`Will not overwrite existing public key file: ${publicKeyPath}`)\n process.exit(1)\n }\n if (await fileExists(encryptedKeyPath) && !options.replace) {\n console.error(`Will not overwrite existing encrypted key file: ${encryptedKeyPath}`)\n process.exit(1)\n }\n\n const { privateKey, publicKey } = crypto.generateKeyPairSync('rsa', {\n modulusLength: 2048,\n publicKeyEncoding: {\n type: 'spki',\n format: 'pem',\n },\n privateKeyEncoding: {\n type: 'pkcs8',\n format: 'pem',\n },\n })\n\n const { passphrase } = await prompts({\n type: 'password',\n name: 'passphrase',\n message: 'Enter a passphrase to encrypt your private key:',\n })\n\n if (!passphrase) {\n console.error('Passphrase is required for encryption.')\n process.exit(1)\n }\n\n await writeFile(encryptedKeyPath, JSON.stringify(encrypt(privateKey, passphrase), null, 2))\n console.log(`Encrypted private key saved to: ${encryptedKeyPath}`)\n\n await writeFile(publicKeyPath, publicKey)\n console.log(`Public key saved to: ${publicKeyPath}`)\n }\n catch (error) {\n throw error\n /*\n if (error instanceof Error) {\n console.error('An error occurred:', error.message)\n }\n else {\n console.error('An unknown error occurred:', error)\n }\n process.exit(1)\n */\n }\n}\n\nmain()\n","import crypto from 'crypto'\n\nexport type Encrypted = {\n ciphertext: string\n iv: string\n tag: string\n salt: string\n iterations: number\n keyLength: number\n algorithm: 'aes-256-gcm'\n}\n\nexport function encrypt(plaintext: string, passphrase: string): Encrypted {\n const salt = crypto.randomBytes(16)\n const iterations = 100000\n const keyLength = 32\n const algorithm = 'aes-256-gcm'\n\n const key = crypto.pbkdf2Sync(passphrase, salt, iterations, keyLength, 'sha256')\n const iv = crypto.randomBytes(12)\n\n const cipher = crypto.createCipheriv(algorithm, key, iv)\n\n let ciphertext = cipher.update(plaintext, 'utf8', 'base64')\n ciphertext += cipher.final('base64')\n\n const tag = cipher.getAuthTag()\n\n return {\n ciphertext,\n iv: iv.toString('base64'),\n tag: tag.toString('base64'),\n salt: salt.toString('base64'),\n iterations,\n keyLength,\n algorithm,\n }\n}\n\nexport function decrypt({ ciphertext, iv, tag, salt, iterations, keyLength, algorithm }: Encrypted, passphrase: string): string {\n const key = crypto.pbkdf2Sync(passphrase, Buffer.from(salt, 'base64'), iterations, keyLength, 'sha256')\n const decipher = crypto.createDecipheriv(algorithm, key, Buffer.from(iv, 'base64'))\n decipher.setAuthTag(Buffer.from(tag, 'base64'))\n let decrypted = decipher.update(ciphertext, 'base64', 'utf8')\n decrypted += decipher.final('utf8')\n return decrypted\n}\n"],"mappings":"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","names":["import_crypto","crypto","dotenvConfig","crypto","prompts"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../bin/link.ts","../../../bin/find-root.ts"],"sourcesContent":["#!/usr/bin/env node\n\n/* eslint-disable @typescript-eslint/no-unsafe-argument, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-assignment, @typescript-eslint/restrict-template-expressions, @typescript-eslint/no-unsafe-call */\n\nimport * as fs from 'fs'\nimport * as path from 'path'\n\
|
|
1
|
+
{"version":3,"sources":["../../../bin/link.ts","../../../bin/find-root.ts"],"sourcesContent":["#!/usr/bin/env node\n\n/* eslint-disable @typescript-eslint/no-unsafe-argument, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-assignment, @typescript-eslint/restrict-template-expressions, @typescript-eslint/no-unsafe-call */\n\nimport * as fs from 'fs'\nimport * as path from 'path'\n\nimport { pkg, root } from './find-root'\n\nif (!pkg.id) pkg.id = `${pkg.name}@${pkg.author.email.replace(/.*@/, '')}`.toLowerCase()\nif (pkg.xpi) Object.assign(pkg, pkg.xpi)\n\nconst build = path.join(root, 'build')\n\nconst zotero = process.argv[2]\n\nif (!zotero) {\n console.log('No directory specified') // eslint-disable-line no-console\n process.exit(1)\n}\n\nconst extensions = path.join(zotero, 'extensions')\nif (!fs.existsSync(extensions)) {\n console.log(`${extensions} does not exist`) // eslint-disable-line no-console\n process.exit(1)\n}\n\nconst extension = path.join(extensions, pkg.id)\n\nfs.writeFileSync(extension, build)\n","import fs from 'fs'\nimport path from '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":";;;;;;;;;;;;;;;;;;;;;;;;;AAIA,IAAAA,MAAoB;AACpB,IAAAC,QAAsB;;;ACLtB,gBAAe;AACf,kBAAiB;AAEjB,IAAM,UAAU,QAAQ,IAAI,EAAE,MAAM,YAAAC,QAAK,GAAG;AAC5C,IAAM,YAAY,QAAQ,UAAU,CAAC,QAAgB,MAAc,UAAAC,QAAG,WAAW,YAAAD,QAAK,KAAK,QAAQ,MAAM,GAAG,IAAI,CAAC,EAAE,KAAK,YAAAA,QAAK,GAAG,GAAG,cAAc,CAAC,CAAC;AAC5I,IAAM,QAAQ,YAAY,IAAI,QAAQ,MAAM,GAAG,YAAY,CAAC,IAAI,SAAS,KAAK,YAAAA,QAAK,GAAG;AAC7F,QAAQ,IAAI,sBAAsB,IAAI;AAE/B,IAAM,MAAM,KAAK,MAAM,UAAAC,QAAG,aAAa,YAAAD,QAAK,KAAK,MAAM,cAAc,GAAG,OAAO,CAAC;;;ADCvF,IAAI,CAAC,IAAI,GAAI,KAAI,KAAK,GAAG,IAAI,IAAI,IAAI,IAAI,OAAO,MAAM,QAAQ,OAAO,EAAE,CAAC,GAAG,YAAY;AACvF,IAAI,IAAI,IAAK,QAAO,OAAO,KAAK,IAAI,GAAG;AAEvC,IAAM,QAAa,WAAK,MAAM,OAAO;AAErC,IAAM,SAAS,QAAQ,KAAK,CAAC;AAE7B,IAAI,CAAC,QAAQ;AACX,UAAQ,IAAI,wBAAwB;AACpC,UAAQ,KAAK,CAAC;AAChB;AAEA,IAAM,aAAkB,WAAK,QAAQ,YAAY;AACjD,IAAI,CAAI,eAAW,UAAU,GAAG;AAC9B,UAAQ,IAAI,GAAG,UAAU,iBAAiB;AAC1C,UAAQ,KAAK,CAAC;AAChB;AAEA,IAAM,YAAiB,WAAK,YAAY,IAAI,EAAE;AAE3C,kBAAc,WAAW,KAAK;","names":["fs","path","path","fs"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../bin/make-dirs.ts","../../../bin/find-root.ts"],"sourcesContent":["/* eslint-disable no-console, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call */\n\nimport * as fs from 'fs'\nimport * as path from 'path'\nimport { rimrafSync } from 'rimraf'\n\
|
|
1
|
+
{"version":3,"sources":["../../../bin/make-dirs.ts","../../../bin/find-root.ts"],"sourcesContent":["/* eslint-disable no-console, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call */\n\nimport * as fs from 'fs'\nimport * as path from 'path'\nimport { rimrafSync } from 'rimraf'\n\nimport { root } from './find-root'\n\nconsole.log('make build dirs')\nfor (const dir of [path.join(root, 'build'), path.join(root, 'gen'), path.join(root, 'xpi')]) {\n rimrafSync(dir)\n fs.mkdirSync(dir)\n}\n","import fs from 'fs'\nimport path from '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":";;;;;;;;;;;;;;;;;;;;;;;;AAEA,IAAAA,MAAoB;AACpB,IAAAC,QAAsB;AACtB,oBAA2B;;;ACJ3B,gBAAe;AACf,kBAAiB;AAEjB,IAAM,UAAU,QAAQ,IAAI,EAAE,MAAM,YAAAC,QAAK,GAAG;AAC5C,IAAM,YAAY,QAAQ,UAAU,CAAC,QAAgB,MAAc,UAAAC,QAAG,WAAW,YAAAD,QAAK,KAAK,QAAQ,MAAM,GAAG,IAAI,CAAC,EAAE,KAAK,YAAAA,QAAK,GAAG,GAAG,cAAc,CAAC,CAAC;AAC5I,IAAM,QAAQ,YAAY,IAAI,QAAQ,MAAM,GAAG,YAAY,CAAC,IAAI,SAAS,KAAK,YAAAA,QAAK,GAAG;AAC7F,QAAQ,IAAI,sBAAsB,IAAI;AAE/B,IAAM,MAAM,KAAK,MAAM,UAAAC,QAAG,aAAa,YAAAD,QAAK,KAAK,MAAM,cAAc,GAAG,OAAO,CAAC;;;ADAvF,QAAQ,IAAI,iBAAiB;AAC7B,WAAW,OAAO,CAAM,WAAK,MAAM,OAAO,GAAQ,WAAK,MAAM,KAAK,GAAQ,WAAK,MAAM,KAAK,CAAC,GAAG;AAC5F,gCAAW,GAAG;AACd,EAAG,cAAU,GAAG;AAClB;","names":["fs","path","path","fs"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"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\n// @ts-expect-error TS2835\nimport { pkg, root } from './find-root'\n// @ts-expect-error TS2835\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.0', maxVersion: '8.*', ...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 trict_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 'fs'\nimport path from '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 'fs'\nimport os from 'os'\nimport path from 'path'\n\n// @ts-expect-error TS2835\nimport { ContinuousIntegration as CI } from './continuous-integration'\n// @ts-expect-error TS2835\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 '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_fs","import_path","os","path","fs","glob","msg","attr","basename"]}
|
|
1
|
+
{"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.0', maxVersion: '8.*', ...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 trict_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 'fs'\nimport path from '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 'fs'\nimport os from 'os'\nimport path from '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 '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_fs","import_path","os","path","fs","glob","msg","attr","basename"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"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\n// @ts-expect-error TS2835\nimport { ContinuousIntegration as CI } from './continuous-integration'\n\n// @ts-expect-error TS2835\nimport { pkg, root } from './find-root'\n// @ts-expect-error TS2835\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 \"Add-ons\", open the gear menu in the top right, and select \"Install Add-on 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 '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 'fs'\nimport path from '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 'fs'\nimport os from 'os'\nimport path from 'path'\n\n// @ts-expect-error TS2835\nimport { ContinuousIntegration as CI } from './continuous-integration'\n// @ts-expect-error TS2835\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_fs","import_path","os","path","fs","moment"]}
|
|
1
|
+
{"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 \"Add-ons\", open the gear menu in the top right, and select \"Install Add-on 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 '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 'fs'\nimport path from '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 'fs'\nimport os from 'os'\nimport path from '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_fs","import_path","os","path","fs","moment"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../bin/version.ts","../../../bin/continuous-integration.ts","../../../bin/find-root.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport fs from 'fs'\nimport os from 'os'\nimport path from 'path'\n\
|
|
1
|
+
{"version":3,"sources":["../../../bin/version.ts","../../../bin/continuous-integration.ts","../../../bin/find-root.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport fs from 'fs'\nimport os from 'os'\nimport path from '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 '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 'fs'\nimport path from '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":["import_fs","import_path","path","fs","os","path","fs"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../bin/zipup.ts","../../../bin/find-root.ts","../../../bin/version.ts","../../../bin/continuous-integration.ts"],"sourcesContent":["#!/usr/bin/env node\n\n/* eslint-disable @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call */\n\nimport archiver from 'archiver'\nimport * as fs from 'fs'\nimport * as path from 'path'\n\
|
|
1
|
+
{"version":3,"sources":["../../../bin/zipup.ts","../../../bin/find-root.ts","../../../bin/version.ts","../../../bin/continuous-integration.ts"],"sourcesContent":["#!/usr/bin/env node\n\n/* eslint-disable @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call */\n\nimport archiver from 'archiver'\nimport * as fs from 'fs'\nimport * as path from 'path'\n\nimport { root } from './find-root'\nimport { version } from './version'\n\nconst [, , source, target] = process.argv\n\nconst xpi = path.join(root, 'xpi', `${target}-${version()}.xpi`)\nconsole.log(`creating ${xpi}`) // eslint-disable-line no-console\nif (fs.existsSync(xpi)) fs.unlinkSync(xpi)\nif (!fs.existsSync(path.dirname(xpi))) fs.mkdirSync(path.dirname(xpi))\n\nasync function main() {\n await new Promise<void>((resolve, reject) => {\n const xpi = path.join(root, 'xpi', `${target}-${version()}.xpi`)\n const output = fs.createWriteStream(xpi)\n const archive = archiver('zip', { zlib: { level: 9 } })\n\n output.on('close', () => {\n console.log(archive.pointer() + ' total bytes')\n console.log('Archiver has been finalized and the output file descriptor has closed.')\n resolve()\n })\n\n archive.on('warning', err => {\n if (err.code === 'ENOENT') {\n console.warn(err.message)\n }\n else {\n console.error(err)\n }\n })\n\n archive.on('error', err => {\n reject(err)\n })\n\n archive.pipe(output)\n\n // Add files to the archive\n archive.directory(`${root}/${source}`, false)\n\n archive.finalize()\n })\n}\n\nmain().catch(err => {\n console.log(err)\n process.exit(1)\n})\n","import fs from 'fs'\nimport path from '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 'fs'\nimport os from 'os'\nimport path from '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 '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_fs","import_path","os","path","fs","xpi","archiver"]}
|
package/dist/cjs/debug-log.cjs
CHANGED
|
@@ -37,7 +37,7 @@ module.exports = __toCommonJS(debug_log_exports);
|
|
|
37
37
|
// package.json
|
|
38
38
|
var package_default = {
|
|
39
39
|
"name": "zotero-plugin",
|
|
40
|
-
"version": "7.0.
|
|
40
|
+
"version": "7.0.11",
|
|
41
41
|
"description": "Zotero plugin builder",
|
|
42
42
|
"homepage": "https://github.com/retorquere/zotero-plugin/wiki",
|
|
43
43
|
"type": "module",
|