diff --git a/.github/workflows/chrome-extension.yaml b/.github/workflows/chrome-extension.yaml new file mode 100644 index 0000000..165e23c --- /dev/null +++ b/.github/workflows/chrome-extension.yaml @@ -0,0 +1,37 @@ +name: Chrome Extension + +on: + push: + branches: + - main + paths: + - chrome-extension/** + - .github/workflows/chrome-extension.yaml + pull_request: + branches: + - main + paths: + - chrome-extension/** + - .github/workflows/chrome-extension.yaml + +jobs: + test: + runs-on: ubuntu-latest + defaults: + run: + working-directory: chrome-extension + + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Set up Node.js + uses: actions/setup-node@v4 + with: + node-version: "22" + + - name: Install dependencies + run: npm ci + + - name: Formatting + run: npm run test:format diff --git a/.gitignore b/.gitignore index 264e934..14a4680 100644 --- a/.gitignore +++ b/.gitignore @@ -2,4 +2,9 @@ node_modules dist dev +# Wordpress extension wordpress/svn/.svn + +# Chrome extension +chrome-extension/release/ +chrome-extension/release.zip diff --git a/chrome-extension/.prettierignore b/chrome-extension/.prettierignore new file mode 100644 index 0000000..e9041b3 --- /dev/null +++ b/chrome-extension/.prettierignore @@ -0,0 +1,7 @@ +images/ +release/ +release.zip + +.prettierignore +.prettierrc +.DS_Store diff --git a/chrome-extension/.prettierrc b/chrome-extension/.prettierrc new file mode 100644 index 0000000..322931f --- /dev/null +++ b/chrome-extension/.prettierrc @@ -0,0 +1,31 @@ +{ + "singleQuote": true, + "trailingComma": "all", + "bracketSpacing": true, + "printWidth": 120, + "tabWidth": 2, + "useTabs": false, + "semi": true, + "parser": "typescript", + "overrides": [ + { + "files": "*.css", + "options": { + "parser": "css" + } + }, + { + "files": "*.json", + "options": { + "parser": "json" + } + }, + { + "files": "*.html", + "options": { + "parser": "html" + } + } + ] + } + diff --git a/chrome-extension/background.js b/chrome-extension/background.js index e5a92e3..f6267c1 100644 --- a/chrome-extension/background.js +++ b/chrome-extension/background.js @@ -1,6 +1,6 @@ // User preferences change chrome.storage.onChanged.addListener((changes, areaName) => { - const hasPreferencesChanged = areaName === "local" && changes.userPreferences; + const hasPreferencesChanged = areaName === 'local' && changes.userPreferences; if (!hasPreferencesChanged) { return; @@ -16,7 +16,7 @@ chrome.tabs.onActivated.addListener(() => { // Current tab URL change chrome.tabs.onUpdated.addListener((tabId, changeInfo, tab) => { - if (changeInfo.status !== "complete") { + if (changeInfo.status !== 'complete') { return; } @@ -31,21 +31,19 @@ function toggleAutoOpenPDFLinksOnCurrentTab() { return; } - const isUnsupportedURL = - currentTab.url.startsWith("chrome://") || - currentTab.url.startsWith("edge://"); + const isUnsupportedURL = currentTab.url.startsWith('chrome://') || currentTab.url.startsWith('edge://'); if (isUnsupportedURL) { return; } - chrome.storage.local.get("userPreferences", ({ userPreferences }) => { + chrome.storage.local.get('userPreferences', ({ userPreferences }) => { const preferences = userPreferences ?? { autoOpen: false }; chrome.scripting.executeScript( { target: { tabId: currentTab.id }, - files: ["./node_modules/@simplepdf/web-embed-pdf/dist/index.js"], + files: ['./node_modules/@simplepdf/web-embed-pdf/dist/index.js'], }, () => { if (chrome.runtime.lastError) { @@ -61,7 +59,7 @@ function toggleAutoOpenPDFLinksOnCurrentTab() { window.simplePDF.setConfig({ autoOpen: preferences.autoOpen, - companyIdentifier: "chrome", + companyIdentifier: 'chrome', }); }, args: [preferences], diff --git a/chrome-extension/manifest.json b/chrome-extension/manifest.json index 56da2ce..88708b2 100644 --- a/chrome-extension/manifest.json +++ b/chrome-extension/manifest.json @@ -2,7 +2,7 @@ "name": "__MSG_app_name__", "description": "__MSG_app_description__", "default_locale": "en", - "version": "1.3.0", + "version": "1.3.1", "manifest_version": 3, "permissions": ["activeTab", "scripting", "storage"], "host_permissions": [""], diff --git a/chrome-extension/package-lock.json b/chrome-extension/package-lock.json index 9a8e2ff..e71a05a 100644 --- a/chrome-extension/package-lock.json +++ b/chrome-extension/package-lock.json @@ -4,6 +4,7 @@ "requires": true, "packages": { "": { + "license": "MIT", "dependencies": { "@simplepdf/web-embed-pdf": "^1.8.1" }, diff --git a/chrome-extension/package.json b/chrome-extension/package.json index 62ceee7..f7f0965 100644 --- a/chrome-extension/package.json +++ b/chrome-extension/package.json @@ -1,4 +1,16 @@ { + "author": "SimplePDF", + "repository": { + "type": "git", + "url": "git+https://github.com/SimplePDF/simplepdf-embed/tree/main/chrome-extension" + }, + "license": "MIT", + "scripts": { + "prettier": "prettier .", + "test:format": "npm run prettier -- --check", + "format": "npm run prettier -- --write", + "package": "npm ci --production && zip -r release.zip . -x .prettierignore .prettierrc package-lock.json" + }, "dependencies": { "@simplepdf/web-embed-pdf": "^1.8.1" }, diff --git a/chrome-extension/popup.js b/chrome-extension/popup.js index e0eebb6..7a1ee6e 100644 --- a/chrome-extension/popup.js +++ b/chrome-extension/popup.js @@ -3,16 +3,15 @@ chrome.tabs.query({ active: true, currentWindow: true }).then(([tab]) => { { target: { tabId: tab.id }, func: () => { - return { isPDF: document.contentType === "application/pdf" }; + return { isPDF: document.contentType === 'application/pdf' }; }, }, (tab) => { - preferencesHeader.textContent = - chrome.i18n.getMessage("preferencesHeader"); - autoOpenLabel.textContent = chrome.i18n.getMessage("autoOpenLabel"); + preferencesHeader.textContent = chrome.i18n.getMessage('preferencesHeader'); + autoOpenLabel.textContent = chrome.i18n.getMessage('autoOpenLabel'); if (!tab) { - openEditorButton.textContent = chrome.i18n.getMessage("openEditor"); + openEditorButton.textContent = chrome.i18n.getMessage('openEditor'); return; } @@ -23,8 +22,8 @@ chrome.tabs.query({ active: true, currentWindow: true }).then(([tab]) => { ] = tab; openEditorButton.textContent = isPDF - ? chrome.i18n.getMessage("editWithSimplePDF") - : chrome.i18n.getMessage("openEditor"); + ? chrome.i18n.getMessage('editWithSimplePDF') + : chrome.i18n.getMessage('openEditor'); }, ); }); @@ -33,7 +32,7 @@ async function handleOpenEditor() { const openEditor = () => { const currentURL = document.location.href; - const isPDF = document.contentType === "application/pdf"; + const isPDF = document.contentType === 'application/pdf'; const href = isPDF ? currentURL : null; @@ -49,7 +48,7 @@ async function handleOpenEditor() { await chrome.scripting.executeScript( { target: { tabId: tab.id }, - files: ["./node_modules/@simplepdf/web-embed-pdf/dist/index.js"], + files: ['./node_modules/@simplepdf/web-embed-pdf/dist/index.js'], }, () => { if (chrome.runtime.lastError) { @@ -64,7 +63,7 @@ async function handleOpenEditor() { } window.simplePDF.setConfig({ - companyIdentifier: "chrome", + companyIdentifier: 'chrome', }); }, }); @@ -78,25 +77,22 @@ async function handleOpenEditor() { window.close(); } catch (e) { - chrome.tabs.create({ url: "https://simplePDF.com/editor", active: false }); - openEditorButton.style.display = "none"; - errorDetails.textContent = chrome.i18n.getMessage( - "unableToOpenInCurrentTab", - ); - errorMessage.textContent = chrome.i18n.getMessage("openedInOtherTab"); + chrome.tabs.create({ url: 'https://simplePDF.com/editor', active: false }); + openEditorButton.style.display = 'none'; + errorDetails.textContent = chrome.i18n.getMessage('unableToOpenInCurrentTab'); + errorMessage.textContent = chrome.i18n.getMessage('openedInOtherTab'); - await fetch("https://chrome.simplePDF.com/graphql", { - method: "POST", + await fetch('https://chrome.simplePDF.com/graphql', { + method: 'POST', headers: { - "Content-Type": "application/json", + 'Content-Type': 'application/json', }, body: JSON.stringify({ - query: - "mutation Track($input: TrackEventInput!) { track(input: $input) }", + query: 'mutation Track($input: TrackEventInput!) { track(input: $input) }', variables: { input: { - type: "ERROR", - name: "Chrome extension error", + type: 'ERROR', + name: 'Chrome extension error', data: JSON.stringify({ name: e.name, message: e.message }), }, }, @@ -105,10 +101,9 @@ async function handleOpenEditor() { } } -document.addEventListener("DOMContentLoaded", () => { - chrome.storage.local.get("userPreferences", ({ userPreferences }) => { - const isAutoOpenedDefined = - userPreferences && typeof userPreferences.autoOpen !== "undefined"; +document.addEventListener('DOMContentLoaded', () => { + chrome.storage.local.get('userPreferences', ({ userPreferences }) => { + const isAutoOpenedDefined = userPreferences && typeof userPreferences.autoOpen !== 'undefined'; if (isAutoOpenedDefined) { autoOpenRadio.checked = userPreferences.autoOpen; @@ -119,7 +114,7 @@ document.addEventListener("DOMContentLoaded", () => { }); setTimeout(() => { - toggle.classList.add("withTransition"); + toggle.classList.add('withTransition'); }, 200); }); @@ -130,5 +125,5 @@ const handleChangeAutoOpenPreferences = (e) => { chrome.storage.local.set({ userPreferences: preferences }); }; -openEditorButton.addEventListener("click", handleOpenEditor); -autoOpenRadio.addEventListener("change", handleChangeAutoOpenPreferences); +openEditorButton.addEventListener('click', handleOpenEditor); +autoOpenRadio.addEventListener('change', handleChangeAutoOpenPreferences); diff --git a/chrome-extension/styles.css b/chrome-extension/styles.css index 8613b1d..f6ed246 100644 --- a/chrome-extension/styles.css +++ b/chrome-extension/styles.css @@ -117,7 +117,7 @@ border-radius: 50%; background-color: #fff; bottom: 2px; - content: ""; + content: ''; height: 17px; left: 2px; position: absolute;