zotero-plugin 7.0.14 → 7.0.16

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/README.md CHANGED
@@ -166,4 +166,4 @@ Logs are sent to/retrieved from 0x0.st
166
166
 
167
167
  The preferences you list will be included in the log; if a preference ends with a period (`.`), all preferences under it will be included
168
168
 
169
- The private key is password-protected so in principle you can check it into your repo. If you don't, and you lose your private key, you will not be able to read logs anymore, but you can of course generate a new keypair, put out a new release of your plugin with that new public key, and you're goog to go again.
169
+ The private key is password-protected so in principle you can check it into your repo. If you don't, and you lose your private key, you will not be able to read logs anymore, but you can of course generate a new keypair, put out a new release of your plugin with that new public key, and you're good to go again.
@@ -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.14",
40
+ "version": "7.0.16",
41
41
  "description": "Zotero plugin builder",
42
42
  "homepage": "https://github.com/retorquere/zotero-plugin/wiki",
43
43
  "type": "module",
@@ -107,15 +107,15 @@ var package_default = {
107
107
  "dependencies": {
108
108
  "@fluent/syntax": "^0.19.0",
109
109
  "@napi-rs/keyring": "^1.2.0",
110
- "@octokit/rest": "^22.0.0",
110
+ "@octokit/rest": "^22.0.1",
111
111
  "@rgrove/parse-xml": "^4.2.0",
112
- "@types/node": "^24.9.1",
112
+ "@types/node": "^24.10.0",
113
113
  "@xmldom/xmldom": "^0.9.8",
114
114
  "ajv": "^8.17.1",
115
115
  "ajv-keywords": "^5.1.0",
116
116
  "archiver": "^7.0.1",
117
117
  "clp": "^4.0.13",
118
- "commander": "^14.0.1",
118
+ "commander": "^14.0.2",
119
119
  "dotenv": "^17.2.3",
120
120
  "ejs": "^3.1.10",
121
121
  "fs-extra": "^11.3.2",
@@ -129,7 +129,7 @@ var package_default = {
129
129
  "peggy": "^5.0.6",
130
130
  "prompts": "^2.4.2",
131
131
  "pug": "^3.0.3",
132
- "rimraf": "^6.0.1",
132
+ "rimraf": "^6.1.0",
133
133
  "shell-quote": "^1.8.3",
134
134
  "shelljs": "^0.10.0",
135
135
  "string-to-arraybuffer": "^1.0.2",
@@ -169,10 +169,10 @@ var package_default = {
169
169
  "url": "https://github.com/retorquere/zotero-plugin/issues"
170
170
  },
171
171
  "devDependencies": {
172
- "@openpgp/web-stream-tools": "^0.2.0",
172
+ "@openpgp/web-stream-tools": "^0.2.1",
173
173
  "concurrently": "^9.2.1",
174
174
  "dprint": "^0.50.2",
175
- "esbuild": "^0.25.11",
175
+ "esbuild": "^0.25.12",
176
176
  "tsup": "^8.5.0"
177
177
  }
178
178
  };
@@ -202,8 +202,12 @@ var Bundler = class {
202
202
  if (this.#pubkey) {
203
203
  if (!this.#symmetric) {
204
204
  this.#symmetric = await this.#subtle.generateKey({ name: "AES-GCM", length: 256 }, true, ["encrypt", "decrypt"]);
205
- const base64Pem = this.#pubkey.replace("-----BEGIN PUBLIC KEY-----", "").replace("-----END PUBLIC KEY-----", "").replace(/\s/g, "");
206
- const keyBuffer = Uint8Array.from(atob(base64Pem), (c) => c.charCodeAt(0)).buffer;
205
+ const base64Pem = this.#pubkey.replace(/-----(BEGIN|END) PUBLIC KEY-----/g, "").trim();
206
+ const binaryPem = atob(base64Pem);
207
+ const keyBuffer = binaryPem.split("").reduce((bytes, char, index) => {
208
+ bytes[index] = char.charCodeAt(0);
209
+ return bytes;
210
+ }, new Uint8Array(binaryPem.length)).buffer;
207
211
  const publicKey = await this.#subtle.importKey("spki", keyBuffer, { name: "RSA-OAEP", hash: "SHA-256" }, true, ["encrypt"]);
208
212
  const exportedKey = await this.#subtle.exportKey("raw", this.#symmetric);
209
213
  this.#files[`${this.key}/${this.key}.key`] = new Uint8Array(await this.#subtle.encrypt({ name: "RSA-OAEP" }, publicKey, exportedKey));
@@ -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.14\",\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.replace(/-----(BEGIN|END) PUBLIC KEY-----/g, '').trim()\n const binaryPem = atob(base64Pem)\n const keyBuffer = binaryPem.split('').reduce((bytes, char, index) => {\n bytes[index] = char.charCodeAt(0)\n return bytes\n }, new Uint8Array(binaryPem.length)).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.16\",\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.1\",\n \"@rgrove/parse-xml\": \"^4.2.0\",\n \"@types/node\": \"^24.10.0\",\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.2\",\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.1.0\",\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.1\",\n \"concurrently\": \"^9.2.1\",\n \"dprint\": \"^0.50.2\",\n \"esbuild\": \"^0.25.12\",\n \"tsup\": \"^8.5.0\"\n }\n}\n"],"mappings":"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","names":[]}
@@ -1,7 +1,7 @@
1
1
  // package.json
2
2
  var package_default = {
3
3
  "name": "zotero-plugin",
4
- "version": "7.0.14",
4
+ "version": "7.0.16",
5
5
  "description": "Zotero plugin builder",
6
6
  "homepage": "https://github.com/retorquere/zotero-plugin/wiki",
7
7
  "type": "module",
@@ -71,15 +71,15 @@ var package_default = {
71
71
  "dependencies": {
72
72
  "@fluent/syntax": "^0.19.0",
73
73
  "@napi-rs/keyring": "^1.2.0",
74
- "@octokit/rest": "^22.0.0",
74
+ "@octokit/rest": "^22.0.1",
75
75
  "@rgrove/parse-xml": "^4.2.0",
76
- "@types/node": "^24.9.1",
76
+ "@types/node": "^24.10.0",
77
77
  "@xmldom/xmldom": "^0.9.8",
78
78
  "ajv": "^8.17.1",
79
79
  "ajv-keywords": "^5.1.0",
80
80
  "archiver": "^7.0.1",
81
81
  "clp": "^4.0.13",
82
- "commander": "^14.0.1",
82
+ "commander": "^14.0.2",
83
83
  "dotenv": "^17.2.3",
84
84
  "ejs": "^3.1.10",
85
85
  "fs-extra": "^11.3.2",
@@ -93,7 +93,7 @@ var package_default = {
93
93
  "peggy": "^5.0.6",
94
94
  "prompts": "^2.4.2",
95
95
  "pug": "^3.0.3",
96
- "rimraf": "^6.0.1",
96
+ "rimraf": "^6.1.0",
97
97
  "shell-quote": "^1.8.3",
98
98
  "shelljs": "^0.10.0",
99
99
  "string-to-arraybuffer": "^1.0.2",
@@ -133,10 +133,10 @@ var package_default = {
133
133
  "url": "https://github.com/retorquere/zotero-plugin/issues"
134
134
  },
135
135
  "devDependencies": {
136
- "@openpgp/web-stream-tools": "^0.2.0",
136
+ "@openpgp/web-stream-tools": "^0.2.1",
137
137
  "concurrently": "^9.2.1",
138
138
  "dprint": "^0.50.2",
139
- "esbuild": "^0.25.11",
139
+ "esbuild": "^0.25.12",
140
140
  "tsup": "^8.5.0"
141
141
  }
142
142
  };
@@ -166,8 +166,12 @@ var Bundler = class {
166
166
  if (this.#pubkey) {
167
167
  if (!this.#symmetric) {
168
168
  this.#symmetric = await this.#subtle.generateKey({ name: "AES-GCM", length: 256 }, true, ["encrypt", "decrypt"]);
169
- const base64Pem = this.#pubkey.replace("-----BEGIN PUBLIC KEY-----", "").replace("-----END PUBLIC KEY-----", "").replace(/\s/g, "");
170
- const keyBuffer = Uint8Array.from(atob(base64Pem), (c) => c.charCodeAt(0)).buffer;
169
+ const base64Pem = this.#pubkey.replace(/-----(BEGIN|END) PUBLIC KEY-----/g, "").trim();
170
+ const binaryPem = atob(base64Pem);
171
+ const keyBuffer = binaryPem.split("").reduce((bytes, char, index) => {
172
+ bytes[index] = char.charCodeAt(0);
173
+ return bytes;
174
+ }, new Uint8Array(binaryPem.length)).buffer;
171
175
  const publicKey = await this.#subtle.importKey("spki", keyBuffer, { name: "RSA-OAEP", hash: "SHA-256" }, true, ["encrypt"]);
172
176
  const exportedKey = await this.#subtle.exportKey("raw", this.#symmetric);
173
177
  this.#files[`${this.key}/${this.key}.key`] = new Uint8Array(await this.#subtle.encrypt({ name: "RSA-OAEP" }, publicKey, exportedKey));
@@ -1 +1 @@
1
- {"version":3,"sources":["../../package.json","../../debug-log.ts"],"sourcesContent":["export default {\n \"name\": \"zotero-plugin\",\n \"version\": \"7.0.14\",\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.16\",\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.1\",\n \"@rgrove/parse-xml\": \"^4.2.0\",\n \"@types/node\": \"^24.10.0\",\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.2\",\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.1.0\",\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.1\",\n \"concurrently\": \"^9.2.1\",\n \"dprint\": \"^0.50.2\",\n \"esbuild\": \"^0.25.12\",\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.replace(/-----(BEGIN|END) PUBLIC KEY-----/g, '').trim()\n const binaryPem = atob(base64Pem)\n const keyBuffer = binaryPem.split('').reduce((bytes, char, index) => {\n bytes[index] = char.charCodeAt(0)\n return bytes\n }, new Uint8Array(binaryPem.length)).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":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "zotero-plugin",
3
- "version": "7.0.14",
3
+ "version": "7.0.16",
4
4
  "description": "Zotero plugin builder",
5
5
  "homepage": "https://github.com/retorquere/zotero-plugin/wiki",
6
6
  "type": "module",
@@ -70,15 +70,15 @@
70
70
  "dependencies": {
71
71
  "@fluent/syntax": "^0.19.0",
72
72
  "@napi-rs/keyring": "^1.2.0",
73
- "@octokit/rest": "^22.0.0",
73
+ "@octokit/rest": "^22.0.1",
74
74
  "@rgrove/parse-xml": "^4.2.0",
75
- "@types/node": "^24.9.1",
75
+ "@types/node": "^24.10.0",
76
76
  "@xmldom/xmldom": "^0.9.8",
77
77
  "ajv": "^8.17.1",
78
78
  "ajv-keywords": "^5.1.0",
79
79
  "archiver": "^7.0.1",
80
80
  "clp": "^4.0.13",
81
- "commander": "^14.0.1",
81
+ "commander": "^14.0.2",
82
82
  "dotenv": "^17.2.3",
83
83
  "ejs": "^3.1.10",
84
84
  "fs-extra": "^11.3.2",
@@ -92,7 +92,7 @@
92
92
  "peggy": "^5.0.6",
93
93
  "prompts": "^2.4.2",
94
94
  "pug": "^3.0.3",
95
- "rimraf": "^6.0.1",
95
+ "rimraf": "^6.1.0",
96
96
  "shell-quote": "^1.8.3",
97
97
  "shelljs": "^0.10.0",
98
98
  "string-to-arraybuffer": "^1.0.2",
@@ -132,10 +132,10 @@
132
132
  "url": "https://github.com/retorquere/zotero-plugin/issues"
133
133
  },
134
134
  "devDependencies": {
135
- "@openpgp/web-stream-tools": "^0.2.0",
135
+ "@openpgp/web-stream-tools": "^0.2.1",
136
136
  "concurrently": "^9.2.1",
137
137
  "dprint": "^0.50.2",
138
- "esbuild": "^0.25.11",
138
+ "esbuild": "^0.25.12",
139
139
  "tsup": "^8.5.0"
140
140
  }
141
141
  }