@kubed.io/cdn 0.0.4 → 0.0.6

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 (430) hide show
  1. package/README.md +11 -0
  2. package/dist/chunks/1c-Cg7z75RR.js +94 -0
  3. package/dist/chunks/1c-Cg7z75RR.js.map +1 -0
  4. package/dist/chunks/abnf-DjOFdYyB.js +59 -0
  5. package/dist/chunks/abnf-DjOFdYyB.js.map +1 -0
  6. package/dist/chunks/accesslog-CT59MCIO.js +72 -0
  7. package/dist/chunks/accesslog-CT59MCIO.js.map +1 -0
  8. package/dist/chunks/actionscript-BF7IWfId.js +85 -0
  9. package/dist/chunks/actionscript-BF7IWfId.js.map +1 -0
  10. package/dist/chunks/ada-BW8u8CRX.js +107 -0
  11. package/dist/chunks/ada-BW8u8CRX.js.map +1 -0
  12. package/dist/chunks/angelscript-2l-XM2Vw.js +91 -0
  13. package/dist/chunks/angelscript-2l-XM2Vw.js.map +1 -0
  14. package/dist/chunks/apache-ClDRwhlj.js +87 -0
  15. package/dist/chunks/apache-ClDRwhlj.js.map +1 -0
  16. package/dist/chunks/applescript-BnCdU8ml.js +57 -0
  17. package/dist/chunks/applescript-BnCdU8ml.js.map +1 -0
  18. package/dist/chunks/arcade-BtIJZuSq.js +157 -0
  19. package/dist/chunks/arcade-BtIJZuSq.js.map +1 -0
  20. package/dist/chunks/arduino-xB3NbW4M.js +272 -0
  21. package/dist/chunks/arduino-xB3NbW4M.js.map +1 -0
  22. package/dist/chunks/armasm-Dg5wPE4N.js +66 -0
  23. package/dist/chunks/armasm-Dg5wPE4N.js.map +1 -0
  24. package/dist/chunks/asciidoc-ZAddoC6x.js +178 -0
  25. package/dist/chunks/asciidoc-ZAddoC6x.js.map +1 -0
  26. package/dist/chunks/aspectj-Dfd0IA-3.js +126 -0
  27. package/dist/chunks/aspectj-Dfd0IA-3.js.map +1 -0
  28. package/dist/chunks/autohotkey-tKEhIrY9.js +55 -0
  29. package/dist/chunks/autohotkey-tKEhIrY9.js.map +1 -0
  30. package/dist/chunks/autoit-BPoYFiDT.js +123 -0
  31. package/dist/chunks/autoit-BPoYFiDT.js.map +1 -0
  32. package/dist/chunks/avrasm-DcwC__J5.js +47 -0
  33. package/dist/chunks/avrasm-DcwC__J5.js.map +1 -0
  34. package/dist/chunks/awk-B0eiS31p.js +56 -0
  35. package/dist/chunks/awk-B0eiS31p.js.map +1 -0
  36. package/dist/chunks/axapta-BZnaEvVa.js +65 -0
  37. package/dist/chunks/axapta-BZnaEvVa.js.map +1 -0
  38. package/dist/chunks/bash-SfqkqXwO.js +171 -0
  39. package/dist/chunks/bash-SfqkqXwO.js.map +1 -0
  40. package/dist/chunks/basic-hK9i76TR.js +44 -0
  41. package/dist/chunks/basic-hK9i76TR.js.map +1 -0
  42. package/dist/chunks/bnf-CT5PE87o.js +28 -0
  43. package/dist/chunks/bnf-CT5PE87o.js.map +1 -0
  44. package/dist/chunks/brainfuck-Cix81oQc.js +41 -0
  45. package/dist/chunks/brainfuck-Cix81oQc.js.map +1 -0
  46. package/dist/chunks/c-DqpMY-rp.js +189 -0
  47. package/dist/chunks/c-DqpMY-rp.js.map +1 -0
  48. package/dist/chunks/cal-C-xic9Tn.js +91 -0
  49. package/dist/chunks/cal-C-xic9Tn.js.map +1 -0
  50. package/dist/chunks/capnproto-Bte6wB8g.js +84 -0
  51. package/dist/chunks/capnproto-Bte6wB8g.js.map +1 -0
  52. package/dist/chunks/ceylon-B5xM3rkd.js +77 -0
  53. package/dist/chunks/ceylon-B5xM3rkd.js.map +1 -0
  54. package/dist/chunks/clean-58wPfVlT.js +24 -0
  55. package/dist/chunks/clean-58wPfVlT.js.map +1 -0
  56. package/dist/chunks/clojure-DnooNAlk.js +114 -0
  57. package/dist/chunks/clojure-DnooNAlk.js.map +1 -0
  58. package/dist/chunks/clojure-repl-BOwc5f8V.js +18 -0
  59. package/dist/chunks/clojure-repl-BOwc5f8V.js.map +1 -0
  60. package/dist/chunks/cmake-CmXecy9B.js +28 -0
  61. package/dist/chunks/cmake-CmXecy9B.js.map +1 -0
  62. package/dist/chunks/coffeescript-BxFWPVxK.js +199 -0
  63. package/dist/chunks/coffeescript-BxFWPVxK.js.map +1 -0
  64. package/dist/chunks/coq-q80xvjL8.js +26 -0
  65. package/dist/chunks/coq-q80xvjL8.js.map +1 -0
  66. package/dist/chunks/core-BSQzrNYA.js +853 -0
  67. package/dist/chunks/core-BSQzrNYA.js.map +1 -0
  68. package/dist/chunks/cos-DiRYB57M.js +78 -0
  69. package/dist/chunks/cos-DiRYB57M.js.map +1 -0
  70. package/dist/chunks/cpp-BvOt3G_R.js +238 -0
  71. package/dist/chunks/cpp-BvOt3G_R.js.map +1 -0
  72. package/dist/chunks/crmsh-h8TY8H79.js +80 -0
  73. package/dist/chunks/crmsh-h8TY8H79.js.map +1 -0
  74. package/dist/chunks/crystal-Cn8iNhTZ.js +247 -0
  75. package/dist/chunks/crystal-Cn8iNhTZ.js.map +1 -0
  76. package/dist/chunks/csharp-BUAiXZio.js +262 -0
  77. package/dist/chunks/csharp-BUAiXZio.js.map +1 -0
  78. package/dist/chunks/csp-BP06y0Ba.js +25 -0
  79. package/dist/chunks/csp-BP06y0Ba.js.map +1 -0
  80. package/dist/chunks/css-CuP2L3Vg.js +147 -0
  81. package/dist/chunks/css-CuP2L3Vg.js.map +1 -0
  82. package/dist/chunks/d-C0cOEHlZ.js +87 -0
  83. package/dist/chunks/d-C0cOEHlZ.js.map +1 -0
  84. package/dist/chunks/dart-DOyn4FWh.js +136 -0
  85. package/dist/chunks/dart-DOyn4FWh.js.map +1 -0
  86. package/dist/chunks/{define-XzEniRJH.js → define-DqUpowD9.js} +3 -3
  87. package/dist/chunks/{define-XzEniRJH.js.map → define-DqUpowD9.js.map} +1 -1
  88. package/dist/chunks/delphi-BL8QbVUL.js +95 -0
  89. package/dist/chunks/delphi-BL8QbVUL.js.map +1 -0
  90. package/dist/chunks/diff-DMbO7OaS.js +41 -0
  91. package/dist/chunks/diff-DMbO7OaS.js.map +1 -0
  92. package/dist/chunks/django-CnvXUSpm.js +44 -0
  93. package/dist/chunks/django-CnvXUSpm.js.map +1 -0
  94. package/dist/chunks/dns-DpaEqlb1.js +73 -0
  95. package/dist/chunks/dns-DpaEqlb1.js.map +1 -0
  96. package/dist/chunks/dockerfile-D9WngOli.js +36 -0
  97. package/dist/chunks/dockerfile-D9WngOli.js.map +1 -0
  98. package/dist/chunks/dos-w6Vxr4_L.js +59 -0
  99. package/dist/chunks/dos-w6Vxr4_L.js.map +1 -0
  100. package/dist/chunks/dsconfig-Dq_NzMQE.js +56 -0
  101. package/dist/chunks/dsconfig-Dq_NzMQE.js.map +1 -0
  102. package/dist/chunks/dts-CpWaLhGr.js +117 -0
  103. package/dist/chunks/dts-CpWaLhGr.js.map +1 -0
  104. package/dist/chunks/dust-C4uDg2L0.js +34 -0
  105. package/dist/chunks/dust-C4uDg2L0.js.map +1 -0
  106. package/dist/chunks/ebnf-ByjV7C32.js +41 -0
  107. package/dist/chunks/ebnf-ByjV7C32.js.map +1 -0
  108. package/dist/chunks/{element-ChNBLJ5X.js → element-CaN9ZVoe.js} +60 -60
  109. package/dist/chunks/element-CaN9ZVoe.js.map +1 -0
  110. package/dist/chunks/elixir-DkdYO0Vr.js +191 -0
  111. package/dist/chunks/elixir-DkdYO0Vr.js.map +1 -0
  112. package/dist/chunks/elm-Clms-iZw.js +101 -0
  113. package/dist/chunks/elm-Clms-iZw.js.map +1 -0
  114. package/dist/chunks/erb-BC3HNNgp.js +18 -0
  115. package/dist/chunks/erb-BC3HNNgp.js.map +1 -0
  116. package/dist/chunks/erlang-Cu0IlQov.js +220 -0
  117. package/dist/chunks/erlang-Cu0IlQov.js.map +1 -0
  118. package/dist/chunks/erlang-repl-5hCt0uhz.js +42 -0
  119. package/dist/chunks/erlang-repl-5hCt0uhz.js.map +1 -0
  120. package/dist/chunks/excel-BIDJpxSu.js +49 -0
  121. package/dist/chunks/excel-BIDJpxSu.js.map +1 -0
  122. package/dist/chunks/fix-C0h50qaq.js +31 -0
  123. package/dist/chunks/fix-C0h50qaq.js.map +1 -0
  124. package/dist/chunks/flix-BCyKzKuw.js +61 -0
  125. package/dist/chunks/flix-BCyKzKuw.js.map +1 -0
  126. package/dist/chunks/fortran-DJ9If3VL.js +55 -0
  127. package/dist/chunks/fortran-DJ9If3VL.js.map +1 -0
  128. package/dist/chunks/freedesktop-DY5X71dr.js +88 -0
  129. package/dist/chunks/freedesktop-DY5X71dr.js.map +1 -0
  130. package/dist/chunks/fsharp-B-zxwYyG.js +243 -0
  131. package/dist/chunks/fsharp-B-zxwYyG.js.map +1 -0
  132. package/dist/chunks/gams-Bk-CWpk3.js +128 -0
  133. package/dist/chunks/gams-Bk-CWpk3.js.map +1 -0
  134. package/dist/chunks/gauss-DoDOans8.js +154 -0
  135. package/dist/chunks/gauss-DoDOans8.js.map +1 -0
  136. package/dist/chunks/gcode-BUHWwtTe.js +123 -0
  137. package/dist/chunks/gcode-BUHWwtTe.js.map +1 -0
  138. package/dist/chunks/gherkin-Wzf9M781.js +70 -0
  139. package/dist/chunks/gherkin-Wzf9M781.js.map +1 -0
  140. package/dist/chunks/glsl-CUb3B_sB.js +27 -0
  141. package/dist/chunks/glsl-CUb3B_sB.js.map +1 -0
  142. package/dist/chunks/gml-BS5lKjIV.js +24 -0
  143. package/dist/chunks/gml-BS5lKjIV.js.map +1 -0
  144. package/dist/chunks/go-BUD6D8kx.js +146 -0
  145. package/dist/chunks/go-BUD6D8kx.js.map +1 -0
  146. package/dist/chunks/golo-CeWwUkIr.js +27 -0
  147. package/dist/chunks/golo-CeWwUkIr.js.map +1 -0
  148. package/dist/chunks/gradle-BoqM74sD.js +20 -0
  149. package/dist/chunks/gradle-BoqM74sD.js.map +1 -0
  150. package/dist/chunks/graphql-j3kf95P9.js +69 -0
  151. package/dist/chunks/graphql-j3kf95P9.js.map +1 -0
  152. package/dist/chunks/groovy-B3DHxrmD.js +129 -0
  153. package/dist/chunks/groovy-B3DHxrmD.js.map +1 -0
  154. package/dist/chunks/haml-CgF67t0s.js +98 -0
  155. package/dist/chunks/haml-CgF67t0s.js.map +1 -0
  156. package/dist/chunks/handlebars-Bp8_IuhA.js +146 -0
  157. package/dist/chunks/handlebars-Bp8_IuhA.js.map +1 -0
  158. package/dist/chunks/haskell-2oFXwht3.js +140 -0
  159. package/dist/chunks/haskell-2oFXwht3.js.map +1 -0
  160. package/dist/chunks/haxe-BWUFK1R1.js +144 -0
  161. package/dist/chunks/haxe-BWUFK1R1.js.map +1 -0
  162. package/dist/chunks/highlight-D54M45bZ.js +328 -0
  163. package/dist/chunks/highlight-D54M45bZ.js.map +1 -0
  164. package/dist/chunks/hsp-YaLnMBmw.js +47 -0
  165. package/dist/chunks/hsp-YaLnMBmw.js.map +1 -0
  166. package/dist/chunks/http-D1Jx4NCy.js +76 -0
  167. package/dist/chunks/http-D1Jx4NCy.js.map +1 -0
  168. package/dist/chunks/hy-W6RLRSst.js +75 -0
  169. package/dist/chunks/hy-W6RLRSst.js.map +1 -0
  170. package/dist/chunks/inform7-Cqmf6Xxi.js +45 -0
  171. package/dist/chunks/inform7-Cqmf6Xxi.js.map +1 -0
  172. package/dist/chunks/ini-C_A9yUHA.js +90 -0
  173. package/dist/chunks/ini-C_A9yUHA.js.map +1 -0
  174. package/dist/chunks/irpf90-CFKe0d2G.js +49 -0
  175. package/dist/chunks/irpf90-CFKe0d2G.js.map +1 -0
  176. package/dist/chunks/isbl-DRZZfDZN.js +98 -0
  177. package/dist/chunks/isbl-DRZZfDZN.js.map +1 -0
  178. package/dist/chunks/java-DH7DXQTB.js +176 -0
  179. package/dist/chunks/java-DH7DXQTB.js.map +1 -0
  180. package/dist/chunks/javascript-D-ispHLP.js +433 -0
  181. package/dist/chunks/javascript-D-ispHLP.js.map +1 -0
  182. package/dist/chunks/jboss-cli-DwoEMfEn.js +48 -0
  183. package/dist/chunks/jboss-cli-DwoEMfEn.js.map +1 -0
  184. package/dist/chunks/json-BrJhaXJI.js +44 -0
  185. package/dist/chunks/json-BrJhaXJI.js.map +1 -0
  186. package/dist/chunks/julia-DUM4uO0n.js +82 -0
  187. package/dist/chunks/julia-DUM4uO0n.js.map +1 -0
  188. package/dist/chunks/julia-repl-DkEOqH-L.js +20 -0
  189. package/dist/chunks/julia-repl-DkEOqH-L.js.map +1 -0
  190. package/dist/chunks/kd-B0BcpOG_.js +2662 -0
  191. package/dist/chunks/kd-B0BcpOG_.js.map +1 -0
  192. package/dist/chunks/kotlin-BvSvL3hH.js +208 -0
  193. package/dist/chunks/kotlin-BvSvL3hH.js.map +1 -0
  194. package/dist/chunks/lasso-BixBtX3R.js +122 -0
  195. package/dist/chunks/lasso-BixBtX3R.js.map +1 -0
  196. package/dist/chunks/latex-BNm-5qSt.js +188 -0
  197. package/dist/chunks/latex-BNm-5qSt.js.map +1 -0
  198. package/dist/chunks/ldif-D2VChYy1.js +26 -0
  199. package/dist/chunks/ldif-D2VChYy1.js.map +1 -0
  200. package/dist/chunks/leaf-DZ17MVc2.js +67 -0
  201. package/dist/chunks/leaf-DZ17MVc2.js.map +1 -0
  202. package/dist/chunks/less-Cj7NvTiz.js +198 -0
  203. package/dist/chunks/less-Cj7NvTiz.js.map +1 -0
  204. package/dist/chunks/lisp-0CHBhNkP.js +105 -0
  205. package/dist/chunks/lisp-0CHBhNkP.js.map +1 -0
  206. package/dist/chunks/livecodeserver-f04_o5o0.js +85 -0
  207. package/dist/chunks/livecodeserver-f04_o5o0.js.map +1 -0
  208. package/dist/chunks/livescript-DnaWcjJC.js +192 -0
  209. package/dist/chunks/livescript-DnaWcjJC.js.map +1 -0
  210. package/dist/chunks/llvm-CD_EQmwW.js +71 -0
  211. package/dist/chunks/llvm-CD_EQmwW.js.map +1 -0
  212. package/dist/chunks/lsl-BjbA45DV.js +56 -0
  213. package/dist/chunks/lsl-BjbA45DV.js.map +1 -0
  214. package/dist/chunks/lua-C8cmPpDf.js +48 -0
  215. package/dist/chunks/lua-C8cmPpDf.js.map +1 -0
  216. package/dist/chunks/makefile-vKf6Crs_.js +59 -0
  217. package/dist/chunks/makefile-vKf6Crs_.js.map +1 -0
  218. package/dist/chunks/markdown-D1MbcAo6.js +180 -0
  219. package/dist/chunks/markdown-D1MbcAo6.js.map +1 -0
  220. package/dist/chunks/marked.esm-BrPimSW6.js +1494 -0
  221. package/dist/chunks/marked.esm-BrPimSW6.js.map +1 -0
  222. package/dist/chunks/mathematica-BAI0dr8P.js +71 -0
  223. package/dist/chunks/mathematica-BAI0dr8P.js.map +1 -0
  224. package/dist/chunks/matlab-tHkexNRr.js +72 -0
  225. package/dist/chunks/matlab-tHkexNRr.js.map +1 -0
  226. package/dist/chunks/maxima-DBb1On73.js +40 -0
  227. package/dist/chunks/maxima-DBb1On73.js.map +1 -0
  228. package/dist/chunks/mel-DQ2XEeJZ.js +26 -0
  229. package/dist/chunks/mel-DQ2XEeJZ.js.map +1 -0
  230. package/dist/chunks/mercury-DB7FwEBk.js +57 -0
  231. package/dist/chunks/mercury-DB7FwEBk.js.map +1 -0
  232. package/dist/chunks/mipsasm-Bnw9lQ6-.js +55 -0
  233. package/dist/chunks/mipsasm-Bnw9lQ6-.js.map +1 -0
  234. package/dist/chunks/mizar-CKEtvqV9.js +12 -0
  235. package/dist/chunks/mizar-CKEtvqV9.js.map +1 -0
  236. package/dist/chunks/mojolicious-FvfVuUnD.js +29 -0
  237. package/dist/chunks/mojolicious-FvfVuUnD.js.map +1 -0
  238. package/dist/chunks/monkey-DaGzblyK.js +73 -0
  239. package/dist/chunks/monkey-DaGzblyK.js.map +1 -0
  240. package/dist/chunks/moonscript-B9xmaKDF.js +99 -0
  241. package/dist/chunks/moonscript-B9xmaKDF.js.map +1 -0
  242. package/dist/chunks/n1ql-h7HuiOG_.js +47 -0
  243. package/dist/chunks/n1ql-h7HuiOG_.js.map +1 -0
  244. package/dist/chunks/nestedtext-z3hOUdBb.js +67 -0
  245. package/dist/chunks/nestedtext-z3hOUdBb.js.map +1 -0
  246. package/dist/chunks/nginx-Cscn9g8k.js +126 -0
  247. package/dist/chunks/nginx-Cscn9g8k.js.map +1 -0
  248. package/dist/chunks/nim-DuEHXsfI.js +57 -0
  249. package/dist/chunks/nim-DuEHXsfI.js.map +1 -0
  250. package/dist/chunks/nix-CK-JoV_w.js +176 -0
  251. package/dist/chunks/nix-CK-JoV_w.js.map +1 -0
  252. package/dist/chunks/node-repl-YPgIlFR4.js +21 -0
  253. package/dist/chunks/node-repl-YPgIlFR4.js.map +1 -0
  254. package/dist/chunks/nsis-C2knGE1f.js +103 -0
  255. package/dist/chunks/nsis-C2knGE1f.js.map +1 -0
  256. package/dist/chunks/objectivec-CUvPbZB7.js +119 -0
  257. package/dist/chunks/objectivec-CUvPbZB7.js.map +1 -0
  258. package/dist/chunks/ocaml-CJnlG7MK.js +54 -0
  259. package/dist/chunks/ocaml-CJnlG7MK.js.map +1 -0
  260. package/dist/chunks/openscad-B7xqzB_t.js +61 -0
  261. package/dist/chunks/openscad-B7xqzB_t.js.map +1 -0
  262. package/dist/chunks/oxygene-y7G7cOvu.js +55 -0
  263. package/dist/chunks/oxygene-y7G7cOvu.js.map +1 -0
  264. package/dist/chunks/parser3-BO1P2QTe.js +42 -0
  265. package/dist/chunks/parser3-BO1P2QTe.js.map +1 -0
  266. package/dist/chunks/perl-CIZiAqA2.js +194 -0
  267. package/dist/chunks/perl-CIZiAqA2.js.map +1 -0
  268. package/dist/chunks/pf-DtIBAeXH.js +32 -0
  269. package/dist/chunks/pf-DtIBAeXH.js.map +1 -0
  270. package/dist/chunks/pgsql-DhvwSgY7.js +193 -0
  271. package/dist/chunks/pgsql-DhvwSgY7.js.map +1 -0
  272. package/dist/chunks/php-Df419x2P.js +302 -0
  273. package/dist/chunks/php-Df419x2P.js.map +1 -0
  274. package/dist/chunks/php-template-NGWDJ4ZL.js +45 -0
  275. package/dist/chunks/php-template-NGWDJ4ZL.js.map +1 -0
  276. package/dist/chunks/plaintext-DI9-6uUK.js +12 -0
  277. package/dist/chunks/plaintext-DI9-6uUK.js.map +1 -0
  278. package/dist/chunks/pony-DWRlzIm6.js +52 -0
  279. package/dist/chunks/pony-DWRlzIm6.js.map +1 -0
  280. package/dist/chunks/powershell-Bi81KJvX.js +190 -0
  281. package/dist/chunks/powershell-Bi81KJvX.js.map +1 -0
  282. package/dist/chunks/processing-NRILzl6W.js +100 -0
  283. package/dist/chunks/processing-NRILzl6W.js.map +1 -0
  284. package/dist/chunks/profile-C5HdUz2O.js +40 -0
  285. package/dist/chunks/profile-C5HdUz2O.js.map +1 -0
  286. package/dist/chunks/prolog-CSxvOOUl.js +56 -0
  287. package/dist/chunks/prolog-CSxvOOUl.js.map +1 -0
  288. package/dist/chunks/properties-DVff9GiD.js +40 -0
  289. package/dist/chunks/properties-DVff9GiD.js.map +1 -0
  290. package/dist/chunks/protobuf-CwPeazJT.js +63 -0
  291. package/dist/chunks/protobuf-CwPeazJT.js.map +1 -0
  292. package/dist/chunks/puppet-wWT6-WaD.js +84 -0
  293. package/dist/chunks/puppet-wWT6-WaD.js.map +1 -0
  294. package/dist/chunks/purebasic-HWZkxa8e.js +44 -0
  295. package/dist/chunks/purebasic-HWZkxa8e.js.map +1 -0
  296. package/dist/chunks/purify.es-C_X9UTsz.js +846 -0
  297. package/dist/chunks/purify.es-C_X9UTsz.js.map +1 -0
  298. package/dist/chunks/python-B3xOtrtl.js +240 -0
  299. package/dist/chunks/python-B3xOtrtl.js.map +1 -0
  300. package/dist/chunks/python-repl-DFMVj5e5.js +21 -0
  301. package/dist/chunks/python-repl-DFMVj5e5.js.map +1 -0
  302. package/dist/chunks/q-DOHmm85f.js +23 -0
  303. package/dist/chunks/q-DOHmm85f.js.map +1 -0
  304. package/dist/chunks/qml-LsukXoE-.js +129 -0
  305. package/dist/chunks/qml-LsukXoE-.js.map +1 -0
  306. package/dist/chunks/r-qBqOPbmv.js +142 -0
  307. package/dist/chunks/r-qBqOPbmv.js.map +1 -0
  308. package/dist/chunks/reasonml-D25FoGuQ.js +80 -0
  309. package/dist/chunks/reasonml-D25FoGuQ.js.map +1 -0
  310. package/dist/chunks/rib-C3T5JisO.js +18 -0
  311. package/dist/chunks/rib-C3T5JisO.js.map +1 -0
  312. package/dist/chunks/roboconf-Ckycnnun.js +55 -0
  313. package/dist/chunks/roboconf-Ckycnnun.js.map +1 -0
  314. package/dist/chunks/routeros-DIBiqeDi.js +104 -0
  315. package/dist/chunks/routeros-DIBiqeDi.js.map +1 -0
  316. package/dist/chunks/rsl-C2V3vKIN.js +61 -0
  317. package/dist/chunks/rsl-C2V3vKIN.js.map +1 -0
  318. package/dist/chunks/ruby-C7c-uCk8.js +264 -0
  319. package/dist/chunks/ruby-C7c-uCk8.js.map +1 -0
  320. package/dist/chunks/ruleslanguage-IlptjHhp.js +28 -0
  321. package/dist/chunks/ruleslanguage-IlptjHhp.js.map +1 -0
  322. package/dist/chunks/rust-D-q21Dm6.js +184 -0
  323. package/dist/chunks/rust-D-q21Dm6.js.map +1 -0
  324. package/dist/chunks/sas-ObguUuPf.js +80 -0
  325. package/dist/chunks/sas-ObguUuPf.js.map +1 -0
  326. package/dist/chunks/scala-DVAYHay6.js +164 -0
  327. package/dist/chunks/scala-DVAYHay6.js.map +1 -0
  328. package/dist/chunks/scheme-DIcGbflN.js +106 -0
  329. package/dist/chunks/scheme-DIcGbflN.js.map +1 -0
  330. package/dist/chunks/scilab-ilneDJJS.js +47 -0
  331. package/dist/chunks/scilab-ilneDJJS.js.map +1 -0
  332. package/dist/chunks/scss-BP8UD0nN.js +157 -0
  333. package/dist/chunks/scss-BP8UD0nN.js.map +1 -0
  334. package/dist/chunks/shell-DBkgOY0Y.js +19 -0
  335. package/dist/chunks/shell-DBkgOY0Y.js.map +1 -0
  336. package/dist/chunks/smali-De20QX07.js +85 -0
  337. package/dist/chunks/smali-De20QX07.js.map +1 -0
  338. package/dist/chunks/smalltalk-DWMPo-qT.js +59 -0
  339. package/dist/chunks/smalltalk-DWMPo-qT.js.map +1 -0
  340. package/dist/chunks/sml-yOrArwoc.js +51 -0
  341. package/dist/chunks/sml-yOrArwoc.js.map +1 -0
  342. package/dist/chunks/sqf-BCN5uwk_.js +78 -0
  343. package/dist/chunks/sqf-BCN5uwk_.js.map +1 -0
  344. package/dist/chunks/sql-CmVzGP4w.js +120 -0
  345. package/dist/chunks/sql-CmVzGP4w.js.map +1 -0
  346. package/dist/chunks/stan-BSt7sG8M.js +142 -0
  347. package/dist/chunks/stan-BSt7sG8M.js.map +1 -0
  348. package/dist/chunks/stata-sbG438-7.js +35 -0
  349. package/dist/chunks/stata-sbG438-7.js.map +1 -0
  350. package/dist/chunks/step21-Cfi2MQDZ.js +55 -0
  351. package/dist/chunks/step21-Cfi2MQDZ.js.map +1 -0
  352. package/dist/chunks/stylus-CiBDFhBN.js +185 -0
  353. package/dist/chunks/stylus-CiBDFhBN.js.map +1 -0
  354. package/dist/chunks/subunit-DWjzVCiA.js +36 -0
  355. package/dist/chunks/subunit-DWjzVCiA.js.map +1 -0
  356. package/dist/chunks/swift-Qo_eIir5.js +577 -0
  357. package/dist/chunks/swift-Qo_eIir5.js.map +1 -0
  358. package/dist/chunks/taggerscript-BvuLYKHz.js +39 -0
  359. package/dist/chunks/taggerscript-BvuLYKHz.js.map +1 -0
  360. package/dist/chunks/tap-uMi8uF_X.js +32 -0
  361. package/dist/chunks/tap-uMi8uF_X.js.map +1 -0
  362. package/dist/chunks/tcl-DMPG3T59.js +46 -0
  363. package/dist/chunks/tcl-DMPG3T59.js.map +1 -0
  364. package/dist/chunks/thrift-DAA8HOe8.js +67 -0
  365. package/dist/chunks/thrift-DAA8HOe8.js.map +1 -0
  366. package/dist/chunks/tp-46SXlDZT.js +87 -0
  367. package/dist/chunks/tp-46SXlDZT.js.map +1 -0
  368. package/dist/chunks/twig-Cf_tZ_wH.js +84 -0
  369. package/dist/chunks/twig-Cf_tZ_wH.js.map +1 -0
  370. package/dist/chunks/typescript-Dc6pBLOZ.js +518 -0
  371. package/dist/chunks/typescript-Dc6pBLOZ.js.map +1 -0
  372. package/dist/chunks/vala-C2GHqzgV.js +41 -0
  373. package/dist/chunks/vala-C2GHqzgV.js.map +1 -0
  374. package/dist/chunks/vbnet-DgQ7B7yi.js +71 -0
  375. package/dist/chunks/vbnet-DgQ7B7yi.js.map +1 -0
  376. package/dist/chunks/vbscript-Bid2w6kd.js +43 -0
  377. package/dist/chunks/vbscript-Bid2w6kd.js.map +1 -0
  378. package/dist/chunks/vbscript-html-DznzJpE3.js +16 -0
  379. package/dist/chunks/vbscript-html-DznzJpE3.js.map +1 -0
  380. package/dist/chunks/verilog-Cfn8vMNy.js +58 -0
  381. package/dist/chunks/verilog-Cfn8vMNy.js.map +1 -0
  382. package/dist/chunks/vhdl-DjBWCsn1.js +48 -0
  383. package/dist/chunks/vhdl-DjBWCsn1.js.map +1 -0
  384. package/dist/chunks/vim-DtRU07HQ.js +56 -0
  385. package/dist/chunks/vim-DtRU07HQ.js.map +1 -0
  386. package/dist/chunks/wasm-CavVFuAK.js +65 -0
  387. package/dist/chunks/wasm-CavVFuAK.js.map +1 -0
  388. package/dist/chunks/wren-BKTRrWxW.js +210 -0
  389. package/dist/chunks/wren-BKTRrWxW.js.map +1 -0
  390. package/dist/chunks/x86asm-D3FT8ZrX.js +66 -0
  391. package/dist/chunks/x86asm-D3FT8ZrX.js.map +1 -0
  392. package/dist/chunks/xl-O8DviBwg.js +85 -0
  393. package/dist/chunks/xl-O8DviBwg.js.map +1 -0
  394. package/dist/chunks/xml-UTtAqziF.js +164 -0
  395. package/dist/chunks/xml-UTtAqziF.js.map +1 -0
  396. package/dist/chunks/xquery-Ybt8-gzE.js +149 -0
  397. package/dist/chunks/xquery-Ybt8-gzE.js.map +1 -0
  398. package/dist/chunks/yaml-DT7UV549.js +146 -0
  399. package/dist/chunks/yaml-DT7UV549.js.map +1 -0
  400. package/dist/chunks/zephir-Dsfqs5td.js +72 -0
  401. package/dist/chunks/zephir-Dsfqs5td.js.map +1 -0
  402. package/dist/github/activity.d.ts +49 -0
  403. package/dist/github/hash.d.ts +8 -0
  404. package/dist/github/index.d.ts +10 -0
  405. package/dist/github/tree.d.ts +26 -0
  406. package/dist/github/urls.d.ts +34 -0
  407. package/dist/github.js +253 -0
  408. package/dist/github.js.map +1 -0
  409. package/dist/k8s.js +6 -6
  410. package/dist/k8s.js.map +1 -1
  411. package/dist/kd/elements/code.d.ts +53 -0
  412. package/dist/kd/elements/markdown.d.ts +55 -0
  413. package/dist/kd/feed.d.ts +31 -0
  414. package/dist/kd/files/explorer.d.ts +88 -0
  415. package/dist/kd/files/file.d.ts +84 -0
  416. package/dist/kd/files/index.d.ts +6 -0
  417. package/dist/kd/files/static.d.ts +12 -0
  418. package/dist/kd/files/types.d.ts +51 -0
  419. package/dist/kd/highlight.d.ts +26 -0
  420. package/dist/kd/index.d.ts +8 -0
  421. package/dist/kd.js +5 -5
  422. package/dist/n8n/config.d.ts +3 -2
  423. package/dist/n8n.js +4 -4
  424. package/dist/n8n.js.map +1 -1
  425. package/dist/openapi.js +4 -4
  426. package/dist/openapi.js.map +1 -1
  427. package/package.json +18 -3
  428. package/dist/chunks/element-ChNBLJ5X.js.map +0 -1
  429. package/dist/chunks/kd-Bbw0GeQ5.js +0 -1149
  430. package/dist/chunks/kd-Bbw0GeQ5.js.map +0 -1
