chore(package.json): początek dodawania abstrakcji w build-time #125
7
.gitignore
vendored
7
.gitignore
vendored
@ -5,3 +5,10 @@ sidebar.js
|
|||||||
lib/*
|
lib/*
|
||||||
/yarn-error.log
|
/yarn-error.log
|
||||||
/rentgen.zip
|
/rentgen.zip
|
||||||
|
|
||||||
|
# Generated PNG icons (build artifacts)
|
||||||
|
/assets/icons/*.png
|
||||||
|
/assets/icon-addon-*.png
|
||||||
|
|
||||||
|
# Exception: do not ignore the `browser-api` directory inside `lib`
|
||||||
|
!/lib/browser-api/
|
54
lib/browser-api/chrome.ts
Normal file
54
lib/browser-api/chrome.ts
Normal file
@ -0,0 +1,54 @@
|
|||||||
|
/**
|
||||||
|
* Chrome Browser API Implementation
|
||||||
|
*
|
||||||
|
* Mapuje Chrome chrome.* API na nasze ujednolicone BrowserAPI
|
||||||
|
*/
|
||||||
|
|
||||||
|
import type { BrowserAPI } from './types';
|
||||||
|
|
||||||
|
// Chrome używa globalnego obiektu `chrome`
|
||||||
|
declare const chrome: any;
|
||||||
|
|
||||||
|
export const chromeAPI: BrowserAPI = {
|
||||||
|
// Tabs API - chrome.tabs.* → tabs.*
|
||||||
|
tabs: {
|
||||||
|
query: chrome.tabs.query,
|
||||||
|
onUpdated: {
|
||||||
|
addListener: chrome.tabs.onUpdated.addListener,
|
||||||
|
removeListener: chrome.tabs.onUpdated.removeListener,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
|
||||||
|
// Badge API - Chrome używa action (nie browserAction)
|
||||||
|
badge: {
|
||||||
|
setBadgeText: chrome.action.setBadgeText,
|
||||||
|
setTitle: chrome.action.setTitle,
|
||||||
|
setBadgeBackgroundColor: chrome.action.setBadgeBackgroundColor,
|
||||||
|
},
|
||||||
|
|
||||||
|
// WebRequest API - chrome.webRequest.* → webRequest.*
|
||||||
|
webRequest: {
|
||||||
|
onBeforeRequest: {
|
||||||
|
addListener: chrome.webRequest.onBeforeRequest.addListener,
|
||||||
|
},
|
||||||
|
onBeforeSendHeaders: {
|
||||||
|
addListener: chrome.webRequest.onBeforeSendHeaders.addListener,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
|
||||||
|
// Cookies API - chrome.cookies.* → cookies.*
|
||||||
|
cookies: {
|
||||||
|
getAll: chrome.cookies.getAll,
|
||||||
|
remove: chrome.cookies.remove,
|
||||||
|
},
|
||||||
|
|
||||||
|
// Extension API - chrome.extension.* → extension.*
|
||||||
|
extension: {
|
||||||
|
getBackgroundPage: chrome.extension.getBackgroundPage,
|
||||||
|
},
|
||||||
|
|
||||||
|
// Windows API - chrome.windows.* → windows.*
|
||||||
|
windows: {
|
||||||
|
WINDOW_ID_CURRENT: chrome.windows.WINDOW_ID_CURRENT,
|
||||||
|
},
|
||||||
|
};
|
54
lib/browser-api/firefox.ts
Normal file
54
lib/browser-api/firefox.ts
Normal file
@ -0,0 +1,54 @@
|
|||||||
|
/**
|
||||||
|
* Firefox Browser API Implementation
|
||||||
|
*
|
||||||
|
* Mapuje Firefox browser.* API na nasze ujednolicone BrowserAPI
|
||||||
|
*/
|
||||||
|
|
||||||
|
import type { BrowserAPI } from './types';
|
||||||
|
|
||||||
|
// Firefox używa globalnego obiektu `browser`
|
||||||
|
declare const browser: any;
|
||||||
|
|
||||||
|
export const firefoxAPI: BrowserAPI = {
|
||||||
|
// Tabs API - direct mapping
|
||||||
|
tabs: {
|
||||||
|
query: browser.tabs.query,
|
||||||
|
onUpdated: {
|
||||||
|
addListener: browser.tabs.onUpdated.addListener,
|
||||||
|
removeListener: browser.tabs.onUpdated.removeListener,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
|
||||||
|
// Badge API - Firefox używa browserAction
|
||||||
|
badge: {
|
||||||
|
setBadgeText: browser.browserAction.setBadgeText,
|
||||||
|
setTitle: browser.browserAction.setTitle,
|
||||||
|
setBadgeBackgroundColor: browser.browserAction.setBadgeBackgroundColor,
|
||||||
|
},
|
||||||
|
|
||||||
|
// WebRequest API - direct mapping
|
||||||
|
webRequest: {
|
||||||
|
onBeforeRequest: {
|
||||||
|
addListener: browser.webRequest.onBeforeRequest.addListener,
|
||||||
|
},
|
||||||
|
onBeforeSendHeaders: {
|
||||||
|
addListener: browser.webRequest.onBeforeSendHeaders.addListener,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
|
||||||
|
// Cookies API - direct mapping
|
||||||
|
cookies: {
|
||||||
|
getAll: browser.cookies.getAll,
|
||||||
|
remove: browser.cookies.remove,
|
||||||
|
},
|
||||||
|
|
||||||
|
// Extension API - direct mapping
|
||||||
|
extension: {
|
||||||
|
getBackgroundPage: browser.extension.getBackgroundPage,
|
||||||
|
},
|
||||||
|
|
||||||
|
// Windows API - direct mapping
|
||||||
|
windows: {
|
||||||
|
WINDOW_ID_CURRENT: browser.windows.WINDOW_ID_CURRENT,
|
||||||
|
},
|
||||||
|
};
|
27
lib/browser-api/index.ts
Normal file
27
lib/browser-api/index.ts
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
/**
|
||||||
|
* Browser API Abstraction - Main Export
|
||||||
|
*
|
||||||
|
* Eksportuje właściwą implementację na podstawie TARGET build variable
|
||||||
|
*/
|
||||||
|
|
||||||
|
import type { BrowserAPI } from './types';
|
||||||
|
|
||||||
|
// Build-time selection of browser API implementation
|
||||||
|
let browserApi: BrowserAPI;
|
||||||
|
|
||||||
|
// TARGET jest ustawiane przez esbuild.config.js na podstawie npm script
|
||||||
|
if (process.env.TARGET === 'chrome') {
|
||||||
|
// Chrome build - używamy chrome adapter
|
||||||
|
const { chromeAPI } = require('./chrome');
|
||||||
|
browserApi = chromeAPI;
|
||||||
|
} else {
|
||||||
|
// Firefox build (default) - używamy firefox adapter
|
||||||
|
const { firefoxAPI } = require('./firefox');
|
||||||
|
browserApi = firefoxAPI;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Eksportuj jako default export
|
||||||
|
export default browserApi;
|
||||||
|
|
||||||
|
// Re-export typów dla wygody
|
||||||
|
export * from './types';
|
124
lib/browser-api/types.ts
Normal file
124
lib/browser-api/types.ts
Normal file
@ -0,0 +1,124 @@
|
|||||||
|
/**
|
||||||
|
* Browser API Abstraction - Typy na podstawie faktycznego użycia w kodzie
|
||||||
|
*
|
||||||
|
* Przeanalizowane pliki:
|
||||||
|
* - util.ts: tabs.query, Tab.id
|
||||||
|
* - tab-dropdown.tsx: tabs.query, Tab.id, Tab.title
|
||||||
|
* - toolbar.tsx: tabs.query, tabs.onUpdated, Tab.url, windows.WINDOW_ID_CURRENT
|
||||||
|
* - memory.ts: browserAction.*, webRequest.*, cookies.*, extension.*
|
||||||
|
*/
|
||||||
|
|
||||||
|
// === Tab API (util.ts, tab-dropdown.tsx, toolbar.tsx) ===
|
||||||
|
export interface Tab {
|
||||||
|
id?: number; // util.ts: tab.id, tab-dropdown.tsx: tab.id
|
||||||
|
title?: string; // tab-dropdown.tsx: tab.title
|
||||||
|
url?: string; // toolbar.tsx: tab.url
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface TabQuery {
|
||||||
|
currentWindow?: boolean; // util.ts, tab-dropdown.tsx
|
||||||
|
active?: boolean; // toolbar.tsx
|
||||||
|
windowId?: number; // toolbar.tsx
|
||||||
|
}
|
||||||
|
|
||||||
|
// === Badge/BrowserAction API (memory.ts) ===
|
||||||
|
export interface BadgeTextDetails {
|
||||||
|
text: string; // memory.ts: setBadgeText
|
||||||
|
tabId?: number; // memory.ts: setBadgeText (optional)
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface BadgeTitleDetails {
|
||||||
|
title: string; // memory.ts: setTitle
|
||||||
|
tabId?: number; // memory.ts: setTitle (optional)
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface BadgeColorDetails {
|
||||||
|
color: string; // memory.ts: setBadgeBackgroundColor
|
||||||
|
}
|
||||||
|
|
||||||
|
// === WebRequest API (memory.ts) ===
|
||||||
|
export interface RequestDetails {
|
||||||
|
requestId: string; // memory.ts: request.requestId
|
||||||
|
requestHeaders?: RequestHeader[]; // memory.ts: request.requestHeaders
|
||||||
|
// Note: ExtendedRequest konstruktor używa więcej pól,
|
||||||
|
// ale tu skupiamy się na tym co bezpośrednio używa browser API
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface RequestHeader {
|
||||||
|
name: string;
|
||||||
|
value?: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface RequestFilter {
|
||||||
|
urls: string[]; // memory.ts: { urls: ['<all_urls>'] }
|
||||||
|
}
|
||||||
|
|
||||||
|
export type RequestListener = (details: RequestDetails) => void;
|
||||||
|
|
||||||
|
// === Cookies API (memory.ts) ===
|
||||||
|
export interface Cookie {
|
||||||
|
name: string; // memory.ts: cookie.name
|
||||||
|
domain: string; // memory.ts: cookie.domain
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface CookieQuery {
|
||||||
|
domain?: string; // memory.ts: { domain: shorthost }
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface CookieRemove {
|
||||||
|
name: string; // memory.ts: { name: cookie.name, url: ... }
|
||||||
|
url: string; // memory.ts: { url: `https://${cookie.domain}` }
|
||||||
|
}
|
||||||
|
|
||||||
|
// === Main Browser API Interface ===
|
||||||
|
export interface BrowserAPI {
|
||||||
|
// Tabs API
|
||||||
|
tabs: {
|
||||||
|
query(queryInfo: TabQuery): Promise<Tab[]>;
|
||||||
|
onUpdated: {
|
||||||
|
addListener(listener: (tabId: number, changeInfo: any, tab: Tab) => void): void;
|
||||||
|
removeListener(listener: (tabId: number, changeInfo: any, tab: Tab) => void): void;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
// Badge API (Firefox: browserAction, Chrome: action)
|
||||||
|
badge: {
|
||||||
|
setBadgeText(details: BadgeTextDetails): void;
|
||||||
|
setTitle(details: BadgeTitleDetails): void;
|
||||||
|
setBadgeBackgroundColor(details: BadgeColorDetails): void;
|
||||||
|
};
|
||||||
|
|
||||||
|
// WebRequest API
|
||||||
|
webRequest: {
|
||||||
|
onBeforeRequest: {
|
||||||
|
addListener(
|
||||||
|
listener: RequestListener,
|
||||||
|
filter: RequestFilter,
|
||||||
|
extraInfoSpec?: string[]
|
||||||
|
): void;
|
||||||
|
};
|
||||||
|
onBeforeSendHeaders: {
|
||||||
|
addListener(
|
||||||
|
listener: RequestListener,
|
||||||
|
filter: RequestFilter,
|
||||||
|
extraInfoSpec?: string[]
|
||||||
|
): void;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
// Cookies API
|
||||||
|
cookies: {
|
||||||
|
getAll(details: CookieQuery): Promise<Cookie[]>;
|
||||||
|
remove(details: CookieRemove): Promise<Cookie | null>;
|
||||||
|
};
|
||||||
|
|
||||||
|
// Extension API
|
||||||
|
extension: {
|
||||||
|
getBackgroundPage(): Window | null;
|
||||||
|
};
|
||||||
|
|
||||||
|
// Windows API
|
||||||
|
windows: {
|
||||||
|
WINDOW_ID_CURRENT: number;
|
||||||
|
};
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user