adnbn 0.13.0 → 0.15.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 (392) hide show
  1. package/dist/cli/builders/app/build.d.ts +7 -0
  2. package/dist/cli/builders/app/build.js +58 -0
  3. package/dist/cli/builders/app/build.js.map +1 -0
  4. package/dist/cli/builders/app/index.d.ts +6 -1
  5. package/dist/cli/builders/app/index.js +49 -14
  6. package/dist/cli/builders/app/index.js.map +1 -1
  7. package/dist/cli/builders/app/{command.d.ts → watch.d.ts} +0 -1
  8. package/dist/cli/builders/app/{command.js → watch.js} +1 -26
  9. package/dist/cli/builders/app/watch.js.map +1 -0
  10. package/dist/cli/builders/manifest/ManifestBase.d.ts +8 -1
  11. package/dist/cli/builders/manifest/ManifestBase.js +30 -0
  12. package/dist/cli/builders/manifest/ManifestBase.js.map +1 -1
  13. package/dist/cli/builders/manifest/ManifestV2.js +3 -15
  14. package/dist/cli/builders/manifest/ManifestV2.js.map +1 -1
  15. package/dist/cli/builders/manifest/ManifestV3.js +3 -15
  16. package/dist/cli/builders/manifest/ManifestV3.js.map +1 -1
  17. package/dist/cli/bundler/plugins/entrypoint/EntrypointPlugin.js +4 -0
  18. package/dist/cli/bundler/plugins/entrypoint/EntrypointPlugin.js.map +1 -1
  19. package/dist/cli/entrypoint/finder/AbstractOverrideFinder.d.ts +15 -0
  20. package/dist/cli/entrypoint/finder/AbstractOverrideFinder.js +20 -0
  21. package/dist/cli/entrypoint/finder/AbstractOverrideFinder.js.map +1 -0
  22. package/dist/cli/entrypoint/finder/AbstractViewFinder.d.ts +6 -1
  23. package/dist/cli/entrypoint/finder/AbstractViewFinder.js +15 -0
  24. package/dist/cli/entrypoint/finder/AbstractViewFinder.js.map +1 -1
  25. package/dist/cli/entrypoint/finder/BookmarksFinder.d.ts +9 -0
  26. package/dist/cli/entrypoint/finder/BookmarksFinder.js +18 -0
  27. package/dist/cli/entrypoint/finder/BookmarksFinder.js.map +1 -0
  28. package/dist/cli/entrypoint/finder/CommandFinder.d.ts +4 -0
  29. package/dist/cli/entrypoint/finder/CommandFinder.js +20 -6
  30. package/dist/cli/entrypoint/finder/CommandFinder.js.map +1 -1
  31. package/dist/cli/entrypoint/finder/HistoryFinder.d.ts +9 -0
  32. package/dist/cli/entrypoint/finder/HistoryFinder.js +18 -0
  33. package/dist/cli/entrypoint/finder/HistoryFinder.js.map +1 -0
  34. package/dist/cli/entrypoint/finder/NewtabFinder.d.ts +9 -0
  35. package/dist/cli/entrypoint/finder/NewtabFinder.js +18 -0
  36. package/dist/cli/entrypoint/finder/NewtabFinder.js.map +1 -0
  37. package/dist/cli/entrypoint/finder/OptionsFinder.d.ts +2 -2
  38. package/dist/cli/entrypoint/finder/OptionsFinder.js +2 -2
  39. package/dist/cli/entrypoint/finder/OptionsFinder.js.map +1 -1
  40. package/dist/cli/entrypoint/finder/PageFinder.js +1 -1
  41. package/dist/cli/entrypoint/finder/PageFinder.js.map +1 -1
  42. package/dist/cli/entrypoint/finder/PopupFinder.d.ts +2 -2
  43. package/dist/cli/entrypoint/finder/PopupFinder.js +2 -2
  44. package/dist/cli/entrypoint/finder/PopupFinder.js.map +1 -1
  45. package/dist/cli/entrypoint/finder/SidebarFinder.d.ts +2 -2
  46. package/dist/cli/entrypoint/finder/SidebarFinder.js +2 -2
  47. package/dist/cli/entrypoint/finder/SidebarFinder.js.map +1 -1
  48. package/dist/cli/entrypoint/finder/ViewCspFinder.d.ts +2 -3
  49. package/dist/cli/entrypoint/finder/ViewCspFinder.js.map +1 -1
  50. package/dist/cli/entrypoint/finder/ViewPermissionsFinder.d.ts +22 -0
  51. package/dist/cli/entrypoint/finder/ViewPermissionsFinder.js +43 -0
  52. package/dist/cli/entrypoint/finder/ViewPermissionsFinder.js.map +1 -0
  53. package/dist/cli/entrypoint/finder/index.d.ts +5 -0
  54. package/dist/cli/entrypoint/finder/index.js +50 -40
  55. package/dist/cli/entrypoint/finder/index.js.map +1 -1
  56. package/dist/cli/entrypoint/name/NameGenerator.d.ts +2 -0
  57. package/dist/cli/entrypoint/name/NameGenerator.js +5 -1
  58. package/dist/cli/entrypoint/name/NameGenerator.js.map +1 -1
  59. package/dist/cli/entrypoint/parser/AbstractOverrideParser.d.ts +9 -0
  60. package/dist/cli/entrypoint/parser/AbstractOverrideParser.js +11 -0
  61. package/dist/cli/entrypoint/parser/AbstractOverrideParser.js.map +1 -0
  62. package/dist/cli/entrypoint/parser/BackgroundParser.js +3 -6
  63. package/dist/cli/entrypoint/parser/BackgroundParser.js.map +1 -1
  64. package/dist/cli/entrypoint/parser/BookmarksParser.d.ts +5 -0
  65. package/dist/cli/entrypoint/parser/BookmarksParser.js +10 -0
  66. package/dist/cli/entrypoint/parser/BookmarksParser.js.map +1 -0
  67. package/dist/cli/entrypoint/parser/HistoryParser.d.ts +5 -0
  68. package/dist/cli/entrypoint/parser/HistoryParser.js +10 -0
  69. package/dist/cli/entrypoint/parser/HistoryParser.js.map +1 -0
  70. package/dist/cli/entrypoint/parser/NewtabParser.d.ts +5 -0
  71. package/dist/cli/entrypoint/parser/NewtabParser.js +10 -0
  72. package/dist/cli/entrypoint/parser/NewtabParser.js.map +1 -0
  73. package/dist/cli/entrypoint/parser/OptionsParser.js +2 -1
  74. package/dist/cli/entrypoint/parser/OptionsParser.js.map +1 -1
  75. package/dist/cli/entrypoint/parser/PopupParser.js +2 -1
  76. package/dist/cli/entrypoint/parser/PopupParser.js.map +1 -1
  77. package/dist/cli/entrypoint/parser/SidebarParser.js +2 -1
  78. package/dist/cli/entrypoint/parser/SidebarParser.js.map +1 -1
  79. package/dist/cli/entrypoint/parser/ViewCspParser.d.ts +1 -1
  80. package/dist/cli/entrypoint/parser/ViewParser.d.ts +1 -1243
  81. package/dist/cli/entrypoint/parser/ViewParser.js +2 -72
  82. package/dist/cli/entrypoint/parser/ViewParser.js.map +1 -1
  83. package/dist/cli/entrypoint/parser/index.d.ts +4 -0
  84. package/dist/cli/entrypoint/parser/index.js +28 -20
  85. package/dist/cli/entrypoint/parser/index.js.map +1 -1
  86. package/dist/cli/entrypoint/parser/schemas/html.d.ts +903 -0
  87. package/dist/cli/entrypoint/parser/schemas/html.js +64 -0
  88. package/dist/cli/entrypoint/parser/schemas/html.js.map +1 -0
  89. package/dist/cli/entrypoint/parser/schemas/permissions.d.ts +23 -0
  90. package/dist/cli/entrypoint/parser/schemas/permissions.js +11 -0
  91. package/dist/cli/entrypoint/parser/schemas/permissions.js.map +1 -0
  92. package/dist/cli/index.js +16 -3
  93. package/dist/cli/index.js.map +1 -1
  94. package/dist/cli/plugins/action.d.ts +2 -0
  95. package/dist/cli/plugins/action.js +13 -0
  96. package/dist/cli/plugins/action.js.map +1 -0
  97. package/dist/cli/plugins/index.d.ts +2 -0
  98. package/dist/cli/plugins/index.js +52 -48
  99. package/dist/cli/plugins/index.js.map +1 -1
  100. package/dist/cli/plugins/offscreen/index.js +2 -4
  101. package/dist/cli/plugins/offscreen/index.js.map +1 -1
  102. package/dist/cli/plugins/options/index.js +1 -1
  103. package/dist/cli/plugins/options/index.js.map +1 -1
  104. package/dist/cli/plugins/override/Override.d.ts +31 -0
  105. package/dist/cli/plugins/override/Override.js +112 -0
  106. package/dist/cli/plugins/override/Override.js.map +1 -0
  107. package/dist/cli/plugins/override/index.d.ts +2 -0
  108. package/dist/cli/plugins/override/index.js +48 -0
  109. package/dist/cli/plugins/override/index.js.map +1 -0
  110. package/dist/cli/plugins/popup/index.js +1 -1
  111. package/dist/cli/plugins/popup/index.js.map +1 -1
  112. package/dist/cli/plugins/sidebar/index.js +1 -2
  113. package/dist/cli/plugins/sidebar/index.js.map +1 -1
  114. package/dist/cli/plugins/style/index.js +34 -31
  115. package/dist/cli/plugins/style/index.js.map +1 -1
  116. package/dist/cli/plugins/style/rebase.d.ts +14 -0
  117. package/dist/cli/plugins/style/rebase.js +63 -0
  118. package/dist/cli/plugins/style/rebase.js.map +1 -0
  119. package/dist/cli/plugins/style/utils.d.ts +5 -1
  120. package/dist/cli/plugins/style/utils.js +21 -8
  121. package/dist/cli/plugins/style/utils.js.map +1 -1
  122. package/dist/cli/plugins/typescript/TypescriptConfig.js +2 -2
  123. package/dist/cli/plugins/typescript/TypescriptConfig.js.map +1 -1
  124. package/dist/cli/plugins/view/View.d.ts +1 -1
  125. package/dist/cli/plugins/view/View.js +2 -10
  126. package/dist/cli/plugins/view/View.js.map +1 -1
  127. package/dist/cli/plugins/view/index.js +10 -1
  128. package/dist/cli/plugins/view/index.js.map +1 -1
  129. package/dist/cli/resolvers/bundler.js +9 -1
  130. package/dist/cli/resolvers/bundler.js.map +1 -1
  131. package/dist/cli/resolvers/config.js +7 -1
  132. package/dist/cli/resolvers/config.js.map +1 -1
  133. package/dist/cli/utils/path.js +1 -1
  134. package/dist/cli/utils/path.js.map +1 -1
  135. package/dist/cli/virtual/index.js +14 -17
  136. package/dist/cli/virtual/virtual.d.ts +7 -127
  137. package/dist/entry/background/Builder.js +1 -1
  138. package/dist/entry/background/Builder.js.map +1 -1
  139. package/dist/entry/background/index.d.ts +1 -1
  140. package/dist/entry/background/index.js +3 -2
  141. package/dist/entry/background/index.js.map +1 -1
  142. package/dist/entry/background/resolvers/definition.d.ts +5 -1
  143. package/dist/entry/background/resolvers/definition.js +15 -4
  144. package/dist/entry/background/resolvers/definition.js.map +1 -1
  145. package/dist/entry/command/Builder.js +1 -1
  146. package/dist/entry/command/Builder.js.map +1 -1
  147. package/dist/entry/command/index.d.ts +1 -1
  148. package/dist/entry/command/index.js +3 -2
  149. package/dist/entry/command/index.js.map +1 -1
  150. package/dist/entry/command/resolvers/definition.d.ts +6 -2
  151. package/dist/entry/command/resolvers/definition.js +14 -4
  152. package/dist/entry/command/resolvers/definition.js.map +1 -1
  153. package/dist/entry/content/adapters/react/Builder.js +4 -2
  154. package/dist/entry/content/adapters/react/Builder.js.map +1 -1
  155. package/dist/entry/content/adapters/react/Node.js +11 -6
  156. package/dist/entry/content/adapters/react/Node.js.map +1 -1
  157. package/dist/entry/content/adapters/react/definition.js +3 -2
  158. package/dist/entry/content/adapters/react/definition.js.map +1 -1
  159. package/dist/entry/content/adapters/vanilla/Builder.js +2 -2
  160. package/dist/entry/content/adapters/vanilla/Builder.js.map +1 -1
  161. package/dist/entry/content/adapters/vanilla/Node.js +3 -5
  162. package/dist/entry/content/adapters/vanilla/Node.js.map +1 -1
  163. package/dist/entry/content/adapters/vanilla/definition.js +2 -2
  164. package/dist/entry/content/adapters/vanilla/definition.js.map +1 -1
  165. package/dist/entry/content/lifecycle/Builder.js +5 -9
  166. package/dist/entry/content/lifecycle/Builder.js.map +1 -1
  167. package/dist/entry/core/react.d.ts +6 -0
  168. package/dist/entry/core/react.js +16 -0
  169. package/dist/entry/core/react.js.map +1 -0
  170. package/dist/entry/core/render.d.ts +5 -0
  171. package/dist/entry/core/render.js +16 -0
  172. package/dist/entry/core/render.js.map +1 -0
  173. package/dist/entry/offscreen/Builder.d.ts +6 -7
  174. package/dist/entry/offscreen/Builder.js +12 -13
  175. package/dist/entry/offscreen/Builder.js.map +1 -1
  176. package/dist/entry/offscreen/TransportBuilder.d.ts +1 -1
  177. package/dist/entry/offscreen/TransportBuilder.js +4 -3
  178. package/dist/entry/offscreen/TransportBuilder.js.map +1 -1
  179. package/dist/entry/offscreen/index.d.ts +5 -2
  180. package/dist/entry/offscreen/index.js +8 -2
  181. package/dist/entry/offscreen/index.js.map +1 -1
  182. package/dist/entry/offscreen/resolvers/definition.d.ts +4 -0
  183. package/dist/entry/offscreen/resolvers/definition.js +8 -0
  184. package/dist/entry/offscreen/resolvers/definition.js.map +1 -0
  185. package/dist/entry/relay/Builder.d.ts +4 -3
  186. package/dist/entry/relay/Builder.js.map +1 -1
  187. package/dist/entry/relay/index.d.ts +4 -3
  188. package/dist/entry/relay/index.js.map +1 -1
  189. package/dist/entry/relay/resolvers/definition.d.ts +1 -1
  190. package/dist/entry/relay/resolvers/definition.js +2 -10
  191. package/dist/entry/relay/resolvers/definition.js.map +1 -1
  192. package/dist/entry/sandbox/Builder.d.ts +6 -7
  193. package/dist/entry/sandbox/Builder.js +8 -12
  194. package/dist/entry/sandbox/Builder.js.map +1 -1
  195. package/dist/entry/sandbox/TransportBuilder.d.ts +1 -1
  196. package/dist/entry/sandbox/TransportBuilder.js +4 -3
  197. package/dist/entry/sandbox/TransportBuilder.js.map +1 -1
  198. package/dist/entry/sandbox/index.d.ts +7 -2
  199. package/dist/entry/sandbox/index.js +10 -4
  200. package/dist/entry/sandbox/index.js.map +1 -1
  201. package/dist/entry/sandbox/resolvers/definition.d.ts +4 -0
  202. package/dist/entry/sandbox/resolvers/definition.js +8 -0
  203. package/dist/entry/sandbox/resolvers/definition.js.map +1 -0
  204. package/dist/entry/service/index.d.ts +1 -0
  205. package/dist/entry/service/index.js +3 -1
  206. package/dist/entry/service/index.js.map +1 -1
  207. package/dist/entry/service/resolvers/definition.d.ts +3 -0
  208. package/dist/entry/service/resolvers/definition.js +8 -0
  209. package/dist/entry/service/resolvers/definition.js.map +1 -0
  210. package/dist/entry/transport/AbstractBuilder.js +1 -1
  211. package/dist/entry/transport/AbstractBuilder.js.map +1 -1
  212. package/dist/entry/transport/resolvers/definition.d.ts +7 -5
  213. package/dist/entry/transport/resolvers/definition.js +15 -4
  214. package/dist/entry/transport/resolvers/definition.js.map +1 -1
  215. package/dist/entry/view/{core/Builder.d.ts → Builder.d.ts} +9 -4
  216. package/dist/entry/view/Builder.js +62 -0
  217. package/dist/entry/view/Builder.js.map +1 -0
  218. package/dist/entry/view/adapters/react/Builder.d.ts +6 -7
  219. package/dist/entry/view/adapters/react/Builder.js +20 -23
  220. package/dist/entry/view/adapters/react/Builder.js.map +1 -1
  221. package/dist/entry/view/adapters/react/definition.d.ts +2 -0
  222. package/dist/entry/view/adapters/react/definition.js +13 -0
  223. package/dist/entry/view/adapters/react/definition.js.map +1 -0
  224. package/dist/entry/view/adapters/react/index.d.ts +2 -1
  225. package/dist/entry/view/adapters/react/index.js +3 -1
  226. package/dist/entry/view/adapters/react/index.js.map +1 -1
  227. package/dist/entry/view/adapters/vanilla/Builder.d.ts +5 -6
  228. package/dist/entry/view/adapters/vanilla/Builder.js +14 -25
  229. package/dist/entry/view/adapters/vanilla/Builder.js.map +1 -1
  230. package/dist/entry/view/adapters/vanilla/definition.d.ts +2 -0
  231. package/dist/entry/view/adapters/vanilla/definition.js +9 -0
  232. package/dist/entry/view/adapters/vanilla/definition.js.map +1 -0
  233. package/dist/entry/view/adapters/vanilla/index.d.ts +2 -1
  234. package/dist/entry/view/adapters/vanilla/index.js +3 -1
  235. package/dist/entry/view/adapters/vanilla/index.js.map +1 -1
  236. package/dist/entry/view/{core/resolvers → resolvers}/container.d.ts +1 -1
  237. package/dist/entry/view/resolvers/container.js.map +1 -0
  238. package/dist/entry/view/resolvers/definition.d.ts +3 -0
  239. package/dist/entry/view/resolvers/definition.js +18 -0
  240. package/dist/entry/view/resolvers/definition.js.map +1 -0
  241. package/dist/locale/adapters/react/hooks/use-locale.js +1 -1
  242. package/dist/locale/adapters/react/hooks/use-locale.js.map +1 -1
  243. package/dist/locale/adapters/react/hooks/use-native-locale.js +1 -1
  244. package/dist/locale/adapters/react/hooks/use-native-locale.js.map +1 -1
  245. package/dist/locale/index.d.ts +1 -0
  246. package/dist/locale/index.js +3 -1
  247. package/dist/locale/index.js.map +1 -1
  248. package/dist/locale/{providers → observers}/ObservableLocale.js +2 -2
  249. package/dist/locale/observers/ObservableLocale.js.map +1 -0
  250. package/dist/locale/observers/index.d.ts +1 -0
  251. package/dist/locale/observers/index.js +5 -0
  252. package/dist/locale/observers/index.js.map +1 -0
  253. package/dist/locale/providers/index.d.ts +0 -1
  254. package/dist/locale/providers/index.js +1 -3
  255. package/dist/locale/providers/index.js.map +1 -1
  256. package/dist/main/config.d.ts +1 -0
  257. package/dist/main/config.js.map +1 -1
  258. package/dist/main/index.d.ts +2 -0
  259. package/dist/main/index.js +2 -0
  260. package/dist/main/index.js.map +1 -1
  261. package/dist/main/override.d.ts +5 -0
  262. package/dist/main/override.js +15 -0
  263. package/dist/main/override.js.map +1 -0
  264. package/dist/main/permissions.d.ts +1 -0
  265. package/dist/main/permissions.js +1 -0
  266. package/dist/main/relay.d.ts +1 -0
  267. package/dist/main/relay.js +2 -0
  268. package/dist/main/relay.js.map +1 -1
  269. package/dist/main/view.d.ts +1 -1
  270. package/dist/message/adapters/react/index.d.ts +1 -1
  271. package/dist/message/adapters/react/index.js +1 -1
  272. package/dist/message/adapters/react/index.js.map +1 -1
  273. package/dist/message/adapters/react/{useMessageHandler.js → use-message-handler.js} +6 -4
  274. package/dist/message/adapters/react/use-message-handler.js.map +1 -0
  275. package/dist/message/handlers/MapHandler.js +2 -1
  276. package/dist/message/handlers/MapHandler.js.map +1 -1
  277. package/dist/message/handlers/SingleHandler.js +2 -1
  278. package/dist/message/handlers/SingleHandler.js.map +1 -1
  279. package/dist/message/providers/Message.js +1 -1
  280. package/dist/message/providers/Message.js.map +1 -1
  281. package/dist/relay/RelayPermission.js +8 -2
  282. package/dist/relay/RelayPermission.js.map +1 -1
  283. package/dist/relay/adapters/RelayScriptingAdapter.d.ts +1 -0
  284. package/dist/relay/adapters/RelayScriptingAdapter.js +30 -64
  285. package/dist/relay/adapters/RelayScriptingAdapter.js.map +1 -1
  286. package/dist/relay/adapters/invoke-relay.d.ts +3 -0
  287. package/dist/relay/adapters/invoke-relay.js +69 -0
  288. package/dist/relay/adapters/invoke-relay.js.map +1 -0
  289. package/dist/relay/adapters/scripting-response.d.ts +12 -0
  290. package/dist/relay/adapters/scripting-response.js +1 -0
  291. package/dist/relay/adapters/scripting-response.js.map +1 -0
  292. package/dist/relay/result.d.ts +3 -0
  293. package/dist/relay/result.js +7 -0
  294. package/dist/relay/result.js.map +1 -1
  295. package/dist/types/action.d.ts +8 -0
  296. package/dist/types/action.js +1 -0
  297. package/dist/types/action.js.map +1 -0
  298. package/dist/types/background.d.ts +2 -8
  299. package/dist/types/background.js.map +1 -1
  300. package/dist/types/config.d.ts +17 -1
  301. package/dist/types/content/definition.d.ts +2 -1
  302. package/dist/types/entrypoint.d.ts +5 -1
  303. package/dist/types/entrypoint.js +3 -0
  304. package/dist/types/entrypoint.js.map +1 -1
  305. package/dist/types/manifest.d.ts +23 -2
  306. package/dist/types/manifest.js.map +1 -1
  307. package/dist/types/offscreen.d.ts +2 -2
  308. package/dist/types/offscreen.js.map +1 -1
  309. package/dist/types/options.d.ts +3 -2
  310. package/dist/types/override.d.ts +22 -0
  311. package/dist/types/override.js +1 -0
  312. package/dist/types/override.js.map +1 -0
  313. package/dist/types/page.d.ts +1 -1
  314. package/dist/types/permissions.d.ts +39 -0
  315. package/dist/types/permissions.js +1 -0
  316. package/dist/types/permissions.js.map +1 -0
  317. package/dist/types/plugin.d.ts +4 -1
  318. package/dist/types/popup.d.ts +5 -3
  319. package/dist/types/sandbox.d.ts +2 -2
  320. package/dist/types/sandbox.js.map +1 -1
  321. package/dist/types/sidebar.d.ts +5 -3
  322. package/dist/types/sidebar.js.map +1 -1
  323. package/dist/types/view/adapters/index.d.ts +2 -0
  324. package/dist/types/view/adapters/index.js +1 -0
  325. package/dist/types/view/adapters/index.js.map +1 -0
  326. package/dist/types/view/adapters/react.d.ts +4 -0
  327. package/dist/types/view/adapters/react.js +1 -0
  328. package/dist/types/view/adapters/react.js.map +1 -0
  329. package/dist/types/view/adapters/vanilla.d.ts +1 -0
  330. package/dist/types/view/adapters/vanilla.js +1 -0
  331. package/dist/types/view/adapters/vanilla.js.map +1 -0
  332. package/dist/types/{view.d.ts → view/common.d.ts} +2 -14
  333. package/dist/types/view/common.js +1 -0
  334. package/dist/types/view/common.js.map +1 -0
  335. package/dist/types/view/definition.d.ts +15 -0
  336. package/dist/types/view/definition.js +1 -0
  337. package/dist/types/view/definition.js.map +1 -0
  338. package/dist/types/view/index.d.ts +4 -0
  339. package/dist/types/view/index.js +1 -0
  340. package/dist/types/view/index.js.map +1 -0
  341. package/dist/types/view/render.d.ts +7 -0
  342. package/dist/types/view/render.js +1 -0
  343. package/dist/types/view/render.js.map +1 -0
  344. package/package.json +18 -31
  345. package/dist/cli/builders/app/command.js.map +0 -1
  346. package/dist/entry/background/resolvers/index.d.ts +0 -1
  347. package/dist/entry/background/resolvers/index.js +0 -2
  348. package/dist/entry/background/resolvers/index.js.map +0 -1
  349. package/dist/entry/command/resolvers/index.d.ts +0 -1
  350. package/dist/entry/command/resolvers/index.js +0 -2
  351. package/dist/entry/command/resolvers/index.js.map +0 -1
  352. package/dist/entry/content/adapters/vanilla/utils.d.ts +0 -1
  353. package/dist/entry/content/adapters/vanilla/utils.js +0 -7
  354. package/dist/entry/content/adapters/vanilla/utils.js.map +0 -1
  355. package/dist/entry/content/resolvers/index.d.ts +0 -6
  356. package/dist/entry/content/resolvers/index.js +0 -7
  357. package/dist/entry/content/resolvers/index.js.map +0 -1
  358. package/dist/entry/transport/index.d.ts +0 -1
  359. package/dist/entry/transport/index.js +0 -2
  360. package/dist/entry/transport/index.js.map +0 -1
  361. package/dist/entry/transport/resolvers/index.d.ts +0 -1
  362. package/dist/entry/transport/resolvers/index.js +0 -2
  363. package/dist/entry/transport/resolvers/index.js.map +0 -1
  364. package/dist/entry/view/adapters/react/resolvers/render.d.ts +0 -2
  365. package/dist/entry/view/adapters/react/resolvers/render.js +0 -11
  366. package/dist/entry/view/adapters/react/resolvers/render.js.map +0 -1
  367. package/dist/entry/view/core/Builder.js +0 -35
  368. package/dist/entry/view/core/Builder.js.map +0 -1
  369. package/dist/entry/view/core/resolvers/container.js.map +0 -1
  370. package/dist/entry/view/core/resolvers/definition.d.ts +0 -3
  371. package/dist/entry/view/core/resolvers/definition.js +0 -12
  372. package/dist/entry/view/core/resolvers/definition.js.map +0 -1
  373. package/dist/entry/view/core/resolvers/render.d.ts +0 -3
  374. package/dist/entry/view/core/resolvers/render.js +0 -18
  375. package/dist/entry/view/core/resolvers/render.js.map +0 -1
  376. package/dist/entry/view/index.d.ts +0 -1
  377. package/dist/entry/view/index.js +0 -2
  378. package/dist/entry/view/index.js.map +0 -1
  379. package/dist/locale/providers/ObservableLocale.js.map +0 -1
  380. package/dist/message/adapters/react/useMessageHandler.js.map +0 -1
  381. package/dist/types/view.js +0 -1
  382. package/scripts/clean-dist.js +0 -7
  383. package/scripts/copy-dts.js +0 -29
  384. package/scripts/merge-coverage.mjs +0 -12
  385. package/scripts/pre-commit.mjs +0 -22
  386. package/scripts/test-inventory.mjs +0 -38
  387. package/scripts/test-run.mjs +0 -25
  388. /package/dist/cli/virtual/{transport.d.ts → service.d.ts} +0 -0
  389. /package/dist/entry/view/{core/resolvers → resolvers}/container.js +0 -0
  390. /package/dist/locale/{providers → observers}/ObservableLocale.d.ts +0 -0
  391. /package/dist/{types/view.js.map → main/permissions.js.map} +0 -0
  392. /package/dist/message/adapters/react/{useMessageHandler.d.ts → use-message-handler.d.ts} +0 -0
