@addonova/browser 0.0.0-stage → 0.2.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 (327) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +693 -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/area.d.ts +4 -0
  100. package/dist/api/storage/area.d.ts.map +1 -0
  101. package/dist/api/storage/area.js +29 -0
  102. package/dist/api/storage/area.js.map +1 -0
  103. package/dist/api/storage/index.d.ts +7 -0
  104. package/dist/api/storage/index.d.ts.map +1 -0
  105. package/dist/api/storage/index.js +37 -0
  106. package/dist/api/storage/index.js.map +1 -0
  107. package/dist/api/storage/item.d.ts +4 -0
  108. package/dist/api/storage/item.d.ts.map +1 -0
  109. package/dist/api/storage/item.js +109 -0
  110. package/dist/api/storage/item.js.map +1 -0
  111. package/dist/api/tabs/index.d.ts +5 -0
  112. package/dist/api/tabs/index.d.ts.map +1 -0
  113. package/dist/api/tabs/index.js +49 -0
  114. package/dist/api/tabs/index.js.map +1 -0
  115. package/dist/api/web-navigation/index.d.ts +5 -0
  116. package/dist/api/web-navigation/index.d.ts.map +1 -0
  117. package/dist/api/web-navigation/index.js +30 -0
  118. package/dist/api/web-navigation/index.js.map +1 -0
  119. package/dist/api/web-request/index.d.ts +5 -0
  120. package/dist/api/web-request/index.d.ts.map +1 -0
  121. package/dist/api/web-request/index.js +27 -0
  122. package/dist/api/web-request/index.js.map +1 -0
  123. package/dist/api/windows/index.d.ts +5 -0
  124. package/dist/api/windows/index.d.ts.map +1 -0
  125. package/dist/api/windows/index.js +27 -0
  126. package/dist/api/windows/index.js.map +1 -0
  127. package/dist/browser/detect.d.ts +19 -0
  128. package/dist/browser/detect.d.ts.map +1 -0
  129. package/dist/browser/detect.js +89 -0
  130. package/dist/browser/detect.js.map +1 -0
  131. package/dist/browser/info.d.ts +17 -0
  132. package/dist/browser/info.d.ts.map +1 -0
  133. package/dist/browser/info.js +77 -0
  134. package/dist/browser/info.js.map +1 -0
  135. package/dist/browser/resolve.d.ts +9 -0
  136. package/dist/browser/resolve.d.ts.map +1 -0
  137. package/dist/browser/resolve.js +57 -0
  138. package/dist/browser/resolve.js.map +1 -0
  139. package/dist/browser/support.d.ts +8 -0
  140. package/dist/browser/support.d.ts.map +1 -0
  141. package/dist/browser/support.js +18 -0
  142. package/dist/browser/support.js.map +1 -0
  143. package/dist/build/target.d.ts +5 -0
  144. package/dist/build/target.d.ts.map +1 -0
  145. package/dist/build/target.js +21 -0
  146. package/dist/build/target.js.map +1 -0
  147. package/dist/content/context.d.ts +24 -0
  148. package/dist/content/context.d.ts.map +1 -0
  149. package/dist/content/context.js +157 -0
  150. package/dist/content/context.js.map +1 -0
  151. package/dist/content/index.d.ts +7 -0
  152. package/dist/content/index.d.ts.map +1 -0
  153. package/dist/content/index.js +4 -0
  154. package/dist/content/index.js.map +1 -0
  155. package/dist/content/inject-root.d.ts +2 -0
  156. package/dist/content/inject-root.d.ts.map +1 -0
  157. package/dist/content/inject-root.js +4 -0
  158. package/dist/content/inject-root.js.map +1 -0
  159. package/dist/content/inject-script.d.ts +16 -0
  160. package/dist/content/inject-script.d.ts.map +1 -0
  161. package/dist/content/inject-script.js +39 -0
  162. package/dist/content/inject-script.js.map +1 -0
  163. package/dist/content/ui.d.ts +50 -0
  164. package/dist/content/ui.d.ts.map +1 -0
  165. package/dist/content/ui.js +331 -0
  166. package/dist/content/ui.js.map +1 -0
  167. package/dist/entries/chrome.d.ts +52 -0
  168. package/dist/entries/chrome.d.ts.map +1 -0
  169. package/dist/entries/chrome.js +101 -0
  170. package/dist/entries/chrome.js.map +1 -0
  171. package/dist/entries/chromium.d.ts +52 -0
  172. package/dist/entries/chromium.d.ts.map +1 -0
  173. package/dist/entries/chromium.js +102 -0
  174. package/dist/entries/chromium.js.map +1 -0
  175. package/dist/entries/edge.d.ts +52 -0
  176. package/dist/entries/edge.d.ts.map +1 -0
  177. package/dist/entries/edge.js +101 -0
  178. package/dist/entries/edge.js.map +1 -0
  179. package/dist/entries/firefox.d.ts +52 -0
  180. package/dist/entries/firefox.d.ts.map +1 -0
  181. package/dist/entries/firefox.js +100 -0
  182. package/dist/entries/firefox.js.map +1 -0
  183. package/dist/entries/info.d.ts +5 -0
  184. package/dist/entries/info.d.ts.map +1 -0
  185. package/dist/entries/info.js +21 -0
  186. package/dist/entries/info.js.map +1 -0
  187. package/dist/entries/shared-exports.d.ts +20 -0
  188. package/dist/entries/shared-exports.d.ts.map +1 -0
  189. package/dist/entries/shared-exports.js +10 -0
  190. package/dist/entries/shared-exports.js.map +1 -0
  191. package/dist/entries/support.d.ts +6 -0
  192. package/dist/entries/support.d.ts.map +1 -0
  193. package/dist/entries/support.js +16 -0
  194. package/dist/entries/support.js.map +1 -0
  195. package/dist/entries/utilities.d.ts +6 -0
  196. package/dist/entries/utilities.d.ts.map +1 -0
  197. package/dist/entries/utilities.js +7 -0
  198. package/dist/entries/utilities.js.map +1 -0
  199. package/dist/i18n/index.d.ts +16 -0
  200. package/dist/i18n/index.d.ts.map +1 -0
  201. package/dist/i18n/index.js +52 -0
  202. package/dist/i18n/index.js.map +1 -0
  203. package/dist/index.d.ts +30 -0
  204. package/dist/index.d.ts.map +1 -0
  205. package/dist/index.js +17 -0
  206. package/dist/index.js.map +1 -0
  207. package/dist/messaging/index.d.ts +22 -0
  208. package/dist/messaging/index.d.ts.map +1 -0
  209. package/dist/messaging/index.js +100 -0
  210. package/dist/messaging/index.js.map +1 -0
  211. package/dist/messaging/proxy.d.ts +17 -0
  212. package/dist/messaging/proxy.d.ts.map +1 -0
  213. package/dist/messaging/proxy.js +61 -0
  214. package/dist/messaging/proxy.js.map +1 -0
  215. package/dist/messaging/root.d.ts +4 -0
  216. package/dist/messaging/root.d.ts.map +1 -0
  217. package/dist/messaging/root.js +9 -0
  218. package/dist/messaging/root.js.map +1 -0
  219. package/dist/shared/capabilities.d.ts +25 -0
  220. package/dist/shared/capabilities.d.ts.map +1 -0
  221. package/dist/shared/capabilities.js +41 -0
  222. package/dist/shared/capabilities.js.map +1 -0
  223. package/dist/shared/errors.d.ts +18 -0
  224. package/dist/shared/errors.d.ts.map +1 -0
  225. package/dist/shared/errors.js +32 -0
  226. package/dist/shared/errors.js.map +1 -0
  227. package/dist/shared/events.d.ts +11 -0
  228. package/dist/shared/events.d.ts.map +1 -0
  229. package/dist/shared/events.js +19 -0
  230. package/dist/shared/events.js.map +1 -0
  231. package/dist/shared/objects.d.ts +4 -0
  232. package/dist/shared/objects.d.ts.map +1 -0
  233. package/dist/shared/objects.js +14 -0
  234. package/dist/shared/objects.js.map +1 -0
  235. package/dist/shared/promises.d.ts +11 -0
  236. package/dist/shared/promises.d.ts.map +1 -0
  237. package/dist/shared/promises.js +70 -0
  238. package/dist/shared/promises.js.map +1 -0
  239. package/dist/testing/fake-browser.d.ts +184 -0
  240. package/dist/testing/fake-browser.d.ts.map +1 -0
  241. package/dist/testing/fake-browser.js +994 -0
  242. package/dist/testing/fake-browser.js.map +1 -0
  243. package/dist/testing/index.d.ts +3 -0
  244. package/dist/testing/index.d.ts.map +1 -0
  245. package/dist/testing/index.js +2 -0
  246. package/dist/testing/index.js.map +1 -0
  247. package/dist/testing/setup.d.ts +2 -0
  248. package/dist/testing/setup.d.ts.map +1 -0
  249. package/dist/testing/setup.js +6 -0
  250. package/dist/testing/setup.js.map +1 -0
  251. package/dist/types/action.d.ts +35 -0
  252. package/dist/types/action.d.ts.map +1 -0
  253. package/dist/types/action.js +2 -0
  254. package/dist/types/action.js.map +1 -0
  255. package/dist/types/alarms.d.ts +21 -0
  256. package/dist/types/alarms.d.ts.map +1 -0
  257. package/dist/types/alarms.js +2 -0
  258. package/dist/types/alarms.js.map +1 -0
  259. package/dist/types/bookmarks.d.ts +57 -0
  260. package/dist/types/bookmarks.d.ts.map +1 -0
  261. package/dist/types/bookmarks.js +2 -0
  262. package/dist/types/bookmarks.js.map +1 -0
  263. package/dist/types/commands.d.ts +11 -0
  264. package/dist/types/commands.d.ts.map +1 -0
  265. package/dist/types/commands.js +2 -0
  266. package/dist/types/commands.js.map +1 -0
  267. package/dist/types/context-menus.d.ts +48 -0
  268. package/dist/types/context-menus.d.ts.map +1 -0
  269. package/dist/types/context-menus.js +2 -0
  270. package/dist/types/context-menus.js.map +1 -0
  271. package/dist/types/cookies.d.ts +54 -0
  272. package/dist/types/cookies.d.ts.map +1 -0
  273. package/dist/types/cookies.js +2 -0
  274. package/dist/types/cookies.js.map +1 -0
  275. package/dist/types/downloads.d.ts +43 -0
  276. package/dist/types/downloads.d.ts.map +1 -0
  277. package/dist/types/downloads.js +2 -0
  278. package/dist/types/downloads.js.map +1 -0
  279. package/dist/types/i18n.d.ts +14 -0
  280. package/dist/types/i18n.d.ts.map +1 -0
  281. package/dist/types/i18n.js +2 -0
  282. package/dist/types/i18n.js.map +1 -0
  283. package/dist/types/index.d.ts +19 -0
  284. package/dist/types/index.d.ts.map +1 -0
  285. package/dist/types/index.js +2 -0
  286. package/dist/types/index.js.map +1 -0
  287. package/dist/types/notifications.d.ts +35 -0
  288. package/dist/types/notifications.d.ts.map +1 -0
  289. package/dist/types/notifications.js +2 -0
  290. package/dist/types/notifications.js.map +1 -0
  291. package/dist/types/permissions.d.ts +14 -0
  292. package/dist/types/permissions.d.ts.map +1 -0
  293. package/dist/types/permissions.js +2 -0
  294. package/dist/types/permissions.js.map +1 -0
  295. package/dist/types/runtime.d.ts +58 -0
  296. package/dist/types/runtime.d.ts.map +1 -0
  297. package/dist/types/runtime.js +2 -0
  298. package/dist/types/runtime.js.map +1 -0
  299. package/dist/types/scripting.d.ts +30 -0
  300. package/dist/types/scripting.d.ts.map +1 -0
  301. package/dist/types/scripting.js +2 -0
  302. package/dist/types/scripting.js.map +1 -0
  303. package/dist/types/sessions.d.ts +28 -0
  304. package/dist/types/sessions.d.ts.map +1 -0
  305. package/dist/types/sessions.js +2 -0
  306. package/dist/types/sessions.js.map +1 -0
  307. package/dist/types/storage.d.ts +51 -0
  308. package/dist/types/storage.d.ts.map +1 -0
  309. package/dist/types/storage.js +2 -0
  310. package/dist/types/storage.js.map +1 -0
  311. package/dist/types/tabs.d.ts +96 -0
  312. package/dist/types/tabs.d.ts.map +1 -0
  313. package/dist/types/tabs.js +2 -0
  314. package/dist/types/tabs.js.map +1 -0
  315. package/dist/types/web-navigation.d.ts +28 -0
  316. package/dist/types/web-navigation.d.ts.map +1 -0
  317. package/dist/types/web-navigation.js +2 -0
  318. package/dist/types/web-navigation.js.map +1 -0
  319. package/dist/types/web-request.d.ts +20 -0
  320. package/dist/types/web-request.d.ts.map +1 -0
  321. package/dist/types/web-request.js +2 -0
  322. package/dist/types/web-request.js.map +1 -0
  323. package/dist/types/windows.d.ts +52 -0
  324. package/dist/types/windows.d.ts.map +1 -0
  325. package/dist/types/windows.js +2 -0
  326. package/dist/types/windows.js.map +1 -0
  327. package/package.json +97 -4
