roxxie-proxy-u-prod 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (481) hide show
  1. package/LICENSE +661 -0
  2. package/README.md +123 -0
  3. package/SOURCE.md +29 -0
  4. package/THIRD_PARTY_NOTICES.md +24 -0
  5. package/dist/assets/filters-Bu_3nHVy.bin +0 -0
  6. package/dist/assets/index-BdRlQ7d_.css +1 -0
  7. package/dist/assets/index-DcvPYWS3.js +3621 -0
  8. package/dist/assets/inject-BnVzMVpl.js +40 -0
  9. package/dist/assets/scramjet-C9HLwI-y.wasm +0 -0
  10. package/dist/defaultfavicon.png +0 -0
  11. package/dist/icon.png +0 -0
  12. package/dist/roxxie-icon.svg +12 -0
  13. package/embed.js +70 -0
  14. package/examples/single-page.html +25 -0
  15. package/package.json +42 -0
  16. package/runtime/controller.sw.js +273 -0
  17. package/runtime/index.html +18 -0
  18. package/runtime/localcontrollersw.js +7 -0
  19. package/runtime/roxxie-network.json +13 -0
  20. package/runtime/sw.js +6 -0
  21. package/scripts/build.mjs +344 -0
  22. package/scripts/smoke.mjs +123 -0
  23. package/scripts/verify.mjs +122 -0
  24. package/source/external/dreamlandjs/LICENSE +21 -0
  25. package/source/external/dreamlandjs/README.md +22 -0
  26. package/source/external/dreamlandjs/dist/core.d.ts +167 -0
  27. package/source/external/dreamlandjs/dist/core.js +2 -0
  28. package/source/external/dreamlandjs/dist/core.js.map +1 -0
  29. package/source/external/dreamlandjs/dist/core.size.html +4950 -0
  30. package/source/external/dreamlandjs/dist/js-runtime.d.ts +3 -0
  31. package/source/external/dreamlandjs/dist/js-runtime.js +2 -0
  32. package/source/external/dreamlandjs/dist/js-runtime.js.map +1 -0
  33. package/source/external/dreamlandjs/dist/jsx-runtime.d.ts +1 -0
  34. package/source/external/dreamlandjs/dist/jsx-runtime.js +2 -0
  35. package/source/external/dreamlandjs/dist/jsx-runtime.js.map +1 -0
  36. package/source/external/dreamlandjs/dist/motion.d.ts +19 -0
  37. package/source/external/dreamlandjs/dist/motion.js +2 -0
  38. package/source/external/dreamlandjs/dist/motion.js.map +1 -0
  39. package/source/external/dreamlandjs/dist/router.d.ts +48 -0
  40. package/source/external/dreamlandjs/dist/router.js +2 -0
  41. package/source/external/dreamlandjs/dist/router.js.map +1 -0
  42. package/source/external/dreamlandjs/dist/ssr.client.d.ts +3 -0
  43. package/source/external/dreamlandjs/dist/ssr.client.js +2 -0
  44. package/source/external/dreamlandjs/dist/ssr.client.js.map +1 -0
  45. package/source/external/dreamlandjs/dist/ssr.client.size.html +4950 -0
  46. package/source/external/dreamlandjs/dist/ssr.hybrid.d.ts +7 -0
  47. package/source/external/dreamlandjs/dist/ssr.hybrid.js +2 -0
  48. package/source/external/dreamlandjs/dist/ssr.hybrid.js.map +1 -0
  49. package/source/external/dreamlandjs/dist/ssr.hybrid.size.html +4950 -0
  50. package/source/external/dreamlandjs/dist/ssr.server.d.ts +11 -0
  51. package/source/external/dreamlandjs/dist/ssr.server.js +2373 -0
  52. package/source/external/dreamlandjs/dist/ssr.server.js.map +1 -0
  53. package/source/external/dreamlandjs/dist/types/core/consts.d.ts +16 -0
  54. package/source/external/dreamlandjs/dist/types/core/css/index.d.ts +11 -0
  55. package/source/external/dreamlandjs/dist/types/core/css/selectorParser.d.ts +50 -0
  56. package/source/external/dreamlandjs/dist/types/core/delegate.d.ts +10 -0
  57. package/source/external/dreamlandjs/dist/types/core/index.d.ts +9 -0
  58. package/source/external/dreamlandjs/dist/types/core/jsx/child.d.ts +2 -0
  59. package/source/external/dreamlandjs/dist/types/core/jsx/definitions.d.ts +76 -0
  60. package/source/external/dreamlandjs/dist/types/core/jsx/dom.d.ts +28 -0
  61. package/source/external/dreamlandjs/dist/types/core/jsx/index.d.ts +14 -0
  62. package/source/external/dreamlandjs/dist/types/core/state/index.d.ts +1 -0
  63. package/source/external/dreamlandjs/dist/types/core/state/pointers.d.ts +37 -0
  64. package/source/external/dreamlandjs/dist/types/core/state/state.d.ts +13 -0
  65. package/source/external/dreamlandjs/dist/types/core/state/use.d.ts +11 -0
  66. package/source/external/dreamlandjs/dist/types/core/utils.d.ts +4 -0
  67. package/source/external/dreamlandjs/dist/types/js-runtime/index.d.ts +1 -0
  68. package/source/external/dreamlandjs/dist/types/jsx-runtime/index.d.ts +2 -0
  69. package/source/external/dreamlandjs/dist/types/motion/index.d.ts +15 -0
  70. package/source/external/dreamlandjs/dist/types/router/index.d.ts +45 -0
  71. package/source/external/dreamlandjs/dist/types/ssr/client/index.d.ts +1 -0
  72. package/source/external/dreamlandjs/dist/types/ssr/common/consts.d.ts +4 -0
  73. package/source/external/dreamlandjs/dist/types/ssr/common/serialize.d.ts +4 -0
  74. package/source/external/dreamlandjs/dist/types/ssr/common/types.d.ts +21 -0
  75. package/source/external/dreamlandjs/dist/types/ssr/hybrid/index.d.ts +4 -0
  76. package/source/external/dreamlandjs/dist/types/ssr/server/index.d.ts +7 -0
  77. package/source/external/dreamlandjs/dist/types/ssr/server/vdom.d.ts +71 -0
  78. package/source/external/dreamlandjs/dist/types/util/index.d.ts +1 -0
  79. package/source/external/dreamlandjs/dist/types/util/store.d.ts +26 -0
  80. package/source/external/dreamlandjs/dist/types/vite/css-minifier.d.ts +7 -0
  81. package/source/external/dreamlandjs/dist/types/vite/index.d.ts +11 -0
  82. package/source/external/dreamlandjs/dist/util.d.ts +29 -0
  83. package/source/external/dreamlandjs/dist/util.js +2 -0
  84. package/source/external/dreamlandjs/dist/util.js.map +1 -0
  85. package/source/external/dreamlandjs/dist/vite.d.ts +19 -0
  86. package/source/external/dreamlandjs/dist/vite.js +2 -0
  87. package/source/external/dreamlandjs/dist/vite.js.map +1 -0
  88. package/source/external/dreamlandjs/package.json +101 -0
  89. package/source/external/dreamlandjs/rollup.config.ts +302 -0
  90. package/source/external/dreamlandjs/rollup.plugins.ts +1134 -0
  91. package/source/external/dreamlandjs/src/core/consts.d.ts +16 -0
  92. package/source/external/dreamlandjs/src/core/consts.js +18 -0
  93. package/source/external/dreamlandjs/src/core/css/index.ts +111 -0
  94. package/source/external/dreamlandjs/src/core/css/selectorParser.ts +313 -0
  95. package/source/external/dreamlandjs/src/core/delegate.ts +28 -0
  96. package/source/external/dreamlandjs/src/core/index.ts +31 -0
  97. package/source/external/dreamlandjs/src/core/jsx/child.ts +91 -0
  98. package/source/external/dreamlandjs/src/core/jsx/definitions.ts +125 -0
  99. package/source/external/dreamlandjs/src/core/jsx/dom.ts +49 -0
  100. package/source/external/dreamlandjs/src/core/jsx/index.ts +289 -0
  101. package/source/external/dreamlandjs/src/core/state/index.ts +1 -0
  102. package/source/external/dreamlandjs/src/core/state/pointers.ts +310 -0
  103. package/source/external/dreamlandjs/src/core/state/state.ts +112 -0
  104. package/source/external/dreamlandjs/src/core/state/use.ts +82 -0
  105. package/source/external/dreamlandjs/src/core/utils.ts +48 -0
  106. package/source/external/dreamlandjs/src/js-runtime/index.ts +4 -0
  107. package/source/external/dreamlandjs/src/jsx-runtime/index.ts +3 -0
  108. package/source/external/dreamlandjs/src/motion/index.ts +156 -0
  109. package/source/external/dreamlandjs/src/router/index.tsx +394 -0
  110. package/source/external/dreamlandjs/src/router/tsconfig.json +9 -0
  111. package/source/external/dreamlandjs/src/ssr/client/index.ts +193 -0
  112. package/source/external/dreamlandjs/src/ssr/common/consts.ts +5 -0
  113. package/source/external/dreamlandjs/src/ssr/common/serialize.ts +115 -0
  114. package/source/external/dreamlandjs/src/ssr/common/types.ts +28 -0
  115. package/source/external/dreamlandjs/src/ssr/hybrid/index.ts +144 -0
  116. package/source/external/dreamlandjs/src/ssr/server/index.ts +157 -0
  117. package/source/external/dreamlandjs/src/ssr/server/tsconfig.json +7 -0
  118. package/source/external/dreamlandjs/src/ssr/server/vdom.ts +285 -0
  119. package/source/external/dreamlandjs/src/util/index.ts +10 -0
  120. package/source/external/dreamlandjs/src/util/store.ts +134 -0
  121. package/source/external/dreamlandjs/src/vite/css-minifier.ts +222 -0
  122. package/source/external/dreamlandjs/src/vite/index.ts +60 -0
  123. package/source/external/dreamlandjs/src/vite/tsconfig.json +7 -0
  124. package/source/external/dreamlandjs/tsconfig.json +15 -0
  125. package/source/package.json +48 -0
  126. package/source/packages/adrift-protocol/package.json +31 -0
  127. package/source/packages/adrift-protocol/src/index.ts +348 -0
  128. package/source/packages/adrift-protocol/tsconfig.json +18 -0
  129. package/source/packages/cdp/LICENSE +21 -0
  130. package/source/packages/cdp/README.md +47 -0
  131. package/source/packages/cdp/dist/chobitsu.js +2 -0
  132. package/source/packages/cdp/dist/chobitsu.js.map +1 -0
  133. package/source/packages/cdp/package.json +73 -0
  134. package/source/packages/cdp/script/build.js +15 -0
  135. package/source/packages/cdp/src/Chobitsu.ts +110 -0
  136. package/source/packages/cdp/src/domains/CSS.ts +378 -0
  137. package/source/packages/cdp/src/domains/CacheStorage.ts +8 -0
  138. package/source/packages/cdp/src/domains/DOM.ts +487 -0
  139. package/source/packages/cdp/src/domains/DOMDebugger.ts +109 -0
  140. package/source/packages/cdp/src/domains/DOMStorage.ts +122 -0
  141. package/source/packages/cdp/src/domains/Debugger.ts +25 -0
  142. package/source/packages/cdp/src/domains/IndexedDB.ts +207 -0
  143. package/source/packages/cdp/src/domains/Input.ts +177 -0
  144. package/source/packages/cdp/src/domains/Network.ts +251 -0
  145. package/source/packages/cdp/src/domains/Overlay.ts +230 -0
  146. package/source/packages/cdp/src/domains/Page.ts +296 -0
  147. package/source/packages/cdp/src/domains/Runtime.ts +273 -0
  148. package/source/packages/cdp/src/domains/Storage.ts +71 -0
  149. package/source/packages/cdp/src/index.d.ts +8 -0
  150. package/source/packages/cdp/src/index.ts +153 -0
  151. package/source/packages/cdp/src/lib/connector.ts +15 -0
  152. package/source/packages/cdp/src/lib/constants.ts +1 -0
  153. package/source/packages/cdp/src/lib/evaluate.ts +59 -0
  154. package/source/packages/cdp/src/lib/mutationObserver.ts +39 -0
  155. package/source/packages/cdp/src/lib/nodeManager.ts +142 -0
  156. package/source/packages/cdp/src/lib/objManager.ts +422 -0
  157. package/source/packages/cdp/src/lib/request.ts +313 -0
  158. package/source/packages/cdp/src/lib/resources.ts +59 -0
  159. package/source/packages/cdp/src/lib/scriptMananger.ts +62 -0
  160. package/source/packages/cdp/src/lib/stylesheet.ts +146 -0
  161. package/source/packages/cdp/src/lib/util.ts +105 -0
  162. package/source/packages/cdp/tsconfig.json +16 -0
  163. package/source/packages/cdp/webpack.config.js +48 -0
  164. package/source/packages/chrome/index.html +17 -0
  165. package/source/packages/chrome/package.json +41 -0
  166. package/source/packages/chrome/public/ROXXIE_NETWORK.md +22 -0
  167. package/source/packages/chrome/public/controller.sw.js +273 -0
  168. package/source/packages/chrome/public/defaultfavicon.png +0 -0
  169. package/source/packages/chrome/public/icon.png +0 -0
  170. package/source/packages/chrome/public/localcontrollersw.js +7 -0
  171. package/source/packages/chrome/public/roxxie-icon.svg +12 -0
  172. package/source/packages/chrome/public/roxxie-network.json +13 -0
  173. package/source/packages/chrome/public/sw.js +6 -0
  174. package/source/packages/chrome/src/App.tsx +269 -0
  175. package/source/packages/chrome/src/CDP.ts +285 -0
  176. package/source/packages/chrome/src/Tab/History.ts +186 -0
  177. package/source/packages/chrome/src/Tab/Tab.tsx +219 -0
  178. package/source/packages/chrome/src/Tab/screenshot.ts +66 -0
  179. package/source/packages/chrome/src/Tab/serialize.ts +221 -0
  180. package/source/packages/chrome/src/adblock/AdBlockPlugin.test.ts +159 -0
  181. package/source/packages/chrome/src/adblock/AdBlockPlugin.ts +232 -0
  182. package/source/packages/chrome/src/adblock/AdBlockService.test.ts +148 -0
  183. package/source/packages/chrome/src/adblock/AdBlockService.ts +166 -0
  184. package/source/packages/chrome/src/adblock/NOTICE.md +14 -0
  185. package/source/packages/chrome/src/adblock/assets/filters.bin +0 -0
  186. package/source/packages/chrome/src/adblock/index.ts +18 -0
  187. package/source/packages/chrome/src/assets/favicon.ts +4 -0
  188. package/source/packages/chrome/src/components/BookmarkPopup.tsx +101 -0
  189. package/source/packages/chrome/src/components/BookmarksStrip.tsx +150 -0
  190. package/source/packages/chrome/src/components/Button.tsx +99 -0
  191. package/source/packages/chrome/src/components/Checkbox.tsx +89 -0
  192. package/source/packages/chrome/src/components/DownloadsPopup.tsx +230 -0
  193. package/source/packages/chrome/src/components/Favicon.tsx +65 -0
  194. package/source/packages/chrome/src/components/Icon.tsx +29 -0
  195. package/source/packages/chrome/src/components/Input.tsx +82 -0
  196. package/source/packages/chrome/src/components/Menu.tsx +287 -0
  197. package/source/packages/chrome/src/components/Omnibar/BookmarkButton.tsx +73 -0
  198. package/source/packages/chrome/src/components/Omnibar/CircularProgress.tsx +83 -0
  199. package/source/packages/chrome/src/components/Omnibar/Omnibar.tsx +455 -0
  200. package/source/packages/chrome/src/components/Omnibar/OmnibarButton.tsx +48 -0
  201. package/source/packages/chrome/src/components/Omnibar/Omnibox.tsx +466 -0
  202. package/source/packages/chrome/src/components/Omnibar/SiteOptionsButton.tsx +52 -0
  203. package/source/packages/chrome/src/components/Omnibar/Suggestion.tsx +186 -0
  204. package/source/packages/chrome/src/components/Omnibar/UrlInput.tsx +198 -0
  205. package/source/packages/chrome/src/components/Omnibar/suggestions.ts +468 -0
  206. package/source/packages/chrome/src/components/Omnibar/utils.ts +11 -0
  207. package/source/packages/chrome/src/components/ReportBrokenSiteModal.tsx +279 -0
  208. package/source/packages/chrome/src/components/Shell.tsx +191 -0
  209. package/source/packages/chrome/src/components/SiteInformationPopup.tsx +96 -0
  210. package/source/packages/chrome/src/components/SmallIconButton.tsx +36 -0
  211. package/source/packages/chrome/src/components/StartScreen.tsx +386 -0
  212. package/source/packages/chrome/src/components/TabStrip/DragTab.tsx +546 -0
  213. package/source/packages/chrome/src/components/TabStrip/Sidebar.tsx +820 -0
  214. package/source/packages/chrome/src/components/TabStrip/TabHoverCard.tsx +87 -0
  215. package/source/packages/chrome/src/components/TabStrip/TabStrip.tsx +510 -0
  216. package/source/packages/chrome/src/components/TopSiteButton.tsx +234 -0
  217. package/source/packages/chrome/src/consts.ts +3 -0
  218. package/source/packages/chrome/src/icons.ts +70 -0
  219. package/source/packages/chrome/src/index.ts +168 -0
  220. package/source/packages/chrome/src/migrations/0-from-legacy.ts +6 -0
  221. package/source/packages/chrome/src/migrations/1-vertical-tab-settings.ts +15 -0
  222. package/source/packages/chrome/src/migrations/index.ts +42 -0
  223. package/source/packages/chrome/src/pages/AboutPage.tsx +37 -0
  224. package/source/packages/chrome/src/pages/DownloadsPage.tsx +133 -0
  225. package/source/packages/chrome/src/pages/HistoryPage.tsx +99 -0
  226. package/source/packages/chrome/src/pages/NewTabPage.tsx +264 -0
  227. package/source/packages/chrome/src/pages/PlaygroundPage.tsx +43 -0
  228. package/source/packages/chrome/src/pages/SettingsPage.tsx +1931 -0
  229. package/source/packages/chrome/src/proxy/Controller.ts +331 -0
  230. package/source/packages/chrome/src/proxy/ProxyFrame.ts +26 -0
  231. package/source/packages/chrome/src/proxy/cache.ts +487 -0
  232. package/source/packages/chrome/src/proxy/codec.ts +11 -0
  233. package/source/packages/chrome/src/proxy/contextitems.ts +180 -0
  234. package/source/packages/chrome/src/proxy/index.ts +5 -0
  235. package/source/packages/chrome/src/proxy/roxxie.ts +85 -0
  236. package/source/packages/chrome/src/proxy/scramjet.ts +642 -0
  237. package/source/packages/chrome/src/reset.css +124 -0
  238. package/source/packages/chrome/src/runtime-base.ts +16 -0
  239. package/source/packages/chrome/src/sentry.tsx +45 -0
  240. package/source/packages/chrome/src/services/DownloadsService.ts +136 -0
  241. package/source/packages/chrome/src/services/FaviconService.ts +161 -0
  242. package/source/packages/chrome/src/services/KVWrapper.ts +169 -0
  243. package/source/packages/chrome/src/services/ProfileService.ts +94 -0
  244. package/source/packages/chrome/src/services/Service.ts +10 -0
  245. package/source/packages/chrome/src/services/SettingsService.ts +108 -0
  246. package/source/packages/chrome/src/services/TabsService.ts +161 -0
  247. package/source/packages/chrome/src/startup.test.ts +129 -0
  248. package/source/packages/chrome/src/startup.ts +161 -0
  249. package/source/packages/chrome/src/style.css +229 -0
  250. package/source/packages/chrome/src/themes.ts +756 -0
  251. package/source/packages/chrome/src/util/StatefulClass.ts +31 -0
  252. package/source/packages/chrome/src/util/index.ts +74 -0
  253. package/source/packages/chrome/src/util/memoize.ts +13 -0
  254. package/source/packages/chrome/src/vite-env.d.ts +16 -0
  255. package/source/packages/chrome/tsconfig.json +30 -0
  256. package/source/packages/chrome/vite.config.ts +47 -0
  257. package/source/packages/inject/package.json +20 -0
  258. package/source/packages/inject/src/context.ts +194 -0
  259. package/source/packages/inject/src/emulators/alwaysLastBubble.ts +168 -0
  260. package/source/packages/inject/src/emulators/anchors.ts +55 -0
  261. package/source/packages/inject/src/emulators/contextmenu.ts +46 -0
  262. package/source/packages/inject/src/emulators/history.ts +51 -0
  263. package/source/packages/inject/src/emulators/titlewatcher.ts +42 -0
  264. package/source/packages/inject/src/emulators/windowopen.ts +134 -0
  265. package/source/packages/inject/src/errorpage/errorpage.css +234 -0
  266. package/source/packages/inject/src/errorpage/errorpage.html +29 -0
  267. package/source/packages/inject/src/errorpage/errorpage.ts +76 -0
  268. package/source/packages/inject/src/index.ts +62 -0
  269. package/source/packages/inject/src/transport.ts +97 -0
  270. package/source/packages/inject/src/types.d.ts +136 -0
  271. package/source/packages/roxxie-transport/package.json +36 -0
  272. package/source/packages/roxxie-transport/src/binary.ts +398 -0
  273. package/source/packages/roxxie-transport/src/config.ts +254 -0
  274. package/source/packages/roxxie-transport/src/connection.ts +767 -0
  275. package/source/packages/roxxie-transport/src/index.ts +5 -0
  276. package/source/packages/roxxie-transport/src/tracker.ts +651 -0
  277. package/source/packages/roxxie-transport/src/transport.ts +414 -0
  278. package/source/packages/roxxie-transport/tsconfig.json +18 -0
  279. package/source/packages/scramjet/packages/controller/package.json +37 -0
  280. package/source/packages/scramjet/packages/controller/src/index.ts +861 -0
  281. package/source/packages/scramjet/packages/controller/src/inject.ts +365 -0
  282. package/source/packages/scramjet/packages/controller/src/sw.ts +231 -0
  283. package/source/packages/scramjet/packages/controller/src/symbols.ts +1 -0
  284. package/source/packages/scramjet/packages/controller/src/types.d.ts +140 -0
  285. package/source/packages/scramjet/packages/controller/src/typesEntry.ts +6 -0
  286. package/source/packages/scramjet/packages/controller/src/version.ts +30 -0
  287. package/source/packages/scramjet/packages/controller/tsconfig.json +24 -0
  288. package/source/packages/scramjet/packages/core/dist/scramjet-external.mjs +57 -0
  289. package/source/packages/scramjet/packages/core/dist/scramjet.js +13599 -0
  290. package/source/packages/scramjet/packages/core/dist/scramjet.js.map +1 -0
  291. package/source/packages/scramjet/packages/core/dist/scramjet.mjs +13649 -0
  292. package/source/packages/scramjet/packages/core/dist/scramjet.mjs.map +1 -0
  293. package/source/packages/scramjet/packages/core/dist/scramjet.wasm +0 -0
  294. package/source/packages/scramjet/packages/core/dist/scramjet_bundled.js +13601 -0
  295. package/source/packages/scramjet/packages/core/dist/scramjet_bundled.js.map +1 -0
  296. package/source/packages/scramjet/packages/core/dist/scramjet_bundled.mjs +13651 -0
  297. package/source/packages/scramjet/packages/core/dist/scramjet_bundled.mjs.map +1 -0
  298. package/source/packages/scramjet/packages/core/dist/temp-types-build/index.js +23 -0
  299. package/source/packages/scramjet/packages/core/dist/temp-types-build/index.js.map +1 -0
  300. package/source/packages/scramjet/packages/core/dist/types/Tap.d.ts +39 -0
  301. package/source/packages/scramjet/packages/core/dist/types/client/client.d.ts +115 -0
  302. package/source/packages/scramjet/packages/core/dist/types/client/entry.d.ts +5 -0
  303. package/source/packages/scramjet/packages/core/dist/types/client/events.d.ts +10 -0
  304. package/source/packages/scramjet/packages/core/dist/types/client/helpers.d.ts +1 -0
  305. package/source/packages/scramjet/packages/core/dist/types/client/index.d.ts +7 -0
  306. package/source/packages/scramjet/packages/core/dist/types/client/location.d.ts +2 -0
  307. package/source/packages/scramjet/packages/core/dist/types/client/shared/eval.d.ts +3 -0
  308. package/source/packages/scramjet/packages/core/dist/types/client/shared/sourcemaps.d.ts +19 -0
  309. package/source/packages/scramjet/packages/core/dist/types/client/shared/wrap.d.ts +4 -0
  310. package/source/packages/scramjet/packages/core/dist/types/client/singletonbox.d.ts +18 -0
  311. package/source/packages/scramjet/packages/core/dist/types/fetch/body.d.ts +3 -0
  312. package/source/packages/scramjet/packages/core/dist/types/fetch/fetch.d.ts +7 -0
  313. package/source/packages/scramjet/packages/core/dist/types/fetch/headers.d.ts +19 -0
  314. package/source/packages/scramjet/packages/core/dist/types/fetch/index.d.ts +128 -0
  315. package/source/packages/scramjet/packages/core/dist/types/fetch/parse.d.ts +23 -0
  316. package/source/packages/scramjet/packages/core/dist/types/fetch/util.d.ts +7 -0
  317. package/source/packages/scramjet/packages/core/dist/types/index.d.ts +12 -0
  318. package/source/packages/scramjet/packages/core/dist/types/shared/cookie.d.ts +26 -0
  319. package/source/packages/scramjet/packages/core/dist/types/shared/headers.d.ts +13 -0
  320. package/source/packages/scramjet/packages/core/dist/types/shared/htmlRules.d.ts +6 -0
  321. package/source/packages/scramjet/packages/core/dist/types/shared/index.d.ts +50 -0
  322. package/source/packages/scramjet/packages/core/dist/types/shared/mime.d.ts +53 -0
  323. package/source/packages/scramjet/packages/core/dist/types/shared/refresh.d.ts +7 -0
  324. package/source/packages/scramjet/packages/core/dist/types/shared/rewriters/css.d.ts +4 -0
  325. package/source/packages/scramjet/packages/core/dist/types/shared/rewriters/html.d.ts +33 -0
  326. package/source/packages/scramjet/packages/core/dist/types/shared/rewriters/index.d.ts +6 -0
  327. package/source/packages/scramjet/packages/core/dist/types/shared/rewriters/js.d.ts +11 -0
  328. package/source/packages/scramjet/packages/core/dist/types/shared/rewriters/url.d.ts +24 -0
  329. package/source/packages/scramjet/packages/core/dist/types/shared/rewriters/wasm.d.ts +7 -0
  330. package/source/packages/scramjet/packages/core/dist/types/shared/rewriters/worker.d.ts +3 -0
  331. package/source/packages/scramjet/packages/core/dist/types/shared/set-cookie-parser.d.ts +20 -0
  332. package/source/packages/scramjet/packages/core/dist/types/shared/snapshot.d.ts +186 -0
  333. package/source/packages/scramjet/packages/core/dist/types/shared/sniffEncoding.d.ts +65 -0
  334. package/source/packages/scramjet/packages/core/dist/types/shared/util.d.ts +2 -0
  335. package/source/packages/scramjet/packages/core/dist/types/symbols.d.ts +6 -0
  336. package/source/packages/scramjet/packages/core/dist/types/types.d.ts +60 -0
  337. package/source/packages/scramjet/packages/core/dist/types/typesEntry.d.ts +5 -0
  338. package/source/packages/scramjet/packages/core/lib/index.cjs +7 -0
  339. package/source/packages/scramjet/packages/core/lib/index.d.ts +8 -0
  340. package/source/packages/scramjet/packages/core/package.json +69 -0
  341. package/source/packages/scramjet/packages/core/rewriter/Cargo.lock +1985 -0
  342. package/source/packages/scramjet/packages/core/rewriter/Cargo.toml +20 -0
  343. package/source/packages/scramjet/packages/core/rewriter/coverage-macro/Cargo.toml +15 -0
  344. package/source/packages/scramjet/packages/core/rewriter/coverage-macro/src/analyze.rs +1118 -0
  345. package/source/packages/scramjet/packages/core/rewriter/coverage-macro/src/ast_table.rs +927 -0
  346. package/source/packages/scramjet/packages/core/rewriter/coverage-macro/src/helper_index.rs +556 -0
  347. package/source/packages/scramjet/packages/core/rewriter/coverage-macro/src/lib.rs +455 -0
  348. package/source/packages/scramjet/packages/core/rewriter/coverage-macro/src/reachability.rs +85 -0
  349. package/source/packages/scramjet/packages/core/rewriter/coverage-macro/src/templates.rs +192 -0
  350. package/source/packages/scramjet/packages/core/rewriter/coverage-macro/src/witness.rs +597 -0
  351. package/source/packages/scramjet/packages/core/rewriter/js/Cargo.toml +18 -0
  352. package/source/packages/scramjet/packages/core/rewriter/js/src/cfg.rs +45 -0
  353. package/source/packages/scramjet/packages/core/rewriter/js/src/changes.rs +379 -0
  354. package/source/packages/scramjet/packages/core/rewriter/js/src/lib.rs +171 -0
  355. package/source/packages/scramjet/packages/core/rewriter/js/src/rewrite.rs +290 -0
  356. package/source/packages/scramjet/packages/core/rewriter/js/src/visitor.rs +967 -0
  357. package/source/packages/scramjet/packages/core/rewriter/native/Cargo.toml +22 -0
  358. package/source/packages/scramjet/packages/core/rewriter/native/src/main.rs +166 -0
  359. package/source/packages/scramjet/packages/core/rewriter/native/src/rewriter.rs +161 -0
  360. package/source/packages/scramjet/packages/core/rewriter/native/src/test_runner.rs +156 -0
  361. package/source/packages/scramjet/packages/core/rewriter/rust-toolchain.toml +5 -0
  362. package/source/packages/scramjet/packages/core/rewriter/rustfmt.toml +2 -0
  363. package/source/packages/scramjet/packages/core/rewriter/transform/Cargo.toml +16 -0
  364. package/source/packages/scramjet/packages/core/rewriter/transform/src/lib.rs +242 -0
  365. package/source/packages/scramjet/packages/core/rewriter/transform/src/transform.rs +123 -0
  366. package/source/packages/scramjet/packages/core/rewriter/wasm/Cargo.toml +22 -0
  367. package/source/packages/scramjet/packages/core/rewriter/wasm/build.sh +128 -0
  368. package/source/packages/scramjet/packages/core/rewriter/wasm/src/error.rs +56 -0
  369. package/source/packages/scramjet/packages/core/rewriter/wasm/src/jsr.rs +125 -0
  370. package/source/packages/scramjet/packages/core/rewriter/wasm/src/lib.rs +144 -0
  371. package/source/packages/scramjet/packages/core/src/Tap.ts +166 -0
  372. package/source/packages/scramjet/packages/core/src/client/client.ts +916 -0
  373. package/source/packages/scramjet/packages/core/src/client/dom/attr.ts +94 -0
  374. package/source/packages/scramjet/packages/core/src/client/dom/beacon.ts +11 -0
  375. package/source/packages/scramjet/packages/core/src/client/dom/cookie.ts +21 -0
  376. package/source/packages/scramjet/packages/core/src/client/dom/css.ts +106 -0
  377. package/source/packages/scramjet/packages/core/src/client/dom/document.ts +140 -0
  378. package/source/packages/scramjet/packages/core/src/client/dom/element.ts +783 -0
  379. package/source/packages/scramjet/packages/core/src/client/dom/fontface.ts +11 -0
  380. package/source/packages/scramjet/packages/core/src/client/dom/fragments.ts +32 -0
  381. package/source/packages/scramjet/packages/core/src/client/dom/history.ts +35 -0
  382. package/source/packages/scramjet/packages/core/src/client/dom/open.ts +59 -0
  383. package/source/packages/scramjet/packages/core/src/client/dom/origin.ts +13 -0
  384. package/source/packages/scramjet/packages/core/src/client/dom/performance.ts +50 -0
  385. package/source/packages/scramjet/packages/core/src/client/dom/protocol.ts +17 -0
  386. package/source/packages/scramjet/packages/core/src/client/dom/storage.ts +107 -0
  387. package/source/packages/scramjet/packages/core/src/client/entry.ts +12 -0
  388. package/source/packages/scramjet/packages/core/src/client/events.ts +10 -0
  389. package/source/packages/scramjet/packages/core/src/client/helpers.ts +7 -0
  390. package/source/packages/scramjet/packages/core/src/client/index.ts +7 -0
  391. package/source/packages/scramjet/packages/core/src/client/location.ts +139 -0
  392. package/source/packages/scramjet/packages/core/src/client/shared/antiantidebugger.ts +20 -0
  393. package/source/packages/scramjet/packages/core/src/client/shared/blob.ts +35 -0
  394. package/source/packages/scramjet/packages/core/src/client/shared/caches.ts +31 -0
  395. package/source/packages/scramjet/packages/core/src/client/shared/chrome.ts +90 -0
  396. package/source/packages/scramjet/packages/core/src/client/shared/err.ts +55 -0
  397. package/source/packages/scramjet/packages/core/src/client/shared/error.ts +42 -0
  398. package/source/packages/scramjet/packages/core/src/client/shared/eval.ts +40 -0
  399. package/source/packages/scramjet/packages/core/src/client/shared/event.ts +215 -0
  400. package/source/packages/scramjet/packages/core/src/client/shared/function.ts +59 -0
  401. package/source/packages/scramjet/packages/core/src/client/shared/import.ts +46 -0
  402. package/source/packages/scramjet/packages/core/src/client/shared/indexeddb.ts +18 -0
  403. package/source/packages/scramjet/packages/core/src/client/shared/opfs.ts +27 -0
  404. package/source/packages/scramjet/packages/core/src/client/shared/postmessage.ts +113 -0
  405. package/source/packages/scramjet/packages/core/src/client/shared/realm.ts +26 -0
  406. package/source/packages/scramjet/packages/core/src/client/shared/requests/eventsource.ts +17 -0
  407. package/source/packages/scramjet/packages/core/src/client/shared/requests/fetch.ts +67 -0
  408. package/source/packages/scramjet/packages/core/src/client/shared/requests/websocket.ts +389 -0
  409. package/source/packages/scramjet/packages/core/src/client/shared/requests/xmlhttprequest.ts +163 -0
  410. package/source/packages/scramjet/packages/core/src/client/shared/settimeout.ts +20 -0
  411. package/source/packages/scramjet/packages/core/src/client/shared/sourcemaps.ts +203 -0
  412. package/source/packages/scramjet/packages/core/src/client/shared/worker.ts +72 -0
  413. package/source/packages/scramjet/packages/core/src/client/shared/wrap.ts +197 -0
  414. package/source/packages/scramjet/packages/core/src/client/singletonbox.ts +52 -0
  415. package/source/packages/scramjet/packages/core/src/client/worker/importScripts.ts +13 -0
  416. package/source/packages/scramjet/packages/core/src/fetch/body.ts +93 -0
  417. package/source/packages/scramjet/packages/core/src/fetch/fetch.ts +323 -0
  418. package/source/packages/scramjet/packages/core/src/fetch/headers.ts +528 -0
  419. package/source/packages/scramjet/packages/core/src/fetch/index.ts +198 -0
  420. package/source/packages/scramjet/packages/core/src/fetch/parse.ts +149 -0
  421. package/source/packages/scramjet/packages/core/src/fetch/util.ts +81 -0
  422. package/source/packages/scramjet/packages/core/src/global.d.ts +32 -0
  423. package/source/packages/scramjet/packages/core/src/index.ts +78 -0
  424. package/source/packages/scramjet/packages/core/src/log.ts +117 -0
  425. package/source/packages/scramjet/packages/core/src/shared/cookie.ts +199 -0
  426. package/source/packages/scramjet/packages/core/src/shared/headers.ts +76 -0
  427. package/source/packages/scramjet/packages/core/src/shared/htmlRules.ts +154 -0
  428. package/source/packages/scramjet/packages/core/src/shared/index.ts +79 -0
  429. package/source/packages/scramjet/packages/core/src/shared/mime.ts +234 -0
  430. package/source/packages/scramjet/packages/core/src/shared/refresh.ts +164 -0
  431. package/source/packages/scramjet/packages/core/src/shared/rewriters/css.ts +67 -0
  432. package/source/packages/scramjet/packages/core/src/shared/rewriters/html.ts +603 -0
  433. package/source/packages/scramjet/packages/core/src/shared/rewriters/index.ts +6 -0
  434. package/source/packages/scramjet/packages/core/src/shared/rewriters/js.ts +158 -0
  435. package/source/packages/scramjet/packages/core/src/shared/rewriters/url.ts +248 -0
  436. package/source/packages/scramjet/packages/core/src/shared/rewriters/wasm.ts +58 -0
  437. package/source/packages/scramjet/packages/core/src/shared/rewriters/worker.ts +37 -0
  438. package/source/packages/scramjet/packages/core/src/shared/set-cookie-parser.ts +195 -0
  439. package/source/packages/scramjet/packages/core/src/shared/snapshot.ts +245 -0
  440. package/source/packages/scramjet/packages/core/src/shared/sniffEncoding.ts +1061 -0
  441. package/source/packages/scramjet/packages/core/src/shared/util.ts +35 -0
  442. package/source/packages/scramjet/packages/core/src/symbols.ts +9 -0
  443. package/source/packages/scramjet/packages/core/src/sync.ts +63 -0
  444. package/source/packages/scramjet/packages/core/src/types.ts +66 -0
  445. package/source/packages/scramjet/packages/core/src/typesEntry.ts +6 -0
  446. package/source/packages/scramjet/packages/core/tsconfig.json +21 -0
  447. package/source/packages/scramjet/packages/rpc/index.ts +100 -0
  448. package/source/packages/scramjet/packages/rpc/package.json +7 -0
  449. package/source/packages/scramjet/packages/utils/package.json +39 -0
  450. package/source/packages/scramjet/packages/utils/src/alwaysLastBubble.ts +172 -0
  451. package/source/packages/scramjet/packages/utils/src/catch-escaped-links.ts +34 -0
  452. package/source/packages/scramjet/packages/utils/src/event-handler-plugin.ts +86 -0
  453. package/source/packages/scramjet/packages/utils/src/global.d.ts +8 -0
  454. package/source/packages/scramjet/packages/utils/src/http-cache-plugin.ts +475 -0
  455. package/source/packages/scramjet/packages/utils/src/index.ts +26 -0
  456. package/source/packages/scramjet/packages/utils/src/link-handler-plugin.ts +75 -0
  457. package/source/packages/scramjet/packages/utils/src/typesEntry.ts +5 -0
  458. package/source/packages/scramjet/packages/utils/src/url-watcher.ts +37 -0
  459. package/source/packages/scramjet/packages/utils/src/version.ts +40 -0
  460. package/source/packages/scramjet/packages/utils/tsconfig.json +11 -0
  461. package/source/packages/scramjet/patches/htmlparser2@12.0.0.patch +124 -0
  462. package/source/packages/scramjet/rspack.config.ts +613 -0
  463. package/source/packages/scramjet/tsconfig.json +11 -0
  464. package/source/packages/tracker-protocol/package.json +31 -0
  465. package/source/packages/tracker-protocol/src/index.ts +745 -0
  466. package/source/packages/tracker-protocol/tsconfig.json +18 -0
  467. package/source/pnpm-lock.yaml +12018 -0
  468. package/source/pnpm-workspace.yaml +31 -0
  469. package/source/rspack.config.ts +103 -0
  470. package/source/scripts/update-adblock-assets.mjs +164 -0
  471. package/third_party/filter-lists/LICENSE-CC-BY-SA-3.0.txt +359 -0
  472. package/third_party/filter-lists/LICENSE-GPL-3.0.txt +674 -0
  473. package/third_party/filter-lists/LICENSE-MPL-2.0.txt +375 -0
  474. package/third_party/filter-lists/README.md +24 -0
  475. package/third_party/filter-lists/easylist.txt +83088 -0
  476. package/third_party/filter-lists/easyprivacy.txt +56361 -0
  477. package/third_party/filter-lists/manifest.json +56 -0
  478. package/third_party/filter-lists/ublock-filters.txt +10937 -0
  479. package/third_party/filter-lists/ublock-privacy.txt +3209 -0
  480. package/third_party/filter-lists/ublock-resources.json +1852 -0
  481. package/third_party/filter-lists/ublock-unbreak.txt +6026 -0
