one 1.2.82 → 1.2.84

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 (342) hide show
  1. package/devtools/dev.mjs +44 -0
  2. package/devtools/devtools.mjs +540 -0
  3. package/devtools/source-inspector.mjs +201 -0
  4. package/dist/cjs/cli/daemon.cjs +136 -0
  5. package/dist/cjs/cli/daemon.js +112 -0
  6. package/dist/cjs/cli/daemon.js.map +6 -0
  7. package/dist/cjs/cli/daemon.native.js +173 -0
  8. package/dist/cjs/cli/daemon.native.js.map +1 -0
  9. package/dist/cjs/createHandleRequest.cjs +15 -8
  10. package/dist/cjs/createHandleRequest.js +10 -6
  11. package/dist/cjs/createHandleRequest.js.map +1 -1
  12. package/dist/cjs/createHandleRequest.native.js +8 -3
  13. package/dist/cjs/createHandleRequest.native.js.map +1 -1
  14. package/dist/cjs/daemon/index.cjs +24 -0
  15. package/dist/cjs/daemon/index.js +21 -0
  16. package/dist/cjs/daemon/index.js.map +6 -0
  17. package/dist/cjs/daemon/index.native.js +27 -0
  18. package/dist/cjs/daemon/index.native.js.map +1 -0
  19. package/dist/cjs/daemon/ipc.cjs +235 -0
  20. package/dist/cjs/daemon/ipc.js +204 -0
  21. package/dist/cjs/daemon/ipc.js.map +6 -0
  22. package/dist/cjs/daemon/ipc.native.js +276 -0
  23. package/dist/cjs/daemon/ipc.native.js.map +1 -0
  24. package/dist/cjs/daemon/picker.cjs +223 -0
  25. package/dist/cjs/daemon/picker.js +191 -0
  26. package/dist/cjs/daemon/picker.js.map +6 -0
  27. package/dist/cjs/daemon/picker.native.js +308 -0
  28. package/dist/cjs/daemon/picker.native.js.map +1 -0
  29. package/dist/cjs/daemon/proxy.cjs +75 -0
  30. package/dist/cjs/daemon/proxy.js +70 -0
  31. package/dist/cjs/daemon/proxy.js.map +6 -0
  32. package/dist/cjs/daemon/proxy.native.js +81 -0
  33. package/dist/cjs/daemon/proxy.native.js.map +1 -0
  34. package/dist/cjs/daemon/registry.cjs +85 -0
  35. package/dist/cjs/daemon/registry.js +81 -0
  36. package/dist/cjs/daemon/registry.js.map +6 -0
  37. package/dist/cjs/daemon/registry.native.js +120 -0
  38. package/dist/cjs/daemon/registry.native.js.map +1 -0
  39. package/dist/cjs/daemon/server.cjs +178 -0
  40. package/dist/cjs/daemon/server.js +179 -0
  41. package/dist/cjs/daemon/server.js.map +6 -0
  42. package/dist/cjs/daemon/server.native.js +200 -0
  43. package/dist/cjs/daemon/server.native.js.map +1 -0
  44. package/dist/cjs/daemon/tui.cjs +223 -0
  45. package/dist/cjs/daemon/tui.js +192 -0
  46. package/dist/cjs/daemon/tui.js.map +6 -0
  47. package/dist/cjs/daemon/tui.native.js +234 -0
  48. package/dist/cjs/daemon/tui.native.js.map +1 -0
  49. package/dist/cjs/daemon/types.cjs +16 -0
  50. package/dist/cjs/daemon/types.js +14 -0
  51. package/dist/cjs/daemon/types.js.map +6 -0
  52. package/dist/cjs/daemon/types.native.js +19 -0
  53. package/dist/cjs/daemon/types.native.js.map +1 -0
  54. package/dist/cjs/daemon/utils.cjs +74 -0
  55. package/dist/cjs/daemon/utils.js +65 -0
  56. package/dist/cjs/daemon/utils.js.map +6 -0
  57. package/dist/cjs/daemon/utils.native.js +83 -0
  58. package/dist/cjs/daemon/utils.native.js.map +1 -0
  59. package/dist/cjs/fork/createMemoryHistory.cjs +22 -8
  60. package/dist/cjs/fork/createMemoryHistory.js +20 -6
  61. package/dist/cjs/fork/createMemoryHistory.js.map +1 -1
  62. package/dist/cjs/fork/createMemoryHistory.native.js +22 -8
  63. package/dist/cjs/fork/createMemoryHistory.native.js.map +1 -1
  64. package/dist/cjs/fork/useLinking.cjs +52 -13
  65. package/dist/cjs/fork/useLinking.js +35 -10
  66. package/dist/cjs/fork/useLinking.js.map +1 -1
  67. package/dist/cjs/index.cjs +6 -2
  68. package/dist/cjs/index.js +4 -2
  69. package/dist/cjs/index.js.map +2 -2
  70. package/dist/cjs/index.native.js +6 -2
  71. package/dist/cjs/index.native.js.map +1 -1
  72. package/dist/cjs/router/linkingConfig.cjs +13 -2
  73. package/dist/cjs/router/linkingConfig.js +14 -5
  74. package/dist/cjs/router/linkingConfig.js.map +1 -1
  75. package/dist/cjs/router/linkingConfig.native.js +10 -1
  76. package/dist/cjs/router/linkingConfig.native.js.map +1 -1
  77. package/dist/cjs/router/routeMask.cjs +137 -0
  78. package/dist/cjs/router/routeMask.js +127 -0
  79. package/dist/cjs/router/routeMask.js.map +6 -0
  80. package/dist/cjs/router/routeMask.native.js +160 -0
  81. package/dist/cjs/router/routeMask.native.js.map +1 -0
  82. package/dist/cjs/router/router.cjs +26 -3
  83. package/dist/cjs/router/router.js +23 -3
  84. package/dist/cjs/router/router.js.map +1 -1
  85. package/dist/cjs/router/router.native.js +26 -3
  86. package/dist/cjs/router/router.native.js.map +1 -1
  87. package/dist/cjs/router/useScreens.cjs +18 -4
  88. package/dist/cjs/router/useScreens.js +20 -2
  89. package/dist/cjs/router/useScreens.js.map +2 -2
  90. package/dist/cjs/router/useScreens.native.js +16 -0
  91. package/dist/cjs/router/useScreens.native.js.map +1 -1
  92. package/dist/cjs/server/PreloadScripts.native.js +45 -39
  93. package/dist/cjs/server/PreloadScripts.native.js.map +1 -6
  94. package/dist/cjs/ui/TabSlot.cjs +2 -1
  95. package/dist/cjs/ui/TabSlot.js +1 -1
  96. package/dist/cjs/ui/TabSlot.js.map +1 -1
  97. package/dist/cjs/ui/TabSlot.native.js +2 -1
  98. package/dist/cjs/ui/TabSlot.native.js.map +1 -1
  99. package/dist/cjs/ui/Tabs.cjs +8 -4
  100. package/dist/cjs/ui/Tabs.js +8 -4
  101. package/dist/cjs/ui/Tabs.js.map +1 -1
  102. package/dist/cjs/ui/Tabs.native.js +8 -4
  103. package/dist/cjs/ui/Tabs.native.js.map +1 -1
  104. package/dist/cjs/views/Navigator.cjs +13 -12
  105. package/dist/cjs/views/Navigator.js +8 -9
  106. package/dist/cjs/views/Navigator.js.map +1 -1
  107. package/dist/cjs/views/Navigator.native.js +16 -15
  108. package/dist/cjs/views/Navigator.native.js.map +1 -1
  109. package/dist/cjs/vite/DevHead.cjs +2 -909
  110. package/dist/cjs/vite/DevHead.js +1 -917
  111. package/dist/cjs/vite/DevHead.js.map +1 -1
  112. package/dist/cjs/vite/DevHead.native.js +1 -882
  113. package/dist/cjs/vite/DevHead.native.js.map +1 -1
  114. package/dist/cjs/vite/one.cjs +4 -1
  115. package/dist/cjs/vite/one.js +4 -2
  116. package/dist/cjs/vite/one.js.map +1 -1
  117. package/dist/cjs/vite/one.native.js +4 -1
  118. package/dist/cjs/vite/one.native.js.map +1 -1
  119. package/dist/cjs/vite/plugins/devtoolsPlugin.cjs +55 -0
  120. package/dist/cjs/vite/plugins/devtoolsPlugin.js +49 -0
  121. package/dist/cjs/vite/plugins/devtoolsPlugin.js.map +6 -0
  122. package/dist/cjs/vite/plugins/devtoolsPlugin.native.js +58 -0
  123. package/dist/cjs/vite/plugins/devtoolsPlugin.native.js.map +1 -0
  124. package/dist/cjs/vite/plugins/fileSystemRouterPlugin.cjs +1 -6
  125. package/dist/cjs/vite/plugins/fileSystemRouterPlugin.js +1 -6
  126. package/dist/cjs/vite/plugins/fileSystemRouterPlugin.js.map +1 -1
  127. package/dist/cjs/vite/plugins/fileSystemRouterPlugin.native.js +1 -6
  128. package/dist/cjs/vite/plugins/fileSystemRouterPlugin.native.js.map +1 -1
  129. package/dist/cjs/vite/plugins/virtualEntryPlugin.cjs +7 -1
  130. package/dist/cjs/vite/plugins/virtualEntryPlugin.js +5 -1
  131. package/dist/cjs/vite/plugins/virtualEntryPlugin.js.map +1 -1
  132. package/dist/cjs/vite/plugins/virtualEntryPlugin.native.js +8 -1
  133. package/dist/cjs/vite/plugins/virtualEntryPlugin.native.js.map +1 -1
  134. package/dist/esm/cli/daemon.js +89 -0
  135. package/dist/esm/cli/daemon.js.map +6 -0
  136. package/dist/esm/cli/daemon.mjs +102 -0
  137. package/dist/esm/cli/daemon.mjs.map +1 -0
  138. package/dist/esm/cli/daemon.native.js +136 -0
  139. package/dist/esm/cli/daemon.native.js.map +1 -0
  140. package/dist/esm/createHandleRequest.js +10 -5
  141. package/dist/esm/createHandleRequest.js.map +1 -1
  142. package/dist/esm/createHandleRequest.mjs +15 -8
  143. package/dist/esm/createHandleRequest.mjs.map +1 -1
  144. package/dist/esm/createHandleRequest.native.js +8 -3
  145. package/dist/esm/createHandleRequest.native.js.map +1 -1
  146. package/dist/esm/daemon/index.js +8 -0
  147. package/dist/esm/daemon/index.js.map +6 -0
  148. package/dist/esm/daemon/index.mjs +8 -0
  149. package/dist/esm/daemon/index.mjs.map +1 -0
  150. package/dist/esm/daemon/index.native.js +8 -0
  151. package/dist/esm/daemon/index.native.js.map +1 -0
  152. package/dist/esm/daemon/ipc.js +192 -0
  153. package/dist/esm/daemon/ipc.js.map +6 -0
  154. package/dist/esm/daemon/ipc.mjs +191 -0
  155. package/dist/esm/daemon/ipc.mjs.map +1 -0
  156. package/dist/esm/daemon/ipc.native.js +229 -0
  157. package/dist/esm/daemon/ipc.native.js.map +1 -0
  158. package/dist/esm/daemon/picker.js +169 -0
  159. package/dist/esm/daemon/picker.js.map +6 -0
  160. package/dist/esm/daemon/picker.mjs +186 -0
  161. package/dist/esm/daemon/picker.mjs.map +1 -0
  162. package/dist/esm/daemon/picker.native.js +268 -0
  163. package/dist/esm/daemon/picker.native.js.map +1 -0
  164. package/dist/esm/daemon/proxy.js +47 -0
  165. package/dist/esm/daemon/proxy.js.map +6 -0
  166. package/dist/esm/daemon/proxy.mjs +40 -0
  167. package/dist/esm/daemon/proxy.mjs.map +1 -0
  168. package/dist/esm/daemon/proxy.native.js +43 -0
  169. package/dist/esm/daemon/proxy.native.js.map +1 -0
  170. package/dist/esm/daemon/registry.js +65 -0
  171. package/dist/esm/daemon/registry.js.map +6 -0
  172. package/dist/esm/daemon/registry.mjs +53 -0
  173. package/dist/esm/daemon/registry.mjs.map +1 -0
  174. package/dist/esm/daemon/registry.native.js +85 -0
  175. package/dist/esm/daemon/registry.native.js.map +1 -0
  176. package/dist/esm/daemon/server.js +167 -0
  177. package/dist/esm/daemon/server.js.map +6 -0
  178. package/dist/esm/daemon/server.mjs +143 -0
  179. package/dist/esm/daemon/server.mjs.map +1 -0
  180. package/dist/esm/daemon/server.native.js +162 -0
  181. package/dist/esm/daemon/server.native.js.map +1 -0
  182. package/dist/esm/daemon/tui.js +171 -0
  183. package/dist/esm/daemon/tui.js.map +6 -0
  184. package/dist/esm/daemon/tui.mjs +187 -0
  185. package/dist/esm/daemon/tui.mjs.map +1 -0
  186. package/dist/esm/daemon/tui.native.js +195 -0
  187. package/dist/esm/daemon/tui.native.js.map +1 -0
  188. package/dist/esm/daemon/types.js +1 -0
  189. package/dist/esm/daemon/types.js.map +6 -0
  190. package/dist/esm/daemon/types.mjs +2 -0
  191. package/dist/esm/daemon/types.mjs.map +1 -0
  192. package/dist/esm/daemon/types.native.js +2 -0
  193. package/dist/esm/daemon/types.native.js.map +1 -0
  194. package/dist/esm/daemon/utils.js +42 -0
  195. package/dist/esm/daemon/utils.js.map +6 -0
  196. package/dist/esm/daemon/utils.mjs +39 -0
  197. package/dist/esm/daemon/utils.mjs.map +1 -0
  198. package/dist/esm/daemon/utils.native.js +45 -0
  199. package/dist/esm/daemon/utils.native.js.map +1 -0
  200. package/dist/esm/fork/createMemoryHistory.js +20 -6
  201. package/dist/esm/fork/createMemoryHistory.js.map +1 -1
  202. package/dist/esm/fork/createMemoryHistory.mjs +22 -8
  203. package/dist/esm/fork/createMemoryHistory.mjs.map +1 -1
  204. package/dist/esm/fork/createMemoryHistory.native.js +22 -8
  205. package/dist/esm/fork/createMemoryHistory.native.js.map +1 -1
  206. package/dist/esm/fork/useLinking.js +35 -9
  207. package/dist/esm/fork/useLinking.js.map +1 -1
  208. package/dist/esm/fork/useLinking.mjs +52 -13
  209. package/dist/esm/fork/useLinking.mjs.map +1 -1
  210. package/dist/esm/index.js +4 -0
  211. package/dist/esm/index.js.map +1 -1
  212. package/dist/esm/index.mjs +3 -1
  213. package/dist/esm/index.mjs.map +1 -1
  214. package/dist/esm/index.native.js +3 -1
  215. package/dist/esm/index.native.js.map +1 -1
  216. package/dist/esm/router/linkingConfig.js +14 -4
  217. package/dist/esm/router/linkingConfig.js.map +1 -1
  218. package/dist/esm/router/linkingConfig.mjs +12 -1
  219. package/dist/esm/router/linkingConfig.mjs.map +1 -1
  220. package/dist/esm/router/linkingConfig.native.js +10 -1
  221. package/dist/esm/router/linkingConfig.native.js.map +1 -1
  222. package/dist/esm/router/routeMask.js +111 -0
  223. package/dist/esm/router/routeMask.js.map +6 -0
  224. package/dist/esm/router/routeMask.mjs +108 -0
  225. package/dist/esm/router/routeMask.mjs.map +1 -0
  226. package/dist/esm/router/routeMask.native.js +128 -0
  227. package/dist/esm/router/routeMask.native.js.map +1 -0
  228. package/dist/esm/router/router.js +23 -2
  229. package/dist/esm/router/router.js.map +1 -1
  230. package/dist/esm/router/router.mjs +24 -3
  231. package/dist/esm/router/router.mjs.map +1 -1
  232. package/dist/esm/router/router.native.js +24 -3
  233. package/dist/esm/router/router.native.js.map +1 -1
  234. package/dist/esm/router/useScreens.js +20 -2
  235. package/dist/esm/router/useScreens.js.map +1 -1
  236. package/dist/esm/router/useScreens.mjs +18 -4
  237. package/dist/esm/router/useScreens.mjs.map +1 -1
  238. package/dist/esm/router/useScreens.native.js +16 -0
  239. package/dist/esm/router/useScreens.native.js.map +1 -1
  240. package/dist/esm/server/PreloadScripts.native.js +29 -33
  241. package/dist/esm/server/PreloadScripts.native.js.map +1 -6
  242. package/dist/esm/ui/TabSlot.js +1 -1
  243. package/dist/esm/ui/TabSlot.js.map +1 -1
  244. package/dist/esm/ui/TabSlot.mjs +2 -1
  245. package/dist/esm/ui/TabSlot.mjs.map +1 -1
  246. package/dist/esm/ui/TabSlot.native.js +2 -1
  247. package/dist/esm/ui/TabSlot.native.js.map +1 -1
  248. package/dist/esm/ui/Tabs.js +10 -5
  249. package/dist/esm/ui/Tabs.js.map +1 -1
  250. package/dist/esm/ui/Tabs.mjs +9 -5
  251. package/dist/esm/ui/Tabs.mjs.map +1 -1
  252. package/dist/esm/ui/Tabs.native.js +9 -5
  253. package/dist/esm/ui/Tabs.native.js.map +1 -1
  254. package/dist/esm/views/Navigator.js +8 -9
  255. package/dist/esm/views/Navigator.js.map +1 -1
  256. package/dist/esm/views/Navigator.mjs +13 -12
  257. package/dist/esm/views/Navigator.mjs.map +1 -1
  258. package/dist/esm/views/Navigator.native.js +16 -15
  259. package/dist/esm/views/Navigator.native.js.map +1 -1
  260. package/dist/esm/vite/DevHead.js +1 -917
  261. package/dist/esm/vite/DevHead.js.map +1 -1
  262. package/dist/esm/vite/DevHead.mjs +2 -909
  263. package/dist/esm/vite/DevHead.mjs.map +1 -1
  264. package/dist/esm/vite/DevHead.native.js +0 -881
  265. package/dist/esm/vite/DevHead.native.js.map +1 -1
  266. package/dist/esm/vite/one.js +4 -1
  267. package/dist/esm/vite/one.js.map +1 -1
  268. package/dist/esm/vite/one.mjs +4 -1
  269. package/dist/esm/vite/one.mjs.map +1 -1
  270. package/dist/esm/vite/one.native.js +4 -1
  271. package/dist/esm/vite/one.native.js.map +1 -1
  272. package/dist/esm/vite/plugins/devtoolsPlugin.js +33 -0
  273. package/dist/esm/vite/plugins/devtoolsPlugin.js.map +6 -0
  274. package/dist/esm/vite/plugins/devtoolsPlugin.mjs +31 -0
  275. package/dist/esm/vite/plugins/devtoolsPlugin.mjs.map +1 -0
  276. package/dist/esm/vite/plugins/devtoolsPlugin.native.js +31 -0
  277. package/dist/esm/vite/plugins/devtoolsPlugin.native.js.map +1 -0
  278. package/dist/esm/vite/plugins/fileSystemRouterPlugin.js +1 -6
  279. package/dist/esm/vite/plugins/fileSystemRouterPlugin.js.map +1 -1
  280. package/dist/esm/vite/plugins/fileSystemRouterPlugin.mjs +1 -6
  281. package/dist/esm/vite/plugins/fileSystemRouterPlugin.mjs.map +1 -1
  282. package/dist/esm/vite/plugins/fileSystemRouterPlugin.native.js +1 -6
  283. package/dist/esm/vite/plugins/fileSystemRouterPlugin.native.js.map +1 -1
  284. package/dist/esm/vite/plugins/virtualEntryPlugin.js +5 -1
  285. package/dist/esm/vite/plugins/virtualEntryPlugin.js.map +1 -1
  286. package/dist/esm/vite/plugins/virtualEntryPlugin.mjs +7 -1
  287. package/dist/esm/vite/plugins/virtualEntryPlugin.mjs.map +1 -1
  288. package/dist/esm/vite/plugins/virtualEntryPlugin.native.js +8 -1
  289. package/dist/esm/vite/plugins/virtualEntryPlugin.native.js.map +1 -1
  290. package/package.json +13 -11
  291. package/src/createHandleRequest.ts +16 -3
  292. package/src/fork/createMemoryHistory.tsx +39 -4
  293. package/src/fork/useLinking.ts +83 -12
  294. package/src/index.ts +3 -0
  295. package/src/router/linkingConfig.ts +21 -4
  296. package/src/router/routeMask.ts +293 -0
  297. package/src/router/router.ts +53 -1
  298. package/src/router/useScreens.tsx +54 -2
  299. package/src/ui/TabSlot.tsx +2 -1
  300. package/src/ui/Tabs.tsx +12 -5
  301. package/src/views/Navigator.tsx +14 -9
  302. package/src/vite/DevHead.tsx +1 -924
  303. package/src/vite/one.ts +4 -0
  304. package/src/vite/plugins/devtoolsPlugin.ts +45 -0
  305. package/src/vite/plugins/fileSystemRouterPlugin.tsx +2 -7
  306. package/src/vite/plugins/virtualEntryPlugin.ts +12 -3
  307. package/src/vite/types.ts +1 -0
  308. package/types/cli/daemon.d.ts.map +1 -0
  309. package/types/createHandleRequest.d.ts.map +1 -1
  310. package/types/daemon/index.d.ts.map +1 -0
  311. package/types/daemon/ipc.d.ts.map +1 -0
  312. package/types/daemon/picker.d.ts.map +1 -0
  313. package/types/daemon/proxy.d.ts.map +1 -0
  314. package/types/daemon/registry.d.ts.map +1 -0
  315. package/types/daemon/server.d.ts.map +1 -0
  316. package/types/daemon/tui.d.ts.map +1 -0
  317. package/types/daemon/types.d.ts.map +1 -0
  318. package/types/daemon/utils.d.ts.map +1 -0
  319. package/types/fork/createMemoryHistory.d.ts +6 -2
  320. package/types/fork/createMemoryHistory.d.ts.map +1 -1
  321. package/types/fork/useLinking.d.ts.map +1 -1
  322. package/types/index.d.ts +2 -0
  323. package/types/index.d.ts.map +1 -1
  324. package/types/router/linkingConfig.d.ts.map +1 -1
  325. package/types/router/routeMask.d.ts +130 -0
  326. package/types/router/routeMask.d.ts.map +1 -0
  327. package/types/router/router.d.ts +23 -0
  328. package/types/router/router.d.ts.map +1 -1
  329. package/types/router/useScreens.d.ts.map +1 -1
  330. package/types/ui/TabSlot.d.ts.map +1 -1
  331. package/types/ui/Tabs.d.ts +1 -16
  332. package/types/ui/Tabs.d.ts.map +1 -1
  333. package/types/views/Navigator.d.ts +4 -14
  334. package/types/views/Navigator.d.ts.map +1 -1
  335. package/types/vite/DevHead.d.ts.map +1 -1
  336. package/types/vite/one.d.ts.map +1 -1
  337. package/types/vite/plugins/devtoolsPlugin.d.ts +5 -0
  338. package/types/vite/plugins/devtoolsPlugin.d.ts.map +1 -0
  339. package/types/vite/plugins/fileSystemRouterPlugin.d.ts.map +1 -1
  340. package/types/vite/plugins/virtualEntryPlugin.d.ts +1 -3
  341. package/types/vite/plugins/virtualEntryPlugin.d.ts.map +1 -1
  342. package/types/vite/types.d.ts.map +1 -1