@@ -0,0 +1,52 @@
1
+ import { BrowserApiError } from '../shared/errors.js';
2
+ export function createI18nHelper(api, options = {}) {
3
+ const fallbackToKey = options.fallbackToKey ?? true;
4
+ const resolvedApi = api ?? getGlobalI18n();
5
+ const raw = (messageName, substitutions) => substitutions === undefined
6
+ ? resolvedApi.getMessage(messageName)
7
+ : resolvedApi.getMessage(messageName, substitutions);
8
+ return {
9
+ get locale() {
10
+ return resolvedApi.getUILanguage();
11
+ },
12
+ t(messageName, substitutions) {
13
+ const message = raw(messageName, substitutions);
14
+ return message === '' && fallbackToKey ? messageName : message;
15
+ },
16
+ raw,
17
+ };
18
+ }
19
+ export function formatMessage(message, substitutions) {
20
+ if (substitutions === undefined) {
21
+ return message;
22
+ }
23
+ const values = typeof substitutions === 'string' ? [substitutions] : substitutions;
24
+ let result = message.replace(/\$\$/g, '\u0000');
25
+ values.forEach((value, index) => {
26
+ result = result.replaceAll(`$${index + 1}`, value);
27
+ });
28
+ return result.replace(/\u0000/g, '$');
29
+ }
30
+ export const i18nHelper = {
31
+ get locale() {
32
+ return createI18nHelper().locale;
33
+ },
34
+ t(messageName, substitutions) {
35
+ return createI18nHelper().t(messageName, substitutions);
36
+ },
37
+ raw(messageName, substitutions) {
38
+ return createI18nHelper().raw(messageName, substitutions);
39
+ },
40
+ };
41
+ export function t(messageName, substitutions) {
42
+ return createI18nHelper().t(messageName, substitutions);
43
+ }
44
+ function getGlobalI18n() {
45
+ const global = globalThis;
46
+ const api = global.browser?.i18n ?? global.chrome?.i18n;
47
+ if (api === undefined) {
48
+ throw new BrowserApiError('BROWSER_UNSUPPORTED_ENVIRONMENT', 'The i18n API is not available in this environment.', { api: 'i18n.getMessage' });
49
+ }
50
+ return api;
51
+ }
52
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/i18n/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAiBtD,MAAM,UAAU,gBAAgB,CAC9B,GAAoB,EACpB,OAAO,GAAsB,EAAE;IAE/B,MAAM,aAAa,GAAG,OAAO,CAAC,aAAa,IAAI,IAAI,CAAC;IACpD,MAAM,WAAW,GAAG,GAAG,IAAI,aAAa,EAAE,CAAC;IAE3C,MAAM,GAAG,GAAG,CACV,WAAmB,EACnB,aAAiC,EACzB,EAAE,CACV,aAAa,KAAK,SAAS;QACzB,CAAC,CAAC,WAAW,CAAC,UAAU,CAAC,WAAW,CAAC;QACrC,CAAC,CAAC,WAAW,CAAC,UAAU,CAAC,WAAW,EAAE,aAAa,CAAC,CAAC;IAEzD,OAAO;QACL,IAAI,MAAM;YACR,OAAO,WAAW,CAAC,aAAa,EAAE,CAAC;QACrC,CAAC;QACD,CAAC,CAAC,WAAmB,EAAE,aAAiC;YACtD,MAAM,OAAO,GAAG,GAAG,CAAC,WAAW,EAAE,aAAa,CAAC,CAAC;YAEhD,OAAO,OAAO,KAAK,EAAE,IAAI,aAAa,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC;QACjE,CAAC;QACD,GAAG;KACJ,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,aAAa,CAC3B,OAAe,EACf,aAAiC;IAEjC,IAAI,aAAa,KAAK,SAAS,EAAE,CAAC;QAChC,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,MAAM,MAAM,GACV,OAAO,aAAa,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC;IACtE,IAAI,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IAEhD,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;QAC9B,MAAM,GAAG,MAAM,CAAC,UAAU,CAAC,IAAI,KAAK,GAAG,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;IACrD,CAAC,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;AACxC,CAAC;AAED,MAAM,CAAC,MAAM,UAAU,GAAe;IACpC,IAAI,MAAM;QACR,OAAO,gBAAgB,EAAE,CAAC,MAAM,CAAC;IACnC,CAAC;IACD,CAAC,CAAC,WAAW,EAAE,aAAa;QAC1B,OAAO,gBAAgB,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,aAAa,CAAC,CAAC;IAC1D,CAAC;IACD,GAAG,CAAC,WAAW,EAAE,aAAa;QAC5B,OAAO,gBAAgB,EAAE,CAAC,GAAG,CAAC,WAAW,EAAE,aAAa,CAAC,CAAC;IAC5D,CAAC;CACF,CAAC;AAEF,MAAM,UAAU,CAAC,CACf,WAAmB,EACnB,aAAiC;IAEjC,OAAO,gBAAgB,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,aAAa,CAAC,CAAC;AAC1D,CAAC;AAED,SAAS,aAAa;IACpB,MAAM,MAAM,GAAG,UAGd,CAAC;IACF,MAAM,GAAG,GAAG,MAAM,CAAC,OAAO,EAAE,IAAI,IAAI,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC;IAExD,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;QACtB,MAAM,IAAI,eAAe,CACvB,iCAAiC,EACjC,oDAAoD,EACpD,EAAE,GAAG,EAAE,iBAAiB,EAAE,CAC3B,CAAC;IACJ,CAAC;IAED,OAAO,GAAG,CAAC;AACb,CAAC"}
@@ -0,0 +1,30 @@
1
+ export { BrowserApiError, isBrowserApiError, isPermissionError, normalizeBrowserApiError, } from './shared/errors.ts';
2
+ export type { BrowserApiErrorCode, BrowserApiErrorOptions, NormalizeBrowserApiErrorOptions, } from './shared/errors.ts';
3
+ export { callbackToPromise, isPromiseLike, promisifyMethod, readLastError, resolveMaybePromise, } from './shared/promises.ts';
4
+ export type { Callback, CallbackOptions } from './shared/promises.ts';
5
+ export { isBrowserEvent, passthroughEvent, requireEvent, } from './shared/events.ts';
6
+ export type { BrowserEvent, BrowserEventListener } from './shared/events.ts';
7
+ export { BROWSER_TARGETS, availableCapability, isBrowserTarget, isManifestVersion, unavailableCapability, } from './shared/capabilities.ts';
8
+ export type { ApiAvailability, ApiAvailabilityReason, BrowserEngine, BrowserTarget, CapabilityProvider, CapabilityQuery, ManifestVersion, } from './shared/capabilities.ts';
9
+ export type { BrowserAdapter } from './adapters/types.ts';
10
+ export { browserInfo, getBrowserInfo } from './browser/info.ts';
11
+ export type { BrowserInfo, BrowserInfoOptions } from './browser/info.ts';
12
+ export { getAvailability, isBrowserSupported, supports, } from './browser/support.ts';
13
+ export { browser } from './api/browser.ts';
14
+ export type { Browser } from './api/browser.ts';
15
+ export { action, alarms, bookmarks, commands, contextMenus, cookies, downloads, i18n, notifications, permissions, runtime, scripting, sessions, storage, tabs, webNavigation, webRequest, windows, } from './api/singletons.ts';
16
+ export type * from './types/index.ts';
17
+ export { createStorageArea, createStorageItem, } from './api/storage/index.ts';
18
+ export type { StorageItem, StorageItemMeta, StorageItemOptions, StorageItemValue, } from './api/storage/index.ts';
19
+ export { createExtensionMessaging } from './messaging/index.ts';
20
+ export type { ExtensionMessenger, MessageContext, MessageData, MessageHandler, MessageKeys, MessageProtocol, MessageReturn, MessageSendArgs, MessagingRuntime, } from './messaging/index.ts';
21
+ export { defineExtensionMessaging } from './messaging/root.ts';
22
+ export { createProxyServices } from './messaging/proxy.ts';
23
+ export type { AsyncService, DefineProxyService, MessengerFactory, ProxyServiceFactory, ProxyServiceRegistration, } from './messaging/proxy.ts';
24
+ export { defineProxyService } from './messaging/root.ts';
25
+ export { createContentScriptContext, createIframeUi, createIntegratedUi, createInjectScript, createShadowRootUi, } from './content/index.ts';
26
+ export { injectScript } from './content/inject-root.ts';
27
+ export type { AutoMountOptions, BaseUiOptions, ContentScriptContext, ContentScriptContextOptions, ContentScriptRuntime, ContentScriptTimer, ContentScriptUi, IframeUiOptions, InjectScript, InjectScriptApis, InjectScriptOptions, IntegratedUiOptions, ShadowRootContentScriptUi, ShadowRootUiOptions, UiAlignment, UiAnchor, UiAppendMode, UiPosition, } from './content/index.ts';
28
+ export { createI18nHelper, formatMessage, i18nHelper, t, } from './i18n/index.ts';
29
+ export type { I18nHelper, I18nHelperOptions, I18nMessageApi, I18nSubstitutions, } from './i18n/index.ts';
30
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js ADDED
@@ -0,0 +1,17 @@
1
+ export { BrowserApiError, isBrowserApiError, isPermissionError, normalizeBrowserApiError, } from './shared/errors.js';
2
+ export { callbackToPromise, isPromiseLike, promisifyMethod, readLastError, resolveMaybePromise, } from './shared/promises.js';
3
+ export { isBrowserEvent, passthroughEvent, requireEvent, } from './shared/events.js';
4
+ export { BROWSER_TARGETS, availableCapability, isBrowserTarget, isManifestVersion, unavailableCapability, } from './shared/capabilities.js';
5
+ export { browserInfo, getBrowserInfo } from './browser/info.js';
6
+ export { getAvailability, isBrowserSupported, supports, } from './browser/support.js';
7
+ export { browser } from './api/browser.js';
8
+ export { action, alarms, bookmarks, commands, contextMenus, cookies, downloads, i18n, notifications, permissions, runtime, scripting, sessions, storage, tabs, webNavigation, webRequest, windows, } from './api/singletons.js';
9
+ export { createStorageArea, createStorageItem, } from './api/storage/index.js';
10
+ export { createExtensionMessaging } from './messaging/index.js';
11
+ export { defineExtensionMessaging } from './messaging/root.js';
12
+ export { createProxyServices } from './messaging/proxy.js';
13
+ export { defineProxyService } from './messaging/root.js';
14
+ export { createContentScriptContext, createIframeUi, createIntegratedUi, createInjectScript, createShadowRootUi, } from './content/index.js';
15
+ export { injectScript } from './content/inject-root.js';
16
+ export { createI18nHelper, formatMessage, i18nHelper, t, } from './i18n/index.js';
17
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,eAAe,EACf,iBAAiB,EACjB,iBAAiB,EACjB,wBAAwB,GACzB,MAAM,oBAAoB,CAAC;AAO5B,OAAO,EACL,iBAAiB,EACjB,aAAa,EACb,eAAe,EACf,aAAa,EACb,mBAAmB,GACpB,MAAM,sBAAsB,CAAC;AAG9B,OAAO,EACL,cAAc,EACd,gBAAgB,EAChB,YAAY,GACb,MAAM,oBAAoB,CAAC;AAG5B,OAAO,EACL,eAAe,EACf,mBAAmB,EACnB,eAAe,EACf,iBAAiB,EACjB,qBAAqB,GACtB,MAAM,0BAA0B,CAAC;AAalC,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAEhE,OAAO,EACL,eAAe,EACf,kBAAkB,EAClB,QAAQ,GACT,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAE3C,OAAO,EACL,MAAM,EACN,MAAM,EACN,SAAS,EACT,QAAQ,EACR,YAAY,EACZ,OAAO,EACP,SAAS,EACT,IAAI,EACJ,aAAa,EACb,WAAW,EACX,OAAO,EACP,SAAS,EACT,QAAQ,EACR,OAAO,EACP,IAAI,EACJ,aAAa,EACb,UAAU,EACV,OAAO,GACR,MAAM,qBAAqB,CAAC;AAI7B,OAAO,EACL,iBAAiB,EACjB,iBAAiB,GAClB,MAAM,wBAAwB,CAAC;AAQhC,OAAO,EAAE,wBAAwB,EAAE,MAAM,sBAAsB,CAAC;AAYhE,OAAO,EAAE,wBAAwB,EAAE,MAAM,qBAAqB,CAAC;AAC/D,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAQ3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAEzD,OAAO,EACL,0BAA0B,EAC1B,cAAc,EACd,kBAAkB,EAClB,kBAAkB,EAClB,kBAAkB,GACnB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAsBxD,OAAO,EACL,gBAAgB,EAChB,aAAa,EACb,UAAU,EACV,CAAC,GACF,MAAM,iBAAiB,CAAC"}
@@ -0,0 +1,22 @@
1
+ import type { BrowserEvent } from '../shared/events.ts';
2
+ import type { MessageSender, SendResponse } from '../types/runtime.ts';
3
+ export interface MessagingRuntime {
4
+ sendMessage<T = unknown>(message: unknown): Promise<T>;
5
+ readonly onMessage: BrowserEvent<(message: unknown, sender: MessageSender, sendResponse: SendResponse) => boolean | void>;
6
+ }
7
+ export type MessageProtocol = object;
8
+ export type MessageKeys<P extends object> = Extract<keyof P, string>;
9
+ export type MessageData<P extends object, K extends MessageKeys<P>> = P[K] extends (...args: infer Args) => unknown ? Args extends readonly [] ? undefined : Args[0] : never;
10
+ export type MessageReturn<P extends object, K extends MessageKeys<P>> = P[K] extends (...args: never[]) => infer Result ? Awaited<Result> : never;
11
+ export type MessageSendArgs<P extends object, K extends MessageKeys<P>> = P[K] extends (...args: infer Args) => unknown ? Args extends readonly [] ? [] : [data: Args[0]] : never;
12
+ export interface MessageContext<Data = unknown, Sender = MessageSender> {
13
+ readonly data: Data;
14
+ readonly sender: Sender;
15
+ }
16
+ export type MessageHandler<P extends object, K extends MessageKeys<P>, Sender = MessageSender> = (message: MessageContext<MessageData<P, K>, Sender>) => P[K] extends (...args: never[]) => infer Result ? Result | Promise<Result> : never;
17
+ export interface ExtensionMessenger<P extends object> {
18
+ sendMessage<K extends MessageKeys<P>>(type: K, ...args: MessageSendArgs<P, K>): Promise<MessageReturn<P, K>>;
19
+ onMessage<K extends MessageKeys<P>>(type: K, handler: MessageHandler<P, K>): () => void;
20
+ }
21
+ export declare function createExtensionMessaging<P extends object = Record<string, (data?: unknown) => unknown>>(runtime: MessagingRuntime): ExtensionMessenger<P>;
22
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/messaging/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAIvE,MAAM,WAAW,gBAAgB;IAC/B,WAAW,CAAC,CAAC,GAAG,OAAO,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IACvD,QAAQ,CAAC,SAAS,EAAE,YAAY,CAC9B,CACE,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,aAAa,EACrB,YAAY,EAAE,YAAY,KACvB,OAAO,GAAG,IAAI,CACpB,CAAC;CACH;AAKD,MAAM,MAAM,eAAe,GAAG,MAAM,CAAC;AAErC,MAAM,MAAM,WAAW,CAAC,CAAC,SAAS,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC;AAErE,MAAM,MAAM,WAAW,CAAC,CAAC,SAAS,MAAM,EAAE,CAAC,SAAS,WAAW,CAAC,CAAC,CAAC,IAChE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,MAAM,IAAI,KAAK,OAAO,GACzC,IAAI,SAAS,SAAS,EAAE,GACtB,SAAS,GACT,IAAI,CAAC,CAAC,CAAC,GACT,KAAK,CAAC;AAEZ,MAAM,MAAM,aAAa,CAAC,CAAC,SAAS,MAAM,EAAE,CAAC,SAAS,WAAW,CAAC,CAAC,CAAC,IAClE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,KAAK,EAAE,KAAK,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,GAAG,KAAK,CAAC;AAE5E,MAAM,MAAM,eAAe,CAAC,CAAC,SAAS,MAAM,EAAE,CAAC,SAAS,WAAW,CAAC,CAAC,CAAC,IACpE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,MAAM,IAAI,KAAK,OAAO,GACzC,IAAI,SAAS,SAAS,EAAE,GACtB,EAAE,GACF,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,GACjB,KAAK,CAAC;AAEZ,MAAM,WAAW,cAAc,CAC7B,IAAI,GAAG,OAAO,EACd,MAAM,GAAG,aAAa;IAEtB,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC;IACpB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,MAAM,cAAc,CACxB,CAAC,SAAS,MAAM,EAChB,CAAC,SAAS,WAAW,CAAC,CAAC,CAAC,EACxB,MAAM,GAAG,aAAa,IACpB,CACF,OAAO,EAAE,cAAc,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,CAAC,KAC/C,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,KAAK,EAAE,KAAK,MAAM,MAAM,GAChD,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,GACxB,KAAK,CAAC;AAEV,MAAM,WAAW,kBAAkB,CAAC,CAAC,SAAS,MAAM;IAClD,WAAW,CAAC,CAAC,SAAS,WAAW,CAAC,CAAC,CAAC,EAClC,IAAI,EAAE,CAAC,EACP,GAAG,IAAI,EAAE,eAAe,CAAC,CAAC,EAAE,CAAC,CAAC,GAC7B,OAAO,CAAC,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAChC,SAAS,CAAC,CAAC,SAAS,WAAW,CAAC,CAAC,CAAC,EAChC,IAAI,EAAE,CAAC,EACP,OAAO,EAAE,cAAc,CAAC,CAAC,EAAE,CAAC,CAAC,GAC5B,MAAM,IAAI,CAAC;CACf;AAsBD,wBAAgB,wBAAwB,CACtC,CAAC,SAAS,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,OAAO,KAAK,OAAO,CAAC,EAC9D,OAAO,EAAE,gBAAgB,GAAG,kBAAkB,CAAC,CAAC,CAAC,CA2DlD"}
@@ -0,0 +1,100 @@
1
+ import { BrowserApiError, isBrowserApiError } from '../shared/errors.js';
2
+ const MESSAGE_KEY = '__addonova_message__';
3
+ const RESPONSE_KEY = '__addonova_message_response__';
4
+ export function createExtensionMessaging(runtime) {
5
+ return {
6
+ async sendMessage(type, ...args) {
7
+ const messageArgs = args;
8
+ const envelope = {
9
+ [MESSAGE_KEY]: true,
10
+ type,
11
+ ...(messageArgs.length === 0 ? {} : { data: messageArgs[0] }),
12
+ };
13
+ const response = await runtime.sendMessage(envelope);
14
+ if (!isMessageResponse(response)) {
15
+ return response;
16
+ }
17
+ if (!response.ok) {
18
+ throw deserializeError(response.error);
19
+ }
20
+ return response.data;
21
+ },
22
+ onMessage(type, handler) {
23
+ const listener = (message, sender, sendResponse) => {
24
+ if (!isMessageEnvelope(message) || message.type !== type) {
25
+ return false;
26
+ }
27
+ void Promise.resolve(handler({
28
+ data: message.data,
29
+ sender,
30
+ })).then((data) => {
31
+ sendResponse(successResponse(data));
32
+ }, (error) => {
33
+ sendResponse(failureResponse(error));
34
+ });
35
+ return true;
36
+ };
37
+ runtime.onMessage.addListener(listener);
38
+ return () => runtime.onMessage.removeListener(listener);
39
+ },
40
+ };
41
+ }
42
+ function isMessageEnvelope(value) {
43
+ return (isRecord(value) &&
44
+ value[MESSAGE_KEY] === true &&
45
+ typeof value.type === 'string');
46
+ }
47
+ function isMessageResponse(value) {
48
+ return isRecord(value) && value[RESPONSE_KEY] === true;
49
+ }
50
+ function successResponse(data) {
51
+ return { [RESPONSE_KEY]: true, ok: true, data };
52
+ }
53
+ function failureResponse(error) {
54
+ return {
55
+ [RESPONSE_KEY]: true,
56
+ ok: false,
57
+ error: serializeError(error),
58
+ };
59
+ }
60
+ function serializeError(error) {
61
+ const name = error instanceof Error && error.name !== ''
62
+ ? error.name
63
+ : 'Error';
64
+ const message = error instanceof Error ? error.message : String(error);
65
+ return {
66
+ name,
67
+ message,
68
+ ...(isBrowserApiError(error) ? { code: error.code } : {}),
69
+ ...(error instanceof Error && error.stack !== undefined
70
+ ? { stack: error.stack }
71
+ : {}),
72
+ };
73
+ }
74
+ function deserializeError(error) {
75
+ if (error === undefined) {
76
+ return new BrowserApiError('BROWSER_API_FAILED', 'The message handler failed without an error.', { api: 'runtime.sendMessage' });
77
+ }
78
+ if (error.code !== undefined && isBrowserApiErrorCode(error.code)) {
79
+ return new BrowserApiError(error.code, error.message, {
80
+ api: 'runtime.sendMessage',
81
+ });
82
+ }
83
+ const result = new Error(error.message);
84
+ result.name = error.name;
85
+ if (error.stack !== undefined) {
86
+ result.stack = error.stack;
87
+ }
88
+ return result;
89
+ }
90
+ function isBrowserApiErrorCode(value) {
91
+ return (value === 'BROWSER_UNSUPPORTED_ENVIRONMENT' ||
92
+ value === 'BROWSER_UNSUPPORTED_API' ||
93
+ value === 'BROWSER_PERMISSION_DENIED' ||
94
+ value === 'BROWSER_API_FAILED' ||
95
+ value === 'BROWSER_INVALID_ARGUMENT');
96
+ }
97
+ function isRecord(value) {
98
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
99
+ }
100
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/messaging/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import type { ExtensionMessenger } from './index.ts';
2
+ export type AsyncService<Service extends object> = {
3
+ [Key in keyof Service]: Service[Key] extends (...args: infer Args) => infer Result ? (...args: Args) => Promise<Awaited<Result>> : never;
4
+ };
5
+ export type ProxyServiceFactory<Service extends object, Args extends readonly unknown[]> = (...args: Args) => Service;
6
+ export type ProxyServiceRegistration<Service extends object, Args extends readonly unknown[]> = {
7
+ (...args: Args): Service;
8
+ readonly name: string;
9
+ dispose(): void;
10
+ };
11
+ export type MessengerFactory = <P extends object = Record<string, (data?: unknown) => unknown>>() => ExtensionMessenger<P>;
12
+ export type DefineProxyService = <Service extends object, Args extends readonly unknown[] = readonly unknown[]>(name: string, create: ProxyServiceFactory<Service, Args>) => [
13
+ register: ProxyServiceRegistration<Service, Args>,
14
+ get: () => AsyncService<Service>
15
+ ];
16
+ export declare function createProxyServices(createMessenger: MessengerFactory): DefineProxyService;
17
+ //# sourceMappingURL=proxy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"proxy.d.ts","sourceRoot":"","sources":["../../src/messaging/proxy.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAcrD,MAAM,MAAM,YAAY,CAAC,OAAO,SAAS,MAAM,IAAI;KAChD,GAAG,IAAI,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,SAAS,CAC3C,GAAG,IAAI,EAAE,MAAM,IAAI,KAChB,MAAM,MAAM,GACb,CAAC,GAAG,IAAI,EAAE,IAAI,KAAK,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,GAC3C,KAAK;CACV,CAAC;AAEF,MAAM,MAAM,mBAAmB,CAC7B,OAAO,SAAS,MAAM,EACtB,IAAI,SAAS,SAAS,OAAO,EAAE,IAC7B,CAAC,GAAG,IAAI,EAAE,IAAI,KAAK,OAAO,CAAC;AAE/B,MAAM,MAAM,wBAAwB,CAClC,OAAO,SAAS,MAAM,EACtB,IAAI,SAAS,SAAS,OAAO,EAAE,IAC7B;IACF,CAAC,GAAG,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,OAAO,IAAI,IAAI,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG,CAC7B,CAAC,SAAS,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,OAAO,KAAK,OAAO,CAAC,OACzD,kBAAkB,CAAC,CAAC,CAAC,CAAC;AAE7B,MAAM,MAAM,kBAAkB,GAAG,CAC/B,OAAO,SAAS,MAAM,EACtB,IAAI,SAAS,SAAS,OAAO,EAAE,GAAG,SAAS,OAAO,EAAE,EAEpD,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,mBAAmB,CAAC,OAAO,EAAE,IAAI,CAAC,KACvC;IACH,QAAQ,EAAE,wBAAwB,CAAC,OAAO,EAAE,IAAI,CAAC;IACjD,GAAG,EAAE,MAAM,YAAY,CAAC,OAAO,CAAC;CACjC,CAAC;AAEF,wBAAgB,mBAAmB,CACjC,eAAe,EAAE,gBAAgB,GAChC,kBAAkB,CA4FpB"}
@@ -0,0 +1,61 @@
1
+ import { BrowserApiError } from '../shared/errors.js';
2
+ const PROXY_PREFIX = '__addonova_proxy__:';
3
+ export function createProxyServices(createMessenger) {
4
+ const messaging = createMessenger();
5
+ const services = new Map();
6
+ return function defineProxyService(name, create) {
7
+ const messageType = `${PROXY_PREFIX}${name}`;
8
+ let dispose;
9
+ const register = ((...args) => {
10
+ if (services.has(name)) {
11
+ throw new BrowserApiError('BROWSER_INVALID_ARGUMENT', `Proxy service "${name}" is already registered.`);
12
+ }
13
+ const service = create(...args);
14
+ services.set(name, service);
15
+ const removeListener = messaging.onMessage(messageType, async ({ data }) => {
16
+ if (!isProxyRequest(data)) {
17
+ throw new BrowserApiError('BROWSER_INVALID_ARGUMENT', `Invalid proxy request for service "${name}".`);
18
+ }
19
+ const method = service[data.method];
20
+ if (typeof method !== 'function') {
21
+ throw new BrowserApiError('BROWSER_UNSUPPORTED_API', `Proxy service "${name}" does not implement "${data.method}".`);
22
+ }
23
+ return await method.apply(service, [...data.args]);
24
+ });
25
+ dispose = () => {
26
+ removeListener();
27
+ services.delete(name);
28
+ dispose = undefined;
29
+ };
30
+ return service;
31
+ });
32
+ Object.defineProperty(register, 'name', { value: name });
33
+ Object.defineProperty(register, 'dispose', {
34
+ value: () => {
35
+ dispose?.();
36
+ },
37
+ });
38
+ const get = () => {
39
+ const proxy = new Proxy({}, {
40
+ get(_target, property) {
41
+ if (typeof property === 'symbol' || property === 'then') {
42
+ return undefined;
43
+ }
44
+ return (...args) => messaging.sendMessage(messageType, {
45
+ method: property,
46
+ args,
47
+ });
48
+ },
49
+ });
50
+ return proxy;
51
+ };
52
+ return [register, get];
53
+ };
54
+ }
55
+ function isProxyRequest(value) {
56
+ return (typeof value === 'object' &&
57
+ value !== null &&
58
+ typeof value.method === 'string' &&
59
+ Array.isArray(value.args));
60
+ }
61
+ //# sourceMappingURL=proxy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"proxy.js","sourceRoot":"","sources":["../../src/messaging/proxy.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { ExtensionMessenger } from './index.ts';
2
+ export declare function defineExtensionMessaging<P extends object = Record<string, (data?: unknown) => unknown>>(): ExtensionMessenger<P>;
3
+ export declare const defineProxyService: import("./proxy.ts").DefineProxyService;
4
+ //# sourceMappingURL=root.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"root.d.ts","sourceRoot":"","sources":["../../src/messaging/root.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAMrD,wBAAgB,wBAAwB,CACtC,CAAC,SAAS,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,OAAO,KAAK,OAAO,CAAC,KAC3D,kBAAkB,CAAC,CAAC,CAAC,CAEzB;AAED,eAAO,MAAM,kBAAkB,yCAAuC,CAAC"}
@@ -0,0 +1,9 @@
1
+ import { runtime } from '../api/singletons.js';
2
+ import { createExtensionMessaging } from './index.js';
3
+ import { createProxyServices } from './proxy.js';
4
+ const createMessenger = () => createExtensionMessaging(runtime);
5
+ export function defineExtensionMessaging() {
6
+ return createExtensionMessaging(runtime);
7
+ }
8
+ export const defineProxyService = createProxyServices(createMessenger);
9
+ //# sourceMappingURL=root.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"root.js","sourceRoot":"","sources":["../../src/messaging/root.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAC/C,OAAO,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAC;AAEtD,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAEjD,MAAM,eAAe,GAAG,GAAqB,EAAE,CAC7C,wBAAwB,CAAI,OAAO,CAAC,CAAC;AAEvC,MAAM,UAAU,wBAAwB;IAGtC,OAAO,wBAAwB,CAAI,OAAO,CAAC,CAAC;AAC9C,CAAC;AAED,MAAM,CAAC,MAAM,kBAAkB,GAAG,mBAAmB,CAAC,eAAe,CAAC,CAAC"}
@@ -0,0 +1,25 @@
1
+ export declare const BROWSER_TARGETS: readonly ['chrome', 'chromium', 'firefox', 'edge'];
2
+ export type BrowserTarget = (typeof BROWSER_TARGETS)[number];
3
+ export type BrowserEngine = 'chromium' | 'gecko' | 'unknown';
4
+ export type ManifestVersion = 2 | 3;
5
+ export type ApiAvailabilityReason = 'missing-api' | 'missing-permission' | 'unsupported-manifest' | 'unsupported-browser';
6
+ export interface CapabilityQuery {
7
+ readonly namespace: string;
8
+ readonly method?: string;
9
+ }
10
+ export declare function normalizeQuery(api: string | CapabilityQuery): CapabilityQuery;
11
+ export interface ApiAvailability {
12
+ readonly namespace: string;
13
+ readonly method?: string;
14
+ readonly available: boolean;
15
+ readonly reason?: ApiAvailabilityReason;
16
+ }
17
+ export interface CapabilityProvider {
18
+ supports(query: CapabilityQuery): boolean;
19
+ availability(query: CapabilityQuery): ApiAvailability;
20
+ }
21
+ export declare function isBrowserTarget(value: unknown): value is BrowserTarget;
22
+ export declare function isManifestVersion(value: unknown): value is ManifestVersion;
23
+ export declare function availableCapability(query: CapabilityQuery): ApiAvailability;
24
+ export declare function unavailableCapability(query: CapabilityQuery, reason: ApiAvailabilityReason): ApiAvailability;
25
+ //# sourceMappingURL=capabilities.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"capabilities.d.ts","sourceRoot":"","sources":["../../src/shared/capabilities.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,eAAe,YAC1B,QAAQ,EACR,UAAU,EACV,SAAS,EACT,MAAM,CACE,CAAC;AAEX,MAAM,MAAM,aAAa,GAAG,CAAC,OAAO,eAAe,CAAC,CAAC,MAAM,CAAC,CAAC;AAE7D,MAAM,MAAM,aAAa,GAAG,UAAU,GAAG,OAAO,GAAG,SAAS,CAAC;AAE7D,MAAM,MAAM,eAAe,GAAG,CAAC,GAAG,CAAC,CAAC;AAEpC,MAAM,MAAM,qBAAqB,GAC7B,aAAa,GACb,oBAAoB,GACpB,sBAAsB,GACtB,qBAAqB,CAAC;AAE1B,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,wBAAgB,cAAc,CAC5B,GAAG,EAAE,MAAM,GAAG,eAAe,GAC5B,eAAe,CAajB;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,MAAM,CAAC,EAAE,qBAAqB,CAAC;CACzC;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC;IAC1C,YAAY,CAAC,KAAK,EAAE,eAAe,GAAG,eAAe,CAAC;CACvD;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,aAAa,CAKtE;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,eAAe,CAE1E;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,eAAe,GAAG,eAAe,CAM3E;AAED,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,eAAe,EACtB,MAAM,EAAE,qBAAqB,GAC5B,eAAe,CAOjB"}
@@ -0,0 +1,41 @@
1
+ export const BROWSER_TARGETS = [
2
+ 'chrome',
3
+ 'chromium',
4
+ 'firefox',
5
+ 'edge',
6
+ ];
7
+ export function normalizeQuery(api) {
8
+ if (typeof api !== 'string') {
9
+ return api;
10
+ }
11
+ const separator = api.indexOf('.');
12
+ return separator === -1
13
+ ? { namespace: api }
14
+ : {
15
+ namespace: api.slice(0, separator),
16
+ method: api.slice(separator + 1),
17
+ };
18
+ }
19
+ export function isBrowserTarget(value) {
20
+ return (typeof value === 'string' &&
21
+ BROWSER_TARGETS.includes(value));
22
+ }
23
+ export function isManifestVersion(value) {
24
+ return value === 2 || value === 3;
25
+ }
26
+ export function availableCapability(query) {
27
+ return {
28
+ namespace: query.namespace,
29
+ ...(query.method === undefined ? {} : { method: query.method }),
30
+ available: true,
31
+ };
32
+ }
33
+ export function unavailableCapability(query, reason) {
34
+ return {
35
+ namespace: query.namespace,
36
+ ...(query.method === undefined ? {} : { method: query.method }),
37
+ available: false,
38
+ reason,
39
+ };
40
+ }
41
+ //# sourceMappingURL=capabilities.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"capabilities.js","sourceRoot":"","sources":["../../src/shared/capabilities.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,QAAQ;IACR,UAAU;IACV,SAAS;IACT,MAAM;CACE,CAAC;AAmBX,MAAM,UAAU,cAAc,CAC5B,GAA6B;IAE7B,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;QAC5B,OAAO,GAAG,CAAC;IACb,CAAC;IAED,MAAM,SAAS,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAEnC,OAAO,SAAS,KAAK,CAAC,CAAC;QACrB,CAAC,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE;QACpB,CAAC,CAAC;YACE,SAAS,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC;YAClC,MAAM,EAAE,GAAG,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,CAAC;SACjC,CAAC;AACR,CAAC;AAcD,MAAM,UAAU,eAAe,CAAC,KAAc;IAC5C,OAAO,CACL,OAAO,KAAK,KAAK,QAAQ;QACxB,eAAqC,CAAC,QAAQ,CAAC,KAAK,CAAC,CACvD,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,KAAc;IAC9C,OAAO,KAAK,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC;AACpC,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,KAAsB;IACxD,OAAO;QACL,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,GAAG,CAAC,KAAK,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC;QAC/D,SAAS,EAAE,IAAI;KAChB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,qBAAqB,CACnC,KAAsB,EACtB,MAA6B;IAE7B,OAAO;QACL,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,GAAG,CAAC,KAAK,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC;QAC/D,SAAS,EAAE,KAAK;QAChB,MAAM;KACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,18 @@
1
+ export type BrowserApiErrorCode = 'BROWSER_UNSUPPORTED_ENVIRONMENT' | 'BROWSER_UNSUPPORTED_API' | 'BROWSER_PERMISSION_DENIED' | 'BROWSER_API_FAILED' | 'BROWSER_INVALID_ARGUMENT';
2
+ export interface BrowserApiErrorOptions {
3
+ api?: string;
4
+ cause?: unknown;
5
+ }
6
+ export interface NormalizeBrowserApiErrorOptions {
7
+ code?: BrowserApiErrorCode;
8
+ api?: string;
9
+ }
10
+ export declare class BrowserApiError extends Error {
11
+ readonly code: BrowserApiErrorCode;
12
+ readonly api: string | undefined;
13
+ constructor(code: BrowserApiErrorCode, message: string, options?: BrowserApiErrorOptions);
14
+ }
15
+ export declare function isBrowserApiError(value: unknown): value is BrowserApiError;
16
+ export declare function isPermissionError(error: unknown): boolean;
17
+ export declare function normalizeBrowserApiError(error: unknown, options?: NormalizeBrowserApiErrorOptions): BrowserApiError;
18
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/shared/errors.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,mBAAmB,GAC3B,iCAAiC,GACjC,yBAAyB,GACzB,2BAA2B,GAC3B,oBAAoB,GACpB,0BAA0B,CAAC;AAE/B,MAAM,WAAW,sBAAsB;IACrC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,+BAA+B;IAC9C,IAAI,CAAC,EAAE,mBAAmB,CAAC;IAC3B,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,qBAAa,eAAgB,SAAQ,KAAK;IACxC,QAAQ,CAAC,IAAI,EAAE,mBAAmB,CAAC;IACnC,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,CAAC;IAEjC,YACE,IAAI,EAAE,mBAAmB,EACzB,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,sBAA2B,EASrC;CACF;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,eAAe,CAE1E;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAGzD;AAED,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,OAAO,EACd,OAAO,GAAE,+BAAoC,GAC5C,eAAe,CAgBjB"}
@@ -0,0 +1,32 @@
1
+ export class BrowserApiError extends Error {
2
+ code;
3
+ api;
4
+ constructor(code, message, options = {}) {
5
+ super(message, options.cause === undefined ? undefined : { cause: options.cause });
6
+ this.name = 'BrowserApiError';
7
+ this.code = code;
8
+ this.api = options.api;
9
+ }
10
+ }
11
+ export function isBrowserApiError(value) {
12
+ return value instanceof BrowserApiError;
13
+ }
14
+ export function isPermissionError(error) {
15
+ const message = error instanceof Error ? error.message : String(error);
16
+ return /permission|not allowed|denied|access/i.test(message);
17
+ }
18
+ export function normalizeBrowserApiError(error, options = {}) {
19
+ if (isBrowserApiError(error)) {
20
+ return error;
21
+ }
22
+ const message = error instanceof Error ? error.message : String(error);
23
+ const code = options.code ??
24
+ (isPermissionError(error)
25
+ ? 'BROWSER_PERMISSION_DENIED'
26
+ : 'BROWSER_API_FAILED');
27
+ return new BrowserApiError(code, message, {
28
+ ...(options.api === undefined ? {} : { api: options.api }),
29
+ cause: error,
30
+ });
31
+ }
32
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/shared/errors.ts"],"names":[],"mappings":"AAiBA,MAAM,OAAO,eAAgB,SAAQ,KAAK;IAC/B,IAAI,CAAsB;IAC1B,GAAG,CAAqB;IAEjC,YACE,IAAyB,EACzB,OAAe,EACf,OAAO,GAA2B,EAAE;QAEpC,KAAK,CACH,OAAO,EACP,OAAO,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CACnE,CAAC;QACF,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAC;QAC9B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC;IACzB,CAAC;CACF;AAED,MAAM,UAAU,iBAAiB,CAAC,KAAc;IAC9C,OAAO,KAAK,YAAY,eAAe,CAAC;AAC1C,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,KAAc;IAC9C,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACvE,OAAO,uCAAuC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AAC/D,CAAC;AAED,MAAM,UAAU,wBAAwB,CACtC,KAAc,EACd,OAAO,GAAoC,EAAE;IAE7C,IAAI,iBAAiB,CAAC,KAAK,CAAC,EAAE,CAAC;QAC7B,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACvE,MAAM,IAAI,GACR,OAAO,CAAC,IAAI;QACZ,CAAC,iBAAiB,CAAC,KAAK,CAAC;YACvB,CAAC,CAAC,2BAA2B;YAC7B,CAAC,CAAC,oBAAoB,CAAC,CAAC;IAE5B,OAAO,IAAI,eAAe,CAAC,IAAI,EAAE,OAAO,EAAE;QACxC,GAAG,CAAC,OAAO,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC;QAC1D,KAAK,EAAE,KAAK;KACb,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,11 @@
1
+ export type BrowserEventListener = (...args: never[]) => unknown;
2
+ export interface BrowserEvent<TListener extends BrowserEventListener = BrowserEventListener> {
3
+ addListener(listener: TListener): void;
4
+ removeListener(listener: TListener): void;
5
+ hasListener?(listener: TListener): boolean;
6
+ hasListeners?(): boolean;
7
+ }
8
+ export declare function isBrowserEvent(value: unknown): value is BrowserEvent;
9
+ export declare function requireEvent<TEvent extends BrowserEvent>(event: TEvent | undefined | null, api: string): TEvent;
10
+ export declare function passthroughEvent<TEvent extends BrowserEvent>(event: TEvent): TEvent;
11
+ //# sourceMappingURL=events.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../src/shared/events.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,oBAAoB,GAAG,CAAC,GAAG,IAAI,EAAE,KAAK,EAAE,KAAK,OAAO,CAAC;AAEjE,MAAM,WAAW,YAAY,CAC3B,SAAS,SAAS,oBAAoB,GAAG,oBAAoB;IAE7D,WAAW,CAAC,QAAQ,EAAE,SAAS,GAAG,IAAI,CAAC;IACvC,cAAc,CAAC,QAAQ,EAAE,SAAS,GAAG,IAAI,CAAC;IAC1C,WAAW,CAAC,CAAC,QAAQ,EAAE,SAAS,GAAG,OAAO,CAAC;IAC3C,YAAY,CAAC,IAAI,OAAO,CAAC;CAC1B;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,YAAY,CAMpE;AAED,wBAAgB,YAAY,CAAC,MAAM,SAAS,YAAY,EACtD,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,EAChC,GAAG,EAAE,MAAM,GACV,MAAM,CAUR;AAED,wBAAgB,gBAAgB,CAAC,MAAM,SAAS,YAAY,EAC1D,KAAK,EAAE,MAAM,GACZ,MAAM,CAER"}
@@ -0,0 +1,19 @@
1
+ import { BrowserApiError } from './errors.js';
2
+ export function isBrowserEvent(value) {
3
+ return (isRecord(value) &&
4
+ typeof value.addListener === 'function' &&
5
+ typeof value.removeListener === 'function');
6
+ }
7
+ export function requireEvent(event, api) {
8
+ if (event === undefined || event === null || !isBrowserEvent(event)) {
9
+ throw new BrowserApiError('BROWSER_UNSUPPORTED_API', `The browser API "${api}" is not available in this environment.`, { api });
10
+ }
11
+ return event;
12
+ }
13
+ export function passthroughEvent(event) {
14
+ return event;
15
+ }
16
+ function isRecord(value) {
17
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
18
+ }
19
+ //# sourceMappingURL=events.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"events.js","sourceRoot":"","sources":["../../src/shared/events.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAa9C,MAAM,UAAU,cAAc,CAAC,KAAc;IAC3C,OAAO,CACL,QAAQ,CAAC,KAAK,CAAC;QACf,OAAO,KAAK,CAAC,WAAW,KAAK,UAAU;QACvC,OAAO,KAAK,CAAC,cAAc,KAAK,UAAU,CAC3C,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,YAAY,CAC1B,KAAgC,EAChC,GAAW;IAEX,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,EAAE,CAAC;QACpE,MAAM,IAAI,eAAe,CACvB,yBAAyB,EACzB,oBAAoB,GAAG,yCAAyC,EAChE,EAAE,GAAG,EAAE,CACR,CAAC;IACJ,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,gBAAgB,CAC9B,KAAa;IAEb,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,QAAQ,CAAC,KAAc;IAC9B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC9E,CAAC"}
@@ -0,0 +1,4 @@
1
+ export declare function isRecord(value: unknown): value is Record<string, unknown>;
2
+ export declare function readProperty(scope: unknown, key: string): unknown;
3
+ export declare function readPath(scope: unknown, ...keys: readonly string[]): unknown;
4
+ //# sourceMappingURL=objects.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"objects.d.ts","sourceRoot":"","sources":["../../src/shared/objects.ts"],"names":[],"mappings":"AAAA,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAEzE;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAEjE;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAQ5E"}
@@ -0,0 +1,14 @@
1
+ export function isRecord(value) {
2
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
3
+ }
4
+ export function readProperty(scope, key) {
5
+ return isRecord(scope) ? scope[key] : undefined;
6
+ }
7
+ export function readPath(scope, ...keys) {
8
+ let current = scope;
9
+ for (const key of keys) {
10
+ current = readProperty(current, key);
11
+ }
12
+ return current;
13
+ }
14
+ //# sourceMappingURL=objects.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"objects.js","sourceRoot":"","sources":["../../src/shared/objects.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,QAAQ,CAAC,KAAc;IACrC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC9E,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,KAAc,EAAE,GAAW;IACtD,OAAO,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AAClD,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,KAAc,EAAE,GAAG,IAAuB;IACjE,IAAI,OAAO,GAAY,KAAK,CAAC;IAE7B,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,OAAO,GAAG,YAAY,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;IACvC,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC"}
@@ -0,0 +1,11 @@
1
+ export type Callback<Result> = (result: Result) => void;
2
+ export interface CallbackOptions {
3
+ scope?: unknown;
4
+ api?: string;
5
+ }
6
+ export declare function readLastError(scope: unknown): string | null;
7
+ export declare function callbackToPromise<TResult>(run: (callback: Callback<TResult>) => void, options?: CallbackOptions): Promise<TResult>;
8
+ export declare function promisifyMethod<Args extends unknown[], Result>(method: (...args: [...Args, Callback<Result>]) => void, options?: CallbackOptions): (...args: Args) => Promise<Result>;
9
+ export declare function isPromiseLike<T>(value: T | PromiseLike<T>): value is PromiseLike<T>;
10
+ export declare function resolveMaybePromise<T>(value: T | PromiseLike<T>): Promise<T>;
11
+ //# sourceMappingURL=promises.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"promises.d.ts","sourceRoot":"","sources":["../../src/shared/promises.ts"],"names":[],"mappings":"AAMA,MAAM,MAAM,QAAQ,CAAC,MAAM,IAAI,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;AAExD,MAAM,WAAW,eAAe;IAC9B,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAwB3D;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EACvC,GAAG,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,OAAO,CAAC,KAAK,IAAI,EAC1C,OAAO,GAAE,eAAoB,GAC5B,OAAO,CAAC,OAAO,CAAC,CA+ClB;AAED,wBAAgB,eAAe,CAAC,IAAI,SAAS,OAAO,EAAE,EAAE,MAAM,EAC5D,MAAM,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,GAAG,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,KAAK,IAAI,EACtD,OAAO,GAAE,eAAoB,GAC5B,CAAC,GAAG,IAAI,EAAE,IAAI,KAAK,OAAO,CAAC,MAAM,CAAC,CAKpC;AAED,wBAAgB,aAAa,CAAC,CAAC,EAC7B,KAAK,EAAE,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,GACxB,KAAK,IAAI,WAAW,CAAC,CAAC,CAAC,CAMzB;AAED,wBAAgB,mBAAmB,CAAC,CAAC,EACnC,KAAK,EAAE,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,GACxB,OAAO,CAAC,CAAC,CAAC,CAEZ"}