difit 4.0.2 → 4.0.4

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 (201) hide show
  1. package/README.ja.md +1 -0
  2. package/README.ko.md +1 -0
  3. package/README.md +1 -0
  4. package/README.zh.md +1 -0
  5. package/dist/cli/index.js +38 -28
  6. package/dist/cli/index.test.js +162 -77
  7. package/dist/cli/utils.js +4 -0
  8. package/dist/cli/utils.test.js +6 -1
  9. package/dist/client/assets/_baseFor-DKyA49xd.js +1 -0
  10. package/dist/client/assets/arc-COOp7iVe.js +1 -0
  11. package/dist/client/assets/architecture-YZFGNWBL-Cs2Q6RQP.js +1 -0
  12. package/dist/client/assets/architectureDiagram-Q4EWVU46-BO4dVPUA.js +36 -0
  13. package/dist/client/assets/blockDiagram-DXYQGD6D-CtNJnEWN.js +132 -0
  14. package/dist/client/assets/c4Diagram-AHTNJAMY-BqG-1m6C.js +10 -0
  15. package/dist/client/assets/channel-_xDT1u3-.js +1 -0
  16. package/dist/client/assets/chunk-2KRD3SAO-DqP2NJNd.js +1 -0
  17. package/dist/client/assets/chunk-336JU56O-D1qa7Qzb.js +2 -0
  18. package/dist/client/assets/chunk-426QAEUC-6J_A_wvD.js +1 -0
  19. package/dist/client/assets/{chunk-4BX2VUAB-CW45MZFx.js → chunk-4BX2VUAB-BT78EnQ6.js} +1 -1
  20. package/dist/client/assets/chunk-4TB4RGXK-C4w_Bwzw.js +206 -0
  21. package/dist/client/assets/{chunk-55IACEB6-Busc3sfI.js → chunk-55IACEB6-z3MQSTaj.js} +1 -1
  22. package/dist/client/assets/chunk-5FUZZQ4R-Chei69aj.js +62 -0
  23. package/dist/client/assets/chunk-5PVQY5BW-HgRiIs0X.js +2 -0
  24. package/dist/client/assets/chunk-67CJDMHE-B2q10-fp.js +1 -0
  25. package/dist/client/assets/chunk-7N4EOEYR-DPgxysWq.js +1 -0
  26. package/dist/client/assets/chunk-AA7GKIK3-BqmVmKLq.js +1 -0
  27. package/dist/client/assets/chunk-BSJP7CBP-CaIgleFn.js +1 -0
  28. package/dist/client/assets/chunk-CFjPhJqf.js +1 -0
  29. package/dist/client/assets/chunk-CIAEETIT-ByD-tlNF.js +1 -0
  30. package/dist/client/assets/{chunk-KX2RTZJC-DrhxxMOx.js → chunk-EDXVE4YY-d3RUKKAj.js} +1 -1
  31. package/dist/client/assets/chunk-ENJZ2VHE-CNq5Qmg9.js +10 -0
  32. package/dist/client/assets/{chunk-FMBD7UC4-BSsJVlRg.js → chunk-FMBD7UC4-DYfHJ6MV.js} +1 -1
  33. package/dist/client/assets/chunk-FOC6F5B3-BRpSWlZj.js +1 -0
  34. package/dist/client/assets/chunk-ICPOFSXX-B_MThwG6.js +122 -0
  35. package/dist/client/assets/chunk-K5T4RW27-DmamW1Ds.js +94 -0
  36. package/dist/client/assets/chunk-KGLVRYIC-CRbg4c4z.js +1 -0
  37. package/dist/client/assets/chunk-LIHQZDEY-CHQPSdB3.js +1 -0
  38. package/dist/client/assets/chunk-ORNJ4GCN-CIsQ4Zi4.js +1 -0
  39. package/dist/client/assets/{chunk-NQ4KR5QH-BZ86r2qK.js → chunk-OYMX7WX6-Cxi0kdGg.js} +25 -14
  40. package/dist/client/assets/chunk-QZHKN3VN-C0QzfgZ8.js +1 -0
  41. package/dist/client/assets/{chunk-PU5JKC2W-PQmA4K_y.js → chunk-U2HBQHQK-V_hneCfR.js} +6 -6
  42. package/dist/client/assets/{chunk-PQ6SQG4A-C9acTu_E.js → chunk-X2U36JSP-De4pvO-I.js} +1 -1
  43. package/dist/client/assets/{chunk-XPW4576I-CcqR6BsE.js → chunk-XPW4576I-B_osXKp6.js} +2 -2
  44. package/dist/client/assets/{chunk-JSJVCQXG-UCJub_Eo.js → chunk-YZCP3GAM-C_kqXssD.js} +1 -1
  45. package/dist/client/assets/chunk-ZZ45TVLE-B_xtlma5.js +1 -0
  46. package/dist/client/assets/classDiagram-6PBFFD2Q-5XrS-DAQ.js +1 -0
  47. package/dist/client/assets/classDiagram-v2-HSJHXN6E-Covl2vKy.js +1 -0
  48. package/dist/client/assets/clone-rhRH8pyW.js +1 -0
  49. package/dist/client/assets/cose-bilkent-S5V4N54A-BvXFc7Rr.js +1 -0
  50. package/dist/client/assets/cytoscape.esm-DRReFUEO.js +321 -0
  51. package/dist/client/assets/dagre-DU-XBdcU.js +1 -0
  52. package/dist/client/assets/dagre-KV5264BT-BWYGReXF.js +4 -0
  53. package/dist/client/assets/diagram-5BDNPKRD-DpUUhvWz.js +10 -0
  54. package/dist/client/assets/diagram-G4DWMVQ6-BJoTrUAx.js +24 -0
  55. package/dist/client/assets/diagram-MMDJMWI5-CAk1GW5g.js +43 -0
  56. package/dist/client/assets/diagram-TYMM5635-Cct6g7FA.js +24 -0
  57. package/dist/client/assets/dist-61sCfOmN.js +1 -0
  58. package/dist/client/assets/{erDiagram-INFDFZHY-ByL02DP-.js → erDiagram-SMLLAGMA-DHs2bXUj.js} +33 -18
  59. package/dist/client/assets/flatten-mnWyE-RB.js +1 -0
  60. package/dist/client/assets/flowDiagram-DWJPFMVM-DLu-6dfC.js +162 -0
  61. package/dist/client/assets/ganttDiagram-T4ZO3ILL-CMIzlKAR.js +292 -0
  62. package/dist/client/assets/gitGraph-7Q5UKJZL-A_wWsXju.js +1 -0
  63. package/dist/client/assets/gitGraphDiagram-UUTBAWPF-Bc_rL3_k.js +106 -0
  64. package/dist/client/assets/graphlib-BVMK0xYE.js +1 -0
  65. package/dist/client/assets/{index-Cn4K2uvR.css → index-Cq_APK7Y.css} +1 -1
  66. package/dist/client/assets/index-RcU838Ah.js +79 -0
  67. package/dist/client/assets/info-OMHHGYJF-Bv3kK2Bb.js +1 -0
  68. package/dist/client/assets/{infoDiagram-LFFYTUFH-CnmYkyCb.js → infoDiagram-42DDH7IO-Cf8u4jgP.js} +1 -1
  69. package/dist/client/assets/isEmpty-CiiIHfXR.js +1 -0
  70. package/dist/client/assets/ishikawaDiagram-UXIWVN3A-7n7DvfEb.js +70 -0
  71. package/dist/client/assets/{journeyDiagram-4ABVD52K-aRoH36nV.js → journeyDiagram-VCZTEJTY-BMkeQqJb.js} +2 -2
  72. package/dist/client/assets/{kanban-definition-K7BYSVSG-BGtGv5yb.js → kanban-definition-6JOO6SKY-B8KkeZLS.js} +2 -2
  73. package/dist/client/assets/katex-FOM3xZj7.js +257 -0
  74. package/dist/client/assets/line-CVpcI6kj.js +1 -0
  75. package/dist/client/assets/{linear-HJOLPv7E.js → linear-DmhiOOKU.js} +1 -1
  76. package/dist/client/assets/mermaid-parser.core-CnJ9Tv8l.js +4 -0
  77. package/dist/client/assets/mermaid.core-R7nXpPx-.js +11 -0
  78. package/dist/client/assets/{mindmap-definition-YRQLILUH-B8jMe7ir.js → mindmap-definition-QFDTVHPH-CwcHocMZ.js} +39 -11
  79. package/dist/client/assets/{ordinal-DIg8h6NI.js → ordinal-k--hYEme.js} +1 -1
  80. package/dist/client/assets/packet-4T2RLAQJ-D2q3-9ae.js +1 -0
  81. package/dist/client/assets/pie-ZZUOXDRM-GivlQcUF.js +1 -0
  82. package/dist/client/assets/pieDiagram-DEJITSTG-BVAn8Lmr.js +30 -0
  83. package/dist/client/assets/preload-helper-DSXbuxSR.js +1 -0
  84. package/dist/client/assets/prism-haskell-BP3SRvzt.js +1 -0
  85. package/dist/client/assets/prism-nix-CO4UPu3E.js +1 -0
  86. package/dist/client/assets/{quadrantDiagram-337W2JSQ-CQ1QKsru.js → quadrantDiagram-34T5L4WZ-C2XZ_zxa.js} +1 -1
  87. package/dist/client/assets/radar-PYXPWWZC-C9pD6VNR.js +1 -0
  88. package/dist/client/assets/reduce-BTlHjXna.js +1 -0
  89. package/dist/client/assets/requirementDiagram-MS252O5E-CfO16pkI.js +84 -0
  90. package/dist/client/assets/{sankeyDiagram-WA2Y5GQK-BQVbT6bS.js → sankeyDiagram-XADWPNL6-D_4_234M.js} +1 -1
  91. package/dist/client/assets/sequenceDiagram-FGHM5R23-B-yHKMuK.js +157 -0
  92. package/dist/client/assets/src-CjDs0_Ij.js +1 -0
  93. package/dist/client/assets/stateDiagram-FHFEXIEX-BeG2di4I.js +1 -0
  94. package/dist/client/assets/stateDiagram-v2-QKLJ7IA2-DvcSq7KE.js +1 -0
  95. package/dist/client/assets/timeline-definition-GMOUNBTQ-DhtnMGcE.js +120 -0
  96. package/dist/client/assets/treeView-SZITEDCU-BSNk8_yV.js +1 -0
  97. package/dist/client/assets/treemap-W4RFUUIX-ym4zQztE.js +1 -0
  98. package/dist/client/assets/vennDiagram-DHZGUBPP-CBn69TcQ.js +34 -0
  99. package/dist/client/assets/wardley-RL74JXVD-B02H6ReJ.js +1 -0
  100. package/dist/client/assets/wardleyDiagram-NUSXRM2D-CEoSJmN1.js +20 -0
  101. package/dist/client/assets/{xychartDiagram-JWTSCODW-DeYZhM2j.js → xychartDiagram-5P7HB3ND-BZ_X9tkn.js} +6 -6
  102. package/dist/client/index.html +4 -2
  103. package/dist/server/git-diff-tui.d.ts +2 -2
  104. package/dist/server/git-diff-tui.js +14 -11
  105. package/dist/server/git-diff-tui.test.js +20 -4
  106. package/dist/server/git-diff.d.ts +3 -2
  107. package/dist/server/git-diff.js +30 -7
  108. package/dist/server/git-diff.test.js +60 -5
  109. package/dist/server/server.d.ts +2 -3
  110. package/dist/server/server.js +80 -55
  111. package/dist/server/server.test.js +110 -60
  112. package/dist/tui/App.d.ts +2 -2
  113. package/dist/tui/App.js +4 -3
  114. package/dist/types/diff.d.ts +8 -0
  115. package/dist/utils/diffSelection.d.ts +6 -0
  116. package/dist/utils/diffSelection.js +30 -0
  117. package/package.json +9 -9
  118. package/dist/client/assets/_basePickBy-hOr-yGsE.js +0 -1
  119. package/dist/client/assets/_baseUniq-b7bzdUSn.js +0 -1
  120. package/dist/client/assets/arc-D65wG9gm.js +0 -1
  121. package/dist/client/assets/architecture-PBZL5I3N-DFdrPtRG.js +0 -1
  122. package/dist/client/assets/architectureDiagram-2XIMDMQ5-CXJTJFYJ.js +0 -36
  123. package/dist/client/assets/blockDiagram-WCTKOSBZ-B60owdAn.js +0 -132
  124. package/dist/client/assets/c4Diagram-IC4MRINW-4tg2D_Vt.js +0 -10
  125. package/dist/client/assets/channel-DogeU0Wo.js +0 -1
  126. package/dist/client/assets/chunk-7E7YKBS2-BVR-8Pma.js +0 -1
  127. package/dist/client/assets/chunk-7R4GIKGN-DneC7PwP.js +0 -80
  128. package/dist/client/assets/chunk-C72U2L5F-CJr98gus.js +0 -1
  129. package/dist/client/assets/chunk-EGIJ26TM-iD_CSqpR.js +0 -1
  130. package/dist/client/assets/chunk-GEFDOKGD-eDUrsRgt.js +0 -2
  131. package/dist/client/assets/chunk-GLR3WWYH-NUOKNaxd.js +0 -2
  132. package/dist/client/assets/chunk-HHEYEP7N-DhuxpkmW.js +0 -1
  133. package/dist/client/assets/chunk-KYZI473N-Brv52ZeO.js +0 -53
  134. package/dist/client/assets/chunk-L3YUKLVL-BkBigLhQ.js +0 -1
  135. package/dist/client/assets/chunk-MX3YWQON-DHRoNbgW.js +0 -1
  136. package/dist/client/assets/chunk-O4XLMI2P-Sr33dk8c.js +0 -7
  137. package/dist/client/assets/chunk-OZEHJAEY-3F2ff7sj.js +0 -1
  138. package/dist/client/assets/chunk-QZHKN3VN-DMRW-mur.js +0 -1
  139. package/dist/client/assets/chunk-R5LLSJPH-ChexuO_S.js +0 -1
  140. package/dist/client/assets/chunk-WL4C6EOR-oxNV_hhM.js +0 -189
  141. package/dist/client/assets/chunk-XIRO2GV7-C9gOnffv.js +0 -1
  142. package/dist/client/assets/chunk-XZSTWKYB-C5JJ0TZR.js +0 -94
  143. package/dist/client/assets/chunk-YBOYWFTD-B6kAkNgH.js +0 -1
  144. package/dist/client/assets/classDiagram-VBA2DB6C-DlDUg6JI.js +0 -1
  145. package/dist/client/assets/classDiagram-v2-RAHNMMFH-BxzJfV1S.js +0 -1
  146. package/dist/client/assets/clone-DuY6BQEm.js +0 -1
  147. package/dist/client/assets/cose-bilkent-S5V4N54A-hlDud6Ym.js +0 -1
  148. package/dist/client/assets/cytoscape.esm-B3gzQ1NF.js +0 -321
  149. package/dist/client/assets/dagre-BwDYerGQ.js +0 -1
  150. package/dist/client/assets/dagre-KLK3FWXG-KnkMUlUE.js +0 -4
  151. package/dist/client/assets/diagram-E7M64L7V-DcTCIFUG.js +0 -24
  152. package/dist/client/assets/diagram-IFDJBPK2-COcDQunj.js +0 -43
  153. package/dist/client/assets/diagram-P4PSJMXO-DmgET9pD.js +0 -24
  154. package/dist/client/assets/dist-v55TM3-O.js +0 -1
  155. package/dist/client/assets/flowDiagram-PKNHOUZH-CW-lseYE.js +0 -162
  156. package/dist/client/assets/ganttDiagram-A5KZAMGK-BxLjKRld.js +0 -292
  157. package/dist/client/assets/gitGraph-HDMCJU4V-CjAGJiCH.js +0 -1
  158. package/dist/client/assets/gitGraphDiagram-K3NZZRJ6-DLEDjokx.js +0 -65
  159. package/dist/client/assets/graphlib-WkJoBgka.js +0 -1
  160. package/dist/client/assets/index-CizZxdOT.js +0 -79
  161. package/dist/client/assets/info-3K5VOQVL-CB6KpH1K.js +0 -1
  162. package/dist/client/assets/isArrayLikeObject-icl0H0jo.js +0 -1
  163. package/dist/client/assets/isEmpty-Du8sNmkE.js +0 -1
  164. package/dist/client/assets/ishikawaDiagram-PHBUUO56-zycn1mVK.js +0 -70
  165. package/dist/client/assets/katex-BJrMXEjr.js +0 -261
  166. package/dist/client/assets/line-Cm3ZuldI.js +0 -1
  167. package/dist/client/assets/math-CNhlSIO3.js +0 -1
  168. package/dist/client/assets/mermaid-parser.core-BvMqHn4b.js +0 -4
  169. package/dist/client/assets/mermaid.core-C4SvQTx9.js +0 -11
  170. package/dist/client/assets/packet-RMMSAZCW-CzbC-tXD.js +0 -1
  171. package/dist/client/assets/pie-UPGHQEXC-CmhYIo8p.js +0 -1
  172. package/dist/client/assets/pieDiagram-SKSYHLDU-CGWbtgxq.js +0 -30
  173. package/dist/client/assets/radar-KQ55EAFF-BCa9lsCc.js +0 -1
  174. package/dist/client/assets/requirementDiagram-Z7DCOOCP-Co1LyL5T.js +0 -73
  175. package/dist/client/assets/sequenceDiagram-2WXFIKYE-DGIEkdPm.js +0 -145
  176. package/dist/client/assets/src-DsmFf7gO.js +0 -1
  177. package/dist/client/assets/stateDiagram-RAJIS63D-DgjKbXnG.js +0 -1
  178. package/dist/client/assets/stateDiagram-v2-FVOUBMTO-gPrpjL74.js +0 -1
  179. package/dist/client/assets/timeline-definition-YZTLITO2-Dz2dVWjY.js +0 -61
  180. package/dist/client/assets/treemap-KZPCXAKY-DXiPfAB6.js +0 -1
  181. package/dist/client/assets/vennDiagram-LZ73GAT5-IIH5S1B6.js +0 -34
  182. /package/dist/client/assets/{array-DOVTz2Mq.js → array-BNor45A1.js} +0 -0
  183. /package/dist/client/assets/{defaultLocale-Ck2Xxk-C.js → defaultLocale-DPzUsThw.js} +0 -0
  184. /package/dist/client/assets/{init-Bft5Ffpj.js → init-C0L3woqb.js} +0 -0
  185. /package/dist/client/assets/{path-DfRbCp9y.js → path-sMK4d_s9.js} +0 -0
  186. /package/dist/client/assets/{prism-bash-6uMTC0Q2.js → prism-bash-iQBez6et.js} +0 -0
  187. /package/dist/client/assets/{prism-csharp-Dkc2OSmh.js → prism-csharp-C1RDHXRk.js} +0 -0
  188. /package/dist/client/assets/{prism-dart-iZy_wlz-.js → prism-dart-nIH9vDUM.js} +0 -0
  189. /package/dist/client/assets/{prism-elixir-BIzI9WJK.js → prism-elixir-DUMUOd7H.js} +0 -0
  190. /package/dist/client/assets/{prism-hcl-Bx2FGBKG.js → prism-hcl-C-ZHJGEE.js} +0 -0
  191. /package/dist/client/assets/{prism-java-DBXf7fH0.js → prism-java-scuShSv5.js} +0 -0
  192. /package/dist/client/assets/{prism-markup-templating-DS0ksKLt.js → prism-markup-templating-BFXREXfb.js} +0 -0
  193. /package/dist/client/assets/{prism-perl-BlhPiMfT.js → prism-perl-BBDKnHRR.js} +0 -0
  194. /package/dist/client/assets/{prism-php-DVtOAJsW.js → prism-php-DjIafOi_.js} +0 -0
  195. /package/dist/client/assets/{prism-protobuf-BUsrNVvv.js → prism-protobuf-BE1MoFmZ.js} +0 -0
  196. /package/dist/client/assets/{prism-ruby-Saes64I6.js → prism-ruby-CZ-lrXfL.js} +0 -0
  197. /package/dist/client/assets/{prism-scala-ANOINMog.js → prism-scala-DgnxHuDn.js} +0 -0
  198. /package/dist/client/assets/{prism-solidity-C5Mx5y66.js → prism-solidity-5fSUcW9Y.js} +0 -0
  199. /package/dist/client/assets/{prism-sql-D5pwK0Dp.js → prism-sql-CKkohPI_.js} +0 -0
  200. /package/dist/client/assets/{prism-vim-BSZSu-gX.js → prism-vim-CkRmxTmK.js} +0 -0
  201. /package/dist/client/assets/{rough.esm-KjoEK0it.js → rough.esm-DeLgKbOI.js} +0 -0
