diff --git a/package.json b/package.json index d633618..46f0c5d 100644 --- a/package.json +++ b/package.json @@ -17,7 +17,8 @@ "lint": "eslint src", "lint:fix": "eslint src --fix", "format": "prettier --write \"src/**/*.ts\" \"addon/**/*.js\"", - "format:check": "prettier --check \"src/**/*.ts\" \"addon/**/*.js\"" + "format:check": "prettier --check \"src/**/*.ts\" \"addon/**/*.js\"", + "postinstall": "node scripts/patch-scaffold.mjs" }, "repository": { "type": "git", diff --git a/scripts/patch-scaffold.mjs b/scripts/patch-scaffold.mjs new file mode 100644 index 0000000..82e6cab --- /dev/null +++ b/scripts/patch-scaffold.mjs @@ -0,0 +1,45 @@ +/** + * Patches zotero-plugin-scaffold's parseRepoUrl to accept non-.com domains. + * + * The upstream regex hardcodes `.com` in the URL pattern, which breaks builds + * when the repository is hosted on a self-hosted Gitea instance (any other TLD). + * This script runs automatically via the `postinstall` npm hook after every + * `npm install` / `npm ci`. + */ + +import { readFileSync, writeFileSync } from "fs"; +import { resolve, dirname } from "path"; +import { fileURLToPath } from "url"; + +const __dirname = dirname(fileURLToPath(import.meta.url)); +const target = resolve( + __dirname, + "../node_modules/zotero-plugin-scaffold/dist/shared/zotero-plugin-scaffold.Lk5EW_9z.mjs" +); + +let content; +try { + content = readFileSync(target, "utf8"); +} catch { + console.warn("[patch-scaffold] Target file not found, skipping patch."); + process.exit(0); +} + +// Original: matches only .com hosts +// /:\/\/.+com\/([^/]+)\/([^.]+)\.git$/ +// Replacement: matches any host and makes .git suffix optional +// /:\/\/.+?\/([^/]+)\/([^/.]+)(?:\.git)?$/ +const SEARCH = String.raw`url.match(/:\/\/.+com\/([^/]+)\/([^.]+)\.git$/)`; +const REPLACE = String.raw`url.match(/:\/\/.+?\/([^/]+)\/([^/.]+)(?:\.git)?$/)`; + +if (content.includes(SEARCH)) { + writeFileSync(target, content.replace(SEARCH, REPLACE), "utf8"); + console.log("[patch-scaffold] Applied: parseRepoUrl now accepts any TLD."); +} else if (content.includes(REPLACE)) { + console.log("[patch-scaffold] Already patched, nothing to do."); +} else { + console.warn( + "[patch-scaffold] Could not find target string — scaffold may have been updated. " + + "Check scripts/patch-scaffold.mjs and update SEARCH/REPLACE strings." + ); +} diff --git a/zotero-plugin.config.ts b/zotero-plugin.config.ts index 6097e45..f52d9d0 100644 --- a/zotero-plugin.config.ts +++ b/zotero-plugin.config.ts @@ -1,12 +1,18 @@ import { defineConfig } from "zotero-plugin-scaffold"; import pkg from "./package.json"; +const GITEA_BASE = "https://gitea.bueso.eu/ignacio.ballesteros/zotero-notes-export-org"; + export default defineConfig({ source: ["src", "addon"], dist: ".scaffold/build", name: pkg.config.addonName, id: pkg.config.addonID, namespace: pkg.config.addonRef, + // Explicit URLs are required because zotero-plugin-scaffold's URL parser + // only handles .com domains and cannot parse our self-hosted Gitea instance. + xpiDownloadLink: `${GITEA_BASE}/releases/download/v{{version}}/{{xpiName}}.xpi`, + updateURL: `${GITEA_BASE}/releases/download/release/{{updateJson}}`, build: { esbuildOptions: [ {