zotero-plugin 8.0.2 → 8.0.4
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 +6 -6
- package/dist/cjs/bin/branches.cjs.map +1 -1
- package/dist/cjs/bin/continuous-integration.cjs.map +1 -1
- package/dist/cjs/bin/fetch-log.cjs +20 -20
- package/dist/cjs/bin/fetch-log.cjs.map +1 -1
- package/dist/cjs/bin/find-root.cjs +6 -6
- package/dist/cjs/bin/find-root.cjs.map +1 -1
- package/dist/cjs/bin/link.cjs +6 -6
- package/dist/cjs/bin/link.cjs.map +1 -1
- package/dist/cjs/bin/make-dirs.cjs +6 -6
- package/dist/cjs/bin/make-dirs.cjs.map +1 -1
- package/dist/cjs/bin/make-manifest.cjs +13 -13
- package/dist/cjs/bin/make-manifest.cjs.map +1 -1
- package/dist/cjs/bin/release.cjs +13 -13
- package/dist/cjs/bin/release.cjs.map +1 -1
- package/dist/cjs/bin/version.cjs +13 -13
- package/dist/cjs/bin/version.cjs.map +1 -1
- package/dist/cjs/bin/zipup.cjs +29 -16
- package/dist/cjs/bin/zipup.cjs.map +1 -1
- package/dist/cjs/debug-log.cjs +8 -8
- package/dist/cjs/debug-log.cjs.map +1 -1
- package/dist/cjs/tsup.config.cjs +187 -112
- package/dist/cjs/tsup.config.cjs.map +1 -1
- package/dist/esm/bin/branches.js.map +1 -1
- package/dist/esm/bin/continuous-integration.js.map +1 -1
- package/dist/esm/bin/fetch-log.js.map +1 -1
- package/dist/esm/bin/find-root.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 +16 -3
- package/dist/esm/bin/zipup.js.map +1 -1
- package/dist/esm/debug-log.js +8 -8
- package/dist/esm/debug-log.js.map +1 -1
- package/dist/esm/tsup.config.js +187 -112
- package/dist/esm/tsup.config.js.map +1 -1
- package/package.json +8 -8
|
@@ -27,13 +27,13 @@ var import_config = require("dotenv/config");
|
|
|
27
27
|
var import_rest = require("@octokit/rest");
|
|
28
28
|
|
|
29
29
|
// bin/find-root.ts
|
|
30
|
-
var
|
|
31
|
-
var
|
|
32
|
-
var folders = process.cwd().split(
|
|
33
|
-
var rootIndex = folders.findIndex((folder, i) =>
|
|
34
|
-
var root = (rootIndex > 0 ? folders.slice(0, rootIndex + 1) : folders).join(
|
|
30
|
+
var import_node_fs = __toESM(require("fs"), 1);
|
|
31
|
+
var import_node_path = __toESM(require("path"), 1);
|
|
32
|
+
var folders = process.cwd().split(import_node_path.default.sep);
|
|
33
|
+
var rootIndex = folders.findIndex((folder, i) => import_node_fs.default.existsSync(import_node_path.default.join(folders.slice(0, i + 1).join(import_node_path.default.sep), "package.json")));
|
|
34
|
+
var root = (rootIndex > 0 ? folders.slice(0, rootIndex + 1) : folders).join(import_node_path.default.sep);
|
|
35
35
|
console.log("project directory:", root);
|
|
36
|
-
var pkg = JSON.parse(
|
|
36
|
+
var pkg = JSON.parse(import_node_fs.default.readFileSync(import_node_path.default.join(root, "package.json"), "utf-8"));
|
|
37
37
|
|
|
38
38
|
// bin/branches.ts
|
|
39
39
|
process.on("unhandledRejection", (up) => {
|
|
@@ -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'\n\nimport { Octokit } from '@octokit/rest'\nconst octokit = new Octokit({ auth: `token ${process.env.GITHUB_TOKEN}` })\n\nimport { pkg } 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;AAEP,kBAAwB;;;ACVxB,
|
|
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'\n\nimport { Octokit } from '@octokit/rest'\nconst octokit = new Octokit({ auth: `token ${process.env.GITHUB_TOKEN}` })\n\nimport { pkg } 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 '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":";;;;;;;;;;;;;;;;;;;;;;;;;AAQA,oBAAO;AAEP,kBAAwB;;;ACVxB,qBAAe;AACf,uBAAiB;AAEjB,IAAM,UAAU,QAAQ,IAAI,EAAE,MAAM,iBAAAA,QAAK,GAAG;AAC5C,IAAM,YAAY,QAAQ,UAAU,CAAC,QAAgB,MAAc,eAAAC,QAAG,WAAW,iBAAAD,QAAK,KAAK,QAAQ,MAAM,GAAG,IAAI,CAAC,EAAE,KAAK,iBAAAA,QAAK,GAAG,GAAG,cAAc,CAAC,CAAC;AAC5I,IAAM,QAAQ,YAAY,IAAI,QAAQ,MAAM,GAAG,YAAY,CAAC,IAAI,SAAS,KAAK,iBAAAA,QAAK,GAAG;AAC7F,QAAQ,IAAI,sBAAsB,IAAI;AAE/B,IAAM,MAAM,KAAK,MAAM,eAAAC,QAAG,aAAa,iBAAAD,QAAK,KAAK,MAAM,cAAc,GAAG,OAAO,CAAC;;;ADJvF,QAAQ,GAAG,sBAAsB,QAAM;AACrC,QAAM;AACR,CAAC;AAKD,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/continuous-integration.ts"],"sourcesContent":["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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oBAA+B;AAE/B,IAAM,iCAAN,MAAqC;AAAA,EAC5B,UAAU;AAAA,EACV;AAAA,EACA,MAAM;AAAA,EACN,iBAAiB;AAAA,EACjB,SAAS;AAAA,EACT,eAAe;AAAA,EACf,QAAQ;AAAA,EAEf,cAAc;AACZ,eAAW,CAAC,IAAI,IAAI,KAAK,OAAO,QAAQ,EAAE,UAAU,UAAU,QAAQ,UAAU,WAAW,aAAa,gBAAgB,SAAS,CAAC,GAAG;AACnI,UAAI,QAAQ,IAAI,EAAE,MAAM,OAAQ,MAAK,UAAU;AAAA,IACjD;AAEA,YAAQ,KAAK,SAAS;AAAA,MACpB,KAAK;AACH,aAAK,eAAe,KAAK,SAAS,QAAQ,IAAI,gBAAgB;AAC9D,YAAI;AACF,eAAK,MAAoB,uBAAS,8BAA8B,QAAQ,IAAI,WAAW,IAAI,EAAE,OAAO,OAAO,CAAC,EAAE,SAAS,EAAE,KAAK;AAAA,QAChI,SACO,KAAK;AACV,eAAK,MAAM;AAAA,QACb;AACA,aAAK,iBAA+B,uBAAS,4BAA4B,QAAQ,IAAI,WAAW,EAAE,EAAE,SAAS,EAAE,KAAK;AACpH,aAAK,SAAS,QAAQ,IAAI;AAC1B,aAAK,eAAe,CAAC,CAAC,QAAQ,IAAI;AAClC;AAAA,MAEF,KAAK;AACH,aAAK,eAAe,KAAK,SAAS,QAAQ,IAAI,iBAAiB;AAC/D,aAAK,iBAA+B,uBAAS,4BAA4B,QAAQ,IAAI,UAAU,EAAE,EAAE,SAAS,EAAE,KAAK;AACnH,aAAK,eAAe,QAAQ,IAAI,kBAAkB,WAAW,cAAc;AAE3E,YAAI,QAAQ,IAAI,iBAAiB;AAC/B,eAAK,SAAS,QAAQ,IAAI,gBAAgB,MAAM,GAAG,EAAE,IAAI;AAAA,QAC3D,WACS,QAAQ,IAAI,WAAW,WAAW,YAAY,GAAG;AAExD,eAAK,MAAM,QAAQ,IAAI,WAAW,MAAM,GAAG,EAAE,IAAI;AAAA,QACnD,WACS,QAAQ,IAAI,WAAW,WAAW,aAAa,GAAG;AACzD,eAAK,SAAS,QAAQ,IAAI,WAAW,MAAM,GAAG,EAAE,IAAI;AAAA,QACtD;AACA,aAAK,SAAS,KAAK,UAAU;AAC7B,aAAK,QAAQ,KAAK,OAAO,MAAM,eAAe,IAAI,CAAC,KAAK;AACxD;AAAA,MAEF;AACE,YAAI,QAAQ,IAAI,OAAO,OAAQ,OAAM,IAAI,MAAM,yBAAyB,KAAK,OAAO,EAAE;AAAA,IAC1F;AAAA,EACF;AAAA,EAEQ,SAAS,GAA4B;AAC3C,QAAI,OAAO,MAAM,SAAU,QAAO;AAClC,UAAM,MAAM,SAAS,CAAC;AACtB,QAAI,MAAM,GAAG,EAAG,OAAM,IAAI,MAAM,GAAG,CAAC,oBAAoB;AACxD,WAAO;AAAA,EACT;AACF;AAEO,IAAM,wBAAwB,IAAI,+BAA+B;","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../../bin/continuous-integration.ts"],"sourcesContent":["import * as child_process from 'node:child_process'\n\nclass ContinuousIntegrationSingleton {\n public service = ''\n public build_number: number\n public tag = ''\n public commit_message = ''\n public branch = ''\n public pull_request = false\n public issue = ''\n\n constructor() {\n for (const [id, name] of Object.entries({ CIRCLECI: 'Circle', TRAVIS: 'Travis', SEMAPHORE: 'Semaphore', GITHUB_ACTIONS: 'GitHub' })) {\n if (process.env[id] === 'true') this.service = name\n }\n\n switch (this.service) {\n case 'Circle':\n this.build_number = this.parseInt(process.env.CIRCLE_BUILD_NUM)\n try {\n this.tag = child_process.execSync(`git describe --exact-match ${process.env.CIRCLE_SHA1}`, { stdio: 'pipe' }).toString().trim()\n }\n catch (err) {\n this.tag = null\n }\n this.commit_message = child_process.execSync(`git log --format=%B -n 1 ${process.env.CIRCLE_SHA1}`).toString().trim()\n this.branch = process.env.CIRCLE_BRANCH\n this.pull_request = !!process.env.CIRCLE_PULL_REQUEST\n break\n\n case 'GitHub':\n this.build_number = this.parseInt(process.env.GITHUB_RUN_NUMBER)\n this.commit_message = child_process.execSync(`git log --format=%B -n 1 ${process.env.GITHUB_SHA}`).toString().trim()\n this.pull_request = process.env.GITHUB_EVENT_NAME.startsWith('pull-request')\n\n if (process.env.GITHUB_HEAD_REF) {\n this.branch = process.env.GITHUB_HEAD_REF.split('/').pop()\n }\n else if (process.env.GITHUB_REF.startsWith('refs/tags/')) {\n // leave branch undefined when tagged... not great\n this.tag = process.env.GITHUB_REF.split('/').pop()\n }\n else if (process.env.GITHUB_REF.startsWith('refs/heads/')) {\n this.branch = process.env.GITHUB_REF.split('/').pop()\n }\n this.branch = this.branch || ''\n this.issue = this.branch.match(/^gh-([0-9]+)$/)?.[1] || ''\n break\n\n default:\n if (process.env.CI === 'true') throw new Error(`Unexpected CI service ${this.service}`)\n }\n }\n\n private parseInt(n: number | string): number {\n if (typeof n === 'number') return n\n const int = parseInt(n)\n if (isNaN(int)) throw new Error(`${n} is not an integer`)\n return int\n }\n}\n\nexport const ContinuousIntegration = new ContinuousIntegrationSingleton() // eslint-disable-line @typescript-eslint/naming-convention,no-underscore-dangle,id-blacklist,id-match\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oBAA+B;AAE/B,IAAM,iCAAN,MAAqC;AAAA,EAC5B,UAAU;AAAA,EACV;AAAA,EACA,MAAM;AAAA,EACN,iBAAiB;AAAA,EACjB,SAAS;AAAA,EACT,eAAe;AAAA,EACf,QAAQ;AAAA,EAEf,cAAc;AACZ,eAAW,CAAC,IAAI,IAAI,KAAK,OAAO,QAAQ,EAAE,UAAU,UAAU,QAAQ,UAAU,WAAW,aAAa,gBAAgB,SAAS,CAAC,GAAG;AACnI,UAAI,QAAQ,IAAI,EAAE,MAAM,OAAQ,MAAK,UAAU;AAAA,IACjD;AAEA,YAAQ,KAAK,SAAS;AAAA,MACpB,KAAK;AACH,aAAK,eAAe,KAAK,SAAS,QAAQ,IAAI,gBAAgB;AAC9D,YAAI;AACF,eAAK,MAAoB,uBAAS,8BAA8B,QAAQ,IAAI,WAAW,IAAI,EAAE,OAAO,OAAO,CAAC,EAAE,SAAS,EAAE,KAAK;AAAA,QAChI,SACO,KAAK;AACV,eAAK,MAAM;AAAA,QACb;AACA,aAAK,iBAA+B,uBAAS,4BAA4B,QAAQ,IAAI,WAAW,EAAE,EAAE,SAAS,EAAE,KAAK;AACpH,aAAK,SAAS,QAAQ,IAAI;AAC1B,aAAK,eAAe,CAAC,CAAC,QAAQ,IAAI;AAClC;AAAA,MAEF,KAAK;AACH,aAAK,eAAe,KAAK,SAAS,QAAQ,IAAI,iBAAiB;AAC/D,aAAK,iBAA+B,uBAAS,4BAA4B,QAAQ,IAAI,UAAU,EAAE,EAAE,SAAS,EAAE,KAAK;AACnH,aAAK,eAAe,QAAQ,IAAI,kBAAkB,WAAW,cAAc;AAE3E,YAAI,QAAQ,IAAI,iBAAiB;AAC/B,eAAK,SAAS,QAAQ,IAAI,gBAAgB,MAAM,GAAG,EAAE,IAAI;AAAA,QAC3D,WACS,QAAQ,IAAI,WAAW,WAAW,YAAY,GAAG;AAExD,eAAK,MAAM,QAAQ,IAAI,WAAW,MAAM,GAAG,EAAE,IAAI;AAAA,QACnD,WACS,QAAQ,IAAI,WAAW,WAAW,aAAa,GAAG;AACzD,eAAK,SAAS,QAAQ,IAAI,WAAW,MAAM,GAAG,EAAE,IAAI;AAAA,QACtD;AACA,aAAK,SAAS,KAAK,UAAU;AAC7B,aAAK,QAAQ,KAAK,OAAO,MAAM,eAAe,IAAI,CAAC,KAAK;AACxD;AAAA,MAEF;AACE,YAAI,QAAQ,IAAI,OAAO,OAAQ,OAAM,IAAI,MAAM,yBAAyB,KAAK,OAAO,EAAE;AAAA,IAC1F;AAAA,EACF;AAAA,EAEQ,SAAS,GAA4B;AAC3C,QAAI,OAAO,MAAM,SAAU,QAAO;AAClC,UAAM,MAAM,SAAS,CAAC;AACtB,QAAI,MAAM,GAAG,EAAG,OAAM,IAAI,MAAM,GAAG,CAAC,oBAAoB;AACxD,WAAO;AAAA,EACT;AACF;AAEO,IAAM,wBAAwB,IAAI,+BAA+B;","names":[]}
|
|
@@ -25,12 +25,12 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
|
|
|
25
25
|
// bin/fetch-log.ts
|
|
26
26
|
var import_commander = require("commander");
|
|
27
27
|
var import_crypto = __toESM(require("crypto"), 1);
|
|
28
|
-
var
|
|
28
|
+
var import_fs = __toESM(require("fs"), 1);
|
|
29
29
|
var jose = __toESM(require("jose"), 1);
|
|
30
30
|
var import_node_stream_zip = __toESM(require("node-stream-zip"), 1);
|
|
31
31
|
var import_node_stream = require("stream");
|
|
32
32
|
var import_promises = require("stream/promises");
|
|
33
|
-
var
|
|
33
|
+
var import_path = __toESM(require("path"), 1);
|
|
34
34
|
var import_keyring = require("@napi-rs/keyring");
|
|
35
35
|
var import_prompts = __toESM(require("prompts"), 1);
|
|
36
36
|
|
|
@@ -38,13 +38,13 @@ var import_prompts = __toESM(require("prompts"), 1);
|
|
|
38
38
|
var KEY_WRAPPING_ALG = "RSA-OAEP-256";
|
|
39
39
|
|
|
40
40
|
// bin/find-root.ts
|
|
41
|
-
var
|
|
42
|
-
var
|
|
43
|
-
var folders = process.cwd().split(
|
|
44
|
-
var rootIndex = folders.findIndex((folder, i) =>
|
|
45
|
-
var root = (rootIndex > 0 ? folders.slice(0, rootIndex + 1) : folders).join(
|
|
41
|
+
var import_node_fs = __toESM(require("fs"), 1);
|
|
42
|
+
var import_node_path = __toESM(require("path"), 1);
|
|
43
|
+
var folders = process.cwd().split(import_node_path.default.sep);
|
|
44
|
+
var rootIndex = folders.findIndex((folder, i) => import_node_fs.default.existsSync(import_node_path.default.join(folders.slice(0, i + 1).join(import_node_path.default.sep), "package.json")));
|
|
45
|
+
var root = (rootIndex > 0 ? folders.slice(0, rootIndex + 1) : folders).join(import_node_path.default.sep);
|
|
46
46
|
console.log("project directory:", root);
|
|
47
|
-
var pkg = JSON.parse(
|
|
47
|
+
var pkg = JSON.parse(import_node_fs.default.readFileSync(import_node_path.default.join(root, "package.json"), "utf-8"));
|
|
48
48
|
|
|
49
49
|
// bin/fetch-log.ts
|
|
50
50
|
async function getPassphrase() {
|
|
@@ -75,22 +75,22 @@ var m = args[0].match(/^(?<key>[a-z0-9]+)-(?<host>[^-]+)-(?<remote>[^.]+)(?<tags
|
|
|
75
75
|
if (!m) oops(args[0], "is not a valid log ID");
|
|
76
76
|
if (m.groups.host !== "0x0") oops("Unexpected debug log host", m.groups.host);
|
|
77
77
|
options.encrypted = m.groups.tags.split(".").includes("enc");
|
|
78
|
-
options.zip =
|
|
78
|
+
options.zip = import_path.default.join("logs", `${m.groups.key}.zip`);
|
|
79
79
|
options.url = `https://0x0.st/${m.groups.remote}.zip`;
|
|
80
80
|
if (options.encrypted) {
|
|
81
81
|
if (!options.private) oops("No private key provided");
|
|
82
|
-
if (!
|
|
83
|
-
if (!
|
|
82
|
+
if (!import_fs.default.existsSync(options.private)) oops("Private key", options.private, "does not exist");
|
|
83
|
+
if (!import_fs.default.existsSync("package.json")) oops("package.json does not exist in the current directory");
|
|
84
84
|
}
|
|
85
|
-
var logs =
|
|
85
|
+
var logs = import_path.default.join("logs", m.groups.key);
|
|
86
86
|
console.log(options.url, "=>", logs);
|
|
87
|
-
if (!
|
|
88
|
-
|
|
87
|
+
if (!import_fs.default.existsSync(logs)) {
|
|
88
|
+
import_fs.default.mkdirSync(logs, { recursive: true });
|
|
89
89
|
}
|
|
90
90
|
async function getPrivateKey() {
|
|
91
91
|
if (!options.encrypted) return void 0;
|
|
92
92
|
const privateKeyObject = import_crypto.default.createPrivateKey({
|
|
93
|
-
key:
|
|
93
|
+
key: import_fs.default.readFileSync(options.private, "utf-8"),
|
|
94
94
|
format: "pem",
|
|
95
95
|
passphrase: await getPassphrase()
|
|
96
96
|
});
|
|
@@ -114,7 +114,7 @@ async function main() {
|
|
|
114
114
|
});
|
|
115
115
|
if (!response.ok) oops(`Failed to download: ${response.statusText}`);
|
|
116
116
|
const readable = import_node_stream.Readable.fromWeb(response.body);
|
|
117
|
-
const download =
|
|
117
|
+
const download = import_fs.default.createWriteStream(options.zip);
|
|
118
118
|
await (0, import_promises.finished)(readable.pipe(download));
|
|
119
119
|
const zipfile = new import_node_stream_zip.default.async({ file: options.zip });
|
|
120
120
|
const entries = Object.values(await zipfile.entries()).filter((entry) => !entry.isDirectory);
|
|
@@ -123,16 +123,16 @@ async function main() {
|
|
|
123
123
|
const m2 = entry.name.match(/(?<filename>.+)\.(?<type>jwe)$/i);
|
|
124
124
|
const filename = m2?.groups.filename || entry.name;
|
|
125
125
|
const type = (m2?.groups.type || "").toLowerCase();
|
|
126
|
-
const target =
|
|
126
|
+
const target = import_path.default.join("logs", filename);
|
|
127
127
|
if (options.encrypted && !type) oops("Unexpected unencrypted contents", entry.name);
|
|
128
128
|
if (type && !options.encrypted) oops("Unexpected encrypted contents", entry.name);
|
|
129
129
|
switch (type) {
|
|
130
130
|
case "":
|
|
131
|
-
|
|
131
|
+
import_fs.default.writeFileSync(target, await zipfile.entryData(entry.name));
|
|
132
132
|
break;
|
|
133
133
|
case "jwe": {
|
|
134
134
|
const { plaintext } = await jose.compactDecrypt((await zipfile.entryData(entry.name)).toString("utf8"), privateKey);
|
|
135
|
-
|
|
135
|
+
import_fs.default.writeFileSync(target, plaintext);
|
|
136
136
|
break;
|
|
137
137
|
}
|
|
138
138
|
default:
|
|
@@ -141,7 +141,7 @@ async function main() {
|
|
|
141
141
|
}
|
|
142
142
|
}
|
|
143
143
|
} finally {
|
|
144
|
-
if (!options.keep &&
|
|
144
|
+
if (!options.keep && import_fs.default.existsSync(options.zip)) import_fs.default.unlinkSync(options.zip);
|
|
145
145
|
}
|
|
146
146
|
}
|
|
147
147
|
main().catch((err) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../bin/fetch-log.ts","../../../crypto.ts","../../../bin/find-root.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { Command } from 'commander'\nimport crypto, { webcrypto } from 'crypto'\nimport fs from 'fs'\nimport * as jose from 'jose'\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 { KEY_WRAPPING_ALG } from '../crypto'\nimport { pkg } from './find-root'\n\nasync function getPassphrase(): Promise<string> {\n const service = `${pkg.name} Zotero plugin`\n const account = `${pkg.name}-debug-log`\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 fetch debug logs.')\n .option('-p, --private <path>', 'Path for the encrypted private key .pem file', 'private.pem')\n .option('-k, --keep', 'Keep the downloaded zip', false)\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 getPrivateKey(): Promise<webcrypto.CryptoKey> {\n if (!options.encrypted) return undefined\n\n const privateKeyObject = crypto.createPrivateKey({\n key: fs.readFileSync(options.private, 'utf-8'),\n format: 'pem',\n passphrase: await getPassphrase(),\n })\n const unencryptedKeyPEM = privateKeyObject.export({\n type: 'pkcs8',\n format: 'pem',\n }).toString()\n return await jose.importPKCS8(\n unencryptedKeyPEM,\n KEY_WRAPPING_ALG,\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 const zipfile = new StreamZip.async({ file: options.zip })\n const entries = Object.values(await zipfile.entries()).filter(entry => !entry.isDirectory)\n\n const privateKey = await getPrivateKey()\n\n for (const entry of entries) {\n const m = entry.name.match(/(?<filename>.+)\\.(?<type>jwe)$/i)\n const filename = m?.groups!.filename || entry.name\n const type = (m?.groups!.type || '').toLowerCase()\n const target = path.join('logs', filename)\n\n if (options.encrypted && !type) oops('Unexpected unencrypted contents', entry.name)\n if (type && !options.encrypted) oops('Unexpected encrypted contents', entry.name)\n switch (type) {\n case '':\n fs.writeFileSync(target, await zipfile.entryData(entry.name))\n break\n case 'jwe': {\n const { plaintext } = await jose.compactDecrypt((await zipfile.entryData(entry.name)).toString('utf8'), privateKey)\n fs.writeFileSync(target, plaintext)\n break\n }\n default:\n oops('Unexpected log entry', entry.name)\n break\n }\n }\n }\n finally {\n if (!options.keep && fs.existsSync(options.zip)) fs.unlinkSync(options.zip)\n }\n}\n\nmain().catch(err => {\n oops(err.message)\n})\n","export const KEYTYPE = 'RSA'\nexport const KEY_WRAPPING_ALG = 'RSA-OAEP-256'\nexport const CONTENT_ENCRYPTION_ALG = 'A256GCM'\nexport const RSA_HASH = 'SHA-256'\nexport const RSA_ALGORITHM = 'RSA-OAEP'\nexport const CIPHER_ALGORITHM = 'aes256'\nexport const AES_KEY_LENGTH = 256\n// export const AES_KEY_BYTES = 32\n\n// export const AES_ALGORITHM = 'AES-GCM'\n// export const IV_LENGTH = 12\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,uBAAwB;AACxB,oBAAkC;AAClC,
|
|
1
|
+
{"version":3,"sources":["../../../bin/fetch-log.ts","../../../crypto.ts","../../../bin/find-root.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { Command } from 'commander'\nimport crypto, { webcrypto } from 'crypto'\nimport fs from 'fs'\nimport * as jose from 'jose'\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 { KEY_WRAPPING_ALG } from '../crypto'\nimport { pkg } from './find-root'\n\nasync function getPassphrase(): Promise<string> {\n const service = `${pkg.name} Zotero plugin`\n const account = `${pkg.name}-debug-log`\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 fetch debug logs.')\n .option('-p, --private <path>', 'Path for the encrypted private key .pem file', 'private.pem')\n .option('-k, --keep', 'Keep the downloaded zip', false)\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 getPrivateKey(): Promise<webcrypto.CryptoKey> {\n if (!options.encrypted) return undefined\n\n const privateKeyObject = crypto.createPrivateKey({\n key: fs.readFileSync(options.private, 'utf-8'),\n format: 'pem',\n passphrase: await getPassphrase(),\n })\n const unencryptedKeyPEM = privateKeyObject.export({\n type: 'pkcs8',\n format: 'pem',\n }).toString()\n return await jose.importPKCS8(\n unencryptedKeyPEM,\n KEY_WRAPPING_ALG,\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 const zipfile = new StreamZip.async({ file: options.zip })\n const entries = Object.values(await zipfile.entries()).filter(entry => !entry.isDirectory)\n\n const privateKey = await getPrivateKey()\n\n for (const entry of entries) {\n const m = entry.name.match(/(?<filename>.+)\\.(?<type>jwe)$/i)\n const filename = m?.groups!.filename || entry.name\n const type = (m?.groups!.type || '').toLowerCase()\n const target = path.join('logs', filename)\n\n if (options.encrypted && !type) oops('Unexpected unencrypted contents', entry.name)\n if (type && !options.encrypted) oops('Unexpected encrypted contents', entry.name)\n switch (type) {\n case '':\n fs.writeFileSync(target, await zipfile.entryData(entry.name))\n break\n case 'jwe': {\n const { plaintext } = await jose.compactDecrypt((await zipfile.entryData(entry.name)).toString('utf8'), privateKey)\n fs.writeFileSync(target, plaintext)\n break\n }\n default:\n oops('Unexpected log entry', entry.name)\n break\n }\n }\n }\n finally {\n if (!options.keep && fs.existsSync(options.zip)) fs.unlinkSync(options.zip)\n }\n}\n\nmain().catch(err => {\n oops(err.message)\n})\n","export const KEYTYPE = 'RSA'\nexport const KEY_WRAPPING_ALG = 'RSA-OAEP-256'\nexport const CONTENT_ENCRYPTION_ALG = 'A256GCM'\nexport const RSA_HASH = 'SHA-256'\nexport const RSA_ALGORITHM = 'RSA-OAEP'\nexport const CIPHER_ALGORITHM = 'aes256'\nexport const AES_KEY_LENGTH = 256\n// export const AES_KEY_BYTES = 32\n\n// export const AES_ALGORITHM = 'AES-GCM'\n// export const IV_LENGTH = 12\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":["path","fs","KeyRingEntry","prompts","args","path","fs","crypto","StreamZip","m"]}
|
|
@@ -33,13 +33,13 @@ __export(find_root_exports, {
|
|
|
33
33
|
root: () => root
|
|
34
34
|
});
|
|
35
35
|
module.exports = __toCommonJS(find_root_exports);
|
|
36
|
-
var
|
|
37
|
-
var
|
|
38
|
-
var folders = process.cwd().split(
|
|
39
|
-
var rootIndex = folders.findIndex((folder, i) =>
|
|
40
|
-
var root = (rootIndex > 0 ? folders.slice(0, rootIndex + 1) : folders).join(
|
|
36
|
+
var import_node_fs = __toESM(require("fs"), 1);
|
|
37
|
+
var import_node_path = __toESM(require("path"), 1);
|
|
38
|
+
var folders = process.cwd().split(import_node_path.default.sep);
|
|
39
|
+
var rootIndex = folders.findIndex((folder, i) => import_node_fs.default.existsSync(import_node_path.default.join(folders.slice(0, i + 1).join(import_node_path.default.sep), "package.json")));
|
|
40
|
+
var root = (rootIndex > 0 ? folders.slice(0, rootIndex + 1) : folders).join(import_node_path.default.sep);
|
|
41
41
|
console.log("project directory:", root);
|
|
42
|
-
var pkg = JSON.parse(
|
|
42
|
+
var pkg = JSON.parse(import_node_fs.default.readFileSync(import_node_path.default.join(root, "package.json"), "utf-8"));
|
|
43
43
|
// Annotate the CommonJS export names for ESM import in node:
|
|
44
44
|
0 && (module.exports = {
|
|
45
45
|
pkg,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../bin/find-root.ts"],"sourcesContent":["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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,
|
|
1
|
+
{"version":3,"sources":["../../../bin/find-root.ts"],"sourcesContent":["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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,qBAAe;AACf,uBAAiB;AAEjB,IAAM,UAAU,QAAQ,IAAI,EAAE,MAAM,iBAAAA,QAAK,GAAG;AAC5C,IAAM,YAAY,QAAQ,UAAU,CAAC,QAAgB,MAAc,eAAAC,QAAG,WAAW,iBAAAD,QAAK,KAAK,QAAQ,MAAM,GAAG,IAAI,CAAC,EAAE,KAAK,iBAAAA,QAAK,GAAG,GAAG,cAAc,CAAC,CAAC;AAC5I,IAAM,QAAQ,YAAY,IAAI,QAAQ,MAAM,GAAG,YAAY,CAAC,IAAI,SAAS,KAAK,iBAAAA,QAAK,GAAG;AAC7F,QAAQ,IAAI,sBAAsB,IAAI;AAE/B,IAAM,MAAM,KAAK,MAAM,eAAAC,QAAG,aAAa,iBAAAD,QAAK,KAAK,MAAM,cAAc,GAAG,OAAO,CAAC;","names":["path","fs"]}
|
package/dist/cjs/bin/link.cjs
CHANGED
|
@@ -27,13 +27,13 @@ var fs2 = __toESM(require("fs"), 1);
|
|
|
27
27
|
var path2 = __toESM(require("path"), 1);
|
|
28
28
|
|
|
29
29
|
// bin/find-root.ts
|
|
30
|
-
var
|
|
31
|
-
var
|
|
32
|
-
var folders = process.cwd().split(
|
|
33
|
-
var rootIndex = folders.findIndex((folder, i) =>
|
|
34
|
-
var root = (rootIndex > 0 ? folders.slice(0, rootIndex + 1) : folders).join(
|
|
30
|
+
var import_node_fs = __toESM(require("fs"), 1);
|
|
31
|
+
var import_node_path = __toESM(require("path"), 1);
|
|
32
|
+
var folders = process.cwd().split(import_node_path.default.sep);
|
|
33
|
+
var rootIndex = folders.findIndex((folder, i) => import_node_fs.default.existsSync(import_node_path.default.join(folders.slice(0, i + 1).join(import_node_path.default.sep), "package.json")));
|
|
34
|
+
var root = (rootIndex > 0 ? folders.slice(0, rootIndex + 1) : folders).join(import_node_path.default.sep);
|
|
35
35
|
console.log("project directory:", root);
|
|
36
|
-
var pkg = JSON.parse(
|
|
36
|
+
var pkg = JSON.parse(import_node_fs.default.readFileSync(import_node_path.default.join(root, "package.json"), "utf-8"));
|
|
37
37
|
|
|
38
38
|
// bin/link.ts
|
|
39
39
|
if (!pkg.id) pkg.id = `${pkg.name}@${pkg.author.email.replace(/.*@/, "")}`.toLowerCase();
|
|
@@ -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\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,
|
|
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 '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":";;;;;;;;;;;;;;;;;;;;;;;;;AAIA,IAAAA,MAAoB;AACpB,IAAAC,QAAsB;;;ACLtB,qBAAe;AACf,uBAAiB;AAEjB,IAAM,UAAU,QAAQ,IAAI,EAAE,MAAM,iBAAAC,QAAK,GAAG;AAC5C,IAAM,YAAY,QAAQ,UAAU,CAAC,QAAgB,MAAc,eAAAC,QAAG,WAAW,iBAAAD,QAAK,KAAK,QAAQ,MAAM,GAAG,IAAI,CAAC,EAAE,KAAK,iBAAAA,QAAK,GAAG,GAAG,cAAc,CAAC,CAAC;AAC5I,IAAM,QAAQ,YAAY,IAAI,QAAQ,MAAM,GAAG,YAAY,CAAC,IAAI,SAAS,KAAK,iBAAAA,QAAK,GAAG;AAC7F,QAAQ,IAAI,sBAAsB,IAAI;AAE/B,IAAM,MAAM,KAAK,MAAM,eAAAC,QAAG,aAAa,iBAAAD,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"]}
|
|
@@ -27,13 +27,13 @@ var path2 = __toESM(require("path"), 1);
|
|
|
27
27
|
var import_rimraf = require("rimraf");
|
|
28
28
|
|
|
29
29
|
// bin/find-root.ts
|
|
30
|
-
var
|
|
31
|
-
var
|
|
32
|
-
var folders = process.cwd().split(
|
|
33
|
-
var rootIndex = folders.findIndex((folder, i) =>
|
|
34
|
-
var root = (rootIndex > 0 ? folders.slice(0, rootIndex + 1) : folders).join(
|
|
30
|
+
var import_node_fs = __toESM(require("fs"), 1);
|
|
31
|
+
var import_node_path = __toESM(require("path"), 1);
|
|
32
|
+
var folders = process.cwd().split(import_node_path.default.sep);
|
|
33
|
+
var rootIndex = folders.findIndex((folder, i) => import_node_fs.default.existsSync(import_node_path.default.join(folders.slice(0, i + 1).join(import_node_path.default.sep), "package.json")));
|
|
34
|
+
var root = (rootIndex > 0 ? folders.slice(0, rootIndex + 1) : folders).join(import_node_path.default.sep);
|
|
35
35
|
console.log("project directory:", root);
|
|
36
|
-
var pkg = JSON.parse(
|
|
36
|
+
var pkg = JSON.parse(import_node_fs.default.readFileSync(import_node_path.default.join(root, "package.json"), "utf-8"));
|
|
37
37
|
|
|
38
38
|
// bin/make-dirs.ts
|
|
39
39
|
console.log("make build dirs");
|
|
@@ -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\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,
|
|
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 '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":";;;;;;;;;;;;;;;;;;;;;;;;AAEA,IAAAA,MAAoB;AACpB,IAAAC,QAAsB;AACtB,oBAA2B;;;ACJ3B,qBAAe;AACf,uBAAiB;AAEjB,IAAM,UAAU,QAAQ,IAAI,EAAE,MAAM,iBAAAC,QAAK,GAAG;AAC5C,IAAM,YAAY,QAAQ,UAAU,CAAC,QAAgB,MAAc,eAAAC,QAAG,WAAW,iBAAAD,QAAK,KAAK,QAAQ,MAAM,GAAG,IAAI,CAAC,EAAE,KAAK,iBAAAA,QAAK,GAAG,GAAG,cAAc,CAAC,CAAC;AAC5I,IAAM,QAAQ,YAAY,IAAI,QAAQ,MAAM,GAAG,YAAY,CAAC,IAAI,SAAS,KAAK,iBAAAA,QAAK,GAAG;AAC7F,QAAQ,IAAI,sBAAsB,IAAI;AAE/B,IAAM,MAAM,KAAK,MAAM,eAAAC,QAAG,aAAa,iBAAAD,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"]}
|
|
@@ -29,18 +29,18 @@ var path3 = __toESM(require("path"), 1);
|
|
|
29
29
|
var import_url_template = require("url-template");
|
|
30
30
|
|
|
31
31
|
// bin/find-root.ts
|
|
32
|
-
var
|
|
33
|
-
var
|
|
34
|
-
var folders = process.cwd().split(
|
|
35
|
-
var rootIndex = folders.findIndex((folder, i) =>
|
|
36
|
-
var root = (rootIndex > 0 ? folders.slice(0, rootIndex + 1) : folders).join(
|
|
32
|
+
var import_node_fs = __toESM(require("fs"), 1);
|
|
33
|
+
var import_node_path = __toESM(require("path"), 1);
|
|
34
|
+
var folders = process.cwd().split(import_node_path.default.sep);
|
|
35
|
+
var rootIndex = folders.findIndex((folder, i) => import_node_fs.default.existsSync(import_node_path.default.join(folders.slice(0, i + 1).join(import_node_path.default.sep), "package.json")));
|
|
36
|
+
var root = (rootIndex > 0 ? folders.slice(0, rootIndex + 1) : folders).join(import_node_path.default.sep);
|
|
37
37
|
console.log("project directory:", root);
|
|
38
|
-
var pkg = JSON.parse(
|
|
38
|
+
var pkg = JSON.parse(import_node_fs.default.readFileSync(import_node_path.default.join(root, "package.json"), "utf-8"));
|
|
39
39
|
|
|
40
40
|
// bin/version.ts
|
|
41
|
-
var
|
|
42
|
-
var
|
|
43
|
-
var
|
|
41
|
+
var import_node_fs2 = __toESM(require("fs"), 1);
|
|
42
|
+
var import_node_os = __toESM(require("os"), 1);
|
|
43
|
+
var import_node_path2 = __toESM(require("path"), 1);
|
|
44
44
|
|
|
45
45
|
// bin/continuous-integration.ts
|
|
46
46
|
var child_process = __toESM(require("child_process"), 1);
|
|
@@ -101,11 +101,11 @@ function version() {
|
|
|
101
101
|
if (ContinuousIntegration.service && !ContinuousIntegration.tag) {
|
|
102
102
|
$version = `${$version}.${ContinuousIntegration.build_number}`;
|
|
103
103
|
} else if (!ContinuousIntegration.service) {
|
|
104
|
-
$version = `${$version}.${
|
|
104
|
+
$version = `${$version}.${import_node_os.default.userInfo().username}.${import_node_os.default.hostname()}`;
|
|
105
105
|
}
|
|
106
|
-
const version_module =
|
|
107
|
-
if (!
|
|
108
|
-
|
|
106
|
+
const version_module = import_node_path2.default.join(root, "gen", "version.cjs");
|
|
107
|
+
if (!import_node_fs2.default.existsSync(import_node_path2.default.dirname(version_module))) import_node_fs2.default.mkdirSync(import_node_path2.default.dirname(version_module));
|
|
108
|
+
import_node_fs2.default.writeFileSync(version_module, `module.exports = { version: ${JSON.stringify($version)} }`);
|
|
109
109
|
console.log("written version", $version, "to", version_module);
|
|
110
110
|
return $version;
|
|
111
111
|
}
|
|
@@ -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\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
|
+
{"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 'node:fs'\nimport path from 'node:path'\n\nconst folders = process.cwd().split(path.sep)\nconst rootIndex = folders.findIndex((folder: string, i: number) => fs.existsSync(path.join(folders.slice(0, i + 1).join(path.sep), 'package.json')))\nexport const root = (rootIndex > 0 ? folders.slice(0, rootIndex + 1) : folders).join(path.sep)\nconsole.log('project directory:', root)\n\nexport const pkg = JSON.parse(fs.readFileSync(path.join(root, 'package.json'), 'utf-8'))\n","#!/usr/bin/env node\n\nimport fs from 'node:fs'\nimport os from 'node:os'\nimport path from 'node:path'\n\nimport { ContinuousIntegration as CI } from './continuous-integration'\nimport { pkg, root } from './find-root'\n\nexport function version(): string {\n let $version = pkg.version as string\n\n if (CI.service && !CI.tag) {\n $version = `${$version}.${CI.build_number}`\n }\n else if (!CI.service) {\n $version = `${$version}.${os.userInfo().username}.${os.hostname()}`\n }\n\n const version_module = path.join(root, 'gen', 'version.cjs')\n if (!fs.existsSync(path.dirname(version_module))) fs.mkdirSync(path.dirname(version_module))\n fs.writeFileSync(version_module, `module.exports = { version: ${JSON.stringify($version)} }`)\n console.log('written version', $version, 'to', version_module)\n return $version\n}\n\nversion()\n","import * as child_process from 'node:child_process'\n\nclass ContinuousIntegrationSingleton {\n public service = ''\n public build_number: number\n public tag = ''\n public commit_message = ''\n public branch = ''\n public pull_request = false\n public issue = ''\n\n constructor() {\n for (const [id, name] of Object.entries({ CIRCLECI: 'Circle', TRAVIS: 'Travis', SEMAPHORE: 'Semaphore', GITHUB_ACTIONS: 'GitHub' })) {\n if (process.env[id] === 'true') this.service = name\n }\n\n switch (this.service) {\n case 'Circle':\n this.build_number = this.parseInt(process.env.CIRCLE_BUILD_NUM)\n try {\n this.tag = child_process.execSync(`git describe --exact-match ${process.env.CIRCLE_SHA1}`, { stdio: 'pipe' }).toString().trim()\n }\n catch (err) {\n this.tag = null\n }\n this.commit_message = child_process.execSync(`git log --format=%B -n 1 ${process.env.CIRCLE_SHA1}`).toString().trim()\n this.branch = process.env.CIRCLE_BRANCH\n this.pull_request = !!process.env.CIRCLE_PULL_REQUEST\n break\n\n case 'GitHub':\n this.build_number = this.parseInt(process.env.GITHUB_RUN_NUMBER)\n this.commit_message = child_process.execSync(`git log --format=%B -n 1 ${process.env.GITHUB_SHA}`).toString().trim()\n this.pull_request = process.env.GITHUB_EVENT_NAME.startsWith('pull-request')\n\n if (process.env.GITHUB_HEAD_REF) {\n this.branch = process.env.GITHUB_HEAD_REF.split('/').pop()\n }\n else if (process.env.GITHUB_REF.startsWith('refs/tags/')) {\n // leave branch undefined when tagged... not great\n this.tag = process.env.GITHUB_REF.split('/').pop()\n }\n else if (process.env.GITHUB_REF.startsWith('refs/heads/')) {\n this.branch = process.env.GITHUB_REF.split('/').pop()\n }\n this.branch = this.branch || ''\n this.issue = this.branch.match(/^gh-([0-9]+)$/)?.[1] || ''\n break\n\n default:\n if (process.env.CI === 'true') throw new Error(`Unexpected CI service ${this.service}`)\n }\n }\n\n private parseInt(n: number | string): number {\n if (typeof n === 'number') return n\n const int = parseInt(n)\n if (isNaN(int)) throw new Error(`${n} is not an integer`)\n return int\n }\n}\n\nexport const ContinuousIntegration = new ContinuousIntegrationSingleton() // eslint-disable-line @typescript-eslint/naming-convention,no-underscore-dangle,id-blacklist,id-match\n"],"mappings":"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","names":["fs","path","path","fs","import_node_fs","import_node_path","os","path","fs","glob","msg","attr","basename"]}
|
package/dist/cjs/bin/release.cjs
CHANGED
|
@@ -85,28 +85,28 @@ var ContinuousIntegrationSingleton = class {
|
|
|
85
85
|
var ContinuousIntegration = new ContinuousIntegrationSingleton();
|
|
86
86
|
|
|
87
87
|
// bin/find-root.ts
|
|
88
|
-
var
|
|
89
|
-
var
|
|
90
|
-
var folders = process.cwd().split(
|
|
91
|
-
var rootIndex = folders.findIndex((folder, i) =>
|
|
92
|
-
var root = (rootIndex > 0 ? folders.slice(0, rootIndex + 1) : folders).join(
|
|
88
|
+
var import_node_fs = __toESM(require("fs"), 1);
|
|
89
|
+
var import_node_path = __toESM(require("path"), 1);
|
|
90
|
+
var folders = process.cwd().split(import_node_path.default.sep);
|
|
91
|
+
var rootIndex = folders.findIndex((folder, i) => import_node_fs.default.existsSync(import_node_path.default.join(folders.slice(0, i + 1).join(import_node_path.default.sep), "package.json")));
|
|
92
|
+
var root = (rootIndex > 0 ? folders.slice(0, rootIndex + 1) : folders).join(import_node_path.default.sep);
|
|
93
93
|
console.log("project directory:", root);
|
|
94
|
-
var pkg = JSON.parse(
|
|
94
|
+
var pkg = JSON.parse(import_node_fs.default.readFileSync(import_node_path.default.join(root, "package.json"), "utf-8"));
|
|
95
95
|
|
|
96
96
|
// bin/version.ts
|
|
97
|
-
var
|
|
98
|
-
var
|
|
99
|
-
var
|
|
97
|
+
var import_node_fs2 = __toESM(require("fs"), 1);
|
|
98
|
+
var import_node_os = __toESM(require("os"), 1);
|
|
99
|
+
var import_node_path2 = __toESM(require("path"), 1);
|
|
100
100
|
function version() {
|
|
101
101
|
let $version = pkg.version;
|
|
102
102
|
if (ContinuousIntegration.service && !ContinuousIntegration.tag) {
|
|
103
103
|
$version = `${$version}.${ContinuousIntegration.build_number}`;
|
|
104
104
|
} else if (!ContinuousIntegration.service) {
|
|
105
|
-
$version = `${$version}.${
|
|
105
|
+
$version = `${$version}.${import_node_os.default.userInfo().username}.${import_node_os.default.hostname()}`;
|
|
106
106
|
}
|
|
107
|
-
const version_module =
|
|
108
|
-
if (!
|
|
109
|
-
|
|
107
|
+
const version_module = import_node_path2.default.join(root, "gen", "version.cjs");
|
|
108
|
+
if (!import_node_fs2.default.existsSync(import_node_path2.default.dirname(version_module))) import_node_fs2.default.mkdirSync(import_node_path2.default.dirname(version_module));
|
|
109
|
+
import_node_fs2.default.writeFileSync(version_module, `module.exports = { version: ${JSON.stringify($version)} }`);
|
|
110
110
|
console.log("written version", $version, "to", version_module);
|
|
111
111
|
return $version;
|
|
112
112
|
}
|
|
@@ -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\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
|
+
{"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 'node:child_process'\n\nclass ContinuousIntegrationSingleton {\n public service = ''\n public build_number: number\n public tag = ''\n public commit_message = ''\n public branch = ''\n public pull_request = false\n public issue = ''\n\n constructor() {\n for (const [id, name] of Object.entries({ CIRCLECI: 'Circle', TRAVIS: 'Travis', SEMAPHORE: 'Semaphore', GITHUB_ACTIONS: 'GitHub' })) {\n if (process.env[id] === 'true') this.service = name\n }\n\n switch (this.service) {\n case 'Circle':\n this.build_number = this.parseInt(process.env.CIRCLE_BUILD_NUM)\n try {\n this.tag = child_process.execSync(`git describe --exact-match ${process.env.CIRCLE_SHA1}`, { stdio: 'pipe' }).toString().trim()\n }\n catch (err) {\n this.tag = null\n }\n this.commit_message = child_process.execSync(`git log --format=%B -n 1 ${process.env.CIRCLE_SHA1}`).toString().trim()\n this.branch = process.env.CIRCLE_BRANCH\n this.pull_request = !!process.env.CIRCLE_PULL_REQUEST\n break\n\n case 'GitHub':\n this.build_number = this.parseInt(process.env.GITHUB_RUN_NUMBER)\n this.commit_message = child_process.execSync(`git log --format=%B -n 1 ${process.env.GITHUB_SHA}`).toString().trim()\n this.pull_request = process.env.GITHUB_EVENT_NAME.startsWith('pull-request')\n\n if (process.env.GITHUB_HEAD_REF) {\n this.branch = process.env.GITHUB_HEAD_REF.split('/').pop()\n }\n else if (process.env.GITHUB_REF.startsWith('refs/tags/')) {\n // leave branch undefined when tagged... not great\n this.tag = process.env.GITHUB_REF.split('/').pop()\n }\n else if (process.env.GITHUB_REF.startsWith('refs/heads/')) {\n this.branch = process.env.GITHUB_REF.split('/').pop()\n }\n this.branch = this.branch || ''\n this.issue = this.branch.match(/^gh-([0-9]+)$/)?.[1] || ''\n break\n\n default:\n if (process.env.CI === 'true') throw new Error(`Unexpected CI service ${this.service}`)\n }\n }\n\n private parseInt(n: number | string): number {\n if (typeof n === 'number') return n\n const int = parseInt(n)\n if (isNaN(int)) throw new Error(`${n} is not an integer`)\n return int\n }\n}\n\nexport const ContinuousIntegration = new ContinuousIntegrationSingleton() // eslint-disable-line @typescript-eslint/naming-convention,no-underscore-dangle,id-blacklist,id-match\n","import fs from 'node:fs'\nimport path from 'node:path'\n\nconst folders = process.cwd().split(path.sep)\nconst rootIndex = folders.findIndex((folder: string, i: number) => fs.existsSync(path.join(folders.slice(0, i + 1).join(path.sep), 'package.json')))\nexport const root = (rootIndex > 0 ? folders.slice(0, rootIndex + 1) : folders).join(path.sep)\nconsole.log('project directory:', root)\n\nexport const pkg = JSON.parse(fs.readFileSync(path.join(root, 'package.json'), 'utf-8'))\n","#!/usr/bin/env node\n\nimport fs from 'node:fs'\nimport os from 'node:os'\nimport path from 'node:path'\n\nimport { ContinuousIntegration as CI } from './continuous-integration'\nimport { pkg, root } from './find-root'\n\nexport function version(): string {\n let $version = pkg.version as string\n\n if (CI.service && !CI.tag) {\n $version = `${$version}.${CI.build_number}`\n }\n else if (!CI.service) {\n $version = `${$version}.${os.userInfo().username}.${os.hostname()}`\n }\n\n const version_module = path.join(root, 'gen', 'version.cjs')\n if (!fs.existsSync(path.dirname(version_module))) fs.mkdirSync(path.dirname(version_module))\n fs.writeFileSync(version_module, `module.exports = { version: ${JSON.stringify($version)} }`)\n console.log('written version', $version, 'to', version_module)\n return $version\n}\n\nversion()\n"],"mappings":"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","names":["fs","path","path","fs","import_node_fs","import_node_path","os","path","fs","moment"]}
|