@@ -33,6 +33,11 @@ vi.mock('./git-diff.js', () => {
33
33
  parseDiff = vi.fn().mockResolvedValue({
34
34
  targetCommit: 'abc123',
35
35
  baseCommit: 'def456',
36
+ baseCommitish: 'def4567',
37
+ targetCommitish: 'abc1234',
38
+ requestedBaseCommitish: 'HEAD^',
39
+ requestedTargetCommitish: 'HEAD',
40
+ requestedBaseMode: undefined,
36
41
  targetMessage: 'Test commit',
37
42
  baseMessage: 'Previous commit',
38
43
  files: [
@@ -192,8 +197,7 @@ describe('Server Integration Tests', () => {
192
197
  // Use a high port number to avoid conflicts
193
198
  const preferredPort = 9000;
194
199
  const result = await startServer({
195
- targetCommitish: 'HEAD',
196
- baseCommitish: 'HEAD^',
200
+ selection: { targetCommitish: 'HEAD', baseCommitish: 'HEAD^' },
197
201
  preferredPort,
198
202
  });
199
203
  servers.push(result.server); // Track for cleanup
@@ -206,15 +210,13 @@ describe('Server Integration Tests', () => {
206
210
  const preferredPort = 9010;
207
211
  // Start server on port 9010
208
212
  const firstServer = await startServer({
209
- targetCommitish: 'HEAD',
210
- baseCommitish: 'HEAD^',
213
+ selection: { targetCommitish: 'HEAD', baseCommitish: 'HEAD^' },
211
214
  preferredPort,
212
215
  });
213
216
  servers.push(firstServer.server);
214
217
  // Try to start another server on the same port
215
218
  const secondServer = await startServer({
216
- targetCommitish: 'HEAD',
217
- baseCommitish: 'HEAD^',
219
+ selection: { targetCommitish: 'HEAD', baseCommitish: 'HEAD^' },
218
220
  preferredPort,
219
221
  });
220
222
  servers.push(secondServer.server);
@@ -224,8 +226,7 @@ describe('Server Integration Tests', () => {
224
226
  });
225
227
  it('binds to specified host', async () => {
226
228
  const result = await startServer({
227
- targetCommitish: 'HEAD',
228
- baseCommitish: 'HEAD^',
229
+ selection: { targetCommitish: 'HEAD', baseCommitish: 'HEAD^' },
229
230
  host: '0.0.0.0',
230
231
  preferredPort: 9020,
231
232
  });
@@ -234,22 +235,20 @@ describe('Server Integration Tests', () => {
234
235
  });
235
236
  it('passes context lines to the initial diff load', async () => {
236
237
  const result = await startServer({
237
- targetCommitish: 'HEAD',
238
- baseCommitish: 'HEAD^',
238
+ selection: { targetCommitish: 'HEAD', baseCommitish: 'HEAD^' },
239
239
  preferredPort: 9025,
240
240
  contextLines: 4,
241
241
  });
242
242
  servers.push(result.server);
243
243
  const parser = parserInstances.at(-1);
244
- expect(parser?.parseDiff).toHaveBeenCalledWith('HEAD', 'HEAD^', false, 4);
244
+ expect(parser?.parseDiff).toHaveBeenCalledWith({ targetCommitish: 'HEAD', baseCommitish: 'HEAD^' }, false, 4);
245
245
  });
246
246
  });
247
247
  describe('API endpoints', () => {
248
248
  let port;
249
249
  beforeEach(async () => {
250
250
  const result = await startServer({
251
- targetCommitish: 'HEAD',
252
- baseCommitish: 'HEAD^',
251
+ selection: { targetCommitish: 'HEAD', baseCommitish: 'HEAD^' },
253
252
  preferredPort: 9030,
254
253
  });
255
254
  servers.push(result.server);
@@ -266,6 +265,8 @@ describe('Server Integration Tests', () => {
266
265
  expect(data.files[0]).toHaveProperty('path', 'test.js');
267
266
  expect(data).toHaveProperty('ignoreWhitespace', false);
268
267
  expect(data).toHaveProperty('openInEditorAvailable', true);
268
+ expect(data).toHaveProperty('requestedBaseCommitish', 'HEAD^');
269
+ expect(data).toHaveProperty('requestedTargetCommitish', 'HEAD');
269
270
  });
270
271
  it('GET /api/diff?ignoreWhitespace=true handles whitespace ignore', async () => {
271
272
  const response = await fetch(`http://localhost:${port}/api/diff?ignoreWhitespace=true`);
@@ -275,8 +276,7 @@ describe('Server Integration Tests', () => {
275
276
  });
276
277
  it('GET /api/diff preserves context lines when recalculating revisions', async () => {
277
278
  const result = await startServer({
278
- targetCommitish: 'HEAD',
279
- baseCommitish: 'HEAD^',
279
+ selection: { targetCommitish: 'HEAD', baseCommitish: 'HEAD^' },
280
280
  preferredPort: 9031,
281
281
  contextLines: 2,
282
282
  });
@@ -285,7 +285,78 @@ describe('Server Integration Tests', () => {
285
285
  parser?.parseDiff.mockClear();
286
286
  const response = await fetch(`http://localhost:${result.port}/api/diff?base=main&target=feature&ignoreWhitespace=true`);
287
287
  expect(response.ok).toBe(true);
288
- expect(parser?.parseDiff).toHaveBeenCalledWith('feature', 'main', true, 2);
288
+ expect(parser?.parseDiff).toHaveBeenCalledWith({ targetCommitish: 'feature', baseCommitish: 'main' }, true, 2);
289
+ });
290
+ it('GET /api/diff passes baseMode through to the parser', async () => {
291
+ const parser = parserInstances.at(-1);
292
+ parser?.parseDiff.mockClear();
293
+ parser?.parseDiff.mockResolvedValueOnce({
294
+ targetCommit: 'abc123',
295
+ baseCommit: 'def456',
296
+ baseCommitish: 'fedcba9',
297
+ targetCommitish: '.',
298
+ requestedBaseCommitish: 'origin/main',
299
+ requestedTargetCommitish: '.',
300
+ requestedBaseMode: 'merge-base',
301
+ files: [],
302
+ isEmpty: true,
303
+ });
304
+ const response = await fetch(`http://localhost:${port}/api/diff?base=origin%2Fmain&target=.&baseMode=merge-base`);
305
+ const data = (await response.json());
306
+ expect(response.ok).toBe(true);
307
+ expect(parser?.parseDiff).toHaveBeenCalledWith({
308
+ targetCommitish: '.',
309
+ baseCommitish: 'origin/main',
310
+ baseMode: 'merge-base',
311
+ }, false, undefined);
312
+ expect(data.requestedBaseMode).toBe('merge-base');
313
+ expect(data.baseCommitish).toBe('fedcba9');
314
+ expect(data.requestedBaseCommitish).toBe('origin/main');
315
+ });
316
+ it('GET /api/diff caches results per revision pair instead of reusing the last request', async () => {
317
+ const result = await startServer({
318
+ selection: { targetCommitish: 'HEAD', baseCommitish: 'HEAD^' },
319
+ preferredPort: 9032,
320
+ });
321
+ servers.push(result.server);
322
+ const parser = parserInstances.at(-1);
323
+ parser?.parseDiff.mockClear();
324
+ const firstResponse = await fetch(`http://localhost:${result.port}/api/diff?base=main&target=feature`);
325
+ expect(firstResponse.ok).toBe(true);
326
+ const secondResponse = await fetch(`http://localhost:${result.port}/api/diff?base=HEAD%5E&target=HEAD`);
327
+ expect(secondResponse.ok).toBe(true);
328
+ const thirdResponse = await fetch(`http://localhost:${result.port}/api/diff?base=main&target=feature`);
329
+ expect(thirdResponse.ok).toBe(true);
330
+ expect(parser?.parseDiff).toHaveBeenCalledTimes(1);
331
+ expect(parser?.parseDiff).toHaveBeenNthCalledWith(1, { targetCommitish: 'feature', baseCommitish: 'main' }, false, undefined);
332
+ });
333
+ it('GET /api/diff evicts least recently used cached diff responses', async () => {
334
+ const result = await startServer({
335
+ selection: { targetCommitish: 'HEAD', baseCommitish: 'HEAD^' },
336
+ preferredPort: 9033,
337
+ });
338
+ servers.push(result.server);
339
+ const parser = parserInstances.at(-1);
340
+ parser?.parseDiff.mockClear();
341
+ const revisionPairs = [
342
+ ['base-a', 'target-a'],
343
+ ['base-b', 'target-b'],
344
+ ['base-c', 'target-c'],
345
+ ['base-d', 'target-d'],
346
+ ['base-e', 'target-e'],
347
+ ['base-f', 'target-f'],
348
+ ['base-g', 'target-g'],
349
+ ['base-h', 'target-h'],
350
+ ['base-i', 'target-i'],
351
+ ];
352
+ for (const [base, target] of revisionPairs) {
353
+ const response = await fetch(`http://localhost:${result.port}/api/diff?base=${base}&target=${target}`);
354
+ expect(response.ok).toBe(true);
355
+ }
356
+ const revisitedResponse = await fetch(`http://localhost:${result.port}/api/diff?base=base-a&target=target-a`);
357
+ expect(revisitedResponse.ok).toBe(true);
358
+ expect(parser?.parseDiff).toHaveBeenCalledTimes(10);
359
+ expect(parser?.parseDiff).toHaveBeenLastCalledWith({ targetCommitish: 'target-a', baseCommitish: 'base-a' }, false, undefined);
289
360
  });
290
361
  it('GET /api/diff returns comment import payload when configured', async () => {
291
362
  const importedComments = [
@@ -297,8 +368,7 @@ describe('Server Integration Tests', () => {
297
368
  },
298
369
  ];
299
370
  const importServer = await startServer({
300
- targetCommitish: 'HEAD',
301
- baseCommitish: 'HEAD^',
371
+ selection: { targetCommitish: 'HEAD', baseCommitish: 'HEAD^' },
302
372
  preferredPort: 9034,
303
373
  commentImports: importedComments,
304
374
  });
@@ -319,8 +389,7 @@ describe('Server Integration Tests', () => {
319
389
  },
320
390
  ];
321
391
  const importServer = await startServer({
322
- targetCommitish: 'HEAD',
323
- baseCommitish: 'HEAD^',
392
+ selection: { targetCommitish: 'HEAD', baseCommitish: 'HEAD^' },
324
393
  preferredPort: 9037,
325
394
  clearComments: true,
326
395
  commentImports: importedComments,
@@ -343,8 +412,7 @@ describe('Server Integration Tests', () => {
343
412
  },
344
413
  ];
345
414
  const importServer = await startServer({
346
- targetCommitish: 'HEAD',
347
- baseCommitish: 'HEAD^',
415
+ selection: { targetCommitish: 'HEAD', baseCommitish: 'HEAD^' },
348
416
  preferredPort: 9038,
349
417
  commentImports: importedComments,
350
418
  });
@@ -502,8 +570,7 @@ describe('Server Integration Tests', () => {
502
570
  it('serves dev mode HTML in development', async () => {
503
571
  process.env.NODE_ENV = 'development';
504
572
  const result = await startServer({
505
- targetCommitish: 'HEAD',
506
- baseCommitish: 'HEAD^',
573
+ selection: { targetCommitish: 'HEAD', baseCommitish: 'HEAD^' },
507
574
  preferredPort: 9040,
508
575
  });
509
576
  servers.push(result.server);
@@ -516,8 +583,7 @@ describe('Server Integration Tests', () => {
516
583
  it('serves static files in production mode', async () => {
517
584
  process.env.NODE_ENV = 'production';
518
585
  const result = await startServer({
519
- targetCommitish: 'HEAD',
520
- baseCommitish: 'HEAD^',
586
+ selection: { targetCommitish: 'HEAD', baseCommitish: 'HEAD^' },
521
587
  preferredPort: 9050,
522
588
  });
523
589
  servers.push(result.server);
@@ -531,8 +597,7 @@ describe('Server Integration Tests', () => {
531
597
  it('returns 404 for unknown paths in production mode', async () => {
532
598
  process.env.NODE_ENV = 'production';
533
599
  const result = await startServer({
534
- targetCommitish: 'HEAD',
535
- baseCommitish: 'HEAD^',
600
+ selection: { targetCommitish: 'HEAD', baseCommitish: 'HEAD^' },
536
601
  preferredPort: 9055,
537
602
  });
538
603
  servers.push(result.server);
@@ -544,8 +609,7 @@ describe('Server Integration Tests', () => {
544
609
  it('accepts mode option in server configuration', async () => {
545
610
  // Test that mode option is accepted without error
546
611
  const result = await startServer({
547
- targetCommitish: 'HEAD',
548
- baseCommitish: 'HEAD^',
612
+ selection: { targetCommitish: 'HEAD', baseCommitish: 'HEAD^' },
549
613
  mode: 'unified',
550
614
  });
551
615
  servers.push(result.server);
@@ -554,14 +618,12 @@ describe('Server Integration Tests', () => {
554
618
  });
555
619
  it('accepts different mode values', async () => {
556
620
  const inlineResult = await startServer({
557
- targetCommitish: 'HEAD',
558
- baseCommitish: 'HEAD^',
621
+ selection: { targetCommitish: 'HEAD', baseCommitish: 'HEAD^' },
559
622
  mode: 'unified',
560
623
  });
561
624
  servers.push(inlineResult.server);
562
625
  const sideBySideResult = await startServer({
563
- targetCommitish: 'HEAD',
564
- baseCommitish: 'HEAD^',
626
+ selection: { targetCommitish: 'HEAD', baseCommitish: 'HEAD^' },
565
627
  mode: 'split',
566
628
  });
567
629
  servers.push(sideBySideResult.server);
@@ -570,8 +632,7 @@ describe('Server Integration Tests', () => {
570
632
  });
571
633
  it('mode option should be included in diff response', async () => {
572
634
  const result = await startServer({
573
- targetCommitish: 'HEAD',
574
- baseCommitish: 'HEAD^',
635
+ selection: { targetCommitish: 'HEAD', baseCommitish: 'HEAD^' },
575
636
  mode: 'inline',
576
637
  });
577
638
  servers.push(result.server);
@@ -584,14 +645,14 @@ describe('Server Integration Tests', () => {
584
645
  describe('Revision options API', () => {
585
646
  it('returns available revisions', async () => {
586
647
  const result = await startServer({
587
- targetCommitish: 'HEAD',
588
- baseCommitish: 'HEAD^',
648
+ selection: { targetCommitish: 'HEAD', baseCommitish: 'HEAD^' },
589
649
  });
590
650
  servers.push(result.server);
591
651
  const response = await fetch(`http://localhost:${result.port}/api/revisions`);
592
652
  const data = (await response.json());
593
653
  expect(response.ok).toBe(true);
594
654
  expect(data.specialOptions).toHaveLength(3);
655
+ expect(data.specialOptions).not.toContainEqual({ value: 'merge-base', label: 'Merge Base' });
595
656
  expect(data.branches).toEqual([{ name: 'main', current: true }]);
596
657
  expect(data.commits).toEqual([
597
658
  { hash: 'abc1234', shortHash: 'abc1234', message: 'Test commit' },
@@ -609,8 +670,7 @@ describe('Server Integration Tests', () => {
609
670
  });
610
671
  it('handles malformed comment data', async () => {
611
672
  const result = await startServer({
612
- targetCommitish: 'HEAD',
613
- baseCommitish: 'HEAD^',
673
+ selection: { targetCommitish: 'HEAD', baseCommitish: 'HEAD^' },
614
674
  });
615
675
  servers.push(result.server);
616
676
  const response = await fetch(`http://localhost:${result.port}/api/comments`, {
@@ -632,8 +692,7 @@ describe('Server Integration Tests', () => {
632
692
  describe('CORS configuration', () => {
633
693
  it('sets correct CORS headers', async () => {
634
694
  const result = await startServer({
635
- targetCommitish: 'HEAD',
636
- baseCommitish: 'HEAD^',
695
+ selection: { targetCommitish: 'HEAD', baseCommitish: 'HEAD^' },
637
696
  });
638
697
  servers.push(result.server);
639
698
  const response = await fetch(`http://localhost:${result.port}/api/diff`);
@@ -646,8 +705,7 @@ describe('Server Integration Tests', () => {
646
705
  let port;
647
706
  beforeEach(async () => {
648
707
  const result = await startServer({
649
- targetCommitish: 'HEAD',
650
- baseCommitish: 'HEAD^',
708
+ selection: { targetCommitish: 'HEAD', baseCommitish: 'HEAD^' },
651
709
  preferredPort: 9050,
652
710
  });
653
711
  servers.push(result.server);
@@ -679,8 +737,7 @@ describe('Server Integration Tests', () => {
679
737
  let port;
680
738
  beforeEach(async () => {
681
739
  const result = await startServer({
682
- targetCommitish: 'HEAD',
683
- baseCommitish: 'HEAD^',
740
+ selection: { targetCommitish: 'HEAD', baseCommitish: 'HEAD^' },
684
741
  preferredPort: 9060,
685
742
  });
686
743
  servers.push(result.server);
@@ -765,8 +822,7 @@ describe('Server Integration Tests', () => {
765
822
  describe('Keep-alive option', () => {
766
823
  it('accepts keepAlive option without error', async () => {
767
824
  const { port, server } = await startServer({
768
- targetCommitish: 'HEAD',
769
- baseCommitish: 'HEAD^',
825
+ selection: { targetCommitish: 'HEAD', baseCommitish: 'HEAD^' },
770
826
  keepAlive: true,
771
827
  });
772
828
  servers.push(server);
@@ -774,16 +830,14 @@ describe('Server Integration Tests', () => {
774
830
  });
775
831
  it('starts normally without keepAlive option', async () => {
776
832
  const { port, server } = await startServer({
777
- targetCommitish: 'HEAD',
778
- baseCommitish: 'HEAD^',
833
+ selection: { targetCommitish: 'HEAD', baseCommitish: 'HEAD^' },
779
834
  });
780
835
  servers.push(server);
781
836
  expect(port).toBeGreaterThanOrEqual(4966);
782
837
  });
783
838
  it('does not call process.exit on client disconnect when keepAlive is true', async () => {
784
839
  const { port, server } = await startServer({
785
- targetCommitish: 'HEAD',
786
- baseCommitish: 'HEAD^',
840
+ selection: { targetCommitish: 'HEAD', baseCommitish: 'HEAD^' },
787
841
  keepAlive: true,
788
842
  preferredPort: 9070,
789
843
  });
@@ -811,8 +865,7 @@ describe('Server Integration Tests', () => {
811
865
  });
812
866
  it('calls process.exit on client disconnect when keepAlive is false', async () => {
813
867
  const { port, server } = await startServer({
814
- targetCommitish: 'HEAD',
815
- baseCommitish: 'HEAD^',
868
+ selection: { targetCommitish: 'HEAD', baseCommitish: 'HEAD^' },
816
869
  keepAlive: false,
817
870
  preferredPort: 9080,
818
871
  });
@@ -841,8 +894,7 @@ describe('Server Integration Tests', () => {
841
894
  describe('Clear Comments functionality', () => {
842
895
  it('includes clearComments flag in diff response when provided', async () => {
843
896
  const { port, server } = await startServer({
844
- targetCommitish: 'HEAD',
845
- baseCommitish: 'HEAD^',
897
+ selection: { targetCommitish: 'HEAD', baseCommitish: 'HEAD^' },
846
898
  clearComments: true,
847
899
  });
848
900
  servers.push(server);
@@ -853,8 +905,7 @@ describe('Server Integration Tests', () => {
853
905
  });
854
906
  it('does not include clearComments flag when not provided', async () => {
855
907
  const { port, server } = await startServer({
856
- targetCommitish: 'HEAD',
857
- baseCommitish: 'HEAD^',
908
+ selection: { targetCommitish: 'HEAD', baseCommitish: 'HEAD^' },
858
909
  });
859
910
  servers.push(server);
860
911
  const response = await fetch(`http://localhost:${port}/api/diff`);
@@ -864,8 +915,7 @@ describe('Server Integration Tests', () => {
864
915
  });
865
916
  it('preserves clearComments flag across diff requests', async () => {
866
917
  const { port, server } = await startServer({
867
- targetCommitish: 'HEAD',
868
- baseCommitish: 'HEAD^',
918
+ selection: { targetCommitish: 'HEAD', baseCommitish: 'HEAD^' },
869
919
  clearComments: true,
870
920
  });
871
921
  servers.push(server);
package/dist/tui/App.d.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  import React from 'react';
2
+ import { type DiffSelection } from '../types/diff.js';
2
3
  interface AppProps {
3
- targetCommitish: string;
4
- baseCommitish: string;
4
+ selection: DiffSelection;
5
5
  mode?: string;
6
6
  repoPath?: string;
7
7
  contextLines?: number;
package/dist/tui/App.js CHANGED
@@ -6,7 +6,8 @@ import DiffViewer from './components/DiffViewer.js';
6
6
  import FileList from './components/FileList.js';
7
7
  import SideBySideDiffViewer from './components/SideBySideDiffViewer.js';
8
8
  import StatusBar from './components/StatusBar.js';
9
- const App = ({ targetCommitish, baseCommitish, mode, repoPath, contextLines, }) => {
9
+ const App = ({ selection, mode, repoPath, contextLines }) => {
10
+ const { targetCommitish, baseCommitish } = selection;
10
11
  const [files, setFiles] = useState([]);
11
12
  const [selectedFileIndex, setSelectedFileIndex] = useState(0);
12
13
  const [loading, setLoading] = useState(true);
@@ -17,7 +18,7 @@ const App = ({ targetCommitish, baseCommitish, mode, repoPath, contextLines, })
17
18
  setLoading(true);
18
19
  setError(null);
19
20
  try {
20
- const fileDiffs = await loadGitDiff(targetCommitish, baseCommitish, repoPath, contextLines);
21
+ const fileDiffs = await loadGitDiff(selection, repoPath, contextLines);
21
22
  setFiles(fileDiffs);
22
23
  setLoading(false);
23
24
  }
@@ -30,7 +31,7 @@ const App = ({ targetCommitish, baseCommitish, mode, repoPath, contextLines, })
30
31
  // oxlint-disable-next-line react-hooks-js/set-state-in-effect -- intentional: trigger initial diff load when revisions change
31
32
  void loadDiff();
32
33
  // oxlint-disable-next-line react/exhaustive-deps
33
- }, [targetCommitish, baseCommitish]);
34
+ }, [baseCommitish, targetCommitish]);
34
35
  useInput((input, key) => {
35
36
  if (input === 'q' || (key.ctrl && input === 'c')) {
36
37
  exit();
@@ -46,6 +46,12 @@ export interface DiffCommentCodeSnapshot {
46
46
  content: string;
47
47
  language?: string;
48
48
  }
49
+ export type BaseMode = 'direct' | 'merge-base';
50
+ export interface DiffSelection {
51
+ baseCommitish: string;
52
+ targetCommitish: string;
53
+ baseMode?: BaseMode;
54
+ }
49
55
  export interface DiffResponse {
50
56
  commit: string;
51
57
  files: DiffFile[];
@@ -57,6 +63,7 @@ export interface DiffResponse {
57
63
  targetCommitish?: string;
58
64
  requestedBaseCommitish?: string;
59
65
  requestedTargetCommitish?: string;
66
+ requestedBaseMode?: BaseMode;
60
67
  clearComments?: boolean;
61
68
  repositoryId?: string;
62
69
  commentImports?: CommentImport[];
@@ -144,6 +151,7 @@ export interface DiffContextStorage {
144
151
  version: 2;
145
152
  baseCommitish: string;
146
153
  targetCommitish: string;
154
+ baseMode?: BaseMode;
147
155
  createdAt: string;
148
156
  lastModifiedAt: string;
149
157
  threads: DiffCommentThread[];
@@ -0,0 +1,6 @@
1
+ import type { BaseMode, DiffSelection } from '../types/diff.js';
2
+ export declare function normalizeBaseMode(baseMode?: BaseMode): BaseMode;
3
+ export declare function createDiffSelection(baseCommitish: string, targetCommitish: string, baseMode?: BaseMode): DiffSelection;
4
+ export declare function diffSelectionsEqual(left: DiffSelection | null | undefined, right: DiffSelection | null | undefined): boolean;
5
+ export declare function getDiffSelectionKey(selection: DiffSelection): string;
6
+ export declare function getMergeBaseTargetRef(targetCommitish: string): string;
@@ -0,0 +1,30 @@
1
+ export function normalizeBaseMode(baseMode) {
2
+ return baseMode ?? 'direct';
3
+ }
4
+ export function createDiffSelection(baseCommitish, targetCommitish, baseMode) {
5
+ if (normalizeBaseMode(baseMode) === 'merge-base') {
6
+ return {
7
+ baseCommitish,
8
+ targetCommitish,
9
+ baseMode: 'merge-base',
10
+ };
11
+ }
12
+ return {
13
+ baseCommitish,
14
+ targetCommitish,
15
+ };
16
+ }
17
+ export function diffSelectionsEqual(left, right) {
18
+ return (left?.baseCommitish === right?.baseCommitish &&
19
+ left?.targetCommitish === right?.targetCommitish &&
20
+ normalizeBaseMode(left?.baseMode) === normalizeBaseMode(right?.baseMode));
21
+ }
22
+ export function getDiffSelectionKey(selection) {
23
+ return `${selection.baseCommitish}:${selection.targetCommitish}:${normalizeBaseMode(selection.baseMode)}`;
24
+ }
25
+ export function getMergeBaseTargetRef(targetCommitish) {
26
+ if (targetCommitish === '.' || targetCommitish === 'staged' || targetCommitish === 'working') {
27
+ return 'HEAD';
28
+ }
29
+ return targetCommitish;
30
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "difit",
3
- "version": "4.0.2",
3
+ "version": "4.0.4",
4
4
  "description": "A lightweight command-line tool that spins up a local web server to display Git commit diffs in a GitHub-like Files changed view",
5
5
  "keywords": [
6
6
  "cli",
@@ -64,8 +64,8 @@
64
64
  "commander": "^14.0.0",
65
65
  "diff": "^8.0.2",
66
66
  "express": "^5.1.0",
67
- "ink": "^6.0.1",
68
- "lucide-react": "^0.577.0",
67
+ "ink": "^7.0.0",
68
+ "lucide-react": "^1.0.0",
69
69
  "mermaid": "^11.13.0",
70
70
  "open": "^11.0.0",
71
71
  "prism-react-renderer": "^2.4.1",
@@ -91,21 +91,21 @@
91
91
  "autoprefixer": "^10.4.21",
92
92
  "eslint-plugin-react-hooks": "^7.0.1",
93
93
  "happy-dom": "^20.0.0",
94
- "knip": "^5.83.0",
94
+ "knip": "^6.0.0",
95
95
  "lefthook": "^2.0.0",
96
- "oxfmt": "^0.41.0",
96
+ "oxfmt": "^0.44.0",
97
97
  "oxlint": "^1.49.0",
98
- "oxlint-tsgolint": "^0.17.0",
98
+ "oxlint-tsgolint": "^0.20.0",
99
99
  "playwright": "^1.54.1",
100
100
  "postcss": "^8.5.6",
101
101
  "tailwindcss": "^4.1.11",
102
- "typescript": "^5.8.3",
103
- "undici": "^7.11.0",
102
+ "typescript": "^6.0.0",
103
+ "undici": "^8.0.0",
104
104
  "vite": "^8.0.0",
105
105
  "vitest": "^4.0.6"
106
106
  },
107
107
  "engines": {
108
108
  "node": ">=21.0.0"
109
109
  },
110
- "packageManager": "pnpm@10.32.1"
110
+ "packageManager": "pnpm@10.33.0"
111
111
  }
@@ -1 +0,0 @@
1
- import{A as e,B as t,C as n,E as r,H as i,M as a,U as o,V as s,k as c,p as l,w as u,z as d}from"./isArrayLikeObject-icl0H0jo.js";import{A as f,C as p,D as m,M as h,N as g,S as _,T as v,f as y,h as b,u as x,w as S}from"./_baseUniq-b7bzdUSn.js";var C=/\s/;function w(e){for(var t=e.length;t--&&C.test(e.charAt(t)););return t}var ee=/^\s+/;function T(e){return e&&e.slice(0,w(e)+1).replace(ee,``)}var E=NaN,D=/^[-+]0x[0-9a-f]+$/i,O=/^0b[01]+$/i,k=/^0o[0-7]+$/i,A=parseInt;function j(e){if(typeof e==`number`)return e;if(g(e))return E;if(t(e)){var n=typeof e.valueOf==`function`?e.valueOf():e;e=t(n)?n+``:n}if(typeof e!=`string`)return e===0?e:+e;e=T(e);var r=O.test(e);return r||k.test(e)?A(e.slice(2),r?2:8):D.test(e)?E:+e}var M=1/0,N=17976931348623157e292;function P(e){return e?(e=j(e),e===M||e===-M?(e<0?-1:1)*N:e===e?e:0):e===0?e:0}function F(e){var t=P(e),n=t%1;return t===t?n?t-n:t:0}function I(e){return e!=null&&e.length?_(e,1):[]}var L=Object.prototype,R=L.hasOwnProperty,z=r(function(t,r){t=Object(t);var i=-1,a=r.length,o=a>2?r[2]:void 0;for(o&&n(r[0],r[1],o)&&(a=1);++i<a;)for(var s=r[i],c=l(s),u=-1,d=c.length;++u<d;){var f=c[u],p=t[f];(p===void 0||e(p,L[f])&&!R.call(t,f))&&(t[f]=s[f])}return t});function B(e){var t=e==null?0:e.length;return t?e[t-1]:void 0}function V(e){return function(t,n,r){var i=Object(t);if(!u(t)){var a=y(n,3);t=m(t),n=function(e){return a(i[e],e,i)}}var o=e(t,n,r);return o>-1?i[a?t[o]:o]:void 0}}var H=Math.max;function U(e,t,n){var r=e==null?0:e.length;if(!r)return-1;var i=n==null?0:F(n);return i<0&&(i=H(r+i,0)),f(e,y(t,3),i)}var W=V(U);function G(e,t){var n=-1,r=u(e)?Array(e.length):[];return x(e,function(e,i,a){r[++n]=t(e,i,a)}),r}function K(e,t){return(s(e)?h:G)(e,y(t,3))}var q=Object.prototype.hasOwnProperty;function J(e,t){return e!=null&&q.call(e,t)}function Y(e,t){return e!=null&&b(e,t,J)}var X=`[object String]`;function Z(e){return typeof e==`string`||!s(e)&&i(e)&&o(e)==X}function Q(e,t){return e<t}function $(e,t,n){for(var r=-1,i=e.length;++r<i;){var a=e[r],o=t(a);if(o!=null&&(s===void 0?o===o&&!g(o):n(o,s)))var s=o,c=a}return c}function te(e){return e&&e.length?$(e,d,Q):void 0}function ne(e,n,r,i){if(!t(e))return e;n=v(n,e);for(var o=-1,s=n.length,l=s-1,u=e;u!=null&&++o<s;){var d=S(n[o]),f=r;if(d===`__proto__`||d===`constructor`||d===`prototype`)return e;if(o!=l){var p=u[d];f=i?i(p,d,u):void 0,f===void 0&&(f=t(p)?p:a(n[o+1])?[]:{})}c(u,d,f),u=u[d]}return e}function re(e,t,n){for(var r=-1,i=t.length,a={};++r<i;){var o=t[r],s=p(e,o);n(s,o)&&ne(a,v(o,e),s)}return a}export{Z as a,G as c,z as d,I as f,Q as i,W as l,P as m,te as n,Y as o,F as p,$ as r,K as s,re as t,B as u};
@@ -1 +0,0 @@
1
- import{A as e,B as t,F as n,H as r,M as i,O as a,T as o,U as s,V as c,W as l,_ as u,a as d,b as f,c as p,d as m,g as h,h as g,i as _,k as v,l as y,n as ee,o as b,p as x,r as te,s as ne,u as re,v as ie,w as S,y as C,z as w}from"./isArrayLikeObject-icl0H0jo.js";import{i as ae,n as T,r as E}from"./isEmpty-Du8sNmkE.js";var oe=`[object Symbol]`;function D(e){return typeof e==`symbol`||r(e)&&s(e)==oe}function O(e,t){for(var n=-1,r=e==null?0:e.length,i=Array(r);++n<r;)i[n]=t(e[n],n,e);return i}var se=1/0,ce=l?l.prototype:void 0,le=ce?ce.toString:void 0;function ue(e){if(typeof e==`string`)return e;if(c(e))return O(e,ue)+``;if(D(e))return le?le.call(e):``;var t=e+``;return t==`0`&&1/e==-se?`-0`:t}function de(){}function fe(e,t){for(var n=-1,r=e==null?0:e.length;++n<r&&t(e[n],n,e)!==!1;);return e}function pe(e,t,n,r){for(var i=e.length,a=n+(r?1:-1);r?a--:++a<i;)if(t(e[a],a,e))return a;return-1}function me(e){return e!==e}function he(e,t,n){for(var r=n-1,i=e.length;++r<i;)if(e[r]===t)return r;return-1}function ge(e,t,n){return t===t?he(e,t,n):pe(e,me,n)}function _e(e,t){return!!(e!=null&&e.length)&&ge(e,t,0)>-1}function k(e){return S(e)?g(e):ae(e)}var ve=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,ye=/^\w*$/;function A(e,t){if(c(e))return!1;var n=typeof e;return n==`number`||n==`symbol`||n==`boolean`||e==null||D(e)?!0:ye.test(e)||!ve.test(e)||t!=null&&e in Object(t)}var be=500;function xe(e){var t=re(e,function(e){return n.size===be&&n.clear(),e}),n=t.cache;return t}var Se=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,Ce=/\\(\\)?/g,we=xe(function(e){var t=[];return e.charCodeAt(0)===46&&t.push(``),e.replace(Se,function(e,n,r,i){t.push(r?i.replace(Ce,`$1`):n||e)}),t});function j(e){return e==null?``:ue(e)}function M(e,t){return c(e)?e:A(e,t)?[e]:we(j(e))}var Te=1/0;function N(e){if(typeof e==`string`||D(e))return e;var t=e+``;return t==`0`&&1/e==-Te?`-0`:t}function P(e,t){t=M(t,e);for(var n=0,r=t.length;e!=null&&n<r;)e=e[N(t[n++])];return n&&n==r?e:void 0}function Ee(e,t,n){var r=e==null?void 0:P(e,t);return r===void 0?n:r}function F(e,t){for(var n=-1,r=t.length,i=e.length;++n<r;)e[i+n]=t[n];return e}var I=l?l.isConcatSpreadable:void 0;function De(e){return c(e)||f(e)||!!(I&&e&&e[I])}function L(e,t,n,r,i){var a=-1,o=e.length;for(n||=De,i||=[];++a<o;){var s=e[a];t>0&&n(s)?t>1?L(s,t-1,n,r,i):F(i,s):r||(i[i.length]=s)}return i}function Oe(e,t,n,r){var i=-1,a=e==null?0:e.length;for(r&&a&&(n=e[++i]);++i<a;)n=t(n,e[i],i,e);return n}function ke(e,t){return e&&a(t,k(t),e)}function Ae(e,t){return e&&a(t,x(t),e)}function R(e,t){for(var n=-1,r=e==null?0:e.length,i=0,a=[];++n<r;){var o=e[n];t(o,n,e)&&(a[i++]=o)}return a}function z(){return[]}var je=Object.prototype.propertyIsEnumerable,B=Object.getOwnPropertySymbols,V=B?function(e){return e==null?[]:(e=Object(e),R(B(e),function(t){return je.call(e,t)}))}:z;function Me(e,t){return a(e,V(e),t)}var Ne=Object.getOwnPropertySymbols?function(e){for(var t=[];e;)F(t,V(e)),e=y(e);return t}:z;function Pe(e,t){return a(e,Ne(e),t)}function Fe(e,t,n){var r=t(e);return c(e)?r:F(r,n(e))}function H(e){return Fe(e,k,V)}function Ie(e){return Fe(e,x,Ne)}var Le=Object.prototype.hasOwnProperty;function Re(e){var t=e.length,n=new e.constructor(t);return t&&typeof e[0]==`string`&&Le.call(e,`index`)&&(n.index=e.index,n.input=e.input),n}function ze(e,t){var n=t?d(e.buffer):e.buffer;return new e.constructor(n,e.byteOffset,e.byteLength)}var Be=/\w*$/;function Ve(e){var t=new e.constructor(e.source,Be.exec(e));return t.lastIndex=e.lastIndex,t}var He=l?l.prototype:void 0,Ue=He?He.valueOf:void 0;function We(e){return Ue?Object(Ue.call(e)):{}}var Ge=`[object Boolean]`,Ke=`[object Date]`,qe=`[object Map]`,Je=`[object Number]`,Ye=`[object RegExp]`,Xe=`[object Set]`,Ze=`[object String]`,Qe=`[object Symbol]`,$e=`[object ArrayBuffer]`,et=`[object DataView]`,tt=`[object Float32Array]`,nt=`[object Float64Array]`,rt=`[object Int8Array]`,it=`[object Int16Array]`,at=`[object Int32Array]`,ot=`[object Uint8Array]`,st=`[object Uint8ClampedArray]`,ct=`[object Uint16Array]`,lt=`[object Uint32Array]`;function ut(e,t,n){var r=e.constructor;switch(t){case $e:return d(e);case Ge:case Ke:return new r(+e);case et:return ze(e,n);case tt:case nt:case rt:case it:case at:case ot:case st:case ct:case lt:return _(e,n);case qe:return new r;case Je:case Ze:return new r(e);case Ye:return Ve(e);case Xe:return new r;case Qe:return We(e)}}var dt=`[object Map]`;function ft(e){return r(e)&&T(e)==dt}var pt=u&&u.isMap,mt=pt?ie(pt):ft,ht=`[object Set]`;function gt(e){return r(e)&&T(e)==ht}var _t=u&&u.isSet,vt=_t?ie(_t):gt,yt=1,bt=2,xt=4,St=`[object Arguments]`,Ct=`[object Array]`,wt=`[object Boolean]`,Tt=`[object Date]`,Et=`[object Error]`,Dt=`[object Function]`,Ot=`[object GeneratorFunction]`,kt=`[object Map]`,At=`[object Number]`,jt=`[object Object]`,Mt=`[object RegExp]`,Nt=`[object Set]`,Pt=`[object String]`,Ft=`[object Symbol]`,It=`[object WeakMap]`,Lt=`[object ArrayBuffer]`,Rt=`[object DataView]`,zt=`[object Float32Array]`,Bt=`[object Float64Array]`,Vt=`[object Int8Array]`,Ht=`[object Int16Array]`,Ut=`[object Int32Array]`,Wt=`[object Uint8Array]`,Gt=`[object Uint8ClampedArray]`,Kt=`[object Uint16Array]`,qt=`[object Uint32Array]`,U={};U[St]=U[Ct]=U[Lt]=U[Rt]=U[wt]=U[Tt]=U[zt]=U[Bt]=U[Vt]=U[Ht]=U[Ut]=U[kt]=U[At]=U[jt]=U[Mt]=U[Nt]=U[Pt]=U[Ft]=U[Wt]=U[Gt]=U[Kt]=U[qt]=!0,U[Et]=U[Dt]=U[It]=!1;function W(e,r,i,a,o,s){var l,u=r&yt,d=r&bt,f=r&xt;if(i&&(l=o?i(e,a,o,s):i(e)),l!==void 0)return l;if(!t(e))return e;var m=c(e);if(m){if(l=Re(e),!u)return n(e,l)}else{var h=T(e),g=h==Dt||h==Ot;if(C(e))return ne(e,u);if(h==jt||h==St||g&&!o){if(l=d||g?{}:te(e),!u)return d?Pe(e,Ae(l,e)):Me(e,ke(l,e))}else{if(!U[h])return o?e:{};l=ut(e,h,u)}}s||=new p;var _=s.get(e);if(_)return _;s.set(e,l),vt(e)?e.forEach(function(t){l.add(W(t,r,i,t,e,s))}):mt(e)&&e.forEach(function(t,n){l.set(n,W(t,r,i,n,e,s))});var y=m?void 0:(f?d?Ie:H:d?x:k)(e);return fe(y||e,function(t,n){y&&(n=t,t=e[n]),v(l,n,W(t,r,i,n,e,s))}),l}var Jt=`__lodash_hash_undefined__`;function Yt(e){return this.__data__.set(e,Jt),this}function Xt(e){return this.__data__.has(e)}function G(e){var t=-1,n=e==null?0:e.length;for(this.__data__=new m;++t<n;)this.add(e[t])}G.prototype.add=G.prototype.push=Yt,G.prototype.has=Xt;function Zt(e,t){for(var n=-1,r=e==null?0:e.length;++n<r;)if(t(e[n],n,e))return!0;return!1}function K(e,t){return e.has(t)}var Qt=1,$t=2;function en(e,t,n,r,i,a){var o=n&Qt,s=e.length,c=t.length;if(s!=c&&!(o&&c>s))return!1;var l=a.get(e),u=a.get(t);if(l&&u)return l==t&&u==e;var d=-1,f=!0,p=n&$t?new G:void 0;for(a.set(e,t),a.set(t,e);++d<s;){var m=e[d],h=t[d];if(r)var g=o?r(h,m,d,t,e,a):r(m,h,d,e,t,a);if(g!==void 0){if(g)continue;f=!1;break}if(p){if(!Zt(t,function(e,t){if(!K(p,t)&&(m===e||i(m,e,n,r,a)))return p.push(t)})){f=!1;break}}else if(!(m===h||i(m,h,n,r,a))){f=!1;break}}return a.delete(e),a.delete(t),f}function tn(e){var t=-1,n=Array(e.size);return e.forEach(function(e,r){n[++t]=[r,e]}),n}function q(e){var t=-1,n=Array(e.size);return e.forEach(function(e){n[++t]=e}),n}var nn=1,rn=2,an=`[object Boolean]`,on=`[object Date]`,sn=`[object Error]`,cn=`[object Map]`,ln=`[object Number]`,un=`[object RegExp]`,dn=`[object Set]`,fn=`[object String]`,pn=`[object Symbol]`,mn=`[object ArrayBuffer]`,hn=`[object DataView]`,gn=l?l.prototype:void 0,J=gn?gn.valueOf:void 0;function _n(t,n,r,i,a,o,s){switch(r){case hn:if(t.byteLength!=n.byteLength||t.byteOffset!=n.byteOffset)return!1;t=t.buffer,n=n.buffer;case mn:return!(t.byteLength!=n.byteLength||!o(new b(t),new b(n)));case an:case on:case ln:return e(+t,+n);case sn:return t.name==n.name&&t.message==n.message;case un:case fn:return t==n+``;case cn:var c=tn;case dn:var l=i&nn;if(c||=q,t.size!=n.size&&!l)return!1;var u=s.get(t);if(u)return u==n;i|=rn,s.set(t,n);var d=en(c(t),c(n),i,a,o,s);return s.delete(t),d;case pn:if(J)return J.call(t)==J.call(n)}return!1}var vn=1,yn=Object.prototype.hasOwnProperty;function bn(e,t,n,r,i,a){var o=n&vn,s=H(e),c=s.length;if(c!=H(t).length&&!o)return!1;for(var l=c;l--;){var u=s[l];if(!(o?u in t:yn.call(t,u)))return!1}var d=a.get(e),f=a.get(t);if(d&&f)return d==t&&f==e;var p=!0;a.set(e,t),a.set(t,e);for(var m=o;++l<c;){u=s[l];var h=e[u],g=t[u];if(r)var _=o?r(g,h,u,t,e,a):r(h,g,u,e,t,a);if(!(_===void 0?h===g||i(h,g,n,r,a):_)){p=!1;break}m||=u==`constructor`}if(p&&!m){var v=e.constructor,y=t.constructor;v!=y&&`constructor`in e&&`constructor`in t&&!(typeof v==`function`&&v instanceof v&&typeof y==`function`&&y instanceof y)&&(p=!1)}return a.delete(e),a.delete(t),p}var xn=1,Sn=`[object Arguments]`,Cn=`[object Array]`,Y=`[object Object]`,wn=Object.prototype.hasOwnProperty;function Tn(e,t,n,r,i,a){var o=c(e),s=c(t),l=o?Cn:T(e),u=s?Cn:T(t);l=l==Sn?Y:l,u=u==Sn?Y:u;var d=l==Y,f=u==Y,m=l==u;if(m&&C(e)){if(!C(t))return!1;o=!0,d=!1}if(m&&!d)return a||=new p,o||h(e)?en(e,t,n,r,i,a):_n(e,t,l,n,r,i,a);if(!(n&xn)){var g=d&&wn.call(e,`__wrapped__`),_=f&&wn.call(t,`__wrapped__`);if(g||_){var v=g?e.value():e,y=_?t.value():t;return a||=new p,i(v,y,n,r,a)}}return m?(a||=new p,bn(e,t,n,r,i,a)):!1}function X(e,t,n,i,a){return e===t?!0:e==null||t==null||!r(e)&&!r(t)?e!==e&&t!==t:Tn(e,t,n,i,X,a)}var En=1,Dn=2;function On(e,t,n,r){var i=n.length,a=i,o=!r;if(e==null)return!a;for(e=Object(e);i--;){var s=n[i];if(o&&s[2]?s[1]!==e[s[0]]:!(s[0]in e))return!1}for(;++i<a;){s=n[i];var c=s[0],l=e[c],u=s[1];if(o&&s[2]){if(l===void 0&&!(c in e))return!1}else{var d=new p;if(r)var f=r(l,u,c,e,t,d);if(!(f===void 0?X(u,l,En|Dn,r,d):f))return!1}}return!0}function kn(e){return e===e&&!t(e)}function An(e){for(var t=k(e),n=t.length;n--;){var r=t[n],i=e[r];t[n]=[r,i,kn(i)]}return t}function Z(e,t){return function(n){return n==null?!1:n[e]===t&&(t!==void 0||e in Object(n))}}function jn(e){var t=An(e);return t.length==1&&t[0][2]?Z(t[0][0],t[0][1]):function(n){return n===e||On(n,e,t)}}function Mn(e,t){return e!=null&&t in Object(e)}function Nn(e,t,n){t=M(t,e);for(var r=-1,a=t.length,s=!1;++r<a;){var l=N(t[r]);if(!(s=e!=null&&n(e,l)))break;e=e[l]}return s||++r!=a?s:(a=e==null?0:e.length,!!a&&o(a)&&i(l,a)&&(c(e)||f(e)))}function Pn(e,t){return e!=null&&Nn(e,t,Mn)}var Fn=1,In=2;function Ln(e,t){return A(e)&&kn(t)?Z(N(e),t):function(n){var r=Ee(n,e);return r===void 0&&r===t?Pn(n,e):X(t,r,Fn|In)}}function Rn(e){return function(t){return t?.[e]}}function zn(e){return function(t){return P(t,e)}}function Bn(e){return A(e)?Rn(N(e)):zn(e)}function Q(e){return typeof e==`function`?e:e==null?w:typeof e==`object`?c(e)?Ln(e[0],e[1]):jn(e):Bn(e)}function Vn(e,t){return e&&ee(e,t,k)}function Hn(e,t){return function(n,r){if(n==null)return n;if(!S(n))return e(n,r);for(var i=n.length,a=t?i:-1,o=Object(n);(t?a--:++a<i)&&r(o[a],a,o)!==!1;);return n}}var $=Hn(Vn);function Un(e,t,n){for(var r=-1,i=e==null?0:e.length;++r<i;)if(n(t,e[r]))return!0;return!1}function Wn(e){return typeof e==`function`?e:w}function Gn(e,t){return(c(e)?fe:$)(e,Wn(t))}function Kn(e,t){var n=[];return $(e,function(e,r,i){t(e,r,i)&&n.push(e)}),n}function qn(e,t){return(c(e)?R:Kn)(e,Q(t,3))}function Jn(e,t){return O(t,function(t){return e[t]})}function Yn(e){return e==null?[]:Jn(e,k(e))}function Xn(e){return e===void 0}function Zn(e,t,n,r,i){return i(e,function(e,i,a){n=r?(r=!1,e):t(n,e,i,a)}),n}function Qn(e,t,n){var r=c(e)?Oe:Zn,i=arguments.length<3;return r(e,Q(t,4),n,i,$)}var $n=E&&1/q(new E([,-0]))[1]==1/0?function(e){return new E(e)}:de,er=200;function tr(e,t,n){var r=-1,i=_e,a=e.length,o=!0,s=[],c=s;if(n)o=!1,i=Un;else if(a>=er){var l=t?null:$n(e);if(l)return q(l);o=!1,i=K,c=new G}else c=t?[]:s;outer:for(;++r<a;){var u=e[r],d=t?t(u):u;if(u=n||u!==0?u:0,o&&d===d){for(var f=c.length;f--;)if(c[f]===d)continue outer;t&&c.push(d),s.push(u)}else i(c,d,n)||(c!==s&&c.push(d),s.push(u))}return s}export{pe as A,P as C,k as D,j as E,O as M,D as N,_e as O,L as S,M as T,Zt as _,qn as a,Ie as b,Wn as c,Vn as d,Q as f,K as g,Nn as h,Yn as i,de as j,ge as k,Un as l,Pn as m,Qn as n,Kn as o,Rn as p,Xn as r,Gn as s,tr as t,$ as u,G as v,N as w,R as x,W as y};
@@ -1 +0,0 @@
1
- import{n as e,t}from"./path-DfRbCp9y.js";import{a as n,c as r,d as i,f as a,i as o,l as s,n as c,p as l,r as u,s as d,t as f,u as p}from"./math-CNhlSIO3.js";function m(e){return e.innerRadius}function h(e){return e.outerRadius}function g(e){return e.startAngle}function _(e){return e.endAngle}function v(e){return e&&e.padAngle}function y(e,t,n,r,i,a,o,s){var c=n-e,l=r-t,u=o-i,d=s-a,f=d*c-u*l;if(!(f*f<1e-12))return f=(u*(t-a)-d*(e-i))/f,[e+f*c,t+f*l]}function b(e,t,n,i,o,s,c){var l=e-n,u=t-i,d=(c?s:-s)/a(l*l+u*u),f=d*u,p=-d*l,m=e+f,h=t+p,g=n+f,_=i+p,v=(m+g)/2,y=(h+_)/2,b=g-m,x=_-h,S=b*b+x*x,C=o-s,w=m*_-g*h,T=(x<0?-1:1)*a(r(0,C*C*S-w*w)),E=(w*x-b*T)/S,D=(-w*b-x*T)/S,O=(w*x+b*T)/S,k=(-w*b+x*T)/S,A=E-v,j=D-y,M=O-v,N=k-y;return A*A+j*j>M*M+N*N&&(E=O,D=k),{cx:E,cy:D,x01:-f,y01:-p,x11:E*(o/C-1),y11:D*(o/C-1)}}function x(){var r=m,x=h,S=e(0),C=null,w=g,T=_,E=v,D=null,O=t(k);function k(){var e,t,m=+r.apply(this,arguments),h=+x.apply(this,arguments),g=w.apply(this,arguments)-d,_=T.apply(this,arguments)-d,v=f(_-g),k=_>g;if(D||=e=O(),h<m&&(t=h,h=m,m=t),!(h>1e-12))D.moveTo(0,0);else if(v>l-1e-12)D.moveTo(h*n(g),h*i(g)),D.arc(0,0,h,g,_,!k),m>1e-12&&(D.moveTo(m*n(_),m*i(_)),D.arc(0,0,m,_,g,k));else{var A=g,j=_,M=g,N=_,P=v,F=v,I=E.apply(this,arguments)/2,L=I>1e-12&&(C?+C.apply(this,arguments):a(m*m+h*h)),R=s(f(h-m)/2,+S.apply(this,arguments)),z=R,B=R,V,H;if(L>1e-12){var U=u(L/m*i(I)),W=u(L/h*i(I));(P-=U*2)>1e-12?(U*=k?1:-1,M+=U,N-=U):(P=0,M=N=(g+_)/2),(F-=W*2)>1e-12?(W*=k?1:-1,A+=W,j-=W):(F=0,A=j=(g+_)/2)}var G=h*n(A),K=h*i(A),q=m*n(N),J=m*i(N);if(R>1e-12){var Y=h*n(j),X=h*i(j),Z=m*n(M),Q=m*i(M),$;if(v<p)if($=y(G,K,Z,Q,Y,X,q,J)){var ee=G-$[0],te=K-$[1],ne=Y-$[0],re=X-$[1],ie=1/i(c((ee*ne+te*re)/(a(ee*ee+te*te)*a(ne*ne+re*re)))/2),ae=a($[0]*$[0]+$[1]*$[1]);z=s(R,(m-ae)/(ie-1)),B=s(R,(h-ae)/(ie+1))}else z=B=0}F>1e-12?B>1e-12?(V=b(Z,Q,G,K,h,B,k),H=b(Y,X,q,J,h,B,k),D.moveTo(V.cx+V.x01,V.cy+V.y01),B<R?D.arc(V.cx,V.cy,B,o(V.y01,V.x01),o(H.y01,H.x01),!k):(D.arc(V.cx,V.cy,B,o(V.y01,V.x01),o(V.y11,V.x11),!k),D.arc(0,0,h,o(V.cy+V.y11,V.cx+V.x11),o(H.cy+H.y11,H.cx+H.x11),!k),D.arc(H.cx,H.cy,B,o(H.y11,H.x11),o(H.y01,H.x01),!k))):(D.moveTo(G,K),D.arc(0,0,h,A,j,!k)):D.moveTo(G,K),!(m>1e-12)||!(P>1e-12)?D.lineTo(q,J):z>1e-12?(V=b(q,J,Y,X,m,-z,k),H=b(G,K,Z,Q,m,-z,k),D.lineTo(V.cx+V.x01,V.cy+V.y01),z<R?D.arc(V.cx,V.cy,z,o(V.y01,V.x01),o(H.y01,H.x01),!k):(D.arc(V.cx,V.cy,z,o(V.y01,V.x01),o(V.y11,V.x11),!k),D.arc(0,0,m,o(V.cy+V.y11,V.cx+V.x11),o(H.cy+H.y11,H.cx+H.x11),k),D.arc(H.cx,H.cy,z,o(H.y11,H.x11),o(H.y01,H.x01),!k))):D.arc(0,0,m,N,M,k)}if(D.closePath(),e)return D=null,e+``||null}return k.centroid=function(){var e=(+r.apply(this,arguments)+ +x.apply(this,arguments))/2,t=(+w.apply(this,arguments)+ +T.apply(this,arguments))/2-p/2;return[n(t)*e,i(t)*e]},k.innerRadius=function(t){return arguments.length?(r=typeof t==`function`?t:e(+t),k):r},k.outerRadius=function(t){return arguments.length?(x=typeof t==`function`?t:e(+t),k):x},k.cornerRadius=function(t){return arguments.length?(S=typeof t==`function`?t:e(+t),k):S},k.padRadius=function(t){return arguments.length?(C=t==null?null:typeof t==`function`?t:e(+t),k):C},k.startAngle=function(t){return arguments.length?(w=typeof t==`function`?t:e(+t),k):w},k.endAngle=function(t){return arguments.length?(T=typeof t==`function`?t:e(+t),k):T},k.padAngle=function(t){return arguments.length?(E=typeof t==`function`?t:e(+t),k):E},k.context=function(e){return arguments.length?(D=e??null,k):D},k}export{x as t};
@@ -1 +0,0 @@
1
- import"./chunk-XZSTWKYB-C5JJ0TZR.js";import{n as e}from"./chunk-R5LLSJPH-ChexuO_S.js";export{e as createArchitectureServices};