silvery 0.21.0 → 0.23.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (224) hide show
  1. package/README.md +1 -1
  2. package/dist/{Text-Lq0dmj8-.mjs → Text-Ci6UCSTL.mjs} +46 -48
  3. package/dist/Text-Ci6UCSTL.mjs.map +1 -0
  4. package/dist/{render-string-DkQacASz.mjs → ag-q9lRlKlt.mjs} +5322 -4259
  5. package/dist/ag-q9lRlKlt.mjs.map +1 -0
  6. package/dist/{animation-ZMN2_XKv.mjs → animation-CZ4x2R7C.mjs} +1 -1
  7. package/dist/{animation-ZMN2_XKv.mjs.map → animation-CZ4x2R7C.mjs.map} +1 -1
  8. package/dist/{ansi-D1KQMAbf.mjs → ansi-CLmIMnop.mjs} +1 -1
  9. package/dist/{ansi-D1KQMAbf.mjs.map → ansi-CLmIMnop.mjs.map} +1 -1
  10. package/dist/{ansi-2Xn0yatP.d.mts → ansi-zmNzgkPB.d.mts} +1 -1
  11. package/dist/{ansi-2Xn0yatP.d.mts.map → ansi-zmNzgkPB.d.mts.map} +1 -1
  12. package/dist/{backend-B-WYLUib.mjs → backend-DSiSIc-h.mjs} +2 -2
  13. package/dist/{backend-B-WYLUib.mjs.map → backend-DSiSIc-h.mjs.map} +1 -1
  14. package/dist/chain-bridge-CkYcMxlq.mjs +4149 -0
  15. package/dist/chain-bridge-CkYcMxlq.mjs.map +1 -0
  16. package/dist/{chunk-BSw8zbkd.mjs → chunk-BEJ448es.mjs} +1 -3
  17. package/dist/cli-VNqUKlXw.mjs +4 -0
  18. package/dist/{context-BU5LkkIy.mjs → context-CEhuD1R_.mjs} +1 -1
  19. package/dist/{context-BU5LkkIy.mjs.map → context-CEhuD1R_.mjs.map} +1 -1
  20. package/dist/devtools-BF4IMumr.mjs +2 -0
  21. package/dist/{devtools-DcQjgyjL.mjs → devtools-td2AjFwc.mjs} +5 -5
  22. package/dist/{devtools-DcQjgyjL.mjs.map → devtools-td2AjFwc.mjs.map} +1 -1
  23. package/dist/{easing-BI-ASGMO.d.mts → easing-C5MrdO7V.d.mts} +1 -1
  24. package/dist/{easing-BI-ASGMO.d.mts.map → easing-C5MrdO7V.d.mts.map} +1 -1
  25. package/dist/{eta-CJlGH06n.mjs → eta-BwYWEjfS.mjs} +1 -1
  26. package/dist/{eta-CJlGH06n.mjs.map → eta-BwYWEjfS.mjs.map} +1 -1
  27. package/dist/{flexily-zero-adapter-C4lW_Ov5.mjs → flexily-zero-adapter-DktX3HsX.mjs} +1 -1
  28. package/dist/{flexily-zero-adapter-C3Vj0fPt.mjs → flexily-zero-adapter-VoBGHG14.mjs} +1 -1
  29. package/dist/{flexily-zero-adapter-C3Vj0fPt.mjs.map → flexily-zero-adapter-VoBGHG14.mjs.map} +1 -1
  30. package/dist/hit-registry-D_nxOivS.d.mts +71 -0
  31. package/dist/hit-registry-D_nxOivS.d.mts.map +1 -0
  32. package/dist/{UPNG-DosRPdF4.mjs → image-CIF75xMr.mjs} +891 -6
  33. package/dist/image-CIF75xMr.mjs.map +1 -0
  34. package/dist/{index-CSQf13CI.d.mts → index-377zdPLP.d.mts} +35 -12
  35. package/dist/index-377zdPLP.d.mts.map +1 -0
  36. package/dist/{index-Cl9KKjQ_.d.mts → index-BcSr0RAQ.d.mts} +8670 -10659
  37. package/dist/index-BcSr0RAQ.d.mts.map +1 -0
  38. package/dist/{index-XbNrPhWl.d.mts → index-DLnpxDAm.d.mts} +2 -2
  39. package/dist/{index-XbNrPhWl.d.mts.map → index-DLnpxDAm.d.mts.map} +1 -1
  40. package/dist/{index-BUMxS65f.d.mts → index-DlNmckTq.d.mts} +2 -2
  41. package/dist/{index-BUMxS65f.d.mts.map → index-DlNmckTq.d.mts.map} +1 -1
  42. package/dist/index.d.mts +12 -8
  43. package/dist/index.d.mts.map +1 -1
  44. package/dist/index.mjs +18 -15
  45. package/dist/index.mjs.map +1 -1
  46. package/dist/{layout-engine-C2px0RJE.mjs → layout-engine-BgR58vL0.mjs} +3 -3
  47. package/dist/{layout-engine-C2px0RJE.mjs.map → layout-engine-BgR58vL0.mjs.map} +1 -1
  48. package/dist/{layout-engine-C07LEXWT.mjs → layout-engine-DNjTha8f.mjs} +1 -1
  49. package/dist/{layout-signals-Cnw6xk8Q.mjs → layout-signals-CGYbHmxy.mjs} +146 -23
  50. package/dist/layout-signals-CGYbHmxy.mjs.map +1 -0
  51. package/dist/{bound-term-0sPrrzH1.d.mts → mouse-events-B2z5tbsL.d.mts} +780 -379
  52. package/dist/mouse-events-B2z5tbsL.d.mts.map +1 -0
  53. package/dist/{mouse-events-Dki3ISIp.mjs → mouse-events-WQ2h-uqG.mjs} +45 -10
  54. package/dist/mouse-events-WQ2h-uqG.mjs.map +1 -0
  55. package/dist/{multi-progress-DHZ2xUT2.d.mts → multi-progress-BaEFfHKP.d.mts} +2 -2
  56. package/dist/{multi-progress-DHZ2xUT2.d.mts.map → multi-progress-BaEFfHKP.d.mts.map} +1 -1
  57. package/dist/{multi-progress-CIRjrzma.mjs → multi-progress-zCWHEm9P.mjs} +3 -3
  58. package/dist/{multi-progress-CIRjrzma.mjs.map → multi-progress-zCWHEm9P.mjs.map} +1 -1
  59. package/dist/{node-CjM5Rt-M.mjs → node-CJ3J_rW-.mjs} +1 -1
  60. package/dist/{node-CjM5Rt-M.mjs.map → node-CJ3J_rW-.mjs.map} +1 -1
  61. package/dist/{progress-DB_Xo071.mjs → progress-6vJ7nxUg.mjs} +4 -4
  62. package/dist/{progress-DB_Xo071.mjs.map → progress-6vJ7nxUg.mjs.map} +1 -1
  63. package/dist/{progress-bar-oJwq22CR.mjs → progress-bar-BlFNsZL8.mjs} +4 -4
  64. package/dist/{progress-bar-oJwq22CR.mjs.map → progress-bar-BlFNsZL8.mjs.map} +1 -1
  65. package/dist/{reconciler-DldIJB93.mjs → reconciler--_-biN23.mjs} +190 -134
  66. package/dist/reconciler--_-biN23.mjs.map +1 -0
  67. package/dist/{render-string-BcoCpjCB.mjs → render-string-DaghHpLN.mjs} +1 -1
  68. package/dist/render-string-DtHZP0cU.mjs +215 -0
  69. package/dist/render-string-DtHZP0cU.mjs.map +1 -0
  70. package/dist/runtime.d.mts +4 -3
  71. package/dist/runtime.mjs +4 -3
  72. package/dist/schemes-DWQPxXAi.mjs +2516 -0
  73. package/dist/{schemes-JjNp4aSl.mjs.map → schemes-DWQPxXAi.mjs.map} +1 -1
  74. package/dist/{spinner-D9lrHr8s.mjs → spinner-B50hILqx.mjs} +19 -4
  75. package/dist/{spinner-D9lrHr8s.mjs.map → spinner-B50hILqx.mjs.map} +1 -1
  76. package/dist/{spinner-CZINHpkV.d.mts → spinner-DN10UfF0.d.mts} +2 -2
  77. package/dist/{spinner-CZINHpkV.d.mts.map → spinner-DN10UfF0.d.mts.map} +1 -1
  78. package/dist/{src-BNTToU7l.mjs → src-B8lf1kiR.mjs} +1507 -1166
  79. package/dist/src-B8lf1kiR.mjs.map +1 -0
  80. package/dist/{src-5w9QR6_8.mjs → src-BOLdi3WG.mjs} +105 -237
  81. package/dist/src-BOLdi3WG.mjs.map +1 -0
  82. package/dist/{src-BR4xNwdG.mjs → src-BXeTHHlL.mjs} +20240 -25437
  83. package/dist/src-BXeTHHlL.mjs.map +1 -0
  84. package/dist/{src-DKp-_OFG.mjs → src-BqeBFB3X.mjs} +90 -47
  85. package/dist/src-BqeBFB3X.mjs.map +1 -0
  86. package/dist/src-DbqcSrhy.mjs +3901 -0
  87. package/dist/src-DbqcSrhy.mjs.map +1 -0
  88. package/dist/{steps-Bp2uNqnn.d.mts → steps-B2kBmFpb.d.mts} +1 -1
  89. package/dist/{steps-Bp2uNqnn.d.mts.map → steps-B2kBmFpb.d.mts.map} +1 -1
  90. package/dist/{svg-Cz0UXcDj.mjs → svg-NmV9dgB9.mjs} +1 -1
  91. package/dist/{svg-Cz0UXcDj.mjs.map → svg-NmV9dgB9.mjs.map} +1 -1
  92. package/dist/{svg-g1D6ErwR.d.mts → svg-VUr78l5d.d.mts} +1 -1
  93. package/dist/{svg-g1D6ErwR.d.mts.map → svg-VUr78l5d.d.mts.map} +1 -1
  94. package/dist/term.d.mts +2 -2
  95. package/dist/term.mjs +3 -8
  96. package/dist/test.d.mts +673 -0
  97. package/dist/test.d.mts.map +1 -0
  98. package/dist/test.mjs +2829 -0
  99. package/dist/test.mjs.map +1 -0
  100. package/dist/theme.d.mts +2 -2
  101. package/dist/theme.d.mts.map +1 -1
  102. package/dist/theme.mjs +3 -8
  103. package/dist/{types-kt_fKR37.d.mts → types-D_E0FbqA.d.mts} +1 -1
  104. package/dist/{types-kt_fKR37.d.mts.map → types-D_E0FbqA.d.mts.map} +1 -1
  105. package/dist/ui/animation.d.mts +2 -2
  106. package/dist/ui/animation.mjs +1 -1
  107. package/dist/ui/ansi.d.mts +1 -1
  108. package/dist/ui/ansi.mjs +1 -1
  109. package/dist/ui/cli.d.mts +3 -3
  110. package/dist/ui/cli.mjs +5 -5
  111. package/dist/ui/image.d.mts +1 -1
  112. package/dist/ui/image.mjs +1 -1
  113. package/dist/ui/progress.d.mts +4 -4
  114. package/dist/ui/progress.mjs +4 -4
  115. package/dist/ui/react.d.mts +1 -1
  116. package/dist/ui/react.mjs +2 -2
  117. package/dist/ui/recording-chrome-react.d.mts +1 -1
  118. package/dist/ui/recording-chrome-react.mjs +2 -2
  119. package/dist/ui/recording-chrome.d.mts +1 -1
  120. package/dist/ui/recording-chrome.mjs +1 -1
  121. package/dist/ui/utils.mjs +1 -1
  122. package/dist/ui/wrappers.d.mts +2 -2
  123. package/dist/ui/wrappers.mjs +1 -1
  124. package/dist/ui.d.mts +6 -6
  125. package/dist/ui.mjs +7 -7
  126. package/dist/unicode-CxyxVGmB.mjs +11077 -0
  127. package/dist/unicode-CxyxVGmB.mjs.map +1 -0
  128. package/dist/{useLatest-DRDDVwjh.d.mts → useLatest-UOvWy0ZW.d.mts} +2 -2
  129. package/dist/{useLatest-DRDDVwjh.d.mts.map → useLatest-UOvWy0ZW.d.mts.map} +1 -1
  130. package/dist/useLayout-D5cE8OCI.mjs +424 -0
  131. package/dist/useLayout-D5cE8OCI.mjs.map +1 -0
  132. package/dist/{with-text-input-YeohVLeo.d.mts → with-text-input-DLoSCBrm.d.mts} +3 -3
  133. package/dist/{with-text-input-YeohVLeo.d.mts.map → with-text-input-DLoSCBrm.d.mts.map} +1 -1
  134. package/dist/wrap-measurer-registration-IV2HtcCd.d.mts +3106 -0
  135. package/dist/wrap-measurer-registration-IV2HtcCd.d.mts.map +1 -0
  136. package/dist/{wrapper-C70ATkVv.mjs → wrapper-CD29afOs.mjs} +59 -17
  137. package/dist/wrapper-CD29afOs.mjs.map +1 -0
  138. package/dist/{wrappers-BCUYITrY.mjs → wrappers-CInBJm44.mjs} +18 -8
  139. package/dist/wrappers-CInBJm44.mjs.map +1 -0
  140. package/dist/{yoga-adapter-BnZX1PAY.mjs → yoga-adapter-9uab5Qn-.mjs} +2 -2
  141. package/dist/{yoga-adapter-BnZX1PAY.mjs.map → yoga-adapter-9uab5Qn-.mjs.map} +1 -1
  142. package/dist/yoga-adapter-yqTl1aXK.mjs +2 -0
  143. package/package.json +59 -14
  144. package/dist/Text-Lq0dmj8-.mjs.map +0 -1
  145. package/dist/UPNG-Bo33r8rA.mjs +0 -3
  146. package/dist/UPNG-DosRPdF4.mjs.map +0 -1
  147. package/dist/__vite-browser-external-2447137e-D_JM6skp.mjs +0 -6
  148. package/dist/__vite-browser-external-2447137e-D_JM6skp.mjs.map +0 -1
  149. package/dist/ansi-yC4RyBNY.mjs +0 -22441
  150. package/dist/ansi-yC4RyBNY.mjs.map +0 -1
  151. package/dist/apng-CR08rIaH.mjs +0 -58
  152. package/dist/apng-CR08rIaH.mjs.map +0 -1
  153. package/dist/apng-DaHfVaVI.mjs +0 -3
  154. package/dist/assets/resvgjs.darwin-arm64-BtufyGW1.node +0 -0
  155. package/dist/assets/skia.darwin-arm64-DQs5sT6N.node +0 -0
  156. package/dist/backends-CUtan80W.mjs +0 -3
  157. package/dist/backends-DIVYzKqd.mjs +0 -1083
  158. package/dist/backends-DIVYzKqd.mjs.map +0 -1
  159. package/dist/bound-term-0sPrrzH1.d.mts.map +0 -1
  160. package/dist/canvas-1v7dPT-_.mjs +0 -3
  161. package/dist/canvas-CSuPOMNt.mjs +0 -1442
  162. package/dist/canvas-CSuPOMNt.mjs.map +0 -1
  163. package/dist/cli-dvo0r2fs.mjs +0 -4
  164. package/dist/compare-CQodSH4G.mjs +0 -376
  165. package/dist/compare-CQodSH4G.mjs.map +0 -1
  166. package/dist/compare-DHlcxEYA.mjs +0 -3
  167. package/dist/devtools-CJdt5H0X.mjs +0 -2
  168. package/dist/fonts-BFmhXDv7.mjs +0 -88
  169. package/dist/fonts-BFmhXDv7.mjs.map +0 -1
  170. package/dist/gif-C_AjaT9d.mjs +0 -188
  171. package/dist/gif-C_AjaT9d.mjs.map +0 -1
  172. package/dist/gif-DaC4XrxA.mjs +0 -3
  173. package/dist/gifenc-BOUT-KFB.mjs +0 -730
  174. package/dist/gifenc-BOUT-KFB.mjs.map +0 -1
  175. package/dist/image-C2Birh2x.mjs +0 -1252
  176. package/dist/image-C2Birh2x.mjs.map +0 -1
  177. package/dist/index-CSQf13CI.d.mts.map +0 -1
  178. package/dist/index-Cl9KKjQ_.d.mts.map +0 -1
  179. package/dist/key-mapping-CS-YD_cD.mjs +0 -132
  180. package/dist/key-mapping-CS-YD_cD.mjs.map +0 -1
  181. package/dist/key-mapping-Yn-Jgrij.mjs +0 -3
  182. package/dist/layout-signals-Cnw6xk8Q.mjs.map +0 -1
  183. package/dist/mouse-events-Dki3ISIp.mjs.map +0 -1
  184. package/dist/playwright-D5YiZcNS.mjs +0 -76397
  185. package/dist/playwright-D5YiZcNS.mjs.map +0 -1
  186. package/dist/png-codec-Dp84742B.mjs +0 -36
  187. package/dist/png-codec-Dp84742B.mjs.map +0 -1
  188. package/dist/png-codec-QwOtJ8Zs.mjs +0 -3
  189. package/dist/rasterizer-BRXrDdWx.mjs +0 -3
  190. package/dist/rasterizer-CpEhJvdR.mjs +0 -296
  191. package/dist/rasterizer-CpEhJvdR.mjs.map +0 -1
  192. package/dist/reconciler-DldIJB93.mjs.map +0 -1
  193. package/dist/render-string-DkQacASz.mjs.map +0 -1
  194. package/dist/resvg-js-DkOndZI3.mjs +0 -203
  195. package/dist/resvg-js-DkOndZI3.mjs.map +0 -1
  196. package/dist/schemes-JjNp4aSl.mjs +0 -2611
  197. package/dist/src-5w9QR6_8.mjs.map +0 -1
  198. package/dist/src-BNTToU7l.mjs.map +0 -1
  199. package/dist/src-BR4xNwdG.mjs.map +0 -1
  200. package/dist/src-DKp-_OFG.mjs.map +0 -1
  201. package/dist/src-bt8wSrfJ.mjs +0 -258
  202. package/dist/src-bt8wSrfJ.mjs.map +0 -1
  203. package/dist/src-e33Y6kNJ.mjs +0 -3
  204. package/dist/src-iDwu25UD.mjs +0 -1814
  205. package/dist/src-iDwu25UD.mjs.map +0 -1
  206. package/dist/svg-15lZZzxq.mjs +0 -486
  207. package/dist/svg-15lZZzxq.mjs.map +0 -1
  208. package/dist/svg-DY72a4HK.mjs +0 -3
  209. package/dist/term.mjs.map +0 -1
  210. package/dist/theme.mjs.map +0 -1
  211. package/dist/ui/display.d.mts +0 -35
  212. package/dist/ui/display.d.mts.map +0 -1
  213. package/dist/ui/display.mjs +0 -123
  214. package/dist/ui/display.mjs.map +0 -1
  215. package/dist/ui/input.d.mts +0 -184
  216. package/dist/ui/input.d.mts.map +0 -1
  217. package/dist/ui/input.mjs +0 -285
  218. package/dist/ui/input.mjs.map +0 -1
  219. package/dist/wrapper-C70ATkVv.mjs.map +0 -1
  220. package/dist/wrappers-BCUYITrY.mjs.map +0 -1
  221. package/dist/yoga-adapter-DxgsQ_gg.mjs +0 -2
  222. package/dist/zipBundle-3nqeDRtm.mjs +0 -3
  223. package/dist/zipBundle-VNAYFmqJ.mjs +0 -2003
  224. package/dist/zipBundle-VNAYFmqJ.mjs.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"canvas-CSuPOMNt.mjs","names":[],"sources":["../../../node_modules/.bun/@napi-rs+canvas@1.0.0/node_modules/@napi-rs/canvas/js-binding.js","../../../node_modules/.bun/@napi-rs+canvas@1.0.0/node_modules/@napi-rs/canvas/geometry.js","../../../node_modules/.bun/@napi-rs+canvas@1.0.0/node_modules/@napi-rs/canvas/load-image.js","../../../node_modules/.bun/@napi-rs+canvas@1.0.0/node_modules/@napi-rs/canvas/index.js"],"sourcesContent":["// prettier-ignore\n/* eslint-disable */\n// @ts-nocheck\n/* auto-generated by NAPI-RS */\n\nconst { readFileSync } = require('fs')\nlet nativeBinding = null\nconst loadErrors = []\n\nconst isMusl = () => {\n let musl = false\n if (process.platform === 'linux') {\n musl = isMuslFromFilesystem()\n if (musl === null) {\n musl = isMuslFromReport()\n }\n if (musl === null) {\n musl = isMuslFromChildProcess()\n }\n }\n return musl\n}\n\nconst isFileMusl = (f) => f.includes('libc.musl-') || f.includes('ld-musl-')\n\nconst isMuslFromFilesystem = () => {\n try {\n return readFileSync('/usr/bin/ldd', 'utf-8').includes('musl')\n } catch {\n return null\n }\n}\n\nconst isMuslFromReport = () => {\n let report = null\n if (typeof process.report?.getReport === 'function') {\n process.report.excludeNetwork = true\n report = process.report.getReport()\n }\n if (!report) {\n return null\n }\n if (report.header && report.header.glibcVersionRuntime) {\n return false\n }\n if (Array.isArray(report.sharedObjects)) {\n if (report.sharedObjects.some(isFileMusl)) {\n return true\n }\n }\n return false\n}\n\nconst isMuslFromChildProcess = () => {\n try {\n return require('child_process').execSync('ldd --version', { encoding: 'utf8' }).includes('musl')\n } catch (e) {\n // If we reach this case, we don't know if the system is musl or not, so is better to just fallback to false\n return false\n }\n}\n\nfunction requireNative() {\n if (process.env.NAPI_RS_NATIVE_LIBRARY_PATH) {\n try {\n return require(process.env.NAPI_RS_NATIVE_LIBRARY_PATH)\n } catch (err) {\n loadErrors.push(err)\n }\n } else if (process.platform === 'android') {\n if (process.arch === 'arm64') {\n try {\n return require('./skia.android-arm64.node')\n } catch (e) {\n loadErrors.push(e)\n }\n try {\n return require('@napi-rs/canvas-android-arm64')\n } catch (e) {\n loadErrors.push(e)\n }\n } else if (process.arch === 'arm') {\n try {\n return require('./skia.android-arm-eabi.node')\n } catch (e) {\n loadErrors.push(e)\n }\n try {\n return require('@napi-rs/canvas-android-arm-eabi')\n } catch (e) {\n loadErrors.push(e)\n }\n } else {\n loadErrors.push(new Error(`Unsupported architecture on Android ${process.arch}`))\n }\n } else if (process.platform === 'win32') {\n if (process.arch === 'x64') {\n if (\n process.config?.variables?.shlib_suffix === 'dll.a' ||\n process.config?.variables?.node_target_type === 'shared_library'\n ) {\n try {\n return require('./skia.win32-x64-gnu.node')\n } catch (e) {\n loadErrors.push(e)\n }\n try {\n return require('@napi-rs/canvas-win32-x64-gnu')\n } catch (e) {\n loadErrors.push(e)\n }\n } else {\n try {\n return require('./skia.win32-x64-msvc.node')\n } catch (e) {\n loadErrors.push(e)\n }\n try {\n return require('@napi-rs/canvas-win32-x64-msvc')\n } catch (e) {\n loadErrors.push(e)\n }\n }\n } else if (process.arch === 'ia32') {\n try {\n return require('./skia.win32-ia32-msvc.node')\n } catch (e) {\n loadErrors.push(e)\n }\n try {\n return require('@napi-rs/canvas-win32-ia32-msvc')\n } catch (e) {\n loadErrors.push(e)\n }\n } else if (process.arch === 'arm64') {\n try {\n return require('./skia.win32-arm64-msvc.node')\n } catch (e) {\n loadErrors.push(e)\n }\n try {\n return require('@napi-rs/canvas-win32-arm64-msvc')\n } catch (e) {\n loadErrors.push(e)\n }\n } else {\n loadErrors.push(new Error(`Unsupported architecture on Windows: ${process.arch}`))\n }\n } else if (process.platform === 'darwin') {\n try {\n return require('./skia.darwin-universal.node')\n } catch (e) {\n loadErrors.push(e)\n }\n try {\n return require('@napi-rs/canvas-darwin-universal')\n } catch (e) {\n loadErrors.push(e)\n }\n if (process.arch === 'x64') {\n try {\n return require('./skia.darwin-x64.node')\n } catch (e) {\n loadErrors.push(e)\n }\n try {\n return require('@napi-rs/canvas-darwin-x64')\n } catch (e) {\n loadErrors.push(e)\n }\n } else if (process.arch === 'arm64') {\n try {\n return require('./skia.darwin-arm64.node')\n } catch (e) {\n loadErrors.push(e)\n }\n try {\n return require('@napi-rs/canvas-darwin-arm64')\n } catch (e) {\n loadErrors.push(e)\n }\n } else {\n loadErrors.push(new Error(`Unsupported architecture on macOS: ${process.arch}`))\n }\n } else if (process.platform === 'freebsd') {\n if (process.arch === 'x64') {\n try {\n return require('./skia.freebsd-x64.node')\n } catch (e) {\n loadErrors.push(e)\n }\n try {\n return require('@napi-rs/canvas-freebsd-x64')\n } catch (e) {\n loadErrors.push(e)\n }\n } else if (process.arch === 'arm64') {\n try {\n return require('./skia.freebsd-arm64.node')\n } catch (e) {\n loadErrors.push(e)\n }\n try {\n return require('@napi-rs/canvas-freebsd-arm64')\n } catch (e) {\n loadErrors.push(e)\n }\n } else {\n loadErrors.push(new Error(`Unsupported architecture on FreeBSD: ${process.arch}`))\n }\n } else if (process.platform === 'linux') {\n if (process.arch === 'x64') {\n if (isMusl()) {\n try {\n return require('./skia.linux-x64-musl.node')\n } catch (e) {\n loadErrors.push(e)\n }\n try {\n return require('@napi-rs/canvas-linux-x64-musl')\n } catch (e) {\n loadErrors.push(e)\n }\n } else {\n try {\n return require('./skia.linux-x64-gnu.node')\n } catch (e) {\n loadErrors.push(e)\n }\n try {\n return require('@napi-rs/canvas-linux-x64-gnu')\n } catch (e) {\n loadErrors.push(e)\n }\n }\n } else if (process.arch === 'arm64') {\n if (isMusl()) {\n try {\n return require('./skia.linux-arm64-musl.node')\n } catch (e) {\n loadErrors.push(e)\n }\n try {\n return require('@napi-rs/canvas-linux-arm64-musl')\n } catch (e) {\n loadErrors.push(e)\n }\n } else {\n try {\n return require('./skia.linux-arm64-gnu.node')\n } catch (e) {\n loadErrors.push(e)\n }\n try {\n return require('@napi-rs/canvas-linux-arm64-gnu')\n } catch (e) {\n loadErrors.push(e)\n }\n }\n } else if (process.arch === 'arm') {\n if (isMusl()) {\n try {\n return require('./skia.linux-arm-musleabihf.node')\n } catch (e) {\n loadErrors.push(e)\n }\n try {\n return require('@napi-rs/canvas-linux-arm-musleabihf')\n } catch (e) {\n loadErrors.push(e)\n }\n } else {\n try {\n return require('./skia.linux-arm-gnueabihf.node')\n } catch (e) {\n loadErrors.push(e)\n }\n try {\n return require('@napi-rs/canvas-linux-arm-gnueabihf')\n } catch (e) {\n loadErrors.push(e)\n }\n }\n } else if (process.arch === 'loong64') {\n if (isMusl()) {\n try {\n return require('./skia.linux-loong64-musl.node')\n } catch (e) {\n loadErrors.push(e)\n }\n try {\n return require('@napi-rs/canvas-linux-loong64-musl')\n } catch (e) {\n loadErrors.push(e)\n }\n } else {\n try {\n return require('./skia.linux-loong64-gnu.node')\n } catch (e) {\n loadErrors.push(e)\n }\n try {\n return require('@napi-rs/canvas-linux-loong64-gnu')\n } catch (e) {\n loadErrors.push(e)\n }\n }\n } else if (process.arch === 'riscv64') {\n if (isMusl()) {\n try {\n return require('./skia.linux-riscv64-musl.node')\n } catch (e) {\n loadErrors.push(e)\n }\n try {\n return require('@napi-rs/canvas-linux-riscv64-musl')\n } catch (e) {\n loadErrors.push(e)\n }\n } else {\n try {\n return require('./skia.linux-riscv64-gnu.node')\n } catch (e) {\n loadErrors.push(e)\n }\n try {\n return require('@napi-rs/canvas-linux-riscv64-gnu')\n } catch (e) {\n loadErrors.push(e)\n }\n }\n } else if (process.arch === 'ppc64') {\n try {\n return require('./skia.linux-ppc64-gnu.node')\n } catch (e) {\n loadErrors.push(e)\n }\n try {\n return require('@napi-rs/canvas-linux-ppc64-gnu')\n } catch (e) {\n loadErrors.push(e)\n }\n } else if (process.arch === 's390x') {\n try {\n return require('./skia.linux-s390x-gnu.node')\n } catch (e) {\n loadErrors.push(e)\n }\n try {\n return require('@napi-rs/canvas-linux-s390x-gnu')\n } catch (e) {\n loadErrors.push(e)\n }\n } else {\n loadErrors.push(new Error(`Unsupported architecture on Linux: ${process.arch}`))\n }\n } else if (process.platform === 'openharmony') {\n if (process.arch === 'arm64') {\n try {\n return require('./skia.openharmony-arm64.node')\n } catch (e) {\n loadErrors.push(e)\n }\n try {\n return require('@napi-rs/canvas-openharmony-arm64')\n } catch (e) {\n loadErrors.push(e)\n }\n } else if (process.arch === 'x64') {\n try {\n return require('./skia.openharmony-x64.node')\n } catch (e) {\n loadErrors.push(e)\n }\n try {\n return require('@napi-rs/canvas-openharmony-x64')\n } catch (e) {\n loadErrors.push(e)\n }\n } else if (process.arch === 'arm') {\n try {\n return require('./skia.openharmony-arm.node')\n } catch (e) {\n loadErrors.push(e)\n }\n try {\n const binding = require('@napi-rs/canvas-openharmony-arm')\n return binding\n } catch (e) {\n loadErrors.push(e)\n }\n } else {\n loadErrors.push(new Error(`Unsupported architecture on OpenHarmony: ${process.arch}`))\n }\n } else {\n loadErrors.push(new Error(`Unsupported OS: ${process.platform}, architecture: ${process.arch}`))\n }\n}\n\nnativeBinding = requireNative()\n\nif (!nativeBinding || process.env.NAPI_RS_FORCE_WASI) {\n let wasiBinding = null\n let wasiBindingError = null\n try {\n wasiBinding = require('./skia.wasi.cjs')\n nativeBinding = wasiBinding\n } catch (err) {\n if (process.env.NAPI_RS_FORCE_WASI) {\n wasiBindingError = err\n }\n }\n if (!nativeBinding) {\n try {\n wasiBinding = require('@napi-rs/canvas-wasm32-wasi')\n nativeBinding = wasiBinding\n } catch (err) {\n if (process.env.NAPI_RS_FORCE_WASI) {\n wasiBindingError.cause = err\n loadErrors.push(err)\n }\n }\n }\n}\n\nif (!nativeBinding) {\n if (loadErrors.length > 0) {\n throw new Error(\n `Cannot find native binding. ` +\n `npm has a bug related to optional dependencies (https://github.com/npm/cli/issues/4828). ` +\n 'Please try `npm i` again after removing both package-lock.json and node_modules directory.',\n {\n cause: loadErrors.reduce((err, cur) => {\n cur.cause = err\n return cur\n }),\n },\n )\n }\n throw new Error(`Failed to load native binding`)\n}\n\nmodule.exports = nativeBinding\nmodule.exports.GlobalFonts = nativeBinding.GlobalFonts\nmodule.exports.CanvasElement = nativeBinding.CanvasElement\nmodule.exports.CanvasGradient = nativeBinding.CanvasGradient\nmodule.exports.CanvasPattern = nativeBinding.CanvasPattern\nmodule.exports.CanvasRenderingContext2D = nativeBinding.CanvasRenderingContext2D\nmodule.exports.FontKey = nativeBinding.FontKey\nmodule.exports.Image = nativeBinding.Image\nmodule.exports.ImageData = nativeBinding.ImageData\nmodule.exports.Path = nativeBinding.Path\nmodule.exports.PdfDocument = nativeBinding.PdfDocument\nmodule.exports.SVGCanvas = nativeBinding.SVGCanvas\nmodule.exports.ChromaSubsampling = nativeBinding.ChromaSubsampling\nmodule.exports.clearAllCache = nativeBinding.clearAllCache\nmodule.exports.convertSVGTextToPath = nativeBinding.convertSVGTextToPath\nmodule.exports.FillType = nativeBinding.FillType\nmodule.exports.PathOp = nativeBinding.PathOp\nmodule.exports.StrokeCap = nativeBinding.StrokeCap\nmodule.exports.StrokeJoin = nativeBinding.StrokeJoin\nmodule.exports.SvgExportFlag = nativeBinding.SvgExportFlag\nmodule.exports.GifEncoder = nativeBinding.GifEncoder\nmodule.exports.GifDisposal = nativeBinding.GifDisposal\n","const { inspect } = require('util')\n/*\n * vendored in order to fix its dependence on the window global [cds 2020/08/04]\n * otherwise unchanged from https://github.com/jarek-foksa/geometry-polyfill/tree/f36bbc8f4bc43539d980687904ce46c8e915543d\n */\n\n// @info\n// DOMPoint polyfill\n// @src\n// https://drafts.fxtf.org/geometry/#DOMPoint\n// https://github.com/chromium/chromium/blob/master/third_party/blink/renderer/core/geometry/dom_point_read_only.cc\nclass DOMPoint {\n constructor(x = 0, y = 0, z = 0, w = 1) {\n this.x = x\n this.y = y\n this.z = z\n this.w = w\n }\n\n static fromPoint(otherPoint) {\n return new DOMPoint(\n otherPoint.x,\n otherPoint.y,\n otherPoint.z !== undefined ? otherPoint.z : 0,\n otherPoint.w !== undefined ? otherPoint.w : 1,\n )\n }\n\n matrixTransform(matrix) {\n if ((matrix.is2D || matrix instanceof SVGMatrix) && this.z === 0 && this.w === 1) {\n return new DOMPoint(\n this.x * matrix.a + this.y * matrix.c + matrix.e,\n this.x * matrix.b + this.y * matrix.d + matrix.f,\n 0,\n 1,\n )\n } else {\n return new DOMPoint(\n this.x * matrix.m11 + this.y * matrix.m21 + this.z * matrix.m31 + this.w * matrix.m41,\n this.x * matrix.m12 + this.y * matrix.m22 + this.z * matrix.m32 + this.w * matrix.m42,\n this.x * matrix.m13 + this.y * matrix.m23 + this.z * matrix.m33 + this.w * matrix.m43,\n this.x * matrix.m14 + this.y * matrix.m24 + this.z * matrix.m34 + this.w * matrix.m44,\n )\n }\n }\n\n toJSON() {\n return {\n x: this.x,\n y: this.y,\n z: this.z,\n w: this.w,\n }\n }\n}\n\n// @info\n// DOMRect polyfill\n// @src\n// https://drafts.fxtf.org/geometry/#DOMRect\n// https://github.com/chromium/chromium/blob/master/third_party/blink/renderer/core/geometry/dom_rect_read_only.cc\n\nclass DOMRect {\n constructor(x = 0, y = 0, width = 0, height = 0) {\n this.x = x\n this.y = y\n this.width = width\n this.height = height\n }\n\n static fromRect(otherRect) {\n return new DOMRect(otherRect.x, otherRect.y, otherRect.width, otherRect.height)\n }\n\n get top() {\n return this.y\n }\n\n get left() {\n return this.x\n }\n\n get right() {\n return this.x + this.width\n }\n\n get bottom() {\n return this.y + this.height\n }\n\n toJSON() {\n return {\n x: this.x,\n y: this.y,\n width: this.width,\n height: this.height,\n top: this.top,\n left: this.left,\n right: this.right,\n bottom: this.bottom,\n }\n }\n}\n\nfor (const propertyName of ['top', 'right', 'bottom', 'left']) {\n const propertyDescriptor = Object.getOwnPropertyDescriptor(DOMRect.prototype, propertyName)\n propertyDescriptor.enumerable = true\n Object.defineProperty(DOMRect.prototype, propertyName, propertyDescriptor)\n}\n\n// @info\n// DOMMatrix polyfill (SVG 2)\n// @src\n// https://github.com/chromium/chromium/blob/master/third_party/blink/renderer/core/geometry/dom_matrix_read_only.cc\n// https://github.com/tocharomera/generativecanvas/blob/master/node-canvas/lib/DOMMatrix.js\n\nconst M11 = 0,\n M12 = 1,\n M13 = 2,\n M14 = 3\nconst M21 = 4,\n M22 = 5,\n M23 = 6,\n M24 = 7\nconst M31 = 8,\n M32 = 9,\n M33 = 10,\n M34 = 11\nconst M41 = 12,\n M42 = 13,\n M43 = 14,\n M44 = 15\n\nconst A = M11,\n B = M12\nconst C = M21,\n D = M22\nconst E = M41,\n F = M42\n\nconst DEGREE_PER_RAD = 180 / Math.PI\nconst RAD_PER_DEGREE = Math.PI / 180\n\nconst VALUES = Symbol('values')\nconst IS_2D = Symbol('is2D')\n\nfunction parseMatrix(init) {\n let parsed = init.replace(/matrix\\(/, '').split(/,/, 7)\n\n if (parsed.length !== 6) {\n throw new Error(`Failed to parse ${init}`)\n }\n\n parsed = parsed.map(parseFloat)\n\n return [parsed[0], parsed[1], 0, 0, parsed[2], parsed[3], 0, 0, 0, 0, 1, 0, parsed[4], parsed[5], 0, 1]\n}\n\nfunction parseMatrix3d(init) {\n const parsed = init.replace(/matrix3d\\(/, '').split(/,/, 17)\n\n if (parsed.length !== 16) {\n throw new Error(`Failed to parse ${init}`)\n }\n\n return parsed.map(parseFloat)\n}\n\nfunction parseTransform(tform) {\n const type = tform.split(/\\(/, 1)[0]\n\n if (type === 'matrix') {\n return parseMatrix(tform)\n } else if (type === 'matrix3d') {\n return parseMatrix3d(tform)\n } else {\n throw new Error(`${type} parsing not implemented`)\n }\n}\n\nconst setNumber2D = (receiver, index, value) => {\n if (typeof value !== 'number') {\n throw new TypeError('Expected number')\n }\n\n receiver[VALUES][index] = value\n}\n\nconst setNumber3D = (receiver, index, value) => {\n if (typeof value !== 'number') {\n throw new TypeError('Expected number')\n }\n\n if (index === M33 || index === M44) {\n if (value !== 1) {\n receiver[IS_2D] = false\n }\n } else if (value !== 0) {\n receiver[IS_2D] = false\n }\n\n receiver[VALUES][index] = value\n}\n\nconst newInstance = (values) => {\n const instance = Object.create(DOMMatrix.prototype)\n instance.constructor = DOMMatrix\n instance[IS_2D] = true\n instance[VALUES] = values\n\n return instance\n}\n\nconst multiply = (first, second) => {\n const dest = new Float64Array(16)\n\n for (let i = 0; i < 4; i++) {\n for (let j = 0; j < 4; j++) {\n let sum = 0\n\n for (let k = 0; k < 4; k++) {\n sum += first[i * 4 + k] * second[k * 4 + j]\n }\n\n dest[i * 4 + j] = sum\n }\n }\n\n return dest\n}\n\nclass DOMMatrix {\n get m11() {\n return this[VALUES][M11]\n }\n set m11(value) {\n setNumber2D(this, M11, value)\n }\n get m12() {\n return this[VALUES][M12]\n }\n set m12(value) {\n setNumber2D(this, M12, value)\n }\n get m13() {\n return this[VALUES][M13]\n }\n set m13(value) {\n setNumber3D(this, M13, value)\n }\n get m14() {\n return this[VALUES][M14]\n }\n set m14(value) {\n setNumber3D(this, M14, value)\n }\n get m21() {\n return this[VALUES][M21]\n }\n set m21(value) {\n setNumber2D(this, M21, value)\n }\n get m22() {\n return this[VALUES][M22]\n }\n set m22(value) {\n setNumber2D(this, M22, value)\n }\n get m23() {\n return this[VALUES][M23]\n }\n set m23(value) {\n setNumber3D(this, M23, value)\n }\n get m24() {\n return this[VALUES][M24]\n }\n set m24(value) {\n setNumber3D(this, M24, value)\n }\n get m31() {\n return this[VALUES][M31]\n }\n set m31(value) {\n setNumber3D(this, M31, value)\n }\n get m32() {\n return this[VALUES][M32]\n }\n set m32(value) {\n setNumber3D(this, M32, value)\n }\n get m33() {\n return this[VALUES][M33]\n }\n set m33(value) {\n setNumber3D(this, M33, value)\n }\n get m34() {\n return this[VALUES][M34]\n }\n set m34(value) {\n setNumber3D(this, M34, value)\n }\n get m41() {\n return this[VALUES][M41]\n }\n set m41(value) {\n setNumber2D(this, M41, value)\n }\n get m42() {\n return this[VALUES][M42]\n }\n set m42(value) {\n setNumber2D(this, M42, value)\n }\n get m43() {\n return this[VALUES][M43]\n }\n set m43(value) {\n setNumber3D(this, M43, value)\n }\n get m44() {\n return this[VALUES][M44]\n }\n set m44(value) {\n setNumber3D(this, M44, value)\n }\n\n get a() {\n return this[VALUES][A]\n }\n set a(value) {\n setNumber2D(this, A, value)\n }\n get b() {\n return this[VALUES][B]\n }\n set b(value) {\n setNumber2D(this, B, value)\n }\n get c() {\n return this[VALUES][C]\n }\n set c(value) {\n setNumber2D(this, C, value)\n }\n get d() {\n return this[VALUES][D]\n }\n set d(value) {\n setNumber2D(this, D, value)\n }\n get e() {\n return this[VALUES][E]\n }\n set e(value) {\n setNumber2D(this, E, value)\n }\n get f() {\n return this[VALUES][F]\n }\n set f(value) {\n setNumber2D(this, F, value)\n }\n\n get is2D() {\n return this[IS_2D]\n }\n\n get isIdentity() {\n const values = this[VALUES]\n\n return (\n values[M11] === 1 &&\n values[M12] === 0 &&\n values[M13] === 0 &&\n values[M14] === 0 &&\n values[M21] === 0 &&\n values[M22] === 1 &&\n values[M23] === 0 &&\n values[M24] === 0 &&\n values[M31] === 0 &&\n values[M32] === 0 &&\n values[M33] === 1 &&\n values[M34] === 0 &&\n values[M41] === 0 &&\n values[M42] === 0 &&\n values[M43] === 0 &&\n values[M44] === 1\n )\n }\n\n static fromMatrix(init) {\n if (init instanceof DOMMatrix) {\n return new DOMMatrix(init[VALUES])\n } else if (init instanceof SVGMatrix) {\n return new DOMMatrix([init.a, init.b, init.c, init.d, init.e, init.f])\n } else {\n throw new TypeError('Expected DOMMatrix')\n }\n }\n\n static fromFloat32Array(init) {\n if (!(init instanceof Float32Array)) throw new TypeError('Expected Float32Array')\n return new DOMMatrix(init)\n }\n\n static fromFloat64Array(init) {\n if (!(init instanceof Float64Array)) throw new TypeError('Expected Float64Array')\n return new DOMMatrix(init)\n }\n\n // @type\n // (Float64Array) => void\n constructor(init) {\n this[IS_2D] = true\n\n this[VALUES] = new Float64Array([1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1])\n\n // Parse CSS transformList\n if (typeof init === 'string') {\n if (init === '') {\n return\n } else {\n const tforms = init.split(/\\)\\s+/, 20).map(parseTransform)\n\n if (tforms.length === 0) {\n return\n }\n\n init = tforms[0]\n\n for (let i = 1; i < tforms.length; i++) {\n init = multiply(tforms[i], init)\n }\n }\n }\n\n let i = 0\n\n if (init && init.length === 6) {\n setNumber2D(this, A, init[i++])\n setNumber2D(this, B, init[i++])\n setNumber2D(this, C, init[i++])\n setNumber2D(this, D, init[i++])\n setNumber2D(this, E, init[i++])\n setNumber2D(this, F, init[i++])\n } else if (init && init.length === 16) {\n setNumber2D(this, M11, init[i++])\n setNumber2D(this, M12, init[i++])\n setNumber3D(this, M13, init[i++])\n setNumber3D(this, M14, init[i++])\n setNumber2D(this, M21, init[i++])\n setNumber2D(this, M22, init[i++])\n setNumber3D(this, M23, init[i++])\n setNumber3D(this, M24, init[i++])\n setNumber3D(this, M31, init[i++])\n setNumber3D(this, M32, init[i++])\n setNumber3D(this, M33, init[i++])\n setNumber3D(this, M34, init[i++])\n setNumber2D(this, M41, init[i++])\n setNumber2D(this, M42, init[i++])\n setNumber3D(this, M43, init[i++])\n setNumber3D(this, M44, init[i])\n } else if (init !== undefined) {\n throw new TypeError('Expected string or array.')\n }\n }\n\n dump() {\n const mat = this[VALUES]\n console.info([mat.slice(0, 4), mat.slice(4, 8), mat.slice(8, 12), mat.slice(12, 16)])\n }\n\n [inspect.custom](depth) {\n if (depth < 0) return '[DOMMatrix]'\n\n const { a, b, c, d, e, f, is2D, isIdentity } = this\n if (this.is2D) {\n return `DOMMatrix ${inspect({ a, b, c, d, e, f, is2D, isIdentity }, { colors: true })}`\n } else {\n const { m11, m12, m13, m14, m21, m22, m23, m24, m31, m32, m33, m34, m41, m42, m43, m44, is2D, isIdentity } = this\n return `DOMMatrix ${inspect(\n {\n a,\n b,\n c,\n d,\n e,\n f,\n m11,\n m12,\n m13,\n m14,\n m21,\n m22,\n m23,\n m24,\n m31,\n m32,\n m33,\n m34,\n m41,\n m42,\n m43,\n m44,\n is2D,\n isIdentity,\n },\n { colors: true },\n )}`\n }\n }\n\n multiply(other) {\n return newInstance(this[VALUES]).multiplySelf(other)\n }\n\n multiplySelf(other) {\n this[VALUES] = multiply(other[VALUES], this[VALUES])\n\n if (!other.is2D) {\n this[IS_2D] = false\n }\n\n return this\n }\n\n preMultiplySelf(other) {\n this[VALUES] = multiply(this[VALUES], other[VALUES])\n\n if (!other.is2D) {\n this[IS_2D] = false\n }\n\n return this\n }\n\n translate(tx, ty, tz) {\n return newInstance(this[VALUES]).translateSelf(tx, ty, tz)\n }\n\n translateSelf(tx = 0, ty = 0, tz = 0) {\n this[VALUES] = multiply([1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, tx, ty, tz, 1], this[VALUES])\n\n if (tz !== 0) {\n this[IS_2D] = false\n }\n\n return this\n }\n\n scale(scaleX, scaleY, scaleZ, originX, originY, originZ) {\n return newInstance(this[VALUES]).scaleSelf(scaleX, scaleY, scaleZ, originX, originY, originZ)\n }\n\n scale3d(scale, originX, originY, originZ) {\n return newInstance(this[VALUES]).scale3dSelf(scale, originX, originY, originZ)\n }\n\n scale3dSelf(scale, originX, originY, originZ) {\n return this.scaleSelf(scale, scale, scale, originX, originY, originZ)\n }\n\n scaleSelf(scaleX, scaleY, scaleZ, originX, originY, originZ) {\n // Not redundant with translate's checks because we need to negate the values later.\n if (typeof originX !== 'number') originX = 0\n if (typeof originY !== 'number') originY = 0\n if (typeof originZ !== 'number') originZ = 0\n\n this.translateSelf(originX, originY, originZ)\n\n if (typeof scaleX !== 'number') scaleX = 1\n if (typeof scaleY !== 'number') scaleY = scaleX\n if (typeof scaleZ !== 'number') scaleZ = 1\n\n this[VALUES] = multiply([scaleX, 0, 0, 0, 0, scaleY, 0, 0, 0, 0, scaleZ, 0, 0, 0, 0, 1], this[VALUES])\n\n this.translateSelf(-originX, -originY, -originZ)\n\n if (scaleZ !== 1 || originZ !== 0) {\n this[IS_2D] = false\n }\n\n return this\n }\n\n rotateFromVector(x, y) {\n return newInstance(this[VALUES]).rotateFromVectorSelf(x, y)\n }\n\n rotateFromVectorSelf(x = 0, y = 0) {\n const theta = x === 0 && y === 0 ? 0 : Math.atan2(y, x) * DEGREE_PER_RAD\n return this.rotateSelf(theta)\n }\n\n rotate(rotX, rotY, rotZ) {\n return newInstance(this[VALUES]).rotateSelf(rotX, rotY, rotZ)\n }\n\n rotateSelf(rotX, rotY, rotZ) {\n if (rotY === undefined && rotZ === undefined) {\n rotZ = rotX\n rotX = rotY = 0\n }\n\n if (typeof rotY !== 'number') rotY = 0\n if (typeof rotZ !== 'number') rotZ = 0\n\n if (rotX !== 0 || rotY !== 0) {\n this[IS_2D] = false\n }\n\n rotX *= RAD_PER_DEGREE\n rotY *= RAD_PER_DEGREE\n rotZ *= RAD_PER_DEGREE\n\n let c = Math.cos(rotZ)\n let s = Math.sin(rotZ)\n\n this[VALUES] = multiply([c, s, 0, 0, -s, c, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], this[VALUES])\n\n c = Math.cos(rotY)\n s = Math.sin(rotY)\n\n this[VALUES] = multiply([c, 0, -s, 0, 0, 1, 0, 0, s, 0, c, 0, 0, 0, 0, 1], this[VALUES])\n\n c = Math.cos(rotX)\n s = Math.sin(rotX)\n\n this[VALUES] = multiply([1, 0, 0, 0, 0, c, s, 0, 0, -s, c, 0, 0, 0, 0, 1], this[VALUES])\n\n return this\n }\n\n rotateAxisAngle(x, y, z, angle) {\n return newInstance(this[VALUES]).rotateAxisAngleSelf(x, y, z, angle)\n }\n\n rotateAxisAngleSelf(x = 0, y = 0, z = 0, angle = 0) {\n const length = Math.sqrt(x * x + y * y + z * z)\n\n if (length === 0) {\n return this\n }\n\n if (length !== 1) {\n x /= length\n y /= length\n z /= length\n }\n\n angle *= RAD_PER_DEGREE\n\n const c = Math.cos(angle)\n const s = Math.sin(angle)\n const t = 1 - c\n const tx = t * x\n const ty = t * y\n\n this[VALUES] = multiply(\n [\n tx * x + c,\n tx * y + s * z,\n tx * z - s * y,\n 0,\n tx * y - s * z,\n ty * y + c,\n ty * z + s * x,\n 0,\n tx * z + s * y,\n ty * z - s * x,\n t * z * z + c,\n 0,\n 0,\n 0,\n 0,\n 1,\n ],\n this[VALUES],\n )\n\n if (x !== 0 || y !== 0) {\n this[IS_2D] = false\n }\n\n return this\n }\n\n skewX(sx) {\n return newInstance(this[VALUES]).skewXSelf(sx)\n }\n\n skewXSelf(sx) {\n if (typeof sx !== 'number') {\n return this\n }\n\n const t = Math.tan(sx * RAD_PER_DEGREE)\n\n this[VALUES] = multiply([1, 0, 0, 0, t, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], this[VALUES])\n\n return this\n }\n\n skewY(sy) {\n return newInstance(this[VALUES]).skewYSelf(sy)\n }\n\n skewYSelf(sy) {\n if (typeof sy !== 'number') {\n return this\n }\n\n const t = Math.tan(sy * RAD_PER_DEGREE)\n\n this[VALUES] = multiply([1, t, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], this[VALUES])\n\n return this\n }\n\n flipX() {\n return newInstance(multiply([-1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], this[VALUES]))\n }\n\n flipY() {\n return newInstance(multiply([1, 0, 0, 0, 0, -1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], this[VALUES]))\n }\n\n inverse() {\n return newInstance(this[VALUES].slice()).invertSelf()\n }\n\n invertSelf() {\n if (this[IS_2D]) {\n const det = this[VALUES][A] * this[VALUES][D] - this[VALUES][B] * this[VALUES][C]\n\n // Invertable\n if (det !== 0) {\n const newA = this[VALUES][D] / det\n const newB = -this[VALUES][B] / det\n const newC = -this[VALUES][C] / det\n const newD = this[VALUES][A] / det\n const newE = (this[VALUES][C] * this[VALUES][F] - this[VALUES][D] * this[VALUES][E]) / det\n const newF = (this[VALUES][B] * this[VALUES][E] - this[VALUES][A] * this[VALUES][F]) / det\n\n this.a = newA\n this.b = newB\n this.c = newC\n this.d = newD\n this.e = newE\n this.f = newF\n\n return this\n }\n\n // Not invertable\n else {\n this[IS_2D] = false\n\n this[VALUES] = [NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN]\n\n return this\n }\n } else {\n throw new Error('3D matrix inversion is not implemented.')\n }\n }\n\n setMatrixValue(transformList) {\n const temp = new DOMMatrix(transformList)\n\n this[VALUES] = temp[VALUES]\n this[IS_2D] = temp[IS_2D]\n\n return this\n }\n\n transformPoint(point) {\n const x = point.x || 0\n const y = point.y || 0\n const z = point.z || 0\n const w = point.w || 1\n\n const values = this[VALUES]\n\n const nx = values[M11] * x + values[M21] * y + values[M31] * z + values[M41] * w\n const ny = values[M12] * x + values[M22] * y + values[M32] * z + values[M42] * w\n const nz = values[M13] * x + values[M23] * y + values[M33] * z + values[M43] * w\n const nw = values[M14] * x + values[M24] * y + values[M34] * z + values[M44] * w\n\n return new DOMPoint(nx, ny, nz, nw)\n }\n\n toFloat32Array() {\n return Float32Array.from(this[VALUES])\n }\n\n toFloat64Array() {\n return this[VALUES].slice(0)\n }\n\n toJSON() {\n return {\n a: this.a,\n b: this.b,\n c: this.c,\n d: this.d,\n e: this.e,\n f: this.f,\n m11: this.m11,\n m12: this.m12,\n m13: this.m13,\n m14: this.m14,\n m21: this.m21,\n m22: this.m22,\n m23: this.m23,\n m24: this.m24,\n m31: this.m31,\n m32: this.m32,\n m33: this.m33,\n m34: this.m34,\n m41: this.m41,\n m42: this.m42,\n m43: this.m43,\n m44: this.m44,\n is2D: this.is2D,\n isIdentity: this.isIdentity,\n }\n }\n\n toString() {\n if (this.is2D) {\n return `matrix(${this.a}, ${this.b}, ${this.c}, ${this.d}, ${this.e}, ${this.f})`\n } else {\n return `matrix3d(${this[VALUES].join(', ')})`\n }\n }\n}\n\nfor (const propertyName of [\n 'a',\n 'b',\n 'c',\n 'd',\n 'e',\n 'f',\n 'm11',\n 'm12',\n 'm13',\n 'm14',\n 'm21',\n 'm22',\n 'm23',\n 'm24',\n 'm31',\n 'm32',\n 'm33',\n 'm34',\n 'm41',\n 'm42',\n 'm43',\n 'm44',\n 'is2D',\n 'isIdentity',\n]) {\n const propertyDescriptor = Object.getOwnPropertyDescriptor(DOMMatrix.prototype, propertyName)\n propertyDescriptor.enumerable = true\n Object.defineProperty(DOMMatrix.prototype, propertyName, propertyDescriptor)\n}\n\nmodule.exports = { DOMPoint, DOMMatrix, DOMRect }\n","const fs = require('fs')\nconst { Readable } = require('stream')\nconst { URL } = require('url')\n\nconst { Image } = require('./js-binding')\n\nlet http, https\n\nconst MAX_REDIRECTS = 20\nconst REDIRECT_STATUSES = new Set([301, 302])\n\n/**\n * Loads the given source into canvas Image\n * @param {string|URL|Image|Buffer} source The image source to be loaded\n * @param {object} options Options passed to the loader\n */\nmodule.exports = async function loadImage(source, options = {}) {\n // use the same buffer without copying if the source is a buffer\n if (Buffer.isBuffer(source) || source instanceof Uint8Array) return createImage(source, options.alt)\n // load readable stream as image\n if (source instanceof Readable) return createImage(await consumeStream(source), options.alt)\n // construct a Uint8Array if the source is ArrayBuffer or SharedArrayBuffer\n if (source instanceof ArrayBuffer || source instanceof SharedArrayBuffer)\n return createImage(new Uint8Array(source), options.alt)\n // construct a buffer if the source is buffer-like\n if (isBufferLike(source)) return createImage(Buffer.from(source), options.alt)\n // if the source is Image instance, copy the image src to new image\n if (source instanceof Image) return createImage(source.src, options.alt)\n // if source is string and in data uri format, construct image using data uri\n if (typeof source === 'string' && source.trimStart().startsWith('data:')) {\n const commaIdx = source.indexOf(',')\n const encoding = source.lastIndexOf('base64', commaIdx) < 0 ? 'utf-8' : 'base64'\n const data = Buffer.from(source.slice(commaIdx + 1), encoding)\n // Empty payload would silently complete on Image (HTML spec) and the loadImage\n // promise would never settle; reject upfront instead.\n // See https://github.com/Brooooooklyn/canvas/issues/1255\n if (data.length === 0) throw new Error(`Invalid data URI: empty payload in ${source.slice(0, 64)}`)\n return createImage(data, options.alt)\n }\n // if source is a string or URL instance\n if (typeof source === 'string') {\n // if the source exists as a file, construct image from that file\n if (!source.startsWith('http') && !source.startsWith('https') && (await exists(source))) {\n return createImage(source, options.alt)\n } else {\n // the source is a remote url here\n source = new URL(source)\n // attempt to download the remote source and construct image\n const data = await new Promise((resolve, reject) =>\n makeRequest(\n source,\n resolve,\n reject,\n typeof options.maxRedirects === 'number' && options.maxRedirects >= 0 ? options.maxRedirects : MAX_REDIRECTS,\n options.requestOptions,\n ),\n )\n return createImage(data, options.alt)\n }\n }\n\n if (source instanceof URL) {\n if (source.protocol === 'file:') {\n // remove the leading slash on windows\n return createImage(process.platform === 'win32' ? source.pathname.substring(1) : source.pathname, options.alt)\n } else {\n const data = await new Promise((resolve, reject) =>\n makeRequest(\n source,\n resolve,\n reject,\n typeof options.maxRedirects === 'number' && options.maxRedirects >= 0 ? options.maxRedirects : MAX_REDIRECTS,\n options.requestOptions,\n ),\n )\n return createImage(data, options.alt)\n }\n }\n\n // throw error as don't support that source\n throw new TypeError('unsupported image source')\n}\n\nfunction makeRequest(url, resolve, reject, redirectCount, requestOptions) {\n const isHttps = url.protocol === 'https:'\n // lazy load the lib\n const lib = isHttps ? (!https ? (https = require('https')) : https) : !http ? (http = require('http')) : http\n\n lib\n .get(url.toString(), requestOptions || {}, (res) => {\n try {\n const shouldRedirect = REDIRECT_STATUSES.has(res.statusCode) && typeof res.headers.location === 'string'\n if (shouldRedirect && redirectCount > 0)\n return makeRequest(\n new URL(res.headers.location, url.origin),\n resolve,\n reject,\n redirectCount - 1,\n requestOptions,\n )\n if (typeof res.statusCode === 'number' && (res.statusCode < 200 || res.statusCode >= 300)) {\n return reject(new Error(`remote source rejected with status code ${res.statusCode}`))\n }\n\n consumeStream(res).then(resolve, reject)\n } catch (err) {\n reject(err)\n }\n })\n .on('error', reject)\n}\n\n// use stream/consumers in the future?\nfunction consumeStream(res) {\n return new Promise((resolve, reject) => {\n const chunks = []\n\n res.on('data', (chunk) => chunks.push(chunk))\n res.on('end', () => resolve(Buffer.concat(chunks)))\n res.on('error', reject)\n })\n}\n\nasync function createImage(src, alt) {\n // Empty Buffer / Uint8Array: Image follows the HTML spec (silent completion,\n // no events) so the promise below would hang. Reject upfront.\n // See https://github.com/Brooooooklyn/canvas/issues/1255\n if ((Buffer.isBuffer(src) || src instanceof Uint8Array) && src.length === 0) {\n throw new Error('loadImage: empty image data')\n }\n\n const image = new Image()\n if (typeof alt === 'string') image.alt = alt\n\n return new Promise((resolve, reject) => {\n image.onload = () => {\n // Wait for bitmap decode before resolving\n image.decode().then(() => resolve(image), reject)\n }\n image.onerror = (e) => reject(e)\n image.src = src\n })\n}\n\nfunction isBufferLike(src) {\n return (src && src.type === 'Buffer') || Array.isArray(src)\n}\n\nasync function exists(path) {\n try {\n await fs.promises.access(path, fs.constants.F_OK)\n return true\n } catch {\n return false\n }\n}\n","const { platform, homedir } = require('os')\nconst { join } = require('path')\n\nconst {\n clearAllCache,\n CanvasRenderingContext2D,\n CanvasElement,\n SVGCanvas,\n Path: Path2D,\n ImageData,\n Image,\n FontKey,\n GlobalFonts,\n PathOp,\n FillType,\n StrokeJoin,\n StrokeCap,\n convertSVGTextToPath,\n PdfDocument,\n GifEncoder,\n GifDisposal,\n LottieAnimation,\n} = require('./js-binding')\n\nconst { DOMPoint, DOMMatrix, DOMRect } = require('./geometry')\n\nconst loadImage = require('./load-image')\n\n// Add Symbol.dispose support for GifEncoder (ECMAScript 2024 Explicit Resource Management)\nif (GifEncoder && typeof Symbol.dispose !== 'undefined') {\n GifEncoder.prototype[Symbol.dispose] = function () {\n this.dispose()\n }\n}\n\nconst SvgExportFlag = {\n ConvertTextToPaths: 0x01,\n NoPrettyXML: 0x02,\n RelativePathEncoding: 0x04,\n}\n\nif (!('families' in GlobalFonts)) {\n Object.defineProperty(GlobalFonts, 'families', {\n get: function () {\n return JSON.parse(GlobalFonts.getFamilies().toString())\n },\n })\n}\n\nif (!('has' in GlobalFonts)) {\n Object.defineProperty(GlobalFonts, 'has', {\n value: function has(name) {\n return !!JSON.parse(GlobalFonts.getFamilies().toString()).find(({ family }) => family === name)\n },\n configurable: false,\n enumerable: false,\n writable: false,\n })\n}\n\nconst _toBlob = CanvasElement.prototype.toBlob\nconst _convertToBlob = CanvasElement.prototype.convertToBlob\nif ('Blob' in globalThis) {\n CanvasElement.prototype.toBlob = function toBlob(callback, mimeType, quality) {\n _toBlob.call(\n this,\n function (/** @type {Uint8Array} */ imageBuffer) {\n const blob = new Blob([imageBuffer.buffer], { type: mimeType })\n callback(blob)\n },\n mimeType,\n quality,\n )\n }\n CanvasElement.prototype.convertToBlob = function convertToBlob(options) {\n return _convertToBlob.call(this, options).then((/** @type {Uint8Array} */ imageBuffer) => {\n const blob = new Blob([imageBuffer.buffer], { type: options?.mime || 'image/png' })\n return blob\n })\n }\n} else {\n // oxlint-disable-next-line no-unused-vars\n CanvasElement.prototype.toBlob = function toBlob(callback, mimeType, quality) {\n callback(null)\n }\n // oxlint-disable-next-line no-unused-vars\n CanvasElement.prototype.convertToBlob = function convertToBlob(options) {\n return Promise.reject(new Error('Blob is not supported in this environment'))\n }\n}\n\nconst _getTransform = CanvasRenderingContext2D.prototype.getTransform\n\nCanvasRenderingContext2D.prototype.getTransform = function getTransform() {\n const transform = _getTransform.apply(this, arguments)\n // monkey patched, skip\n if (transform instanceof DOMMatrix) {\n return transform\n }\n const { a, b, c, d, e, f } = transform\n return new DOMMatrix([a, b, c, d, e, f])\n}\n\n// Workaround for webpack bundling issue with drawImage\n// Store the original drawImage method\nconst _drawImage = CanvasRenderingContext2D.prototype.drawImage\n\n// Override drawImage to ensure proper type recognition in bundled environments\nCanvasRenderingContext2D.prototype.drawImage = function drawImage(image, ...args) {\n // If the image is a Canvas-like object but not recognized due to bundling,\n // we need to ensure it's properly identified\n if (image && typeof image === 'object') {\n // First check if it's a wrapped canvas object\n if (image.canvas instanceof CanvasElement || image.canvas instanceof SVGCanvas) {\n image = image.canvas\n } else if (image._canvas instanceof CanvasElement || image._canvas instanceof SVGCanvas) {\n image = image._canvas\n }\n // Then check if it's a Canvas-like object by checking for getContext method\n else if (typeof image.getContext === 'function' && image.width && image.height) {\n // If it has canvas properties but isn't recognized as CanvasElement or SVGCanvas,\n // try to correct the prototype chain\n if (!(image instanceof CanvasElement) && !(image instanceof SVGCanvas)) {\n // Try to create a proper CanvasElement from the canvas-like object\n // This helps when webpack has transformed the prototype chain\n Object.setPrototypeOf(image, CanvasElement.prototype)\n }\n }\n }\n\n // Call the original drawImage with the potentially corrected image\n return _drawImage.apply(this, [image, ...args])\n}\n\nfunction createCanvas(width, height, flag) {\n const isSvgBackend = typeof flag !== 'undefined'\n return isSvgBackend ? new SVGCanvas(width, height, flag) : new CanvasElement(width, height)\n}\n\nclass Canvas {\n constructor(width, height, flag) {\n return createCanvas(width, height, flag)\n }\n\n static [Symbol.hasInstance](instance) {\n return instance instanceof CanvasElement || instance instanceof SVGCanvas\n }\n}\n\nif (!process.env.DISABLE_SYSTEM_FONTS_LOAD) {\n GlobalFonts.loadSystemFonts()\n const platformName = platform()\n const homedirPath = homedir()\n switch (platformName) {\n case 'win32':\n GlobalFonts.loadFontsFromDir(join(homedirPath, 'AppData', 'Local', 'Microsoft', 'Windows', 'Fonts'))\n break\n case 'darwin':\n GlobalFonts.loadFontsFromDir(join(homedirPath, 'Library', 'Fonts'))\n break\n case 'linux':\n GlobalFonts.loadFontsFromDir(join('usr', 'local', 'share', 'fonts'))\n GlobalFonts.loadFontsFromDir(join(homedirPath, '.fonts'))\n break\n }\n}\n\nmodule.exports = {\n clearAllCache,\n Canvas,\n createCanvas,\n Path2D,\n ImageData,\n Image,\n PathOp,\n FillType,\n StrokeCap,\n StrokeJoin,\n SvgExportFlag,\n GlobalFonts: GlobalFonts,\n convertSVGTextToPath,\n DOMPoint,\n DOMMatrix,\n DOMRect,\n loadImage,\n FontKey,\n // Export these for better webpack compatibility\n CanvasElement,\n SVGCanvas,\n PDFDocument: PdfDocument,\n // GIF encoding\n GifEncoder,\n GifDisposal,\n // Lottie animation\n LottieAnimation,\n}\n"],"x_google_ignoreList":[0,1,2,3],"mappings":"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"}