@@ -78,7 +78,7 @@ class Message extends AbstractMessage {
78
78
  return false;
79
79
  }
80
80
  if (response.ok) {
81
- return "payload" in response;
81
+ return true;
82
82
  }
83
83
  return this.isSerializedError(response.error);
84
84
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/message/providers/Message.ts"],"sourcesContent":["import {getBrowserInfo, sendMessage, sendTabMessage} from \"@addon-core/browser\";\n\nimport {markRemoteMessageError, restoreError, UnsupportedMessageTargetError} from \"../error\";\n\nimport {isBrowser} from \"@main/env\";\n\nimport {\n MessageBody,\n MessageData,\n MessageDictionary,\n MessageError,\n MessageGeneralHandler,\n MessageHandler,\n MessageMapHandler,\n MessageResult,\n MessageResultEnvelopeProperty,\n MessageResponse,\n MessageSendOptions,\n MessageTargetHandler,\n MessageType,\n} from \"@typing/message\";\nimport {Browser} from \"@typing/browser\";\n\nimport AbstractMessage from \"./AbstractMessage\";\nimport MessageManager from \"../MessageManager\";\n\nimport {GeneralHandler, MapHandler, SingleHandler} from \"../handlers\";\n\nexport default class Message<T extends MessageDictionary> extends AbstractMessage<T, MessageSendOptions> {\n private static readonly FirefoxDocumentIdMinVersion = 153;\n private static instance: Message<MessageDictionary> | null = null;\n private firefoxDocumentIdVersion?: Promise<{major: number; version: string}>;\n\n public static getInstance<T extends MessageDictionary>() {\n return (this.instance ??= new Message<T>());\n }\n\n protected get manager(): MessageManager<T> {\n return MessageManager.getInstance<T>();\n }\n\n public async send<K extends MessageType<T>>(\n type: K,\n data: MessageData<T, K>,\n options?: MessageSendOptions\n ): Promise<MessageResponse<T, K>> {\n const message = this.buildMessage(type, data);\n const response = await this.dispatch(message, options);\n\n return this.unwrap(response);\n }\n\n private async dispatch<K extends MessageType<T>>(\n message: MessageBody<T, K>,\n options?: MessageSendOptions\n ): Promise<MessageResult<MessageResponse<T, K>> | MessageResponse<T, K> | undefined> {\n if (options === undefined) {\n return sendMessage(message);\n }\n\n if (typeof options === \"number\") {\n return sendTabMessage(options, message);\n }\n\n const {tabId, ...other} = options;\n\n if (other.documentId !== undefined && isBrowser(Browser.Firefox)) {\n await this.assertFirefoxDocumentTargetSupport();\n }\n\n return sendTabMessage(tabId, message, other);\n }\n\n private unwrap<K extends MessageType<T>>(\n response: MessageResult<MessageResponse<T, K>> | MessageResponse<T, K> | undefined\n ): MessageResponse<T, K> {\n if (!this.isMessageResult(response)) {\n return response as MessageResponse<T, K>;\n }\n\n if (response.ok) {\n return response.payload;\n }\n\n throw markRemoteMessageError(restoreError(response.error));\n }\n\n private async assertFirefoxDocumentTargetSupport(): Promise<void> {\n this.firefoxDocumentIdVersion ??= getBrowserInfo().then(info => {\n const major = Number.parseInt(info.version.split(\".\")[0], 10);\n\n if (!Number.isInteger(major)) {\n throw new UnsupportedMessageTargetError(\n `Cannot determine whether Firefox ${JSON.stringify(info.version)} supports documentId message targets.`\n );\n }\n\n return {major, version: info.version};\n });\n\n let browserVersion: {major: number; version: string};\n\n try {\n browserVersion = await this.firefoxDocumentIdVersion;\n } catch (error) {\n if (error instanceof UnsupportedMessageTargetError) {\n throw error;\n }\n\n throw new UnsupportedMessageTargetError(\n \"Cannot determine whether the current Firefox version supports documentId message targets.\",\n error\n );\n }\n\n if (browserVersion.major < Message.FirefoxDocumentIdMinVersion) {\n throw new UnsupportedMessageTargetError(\n `Messaging by documentId requires Firefox ${Message.FirefoxDocumentIdMinVersion} or newer; current version is ${browserVersion.version}.`\n );\n }\n }\n\n private isMessageResult(response: unknown): response is MessageResult {\n if (\n !this.isRecord(response) ||\n response[MessageResultEnvelopeProperty] !== true ||\n typeof response.ok !== \"boolean\"\n ) {\n return false;\n }\n\n if (response.ok) {\n return \"payload\" in response;\n }\n\n return this.isSerializedError(response.error);\n }\n\n private isSerializedError(error: unknown): error is MessageError {\n return (\n this.isRecord(error) &&\n typeof error.name === \"string\" &&\n typeof error.message === \"string\" &&\n (error.stack === undefined || typeof error.stack === \"string\")\n );\n }\n\n private isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null;\n }\n\n public watch<K extends MessageType<T>>(\n arg1: K | MessageMapHandler<T> | MessageGeneralHandler<T, K>,\n arg2?: MessageTargetHandler<T, K>\n ): () => void {\n let handler: MessageHandler<T>;\n\n if (typeof arg1 === \"function\") {\n handler = new GeneralHandler<T, K>(arg1);\n } else if (typeof arg1 === \"object\" && arg2 === undefined) {\n handler = new MapHandler<T>(arg1);\n } else if (typeof arg1 === \"string\" && arg2) {\n handler = new SingleHandler<T>(arg1, arg2);\n } else {\n throw new Error(\"Invalid arguments passed to watch()\");\n }\n\n this.manager.add(handler);\n\n return () => this.manager.remove(handler);\n }\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../src/message/providers/Message.ts"],"sourcesContent":["import {getBrowserInfo, sendMessage, sendTabMessage} from \"@addon-core/browser\";\n\nimport {markRemoteMessageError, restoreError, UnsupportedMessageTargetError} from \"../error\";\n\nimport {isBrowser} from \"@main/env\";\n\nimport {\n MessageBody,\n MessageData,\n MessageDictionary,\n MessageError,\n MessageGeneralHandler,\n MessageHandler,\n MessageMapHandler,\n MessageResult,\n MessageResultEnvelopeProperty,\n MessageResponse,\n MessageSendOptions,\n MessageTargetHandler,\n MessageType,\n} from \"@typing/message\";\nimport {Browser} from \"@typing/browser\";\n\nimport AbstractMessage from \"./AbstractMessage\";\nimport MessageManager from \"../MessageManager\";\n\nimport {GeneralHandler, MapHandler, SingleHandler} from \"../handlers\";\n\nexport default class Message<T extends MessageDictionary> extends AbstractMessage<T, MessageSendOptions> {\n private static readonly FirefoxDocumentIdMinVersion = 153;\n private static instance: Message<MessageDictionary> | null = null;\n private firefoxDocumentIdVersion?: Promise<{major: number; version: string}>;\n\n public static getInstance<T extends MessageDictionary>() {\n return (this.instance ??= new Message<T>());\n }\n\n protected get manager(): MessageManager<T> {\n return MessageManager.getInstance<T>();\n }\n\n public async send<K extends MessageType<T>>(\n type: K,\n data: MessageData<T, K>,\n options?: MessageSendOptions\n ): Promise<MessageResponse<T, K>> {\n const message = this.buildMessage(type, data);\n const response = await this.dispatch(message, options);\n\n return this.unwrap(response);\n }\n\n private async dispatch<K extends MessageType<T>>(\n message: MessageBody<T, K>,\n options?: MessageSendOptions\n ): Promise<MessageResult<MessageResponse<T, K>> | MessageResponse<T, K> | undefined> {\n if (options === undefined) {\n return sendMessage(message);\n }\n\n if (typeof options === \"number\") {\n return sendTabMessage(options, message);\n }\n\n const {tabId, ...other} = options;\n\n if (other.documentId !== undefined && isBrowser(Browser.Firefox)) {\n await this.assertFirefoxDocumentTargetSupport();\n }\n\n return sendTabMessage(tabId, message, other);\n }\n\n private unwrap<K extends MessageType<T>>(\n response: MessageResult<MessageResponse<T, K>> | MessageResponse<T, K> | undefined\n ): MessageResponse<T, K> {\n if (!this.isMessageResult(response)) {\n return response as MessageResponse<T, K>;\n }\n\n if (response.ok) {\n return response.payload;\n }\n\n throw markRemoteMessageError(restoreError(response.error));\n }\n\n private async assertFirefoxDocumentTargetSupport(): Promise<void> {\n this.firefoxDocumentIdVersion ??= getBrowserInfo().then(info => {\n const major = Number.parseInt(info.version.split(\".\")[0], 10);\n\n if (!Number.isInteger(major)) {\n throw new UnsupportedMessageTargetError(\n `Cannot determine whether Firefox ${JSON.stringify(info.version)} supports documentId message targets.`\n );\n }\n\n return {major, version: info.version};\n });\n\n let browserVersion: {major: number; version: string};\n\n try {\n browserVersion = await this.firefoxDocumentIdVersion;\n } catch (error) {\n if (error instanceof UnsupportedMessageTargetError) {\n throw error;\n }\n\n throw new UnsupportedMessageTargetError(\n \"Cannot determine whether the current Firefox version supports documentId message targets.\",\n error\n );\n }\n\n if (browserVersion.major < Message.FirefoxDocumentIdMinVersion) {\n throw new UnsupportedMessageTargetError(\n `Messaging by documentId requires Firefox ${Message.FirefoxDocumentIdMinVersion} or newer; current version is ${browserVersion.version}.`\n );\n }\n }\n\n private isMessageResult(response: unknown): response is MessageResult {\n if (\n !this.isRecord(response) ||\n response[MessageResultEnvelopeProperty] !== true ||\n typeof response.ok !== \"boolean\"\n ) {\n return false;\n }\n\n if (response.ok) {\n // JSON serialization omits payload when a successful handler returns undefined.\n return true;\n }\n\n return this.isSerializedError(response.error);\n }\n\n private isSerializedError(error: unknown): error is MessageError {\n return (\n this.isRecord(error) &&\n typeof error.name === \"string\" &&\n typeof error.message === \"string\" &&\n (error.stack === undefined || typeof error.stack === \"string\")\n );\n }\n\n private isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null;\n }\n\n public watch<K extends MessageType<T>>(\n arg1: K | MessageMapHandler<T> | MessageGeneralHandler<T, K>,\n arg2?: MessageTargetHandler<T, K>\n ): () => void {\n let handler: MessageHandler<T>;\n\n if (typeof arg1 === \"function\") {\n handler = new GeneralHandler<T, K>(arg1);\n } else if (typeof arg1 === \"object\" && arg2 === undefined) {\n handler = new MapHandler<T>(arg1);\n } else if (typeof arg1 === \"string\" && arg2) {\n handler = new SingleHandler<T>(arg1, arg2);\n } else {\n throw new Error(\"Invalid arguments passed to watch()\");\n }\n\n this.manager.add(handler);\n\n return () => this.manager.remove(handler);\n }\n}\n"],"mappings":"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","names":[]}
@@ -1,4 +1,10 @@
1
- import { containsPermissions, onPermissionsAdded, onPermissionsRemoved, requestPermissions } from "@addon-core/browser";
1
+ import {
2
+ containsPermissions,
3
+ getManifestVersion,
4
+ onPermissionsAdded,
5
+ onPermissionsRemoved,
6
+ requestPermissions
7
+ } from "@addon-core/browser";
2
8
  import { RelayMethod } from "./../types/relay.js";
