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
@@ -0,0 +1,44 @@
1
+ // main dev entry - imports all dev scripts
2
+ // this file is served as /@one/dev.js by the devtools plugin
3
+
4
+ import { createHotContext } from '/@vite/client'
5
+ import { injectIntoGlobalHook } from '/@react-refresh'
6
+
7
+ // route HMR
8
+ const routeHot = createHotContext('/__one_route_hmr')
9
+ routeHot.on('one:route-update', (data) => {
10
+ if (window.__oneRouteCache) {
11
+ if (data?.file) {
12
+ window.__oneRouteCache.clearFile(data.file)
13
+ } else {
14
+ window.__oneRouteCache.clear()
15
+ }
16
+ }
17
+ window.dispatchEvent(new CustomEvent('one-hmr-update'))
18
+ })
19
+
20
+ // loader HMR
21
+ const loaderHot = createHotContext('/__one_loader_hmr')
22
+ loaderHot.on('one:loader-data-update', async (data) => {
23
+ if (data?.routePaths && window.__oneRefetchLoader) {
24
+ const currentPath = window.location.pathname.replace(/\/$/, '') || '/'
25
+ for (const routePath of data.routePaths) {
26
+ if (routePath === currentPath) {
27
+ try {
28
+ await window.__oneRefetchLoader(routePath)
29
+ } catch (err) {
30
+ console.error('[one] Error refetching loader:', err)
31
+ }
32
+ }
33
+ }
34
+ }
35
+ })
36
+
37
+ // react refresh
38
+ injectIntoGlobalHook(window)
39
+ window.$RefreshReg$ = () => {}
40
+ window.$RefreshSig$ = () => (type) => type
41
+
42
+ // devtools UI
43
+ import './devtools.mjs'
44
+ import './source-inspector.mjs'
@@ -0,0 +1,540 @@
1
+ // One DevTools - All panels in one draggable window
2
+ // Alt+Space opens Spotlight-style quick picker
3
+
4
+ ;(function () {
5
+ try {
6
+ let host = null
7
+ let shadow = null
8
+ let spotlightDialog = null
9
+ let panelDialog = null
10
+ let panel = null
11
+ let activeTab = 'seo'
12
+ let isDragging = false
13
+ const dragOffset = { x: 0, y: 0 }
14
+ const panelPos = { x: 20, y: 20 }
15
+ let snappedEdge = { h: null, v: null }
16
+ let removalObserver = null
17
+
18
+ const LOGO_SVG =
19
+ '<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>'
20
+
21
+ function escapeHtml(str) {
22
+ if (!str) return ''
23
+ return String(str)
24
+ .replace(/&/g, '&amp;')
25
+ .replace(/</g, '&lt;')
26
+ .replace(/>/g, '&gt;')
27
+ .replace(/"/g, '&quot;')
28
+ }
29
+
30
+ function createHost() {
31
+ if (host) return
32
+ host = document.createElement('div')
33
+ host.id = 'one-devtools'
34
+ shadow = host.attachShadow({ mode: 'open' })
35
+
36
+ const css = `
37
+ * { box-sizing: border-box; margin: 0; padding: 0; }
38
+ dialog { border: none; padding: 0; background: transparent; max-width: none; max-height: none; overflow: visible; }
39
+ dialog::backdrop { background: transparent; }
40
+ #spotlight-dialog::backdrop { background: rgba(0,0,0,0.3); backdrop-filter: blur(8px); }
41
+ .spotlight { display: flex; align-items: center; justify-content: center; position: fixed; inset: 0; }
42
+ .spotlight-box { background: #1a1a1a; border-radius: 12px; width: 320px; max-width: 90vw; overflow: hidden; box-shadow: 0 16px 48px rgba(0,0,0,0.5); }
43
+ .spotlight-header { display: flex; align-items: center; padding: 12px 16px; border-bottom: 1px solid #252525; gap: 10px; }
44
+ .spotlight-header svg { width: 20px; height: 20px; flex-shrink: 0; }
45
+ .spotlight-header-title { font: 13px system-ui, sans-serif; color: #ccc; flex: 1; }
46
+ .spotlight-header-version { font: 11px system-ui, sans-serif; color: #666; }
47
+ .spotlight-item { display: flex; align-items: center; gap: 12px; padding: 12px 16px; color: #ccc; font: 13px system-ui, sans-serif; cursor: pointer; transition: background 0.1s; border-bottom: 1px solid #252525; }
48
+ .spotlight-item:last-child { border-bottom: none; }
49
+ .spotlight-item:hover { background: #252525; color: #fff; }
50
+ .spotlight-item .key { background: #333; color: #888; padding: 2px 6px; border-radius: 4px; font-size: 11px; margin-left: auto; }
51
+ .panel-dialog { position: fixed; margin: 0; inset: unset; z-index: 2147483647; }
52
+ .panel-dialog::backdrop { display: none; }
53
+ .panel { width: 420px; max-width: calc(100vw - 40px); max-height: calc(100vh - 40px); background: #161616; border-radius: 10px; box-shadow: 0 12px 40px rgba(0,0,0,0.4); display: flex; flex-direction: column; overflow: hidden; font: 13px system-ui, sans-serif; color: #ccc; }
54
+ .panel-header { display: flex; align-items: center; padding: 8px 12px; background: #1a1a1a; cursor: grab; user-select: none; gap: 8px; }
55
+ .panel-header:active { cursor: grabbing; }
56
+ .panel-header svg { width: 18px; height: 18px; }
57
+ .panel-title { font-weight: 500; color: #999; font-size: 12px; flex: 1; }
58
+ .panel-close { background: none; border: none; color: #666; cursor: pointer; padding: 4px; font-size: 16px; line-height: 1; }
59
+ .panel-close:hover { color: #fff; }
60
+ .tabs { display: flex; background: #1a1a1a; padding: 0 8px; gap: 2px; overflow-x: auto; }
61
+ .tab { padding: 8px 12px; background: none; border: none; color: #666; font: 12px system-ui, sans-serif; cursor: pointer; border-bottom: 2px solid transparent; transition: all 0.1s; }
62
+ .tab:hover { color: #999; }
63
+ .tab.active { color: #fff; border-bottom-color: #666; }
64
+ .content { flex: 1; overflow-y: auto; padding: 12px; min-height: 200px; max-height: calc(100vh - 140px); }
65
+ .section { margin-bottom: 12px; }
66
+ .section-title { font-size: 11px; color: #666; margin-bottom: 6px; text-transform: uppercase; letter-spacing: 0.5px; }
67
+ .info-row { display: flex; gap: 12px; padding: 8px 0; border-bottom: 1px solid #222; }
68
+ .info-row:last-child { border-bottom: none; }
69
+ .info-label { color: #666; font-size: 11px; width: 90px; flex-shrink: 0; padding-top: 1px; }
70
+ .info-value { color: #ccc; font-family: monospace; font-size: 12px; word-break: break-word; line-height: 1.4; flex: 1; }
71
+ .badge { display: inline-block; padding: 2px 6px; border-radius: 4px; font-size: 10px; text-transform: uppercase; }
72
+ .badge-error { background: #3a2020; color: #f87171; }
73
+ .badge-warn { background: #3a3520; color: #fbbf24; }
74
+ .badge-info { background: #202a3a; color: #60a5fa; }
75
+ .badge-success { background: #1a3a20; color: #4ade80; }
76
+ .empty { text-align: center; color: #555; padding: 24px; }
77
+ .error-item { background: #1e1e1e; border-radius: 6px; padding: 10px; margin-bottom: 8px; border-left: 3px solid #666; }
78
+ .error-item.error { border-left-color: #f87171; }
79
+ .error-msg { color: #f87171; font-family: monospace; font-size: 12px; margin-top: 6px; }
80
+ .timing-bar { height: 16px; background: #252525; border-radius: 4px; overflow: hidden; display: flex; margin: 4px 0; }
81
+ .timing-segment { height: 100%; display: flex; align-items: center; justify-content: center; font-size: 9px; color: #fff; }
82
+ .timing-module { background: #555; }
83
+ .timing-exec { background: #888; }
84
+ .preview-card { background: #1e1e1e; border-radius: 6px; padding: 10px; margin-bottom: 10px; }
85
+ .preview-title { font-size: 11px; color: #666; margin-bottom: 6px; }
86
+ .issue-item { display: flex; align-items: center; gap: 8px; padding: 6px 0; font-size: 12px; }
87
+ .issue-icon { font-size: 10px; }
88
+ `
89
+
90
+ shadow.innerHTML =
91
+ '<style>' +
92
+ css +
93
+ '</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>'
94
+ document.body.appendChild(host)
95
+
96
+ setupSpotlight()
97
+ setupPanel()
98
+ setupKeyboard()
99
+ setupRemovalObserver()
100
+ }
101
+
102
+ function setupRemovalObserver() {
103
+ if (removalObserver) return
104
+ removalObserver = new MutationObserver((mutations) => {
105
+ for (const mutation of mutations) {
106
+ if (mutation.type === 'childList') {
107
+ for (const node of mutation.removedNodes) {
108
+ if (node === host) {
109
+ host = null
110
+ shadow = null
111
+ spotlightDialog = null
112
+ panelDialog = null
113
+ panel = null
114
+ setTimeout(createHost, 0)
115
+ return
116
+ }
117
+ }
118
+ }
119
+ }
120
+ })
121
+ removalObserver.observe(document.body, { childList: true })
122
+ }
123
+
124
+ function setupSpotlight() {
125
+ spotlightDialog = shadow.getElementById('spotlight-dialog')
126
+ const box = shadow.getElementById('spotlight-box')
127
+
128
+ const items = [
129
+ { id: 'seo', name: 'SEO Preview', key: '⌥S' },
130
+ { id: 'route', name: 'Route Info', key: '⌥R' },
131
+ { id: 'loader', name: 'Loader Timing', key: '⌥L' },
132
+ { id: 'errors', name: 'Errors', key: '⌥E' },
133
+ ]
134
+
135
+ const header =
136
+ '<div class="spotlight-header">' +
137
+ LOGO_SVG +
138
+ '<span class="spotlight-header-title">Dev Tools</span><span class="spotlight-header-version">v1.2.57</span></div>'
139
+ box.innerHTML =
140
+ header +
141
+ items
142
+ .map(
143
+ (item) =>
144
+ '<div class="spotlight-item" data-tab="' +
145
+ item.id +
146
+ '"><span>' +
147
+ item.name +
148
+ '</span><span class="key">' +
149
+ item.key +
150
+ '</span></div>'
151
+ )
152
+ .join('')
153
+
154
+ box.addEventListener('click', (e) => {
155
+ const item = e.target.closest('.spotlight-item')
156
+ if (item) {
157
+ activeTab = item.dataset.tab
158
+ hideSpotlight()
159
+ showPanel()
160
+ }
161
+ })
162
+
163
+ spotlightDialog.addEventListener('click', (e) => {
164
+ if (e.target === spotlightDialog) spotlightDialog.close()
165
+ })
166
+ }
167
+
168
+ function setupPanel() {
169
+ panelDialog = shadow.getElementById('panel-dialog')
170
+ panel = shadow.getElementById('panel')
171
+ panel.innerHTML =
172
+ '<div class="panel-header" id="panel-header">' +
173
+ LOGO_SVG +
174
+ '<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>'
175
+
176
+ shadow.getElementById('panel-close').addEventListener('click', hidePanel)
177
+
178
+ const tabs = shadow.getElementById('tabs')
179
+ tabs.addEventListener('click', (e) => {
180
+ const tab = e.target.closest('.tab')
181
+ if (tab) {
182
+ activeTab = tab.dataset.tab
183
+ updateTabs()
184
+ updateContent()
185
+ }
186
+ })
187
+
188
+ setupDrag()
189
+ }
190
+
191
+ function setupDrag() {
192
+ const header = shadow.getElementById('panel-header')
193
+
194
+ header.addEventListener('mousedown', (e) => {
195
+ if (e.target.closest('.panel-close')) return
196
+ isDragging = true
197
+ const rect = panelDialog.getBoundingClientRect()
198
+ dragOffset.x = e.clientX - rect.left
199
+ dragOffset.y = e.clientY - rect.top
200
+ panelPos.x = rect.left
201
+ panelPos.y = rect.top
202
+ snappedEdge = { h: null, v: null }
203
+ })
204
+
205
+ document.addEventListener('mousemove', (e) => {
206
+ if (!isDragging) return
207
+ const x = e.clientX - dragOffset.x
208
+ const y = e.clientY - dragOffset.y
209
+ const snapDist = 20
210
+ const w = window.innerWidth
211
+ const h = window.innerHeight
212
+ const pw = panelDialog.offsetWidth
213
+ const ph = panelDialog.offsetHeight
214
+ const pad = 10
215
+
216
+ let snapH = null
217
+ let snapV = null
218
+
219
+ if (x < snapDist) snapH = 'left'
220
+ else if (x + pw > w - snapDist) snapH = 'right'
221
+ if (y < snapDist) snapV = 'top'
222
+ else if (y + ph > h - snapDist) snapV = 'bottom'
223
+
224
+ snappedEdge = { h: snapH, v: snapV }
225
+
226
+ if (snapH === 'left') {
227
+ panelDialog.style.left = pad + 'px'
228
+ panelDialog.style.right = 'auto'
229
+ } else if (snapH === 'right') {
230
+ panelDialog.style.left = 'auto'
231
+ panelDialog.style.right = pad + 'px'
232
+ } else {
233
+ panelDialog.style.left = x + 'px'
234
+ panelDialog.style.right = 'auto'
235
+ panelPos.x = x
236
+ }
237
+
238
+ if (snapV === 'top') {
239
+ panelDialog.style.top = pad + 'px'
240
+ panelDialog.style.bottom = 'auto'
241
+ } else if (snapV === 'bottom') {
242
+ panelDialog.style.top = 'auto'
243
+ panelDialog.style.bottom = pad + 'px'
244
+ } else {
245
+ panelDialog.style.top = y + 'px'
246
+ panelDialog.style.bottom = 'auto'
247
+ panelPos.y = y
248
+ }
249
+ })
250
+
251
+ document.addEventListener('mouseup', () => {
252
+ isDragging = false
253
+ })
254
+ }
255
+
256
+ let keyboardSetup = false
257
+ function setupKeyboard() {
258
+ if (keyboardSetup) return
259
+ keyboardSetup = true
260
+ document.addEventListener('keydown', (e) => {
261
+ if (e.altKey && e.code === 'Space') {
262
+ e.preventDefault()
263
+ toggleSpotlight()
264
+ } else if (e.altKey) {
265
+ const tabMap = {
266
+ KeyS: 'seo',
267
+ KeyR: 'route',
268
+ KeyL: 'loader',
269
+ KeyE: 'errors',
270
+ }
271
+ const tab = tabMap[e.code]
272
+ if (tab) {
273
+ e.preventDefault()
274
+ activeTab = tab
275
+ hideSpotlight()
276
+ showPanel()
277
+ }
278
+ } else if (e.code === 'Escape') {
279
+ if (spotlightDialog?.open) spotlightDialog.close()
280
+ else if (panelDialog?.open) panelDialog.close()
281
+ }
282
+ })
283
+ }
284
+
285
+ function toggleSpotlight() {
286
+ if (spotlightDialog?.open) hideSpotlight()
287
+ else showSpotlight()
288
+ }
289
+
290
+ function showSpotlight() {
291
+ if (!host) createHost()
292
+ spotlightDialog.showModal()
293
+ }
294
+
295
+ function hideSpotlight() {
296
+ spotlightDialog.close()
297
+ }
298
+
299
+ function showPanel() {
300
+ if (!host) createHost()
301
+ const pad = 10
302
+ if (snappedEdge.h === 'left') {
303
+ panelDialog.style.left = pad + 'px'
304
+ panelDialog.style.right = 'auto'
305
+ } else if (snappedEdge.h === 'right') {
306
+ panelDialog.style.left = 'auto'
307
+ panelDialog.style.right = pad + 'px'
308
+ } else {
309
+ panelDialog.style.left = panelPos.x + 'px'
310
+ panelDialog.style.right = 'auto'
311
+ }
312
+ if (snappedEdge.v === 'top') {
313
+ panelDialog.style.top = pad + 'px'
314
+ panelDialog.style.bottom = 'auto'
315
+ } else if (snappedEdge.v === 'bottom') {
316
+ panelDialog.style.top = 'auto'
317
+ panelDialog.style.bottom = pad + 'px'
318
+ } else {
319
+ panelDialog.style.top = panelPos.y + 'px'
320
+ panelDialog.style.bottom = 'auto'
321
+ }
322
+ panelDialog.show()
323
+ updateTabs()
324
+ updateContent()
325
+ }
326
+
327
+ function hidePanel() {
328
+ panelDialog.close()
329
+ }
330
+
331
+ function updateTabs() {
332
+ shadow.querySelectorAll('.tab').forEach((t) => {
333
+ t.classList.toggle('active', t.dataset.tab === activeTab)
334
+ })
335
+ }
336
+
337
+ function updateContent() {
338
+ const content = shadow.getElementById('content')
339
+ if (activeTab === 'seo') content.innerHTML = getSeoContent()
340
+ else if (activeTab === 'route') content.innerHTML = getRouteContent()
341
+ else if (activeTab === 'loader') content.innerHTML = getLoaderContent()
342
+ else if (activeTab === 'errors') content.innerHTML = getErrorsContent()
343
+ }
344
+
345
+ function getSeoContent() {
346
+ const title = document.title || ''
347
+ const desc = document.querySelector('meta[name="description"]')?.getAttribute('content') || ''
348
+ const ogTitle = document.querySelector('meta[property="og:title"]')?.getAttribute('content') || ''
349
+ const ogDesc = document.querySelector('meta[property="og:description"]')?.getAttribute('content') || ''
350
+ const ogImage = document.querySelector('meta[property="og:image"]')?.getAttribute('content') || ''
351
+
352
+ const issues = []
353
+ if (!title) issues.push({ type: 'error', msg: 'Missing title' })
354
+ else if (title.length > 60) issues.push({ type: 'warn', msg: 'Title too long (>60)' })
355
+ if (!desc) issues.push({ type: 'error', msg: 'Missing description' })
356
+ else if (desc.length > 160) issues.push({ type: 'warn', msg: 'Description too long (>160)' })
357
+ if (!ogTitle) issues.push({ type: 'warn', msg: 'Missing og:title' })
358
+ if (!ogImage) issues.push({ type: 'warn', msg: 'Missing og:image' })
359
+
360
+ let html = ''
361
+ if (issues.length) {
362
+ html += '<div class="section"><div class="section-title">Issues</div>'
363
+ issues.forEach((i) => {
364
+ html +=
365
+ '<div class="issue-item"><span class="issue-icon">' +
366
+ (i.type === 'error' ? '✖' : '⚠') +
367
+ '</span><span>' +
368
+ escapeHtml(i.msg) +
369
+ '</span></div>'
370
+ })
371
+ html += '</div>'
372
+ }
373
+
374
+ html +=
375
+ '<div class="section"><div class="section-title">Google Preview</div><div class="preview-card" style="background:#fff;color:#202124;padding:12px;border-radius:8px;">'
376
+ html += '<div style="font-size:12px;color:#202124;margin-bottom:2px;">' + escapeHtml(location.hostname) + '</div>'
377
+ html += '<div style="font-size:16px;color:#1a0dab;margin-bottom:4px;">' + escapeHtml(title || 'No title') + '</div>'
378
+ html += '<div style="font-size:13px;color:#4d5156;">' + escapeHtml(desc ? desc.slice(0, 160) : 'No description') + '</div>'
379
+ html += '</div></div>'
380
+
381
+ if (ogImage) {
382
+ html += '<div class="section"><div class="section-title">Social Preview</div>'
383
+ html += '<div class="preview-card" style="background:#fff;border-radius:12px;overflow:hidden;border:1px solid #e1e8ed;">'
384
+ html += '<img src="' + escapeHtml(ogImage) + '" style="width:100%;height:auto;display:block;border-bottom:1px solid #e1e8ed;" onerror="this.style.display=\'none\'" />'
385
+ html += '<div style="padding:12px;">'
386
+ html += '<div style="font-size:12px;color:#8899a6;text-transform:uppercase;margin-bottom:2px;">' + escapeHtml(location.hostname) + '</div>'
387
+ html += '<div style="font-size:15px;color:#1c2022;font-weight:700;margin-bottom:4px;line-height:1.3;">' + escapeHtml(ogTitle || title || 'No title') + '</div>'
388
+ html += '<div style="font-size:14px;color:#8899a6;line-height:1.3;">' + escapeHtml((ogDesc || desc || '').slice(0, 100)) + '</div>'
389
+ html += '</div></div></div>'
390
+ }
391
+
392
+ html += '<div class="section"><div class="section-title">Meta Tags</div>'
393
+ html += '<div class="info-row"><div class="info-label">title</div><div class="info-value">' + escapeHtml(title || '-') + '</div></div>'
394
+ html += '<div class="info-row"><div class="info-label">description</div><div class="info-value">' + escapeHtml(desc || '-') + '</div></div>'
395
+ html += '<div class="info-row"><div class="info-label">og:title</div><div class="info-value">' + escapeHtml(ogTitle || '-') + '</div></div>'
396
+ html += '<div class="info-row"><div class="info-label">og:description</div><div class="info-value">' + escapeHtml(ogDesc || '-') + '</div></div>'
397
+ html += '<div class="info-row"><div class="info-label">og:image</div><div class="info-value">' + escapeHtml(ogImage || '-') + '</div></div>'
398
+ html += '</div>'
399
+
400
+ return html
401
+ }
402
+
403
+ function getRouteContent() {
404
+ const pathname = location.pathname
405
+ const segments = pathname.split('/').filter(Boolean)
406
+ const search = location.search
407
+ const hash = location.hash
408
+ const devtools = window.__oneDevtools || {}
409
+ const routeInfo = devtools.routeInfo || {}
410
+ const params = routeInfo.params || {}
411
+
412
+ let html = '<div class="section"><div class="section-title">Current Route</div>'
413
+ html += '<div class="info-row"><span class="info-label">pathname</span><span class="info-value">' + escapeHtml(pathname) + '</span></div>'
414
+ html +=
415
+ '<div class="info-row"><span class="info-label">segments</span><span class="info-value">' +
416
+ (segments.length
417
+ ? segments.map((s) => '<span style="background:#252525;padding:2px 6px;border-radius:4px;margin-right:4px;">' + escapeHtml(s) + '</span>').join('')
418
+ : '/') +
419
+ '</span></div>'
420
+ if (search) html += '<div class="info-row"><span class="info-label">search</span><span class="info-value">' + escapeHtml(search) + '</span></div>'
421
+ if (hash) html += '<div class="info-row"><span class="info-label">hash</span><span class="info-value">' + escapeHtml(hash) + '</span></div>'
422
+ html += '</div>'
423
+
424
+ if (Object.keys(params).length) {
425
+ html += '<div class="section"><div class="section-title">Route Params</div>'
426
+ Object.entries(params).forEach(([k, v]) => {
427
+ html += '<div class="info-row"><span class="info-label">' + escapeHtml(k) + '</span><span class="info-value">' + escapeHtml(String(v)) + '</span></div>'
428
+ })
429
+ html += '</div>'
430
+ }
431
+
432
+ html += '<div class="section"><div class="section-title">Full URL</div>'
433
+ html += '<div style="font-family:monospace;font-size:11px;color:#666;word-break:break-all;">' + escapeHtml(location.href) + '</div>'
434
+ html += '</div>'
435
+
436
+ return html
437
+ }
438
+
439
+ function getLoaderContent() {
440
+ const devtools = window.__oneDevtools || {}
441
+ const history = typeof devtools.getLoaderTimingHistory === 'function' ? devtools.getLoaderTimingHistory() || [] : []
442
+
443
+ if (!history.length) {
444
+ return '<div class="empty">No loader timings recorded yet</div>'
445
+ }
446
+
447
+ const maxTime = Math.max(...history.map((t) => t.totalTime || 0))
448
+ let html = ''
449
+
450
+ history.forEach((t) => {
451
+ const modPct = t.moduleLoadTime && t.totalTime ? (t.moduleLoadTime / t.totalTime) * 100 : 0
452
+ const execPct = t.executionTime && t.totalTime ? (t.executionTime / t.totalTime) * 100 : 0
453
+ const widthPct = t.totalTime && maxTime ? (t.totalTime / maxTime) * 100 : 0
454
+
455
+ html += '<div class="error-item' + (t.error ? ' error' : '') + '">'
456
+ html += '<div style="display:flex;justify-content:space-between;align-items:center;">'
457
+ html += '<span style="font-family:monospace;font-size:11px;">' + escapeHtml(t.path) + '</span>'
458
+ html += '<span class="badge badge-' + (t.error ? 'error' : 'success') + '">' + (t.totalTime ? Math.round(t.totalTime) + 'ms' : '-') + '</span>'
459
+ html += '</div>'
460
+ if (!t.error) {
461
+ html += '<div class="timing-bar" style="width:' + Math.max(20, widthPct) + '%;">'
462
+ html += '<div class="timing-segment timing-module" style="width:' + modPct + '%;" title="Module: ' + Math.round(t.moduleLoadTime || 0) + 'ms"></div>'
463
+ html += '<div class="timing-segment timing-exec" style="width:' + execPct + '%;" title="Exec: ' + Math.round(t.executionTime || 0) + 'ms"></div>'
464
+ html += '</div>'
465
+ }
466
+ if (t.error) html += '<div class="error-msg">' + escapeHtml(t.error) + '</div>'
467
+ html += '</div>'
468
+ })
469
+
470
+ return html
471
+ }
472
+
473
+ function getErrorsContent() {
474
+ const devtools = window.__oneDevtools || {}
475
+ const errors = devtools.errorHistory || []
476
+
477
+ if (!errors.length) {
478
+ return '<div class="empty">✓ No errors recorded</div>'
479
+ }
480
+
481
+ let html = ''
482
+ errors.forEach((err) => {
483
+ html += '<div class="error-item error">'
484
+ html += '<div style="display:flex;justify-content:space-between;align-items:center;margin-bottom:6px;">'
485
+ html += '<span class="badge badge-error">' + escapeHtml(err.type || 'error') + '</span>'
486
+ html += '<span style="font-size:11px;color:#666;">' + new Date(err.timestamp).toLocaleTimeString() + '</span>'
487
+ html += '</div>'
488
+ html += '<div class="error-msg">' + escapeHtml(err.error?.message || 'Unknown error') + '</div>'
489
+ html += '</div>'
490
+ })
491
+
492
+ return html
493
+ }
494
+
495
+ function initAfterHydration() {
496
+ if (typeof requestIdleCallback !== 'undefined') {
497
+ requestIdleCallback(() => createHost(), { timeout: 3000 })
498
+ } else {
499
+ setTimeout(createHost, 100)
500
+ }
501
+ }
502
+
503
+ if (document.readyState === 'complete') {
504
+ initAfterHydration()
505
+ } else {
506
+ window.addEventListener('load', initAfterHydration)
507
+ }
508
+
509
+ window.addEventListener('one-loader-timing', () => {
510
+ if (panelDialog?.open && activeTab === 'loader') updateContent()
511
+ })
512
+
513
+ window.addEventListener('one-error', (e) => {
514
+ const devtools = (window.__oneDevtools = window.__oneDevtools || {})
515
+ devtools.errorHistory = devtools.errorHistory || []
516
+ devtools.errorHistory.unshift(e.detail)
517
+ if (devtools.errorHistory.length > 20) devtools.errorHistory = devtools.errorHistory.slice(0, 20)
518
+ if (panelDialog?.open && activeTab === 'errors') updateContent()
519
+ })
520
+
521
+ function onNavigate() {
522
+ if (panelDialog?.open) updateContent()
523
+ }
524
+ window.addEventListener('popstate', onNavigate)
525
+ window.addEventListener('one-hmr-update', onNavigate)
526
+
527
+ const origPushState = history.pushState
528
+ const origReplaceState = history.replaceState
529
+ history.pushState = function (...args) {
530
+ origPushState.apply(this, args)
531
+ setTimeout(onNavigate, 0)
532
+ }
533
+ history.replaceState = function (...args) {
534
+ origReplaceState.apply(this, args)
535
+ setTimeout(onNavigate, 0)
536
+ }
537
+ } catch (e) {
538
+ console.error('[One DevTools] Failed to initialize:', e)
539
+ }
540
+ })()