package/dist/k8s.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"k8s.js","names":["nothing","nothing","nothing","b","i","A","json","KdElement","applyTheme","define","VERSION","timeRange","COMMUNITY","ARTWORK","ESO","DEVICON","resource","name","DEFAULT_ICON","CRD_ICON","KIND_ICONS","GROUP_ICONS","GROUP_SUFFIXES","BUILT_IN","apiGroup","v","apiVersion","cut","isBuiltInGroup","group","kindIcon","k","kind","exact","suffix","s","WORKLOAD_KINDS","DASHBOARDS","plural","apiPath","ref","root","ns","namespaceRoute","namespace","route","path","definitionRoute","icon","opt","refLink","text","title","to","img","namespaceLink","kindLink","SUFFIXES","QUANTITY","quantity","value","m","duration","seconds","ms","iso","age","t","now","ORDER","BYTES","scale","largest","resources","requests","container","limits","a","request","limit","used","usage","marks","factor","data","CONDITION_ORDER","NEGATIVE_CONDITIONS","CONDITION_LABELS","conditionOk","negative","c","because","conditions","list","obj","order","rank","created","ok","status","step","changed","why","sameRef","o","owners","chain","seen","walk","hash","key","found","related","r","labels","HIDDEN_ANNOTATIONS","annotations","out","code","pill","when","podRows","spec","ips","x","workloadRows","selector","sa","replicas","ROLE","nodeRows","info","address","type","cap","mem","summary","rows","f","PHASE_TONES","phaseTone","re","phase","ready","want","podChips","sidecars","main","all","restarts","n","tone","total","nodeChips","pressure","genericChips","good","lead","chips","bar","trimmed","_drop","metadata","WARNING_REASONS","isWarning","isFieldFrame","frameRows","columns","frame","eventRows","visit","input","labelsOf","l","row","timeOf","foldEvents","groups","message","g","eventsTable","ago","KdK8sEvents","base","#groups","pane","table","#end","KdK8sObject","steps","count","map","KdK8sRef","d"],"sources":["../src/k8s/icons.ts","../src/k8s/links.ts","../src/k8s/map.ts","../src/k8s/events.ts","../src/k8s/elements/events.ts","../src/k8s/elements/object.ts","../src/k8s/elements/ref.ts"],"sourcesContent":["// Kind -> icon. Every URL is pinned to a commit, so an upstream move or rename\n// never breaks a published version.\n\nconst COMMUNITY = 'https://cdn.jsdelivr.net/gh/kubernetes/community@149066325ed521eab576a262ddff8f4da074d5de/icons/svg/';\nconst ARTWORK = 'https://cdn.jsdelivr.net/gh/cncf/artwork@002662490acb2303c7301acc0256c00790e03e9f/projects/';\nconst ESO = 'https://cdn.jsdelivr.net/gh/external-secrets/external-secrets@088f9e5ff057d35bd9f68779893b691abb948b33/assets/';\nconst DEVICON = 'https://cdn.jsdelivr.net/gh/devicons/devicon@7330accdbc47e2dc0c19789a48533c4a3c50fe58/icons/';\n\nconst resource = (name: string) => `${COMMUNITY}resources/unlabeled/${name}.svg`;\n\n/** The Kubernetes wheel: a kind nobody drew an icon for. */\nexport const DEFAULT_ICON = `${ARTWORK}kubernetes/icon/color/kubernetes-icon-color.svg`;\n\n/** A custom resource whose group has no icon of its own. */\nexport const CRD_ICON = resource('crd');\n\n/** The kubernetes/community icon of each built-in kind that has one. */\nexport const KIND_ICONS: Readonly<Record<string, string>> = {\n Pod: resource('pod'),\n Deployment: resource('deploy'),\n StatefulSet: resource('sts'),\n DaemonSet: resource('ds'),\n ReplicaSet: resource('rs'),\n CronJob: resource('cronjob'),\n Job: resource('job'),\n Service: resource('svc'),\n Ingress: resource('ing'),\n IngressClass: resource('ing'),\n Endpoints: resource('ep'),\n EndpointSlice: resource('ep'),\n NetworkPolicy: resource('netpol'),\n ConfigMap: resource('cm'),\n Secret: resource('secret'),\n PersistentVolumeClaim: resource('pvc'),\n PersistentVolume: resource('pv'),\n StorageClass: resource('sc'),\n Volume: resource('vol'),\n ServiceAccount: resource('sa'),\n Role: resource('role'),\n RoleBinding: resource('rb'),\n ClusterRole: resource('c-role'),\n ClusterRoleBinding: resource('crb'),\n User: resource('user'),\n Group: resource('group'),\n Namespace: resource('ns'),\n ResourceQuota: resource('quota'),\n PriorityClass: resource('quota'),\n LimitRange: resource('limits'),\n HorizontalPodAutoscaler: resource('hpa'),\n PodSecurityPolicy: resource('psp'),\n CustomResourceDefinition: resource('crd'),\n Node: `${COMMUNITY}infrastructure_components/unlabeled/node.svg`,\n};\n\n/** The icon of each API group that has one; a group missing here falls back to `CRD_ICON`. */\nexport const GROUP_ICONS: Readonly<Record<string, string>> = {\n 'cert-manager.io': `${ARTWORK}cert-manager/icon/color/cert-manager-icon-color.svg`,\n 'external-secrets.io': `${ESO}eso-round-logo.svg`,\n 'postgresql.kubed.io': `${DEVICON}postgresql/postgresql-original.svg`,\n 'gcp.kubed.io': `${DEVICON}googlecloud/googlecloud-original.svg`,\n 'keycloak.kubed.io': `${ARTWORK}keycloak/icon/color/keycloak-icon-color.svg`,\n 'pkg.crossplane.io': `${ARTWORK}crossplane/icon/color/crossplane-icon-color.svg`,\n};\n\n// Groups whose kinds take their icon from the group, whatever the kind.\nconst GROUP_SUFFIXES: readonly [string, string][] = [\n ['crossplane.io', GROUP_ICONS['pkg.crossplane.io']],\n ['kubed.io', GROUP_ICONS['pkg.crossplane.io']],\n];\n\nconst BUILT_IN = /^(|apps|batch|policy|autoscaling|[a-z0-9.-]*\\.k8s\\.io)$/;\n\n/** The group of an apiVersion: `apps` for `apps/v1`, `''` for `v1`. */\nexport function apiGroup(apiVersion: string | null | undefined): string {\n const v = apiVersion ?? '';\n const cut = v.indexOf('/');\n return cut < 0 ? '' : v.slice(0, cut);\n}\n\n/** Whether a group is served by Kubernetes itself rather than a CRD or an aggregated API. */\nexport function isBuiltInGroup(group: string): boolean {\n return BUILT_IN.test(group);\n}\n\n/**\n * The icon of a kind. With an apiVersion, a custom resource takes its group's\n * icon (or the CRD icon), so a `ServiceAccount` of some operator's group is not\n * drawn as the core one. A kind with no icon at all gets `DEFAULT_ICON`.\n */\nexport function kindIcon(kind: string | null | undefined, apiVersion?: string | null): string {\n const k = kind ?? '';\n if (apiVersion != null && apiVersion !== '') {\n const group = apiGroup(apiVersion);\n if (!isBuiltInGroup(group)) {\n // ldap.kubed.io manages LDAP accounts: its kinds read as users.\n if (group === 'ldap.kubed.io') return KIND_ICONS[k === 'ServiceAccount' ? 'ServiceAccount' : 'User'];\n const exact = GROUP_ICONS[group];\n if (exact) return exact;\n const suffix = GROUP_SUFFIXES.find(([s]) => group === s || group.endsWith(`.${s}`));\n return suffix ? suffix[1] : CRD_ICON;\n }\n }\n return KIND_ICONS[k] ?? DEFAULT_ICON;\n}\n","// Kind -> the k8s-* dashboard that shows it, as kd-link data.\nimport type { DashboardCell, HrefCell } from '../kd/cell';\nimport type { Vars } from '../kd/elements/link';\nimport { apiGroup, isBuiltInGroup, kindIcon } from './icons';\n\n/** What names one Kubernetes object. */\nexport interface ObjectRef {\n kind: string;\n name: string;\n namespace?: string | null;\n apiVersion?: string | null;\n /** The resource name (`deployments`) when the kind's plural is irregular; guessed otherwise. */\n plural?: string | null;\n}\n\n/** A dashboard and its variables. */\nexport interface Route {\n dashboard: string;\n vars: Vars;\n}\n\n/** Options for a link cell. */\nexport interface LinkOptions {\n /** The label; defaults to the object's name. */\n text?: string;\n /** False leaves the icon out; a string replaces it. */\n icon?: boolean | string;\n /** Tooltip; defaults to the kind. */\n title?: string;\n}\n\n/** A dashboard link, or a plain label (an `href` cell with an empty href) where no view shows the kind. */\nexport type RefCell = DashboardCell | HrefCell;\n\n/** Kinds the workload view opens, and the apiVersion each has when a reference omits it. */\nexport const WORKLOAD_KINDS: Readonly<Record<string, string>> = {\n Deployment: 'apps/v1',\n StatefulSet: 'apps/v1',\n DaemonSet: 'apps/v1',\n ReplicaSet: 'apps/v1',\n Job: 'batch/v1',\n CronJob: 'batch/v1',\n};\n\n/** The k8s-* dashboards, by kind, that the routes below can open. */\nexport const DASHBOARDS = {\n pod: 'k8s-pod',\n workload: 'k8s-workload',\n maps: 'k8s-maps',\n volume: 'k8s-volume',\n class: 'k8s-class',\n serviceaccount: 'k8s-serviceaccount',\n crd: 'k8s-crd',\n rd: 'k8s-rd',\n namespace: 'k8s-namespace',\n node: 'k8s-node',\n service: 'k8s-service',\n ingress: 'k8s-ingress',\n resource: 'k8s-resource',\n} as const;\n\n/** A kind's resource name, as the API guesses it: `Ingress` -> `ingresses`, `Policy` -> `policies`. */\nexport function plural(kind: string): string {\n const s = kind.toLowerCase();\n if (s === 'endpoints') return s;\n if (/(s|x|z|ch|sh)$/.test(s)) return `${s}es`;\n if (/[^aeiou]y$/.test(s)) return `${s.slice(0, -1)}ies`;\n return `${s}s`;\n}\n\n/** The API path of an object: `apis/apps/v1/namespaces/db/statefulsets/postgresql`, or `api/v1/nodes/n1`. */\nexport function apiPath(ref: ObjectRef): string | undefined {\n if (!ref.apiVersion) return undefined;\n const root = ref.apiVersion.includes('/') ? 'apis' : 'api';\n const ns = ref.namespace ? `/namespaces/${ref.namespace}` : '';\n return `${root}/${ref.apiVersion}${ns}/${ref.plural || plural(ref.kind)}/${ref.name}`;\n}\n\n/** The namespace view. */\nexport function namespaceRoute(namespace: string): Route {\n return { dashboard: DASHBOARDS.namespace, vars: { app_namespace: namespace } };\n}\n\n/**\n * The dashboard that shows an object: its own k8s-* view for the kinds that\n * have one, else the generic resource view (which needs the apiVersion to\n * build the API path). Undefined when there is neither.\n */\nexport function route(ref: ObjectRef): Route | undefined {\n const { kind, name } = ref;\n const ns = ref.namespace ?? '';\n // A kind of the same name in some operator's group is not the built-in one.\n const builtIn = !ref.apiVersion || isBuiltInGroup(apiGroup(ref.apiVersion));\n if (builtIn) {\n if (kind === 'Pod') return { dashboard: DASHBOARDS.pod, vars: { app_namespace: ns, pod: name } };\n if (kind in WORKLOAD_KINDS) {\n const apiVersion = ref.apiVersion || WORKLOAD_KINDS[kind];\n return {\n dashboard: DASHBOARDS.workload,\n vars: { kind: `${apiVersion}/${ref.plural || plural(kind)}`, app_namespace: ns, workload: name },\n };\n }\n if (kind === 'ConfigMap' || kind === 'Secret') {\n return {\n dashboard: DASHBOARDS.maps,\n vars: { kind: kind === 'Secret' ? 'secrets' : 'configmaps', app_namespace: ns, mapname: name },\n };\n }\n if (kind === 'PersistentVolumeClaim' || kind === 'PersistentVolume') {\n return {\n dashboard: DASHBOARDS.volume,\n vars: {\n kind: kind === 'PersistentVolume' ? 'persistentvolumes' : 'persistentvolumeclaims',\n app_namespace: kind === 'PersistentVolume' ? '' : ns,\n volname: name,\n },\n };\n }\n if (kind === 'StorageClass' || kind === 'IngressClass') {\n return {\n dashboard: DASHBOARDS.class,\n vars: {\n kind: kind === 'IngressClass' ? 'networking.k8s.io/v1/ingressclasses' : 'storage.k8s.io/v1/storageclasses',\n classname: name,\n },\n };\n }\n if (kind === 'ServiceAccount') return { dashboard: DASHBOARDS.serviceaccount, vars: { app_namespace: ns, saname: name } };\n if (kind === 'CustomResourceDefinition') return { dashboard: DASHBOARDS.crd, vars: { crdname: name } };\n if (kind === 'Namespace') return namespaceRoute(name);\n if (kind === 'Node') return { dashboard: DASHBOARDS.node, vars: { node: name } };\n if (kind === 'Service') return { dashboard: DASHBOARDS.service, vars: { app_namespace: ns, service: name } };\n if (kind === 'Ingress') return { dashboard: DASHBOARDS.ingress, vars: { app_namespace: ns, ingress: name } };\n }\n const path = apiPath(ref);\n return path ? { dashboard: DASHBOARDS.resource, vars: { path } } : undefined;\n}\n\n/**\n * The view of a kind's definition: the CRD view for a custom resource (its\n * CRD is named `<plural>.<group>`), the resource-definition view for a\n * built-in kind (which picks it as `<api path>#<Kind>`).\n */\nexport function definitionRoute(kind: string, apiVersion: string, resource?: string | null): Route {\n const group = apiGroup(apiVersion);\n if (!isBuiltInGroup(group)) {\n return { dashboard: DASHBOARDS.crd, vars: { crdname: `${resource || plural(kind)}.${group}` } };\n }\n const root = apiVersion.includes('/') ? 'apis' : 'api';\n return { dashboard: DASHBOARDS.rd, vars: { rd: `${root}/${apiVersion}#${kind}` } };\n}\n\nfunction icon(ref: ObjectRef, opt: LinkOptions): string | undefined {\n if (opt.icon === false) return undefined;\n return typeof opt.icon === 'string' ? opt.icon : kindIcon(ref.kind, ref.apiVersion);\n}\n\n/**\n * An object as a link cell (`kd-link` data) to its view, with its kind's icon\n * and a back link to this page. A kind no view shows is a plain label.\n */\nexport function refLink(ref: ObjectRef, opt: LinkOptions = {}): RefCell {\n const text = opt.text ?? ref.name;\n const title = opt.title ?? ref.kind;\n const to = route(ref);\n const img = icon(ref, opt);\n if (!to) return { href: '', text, title, ...(img ? { icon: img } : {}) };\n return { dashboard: to.dashboard, vars: to.vars, back: true, text, title, ...(img ? { icon: img } : {}) };\n}\n\n/** A namespace as a link cell to the namespace view. */\nexport function namespaceLink(namespace: string, opt: LinkOptions = {}): DashboardCell {\n return refLink({ kind: 'Namespace', name: namespace, apiVersion: 'v1' }, { title: 'Namespace', ...opt }) as DashboardCell;\n}\n\n/** A kind as a link cell to its definition. */\nexport function kindLink(kind: string, apiVersion: string, opt: LinkOptions = {}): DashboardCell {\n const to = definitionRoute(kind, apiVersion);\n const img = icon({ kind, name: kind, apiVersion }, opt);\n return {\n dashboard: to.dashboard,\n vars: to.vars,\n back: true,\n text: opt.text ?? kind,\n title: opt.title ?? apiVersion,\n ...(img ? { icon: img } : {}),\n };\n}\n","// A Kubernetes API object, mapped onto the generic elements' data.\nimport type { Cell, CodeCell, PillCell } from '../kd/cell';\nimport type { BarData } from '../kd/elements/bar';\nimport type { GroupsData } from '../kd/elements/groups';\nimport type { MeterData, MeterMark } from '../kd/elements/meter';\nimport type { SheetRow } from '../kd/elements/sheet';\nimport type { Step, StepStatus } from '../kd/elements/steps';\nimport type { Tone } from '../kd/parts';\nimport { kindIcon } from './icons';\nimport { kindLink, namespaceLink, refLink, WORKLOAD_KINDS, type RefCell } from './links';\n\nexport interface OwnerReference {\n apiVersion?: string;\n kind: string;\n name: string;\n uid?: string;\n controller?: boolean;\n}\n\nexport interface Condition {\n type: string;\n status: 'True' | 'False' | 'Unknown' | string;\n reason?: string;\n message?: string;\n lastTransitionTime?: string;\n}\n\nexport interface ObjectMeta {\n name?: string;\n namespace?: string;\n uid?: string;\n creationTimestamp?: string;\n deletionTimestamp?: string;\n labels?: Record<string, string>;\n annotations?: Record<string, string>;\n ownerReferences?: OwnerReference[];\n finalizers?: string[];\n [key: string]: unknown;\n}\n\n/** Any Kubernetes API object; only the parts the mappings read are typed. */\nexport interface K8sObject {\n apiVersion?: string;\n kind?: string;\n metadata?: ObjectMeta;\n // The shapes differ by kind; each mapping reads what it knows defensively.\n spec?: any;\n status?: any;\n [key: string]: unknown;\n}\n\nexport interface ResourceRequirements {\n requests?: Record<string, string | number>;\n limits?: Record<string, string | number>;\n}\n\n/** A container, or anything with `resources`. */\nexport interface ContainerLike {\n name?: string;\n resources?: ResourceRequirements;\n}\n\n/** Options shared by the mappings that show an age. */\nexport interface MapOptions {\n /** The time ages are measured to, in ms; defaults to now. */\n now?: number;\n /** Other objects the owner chain may walk through (the ReplicaSet a pod's Deployment owns, say). */\n related?: K8sObject[];\n}\n\n// --- quantities and times ------------------------------------------------------\n\nconst SUFFIXES: Record<string, number> = {\n n: 1e-9,\n u: 1e-6,\n m: 1e-3,\n '': 1,\n k: 1e3,\n M: 1e6,\n G: 1e9,\n T: 1e12,\n P: 1e15,\n E: 1e18,\n Ki: 2 ** 10,\n Mi: 2 ** 20,\n Gi: 2 ** 30,\n Ti: 2 ** 40,\n Pi: 2 ** 50,\n Ei: 2 ** 60,\n};\n\nconst QUANTITY = /^([+-]?(?:\\d+(?:\\.\\d*)?|\\.\\d+))(?:([eE][+-]?\\d+)|(Ki|Mi|Gi|Ti|Pi|Ei|[numkMGTPE]))?$/;\n\n/**\n * A Kubernetes quantity as a plain number in base units: `100m` -> 0.1,\n * `128Mi` -> 134217728, `1e3` -> 1000, `2E` -> 2e18. NaN when it is not one.\n */\nexport function quantity(value: string | number | null | undefined): number {\n if (typeof value === 'number') return value;\n if (typeof value !== 'string') return NaN;\n const m = QUANTITY.exec(value.trim());\n if (!m) return NaN;\n const n = Number(m[1]);\n if (m[2]) return n * 10 ** Number(m[2].slice(1));\n return n * SUFFIXES[m[3] ?? ''];\n}\n\n/** Seconds as kubectl-ish text: `42s`, `5m`, `3h 12m`, `2d 4h`. */\nexport function duration(seconds: number): string {\n const s = Math.max(0, Math.floor(seconds));\n if (s < 60) return `${s}s`;\n if (s < 3600) return `${Math.floor(s / 60)}m`;\n if (s < 86400) return `${Math.floor(s / 3600)}h ${Math.floor((s % 3600) / 60)}m`;\n return `${Math.floor(s / 86400)}d ${Math.floor((s % 86400) / 3600)}h`;\n}\n\nconst ms = (iso: string | null | undefined) => (iso ? Date.parse(iso) : NaN);\n\n/** How long ago a timestamp was, or '' without one. */\nexport function age(iso: string | null | undefined, now = Date.now()): string {\n const t = ms(iso);\n return Number.isFinite(t) ? duration((now - t) / 1000) : '';\n}\n\n// --- resources -----------------------------------------------------------------\n\nexport interface ResourceMeter {\n /** `cpu`, `memory`, or any other resource name. */\n resource: string;\n data: MeterData;\n}\n\nconst ORDER = (name: string) => (name === 'cpu' ? 0 : name === 'memory' ? 1 : 2);\nconst BYTES = /^(memory|ephemeral-storage|storage|hugepages-.*)$/;\n\n// The display unit of a resource, chosen from the largest number shown.\nfunction scale(resource: string, largest: number): { unit: string; factor: number } {\n if (resource === 'cpu') return { unit: 'm', factor: 1e3 };\n if (!BYTES.test(resource)) return { unit: '', factor: 1 };\n if (largest >= 2 ** 40) return { unit: 'Ti', factor: 2 ** -40 };\n if (largest >= 2 ** 30) return { unit: 'Gi', factor: 2 ** -30 };\n if (largest >= 2 ** 20) return { unit: 'Mi', factor: 2 ** -20 };\n return { unit: 'Ki', factor: 2 ** -10 };\n}\n\n/**\n * One meter per resource a container requests or limits, cpu and memory\n * first: CPU in millicores, bytes in Ki/Mi/Gi/Ti. `usage` (quantities or base\n * numbers, by resource name) fills the meter; without it only the marks show.\n */\nexport function resources(container: ContainerLike | null | undefined, usage: Record<string, string | number> = {}): ResourceMeter[] {\n const requests = container?.resources?.requests ?? {};\n const limits = container?.resources?.limits ?? {};\n const names = [...new Set([...Object.keys(requests), ...Object.keys(limits)])].sort(\n (a, b) => ORDER(a) - ORDER(b) || (a < b ? -1 : a > b ? 1 : 0),\n );\n return names.map((resource) => {\n const request = quantity(requests[resource]);\n const limit = quantity(limits[resource]);\n const used = quantity(usage[resource]);\n const { unit, factor } = scale(resource, Math.max(...[request, limit, used].filter(Number.isFinite), 0));\n const marks: MeterMark[] = [];\n if (Number.isFinite(request)) marks.push({ label: 'request', value: request * factor });\n if (Number.isFinite(limit)) marks.push({ label: 'limit', value: limit * factor, tone: 'error' });\n const data: MeterData = { unit, marks };\n if (Number.isFinite(used)) data.value = used * factor;\n return { resource, data };\n });\n}\n\n// --- conditions ----------------------------------------------------------------\n\n// The order each kind's conditions happen in; any other condition follows, by time.\nconst CONDITION_ORDER: Record<string, string[]> = {\n Pod: ['PodScheduled', 'PodReadyToStartContainers', 'Initialized', 'ContainersReady', 'Ready'],\n Node: ['MemoryPressure', 'DiskPressure', 'PIDPressure', 'NetworkUnavailable', 'Ready'],\n Deployment: ['Progressing', 'Available', 'ReplicaFailure'],\n};\n\n/** Condition types that are good when False. */\nexport const NEGATIVE_CONDITIONS: ReadonlySet<string> = new Set([\n 'Failed',\n 'Stalled',\n 'Degraded',\n 'FailureTarget',\n 'Suspended',\n 'Terminating',\n 'DisruptionTarget',\n 'ReplicaFailure',\n 'MemoryPressure',\n 'DiskPressure',\n 'PIDPressure',\n 'NetworkUnavailable',\n]);\n\nconst CONDITION_LABELS: Record<string, string> = {\n PodScheduled: 'Scheduled',\n PodReadyToStartContainers: 'Sandbox',\n ContainersReady: 'Containers',\n MemoryPressure: 'Memory',\n DiskPressure: 'Disk',\n PIDPressure: 'PIDs',\n NetworkUnavailable: 'Network',\n};\n\n/** Whether a condition is in its good state (true), its bad one (false), or unknown (null). */\nexport function conditionOk(c: Condition): boolean | null {\n const negative = NEGATIVE_CONDITIONS.has(c.type);\n if (c.status === 'True') return !negative;\n if (c.status === 'False') return negative;\n return null;\n}\n\nconst because = (c: Condition) => [c.reason, c.message].filter((s) => s != null && s !== '').join(': ');\n\n/**\n * The object's conditions as steps, in the order they happen for the kinds\n * that have one: done when good, failed when bad, warning when unknown. The\n * time is how long after creation the condition last changed.\n */\nexport function conditions(obj: K8sObject | null | undefined): Step[] {\n const list: Condition[] = Array.isArray(obj?.status?.conditions) ? obj.status.conditions : [];\n const order = CONDITION_ORDER[obj?.kind ?? ''] ?? [];\n const rank = (c: Condition) => (order.includes(c.type) ? order.indexOf(c.type) : order.length);\n const created = ms(obj?.metadata?.creationTimestamp);\n return [...list]\n .sort((a, b) => rank(a) - rank(b) || (ms(a.lastTransitionTime) || 0) - (ms(b.lastTransitionTime) || 0))\n .map((c) => {\n const ok = conditionOk(c);\n const status: StepStatus = ok === true ? 'done' : ok === false ? 'failed' : 'warning';\n const step: Step = { label: CONDITION_LABELS[c.type] ?? c.type, status };\n const changed = ms(c.lastTransitionTime);\n if (Number.isFinite(changed) && Number.isFinite(created)) step.time = `+${duration((changed - created) / 1000)}`;\n const why = because(c);\n if (why && ok !== true) step.detail = why;\n return step;\n });\n}\n\n// --- owners --------------------------------------------------------------------\n\nconst sameRef = (o: K8sObject, ref: OwnerReference) =>\n (ref.uid && o.metadata?.uid === ref.uid) || (o.kind === ref.kind && o.metadata?.name === ref.name);\n\n/**\n * The owner chain, outermost first, as link cells: each owner reference, with\n * the owners of any owner found in `related` before it. A pod's ReplicaSet\n * that carries its `pod-template-hash` is preceded by the Deployment it\n * implies even when the ReplicaSet itself is not at hand.\n */\nexport function owners(obj: K8sObject | null | undefined, related: K8sObject[] = []): RefCell[] {\n const chain: RefCell[] = [];\n const seen = new Set<string>();\n const walk = (o: K8sObject) => {\n const ns = o.metadata?.namespace;\n const hash = o.metadata?.labels?.['pod-template-hash'];\n for (const ref of o.metadata?.ownerReferences ?? []) {\n const key = ref.uid || `${ref.kind}/${ref.name}`;\n if (seen.has(key)) continue;\n seen.add(key);\n const found = related.find((r) => sameRef(r, ref));\n if (found) walk(found);\n else if (ref.kind === 'ReplicaSet' && hash && ref.name.endsWith(`-${hash}`)) {\n const name = ref.name.slice(0, -hash.length - 1);\n chain.push(refLink({ kind: 'Deployment', name, namespace: ns, apiVersion: ref.apiVersion ?? 'apps/v1' }));\n }\n chain.push(refLink({ kind: ref.kind, name: ref.name, namespace: ns, apiVersion: ref.apiVersion }));\n }\n };\n if (obj) walk(obj);\n return chain;\n}\n\n// --- labels and annotations ---------------------------------------------------\n\n/** The labels, for `<kd-groups mode=\"pills\">`. */\nexport function labels(obj: K8sObject | null | undefined): GroupsData {\n return { ...(obj?.metadata?.labels ?? {}) };\n}\n\n/** Annotations too large and too stale to show: the copy of the object kubectl apply keeps. */\nexport const HIDDEN_ANNOTATIONS: readonly string[] = ['kubectl.kubernetes.io/last-applied-configuration'];\n\n/** The annotations, for `<kd-groups mode=\"tree\">`, without the last-applied copy. */\nexport function annotations(obj: K8sObject | null | undefined): GroupsData {\n const out: GroupsData = { ...(obj?.metadata?.annotations ?? {}) };\n for (const key of HIDDEN_ANNOTATIONS) delete out[key];\n return out;\n}\n\n// --- summary and bar ----------------------------------------------------------\n\nconst code = (value: unknown): CodeCell | undefined =>\n value === null || value === undefined || value === '' ? undefined : { code: String(value) };\nconst pill = (text: string, tone: Tone, title?: string): PillCell => (title ? { text, tone, title } : { text, tone });\n\nfunction when(iso: string | undefined, now: number): Cell {\n const a = age(iso, now);\n return a ? [`${a} ago`, { code: iso as string }] : undefined;\n}\n\nfunction podRows(o: K8sObject, now: number): SheetRow[] {\n const spec = o.spec ?? {};\n const status = o.status ?? {};\n const ns = o.metadata?.namespace;\n const ips = (list: unknown) => (Array.isArray(list) ? list.map((x: { ip?: string }) => code(x?.ip)) : undefined);\n return [\n { key: 'Started', value: when(status.startTime, now) },\n {\n key: 'Node',\n value: spec.nodeName ? refLink({ kind: 'Node', name: spec.nodeName, apiVersion: 'v1' }) : pill('unscheduled', 'warning'),\n },\n { key: 'Pod IP', value: ips(status.podIPs) ?? code(status.podIP) },\n { key: 'Host IP', value: ips(status.hostIPs) ?? code(status.hostIP) },\n { key: 'QoS', value: status.qosClass },\n {\n key: 'Priority',\n value: [\n spec.priorityClassName\n ? refLink({ kind: 'PriorityClass', name: spec.priorityClassName, apiVersion: 'scheduling.k8s.io/v1' })\n : undefined,\n code(spec.priority ?? 0),\n ],\n },\n {\n key: 'Service account',\n value: spec.serviceAccountName\n ? refLink({ kind: 'ServiceAccount', name: spec.serviceAccountName, namespace: ns, apiVersion: 'v1' })\n : undefined,\n },\n { key: 'Restart policy', value: spec.restartPolicy },\n ];\n}\n\nfunction workloadRows(o: K8sObject): SheetRow[] {\n const spec = o.spec ?? {};\n const ns = o.metadata?.namespace;\n const selector = spec.selector?.matchLabels as Record<string, string> | undefined;\n const sa = spec.template?.spec?.serviceAccountName ?? spec.jobTemplate?.spec?.template?.spec?.serviceAccountName;\n return [\n { key: 'Replicas', value: replicas(o)?.text },\n { key: 'Strategy', value: spec.strategy?.type ?? spec.updateStrategy?.type },\n { key: 'Schedule', value: code(spec.schedule) },\n { key: 'Selector', value: selector ? Object.entries(selector).map(([k, v]) => code(`${k}=${v}`)) : undefined },\n { key: 'Service account', value: sa ? refLink({ kind: 'ServiceAccount', name: sa, namespace: ns, apiVersion: 'v1' }) : undefined },\n ];\n}\n\nconst ROLE = 'node-role.kubernetes.io/';\n\nfunction nodeRows(o: K8sObject): SheetRow[] {\n const status = o.status ?? {};\n const info = status.nodeInfo ?? {};\n const address = (type: string) =>\n (Array.isArray(status.addresses) ? status.addresses : []).filter((a: { type?: string }) => a?.type === type).map((a: { address?: string }) => code(a.address));\n const cap = status.capacity ?? {};\n const mem = quantity(cap.memory);\n return [\n { key: 'Roles', value: Object.keys(o.metadata?.labels ?? {}).filter((k) => k.startsWith(ROLE)).map((k) => k.slice(ROLE.length)).join(', ') },\n { key: 'Internal IP', value: address('InternalIP') },\n { key: 'External IP', value: address('ExternalIP') },\n { key: 'Kubelet', value: code(info.kubeletVersion) },\n { key: 'OS', value: [info.osImage, info.architecture].filter(Boolean).join(' · ') },\n { key: 'Kernel', value: code(info.kernelVersion) },\n { key: 'Runtime', value: code(info.containerRuntimeVersion) },\n { key: 'CPU', value: cap.cpu === undefined ? undefined : `${cap.cpu} cores` },\n { key: 'Memory', value: Number.isFinite(mem) ? `${(mem / 2 ** 30).toFixed(1)} Gi` : undefined },\n { key: 'Pods', value: cap.pods },\n ];\n}\n\n/**\n * A property sheet of the object, as the k8s views show it: kind (linked to\n * its definition), namespace, age, owners and uid, then what the kind adds\n * (a pod's node and IPs, a workload's replicas, a node's addresses and\n * capacity), then finalizers. Empty rows are left in; `kd-sheet` drops them.\n */\nexport function summary(obj: K8sObject | null | undefined, opt: MapOptions = {}): SheetRow[] {\n if (!obj) return [];\n const now = opt.now ?? Date.now();\n const m = obj.metadata ?? {};\n const kind = obj.kind ?? '';\n const rows: SheetRow[] = [\n { key: 'Kind', value: kind && obj.apiVersion ? kindLink(kind, obj.apiVersion) : kind },\n { key: 'Namespace', value: m.namespace ? namespaceLink(m.namespace) : undefined },\n { key: 'Created', value: when(m.creationTimestamp, now) },\n {\n key: 'Deleting',\n value: m.deletionTimestamp ? pill('terminating', 'warning', m.deletionTimestamp) : undefined,\n },\n { key: 'Controlled by', value: owners(obj, opt.related) },\n ];\n if (kind === 'Pod') rows.push(...podRows(obj, now));\n else if (kind in WORKLOAD_KINDS) rows.push(...workloadRows(obj));\n else if (kind === 'Node') rows.push(...nodeRows(obj));\n rows.push(\n { key: 'UID', value: code(m.uid) },\n { key: 'Finalizers', value: (m.finalizers ?? []).map((f) => code(f)) },\n );\n return rows;\n}\n\nconst PHASE_TONES: [RegExp, Tone][] = [\n [/^(Running|Bound|Succeeded|Active|Available)$/, 'success'],\n [/^(Pending|Terminating|Released)$/, 'warning'],\n [/^(Failed|Lost)$/, 'error'],\n];\n\nconst phaseTone = (phase: string): Tone => PHASE_TONES.find(([re]) => re.test(phase))?.[1] ?? 'neutral';\n\n// Ready/desired for the kinds that run replicas.\nfunction replicas(o: K8sObject): PillCell | undefined {\n const s = o.status ?? {};\n const kind = o.kind;\n let ready: number | undefined;\n let want: number | undefined;\n if (kind === 'DaemonSet') {\n ready = s.numberReady ?? 0;\n want = s.desiredNumberScheduled ?? 0;\n } else if (kind === 'Deployment' || kind === 'StatefulSet' || kind === 'ReplicaSet') {\n ready = s.readyReplicas ?? 0;\n want = o.spec?.replicas ?? 1;\n }\n if (ready === undefined || want === undefined) return undefined;\n return pill(`${ready}/${want} ready`, ready >= want ? 'success' : 'warning');\n}\n\nfunction podChips(o: K8sObject): Cell[] {\n const status = o.status ?? {};\n const sidecars = new Set(\n (o.spec?.initContainers ?? []).filter((c: { restartPolicy?: string }) => c.restartPolicy === 'Always').map((c: { name: string }) => c.name),\n );\n const main = [\n ...(status.containerStatuses ?? []),\n ...(status.initContainerStatuses ?? []).filter((c: { name: string }) => sidecars.has(c.name)),\n ];\n const all = [...(status.initContainerStatuses ?? []), ...(status.containerStatuses ?? []), ...(status.ephemeralContainerStatuses ?? [])];\n const ready = main.filter((c: { ready?: boolean }) => c.ready).length;\n const restarts = all.reduce((n: number, c: { restartCount?: number }) => n + (c.restartCount ?? 0), 0);\n const phase: string = o.metadata?.deletionTimestamp ? 'Terminating' : (status.phase ?? 'Unknown');\n const tone: Tone = phase === 'Succeeded' ? 'neutral' : phaseTone(phase);\n const total = main.length || (o.spec?.containers ?? []).length;\n return [\n pill(phase, tone, status.message ?? status.reason),\n pill(`${ready}/${total} ready`, ready === total ? 'success' : 'warning'),\n restarts > 0 ? pill(`↻ ${restarts}`, 'warning', 'restarts') : undefined,\n ];\n}\n\nfunction nodeChips(o: K8sObject): Cell[] {\n const ready = ((o.status?.conditions ?? []) as Condition[]).find((c) => c.type === 'Ready');\n const pressure = ((o.status?.conditions ?? []) as Condition[]).filter((c) => c.type !== 'Ready' && conditionOk(c) === false);\n return [\n ready ? pill(ready.status === 'True' ? 'Ready' : 'NotReady', ready.status === 'True' ? 'success' : 'error', because(ready)) : undefined,\n o.spec?.unschedulable ? pill('cordoned', 'warning', 'unschedulable') : undefined,\n ...pressure.map((c) => pill(`✗ ${c.type}`, 'error', because(c))),\n ];\n}\n\n// Phase, then the conditions folded into one good pill and one pill per bad one.\nfunction genericChips(o: K8sObject): Cell[] {\n const s = o.status ?? {};\n const list = (Array.isArray(s.conditions) ? s.conditions : []) as Condition[];\n const good = list.filter((c) => conditionOk(c) === true);\n const lead = ['Ready', 'Available', 'Complete'].find((t) => good.some((c) => c.type === t)) ?? good[0]?.type;\n return [\n typeof s.phase === 'string' ? pill(s.phase, phaseTone(s.phase), 'phase') : undefined,\n kind(o) in WORKLOAD_KINDS ? replicas(o) : undefined,\n good.length ? pill(`✓ ${lead}${good.length > 1 ? ` +${good.length - 1}` : ''}`, 'success', good.map((c) => c.type).join(', ')) : undefined,\n ...list\n .filter((c) => conditionOk(c) !== true)\n .map((c) => (conditionOk(c) === null ? pill(`? ${c.type}`, 'warning', because(c)) : pill(`✗ ${c.type}`, 'error', because(c)))),\n ];\n}\n\nconst kind = (o: K8sObject) => o.kind ?? '';\n\n/** Status pills for the title bar: a pod's phase, readiness and restarts; a node's readiness; else phase, replicas and conditions. */\nexport function chips(obj: K8sObject | null | undefined): Cell[] {\n if (!obj) return [];\n const out = kind(obj) === 'Pod' ? podChips(obj) : kind(obj) === 'Node' ? nodeChips(obj) : genericChips(obj);\n return out.filter((c) => c !== undefined);\n}\n\n/** The title bar: the kind's icon, `Kind · namespace` above the name, status pills and the owner chain. */\nexport function bar(obj: K8sObject | null | undefined, opt: MapOptions = {}): BarData {\n if (!obj) return { title: '' };\n const ns = obj.metadata?.namespace;\n return {\n icon: kindIcon(obj.kind, obj.apiVersion),\n eyebrow: ns ? [`${kind(obj)} ·`, namespaceLink(ns, { icon: false })] : kind(obj),\n title: obj.metadata?.name ?? '',\n chips: chips(obj),\n chain: owners(obj, opt.related),\n };\n}\n\n/** The object without what nobody reads: managedFields and the last-applied copy. */\nexport function trimmed(obj: K8sObject): K8sObject {\n const { managedFields: _drop, ...metadata } = obj.metadata ?? {};\n const out: K8sObject = { ...obj, metadata };\n if (metadata.annotations) {\n const a = annotations(obj);\n if (Object.keys(a).length) metadata.annotations = a;\n else delete metadata.annotations;\n }\n return out;\n}\n","// Kubernetes events as Loki keeps them (one line per event, the object and\n// reason as labels), folded into one row per object, reason and message.\nimport type { Cell } from '../kd/cell';\nimport type { TableColumn, TableData } from '../kd/elements/table';\nimport { refLink, namespaceLink } from './links';\nimport { duration } from './map';\n\n/** The labels the kube-events source puts on each line. */\nexport interface EventLabels {\n kind?: string;\n name?: string;\n namespace?: string;\n objectAPIversion?: string;\n reason?: string;\n type?: string;\n sourcecomponent?: string;\n reportingcontroller?: string;\n [key: string]: unknown;\n}\n\n/** One Loki log row, as Business Text hands a frame's rows to a panel. */\nexport interface EventRow {\n labels?: EventLabels | string;\n Line?: string;\n body?: string;\n Time?: number | string;\n timestamp?: number | string;\n tsNs?: string;\n [key: string]: unknown;\n}\n\n/** One folded event. */\nexport interface EventGroup {\n kind: string;\n name: string;\n namespace: string;\n apiVersion: string;\n reason: string;\n message: string;\n /** The component that reported it. */\n source: string;\n warning: boolean;\n count: number;\n /** ms */\n first: number;\n /** ms */\n last: number;\n}\n\n/** Reasons that mean something went wrong, for sources whose lines carry no `type` label. */\nexport const WARNING_REASONS =\n /^(BackOff|Failed|Unhealthy|Evicted|OOM|Killing|Preempt|ExceededGracePeriod|NetworkNotReady|NodeNotReady|InspectFailed|ErrImage|ProbeWarning|FreeDiskSpaceFailed|BadConfig|Error)/;\n\n/** Whether an event is a warning: its `type` label says so, or its reason does. */\nexport function isWarning(labels: EventLabels): boolean {\n return labels.type === 'Warning' || WARNING_REASONS.test(labels.reason ?? '');\n}\n\ninterface FieldFrame {\n fields: { name: string; values: ArrayLike<unknown> | { toArray(): unknown[] } }[];\n}\n\nconst isFieldFrame = (x: unknown): x is FieldFrame =>\n typeof x === 'object' && x !== null && Array.isArray((x as FieldFrame).fields);\n\nfunction frameRows(frame: FieldFrame): EventRow[] {\n const columns = frame.fields.map((f) => ({\n name: f.name,\n values: Array.from('toArray' in f.values && typeof f.values.toArray === 'function' ? f.values.toArray() : (f.values as ArrayLike<unknown>)),\n }));\n const n = Math.max(0, ...columns.map((c) => c.values.length));\n return Array.from({ length: n }, (_, i) => Object.fromEntries(columns.map((c) => [c.name, c.values[i]])) as EventRow);\n}\n\n/**\n * The log rows in whatever Business Text or a query hands over: rows, an\n * array of frames' rows, or data frames with `fields`. Rows that are not log\n * lines (an Infinity query's rows in the same panel) are dropped.\n */\nexport function eventRows(input: unknown): EventRow[] {\n const out: EventRow[] = [];\n const visit = (x: unknown) => {\n if (Array.isArray(x)) x.forEach(visit);\n else if (isFieldFrame(x)) frameRows(x).forEach(visit);\n else if (typeof x === 'object' && x !== null && ((x as EventRow).Line !== undefined || (x as EventRow).body !== undefined)) {\n out.push(x as EventRow);\n }\n };\n visit(input);\n return out;\n}\n\nfunction labelsOf(row: EventRow): EventLabels {\n const l = row.labels;\n if (typeof l === 'string') {\n try {\n return (JSON.parse(l) as EventLabels) ?? {};\n } catch {\n return {};\n }\n }\n return l ?? {};\n}\n\nfunction timeOf(row: EventRow): number {\n if (row.tsNs) return Number(row.tsNs) / 1e6;\n const t = row.Time ?? row.timestamp;\n if (typeof t === 'number') return t;\n if (typeof t === 'string') {\n const n = Number(t);\n if (Number.isFinite(n)) return n > 1e14 ? n / 1e6 : n;\n return Date.parse(t);\n }\n return NaN;\n}\n\n/** Events folded by object, reason and message, the most recent first. */\nexport function foldEvents(input: unknown): EventGroup[] {\n const groups = new Map<string, EventGroup>();\n for (const row of eventRows(input)) {\n const l = labelsOf(row);\n const message = String(row.Line ?? row.body ?? '');\n const key = [l.kind ?? '', l.namespace ?? '', l.name ?? '', l.reason ?? '', message].join('\\u0000');\n const t = timeOf(row);\n let g = groups.get(key);\n if (!g) {\n g = {\n kind: l.kind ?? '',\n name: l.name ?? '',\n namespace: l.namespace ?? '',\n apiVersion: l.objectAPIversion ?? '',\n reason: l.reason ?? '',\n message,\n source: l.sourcecomponent || l.reportingcontroller || '',\n warning: isWarning(l),\n count: 0,\n first: t,\n last: t,\n };\n groups.set(key, g);\n }\n g.count += 1;\n if (Number.isFinite(t)) {\n g.first = Number.isFinite(g.first) ? Math.min(g.first, t) : t;\n g.last = Number.isFinite(g.last) ? Math.max(g.last, t) : t;\n }\n }\n return [...groups.values()].sort((a, b) => (b.last || 0) - (a.last || 0));\n}\n\n/** Which optional columns an events table has. */\nexport interface EventColumns {\n /** The object each event is about, for a view of many objects (a namespace, a workload). */\n object?: boolean;\n /** The object's namespace, for a cluster-wide view (a node). */\n namespace?: boolean;\n /** The end of the time range, in ms: \"last seen\" is measured to it. */\n now?: number;\n}\n\n/** Folded events as `kd-table` data: reason pill, [namespace], [object], message, count, last seen. */\nexport function eventsTable(groups: EventGroup[], opt: EventColumns = {}): TableData {\n const now = opt.now ?? Date.now();\n const columns: TableColumn[] = [\n { key: 'reason', label: 'Reason', nowrap: true },\n ...(opt.namespace ? [{ key: 'namespace', label: 'Namespace' }] : []),\n ...(opt.object ? [{ key: 'object', label: 'Object' }] : []),\n { key: 'message', label: 'Message' },\n { key: 'count', label: '', align: 'right' as const, nowrap: true },\n { key: 'last', label: 'Last seen', nowrap: true },\n ];\n const ago = (t: number) => (Number.isFinite(t) ? `${duration((now - t) / 1000)} ago` : '');\n const rows = groups.map((g): Record<string, Cell> => ({\n reason: {\n text: g.reason || '?',\n tone: g.warning ? 'error' : 'info',\n title: `${g.warning ? 'Warning' : 'Normal'}${g.source ? ` · from ${g.source}` : ''}`,\n },\n namespace: g.namespace ? namespaceLink(g.namespace) : '',\n object: g.kind && g.name\n ? refLink({ kind: g.kind, name: g.name, namespace: g.namespace || undefined, apiVersion: g.apiVersion || undefined })\n : '',\n message: g.message,\n count: g.count > 1 ? `×${g.count}` : '',\n last: g.count > 1 && g.first !== g.last ? [ago(g.last), `(first ${ago(g.first).replace(/ ago$/, '')})`] : ago(g.last),\n }));\n return { columns, rows };\n}\n","import { html, nothing, type PropertyValues } from 'lit';\n\nimport '../../kd/elements/table';\nimport { define } from '../../kd/define';\nimport { KdElement, base, json } from '../../kd/element';\nimport { timeRange } from '../../kd/scene';\nimport { eventsTable, foldEvents, type EventGroup } from '../events';\n\n/**\n * Kubernetes events from Loki (the panel's frames, or their rows) folded into\n * a table: one row per object, reason and message, with a reason pill\n * (warnings in the error tone, the reporting component on hover), the\n * message, how many times and when last seen. `object` adds the object each\n * event is about, `namespace` its namespace. \"Last seen\" is measured to `now`\n * (ms), else the dashboard's time range end, else the clock.\n *\n * `count` is the number of rows, `warnings` how many are warnings. Inside a\n * `kd-tabs` pane, the pane's `count` follows it, so the tab shows it.\n *\n * `el.data = context.data` → `<kd-k8s-events object></kd-k8s-events>`\n */\nexport class KdK8sEvents extends KdElement {\n static override properties = {\n data: { attribute: 'data', converter: json },\n object: { type: Boolean },\n namespace: { type: Boolean },\n now: { type: Number },\n empty: {},\n };\n static override styles = base;\n\n declare data: unknown;\n declare object: boolean | undefined;\n declare namespace: boolean | undefined;\n declare now: number | undefined;\n declare empty: string | undefined;\n\n #groups: EventGroup[] = [];\n\n /** The folded events. */\n get groups(): EventGroup[] {\n return this.#groups;\n }\n\n /** How many rows the table has. */\n get count(): number {\n return this.#groups.length;\n }\n\n /** How many of them are warnings. */\n get warnings(): number {\n return this.#groups.filter((g) => g.warning).length;\n }\n\n #end(): number {\n if (typeof this.now === 'number' && Number.isFinite(this.now)) return this.now;\n const to = timeRange(this)?.toIso;\n const t = to ? Date.parse(to) : NaN;\n return Number.isFinite(t) ? t : Date.now();\n }\n\n protected override willUpdate(changed: PropertyValues<this>): void {\n if (changed.has('data')) this.#groups = foldEvents(this.data);\n }\n\n protected override updated(): void {\n const pane = this.parentElement;\n if (pane?.parentElement?.localName === 'kd-tabs' && pane.getAttribute('count') !== String(this.count)) {\n pane.setAttribute('count', String(this.count));\n }\n }\n\n override render() {\n if (this.data === undefined || this.data === null) return nothing;\n const table = eventsTable(this.#groups, { object: this.object, namespace: this.namespace, now: this.#end() });\n return html`<kd-table .data=${table} empty=${this.empty ?? 'No events in this time range'}></kd-table>`;\n }\n}\n\ndefine('kd-k8s-events', KdK8sEvents);\n","import { css, html, nothing } from 'lit';\n\nimport '../../kd/elements/bar';\nimport '../../kd/elements/data';\nimport '../../kd/elements/groups';\nimport '../../kd/elements/sheet';\nimport '../../kd/elements/steps';\nimport '../../kd/elements/tabs';\nimport './events';\nimport { define } from '../../kd/define';\nimport { KdElement, base, json } from '../../kd/element';\nimport { annotations, bar, conditions, labels, summary, trimmed, type K8sObject } from '../map';\n\n/**\n * The generic page of one Kubernetes object, composed from the kd elements:\n * the title bar, the conditions as steps, then tabs for the summary sheet,\n * labels, annotations, events (when `events` is set: the panel's Loki frames)\n * and the YAML. `related` objects extend the owner chain; `key` keeps the\n * open tab per view; `now` (ms) pins the ages.\n *\n * `el.data = context.data[0][0]; el.events = context.data` → `<kd-k8s-object key=\"pod\"></kd-k8s-object>`\n */\nexport class KdK8sObject extends KdElement {\n static override properties = {\n data: { attribute: 'data', converter: json },\n events: { attribute: false },\n related: { attribute: false },\n key: {},\n now: { type: Number },\n };\n static override styles = [\n base,\n css`\n .page {\n display: flex;\n flex-direction: column;\n gap: 16px;\n }\n `,\n ];\n\n declare data: K8sObject | undefined;\n declare events: unknown;\n declare related: K8sObject[] | undefined;\n declare key: string | undefined;\n declare now: number | undefined;\n\n override render() {\n const o = this.data;\n if (!o || typeof o !== 'object') return nothing;\n const opt = { now: this.now, related: this.related };\n const steps = conditions(o);\n const l = labels(o);\n const a = annotations(o);\n const count = (map: object) => String(Object.keys(map).length);\n return html`<div class=\"page\">\n <kd-bar .data=${bar(o, opt)}></kd-bar>\n ${steps.length ? html`<kd-steps .data=${steps}></kd-steps>` : nothing}\n <kd-tabs key=${this.key ?? nothing}>\n <section label=\"Summary\"><kd-sheet .data=${summary(o, opt)}></kd-sheet></section>\n <section label=\"Labels\" count=${count(l)}><kd-groups mode=\"pills\" .data=${l}></kd-groups></section>\n <section label=\"Annotations\" count=${count(a)}><kd-groups mode=\"tree\" .data=${a}></kd-groups></section>\n ${this.events === undefined\n ? nothing\n : html`<section label=\"Events\"><kd-k8s-events .data=${this.events} .now=${this.now}></kd-k8s-events></section>`}\n <section label=\"YAML\"><kd-data fold=\"0\" .data=${trimmed(o)}></kd-data></section>\n </kd-tabs>\n </div>`;\n }\n}\n\ndefine('kd-k8s-object', KdK8sObject);\n","import { css, html, nothing } from 'lit';\n\nimport '../../kd/elements/link';\nimport { define } from '../../kd/define';\nimport { KdElement, base, json } from '../../kd/element';\nimport { refLink, type ObjectRef } from '../links';\n\n/**\n * A link to the k8s-* view of one object, with its kind's icon and a back\n * link to this page. Set `data` (an `ObjectRef`, or any object with `kind`,\n * `apiVersion` and `metadata`), or the attributes `kind`, `name`, `namespace`,\n * `api-version` and `plural`. A kind no view shows renders as a label.\n *\n * `<kd-k8s-ref kind=\"Pod\" namespace=\"db\" name=\"postgresql-0\"></kd-k8s-ref>`\n */\nexport class KdK8sRef extends KdElement {\n static override properties = {\n data: { attribute: 'data', converter: json },\n kind: {},\n name: {},\n namespace: {},\n apiVersion: { attribute: 'api-version' },\n plural: {},\n };\n static override styles = [\n base,\n css`\n :host {\n display: inline;\n }\n `,\n ];\n\n declare data: Partial<ObjectRef> & { metadata?: { name?: string; namespace?: string } } | undefined;\n declare kind: string | undefined;\n declare name: string | undefined;\n declare namespace: string | undefined;\n declare apiVersion: string | undefined;\n declare plural: string | undefined;\n\n /** The reference, `data` taking precedence over the attributes field by field. */\n get ref(): ObjectRef | undefined {\n const d = this.data ?? {};\n const kind = d.kind ?? this.kind;\n const name = d.name ?? d.metadata?.name ?? this.name;\n if (!kind || !name) return undefined;\n return {\n kind,\n name,\n namespace: d.namespace ?? d.metadata?.namespace ?? this.namespace,\n apiVersion: d.apiVersion ?? this.apiVersion,\n plural: d.plural ?? this.plural,\n };\n }\n\n override render() {\n const ref = this.ref;\n return ref ? html`<kd-link .data=${refLink(ref)}></kd-link>` : nothing;\n }\n}\n\ndefine('kd-k8s-ref', KdK8sRef);\n"],"mappings":"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"}
1
+ {"version":3,"file":"k8s.js","names":["nothing","nothing","nothing","b","applyTheme","A","json","KdElement","i","define","VERSION","timeRange","COMMUNITY","ARTWORK","ESO","DEVICON","resource","name","DEFAULT_ICON","CRD_ICON","KIND_ICONS","GROUP_ICONS","GROUP_SUFFIXES","BUILT_IN","apiGroup","v","apiVersion","cut","isBuiltInGroup","group","kindIcon","k","kind","exact","suffix","s","WORKLOAD_KINDS","DASHBOARDS","plural","apiPath","ref","root","ns","namespaceRoute","namespace","route","path","definitionRoute","icon","opt","refLink","text","title","to","img","namespaceLink","kindLink","SUFFIXES","QUANTITY","quantity","value","m","duration","seconds","ms","iso","age","t","now","ORDER","BYTES","scale","largest","resources","requests","container","limits","a","request","limit","used","usage","marks","factor","data","CONDITION_ORDER","NEGATIVE_CONDITIONS","CONDITION_LABELS","conditionOk","negative","c","because","conditions","list","obj","order","rank","created","ok","status","step","changed","why","sameRef","o","owners","chain","seen","walk","hash","key","found","related","r","labels","HIDDEN_ANNOTATIONS","annotations","out","code","pill","when","podRows","spec","ips","x","workloadRows","selector","sa","replicas","ROLE","nodeRows","info","address","type","cap","mem","summary","rows","f","PHASE_TONES","phaseTone","re","phase","ready","want","podChips","sidecars","main","all","restarts","n","tone","total","nodeChips","pressure","genericChips","good","lead","chips","bar","trimmed","_drop","metadata","WARNING_REASONS","isWarning","isFieldFrame","frameRows","columns","frame","eventRows","visit","input","labelsOf","l","row","timeOf","foldEvents","groups","message","g","eventsTable","ago","KdK8sEvents","base","#groups","pane","table","#end","KdK8sObject","steps","count","map","KdK8sRef","d"],"sources":["../src/k8s/icons.ts","../src/k8s/links.ts","../src/k8s/map.ts","../src/k8s/events.ts","../src/k8s/elements/events.ts","../src/k8s/elements/object.ts","../src/k8s/elements/ref.ts"],"sourcesContent":["// Kind -> icon. Every URL is pinned to a commit, so an upstream move or rename\n// never breaks a published version.\n\nconst COMMUNITY = 'https://cdn.jsdelivr.net/gh/kubernetes/community@149066325ed521eab576a262ddff8f4da074d5de/icons/svg/';\nconst ARTWORK = 'https://cdn.jsdelivr.net/gh/cncf/artwork@002662490acb2303c7301acc0256c00790e03e9f/projects/';\nconst ESO = 'https://cdn.jsdelivr.net/gh/external-secrets/external-secrets@088f9e5ff057d35bd9f68779893b691abb948b33/assets/';\nconst DEVICON = 'https://cdn.jsdelivr.net/gh/devicons/devicon@7330accdbc47e2dc0c19789a48533c4a3c50fe58/icons/';\n\nconst resource = (name: string) => `${COMMUNITY}resources/unlabeled/${name}.svg`;\n\n/** The Kubernetes wheel: a kind nobody drew an icon for. */\nexport const DEFAULT_ICON = `${ARTWORK}kubernetes/icon/color/kubernetes-icon-color.svg`;\n\n/** A custom resource whose group has no icon of its own. */\nexport const CRD_ICON = resource('crd');\n\n/** The kubernetes/community icon of each built-in kind that has one. */\nexport const KIND_ICONS: Readonly<Record<string, string>> = {\n Pod: resource('pod'),\n Deployment: resource('deploy'),\n StatefulSet: resource('sts'),\n DaemonSet: resource('ds'),\n ReplicaSet: resource('rs'),\n CronJob: resource('cronjob'),\n Job: resource('job'),\n Service: resource('svc'),\n Ingress: resource('ing'),\n IngressClass: resource('ing'),\n Endpoints: resource('ep'),\n EndpointSlice: resource('ep'),\n NetworkPolicy: resource('netpol'),\n ConfigMap: resource('cm'),\n Secret: resource('secret'),\n PersistentVolumeClaim: resource('pvc'),\n PersistentVolume: resource('pv'),\n StorageClass: resource('sc'),\n Volume: resource('vol'),\n ServiceAccount: resource('sa'),\n Role: resource('role'),\n RoleBinding: resource('rb'),\n ClusterRole: resource('c-role'),\n ClusterRoleBinding: resource('crb'),\n User: resource('user'),\n Group: resource('group'),\n Namespace: resource('ns'),\n ResourceQuota: resource('quota'),\n PriorityClass: resource('quota'),\n LimitRange: resource('limits'),\n HorizontalPodAutoscaler: resource('hpa'),\n PodSecurityPolicy: resource('psp'),\n CustomResourceDefinition: resource('crd'),\n Node: `${COMMUNITY}infrastructure_components/unlabeled/node.svg`,\n};\n\n/** The icon of each API group that has one; a group missing here falls back to `CRD_ICON`. */\nexport const GROUP_ICONS: Readonly<Record<string, string>> = {\n 'cert-manager.io': `${ARTWORK}cert-manager/icon/color/cert-manager-icon-color.svg`,\n 'external-secrets.io': `${ESO}eso-round-logo.svg`,\n 'postgresql.kubed.io': `${DEVICON}postgresql/postgresql-original.svg`,\n 'gcp.kubed.io': `${DEVICON}googlecloud/googlecloud-original.svg`,\n 'keycloak.kubed.io': `${ARTWORK}keycloak/icon/color/keycloak-icon-color.svg`,\n 'pkg.crossplane.io': `${ARTWORK}crossplane/icon/color/crossplane-icon-color.svg`,\n};\n\n// Groups whose kinds take their icon from the group, whatever the kind.\nconst GROUP_SUFFIXES: readonly [string, string][] = [\n ['crossplane.io', GROUP_ICONS['pkg.crossplane.io']],\n ['kubed.io', GROUP_ICONS['pkg.crossplane.io']],\n];\n\nconst BUILT_IN = /^(|apps|batch|policy|autoscaling|[a-z0-9.-]*\\.k8s\\.io)$/;\n\n/** The group of an apiVersion: `apps` for `apps/v1`, `''` for `v1`. */\nexport function apiGroup(apiVersion: string | null | undefined): string {\n const v = apiVersion ?? '';\n const cut = v.indexOf('/');\n return cut < 0 ? '' : v.slice(0, cut);\n}\n\n/** Whether a group is served by Kubernetes itself rather than a CRD or an aggregated API. */\nexport function isBuiltInGroup(group: string): boolean {\n return BUILT_IN.test(group);\n}\n\n/**\n * The icon of a kind. With an apiVersion, a custom resource takes its group's\n * icon (or the CRD icon), so a `ServiceAccount` of some operator's group is not\n * drawn as the core one. A kind with no icon at all gets `DEFAULT_ICON`.\n */\nexport function kindIcon(kind: string | null | undefined, apiVersion?: string | null): string {\n const k = kind ?? '';\n if (apiVersion != null && apiVersion !== '') {\n const group = apiGroup(apiVersion);\n if (!isBuiltInGroup(group)) {\n // ldap.kubed.io manages LDAP accounts: its kinds read as users.\n if (group === 'ldap.kubed.io') return KIND_ICONS[k === 'ServiceAccount' ? 'ServiceAccount' : 'User'];\n const exact = GROUP_ICONS[group];\n if (exact) return exact;\n const suffix = GROUP_SUFFIXES.find(([s]) => group === s || group.endsWith(`.${s}`));\n return suffix ? suffix[1] : CRD_ICON;\n }\n }\n return KIND_ICONS[k] ?? DEFAULT_ICON;\n}\n","// Kind -> the k8s-* dashboard that shows it, as kd-link data.\nimport type { DashboardCell, HrefCell } from '../kd/cell';\nimport type { Vars } from '../kd/elements/link';\nimport { apiGroup, isBuiltInGroup, kindIcon } from './icons';\n\n/** What names one Kubernetes object. */\nexport interface ObjectRef {\n kind: string;\n name: string;\n namespace?: string | null;\n apiVersion?: string | null;\n /** The resource name (`deployments`) when the kind's plural is irregular; guessed otherwise. */\n plural?: string | null;\n}\n\n/** A dashboard and its variables. */\nexport interface Route {\n dashboard: string;\n vars: Vars;\n}\n\n/** Options for a link cell. */\nexport interface LinkOptions {\n /** The label; defaults to the object's name. */\n text?: string;\n /** False leaves the icon out; a string replaces it. */\n icon?: boolean | string;\n /** Tooltip; defaults to the kind. */\n title?: string;\n}\n\n/** A dashboard link, or a plain label (an `href` cell with an empty href) where no view shows the kind. */\nexport type RefCell = DashboardCell | HrefCell;\n\n/** Kinds the workload view opens, and the apiVersion each has when a reference omits it. */\nexport const WORKLOAD_KINDS: Readonly<Record<string, string>> = {\n Deployment: 'apps/v1',\n StatefulSet: 'apps/v1',\n DaemonSet: 'apps/v1',\n ReplicaSet: 'apps/v1',\n Job: 'batch/v1',\n CronJob: 'batch/v1',\n};\n\n/** The k8s-* dashboards, by kind, that the routes below can open. */\nexport const DASHBOARDS = {\n pod: 'k8s-pod',\n workload: 'k8s-workload',\n maps: 'k8s-maps',\n volume: 'k8s-volume',\n class: 'k8s-class',\n serviceaccount: 'k8s-serviceaccount',\n crd: 'k8s-crd',\n rd: 'k8s-rd',\n namespace: 'k8s-namespace',\n node: 'k8s-node',\n service: 'k8s-service',\n ingress: 'k8s-ingress',\n resource: 'k8s-resource',\n} as const;\n\n/** A kind's resource name, as the API guesses it: `Ingress` -> `ingresses`, `Policy` -> `policies`. */\nexport function plural(kind: string): string {\n const s = kind.toLowerCase();\n if (s === 'endpoints') return s;\n if (/(s|x|z|ch|sh)$/.test(s)) return `${s}es`;\n if (/[^aeiou]y$/.test(s)) return `${s.slice(0, -1)}ies`;\n return `${s}s`;\n}\n\n/** The API path of an object: `apis/apps/v1/namespaces/db/statefulsets/postgresql`, or `api/v1/nodes/n1`. */\nexport function apiPath(ref: ObjectRef): string | undefined {\n if (!ref.apiVersion) return undefined;\n const root = ref.apiVersion.includes('/') ? 'apis' : 'api';\n const ns = ref.namespace ? `/namespaces/${ref.namespace}` : '';\n return `${root}/${ref.apiVersion}${ns}/${ref.plural || plural(ref.kind)}/${ref.name}`;\n}\n\n/** The namespace view. */\nexport function namespaceRoute(namespace: string): Route {\n return { dashboard: DASHBOARDS.namespace, vars: { app_namespace: namespace } };\n}\n\n/**\n * The dashboard that shows an object: its own k8s-* view for the kinds that\n * have one, else the generic resource view (which needs the apiVersion to\n * build the API path). Undefined when there is neither.\n */\nexport function route(ref: ObjectRef): Route | undefined {\n const { kind, name } = ref;\n const ns = ref.namespace ?? '';\n // A kind of the same name in some operator's group is not the built-in one.\n const builtIn = !ref.apiVersion || isBuiltInGroup(apiGroup(ref.apiVersion));\n if (builtIn) {\n if (kind === 'Pod') return { dashboard: DASHBOARDS.pod, vars: { app_namespace: ns, pod: name } };\n if (kind in WORKLOAD_KINDS) {\n const apiVersion = ref.apiVersion || WORKLOAD_KINDS[kind];\n return {\n dashboard: DASHBOARDS.workload,\n vars: { kind: `${apiVersion}/${ref.plural || plural(kind)}`, app_namespace: ns, workload: name },\n };\n }\n if (kind === 'ConfigMap' || kind === 'Secret') {\n return {\n dashboard: DASHBOARDS.maps,\n vars: { kind: kind === 'Secret' ? 'secrets' : 'configmaps', app_namespace: ns, mapname: name },\n };\n }\n if (kind === 'PersistentVolumeClaim' || kind === 'PersistentVolume') {\n return {\n dashboard: DASHBOARDS.volume,\n vars: {\n kind: kind === 'PersistentVolume' ? 'persistentvolumes' : 'persistentvolumeclaims',\n app_namespace: kind === 'PersistentVolume' ? '' : ns,\n volname: name,\n },\n };\n }\n if (kind === 'StorageClass' || kind === 'IngressClass') {\n return {\n dashboard: DASHBOARDS.class,\n vars: {\n kind: kind === 'IngressClass' ? 'networking.k8s.io/v1/ingressclasses' : 'storage.k8s.io/v1/storageclasses',\n classname: name,\n },\n };\n }\n if (kind === 'ServiceAccount') return { dashboard: DASHBOARDS.serviceaccount, vars: { app_namespace: ns, saname: name } };\n if (kind === 'CustomResourceDefinition') return { dashboard: DASHBOARDS.crd, vars: { crdname: name } };\n if (kind === 'Namespace') return namespaceRoute(name);\n if (kind === 'Node') return { dashboard: DASHBOARDS.node, vars: { node: name } };\n if (kind === 'Service') return { dashboard: DASHBOARDS.service, vars: { app_namespace: ns, service: name } };\n if (kind === 'Ingress') return { dashboard: DASHBOARDS.ingress, vars: { app_namespace: ns, ingress: name } };\n }\n const path = apiPath(ref);\n return path ? { dashboard: DASHBOARDS.resource, vars: { path } } : undefined;\n}\n\n/**\n * The view of a kind's definition: the CRD view for a custom resource (its\n * CRD is named `<plural>.<group>`), the resource-definition view for a\n * built-in kind (which picks it as `<api path>#<Kind>`).\n */\nexport function definitionRoute(kind: string, apiVersion: string, resource?: string | null): Route {\n const group = apiGroup(apiVersion);\n if (!isBuiltInGroup(group)) {\n return { dashboard: DASHBOARDS.crd, vars: { crdname: `${resource || plural(kind)}.${group}` } };\n }\n const root = apiVersion.includes('/') ? 'apis' : 'api';\n return { dashboard: DASHBOARDS.rd, vars: { rd: `${root}/${apiVersion}#${kind}` } };\n}\n\nfunction icon(ref: ObjectRef, opt: LinkOptions): string | undefined {\n if (opt.icon === false) return undefined;\n return typeof opt.icon === 'string' ? opt.icon : kindIcon(ref.kind, ref.apiVersion);\n}\n\n/**\n * An object as a link cell (`kd-link` data) to its view, with its kind's icon\n * and a back link to this page. A kind no view shows is a plain label.\n */\nexport function refLink(ref: ObjectRef, opt: LinkOptions = {}): RefCell {\n const text = opt.text ?? ref.name;\n const title = opt.title ?? ref.kind;\n const to = route(ref);\n const img = icon(ref, opt);\n if (!to) return { href: '', text, title, ...(img ? { icon: img } : {}) };\n return { dashboard: to.dashboard, vars: to.vars, back: true, text, title, ...(img ? { icon: img } : {}) };\n}\n\n/** A namespace as a link cell to the namespace view. */\nexport function namespaceLink(namespace: string, opt: LinkOptions = {}): DashboardCell {\n return refLink({ kind: 'Namespace', name: namespace, apiVersion: 'v1' }, { title: 'Namespace', ...opt }) as DashboardCell;\n}\n\n/** A kind as a link cell to its definition. */\nexport function kindLink(kind: string, apiVersion: string, opt: LinkOptions = {}): DashboardCell {\n const to = definitionRoute(kind, apiVersion);\n const img = icon({ kind, name: kind, apiVersion }, opt);\n return {\n dashboard: to.dashboard,\n vars: to.vars,\n back: true,\n text: opt.text ?? kind,\n title: opt.title ?? apiVersion,\n ...(img ? { icon: img } : {}),\n };\n}\n","// A Kubernetes API object, mapped onto the generic elements' data.\nimport type { Cell, CodeCell, PillCell } from '../kd/cell';\nimport type { BarData } from '../kd/elements/bar';\nimport type { GroupsData } from '../kd/elements/groups';\nimport type { MeterData, MeterMark } from '../kd/elements/meter';\nimport type { SheetRow } from '../kd/elements/sheet';\nimport type { Step, StepStatus } from '../kd/elements/steps';\nimport type { Tone } from '../kd/parts';\nimport { kindIcon } from './icons';\nimport { kindLink, namespaceLink, refLink, WORKLOAD_KINDS, type RefCell } from './links';\n\nexport interface OwnerReference {\n apiVersion?: string;\n kind: string;\n name: string;\n uid?: string;\n controller?: boolean;\n}\n\nexport interface Condition {\n type: string;\n status: 'True' | 'False' | 'Unknown' | string;\n reason?: string;\n message?: string;\n lastTransitionTime?: string;\n}\n\nexport interface ObjectMeta {\n name?: string;\n namespace?: string;\n uid?: string;\n creationTimestamp?: string;\n deletionTimestamp?: string;\n labels?: Record<string, string>;\n annotations?: Record<string, string>;\n ownerReferences?: OwnerReference[];\n finalizers?: string[];\n [key: string]: unknown;\n}\n\n/** Any Kubernetes API object; only the parts the mappings read are typed. */\nexport interface K8sObject {\n apiVersion?: string;\n kind?: string;\n metadata?: ObjectMeta;\n // The shapes differ by kind; each mapping reads what it knows defensively.\n spec?: any;\n status?: any;\n [key: string]: unknown;\n}\n\nexport interface ResourceRequirements {\n requests?: Record<string, string | number>;\n limits?: Record<string, string | number>;\n}\n\n/** A container, or anything with `resources`. */\nexport interface ContainerLike {\n name?: string;\n resources?: ResourceRequirements;\n}\n\n/** Options shared by the mappings that show an age. */\nexport interface MapOptions {\n /** The time ages are measured to, in ms; defaults to now. */\n now?: number;\n /** Other objects the owner chain may walk through (the ReplicaSet a pod's Deployment owns, say). */\n related?: K8sObject[];\n}\n\n// --- quantities and times ------------------------------------------------------\n\nconst SUFFIXES: Record<string, number> = {\n n: 1e-9,\n u: 1e-6,\n m: 1e-3,\n '': 1,\n k: 1e3,\n M: 1e6,\n G: 1e9,\n T: 1e12,\n P: 1e15,\n E: 1e18,\n Ki: 2 ** 10,\n Mi: 2 ** 20,\n Gi: 2 ** 30,\n Ti: 2 ** 40,\n Pi: 2 ** 50,\n Ei: 2 ** 60,\n};\n\nconst QUANTITY = /^([+-]?(?:\\d+(?:\\.\\d*)?|\\.\\d+))(?:([eE][+-]?\\d+)|(Ki|Mi|Gi|Ti|Pi|Ei|[numkMGTPE]))?$/;\n\n/**\n * A Kubernetes quantity as a plain number in base units: `100m` -> 0.1,\n * `128Mi` -> 134217728, `1e3` -> 1000, `2E` -> 2e18. NaN when it is not one.\n */\nexport function quantity(value: string | number | null | undefined): number {\n if (typeof value === 'number') return value;\n if (typeof value !== 'string') return NaN;\n const m = QUANTITY.exec(value.trim());\n if (!m) return NaN;\n const n = Number(m[1]);\n if (m[2]) return n * 10 ** Number(m[2].slice(1));\n return n * SUFFIXES[m[3] ?? ''];\n}\n\n/** Seconds as kubectl-ish text: `42s`, `5m`, `3h 12m`, `2d 4h`. */\nexport function duration(seconds: number): string {\n const s = Math.max(0, Math.floor(seconds));\n if (s < 60) return `${s}s`;\n if (s < 3600) return `${Math.floor(s / 60)}m`;\n if (s < 86400) return `${Math.floor(s / 3600)}h ${Math.floor((s % 3600) / 60)}m`;\n return `${Math.floor(s / 86400)}d ${Math.floor((s % 86400) / 3600)}h`;\n}\n\nconst ms = (iso: string | null | undefined) => (iso ? Date.parse(iso) : NaN);\n\n/** How long ago a timestamp was, or '' without one. */\nexport function age(iso: string | null | undefined, now = Date.now()): string {\n const t = ms(iso);\n return Number.isFinite(t) ? duration((now - t) / 1000) : '';\n}\n\n// --- resources -----------------------------------------------------------------\n\nexport interface ResourceMeter {\n /** `cpu`, `memory`, or any other resource name. */\n resource: string;\n data: MeterData;\n}\n\nconst ORDER = (name: string) => (name === 'cpu' ? 0 : name === 'memory' ? 1 : 2);\nconst BYTES = /^(memory|ephemeral-storage|storage|hugepages-.*)$/;\n\n// The display unit of a resource, chosen from the largest number shown.\nfunction scale(resource: string, largest: number): { unit: string; factor: number } {\n if (resource === 'cpu') return { unit: 'm', factor: 1e3 };\n if (!BYTES.test(resource)) return { unit: '', factor: 1 };\n if (largest >= 2 ** 40) return { unit: 'Ti', factor: 2 ** -40 };\n if (largest >= 2 ** 30) return { unit: 'Gi', factor: 2 ** -30 };\n if (largest >= 2 ** 20) return { unit: 'Mi', factor: 2 ** -20 };\n return { unit: 'Ki', factor: 2 ** -10 };\n}\n\n/**\n * One meter per resource a container requests or limits, cpu and memory\n * first: CPU in millicores, bytes in Ki/Mi/Gi/Ti. `usage` (quantities or base\n * numbers, by resource name) fills the meter; without it only the marks show.\n */\nexport function resources(container: ContainerLike | null | undefined, usage: Record<string, string | number> = {}): ResourceMeter[] {\n const requests = container?.resources?.requests ?? {};\n const limits = container?.resources?.limits ?? {};\n const names = [...new Set([...Object.keys(requests), ...Object.keys(limits)])].sort(\n (a, b) => ORDER(a) - ORDER(b) || (a < b ? -1 : a > b ? 1 : 0),\n );\n return names.map((resource) => {\n const request = quantity(requests[resource]);\n const limit = quantity(limits[resource]);\n const used = quantity(usage[resource]);\n const { unit, factor } = scale(resource, Math.max(...[request, limit, used].filter(Number.isFinite), 0));\n const marks: MeterMark[] = [];\n if (Number.isFinite(request)) marks.push({ label: 'request', value: request * factor });\n if (Number.isFinite(limit)) marks.push({ label: 'limit', value: limit * factor, tone: 'error' });\n const data: MeterData = { unit, marks };\n if (Number.isFinite(used)) data.value = used * factor;\n return { resource, data };\n });\n}\n\n// --- conditions ----------------------------------------------------------------\n\n// The order each kind's conditions happen in; any other condition follows, by time.\nconst CONDITION_ORDER: Record<string, string[]> = {\n Pod: ['PodScheduled', 'PodReadyToStartContainers', 'Initialized', 'ContainersReady', 'Ready'],\n Node: ['MemoryPressure', 'DiskPressure', 'PIDPressure', 'NetworkUnavailable', 'Ready'],\n Deployment: ['Progressing', 'Available', 'ReplicaFailure'],\n};\n\n/** Condition types that are good when False. */\nexport const NEGATIVE_CONDITIONS: ReadonlySet<string> = new Set([\n 'Failed',\n 'Stalled',\n 'Degraded',\n 'FailureTarget',\n 'Suspended',\n 'Terminating',\n 'DisruptionTarget',\n 'ReplicaFailure',\n 'MemoryPressure',\n 'DiskPressure',\n 'PIDPressure',\n 'NetworkUnavailable',\n]);\n\nconst CONDITION_LABELS: Record<string, string> = {\n PodScheduled: 'Scheduled',\n PodReadyToStartContainers: 'Sandbox',\n ContainersReady: 'Containers',\n MemoryPressure: 'Memory',\n DiskPressure: 'Disk',\n PIDPressure: 'PIDs',\n NetworkUnavailable: 'Network',\n};\n\n/** Whether a condition is in its good state (true), its bad one (false), or unknown (null). */\nexport function conditionOk(c: Condition): boolean | null {\n const negative = NEGATIVE_CONDITIONS.has(c.type);\n if (c.status === 'True') return !negative;\n if (c.status === 'False') return negative;\n return null;\n}\n\nconst because = (c: Condition) => [c.reason, c.message].filter((s) => s != null && s !== '').join(': ');\n\n/**\n * The object's conditions as steps, in the order they happen for the kinds\n * that have one: done when good, failed when bad, warning when unknown. The\n * time is how long after creation the condition last changed.\n */\nexport function conditions(obj: K8sObject | null | undefined): Step[] {\n const list: Condition[] = Array.isArray(obj?.status?.conditions) ? obj.status.conditions : [];\n const order = CONDITION_ORDER[obj?.kind ?? ''] ?? [];\n const rank = (c: Condition) => (order.includes(c.type) ? order.indexOf(c.type) : order.length);\n const created = ms(obj?.metadata?.creationTimestamp);\n return [...list]\n .sort((a, b) => rank(a) - rank(b) || (ms(a.lastTransitionTime) || 0) - (ms(b.lastTransitionTime) || 0))\n .map((c) => {\n const ok = conditionOk(c);\n const status: StepStatus = ok === true ? 'done' : ok === false ? 'failed' : 'warning';\n const step: Step = { label: CONDITION_LABELS[c.type] ?? c.type, status };\n const changed = ms(c.lastTransitionTime);\n if (Number.isFinite(changed) && Number.isFinite(created)) step.time = `+${duration((changed - created) / 1000)}`;\n const why = because(c);\n if (why && ok !== true) step.detail = why;\n return step;\n });\n}\n\n// --- owners --------------------------------------------------------------------\n\nconst sameRef = (o: K8sObject, ref: OwnerReference) =>\n (ref.uid && o.metadata?.uid === ref.uid) || (o.kind === ref.kind && o.metadata?.name === ref.name);\n\n/**\n * The owner chain, outermost first, as link cells: each owner reference, with\n * the owners of any owner found in `related` before it. A pod's ReplicaSet\n * that carries its `pod-template-hash` is preceded by the Deployment it\n * implies even when the ReplicaSet itself is not at hand.\n */\nexport function owners(obj: K8sObject | null | undefined, related: K8sObject[] = []): RefCell[] {\n const chain: RefCell[] = [];\n const seen = new Set<string>();\n const walk = (o: K8sObject) => {\n const ns = o.metadata?.namespace;\n const hash = o.metadata?.labels?.['pod-template-hash'];\n for (const ref of o.metadata?.ownerReferences ?? []) {\n const key = ref.uid || `${ref.kind}/${ref.name}`;\n if (seen.has(key)) continue;\n seen.add(key);\n const found = related.find((r) => sameRef(r, ref));\n if (found) walk(found);\n else if (ref.kind === 'ReplicaSet' && hash && ref.name.endsWith(`-${hash}`)) {\n const name = ref.name.slice(0, -hash.length - 1);\n chain.push(refLink({ kind: 'Deployment', name, namespace: ns, apiVersion: ref.apiVersion ?? 'apps/v1' }));\n }\n chain.push(refLink({ kind: ref.kind, name: ref.name, namespace: ns, apiVersion: ref.apiVersion }));\n }\n };\n if (obj) walk(obj);\n return chain;\n}\n\n// --- labels and annotations ---------------------------------------------------\n\n/** The labels, for `<kd-groups mode=\"pills\">`. */\nexport function labels(obj: K8sObject | null | undefined): GroupsData {\n return { ...(obj?.metadata?.labels ?? {}) };\n}\n\n/** Annotations too large and too stale to show: the copy of the object kubectl apply keeps. */\nexport const HIDDEN_ANNOTATIONS: readonly string[] = ['kubectl.kubernetes.io/last-applied-configuration'];\n\n/** The annotations, for `<kd-groups mode=\"tree\">`, without the last-applied copy. */\nexport function annotations(obj: K8sObject | null | undefined): GroupsData {\n const out: GroupsData = { ...(obj?.metadata?.annotations ?? {}) };\n for (const key of HIDDEN_ANNOTATIONS) delete out[key];\n return out;\n}\n\n// --- summary and bar ----------------------------------------------------------\n\nconst code = (value: unknown): CodeCell | undefined =>\n value === null || value === undefined || value === '' ? undefined : { code: String(value) };\nconst pill = (text: string, tone: Tone, title?: string): PillCell => (title ? { text, tone, title } : { text, tone });\n\nfunction when(iso: string | undefined, now: number): Cell {\n const a = age(iso, now);\n return a ? [`${a} ago`, { code: iso as string }] : undefined;\n}\n\nfunction podRows(o: K8sObject, now: number): SheetRow[] {\n const spec = o.spec ?? {};\n const status = o.status ?? {};\n const ns = o.metadata?.namespace;\n const ips = (list: unknown) => (Array.isArray(list) ? list.map((x: { ip?: string }) => code(x?.ip)) : undefined);\n return [\n { key: 'Started', value: when(status.startTime, now) },\n {\n key: 'Node',\n value: spec.nodeName ? refLink({ kind: 'Node', name: spec.nodeName, apiVersion: 'v1' }) : pill('unscheduled', 'warning'),\n },\n { key: 'Pod IP', value: ips(status.podIPs) ?? code(status.podIP) },\n { key: 'Host IP', value: ips(status.hostIPs) ?? code(status.hostIP) },\n { key: 'QoS', value: status.qosClass },\n {\n key: 'Priority',\n value: [\n spec.priorityClassName\n ? refLink({ kind: 'PriorityClass', name: spec.priorityClassName, apiVersion: 'scheduling.k8s.io/v1' })\n : undefined,\n code(spec.priority ?? 0),\n ],\n },\n {\n key: 'Service account',\n value: spec.serviceAccountName\n ? refLink({ kind: 'ServiceAccount', name: spec.serviceAccountName, namespace: ns, apiVersion: 'v1' })\n : undefined,\n },\n { key: 'Restart policy', value: spec.restartPolicy },\n ];\n}\n\nfunction workloadRows(o: K8sObject): SheetRow[] {\n const spec = o.spec ?? {};\n const ns = o.metadata?.namespace;\n const selector = spec.selector?.matchLabels as Record<string, string> | undefined;\n const sa = spec.template?.spec?.serviceAccountName ?? spec.jobTemplate?.spec?.template?.spec?.serviceAccountName;\n return [\n { key: 'Replicas', value: replicas(o)?.text },\n { key: 'Strategy', value: spec.strategy?.type ?? spec.updateStrategy?.type },\n { key: 'Schedule', value: code(spec.schedule) },\n { key: 'Selector', value: selector ? Object.entries(selector).map(([k, v]) => code(`${k}=${v}`)) : undefined },\n { key: 'Service account', value: sa ? refLink({ kind: 'ServiceAccount', name: sa, namespace: ns, apiVersion: 'v1' }) : undefined },\n ];\n}\n\nconst ROLE = 'node-role.kubernetes.io/';\n\nfunction nodeRows(o: K8sObject): SheetRow[] {\n const status = o.status ?? {};\n const info = status.nodeInfo ?? {};\n const address = (type: string) =>\n (Array.isArray(status.addresses) ? status.addresses : []).filter((a: { type?: string }) => a?.type === type).map((a: { address?: string }) => code(a.address));\n const cap = status.capacity ?? {};\n const mem = quantity(cap.memory);\n return [\n { key: 'Roles', value: Object.keys(o.metadata?.labels ?? {}).filter((k) => k.startsWith(ROLE)).map((k) => k.slice(ROLE.length)).join(', ') },\n { key: 'Internal IP', value: address('InternalIP') },\n { key: 'External IP', value: address('ExternalIP') },\n { key: 'Kubelet', value: code(info.kubeletVersion) },\n { key: 'OS', value: [info.osImage, info.architecture].filter(Boolean).join(' · ') },\n { key: 'Kernel', value: code(info.kernelVersion) },\n { key: 'Runtime', value: code(info.containerRuntimeVersion) },\n { key: 'CPU', value: cap.cpu === undefined ? undefined : `${cap.cpu} cores` },\n { key: 'Memory', value: Number.isFinite(mem) ? `${(mem / 2 ** 30).toFixed(1)} Gi` : undefined },\n { key: 'Pods', value: cap.pods },\n ];\n}\n\n/**\n * A property sheet of the object, as the k8s views show it: kind (linked to\n * its definition), namespace, age, owners and uid, then what the kind adds\n * (a pod's node and IPs, a workload's replicas, a node's addresses and\n * capacity), then finalizers. Empty rows are left in; `kd-sheet` drops them.\n */\nexport function summary(obj: K8sObject | null | undefined, opt: MapOptions = {}): SheetRow[] {\n if (!obj) return [];\n const now = opt.now ?? Date.now();\n const m = obj.metadata ?? {};\n const kind = obj.kind ?? '';\n const rows: SheetRow[] = [\n { key: 'Kind', value: kind && obj.apiVersion ? kindLink(kind, obj.apiVersion) : kind },\n { key: 'Namespace', value: m.namespace ? namespaceLink(m.namespace) : undefined },\n { key: 'Created', value: when(m.creationTimestamp, now) },\n {\n key: 'Deleting',\n value: m.deletionTimestamp ? pill('terminating', 'warning', m.deletionTimestamp) : undefined,\n },\n { key: 'Controlled by', value: owners(obj, opt.related) },\n ];\n if (kind === 'Pod') rows.push(...podRows(obj, now));\n else if (kind in WORKLOAD_KINDS) rows.push(...workloadRows(obj));\n else if (kind === 'Node') rows.push(...nodeRows(obj));\n rows.push(\n { key: 'UID', value: code(m.uid) },\n { key: 'Finalizers', value: (m.finalizers ?? []).map((f) => code(f)) },\n );\n return rows;\n}\n\nconst PHASE_TONES: [RegExp, Tone][] = [\n [/^(Running|Bound|Succeeded|Active|Available)$/, 'success'],\n [/^(Pending|Terminating|Released)$/, 'warning'],\n [/^(Failed|Lost)$/, 'error'],\n];\n\nconst phaseTone = (phase: string): Tone => PHASE_TONES.find(([re]) => re.test(phase))?.[1] ?? 'neutral';\n\n// Ready/desired for the kinds that run replicas.\nfunction replicas(o: K8sObject): PillCell | undefined {\n const s = o.status ?? {};\n const kind = o.kind;\n let ready: number | undefined;\n let want: number | undefined;\n if (kind === 'DaemonSet') {\n ready = s.numberReady ?? 0;\n want = s.desiredNumberScheduled ?? 0;\n } else if (kind === 'Deployment' || kind === 'StatefulSet' || kind === 'ReplicaSet') {\n ready = s.readyReplicas ?? 0;\n want = o.spec?.replicas ?? 1;\n }\n if (ready === undefined || want === undefined) return undefined;\n return pill(`${ready}/${want} ready`, ready >= want ? 'success' : 'warning');\n}\n\nfunction podChips(o: K8sObject): Cell[] {\n const status = o.status ?? {};\n const sidecars = new Set(\n (o.spec?.initContainers ?? []).filter((c: { restartPolicy?: string }) => c.restartPolicy === 'Always').map((c: { name: string }) => c.name),\n );\n const main = [\n ...(status.containerStatuses ?? []),\n ...(status.initContainerStatuses ?? []).filter((c: { name: string }) => sidecars.has(c.name)),\n ];\n const all = [...(status.initContainerStatuses ?? []), ...(status.containerStatuses ?? []), ...(status.ephemeralContainerStatuses ?? [])];\n const ready = main.filter((c: { ready?: boolean }) => c.ready).length;\n const restarts = all.reduce((n: number, c: { restartCount?: number }) => n + (c.restartCount ?? 0), 0);\n const phase: string = o.metadata?.deletionTimestamp ? 'Terminating' : (status.phase ?? 'Unknown');\n const tone: Tone = phase === 'Succeeded' ? 'neutral' : phaseTone(phase);\n const total = main.length || (o.spec?.containers ?? []).length;\n return [\n pill(phase, tone, status.message ?? status.reason),\n pill(`${ready}/${total} ready`, ready === total ? 'success' : 'warning'),\n restarts > 0 ? pill(`↻ ${restarts}`, 'warning', 'restarts') : undefined,\n ];\n}\n\nfunction nodeChips(o: K8sObject): Cell[] {\n const ready = ((o.status?.conditions ?? []) as Condition[]).find((c) => c.type === 'Ready');\n const pressure = ((o.status?.conditions ?? []) as Condition[]).filter((c) => c.type !== 'Ready' && conditionOk(c) === false);\n return [\n ready ? pill(ready.status === 'True' ? 'Ready' : 'NotReady', ready.status === 'True' ? 'success' : 'error', because(ready)) : undefined,\n o.spec?.unschedulable ? pill('cordoned', 'warning', 'unschedulable') : undefined,\n ...pressure.map((c) => pill(`✗ ${c.type}`, 'error', because(c))),\n ];\n}\n\n// Phase, then the conditions folded into one good pill and one pill per bad one.\nfunction genericChips(o: K8sObject): Cell[] {\n const s = o.status ?? {};\n const list = (Array.isArray(s.conditions) ? s.conditions : []) as Condition[];\n const good = list.filter((c) => conditionOk(c) === true);\n const lead = ['Ready', 'Available', 'Complete'].find((t) => good.some((c) => c.type === t)) ?? good[0]?.type;\n return [\n typeof s.phase === 'string' ? pill(s.phase, phaseTone(s.phase), 'phase') : undefined,\n kind(o) in WORKLOAD_KINDS ? replicas(o) : undefined,\n good.length ? pill(`✓ ${lead}${good.length > 1 ? ` +${good.length - 1}` : ''}`, 'success', good.map((c) => c.type).join(', ')) : undefined,\n ...list\n .filter((c) => conditionOk(c) !== true)\n .map((c) => (conditionOk(c) === null ? pill(`? ${c.type}`, 'warning', because(c)) : pill(`✗ ${c.type}`, 'error', because(c)))),\n ];\n}\n\nconst kind = (o: K8sObject) => o.kind ?? '';\n\n/** Status pills for the title bar: a pod's phase, readiness and restarts; a node's readiness; else phase, replicas and conditions. */\nexport function chips(obj: K8sObject | null | undefined): Cell[] {\n if (!obj) return [];\n const out = kind(obj) === 'Pod' ? podChips(obj) : kind(obj) === 'Node' ? nodeChips(obj) : genericChips(obj);\n return out.filter((c) => c !== undefined);\n}\n\n/** The title bar: the kind's icon, `Kind · namespace` above the name, status pills and the owner chain. */\nexport function bar(obj: K8sObject | null | undefined, opt: MapOptions = {}): BarData {\n if (!obj) return { title: '' };\n const ns = obj.metadata?.namespace;\n return {\n icon: kindIcon(obj.kind, obj.apiVersion),\n eyebrow: ns ? [`${kind(obj)} ·`, namespaceLink(ns, { icon: false })] : kind(obj),\n title: obj.metadata?.name ?? '',\n chips: chips(obj),\n chain: owners(obj, opt.related),\n };\n}\n\n/** The object without what nobody reads: managedFields and the last-applied copy. */\nexport function trimmed(obj: K8sObject): K8sObject {\n const { managedFields: _drop, ...metadata } = obj.metadata ?? {};\n const out: K8sObject = { ...obj, metadata };\n if (metadata.annotations) {\n const a = annotations(obj);\n if (Object.keys(a).length) metadata.annotations = a;\n else delete metadata.annotations;\n }\n return out;\n}\n","// Kubernetes events as Loki keeps them (one line per event, the object and\n// reason as labels), folded into one row per object, reason and message.\nimport type { Cell } from '../kd/cell';\nimport type { TableColumn, TableData } from '../kd/elements/table';\nimport { refLink, namespaceLink } from './links';\nimport { duration } from './map';\n\n/** The labels the kube-events source puts on each line. */\nexport interface EventLabels {\n kind?: string;\n name?: string;\n namespace?: string;\n objectAPIversion?: string;\n reason?: string;\n type?: string;\n sourcecomponent?: string;\n reportingcontroller?: string;\n [key: string]: unknown;\n}\n\n/** One Loki log row, as Business Text hands a frame's rows to a panel. */\nexport interface EventRow {\n labels?: EventLabels | string;\n Line?: string;\n body?: string;\n Time?: number | string;\n timestamp?: number | string;\n tsNs?: string;\n [key: string]: unknown;\n}\n\n/** One folded event. */\nexport interface EventGroup {\n kind: string;\n name: string;\n namespace: string;\n apiVersion: string;\n reason: string;\n message: string;\n /** The component that reported it. */\n source: string;\n warning: boolean;\n count: number;\n /** ms */\n first: number;\n /** ms */\n last: number;\n}\n\n/** Reasons that mean something went wrong, for sources whose lines carry no `type` label. */\nexport const WARNING_REASONS =\n /^(BackOff|Failed|Unhealthy|Evicted|OOM|Killing|Preempt|ExceededGracePeriod|NetworkNotReady|NodeNotReady|InspectFailed|ErrImage|ProbeWarning|FreeDiskSpaceFailed|BadConfig|Error)/;\n\n/** Whether an event is a warning: its `type` label says so, or its reason does. */\nexport function isWarning(labels: EventLabels): boolean {\n return labels.type === 'Warning' || WARNING_REASONS.test(labels.reason ?? '');\n}\n\ninterface FieldFrame {\n fields: { name: string; values: ArrayLike<unknown> | { toArray(): unknown[] } }[];\n}\n\nconst isFieldFrame = (x: unknown): x is FieldFrame =>\n typeof x === 'object' && x !== null && Array.isArray((x as FieldFrame).fields);\n\nfunction frameRows(frame: FieldFrame): EventRow[] {\n const columns = frame.fields.map((f) => ({\n name: f.name,\n values: Array.from('toArray' in f.values && typeof f.values.toArray === 'function' ? f.values.toArray() : (f.values as ArrayLike<unknown>)),\n }));\n const n = Math.max(0, ...columns.map((c) => c.values.length));\n return Array.from({ length: n }, (_, i) => Object.fromEntries(columns.map((c) => [c.name, c.values[i]])) as EventRow);\n}\n\n/**\n * The log rows in whatever Business Text or a query hands over: rows, an\n * array of frames' rows, or data frames with `fields`. Rows that are not log\n * lines (an Infinity query's rows in the same panel) are dropped.\n */\nexport function eventRows(input: unknown): EventRow[] {\n const out: EventRow[] = [];\n const visit = (x: unknown) => {\n if (Array.isArray(x)) x.forEach(visit);\n else if (isFieldFrame(x)) frameRows(x).forEach(visit);\n else if (typeof x === 'object' && x !== null && ((x as EventRow).Line !== undefined || (x as EventRow).body !== undefined)) {\n out.push(x as EventRow);\n }\n };\n visit(input);\n return out;\n}\n\nfunction labelsOf(row: EventRow): EventLabels {\n const l = row.labels;\n if (typeof l === 'string') {\n try {\n return (JSON.parse(l) as EventLabels) ?? {};\n } catch {\n return {};\n }\n }\n return l ?? {};\n}\n\nfunction timeOf(row: EventRow): number {\n if (row.tsNs) return Number(row.tsNs) / 1e6;\n const t = row.Time ?? row.timestamp;\n if (typeof t === 'number') return t;\n if (typeof t === 'string') {\n const n = Number(t);\n if (Number.isFinite(n)) return n > 1e14 ? n / 1e6 : n;\n return Date.parse(t);\n }\n return NaN;\n}\n\n/** Events folded by object, reason and message, the most recent first. */\nexport function foldEvents(input: unknown): EventGroup[] {\n const groups = new Map<string, EventGroup>();\n for (const row of eventRows(input)) {\n const l = labelsOf(row);\n const message = String(row.Line ?? row.body ?? '');\n const key = [l.kind ?? '', l.namespace ?? '', l.name ?? '', l.reason ?? '', message].join('\\u0000');\n const t = timeOf(row);\n let g = groups.get(key);\n if (!g) {\n g = {\n kind: l.kind ?? '',\n name: l.name ?? '',\n namespace: l.namespace ?? '',\n apiVersion: l.objectAPIversion ?? '',\n reason: l.reason ?? '',\n message,\n source: l.sourcecomponent || l.reportingcontroller || '',\n warning: isWarning(l),\n count: 0,\n first: t,\n last: t,\n };\n groups.set(key, g);\n }\n g.count += 1;\n if (Number.isFinite(t)) {\n g.first = Number.isFinite(g.first) ? Math.min(g.first, t) : t;\n g.last = Number.isFinite(g.last) ? Math.max(g.last, t) : t;\n }\n }\n return [...groups.values()].sort((a, b) => (b.last || 0) - (a.last || 0));\n}\n\n/** Which optional columns an events table has. */\nexport interface EventColumns {\n /** The object each event is about, for a view of many objects (a namespace, a workload). */\n object?: boolean;\n /** The object's namespace, for a cluster-wide view (a node). */\n namespace?: boolean;\n /** The end of the time range, in ms: \"last seen\" is measured to it. */\n now?: number;\n}\n\n/** Folded events as `kd-table` data: reason pill, [namespace], [object], message, count, last seen. */\nexport function eventsTable(groups: EventGroup[], opt: EventColumns = {}): TableData {\n const now = opt.now ?? Date.now();\n const columns: TableColumn[] = [\n { key: 'reason', label: 'Reason', nowrap: true },\n ...(opt.namespace ? [{ key: 'namespace', label: 'Namespace' }] : []),\n ...(opt.object ? [{ key: 'object', label: 'Object' }] : []),\n { key: 'message', label: 'Message' },\n { key: 'count', label: '', align: 'right' as const, nowrap: true },\n { key: 'last', label: 'Last seen', nowrap: true },\n ];\n const ago = (t: number) => (Number.isFinite(t) ? `${duration((now - t) / 1000)} ago` : '');\n const rows = groups.map((g): Record<string, Cell> => ({\n reason: {\n text: g.reason || '?',\n tone: g.warning ? 'error' : 'info',\n title: `${g.warning ? 'Warning' : 'Normal'}${g.source ? ` · from ${g.source}` : ''}`,\n },\n namespace: g.namespace ? namespaceLink(g.namespace) : '',\n object: g.kind && g.name\n ? refLink({ kind: g.kind, name: g.name, namespace: g.namespace || undefined, apiVersion: g.apiVersion || undefined })\n : '',\n message: g.message,\n count: g.count > 1 ? `×${g.count}` : '',\n last: g.count > 1 && g.first !== g.last ? [ago(g.last), `(first ${ago(g.first).replace(/ ago$/, '')})`] : ago(g.last),\n }));\n return { columns, rows };\n}\n","import { html, nothing, type PropertyValues } from 'lit';\n\nimport '../../kd/elements/table';\nimport { define } from '../../kd/define';\nimport { KdElement, base, json } from '../../kd/element';\nimport { timeRange } from '../../kd/scene';\nimport { eventsTable, foldEvents, type EventGroup } from '../events';\n\n/**\n * Kubernetes events from Loki (the panel's frames, or their rows) folded into\n * a table: one row per object, reason and message, with a reason pill\n * (warnings in the error tone, the reporting component on hover), the\n * message, how many times and when last seen. `object` adds the object each\n * event is about, `namespace` its namespace. \"Last seen\" is measured to `now`\n * (ms), else the dashboard's time range end, else the clock.\n *\n * `count` is the number of rows, `warnings` how many are warnings. Inside a\n * `kd-tabs` pane, the pane's `count` follows it, so the tab shows it.\n *\n * `el.data = context.data` → `<kd-k8s-events object></kd-k8s-events>`\n */\nexport class KdK8sEvents extends KdElement {\n static override properties = {\n data: { attribute: 'data', converter: json },\n object: { type: Boolean },\n namespace: { type: Boolean },\n now: { type: Number },\n empty: {},\n };\n static override styles = base;\n\n declare data: unknown;\n declare object: boolean | undefined;\n declare namespace: boolean | undefined;\n declare now: number | undefined;\n declare empty: string | undefined;\n\n #groups: EventGroup[] = [];\n\n /** The folded events. */\n get groups(): EventGroup[] {\n return this.#groups;\n }\n\n /** How many rows the table has. */\n get count(): number {\n return this.#groups.length;\n }\n\n /** How many of them are warnings. */\n get warnings(): number {\n return this.#groups.filter((g) => g.warning).length;\n }\n\n #end(): number {\n if (typeof this.now === 'number' && Number.isFinite(this.now)) return this.now;\n const to = timeRange(this)?.toIso;\n const t = to ? Date.parse(to) : NaN;\n return Number.isFinite(t) ? t : Date.now();\n }\n\n protected override willUpdate(changed: PropertyValues<this>): void {\n if (changed.has('data')) this.#groups = foldEvents(this.data);\n }\n\n protected override updated(): void {\n const pane = this.parentElement;\n if (pane?.parentElement?.localName === 'kd-tabs' && pane.getAttribute('count') !== String(this.count)) {\n pane.setAttribute('count', String(this.count));\n }\n }\n\n override render() {\n if (this.data === undefined || this.data === null) return nothing;\n const table = eventsTable(this.#groups, { object: this.object, namespace: this.namespace, now: this.#end() });\n return html`<kd-table .data=${table} empty=${this.empty ?? 'No events in this time range'}></kd-table>`;\n }\n}\n\ndefine('kd-k8s-events', KdK8sEvents);\n","import { css, html, nothing } from 'lit';\n\nimport '../../kd/elements/bar';\nimport '../../kd/elements/data';\nimport '../../kd/elements/groups';\nimport '../../kd/elements/sheet';\nimport '../../kd/elements/steps';\nimport '../../kd/elements/tabs';\nimport './events';\nimport { define } from '../../kd/define';\nimport { KdElement, base, json } from '../../kd/element';\nimport { annotations, bar, conditions, labels, summary, trimmed, type K8sObject } from '../map';\n\n/**\n * The generic page of one Kubernetes object, composed from the kd elements:\n * the title bar, the conditions as steps, then tabs for the summary sheet,\n * labels, annotations, events (when `events` is set: the panel's Loki frames)\n * and the YAML. `related` objects extend the owner chain; `key` keeps the\n * open tab per view; `now` (ms) pins the ages.\n *\n * `el.data = context.data[0][0]; el.events = context.data` → `<kd-k8s-object key=\"pod\"></kd-k8s-object>`\n */\nexport class KdK8sObject extends KdElement {\n static override properties = {\n data: { attribute: 'data', converter: json },\n events: { attribute: false },\n related: { attribute: false },\n key: {},\n now: { type: Number },\n };\n static override styles = [\n base,\n css`\n .page {\n display: flex;\n flex-direction: column;\n gap: 16px;\n }\n `,\n ];\n\n declare data: K8sObject | undefined;\n declare events: unknown;\n declare related: K8sObject[] | undefined;\n declare key: string | undefined;\n declare now: number | undefined;\n\n override render() {\n const o = this.data;\n if (!o || typeof o !== 'object') return nothing;\n const opt = { now: this.now, related: this.related };\n const steps = conditions(o);\n const l = labels(o);\n const a = annotations(o);\n const count = (map: object) => String(Object.keys(map).length);\n return html`<div class=\"page\">\n <kd-bar .data=${bar(o, opt)}></kd-bar>\n ${steps.length ? html`<kd-steps .data=${steps}></kd-steps>` : nothing}\n <kd-tabs key=${this.key ?? nothing}>\n <section label=\"Summary\"><kd-sheet .data=${summary(o, opt)}></kd-sheet></section>\n <section label=\"Labels\" count=${count(l)}><kd-groups mode=\"pills\" .data=${l}></kd-groups></section>\n <section label=\"Annotations\" count=${count(a)}><kd-groups mode=\"tree\" .data=${a}></kd-groups></section>\n ${this.events === undefined\n ? nothing\n : html`<section label=\"Events\"><kd-k8s-events .data=${this.events} .now=${this.now}></kd-k8s-events></section>`}\n <section label=\"YAML\"><kd-data fold=\"0\" .data=${trimmed(o)}></kd-data></section>\n </kd-tabs>\n </div>`;\n }\n}\n\ndefine('kd-k8s-object', KdK8sObject);\n","import { css, html, nothing } from 'lit';\n\nimport '../../kd/elements/link';\nimport { define } from '../../kd/define';\nimport { KdElement, base, json } from '../../kd/element';\nimport { refLink, type ObjectRef } from '../links';\n\n/**\n * A link to the k8s-* view of one object, with its kind's icon and a back\n * link to this page. Set `data` (an `ObjectRef`, or any object with `kind`,\n * `apiVersion` and `metadata`), or the attributes `kind`, `name`, `namespace`,\n * `api-version` and `plural`. A kind no view shows renders as a label.\n *\n * `<kd-k8s-ref kind=\"Pod\" namespace=\"db\" name=\"postgresql-0\"></kd-k8s-ref>`\n */\nexport class KdK8sRef extends KdElement {\n static override properties = {\n data: { attribute: 'data', converter: json },\n kind: {},\n name: {},\n namespace: {},\n apiVersion: { attribute: 'api-version' },\n plural: {},\n };\n static override styles = [\n base,\n css`\n :host {\n display: inline;\n }\n `,\n ];\n\n declare data: Partial<ObjectRef> & { metadata?: { name?: string; namespace?: string } } | undefined;\n declare kind: string | undefined;\n declare name: string | undefined;\n declare namespace: string | undefined;\n declare apiVersion: string | undefined;\n declare plural: string | undefined;\n\n /** The reference, `data` taking precedence over the attributes field by field. */\n get ref(): ObjectRef | undefined {\n const d = this.data ?? {};\n const kind = d.kind ?? this.kind;\n const name = d.name ?? d.metadata?.name ?? this.name;\n if (!kind || !name) return undefined;\n return {\n kind,\n name,\n namespace: d.namespace ?? d.metadata?.namespace ?? this.namespace,\n apiVersion: d.apiVersion ?? this.apiVersion,\n plural: d.plural ?? this.plural,\n };\n }\n\n override render() {\n const ref = this.ref;\n return ref ? html`<kd-link .data=${refLink(ref)}></kd-link>` : nothing;\n }\n}\n\ndefine('kd-k8s-ref', KdK8sRef);\n"],"mappings":"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"}
@@ -0,0 +1,53 @@
1
+ import { nothing, type PropertyValues } from 'lit';
2
+ import { KdElement } from '../element';
3
+ /** The highlighter, loaded on first use: language lookup by name or file name, and `highlight()`. */
4
+ export declare const highlighter: () => Promise<typeof import("../highlight")>;
5
+ /** Line numbers from `"3,7-9"` (or `"L3-L9"`) or `[3, 7, 8, 9]`. */
6
+ export declare function lineSet(value: string | number | number[] | null | undefined): Set<number>;
7
+ /**
8
+ * Source code with syntax colours from highlight.js, themed from `--kd-*`.
9
+ * The language comes from `language` (a name or alias: `yaml`, `js`) or else
10
+ * from `filename`; only that language's chunk loads, and an unknown one shows
11
+ * as plain text. So does a file past 256 KB or 10,000 lines.
12
+ *
13
+ * `<kd-code filename="deploy.yaml" highlight="3,7-9"></kd-code>` with `text`
14
+ * set from afterRender.
15
+ */
16
+ export declare class KdCode extends KdElement {
17
+ #private;
18
+ static properties: {
19
+ text: {};
20
+ language: {};
21
+ filename: {};
22
+ lines: {
23
+ converter: {
24
+ fromAttribute: (value: string | null) => boolean;
25
+ toAttribute: (value: boolean) => "" | "false";
26
+ };
27
+ };
28
+ wrap: {
29
+ converter: {
30
+ fromAttribute: (value: string | null) => boolean;
31
+ toAttribute: (value: boolean) => "" | "false";
32
+ };
33
+ };
34
+ highlight: {};
35
+ start: {
36
+ type: NumberConstructor;
37
+ };
38
+ };
39
+ static styles: import("lit").CSSResult[];
40
+ text: string | undefined;
41
+ language: string | undefined;
42
+ filename: string | undefined;
43
+ lines: boolean;
44
+ wrap: boolean;
45
+ highlight: string | number[] | undefined;
46
+ start: number;
47
+ constructor();
48
+ /** Also waits for the highlighting, so a test or a probe sees the coloured result. */
49
+ protected getUpdateComplete(): Promise<boolean>;
50
+ protected willUpdate(changed: PropertyValues<this>): void;
51
+ render(): typeof nothing | import("lit-html").TemplateResult<1>;
52
+ disconnectedCallback(): void;
53
+ }
@@ -0,0 +1,55 @@
1
+ import { nothing, type PropertyValues } from 'lit';
2
+ import { KdElement } from '../element';
3
+ import './code';
4
+ /** URL prefixes that relative links and images in the document resolve against. */
5
+ export interface MarkdownBase {
6
+ links?: string;
7
+ images?: string;
8
+ }
9
+ /**
10
+ * A second pass over DOMPurify's output, which must already be clean: drops
11
+ * any script-capable tag, event handler, style or script URL left in `root`.
12
+ * It costs one walk, and it holds where DOMPurify cannot run properly (happy-dom,
13
+ * whose NodeIterator loses its place on a removal, makes DOMPurify return
14
+ * scripts untouched).
15
+ */
16
+ export declare function scrub(root: Element | DocumentFragment): void;
17
+ /**
18
+ * `url` resolved against `base`, a URL prefix: `docs/a.md` and `/docs/a.md`
19
+ * both land under it. Without a prefix, a document fetched from `from`
20
+ * resolves the usual web way, against its own URL.
21
+ */
22
+ export declare function rebase(url: string, base: string | undefined, from?: string): string;
23
+ /** GitHub's heading anchor: lower case, punctuation dropped, spaces to dashes. */
24
+ export declare function slug(text: string): string;
25
+ /**
26
+ * Markdown, GitHub-flavoured (tables, task lists, autolinks), rendered by
27
+ * marked and sanitised by DOMPurify before it reaches the shadow root. Code
28
+ * fences render through `kd-code`; headings get anchors; links open in a new
29
+ * tab. Relative links and images resolve against `base` (URL prefixes), or,
30
+ * for a document fetched from `src`, against that URL.
31
+ *
32
+ * `<kd-markdown src="https://…/README.md"></kd-markdown>`, or `markdown` and
33
+ * `base` set from afterRender.
34
+ */
35
+ export declare class KdMarkdown extends KdElement {
36
+ #private;
37
+ static properties: {
38
+ markdown: {};
39
+ src: {};
40
+ base: {
41
+ converter: {
42
+ fromAttribute(value: string | null): unknown;
43
+ toAttribute(value: unknown): string;
44
+ };
45
+ };
46
+ };
47
+ static styles: import("lit").CSSResult[];
48
+ markdown: string | undefined;
49
+ src: string | undefined;
50
+ base: MarkdownBase | undefined;
51
+ /** Also waits for the document and the code in it to render. */
52
+ protected getUpdateComplete(): Promise<boolean>;
53
+ protected willUpdate(changed: PropertyValues<this>): void;
54
+ render(): typeof nothing | import("lit-html").TemplateResult<1>;
55
+ }
@@ -0,0 +1,31 @@
1
+ import { type ThemeLike } from './theme';
2
+ /** The parts of Business Text's `context` that feed and variable read. */
3
+ export interface FeedContext {
4
+ element?: HTMLElement | null;
5
+ grafana?: {
6
+ theme?: ThemeLike;
7
+ replaceVariables?(text: string): string;
8
+ } | null;
9
+ }
10
+ /** Properties to set, by CSS selector: `{ 'kd-files': { entries, selected } }`. */
11
+ export type FeedMap = Record<string, Record<string, unknown>>;
12
+ /**
13
+ * Applies the theme to the panel root, then sets each selector's properties on
14
+ * every element under the root that matches it. Idempotent, as afterRender
15
+ * runs twice per refresh.
16
+ *
17
+ * It merges (`Object.assign`): a key left out keeps the value an earlier call
18
+ * gave it. A panel should pass every key it manages each time, `undefined`
19
+ * where one does not apply, or the last file's `type` or `src` sticks to the next.
20
+ *
21
+ * `afterRender: import(assets + '/kd.js').then((m) => m.feed(context, { 'kd-markdown': { markdown } }))`
22
+ *
23
+ * @returns the elements it set properties on
24
+ */
25
+ export declare function feed(context: FeedContext | null | undefined, map?: FeedMap): Element[];
26
+ /**
27
+ * A dashboard variable's value as the panel sees it, through
28
+ * `context.grafana.replaceVariables`: '' when the variable is not set or does
29
+ * not exist.
30
+ */
31
+ export declare function variable(context: FeedContext | null | undefined, name: string): string;
@@ -0,0 +1,88 @@
1
+ import { type PropertyValues, type TemplateResult } from 'lit';
2
+ import { KdElement } from '../element';
3
+ import { type Tone } from '../parts';
4
+ import { type Entry, type Provider } from './types';
5
+ export interface FileColumn {
6
+ /** The stat or cell key; `size` and `modified` name the entry's own fields. */
7
+ key: string;
8
+ /** Defaults to the key. */
9
+ label?: string;
10
+ /** Defaults to `size` or `modified` for those keys, else `stat`. */
11
+ kind?: 'size' | 'stat' | 'cell' | 'modified';
12
+ /** Shown before a stat's number (`+`, an emoji). */
13
+ icon?: string;
14
+ /** The colour of a non-zero stat. */
15
+ tone?: Tone;
16
+ /** The header's tooltip. */
17
+ title?: string;
18
+ }
19
+ /** What `navigate` and `select` carry. `entry` is undefined for the root. */
20
+ export interface FilesEventDetail {
21
+ path: string;
22
+ entry?: Entry;
23
+ }
24
+ /**
25
+ * A file explorer over a provider (`provider`, or `entries` for a static
26
+ * list): breadcrumbs and `..`, folders first, columns sorted by a header
27
+ * click, a filter box (`filter`), and the keyboard (arrows, Enter, Backspace).
28
+ * Clicking a folder opens it (`navigate`); clicking a file selects it
29
+ * (`select`, cancelable), and with `variable` writes `valuePrefix + path` to that
30
+ * dashboard variable, replacing the URL entry as Grafana's own programmatic
31
+ * writes do. `selected` (`valuePrefix + path`, as the variable holds it) is highlighted and
32
+ * its folder opened. With a `key`, the open folder and the sort survive the
33
+ * panel recreating the element; the folder is stored with the selection it was
34
+ * left with, so a different `selected` (a deep link) opens its own folder instead.
35
+ *
36
+ * `<kd-files variable="file" key="repo-files" filter></kd-files>` + `el.entries = [...]`
37
+ */
38
+ export declare class KdFiles extends KdElement {
39
+ #private;
40
+ static properties: {
41
+ provider: {
42
+ attribute: boolean;
43
+ };
44
+ entries: {
45
+ attribute: string;
46
+ converter: {
47
+ fromAttribute(value: string | null): unknown;
48
+ toAttribute(value: unknown): string;
49
+ };
50
+ };
51
+ columns: {
52
+ attribute: string;
53
+ converter: {
54
+ fromAttribute(value: string | null): unknown;
55
+ toAttribute(value: unknown): string;
56
+ };
57
+ };
58
+ selected: {};
59
+ variable: {};
60
+ key: {};
61
+ valuePrefix: {
62
+ attribute: string;
63
+ };
64
+ label: {};
65
+ filter: {
66
+ type: BooleanConstructor;
67
+ };
68
+ empty: {};
69
+ };
70
+ static styles: import("lit").CSSResult[];
71
+ provider: Provider | undefined;
72
+ entries: Entry[] | undefined;
73
+ columns: FileColumn[] | undefined;
74
+ selected: string | undefined;
75
+ variable: string | undefined;
76
+ key: string | undefined;
77
+ valuePrefix: string | undefined;
78
+ label: string | undefined;
79
+ filter: boolean | undefined;
80
+ empty: string | undefined;
81
+ /** The open folder. */
82
+ get folder(): string;
83
+ /** `selected` as a path, without `valuePrefix`; '' when it carries another prefix. */
84
+ get selectedPath(): string;
85
+ protected willUpdate(changed: PropertyValues<this>): void;
86
+ protected updated(): void;
87
+ render(): TemplateResult<1>;
88
+ }