@@ -1,4 +0,0 @@
1
- import "./spinner-D9lrHr8s.mjs";
2
- import "./progress-bar-oJwq22CR.mjs";
3
- import "./multi-progress-CIRjrzma.mjs";
4
- export {};
@@ -1,376 +0,0 @@
1
- import { i as __require, n as __esmMin } from "./chunk-BSw8zbkd.mjs";
2
- import { s as renderTerminalPng, t as init_src } from "./src-iDwu25UD.mjs";
3
- //#region ../termless/src/compare.ts
4
- /**
5
- * Read PNG width + height from header bytes. PNG IHDR is at offset 16
6
- * (4-byte big-endian width, 4-byte big-endian height).
7
- */
8
- function pngDimensions(png) {
9
- const view = new DataView(png.buffer, png.byteOffset, png.byteLength);
10
- return {
11
- width: view.getUint32(16, false),
12
- height: view.getUint32(20, false)
13
- };
14
- }
15
- /**
16
- * Capture the same terminal buffer state via canvas, SVG, and (optionally)
17
- * peekaboo. Returns the three PNGs + a comparison report.
18
- *
19
- * Caller is responsible for putting the terminal into the desired state
20
- * via `feed()` or `spawn()` before invoking this.
21
- */
22
- async function captureCrossRenderer(terminal, options = {}) {
23
- const notes = [];
24
- const canvasResult = await renderTerminalPng(terminal, {
25
- returnMeta: true,
26
- ...options.cols != null ? { cols: options.cols } : {},
27
- ...options.rows != null ? { rows: options.rows } : {},
28
- ...options.theme ? { theme: options.theme } : {},
29
- ...options.fontPath ? { fontPath: options.fontPath } : {},
30
- ...options.fontSize ? { fontSize: options.fontSize } : {},
31
- ...options.fontFamily ? { fontFamily: options.fontFamily } : {}
32
- });
33
- const canvasBytes = canvasResult.png;
34
- const canvasMeta = canvasResult.meta;
35
- const measuredCellWidth = canvasMeta.cellWidth || 9.6;
36
- const measuredCellHeight = canvasMeta.cellHeight || 20;
37
- const svgString = terminal.screenshotSvg({
38
- ...options.theme ? { theme: {
39
- foreground: options.theme.foreground,
40
- background: options.theme.background
41
- } } : {},
42
- cellWidth: options.cellWidth ?? measuredCellWidth,
43
- cellHeight: options.cellHeight ?? measuredCellHeight,
44
- ...options.fontFamily ? { fontFamily: options.fontFamily } : {}
45
- });
46
- const svgBytes = new TextEncoder().encode(svgString);
47
- let peekabooBytes;
48
- if (options.includePeekaboo) if (process.platform !== "darwin") notes.push("peekaboo skipped: requires macOS");
49
- else if (!options.command) notes.push("peekaboo skipped: `command` not provided (needed to re-run in real terminal)");
50
- else try {
51
- peekabooBytes = await captureRealTerminal({
52
- app: options.peekabooApp ?? "ghostty",
53
- command: options.command,
54
- waitMs: 2500,
55
- ...options.cropChrome != null ? { cropChrome: options.cropChrome } : {},
56
- ...options.ghosttyConfig ? { ghosttyConfig: options.ghosttyConfig } : {},
57
- ...options.peekabooEnv ? { env: options.peekabooEnv } : {},
58
- ...options.peekabooCwd ? { cwd: options.peekabooCwd } : {}
59
- });
60
- } catch (err) {
61
- notes.push(`peekaboo failed: ${err instanceof Error ? err.message : String(err)}`);
62
- }
63
- const canvasDim = pngDimensions(canvasBytes);
64
- let svgDim = null;
65
- const m = svgString.match(/<svg[^>]+width="(\d+)"[^>]+height="(\d+)"/);
66
- if (m) svgDim = {
67
- width: Number.parseInt(m[1], 10),
68
- height: Number.parseInt(m[2], 10)
69
- };
70
- const peekDim = peekabooBytes ? pngDimensions(peekabooBytes) : null;
71
- const logical = {
72
- canvas: canvasDim,
73
- svg: svgDim,
74
- peekaboo: peekDim
75
- };
76
- let canvasHash = null;
77
- let peekHash = null;
78
- if (process.platform === "darwin") {
79
- try {
80
- canvasHash = await dHash(canvasBytes);
81
- } catch {}
82
- if (peekabooBytes) try {
83
- peekHash = await dHash(peekabooBytes);
84
- } catch {}
85
- }
86
- const report = {
87
- dimensions: {
88
- canvas: canvasDim,
89
- svg: svgDim,
90
- peekaboo: peekDim
91
- },
92
- logical,
93
- textEquality: true,
94
- hashes: {
95
- canvas: canvasHash,
96
- peekaboo: peekHash
97
- },
98
- hashDistances: { canvasVsPeekaboo: canvasHash && peekHash ? hashDistance(canvasHash, peekHash) : null },
99
- notes
100
- };
101
- if (options.saveTo) {
102
- const { mkdirSync, writeFileSync } = await import("node:fs");
103
- const { join } = await import("node:path");
104
- mkdirSync(options.saveTo, { recursive: true });
105
- const canvasPath = join(options.saveTo, "canvas.png");
106
- const svgPngPath = join(options.saveTo, "svg.svg");
107
- const peekPath = join(options.saveTo, "peekaboo.png");
108
- const reportPath = join(options.saveTo, "report.json");
109
- writeFileSync(canvasPath, canvasBytes);
110
- writeFileSync(svgPngPath, svgString, "utf-8");
111
- if (peekabooBytes) writeFileSync(peekPath, peekabooBytes);
112
- writeFileSync(reportPath, JSON.stringify(report, null, 2));
113
- report.files = {
114
- canvas: canvasPath,
115
- svg: svgPngPath,
116
- ...peekabooBytes ? { peekaboo: peekPath } : {},
117
- report: reportPath
118
- };
119
- }
120
- return {
121
- canvas: canvasBytes,
122
- svg: svgBytes,
123
- peekaboo: peekabooBytes,
124
- report
125
- };
126
- }
127
- async function captureRealTerminal(opts) {
128
- const { spawnSync } = await import("node:child_process");
129
- const { mkdtempSync, readFileSync, rmSync, writeFileSync, chmodSync } = await import("node:fs");
130
- const { tmpdir } = await import("node:os");
131
- const { join } = await import("node:path");
132
- const bundle = APP_BUNDLE_NAMES[opts.app];
133
- const idsBefore = listWindowIds(opts.app);
134
- const cgIdsBefore = listCGWindowIds(bundle);
135
- const tmpDir = mkdtempSync(join(tmpdir(), "term-real-"));
136
- const script = join(tmpDir, "payload.sh");
137
- const envLines = opts.env ? Object.entries(opts.env).map(([k, v]) => `export ${k}=${JSON.stringify(v)}`) : [];
138
- const cdLine = opts.cwd ? `cd ${JSON.stringify(opts.cwd)}` : "";
139
- const cmdLine = opts.command[0] === "/bin/bash" && opts.command[1] === "-c" && opts.command.length === 3 ? opts.command[2] : opts.command.map((arg) => `'${arg.replace(/'/g, "'\\''")}'`).join(" ");
140
- writeFileSync(script, `#!/bin/bash\n${envLines.join("\n")}\n${cdLine}\n${cmdLine}\nsleep 60\n`);
141
- chmodSync(script, 493);
142
- let ghosttyConfigPath;
143
- if (opts.app === "ghostty") {
144
- ghosttyConfigPath = join(tmpDir, "ghostty.cfg");
145
- const cfgLines = [
146
- `command = ${script}`,
147
- "confirm-close-surface = false",
148
- "wait-after-command = false",
149
- "window-padding-x = 0",
150
- "window-padding-y = 0",
151
- ...opts.ghosttyConfig?.theme ? [`theme = ${opts.ghosttyConfig.theme}`] : [],
152
- ...opts.ghosttyConfig?.fontFamily ? [`font-family = ${opts.ghosttyConfig.fontFamily}`] : [],
153
- ...opts.ghosttyConfig?.fontSize != null ? [`font-size = ${opts.ghosttyConfig.fontSize}`] : [],
154
- ...opts.ghosttyConfig?.backgroundOpacity != null ? [`background-opacity = ${opts.ghosttyConfig.backgroundOpacity}`] : []
155
- ];
156
- writeFileSync(ghosttyConfigPath, cfgLines.join("\n") + "\n");
157
- }
158
- if (opts.app === "ghostty") {
159
- const args = [
160
- "-g",
161
- "-a",
162
- "Ghostty",
163
- "--args"
164
- ];
165
- if (ghosttyConfigPath) args.push(`--config-file=${ghosttyConfigPath}`);
166
- spawnSync("open", args, { stdio: "ignore" });
167
- } else if (opts.app === "kitty") spawnSync("open", [
168
- "-g",
169
- "-a",
170
- "kitty",
171
- "--args",
172
- script
173
- ], { stdio: "ignore" });
174
- else if (opts.app === "wezterm") spawnSync("open", [
175
- "-g",
176
- "-a",
177
- "WezTerm",
178
- "--args",
179
- "start",
180
- "--",
181
- "bash",
182
- "-c",
183
- script
184
- ], { stdio: "ignore" });
185
- else spawnSync("open", [
186
- "-g",
187
- "-a",
188
- bundle,
189
- script
190
- ], { stdio: "ignore" });
191
- let newId;
192
- for (let i = 0; i < 40 && !newId; i++) {
193
- await new Promise((r) => setTimeout(r, 200));
194
- newId = listWindowIds(opts.app).find((id) => !idsBefore.includes(id));
195
- }
196
- try {
197
- await new Promise((r) => setTimeout(r, opts.waitMs));
198
- spawnSync("osascript", ["-e", `tell application "${bundle}" to activate`], { stdio: "ignore" });
199
- await new Promise((r) => setTimeout(r, 300));
200
- const cgIds = listCGWindowIds(bundle);
201
- if (cgIds.length === 0) throw new Error(`captureRealTerminal: no ${bundle} windows visible (CGWindowList returned empty)`);
202
- const cgId = (cgIds.filter((id) => !cgIdsBefore.includes(id))[0] ?? cgIds.sort((a, b) => Number(a) - Number(b)).pop()).toString();
203
- const outPath = join(tmpDir, "capture.png");
204
- const cap = spawnSync("screencapture", [
205
- "-l",
206
- cgId,
207
- "-o",
208
- "-x",
209
- outPath
210
- ], { stdio: [
211
- "ignore",
212
- "ignore",
213
- "pipe"
214
- ] });
215
- if (cap.status !== 0) throw new Error(`screencapture -l ${cgId} failed: ${cap.stderr?.toString().trim()}`);
216
- const bytes = readFileSync(outPath);
217
- opts.cropChrome;
218
- return new Uint8Array(bytes.buffer, bytes.byteOffset, bytes.byteLength);
219
- } finally {
220
- try {
221
- spawnSync("pkill", ["-f", script], {
222
- stdio: "ignore",
223
- timeout: 2e3
224
- });
225
- } catch {}
226
- await new Promise((r) => setTimeout(r, 400));
227
- if (newId) spawnSync("osascript", ["-e", `tell application "${bundle}" to close (every window whose id is ${newId})`], {
228
- stdio: "ignore",
229
- timeout: 3e3
230
- });
231
- if (process.env.CROSS_RENDERER_DEBUG !== "1") rmSync(tmpDir, {
232
- recursive: true,
233
- force: true
234
- });
235
- else console.error(`[cross-renderer] preserved tmpDir: ${tmpDir}`);
236
- }
237
- }
238
- /** Compute a 64-bit difference hash for a PNG. Returns a 16-char hex string. */
239
- async function dHash(pngBytes) {
240
- const { spawnSync } = await import("node:child_process");
241
- const { mkdtempSync, writeFileSync, readFileSync, rmSync } = await import("node:fs");
242
- const { tmpdir } = await import("node:os");
243
- const { join } = await import("node:path");
244
- const tmp = mkdtempSync(join(tmpdir(), "dhash-"));
245
- try {
246
- const inPath = join(tmp, "in.png");
247
- const outPath = join(tmp, "out.png");
248
- writeFileSync(inPath, pngBytes);
249
- if (spawnSync("sips", [
250
- "-s",
251
- "format",
252
- "png",
253
- "-z",
254
- "8",
255
- "9",
256
- inPath,
257
- "--out",
258
- outPath
259
- ], { stdio: "ignore" }).status !== 0) return "0".repeat(16);
260
- readFileSync(outPath);
261
- const rawPath = join(tmp, "raw.bmp");
262
- if (spawnSync("sips", [
263
- "-s",
264
- "format",
265
- "bmp",
266
- outPath,
267
- "--out",
268
- rawPath
269
- ], { stdio: "ignore" }).status !== 0) return "0".repeat(16);
270
- const bmp = readFileSync(rawPath);
271
- const view = new DataView(bmp.buffer, bmp.byteOffset, bmp.byteLength);
272
- const pixOffset = view.getUint32(10, true);
273
- const width = view.getInt32(18, true);
274
- const height = view.getInt32(22, true);
275
- const bpp = view.getUint16(28, true);
276
- if (bpp !== 24 && bpp !== 32) return "0".repeat(16);
277
- const bytesPerPx = bpp / 8;
278
- const rowSize = Math.floor((bpp * width + 31) / 32) * 4;
279
- const gray = new Uint8Array(Math.abs(width) * Math.abs(height));
280
- for (let row = 0; row < Math.abs(height); row++) {
281
- const srcRow = height > 0 ? Math.abs(height) - 1 - row : row;
282
- for (let col = 0; col < Math.abs(width); col++) {
283
- const idx = pixOffset + srcRow * rowSize + col * bytesPerPx;
284
- const b = bmp[idx] ?? 0;
285
- const g = bmp[idx + 1] ?? 0;
286
- const r = bmp[idx + 2] ?? 0;
287
- gray[row * Math.abs(width) + col] = Math.round(.299 * r + .587 * g + .114 * b);
288
- }
289
- }
290
- let hash = 0n;
291
- for (let row = 0; row < 8; row++) for (let col = 0; col < 8; col++) if ((gray[row * Math.abs(width) + col] ?? 0) < (gray[row * Math.abs(width) + col + 1] ?? 0)) hash |= 1n << BigInt(row * 8 + col);
292
- return hash.toString(16).padStart(16, "0");
293
- } finally {
294
- rmSync(tmp, {
295
- recursive: true,
296
- force: true
297
- });
298
- }
299
- }
300
- /** Hamming distance between two hex hashes (64 bits / 16 hex chars). */
301
- function hashDistance(a, b) {
302
- let diff = 0n;
303
- diff = BigInt("0x" + a) ^ BigInt("0x" + b);
304
- let count = 0;
305
- while (diff > 0n) {
306
- if (diff & 1n) count++;
307
- diff >>= 1n;
308
- }
309
- return count;
310
- }
311
- /** Get CGWindowIDs (numeric) for all on-screen windows owned by an app. */
312
- function listCGWindowIds(bundle) {
313
- const { spawnSync } = __require("node:child_process");
314
- const r = spawnSync("env", [
315
- "-i",
316
- "PATH=/usr/bin:/bin",
317
- "xcrun",
318
- "swift",
319
- "-"
320
- ], {
321
- input: `import Foundation
322
- import CoreGraphics
323
- let opts: CGWindowListOption = [.optionOnScreenOnly]
324
- guard let windows = CGWindowListCopyWindowInfo(opts, kCGNullWindowID) as? [[String: Any]] else { exit(1) }
325
- for w in windows {
326
- if let owner = w["kCGWindowOwnerName"] as? String, owner == "${bundle}" {
327
- if let id = w["kCGWindowNumber"] as? Int {
328
- print(id)
329
- }
330
- }
331
- }`,
332
- stdio: [
333
- "pipe",
334
- "pipe",
335
- "pipe"
336
- ],
337
- encoding: "utf-8"
338
- });
339
- if (r.status !== 0) return [];
340
- return (r.stdout ?? "").trim().split("\n").map((s) => s.trim()).filter(Boolean);
341
- }
342
- function listWindowIds(app) {
343
- const { spawnSync } = __require("node:child_process");
344
- const bundle = APP_BUNDLE_NAMES[app];
345
- const r = spawnSync("osascript", ["-e", `if application "${bundle}" is running then
346
- tell application "${bundle}" to return id of every window as text
347
- else
348
- return ""
349
- end if`], {
350
- stdio: [
351
- "ignore",
352
- "pipe",
353
- "pipe"
354
- ],
355
- encoding: "utf-8"
356
- });
357
- if (r.status !== 0) return [];
358
- const out = (r.stdout ?? "").trim();
359
- if (!out) return [];
360
- return out.split(", ").map((s) => s.trim()).filter(Boolean);
361
- }
362
- var APP_BUNDLE_NAMES;
363
- var init_compare = __esmMin((() => {
364
- init_src();
365
- APP_BUNDLE_NAMES = {
366
- ghostty: "Ghostty",
367
- iterm2: "iTerm",
368
- terminal: "Terminal",
369
- wezterm: "WezTerm",
370
- kitty: "kitty"
371
- };
372
- }));
373
- //#endregion
374
- export { pngDimensions as a, init_compare as i, dHash as n, hashDistance as r, captureCrossRenderer as t };
375
-
376
- //# sourceMappingURL=compare-CQodSH4G.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"compare-CQodSH4G.mjs","names":[],"sources":["../../termless/src/compare.ts"],"sourcesContent":["/**\n * Cross-renderer capture + comparison harness.\n *\n * Given a Terminal (xterm.js, vt100, vterm, etc.) and the command that\n * put it into its current state, captures three renderings of the same\n * buffer state:\n *\n * 1. Canvas — ghostty-web's CanvasRenderer via @termless/ghostty's native\n * canvas pipeline (@napi-rs/canvas + ghostty-web WASM, no Chromium)\n * (real-fidelity truecolor + glyph shaping)\n * 2. SVG — termless's deterministic SVG renderer (text-tags + rects)\n * 3. Peekaboo — a real terminal app (Ghostty, iTerm2, Terminal.app)\n * re-running the command; macOS-only; GUI-required\n *\n * Returns the three PNGs plus a comparison report (dimensions, cell-grid\n * alignment, similarity). Used by the `toMatchAcrossRenderers` matcher.\n *\n * Design choices:\n * - All three renderers see the same buffer state via the same source\n * (xterm.js for canvas+SVG; the real terminal's own parser for peekaboo).\n * - A unified theme + font config is applied to all three when possible.\n * Canvas: passes theme + fontPath to @termless/ghostty's renderTerminalPng.\n * SVG: passes theme + cellWidth/Height. Peekaboo: launches the terminal app\n * with whatever the user's config dictates — we can't override that in-flight.\n * - Peekaboo is opt-in (set `includePeekaboo: true`) because it requires\n * GUI access + spawns a real window.\n */\n\nimport type { Terminal, SvgScreenshotOptions } from \"./terminal/types.ts\"\nimport { renderTerminalPng, type CanvasTheme, type RenderOptions, type RenderMeta } from \"@termless/ghostty\"\n\nexport interface CrossRendererOptions {\n /**\n * Command that puts the terminal into its current state. Re-run in a\n * real terminal app when `includePeekaboo: true`. If omitted, peekaboo\n * is skipped regardless of `includePeekaboo`.\n */\n command?: string[]\n /** Unified theme — applied to both canvas + SVG paths. */\n theme?: CanvasTheme\n /** Path to .ttf/.otf font file; canvas embeds it via @font-face. */\n fontPath?: string\n /** Font size (canvas). */\n fontSize?: number\n /** SVG cell dimensions (canvas measures its own from the font). */\n cellWidth?: number\n cellHeight?: number\n /** Pixel-rounded font family for SVG (matches canvas when same family). */\n fontFamily?: string\n /** Output dir for diff bundle. When set, all PNGs + report.json are saved. */\n saveTo?: string\n /** Capture peekaboo too. macOS-only, GUI-required, slow. */\n includePeekaboo?: boolean\n /** Terminal app for peekaboo. Default: \"ghostty\". */\n peekabooApp?: \"ghostty\" | \"iterm2\" | \"terminal\" | \"wezterm\" | \"kitty\"\n /** Ghostty-specific config overrides (written to a temp config-file). */\n ghosttyConfig?: { theme?: string; fontFamily?: string; fontSize?: number; backgroundOpacity?: number }\n /** Strip window chrome from peekaboo capture (Ghostty: enabled with window-decoration=false in temp config). */\n cropChrome?: boolean\n /** Env vars for the peekaboo spawned shell (e.g. KM_ROOT). */\n peekabooEnv?: Record<string, string>\n /** Working directory for the peekaboo spawned shell. */\n peekabooCwd?: string\n /** Terminal dimensions — must match the source terminal's cols/rows. */\n cols?: number\n rows?: number\n}\n\nexport interface CrossRendererResult {\n canvas: Uint8Array\n svg: Uint8Array\n peekaboo?: Uint8Array\n report: CrossRendererReport\n}\n\nexport interface CrossRendererReport {\n /** Decoded PNG dimensions per renderer. */\n dimensions: Record<\"canvas\" | \"svg\" | \"peekaboo\", { width: number; height: number } | null>\n /** Logical dimensions normalized by DPR (estimated from cols/rows + cell metrics). */\n logical: Record<\"canvas\" | \"svg\" | \"peekaboo\", { width: number; height: number } | null>\n /** Buffer text equality — all three renderers see the same buffer iff this is true. */\n textEquality: boolean\n /** dHash (perceptual hash) per renderer that has a rasterized PNG. */\n hashes?: Record<\"canvas\" | \"peekaboo\", string | null>\n /** Hamming distances between pairs (0=identical, 32=completely different). */\n hashDistances?: { canvasVsPeekaboo: number | null }\n /** Files written (when saveTo set). */\n files?: { canvas: string; svg: string; peekaboo?: string; report: string }\n /** Notes on residual divergence — why pixels don't match perfectly. */\n notes: string[]\n}\n\n/**\n * Read PNG width + height from header bytes. PNG IHDR is at offset 16\n * (4-byte big-endian width, 4-byte big-endian height).\n */\nexport function pngDimensions(png: Uint8Array): { width: number; height: number } {\n const view = new DataView(png.buffer, png.byteOffset, png.byteLength)\n return { width: view.getUint32(16, false), height: view.getUint32(20, false) }\n}\n\n/**\n * Capture the same terminal buffer state via canvas, SVG, and (optionally)\n * peekaboo. Returns the three PNGs + a comparison report.\n *\n * Caller is responsible for putting the terminal into the desired state\n * via `feed()` or `spawn()` before invoking this.\n */\nexport async function captureCrossRenderer(\n terminal: Terminal,\n options: CrossRendererOptions = {},\n): Promise<CrossRendererResult> {\n const notes: string[] = []\n\n // ── canvas ──────────────────────────────────────────────\n // Capture with returnMeta so we can pass measured cell dimensions to\n // SVG for unification — otherwise SVG's 9.6×20 defaults won't match\n // canvas's font-measured ~10×17 metrics and dimension comparisons fail.\n //\n // Phase 9: routes through @termless/ghostty's renderTerminalPng (native\n // canvas via @napi-rs/canvas + ghostty-web WASM). Replaces the deleted\n // screenshotCanvasPng (Playwright + Chromium) path.\n const canvasOptions: RenderOptions & { returnMeta: true } = {\n returnMeta: true,\n ...(options.cols != null ? { cols: options.cols } : {}),\n ...(options.rows != null ? { rows: options.rows } : {}),\n ...(options.theme ? { theme: options.theme } : {}),\n ...(options.fontPath ? { fontPath: options.fontPath } : {}),\n ...(options.fontSize ? { fontSize: options.fontSize } : {}),\n ...(options.fontFamily ? { fontFamily: options.fontFamily } : {}),\n }\n const canvasResult = (await renderTerminalPng(terminal, canvasOptions)) as unknown as {\n png: Uint8Array\n meta: RenderMeta\n }\n const canvasBytes = canvasResult.png\n const canvasMeta = canvasResult.meta\n // Cell metrics from ghostty-web's CanvasRenderer are reported in CSS\n // (logical) pixels — same units SVG uses for `cellWidth`/`cellHeight`.\n // The canvas's actual pixel dimensions ARE multiplied by DPR (so a 40×6\n // grid at 10×17 logical = 400×102 logical = 800×204 canvas at DPR 2),\n // but cellWidth/cellHeight stay in logical px.\n const measuredCellWidth = canvasMeta.cellWidth || 9.6\n const measuredCellHeight = canvasMeta.cellHeight || 20\n\n // ── svg ────────────────────────────────────────────────\n // The SVG renderer emits an SVG string; pass canvas's measured cell\n // dimensions when caller doesn't override — so the two paths produce\n // matched aspect ratios + sizes (modulo DPR).\n const svgString = terminal.screenshotSvg({\n ...(options.theme ? { theme: { foreground: options.theme.foreground, background: options.theme.background } } : {}),\n cellWidth: options.cellWidth ?? measuredCellWidth,\n cellHeight: options.cellHeight ?? measuredCellHeight,\n ...(options.fontFamily ? { fontFamily: options.fontFamily } : {}),\n } as SvgScreenshotOptions)\n // Store as utf-8 bytes for now. Rasterization is the caller's job.\n const svgBytes = new TextEncoder().encode(svgString)\n\n // ── peekaboo (opt-in) ──────────────────────────────────\n // Use osascript + screencapture directly — peekaboo's full backend\n // requires node-pty (xterm.js data-layer PTY), which is heavy native\n // dep we don't need for screenshot-only capture. Inline the launch +\n // bounds-based capture + cleanup we want.\n let peekabooBytes: Uint8Array | undefined\n if (options.includePeekaboo) {\n if (process.platform !== \"darwin\") {\n notes.push(\"peekaboo skipped: requires macOS\")\n } else if (!options.command) {\n notes.push(\"peekaboo skipped: `command` not provided (needed to re-run in real terminal)\")\n } else {\n try {\n peekabooBytes = await captureRealTerminal({\n app: options.peekabooApp ?? \"ghostty\",\n command: options.command,\n waitMs: 2500,\n ...(options.cropChrome != null ? { cropChrome: options.cropChrome } : {}),\n ...(options.ghosttyConfig ? { ghosttyConfig: options.ghosttyConfig } : {}),\n ...(options.peekabooEnv ? { env: options.peekabooEnv } : {}),\n ...(options.peekabooCwd ? { cwd: options.peekabooCwd } : {}),\n })\n } catch (err) {\n notes.push(`peekaboo failed: ${err instanceof Error ? err.message : String(err)}`)\n }\n }\n }\n\n // ── Compute report ─────────────────────────────────────\n const canvasDim = pngDimensions(canvasBytes)\n let svgDim: { width: number; height: number } | null = null\n // Parse <svg width=\"X\" height=\"Y\"> from the SVG string for logical dim.\n const m = svgString.match(/<svg[^>]+width=\"(\\d+)\"[^>]+height=\"(\\d+)\"/)\n if (m) svgDim = { width: Number.parseInt(m[1]!, 10), height: Number.parseInt(m[2]!, 10) }\n const peekDim = peekabooBytes ? pngDimensions(peekabooBytes) : null\n\n // Estimate logical dimensions by dividing by suspected DPR.\n // Canvas reports DPR via the meta passed in; we don't have access here,\n // so estimate from cols × ~10px (typical cell width). For now, simply\n // report raw and let the caller decide.\n const logical = {\n canvas: canvasDim,\n svg: svgDim,\n peekaboo: peekDim, // includes window chrome — caller should crop\n }\n\n // Compute perceptual hashes for canvas + peekaboo (SVG is XML, not a\n // raster — skipped). pHash is dep-free via sips on macOS; falls back\n // to a no-op zero-hash on other platforms or when sips is missing.\n let canvasHash: string | null = null\n let peekHash: string | null = null\n if (process.platform === \"darwin\") {\n try {\n canvasHash = await dHash(canvasBytes)\n } catch {\n // ignore — leaves hash null\n }\n if (peekabooBytes) {\n try {\n peekHash = await dHash(peekabooBytes)\n } catch {\n // ignore — leaves hash null\n }\n }\n }\n\n const report: CrossRendererReport = {\n dimensions: { canvas: canvasDim, svg: svgDim, peekaboo: peekDim },\n logical,\n textEquality: true, // canvas + SVG both read from the same terminal buffer\n hashes: { canvas: canvasHash, peekaboo: peekHash },\n hashDistances: {\n canvasVsPeekaboo: canvasHash && peekHash ? hashDistance(canvasHash, peekHash) : null,\n },\n notes,\n }\n\n // ── Persist diff bundle ────────────────────────────────\n if (options.saveTo) {\n const { mkdirSync, writeFileSync } = await import(\"node:fs\")\n const { join } = await import(\"node:path\")\n mkdirSync(options.saveTo, { recursive: true })\n const canvasPath = join(options.saveTo, \"canvas.png\")\n const svgPngPath = join(options.saveTo, \"svg.svg\") // SVG kept as XML for now\n const peekPath = join(options.saveTo, \"peekaboo.png\")\n const reportPath = join(options.saveTo, \"report.json\")\n writeFileSync(canvasPath, canvasBytes)\n writeFileSync(svgPngPath, svgString, \"utf-8\")\n if (peekabooBytes) writeFileSync(peekPath, peekabooBytes)\n writeFileSync(reportPath, JSON.stringify(report, null, 2))\n report.files = {\n canvas: canvasPath,\n svg: svgPngPath,\n ...(peekabooBytes ? { peekaboo: peekPath } : {}),\n report: reportPath,\n }\n }\n\n return { canvas: canvasBytes, svg: svgBytes, peekaboo: peekabooBytes, report }\n}\n\n// ─────────────────────────────────────────────────────────\n// Real-terminal capture (macOS)\n// ─────────────────────────────────────────────────────────\n//\n// Spawns a terminal app via `open -a`, captures the window via\n// `screencapture -R <bounds>` (non-interactive — no popup picker), then\n// closes the spawned window. Uses System Events to query position+size\n// for the bounds, and Ghostty/iTerm2/Terminal AppleScript to close.\n//\n// Bypasses peekaboo's full backend (which spawns an xterm.js PTY for\n// data-layer access). For screenshot-only purposes, we don't need that.\n\nconst APP_BUNDLE_NAMES = {\n ghostty: \"Ghostty\",\n iterm2: \"iTerm\",\n terminal: \"Terminal\",\n wezterm: \"WezTerm\",\n kitty: \"kitty\",\n} as const\n\nasync function captureRealTerminal(opts: {\n app: keyof typeof APP_BUNDLE_NAMES\n command: string[]\n waitMs: number\n /** Strip Ghostty's window chrome (titlebar, padding) from the capture. */\n cropChrome?: boolean\n /** Ghostty config overrides (theme, font, padding). Ignored for non-Ghostty. */\n ghosttyConfig?: { theme?: string; fontFamily?: string; fontSize?: number; backgroundOpacity?: number }\n /** Environment variables for the spawned shell. */\n env?: Record<string, string>\n /** Working directory for the spawned shell. */\n cwd?: string\n}): Promise<Uint8Array> {\n const { spawnSync } = await import(\"node:child_process\")\n const { mkdtempSync, readFileSync, rmSync, writeFileSync, chmodSync } = await import(\"node:fs\")\n const { tmpdir } = await import(\"node:os\")\n const { join } = await import(\"node:path\")\n const bundle = APP_BUNDLE_NAMES[opts.app]\n\n const idsBefore = listWindowIds(opts.app)\n // Also snapshot CGWindowIDs (numeric, macOS-native) so we can diff\n // post-launch to find OUR new window — independent of AppleScript ids.\n const cgIdsBefore = listCGWindowIds(bundle)\n const tmpDir = mkdtempSync(join(tmpdir(), \"term-real-\"))\n const script = join(tmpDir, \"payload.sh\")\n // Build the script: prepend env exports + cd, then the command.\n const envLines = opts.env ? Object.entries(opts.env).map(([k, v]) => `export ${k}=${JSON.stringify(v)}`) : []\n const cdLine = opts.cwd ? `cd ${JSON.stringify(opts.cwd)}` : \"\"\n // Build the command line. For bash -c shape ([\"/bin/bash\", \"-c\", \"...\"]),\n // unwrap to the inner shell command. For other shapes, shell-quote each\n // argv element so spaces/special-chars in paths don't split.\n const cmdLine =\n opts.command[0] === \"/bin/bash\" && opts.command[1] === \"-c\" && opts.command.length === 3\n ? opts.command[2]\n : opts.command.map((arg) => `'${arg.replace(/'/g, \"'\\\\''\")}'`).join(\" \")\n // Append a sleep so the window doesn't auto-close before screencapture\n // fires. The harness's `pkill -f <script>` in finally{} kills bash mid-\n // sleep, triggering Ghostty's wait-after-command=false → window closes.\n writeFileSync(script, `#!/bin/bash\\n${envLines.join(\"\\n\")}\\n${cdLine}\\n${cmdLine}\\nsleep 60\\n`)\n chmodSync(script, 0o755)\n\n // Ghostty on macOS doesn't accept `-e <command>` via `open --args` —\n // per the docs, \"launching the terminal emulator from the CLI is not\n // supported\". Instead, set `command = <script>` in a temp config file\n // and pass it via `--config-file=<path>`.\n //\n // Additional config keys for reliable capture + cleanup:\n // - confirm-close-surface = false: no \"Are you sure?\" dialog\n // - wait-after-command = false: (default) window closes when command exits\n // - window-padding-x/y = 0: cell-grid fills the window\n let ghosttyConfigPath: string | undefined\n if (opts.app === \"ghostty\") {\n ghosttyConfigPath = join(tmpDir, \"ghostty.cfg\")\n const cfgLines = [\n `command = ${script}`,\n \"confirm-close-surface = false\",\n \"wait-after-command = false\",\n \"window-padding-x = 0\",\n \"window-padding-y = 0\",\n ...(opts.ghosttyConfig?.theme ? [`theme = ${opts.ghosttyConfig.theme}`] : []),\n ...(opts.ghosttyConfig?.fontFamily ? [`font-family = ${opts.ghosttyConfig.fontFamily}`] : []),\n ...(opts.ghosttyConfig?.fontSize != null ? [`font-size = ${opts.ghosttyConfig.fontSize}`] : []),\n ...(opts.ghosttyConfig?.backgroundOpacity != null\n ? [`background-opacity = ${opts.ghosttyConfig.backgroundOpacity}`]\n : []),\n ]\n writeFileSync(ghosttyConfigPath, cfgLines.join(\"\\n\") + \"\\n\")\n }\n\n // Launch — `open -g` opens without activating, so the user's current\n // window stays focused. The new terminal still spawns visibly (macOS\n // can't truly hide a window) but doesn't steal keyboard focus.\n if (opts.app === \"ghostty\") {\n // On macOS, Ghostty doesn't accept `-e <command>` via `open --args`.\n // The temp config-file (above) carries `command = <script>` instead.\n //\n // CRITICAL: do NOT use `-n` (open --new-instance). It spawns a fresh\n // Ghostty.app PROCESS each time, creating a stack of dock icons that\n // accumulates over the user's session. The user can't `quit` them\n // selectively without losing their primary Ghostty (which hosts\n // their actual terminal sessions / cmux). Use a regular `open` so\n // existing Ghostty makes a new window inside its single process.\n const args = [\"-g\", \"-a\", \"Ghostty\", \"--args\"]\n if (ghosttyConfigPath) args.push(`--config-file=${ghosttyConfigPath}`)\n spawnSync(\"open\", args, { stdio: \"ignore\" })\n } else if (opts.app === \"kitty\") {\n spawnSync(\"open\", [\"-g\", \"-a\", \"kitty\", \"--args\", script], { stdio: \"ignore\" })\n } else if (opts.app === \"wezterm\") {\n spawnSync(\"open\", [\"-g\", \"-a\", \"WezTerm\", \"--args\", \"start\", \"--\", \"bash\", \"-c\", script], { stdio: \"ignore\" })\n } else {\n spawnSync(\"open\", [\"-g\", \"-a\", bundle, script], { stdio: \"ignore\" })\n }\n\n // Poll for the new window.\n let newId: string | undefined\n for (let i = 0; i < 40 && !newId; i++) {\n await new Promise((r) => setTimeout(r, 200))\n const idsNow = listWindowIds(opts.app)\n newId = idsNow.find((id) => !idsBefore.includes(id))\n }\n\n try {\n await new Promise((r) => setTimeout(r, opts.waitMs))\n\n spawnSync(\"osascript\", [\"-e\", `tell application \"${bundle}\" to activate`], { stdio: \"ignore\" })\n await new Promise((r) => setTimeout(r, 300))\n\n // Get the spawned window's CGWindowID via a Swift one-liner. This is\n // the macOS window-number used by `screencapture -l <id>` — captures\n // THAT specific window's pixels even when occluded by other windows.\n // The AppleScript `id of front window` returns a different identifier\n // (a \"tab-group-XXX\" string for Ghostty) that screencapture doesn't\n // accept; bounds-based `-R` capture picks up whatever's visible at the\n // screen coordinates, which fails when other apps overlap. CGWindowID\n // is the right primitive.\n //\n // env -i bypasses the user's Nix-managed PATH so xcrun resolves the\n // macOS-bundled Swift toolchain (which matches the macOS SDK).\n const cgIds = listCGWindowIds(bundle)\n if (cgIds.length === 0) {\n throw new Error(`captureRealTerminal: no ${bundle} windows visible (CGWindowList returned empty)`)\n }\n // Pick the window that's NEW since launch — diff against the\n // pre-launch CGWindowID set. Falls back to the highest id when the\n // diff is empty (shouldn't happen but defensive).\n const freshIds = cgIds.filter((id) => !cgIdsBefore.includes(id))\n const cgId = (freshIds[0] ?? cgIds.sort((a, b) => Number(a) - Number(b)).pop())!.toString()\n const outPath = join(tmpDir, \"capture.png\")\n const cap = spawnSync(\"screencapture\", [\"-l\", cgId, \"-o\", \"-x\", outPath], { stdio: [\"ignore\", \"ignore\", \"pipe\"] })\n if (cap.status !== 0) throw new Error(`screencapture -l ${cgId} failed: ${cap.stderr?.toString().trim()}`)\n const bytes = readFileSync(outPath)\n void opts.cropChrome // currently unused; chrome handling lives in caller\n return new Uint8Array(bytes.buffer, bytes.byteOffset, bytes.byteLength)\n } finally {\n // Cleanup strategy (in order):\n // 1. Kill the script process that's running inside the window.\n // With close-on-exit=true, killing the script causes Ghostty to\n // close the window automatically. Works even without\n // AppleScript permissions.\n // 2. AppleScript close-by-id as a backstop for apps without\n // close-on-exit.\n try {\n spawnSync(\"pkill\", [\"-f\", script], { stdio: \"ignore\", timeout: 2000 })\n } catch {\n // ignore\n }\n // Give close-on-exit a beat to fire.\n await new Promise((r) => setTimeout(r, 400))\n if (newId) {\n const closeScript = `tell application \"${bundle}\" to close (every window whose id is ${newId})`\n spawnSync(\"osascript\", [\"-e\", closeScript], { stdio: \"ignore\", timeout: 3000 })\n }\n // KEEP tmpDir when CROSS_RENDERER_DEBUG=1 — useful for inspecting the\n // generated script + Ghostty config when capture fails. Default: clean.\n if (process.env.CROSS_RENDERER_DEBUG !== \"1\") {\n rmSync(tmpDir, { recursive: true, force: true })\n } else {\n // eslint-disable-next-line no-console\n console.error(`[cross-renderer] preserved tmpDir: ${tmpDir}`)\n }\n }\n}\n\n// ─────────────────────────────────────────────────────────\n// Image similarity — perceptual hash (no external deps)\n// ─────────────────────────────────────────────────────────\n//\n// pHash via Difference Hash (dHash): downscale to 9×8 grayscale, compute\n// 64 bits where each bit is \"left-pixel < right-pixel\". Tolerant to\n// resolution, font hinting, and small color differences. Two PNGs with\n// the same cell-grid structure should hash within Hamming distance ~5.\n// True identical: 0. Completely different: 32.\n\n/** Compute a 64-bit difference hash for a PNG. Returns a 16-char hex string. */\nexport async function dHash(pngBytes: Uint8Array): Promise<string> {\n // Decode PNG via playwright's image — heavy. Alternative: shell out to\n // sips (macOS) for resize+grayscale, then read raw bytes.\n const { spawnSync } = await import(\"node:child_process\")\n const { mkdtempSync, writeFileSync, readFileSync, rmSync } = await import(\"node:fs\")\n const { tmpdir } = await import(\"node:os\")\n const { join } = await import(\"node:path\")\n const tmp = mkdtempSync(join(tmpdir(), \"dhash-\"))\n try {\n const inPath = join(tmp, \"in.png\")\n const outPath = join(tmp, \"out.png\")\n writeFileSync(inPath, pngBytes)\n // Resize to 9×8 grayscale BMP (raw-ish format easy to parse).\n // sips -s format bmp -s formatOptions normal -z 8 9 -s pixelsPerInchH 72 ...\n const r = spawnSync(\"sips\", [\"-s\", \"format\", \"png\", \"-z\", \"8\", \"9\", inPath, \"--out\", outPath], { stdio: \"ignore\" })\n if (r.status !== 0) {\n // Fallback: return null-like hash so similarity returns Infinity\n return \"0\".repeat(16)\n }\n const png = readFileSync(outPath)\n // We don't have a PNG decoder in dep-free TS. Use Bun's built-in\n // image bitmap via Canvas — but Bun has no canvas. Workaround: shell\n // out again to sips to convert to raw RGB.\n const rawPath = join(tmp, \"raw.bmp\")\n const r2 = spawnSync(\"sips\", [\"-s\", \"format\", \"bmp\", outPath, \"--out\", rawPath], { stdio: \"ignore\" })\n if (r2.status !== 0) return \"0\".repeat(16)\n const bmp = readFileSync(rawPath)\n // BMP header: 14 bytes file header + 40 bytes DIB header for BITMAPINFOHEADER.\n // Pixel data starts at offset given by the file header (bytes 10-13).\n const view = new DataView(bmp.buffer, bmp.byteOffset, bmp.byteLength)\n const pixOffset = view.getUint32(10, true)\n const width = view.getInt32(18, true)\n const height = view.getInt32(22, true)\n const bpp = view.getUint16(28, true)\n if (bpp !== 24 && bpp !== 32) return \"0\".repeat(16)\n const bytesPerPx = bpp / 8\n const rowSize = Math.floor((bpp * width + 31) / 32) * 4\n // BMP rows are bottom-up by default.\n const gray = new Uint8Array(Math.abs(width) * Math.abs(height))\n for (let row = 0; row < Math.abs(height); row++) {\n const srcRow = height > 0 ? Math.abs(height) - 1 - row : row\n for (let col = 0; col < Math.abs(width); col++) {\n const idx = pixOffset + srcRow * rowSize + col * bytesPerPx\n // BMP is BGR (or BGRA)\n const b = bmp[idx] ?? 0\n const g = bmp[idx + 1] ?? 0\n const r = bmp[idx + 2] ?? 0\n gray[row * Math.abs(width) + col] = Math.round(0.299 * r + 0.587 * g + 0.114 * b)\n }\n }\n // 8 rows × 9 cols → 8 rows × 8 bits = 64 bits\n let hash = 0n\n for (let row = 0; row < 8; row++) {\n for (let col = 0; col < 8; col++) {\n const left = gray[row * Math.abs(width) + col] ?? 0\n const right = gray[row * Math.abs(width) + col + 1] ?? 0\n if (left < right) hash |= 1n << BigInt(row * 8 + col)\n }\n }\n void png\n return hash.toString(16).padStart(16, \"0\")\n } finally {\n rmSync(tmp, { recursive: true, force: true })\n }\n}\n\n/** Hamming distance between two hex hashes (64 bits / 16 hex chars). */\nexport function hashDistance(a: string, b: string): number {\n let diff = 0n\n diff = BigInt(\"0x\" + a) ^ BigInt(\"0x\" + b)\n let count = 0\n while (diff > 0n) {\n if (diff & 1n) count++\n diff >>= 1n\n }\n return count\n}\n\n/** Get CGWindowIDs (numeric) for all on-screen windows owned by an app. */\nfunction listCGWindowIds(bundle: string): string[] {\n const { spawnSync } = require(\"node:child_process\") as typeof import(\"node:child_process\")\n const swiftSnippet = `import Foundation\nimport CoreGraphics\nlet opts: CGWindowListOption = [.optionOnScreenOnly]\nguard let windows = CGWindowListCopyWindowInfo(opts, kCGNullWindowID) as? [[String: Any]] else { exit(1) }\nfor w in windows {\n if let owner = w[\"kCGWindowOwnerName\"] as? String, owner == \"${bundle}\" {\n if let id = w[\"kCGWindowNumber\"] as? Int {\n print(id)\n }\n }\n}`\n const r = spawnSync(\"env\", [\"-i\", \"PATH=/usr/bin:/bin\", \"xcrun\", \"swift\", \"-\"], {\n input: swiftSnippet,\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n encoding: \"utf-8\",\n })\n if (r.status !== 0) return []\n return (r.stdout ?? \"\")\n .trim()\n .split(\"\\n\")\n .map((s: string) => s.trim())\n .filter(Boolean)\n}\n\nfunction listWindowIds(app: keyof typeof APP_BUNDLE_NAMES): string[] {\n // sync version of peekaboo's listGhosttyWindowIds — applies to any\n // terminal app, returns AppleScript window ids comma-separated.\n const { spawnSync } = require(\"node:child_process\") as typeof import(\"node:child_process\")\n const bundle = APP_BUNDLE_NAMES[app]\n const r = spawnSync(\n \"osascript\",\n [\n \"-e\",\n `if application \"${bundle}\" is running then\n tell application \"${bundle}\" to return id of every window as text\n else\n return \"\"\n end if`,\n ],\n { stdio: [\"ignore\", \"pipe\", \"pipe\"], encoding: \"utf-8\" },\n )\n if (r.status !== 0) return []\n const out = (r.stdout ?? \"\").trim()\n if (!out) return []\n return out\n .split(\", \")\n .map((s: string) => s.trim())\n .filter(Boolean)\n}\n"],"mappings":"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"}