@addonova/browser 0.0.0-stage → 0.1.0
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/LICENSE +21 -0
- package/README.md +434 -2
- package/dist/adapters/chrome/index.d.ts +9 -0
- package/dist/adapters/chrome/index.d.ts.map +1 -0
- package/dist/adapters/chrome/index.js +12 -0
- package/dist/adapters/chrome/index.js.map +1 -0
- package/dist/adapters/chromium/index.d.ts +12 -0
- package/dist/adapters/chromium/index.d.ts.map +1 -0
- package/dist/adapters/chromium/index.js +12 -0
- package/dist/adapters/chromium/index.js.map +1 -0
- package/dist/adapters/edge/index.d.ts +11 -0
- package/dist/adapters/edge/index.d.ts.map +1 -0
- package/dist/adapters/edge/index.js +13 -0
- package/dist/adapters/edge/index.js.map +1 -0
- package/dist/adapters/firefox/index.d.ts +10 -0
- package/dist/adapters/firefox/index.d.ts.map +1 -0
- package/dist/adapters/firefox/index.js +12 -0
- package/dist/adapters/firefox/index.js.map +1 -0
- package/dist/adapters/shared/adapter.d.ts +13 -0
- package/dist/adapters/shared/adapter.d.ts.map +1 -0
- package/dist/adapters/shared/adapter.js +24 -0
- package/dist/adapters/shared/adapter.js.map +1 -0
- package/dist/adapters/shared/namespace.d.ts +4 -0
- package/dist/adapters/shared/namespace.d.ts.map +1 -0
- package/dist/adapters/shared/namespace.js +20 -0
- package/dist/adapters/shared/namespace.js.map +1 -0
- package/dist/adapters/types.d.ts +10 -0
- package/dist/adapters/types.d.ts.map +1 -0
- package/dist/adapters/types.js +2 -0
- package/dist/adapters/types.js.map +1 -0
- package/dist/api/action/index.d.ts +6 -0
- package/dist/api/action/index.d.ts.map +1 -0
- package/dist/api/action/index.js +56 -0
- package/dist/api/action/index.js.map +1 -0
- package/dist/api/alarms/index.d.ts +5 -0
- package/dist/api/alarms/index.d.ts.map +1 -0
- package/dist/api/alarms/index.js +34 -0
- package/dist/api/alarms/index.js.map +1 -0
- package/dist/api/bookmarks/index.d.ts +5 -0
- package/dist/api/bookmarks/index.d.ts.map +1 -0
- package/dist/api/bookmarks/index.js +39 -0
- package/dist/api/bookmarks/index.js.map +1 -0
- package/dist/api/browser.d.ts +3 -0
- package/dist/api/browser.d.ts.map +1 -0
- package/dist/api/browser.js +2 -0
- package/dist/api/browser.js.map +1 -0
- package/dist/api/commands/index.d.ts +5 -0
- package/dist/api/commands/index.d.ts.map +1 -0
- package/dist/api/commands/index.js +12 -0
- package/dist/api/commands/index.js.map +1 -0
- package/dist/api/context-menus/index.d.ts +5 -0
- package/dist/api/context-menus/index.d.ts.map +1 -0
- package/dist/api/context-menus/index.js +21 -0
- package/dist/api/context-menus/index.js.map +1 -0
- package/dist/api/cookies/index.d.ts +5 -0
- package/dist/api/cookies/index.d.ts.map +1 -0
- package/dist/api/cookies/index.js +21 -0
- package/dist/api/cookies/index.js.map +1 -0
- package/dist/api/downloads/index.d.ts +5 -0
- package/dist/api/downloads/index.d.ts.map +1 -0
- package/dist/api/downloads/index.js +20 -0
- package/dist/api/downloads/index.js.map +1 -0
- package/dist/api/helpers.d.ts +17 -0
- package/dist/api/helpers.d.ts.map +1 -0
- package/dist/api/helpers.js +100 -0
- package/dist/api/helpers.js.map +1 -0
- package/dist/api/i18n/index.d.ts +5 -0
- package/dist/api/i18n/index.d.ts.map +1 -0
- package/dist/api/i18n/index.js +17 -0
- package/dist/api/i18n/index.js.map +1 -0
- package/dist/api/lazy-adapter.d.ts +5 -0
- package/dist/api/lazy-adapter.d.ts.map +1 -0
- package/dist/api/lazy-adapter.js +37 -0
- package/dist/api/lazy-adapter.js.map +1 -0
- package/dist/api/notifications/index.d.ts +5 -0
- package/dist/api/notifications/index.d.ts.map +1 -0
- package/dist/api/notifications/index.js +27 -0
- package/dist/api/notifications/index.js.map +1 -0
- package/dist/api/permissions/index.d.ts +5 -0
- package/dist/api/permissions/index.d.ts.map +1 -0
- package/dist/api/permissions/index.js +24 -0
- package/dist/api/permissions/index.js.map +1 -0
- package/dist/api/runtime/index.d.ts +5 -0
- package/dist/api/runtime/index.d.ts.map +1 -0
- package/dist/api/runtime/index.js +38 -0
- package/dist/api/runtime/index.js.map +1 -0
- package/dist/api/scripting/index.d.ts +5 -0
- package/dist/api/scripting/index.d.ts.map +1 -0
- package/dist/api/scripting/index.js +15 -0
- package/dist/api/scripting/index.js.map +1 -0
- package/dist/api/sessions/index.d.ts +5 -0
- package/dist/api/sessions/index.d.ts.map +1 -0
- package/dist/api/sessions/index.js +19 -0
- package/dist/api/sessions/index.js.map +1 -0
- package/dist/api/singletons.d.ts +40 -0
- package/dist/api/singletons.d.ts.map +1 -0
- package/dist/api/singletons.js +60 -0
- package/dist/api/singletons.js.map +1 -0
- package/dist/api/storage/index.d.ts +6 -0
- package/dist/api/storage/index.d.ts.map +1 -0
- package/dist/api/storage/index.js +57 -0
- package/dist/api/storage/index.js.map +1 -0
- package/dist/api/tabs/index.d.ts +5 -0
- package/dist/api/tabs/index.d.ts.map +1 -0
- package/dist/api/tabs/index.js +49 -0
- package/dist/api/tabs/index.js.map +1 -0
- package/dist/api/web-navigation/index.d.ts +5 -0
- package/dist/api/web-navigation/index.d.ts.map +1 -0
- package/dist/api/web-navigation/index.js +30 -0
- package/dist/api/web-navigation/index.js.map +1 -0
- package/dist/api/web-request/index.d.ts +5 -0
- package/dist/api/web-request/index.d.ts.map +1 -0
- package/dist/api/web-request/index.js +27 -0
- package/dist/api/web-request/index.js.map +1 -0
- package/dist/api/windows/index.d.ts +5 -0
- package/dist/api/windows/index.d.ts.map +1 -0
- package/dist/api/windows/index.js +27 -0
- package/dist/api/windows/index.js.map +1 -0
- package/dist/browser/detect.d.ts +19 -0
- package/dist/browser/detect.d.ts.map +1 -0
- package/dist/browser/detect.js +89 -0
- package/dist/browser/detect.js.map +1 -0
- package/dist/browser/info.d.ts +17 -0
- package/dist/browser/info.d.ts.map +1 -0
- package/dist/browser/info.js +77 -0
- package/dist/browser/info.js.map +1 -0
- package/dist/browser/resolve.d.ts +9 -0
- package/dist/browser/resolve.d.ts.map +1 -0
- package/dist/browser/resolve.js +57 -0
- package/dist/browser/resolve.js.map +1 -0
- package/dist/browser/support.d.ts +8 -0
- package/dist/browser/support.d.ts.map +1 -0
- package/dist/browser/support.js +18 -0
- package/dist/browser/support.js.map +1 -0
- package/dist/build/target.d.ts +5 -0
- package/dist/build/target.d.ts.map +1 -0
- package/dist/build/target.js +21 -0
- package/dist/build/target.js.map +1 -0
- package/dist/entries/chrome.d.ts +49 -0
- package/dist/entries/chrome.d.ts.map +1 -0
- package/dist/entries/chrome.js +94 -0
- package/dist/entries/chrome.js.map +1 -0
- package/dist/entries/chromium.d.ts +49 -0
- package/dist/entries/chromium.d.ts.map +1 -0
- package/dist/entries/chromium.js +95 -0
- package/dist/entries/chromium.js.map +1 -0
- package/dist/entries/edge.d.ts +49 -0
- package/dist/entries/edge.d.ts.map +1 -0
- package/dist/entries/edge.js +94 -0
- package/dist/entries/edge.js.map +1 -0
- package/dist/entries/firefox.d.ts +49 -0
- package/dist/entries/firefox.d.ts.map +1 -0
- package/dist/entries/firefox.js +93 -0
- package/dist/entries/firefox.js.map +1 -0
- package/dist/entries/info.d.ts +5 -0
- package/dist/entries/info.d.ts.map +1 -0
- package/dist/entries/info.js +21 -0
- package/dist/entries/info.js.map +1 -0
- package/dist/entries/shared-exports.d.ts +10 -0
- package/dist/entries/shared-exports.d.ts.map +1 -0
- package/dist/entries/shared-exports.js +5 -0
- package/dist/entries/shared-exports.js.map +1 -0
- package/dist/entries/support.d.ts +6 -0
- package/dist/entries/support.d.ts.map +1 -0
- package/dist/entries/support.js +16 -0
- package/dist/entries/support.js.map +1 -0
- package/dist/index.d.ts +17 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -0
- package/dist/shared/capabilities.d.ts +25 -0
- package/dist/shared/capabilities.d.ts.map +1 -0
- package/dist/shared/capabilities.js +41 -0
- package/dist/shared/capabilities.js.map +1 -0
- package/dist/shared/errors.d.ts +18 -0
- package/dist/shared/errors.d.ts.map +1 -0
- package/dist/shared/errors.js +32 -0
- package/dist/shared/errors.js.map +1 -0
- package/dist/shared/events.d.ts +11 -0
- package/dist/shared/events.d.ts.map +1 -0
- package/dist/shared/events.js +19 -0
- package/dist/shared/events.js.map +1 -0
- package/dist/shared/objects.d.ts +4 -0
- package/dist/shared/objects.d.ts.map +1 -0
- package/dist/shared/objects.js +14 -0
- package/dist/shared/objects.js.map +1 -0
- package/dist/shared/promises.d.ts +11 -0
- package/dist/shared/promises.d.ts.map +1 -0
- package/dist/shared/promises.js +70 -0
- package/dist/shared/promises.js.map +1 -0
- package/dist/types/action.d.ts +35 -0
- package/dist/types/action.d.ts.map +1 -0
- package/dist/types/action.js +2 -0
- package/dist/types/action.js.map +1 -0
- package/dist/types/alarms.d.ts +21 -0
- package/dist/types/alarms.d.ts.map +1 -0
- package/dist/types/alarms.js +2 -0
- package/dist/types/alarms.js.map +1 -0
- package/dist/types/bookmarks.d.ts +57 -0
- package/dist/types/bookmarks.d.ts.map +1 -0
- package/dist/types/bookmarks.js +2 -0
- package/dist/types/bookmarks.js.map +1 -0
- package/dist/types/commands.d.ts +11 -0
- package/dist/types/commands.d.ts.map +1 -0
- package/dist/types/commands.js +2 -0
- package/dist/types/commands.js.map +1 -0
- package/dist/types/context-menus.d.ts +48 -0
- package/dist/types/context-menus.d.ts.map +1 -0
- package/dist/types/context-menus.js +2 -0
- package/dist/types/context-menus.js.map +1 -0
- package/dist/types/cookies.d.ts +54 -0
- package/dist/types/cookies.d.ts.map +1 -0
- package/dist/types/cookies.js +2 -0
- package/dist/types/cookies.js.map +1 -0
- package/dist/types/downloads.d.ts +43 -0
- package/dist/types/downloads.d.ts.map +1 -0
- package/dist/types/downloads.js +2 -0
- package/dist/types/downloads.js.map +1 -0
- package/dist/types/i18n.d.ts +14 -0
- package/dist/types/i18n.d.ts.map +1 -0
- package/dist/types/i18n.js +2 -0
- package/dist/types/i18n.js.map +1 -0
- package/dist/types/index.d.ts +19 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +2 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/notifications.d.ts +35 -0
- package/dist/types/notifications.d.ts.map +1 -0
- package/dist/types/notifications.js +2 -0
- package/dist/types/notifications.js.map +1 -0
- package/dist/types/permissions.d.ts +14 -0
- package/dist/types/permissions.d.ts.map +1 -0
- package/dist/types/permissions.js +2 -0
- package/dist/types/permissions.js.map +1 -0
- package/dist/types/runtime.d.ts +58 -0
- package/dist/types/runtime.d.ts.map +1 -0
- package/dist/types/runtime.js +2 -0
- package/dist/types/runtime.js.map +1 -0
- package/dist/types/scripting.d.ts +30 -0
- package/dist/types/scripting.d.ts.map +1 -0
- package/dist/types/scripting.js +2 -0
- package/dist/types/scripting.js.map +1 -0
- package/dist/types/sessions.d.ts +28 -0
- package/dist/types/sessions.d.ts.map +1 -0
- package/dist/types/sessions.js +2 -0
- package/dist/types/sessions.js.map +1 -0
- package/dist/types/storage.d.ts +28 -0
- package/dist/types/storage.d.ts.map +1 -0
- package/dist/types/storage.js +2 -0
- package/dist/types/storage.js.map +1 -0
- package/dist/types/tabs.d.ts +96 -0
- package/dist/types/tabs.d.ts.map +1 -0
- package/dist/types/tabs.js +2 -0
- package/dist/types/tabs.js.map +1 -0
- package/dist/types/web-navigation.d.ts +28 -0
- package/dist/types/web-navigation.d.ts.map +1 -0
- package/dist/types/web-navigation.js +2 -0
- package/dist/types/web-navigation.js.map +1 -0
- package/dist/types/web-request.d.ts +20 -0
- package/dist/types/web-request.d.ts.map +1 -0
- package/dist/types/web-request.js +2 -0
- package/dist/types/web-request.js.map +1 -0
- package/dist/types/windows.d.ts +52 -0
- package/dist/types/windows.d.ts.map +1 -0
- package/dist/types/windows.js +2 -0
- package/dist/types/windows.js.map +1 -0
- package/package.json +69 -4
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 hemanta-gayen
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
CHANGED
|
@@ -1,3 +1,435 @@
|
|
|
1
|
-
|
|
1
|
+
[](https://github.com/addonova)
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Browser extension APIs are similar but not identical. `@addonova/browser`
|
|
4
|
+
normalizes the differences that can be normalized safely:
|
|
5
|
+
|
|
6
|
+
- one Promise-based method shape for asynchronous APIs;
|
|
7
|
+
- unchanged native events with `addListener`, `removeListener`, and
|
|
8
|
+
`hasListener`;
|
|
9
|
+
- typed errors for missing APIs, missing permissions, and native failures;
|
|
10
|
+
- support for `chrome`, `chromium`, `edge`, and `firefox` targets;
|
|
11
|
+
- browser-specific entry points for build-time code elimination.
|
|
12
|
+
|
|
13
|
+
The package does not generate manifests, inject content scripts, grant
|
|
14
|
+
permissions, or emulate an API the browser does not provide. See the verified
|
|
15
|
+
[compatibility matrix](docs/compatibility-matrix.md) for the exact support
|
|
16
|
+
surface.
|
|
17
|
+
|
|
18
|
+
## Installation
|
|
19
|
+
|
|
20
|
+
```sh
|
|
21
|
+
npm install @addonova/browser
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
Requirements:
|
|
25
|
+
|
|
26
|
+
- ESM bundler or extension runtime with ES module support.
|
|
27
|
+
- Node.js `>=20` for development and the Guchho-based test tooling.
|
|
28
|
+
- No runtime dependency on Addonova Build.
|
|
29
|
+
|
|
30
|
+
Package entries:
|
|
31
|
+
|
|
32
|
+
| Import | Purpose |
|
|
33
|
+
| --- | --- |
|
|
34
|
+
| `@addonova/browser` | Runtime browser detection; default fallback. |
|
|
35
|
+
| `@addonova/browser/chrome` | Fixed Chrome target. |
|
|
36
|
+
| `@addonova/browser/chromium` | Fixed Chromium target. |
|
|
37
|
+
| `@addonova/browser/edge` | Fixed Edge target. |
|
|
38
|
+
| `@addonova/browser/firefox` | Fixed Firefox target. |
|
|
39
|
+
|
|
40
|
+
## Quick start
|
|
41
|
+
|
|
42
|
+
```ts
|
|
43
|
+
import { action, storage, tabs } from '@addonova/browser';
|
|
44
|
+
|
|
45
|
+
export async function updateBadge(): Promise<void> {
|
|
46
|
+
const [tab] = await tabs.query({ active: true, currentWindow: true });
|
|
47
|
+
|
|
48
|
+
if (tab?.id === undefined) {
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
const { enabled = false } = await storage.local.get('enabled');
|
|
53
|
+
|
|
54
|
+
await tabs.sendMessage(tab.id, {
|
|
55
|
+
type: 'set-enabled',
|
|
56
|
+
enabled,
|
|
57
|
+
});
|
|
58
|
+
await action.setBadgeText({ text: enabled ? 'ON' : '' });
|
|
59
|
+
}
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
Register listeners at the top level of a service worker or event page:
|
|
63
|
+
|
|
64
|
+
```ts
|
|
65
|
+
import { runtime } from '@addonova/browser';
|
|
66
|
+
|
|
67
|
+
runtime.onInstalled.addListener((details) => {
|
|
68
|
+
console.log('Installed/updated:', details.reason);
|
|
69
|
+
});
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
## Browser compatibility
|
|
73
|
+
|
|
74
|
+
The verified matrix is in
|
|
75
|
+
[`docs/compatibility-matrix.md`](docs/compatibility-matrix.md). The short
|
|
76
|
+
version:
|
|
77
|
+
|
|
78
|
+
- Chrome, Chromium, and Edge share one Chromium adapter. Current stable
|
|
79
|
+
releases target Manifest V3; legacy MV2 is outside current support scope.
|
|
80
|
+
- Edge legacy MV2 is still in Microsoft's deprecation transition and is
|
|
81
|
+
conditional.
|
|
82
|
+
- Firefox supports both MV2 and MV3. Firefox MV3 uses `background.scripts`
|
|
83
|
+
event pages, not a service worker.
|
|
84
|
+
- Firefox 102+ exposes `scripting` in MV2; Chromium MV2 does not.
|
|
85
|
+
- `tabs.executeScript` and blocking `webRequest` APIs are intentionally not
|
|
86
|
+
exposed. Use `scripting` and observational `webRequest` events instead.
|
|
87
|
+
- Firefox does not support `notifications.update()` or
|
|
88
|
+
`notifications.onButtonClicked`.
|
|
89
|
+
|
|
90
|
+
Run `supports()` before using an optional API when an extension must work across
|
|
91
|
+
older browser versions.
|
|
92
|
+
|
|
93
|
+
## API reference
|
|
94
|
+
|
|
95
|
+
The root export exposes a `browser` object plus named namespaces:
|
|
96
|
+
|
|
97
|
+
```ts
|
|
98
|
+
import {
|
|
99
|
+
action,
|
|
100
|
+
alarms,
|
|
101
|
+
bookmarks,
|
|
102
|
+
browser,
|
|
103
|
+
browserInfo,
|
|
104
|
+
commands,
|
|
105
|
+
contextMenus,
|
|
106
|
+
cookies,
|
|
107
|
+
downloads,
|
|
108
|
+
getAvailability,
|
|
109
|
+
getBrowserInfo,
|
|
110
|
+
i18n,
|
|
111
|
+
isBrowserSupported,
|
|
112
|
+
notifications,
|
|
113
|
+
permissions,
|
|
114
|
+
runtime,
|
|
115
|
+
scripting,
|
|
116
|
+
sessions,
|
|
117
|
+
storage,
|
|
118
|
+
supports,
|
|
119
|
+
tabs,
|
|
120
|
+
webNavigation,
|
|
121
|
+
webRequest,
|
|
122
|
+
windows,
|
|
123
|
+
BrowserApiError,
|
|
124
|
+
} from '@addonova/browser';
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
| Namespace | Representative methods |
|
|
128
|
+
| --- | --- |
|
|
129
|
+
| `runtime` | `id`, `getManifest`, `getURL`, `sendMessage`, `connect`, events |
|
|
130
|
+
| `storage` | `local`, `sync`, `session`, `managed`, `isAreaAvailable` |
|
|
131
|
+
| `tabs` | `query`, `get`, `create`, `update`, `remove`, `reload`, `sendMessage` |
|
|
132
|
+
| `windows` | `getCurrent`, `create`, `update`, `remove`, `getAll` |
|
|
133
|
+
| `action` | badge text/color, title, icon, `openPopup`, `onClicked` |
|
|
134
|
+
| `alarms` | `create`, `get`, `getAll`, `clear`, `clearAll`, `onAlarm` |
|
|
135
|
+
| `commands` | `getAll`, `onCommand` |
|
|
136
|
+
| `contextMenus` | `create`, `update`, `remove`, `removeAll`, `onClicked` |
|
|
137
|
+
| `notifications` | `create`, `update`, `clear`, `getAll`, events |
|
|
138
|
+
| `permissions` | `contains`, `request`, `remove`, `getAll`, events |
|
|
139
|
+
| `scripting` | `executeScript`, `insertCSS`, `removeCSS` |
|
|
140
|
+
| `bookmarks` | `getTree`, `search`, CRUD, events |
|
|
141
|
+
| `cookies` | `get`, `getAll`, `set`, `remove`, `onChanged` |
|
|
142
|
+
| `downloads` | `download`, `cancel`, `search`, `onChanged` |
|
|
143
|
+
| `sessions` | `getRecentlyClosed`, `restore`, `onChanged` |
|
|
144
|
+
| `webNavigation` | navigation event passthrough |
|
|
145
|
+
| `webRequest` | observational request event passthrough |
|
|
146
|
+
| `i18n` | `getMessage`, `getUILanguage`, `detectLanguage` |
|
|
147
|
+
|
|
148
|
+
Shared exports:
|
|
149
|
+
|
|
150
|
+
- `browserInfo`: lazily resolved browser metadata.
|
|
151
|
+
- `getBrowserInfo()`: resolves the browser name, version, engine, and manifest
|
|
152
|
+
version.
|
|
153
|
+
- `supports('namespace.method')`: boolean feature check.
|
|
154
|
+
- `getAvailability('namespace.method')`: typed availability result with a
|
|
155
|
+
reason.
|
|
156
|
+
- `isBrowserSupported()`: whether an extension runtime is available.
|
|
157
|
+
- `BrowserApiError`: normalized error class with a `code`.
|
|
158
|
+
- `callbackToPromise`, `promisifyMethod`, and event helpers for advanced
|
|
159
|
+
integrations.
|
|
160
|
+
|
|
161
|
+
## TypeScript examples
|
|
162
|
+
|
|
163
|
+
All public types are exported from the package root.
|
|
164
|
+
|
|
165
|
+
```ts
|
|
166
|
+
import {
|
|
167
|
+
BrowserApiError,
|
|
168
|
+
runtime,
|
|
169
|
+
storage,
|
|
170
|
+
type StorageChange,
|
|
171
|
+
} from '@addonova/browser';
|
|
172
|
+
|
|
173
|
+
interface Settings {
|
|
174
|
+
enabled: boolean;
|
|
175
|
+
theme: 'light' | 'dark';
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
export async function readSettings(): Promise<Settings> {
|
|
179
|
+
const values = await storage.local.get(['enabled', 'theme']);
|
|
180
|
+
|
|
181
|
+
return {
|
|
182
|
+
enabled: values.enabled === true,
|
|
183
|
+
theme: values.theme === 'dark' ? 'dark' : 'light',
|
|
184
|
+
};
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
storage.onChanged.addListener(
|
|
188
|
+
(changes: Record<string, StorageChange>, areaName) => {
|
|
189
|
+
if (areaName !== 'local' || changes.enabled === undefined) {
|
|
190
|
+
return;
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
console.log('enabled changed:', changes.enabled.newValue);
|
|
194
|
+
},
|
|
195
|
+
);
|
|
196
|
+
|
|
197
|
+
export async function sendHello(): Promise<void> {
|
|
198
|
+
try {
|
|
199
|
+
await runtime.sendMessage({ type: 'hello' });
|
|
200
|
+
} catch (error) {
|
|
201
|
+
if (error instanceof BrowserApiError) {
|
|
202
|
+
console.error(error.code, error.api, error.message);
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
```
|
|
207
|
+
|
|
208
|
+
## Browser detection
|
|
209
|
+
|
|
210
|
+
```ts
|
|
211
|
+
import { browserInfo, getBrowserInfo } from '@addonova/browser';
|
|
212
|
+
|
|
213
|
+
console.log(browserInfo.name); // 'chrome' | 'chromium' | 'edge' | 'firefox' | 'unknown'
|
|
214
|
+
console.log(browserInfo.engine); // 'chromium' | 'gecko' | 'unknown'
|
|
215
|
+
|
|
216
|
+
const info = getBrowserInfo();
|
|
217
|
+
console.log(info);
|
|
218
|
+
```
|
|
219
|
+
|
|
220
|
+
Detection is feature-first: it checks the extension runtime and API shape before
|
|
221
|
+
parsing the user agent. Outside an extension, the package returns an unknown
|
|
222
|
+
environment instead of throwing at import time.
|
|
223
|
+
|
|
224
|
+
## 8. Feature detection
|
|
225
|
+
|
|
226
|
+
```ts
|
|
227
|
+
import { getAvailability, storage, supports } from '@addonova/browser';
|
|
228
|
+
|
|
229
|
+
if (supports('scripting.executeScript')) {
|
|
230
|
+
// The native API is present.
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
const availability = getAvailability('storage.session');
|
|
234
|
+
console.log(availability.available, availability.reason);
|
|
235
|
+
|
|
236
|
+
if (storage.isAreaAvailable('session')) {
|
|
237
|
+
await storage.session.set({ draft: 'saved for this browser session' });
|
|
238
|
+
}
|
|
239
|
+
```
|
|
240
|
+
|
|
241
|
+
`supports()` is a fast capability check. `getAvailability()` explains why a
|
|
242
|
+
capability is unavailable. Accessing a missing method or event throws
|
|
243
|
+
`BrowserApiError` with `BROWSER_UNSUPPORTED_API`.
|
|
244
|
+
|
|
245
|
+
## 9. Browser-specific adapters
|
|
246
|
+
|
|
247
|
+
Use the root import for runtime detection, or a fixed subpath when the target is
|
|
248
|
+
known at build time:
|
|
249
|
+
|
|
250
|
+
```ts
|
|
251
|
+
import { tabs } from '@addonova/browser/chrome';
|
|
252
|
+
```
|
|
253
|
+
|
|
254
|
+
Chrome, Chromium, and Edge share the Chromium adapter implementation. Firefox
|
|
255
|
+
uses a separate Gecko adapter with native Promises. All entries expose the same
|
|
256
|
+
public surface. Application code should normally import the root; the build
|
|
257
|
+
integration chooses the subpath.
|
|
258
|
+
|
|
259
|
+
## Browser-specific tree shaking
|
|
260
|
+
|
|
261
|
+
Use static imports so a bundler can remove unused APIs:
|
|
262
|
+
|
|
263
|
+
```ts
|
|
264
|
+
import { tabs } from '@addonova/browser';
|
|
265
|
+
|
|
266
|
+
const [tab] = await tabs.query({ active: true, currentWindow: true });
|
|
267
|
+
```
|
|
268
|
+
|
|
269
|
+
Aliasing the root to a browser subpath also removes unrelated adapters:
|
|
270
|
+
|
|
271
|
+
```js
|
|
272
|
+
// Vite-style alias
|
|
273
|
+
resolve: {
|
|
274
|
+
alias: {
|
|
275
|
+
'@addonova/browser': '@addonova/browser/chrome',
|
|
276
|
+
},
|
|
277
|
+
}
|
|
278
|
+
```
|
|
279
|
+
|
|
280
|
+
The repository verifies real generated bundles with Guchho in
|
|
281
|
+
`tests/build/tree-shaking.test.ts`. A Chrome build retains Chrome plus shared
|
|
282
|
+
Chromium code, a Firefox build retains Firefox code, and an Edge build retains
|
|
283
|
+
Edge plus shared Chromium code. Importing only `tabs` removes unrelated API
|
|
284
|
+
modules. Dynamic access through the `browser` object intentionally retains every
|
|
285
|
+
API. See [`docs/build-integration.md`](docs/build-integration.md).
|
|
286
|
+
|
|
287
|
+
## Build-time API selection
|
|
288
|
+
|
|
289
|
+
The optional compile-time definition `__ADDONOVA_BROWSER__` accepts `'chrome'`,
|
|
290
|
+
`'chromium'`, `'firefox'`, `'edge'`, or `'auto'`:
|
|
291
|
+
|
|
292
|
+
```js
|
|
293
|
+
define: {
|
|
294
|
+
__ADDONOVA_BROWSER__: '"chrome"',
|
|
295
|
+
}
|
|
296
|
+
```
|
|
297
|
+
|
|
298
|
+
It makes target-dependent runtime behavior deterministic. It does not replace
|
|
299
|
+
the subpath alias for code elimination. Invalid or missing values fall back to
|
|
300
|
+
`'auto'`.
|
|
301
|
+
|
|
302
|
+
## Runtime resolution
|
|
303
|
+
|
|
304
|
+
The default root import resolves the adapter on first use and memoizes it:
|
|
305
|
+
|
|
306
|
+
1. Read the build-time target, if present.
|
|
307
|
+
2. Detect the extension runtime and browser API shape.
|
|
308
|
+
3. Select Chrome, Chromium, Edge, or Firefox.
|
|
309
|
+
4. Fall back to an unknown environment that reports explicit unsupported errors.
|
|
310
|
+
|
|
311
|
+
Runtime resolution always remains available. It does not require Addonova Build,
|
|
312
|
+
a define, or an alias. Fixed subpaths skip detection and use their target
|
|
313
|
+
provider directly.
|
|
314
|
+
|
|
315
|
+
## Manifest compatibility
|
|
316
|
+
|
|
317
|
+
The library does not create or edit `manifest.json`.
|
|
318
|
+
|
|
319
|
+
Manifest V3:
|
|
320
|
+
|
|
321
|
+
```json
|
|
322
|
+
{
|
|
323
|
+
"manifest_version": 3,
|
|
324
|
+
"background": { "service_worker": "background.js", "type": "module" },
|
|
325
|
+
"action": { "default_popup": "popup.html" },
|
|
326
|
+
"permissions": ["storage", "tabs"],
|
|
327
|
+
"host_permissions": ["https://example.com/*"]
|
|
328
|
+
}
|
|
329
|
+
```
|
|
330
|
+
|
|
331
|
+
For Firefox MV3, use an event page instead of a service worker:
|
|
332
|
+
|
|
333
|
+
```json
|
|
334
|
+
{
|
|
335
|
+
"manifest_version": 3,
|
|
336
|
+
"background": { "scripts": ["background.js"] },
|
|
337
|
+
"action": { "default_popup": "popup.html" },
|
|
338
|
+
"browser_specific_settings": {
|
|
339
|
+
"gecko": { "id": "example@addonova.dev" }
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
```
|
|
343
|
+
|
|
344
|
+
Manifest V2 for Firefox uses `browser_action` or `page_action`, host
|
|
345
|
+
permissions inside `permissions`, and background scripts or a background page.
|
|
346
|
+
Chromium legacy MV2 is outside current support scope; Edge MV2 is conditional.
|
|
347
|
+
See the [compatibility matrix](docs/compatibility-matrix.md) for background
|
|
348
|
+
shapes, `webRequestBlocking`, `scripting`, and host-permission differences.
|
|
349
|
+
|
|
350
|
+
Register event listeners synchronously at the top level of a service worker or
|
|
351
|
+
event page. Do not wait for asynchronous initialization before registering
|
|
352
|
+
listeners.
|
|
353
|
+
|
|
354
|
+
## Error handling
|
|
355
|
+
|
|
356
|
+
```ts
|
|
357
|
+
import { BrowserApiError, runtime } from '@addonova/browser';
|
|
358
|
+
|
|
359
|
+
try {
|
|
360
|
+
await runtime.sendMessage({ type: 'ping' });
|
|
361
|
+
} catch (error) {
|
|
362
|
+
if (error instanceof BrowserApiError) {
|
|
363
|
+
switch (error.code) {
|
|
364
|
+
case 'BROWSER_UNSUPPORTED_API':
|
|
365
|
+
case 'BROWSER_UNSUPPORTED_ENVIRONMENT':
|
|
366
|
+
case 'BROWSER_PERMISSION_DENIED':
|
|
367
|
+
case 'BROWSER_API_FAILED':
|
|
368
|
+
console.error(error.code, error.api, error.message);
|
|
369
|
+
break;
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
```
|
|
374
|
+
|
|
375
|
+
Error codes:
|
|
376
|
+
|
|
377
|
+
| Code | Meaning |
|
|
378
|
+
| --- | --- |
|
|
379
|
+
| `BROWSER_UNSUPPORTED_API` | Namespace, method, or event is unavailable. |
|
|
380
|
+
| `BROWSER_UNSUPPORTED_ENVIRONMENT` | No extension runtime was detected. |
|
|
381
|
+
| `BROWSER_PERMISSION_DENIED` | The browser reported a permission failure. |
|
|
382
|
+
| `BROWSER_API_FAILED` | A native API failed for another reason. |
|
|
383
|
+
|
|
384
|
+
No module fakes success, silently no-ops, or falls back to an unrequested API.
|
|
385
|
+
|
|
386
|
+
## Permissions
|
|
387
|
+
|
|
388
|
+
Permissions are never requested or granted automatically. Declare static
|
|
389
|
+
permissions in the manifest and request optional permissions from a permitted
|
|
390
|
+
user gesture:
|
|
391
|
+
|
|
392
|
+
```ts
|
|
393
|
+
import { permissions } from '@addonova/browser';
|
|
394
|
+
|
|
395
|
+
const granted = await permissions.request({
|
|
396
|
+
permissions: ['bookmarks'],
|
|
397
|
+
});
|
|
398
|
+
|
|
399
|
+
if (!granted) {
|
|
400
|
+
console.warn('Bookmarks permission was not granted.');
|
|
401
|
+
}
|
|
402
|
+
```
|
|
403
|
+
|
|
404
|
+
Module permission mapping:
|
|
405
|
+
|
|
406
|
+
| Module | Requirement |
|
|
407
|
+
| --- | --- |
|
|
408
|
+
| `storage` | `storage` |
|
|
409
|
+
| `tabs` | `tabs` for sensitive fields; host permissions for page access |
|
|
410
|
+
| `alarms` | `alarms` |
|
|
411
|
+
| `contextMenus` | `contextMenus` |
|
|
412
|
+
| `notifications` | `notifications` |
|
|
413
|
+
| `bookmarks` | `bookmarks` |
|
|
414
|
+
| `cookies` | `cookies` plus host permissions |
|
|
415
|
+
| `downloads` | `downloads` |
|
|
416
|
+
| `sessions` | `sessions` |
|
|
417
|
+
| `webNavigation` | `webNavigation` |
|
|
418
|
+
| `webRequest` | `webRequest` plus host permissions |
|
|
419
|
+
| `scripting` | `scripting` plus host permissions or `activeTab` |
|
|
420
|
+
| `runtime`, `action`, `commands`, `i18n` | No extra runtime permission |
|
|
421
|
+
|
|
422
|
+
Static host permissions are granted at install time subject to browser policy.
|
|
423
|
+
`permissions.request()` asks the user; it can return `false` or reject. See
|
|
424
|
+
[`docs/api-compatibility.md`](docs/api-compatibility.md) and the
|
|
425
|
+
[compatibility matrix](docs/compatibility-matrix.md).
|
|
426
|
+
|
|
427
|
+
Packaging and manual browser smoke-test steps are in
|
|
428
|
+
[`docs/integration-testing.md`](docs/integration-testing.md).
|
|
429
|
+
|
|
430
|
+
Do not publish to npm without explicit authorization. Security issues should be
|
|
431
|
+
reported according to [`SECURITY`](https://github.com/addonova/.github/blob/main/.github/SECURITY.md).
|
|
432
|
+
|
|
433
|
+
## License
|
|
434
|
+
|
|
435
|
+
Addonova is licensed under **MIT**. Copyright © [CodeHemu](https://github.com/code-hemu).
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { ManifestVersion } from '../../shared/capabilities.ts';
|
|
2
|
+
import type { BrowserAdapter } from '../types.ts';
|
|
3
|
+
export interface ChromeAdapterOptions {
|
|
4
|
+
api: unknown;
|
|
5
|
+
manifestVersion: ManifestVersion | null;
|
|
6
|
+
callbackBased?: boolean;
|
|
7
|
+
}
|
|
8
|
+
export declare function createChromeAdapter(options: ChromeAdapterOptions): BrowserAdapter;
|
|
9
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/adapters/chrome/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AACpE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAGlD,MAAM,WAAW,oBAAoB;IACnC,GAAG,EAAE,OAAO,CAAC;IACb,eAAe,EAAE,eAAe,GAAG,IAAI,CAAC;IACxC,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,oBAAoB,GAC5B,cAAc,CAShB"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { createChromiumAdapter } from '../chromium/index.js';
|
|
2
|
+
export function createChromeAdapter(options) {
|
|
3
|
+
return createChromiumAdapter({
|
|
4
|
+
target: 'chrome',
|
|
5
|
+
api: options.api,
|
|
6
|
+
manifestVersion: options.manifestVersion,
|
|
7
|
+
...(options.callbackBased === undefined
|
|
8
|
+
? {}
|
|
9
|
+
: { callbackBased: options.callbackBased }),
|
|
10
|
+
});
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/adapters/chrome/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAQ7D,MAAM,UAAU,mBAAmB,CACjC,OAA6B;IAE7B,OAAO,qBAAqB,CAAC;QAC3B,MAAM,EAAE,QAAQ;QAChB,GAAG,EAAE,OAAO,CAAC,GAAG;QAChB,eAAe,EAAE,OAAO,CAAC,eAAe;QACxC,GAAG,CAAC,OAAO,CAAC,aAAa,KAAK,SAAS;YACrC,CAAC,CAAC,EAAE;YACJ,CAAC,CAAC,EAAE,aAAa,EAAE,OAAO,CAAC,aAAa,EAAE,CAAC;KAC9C,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { ManifestVersion } from '../../shared/capabilities.ts';
|
|
2
|
+
import type { BrowserAdapter } from '../types.ts';
|
|
3
|
+
import { type CapabilityOverride } from '../shared/adapter.ts';
|
|
4
|
+
export interface ChromiumAdapterOptions {
|
|
5
|
+
target: 'chrome' | 'chromium' | 'edge';
|
|
6
|
+
api: unknown;
|
|
7
|
+
manifestVersion: ManifestVersion | null;
|
|
8
|
+
callbackBased?: boolean;
|
|
9
|
+
overrides?: CapabilityOverride;
|
|
10
|
+
}
|
|
11
|
+
export declare function createChromiumAdapter(options: ChromiumAdapterOptions): BrowserAdapter;
|
|
12
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/adapters/chromium/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AACpE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAEL,KAAK,kBAAkB,EACxB,MAAM,sBAAsB,CAAC;AAE9B,MAAM,WAAW,sBAAsB;IACrC,MAAM,EAAE,QAAQ,GAAG,UAAU,GAAG,MAAM,CAAC;IACvC,GAAG,EAAE,OAAO,CAAC;IACb,eAAe,EAAE,eAAe,GAAG,IAAI,CAAC;IACxC,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,SAAS,CAAC,EAAE,kBAAkB,CAAC;CAChC;AAED,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,sBAAsB,GAC9B,cAAc,CAShB"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { createAdapter, } from '../shared/adapter.js';
|
|
2
|
+
export function createChromiumAdapter(options) {
|
|
3
|
+
return createAdapter({
|
|
4
|
+
target: options.target,
|
|
5
|
+
engine: 'chromium',
|
|
6
|
+
callbackBased: options.callbackBased ?? true,
|
|
7
|
+
api: options.api,
|
|
8
|
+
manifestVersion: options.manifestVersion,
|
|
9
|
+
...(options.overrides === undefined ? {} : { overrides: options.overrides }),
|
|
10
|
+
});
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/adapters/chromium/index.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,aAAa,GAEd,MAAM,sBAAsB,CAAC;AAU9B,MAAM,UAAU,qBAAqB,CACnC,OAA+B;IAE/B,OAAO,aAAa,CAAC;QACnB,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,MAAM,EAAE,UAAU;QAClB,aAAa,EAAE,OAAO,CAAC,aAAa,IAAI,IAAI;QAC5C,GAAG,EAAE,OAAO,CAAC,GAAG;QAChB,eAAe,EAAE,OAAO,CAAC,eAAe;QACxC,GAAG,CAAC,OAAO,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,CAAC;KAC7E,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { ManifestVersion } from '../../shared/capabilities.ts';
|
|
2
|
+
import type { BrowserAdapter } from '../types.ts';
|
|
3
|
+
import type { CapabilityOverride } from '../shared/adapter.ts';
|
|
4
|
+
export interface EdgeAdapterOptions {
|
|
5
|
+
api: unknown;
|
|
6
|
+
manifestVersion: ManifestVersion | null;
|
|
7
|
+
callbackBased?: boolean;
|
|
8
|
+
overrides?: CapabilityOverride;
|
|
9
|
+
}
|
|
10
|
+
export declare function createEdgeAdapter(options: EdgeAdapterOptions): BrowserAdapter;
|
|
11
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/adapters/edge/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AACpE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAElD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAE/D,MAAM,WAAW,kBAAkB;IACjC,GAAG,EAAE,OAAO,CAAC;IACb,eAAe,EAAE,eAAe,GAAG,IAAI,CAAC;IACxC,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,SAAS,CAAC,EAAE,kBAAkB,CAAC;CAChC;AAED,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,kBAAkB,GAC1B,cAAc,CAUhB"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { createChromiumAdapter } from '../chromium/index.js';
|
|
2
|
+
export function createEdgeAdapter(options) {
|
|
3
|
+
return createChromiumAdapter({
|
|
4
|
+
target: 'edge',
|
|
5
|
+
api: options.api,
|
|
6
|
+
manifestVersion: options.manifestVersion,
|
|
7
|
+
...(options.callbackBased === undefined
|
|
8
|
+
? {}
|
|
9
|
+
: { callbackBased: options.callbackBased }),
|
|
10
|
+
...(options.overrides === undefined ? {} : { overrides: options.overrides }),
|
|
11
|
+
});
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/adapters/edge/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAU7D,MAAM,UAAU,iBAAiB,CAC/B,OAA2B;IAE3B,OAAO,qBAAqB,CAAC;QAC3B,MAAM,EAAE,MAAM;QACd,GAAG,EAAE,OAAO,CAAC,GAAG;QAChB,eAAe,EAAE,OAAO,CAAC,eAAe;QACxC,GAAG,CAAC,OAAO,CAAC,aAAa,KAAK,SAAS;YACrC,CAAC,CAAC,EAAE;YACJ,CAAC,CAAC,EAAE,aAAa,EAAE,OAAO,CAAC,aAAa,EAAE,CAAC;QAC7C,GAAG,CAAC,OAAO,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,CAAC;KAC7E,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { ManifestVersion } from '../../shared/capabilities.ts';
|
|
2
|
+
import type { BrowserAdapter } from '../types.ts';
|
|
3
|
+
import { type CapabilityOverride } from '../shared/adapter.ts';
|
|
4
|
+
export interface FirefoxAdapterOptions {
|
|
5
|
+
api: unknown;
|
|
6
|
+
manifestVersion: ManifestVersion | null;
|
|
7
|
+
overrides?: CapabilityOverride;
|
|
8
|
+
}
|
|
9
|
+
export declare function createFirefoxAdapter(options: FirefoxAdapterOptions): BrowserAdapter;
|
|
10
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/adapters/firefox/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AACpE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAEL,KAAK,kBAAkB,EACxB,MAAM,sBAAsB,CAAC;AAE9B,MAAM,WAAW,qBAAqB;IACpC,GAAG,EAAE,OAAO,CAAC;IACb,eAAe,EAAE,eAAe,GAAG,IAAI,CAAC;IACxC,SAAS,CAAC,EAAE,kBAAkB,CAAC;CAChC;AAED,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,qBAAqB,GAC7B,cAAc,CAShB"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { createAdapter, } from '../shared/adapter.js';
|
|
2
|
+
export function createFirefoxAdapter(options) {
|
|
3
|
+
return createAdapter({
|
|
4
|
+
target: 'firefox',
|
|
5
|
+
engine: 'gecko',
|
|
6
|
+
callbackBased: false,
|
|
7
|
+
api: options.api,
|
|
8
|
+
manifestVersion: options.manifestVersion,
|
|
9
|
+
...(options.overrides === undefined ? {} : { overrides: options.overrides }),
|
|
10
|
+
});
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/adapters/firefox/index.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,aAAa,GAEd,MAAM,sBAAsB,CAAC;AAQ9B,MAAM,UAAU,oBAAoB,CAClC,OAA8B;IAE9B,OAAO,aAAa,CAAC;QACnB,MAAM,EAAE,SAAS;QACjB,MAAM,EAAE,OAAO;QACf,aAAa,EAAE,KAAK;QACpB,GAAG,EAAE,OAAO,CAAC,GAAG;QAChB,eAAe,EAAE,OAAO,CAAC,eAAe;QACxC,GAAG,CAAC,OAAO,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,CAAC;KAC7E,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { ApiAvailability, BrowserEngine, BrowserTarget, CapabilityQuery, ManifestVersion } from '../../shared/capabilities.ts';
|
|
2
|
+
import type { BrowserAdapter } from '../types.ts';
|
|
3
|
+
export type CapabilityOverride = (query: CapabilityQuery, availability: ApiAvailability) => ApiAvailability;
|
|
4
|
+
export interface CreateAdapterOptions {
|
|
5
|
+
target: BrowserTarget;
|
|
6
|
+
engine: BrowserEngine;
|
|
7
|
+
callbackBased: boolean;
|
|
8
|
+
api: unknown;
|
|
9
|
+
manifestVersion: ManifestVersion | null;
|
|
10
|
+
overrides?: CapabilityOverride;
|
|
11
|
+
}
|
|
12
|
+
export declare function createAdapter(options: CreateAdapterOptions): BrowserAdapter;
|
|
13
|
+
//# sourceMappingURL=adapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../../src/adapters/shared/adapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,eAAe,EACf,aAAa,EACb,aAAa,EACb,eAAe,EACf,eAAe,EAChB,MAAM,8BAA8B,CAAC;AACtC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAGlD,MAAM,MAAM,kBAAkB,GAAG,CAC/B,KAAK,EAAE,eAAe,EACtB,YAAY,EAAE,eAAe,KAC1B,eAAe,CAAC;AAErB,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,aAAa,CAAC;IACtB,MAAM,EAAE,aAAa,CAAC;IACtB,aAAa,EAAE,OAAO,CAAC;IACvB,GAAG,EAAE,OAAO,CAAC;IACb,eAAe,EAAE,eAAe,GAAG,IAAI,CAAC;IACxC,SAAS,CAAC,EAAE,kBAAkB,CAAC;CAChC;AAED,wBAAgB,aAAa,CAC3B,OAAO,EAAE,oBAAoB,GAC5B,cAAc,CAuBhB"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { detectAvailability, readNamespace } from './namespace.js';
|
|
2
|
+
export function createAdapter(options) {
|
|
3
|
+
const availability = (query) => {
|
|
4
|
+
const detected = detectAvailability(options.api, query);
|
|
5
|
+
return options.overrides === undefined
|
|
6
|
+
? detected
|
|
7
|
+
: options.overrides(query, detected);
|
|
8
|
+
};
|
|
9
|
+
return {
|
|
10
|
+
target: options.target,
|
|
11
|
+
engine: options.engine,
|
|
12
|
+
manifestVersion: options.manifestVersion,
|
|
13
|
+
callbackBased: options.callbackBased,
|
|
14
|
+
api: options.api,
|
|
15
|
+
namespace(name) {
|
|
16
|
+
return readNamespace(options.api, name);
|
|
17
|
+
},
|
|
18
|
+
supports(query) {
|
|
19
|
+
return availability(query).available;
|
|
20
|
+
},
|
|
21
|
+
availability,
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adapter.js","sourceRoot":"","sources":["../../../src/adapters/shared/adapter.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAgBnE,MAAM,UAAU,aAAa,CAC3B,OAA6B;IAE7B,MAAM,YAAY,GAAG,CAAC,KAAsB,EAAmB,EAAE;QAC/D,MAAM,QAAQ,GAAG,kBAAkB,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAExD,OAAO,OAAO,CAAC,SAAS,KAAK,SAAS;YACpC,CAAC,CAAC,QAAQ;YACV,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IACzC,CAAC,CAAC;IAEF,OAAO;QACL,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,eAAe,EAAE,OAAO,CAAC,eAAe;QACxC,aAAa,EAAE,OAAO,CAAC,aAAa;QACpC,GAAG,EAAE,OAAO,CAAC,GAAG;QAChB,SAAS,CAAc,IAAY;YACjC,OAAO,aAAa,CAAI,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QAC7C,CAAC;QACD,QAAQ,CAAC,KAAsB;YAC7B,OAAO,YAAY,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC;QACvC,CAAC;QACD,YAAY;KACb,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { ApiAvailability, CapabilityQuery } from '../../shared/capabilities.ts';
|
|
2
|
+
export declare function readNamespace<T = unknown>(api: unknown, name: string): T | undefined;
|
|
3
|
+
export declare function detectAvailability(api: unknown, query: CapabilityQuery): ApiAvailability;
|
|
4
|
+
//# sourceMappingURL=namespace.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"namespace.d.ts","sourceRoot":"","sources":["../../../src/adapters/shared/namespace.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,eAAe,EACf,eAAe,EAChB,MAAM,8BAA8B,CAAC;AAGtC,wBAAgB,aAAa,CAAC,CAAC,GAAG,OAAO,EACvC,GAAG,EAAE,OAAO,EACZ,IAAI,EAAE,MAAM,GACX,CAAC,GAAG,SAAS,CAIf;AAED,wBAAgB,kBAAkB,CAChC,GAAG,EAAE,OAAO,EACZ,KAAK,EAAE,eAAe,GACrB,eAAe,CAgBjB"}
|