3
9
  import { ContentScriptDeclarative } from "./../types/content/index.js";
4
10
  const RelayPermissionGlobalKey = "adnbnRelayPermission";
@@ -18,7 +24,7 @@ class RelayPermission {
18
24
  const allow = declarative === true || declarative === ContentScriptDeclarative.Required || method === RelayMethod.Messaging;
19
25
  const permissions = method === RelayMethod.Messaging ? void 0 : {
20
26
  origins: !declarative || declarative === ContentScriptDeclarative.Optional ? matches : [],
21
- permissions: ["scripting"]
27
+ permissions: getManifestVersion() === 3 ? ["scripting"] : []
22
28
  };
23
29
  this.set(name, { allow, permissions });
24
30
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/relay/RelayPermission.ts"],"sourcesContent":["import {containsPermissions, onPermissionsAdded, onPermissionsRemoved, requestPermissions} from \"@addon-core/browser\";\n\nimport {RelayMethod, RelayOptionsMap} from \"@typing/relay\";\nimport {ContentScriptDeclarative} from \"@typing/content\";\n\ntype Permissions = chrome.permissions.Permissions;\n\nexport interface RelayPermissionValue {\n allow: boolean;\n permissions?: Permissions;\n}\n\nexport const RelayPermissionGlobalKey = \"adnbnRelayPermission\";\n\nexport default class RelayPermission {\n private permissions = new Map<string, RelayPermissionValue>();\n private started = false;\n\n private constructor(relays: RelayOptionsMap) {\n this.configure(relays);\n }\n\n private configure(relays: RelayOptionsMap): void {\n for (const [name, {declarative, method, matches}] of relays) {\n if (declarative === false && method === RelayMethod.Scripting) {\n console.warn(\n `Relay \"${name}\" has invalid configuration: \"scripting\" method cannot work with declarative = false.`\n );\n }\n\n const allow: boolean =\n declarative === true ||\n declarative === ContentScriptDeclarative.Required ||\n method === RelayMethod.Messaging;\n\n const permissions: Permissions | undefined =\n method === RelayMethod.Messaging\n ? undefined\n : {\n origins: !declarative || declarative === ContentScriptDeclarative.Optional ? matches : [],\n permissions: [\"scripting\"],\n };\n\n this.set(name, {allow, permissions});\n }\n }\n\n public static getInstance(relays: RelayOptionsMap): RelayPermission {\n const current = globalThis[RelayPermissionGlobalKey] as RelayPermission | undefined;\n\n if (current) {\n return current;\n }\n\n const instance = new RelayPermission(relays);\n\n globalThis[RelayPermissionGlobalKey] = instance;\n\n return instance.start();\n }\n\n public start(): this {\n if (this.started) {\n return this;\n }\n\n this.started = true;\n\n const checkPermissions = (): void => {\n void this.check().catch(error => console.error(error));\n };\n\n onPermissionsAdded(checkPermissions);\n onPermissionsRemoved(checkPermissions);\n checkPermissions();\n\n return this;\n }\n\n public set(name: string, value: Partial<RelayPermissionValue>): this {\n const relayPermissions = this.get(name) || {allow: false, permissions: {}};\n\n this.permissions.set(name, {...relayPermissions, ...value});\n\n return this;\n }\n\n public get(name: string): RelayPermissionValue | undefined {\n return this.permissions.get(name);\n }\n\n public has(name: string): boolean {\n return this.permissions.has(name);\n }\n\n public allow(name: string): boolean {\n return this.get(name)?.allow ?? false;\n }\n\n public async contains(name: string): Promise<boolean> {\n const relayPermissions = this.get(name);\n\n if (!relayPermissions) {\n throw new Error(`RelayPermission, relay \"${name}\" not found`);\n }\n\n if (!relayPermissions.permissions) {\n return true;\n }\n\n const allow = await containsPermissions(relayPermissions.permissions);\n\n this.set(name, {allow});\n\n return allow;\n }\n\n public async request(name: string): Promise<boolean> {\n const relayPermissions = this.get(name);\n\n if (!relayPermissions) {\n throw new Error(`RelayPermission, relay \"${name}\" not found`);\n }\n\n if (!relayPermissions.permissions) {\n return true;\n }\n\n const allow = await requestPermissions(relayPermissions.permissions);\n\n this.set(name, {allow});\n\n return allow;\n }\n\n private async check(): Promise<void> {\n await Promise.allSettled([...this.permissions.keys()].map(name => this.contains(name)));\n }\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../src/relay/RelayPermission.ts"],"sourcesContent":["import {\n containsPermissions,\n getManifestVersion,\n onPermissionsAdded,\n onPermissionsRemoved,\n requestPermissions,\n} from \"@addon-core/browser\";\n\nimport {RelayMethod, RelayOptionsMap} from \"@typing/relay\";\nimport {ContentScriptDeclarative} from \"@typing/content\";\n\ntype Permissions = chrome.permissions.Permissions;\n\nexport interface RelayPermissionValue {\n allow: boolean;\n permissions?: Permissions;\n}\n\nexport const RelayPermissionGlobalKey = \"adnbnRelayPermission\";\n\nexport default class RelayPermission {\n private permissions = new Map<string, RelayPermissionValue>();\n private started = false;\n\n private constructor(relays: RelayOptionsMap) {\n this.configure(relays);\n }\n\n private configure(relays: RelayOptionsMap): void {\n for (const [name, {declarative, method, matches}] of relays) {\n if (declarative === false && method === RelayMethod.Scripting) {\n console.warn(\n `Relay \"${name}\" has invalid configuration: \"scripting\" method cannot work with declarative = false.`\n );\n }\n\n const allow: boolean =\n declarative === true ||\n declarative === ContentScriptDeclarative.Required ||\n method === RelayMethod.Messaging;\n\n const permissions: Permissions | undefined =\n method === RelayMethod.Messaging\n ? undefined\n : {\n origins: !declarative || declarative === ContentScriptDeclarative.Optional ? matches : [],\n permissions: getManifestVersion() === 3 ? [\"scripting\"] : [],\n };\n\n this.set(name, {allow, permissions});\n }\n }\n\n public static getInstance(relays: RelayOptionsMap): RelayPermission {\n const current = globalThis[RelayPermissionGlobalKey] as RelayPermission | undefined;\n\n if (current) {\n return current;\n }\n\n const instance = new RelayPermission(relays);\n\n globalThis[RelayPermissionGlobalKey] = instance;\n\n return instance.start();\n }\n\n public start(): this {\n if (this.started) {\n return this;\n }\n\n this.started = true;\n\n const checkPermissions = (): void => {\n void this.check().catch(error => console.error(error));\n };\n\n onPermissionsAdded(checkPermissions);\n onPermissionsRemoved(checkPermissions);\n checkPermissions();\n\n return this;\n }\n\n public set(name: string, value: Partial<RelayPermissionValue>): this {\n const relayPermissions = this.get(name) || {allow: false, permissions: {}};\n\n this.permissions.set(name, {...relayPermissions, ...value});\n\n return this;\n }\n\n public get(name: string): RelayPermissionValue | undefined {\n return this.permissions.get(name);\n }\n\n public has(name: string): boolean {\n return this.permissions.has(name);\n }\n\n public allow(name: string): boolean {\n return this.get(name)?.allow ?? false;\n }\n\n public async contains(name: string): Promise<boolean> {\n const relayPermissions = this.get(name);\n\n if (!relayPermissions) {\n throw new Error(`RelayPermission, relay \"${name}\" not found`);\n }\n\n if (!relayPermissions.permissions) {\n return true;\n }\n\n const allow = await containsPermissions(relayPermissions.permissions);\n\n this.set(name, {allow});\n\n return allow;\n }\n\n public async request(name: string): Promise<boolean> {\n const relayPermissions = this.get(name);\n\n if (!relayPermissions) {\n throw new Error(`RelayPermission, relay \"${name}\" not found`);\n }\n\n if (!relayPermissions.permissions) {\n return true;\n }\n\n const allow = await requestPermissions(relayPermissions.permissions);\n\n this.set(name, {allow});\n\n return allow;\n }\n\n private async check(): Promise<void> {\n await Promise.allSettled([...this.permissions.keys()].map(name => this.contains(name)));\n }\n}\n"],"mappings":"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","names":[]}
@@ -6,6 +6,7 @@ export default class RelayScriptingAdapter extends RelayAdapter {
6
6
  private get injectScript();
7
7
  invoke(args: any[], path?: string): Promise<any>;
8
8
  private normalize;
9
+ private isResponse;
9
10
  private resultTarget;
10
11
  private unwrap;
11
12
  private injectScriptOptions;
@@ -5,8 +5,15 @@ import {
5
5
  RelayFrameErrorKind,
6
6
  RelayGlobalKey
7
7
  } from "./../../types/relay.js";
8
- import { fulfilledRelayFrame, injectScriptErrorKind, rejectedRelayFrame, sortRelayFrameResults } from "../result.js";
8
+ import {
9
+ RelayProtocolError,
10
+ fulfilledRelayFrame,
11
+ injectScriptErrorKind,
12
+ rejectedRelayFrame,
13
+ sortRelayFrameResults
14
+ } from "../result.js";
9
15
  import RelayAdapter from "./RelayAdapter.js";
16
+ import { invokeRelay } from "./invoke-relay.js";
10
17
  class RelayScriptingAdapter extends RelayAdapter {
11
18
  _injectScript;
12
19
  constructor(name, target) {
@@ -16,68 +23,6 @@ class RelayScriptingAdapter extends RelayAdapter {
16
23
  return this._injectScript ?? (this._injectScript = injectScriptFactory(this.injectScriptOptions()));
17
24
  }
18
25
  async invoke(args, path) {
19
- const func = (name, path2, args2, key, retryManager) => {
20
- const serialize = (error) => {
21
- if (error instanceof Error) {
22
- return {
23
- name: error.name,
24
- message: error.message,
25
- ...error.stack ? { stack: error.stack } : {}
26
- };
27
- }
28
- if (typeof error === "object" && error !== null) {
29
- const record = error;
30
- return {
31
- name: typeof record.name === "string" ? record.name : "Error",
32
- message: typeof record.message === "string" ? record.message : (() => {
33
- try {
34
- return JSON.stringify(error) ?? String(error);
35
- } catch {
36
- return String(error);
37
- }
38
- })(),
39
- ...typeof record.stack === "string" ? { stack: record.stack } : {}
40
- };
41
- }
42
- return { name: "Error", message: String(error) };
43
- };
44
- const invoke = (manager2) => {
45
- try {
46
- return Promise.resolve(manager2.property(name, { path: path2, args: args2 })).then(
47
- (result) => result === void 0 ? { ok: true, hasResult: false } : { ok: true, hasResult: true, result },
48
- (error) => ({ ok: false, error: serialize(error) })
49
- );
50
- } catch (error) {
51
- return Promise.resolve({ ok: false, error: serialize(error) });
52
- }
53
- };
54
- const manager = globalThis[key];
55
- if (manager) {
56
- return invoke(manager);
57
- }
58
- if (!retryManager) {
59
- return Promise.reject(new Error("Relay manager not found."));
60
- }
61
- return new Promise((resolve, reject) => {
62
- const maxAttempts = 10;
63
- const delay = 300;
64
- let attempts = 0;
65
- const findManager = () => {
66
- const delayedManager = globalThis[key];
67
- if (delayedManager) {
68
- resolve(invoke(delayedManager));
69
- return;
70
- }
71
- attempts++;
72
- if (attempts >= maxAttempts) {
73
- reject(new Error(`Relay manager not found after ${maxAttempts} attempts.`));
74
- return;
75
- }
76
- setTimeout(findManager, delay);
77
- };
78
- findManager();
79
- });
80
- };
81
26
  const scriptArgs = [
82
27
  this.name,
83
28
  path ?? null,
@@ -85,7 +30,7 @@ class RelayScriptingAdapter extends RelayAdapter {
85
30
  RelayGlobalKey,
86
31
  !this.isAnyFramesTarget()
87
32
  ];
88
- const outcomes = await this.injectScript.run(func, scriptArgs);
33
+ const outcomes = await this.injectScript.run(invokeRelay, scriptArgs);
89
34
  const results = this.normalize(outcomes);
90
35
  if (this.isAnyFramesTarget()) {
91
36
  const result = results.find((result2) => result2.status === "fulfilled") ?? results[0];
@@ -108,6 +53,13 @@ class RelayScriptingAdapter extends RelayAdapter {
108
53
  if (!outcome.success) {
109
54
  return rejectedRelayFrame(target, outcome.error, injectScriptErrorKind(outcome.error.kind));
110
55
  }
56
+ if (!this.isResponse(outcome.value)) {
57
+ const error = new RelayProtocolError(this.name);
58
+ if (!this.isBatchTarget(this.target)) {
59
+ throw error;
60
+ }
61
+ return rejectedRelayFrame(target, error, RelayFrameErrorKind.Execution);
62
+ }
111
63
  if (!outcome.value.ok) {
112
64
  return rejectedRelayFrame(target, outcome.value.error, RelayFrameErrorKind.Remote);
113
65
  }
@@ -115,6 +67,20 @@ class RelayScriptingAdapter extends RelayAdapter {
115
67
  })
116
68
  );
117
69
  }
70
+ isResponse(value) {
71
+ if (typeof value !== "object" || value === null || Array.isArray(value)) {
72
+ return false;
73
+ }
74
+ const response = value;
75
+ if (response.ok === true) {
76
+ return response.hasResult === false ? !Object.hasOwn(response, "result") : response.hasResult === true && Object.hasOwn(response, "result");
77
+ }
78
+ if (response.ok !== false || typeof response.error !== "object" || response.error === null || Array.isArray(response.error)) {
79
+ return false;
80
+ }
81
+ const error = response.error;
82
+ return typeof error.name === "string" && typeof error.message === "string" && (error.stack === void 0 || typeof error.stack === "string");
83
+ }
118
84
  resultTarget(target) {
119
85
  if (target.allFrames === true) {
120
86
  return {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/relay/adapters/RelayScriptingAdapter.ts"],"sourcesContent":["import injectScriptFactory, {\n type InjectScriptContract,\n type InjectScriptOptions,\n type InjectScriptResult,\n type InjectScriptResultTarget,\n type InjectScriptTarget,\n type JsonValue,\n} from \"@addon-core/inject-script\";\n\nimport {restoreError} from \"@message/error\";\n\nimport type {MessageError} from \"@typing/message\";\nimport {\n RelayAllFrames,\n RelayFrameErrorKind,\n RelayGlobalKey,\n type RelayCallOptions,\n type RelayDocumentOptions,\n type RelayFrameOptions,\n type RelayFramesResult,\n type RelayResultTarget,\n type RelayScalarOptions,\n} from \"@typing/relay\";\n\nimport {fulfilledRelayFrame, injectScriptErrorKind, rejectedRelayFrame, sortRelayFrameResults} from \"../result\";\nimport RelayAdapter from \"./RelayAdapter\";\n\ntype RelayInvocationResult =\n | {\n ok: true;\n hasResult: false;\n }\n | {\n ok: true;\n hasResult: true;\n result: any;\n }\n | {\n ok: false;\n error: MessageError;\n };\n\nexport default class RelayScriptingAdapter extends RelayAdapter {\n private _injectScript?: InjectScriptContract;\n\n public constructor(name: string, target: RelayCallOptions) {\n super(name, target);\n }\n\n private get injectScript(): InjectScriptContract {\n return (this._injectScript ??= injectScriptFactory(this.injectScriptOptions()));\n }\n\n public async invoke(args: any[], path?: string): Promise<any> {\n const func = (\n name: string,\n path: string | null,\n args: JsonValue[],\n key: string,\n retryManager: boolean\n ): Promise<RelayInvocationResult> => {\n const serialize = (error: unknown): MessageError => {\n if (error instanceof Error) {\n return {\n name: error.name,\n message: error.message,\n ...(error.stack ? {stack: error.stack} : {}),\n };\n }\n\n if (typeof error === \"object\" && error !== null) {\n const record = error as Record<string, unknown>;\n\n return {\n name: typeof record.name === \"string\" ? record.name : \"Error\",\n message:\n typeof record.message === \"string\"\n ? record.message\n : (() => {\n try {\n return JSON.stringify(error) ?? String(error);\n } catch {\n return String(error);\n }\n })(),\n ...(typeof record.stack === \"string\" ? {stack: record.stack} : {}),\n };\n }\n\n return {name: \"Error\", message: String(error)};\n };\n\n const invoke = (manager: any): Promise<RelayInvocationResult> => {\n try {\n return Promise.resolve(manager.property(name, {path, args})).then(\n result =>\n result === undefined\n ? {ok: true as const, hasResult: false as const}\n : {ok: true as const, hasResult: true as const, result},\n error => ({ok: false as const, error: serialize(error)})\n );\n } catch (error) {\n return Promise.resolve({ok: false as const, error: serialize(error)});\n }\n };\n\n const manager = globalThis[key];\n\n if (manager) {\n // Keep the normal Scripting path synchronous until the remote method starts.\n return invoke(manager);\n }\n\n if (!retryManager) {\n return Promise.reject(new Error(\"Relay manager not found.\"));\n }\n\n return new Promise<RelayInvocationResult>((resolve, reject) => {\n const maxAttempts = 10;\n const delay = 300;\n let attempts = 0;\n\n const findManager = () => {\n const delayedManager = globalThis[key];\n\n if (delayedManager) {\n resolve(invoke(delayedManager));\n return;\n }\n\n attempts++;\n\n if (attempts >= maxAttempts) {\n reject(new Error(`Relay manager not found after ${maxAttempts} attempts.`));\n return;\n }\n\n setTimeout(findManager, delay);\n };\n\n findManager();\n });\n };\n\n const scriptArgs: [string, string | null, JsonValue[], string, boolean] = [\n this.name,\n path ?? null,\n args as JsonValue[],\n RelayGlobalKey,\n !this.isAnyFramesTarget(),\n ];\n const outcomes = await this.injectScript.run(func, scriptArgs);\n const results = this.normalize(outcomes);\n\n if (this.isAnyFramesTarget()) {\n const result = results.find(result => result.status === \"fulfilled\") ?? results[0];\n\n return result\n ? [\n {\n ...result,\n target: {tabId: this.target.tabId, allFrames: RelayAllFrames.Any},\n },\n ]\n : [];\n }\n\n if (this.isBatchTarget(this.target)) {\n return results;\n }\n\n return this.unwrap(results);\n }\n\n private normalize(outcomes: readonly InjectScriptResult<RelayInvocationResult>[]): RelayFramesResult<any> {\n return sortRelayFrameResults(\n outcomes.map(outcome => {\n const target = this.resultTarget(outcome.target);\n\n if (!outcome.success) {\n return rejectedRelayFrame(target, outcome.error, injectScriptErrorKind(outcome.error.kind));\n }\n\n if (!outcome.value.ok) {\n return rejectedRelayFrame(target, outcome.value.error, RelayFrameErrorKind.Remote);\n }\n\n return fulfilledRelayFrame(target, outcome.value.hasResult ? outcome.value.result : undefined);\n })\n );\n }\n\n private resultTarget(target: InjectScriptResultTarget): RelayResultTarget {\n if (target.allFrames === true) {\n return {\n tabId: target.tabId,\n allFrames: this.target.allFrames === RelayAllFrames.All ? RelayAllFrames.All : RelayAllFrames.Any,\n };\n }\n\n return target;\n }\n\n private unwrap(results: RelayFramesResult<any>): any {\n const result = results[0];\n\n if (!result) {\n throw new Error(`Relay \"${this.name}\" did not return a frame result.`);\n }\n\n if (result.status === \"fulfilled\") {\n return result.result;\n }\n\n throw restoreError(result.error);\n }\n\n private injectScriptOptions(): InjectScriptOptions {\n let injectTarget: InjectScriptTarget;\n\n if (\n this.target.allFrames === true ||\n this.target.allFrames === RelayAllFrames.Any ||\n this.target.allFrames === RelayAllFrames.All\n ) {\n injectTarget = {tabId: this.target.tabId, allFrames: true};\n } else if (this.target.frameIds !== undefined) {\n injectTarget = {tabId: this.target.tabId, frameIds: this.target.frameIds};\n } else if (this.target.documentIds !== undefined) {\n injectTarget = {tabId: this.target.tabId, documentIds: this.target.documentIds};\n } else if (this.isFrameTarget(this.target)) {\n injectTarget = {tabId: this.target.tabId, frameIds: [this.target.frameId]};\n } else if (this.isDocumentTarget(this.target)) {\n injectTarget = {tabId: this.target.tabId, documentIds: [this.target.documentId]};\n } else {\n injectTarget = {tabId: (this.target as RelayScalarOptions).tabId};\n }\n\n return {\n target: injectTarget,\n ...(this.target.timeoutMs === undefined ? {} : {timeoutMs: this.target.timeoutMs}),\n };\n }\n\n private isFrameTarget(target: RelayCallOptions): target is RelayFrameOptions {\n return target.frameId !== undefined;\n }\n\n private isDocumentTarget(target: RelayCallOptions): target is RelayDocumentOptions {\n return target.documentId !== undefined;\n }\n\n private isAnyFramesTarget(): boolean {\n return this.target.allFrames === true || this.target.allFrames === RelayAllFrames.Any;\n }\n}\n"],"mappings":"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","names":["path","args","manager","result"]}
1
+ {"version":3,"sources":["../../../src/relay/adapters/RelayScriptingAdapter.ts"],"sourcesContent":["import injectScriptFactory, {\n type InjectScriptContract,\n type InjectScriptOptions,\n type InjectScriptResult,\n type InjectScriptResultTarget,\n type InjectScriptTarget,\n type JsonValue,\n} from \"@addon-core/inject-script\";\n\nimport {restoreError} from \"@message/error\";\n\nimport {\n RelayAllFrames,\n RelayFrameErrorKind,\n RelayGlobalKey,\n type RelayCallOptions,\n type RelayDocumentOptions,\n type RelayFrameOptions,\n type RelayFramesResult,\n type RelayResultTarget,\n type RelayScalarOptions,\n} from \"@typing/relay\";\n\nimport {\n RelayProtocolError,\n fulfilledRelayFrame,\n injectScriptErrorKind,\n rejectedRelayFrame,\n sortRelayFrameResults,\n} from \"../result\";\nimport RelayAdapter from \"./RelayAdapter\";\nimport {invokeRelay} from \"./invoke-relay\";\nimport type {RelayInvocationResult} from \"./scripting-response\";\n\nexport default class RelayScriptingAdapter extends RelayAdapter {\n private _injectScript?: InjectScriptContract;\n\n public constructor(name: string, target: RelayCallOptions) {\n super(name, target);\n }\n\n private get injectScript(): InjectScriptContract {\n return (this._injectScript ??= injectScriptFactory(this.injectScriptOptions()));\n }\n\n public async invoke(args: any[], path?: string): Promise<any> {\n const scriptArgs: [string, string | null, JsonValue[], string, boolean] = [\n this.name,\n path ?? null,\n args as JsonValue[],\n RelayGlobalKey,\n !this.isAnyFramesTarget(),\n ];\n const outcomes = await this.injectScript.run(invokeRelay, scriptArgs);\n const results = this.normalize(outcomes);\n\n if (this.isAnyFramesTarget()) {\n const result = results.find(result => result.status === \"fulfilled\") ?? results[0];\n\n return result\n ? [\n {\n ...result,\n target: {tabId: this.target.tabId, allFrames: RelayAllFrames.Any},\n },\n ]\n : [];\n }\n\n if (this.isBatchTarget(this.target)) {\n return results;\n }\n\n return this.unwrap(results);\n }\n\n private normalize(outcomes: readonly InjectScriptResult<unknown>[]): RelayFramesResult<any> {\n return sortRelayFrameResults(\n outcomes.map(outcome => {\n const target = this.resultTarget(outcome.target);\n\n if (!outcome.success) {\n return rejectedRelayFrame(target, outcome.error, injectScriptErrorKind(outcome.error.kind));\n }\n\n if (!this.isResponse(outcome.value)) {\n const error = new RelayProtocolError(this.name);\n\n if (!this.isBatchTarget(this.target)) {\n throw error;\n }\n\n return rejectedRelayFrame(target, error, RelayFrameErrorKind.Execution);\n }\n\n if (!outcome.value.ok) {\n return rejectedRelayFrame(target, outcome.value.error, RelayFrameErrorKind.Remote);\n }\n\n return fulfilledRelayFrame(target, outcome.value.hasResult ? outcome.value.result : undefined);\n })\n );\n }\n\n private isResponse(value: unknown): value is RelayInvocationResult {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) {\n return false;\n }\n\n const response = value as Record<string, unknown>;\n\n if (response.ok === true) {\n return response.hasResult === false\n ? !Object.hasOwn(response, \"result\")\n : response.hasResult === true && Object.hasOwn(response, \"result\");\n }\n\n if (\n response.ok !== false ||\n typeof response.error !== \"object\" ||\n response.error === null ||\n Array.isArray(response.error)\n ) {\n return false;\n }\n\n const error = response.error as Record<string, unknown>;\n\n return (\n typeof error.name === \"string\" &&\n typeof error.message === \"string\" &&\n (error.stack === undefined || typeof error.stack === \"string\")\n );\n }\n\n private resultTarget(target: InjectScriptResultTarget): RelayResultTarget {\n if (target.allFrames === true) {\n return {\n tabId: target.tabId,\n allFrames: this.target.allFrames === RelayAllFrames.All ? RelayAllFrames.All : RelayAllFrames.Any,\n };\n }\n\n return target;\n }\n\n private unwrap(results: RelayFramesResult<any>): any {\n const result = results[0];\n\n if (!result) {\n throw new Error(`Relay \"${this.name}\" did not return a frame result.`);\n }\n\n if (result.status === \"fulfilled\") {\n return result.result;\n }\n\n throw restoreError(result.error);\n }\n\n private injectScriptOptions(): InjectScriptOptions {\n let injectTarget: InjectScriptTarget;\n\n if (\n this.target.allFrames === true ||\n this.target.allFrames === RelayAllFrames.Any ||\n this.target.allFrames === RelayAllFrames.All\n ) {\n injectTarget = {tabId: this.target.tabId, allFrames: true};\n } else if (this.target.frameIds !== undefined) {\n injectTarget = {tabId: this.target.tabId, frameIds: this.target.frameIds};\n } else if (this.target.documentIds !== undefined) {\n injectTarget = {tabId: this.target.tabId, documentIds: this.target.documentIds};\n } else if (this.isFrameTarget(this.target)) {\n injectTarget = {tabId: this.target.tabId, frameIds: [this.target.frameId]};\n } else if (this.isDocumentTarget(this.target)) {\n injectTarget = {tabId: this.target.tabId, documentIds: [this.target.documentId]};\n } else {\n injectTarget = {tabId: (this.target as RelayScalarOptions).tabId};\n }\n\n return {\n target: injectTarget,\n ...(this.target.timeoutMs === undefined ? {} : {timeoutMs: this.target.timeoutMs}),\n };\n }\n\n private isFrameTarget(target: RelayCallOptions): target is RelayFrameOptions {\n return target.frameId !== undefined;\n }\n\n private isDocumentTarget(target: RelayCallOptions): target is RelayDocumentOptions {\n return target.documentId !== undefined;\n }\n\n private isAnyFramesTarget(): boolean {\n return this.target.allFrames === true || this.target.allFrames === RelayAllFrames.Any;\n }\n}\n"],"mappings":"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","names":["result"]}
@@ -0,0 +1,3 @@
1
+ import type { JsonValue } from "@addon-core/inject-script";
2
+ import type { RelayInvocationResult } from "./scripting-response.js";
3
+ export declare const invokeRelay: (name: string, path: string | null, args: JsonValue[], key: string, retryManager: boolean) => Promise<RelayInvocationResult>;
@@ -0,0 +1,69 @@
1
+ const invokeRelay = (name, path, args, key, retryManager) => {
2
+ const serialize = (error) => {
3
+ if (error instanceof Error) {
4
+ return {
5
+ name: error.name,
6
+ message: error.message,
7
+ ...error.stack ? { stack: error.stack } : {}
8
+ };
9
+ }
10
+ if (typeof error === "object" && error !== null) {
11
+ const record = error;
12
+ return {
13
+ name: typeof record.name === "string" ? record.name : "Error",
14
+ message: typeof record.message === "string" ? record.message : (() => {
15
+ try {
16
+ return JSON.stringify(error) ?? String(error);
17
+ } catch {
18
+ return String(error);
19
+ }
20
+ })(),
21
+ ...typeof record.stack === "string" ? { stack: record.stack } : {}
22
+ };
23
+ }
24
+ return { name: "Error", message: String(error) };
25
+ };
26
+ const invoke = (manager2) => {
27
+ try {
28
+ return Promise.resolve(manager2.property(name, { path, args })).then(
29
+ (result) => result === void 0 ? { ok: true, hasResult: false } : { ok: true, hasResult: true, result },
30
+ (error) => ({ ok: false, error: serialize(error) })
31
+ );
32
+ } catch (error) {
33
+ return Promise.resolve({ ok: false, error: serialize(error) });
34
+ }
35
+ };
36
+ const manager = globalThis[key];
37
+ if (manager) {
38
+ return invoke(manager);
39
+ }
40
+ if (!retryManager) {
41
+ return Promise.resolve({ ok: false, error: serialize(new Error("Relay manager not found.")) });
42
+ }
43
+ return new Promise((resolve) => {
44
+ const maxAttempts = 10;
45
+ const delay = 300;
46
+ let attempts = 1;
47
+ const findManager = () => {
48
+ const delayedManager = globalThis[key];
49
+ if (delayedManager) {
50
+ resolve(invoke(delayedManager));
51
+ return;
52
+ }
53
+ attempts++;
54
+ if (attempts >= maxAttempts) {
55
+ resolve({
56
+ ok: false,
57
+ error: serialize(new Error(`Relay manager not found after ${maxAttempts} attempts.`))
58
+ });
59
+ return;
60
+ }
61
+ setTimeout(findManager, delay);
62
+ };
63
+ setTimeout(findManager, delay);
64
+ });
65
+ };
66
+ export {
67
+ invokeRelay
68
+ };
69
+ //# sourceMappingURL=invoke-relay.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/relay/adapters/invoke-relay.ts"],"sourcesContent":["import type {JsonValue} from \"@addon-core/inject-script\";\nimport type {MessageError} from \"@typing/message\";\nimport type {RelayInvocationResult} from \"./scripting-response\";\n\n// Serialized by scripting.executeScript: all runtime dependencies must stay inside this function.\nexport const invokeRelay = (\n name: string,\n path: string | null,\n args: JsonValue[],\n key: string,\n retryManager: boolean\n): Promise<RelayInvocationResult> => {\n const serialize = (error: unknown): MessageError => {\n if (error instanceof Error) {\n return {\n name: error.name,\n message: error.message,\n ...(error.stack ? {stack: error.stack} : {}),\n };\n }\n\n if (typeof error === \"object\" && error !== null) {\n const record = error as Record<string, unknown>;\n\n return {\n name: typeof record.name === \"string\" ? record.name : \"Error\",\n message:\n typeof record.message === \"string\"\n ? record.message\n : (() => {\n try {\n return JSON.stringify(error) ?? String(error);\n } catch {\n return String(error);\n }\n })(),\n ...(typeof record.stack === \"string\" ? {stack: record.stack} : {}),\n };\n }\n\n return {name: \"Error\", message: String(error)};\n };\n\n const invoke = (manager: any): Promise<RelayInvocationResult> => {\n try {\n return Promise.resolve(manager.property(name, {path, args})).then(\n result =>\n result === undefined\n ? {ok: true as const, hasResult: false as const}\n : {ok: true as const, hasResult: true as const, result},\n error => ({ok: false as const, error: serialize(error)})\n );\n } catch (error) {\n return Promise.resolve({ok: false as const, error: serialize(error)});\n }\n };\n\n const manager = globalThis[key];\n\n if (manager) {\n // Keep the normal Scripting path synchronous until the remote method starts.\n return invoke(manager);\n }\n\n if (!retryManager) {\n return Promise.resolve({ok: false, error: serialize(new Error(\"Relay manager not found.\"))});\n }\n\n return new Promise<RelayInvocationResult>(resolve => {\n const maxAttempts = 10;\n const delay = 300;\n // The synchronous lookup above is the first attempt.\n let attempts = 1;\n\n const findManager = () => {\n const delayedManager = globalThis[key];\n\n if (delayedManager) {\n resolve(invoke(delayedManager));\n\n return;\n }\n\n attempts++;\n\n if (attempts >= maxAttempts) {\n resolve({\n ok: false,\n error: serialize(new Error(`Relay manager not found after ${maxAttempts} attempts.`)),\n });\n\n return;\n }\n\n setTimeout(findManager, delay);\n };\n\n setTimeout(findManager, delay);\n });\n};\n"],"mappings":"AAKO,MAAM,cAAc,CACvB,MACA,MACA,MACA,KACA,iBACiC;AACjC,QAAM,YAAY,CAAC,UAAiC;AAChD,QAAI,iBAAiB,OAAO;AACxB,aAAO;AAAA,QACH,MAAM,MAAM;AAAA,QACZ,SAAS,MAAM;AAAA,QACf,GAAI,MAAM,QAAQ,EAAC,OAAO,MAAM,MAAK,IAAI,CAAC;AAAA,MAC9C;AAAA,IACJ;AAEA,QAAI,OAAO,UAAU,YAAY,UAAU,MAAM;AAC7C,YAAM,SAAS;AAEf,aAAO;AAAA,QACH,MAAM,OAAO,OAAO,SAAS,WAAW,OAAO,OAAO;AAAA,QACtD,SACI,OAAO,OAAO,YAAY,WACpB,OAAO,WACN,MAAM;AACH,cAAI;AACA,mBAAO,KAAK,UAAU,KAAK,KAAK,OAAO,KAAK;AAAA,UAChD,QAAQ;AACJ,mBAAO,OAAO,KAAK;AAAA,UACvB;AAAA,QACJ,GAAG;AAAA,QACb,GAAI,OAAO,OAAO,UAAU,WAAW,EAAC,OAAO,OAAO,MAAK,IAAI,CAAC;AAAA,MACpE;AAAA,IACJ;AAEA,WAAO,EAAC,MAAM,SAAS,SAAS,OAAO,KAAK,EAAC;AAAA,EACjD;AAEA,QAAM,SAAS,CAACA,aAAiD;AAC7D,QAAI;AACA,aAAO,QAAQ,QAAQA,SAAQ,SAAS,MAAM,EAAC,MAAM,KAAI,CAAC,CAAC,EAAE;AAAA,QACzD,YACI,WAAW,SACL,EAAC,IAAI,MAAe,WAAW,MAAc,IAC7C,EAAC,IAAI,MAAe,WAAW,MAAe,OAAM;AAAA,QAC9D,YAAU,EAAC,IAAI,OAAgB,OAAO,UAAU,KAAK,EAAC;AAAA,MAC1D;AAAA,IACJ,SAAS,OAAO;AACZ,aAAO,QAAQ,QAAQ,EAAC,IAAI,OAAgB,OAAO,UAAU,KAAK,EAAC,CAAC;AAAA,IACxE;AAAA,EACJ;AAEA,QAAM,UAAU,WAAW,GAAG;AAE9B,MAAI,SAAS;AAET,WAAO,OAAO,OAAO;AAAA,EACzB;AAEA,MAAI,CAAC,cAAc;AACf,WAAO,QAAQ,QAAQ,EAAC,IAAI,OAAO,OAAO,UAAU,IAAI,MAAM,0BAA0B,CAAC,EAAC,CAAC;AAAA,EAC/F;AAEA,SAAO,IAAI,QAA+B,aAAW;AACjD,UAAM,cAAc;AACpB,UAAM,QAAQ;AAEd,QAAI,WAAW;AAEf,UAAM,cAAc,MAAM;AACtB,YAAM,iBAAiB,WAAW,GAAG;AAErC,UAAI,gBAAgB;AAChB,gBAAQ,OAAO,cAAc,CAAC;AAE9B;AAAA,MACJ;AAEA;AAEA,UAAI,YAAY,aAAa;AACzB,gBAAQ;AAAA,UACJ,IAAI;AAAA,UACJ,OAAO,UAAU,IAAI,MAAM,iCAAiC,WAAW,YAAY,CAAC;AAAA,QACxF,CAAC;AAED;AAAA,MACJ;AAEA,iBAAW,aAAa,KAAK;AAAA,IACjC;AAEA,eAAW,aAAa,KAAK;AAAA,EACjC,CAAC;AACL;","names":["manager"]}
@@ -0,0 +1,12 @@
1
+ import type { MessageError } from "../../types/message.js";
2
+ export type RelayInvocationResult = {
3
+ ok: true;
4
+ hasResult: false;
5
+ } | {
6
+ ok: true;
7
+ hasResult: true;
8
+ result: any;
9
+ } | {
10
+ ok: false;
11
+ error: MessageError;
12
+ };
@@ -0,0 +1 @@
1
+ //# sourceMappingURL=scripting-response.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -4,6 +4,9 @@ export declare class RelayFrameTimeoutError extends Error {
4
4
  readonly timeoutMs: number;
5
5
  constructor(timeoutMs: number);
6
6
  }
7
+ export declare class RelayProtocolError extends Error {
8
+ constructor(relayName: string);
9
+ }
7
10
  export declare const fulfilledRelayFrame: <T>(target: RelayResultTarget, result: T) => RelayFrameResult<T>;
8
11
  export declare const rejectedRelayFrame: <T>(target: RelayResultTarget, error: unknown, kind: RelayFrameErrorKind) => RelayFrameResult<T>;
9
12
  export declare const messageErrorKind: (error: unknown) => RelayFrameErrorKind;
@@ -11,6 +11,12 @@ class RelayFrameTimeoutError extends Error {
11
11
  }
12
12
  timeoutMs;
13
13
  }
14
+ class RelayProtocolError extends Error {
15
+ constructor(relayName) {
16
+ super(`Relay "${relayName}" returned an invalid scripting response envelope.`);
17
+ this.name = "RelayProtocolError";
18
+ }
19
+ }
14
20
  const fulfilledRelayFrame = (target, result) => ({
15
21
  target,
16
22
  status: "fulfilled",
@@ -78,6 +84,7 @@ const sortRelayFrameResults = (results) => {
78
84
  };
79
85
  export {
80
86
  RelayFrameTimeoutError,
87
+ RelayProtocolError,
81
88
  fulfilledRelayFrame,
82
89
  injectScriptErrorKind,
83
90
  messageErrorKind,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/relay/result.ts"],"sourcesContent":["import {serializeError} from \"@message/error\";\n\nimport {InjectScriptTargetErrorKind} from \"@addon-core/inject-script\";\n\nimport {\n RelayFrameErrorKind,\n type RelayFrameResult,\n type RelayFramesResult,\n type RelayResultTarget,\n} from \"@typing/relay\";\n\nexport class RelayFrameTimeoutError extends Error {\n public constructor(public readonly timeoutMs: number) {\n super(`Relay frame did not respond within ${timeoutMs}ms.`);\n this.name = \"RelayFrameTimeoutError\";\n }\n}\n\nexport const fulfilledRelayFrame = <T>(target: RelayResultTarget, result: T): RelayFrameResult<T> => ({\n target,\n status: \"fulfilled\",\n result,\n});\n\nexport const rejectedRelayFrame = <T>(\n target: RelayResultTarget,\n error: unknown,\n kind: RelayFrameErrorKind\n): RelayFrameResult<T> => ({\n target,\n status: \"rejected\",\n error: {\n kind,\n ...serializeError(error),\n },\n});\n\nexport const messageErrorKind = (error: unknown): RelayFrameErrorKind => {\n const message = error instanceof Error ? error.message : String(error);\n\n if (\n /receiving end does not exist|no matching message handler|frame.*(?:removed|not found)|no frame with id|invalid frame id/i.test(\n message\n )\n ) {\n return RelayFrameErrorKind.TargetGone;\n }\n\n return RelayFrameErrorKind.Delivery;\n};\n\nexport const injectScriptErrorKind = (kind: `${InjectScriptTargetErrorKind}`): RelayFrameErrorKind => {\n switch (kind) {\n case InjectScriptTargetErrorKind.Execution:\n return RelayFrameErrorKind.Execution;\n case InjectScriptTargetErrorKind.Delivery:\n return RelayFrameErrorKind.Delivery;\n case InjectScriptTargetErrorKind.Timeout:\n return RelayFrameErrorKind.Timeout;\n case InjectScriptTargetErrorKind.TargetGone:\n return RelayFrameErrorKind.TargetGone;\n case InjectScriptTargetErrorKind.Unobservable:\n return RelayFrameErrorKind.Unobservable;\n default:\n throw new TypeError(`Unsupported Inject Script target error kind: ${kind}`);\n }\n};\n\nexport const withRelayTimeout = <T>(promise: Promise<T>, timeoutMs?: number): Promise<T> => {\n if (timeoutMs === undefined) {\n return promise;\n }\n\n return new Promise<T>((resolve, reject) => {\n const timeout = setTimeout(() => reject(new RelayFrameTimeoutError(timeoutMs)), timeoutMs);\n\n promise.then(\n result => {\n clearTimeout(timeout);\n resolve(result);\n },\n error => {\n clearTimeout(timeout);\n reject(error);\n }\n );\n });\n};\n\nexport const sortRelayFrameResults = <T>(results: RelayFramesResult<T>): RelayFramesResult<T> => {\n return [...results].sort((a, b) => {\n const frameDifference =\n (a.target.frameId ?? Number.MAX_SAFE_INTEGER) - (b.target.frameId ?? Number.MAX_SAFE_INTEGER);\n\n if (frameDifference !== 0) {\n return frameDifference;\n }\n\n return (a.target.documentId ?? \"\").localeCompare(b.target.documentId ?? \"\");\n });\n};\n"],"mappings":"AAAA,SAAQ,sBAAqB;AAE7B,SAAQ,mCAAkC;AAE1C;AAAA,EACI;AAAA,OAIG;AAEA,MAAM,+BAA+B,MAAM;AAAA,EACvC,YAA4B,WAAmB;AAClD,UAAM,sCAAsC,SAAS,KAAK;AAD3B;AAE/B,SAAK,OAAO;AAAA,EAChB;AAAA,EAHmC;AAIvC;AAEO,MAAM,sBAAsB,CAAI,QAA2B,YAAoC;AAAA,EAClG;AAAA,EACA,QAAQ;AAAA,EACR;AACJ;AAEO,MAAM,qBAAqB,CAC9B,QACA,OACA,UACuB;AAAA,EACvB;AAAA,EACA,QAAQ;AAAA,EACR,OAAO;AAAA,IACH;AAAA,IACA,GAAG,eAAe,KAAK;AAAA,EAC3B;AACJ;AAEO,MAAM,mBAAmB,CAAC,UAAwC;AACrE,QAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAErE,MACI,2HAA2H;AAAA,IACvH;AAAA,EACJ,GACF;AACE,WAAO,oBAAoB;AAAA,EAC/B;AAEA,SAAO,oBAAoB;AAC/B;AAEO,MAAM,wBAAwB,CAAC,SAAgE;AAClG,UAAQ,MAAM;AAAA,IACV,KAAK,4BAA4B;AAC7B,aAAO,oBAAoB;AAAA,IAC/B,KAAK,4BAA4B;AAC7B,aAAO,oBAAoB;AAAA,IAC/B,KAAK,4BAA4B;AAC7B,aAAO,oBAAoB;AAAA,IAC/B,KAAK,4BAA4B;AAC7B,aAAO,oBAAoB;AAAA,IAC/B,KAAK,4BAA4B;AAC7B,aAAO,oBAAoB;AAAA,IAC/B;AACI,YAAM,IAAI,UAAU,gDAAgD,IAAI,EAAE;AAAA,EAClF;AACJ;AAEO,MAAM,mBAAmB,CAAI,SAAqB,cAAmC;AACxF,MAAI,cAAc,QAAW;AACzB,WAAO;AAAA,EACX;AAEA,SAAO,IAAI,QAAW,CAAC,SAAS,WAAW;AACvC,UAAM,UAAU,WAAW,MAAM,OAAO,IAAI,uBAAuB,SAAS,CAAC,GAAG,SAAS;AAEzF,YAAQ;AAAA,MACJ,YAAU;AACN,qBAAa,OAAO;AACpB,gBAAQ,MAAM;AAAA,MAClB;AAAA,MACA,WAAS;AACL,qBAAa,OAAO;AACpB,eAAO,KAAK;AAAA,MAChB;AAAA,IACJ;AAAA,EACJ,CAAC;AACL;AAEO,MAAM,wBAAwB,CAAI,YAAwD;AAC7F,SAAO,CAAC,GAAG,OAAO,EAAE,KAAK,CAAC,GAAG,MAAM;AAC/B,UAAM,mBACD,EAAE,OAAO,WAAW,OAAO,qBAAqB,EAAE,OAAO,WAAW,OAAO;AAEhF,QAAI,oBAAoB,GAAG;AACvB,aAAO;AAAA,IACX;AAEA,YAAQ,EAAE,OAAO,cAAc,IAAI,cAAc,EAAE,OAAO,cAAc,EAAE;AAAA,EAC9E,CAAC;AACL;","names":[]}
1
+ {"version":3,"sources":["../../src/relay/result.ts"],"sourcesContent":["import {serializeError} from \"@message/error\";\n\nimport {InjectScriptTargetErrorKind} from \"@addon-core/inject-script\";\n\nimport {\n RelayFrameErrorKind,\n type RelayFrameResult,\n type RelayFramesResult,\n type RelayResultTarget,\n} from \"@typing/relay\";\n\nexport class RelayFrameTimeoutError extends Error {\n public constructor(public readonly timeoutMs: number) {\n super(`Relay frame did not respond within ${timeoutMs}ms.`);\n this.name = \"RelayFrameTimeoutError\";\n }\n}\n\nexport class RelayProtocolError extends Error {\n public constructor(relayName: string) {\n super(`Relay \"${relayName}\" returned an invalid scripting response envelope.`);\n this.name = \"RelayProtocolError\";\n }\n}\n\nexport const fulfilledRelayFrame = <T>(target: RelayResultTarget, result: T): RelayFrameResult<T> => ({\n target,\n status: \"fulfilled\",\n result,\n});\n\nexport const rejectedRelayFrame = <T>(\n target: RelayResultTarget,\n error: unknown,\n kind: RelayFrameErrorKind\n): RelayFrameResult<T> => ({\n target,\n status: \"rejected\",\n error: {\n kind,\n ...serializeError(error),\n },\n});\n\nexport const messageErrorKind = (error: unknown): RelayFrameErrorKind => {\n const message = error instanceof Error ? error.message : String(error);\n\n if (\n /receiving end does not exist|no matching message handler|frame.*(?:removed|not found)|no frame with id|invalid frame id/i.test(\n message\n )\n ) {\n return RelayFrameErrorKind.TargetGone;\n }\n\n return RelayFrameErrorKind.Delivery;\n};\n\nexport const injectScriptErrorKind = (kind: `${InjectScriptTargetErrorKind}`): RelayFrameErrorKind => {\n switch (kind) {\n case InjectScriptTargetErrorKind.Execution:\n return RelayFrameErrorKind.Execution;\n case InjectScriptTargetErrorKind.Delivery:\n return RelayFrameErrorKind.Delivery;\n case InjectScriptTargetErrorKind.Timeout:\n return RelayFrameErrorKind.Timeout;\n case InjectScriptTargetErrorKind.TargetGone:\n return RelayFrameErrorKind.TargetGone;\n case InjectScriptTargetErrorKind.Unobservable:\n return RelayFrameErrorKind.Unobservable;\n default:\n throw new TypeError(`Unsupported Inject Script target error kind: ${kind}`);\n }\n};\n\nexport const withRelayTimeout = <T>(promise: Promise<T>, timeoutMs?: number): Promise<T> => {\n if (timeoutMs === undefined) {\n return promise;\n }\n\n return new Promise<T>((resolve, reject) => {\n const timeout = setTimeout(() => reject(new RelayFrameTimeoutError(timeoutMs)), timeoutMs);\n\n promise.then(\n result => {\n clearTimeout(timeout);\n resolve(result);\n },\n error => {\n clearTimeout(timeout);\n reject(error);\n }\n );\n });\n};\n\nexport const sortRelayFrameResults = <T>(results: RelayFramesResult<T>): RelayFramesResult<T> => {\n return [...results].sort((a, b) => {\n const frameDifference =\n (a.target.frameId ?? Number.MAX_SAFE_INTEGER) - (b.target.frameId ?? Number.MAX_SAFE_INTEGER);\n\n if (frameDifference !== 0) {\n return frameDifference;\n }\n\n return (a.target.documentId ?? \"\").localeCompare(b.target.documentId ?? \"\");\n });\n};\n"],"mappings":"AAAA,SAAQ,sBAAqB;AAE7B,SAAQ,mCAAkC;AAE1C;AAAA,EACI;AAAA,OAIG;AAEA,MAAM,+BAA+B,MAAM;AAAA,EACvC,YAA4B,WAAmB;AAClD,UAAM,sCAAsC,SAAS,KAAK;AAD3B;AAE/B,SAAK,OAAO;AAAA,EAChB;AAAA,EAHmC;AAIvC;AAEO,MAAM,2BAA2B,MAAM;AAAA,EACnC,YAAY,WAAmB;AAClC,UAAM,UAAU,SAAS,oDAAoD;AAC7E,SAAK,OAAO;AAAA,EAChB;AACJ;AAEO,MAAM,sBAAsB,CAAI,QAA2B,YAAoC;AAAA,EAClG;AAAA,EACA,QAAQ;AAAA,EACR;AACJ;AAEO,MAAM,qBAAqB,CAC9B,QACA,OACA,UACuB;AAAA,EACvB;AAAA,EACA,QAAQ;AAAA,EACR,OAAO;AAAA,IACH;AAAA,IACA,GAAG,eAAe,KAAK;AAAA,EAC3B;AACJ;AAEO,MAAM,mBAAmB,CAAC,UAAwC;AACrE,QAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAErE,MACI,2HAA2H;AAAA,IACvH;AAAA,EACJ,GACF;AACE,WAAO,oBAAoB;AAAA,EAC/B;AAEA,SAAO,oBAAoB;AAC/B;AAEO,MAAM,wBAAwB,CAAC,SAAgE;AAClG,UAAQ,MAAM;AAAA,IACV,KAAK,4BAA4B;AAC7B,aAAO,oBAAoB;AAAA,IAC/B,KAAK,4BAA4B;AAC7B,aAAO,oBAAoB;AAAA,IAC/B,KAAK,4BAA4B;AAC7B,aAAO,oBAAoB;AAAA,IAC/B,KAAK,4BAA4B;AAC7B,aAAO,oBAAoB;AAAA,IAC/B,KAAK,4BAA4B;AAC7B,aAAO,oBAAoB;AAAA,IAC/B;AACI,YAAM,IAAI,UAAU,gDAAgD,IAAI,EAAE;AAAA,EAClF;AACJ;AAEO,MAAM,mBAAmB,CAAI,SAAqB,cAAmC;AACxF,MAAI,cAAc,QAAW;AACzB,WAAO;AAAA,EACX;AAEA,SAAO,IAAI,QAAW,CAAC,SAAS,WAAW;AACvC,UAAM,UAAU,WAAW,MAAM,OAAO,IAAI,uBAAuB,SAAS,CAAC,GAAG,SAAS;AAEzF,YAAQ;AAAA,MACJ,YAAU;AACN,qBAAa,OAAO;AACpB,gBAAQ,MAAM;AAAA,MAClB;AAAA,MACA,WAAS;AACL,qBAAa,OAAO;AACpB,eAAO,KAAK;AAAA,MAChB;AAAA,IACJ;AAAA,EACJ,CAAC;AACL;AAEO,MAAM,wBAAwB,CAAI,YAAwD;AAC7F,SAAO,CAAC,GAAG,OAAO,EAAE,KAAK,CAAC,GAAG,MAAM;AAC/B,UAAM,mBACD,EAAE,OAAO,WAAW,OAAO,qBAAqB,EAAE,OAAO,WAAW,OAAO;AAEhF,QAAI,oBAAoB,GAAG;AACvB,aAAO;AAAA,IACX;AAEA,YAAQ,EAAE,OAAO,cAAc,IAAI,cAAc,EAAE,OAAO,cAAc,EAAE;AAAA,EAC9E,CAAC;AACL;","names":[]}
@@ -0,0 +1,8 @@
1
+ import type { IconName } from "./icon.js";
2
+ /** Default appearance of the extension's toolbar button. */
3
+ export interface ActionOptions {
4
+ /** Icon group name. Falls back to `config.icon` when omitted. */
5
+ icon?: IconName;
6
+ /** Tooltip text or locale key, such as `@action.title`. Defaults to the extension name. */
7
+ title?: string;
8
+ }
@@ -0,0 +1 @@
1
+ //# sourceMappingURL=action.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -1,14 +1,9 @@
1
1
  import { EntrypointBuilder, EntrypointOptions } from "./entrypoint.js";
2
2
  import { Awaiter } from "./helpers.js";
3
+ import { PermissionsOptions } from "./permissions.js";
3
4
  export declare const BackgroundEntryName = "background";
4
- type ManifestPermissions = chrome.runtime.ManifestPermission;
5
- type ManifestOptionalPermissions = chrome.runtime.ManifestOptionalPermission;
6
- export interface BackgroundConfig {
5
+ export interface BackgroundConfig extends PermissionsOptions {
7
6
  persistent?: boolean;
8
- permissions?: ManifestPermissions[];
9
- optionalPermissions?: ManifestOptionalPermissions[];
10
- hostPermissions?: string[];
11
- optionalHostPermissions?: string[];
12
7
  }
13
8
  export type BackgroundOptions = BackgroundConfig & EntrypointOptions;
14
9
  export type BackgroundEntrypointOptions = BackgroundOptions;
@@ -17,4 +12,3 @@ export interface BackgroundDefinition extends BackgroundEntrypointOptions {
17
12
  main?: BackgroundMainHandler;
18
13
  }
19
14
  export type BackgroundBuilder = EntrypointBuilder;
20
- export {};
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/types/background.ts"],"sourcesContent":["import {EntrypointBuilder, EntrypointOptions} from \"@typing/entrypoint\";\nimport {Awaiter} from \"@typing/helpers\";\n\nexport const BackgroundEntryName = \"background\";\n\ntype ManifestPermissions = chrome.runtime.ManifestPermission;\n\ntype ManifestOptionalPermissions = chrome.runtime.ManifestOptionalPermission;\n\nexport interface BackgroundConfig {\n persistent?: boolean;\n permissions?: ManifestPermissions[];\n optionalPermissions?: ManifestOptionalPermissions[];\n hostPermissions?: string[];\n optionalHostPermissions?: string[];\n}\n\nexport type BackgroundOptions = BackgroundConfig & EntrypointOptions;\n\nexport type BackgroundEntrypointOptions = BackgroundOptions;\n\nexport type BackgroundMainHandler = (options: BackgroundOptions) => Awaiter<void>;\n\nexport interface BackgroundDefinition extends BackgroundEntrypointOptions {\n main?: BackgroundMainHandler;\n}\n\nexport type BackgroundBuilder = EntrypointBuilder;\n"],"mappings":"AAGO,MAAM,sBAAsB;","names":[]}
1
+ {"version":3,"sources":["../../src/types/background.ts"],"sourcesContent":["import {EntrypointBuilder, EntrypointOptions} from \"@typing/entrypoint\";\nimport {Awaiter} from \"@typing/helpers\";\nimport {PermissionsOptions} from \"@typing/permissions\";\n\nexport const BackgroundEntryName = \"background\";\n\nexport interface BackgroundConfig extends PermissionsOptions {\n persistent?: boolean;\n}\n\nexport type BackgroundOptions = BackgroundConfig & EntrypointOptions;\n\nexport type BackgroundEntrypointOptions = BackgroundOptions;\n\nexport type BackgroundMainHandler = (options: BackgroundOptions) => Awaiter<void>;\n\nexport interface BackgroundDefinition extends BackgroundEntrypointOptions {\n main?: BackgroundMainHandler;\n}\n\nexport type BackgroundBuilder = EntrypointBuilder;\n"],"mappings":"AAIO,MAAM,sBAAsB;","names":[]}
@@ -7,6 +7,7 @@ import { Plugin } from "./plugin.js";
7
7
  import { Language } from "./locale.js";
8
8
  import { Awaiter } from "./helpers.js";
9
9
  import { EnvFilterOptions, EnvFilterVariant } from "./env.js";
10
+ import { ActionOptions } from "./action.js";
10
11
  /**
11
12
  * Configuration options for building a browser extension. This interface defines
12
13
  * all the properties required to customize the build process, extension metadata,
@@ -136,6 +137,18 @@ export interface Config {
136
137
  * - "disable"
137
138
  */
138
139
  icon: string;
140
+ /**
141
+ * Default appearance of the toolbar button (`action` in MV3, `browser_action` in MV2).
142
+ * An explicit object, including `{}`, declares the button without requiring a popup or command.
143
+ * It does not register a click handler.
144
+ *
145
+ * The applied popup overrides each explicitly specified icon/title independently.
146
+ * Missing values fall back to these settings, then to `icon` and the extension name.
147
+ * When omitted, only an applied popup or execute-action command declares the button.
148
+ *
149
+ * @example {icon: "active", title: "@action.title"}
150
+ */
151
+ action?: ActionOptions;
139
152
  /**
140
153
  * Browser-specific settings (populate manifest.browser_specific_settings).
141
154
  *
@@ -405,7 +418,10 @@ export interface Config {
405
418
  concatContentScripts: boolean;
406
419
  /**
407
420
  * Flag indicating whether to merge styles from App and Shared directories.
408
- * When `true`, styles from both directories will be combined.
421
+ * When `true`, importing a shared stylesheet also compiles the app stylesheet at the same
422
+ * relative path into the same CSS module, with shared rules before app rules. Relative `@use`
423
+ * and `@forward` requests and literal `url(...)` values in the merged sources resolve from the
424
+ * file that declares them.
409
425
  *
410
426
  * @default true
411
427
  */
@@ -1,6 +1,6 @@
1
1
  import type { ContentScriptPrepareHandler } from "./prepare.js";
2
2
  import type { ContentScriptBoundaryHandler } from "./boundary.js";
3
- import type { ContentScriptAnchor, ContentScriptAnchorGetter, ContentScriptAppend, ContentScriptContainerCreator, ContentScriptContainerFactory, ContentScriptContainerOptions, ContentScriptContainerTag, ContentScriptFramePageOptions, ContentScriptFrameRenderOptions, ContentScriptFrameSourceOptions, ContentScriptIsolation, ContentScriptIsolationFrameOptions, ContentScriptIsolationOptions, ContentScriptIsolationShadowOptions, ContentScriptMainFunction, ContentScriptMarkerGetter, ContentScriptMarkerResolver, ContentScriptMarkerType, ContentScriptMountFunction, ContentScriptOptions, ContentScriptWatchStrategy } from "./common.js";
3
+ import type { ContentScriptAnchor, ContentScriptAnchorGetter, ContentScriptBuilder, ContentScriptAppend, ContentScriptContainerCreator, ContentScriptContainerFactory, ContentScriptContainerOptions, ContentScriptContainerTag, ContentScriptFramePageOptions, ContentScriptFrameRenderOptions, ContentScriptFrameSourceOptions, ContentScriptIsolation, ContentScriptIsolationFrameOptions, ContentScriptIsolationOptions, ContentScriptIsolationShadowOptions, ContentScriptMainFunction, ContentScriptMarkerGetter, ContentScriptMarkerResolver, ContentScriptMarkerType, ContentScriptMountFunction, ContentScriptOptions, ContentScriptWatchStrategy } from "./common.js";
4
4
  import type { ContentScriptRenderHandler, ContentScriptRenderValue } from "./render.js";
5
5
  import type { ContentScriptTarget, ContentScriptTargetCreator } from "./target.js";
6
6
  export interface ContentScriptDefinitionBase<Data = unknown> extends Partial<ContentScriptOptions> {
@@ -50,6 +50,7 @@ export type ContentScriptRenderDefinition<Data = unknown, Isolation extends `${C
50
50
  isolation: unknown;
51
51
  });
52
52
  export type ContentScriptDefinition<Data = unknown, Isolation extends `${ContentScriptIsolation}` = `${ContentScriptIsolation}`> = ContentScriptDefinitionBase<Data> & ContentScriptRenderDefinition<Data, Isolation>;
53
+ export type ContentScriptBuilderConstructor<Data = unknown, Isolation extends `${ContentScriptIsolation}` = `${ContentScriptIsolation}`> = new (definition: ContentScriptDefinition<Data, NoInfer<Isolation>>) => ContentScriptBuilder;
53
54
  export interface ContentScriptResolvedDefinition<Data = unknown> extends Omit<ContentScriptDefinitionBase<Data>, "anchor" | "marker" | "mount" | "container" | "watch"> {
54
55
  isolation: ContentScriptIsolationOptions;
55
56
  boundary?: ContentScriptBoundaryHandler<Data>;
@@ -15,7 +15,10 @@ export declare enum EntrypointType {
15
15
  Popup = "popup",
16
16
  Sidebar = "sidebar",
17
17
  Offscreen = "offscreen",
18
- Sandbox = "sandbox"
18
+ Sandbox = "sandbox",
19
+ Newtab = "newtab",
20
+ Bookmarks = "bookmarks",
21
+ History = "history"
19
22
  }
20
23
  export interface EntrypointOptions {
21
24
  /**
@@ -116,6 +119,7 @@ export interface EntrypointNameGenerator {
116
119
  reserve(name: string): this;
117
120
  name(name: string): string;
118
121
  file(file: EntrypointFile): string;
122
+ derive(file: EntrypointFile): string;
119
123
  likely(name?: string): boolean;
120
124
  has(name: string): boolean;
121
125
  reset(): this;
@@ -13,6 +13,9 @@ var EntrypointType = /* @__PURE__ */ ((EntrypointType2) => {
13
13
  EntrypointType2["Sidebar"] = "sidebar";
14
14
  EntrypointType2["Offscreen"] = "offscreen";
15
15
  EntrypointType2["Sandbox"] = "sandbox";
16
+ EntrypointType2["Newtab"] = "newtab";
17
+ EntrypointType2["Bookmarks"] = "bookmarks";
18
+ EntrypointType2["History"] = "history";
16
19
  return EntrypointType2;
17
20
  })(EntrypointType || {});
18
21
  export {