@@ -0,0 +1,556 @@
1
+ //! Build a global index of every method in visitor.rs that takes a `&AstNode`
2
+ //! as its first non-self argument. For each, recursively analyze the body to
3
+ //! determine whether it fully covers all R-reaching fields of that node.
4
+ //!
5
+ //! Helpers (`recurse_*`, `handle_*`) get the same treatment as visit_* methods
6
+ //! — if their body provably walks every R-field of their input, they're
7
+ //! recorded as "fully covers". Callers can then credit the corresponding
8
+ //! field at the call site.
9
+
10
+ use std::collections::HashMap;
11
+
12
+ use syn::{Expr, FnArg, ImplItem, Item, Pat, PatType, Type};
13
+
14
+ use crate::reachability::AstGraph;
15
+
16
+ /// Per-AST-typed-argument coverage data.
17
+ #[derive(Clone, Debug)]
18
+ pub struct HelperArg {
19
+ pub name: String,
20
+ pub ast_type: String,
21
+ /// 0-based index of this arg in the original `fn helper(&mut self, a,
22
+ /// b, c, ...)` signature (excluding `self`). Needed at call sites to
23
+ /// pair the helper's per-arg coverage with the right positional call
24
+ /// argument (since non-AST args are filtered out of `args` but appear in
25
+ /// the call expression's positional list).
26
+ pub call_pos: usize,
27
+ pub fully_covers: bool,
28
+ pub covered_set: std::collections::BTreeSet<String>,
29
+ pub covered_all: bool,
30
+ }
31
+
32
+ #[derive(Clone, Debug)]
33
+ pub struct HelperInfo {
34
+ pub name: String,
35
+ pub args: Vec<HelperArg>,
36
+
37
+ // Backward-compat: views over args[0]. These shadow the per-arg fields so
38
+ // existing call sites that read `info.node_type` / `info.fully_covers` /
39
+ // `info.covered_set` / `info.covered_all` keep working.
40
+ pub node_type: String,
41
+ pub it_param_name: String,
42
+ pub fully_covers: bool,
43
+ pub covered_set: std::collections::BTreeSet<String>,
44
+ pub covered_all: bool,
45
+ }
46
+
47
+ impl HelperInfo {
48
+ pub fn refresh_first_arg_view(&mut self) {
49
+ if let Some(a) = self.args.first() {
50
+ self.node_type = a.ast_type.clone();
51
+ self.it_param_name = a.name.clone();
52
+ self.fully_covers = a.fully_covers;
53
+ self.covered_set = a.covered_set.clone();
54
+ self.covered_all = a.covered_all;
55
+ }
56
+ }
57
+ }
58
+
59
+ /// Working copy used only during build_index (carries the body for analysis).
60
+ #[derive(Clone, Debug)]
61
+ struct WorkingHelper {
62
+ info: HelperInfo,
63
+ body: syn::Block,
64
+ }
65
+
66
+ #[derive(Default, Debug, Clone)]
67
+ pub struct HelperIndex {
68
+ by_name: HashMap<String, HelperInfo>,
69
+ }
70
+
71
+ impl HelperIndex {
72
+ pub fn lookup(&self, name: &str) -> Option<&HelperInfo> {
73
+ self.by_name.get(name)
74
+ }
75
+ pub fn all(&self) -> impl Iterator<Item = &HelperInfo> {
76
+ self.by_name.values()
77
+ }
78
+ }
79
+
80
+ /// Lazily parse visitor.rs and build the index. The result contains only
81
+ /// owned `String` values and no proc_macro2 tokens — safe to cache across
82
+ /// macro invocations.
83
+ ///
84
+ /// We cache the file's content hash + the resulting HelperIndex so we don't
85
+ /// re-parse on every proc-macro invocation. (Tokens would be use-after-free
86
+ /// across invocations, but Strings/bools are fine.)
87
+ pub fn index() -> HelperIndex {
88
+ use std::sync::Mutex;
89
+ static CACHE: Mutex<Option<(u64, HelperIndex)>> = Mutex::new(None);
90
+
91
+ let Some(path) = locate_visitor_rs() else {
92
+ return HelperIndex::default();
93
+ };
94
+ let Ok(src) = std::fs::read_to_string(&path) else {
95
+ return HelperIndex::default();
96
+ };
97
+ // Cheap content hash.
98
+ let mut hash: u64 = 1469598103934665603;
99
+ for b in src.bytes() {
100
+ hash ^= b as u64;
101
+ hash = hash.wrapping_mul(1099511628211);
102
+ }
103
+ {
104
+ let g = CACHE.lock().unwrap();
105
+ if let Some((h, idx)) = g.as_ref() {
106
+ if *h == hash {
107
+ return idx.clone();
108
+ }
109
+ }
110
+ }
111
+ let idx = build_index_from(&src);
112
+ let mut g = CACHE.lock().unwrap();
113
+ *g = Some((hash, idx.clone()));
114
+ idx
115
+ }
116
+
117
+ fn build_index_from(src: &str) -> HelperIndex {
118
+ let Ok(file) = syn::parse_file(src) else {
119
+ return HelperIndex::default();
120
+ };
121
+
122
+ let mut working: HashMap<String, WorkingHelper> = HashMap::new();
123
+
124
+ for item in &file.items {
125
+ if let Item::Impl(imp) = item {
126
+ for ii in &imp.items {
127
+ if let ImplItem::Fn(f) = ii {
128
+ if let Some(w) = extract_method(f) {
129
+ working.insert(w.info.name.clone(), w);
130
+ }
131
+ }
132
+ }
133
+ }
134
+ }
135
+
136
+ // Fixpoint: re-check each helper's full-coverage until stable.
137
+ let graph = AstGraph::build();
138
+ loop {
139
+ let mut changed = false;
140
+ let names: Vec<String> = working.keys().cloned().collect();
141
+ // Snapshot infos for analyze_helper input.
142
+ let infos_snapshot: HashMap<String, HelperInfo> = working
143
+ .iter()
144
+ .map(|(k, v)| (k.clone(), v.info.clone()))
145
+ .collect();
146
+ for name in names {
147
+ let w = working.get(&name).unwrap().clone();
148
+ // Re-analyze each AST-typed arg independently.
149
+ let mut new_args = w.info.args.clone();
150
+ let mut any_changed = false;
151
+ for arg_idx in 0..new_args.len() {
152
+ let (fully, set, all) =
153
+ analyze_helper_arg(&w, arg_idx, &infos_snapshot, &graph);
154
+ let a = &mut new_args[arg_idx];
155
+ if fully != a.fully_covers || all != a.covered_all || set != a.covered_set {
156
+ a.fully_covers = fully;
157
+ a.covered_set = set;
158
+ a.covered_all = all;
159
+ any_changed = true;
160
+ }
161
+ }
162
+ if any_changed {
163
+ let info = &mut working.get_mut(&name).unwrap().info;
164
+ info.args = new_args;
165
+ info.refresh_first_arg_view();
166
+ changed = true;
167
+ }
168
+ }
169
+ if !changed {
170
+ break;
171
+ }
172
+ }
173
+
174
+ HelperIndex {
175
+ by_name: working.into_iter().map(|(k, v)| (k, v.info)).collect(),
176
+ }
177
+ }
178
+
179
+ fn locate_visitor_rs() -> Option<String> {
180
+ if let Ok(p) = std::env::var("COVERAGE_VISITOR_FILE") {
181
+ return Some(p);
182
+ }
183
+ // Default: relative to coverage-macro's CARGO_MANIFEST_DIR.
184
+ let dir = env!("CARGO_MANIFEST_DIR");
185
+ Some(format!("{dir}/../js/src/visitor.rs"))
186
+ }
187
+
188
+ fn extract_method(f: &syn::ImplItemFn) -> Option<WorkingHelper> {
189
+ let name = f.sig.ident.to_string();
190
+ let mut iter = f.sig.inputs.iter();
191
+ let _recv = iter.next()?;
192
+ // Collect every &T arg whose T resolves to a known AST type.
193
+ let mut args: Vec<HelperArg> = Vec::new();
194
+ let graph = AstGraph::build();
195
+ for (pos, arg) in iter.enumerate() {
196
+ let FnArg::Typed(PatType { pat, ty, .. }) = arg else { continue };
197
+ let pname = match pat.as_ref() {
198
+ Pat::Ident(p) => p.ident.to_string(),
199
+ _ => continue,
200
+ };
201
+ let Some(ast_type) = extract_ref_type_name(ty) else { continue };
202
+ // Only accept types we know are AST nodes (in our shape table).
203
+ if !graph.nodes.contains_key(ast_type.as_str()) {
204
+ continue;
205
+ }
206
+ args.push(HelperArg {
207
+ name: pname,
208
+ ast_type,
209
+ call_pos: pos,
210
+ fully_covers: false,
211
+ covered_set: std::collections::BTreeSet::new(),
212
+ covered_all: false,
213
+ });
214
+ }
215
+ if args.is_empty() { return None; }
216
+ let mut info = HelperInfo {
217
+ name,
218
+ args,
219
+ node_type: String::new(),
220
+ it_param_name: String::new(),
221
+ fully_covers: false,
222
+ covered_set: std::collections::BTreeSet::new(),
223
+ covered_all: false,
224
+ };
225
+ info.refresh_first_arg_view();
226
+ Some(WorkingHelper { info, body: f.block.clone() })
227
+ }
228
+
229
+ /// Given a `&Foo<'a>` or `&Foo` type, return `"Foo"`. Handles fully-qualified
230
+ /// paths like `oxc::ast::ast::Foo` by taking the last segment.
231
+ fn extract_ref_type_name(ty: &Type) -> Option<String> {
232
+ let Type::Reference(r) = ty else { return None };
233
+ let Type::Path(tp) = r.elem.as_ref() else {
234
+ return None;
235
+ };
236
+ let last = tp.path.segments.last()?;
237
+ Some(last.ident.to_string())
238
+ }
239
+
240
+ /// Returns (fully_covers, covered_set, covered_all) for the helper's
241
+ /// first AST arg. (Kept for the snippet-builder/fixpoint convenience.)
242
+ #[allow(dead_code)]
243
+ fn analyze_helper(
244
+ w: &WorkingHelper,
245
+ helpers: &HashMap<String, HelperInfo>,
246
+ graph: &AstGraph,
247
+ ) -> (bool, std::collections::BTreeSet<String>, bool) {
248
+ analyze_helper_arg(w, 0, helpers, graph)
249
+ }
250
+
251
+ /// Analyzes the helper's body treating arg #`arg_idx` as the "it" being
252
+ /// covered. Returns its (fully_covers, covered_set, covered_all).
253
+ fn analyze_helper_arg(
254
+ w: &WorkingHelper,
255
+ arg_idx: usize,
256
+ helpers: &HashMap<String, HelperInfo>,
257
+ graph: &AstGraph,
258
+ ) -> (bool, std::collections::BTreeSet<String>, bool) {
259
+ let Some(arg) = w.info.args.get(arg_idx) else {
260
+ return (false, std::collections::BTreeSet::new(), false);
261
+ };
262
+ let Some(def) = graph.nodes.get(arg.ast_type.as_str()) else {
263
+ return (false, std::collections::BTreeSet::new(), false);
264
+ };
265
+
266
+ let mut origins = OriginMap::new();
267
+ // Treat the analyzed arg as `it` for this pass. Other AST args get a
268
+ // best-effort Origin::Unknown so walks on them don't credit the wrong
269
+ // field.
270
+ origins.set_binding(&arg.name, Binding::it(Some(arg.ast_type.clone())));
271
+ for (i, other) in w.info.args.iter().enumerate() {
272
+ if i == arg_idx { continue; }
273
+ origins.set_binding(
274
+ &other.name,
275
+ Binding {
276
+ origin: Origin::Unknown,
277
+ ast_type: Some(other.ast_type.clone()),
278
+ },
279
+ );
280
+ }
281
+
282
+ // Optimistic self-coverage on every arg so recursive helpers don't
283
+ // pessimize themselves.
284
+ let mut optimistic_helpers = helpers.clone();
285
+ if let Some(self_info) = optimistic_helpers.get_mut(&w.info.name) {
286
+ for a in &mut self_info.args {
287
+ a.fully_covers = true;
288
+ }
289
+ self_info.refresh_first_arg_view();
290
+ }
291
+
292
+ let paths = crate::analyze::analyze_with_helpers_typed(
293
+ &w.body,
294
+ &arg.name,
295
+ Some(&arg.ast_type),
296
+ &optimistic_helpers,
297
+ graph,
298
+ origins,
299
+ );
300
+
301
+ // Compute intersection of covered across all paths (the conservative
302
+ // "always covered" set).
303
+ let mut combined: Option<crate::analyze::Covered> = None;
304
+ for p in &paths {
305
+ combined = Some(match combined {
306
+ None => p.covered.clone(),
307
+ Some(prev) => crate::analyze::Covered::intersect(&prev, &p.covered),
308
+ });
309
+ }
310
+ let combined = combined.unwrap_or(crate::analyze::Covered::empty());
311
+
312
+ // Verify fully_covers across all paths.
313
+ let mut fully = true;
314
+ for p in &paths {
315
+ let covered_all = p.covered.all;
316
+ for f in def.fields {
317
+ if !graph.field_in_r(f) {
318
+ continue;
319
+ }
320
+ if !covered_all && !p.covered.fields.iter().any(|n| n == f.name) {
321
+ fully = false;
322
+ break;
323
+ }
324
+ }
325
+ // For enum node_types (no fields, only variants), fully_covers
326
+ // requires covered_all (the helper must walk the whole enum).
327
+ if def.fields.is_empty() && !def.variants.is_empty() && !covered_all {
328
+ fully = false;
329
+ }
330
+ if !fully { break; }
331
+ }
332
+
333
+ (fully, combined.fields, combined.all)
334
+ }
335
+
336
+ /// A local binding's tracked information: where in the AST it comes from
337
+ /// (relative to `it`) and what AST type it holds.
338
+ #[derive(Clone, Debug)]
339
+ pub struct Binding {
340
+ pub origin: Origin,
341
+ /// AST node type (e.g. "AssignmentTarget", "BindingPattern"). None when
342
+ /// the type couldn't be inferred from the binding site.
343
+ pub ast_type: Option<String>,
344
+ }
345
+
346
+ impl Binding {
347
+ pub fn unknown() -> Self {
348
+ Self { origin: Origin::Unknown, ast_type: None }
349
+ }
350
+ pub fn it(ty: Option<String>) -> Self {
351
+ Self { origin: Origin::It, ast_type: ty }
352
+ }
353
+ pub fn with_origin(origin: Origin) -> Self {
354
+ Self { origin, ast_type: None }
355
+ }
356
+ }
357
+
358
+ /// Tracks per-local origin AND ast type within a method body.
359
+ #[derive(Clone, Debug, Default)]
360
+ pub struct OriginMap {
361
+ map: HashMap<String, Binding>,
362
+ }
363
+
364
+ impl OriginMap {
365
+ pub fn new() -> Self {
366
+ Self::default()
367
+ }
368
+ /// Backward-compat: set just the origin, leave type unknown.
369
+ pub fn set(&mut self, name: &str, origin: Origin) {
370
+ self.map.insert(name.to_string(), Binding::with_origin(origin));
371
+ }
372
+ pub fn set_binding(&mut self, name: &str, b: Binding) {
373
+ self.map.insert(name.to_string(), b);
374
+ }
375
+ pub fn get(&self, name: &str) -> Origin {
376
+ self.map
377
+ .get(name)
378
+ .map(|b| b.origin.clone())
379
+ .unwrap_or(Origin::Unknown)
380
+ }
381
+ pub fn get_binding(&self, name: &str) -> Binding {
382
+ self.map.get(name).cloned().unwrap_or_else(Binding::unknown)
383
+ }
384
+ pub fn get_type(&self, name: &str) -> Option<String> {
385
+ self.map.get(name).and_then(|b| b.ast_type.clone())
386
+ }
387
+ }
388
+
389
+ #[derive(Clone, Debug)]
390
+ pub enum Origin {
391
+ /// Refers to the `it` arg itself.
392
+ It,
393
+ /// A field of `it`. Sub-accesses (`.bar`, `[i]`) on a Field still carry
394
+ /// the parent field name — we only care which top-level R-field of `it`
395
+ /// is being touched.
396
+ Field(String),
397
+ Unknown,
398
+ }
399
+
400
+ /// Resolve the origin of an expression: trace `&x`, `x.y`, `it.foo`, etc.
401
+ pub fn resolve_origin(e: &Expr, origins: &OriginMap, it_name: &str) -> Origin {
402
+ let inner = match e {
403
+ Expr::Reference(r) => r.expr.as_ref(),
404
+ other => other,
405
+ };
406
+ match inner {
407
+ Expr::Path(p) => {
408
+ if p.path.is_ident(it_name) {
409
+ return Origin::It;
410
+ }
411
+ if let Some(seg) = p.path.get_ident() {
412
+ return origins.get(&seg.to_string());
413
+ }
414
+ Origin::Unknown
415
+ }
416
+ Expr::Field(f) => {
417
+ // Could be `it.foo`, `it.foo.bar`, or `local.field`.
418
+ // Trace the base.
419
+ let base = resolve_origin(&f.base, origins, it_name);
420
+ match base {
421
+ Origin::It => {
422
+ if let syn::Member::Named(n) = &f.member {
423
+ return Origin::Field(n.to_string());
424
+ }
425
+ Origin::Unknown
426
+ }
427
+ other => other,
428
+ }
429
+ }
430
+ Expr::Index(idx) => resolve_origin(&idx.expr, origins, it_name),
431
+ Expr::MethodCall(m) => {
432
+ // e.g. `.unwrap()`, `.as_assignment_target()`. Pass through.
433
+ resolve_origin(&m.receiver, origins, it_name)
434
+ }
435
+ _ => Origin::Unknown,
436
+ }
437
+ }
438
+
439
+ /// Resolve the AST type of an expression.
440
+ ///
441
+ /// - `it` → `it_type`.
442
+ /// - `it.foo` → look up `foo` in `it_type`'s fields → field's type.
443
+ /// - `local` → from the OriginMap.
444
+ /// - `local.foo` → look up `foo` in `local`'s type.
445
+ /// - method calls → small hardcoded table for known oxc conversions
446
+ /// (`as_assignment_target`, `unwrap`, etc.).
447
+ /// - references / indexing → pass through.
448
+ pub fn resolve_type(
449
+ e: &Expr,
450
+ origins: &OriginMap,
451
+ it_name: &str,
452
+ it_type: Option<&str>,
453
+ graph: &crate::reachability::AstGraph,
454
+ ) -> Option<String> {
455
+ let inner = match e {
456
+ Expr::Reference(r) => r.expr.as_ref(),
457
+ other => other,
458
+ };
459
+ match inner {
460
+ Expr::Path(p) => {
461
+ if p.path.is_ident(it_name) {
462
+ return it_type.map(String::from);
463
+ }
464
+ if let Some(seg) = p.path.get_ident() {
465
+ return origins.get_type(&seg.to_string());
466
+ }
467
+ None
468
+ }
469
+ Expr::Field(f) => {
470
+ let base_ty = resolve_type(&f.base, origins, it_name, it_type, graph)?;
471
+ if let syn::Member::Named(n) = &f.member {
472
+ let def = graph.nodes.get(base_ty.as_str())?;
473
+ let field = def.fields.iter().find(|fd| fd.name == n.to_string())?;
474
+ return Some(field.ty.to_string());
475
+ }
476
+ None
477
+ }
478
+ Expr::Index(i) => resolve_type(&i.expr, origins, it_name, it_type, graph),
479
+ Expr::MethodCall(m) => {
480
+ let recv_ty = resolve_type(&m.receiver, origins, it_name, it_type, graph);
481
+ let method = m.method.to_string();
482
+ method_result_type(recv_ty.as_deref(), &method)
483
+ }
484
+ _ => None,
485
+ }
486
+ }
487
+
488
+ /// Hardcoded table for method-call result types. Conservative — returns None
489
+ /// for unknown methods so the type tracker degrades to "I don't know" rather
490
+ /// than asserting a wrong type.
491
+ fn method_result_type(recv: Option<&str>, method: &str) -> Option<String> {
492
+ // Pass-through methods on Option/Result/Box/&T — the inner value type is
493
+ // the same as the receiver's logical type for our purposes.
494
+ let pass_through = [
495
+ "unwrap", "unwrap_or", "unwrap_or_else", "expect", "as_ref", "as_deref",
496
+ "as_mut", "as_deref_mut", "clone", "to_owned",
497
+ ];
498
+ if pass_through.contains(&method) {
499
+ return recv.map(String::from);
500
+ }
501
+ // oxc-specific conversions.
502
+ let recv = recv?;
503
+ match (recv, method) {
504
+ ("ForStatementLeft", "as_assignment_target") => Some("AssignmentTarget".into()),
505
+ ("AssignmentTargetMaybeDefault", "as_assignment_target") => {
506
+ Some("AssignmentTarget".into())
507
+ }
508
+ ("AssignmentTarget", "to_simple_assignment_target") => {
509
+ Some("SimpleAssignmentTarget".into())
510
+ }
511
+ ("MemberExpression", "to_member_expression") => Some("MemberExpression".into()),
512
+ ("BindingPattern", "get_identifier_name") => None,
513
+ _ => None,
514
+ }
515
+ }
516
+
517
+ /// For loops: `for v in &it.foo` → v's origin = Field("foo").
518
+ /// `resolve_origin` already does the right thing by returning the top-level
519
+ /// `Field(name)` regardless of how deeply we project, so we just delegate.
520
+ pub fn origin_from_iter(iter: &Expr, origins: &OriginMap, it_name: &str) -> Origin {
521
+ resolve_origin(iter, origins, it_name)
522
+ }
523
+
524
+ /// For loops: element type of the iterator. `for v in &it.foo.items` where
525
+ /// `items` is `Vec<X>` → v's type = X. We assume the iterator is a reference
526
+ /// to a Vec/slice/Option whose element is itself an AST type.
527
+ pub fn iter_element_type(
528
+ iter: &Expr,
529
+ origins: &OriginMap,
530
+ it_name: &str,
531
+ it_type: Option<&str>,
532
+ graph: &crate::reachability::AstGraph,
533
+ ) -> Option<String> {
534
+ // The iter expression's type IS the collection field type (e.g.
535
+ // BindingProperty for ObjectPattern.properties: Vec<BindingProperty>).
536
+ // resolve_type peels references and field accesses to give us the inner
537
+ // type. For Vec/Option fields we registered the *element* type in
538
+ // ast_table.rs (Cardinality flags carry that). resolve_type already
539
+ // returns the element type because our table stores `ty` as the element.
540
+ resolve_type(iter, origins, it_name, it_type, graph)
541
+ }
542
+
543
+ #[allow(dead_code)]
544
+ pub fn dump_helpers(idx: &HelperIndex) -> String {
545
+ let mut names: Vec<_> = idx.by_name.keys().cloned().collect();
546
+ names.sort();
547
+ let mut s = String::new();
548
+ for n in names {
549
+ let h = &idx.by_name[&n];
550
+ s.push_str(&format!(
551
+ " {} : &{} -> fully_covers={}\n",
552
+ h.name, h.node_type, h.fully_covers
553
+ ));
554
+ }
555
+ s
556
+ }