local-diff-reviewer 3.0.10 → 4.0.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.
- package/dist/cli/start.js +150 -6
- package/dist/web/assets/{arc-BSLmS7QL.js → arc-BR56UJ2q.js} +1 -1
- package/dist/web/assets/{architectureDiagram-3BPJPVTR-BYS4zjbs.js → architectureDiagram-3BPJPVTR-QSNoOmcD.js} +1 -1
- package/dist/web/assets/{blockDiagram-GPEHLZMM-PmlAizTj.js → blockDiagram-GPEHLZMM-DIZH0QR3.js} +1 -1
- package/dist/web/assets/{c4Diagram-AAUBKEIU-CbuIUxBl.js → c4Diagram-AAUBKEIU-CPDSbt6E.js} +1 -1
- package/dist/web/assets/channel-B1I9H9NN.js +1 -0
- package/dist/web/assets/{chunk-2J33WTMH-9RQh96-h.js → chunk-2J33WTMH-DfV1Wxzg.js} +1 -1
- package/dist/web/assets/{chunk-3OPIFGDE-DsWGTKCT.js → chunk-3OPIFGDE-B7UZbk4f.js} +1 -1
- package/dist/web/assets/{chunk-4BX2VUAB-BEWv--B6.js → chunk-4BX2VUAB-urkKkocB.js} +1 -1
- package/dist/web/assets/{chunk-55IACEB6-FQtgl8QA.js → chunk-55IACEB6-C8ylU6mt.js} +1 -1
- package/dist/web/assets/{chunk-5ZQYHXKU-BakogfYY.js → chunk-5ZQYHXKU-Cy7POa4x.js} +1 -1
- package/dist/web/assets/{chunk-727SXJPM-DH6Pmel3.js → chunk-727SXJPM-C8E8Y71j.js} +1 -1
- package/dist/web/assets/{chunk-AQP2D5EJ-C3H1-cjU.js → chunk-AQP2D5EJ-D9rMJpjr.js} +1 -1
- package/dist/web/assets/{chunk-BSJP7CBP-ot3nfttV.js → chunk-BSJP7CBP-DPOxgIuA.js} +1 -1
- package/dist/web/assets/{chunk-CSCIHK7Q-DU2XRhoi.js → chunk-CSCIHK7Q-NalEqjEe.js} +1 -1
- package/dist/web/assets/{chunk-FMBD7UC4-vFABKE4n.js → chunk-FMBD7UC4-CqHu0Ddy.js} +1 -1
- package/dist/web/assets/{chunk-KSCS5N6A-Cyihy6vg.js → chunk-KSCS5N6A-4DOHUm1X.js} +1 -1
- package/dist/web/assets/{chunk-L5ZTLDWV-1-azreHq.js → chunk-L5ZTLDWV-C2ELgJzw.js} +1 -1
- package/dist/web/assets/{chunk-LZXEDZCA-CtT9i9tB.js → chunk-LZXEDZCA-BB0BR9oJ.js} +2 -2
- package/dist/web/assets/{chunk-ND2GUHAM-DBTROLaS.js → chunk-ND2GUHAM-Xhn_2Cqz.js} +1 -1
- package/dist/web/assets/{chunk-NZK2D7GU-BIB9cXcy.js → chunk-NZK2D7GU-zYi1cs9Z.js} +1 -1
- package/dist/web/assets/{chunk-O5CBEL6O-D2jWf1jO.js → chunk-O5CBEL6O-BODJA_dy.js} +1 -1
- package/dist/web/assets/chunk-QZHKN3VN-ByJ-AwbE.js +1 -0
- package/dist/web/assets/chunk-WU5MYG2G-D1aTMOQw.js +1 -0
- package/dist/web/assets/{chunk-XPW4576I-Dn0McE6u.js → chunk-XPW4576I-D8_9GoWv.js} +1 -1
- package/dist/web/assets/classDiagram-4FO5ZUOK-DqiTlcHU.js +1 -0
- package/dist/web/assets/classDiagram-v2-Q7XG4LA2-BCTUlGPz.js +1 -0
- package/dist/web/assets/{cose-bilkent-S5V4N54A-CFgYIdZc.js → cose-bilkent-S5V4N54A-BsloOG1M.js} +1 -1
- package/dist/web/assets/{dagre-BM42HDAG-DW9dRv5W.js → dagre-BM42HDAG-C2KIEcH-.js} +1 -1
- package/dist/web/assets/{diagram-2AECGRRQ-CNqjHCOr.js → diagram-2AECGRRQ-BUwRJ9KM.js} +1 -1
- package/dist/web/assets/{diagram-5GNKFQAL-GlReVWQT.js → diagram-5GNKFQAL-BZPhOzmo.js} +1 -1
- package/dist/web/assets/{diagram-KO2AKTUF-BAhEPBnL.js → diagram-KO2AKTUF-CAUK4gKm.js} +1 -1
- package/dist/web/assets/{diagram-LMA3HP47-BXic13O6.js → diagram-LMA3HP47-C_r9DVs_.js} +1 -1
- package/dist/web/assets/{diagram-OG6HWLK6-CMHvKcdI.js → diagram-OG6HWLK6-31p4uFXJ.js} +1 -1
- package/dist/web/assets/{dist-DzagEH4V.js → dist-Ck1Zve1a.js} +1 -1
- package/dist/web/assets/{erDiagram-TEJ5UH35-CV_KA5SE.js → erDiagram-TEJ5UH35-C8EeJM7j.js} +1 -1
- package/dist/web/assets/{flowDiagram-I6XJVG4X-Ds3vbrS-.js → flowDiagram-I6XJVG4X-BQqB8kKF.js} +1 -1
- package/dist/web/assets/{ganttDiagram-6RSMTGT7-BGmxRLNf.js → ganttDiagram-6RSMTGT7-4NPFmdaW.js} +1 -1
- package/dist/web/assets/{gitGraphDiagram-PVQCEYII-BOw_MMB6.js → gitGraphDiagram-PVQCEYII-CDmvFqiZ.js} +1 -1
- package/dist/web/assets/{index-dCkMyylZ.js → index-B_58iLIC.js} +20 -20
- package/dist/web/assets/index-Bp6Az-HB.css +1 -0
- package/dist/web/assets/{infoDiagram-5YYISTIA-ley6Hm2n.js → infoDiagram-5YYISTIA-B7bI0yw0.js} +1 -1
- package/dist/web/assets/{ishikawaDiagram-YF4QCWOH-B39CSvE8.js → ishikawaDiagram-YF4QCWOH-D5xBBsAU.js} +1 -1
- package/dist/web/assets/{journeyDiagram-JHISSGLW-DHj6gXNu.js → journeyDiagram-JHISSGLW-Bx7sCi9m.js} +1 -1
- package/dist/web/assets/{kanban-definition-UN3LZRKU-YmyzUsC6.js → kanban-definition-UN3LZRKU-BZMYOpbE.js} +1 -1
- package/dist/web/assets/{line-Dp2JHSw-.js → line-D_c4pLL_.js} +1 -1
- package/dist/web/assets/{linear-BGxRqmrd.js → linear-jch8k3gY.js} +1 -1
- package/dist/web/assets/{mermaid-parser.core-bUg8VhRH.js → mermaid-parser.core-meE2GJWa.js} +1 -1
- package/dist/web/assets/{mermaid.core-DLvn7hAi.js → mermaid.core-CED8hy6R.js} +3 -3
- package/dist/web/assets/{mindmap-definition-RKZ34NQL-DedTfPIo.js → mindmap-definition-RKZ34NQL-Dq5CdJkT.js} +1 -1
- package/dist/web/assets/{pieDiagram-4H26LBE5-7UETwr_6.js → pieDiagram-4H26LBE5-tlCDWqfO.js} +1 -1
- package/dist/web/assets/{quadrantDiagram-W4KKPZXB-CZNMkjx2.js → quadrantDiagram-W4KKPZXB-DxqMe-7l.js} +1 -1
- package/dist/web/assets/{requirementDiagram-4Y6WPE33-QKvaPdIO.js → requirementDiagram-4Y6WPE33-Cit2aJnc.js} +1 -1
- package/dist/web/assets/{sankeyDiagram-5OEKKPKP-BTsrp14L.js → sankeyDiagram-5OEKKPKP-DxOco6qW.js} +1 -1
- package/dist/web/assets/{sequenceDiagram-3UESZ5HK-Ou4mt4DX.js → sequenceDiagram-3UESZ5HK-FxR-x1T2.js} +1 -1
- package/dist/web/assets/{src-BoL9WGRu.js → src-R6QfzeRb.js} +1 -1
- package/dist/web/assets/{stateDiagram-AJRCARHV-BnN_03nu.js → stateDiagram-AJRCARHV-D_w-AmGN.js} +1 -1
- package/dist/web/assets/stateDiagram-v2-BHNVJYJU-CEnMp_RU.js +1 -0
- package/dist/web/assets/{timeline-definition-PNZ67QCA-CB7BJuqZ.js → timeline-definition-PNZ67QCA--m6p5F06.js} +1 -1
- package/dist/web/assets/{vennDiagram-CIIHVFJN-BZqQy9fg.js → vennDiagram-CIIHVFJN-BvTLOSov.js} +1 -1
- package/dist/web/assets/{wardleyDiagram-YWT4CUSO-BOU8Yt-c.js → wardleyDiagram-YWT4CUSO-suMirVgL.js} +1 -1
- package/dist/web/assets/{xychartDiagram-2RQKCTM6-DGfvr1AY.js → xychartDiagram-2RQKCTM6-BDTgsmAY.js} +1 -1
- package/dist/web/index.html +2 -2
- package/docs/images/diff-review-ui.jpg +0 -0
- package/package.json +1 -1
- package/dist/web/assets/channel-CmWwTUGo.js +0 -1
- package/dist/web/assets/chunk-QZHKN3VN-BRcGdJaW.js +0 -1
- package/dist/web/assets/chunk-WU5MYG2G-CU2gWTHX.js +0 -1
- package/dist/web/assets/classDiagram-4FO5ZUOK-CiLEawz2.js +0 -1
- package/dist/web/assets/classDiagram-v2-Q7XG4LA2-DIfJKG9o.js +0 -1
- package/dist/web/assets/index-Ci6CsMGU.css +0 -1
- package/dist/web/assets/stateDiagram-v2-BHNVJYJU-PUcRnDWi.js +0 -1
package/dist/cli/start.js
CHANGED
|
@@ -798,7 +798,7 @@ function buildMarkdownBlocks(content) {
|
|
|
798
798
|
return blocks;
|
|
799
799
|
}
|
|
800
800
|
function isListLine(line) {
|
|
801
|
-
return /^\s*([-*+]|\d
|
|
801
|
+
return /^\s*([-*+]|\d+[.)])\s+/.test(line);
|
|
802
802
|
}
|
|
803
803
|
function isIndentedContinuationLine(line) {
|
|
804
804
|
return /^\s{2,}\S/.test(line);
|
|
@@ -850,9 +850,108 @@ function getThreadLocation(thread) {
|
|
|
850
850
|
return `${thread.filePath}:${thread.anchor.lineNumber}`;
|
|
851
851
|
}
|
|
852
852
|
|
|
853
|
+
// src/server/file-watcher-service.ts
|
|
854
|
+
import { watch } from "node:fs";
|
|
855
|
+
var FileWatcherService = class {
|
|
856
|
+
constructor(repoRoot) {
|
|
857
|
+
this.repoRoot = repoRoot;
|
|
858
|
+
this.startWatching();
|
|
859
|
+
}
|
|
860
|
+
repoRoot;
|
|
861
|
+
clients = /* @__PURE__ */ new Set();
|
|
862
|
+
watchers = [];
|
|
863
|
+
pendingChanges = false;
|
|
864
|
+
debounceTimer = null;
|
|
865
|
+
closed = false;
|
|
866
|
+
/**
|
|
867
|
+
* 注册一个 SSE 客户端,并立即同步当前是否存在待刷新的文件变化。
|
|
868
|
+
*/
|
|
869
|
+
subscribe(res) {
|
|
870
|
+
this.clients.add(res);
|
|
871
|
+
this.send(res, {
|
|
872
|
+
type: "connected",
|
|
873
|
+
hasPendingChanges: this.pendingChanges
|
|
874
|
+
});
|
|
875
|
+
res.on("close", () => {
|
|
876
|
+
this.clients.delete(res);
|
|
877
|
+
});
|
|
878
|
+
}
|
|
879
|
+
/**
|
|
880
|
+
* 在 review 快照已经重算后清空待刷新状态,并通知前端恢复为最新快照。
|
|
881
|
+
*/
|
|
882
|
+
clearPendingChanges() {
|
|
883
|
+
if (!this.pendingChanges) return;
|
|
884
|
+
this.pendingChanges = false;
|
|
885
|
+
this.broadcast({ type: "synced", hasPendingChanges: false });
|
|
886
|
+
}
|
|
887
|
+
/**
|
|
888
|
+
* 释放底层文件监听资源,避免 runtime 退出后留下悬挂 watcher。
|
|
889
|
+
*/
|
|
890
|
+
dispose() {
|
|
891
|
+
this.closed = true;
|
|
892
|
+
if (this.debounceTimer) {
|
|
893
|
+
clearTimeout(this.debounceTimer);
|
|
894
|
+
this.debounceTimer = null;
|
|
895
|
+
}
|
|
896
|
+
this.watchers.splice(0).forEach((watcher) => watcher.close());
|
|
897
|
+
this.clients.forEach((client) => client.end());
|
|
898
|
+
this.clients.clear();
|
|
899
|
+
}
|
|
900
|
+
/**
|
|
901
|
+
* 优先使用递归监听整个仓库;若运行环境不支持,则退化为监听仓库根和 `.git`。
|
|
902
|
+
*/
|
|
903
|
+
startWatching() {
|
|
904
|
+
if (this.tryWatch(this.repoRoot, { recursive: true })) {
|
|
905
|
+
return;
|
|
906
|
+
}
|
|
907
|
+
this.tryWatch(this.repoRoot);
|
|
908
|
+
this.tryWatch(`${this.repoRoot}/.git`);
|
|
909
|
+
}
|
|
910
|
+
/**
|
|
911
|
+
* 把短时间内的多次磁盘事件合并成一次“可刷新”通知,避免前端按钮频繁闪动。
|
|
912
|
+
*/
|
|
913
|
+
handleChange() {
|
|
914
|
+
if (this.closed) return;
|
|
915
|
+
this.pendingChanges = true;
|
|
916
|
+
if (this.debounceTimer) {
|
|
917
|
+
clearTimeout(this.debounceTimer);
|
|
918
|
+
}
|
|
919
|
+
this.debounceTimer = setTimeout(() => {
|
|
920
|
+
this.debounceTimer = null;
|
|
921
|
+
this.broadcast({
|
|
922
|
+
type: "change",
|
|
923
|
+
hasPendingChanges: true,
|
|
924
|
+
changedAt: (/* @__PURE__ */ new Date()).toISOString()
|
|
925
|
+
});
|
|
926
|
+
}, 180);
|
|
927
|
+
}
|
|
928
|
+
tryWatch(path, options) {
|
|
929
|
+
try {
|
|
930
|
+
const watcher = watch(path, options ?? {}, () => {
|
|
931
|
+
this.handleChange();
|
|
932
|
+
});
|
|
933
|
+
this.watchers.push(watcher);
|
|
934
|
+
return true;
|
|
935
|
+
} catch {
|
|
936
|
+
return false;
|
|
937
|
+
}
|
|
938
|
+
}
|
|
939
|
+
broadcast(event) {
|
|
940
|
+
this.clients.forEach((client) => {
|
|
941
|
+
this.send(client, event);
|
|
942
|
+
});
|
|
943
|
+
}
|
|
944
|
+
send(res, event) {
|
|
945
|
+
res.write(`data: ${JSON.stringify(event)}
|
|
946
|
+
|
|
947
|
+
`);
|
|
948
|
+
}
|
|
949
|
+
};
|
|
950
|
+
|
|
853
951
|
// src/server/index.ts
|
|
854
952
|
async function startServer(state, port = 4966) {
|
|
855
953
|
let markdownPreviews = await buildMarkdownPreviewCache(state);
|
|
954
|
+
const fileWatcher = new FileWatcherService(state.session.repoRoot);
|
|
856
955
|
const app = express();
|
|
857
956
|
app.use(express.json({ limit: "2mb" }));
|
|
858
957
|
app.get("/api/session", (_req, res) => {
|
|
@@ -885,13 +984,34 @@ async function startServer(state, port = 4966) {
|
|
|
885
984
|
webDist: state.webDist
|
|
886
985
|
};
|
|
887
986
|
markdownPreviews = await buildMarkdownPreviewCache(nextReviewState);
|
|
888
|
-
state
|
|
889
|
-
|
|
987
|
+
applyReviewState(state, nextReviewState);
|
|
988
|
+
fileWatcher.clearPendingChanges();
|
|
890
989
|
res.json({ session: state.session, files: state.diffFiles });
|
|
891
990
|
} catch (error) {
|
|
892
991
|
next(error);
|
|
893
992
|
}
|
|
894
993
|
});
|
|
994
|
+
app.get("/api/watch", (_req, res) => {
|
|
995
|
+
res.writeHead(200, {
|
|
996
|
+
"Content-Type": "text/event-stream",
|
|
997
|
+
"Cache-Control": "no-cache, no-transform",
|
|
998
|
+
Connection: "keep-alive"
|
|
999
|
+
});
|
|
1000
|
+
res.write(": connected\n\n");
|
|
1001
|
+
fileWatcher.subscribe(res);
|
|
1002
|
+
});
|
|
1003
|
+
app.post("/api/refresh", async (_req, res, next) => {
|
|
1004
|
+
try {
|
|
1005
|
+
const nextReviewState = await rebuildReviewState(state);
|
|
1006
|
+
markdownPreviews = await buildMarkdownPreviewCache(nextReviewState);
|
|
1007
|
+
applyReviewState(state, nextReviewState);
|
|
1008
|
+
fileWatcher.clearPendingChanges();
|
|
1009
|
+
const comments = await readComments(state.session.repoRoot);
|
|
1010
|
+
res.json({ session: state.session, files: state.diffFiles, threads: comments.threads });
|
|
1011
|
+
} catch (error) {
|
|
1012
|
+
next(error);
|
|
1013
|
+
}
|
|
1014
|
+
});
|
|
895
1015
|
app.get("/api/markdown-preview", async (req, res, next) => {
|
|
896
1016
|
try {
|
|
897
1017
|
const filePath = String(req.query.path ?? "");
|
|
@@ -1168,7 +1288,7 @@ async function startServer(state, port = 4966) {
|
|
|
1168
1288
|
app.use((error, _req, res, _next) => {
|
|
1169
1289
|
res.status(500).json({ error: error.message });
|
|
1170
1290
|
});
|
|
1171
|
-
return listen(app, port);
|
|
1291
|
+
return listen(app, port, fileWatcher);
|
|
1172
1292
|
}
|
|
1173
1293
|
async function buildMarkdownPreviewCache(state) {
|
|
1174
1294
|
const previews = /* @__PURE__ */ new Map();
|
|
@@ -1187,12 +1307,36 @@ async function buildMarkdownPreviewCache(state) {
|
|
|
1187
1307
|
);
|
|
1188
1308
|
return previews;
|
|
1189
1309
|
}
|
|
1190
|
-
function
|
|
1310
|
+
function applyReviewState(currentState, nextState) {
|
|
1311
|
+
currentState.session = nextState.session;
|
|
1312
|
+
currentState.diffFiles = nextState.diffFiles;
|
|
1313
|
+
}
|
|
1314
|
+
async function rebuildReviewState(state) {
|
|
1315
|
+
const diff = await getDiff(state.session.mode, state.session.repoRoot);
|
|
1316
|
+
const diffFiles = parseUnifiedDiff(diff);
|
|
1317
|
+
const session = {
|
|
1318
|
+
id: crypto.randomUUID(),
|
|
1319
|
+
repoName: state.session.repoName,
|
|
1320
|
+
repoRoot: state.session.repoRoot,
|
|
1321
|
+
mode: state.session.mode,
|
|
1322
|
+
diffHash: diffHash(diff),
|
|
1323
|
+
createdAt: (/* @__PURE__ */ new Date()).toISOString()
|
|
1324
|
+
};
|
|
1325
|
+
return {
|
|
1326
|
+
session,
|
|
1327
|
+
diffFiles,
|
|
1328
|
+
webDist: state.webDist
|
|
1329
|
+
};
|
|
1330
|
+
}
|
|
1331
|
+
function listen(app, port, fileWatcher) {
|
|
1191
1332
|
return new Promise((resolve3, reject) => {
|
|
1192
1333
|
const server = createServer(app);
|
|
1334
|
+
server.once("close", () => {
|
|
1335
|
+
fileWatcher.dispose();
|
|
1336
|
+
});
|
|
1193
1337
|
server.once("error", (error) => {
|
|
1194
1338
|
if (error.code === "EADDRINUSE" && port !== 0) {
|
|
1195
|
-
listen(app, 0).then(resolve3, reject);
|
|
1339
|
+
listen(app, 0, fileWatcher).then(resolve3, reject);
|
|
1196
1340
|
return;
|
|
1197
1341
|
}
|
|
1198
1342
|
reject(error);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{n as e,t}from"./path-BJQEcSo7.js";import{a as n,c as r,d as i,f as a,i as o,l as s,m as c,n as l,o as u,p as d,r as f,u as p}from"./dist-
|
|
1
|
+
import{n as e,t}from"./path-BJQEcSo7.js";import{a as n,c as r,d as i,f as a,i as o,l as s,m as c,n as l,o as u,p as d,r as f,u as p}from"./dist-Ck1Zve1a.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,r,i,a,o){var c=e-n,l=t-r,u=(o?a:-a)/d(c*c+l*l),f=u*l,p=-u*c,m=e+f,h=t+p,g=n+f,_=r+p,v=(m+g)/2,y=(h+_)/2,b=g-m,x=_-h,S=b*b+x*x,C=i-a,w=m*_-g*h,T=(x<0?-1:1)*d(s(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*(i/C-1),y11:D*(i/C-1)}}function x(){var s=m,x=h,S=e(0),C=null,w=g,T=_,E=v,D=null,O=t(k);function k(){var e,t,m=+s.apply(this,arguments),h=+x.apply(this,arguments),g=w.apply(this,arguments)-r,_=T.apply(this,arguments)-r,v=l(_-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>c-1e-12)D.moveTo(h*u(g),h*a(g)),D.arc(0,0,h,g,_,!k),m>1e-12&&(D.moveTo(m*u(_),m*a(_)),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):d(m*m+h*h)),R=p(l(h-m)/2,+S.apply(this,arguments)),z=R,B=R,V,H;if(L>1e-12){var U=o(L/m*a(I)),W=o(L/h*a(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*u(A),K=h*a(A),q=m*u(N),J=m*a(N);if(R>1e-12){var Y=h*u(j),X=h*a(j),Z=m*u(M),Q=m*a(M),$;if(v<i)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/a(f((ee*ne+te*re)/(d(ee*ee+te*te)*d(ne*ne+re*re)))/2),ae=d($[0]*$[0]+$[1]*$[1]);z=p(R,(m-ae)/(ie-1)),B=p(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,n(V.y01,V.x01),n(H.y01,H.x01),!k):(D.arc(V.cx,V.cy,B,n(V.y01,V.x01),n(V.y11,V.x11),!k),D.arc(0,0,h,n(V.cy+V.y11,V.cx+V.x11),n(H.cy+H.y11,H.cx+H.x11),!k),D.arc(H.cx,H.cy,B,n(H.y11,H.x11),n(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,n(V.y01,V.x01),n(H.y01,H.x01),!k):(D.arc(V.cx,V.cy,z,n(V.y01,V.x01),n(V.y11,V.x11),!k),D.arc(0,0,m,n(V.cy+V.y11,V.cx+V.x11),n(H.cy+H.y11,H.cx+H.x11),k),D.arc(H.cx,H.cy,z,n(H.y11,H.x11),n(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=(+s.apply(this,arguments)+ +x.apply(this,arguments))/2,t=(+w.apply(this,arguments)+ +T.apply(this,arguments))/2-i/2;return[u(t)*e,a(t)*e]},k.innerRadius=function(t){return arguments.length?(s=typeof t==`function`?t:e(+t),k):s},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};
|