@@ -1,902 +1,5 @@
1
- // @ts-nocheck - This file contains inline JavaScript strings for client-side devtools
2
1
  import { VIRTUAL_SSR_CSS_HREF } from '../constants'
3
2
 
4
- // HMR script for route updates
5
- const ROUTE_HMR_SCRIPT =
6
- 'import { createHotContext } from "/@vite/client"; const hot = createHotContext("/__one_route_hmr"); hot.on("one:route-update", (data) => { if (window.__oneRouteCache) { if (data?.file) { window.__oneRouteCache.clearFile(data.file); } else { window.__oneRouteCache.clear(); } } window.dispatchEvent(new CustomEvent("one-hmr-update")); });'
7
-
8
- // HMR script for loader data updates
9
- const LOADER_HMR_SCRIPT =
10
- 'import { createHotContext } from "/@vite/client"; const hot = createHotContext("/__one_loader_hmr"); hot.on("one:loader-data-update", async (data) => { if (data?.routePaths && window.__oneRefetchLoader) { const currentPath = window.location.pathname.replace(/\\/$/, "") || "/"; for (const routePath of data.routePaths) { if (routePath === currentPath) { try { await window.__oneRefetchLoader(routePath); } catch (err) { console.error("[one] Error refetching loader:", err); } } } } });'
11
-
12
- // React refresh script
13
- const REACT_REFRESH_SCRIPT =
14
- 'import { injectIntoGlobalHook } from "/@react-refresh"; injectIntoGlobalHook(window); window.$RefreshReg$ = () => {}; window.$RefreshSig$ = () => (type) => type;'
15
-
16
- // Unified One DevTools - All panels in one draggable window
17
- // Alt+Space opens Spotlight-style quick picker
18
- const ONE_DEVTOOLS_SCRIPT = `
19
- (function() {
20
- try {
21
- var host = null;
22
- var shadow = null;
23
- var spotlightDialog = null;
24
- var panelDialog = null;
25
- var panel = null;
26
- var activeTab = 'seo';
27
- var isDragging = false;
28
- var dragOffset = { x: 0, y: 0 };
29
- var panelPos = { x: 20, y: 20 };
30
- var snappedEdge = { h: null, v: null };
31
- var removalObserver = null;
32
-
33
- var LOGO_SVG = '<svg width="24" height="24" viewBox="0 0 100 100"><circle cx="50" cy="50" r="48" fill="#FCD34D" stroke="#222" stroke-width="2"/><circle cx="50" cy="35" r="16" fill="white"/><text x="50" y="41" text-anchor="middle" font-family="system-ui" font-size="16" font-weight="bold" fill="#222">1</text></svg>';
34
-
35
- function escapeHtml(str) {
36
- if (!str) return '';
37
- return String(str).replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/"/g, '&quot;');
38
- }
39
-
40
- function createHost() {
41
- if (host) return;
42
- host = document.createElement('div');
43
- host.id = 'one-devtools';
44
- shadow = host.attachShadow({ mode: 'open' });
45
-
46
- var css = \`
47
- * { box-sizing: border-box; margin: 0; padding: 0; }
48
-
49
- dialog {
50
- border: none;
51
- padding: 0;
52
- background: transparent;
53
- max-width: none;
54
- max-height: none;
55
- overflow: visible;
56
- }
57
- dialog::backdrop {
58
- background: transparent;
59
- }
60
- #spotlight-dialog::backdrop {
61
- background: rgba(0,0,0,0.3);
62
- backdrop-filter: blur(8px);
63
- }
64
-
65
- .spotlight {
66
- display: flex;
67
- align-items: center;
68
- justify-content: center;
69
- position: fixed;
70
- inset: 0;
71
- }
72
-
73
- .spotlight-box {
74
- background: #1a1a1a;
75
- border-radius: 12px;
76
- width: 320px;
77
- max-width: 90vw;
78
- overflow: hidden;
79
- box-shadow: 0 16px 48px rgba(0,0,0,0.5);
80
- }
81
-
82
- .spotlight-header {
83
- display: flex;
84
- align-items: center;
85
- padding: 12px 16px;
86
- border-bottom: 1px solid #252525;
87
- gap: 10px;
88
- }
89
- .spotlight-header svg { width: 20px; height: 20px; flex-shrink: 0; }
90
- .spotlight-header-title { font: 13px system-ui, sans-serif; color: #ccc; flex: 1; }
91
- .spotlight-header-version { font: 11px system-ui, sans-serif; color: #666; }
92
-
93
- .spotlight-item {
94
- display: flex;
95
- align-items: center;
96
- gap: 12px;
97
- padding: 12px 16px;
98
- color: #ccc;
99
- font: 13px system-ui, sans-serif;
100
- cursor: pointer;
101
- transition: background 0.1s;
102
- border-bottom: 1px solid #252525;
103
- }
104
- .spotlight-item:last-child { border-bottom: none; }
105
- .spotlight-item:hover { background: #252525; color: #fff; }
106
- .spotlight-item .key {
107
- background: #333;
108
- color: #888;
109
- padding: 2px 6px;
110
- border-radius: 4px;
111
- font-size: 11px;
112
- margin-left: auto;
113
- }
114
-
115
- .panel-dialog {
116
- position: fixed;
117
- margin: 0;
118
- inset: unset;
119
- z-index: 2147483647;
120
- }
121
- .panel-dialog::backdrop {
122
- display: none;
123
- }
124
-
125
- .panel {
126
- width: 420px;
127
- max-width: calc(100vw - 40px);
128
- max-height: calc(100vh - 40px);
129
- background: #161616;
130
- border-radius: 10px;
131
- box-shadow: 0 12px 40px rgba(0,0,0,0.4);
132
- display: flex;
133
- flex-direction: column;
134
- overflow: hidden;
135
- font: 13px system-ui, sans-serif;
136
- color: #ccc;
137
- }
138
-
139
- .panel-header {
140
- display: flex;
141
- align-items: center;
142
- padding: 8px 12px;
143
- background: #1a1a1a;
144
- cursor: grab;
145
- user-select: none;
146
- gap: 8px;
147
- }
148
- .panel-header:active { cursor: grabbing; }
149
- .panel-header svg { width: 18px; height: 18px; }
150
- .panel-title { font-weight: 500; color: #999; font-size: 12px; flex: 1; }
151
- .panel-close {
152
- background: none;
153
- border: none;
154
- color: #666;
155
- cursor: pointer;
156
- padding: 4px;
157
- font-size: 16px;
158
- line-height: 1;
159
- }
160
- .panel-close:hover { color: #fff; }
161
-
162
- .tabs {
163
- display: flex;
164
- background: #1a1a1a;
165
- padding: 0 8px;
166
- gap: 2px;
167
- overflow-x: auto;
168
- }
169
- .tab {
170
- padding: 8px 12px;
171
- background: none;
172
- border: none;
173
- color: #666;
174
- font: 12px system-ui, sans-serif;
175
- cursor: pointer;
176
- border-bottom: 2px solid transparent;
177
- transition: all 0.1s;
178
- }
179
- .tab:hover { color: #999; }
180
- .tab.active { color: #fff; border-bottom-color: #666; }
181
-
182
- .content {
183
- flex: 1;
184
- overflow-y: auto;
185
- padding: 12px;
186
- min-height: 200px;
187
- max-height: calc(100vh - 140px);
188
- }
189
-
190
- .section { margin-bottom: 12px; }
191
- .section-title { font-size: 11px; color: #666; margin-bottom: 6px; text-transform: uppercase; letter-spacing: 0.5px; }
192
-
193
- .info-row {
194
- display: flex;
195
- gap: 12px;
196
- padding: 8px 0;
197
- border-bottom: 1px solid #222;
198
- }
199
- .info-row:last-child { border-bottom: none; }
200
- .info-label { color: #666; font-size: 11px; width: 90px; flex-shrink: 0; padding-top: 1px; }
201
- .info-value { color: #ccc; font-family: monospace; font-size: 12px; word-break: break-word; line-height: 1.4; flex: 1; }
202
-
203
- .badge {
204
- display: inline-block;
205
- padding: 2px 6px;
206
- border-radius: 4px;
207
- font-size: 10px;
208
- text-transform: uppercase;
209
- }
210
- .badge-error { background: #3a2020; color: #f87171; }
211
- .badge-warn { background: #3a3520; color: #fbbf24; }
212
- .badge-info { background: #202a3a; color: #60a5fa; }
213
- .badge-success { background: #1a3a20; color: #4ade80; }
214
-
215
- .empty { text-align: center; color: #555; padding: 24px; }
216
-
217
- .error-item {
218
- background: #1e1e1e;
219
- border-radius: 6px;
220
- padding: 10px;
221
- margin-bottom: 8px;
222
- border-left: 3px solid #666;
223
- }
224
- .error-item.error { border-left-color: #f87171; }
225
- .error-msg { color: #f87171; font-family: monospace; font-size: 12px; margin-top: 6px; }
226
-
227
- .timing-bar {
228
- height: 16px;
229
- background: #252525;
230
- border-radius: 4px;
231
- overflow: hidden;
232
- display: flex;
233
- margin: 4px 0;
234
- }
235
- .timing-segment { height: 100%; display: flex; align-items: center; justify-content: center; font-size: 9px; color: #fff; }
236
- .timing-module { background: #555; }
237
- .timing-exec { background: #888; }
238
-
239
- .preview-card {
240
- background: #1e1e1e;
241
- border-radius: 6px;
242
- padding: 10px;
243
- margin-bottom: 10px;
244
- }
245
- .preview-title { font-size: 11px; color: #666; margin-bottom: 6px; }
246
-
247
- .issue-item {
248
- display: flex;
249
- align-items: center;
250
- gap: 8px;
251
- padding: 6px 0;
252
- font-size: 12px;
253
- }
254
- .issue-icon { font-size: 10px; }
255
- \`;
256
-
257
- shadow.innerHTML = '<style>' + css + '</style><dialog id="spotlight-dialog"><div class="spotlight"><div class="spotlight-box" id="spotlight-box"></div></div></dialog><dialog class="panel-dialog" id="panel-dialog"><div class="panel" id="panel"></div></dialog>';
258
- document.body.appendChild(host);
259
-
260
- setupSpotlight();
261
- setupPanel();
262
- setupKeyboard();
263
- setupRemovalObserver();
264
- }
265
-
266
- // watch for React hydration removing our element and re-create it
267
- function setupRemovalObserver() {
268
- if (removalObserver) return;
269
- removalObserver = new MutationObserver(function(mutations) {
270
- for (var i = 0; i < mutations.length; i++) {
271
- var mutation = mutations[i];
272
- if (mutation.type === 'childList') {
273
- for (var j = 0; j < mutation.removedNodes.length; j++) {
274
- var node = mutation.removedNodes[j];
275
- if (node === host) {
276
- // our element was removed (likely by React hydration), re-create it
277
- host = null;
278
- shadow = null;
279
- spotlightDialog = null;
280
- panelDialog = null;
281
- panel = null;
282
- setTimeout(createHost, 0);
283
- return;
284
- }
285
- }
286
- }
287
- }
288
- });
289
- removalObserver.observe(document.body, { childList: true });
290
- }
291
-
292
- function setupSpotlight() {
293
- spotlightDialog = shadow.getElementById('spotlight-dialog');
294
- var box = shadow.getElementById('spotlight-box');
295
-
296
- var items = [
297
- { id: 'seo', name: 'SEO Preview', key: '⌥S' },
298
- { id: 'route', name: 'Route Info', key: '⌥R' },
299
- { id: 'loader', name: 'Loader Timing', key: '⌥L' },
300
- { id: 'errors', name: 'Errors', key: '⌥E' },
301
- ];
302
-
303
- var header = '<div class="spotlight-header">' + LOGO_SVG + '<span class="spotlight-header-title">Dev Tools</span><span class="spotlight-header-version">v1.2.57</span></div>';
304
- box.innerHTML = header + items.map(function(item) {
305
- return '<div class="spotlight-item" data-tab="' + item.id + '"><span>' + item.name + '</span><span class="key">' + item.key + '</span></div>';
306
- }).join('');
307
-
308
- box.addEventListener('click', function(e) {
309
- var item = e.target.closest('.spotlight-item');
310
- if (item) {
311
- activeTab = item.dataset.tab;
312
- hideSpotlight();
313
- showPanel();
314
- }
315
- });
316
-
317
- // close on backdrop click
318
- spotlightDialog.addEventListener('click', function(e) {
319
- if (e.target === spotlightDialog) spotlightDialog.close();
320
- });
321
- }
322
-
323
- function setupPanel() {
324
- panelDialog = shadow.getElementById('panel-dialog');
325
- panel = shadow.getElementById('panel');
326
- panel.innerHTML = '<div class="panel-header" id="panel-header">' + LOGO_SVG + '<span class="panel-title">DevTools</span><button class="panel-close" id="panel-close">×</button></div><div class="tabs" id="tabs"><button class="tab active" data-tab="seo">SEO</button><button class="tab" data-tab="route">Route</button><button class="tab" data-tab="loader">Loader</button><button class="tab" data-tab="errors">Errors</button></div><div class="content" id="content"></div>';
327
-
328
- shadow.getElementById('panel-close').addEventListener('click', hidePanel);
329
-
330
- var tabs = shadow.getElementById('tabs');
331
- tabs.addEventListener('click', function(e) {
332
- var tab = e.target.closest('.tab');
333
- if (tab) {
334
- activeTab = tab.dataset.tab;
335
- updateTabs();
336
- updateContent();
337
- }
338
- });
339
-
340
- setupDrag();
341
- }
342
-
343
- function setupDrag() {
344
- var header = shadow.getElementById('panel-header');
345
-
346
- header.addEventListener('mousedown', function(e) {
347
- if (e.target.closest('.panel-close')) return;
348
- isDragging = true;
349
- var rect = panelDialog.getBoundingClientRect();
350
- dragOffset.x = e.clientX - rect.left;
351
- dragOffset.y = e.clientY - rect.top;
352
- // Store current position before resetting snap state
353
- panelPos.x = rect.left;
354
- panelPos.y = rect.top;
355
- snappedEdge = { h: null, v: null };
356
- });
357
-
358
- document.addEventListener('mousemove', function(e) {
359
- if (!isDragging) return;
360
- var x = e.clientX - dragOffset.x;
361
- var y = e.clientY - dragOffset.y;
362
- var snapDist = 20;
363
- var w = window.innerWidth;
364
- var h = window.innerHeight;
365
- var pw = panelDialog.offsetWidth;
366
- var ph = panelDialog.offsetHeight;
367
- var pad = 10;
368
-
369
- var snapH = null;
370
- var snapV = null;
371
-
372
- if (x < snapDist) { snapH = 'left'; }
373
- else if (x + pw > w - snapDist) { snapH = 'right'; }
374
- if (y < snapDist) { snapV = 'top'; }
375
- else if (y + ph > h - snapDist) { snapV = 'bottom'; }
376
-
377
- snappedEdge = { h: snapH, v: snapV };
378
-
379
- // Apply horizontal positioning
380
- if (snapH === 'left') {
381
- panelDialog.style.left = pad + 'px';
382
- panelDialog.style.right = 'auto';
383
- } else if (snapH === 'right') {
384
- panelDialog.style.left = 'auto';
385
- panelDialog.style.right = pad + 'px';
386
- } else {
387
- panelDialog.style.left = x + 'px';
388
- panelDialog.style.right = 'auto';
389
- panelPos.x = x;
390
- }
391
-
392
- // Apply vertical positioning
393
- if (snapV === 'top') {
394
- panelDialog.style.top = pad + 'px';
395
- panelDialog.style.bottom = 'auto';
396
- } else if (snapV === 'bottom') {
397
- panelDialog.style.top = 'auto';
398
- panelDialog.style.bottom = pad + 'px';
399
- } else {
400
- panelDialog.style.top = y + 'px';
401
- panelDialog.style.bottom = 'auto';
402
- panelPos.y = y;
403
- }
404
- });
405
-
406
- document.addEventListener('mouseup', function() {
407
- isDragging = false;
408
- });
409
- }
410
-
411
- var keyboardSetup = false;
412
- function setupKeyboard() {
413
- if (keyboardSetup) return;
414
- keyboardSetup = true;
415
- document.addEventListener('keydown', function(e) {
416
- if (e.altKey && e.code === 'Space') {
417
- e.preventDefault();
418
- toggleSpotlight();
419
- } else if (e.altKey) {
420
- var tabMap = { KeyS: 'seo', KeyR: 'route', KeyL: 'loader', KeyE: 'errors' };
421
- var tab = tabMap[e.code];
422
- if (tab) {
423
- e.preventDefault();
424
- activeTab = tab;
425
- hideSpotlight();
426
- showPanel();
427
- }
428
- } else if (e.code === 'Escape') {
429
- // dialogs handle escape natively, but we need to handle the case where escape is pressed
430
- // when only one is open
431
- if (spotlightDialog && spotlightDialog.open) spotlightDialog.close();
432
- else if (panelDialog && panelDialog.open) panelDialog.close();
433
- }
434
- });
435
- }
436
-
437
- function toggleSpotlight() {
438
- if (spotlightDialog && spotlightDialog.open) hideSpotlight();
439
- else showSpotlight();
440
- }
441
-
442
- function showSpotlight() {
443
- if (!host) createHost();
444
- spotlightDialog.showModal();
445
- }
446
-
447
- function hideSpotlight() {
448
- spotlightDialog.close();
449
- }
450
-
451
- function showPanel() {
452
- if (!host) createHost();
453
- var pad = 10;
454
- // Apply horizontal positioning based on snap state
455
- if (snappedEdge.h === 'left') {
456
- panelDialog.style.left = pad + 'px';
457
- panelDialog.style.right = 'auto';
458
- } else if (snappedEdge.h === 'right') {
459
- panelDialog.style.left = 'auto';
460
- panelDialog.style.right = pad + 'px';
461
- } else {
462
- panelDialog.style.left = panelPos.x + 'px';
463
- panelDialog.style.right = 'auto';
464
- }
465
- // Apply vertical positioning based on snap state
466
- if (snappedEdge.v === 'top') {
467
- panelDialog.style.top = pad + 'px';
468
- panelDialog.style.bottom = 'auto';
469
- } else if (snappedEdge.v === 'bottom') {
470
- panelDialog.style.top = 'auto';
471
- panelDialog.style.bottom = pad + 'px';
472
- } else {
473
- panelDialog.style.top = panelPos.y + 'px';
474
- panelDialog.style.bottom = 'auto';
475
- }
476
- panelDialog.show();
477
- updateTabs();
478
- updateContent();
479
- }
480
-
481
- function hidePanel() {
482
- panelDialog.close();
483
- }
484
-
485
- function updateTabs() {
486
- shadow.querySelectorAll('.tab').forEach(function(t) {
487
- t.classList.toggle('active', t.dataset.tab === activeTab);
488
- });
489
- }
490
-
491
- function updateContent() {
492
- var content = shadow.getElementById('content');
493
- if (activeTab === 'seo') content.innerHTML = getSeoContent();
494
- else if (activeTab === 'route') content.innerHTML = getRouteContent();
495
- else if (activeTab === 'loader') content.innerHTML = getLoaderContent();
496
- else if (activeTab === 'errors') content.innerHTML = getErrorsContent();
497
- }
498
-
499
- function getSeoContent() {
500
- var title = document.title || '';
501
- var desc = document.querySelector('meta[name="description"]')?.content || '';
502
- var ogTitle = document.querySelector('meta[property="og:title"]')?.content || '';
503
- var ogDesc = document.querySelector('meta[property="og:description"]')?.content || '';
504
- var ogImage = document.querySelector('meta[property="og:image"]')?.content || '';
505
-
506
- var issues = [];
507
- if (!title) issues.push({ type: 'error', msg: 'Missing title' });
508
- else if (title.length > 60) issues.push({ type: 'warn', msg: 'Title too long (>60)' });
509
- if (!desc) issues.push({ type: 'error', msg: 'Missing description' });
510
- else if (desc.length > 160) issues.push({ type: 'warn', msg: 'Description too long (>160)' });
511
- if (!ogTitle) issues.push({ type: 'warn', msg: 'Missing og:title' });
512
- if (!ogImage) issues.push({ type: 'warn', msg: 'Missing og:image' });
513
-
514
- var html = '';
515
- if (issues.length) {
516
- html += '<div class="section"><div class="section-title">Issues</div>';
517
- issues.forEach(function(i) {
518
- html += '<div class="issue-item"><span class="issue-icon">' + (i.type === 'error' ? '✖' : '⚠') + '</span><span>' + escapeHtml(i.msg) + '</span></div>';
519
- });
520
- html += '</div>';
521
- }
522
-
523
- html += '<div class="section"><div class="section-title">Google Preview</div><div class="preview-card" style="background:#fff;color:#202124;padding:12px;border-radius:8px;">';
524
- html += '<div style="font-size:12px;color:#202124;margin-bottom:2px;">' + escapeHtml(location.hostname) + '</div>';
525
- html += '<div style="font-size:16px;color:#1a0dab;margin-bottom:4px;">' + escapeHtml(title || 'No title') + '</div>';
526
- html += '<div style="font-size:13px;color:#4d5156;">' + escapeHtml(desc ? desc.slice(0,160) : 'No description') + '</div>';
527
- html += '</div></div>';
528
-
529
- if (ogImage) {
530
- html += '<div class="section"><div class="section-title">Social Preview</div>';
531
- html += '<div class="preview-card" style="background:#fff;border-radius:12px;overflow:hidden;border:1px solid #e1e8ed;">';
532
- html += '<img src="' + escapeHtml(ogImage) + '" style="width:100%;height:auto;display:block;border-bottom:1px solid #e1e8ed;" onerror="this.style.display=&quot;none&quot;" />';
533
- html += '<div style="padding:12px;">';
534
- html += '<div style="font-size:12px;color:#8899a6;text-transform:uppercase;margin-bottom:2px;">' + escapeHtml(location.hostname) + '</div>';
535
- html += '<div style="font-size:15px;color:#1c2022;font-weight:700;margin-bottom:4px;line-height:1.3;">' + escapeHtml(ogTitle || title || 'No title') + '</div>';
536
- html += '<div style="font-size:14px;color:#8899a6;line-height:1.3;">' + escapeHtml((ogDesc || desc || '').slice(0,100)) + '</div>';
537
- html += '</div></div></div>';
538
- }
539
-
540
- html += '<div class="section"><div class="section-title">Meta Tags</div>';
541
- html += '<div class="info-row"><div class="info-label">title</div><div class="info-value">' + escapeHtml(title || '-') + '</div></div>';
542
- html += '<div class="info-row"><div class="info-label">description</div><div class="info-value">' + escapeHtml(desc || '-') + '</div></div>';
543
- html += '<div class="info-row"><div class="info-label">og:title</div><div class="info-value">' + escapeHtml(ogTitle || '-') + '</div></div>';
544
- html += '<div class="info-row"><div class="info-label">og:description</div><div class="info-value">' + escapeHtml(ogDesc || '-') + '</div></div>';
545
- html += '<div class="info-row"><div class="info-label">og:image</div><div class="info-value">' + escapeHtml(ogImage || '-') + '</div></div>';
546
- html += '</div>';
547
-
548
- return html;
549
- }
550
-
551
- function getRouteContent() {
552
- var pathname = location.pathname;
553
- var segments = pathname.split('/').filter(Boolean);
554
- var search = location.search;
555
- var hash = location.hash;
556
- var devtools = window.__oneDevtools || {};
557
- var routeInfo = devtools.routeInfo || {};
558
- var params = routeInfo.params || {};
559
-
560
- var html = '<div class="section"><div class="section-title">Current Route</div>';
561
- html += '<div class="info-row"><span class="info-label">pathname</span><span class="info-value">' + escapeHtml(pathname) + '</span></div>';
562
- html += '<div class="info-row"><span class="info-label">segments</span><span class="info-value">' + (segments.length ? segments.map(function(s) { return '<span style="background:#252525;padding:2px 6px;border-radius:4px;margin-right:4px;">' + escapeHtml(s) + '</span>'; }).join('') : '/') + '</span></div>';
563
- if (search) html += '<div class="info-row"><span class="info-label">search</span><span class="info-value">' + escapeHtml(search) + '</span></div>';
564
- if (hash) html += '<div class="info-row"><span class="info-label">hash</span><span class="info-value">' + escapeHtml(hash) + '</span></div>';
565
- html += '</div>';
566
-
567
- if (Object.keys(params).length) {
568
- html += '<div class="section"><div class="section-title">Route Params</div>';
569
- Object.entries(params).forEach(function(kv) {
570
- html += '<div class="info-row"><span class="info-label">' + escapeHtml(kv[0]) + '</span><span class="info-value">' + escapeHtml(String(kv[1])) + '</span></div>';
571
- });
572
- html += '</div>';
573
- }
574
-
575
- html += '<div class="section"><div class="section-title">Full URL</div>';
576
- html += '<div style="font-family:monospace;font-size:11px;color:#666;word-break:break-all;">' + escapeHtml(location.href) + '</div>';
577
- html += '</div>';
578
-
579
- return html;
580
- }
581
-
582
- function getLoaderContent() {
583
- var devtools = window.__oneDevtools || {};
584
- var history = typeof devtools.getLoaderTimingHistory === 'function' ? devtools.getLoaderTimingHistory() || [] : [];
585
-
586
- if (!history.length) {
587
- return '<div class="empty">No loader timings recorded yet</div>';
588
- }
589
-
590
- var maxTime = Math.max.apply(null, history.map(function(t) { return t.totalTime || 0; }));
591
- var html = '';
592
-
593
- history.forEach(function(t) {
594
- var modPct = t.moduleLoadTime && t.totalTime ? (t.moduleLoadTime / t.totalTime) * 100 : 0;
595
- var execPct = t.executionTime && t.totalTime ? (t.executionTime / t.totalTime) * 100 : 0;
596
- var widthPct = t.totalTime && maxTime ? (t.totalTime / maxTime) * 100 : 0;
597
-
598
- html += '<div class="error-item' + (t.error ? ' error' : '') + '">';
599
- html += '<div style="display:flex;justify-content:space-between;align-items:center;">';
600
- html += '<span style="font-family:monospace;font-size:11px;">' + escapeHtml(t.path) + '</span>';
601
- html += '<span class="badge badge-' + (t.error ? 'error' : 'success') + '">' + (t.totalTime ? Math.round(t.totalTime) + 'ms' : '-') + '</span>';
602
- html += '</div>';
603
- if (!t.error) {
604
- html += '<div class="timing-bar" style="width:' + Math.max(20, widthPct) + '%;">';
605
- html += '<div class="timing-segment timing-module" style="width:' + modPct + '%;" title="Module: ' + Math.round(t.moduleLoadTime || 0) + 'ms"></div>';
606
- html += '<div class="timing-segment timing-exec" style="width:' + execPct + '%;" title="Exec: ' + Math.round(t.executionTime || 0) + 'ms"></div>';
607
- html += '</div>';
608
- }
609
- if (t.error) html += '<div class="error-msg">' + escapeHtml(t.error) + '</div>';
610
- html += '</div>';
611
- });
612
-
613
- return html;
614
- }
615
-
616
- function getErrorsContent() {
617
- var devtools = window.__oneDevtools || {};
618
- var errors = devtools.errorHistory || [];
619
-
620
- if (!errors.length) {
621
- return '<div class="empty">✓ No errors recorded</div>';
622
- }
623
-
624
- var html = '';
625
- errors.forEach(function(err) {
626
- html += '<div class="error-item error">';
627
- html += '<div style="display:flex;justify-content:space-between;align-items:center;margin-bottom:6px;">';
628
- html += '<span class="badge badge-error">' + escapeHtml(err.type || 'error') + '</span>';
629
- html += '<span style="font-size:11px;color:#666;">' + new Date(err.timestamp).toLocaleTimeString() + '</span>';
630
- html += '</div>';
631
- html += '<div class="error-msg">' + escapeHtml(err.error?.message || 'Unknown error') + '</div>';
632
- html += '</div>';
633
- });
634
-
635
- return html;
636
- }
637
-
638
- // Initialize after React hydration completes
639
- // use requestIdleCallback to wait for the browser to be idle (after hydration)
640
- function initAfterHydration() {
641
- if (typeof requestIdleCallback !== 'undefined') {
642
- requestIdleCallback(createHost, { timeout: 3000 });
643
- } else {
644
- setTimeout(createHost, 100);
645
- }
646
- }
647
-
648
- if (document.readyState === 'complete') {
649
- initAfterHydration();
650
- } else {
651
- window.addEventListener('load', initAfterHydration);
652
- }
653
-
654
- // Listen for events
655
- window.addEventListener('one-loader-timing', function() {
656
- if (panelDialog && panelDialog.open && activeTab === 'loader') updateContent();
657
- });
658
- window.addEventListener('one-error', function(e) {
659
- var devtools = window.__oneDevtools = window.__oneDevtools || {};
660
- devtools.errorHistory = devtools.errorHistory || [];
661
- devtools.errorHistory.unshift(e.detail);
662
- if (devtools.errorHistory.length > 20) devtools.errorHistory = devtools.errorHistory.slice(0, 20);
663
- if (panelDialog && panelDialog.open && activeTab === 'errors') updateContent();
664
- });
665
-
666
- // Update on navigation
667
- function onNavigate() {
668
- if (panelDialog && panelDialog.open) updateContent();
669
- }
670
- window.addEventListener('popstate', onNavigate);
671
- window.addEventListener('one-hmr-update', onNavigate);
672
- // Also catch pushState/replaceState
673
- var origPushState = history.pushState;
674
- var origReplaceState = history.replaceState;
675
- history.pushState = function() {
676
- origPushState.apply(this, arguments);
677
- setTimeout(onNavigate, 0);
678
- };
679
- history.replaceState = function() {
680
- origReplaceState.apply(this, arguments);
681
- setTimeout(onNavigate, 0);
682
- };
683
-
684
- } catch (e) {
685
- console.error('[One DevTools] Failed to initialize:', e);
686
- }
687
- })();
688
- `
689
-
690
- // Source Inspector script - shows source location on hover when holding Option for 0.5s
691
- // Uses shadow DOM for style isolation to avoid conflicts with page styles (e.g., Tamagui)
692
- const SOURCE_INSPECTOR_SCRIPT = `
693
- (function() {
694
- try {
695
- var active = false;
696
- var host = null;
697
- var shadow = null;
698
- var overlay = null;
699
- var tag = null;
700
- var holdTimer = null;
701
- var holdDelay = 500;
702
- var mousePos = { x: 0, y: 0 };
703
- var removalObserver = null;
704
-
705
- function createHost() {
706
- if (host) return;
707
- host = document.createElement('div');
708
- host.id = 'one-source-inspector';
709
- shadow = host.attachShadow({ mode: 'open' });
710
- shadow.innerHTML = \`
711
- <style>
712
- * { box-sizing: border-box; margin: 0; padding: 0; }
713
- .overlay {
714
- position: fixed;
715
- pointer-events: none;
716
- z-index: 100000;
717
- background: rgba(100,100,100,0.2);
718
- border: 2px solid rgba(100,100,100,0.6);
719
- border-radius: 2px;
720
- transition: all 0.05s;
721
- display: none;
722
- }
723
- .tag {
724
- position: fixed;
725
- pointer-events: none;
726
- z-index: 100001;
727
- background: rgba(60,60,60,0.95);
728
- color: white;
729
- padding: 4px 8px;
730
- font-size: 12px;
731
- font-family: system-ui, -apple-system, sans-serif;
732
- border-radius: 4px;
733
- white-space: nowrap;
734
- box-shadow: 0 2px 8px rgba(0,0,0,0.3);
735
- display: none;
736
- }
737
- </style>
738
- <div class="overlay"></div>
739
- <div class="tag"></div>
740
- \`;
741
- document.body.appendChild(host);
742
- overlay = shadow.querySelector('.overlay');
743
- tag = shadow.querySelector('.tag');
744
- setupRemovalObserver();
745
- }
746
-
747
- // watch for React hydration removing our element and re-create it
748
- function setupRemovalObserver() {
749
- if (removalObserver) return;
750
- removalObserver = new MutationObserver(function(mutations) {
751
- for (var i = 0; i < mutations.length; i++) {
752
- var mutation = mutations[i];
753
- if (mutation.type === 'childList') {
754
- for (var j = 0; j < mutation.removedNodes.length; j++) {
755
- var node = mutation.removedNodes[j];
756
- if (node === host) {
757
- host = null;
758
- shadow = null;
759
- overlay = null;
760
- tag = null;
761
- // don't auto-recreate - will be created on next hover
762
- return;
763
- }
764
- }
765
- }
766
- }
767
- });
768
- removalObserver.observe(document.body, { childList: true });
769
- }
770
-
771
- function hideOverlay() {
772
- if (overlay) overlay.style.display = 'none';
773
- if (tag) tag.style.display = 'none';
774
- }
775
-
776
- function showOverlay(el, source) {
777
- if (!host) createHost();
778
- var rect = el.getBoundingClientRect();
779
- overlay.style.display = 'block';
780
- overlay.style.top = rect.top + 'px';
781
- overlay.style.left = rect.left + 'px';
782
- overlay.style.width = rect.width + 'px';
783
- overlay.style.height = rect.height + 'px';
784
- tag.style.display = 'block';
785
- tag.textContent = source;
786
- var top = rect.top - 28;
787
- if (top < 0) top = rect.bottom + 4;
788
- tag.style.top = top + 'px';
789
- tag.style.left = Math.max(4, Math.min(rect.left, window.innerWidth - 200)) + 'px';
790
- }
791
-
792
- function cancelHold() {
793
- clearTimeout(holdTimer);
794
- holdTimer = null;
795
- }
796
-
797
- function updateOverlayAtPosition(x, y) {
798
- // Use elementsFromPoint to get all elements at position, ordered from topmost/innermost to bottom
799
- var allElements = document.elementsFromPoint(x, y);
800
- // Find the first (innermost) element with data-one-source
801
- var el = null;
802
- for (var i = 0; i < allElements.length; i++) {
803
- if (allElements[i].hasAttribute('data-one-source')) {
804
- el = allElements[i];
805
- break;
806
- }
807
- }
808
- if (el) {
809
- var source = el.getAttribute('data-one-source');
810
- var lastColon = source.lastIndexOf(':');
811
- var filePath = source.slice(0, lastColon);
812
- var idx = source.slice(lastColon + 1);
813
- var info = window.__oneSourceInfo && window.__oneSourceInfo[filePath];
814
- var lineCol = info && info[idx];
815
- var displaySource = lineCol ? filePath + ':' + lineCol[0] + ':' + lineCol[1] : source;
816
- showOverlay(el, displaySource);
817
- } else {
818
- hideOverlay();
819
- }
820
- }
821
-
822
- function activate() {
823
- active = true;
824
- // Immediately show overlay at current mouse position
825
- updateOverlayAtPosition(mousePos.x, mousePos.y);
826
- }
827
-
828
- function deactivate() {
829
- cancelHold();
830
- active = false;
831
- hideOverlay();
832
- }
833
-
834
- window.addEventListener('keydown', function(e) {
835
- // Only trigger on Alt/Option key held alone
836
- if (e.key !== 'Alt') {
837
- cancelHold();
838
- return;
839
- }
840
- // Ignore if other modifier keys are pressed
841
- if (e.metaKey || e.ctrlKey || e.shiftKey) {
842
- cancelHold();
843
- return;
844
- }
845
- if (e.defaultPrevented) return;
846
- if (holdTimer) return; // already waiting
847
- holdTimer = setTimeout(activate, holdDelay);
848
- });
849
-
850
- window.addEventListener('keyup', function(e) {
851
- if (e.defaultPrevented) return;
852
- deactivate();
853
- });
854
-
855
- window.addEventListener('blur', deactivate);
856
-
857
- document.addEventListener('mousemove', function(e) {
858
- // Always track mouse position
859
- mousePos.x = e.clientX;
860
- mousePos.y = e.clientY;
861
- if (!active) return;
862
- updateOverlayAtPosition(e.clientX, e.clientY);
863
- });
864
-
865
- document.addEventListener('click', function(e) {
866
- if (!active) return;
867
- // Use elementsFromPoint to find innermost sourced element
868
- var allElements = document.elementsFromPoint(e.clientX, e.clientY);
869
- var el = null;
870
- for (var i = 0; i < allElements.length; i++) {
871
- if (allElements[i].hasAttribute('data-one-source')) {
872
- el = allElements[i];
873
- break;
874
- }
875
- }
876
- if (el) {
877
- e.preventDefault();
878
- e.stopPropagation();
879
- var source = el.getAttribute('data-one-source');
880
- // Parse source: "/path/to/file.tsx:index"
881
- var lastColon = source.lastIndexOf(':');
882
- var filePath = source.slice(0, lastColon);
883
- var idx = source.slice(lastColon + 1);
884
- // Look up actual line/column from source info
885
- var info = window.__oneSourceInfo && window.__oneSourceInfo[filePath];
886
- var lineCol = info && info[idx];
887
- var url = '/__one/open-source?source=' + encodeURIComponent(source);
888
- if (lineCol) {
889
- url += '&line=' + lineCol[0] + '&column=' + lineCol[1];
890
- }
891
- fetch(url);
892
- }
893
- }, true);
894
- } catch (e) {
895
- console.error('[Source Inspector] Failed to initialize:', e);
896
- }
897
- })();
898
- `
899
-
900
3
  export function DevHead() {
901
4
  if (process.env.TAMAGUI_TARGET === 'native') {
902
5
  return null
@@ -911,33 +14,7 @@ export function DevHead() {
911
14
  data-ssr-css
912
15
  suppressHydrationWarning
913
16
  />
914
- <script
915
- type="module"
916
- suppressHydrationWarning
917
- dangerouslySetInnerHTML={{ __html: ROUTE_HMR_SCRIPT }}
918
- />
919
- <script
920
- type="module"
921
- suppressHydrationWarning
922
- dangerouslySetInnerHTML={{ __html: LOADER_HMR_SCRIPT }}
923
- />
924
- <script
925
- type="module"
926
- suppressHydrationWarning
927
- dangerouslySetInnerHTML={{ __html: REACT_REFRESH_SCRIPT }}
928
- />
929
- {/* Unified One DevTools */}
930
- <script
931
- type="module"
932
- suppressHydrationWarning
933
- dangerouslySetInnerHTML={{ __html: ONE_DEVTOOLS_SCRIPT }}
934
- />
935
- {/* Source Inspector - hold Option for 1s then hover */}
936
- <script
937
- type="module"
938
- suppressHydrationWarning
939
- dangerouslySetInnerHTML={{ __html: SOURCE_INSPECTOR_SCRIPT }}
940
- />
17
+ <script type="module" src="/@one/dev.js" suppressHydrationWarning />
941
18
  </>
942
19
  )
943
20
  }