zotero-plugin 7.0.13 → 7.0.14

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
@@ -74,9 +74,9 @@ DebugLog.register('your plugin name', ['extensions.zotero.<your plugin extension
74
74
 
75
75
  the array is a list of either full names of preferences you want to know about, or a name ending in `.` which means "all keys directly under this".
76
76
 
77
- The Help menu will now have an entry "send debug log to bashupload.com"; when your user selects that, the error log and the selected settings will be sent to bashupload.com; if any items are selected, when that is clicked, a copy of those items will be included in RDF format.
77
+ The Help menu will now have an entry "Send plugin debug log"; when your user selects that, the error log and the selected settings will be sent to 0x0.st.com; if any items are selected, when that is clicked, a copy of those items will be included in RDF format.
78
78
 
79
- The user will get an ID that looks like `C3WvhYgA8RDM-buc-2XZGa`; the last part is the bashupload ID, so you would go to `https://bashupload.com/2XZGa/C3WvhYgA8RDM.zip` to retrieve the download; the zipfile you get there will be `C3WvhYgA8RDM.zip`.
79
+ The user will get an ID that looks like `V8XPP96B-0x0-K2mk.refs.enc`; the `K2mk` part is the 0x0 upload ID, so you would go to `https://0x0.st/K2mk/` to retrieve the download; the zipfile you get there will be `V8XPP96B.zip`. if the ID contains `.refs`, the user had items selected when the log was sent and those are included in RDF format. If the ID contains `.enc` the log is encrypted with your public key. It is not mandatory, but some users are skittish about what is in their log files, and downloads at 0x0 are public if you know the URL, and the user will usually make that information public in the github issue. With encryption on, the logs are still publicly downloaded, but you will need your private key to decrypt it.
80
80
 
81
81
  # Starting Zotero with your plugin loaded
82
82
 
@@ -165,3 +165,5 @@ DebugLog.register('<your plugin name>', ['your-plugin.', 'fileHandler.pdf'], req
165
165
  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
+
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.
@@ -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.13",
40
+ "version": "7.0.14",
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.13\",\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.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,7 +1,7 @@
1
1
  // package.json
2
2
  var package_default = {
3
3
  "name": "zotero-plugin",
4
- "version": "7.0.13",
4
+ "version": "7.0.14",
5
5
  "description": "Zotero plugin builder",
6
6
  "homepage": "https://github.com/retorquere/zotero-plugin/wiki",
7
7
  "type": "module",
@@ -1 +1 @@
1
- {"version":3,"sources":["../../package.json","../../debug-log.ts"],"sourcesContent":["export default {\n \"name\": \"zotero-plugin\",\n \"version\": \"7.0.13\",\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.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":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "zotero-plugin",
3
- "version": "7.0.13",
3
+ "version": "7.0.14",
4
4
  "description": "Zotero plugin builder",
5
5
  "homepage": "https://github.com/retorquere/zotero-plugin/wiki",
6
6
  "type": "module",