@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.
Files changed (267) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +434 -2
  3. package/dist/adapters/chrome/index.d.ts +9 -0
  4. package/dist/adapters/chrome/index.d.ts.map +1 -0
  5. package/dist/adapters/chrome/index.js +12 -0
  6. package/dist/adapters/chrome/index.js.map +1 -0
  7. package/dist/adapters/chromium/index.d.ts +12 -0
  8. package/dist/adapters/chromium/index.d.ts.map +1 -0
  9. package/dist/adapters/chromium/index.js +12 -0
  10. package/dist/adapters/chromium/index.js.map +1 -0
  11. package/dist/adapters/edge/index.d.ts +11 -0
  12. package/dist/adapters/edge/index.d.ts.map +1 -0
  13. package/dist/adapters/edge/index.js +13 -0
  14. package/dist/adapters/edge/index.js.map +1 -0
  15. package/dist/adapters/firefox/index.d.ts +10 -0
  16. package/dist/adapters/firefox/index.d.ts.map +1 -0
  17. package/dist/adapters/firefox/index.js +12 -0
  18. package/dist/adapters/firefox/index.js.map +1 -0
  19. package/dist/adapters/shared/adapter.d.ts +13 -0
  20. package/dist/adapters/shared/adapter.d.ts.map +1 -0
  21. package/dist/adapters/shared/adapter.js +24 -0
  22. package/dist/adapters/shared/adapter.js.map +1 -0
  23. package/dist/adapters/shared/namespace.d.ts +4 -0
  24. package/dist/adapters/shared/namespace.d.ts.map +1 -0
  25. package/dist/adapters/shared/namespace.js +20 -0
  26. package/dist/adapters/shared/namespace.js.map +1 -0
  27. package/dist/adapters/types.d.ts +10 -0
  28. package/dist/adapters/types.d.ts.map +1 -0
  29. package/dist/adapters/types.js +2 -0
  30. package/dist/adapters/types.js.map +1 -0
  31. package/dist/api/action/index.d.ts +6 -0
  32. package/dist/api/action/index.d.ts.map +1 -0
  33. package/dist/api/action/index.js +56 -0
  34. package/dist/api/action/index.js.map +1 -0
  35. package/dist/api/alarms/index.d.ts +5 -0
  36. package/dist/api/alarms/index.d.ts.map +1 -0
  37. package/dist/api/alarms/index.js +34 -0
  38. package/dist/api/alarms/index.js.map +1 -0
  39. package/dist/api/bookmarks/index.d.ts +5 -0
  40. package/dist/api/bookmarks/index.d.ts.map +1 -0
  41. package/dist/api/bookmarks/index.js +39 -0
  42. package/dist/api/bookmarks/index.js.map +1 -0
  43. package/dist/api/browser.d.ts +3 -0
  44. package/dist/api/browser.d.ts.map +1 -0
  45. package/dist/api/browser.js +2 -0
  46. package/dist/api/browser.js.map +1 -0
  47. package/dist/api/commands/index.d.ts +5 -0
  48. package/dist/api/commands/index.d.ts.map +1 -0
  49. package/dist/api/commands/index.js +12 -0
  50. package/dist/api/commands/index.js.map +1 -0
  51. package/dist/api/context-menus/index.d.ts +5 -0
  52. package/dist/api/context-menus/index.d.ts.map +1 -0
  53. package/dist/api/context-menus/index.js +21 -0
  54. package/dist/api/context-menus/index.js.map +1 -0
  55. package/dist/api/cookies/index.d.ts +5 -0
  56. package/dist/api/cookies/index.d.ts.map +1 -0
  57. package/dist/api/cookies/index.js +21 -0
  58. package/dist/api/cookies/index.js.map +1 -0
  59. package/dist/api/downloads/index.d.ts +5 -0
  60. package/dist/api/downloads/index.d.ts.map +1 -0
  61. package/dist/api/downloads/index.js +20 -0
  62. package/dist/api/downloads/index.js.map +1 -0
  63. package/dist/api/helpers.d.ts +17 -0
  64. package/dist/api/helpers.d.ts.map +1 -0
  65. package/dist/api/helpers.js +100 -0
  66. package/dist/api/helpers.js.map +1 -0
  67. package/dist/api/i18n/index.d.ts +5 -0
  68. package/dist/api/i18n/index.d.ts.map +1 -0
  69. package/dist/api/i18n/index.js +17 -0
  70. package/dist/api/i18n/index.js.map +1 -0
  71. package/dist/api/lazy-adapter.d.ts +5 -0
  72. package/dist/api/lazy-adapter.d.ts.map +1 -0
  73. package/dist/api/lazy-adapter.js +37 -0
  74. package/dist/api/lazy-adapter.js.map +1 -0
  75. package/dist/api/notifications/index.d.ts +5 -0
  76. package/dist/api/notifications/index.d.ts.map +1 -0
  77. package/dist/api/notifications/index.js +27 -0
  78. package/dist/api/notifications/index.js.map +1 -0
  79. package/dist/api/permissions/index.d.ts +5 -0
  80. package/dist/api/permissions/index.d.ts.map +1 -0
  81. package/dist/api/permissions/index.js +24 -0
  82. package/dist/api/permissions/index.js.map +1 -0
  83. package/dist/api/runtime/index.d.ts +5 -0
  84. package/dist/api/runtime/index.d.ts.map +1 -0
  85. package/dist/api/runtime/index.js +38 -0
  86. package/dist/api/runtime/index.js.map +1 -0
  87. package/dist/api/scripting/index.d.ts +5 -0
  88. package/dist/api/scripting/index.d.ts.map +1 -0
  89. package/dist/api/scripting/index.js +15 -0
  90. package/dist/api/scripting/index.js.map +1 -0
  91. package/dist/api/sessions/index.d.ts +5 -0
  92. package/dist/api/sessions/index.d.ts.map +1 -0
  93. package/dist/api/sessions/index.js +19 -0
  94. package/dist/api/sessions/index.js.map +1 -0
  95. package/dist/api/singletons.d.ts +40 -0
  96. package/dist/api/singletons.d.ts.map +1 -0
  97. package/dist/api/singletons.js +60 -0
  98. package/dist/api/singletons.js.map +1 -0
  99. package/dist/api/storage/index.d.ts +6 -0
  100. package/dist/api/storage/index.d.ts.map +1 -0
  101. package/dist/api/storage/index.js +57 -0
  102. package/dist/api/storage/index.js.map +1 -0
  103. package/dist/api/tabs/index.d.ts +5 -0
  104. package/dist/api/tabs/index.d.ts.map +1 -0
  105. package/dist/api/tabs/index.js +49 -0
  106. package/dist/api/tabs/index.js.map +1 -0
  107. package/dist/api/web-navigation/index.d.ts +5 -0
  108. package/dist/api/web-navigation/index.d.ts.map +1 -0
  109. package/dist/api/web-navigation/index.js +30 -0
  110. package/dist/api/web-navigation/index.js.map +1 -0
  111. package/dist/api/web-request/index.d.ts +5 -0
  112. package/dist/api/web-request/index.d.ts.map +1 -0
  113. package/dist/api/web-request/index.js +27 -0
  114. package/dist/api/web-request/index.js.map +1 -0
  115. package/dist/api/windows/index.d.ts +5 -0
  116. package/dist/api/windows/index.d.ts.map +1 -0
  117. package/dist/api/windows/index.js +27 -0
  118. package/dist/api/windows/index.js.map +1 -0
  119. package/dist/browser/detect.d.ts +19 -0
  120. package/dist/browser/detect.d.ts.map +1 -0
  121. package/dist/browser/detect.js +89 -0
  122. package/dist/browser/detect.js.map +1 -0
  123. package/dist/browser/info.d.ts +17 -0
  124. package/dist/browser/info.d.ts.map +1 -0
  125. package/dist/browser/info.js +77 -0
  126. package/dist/browser/info.js.map +1 -0
  127. package/dist/browser/resolve.d.ts +9 -0
  128. package/dist/browser/resolve.d.ts.map +1 -0
  129. package/dist/browser/resolve.js +57 -0
  130. package/dist/browser/resolve.js.map +1 -0
  131. package/dist/browser/support.d.ts +8 -0
  132. package/dist/browser/support.d.ts.map +1 -0
  133. package/dist/browser/support.js +18 -0
  134. package/dist/browser/support.js.map +1 -0
  135. package/dist/build/target.d.ts +5 -0
  136. package/dist/build/target.d.ts.map +1 -0
  137. package/dist/build/target.js +21 -0
  138. package/dist/build/target.js.map +1 -0
  139. package/dist/entries/chrome.d.ts +49 -0
  140. package/dist/entries/chrome.d.ts.map +1 -0
  141. package/dist/entries/chrome.js +94 -0
  142. package/dist/entries/chrome.js.map +1 -0
  143. package/dist/entries/chromium.d.ts +49 -0
  144. package/dist/entries/chromium.d.ts.map +1 -0
  145. package/dist/entries/chromium.js +95 -0
  146. package/dist/entries/chromium.js.map +1 -0
  147. package/dist/entries/edge.d.ts +49 -0
  148. package/dist/entries/edge.d.ts.map +1 -0
  149. package/dist/entries/edge.js +94 -0
  150. package/dist/entries/edge.js.map +1 -0
  151. package/dist/entries/firefox.d.ts +49 -0
  152. package/dist/entries/firefox.d.ts.map +1 -0
  153. package/dist/entries/firefox.js +93 -0
  154. package/dist/entries/firefox.js.map +1 -0
  155. package/dist/entries/info.d.ts +5 -0
  156. package/dist/entries/info.d.ts.map +1 -0
  157. package/dist/entries/info.js +21 -0
  158. package/dist/entries/info.js.map +1 -0
  159. package/dist/entries/shared-exports.d.ts +10 -0
  160. package/dist/entries/shared-exports.d.ts.map +1 -0
  161. package/dist/entries/shared-exports.js +5 -0
  162. package/dist/entries/shared-exports.js.map +1 -0
  163. package/dist/entries/support.d.ts +6 -0
  164. package/dist/entries/support.d.ts.map +1 -0
  165. package/dist/entries/support.js +16 -0
  166. package/dist/entries/support.js.map +1 -0
  167. package/dist/index.d.ts +17 -0
  168. package/dist/index.d.ts.map +1 -0
  169. package/dist/index.js +9 -0
  170. package/dist/index.js.map +1 -0
  171. package/dist/shared/capabilities.d.ts +25 -0
  172. package/dist/shared/capabilities.d.ts.map +1 -0
  173. package/dist/shared/capabilities.js +41 -0
  174. package/dist/shared/capabilities.js.map +1 -0
  175. package/dist/shared/errors.d.ts +18 -0
  176. package/dist/shared/errors.d.ts.map +1 -0
  177. package/dist/shared/errors.js +32 -0
  178. package/dist/shared/errors.js.map +1 -0
  179. package/dist/shared/events.d.ts +11 -0
  180. package/dist/shared/events.d.ts.map +1 -0
  181. package/dist/shared/events.js +19 -0
  182. package/dist/shared/events.js.map +1 -0
  183. package/dist/shared/objects.d.ts +4 -0
  184. package/dist/shared/objects.d.ts.map +1 -0
  185. package/dist/shared/objects.js +14 -0
  186. package/dist/shared/objects.js.map +1 -0
  187. package/dist/shared/promises.d.ts +11 -0
  188. package/dist/shared/promises.d.ts.map +1 -0
  189. package/dist/shared/promises.js +70 -0
  190. package/dist/shared/promises.js.map +1 -0
  191. package/dist/types/action.d.ts +35 -0
  192. package/dist/types/action.d.ts.map +1 -0
  193. package/dist/types/action.js +2 -0
  194. package/dist/types/action.js.map +1 -0
  195. package/dist/types/alarms.d.ts +21 -0
  196. package/dist/types/alarms.d.ts.map +1 -0
  197. package/dist/types/alarms.js +2 -0
  198. package/dist/types/alarms.js.map +1 -0
  199. package/dist/types/bookmarks.d.ts +57 -0
  200. package/dist/types/bookmarks.d.ts.map +1 -0
  201. package/dist/types/bookmarks.js +2 -0
  202. package/dist/types/bookmarks.js.map +1 -0
  203. package/dist/types/commands.d.ts +11 -0
  204. package/dist/types/commands.d.ts.map +1 -0
  205. package/dist/types/commands.js +2 -0
  206. package/dist/types/commands.js.map +1 -0
  207. package/dist/types/context-menus.d.ts +48 -0
  208. package/dist/types/context-menus.d.ts.map +1 -0
  209. package/dist/types/context-menus.js +2 -0
  210. package/dist/types/context-menus.js.map +1 -0
  211. package/dist/types/cookies.d.ts +54 -0
  212. package/dist/types/cookies.d.ts.map +1 -0
  213. package/dist/types/cookies.js +2 -0
  214. package/dist/types/cookies.js.map +1 -0
  215. package/dist/types/downloads.d.ts +43 -0
  216. package/dist/types/downloads.d.ts.map +1 -0
  217. package/dist/types/downloads.js +2 -0
  218. package/dist/types/downloads.js.map +1 -0
  219. package/dist/types/i18n.d.ts +14 -0
  220. package/dist/types/i18n.d.ts.map +1 -0
  221. package/dist/types/i18n.js +2 -0
  222. package/dist/types/i18n.js.map +1 -0
  223. package/dist/types/index.d.ts +19 -0
  224. package/dist/types/index.d.ts.map +1 -0
  225. package/dist/types/index.js +2 -0
  226. package/dist/types/index.js.map +1 -0
  227. package/dist/types/notifications.d.ts +35 -0
  228. package/dist/types/notifications.d.ts.map +1 -0
  229. package/dist/types/notifications.js +2 -0
  230. package/dist/types/notifications.js.map +1 -0
  231. package/dist/types/permissions.d.ts +14 -0
  232. package/dist/types/permissions.d.ts.map +1 -0
  233. package/dist/types/permissions.js +2 -0
  234. package/dist/types/permissions.js.map +1 -0
  235. package/dist/types/runtime.d.ts +58 -0
  236. package/dist/types/runtime.d.ts.map +1 -0
  237. package/dist/types/runtime.js +2 -0
  238. package/dist/types/runtime.js.map +1 -0
  239. package/dist/types/scripting.d.ts +30 -0
  240. package/dist/types/scripting.d.ts.map +1 -0
  241. package/dist/types/scripting.js +2 -0
  242. package/dist/types/scripting.js.map +1 -0
  243. package/dist/types/sessions.d.ts +28 -0
  244. package/dist/types/sessions.d.ts.map +1 -0
  245. package/dist/types/sessions.js +2 -0
  246. package/dist/types/sessions.js.map +1 -0
  247. package/dist/types/storage.d.ts +28 -0
  248. package/dist/types/storage.d.ts.map +1 -0
  249. package/dist/types/storage.js +2 -0
  250. package/dist/types/storage.js.map +1 -0
  251. package/dist/types/tabs.d.ts +96 -0
  252. package/dist/types/tabs.d.ts.map +1 -0
  253. package/dist/types/tabs.js +2 -0
  254. package/dist/types/tabs.js.map +1 -0
  255. package/dist/types/web-navigation.d.ts +28 -0
  256. package/dist/types/web-navigation.d.ts.map +1 -0
  257. package/dist/types/web-navigation.js +2 -0
  258. package/dist/types/web-navigation.js.map +1 -0
  259. package/dist/types/web-request.d.ts +20 -0
  260. package/dist/types/web-request.d.ts.map +1 -0
  261. package/dist/types/web-request.js +2 -0
  262. package/dist/types/web-request.js.map +1 -0
  263. package/dist/types/windows.d.ts +52 -0
  264. package/dist/types/windows.d.ts.map +1 -0
  265. package/dist/types/windows.js +2 -0
  266. package/dist/types/windows.js.map +1 -0
  267. 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
- # Temporary Holding Version
1
+ [![Addonova Browser Social Banner](https://raw.githubusercontent.com/addonova/.github/refs/heads/main/profile/image/addonova_browser_banner.png)](https://github.com/addonova)
2
2
 
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.
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"}