zotero-plugin 7.0.8 → 7.0.9
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/release.cjs +1 -1
- package/dist/cjs/bin/release.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/release.js +1 -1
- package/dist/esm/bin/release.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
package/dist/cjs/bin/release.cjs
CHANGED
|
@@ -118,7 +118,7 @@ var import_rest = require("@octokit/rest");
|
|
|
118
118
|
process.on("unhandledRejection", (up) => {
|
|
119
119
|
throw up;
|
|
120
120
|
});
|
|
121
|
-
import_commander.program.option("-r, --release-message <value>", "add message to github release").option("-x, --xpi <value>", "xpi filename template", "{name}-{version
|
|
121
|
+
import_commander.program.option("-r, --release-message <value>", "add message to github release").option("-x, --xpi <value>", "xpi filename template", "{name}-{version}.xpi").option("-d, --dry-run", "dry run", !ContinuousIntegration.service).option("-p, --pre-release", "release is a pre-release").option("-t, --tag <value>", "tag for release", ContinuousIntegration.tag).parse(process.argv);
|
|
122
122
|
var options = import_commander.program.opts();
|
|
123
123
|
if (options.tag && options.tag !== ContinuousIntegration.tag) {
|
|
124
124
|
console.log("dry-run: tag specified manually, switching to dry-run mode");
|
|
@@ -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 const issue = CI.issue && process.env.VERSION_WITH_ISSUE !== 'false' ? `.${CI.issue}` : ''\n $version = `${$version}${issue}.${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\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 const issue = CI.issue && process.env.VERSION_WITH_ISSUE !== 'false' ? `.${CI.issue}` : ''\n $version = `${$version}${issue}.${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"]}
|
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.9",
|
|
41
41
|
"description": "Zotero plugin builder",
|
|
42
42
|
"homepage": "https://github.com/retorquere/zotero-plugin/wiki",
|
|
43
43
|
"type": "module",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../debug-log.ts","../../package.json"],"sourcesContent":["/* eslint-disable no-magic-numbers */\n\nComponents.utils.importGlobalProperties(['FormData'])\n\ntype ZoteroPane = {\n getSelectedItems: () => any[]\n}\n\nimport pkg from './package.json'\n\nimport * as UZip from 'uzip'\n\n/*\nconst path = new class {\n #home = ''\n\n get home(): string {\n return this.#home = (this.#home || FileUtils.getDir('Home', []).path)\n }\n}\n*/\n\nexport class Bundler {\n public key: string\n\n #refs = false\n\n private IV_LENGTH = 12\n #symmetric: CryptoKey\n #pubkey: string\n\n #crypto: Crypto\n #subtle: SubtleCrypto\n #files: Record<string, Uint8Array> = {}\n\n #encoder = new TextEncoder()\n\n constructor(pubkey: string) {\n this.key = Zotero.Utilities.generateObjectKey()\n this.#pubkey = pubkey\n this.#crypto = Zotero.getMainWindow().crypto\n this.#subtle = this.#crypto.subtle\n }\n\n async add(path: string, data: string, refs = false): Promise<void> {\n this.#refs = this.#refs || refs\n\n const encoded = this.#encoder.encode(data)\n\n if (this.#pubkey) {\n if (!this.#symmetric) {\n this.#symmetric = await this.#subtle.generateKey({ name: 'AES-GCM', length: 256 }, true, ['encrypt', 'decrypt'])\n\n const base64Pem = this.#pubkey\n .replace('-----BEGIN PUBLIC KEY-----', '')\n .replace('-----END PUBLIC KEY-----', '')\n .replace(/\\s/g, '')\n const keyBuffer = Uint8Array.from(atob(base64Pem), c => c.charCodeAt(0)).buffer\n const publicKey = await this.#subtle.importKey('spki', keyBuffer, { name: 'RSA-OAEP', hash: 'SHA-256' }, true, ['encrypt'])\n const exportedKey = await this.#subtle.exportKey('raw', this.#symmetric)\n\n this.#files[`${this.key}/${this.key}.key`] = new Uint8Array(await this.#subtle.encrypt({ name: 'RSA-OAEP' }, publicKey, exportedKey))\n }\n\n const iv = this.#crypto.getRandomValues(new Uint8Array(this.IV_LENGTH))\n const encryptedData = await this.#subtle.encrypt({ name: 'AES-GCM', iv: iv }, this.#symmetric, encoded)\n this.#files[`${this.key}/${path}.iv`] = iv\n this.#files[`${this.key}/${path}.enc`] = new Uint8Array(encryptedData)\n }\n else {\n this.#files[`${this.key}/${path}`] = encoded\n }\n }\n\n public get zip(): ArrayBuffer {\n return UZip.encode(this.#files) as ArrayBuffer\n }\n\n public get name(): string {\n return `${this.key}.zip`\n }\n\n public id(remote: string): string {\n return `${this.key}-${remote}${this.#refs ? '.refs' : ''}${this.#pubkey ? '.enc' : ''}`\n }\n\n public formData(expire = 30): FormData {\n const blob = new Blob([this.zip], { type: 'application/zip' })\n const formData = new FormData()\n formData.append('file', blob, this.name)\n formData.append('expire', `${expire * 24}`)\n return formData\n }\n}\n\ndeclare var Zotero: { // eslint-disable-line no-var\n platformMajorVersion: number\n debug: (msg: string) => void\n DebugLogSender: {\n plugins: Record<string, string[]>\n }\n Translate: any\n Prefs: {\n get: (name: string, global?: boolean) => string | number | boolean\n }\n getInstalledExtensions: () => Promise<string[]>\n platform: string\n oscpu: string\n arch: string\n locale: string\n Utilities: {\n generateObjectKey: () => string\n }\n Debug: {\n enabled: boolean\n getConsoleViewerOutput: () => string[]\n }\n getErrors: (something: boolean) => string[]\n Schema: {\n schemaUpdatePromise: Promise<void>\n }\n getActiveZoteroPane: () => ZoteroPane\n getMainWindow(): Window\n}\n\ndeclare var Services: any // eslint-disable-line no-var\ndeclare const Components: any\ndeclare const ChromeUtils: any\n\ntype ExportTranslator = {\n setHandler: (phase: string, handler: (obj: { string: string }, success: boolean) => void) => void // eslint-disable-line id-blacklist\n setTranslator: (id: string) => void\n setItems: (items: any[]) => void\n translate: () => void\n}\n\nconst zotero_prefs_root = 'extensions.zotero.'\n\nclass DebugLogSender {\n public id = {\n menu: 'debug-log-sender-menu',\n menupopup: 'debug-log-sender-menupopup',\n menuitem: 'debug-log-sender',\n }\n\n public debugEnabledAtStart: boolean = typeof Zotero !== 'undefined'\n ? (Zotero.Prefs.get('debug.store') || Zotero.Debug.enabled) as unknown as boolean\n : null\n\n private element(name: string, attrs: Record<string, string> = {}): HTMLElement {\n const doc = Zotero.getMainWindow().document\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-call\n const elt: HTMLElement = doc[Zotero.platformMajorVersion >= 102 ? 'createXULElement' : 'createElement'](name)\n for (const [k, v] of Object.entries(attrs)) {\n elt.setAttribute(k, v)\n }\n return elt\n }\n\n public register(plugin: string, preferences: string[] = [], pubkey = ''): void {\n const label = 'Send plugin debug log'\n\n const doc = Zotero.getMainWindow()?.document\n if (doc) {\n let menupopup = doc.querySelector(`#${this.id.menupopup}`)\n if (menupopup) {\n menupopup.setAttribute('label', label)\n }\n else {\n menupopup = doc.querySelector('menupopup#menu_HelpPopup')\n .appendChild(this.element('menu', { id: this.id.menu, label }))\n .appendChild(this.element('menupopup', { id: this.id.menupopup }))\n }\n\n doc.querySelector(`.${this.id.menuitem}[label=${JSON.stringify(plugin)}]`)?.remove()\n const menuitem = menupopup.appendChild(this.element('menuitem', {\n label: plugin,\n class: this.id.menuitem,\n 'data-preferences': JSON.stringify(preferences || []),\n 'data-pubkey': pubkey,\n }))\n menuitem.addEventListener('command', event => this.send(event.currentTarget))\n }\n }\n\n public unregister(plugin: string): void {\n const doc = Zotero.getMainWindow()?.document\n if (doc) {\n doc.querySelector(`.debug-log-sender[label=${JSON.stringify(plugin)}]`)?.remove()\n const menupopup = doc.querySelector('#debug-log-sender-menupopup')\n if (menupopup && !menupopup.children.length) doc.querySelector('#debug-log-sender-menu')?.remove()\n }\n }\n\n public send(target: EventTarget): void {\n const elt: HTMLElement = target as unknown as HTMLElement\n const plugin: string = elt.getAttribute('label')\n const preferences: string[] = JSON.parse(elt.getAttribute('data-preferences')) as string[]\n const pubkey: string = elt.getAttribute('data-pubkey')\n\n this.sendAsync(plugin, preferences, pubkey).catch((err: Error) => {\n Services.prompt.alert(null, 'Debug log submission error', `${err}`) // eslint-disable-line @typescript-eslint/restrict-template-expressions\n })\n }\n\n private async sendAsync(plugin: string, preferences: string[], pubkey = '') {\n await Zotero.Schema.schemaUpdatePromise\n\n const bundler = new Bundler(pubkey)\n\n let log = [\n await this.info(preferences),\n Zotero.getErrors(true).join('\\n\\n'),\n Zotero.Debug.getConsoleViewerOutput().slice(-250000).join('\\n'), // eslint-disable-line no-magic-numbers\n ].filter((txt: string) => txt).join('\\n\\n').trim()\n await bundler.add('debug.txt', log)\n\n let rdf = await this.rdf()\n if (rdf) await bundler.add('items.rdf', rdf, true)\n\n try {\n const response = await fetch('https://0x0.st', {\n method: 'POST',\n body: bundler.formData(),\n headers: {\n 'User-Agent': `Zotero-plugin/${pkg.version}`,\n },\n })\n const body = await response.text()\n const id = body.match(/https:\\/\\/0x0.st\\/([A-Z0-9]+)\\.zip/i)\n if (!id) throw new Error(body)\n Services.prompt.alert(null, `Debug log ID for ${plugin}`, bundler.id(`0x0-${id[1]}`))\n }\n catch (err) {\n Services.prompt.alert(null, `Could not post debug log for ${plugin}`, err.message)\n }\n }\n\n private preferences(preferences: string[]): Record<string, string | number | boolean> {\n const prefs: Record<string, string | number | boolean> = {}\n\n const names: string[] = []\n for (let pref of preferences) {\n if (pref[0] === ':') {\n pref = pref.substring(1)\n }\n else if (!pref.startsWith(zotero_prefs_root)) {\n pref = zotero_prefs_root + pref\n }\n if (pref.endsWith('.')) {\n const childkeys: string[] = Services.prefs.getBranch(pref).getChildList('', {})\n for (const key of childkeys) {\n names.push(pref + key)\n }\n }\n else {\n names.push(pref)\n }\n }\n\n for (const pref of names.sort()) {\n prefs[pref] = Zotero.Prefs.get(pref, true)\n }\n\n return prefs\n }\n\n // general state of Zotero\n private async info(preferences: string[]): Promise<string> {\n let info = ''\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-assignment\n const appInfo: { name: string; version: string } = Components.classes['@mozilla.org/xre/app-info;1'].getService(Components.interfaces.nsIXULAppInfo)\n info += `Application: ${appInfo.name} ${appInfo.version} ${Zotero.locale}\\n`\n\n const platform = ['Win', 'Mac', 'Linux'].find(p => Zotero[`is${p}`]) || 'Unknown'\n const arch = Zotero.oscpu || Zotero.arch\n info += `Platform: ${platform} ${arch}\\n`\n\n const addons: string[] = await Zotero.getInstalledExtensions()\n if (addons.length) {\n info += 'Addons:\\n' + addons.map((addon: string) => ` ${addon}\\n`).join('') // eslint-disable-line prefer-template\n }\n info += `Debug logging on at Zotero start: ${this.debugEnabledAtStart}\\n`\n info += `Debug logging on at log submit: ${Zotero.Prefs.get('debug.store') || Zotero.Debug.enabled}\\n`\n\n for (const [pref, value] of Object.entries(this.preferences(preferences))) {\n info += `${pref} = ${JSON.stringify(value)}\\n`\n }\n\n return info\n }\n\n private rdf(): Promise<string> {\n return new Promise((resolve, reject) => {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-assignment\n const items: any[] = Zotero.getActiveZoteroPane().getSelectedItems()\n if (items.length === 0) return resolve('')\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call\n const translation: ExportTranslator = new Zotero.Translate.Export() as ExportTranslator\n translation.setItems(items)\n translation.setTranslator('14763d24-8ba0-45df-8f52-b8d1108e7ac9') // rdf\n\n translation.setHandler('done', (obj, success) => {\n if (success) {\n resolve(obj ? obj.string : undefined)\n }\n else {\n reject(new Error('translation failed'))\n }\n })\n\n translation.translate() // eslint-disable-line @typescript-eslint/no-unsafe-call\n })\n }\n\n private arrayBufferToBase64(buffer) {\n let binary = ''\n const bytes = new Uint8Array(buffer)\n const len = bytes.byteLength\n for (let i = 0; i < len; i++) {\n binary += String.fromCharCode(bytes[i])\n }\n return btoa(binary)\n }\n\n private base64ToArrayBuffer(base64) {\n const binaryString = atob(base64)\n const len = binaryString.length\n const bytes = new Uint8Array(len)\n for (let i = 0; i < len; i++) {\n bytes[i] = binaryString.charCodeAt(i)\n }\n return bytes.buffer\n }\n}\n\nexport const DebugLog = new DebugLogSender()\n","export default {\n \"name\": \"zotero-plugin\",\n \"version\": \"7.0.8\",\n \"description\": \"Zotero plugin builder\",\n \"homepage\": \"https://github.com/retorquere/zotero-plugin/wiki\",\n \"type\": \"module\",\n \"main\": \"./dist/cjs/index.js\",\n \"module\": \"./dist/esm/index.js\",\n \"exports\": {\n \".\": {\n \"import\": \"./dist/esm/index.js\",\n \"require\": \"./dist/cjs/index.cjs\"\n },\n \"./debug-log\": {\n \"import\": \"./dist/esm/debug-log.js\",\n \"require\": \"./dist/cjs/debug-log.cjs\"\n },\n \"./logger\": {\n \"import\": \"./dist/esm/ulogger.js\",\n \"require\": \"./dist/cjs/logger.cjs\"\n },\n \".loader/json\": {\n \"import\": \"./dist/esm/loader/json.js\",\n \"require\": \"./dist/cjs/loader/json.cjs\"\n },\n \".loader/peggy\": {\n \"import\": \"./dist/esm/loader/peggy.js\",\n \"require\": \"./dist/cjs/loader/peggy.cjs\"\n },\n \".loader/pem\": {\n \"import\": \"./dist/esm/loader/pem.js\",\n \"require\": \"./dist/cjs/loader/pem.cjs\"\n },\n \"./copy-assets\": {\n \"import\": \"./dist/esm/bin/copy-assets.js\",\n \"require\": \"./dist/cjs/bin/copy-assets.cjs\"\n },\n \"./make-dirs\": {\n \"import\": \"./dist/esm/bin/make-dirs.js\",\n \"require\": \"./dist/cjs/bin/make-dirs.cjs\"\n },\n \"./make-manifest\": {\n \"import\": \"./dist/esm/bin/make-manifest.js\",\n \"require\": \"./dist/cjs/bin/make-manifest.cjs\"\n },\n \"./make-version\": {\n \"import\": \"./dist/esm/bin/version.js\",\n \"require\": \"./dist/cjs/bin/version.cjs\"\n }\n },\n \"author\": {\n \"name\": \"Emiliano Heyns\",\n \"email\": \"Emiliano.Heyns@iris-advies.com\"\n },\n \"scripts\": {\n \"preversion\": \"npm test\",\n \"postversion\": \"git push --follow-tags\",\n \"test\": \"dprint fmt *.ts */*.ts && dprint check *.ts */*.ts && npm run build\",\n \"prebuild\": \"rm -rf dist\",\n \"build\": \"tsup\",\n \"check\": \"tsc --noEmit\",\n \"start\": \"concurrently --raw --group 'npm run check' 'npm run build'\",\n \"pack\": \"npm test && npm pack\",\n \"prepublishOnly\": \"npm install && npm run build\",\n \"ncu\": \"ncu -u && npm i && git add package.json package-lock.json && git commit -m ncu\"\n },\n \"directories\": {\n \"test\": \"test\"\n },\n \"dependencies\": {\n \"@fluent/syntax\": \"^0.19.0\",\n \"@napi-rs/keyring\": \"^1.2.0\",\n \"@octokit/rest\": \"^22.0.0\",\n \"@rgrove/parse-xml\": \"^4.2.0\",\n \"@types/node\": \"^24.9.1\",\n \"@xmldom/xmldom\": \"^0.9.8\",\n \"ajv\": \"^8.17.1\",\n \"ajv-keywords\": \"^5.1.0\",\n \"archiver\": \"^7.0.1\",\n \"clp\": \"^4.0.13\",\n \"commander\": \"^14.0.1\",\n \"dotenv\": \"^17.2.3\",\n \"ejs\": \"^3.1.10\",\n \"fs-extra\": \"^11.3.2\",\n \"glob\": \"^11.0.3\",\n \"ini\": \"^6.0.0\",\n \"jsesc\": \"^3.1.0\",\n \"lodash\": \"^4.17.21\",\n \"moment\": \"^2.30.1\",\n \"node-stream-zip\": \"^1.15.0\",\n \"openpgp\": \"^6.2.2\",\n \"peggy\": \"^5.0.6\",\n \"prompts\": \"^2.4.2\",\n \"pug\": \"^3.0.3\",\n \"rimraf\": \"^6.0.1\",\n \"shell-quote\": \"^1.8.3\",\n \"shelljs\": \"^0.10.0\",\n \"string-to-arraybuffer\": \"^1.0.2\",\n \"ts-node\": \"^10.9.2\",\n \"tslib\": \"^2.8.1\",\n \"typescript\": \"^5.9.3\",\n \"uri-templates\": \"^0.2.0\",\n \"url-template\": \"^3.1.1\",\n \"uzip\": \"^0.20201231.0\",\n \"xml-parser\": \"^1.2.1\",\n \"xpath\": \"^0.0.34\"\n },\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/retorquere/zotero-plugin.git\"\n },\n \"license\": \"ISC\",\n \"files\": [\n \"package.json\",\n \"README.md\",\n \"dist\"\n ],\n \"bin\": {\n \"zp-release\": \"dist/cjs/bin/release.cjs\",\n \"zp-zipup\": \"dist/cjs/bin/zipup.cjs\",\n \"zp-link\": \"dist/cjs/bin/link.cjs\",\n \"issue-branches\": \"dist/cjs/bin/branches.cjs\",\n \"zotero-start\": \"dist/cjs/bin/start.cjs\",\n \"zp-fetch-log\": \"dist/cjs/bin/fetch-log.cjs\",\n \"zp-keypair\": \"dist/cjs/bin/keypair.cjs\",\n \"zp-copy-assets\": \"dist/cjs/copy-assets.cjs\",\n \"zp-make-dirs\": \"dist/cjs/make-dirs.cjs\",\n \"zp-manifest\": \"dist/cjs/make-manifest.cjs\",\n \"zp-version\": \"dist/cjs/version.cjs\"\n },\n \"bugs\": {\n \"url\": \"https://github.com/retorquere/zotero-plugin/issues\"\n },\n \"devDependencies\": {\n \"@openpgp/web-stream-tools\": \"^0.2.0\",\n \"concurrently\": \"^9.2.1\",\n \"dprint\": \"^0.50.2\",\n \"esbuild\": \"^0.25.11\",\n \"tsup\": \"^8.5.0\"\n }\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../debug-log.ts","../../package.json"],"sourcesContent":["/* eslint-disable no-magic-numbers */\n\nComponents.utils.importGlobalProperties(['FormData'])\n\ntype ZoteroPane = {\n getSelectedItems: () => any[]\n}\n\nimport pkg from './package.json'\n\nimport * as UZip from 'uzip'\n\n/*\nconst path = new class {\n #home = ''\n\n get home(): string {\n return this.#home = (this.#home || FileUtils.getDir('Home', []).path)\n }\n}\n*/\n\nexport class Bundler {\n public key: string\n\n #refs = false\n\n private IV_LENGTH = 12\n #symmetric: CryptoKey\n #pubkey: string\n\n #crypto: Crypto\n #subtle: SubtleCrypto\n #files: Record<string, Uint8Array> = {}\n\n #encoder = new TextEncoder()\n\n constructor(pubkey: string) {\n this.key = Zotero.Utilities.generateObjectKey()\n this.#pubkey = pubkey\n this.#crypto = Zotero.getMainWindow().crypto\n this.#subtle = this.#crypto.subtle\n }\n\n async add(path: string, data: string, refs = false): Promise<void> {\n this.#refs = this.#refs || refs\n\n const encoded = this.#encoder.encode(data)\n\n if (this.#pubkey) {\n if (!this.#symmetric) {\n this.#symmetric = await this.#subtle.generateKey({ name: 'AES-GCM', length: 256 }, true, ['encrypt', 'decrypt'])\n\n const base64Pem = this.#pubkey\n .replace('-----BEGIN PUBLIC KEY-----', '')\n .replace('-----END PUBLIC KEY-----', '')\n .replace(/\\s/g, '')\n const keyBuffer = Uint8Array.from(atob(base64Pem), c => c.charCodeAt(0)).buffer\n const publicKey = await this.#subtle.importKey('spki', keyBuffer, { name: 'RSA-OAEP', hash: 'SHA-256' }, true, ['encrypt'])\n const exportedKey = await this.#subtle.exportKey('raw', this.#symmetric)\n\n this.#files[`${this.key}/${this.key}.key`] = new Uint8Array(await this.#subtle.encrypt({ name: 'RSA-OAEP' }, publicKey, exportedKey))\n }\n\n const iv = this.#crypto.getRandomValues(new Uint8Array(this.IV_LENGTH))\n const encryptedData = await this.#subtle.encrypt({ name: 'AES-GCM', iv: iv }, this.#symmetric, encoded)\n this.#files[`${this.key}/${path}.iv`] = iv\n this.#files[`${this.key}/${path}.enc`] = new Uint8Array(encryptedData)\n }\n else {\n this.#files[`${this.key}/${path}`] = encoded\n }\n }\n\n public get zip(): ArrayBuffer {\n return UZip.encode(this.#files) as ArrayBuffer\n }\n\n public get name(): string {\n return `${this.key}.zip`\n }\n\n public id(remote: string): string {\n return `${this.key}-${remote}${this.#refs ? '.refs' : ''}${this.#pubkey ? '.enc' : ''}`\n }\n\n public formData(expire = 30): FormData {\n const blob = new Blob([this.zip], { type: 'application/zip' })\n const formData = new FormData()\n formData.append('file', blob, this.name)\n formData.append('expire', `${expire * 24}`)\n return formData\n }\n}\n\ndeclare var Zotero: { // eslint-disable-line no-var\n platformMajorVersion: number\n debug: (msg: string) => void\n DebugLogSender: {\n plugins: Record<string, string[]>\n }\n Translate: any\n Prefs: {\n get: (name: string, global?: boolean) => string | number | boolean\n }\n getInstalledExtensions: () => Promise<string[]>\n platform: string\n oscpu: string\n arch: string\n locale: string\n Utilities: {\n generateObjectKey: () => string\n }\n Debug: {\n enabled: boolean\n getConsoleViewerOutput: () => string[]\n }\n getErrors: (something: boolean) => string[]\n Schema: {\n schemaUpdatePromise: Promise<void>\n }\n getActiveZoteroPane: () => ZoteroPane\n getMainWindow(): Window\n}\n\ndeclare var Services: any // eslint-disable-line no-var\ndeclare const Components: any\ndeclare const ChromeUtils: any\n\ntype ExportTranslator = {\n setHandler: (phase: string, handler: (obj: { string: string }, success: boolean) => void) => void // eslint-disable-line id-blacklist\n setTranslator: (id: string) => void\n setItems: (items: any[]) => void\n translate: () => void\n}\n\nconst zotero_prefs_root = 'extensions.zotero.'\n\nclass DebugLogSender {\n public id = {\n menu: 'debug-log-sender-menu',\n menupopup: 'debug-log-sender-menupopup',\n menuitem: 'debug-log-sender',\n }\n\n public debugEnabledAtStart: boolean = typeof Zotero !== 'undefined'\n ? (Zotero.Prefs.get('debug.store') || Zotero.Debug.enabled) as unknown as boolean\n : null\n\n private element(name: string, attrs: Record<string, string> = {}): HTMLElement {\n const doc = Zotero.getMainWindow().document\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-call\n const elt: HTMLElement = doc[Zotero.platformMajorVersion >= 102 ? 'createXULElement' : 'createElement'](name)\n for (const [k, v] of Object.entries(attrs)) {\n elt.setAttribute(k, v)\n }\n return elt\n }\n\n public register(plugin: string, preferences: string[] = [], pubkey = ''): void {\n const label = 'Send plugin debug log'\n\n const doc = Zotero.getMainWindow()?.document\n if (doc) {\n let menupopup = doc.querySelector(`#${this.id.menupopup}`)\n if (menupopup) {\n menupopup.setAttribute('label', label)\n }\n else {\n menupopup = doc.querySelector('menupopup#menu_HelpPopup')\n .appendChild(this.element('menu', { id: this.id.menu, label }))\n .appendChild(this.element('menupopup', { id: this.id.menupopup }))\n }\n\n doc.querySelector(`.${this.id.menuitem}[label=${JSON.stringify(plugin)}]`)?.remove()\n const menuitem = menupopup.appendChild(this.element('menuitem', {\n label: plugin,\n class: this.id.menuitem,\n 'data-preferences': JSON.stringify(preferences || []),\n 'data-pubkey': pubkey,\n }))\n menuitem.addEventListener('command', event => this.send(event.currentTarget))\n }\n }\n\n public unregister(plugin: string): void {\n const doc = Zotero.getMainWindow()?.document\n if (doc) {\n doc.querySelector(`.debug-log-sender[label=${JSON.stringify(plugin)}]`)?.remove()\n const menupopup = doc.querySelector('#debug-log-sender-menupopup')\n if (menupopup && !menupopup.children.length) doc.querySelector('#debug-log-sender-menu')?.remove()\n }\n }\n\n public send(target: EventTarget): void {\n const elt: HTMLElement = target as unknown as HTMLElement\n const plugin: string = elt.getAttribute('label')\n const preferences: string[] = JSON.parse(elt.getAttribute('data-preferences')) as string[]\n const pubkey: string = elt.getAttribute('data-pubkey')\n\n this.sendAsync(plugin, preferences, pubkey).catch((err: Error) => {\n Services.prompt.alert(null, 'Debug log submission error', `${err}`) // eslint-disable-line @typescript-eslint/restrict-template-expressions\n })\n }\n\n private async sendAsync(plugin: string, preferences: string[], pubkey = '') {\n await Zotero.Schema.schemaUpdatePromise\n\n const bundler = new Bundler(pubkey)\n\n let log = [\n await this.info(preferences),\n Zotero.getErrors(true).join('\\n\\n'),\n Zotero.Debug.getConsoleViewerOutput().slice(-250000).join('\\n'), // eslint-disable-line no-magic-numbers\n ].filter((txt: string) => txt).join('\\n\\n').trim()\n await bundler.add('debug.txt', log)\n\n let rdf = await this.rdf()\n if (rdf) await bundler.add('items.rdf', rdf, true)\n\n try {\n const response = await fetch('https://0x0.st', {\n method: 'POST',\n body: bundler.formData(),\n headers: {\n 'User-Agent': `Zotero-plugin/${pkg.version}`,\n },\n })\n const body = await response.text()\n const id = body.match(/https:\\/\\/0x0.st\\/([A-Z0-9]+)\\.zip/i)\n if (!id) throw new Error(body)\n Services.prompt.alert(null, `Debug log ID for ${plugin}`, bundler.id(`0x0-${id[1]}`))\n }\n catch (err) {\n Services.prompt.alert(null, `Could not post debug log for ${plugin}`, err.message)\n }\n }\n\n private preferences(preferences: string[]): Record<string, string | number | boolean> {\n const prefs: Record<string, string | number | boolean> = {}\n\n const names: string[] = []\n for (let pref of preferences) {\n if (pref[0] === ':') {\n pref = pref.substring(1)\n }\n else if (!pref.startsWith(zotero_prefs_root)) {\n pref = zotero_prefs_root + pref\n }\n if (pref.endsWith('.')) {\n const childkeys: string[] = Services.prefs.getBranch(pref).getChildList('', {})\n for (const key of childkeys) {\n names.push(pref + key)\n }\n }\n else {\n names.push(pref)\n }\n }\n\n for (const pref of names.sort()) {\n prefs[pref] = Zotero.Prefs.get(pref, true)\n }\n\n return prefs\n }\n\n // general state of Zotero\n private async info(preferences: string[]): Promise<string> {\n let info = ''\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-assignment\n const appInfo: { name: string; version: string } = Components.classes['@mozilla.org/xre/app-info;1'].getService(Components.interfaces.nsIXULAppInfo)\n info += `Application: ${appInfo.name} ${appInfo.version} ${Zotero.locale}\\n`\n\n const platform = ['Win', 'Mac', 'Linux'].find(p => Zotero[`is${p}`]) || 'Unknown'\n const arch = Zotero.oscpu || Zotero.arch\n info += `Platform: ${platform} ${arch}\\n`\n\n const addons: string[] = await Zotero.getInstalledExtensions()\n if (addons.length) {\n info += 'Addons:\\n' + addons.map((addon: string) => ` ${addon}\\n`).join('') // eslint-disable-line prefer-template\n }\n info += `Debug logging on at Zotero start: ${this.debugEnabledAtStart}\\n`\n info += `Debug logging on at log submit: ${Zotero.Prefs.get('debug.store') || Zotero.Debug.enabled}\\n`\n\n for (const [pref, value] of Object.entries(this.preferences(preferences))) {\n info += `${pref} = ${JSON.stringify(value)}\\n`\n }\n\n return info\n }\n\n private rdf(): Promise<string> {\n return new Promise((resolve, reject) => {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-assignment\n const items: any[] = Zotero.getActiveZoteroPane().getSelectedItems()\n if (items.length === 0) return resolve('')\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call\n const translation: ExportTranslator = new Zotero.Translate.Export() as ExportTranslator\n translation.setItems(items)\n translation.setTranslator('14763d24-8ba0-45df-8f52-b8d1108e7ac9') // rdf\n\n translation.setHandler('done', (obj, success) => {\n if (success) {\n resolve(obj ? obj.string : undefined)\n }\n else {\n reject(new Error('translation failed'))\n }\n })\n\n translation.translate() // eslint-disable-line @typescript-eslint/no-unsafe-call\n })\n }\n\n private arrayBufferToBase64(buffer) {\n let binary = ''\n const bytes = new Uint8Array(buffer)\n const len = bytes.byteLength\n for (let i = 0; i < len; i++) {\n binary += String.fromCharCode(bytes[i])\n }\n return btoa(binary)\n }\n\n private base64ToArrayBuffer(base64) {\n const binaryString = atob(base64)\n const len = binaryString.length\n const bytes = new Uint8Array(len)\n for (let i = 0; i < len; i++) {\n bytes[i] = binaryString.charCodeAt(i)\n }\n return bytes.buffer\n }\n}\n\nexport const DebugLog = new DebugLogSender()\n","export default {\n \"name\": \"zotero-plugin\",\n \"version\": \"7.0.9\",\n \"description\": \"Zotero plugin builder\",\n \"homepage\": \"https://github.com/retorquere/zotero-plugin/wiki\",\n \"type\": \"module\",\n \"main\": \"./dist/cjs/index.js\",\n \"module\": \"./dist/esm/index.js\",\n \"exports\": {\n \".\": {\n \"import\": \"./dist/esm/index.js\",\n \"require\": \"./dist/cjs/index.cjs\"\n },\n \"./debug-log\": {\n \"import\": \"./dist/esm/debug-log.js\",\n \"require\": \"./dist/cjs/debug-log.cjs\"\n },\n \"./logger\": {\n \"import\": \"./dist/esm/ulogger.js\",\n \"require\": \"./dist/cjs/logger.cjs\"\n },\n \".loader/json\": {\n \"import\": \"./dist/esm/loader/json.js\",\n \"require\": \"./dist/cjs/loader/json.cjs\"\n },\n \".loader/peggy\": {\n \"import\": \"./dist/esm/loader/peggy.js\",\n \"require\": \"./dist/cjs/loader/peggy.cjs\"\n },\n \".loader/pem\": {\n \"import\": \"./dist/esm/loader/pem.js\",\n \"require\": \"./dist/cjs/loader/pem.cjs\"\n },\n \"./copy-assets\": {\n \"import\": \"./dist/esm/bin/copy-assets.js\",\n \"require\": \"./dist/cjs/bin/copy-assets.cjs\"\n },\n \"./make-dirs\": {\n \"import\": \"./dist/esm/bin/make-dirs.js\",\n \"require\": \"./dist/cjs/bin/make-dirs.cjs\"\n },\n \"./make-manifest\": {\n \"import\": \"./dist/esm/bin/make-manifest.js\",\n \"require\": \"./dist/cjs/bin/make-manifest.cjs\"\n },\n \"./make-version\": {\n \"import\": \"./dist/esm/bin/version.js\",\n \"require\": \"./dist/cjs/bin/version.cjs\"\n }\n },\n \"author\": {\n \"name\": \"Emiliano Heyns\",\n \"email\": \"Emiliano.Heyns@iris-advies.com\"\n },\n \"scripts\": {\n \"preversion\": \"npm test\",\n \"postversion\": \"git push --follow-tags\",\n \"test\": \"dprint fmt *.ts */*.ts && dprint check *.ts */*.ts && npm run build\",\n \"prebuild\": \"rm -rf dist\",\n \"build\": \"tsup\",\n \"check\": \"tsc --noEmit\",\n \"start\": \"concurrently --raw --group 'npm run check' 'npm run build'\",\n \"pack\": \"npm test && npm pack\",\n \"prepublishOnly\": \"npm install && npm run build\",\n \"ncu\": \"ncu -u && npm i && git add package.json package-lock.json && git commit -m ncu\"\n },\n \"directories\": {\n \"test\": \"test\"\n },\n \"dependencies\": {\n \"@fluent/syntax\": \"^0.19.0\",\n \"@napi-rs/keyring\": \"^1.2.0\",\n \"@octokit/rest\": \"^22.0.0\",\n \"@rgrove/parse-xml\": \"^4.2.0\",\n \"@types/node\": \"^24.9.1\",\n \"@xmldom/xmldom\": \"^0.9.8\",\n \"ajv\": \"^8.17.1\",\n \"ajv-keywords\": \"^5.1.0\",\n \"archiver\": \"^7.0.1\",\n \"clp\": \"^4.0.13\",\n \"commander\": \"^14.0.1\",\n \"dotenv\": \"^17.2.3\",\n \"ejs\": \"^3.1.10\",\n \"fs-extra\": \"^11.3.2\",\n \"glob\": \"^11.0.3\",\n \"ini\": \"^6.0.0\",\n \"jsesc\": \"^3.1.0\",\n \"lodash\": \"^4.17.21\",\n \"moment\": \"^2.30.1\",\n \"node-stream-zip\": \"^1.15.0\",\n \"openpgp\": \"^6.2.2\",\n \"peggy\": \"^5.0.6\",\n \"prompts\": \"^2.4.2\",\n \"pug\": \"^3.0.3\",\n \"rimraf\": \"^6.0.1\",\n \"shell-quote\": \"^1.8.3\",\n \"shelljs\": \"^0.10.0\",\n \"string-to-arraybuffer\": \"^1.0.2\",\n \"ts-node\": \"^10.9.2\",\n \"tslib\": \"^2.8.1\",\n \"typescript\": \"^5.9.3\",\n \"uri-templates\": \"^0.2.0\",\n \"url-template\": \"^3.1.1\",\n \"uzip\": \"^0.20201231.0\",\n \"xml-parser\": \"^1.2.1\",\n \"xpath\": \"^0.0.34\"\n },\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/retorquere/zotero-plugin.git\"\n },\n \"license\": \"ISC\",\n \"files\": [\n \"package.json\",\n \"README.md\",\n \"dist\"\n ],\n \"bin\": {\n \"zp-release\": \"dist/cjs/bin/release.cjs\",\n \"zp-zipup\": \"dist/cjs/bin/zipup.cjs\",\n \"zp-link\": \"dist/cjs/bin/link.cjs\",\n \"issue-branches\": \"dist/cjs/bin/branches.cjs\",\n \"zotero-start\": \"dist/cjs/bin/start.cjs\",\n \"zp-fetch-log\": \"dist/cjs/bin/fetch-log.cjs\",\n \"zp-keypair\": \"dist/cjs/bin/keypair.cjs\",\n \"zp-copy-assets\": \"dist/cjs/copy-assets.cjs\",\n \"zp-make-dirs\": \"dist/cjs/make-dirs.cjs\",\n \"zp-manifest\": \"dist/cjs/make-manifest.cjs\",\n \"zp-version\": \"dist/cjs/version.cjs\"\n },\n \"bugs\": {\n \"url\": \"https://github.com/retorquere/zotero-plugin/issues\"\n },\n \"devDependencies\": {\n \"@openpgp/web-stream-tools\": \"^0.2.0\",\n \"concurrently\": \"^9.2.1\",\n \"dprint\": \"^0.50.2\",\n \"esbuild\": \"^0.25.11\",\n \"tsup\": \"^8.5.0\"\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,IAAO,kBAAQ;AAAA,EACb,QAAQ;AAAA,EACR,WAAW;AAAA,EACX,eAAe;AAAA,EACf,YAAY;AAAA,EACZ,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,WAAW;AAAA,IACT,KAAK;AAAA,MACH,UAAU;AAAA,MACV,WAAW;AAAA,IACb;AAAA,IACA,eAAe;AAAA,MACb,UAAU;AAAA,MACV,WAAW;AAAA,IACb;AAAA,IACA,YAAY;AAAA,MACV,UAAU;AAAA,MACV,WAAW;AAAA,IACb;AAAA,IACA,gBAAgB;AAAA,MACd,UAAU;AAAA,MACV,WAAW;AAAA,IACb;AAAA,IACA,iBAAiB;AAAA,MACf,UAAU;AAAA,MACV,WAAW;AAAA,IACb;AAAA,IACA,eAAe;AAAA,MACb,UAAU;AAAA,MACV,WAAW;AAAA,IACb;AAAA,IACA,iBAAiB;AAAA,MACf,UAAU;AAAA,MACV,WAAW;AAAA,IACb;AAAA,IACA,eAAe;AAAA,MACb,UAAU;AAAA,MACV,WAAW;AAAA,IACb;AAAA,IACA,mBAAmB;AAAA,MACjB,UAAU;AAAA,MACV,WAAW;AAAA,IACb;AAAA,IACA,kBAAkB;AAAA,MAChB,UAAU;AAAA,MACV,WAAW;AAAA,IACb;AAAA,EACF;AAAA,EACA,UAAU;AAAA,IACR,QAAQ;AAAA,IACR,SAAS;AAAA,EACX;AAAA,EACA,WAAW;AAAA,IACT,cAAc;AAAA,IACd,eAAe;AAAA,IACf,QAAQ;AAAA,IACR,YAAY;AAAA,IACZ,SAAS;AAAA,IACT,SAAS;AAAA,IACT,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,kBAAkB;AAAA,IAClB,OAAO;AAAA,EACT;AAAA,EACA,eAAe;AAAA,IACb,QAAQ;AAAA,EACV;AAAA,EACA,gBAAgB;AAAA,IACd,kBAAkB;AAAA,IAClB,oBAAoB;AAAA,IACpB,iBAAiB;AAAA,IACjB,qBAAqB;AAAA,IACrB,eAAe;AAAA,IACf,kBAAkB;AAAA,IAClB,OAAO;AAAA,IACP,gBAAgB;AAAA,IAChB,YAAY;AAAA,IACZ,OAAO;AAAA,IACP,aAAa;AAAA,IACb,UAAU;AAAA,IACV,OAAO;AAAA,IACP,YAAY;AAAA,IACZ,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,SAAS;AAAA,IACT,UAAU;AAAA,IACV,UAAU;AAAA,IACV,mBAAmB;AAAA,IACnB,WAAW;AAAA,IACX,SAAS;AAAA,IACT,WAAW;AAAA,IACX,OAAO;AAAA,IACP,UAAU;AAAA,IACV,eAAe;AAAA,IACf,WAAW;AAAA,IACX,yBAAyB;AAAA,IACzB,WAAW;AAAA,IACX,SAAS;AAAA,IACT,cAAc;AAAA,IACd,iBAAiB;AAAA,IACjB,gBAAgB;AAAA,IAChB,QAAQ;AAAA,IACR,cAAc;AAAA,IACd,SAAS;AAAA,EACX;AAAA,EACA,cAAc;AAAA,IACZ,QAAQ;AAAA,IACR,OAAO;AAAA,EACT;AAAA,EACA,WAAW;AAAA,EACX,SAAS;AAAA,IACP;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,OAAO;AAAA,IACL,cAAc;AAAA,IACd,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,kBAAkB;AAAA,IAClB,gBAAgB;AAAA,IAChB,gBAAgB;AAAA,IAChB,cAAc;AAAA,IACd,kBAAkB;AAAA,IAClB,gBAAgB;AAAA,IAChB,eAAe;AAAA,IACf,cAAc;AAAA,EAChB;AAAA,EACA,QAAQ;AAAA,IACN,OAAO;AAAA,EACT;AAAA,EACA,mBAAmB;AAAA,IACjB,6BAA6B;AAAA,IAC7B,gBAAgB;AAAA,IAChB,UAAU;AAAA,IACV,WAAW;AAAA,IACX,QAAQ;AAAA,EACV;AACF;;;ADlIA,WAAsB;AARtB,WAAW,MAAM,uBAAuB,CAAC,UAAU,CAAC;AAoB7C,IAAM,UAAN,MAAc;AAAA,EACZ;AAAA,EAEP,QAAQ;AAAA,EAEA,YAAY;AAAA,EACpB;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA,SAAqC,CAAC;AAAA,EAEtC,WAAW,IAAI,YAAY;AAAA,EAE3B,YAAY,QAAgB;AAC1B,SAAK,MAAM,OAAO,UAAU,kBAAkB;AAC9C,SAAK,UAAU;AACf,SAAK,UAAU,OAAO,cAAc,EAAE;AACtC,SAAK,UAAU,KAAK,QAAQ;AAAA,EAC9B;AAAA,EAEA,MAAM,IAAI,MAAc,MAAc,OAAO,OAAsB;AACjE,SAAK,QAAQ,KAAK,SAAS;AAE3B,UAAM,UAAU,KAAK,SAAS,OAAO,IAAI;AAEzC,QAAI,KAAK,SAAS;AAChB,UAAI,CAAC,KAAK,YAAY;AACpB,aAAK,aAAa,MAAM,KAAK,QAAQ,YAAY,EAAE,MAAM,WAAW,QAAQ,IAAI,GAAG,MAAM,CAAC,WAAW,SAAS,CAAC;AAE/G,cAAM,YAAY,KAAK,QACpB,QAAQ,8BAA8B,EAAE,EACxC,QAAQ,4BAA4B,EAAE,EACtC,QAAQ,OAAO,EAAE;AACpB,cAAM,YAAY,WAAW,KAAK,KAAK,SAAS,GAAG,OAAK,EAAE,WAAW,CAAC,CAAC,EAAE;AACzE,cAAM,YAAY,MAAM,KAAK,QAAQ,UAAU,QAAQ,WAAW,EAAE,MAAM,YAAY,MAAM,UAAU,GAAG,MAAM,CAAC,SAAS,CAAC;AAC1H,cAAM,cAAc,MAAM,KAAK,QAAQ,UAAU,OAAO,KAAK,UAAU;AAEvE,aAAK,OAAO,GAAG,KAAK,GAAG,IAAI,KAAK,GAAG,MAAM,IAAI,IAAI,WAAW,MAAM,KAAK,QAAQ,QAAQ,EAAE,MAAM,WAAW,GAAG,WAAW,WAAW,CAAC;AAAA,MACtI;AAEA,YAAM,KAAK,KAAK,QAAQ,gBAAgB,IAAI,WAAW,KAAK,SAAS,CAAC;AACtE,YAAM,gBAAgB,MAAM,KAAK,QAAQ,QAAQ,EAAE,MAAM,WAAW,GAAO,GAAG,KAAK,YAAY,OAAO;AACtG,WAAK,OAAO,GAAG,KAAK,GAAG,IAAI,IAAI,KAAK,IAAI;AACxC,WAAK,OAAO,GAAG,KAAK,GAAG,IAAI,IAAI,MAAM,IAAI,IAAI,WAAW,aAAa;AAAA,IACvE,OACK;AACH,WAAK,OAAO,GAAG,KAAK,GAAG,IAAI,IAAI,EAAE,IAAI;AAAA,IACvC;AAAA,EACF;AAAA,EAEA,IAAW,MAAmB;AAC5B,WAAY,YAAO,KAAK,MAAM;AAAA,EAChC;AAAA,EAEA,IAAW,OAAe;AACxB,WAAO,GAAG,KAAK,GAAG;AAAA,EACpB;AAAA,EAEO,GAAG,QAAwB;AAChC,WAAO,GAAG,KAAK,GAAG,IAAI,MAAM,GAAG,KAAK,QAAQ,UAAU,EAAE,GAAG,KAAK,UAAU,SAAS,EAAE;AAAA,EACvF;AAAA,EAEO,SAAS,SAAS,IAAc;AACrC,UAAM,OAAO,IAAI,KAAK,CAAC,KAAK,GAAG,GAAG,EAAE,MAAM,kBAAkB,CAAC;AAC7D,UAAM,WAAW,IAAI,SAAS;AAC9B,aAAS,OAAO,QAAQ,MAAM,KAAK,IAAI;AACvC,aAAS,OAAO,UAAU,GAAG,SAAS,EAAE,EAAE;AAC1C,WAAO;AAAA,EACT;AACF;AA2CA,IAAM,oBAAoB;AAE1B,IAAM,iBAAN,MAAqB;AAAA,EACZ,KAAK;AAAA,IACV,MAAM;AAAA,IACN,WAAW;AAAA,IACX,UAAU;AAAA,EACZ;AAAA,EAEO,sBAA+B,OAAO,WAAW,cACnD,OAAO,MAAM,IAAI,aAAa,KAAK,OAAO,MAAM,UACjD;AAAA,EAEI,QAAQ,MAAc,QAAgC,CAAC,GAAgB;AAC7E,UAAM,MAAM,OAAO,cAAc,EAAE;AAEnC,UAAM,MAAmB,IAAI,OAAO,wBAAwB,MAAM,qBAAqB,eAAe,EAAE,IAAI;AAC5G,eAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,KAAK,GAAG;AAC1C,UAAI,aAAa,GAAG,CAAC;AAAA,IACvB;AACA,WAAO;AAAA,EACT;AAAA,EAEO,SAAS,QAAgB,cAAwB,CAAC,GAAG,SAAS,IAAU;AAC7E,UAAM,QAAQ;AAEd,UAAM,MAAM,OAAO,cAAc,GAAG;AACpC,QAAI,KAAK;AACP,UAAI,YAAY,IAAI,cAAc,IAAI,KAAK,GAAG,SAAS,EAAE;AACzD,UAAI,WAAW;AACb,kBAAU,aAAa,SAAS,KAAK;AAAA,MACvC,OACK;AACH,oBAAY,IAAI,cAAc,0BAA0B,EACrD,YAAY,KAAK,QAAQ,QAAQ,EAAE,IAAI,KAAK,GAAG,MAAM,MAAM,CAAC,CAAC,EAC7D,YAAY,KAAK,QAAQ,aAAa,EAAE,IAAI,KAAK,GAAG,UAAU,CAAC,CAAC;AAAA,MACrE;AAEA,UAAI,cAAc,IAAI,KAAK,GAAG,QAAQ,UAAU,KAAK,UAAU,MAAM,CAAC,GAAG,GAAG,OAAO;AACnF,YAAM,WAAW,UAAU,YAAY,KAAK,QAAQ,YAAY;AAAA,QAC9D,OAAO;AAAA,QACP,OAAO,KAAK,GAAG;AAAA,QACf,oBAAoB,KAAK,UAAU,eAAe,CAAC,CAAC;AAAA,QACpD,eAAe;AAAA,MACjB,CAAC,CAAC;AACF,eAAS,iBAAiB,WAAW,WAAS,KAAK,KAAK,MAAM,aAAa,CAAC;AAAA,IAC9E;AAAA,EACF;AAAA,EAEO,WAAW,QAAsB;AACtC,UAAM,MAAM,OAAO,cAAc,GAAG;AACpC,QAAI,KAAK;AACP,UAAI,cAAc,2BAA2B,KAAK,UAAU,MAAM,CAAC,GAAG,GAAG,OAAO;AAChF,YAAM,YAAY,IAAI,cAAc,6BAA6B;AACjE,UAAI,aAAa,CAAC,UAAU,SAAS,OAAQ,KAAI,cAAc,wBAAwB,GAAG,OAAO;AAAA,IACnG;AAAA,EACF;AAAA,EAEO,KAAK,QAA2B;AACrC,UAAM,MAAmB;AACzB,UAAM,SAAiB,IAAI,aAAa,OAAO;AAC/C,UAAM,cAAwB,KAAK,MAAM,IAAI,aAAa,kBAAkB,CAAC;AAC7E,UAAM,SAAiB,IAAI,aAAa,aAAa;AAErD,SAAK,UAAU,QAAQ,aAAa,MAAM,EAAE,MAAM,CAAC,QAAe;AAChE,eAAS,OAAO,MAAM,MAAM,8BAA8B,GAAG,GAAG,EAAE;AAAA,IACpE,CAAC;AAAA,EACH;AAAA,EAEA,MAAc,UAAU,QAAgB,aAAuB,SAAS,IAAI;AAC1E,UAAM,OAAO,OAAO;AAEpB,UAAM,UAAU,IAAI,QAAQ,MAAM;AAElC,QAAI,MAAM;AAAA,MACR,MAAM,KAAK,KAAK,WAAW;AAAA,MAC3B,OAAO,UAAU,IAAI,EAAE,KAAK,MAAM;AAAA,MAClC,OAAO,MAAM,uBAAuB,EAAE,MAAM,KAAO,EAAE,KAAK,IAAI;AAAA;AAAA,IAChE,EAAE,OAAO,CAAC,QAAgB,GAAG,EAAE,KAAK,MAAM,EAAE,KAAK;AACjD,UAAM,QAAQ,IAAI,aAAa,GAAG;AAElC,QAAI,MAAM,MAAM,KAAK,IAAI;AACzB,QAAI,IAAK,OAAM,QAAQ,IAAI,aAAa,KAAK,IAAI;AAEjD,QAAI;AACF,YAAM,WAAW,MAAM,MAAM,kBAAkB;AAAA,QAC7C,QAAQ;AAAA,QACR,MAAM,QAAQ,SAAS;AAAA,QACvB,SAAS;AAAA,UACP,cAAc,iBAAiB,gBAAI,OAAO;AAAA,QAC5C;AAAA,MACF,CAAC;AACD,YAAM,OAAO,MAAM,SAAS,KAAK;AACjC,YAAM,KAAK,KAAK,MAAM,qCAAqC;AAC3D,UAAI,CAAC,GAAI,OAAM,IAAI,MAAM,IAAI;AAC7B,eAAS,OAAO,MAAM,MAAM,oBAAoB,MAAM,IAAI,QAAQ,GAAG,OAAO,GAAG,CAAC,CAAC,EAAE,CAAC;AAAA,IACtF,SACO,KAAK;AACV,eAAS,OAAO,MAAM,MAAM,gCAAgC,MAAM,IAAI,IAAI,OAAO;AAAA,IACnF;AAAA,EACF;AAAA,EAEQ,YAAY,aAAkE;AACpF,UAAM,QAAmD,CAAC;AAE1D,UAAM,QAAkB,CAAC;AACzB,aAAS,QAAQ,aAAa;AAC5B,UAAI,KAAK,CAAC,MAAM,KAAK;AACnB,eAAO,KAAK,UAAU,CAAC;AAAA,MACzB,WACS,CAAC,KAAK,WAAW,iBAAiB,GAAG;AAC5C,eAAO,oBAAoB;AAAA,MAC7B;AACA,UAAI,KAAK,SAAS,GAAG,GAAG;AACtB,cAAM,YAAsB,SAAS,MAAM,UAAU,IAAI,EAAE,aAAa,IAAI,CAAC,CAAC;AAC9E,mBAAW,OAAO,WAAW;AAC3B,gBAAM,KAAK,OAAO,GAAG;AAAA,QACvB;AAAA,MACF,OACK;AACH,cAAM,KAAK,IAAI;AAAA,MACjB;AAAA,IACF;AAEA,eAAW,QAAQ,MAAM,KAAK,GAAG;AAC/B,YAAM,IAAI,IAAI,OAAO,MAAM,IAAI,MAAM,IAAI;AAAA,IAC3C;AAEA,WAAO;AAAA,EACT;AAAA;AAAA,EAGA,MAAc,KAAK,aAAwC;AACzD,QAAI,OAAO;AAGX,UAAM,UAA6C,WAAW,QAAQ,6BAA6B,EAAE,WAAW,WAAW,WAAW,aAAa;AACnJ,YAAQ,gBAAgB,QAAQ,IAAI,IAAI,QAAQ,OAAO,IAAI,OAAO,MAAM;AAAA;AAExE,UAAM,WAAW,CAAC,OAAO,OAAO,OAAO,EAAE,KAAK,OAAK,OAAO,KAAK,CAAC,EAAE,CAAC,KAAK;AACxE,UAAM,OAAO,OAAO,SAAS,OAAO;AACpC,YAAQ,aAAa,QAAQ,IAAI,IAAI;AAAA;AAErC,UAAM,SAAmB,MAAM,OAAO,uBAAuB;AAC7D,QAAI,OAAO,QAAQ;AACjB,cAAQ,cAAc,OAAO,IAAI,CAAC,UAAkB,KAAK,KAAK;AAAA,CAAI,EAAE,KAAK,EAAE;AAAA,IAC7E;AACA,YAAQ,qCAAqC,KAAK,mBAAmB;AAAA;AACrE,YAAQ,mCAAmC,OAAO,MAAM,IAAI,aAAa,KAAK,OAAO,MAAM,OAAO;AAAA;AAElG,eAAW,CAAC,MAAM,KAAK,KAAK,OAAO,QAAQ,KAAK,YAAY,WAAW,CAAC,GAAG;AACzE,cAAQ,GAAG,IAAI,MAAM,KAAK,UAAU,KAAK,CAAC;AAAA;AAAA,IAC5C;AAEA,WAAO;AAAA,EACT;AAAA,EAEQ,MAAuB;AAC7B,WAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AAEtC,YAAM,QAAe,OAAO,oBAAoB,EAAE,iBAAiB;AACnE,UAAI,MAAM,WAAW,EAAG,QAAO,QAAQ,EAAE;AAGzC,YAAM,cAAgC,IAAI,OAAO,UAAU,OAAO;AAClE,kBAAY,SAAS,KAAK;AAC1B,kBAAY,cAAc,sCAAsC;AAEhE,kBAAY,WAAW,QAAQ,CAAC,KAAK,YAAY;AAC/C,YAAI,SAAS;AACX,kBAAQ,MAAM,IAAI,SAAS,MAAS;AAAA,QACtC,OACK;AACH,iBAAO,IAAI,MAAM,oBAAoB,CAAC;AAAA,QACxC;AAAA,MACF,CAAC;AAED,kBAAY,UAAU;AAAA,IACxB,CAAC;AAAA,EACH;AAAA,EAEQ,oBAAoB,QAAQ;AAClC,QAAI,SAAS;AACb,UAAM,QAAQ,IAAI,WAAW,MAAM;AACnC,UAAM,MAAM,MAAM;AAClB,aAAS,IAAI,GAAG,IAAI,KAAK,KAAK;AAC5B,gBAAU,OAAO,aAAa,MAAM,CAAC,CAAC;AAAA,IACxC;AACA,WAAO,KAAK,MAAM;AAAA,EACpB;AAAA,EAEQ,oBAAoB,QAAQ;AAClC,UAAM,eAAe,KAAK,MAAM;AAChC,UAAM,MAAM,aAAa;AACzB,UAAM,QAAQ,IAAI,WAAW,GAAG;AAChC,aAAS,IAAI,GAAG,IAAI,KAAK,KAAK;AAC5B,YAAM,CAAC,IAAI,aAAa,WAAW,CAAC;AAAA,IACtC;AACA,WAAO,MAAM;AAAA,EACf;AACF;AAEO,IAAM,WAAW,IAAI,eAAe;","names":[]}
|
package/dist/esm/bin/release.js
CHANGED
|
@@ -96,7 +96,7 @@ import { Octokit } from "@octokit/rest";
|
|
|
96
96
|
process.on("unhandledRejection", (up) => {
|
|
97
97
|
throw up;
|
|
98
98
|
});
|
|
99
|
-
program.option("-r, --release-message <value>", "add message to github release").option("-x, --xpi <value>", "xpi filename template", "{name}-{version
|
|
99
|
+
program.option("-r, --release-message <value>", "add message to github release").option("-x, --xpi <value>", "xpi filename template", "{name}-{version}.xpi").option("-d, --dry-run", "dry run", !ContinuousIntegration.service).option("-p, --pre-release", "release is a pre-release").option("-t, --tag <value>", "tag for release", ContinuousIntegration.tag).parse(process.argv);
|
|
100
100
|
var options = program.opts();
|
|
101
101
|
if (options.tag && options.tag !== ContinuousIntegration.tag) {
|
|
102
102
|
console.log("dry-run: tag specified manually, switching to dry-run mode");
|
|
@@ -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 const issue = CI.issue && process.env.VERSION_WITH_ISSUE !== 'false' ? `.${CI.issue}` : ''\n $version = `${$version}${issue}.${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":["execSync","fs","path","fs","path","path","fs","execSync"]}
|
|
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 const issue = CI.issue && process.env.VERSION_WITH_ISSUE !== 'false' ? `.${CI.issue}` : ''\n $version = `${$version}${issue}.${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":["execSync","fs","path","fs","path","path","fs","execSync"]}
|
package/dist/esm/debug-log.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../package.json","../../debug-log.ts"],"sourcesContent":["export default {\n \"name\": \"zotero-plugin\",\n \"version\": \"7.0.8\",\n \"description\": \"Zotero plugin builder\",\n \"homepage\": \"https://github.com/retorquere/zotero-plugin/wiki\",\n \"type\": \"module\",\n \"main\": \"./dist/cjs/index.js\",\n \"module\": \"./dist/esm/index.js\",\n \"exports\": {\n \".\": {\n \"import\": \"./dist/esm/index.js\",\n \"require\": \"./dist/cjs/index.cjs\"\n },\n \"./debug-log\": {\n \"import\": \"./dist/esm/debug-log.js\",\n \"require\": \"./dist/cjs/debug-log.cjs\"\n },\n \"./logger\": {\n \"import\": \"./dist/esm/ulogger.js\",\n \"require\": \"./dist/cjs/logger.cjs\"\n },\n \".loader/json\": {\n \"import\": \"./dist/esm/loader/json.js\",\n \"require\": \"./dist/cjs/loader/json.cjs\"\n },\n \".loader/peggy\": {\n \"import\": \"./dist/esm/loader/peggy.js\",\n \"require\": \"./dist/cjs/loader/peggy.cjs\"\n },\n \".loader/pem\": {\n \"import\": \"./dist/esm/loader/pem.js\",\n \"require\": \"./dist/cjs/loader/pem.cjs\"\n },\n \"./copy-assets\": {\n \"import\": \"./dist/esm/bin/copy-assets.js\",\n \"require\": \"./dist/cjs/bin/copy-assets.cjs\"\n },\n \"./make-dirs\": {\n \"import\": \"./dist/esm/bin/make-dirs.js\",\n \"require\": \"./dist/cjs/bin/make-dirs.cjs\"\n },\n \"./make-manifest\": {\n \"import\": \"./dist/esm/bin/make-manifest.js\",\n \"require\": \"./dist/cjs/bin/make-manifest.cjs\"\n },\n \"./make-version\": {\n \"import\": \"./dist/esm/bin/version.js\",\n \"require\": \"./dist/cjs/bin/version.cjs\"\n }\n },\n \"author\": {\n \"name\": \"Emiliano Heyns\",\n \"email\": \"Emiliano.Heyns@iris-advies.com\"\n },\n \"scripts\": {\n \"preversion\": \"npm test\",\n \"postversion\": \"git push --follow-tags\",\n \"test\": \"dprint fmt *.ts */*.ts && dprint check *.ts */*.ts && npm run build\",\n \"prebuild\": \"rm -rf dist\",\n \"build\": \"tsup\",\n \"check\": \"tsc --noEmit\",\n \"start\": \"concurrently --raw --group 'npm run check' 'npm run build'\",\n \"pack\": \"npm test && npm pack\",\n \"prepublishOnly\": \"npm install && npm run build\",\n \"ncu\": \"ncu -u && npm i && git add package.json package-lock.json && git commit -m ncu\"\n },\n \"directories\": {\n \"test\": \"test\"\n },\n \"dependencies\": {\n \"@fluent/syntax\": \"^0.19.0\",\n \"@napi-rs/keyring\": \"^1.2.0\",\n \"@octokit/rest\": \"^22.0.0\",\n \"@rgrove/parse-xml\": \"^4.2.0\",\n \"@types/node\": \"^24.9.1\",\n \"@xmldom/xmldom\": \"^0.9.8\",\n \"ajv\": \"^8.17.1\",\n \"ajv-keywords\": \"^5.1.0\",\n \"archiver\": \"^7.0.1\",\n \"clp\": \"^4.0.13\",\n \"commander\": \"^14.0.1\",\n \"dotenv\": \"^17.2.3\",\n \"ejs\": \"^3.1.10\",\n \"fs-extra\": \"^11.3.2\",\n \"glob\": \"^11.0.3\",\n \"ini\": \"^6.0.0\",\n \"jsesc\": \"^3.1.0\",\n \"lodash\": \"^4.17.21\",\n \"moment\": \"^2.30.1\",\n \"node-stream-zip\": \"^1.15.0\",\n \"openpgp\": \"^6.2.2\",\n \"peggy\": \"^5.0.6\",\n \"prompts\": \"^2.4.2\",\n \"pug\": \"^3.0.3\",\n \"rimraf\": \"^6.0.1\",\n \"shell-quote\": \"^1.8.3\",\n \"shelljs\": \"^0.10.0\",\n \"string-to-arraybuffer\": \"^1.0.2\",\n \"ts-node\": \"^10.9.2\",\n \"tslib\": \"^2.8.1\",\n \"typescript\": \"^5.9.3\",\n \"uri-templates\": \"^0.2.0\",\n \"url-template\": \"^3.1.1\",\n \"uzip\": \"^0.20201231.0\",\n \"xml-parser\": \"^1.2.1\",\n \"xpath\": \"^0.0.34\"\n },\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/retorquere/zotero-plugin.git\"\n },\n \"license\": \"ISC\",\n \"files\": [\n \"package.json\",\n \"README.md\",\n \"dist\"\n ],\n \"bin\": {\n \"zp-release\": \"dist/cjs/bin/release.cjs\",\n \"zp-zipup\": \"dist/cjs/bin/zipup.cjs\",\n \"zp-link\": \"dist/cjs/bin/link.cjs\",\n \"issue-branches\": \"dist/cjs/bin/branches.cjs\",\n \"zotero-start\": \"dist/cjs/bin/start.cjs\",\n \"zp-fetch-log\": \"dist/cjs/bin/fetch-log.cjs\",\n \"zp-keypair\": \"dist/cjs/bin/keypair.cjs\",\n \"zp-copy-assets\": \"dist/cjs/copy-assets.cjs\",\n \"zp-make-dirs\": \"dist/cjs/make-dirs.cjs\",\n \"zp-manifest\": \"dist/cjs/make-manifest.cjs\",\n \"zp-version\": \"dist/cjs/version.cjs\"\n },\n \"bugs\": {\n \"url\": \"https://github.com/retorquere/zotero-plugin/issues\"\n },\n \"devDependencies\": {\n \"@openpgp/web-stream-tools\": \"^0.2.0\",\n \"concurrently\": \"^9.2.1\",\n \"dprint\": \"^0.50.2\",\n \"esbuild\": \"^0.25.11\",\n \"tsup\": \"^8.5.0\"\n }\n}\n","/* eslint-disable no-magic-numbers */\n\nComponents.utils.importGlobalProperties(['FormData'])\n\ntype ZoteroPane = {\n getSelectedItems: () => any[]\n}\n\nimport pkg from './package.json'\n\nimport * as UZip from 'uzip'\n\n/*\nconst path = new class {\n #home = ''\n\n get home(): string {\n return this.#home = (this.#home || FileUtils.getDir('Home', []).path)\n }\n}\n*/\n\nexport class Bundler {\n public key: string\n\n #refs = false\n\n private IV_LENGTH = 12\n #symmetric: CryptoKey\n #pubkey: string\n\n #crypto: Crypto\n #subtle: SubtleCrypto\n #files: Record<string, Uint8Array> = {}\n\n #encoder = new TextEncoder()\n\n constructor(pubkey: string) {\n this.key = Zotero.Utilities.generateObjectKey()\n this.#pubkey = pubkey\n this.#crypto = Zotero.getMainWindow().crypto\n this.#subtle = this.#crypto.subtle\n }\n\n async add(path: string, data: string, refs = false): Promise<void> {\n this.#refs = this.#refs || refs\n\n const encoded = this.#encoder.encode(data)\n\n if (this.#pubkey) {\n if (!this.#symmetric) {\n this.#symmetric = await this.#subtle.generateKey({ name: 'AES-GCM', length: 256 }, true, ['encrypt', 'decrypt'])\n\n const base64Pem = this.#pubkey\n .replace('-----BEGIN PUBLIC KEY-----', '')\n .replace('-----END PUBLIC KEY-----', '')\n .replace(/\\s/g, '')\n const keyBuffer = Uint8Array.from(atob(base64Pem), c => c.charCodeAt(0)).buffer\n const publicKey = await this.#subtle.importKey('spki', keyBuffer, { name: 'RSA-OAEP', hash: 'SHA-256' }, true, ['encrypt'])\n const exportedKey = await this.#subtle.exportKey('raw', this.#symmetric)\n\n this.#files[`${this.key}/${this.key}.key`] = new Uint8Array(await this.#subtle.encrypt({ name: 'RSA-OAEP' }, publicKey, exportedKey))\n }\n\n const iv = this.#crypto.getRandomValues(new Uint8Array(this.IV_LENGTH))\n const encryptedData = await this.#subtle.encrypt({ name: 'AES-GCM', iv: iv }, this.#symmetric, encoded)\n this.#files[`${this.key}/${path}.iv`] = iv\n this.#files[`${this.key}/${path}.enc`] = new Uint8Array(encryptedData)\n }\n else {\n this.#files[`${this.key}/${path}`] = encoded\n }\n }\n\n public get zip(): ArrayBuffer {\n return UZip.encode(this.#files) as ArrayBuffer\n }\n\n public get name(): string {\n return `${this.key}.zip`\n }\n\n public id(remote: string): string {\n return `${this.key}-${remote}${this.#refs ? '.refs' : ''}${this.#pubkey ? '.enc' : ''}`\n }\n\n public formData(expire = 30): FormData {\n const blob = new Blob([this.zip], { type: 'application/zip' })\n const formData = new FormData()\n formData.append('file', blob, this.name)\n formData.append('expire', `${expire * 24}`)\n return formData\n }\n}\n\ndeclare var Zotero: { // eslint-disable-line no-var\n platformMajorVersion: number\n debug: (msg: string) => void\n DebugLogSender: {\n plugins: Record<string, string[]>\n }\n Translate: any\n Prefs: {\n get: (name: string, global?: boolean) => string | number | boolean\n }\n getInstalledExtensions: () => Promise<string[]>\n platform: string\n oscpu: string\n arch: string\n locale: string\n Utilities: {\n generateObjectKey: () => string\n }\n Debug: {\n enabled: boolean\n getConsoleViewerOutput: () => string[]\n }\n getErrors: (something: boolean) => string[]\n Schema: {\n schemaUpdatePromise: Promise<void>\n }\n getActiveZoteroPane: () => ZoteroPane\n getMainWindow(): Window\n}\n\ndeclare var Services: any // eslint-disable-line no-var\ndeclare const Components: any\ndeclare const ChromeUtils: any\n\ntype ExportTranslator = {\n setHandler: (phase: string, handler: (obj: { string: string }, success: boolean) => void) => void // eslint-disable-line id-blacklist\n setTranslator: (id: string) => void\n setItems: (items: any[]) => void\n translate: () => void\n}\n\nconst zotero_prefs_root = 'extensions.zotero.'\n\nclass DebugLogSender {\n public id = {\n menu: 'debug-log-sender-menu',\n menupopup: 'debug-log-sender-menupopup',\n menuitem: 'debug-log-sender',\n }\n\n public debugEnabledAtStart: boolean = typeof Zotero !== 'undefined'\n ? (Zotero.Prefs.get('debug.store') || Zotero.Debug.enabled) as unknown as boolean\n : null\n\n private element(name: string, attrs: Record<string, string> = {}): HTMLElement {\n const doc = Zotero.getMainWindow().document\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-call\n const elt: HTMLElement = doc[Zotero.platformMajorVersion >= 102 ? 'createXULElement' : 'createElement'](name)\n for (const [k, v] of Object.entries(attrs)) {\n elt.setAttribute(k, v)\n }\n return elt\n }\n\n public register(plugin: string, preferences: string[] = [], pubkey = ''): void {\n const label = 'Send plugin debug log'\n\n const doc = Zotero.getMainWindow()?.document\n if (doc) {\n let menupopup = doc.querySelector(`#${this.id.menupopup}`)\n if (menupopup) {\n menupopup.setAttribute('label', label)\n }\n else {\n menupopup = doc.querySelector('menupopup#menu_HelpPopup')\n .appendChild(this.element('menu', { id: this.id.menu, label }))\n .appendChild(this.element('menupopup', { id: this.id.menupopup }))\n }\n\n doc.querySelector(`.${this.id.menuitem}[label=${JSON.stringify(plugin)}]`)?.remove()\n const menuitem = menupopup.appendChild(this.element('menuitem', {\n label: plugin,\n class: this.id.menuitem,\n 'data-preferences': JSON.stringify(preferences || []),\n 'data-pubkey': pubkey,\n }))\n menuitem.addEventListener('command', event => this.send(event.currentTarget))\n }\n }\n\n public unregister(plugin: string): void {\n const doc = Zotero.getMainWindow()?.document\n if (doc) {\n doc.querySelector(`.debug-log-sender[label=${JSON.stringify(plugin)}]`)?.remove()\n const menupopup = doc.querySelector('#debug-log-sender-menupopup')\n if (menupopup && !menupopup.children.length) doc.querySelector('#debug-log-sender-menu')?.remove()\n }\n }\n\n public send(target: EventTarget): void {\n const elt: HTMLElement = target as unknown as HTMLElement\n const plugin: string = elt.getAttribute('label')\n const preferences: string[] = JSON.parse(elt.getAttribute('data-preferences')) as string[]\n const pubkey: string = elt.getAttribute('data-pubkey')\n\n this.sendAsync(plugin, preferences, pubkey).catch((err: Error) => {\n Services.prompt.alert(null, 'Debug log submission error', `${err}`) // eslint-disable-line @typescript-eslint/restrict-template-expressions\n })\n }\n\n private async sendAsync(plugin: string, preferences: string[], pubkey = '') {\n await Zotero.Schema.schemaUpdatePromise\n\n const bundler = new Bundler(pubkey)\n\n let log = [\n await this.info(preferences),\n Zotero.getErrors(true).join('\\n\\n'),\n Zotero.Debug.getConsoleViewerOutput().slice(-250000).join('\\n'), // eslint-disable-line no-magic-numbers\n ].filter((txt: string) => txt).join('\\n\\n').trim()\n await bundler.add('debug.txt', log)\n\n let rdf = await this.rdf()\n if (rdf) await bundler.add('items.rdf', rdf, true)\n\n try {\n const response = await fetch('https://0x0.st', {\n method: 'POST',\n body: bundler.formData(),\n headers: {\n 'User-Agent': `Zotero-plugin/${pkg.version}`,\n },\n })\n const body = await response.text()\n const id = body.match(/https:\\/\\/0x0.st\\/([A-Z0-9]+)\\.zip/i)\n if (!id) throw new Error(body)\n Services.prompt.alert(null, `Debug log ID for ${plugin}`, bundler.id(`0x0-${id[1]}`))\n }\n catch (err) {\n Services.prompt.alert(null, `Could not post debug log for ${plugin}`, err.message)\n }\n }\n\n private preferences(preferences: string[]): Record<string, string | number | boolean> {\n const prefs: Record<string, string | number | boolean> = {}\n\n const names: string[] = []\n for (let pref of preferences) {\n if (pref[0] === ':') {\n pref = pref.substring(1)\n }\n else if (!pref.startsWith(zotero_prefs_root)) {\n pref = zotero_prefs_root + pref\n }\n if (pref.endsWith('.')) {\n const childkeys: string[] = Services.prefs.getBranch(pref).getChildList('', {})\n for (const key of childkeys) {\n names.push(pref + key)\n }\n }\n else {\n names.push(pref)\n }\n }\n\n for (const pref of names.sort()) {\n prefs[pref] = Zotero.Prefs.get(pref, true)\n }\n\n return prefs\n }\n\n // general state of Zotero\n private async info(preferences: string[]): Promise<string> {\n let info = ''\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-assignment\n const appInfo: { name: string; version: string } = Components.classes['@mozilla.org/xre/app-info;1'].getService(Components.interfaces.nsIXULAppInfo)\n info += `Application: ${appInfo.name} ${appInfo.version} ${Zotero.locale}\\n`\n\n const platform = ['Win', 'Mac', 'Linux'].find(p => Zotero[`is${p}`]) || 'Unknown'\n const arch = Zotero.oscpu || Zotero.arch\n info += `Platform: ${platform} ${arch}\\n`\n\n const addons: string[] = await Zotero.getInstalledExtensions()\n if (addons.length) {\n info += 'Addons:\\n' + addons.map((addon: string) => ` ${addon}\\n`).join('') // eslint-disable-line prefer-template\n }\n info += `Debug logging on at Zotero start: ${this.debugEnabledAtStart}\\n`\n info += `Debug logging on at log submit: ${Zotero.Prefs.get('debug.store') || Zotero.Debug.enabled}\\n`\n\n for (const [pref, value] of Object.entries(this.preferences(preferences))) {\n info += `${pref} = ${JSON.stringify(value)}\\n`\n }\n\n return info\n }\n\n private rdf(): Promise<string> {\n return new Promise((resolve, reject) => {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-assignment\n const items: any[] = Zotero.getActiveZoteroPane().getSelectedItems()\n if (items.length === 0) return resolve('')\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call\n const translation: ExportTranslator = new Zotero.Translate.Export() as ExportTranslator\n translation.setItems(items)\n translation.setTranslator('14763d24-8ba0-45df-8f52-b8d1108e7ac9') // rdf\n\n translation.setHandler('done', (obj, success) => {\n if (success) {\n resolve(obj ? obj.string : undefined)\n }\n else {\n reject(new Error('translation failed'))\n }\n })\n\n translation.translate() // eslint-disable-line @typescript-eslint/no-unsafe-call\n })\n }\n\n private arrayBufferToBase64(buffer) {\n let binary = ''\n const bytes = new Uint8Array(buffer)\n const len = bytes.byteLength\n for (let i = 0; i < len; i++) {\n binary += String.fromCharCode(bytes[i])\n }\n return btoa(binary)\n }\n\n private base64ToArrayBuffer(base64) {\n const binaryString = atob(base64)\n const len = binaryString.length\n const bytes = new Uint8Array(len)\n for (let i = 0; i < len; i++) {\n bytes[i] = binaryString.charCodeAt(i)\n }\n return bytes.buffer\n }\n}\n\nexport const DebugLog = new DebugLogSender()\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../package.json","../../debug-log.ts"],"sourcesContent":["export default {\n \"name\": \"zotero-plugin\",\n \"version\": \"7.0.9\",\n \"description\": \"Zotero plugin builder\",\n \"homepage\": \"https://github.com/retorquere/zotero-plugin/wiki\",\n \"type\": \"module\",\n \"main\": \"./dist/cjs/index.js\",\n \"module\": \"./dist/esm/index.js\",\n \"exports\": {\n \".\": {\n \"import\": \"./dist/esm/index.js\",\n \"require\": \"./dist/cjs/index.cjs\"\n },\n \"./debug-log\": {\n \"import\": \"./dist/esm/debug-log.js\",\n \"require\": \"./dist/cjs/debug-log.cjs\"\n },\n \"./logger\": {\n \"import\": \"./dist/esm/ulogger.js\",\n \"require\": \"./dist/cjs/logger.cjs\"\n },\n \".loader/json\": {\n \"import\": \"./dist/esm/loader/json.js\",\n \"require\": \"./dist/cjs/loader/json.cjs\"\n },\n \".loader/peggy\": {\n \"import\": \"./dist/esm/loader/peggy.js\",\n \"require\": \"./dist/cjs/loader/peggy.cjs\"\n },\n \".loader/pem\": {\n \"import\": \"./dist/esm/loader/pem.js\",\n \"require\": \"./dist/cjs/loader/pem.cjs\"\n },\n \"./copy-assets\": {\n \"import\": \"./dist/esm/bin/copy-assets.js\",\n \"require\": \"./dist/cjs/bin/copy-assets.cjs\"\n },\n \"./make-dirs\": {\n \"import\": \"./dist/esm/bin/make-dirs.js\",\n \"require\": \"./dist/cjs/bin/make-dirs.cjs\"\n },\n \"./make-manifest\": {\n \"import\": \"./dist/esm/bin/make-manifest.js\",\n \"require\": \"./dist/cjs/bin/make-manifest.cjs\"\n },\n \"./make-version\": {\n \"import\": \"./dist/esm/bin/version.js\",\n \"require\": \"./dist/cjs/bin/version.cjs\"\n }\n },\n \"author\": {\n \"name\": \"Emiliano Heyns\",\n \"email\": \"Emiliano.Heyns@iris-advies.com\"\n },\n \"scripts\": {\n \"preversion\": \"npm test\",\n \"postversion\": \"git push --follow-tags\",\n \"test\": \"dprint fmt *.ts */*.ts && dprint check *.ts */*.ts && npm run build\",\n \"prebuild\": \"rm -rf dist\",\n \"build\": \"tsup\",\n \"check\": \"tsc --noEmit\",\n \"start\": \"concurrently --raw --group 'npm run check' 'npm run build'\",\n \"pack\": \"npm test && npm pack\",\n \"prepublishOnly\": \"npm install && npm run build\",\n \"ncu\": \"ncu -u && npm i && git add package.json package-lock.json && git commit -m ncu\"\n },\n \"directories\": {\n \"test\": \"test\"\n },\n \"dependencies\": {\n \"@fluent/syntax\": \"^0.19.0\",\n \"@napi-rs/keyring\": \"^1.2.0\",\n \"@octokit/rest\": \"^22.0.0\",\n \"@rgrove/parse-xml\": \"^4.2.0\",\n \"@types/node\": \"^24.9.1\",\n \"@xmldom/xmldom\": \"^0.9.8\",\n \"ajv\": \"^8.17.1\",\n \"ajv-keywords\": \"^5.1.0\",\n \"archiver\": \"^7.0.1\",\n \"clp\": \"^4.0.13\",\n \"commander\": \"^14.0.1\",\n \"dotenv\": \"^17.2.3\",\n \"ejs\": \"^3.1.10\",\n \"fs-extra\": \"^11.3.2\",\n \"glob\": \"^11.0.3\",\n \"ini\": \"^6.0.0\",\n \"jsesc\": \"^3.1.0\",\n \"lodash\": \"^4.17.21\",\n \"moment\": \"^2.30.1\",\n \"node-stream-zip\": \"^1.15.0\",\n \"openpgp\": \"^6.2.2\",\n \"peggy\": \"^5.0.6\",\n \"prompts\": \"^2.4.2\",\n \"pug\": \"^3.0.3\",\n \"rimraf\": \"^6.0.1\",\n \"shell-quote\": \"^1.8.3\",\n \"shelljs\": \"^0.10.0\",\n \"string-to-arraybuffer\": \"^1.0.2\",\n \"ts-node\": \"^10.9.2\",\n \"tslib\": \"^2.8.1\",\n \"typescript\": \"^5.9.3\",\n \"uri-templates\": \"^0.2.0\",\n \"url-template\": \"^3.1.1\",\n \"uzip\": \"^0.20201231.0\",\n \"xml-parser\": \"^1.2.1\",\n \"xpath\": \"^0.0.34\"\n },\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/retorquere/zotero-plugin.git\"\n },\n \"license\": \"ISC\",\n \"files\": [\n \"package.json\",\n \"README.md\",\n \"dist\"\n ],\n \"bin\": {\n \"zp-release\": \"dist/cjs/bin/release.cjs\",\n \"zp-zipup\": \"dist/cjs/bin/zipup.cjs\",\n \"zp-link\": \"dist/cjs/bin/link.cjs\",\n \"issue-branches\": \"dist/cjs/bin/branches.cjs\",\n \"zotero-start\": \"dist/cjs/bin/start.cjs\",\n \"zp-fetch-log\": \"dist/cjs/bin/fetch-log.cjs\",\n \"zp-keypair\": \"dist/cjs/bin/keypair.cjs\",\n \"zp-copy-assets\": \"dist/cjs/copy-assets.cjs\",\n \"zp-make-dirs\": \"dist/cjs/make-dirs.cjs\",\n \"zp-manifest\": \"dist/cjs/make-manifest.cjs\",\n \"zp-version\": \"dist/cjs/version.cjs\"\n },\n \"bugs\": {\n \"url\": \"https://github.com/retorquere/zotero-plugin/issues\"\n },\n \"devDependencies\": {\n \"@openpgp/web-stream-tools\": \"^0.2.0\",\n \"concurrently\": \"^9.2.1\",\n \"dprint\": \"^0.50.2\",\n \"esbuild\": \"^0.25.11\",\n \"tsup\": \"^8.5.0\"\n }\n}\n","/* eslint-disable no-magic-numbers */\n\nComponents.utils.importGlobalProperties(['FormData'])\n\ntype ZoteroPane = {\n getSelectedItems: () => any[]\n}\n\nimport pkg from './package.json'\n\nimport * as UZip from 'uzip'\n\n/*\nconst path = new class {\n #home = ''\n\n get home(): string {\n return this.#home = (this.#home || FileUtils.getDir('Home', []).path)\n }\n}\n*/\n\nexport class Bundler {\n public key: string\n\n #refs = false\n\n private IV_LENGTH = 12\n #symmetric: CryptoKey\n #pubkey: string\n\n #crypto: Crypto\n #subtle: SubtleCrypto\n #files: Record<string, Uint8Array> = {}\n\n #encoder = new TextEncoder()\n\n constructor(pubkey: string) {\n this.key = Zotero.Utilities.generateObjectKey()\n this.#pubkey = pubkey\n this.#crypto = Zotero.getMainWindow().crypto\n this.#subtle = this.#crypto.subtle\n }\n\n async add(path: string, data: string, refs = false): Promise<void> {\n this.#refs = this.#refs || refs\n\n const encoded = this.#encoder.encode(data)\n\n if (this.#pubkey) {\n if (!this.#symmetric) {\n this.#symmetric = await this.#subtle.generateKey({ name: 'AES-GCM', length: 256 }, true, ['encrypt', 'decrypt'])\n\n const base64Pem = this.#pubkey\n .replace('-----BEGIN PUBLIC KEY-----', '')\n .replace('-----END PUBLIC KEY-----', '')\n .replace(/\\s/g, '')\n const keyBuffer = Uint8Array.from(atob(base64Pem), c => c.charCodeAt(0)).buffer\n const publicKey = await this.#subtle.importKey('spki', keyBuffer, { name: 'RSA-OAEP', hash: 'SHA-256' }, true, ['encrypt'])\n const exportedKey = await this.#subtle.exportKey('raw', this.#symmetric)\n\n this.#files[`${this.key}/${this.key}.key`] = new Uint8Array(await this.#subtle.encrypt({ name: 'RSA-OAEP' }, publicKey, exportedKey))\n }\n\n const iv = this.#crypto.getRandomValues(new Uint8Array(this.IV_LENGTH))\n const encryptedData = await this.#subtle.encrypt({ name: 'AES-GCM', iv: iv }, this.#symmetric, encoded)\n this.#files[`${this.key}/${path}.iv`] = iv\n this.#files[`${this.key}/${path}.enc`] = new Uint8Array(encryptedData)\n }\n else {\n this.#files[`${this.key}/${path}`] = encoded\n }\n }\n\n public get zip(): ArrayBuffer {\n return UZip.encode(this.#files) as ArrayBuffer\n }\n\n public get name(): string {\n return `${this.key}.zip`\n }\n\n public id(remote: string): string {\n return `${this.key}-${remote}${this.#refs ? '.refs' : ''}${this.#pubkey ? '.enc' : ''}`\n }\n\n public formData(expire = 30): FormData {\n const blob = new Blob([this.zip], { type: 'application/zip' })\n const formData = new FormData()\n formData.append('file', blob, this.name)\n formData.append('expire', `${expire * 24}`)\n return formData\n }\n}\n\ndeclare var Zotero: { // eslint-disable-line no-var\n platformMajorVersion: number\n debug: (msg: string) => void\n DebugLogSender: {\n plugins: Record<string, string[]>\n }\n Translate: any\n Prefs: {\n get: (name: string, global?: boolean) => string | number | boolean\n }\n getInstalledExtensions: () => Promise<string[]>\n platform: string\n oscpu: string\n arch: string\n locale: string\n Utilities: {\n generateObjectKey: () => string\n }\n Debug: {\n enabled: boolean\n getConsoleViewerOutput: () => string[]\n }\n getErrors: (something: boolean) => string[]\n Schema: {\n schemaUpdatePromise: Promise<void>\n }\n getActiveZoteroPane: () => ZoteroPane\n getMainWindow(): Window\n}\n\ndeclare var Services: any // eslint-disable-line no-var\ndeclare const Components: any\ndeclare const ChromeUtils: any\n\ntype ExportTranslator = {\n setHandler: (phase: string, handler: (obj: { string: string }, success: boolean) => void) => void // eslint-disable-line id-blacklist\n setTranslator: (id: string) => void\n setItems: (items: any[]) => void\n translate: () => void\n}\n\nconst zotero_prefs_root = 'extensions.zotero.'\n\nclass DebugLogSender {\n public id = {\n menu: 'debug-log-sender-menu',\n menupopup: 'debug-log-sender-menupopup',\n menuitem: 'debug-log-sender',\n }\n\n public debugEnabledAtStart: boolean = typeof Zotero !== 'undefined'\n ? (Zotero.Prefs.get('debug.store') || Zotero.Debug.enabled) as unknown as boolean\n : null\n\n private element(name: string, attrs: Record<string, string> = {}): HTMLElement {\n const doc = Zotero.getMainWindow().document\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-call\n const elt: HTMLElement = doc[Zotero.platformMajorVersion >= 102 ? 'createXULElement' : 'createElement'](name)\n for (const [k, v] of Object.entries(attrs)) {\n elt.setAttribute(k, v)\n }\n return elt\n }\n\n public register(plugin: string, preferences: string[] = [], pubkey = ''): void {\n const label = 'Send plugin debug log'\n\n const doc = Zotero.getMainWindow()?.document\n if (doc) {\n let menupopup = doc.querySelector(`#${this.id.menupopup}`)\n if (menupopup) {\n menupopup.setAttribute('label', label)\n }\n else {\n menupopup = doc.querySelector('menupopup#menu_HelpPopup')\n .appendChild(this.element('menu', { id: this.id.menu, label }))\n .appendChild(this.element('menupopup', { id: this.id.menupopup }))\n }\n\n doc.querySelector(`.${this.id.menuitem}[label=${JSON.stringify(plugin)}]`)?.remove()\n const menuitem = menupopup.appendChild(this.element('menuitem', {\n label: plugin,\n class: this.id.menuitem,\n 'data-preferences': JSON.stringify(preferences || []),\n 'data-pubkey': pubkey,\n }))\n menuitem.addEventListener('command', event => this.send(event.currentTarget))\n }\n }\n\n public unregister(plugin: string): void {\n const doc = Zotero.getMainWindow()?.document\n if (doc) {\n doc.querySelector(`.debug-log-sender[label=${JSON.stringify(plugin)}]`)?.remove()\n const menupopup = doc.querySelector('#debug-log-sender-menupopup')\n if (menupopup && !menupopup.children.length) doc.querySelector('#debug-log-sender-menu')?.remove()\n }\n }\n\n public send(target: EventTarget): void {\n const elt: HTMLElement = target as unknown as HTMLElement\n const plugin: string = elt.getAttribute('label')\n const preferences: string[] = JSON.parse(elt.getAttribute('data-preferences')) as string[]\n const pubkey: string = elt.getAttribute('data-pubkey')\n\n this.sendAsync(plugin, preferences, pubkey).catch((err: Error) => {\n Services.prompt.alert(null, 'Debug log submission error', `${err}`) // eslint-disable-line @typescript-eslint/restrict-template-expressions\n })\n }\n\n private async sendAsync(plugin: string, preferences: string[], pubkey = '') {\n await Zotero.Schema.schemaUpdatePromise\n\n const bundler = new Bundler(pubkey)\n\n let log = [\n await this.info(preferences),\n Zotero.getErrors(true).join('\\n\\n'),\n Zotero.Debug.getConsoleViewerOutput().slice(-250000).join('\\n'), // eslint-disable-line no-magic-numbers\n ].filter((txt: string) => txt).join('\\n\\n').trim()\n await bundler.add('debug.txt', log)\n\n let rdf = await this.rdf()\n if (rdf) await bundler.add('items.rdf', rdf, true)\n\n try {\n const response = await fetch('https://0x0.st', {\n method: 'POST',\n body: bundler.formData(),\n headers: {\n 'User-Agent': `Zotero-plugin/${pkg.version}`,\n },\n })\n const body = await response.text()\n const id = body.match(/https:\\/\\/0x0.st\\/([A-Z0-9]+)\\.zip/i)\n if (!id) throw new Error(body)\n Services.prompt.alert(null, `Debug log ID for ${plugin}`, bundler.id(`0x0-${id[1]}`))\n }\n catch (err) {\n Services.prompt.alert(null, `Could not post debug log for ${plugin}`, err.message)\n }\n }\n\n private preferences(preferences: string[]): Record<string, string | number | boolean> {\n const prefs: Record<string, string | number | boolean> = {}\n\n const names: string[] = []\n for (let pref of preferences) {\n if (pref[0] === ':') {\n pref = pref.substring(1)\n }\n else if (!pref.startsWith(zotero_prefs_root)) {\n pref = zotero_prefs_root + pref\n }\n if (pref.endsWith('.')) {\n const childkeys: string[] = Services.prefs.getBranch(pref).getChildList('', {})\n for (const key of childkeys) {\n names.push(pref + key)\n }\n }\n else {\n names.push(pref)\n }\n }\n\n for (const pref of names.sort()) {\n prefs[pref] = Zotero.Prefs.get(pref, true)\n }\n\n return prefs\n }\n\n // general state of Zotero\n private async info(preferences: string[]): Promise<string> {\n let info = ''\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-assignment\n const appInfo: { name: string; version: string } = Components.classes['@mozilla.org/xre/app-info;1'].getService(Components.interfaces.nsIXULAppInfo)\n info += `Application: ${appInfo.name} ${appInfo.version} ${Zotero.locale}\\n`\n\n const platform = ['Win', 'Mac', 'Linux'].find(p => Zotero[`is${p}`]) || 'Unknown'\n const arch = Zotero.oscpu || Zotero.arch\n info += `Platform: ${platform} ${arch}\\n`\n\n const addons: string[] = await Zotero.getInstalledExtensions()\n if (addons.length) {\n info += 'Addons:\\n' + addons.map((addon: string) => ` ${addon}\\n`).join('') // eslint-disable-line prefer-template\n }\n info += `Debug logging on at Zotero start: ${this.debugEnabledAtStart}\\n`\n info += `Debug logging on at log submit: ${Zotero.Prefs.get('debug.store') || Zotero.Debug.enabled}\\n`\n\n for (const [pref, value] of Object.entries(this.preferences(preferences))) {\n info += `${pref} = ${JSON.stringify(value)}\\n`\n }\n\n return info\n }\n\n private rdf(): Promise<string> {\n return new Promise((resolve, reject) => {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-assignment\n const items: any[] = Zotero.getActiveZoteroPane().getSelectedItems()\n if (items.length === 0) return resolve('')\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call\n const translation: ExportTranslator = new Zotero.Translate.Export() as ExportTranslator\n translation.setItems(items)\n translation.setTranslator('14763d24-8ba0-45df-8f52-b8d1108e7ac9') // rdf\n\n translation.setHandler('done', (obj, success) => {\n if (success) {\n resolve(obj ? obj.string : undefined)\n }\n else {\n reject(new Error('translation failed'))\n }\n })\n\n translation.translate() // eslint-disable-line @typescript-eslint/no-unsafe-call\n })\n }\n\n private arrayBufferToBase64(buffer) {\n let binary = ''\n const bytes = new Uint8Array(buffer)\n const len = bytes.byteLength\n for (let i = 0; i < len; i++) {\n binary += String.fromCharCode(bytes[i])\n }\n return btoa(binary)\n }\n\n private base64ToArrayBuffer(base64) {\n const binaryString = atob(base64)\n const len = binaryString.length\n const bytes = new Uint8Array(len)\n for (let i = 0; i < len; i++) {\n bytes[i] = binaryString.charCodeAt(i)\n }\n return bytes.buffer\n }\n}\n\nexport const DebugLog = new DebugLogSender()\n"],"mappings":"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","names":[]}
|