difit 4.0.0 → 4.0.2
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/README.ja.md +15 -14
- package/README.ko.md +15 -14
- package/README.md +15 -14
- package/README.zh.md +15 -14
- package/dist/cli/index.js +18 -0
- package/dist/cli/index.test.js +148 -38
- package/dist/cli/tuiDeprecation.d.ts +3 -0
- package/dist/cli/tuiDeprecation.js +16 -0
- package/dist/cli/tuiDeprecation.test.d.ts +1 -0
- package/dist/cli/tuiDeprecation.test.js +16 -0
- package/dist/cli/utils.d.ts +1 -0
- package/dist/cli/utils.js +17 -0
- package/dist/client/assets/_basePickBy-hOr-yGsE.js +1 -0
- package/dist/client/assets/_baseUniq-b7bzdUSn.js +1 -0
- package/dist/client/assets/arc-D65wG9gm.js +1 -0
- package/dist/client/assets/architecture-PBZL5I3N-DFdrPtRG.js +1 -0
- package/dist/client/assets/architectureDiagram-2XIMDMQ5-CXJTJFYJ.js +36 -0
- package/dist/client/assets/array-DOVTz2Mq.js +1 -0
- package/dist/client/assets/blockDiagram-WCTKOSBZ-B60owdAn.js +132 -0
- package/dist/client/assets/c4Diagram-IC4MRINW-4tg2D_Vt.js +10 -0
- package/dist/client/assets/channel-DogeU0Wo.js +1 -0
- package/dist/client/assets/chunk-4BX2VUAB-CW45MZFx.js +1 -0
- package/dist/client/assets/chunk-55IACEB6-Busc3sfI.js +1 -0
- package/dist/client/assets/chunk-7E7YKBS2-BVR-8Pma.js +1 -0
- package/dist/client/assets/chunk-7R4GIKGN-DneC7PwP.js +80 -0
- package/dist/client/assets/chunk-C72U2L5F-CJr98gus.js +1 -0
- package/dist/client/assets/chunk-EGIJ26TM-iD_CSqpR.js +1 -0
- package/dist/client/assets/{chunk-FMBD7UC4-CrKv7ndg.js → chunk-FMBD7UC4-BSsJVlRg.js} +2 -2
- package/dist/client/assets/chunk-GEFDOKGD-eDUrsRgt.js +2 -0
- package/dist/client/assets/chunk-GLR3WWYH-NUOKNaxd.js +2 -0
- package/dist/client/assets/chunk-HHEYEP7N-DhuxpkmW.js +1 -0
- package/dist/client/assets/chunk-JSJVCQXG-UCJub_Eo.js +1 -0
- package/dist/client/assets/chunk-KX2RTZJC-DrhxxMOx.js +1 -0
- package/dist/client/assets/chunk-KYZI473N-Brv52ZeO.js +53 -0
- package/dist/client/assets/chunk-L3YUKLVL-BkBigLhQ.js +1 -0
- package/dist/client/assets/chunk-MX3YWQON-DHRoNbgW.js +1 -0
- package/dist/client/assets/chunk-NQ4KR5QH-BZ86r2qK.js +220 -0
- package/dist/client/assets/chunk-O4XLMI2P-Sr33dk8c.js +7 -0
- package/dist/client/assets/chunk-OZEHJAEY-3F2ff7sj.js +1 -0
- package/dist/client/assets/chunk-PQ6SQG4A-C9acTu_E.js +1 -0
- package/dist/client/assets/chunk-PU5JKC2W-PQmA4K_y.js +70 -0
- package/dist/client/assets/chunk-QZHKN3VN-DMRW-mur.js +1 -0
- package/dist/client/assets/chunk-R5LLSJPH-ChexuO_S.js +1 -0
- package/dist/client/assets/chunk-WL4C6EOR-oxNV_hhM.js +189 -0
- package/dist/client/assets/chunk-XIRO2GV7-C9gOnffv.js +1 -0
- package/dist/client/assets/chunk-XPW4576I-CcqR6BsE.js +32 -0
- package/dist/client/assets/chunk-XZSTWKYB-C5JJ0TZR.js +94 -0
- package/dist/client/assets/chunk-YBOYWFTD-B6kAkNgH.js +1 -0
- package/dist/client/assets/classDiagram-VBA2DB6C-DlDUg6JI.js +1 -0
- package/dist/client/assets/classDiagram-v2-RAHNMMFH-BxzJfV1S.js +1 -0
- package/dist/client/assets/clone-DuY6BQEm.js +1 -0
- package/dist/client/assets/cose-bilkent-S5V4N54A-hlDud6Ym.js +1 -0
- package/dist/client/assets/cytoscape.esm-B3gzQ1NF.js +321 -0
- package/dist/client/assets/dagre-BwDYerGQ.js +1 -0
- package/dist/client/assets/dagre-KLK3FWXG-KnkMUlUE.js +4 -0
- package/dist/client/assets/defaultLocale-Ck2Xxk-C.js +1 -0
- package/dist/client/assets/diagram-E7M64L7V-DcTCIFUG.js +24 -0
- package/dist/client/assets/diagram-IFDJBPK2-COcDQunj.js +43 -0
- package/dist/client/assets/diagram-P4PSJMXO-DmgET9pD.js +24 -0
- package/dist/client/assets/dist-v55TM3-O.js +1 -0
- package/dist/client/assets/erDiagram-INFDFZHY-ByL02DP-.js +70 -0
- package/dist/client/assets/flowDiagram-PKNHOUZH-CW-lseYE.js +162 -0
- package/dist/client/assets/ganttDiagram-A5KZAMGK-BxLjKRld.js +292 -0
- package/dist/client/assets/gitGraph-HDMCJU4V-CjAGJiCH.js +1 -0
- package/dist/client/assets/gitGraphDiagram-K3NZZRJ6-DLEDjokx.js +65 -0
- package/dist/client/assets/graphlib-WkJoBgka.js +1 -0
- package/dist/client/assets/index-CizZxdOT.js +79 -0
- package/dist/client/assets/index-Cn4K2uvR.css +2 -0
- package/dist/client/assets/info-3K5VOQVL-CB6KpH1K.js +1 -0
- package/dist/client/assets/infoDiagram-LFFYTUFH-CnmYkyCb.js +2 -0
- package/dist/client/assets/init-Bft5Ffpj.js +1 -0
- package/dist/client/assets/isArrayLikeObject-icl0H0jo.js +1 -0
- package/dist/client/assets/isEmpty-Du8sNmkE.js +1 -0
- package/dist/client/assets/ishikawaDiagram-PHBUUO56-zycn1mVK.js +70 -0
- package/dist/client/assets/journeyDiagram-4ABVD52K-aRoH36nV.js +139 -0
- package/dist/client/assets/kanban-definition-K7BYSVSG-BGtGv5yb.js +89 -0
- package/dist/client/assets/katex-BJrMXEjr.js +261 -0
- package/dist/client/assets/line-Cm3ZuldI.js +1 -0
- package/dist/client/assets/linear-HJOLPv7E.js +1 -0
- package/dist/client/assets/math-CNhlSIO3.js +1 -0
- package/dist/client/assets/mermaid-parser.core-BvMqHn4b.js +4 -0
- package/dist/client/assets/mermaid.core-C4SvQTx9.js +11 -0
- package/dist/client/assets/mindmap-definition-YRQLILUH-B8jMe7ir.js +68 -0
- package/dist/client/assets/ordinal-DIg8h6NI.js +1 -0
- package/dist/client/assets/packet-RMMSAZCW-CzbC-tXD.js +1 -0
- package/dist/client/assets/path-DfRbCp9y.js +1 -0
- package/dist/client/assets/pie-UPGHQEXC-CmhYIo8p.js +1 -0
- package/dist/client/assets/pieDiagram-SKSYHLDU-CGWbtgxq.js +30 -0
- package/dist/client/assets/{prism-bash-DTkDXsAh.js → prism-bash-6uMTC0Q2.js} +1 -1
- package/dist/client/assets/prism-csharp-Dkc2OSmh.js +1 -0
- package/dist/client/assets/prism-dart-iZy_wlz-.js +1 -0
- package/dist/client/assets/prism-elixir-BIzI9WJK.js +1 -0
- package/dist/client/assets/prism-hcl-Bx2FGBKG.js +1 -0
- package/dist/client/assets/prism-java-DBXf7fH0.js +1 -0
- package/dist/client/assets/prism-markup-templating-DS0ksKLt.js +1 -0
- package/dist/client/assets/prism-perl-BlhPiMfT.js +1 -0
- package/dist/client/assets/prism-php-DVtOAJsW.js +1 -0
- package/dist/client/assets/{prism-protobuf-DiQ_z8B5.js → prism-protobuf-BUsrNVvv.js} +1 -1
- package/dist/client/assets/prism-ruby-Saes64I6.js +1 -0
- package/dist/client/assets/{prism-scala-BjNo2HkN.js → prism-scala-ANOINMog.js} +1 -1
- package/dist/client/assets/prism-solidity-C5Mx5y66.js +1 -0
- package/dist/client/assets/{prism-sql-AgAyy5H_.js → prism-sql-D5pwK0Dp.js} +1 -1
- package/dist/client/assets/{prism-vim-uciLQ2PQ.js → prism-vim-BSZSu-gX.js} +1 -1
- package/dist/client/assets/quadrantDiagram-337W2JSQ-CQ1QKsru.js +7 -0
- package/dist/client/assets/radar-KQ55EAFF-BCa9lsCc.js +1 -0
- package/dist/client/assets/requirementDiagram-Z7DCOOCP-Co1LyL5T.js +73 -0
- package/dist/client/assets/rough.esm-KjoEK0it.js +1 -0
- package/dist/client/assets/sankeyDiagram-WA2Y5GQK-BQVbT6bS.js +10 -0
- package/dist/client/assets/sequenceDiagram-2WXFIKYE-DGIEkdPm.js +145 -0
- package/dist/client/assets/src-DsmFf7gO.js +1 -0
- package/dist/client/assets/stateDiagram-RAJIS63D-DgjKbXnG.js +1 -0
- package/dist/client/assets/stateDiagram-v2-FVOUBMTO-gPrpjL74.js +1 -0
- package/dist/client/assets/timeline-definition-YZTLITO2-Dz2dVWjY.js +61 -0
- package/dist/client/assets/treemap-KZPCXAKY-DXiPfAB6.js +1 -0
- package/dist/client/assets/vennDiagram-LZ73GAT5-IIH5S1B6.js +34 -0
- package/dist/client/assets/xychartDiagram-JWTSCODW-DeYZhM2j.js +7 -0
- package/dist/client/index.html +2 -2
- package/dist/server/git-diff-tui.d.ts +1 -1
- package/dist/server/git-diff-tui.js +7 -5
- package/dist/server/git-diff-tui.test.d.ts +1 -0
- package/dist/server/git-diff-tui.test.js +60 -0
- package/dist/server/git-diff.d.ts +3 -1
- package/dist/server/git-diff.js +40 -3
- package/dist/server/git-diff.test.js +20 -0
- package/dist/server/server.d.ts +1 -0
- package/dist/server/server.js +4 -3
- package/dist/server/server.test.js +32 -0
- package/dist/tui/App.d.ts +1 -0
- package/dist/tui/App.js +2 -2
- package/dist/types/diff.d.ts +1 -0
- package/dist/utils/commentImports.js +3 -2
- package/dist/utils/createId.d.ts +1 -0
- package/dist/utils/createId.js +5 -0
- package/dist/utils/createId.test.d.ts +1 -0
- package/dist/utils/createId.test.js +48 -0
- package/package.json +5 -5
- package/dist/client/assets/_basePickBy-B9N-f0iT.js +0 -1
- package/dist/client/assets/_baseUniq-tbL7nVvN.js +0 -1
- package/dist/client/assets/arc-BOY-7mep.js +0 -1
- package/dist/client/assets/architectureDiagram-2XIMDMQ5-59AvHaSB.js +0 -36
- package/dist/client/assets/blockDiagram-WCTKOSBZ-DXIlumQk.js +0 -132
- package/dist/client/assets/c4Diagram-IC4MRINW-BbfZ0uRn.js +0 -10
- package/dist/client/assets/channel-cZXsTJxA.js +0 -1
- package/dist/client/assets/chunk-4BX2VUAB-l7rcB2IW.js +0 -1
- package/dist/client/assets/chunk-55IACEB6-CrZL3qv9.js +0 -1
- package/dist/client/assets/chunk-JSJVCQXG-DyBDhAEM.js +0 -1
- package/dist/client/assets/chunk-KX2RTZJC-By5mkZmU.js +0 -1
- package/dist/client/assets/chunk-NQ4KR5QH-C30p9xRx.js +0 -220
- package/dist/client/assets/chunk-QZHKN3VN-DVlhR2wU.js +0 -1
- package/dist/client/assets/chunk-WL4C6EOR-Cn7a6CO3.js +0 -189
- package/dist/client/assets/classDiagram-VBA2DB6C-B_coIPEy.js +0 -1
- package/dist/client/assets/classDiagram-v2-RAHNMMFH-B_coIPEy.js +0 -1
- package/dist/client/assets/clone-BjaT2HOk.js +0 -1
- package/dist/client/assets/cose-bilkent-S5V4N54A-LyauIk_9.js +0 -1
- package/dist/client/assets/cytoscape.esm-5J0xJHOV.js +0 -321
- package/dist/client/assets/dagre-KLK3FWXG-DRWb2KE3.js +0 -4
- package/dist/client/assets/defaultLocale-DX6XiGOO.js +0 -1
- package/dist/client/assets/diagram-E7M64L7V-ChT6mNWK.js +0 -24
- package/dist/client/assets/diagram-IFDJBPK2-CqbTduoP.js +0 -43
- package/dist/client/assets/diagram-P4PSJMXO-Bzv5Z3ri.js +0 -24
- package/dist/client/assets/erDiagram-INFDFZHY-CvXfUZ4L.js +0 -70
- package/dist/client/assets/flowDiagram-PKNHOUZH-CxmpNUKq.js +0 -162
- package/dist/client/assets/ganttDiagram-A5KZAMGK-9LpZCsg6.js +0 -292
- package/dist/client/assets/gitGraphDiagram-K3NZZRJ6-C6yZOrQJ.js +0 -65
- package/dist/client/assets/graph-bUZ7uHLW.js +0 -1
- package/dist/client/assets/index-BLNN1bfE.js +0 -98
- package/dist/client/assets/index-VxkpzDXr.css +0 -1
- package/dist/client/assets/infoDiagram-LFFYTUFH-Djdy3W21.js +0 -2
- package/dist/client/assets/init-Gi6I4Gst.js +0 -1
- package/dist/client/assets/ishikawaDiagram-PHBUUO56-oOdwCpeS.js +0 -70
- package/dist/client/assets/journeyDiagram-4ABVD52K-DTb_nGAw.js +0 -139
- package/dist/client/assets/kanban-definition-K7BYSVSG-CMtP7pHA.js +0 -89
- package/dist/client/assets/katex-C-M49wc6.js +0 -261
- package/dist/client/assets/layout-CXr5MatK.js +0 -1
- package/dist/client/assets/linear-pOMS9pjV.js +0 -1
- package/dist/client/assets/mermaid.core-DV5JJ1Ie.js +0 -249
- package/dist/client/assets/mindmap-definition-YRQLILUH-DN-sbonc.js +0 -68
- package/dist/client/assets/ordinal-Cboi1Yqb.js +0 -1
- package/dist/client/assets/pieDiagram-SKSYHLDU-tAHCkgh1.js +0 -30
- package/dist/client/assets/prism-csharp-5CQ0RcEE.js +0 -1
- package/dist/client/assets/prism-dart-MjriiaMt.js +0 -1
- package/dist/client/assets/prism-elixir-BSOTyVg2.js +0 -1
- package/dist/client/assets/prism-hcl-BYvi1mtM.js +0 -1
- package/dist/client/assets/prism-java-DMU2FM4X.js +0 -1
- package/dist/client/assets/prism-markup-templating-Ct1xsyfA.js +0 -1
- package/dist/client/assets/prism-perl-CpfvaEQk.js +0 -1
- package/dist/client/assets/prism-php-SC920LoD.js +0 -1
- package/dist/client/assets/prism-ruby-DZph-YiO.js +0 -1
- package/dist/client/assets/prism-solidity-qTLbmiAT.js +0 -1
- package/dist/client/assets/quadrantDiagram-337W2JSQ-B0wODmgR.js +0 -7
- package/dist/client/assets/requirementDiagram-Z7DCOOCP-A3aeHC06.js +0 -73
- package/dist/client/assets/sankeyDiagram-WA2Y5GQK-BWa6kZhG.js +0 -10
- package/dist/client/assets/sequenceDiagram-2WXFIKYE-Cx_COX9G.js +0 -145
- package/dist/client/assets/stateDiagram-RAJIS63D-BXGnN6rZ.js +0 -1
- package/dist/client/assets/stateDiagram-v2-FVOUBMTO-CMw3xNha.js +0 -1
- package/dist/client/assets/timeline-definition-YZTLITO2-DbqaUm9k.js +0 -61
- package/dist/client/assets/treemap-KZPCXAKY-CfEujPCR.js +0 -162
- package/dist/client/assets/vennDiagram-LZ73GAT5-CqJE8CAD.js +0 -34
- package/dist/client/assets/xychartDiagram-JWTSCODW-CfdDvzHC.js +0 -7
package/README.ja.md
CHANGED
|
@@ -136,20 +136,21 @@ git diff --cached | difit -
|
|
|
136
136
|
|
|
137
137
|
## ⚙️ CLIオプション
|
|
138
138
|
|
|
139
|
-
| フラグ | デフォルト
|
|
140
|
-
| --------------------- |
|
|
141
|
-
| `<target>` | HEAD
|
|
142
|
-
| `[compare-with]` | -
|
|
143
|
-
| `--pr <url>` | -
|
|
144
|
-
| `--comment <json>` | -
|
|
145
|
-
| `--port` | 4966
|
|
146
|
-
| `--host` | 127.0.0.1
|
|
147
|
-
| `--no-open` | false
|
|
148
|
-
| `--mode` | split
|
|
149
|
-
| `--tui`
|
|
150
|
-
| `--clean` | false
|
|
151
|
-
| `--include-untracked` | false
|
|
152
|
-
| `--keep-alive` | false
|
|
139
|
+
| フラグ | デフォルト | 説明 |
|
|
140
|
+
| --------------------- | --------------- | ------------------------------------------------------------------------------------------ |
|
|
141
|
+
| `<target>` | HEAD | コミットハッシュ、タグ、HEAD~n、ブランチ、または特別な引数 |
|
|
142
|
+
| `[compare-with]` | - | 比較対象の2番目のコミット(2つの間のdiffを表示) |
|
|
143
|
+
| `--pr <url>` | - | レビューするGitHub PRのURL(例:https://github.com/owner/repo/pull/123) |
|
|
144
|
+
| `--comment <json>` | - | 起動時に初期コメントを注入(複数指定可。JSON object または array を受け付ける) |
|
|
145
|
+
| `--port` | 4966 | 優先ポート。使用中の場合は+1にフォールバック |
|
|
146
|
+
| `--host` | 127.0.0.1 | サーバーをバインドするホストアドレス(外部からアクセスしたい場合は0.0.0.0を指定) |
|
|
147
|
+
| `--no-open` | false | ブラウザを自動的に開かない |
|
|
148
|
+
| `--mode` | split | 表示モード。`unified`または`split` |
|
|
149
|
+
| `--tui` (deprecated) | false | WebUIの代わりにターミナルUIを使用 |
|
|
150
|
+
| `--clean` | false | 起動時に既存コメントと閲覧済みファイルをすべてクリア |
|
|
151
|
+
| `--include-untracked` | false | diffにuntrackedファイルを自動的に含める(`.`または`working`のみ有効) |
|
|
152
|
+
| `--keep-alive` | false | ブラウザ切断後もサーバーを終了せず起動したままにする(Ctrl+Cで手動停止) |
|
|
153
|
+
| `--context <lines>` | Gitの既定値 (3) | 変更ごとの前後コンテキスト行数を制限(`0` は変更行のみ表示。`--pr` と stdin では使用不可) |
|
|
153
154
|
|
|
154
155
|
## 💬 コメントシステム
|
|
155
156
|
|
package/README.ko.md
CHANGED
|
@@ -136,20 +136,21 @@ git diff --cached | difit -
|
|
|
136
136
|
|
|
137
137
|
## ⚙️ CLI 옵션
|
|
138
138
|
|
|
139
|
-
| 플래그 | 기본값
|
|
140
|
-
| --------------------- |
|
|
141
|
-
| `<target>` | HEAD
|
|
142
|
-
| `[compare-with]` | -
|
|
143
|
-
| `--pr <url>` | -
|
|
144
|
-
| `--comment <json>` | -
|
|
145
|
-
| `--port` | 4966
|
|
146
|
-
| `--host` | 127.0.0.1
|
|
147
|
-
| `--no-open` | false
|
|
148
|
-
| `--mode` | split
|
|
149
|
-
| `--tui`
|
|
150
|
-
| `--clean` | false
|
|
151
|
-
| `--include-untracked` | false
|
|
152
|
-
| `--keep-alive` | false
|
|
139
|
+
| 플래그 | 기본값 | 설명 |
|
|
140
|
+
| --------------------- | -------------- | --------------------------------------------------------------------------------------------- |
|
|
141
|
+
| `<target>` | HEAD | 커밋 해시, 태그, HEAD~n, 브랜치 또는 특수 인수 |
|
|
142
|
+
| `[compare-with]` | - | 비교할 선택적 두 번째 커밋 (둘 사이의 diff 표시) |
|
|
143
|
+
| `--pr <url>` | - | 검토할 GitHub PR URL (예: https://github.com/owner/repo/pull/123) |
|
|
144
|
+
| `--comment <json>` | - | 초기 코멘트 주입 (반복 가능; JSON object 또는 array 허용) |
|
|
145
|
+
| `--port` | 4966 | 선호 포트; 사용 중인 경우 +1로 대체 |
|
|
146
|
+
| `--host` | 127.0.0.1 | 서버를 바인딩할 호스트 주소 (외부 액세스는 0.0.0.0 사용) |
|
|
147
|
+
| `--no-open` | false | 브라우저를 자동으로 열지 않음 |
|
|
148
|
+
| `--mode` | split | 표시 모드: `unified` 또는 `split` |
|
|
149
|
+
| `--tui` (deprecated) | false | WebUI 대신 터미널 UI 모드 사용 |
|
|
150
|
+
| `--clean` | false | 시작 시 모든 기존 코멘트와 열람된 파일 표시 초기화 |
|
|
151
|
+
| `--include-untracked` | false | diff에 untracked 파일 자동 포함 (`.` 또는 `working`에서만 유효) |
|
|
152
|
+
| `--keep-alive` | false | 브라우저 연결이 끊겨도 서버 유지 (Ctrl+C로 수동 종료) |
|
|
153
|
+
| `--context <lines>` | Git 기본값 (3) | 변경 주변의 컨텍스트 줄 수를 제한 (`0`이면 변경된 줄만 표시, `--pr` 및 stdin에서는 사용 불가) |
|
|
153
154
|
|
|
154
155
|
## 💬 코멘트 시스템
|
|
155
156
|
|
package/README.md
CHANGED
|
@@ -136,20 +136,21 @@ Stdin mode is selected with intent-first rules:
|
|
|
136
136
|
|
|
137
137
|
## ⚙️ CLI Options
|
|
138
138
|
|
|
139
|
-
| Flag | Default
|
|
140
|
-
| --------------------- |
|
|
141
|
-
| `<target>` | HEAD
|
|
142
|
-
| `[compare-with]` | -
|
|
143
|
-
| `--pr <url>` | -
|
|
144
|
-
| `--comment <json>` | -
|
|
145
|
-
| `--port` | 4966
|
|
146
|
-
| `--host` | 127.0.0.1
|
|
147
|
-
| `--no-open` | false
|
|
148
|
-
| `--mode` | split
|
|
149
|
-
| `--tui`
|
|
150
|
-
| `--clean` | false
|
|
151
|
-
| `--include-untracked` | false
|
|
152
|
-
| `--keep-alive` | false
|
|
139
|
+
| Flag | Default | Description |
|
|
140
|
+
| --------------------- | --------------- | ------------------------------------------------------------------------------------------------------- |
|
|
141
|
+
| `<target>` | HEAD | Commit hash, tag, HEAD~n, branch, or special arguments |
|
|
142
|
+
| `[compare-with]` | - | Optional second commit to compare with (shows diff between the two) |
|
|
143
|
+
| `--pr <url>` | - | GitHub PR URL to review (e.g., https://github.com/owner/repo/pull/123) |
|
|
144
|
+
| `--comment <json>` | - | Inject initial comments (repeatable; accepts a JSON object or array) |
|
|
145
|
+
| `--port` | 4966 | Preferred port; falls back to +1 if occupied |
|
|
146
|
+
| `--host` | 127.0.0.1 | Host address to bind server to (use 0.0.0.0 for external access) |
|
|
147
|
+
| `--no-open` | false | Don't automatically open browser |
|
|
148
|
+
| `--mode` | split | Display mode: `unified` or `split` |
|
|
149
|
+
| `--tui` (deprecated) | false | Use terminal UI mode instead of WebUI |
|
|
150
|
+
| `--clean` | false | Clear all existing comments and viewed files on startup |
|
|
151
|
+
| `--include-untracked` | false | Automatically include untracked files in diff (only with `.` or `working`) |
|
|
152
|
+
| `--keep-alive` | false | Keep server running after browser disconnects (stop manually with Ctrl+C) |
|
|
153
|
+
| `--context <lines>` | git default (3) | Limit surrounding context lines per change (`0` shows changes only; not available with `--pr` or stdin) |
|
|
153
154
|
|
|
154
155
|
## 💬 Comment System
|
|
155
156
|
|
package/README.zh.md
CHANGED
|
@@ -136,20 +136,21 @@ git diff --cached | difit -
|
|
|
136
136
|
|
|
137
137
|
## ⚙️ CLI 选项
|
|
138
138
|
|
|
139
|
-
| 标志 | 默认值
|
|
140
|
-
| --------------------- |
|
|
141
|
-
| `<target>` | HEAD
|
|
142
|
-
| `[compare-with]` | -
|
|
143
|
-
| `--pr <url>` | -
|
|
144
|
-
| `--comment <json>` | -
|
|
145
|
-
| `--port` | 4966
|
|
146
|
-
| `--host` | 127.0.0.1
|
|
147
|
-
| `--no-open` | false
|
|
148
|
-
| `--mode` | split
|
|
149
|
-
| `--tui`
|
|
150
|
-
| `--clean` | false
|
|
151
|
-
| `--include-untracked` | false
|
|
152
|
-
| `--keep-alive` | false
|
|
139
|
+
| 标志 | 默认值 | 描述 |
|
|
140
|
+
| --------------------- | -------------- | --------------------------------------------------------------------------------- |
|
|
141
|
+
| `<target>` | HEAD | 提交哈希、标签、HEAD~n、分支或特殊参数 |
|
|
142
|
+
| `[compare-with]` | - | 要比较的可选第二个提交(显示两者之间的差异) |
|
|
143
|
+
| `--pr <url>` | - | 要审查的 GitHub PR URL(例如:https://github.com/owner/repo/pull/123) |
|
|
144
|
+
| `--comment <json>` | - | 注入初始评论(可重复指定;接受 JSON object 或 array) |
|
|
145
|
+
| `--port` | 4966 | 首选端口;如果被占用则回退到 +1 |
|
|
146
|
+
| `--host` | 127.0.0.1 | 绑定服务器的主机地址(使用 0.0.0.0 进行外部访问) |
|
|
147
|
+
| `--no-open` | false | 不自动打开浏览器 |
|
|
148
|
+
| `--mode` | split | 显示模式:`unified` 或 `split` |
|
|
149
|
+
| `--tui` (deprecated) | false | 使用终端 UI 模式而不是 WebUI |
|
|
150
|
+
| `--clean` | false | 启动时清除所有现有评论和已查看的文件 |
|
|
151
|
+
| `--include-untracked` | false | 自动将 untracked 文件包含在 diff 中(仅在 `.` 或 `working` 时有效) |
|
|
152
|
+
| `--keep-alive` | false | 浏览器断开后保持服务器运行(使用 Ctrl+C 手动停止) |
|
|
153
|
+
| `--context <lines>` | Git 默认值 (3) | 限制每处变更周围的上下文行数(`0` 仅显示变更行;不可与 `--pr` 或 stdin 一起使用) |
|
|
153
154
|
|
|
154
155
|
## 💬 评论系统
|
|
155
156
|
|
package/dist/cli/index.js
CHANGED
|
@@ -8,6 +8,7 @@ import { DiffMode } from '../types/watch.js';
|
|
|
8
8
|
import { DEFAULT_DIFF_VIEW_MODE, normalizeDiffViewMode } from '../utils/diffMode.js';
|
|
9
9
|
import { shouldReadStdin, findUntrackedFiles, markFilesIntentToAdd, promptUser, parseCommentOptions, validateDiffArguments, getGitRoot, } from './utils.js';
|
|
10
10
|
import { getPrPatch, getPrCommentImports } from './github.js';
|
|
11
|
+
import { warnAboutTuiDeprecation } from './tuiDeprecation.js';
|
|
11
12
|
function isSpecialArg(arg) {
|
|
12
13
|
return arg === 'working' || arg === 'staged' || arg === '.';
|
|
13
14
|
}
|
|
@@ -46,12 +47,18 @@ program
|
|
|
46
47
|
.option('--clean', 'start with a clean slate by clearing all existing comments')
|
|
47
48
|
.option('--include-untracked', 'automatically include untracked files in diff')
|
|
48
49
|
.option('--keep-alive', 'keep server running even after browser disconnects')
|
|
50
|
+
.option('--context <lines>', 'number of context lines shown around each change', parseInt)
|
|
49
51
|
.action(async (commitish, compareWith, options) => {
|
|
50
52
|
try {
|
|
51
53
|
let stdinDiff;
|
|
52
54
|
let stdinReviewLabel = 'diff from stdin';
|
|
53
55
|
let manualCommentImports = [];
|
|
54
56
|
let commentImports = [];
|
|
57
|
+
if (options.context !== undefined &&
|
|
58
|
+
(!Number.isInteger(options.context) || options.context < 0)) {
|
|
59
|
+
console.error('Error: --context must be a non-negative integer');
|
|
60
|
+
process.exit(1);
|
|
61
|
+
}
|
|
55
62
|
try {
|
|
56
63
|
manualCommentImports = parseCommentOptions(options.comment);
|
|
57
64
|
commentImports = manualCommentImports;
|
|
@@ -69,6 +76,10 @@ program
|
|
|
69
76
|
console.error('Error: --pr option cannot be used with --tui');
|
|
70
77
|
process.exit(1);
|
|
71
78
|
}
|
|
79
|
+
if (options.context !== undefined) {
|
|
80
|
+
console.error('Error: --context option cannot be used with --pr');
|
|
81
|
+
process.exit(1);
|
|
82
|
+
}
|
|
72
83
|
try {
|
|
73
84
|
stdinDiff = getPrPatch(options.pr);
|
|
74
85
|
stdinReviewLabel = options.pr;
|
|
@@ -94,6 +105,10 @@ program
|
|
|
94
105
|
hasTuiOption: Boolean(options.tui),
|
|
95
106
|
});
|
|
96
107
|
if (readFromStdin) {
|
|
108
|
+
if (options.context !== undefined) {
|
|
109
|
+
console.error('Error: --context option cannot be used with stdin diff');
|
|
110
|
+
process.exit(1);
|
|
111
|
+
}
|
|
97
112
|
// Read unified diff from stdin
|
|
98
113
|
stdinDiff = await readStdin();
|
|
99
114
|
if (!stdinDiff.trim()) {
|
|
@@ -166,6 +181,7 @@ program
|
|
|
166
181
|
console.error('Try running the command directly in your terminal without piping.');
|
|
167
182
|
process.exit(1);
|
|
168
183
|
}
|
|
184
|
+
await warnAboutTuiDeprecation();
|
|
169
185
|
// Dynamic import for TUI mode
|
|
170
186
|
const { render } = await import('ink');
|
|
171
187
|
const { default: TuiApp } = await import('../tui/App.js');
|
|
@@ -174,6 +190,7 @@ program
|
|
|
174
190
|
baseCommitish,
|
|
175
191
|
mode: options.mode,
|
|
176
192
|
repoPath,
|
|
193
|
+
contextLines: options.context,
|
|
177
194
|
}));
|
|
178
195
|
return;
|
|
179
196
|
}
|
|
@@ -191,6 +208,7 @@ program
|
|
|
191
208
|
mode: options.mode,
|
|
192
209
|
clearComments: options.clean,
|
|
193
210
|
keepAlive: options.keepAlive,
|
|
211
|
+
contextLines: options.context,
|
|
194
212
|
diffMode: determineDiffMode(targetCommitish, compareWith),
|
|
195
213
|
repoPath,
|
|
196
214
|
...(commentImports.length > 0 ? { commentImports } : {}),
|
package/dist/cli/index.test.js
CHANGED
|
@@ -22,7 +22,7 @@ vi.mock('./github.js', () => ({
|
|
|
22
22
|
}));
|
|
23
23
|
const { simpleGit } = await import('simple-git');
|
|
24
24
|
const { startServer } = await import('../server/server.js');
|
|
25
|
-
const { promptUser, findUntrackedFiles, markFilesIntentToAdd, parseCommentOptions } = await import('./utils.js');
|
|
25
|
+
const { promptUser, findUntrackedFiles, markFilesIntentToAdd, parseCommentOptions, shouldReadStdin, } = await import('./utils.js');
|
|
26
26
|
const { getPrPatch, getPrCommentImports } = await import('./github.js');
|
|
27
27
|
describe('CLI index.ts', () => {
|
|
28
28
|
let mockGit;
|
|
@@ -213,6 +213,11 @@ describe('CLI index.ts', () => {
|
|
|
213
213
|
args: ['--keep-alive'],
|
|
214
214
|
expectedOptions: { keepAlive: true },
|
|
215
215
|
},
|
|
216
|
+
{
|
|
217
|
+
name: '--context option',
|
|
218
|
+
args: ['--context', '5'],
|
|
219
|
+
expectedOptions: { context: 5 },
|
|
220
|
+
},
|
|
216
221
|
])('$name', async ({ args, expectedOptions }) => {
|
|
217
222
|
mockFindUntrackedFiles.mockResolvedValue([]);
|
|
218
223
|
const program = new Command();
|
|
@@ -227,6 +232,7 @@ describe('CLI index.ts', () => {
|
|
|
227
232
|
.option('--pr <url>', 'pr')
|
|
228
233
|
.option('--clean', 'start with a clean slate by clearing all existing comments')
|
|
229
234
|
.option('--keep-alive', 'keep server running even after browser disconnects')
|
|
235
|
+
.option('--context <lines>', 'context', parseInt)
|
|
230
236
|
.action(async (commitish, _compareWith, options) => {
|
|
231
237
|
let targetCommitish = commitish;
|
|
232
238
|
let baseCommitish = commitish + '^';
|
|
@@ -239,6 +245,7 @@ describe('CLI index.ts', () => {
|
|
|
239
245
|
mode: options.mode,
|
|
240
246
|
clearComments: options.clean,
|
|
241
247
|
keepAlive: options.keepAlive,
|
|
248
|
+
contextLines: options.context,
|
|
242
249
|
});
|
|
243
250
|
});
|
|
244
251
|
await program.parseAsync([...args], { from: 'user' });
|
|
@@ -251,10 +258,91 @@ describe('CLI index.ts', () => {
|
|
|
251
258
|
mode: expectedOptions.mode || 'split',
|
|
252
259
|
clearComments: expectedOptions.clean,
|
|
253
260
|
keepAlive: expectedOptions.keepAlive,
|
|
261
|
+
contextLines: expectedOptions.context,
|
|
254
262
|
};
|
|
255
263
|
expect(mockStartServer).toHaveBeenCalledWith(expectedCall);
|
|
256
264
|
});
|
|
257
265
|
});
|
|
266
|
+
describe('--context option', () => {
|
|
267
|
+
it('rejects negative values', async () => {
|
|
268
|
+
const program = new Command();
|
|
269
|
+
program
|
|
270
|
+
.argument('[commit-ish]', 'commit-ish', 'HEAD')
|
|
271
|
+
.argument('[compare-with]', 'compare-with')
|
|
272
|
+
.option('--context <lines>', 'context', parseInt)
|
|
273
|
+
.action(async (commitish, _compareWith, options) => {
|
|
274
|
+
if (options.context !== undefined &&
|
|
275
|
+
(!Number.isInteger(options.context) || options.context < 0)) {
|
|
276
|
+
console.error('Error: --context must be a non-negative integer');
|
|
277
|
+
process.exit(1);
|
|
278
|
+
return;
|
|
279
|
+
}
|
|
280
|
+
await startServer({
|
|
281
|
+
targetCommitish: commitish,
|
|
282
|
+
baseCommitish: `${commitish}^`,
|
|
283
|
+
contextLines: options.context,
|
|
284
|
+
});
|
|
285
|
+
});
|
|
286
|
+
await program.parseAsync(['--context', '-1'], { from: 'user' });
|
|
287
|
+
expect(console.error).toHaveBeenCalledWith('Error: --context must be a non-negative integer');
|
|
288
|
+
expect(process.exit).toHaveBeenCalledWith(1);
|
|
289
|
+
expect(mockStartServer).not.toHaveBeenCalled();
|
|
290
|
+
});
|
|
291
|
+
it('rejects --context with --pr', async () => {
|
|
292
|
+
const prUrl = 'https://github.com/owner/repo/pull/123';
|
|
293
|
+
const program = new Command();
|
|
294
|
+
program
|
|
295
|
+
.argument('[commit-ish]', 'commit-ish', 'HEAD')
|
|
296
|
+
.argument('[compare-with]', 'compare-with')
|
|
297
|
+
.option('--context <lines>', 'context', parseInt)
|
|
298
|
+
.option('--pr <url>', 'pr')
|
|
299
|
+
.action(async (_commitish, _compareWith, options) => {
|
|
300
|
+
if (options.pr && options.context !== undefined) {
|
|
301
|
+
console.error('Error: --context option cannot be used with --pr');
|
|
302
|
+
process.exit(1);
|
|
303
|
+
return;
|
|
304
|
+
}
|
|
305
|
+
await startServer({
|
|
306
|
+
stdinDiff: getPrPatch(options.pr),
|
|
307
|
+
contextLines: options.context,
|
|
308
|
+
});
|
|
309
|
+
});
|
|
310
|
+
await program.parseAsync(['--pr', prUrl, '--context', '3'], { from: 'user' });
|
|
311
|
+
expect(console.error).toHaveBeenCalledWith('Error: --context option cannot be used with --pr');
|
|
312
|
+
expect(process.exit).toHaveBeenCalledWith(1);
|
|
313
|
+
expect(mockGetPrPatch).not.toHaveBeenCalled();
|
|
314
|
+
expect(mockStartServer).not.toHaveBeenCalled();
|
|
315
|
+
});
|
|
316
|
+
it('rejects --context with stdin diff', async () => {
|
|
317
|
+
const program = new Command();
|
|
318
|
+
program
|
|
319
|
+
.argument('[commit-ish]', 'commit-ish', 'HEAD')
|
|
320
|
+
.argument('[compare-with]', 'compare-with')
|
|
321
|
+
.option('--context <lines>', 'context', parseInt)
|
|
322
|
+
.option('--tui', 'tui')
|
|
323
|
+
.action(async (commitish, _compareWith, options) => {
|
|
324
|
+
const readFromStdin = shouldReadStdin({
|
|
325
|
+
commitish,
|
|
326
|
+
hasPositionalArgs: program.args.length > 0,
|
|
327
|
+
hasPrOption: false,
|
|
328
|
+
hasTuiOption: Boolean(options.tui),
|
|
329
|
+
});
|
|
330
|
+
if (readFromStdin && options.context !== undefined) {
|
|
331
|
+
console.error('Error: --context option cannot be used with stdin diff');
|
|
332
|
+
process.exit(1);
|
|
333
|
+
return;
|
|
334
|
+
}
|
|
335
|
+
await startServer({
|
|
336
|
+
stdinDiff: 'diff --git a/file.ts b/file.ts',
|
|
337
|
+
contextLines: options.context,
|
|
338
|
+
});
|
|
339
|
+
});
|
|
340
|
+
await program.parseAsync(['-', '--context', '3'], { from: 'user' });
|
|
341
|
+
expect(console.error).toHaveBeenCalledWith('Error: --context option cannot be used with stdin diff');
|
|
342
|
+
expect(process.exit).toHaveBeenCalledWith(1);
|
|
343
|
+
expect(mockStartServer).not.toHaveBeenCalled();
|
|
344
|
+
});
|
|
345
|
+
});
|
|
258
346
|
describe('Version option', () => {
|
|
259
347
|
it('supports --version flag', async () => {
|
|
260
348
|
const program = new Command();
|
|
@@ -1014,16 +1102,16 @@ describe('CLI index.ts', () => {
|
|
|
1014
1102
|
describe('TUI mode', () => {
|
|
1015
1103
|
let mockRender;
|
|
1016
1104
|
let mockTuiApp;
|
|
1017
|
-
|
|
1018
|
-
|
|
1105
|
+
const expectRenderedTuiProps = (props) => {
|
|
1106
|
+
expect(mockRender).toHaveBeenCalledTimes(1);
|
|
1107
|
+
expect(mockRender).toHaveBeenCalledWith({
|
|
1108
|
+
component: mockTuiApp,
|
|
1109
|
+
props,
|
|
1110
|
+
});
|
|
1111
|
+
};
|
|
1112
|
+
beforeEach(() => {
|
|
1019
1113
|
mockRender = vi.fn();
|
|
1020
1114
|
mockTuiApp = vi.fn();
|
|
1021
|
-
vi.doMock('ink', async () => ({
|
|
1022
|
-
render: mockRender,
|
|
1023
|
-
}));
|
|
1024
|
-
vi.doMock('../tui/App.js', async () => ({
|
|
1025
|
-
default: mockTuiApp,
|
|
1026
|
-
}));
|
|
1027
1115
|
// Mock React.createElement for testing
|
|
1028
1116
|
vi.spyOn(React, 'createElement').mockImplementation((component, props) => ({ component, props }));
|
|
1029
1117
|
// Mock process.stdin.isTTY
|
|
@@ -1033,8 +1121,6 @@ describe('CLI index.ts', () => {
|
|
|
1033
1121
|
});
|
|
1034
1122
|
});
|
|
1035
1123
|
afterEach(() => {
|
|
1036
|
-
vi.doUnmock('ink');
|
|
1037
|
-
vi.doUnmock('../tui/App.js');
|
|
1038
1124
|
vi.restoreAllMocks();
|
|
1039
1125
|
});
|
|
1040
1126
|
it('passes arguments to TUI app correctly', async () => {
|
|
@@ -1055,8 +1141,8 @@ describe('CLI index.ts', () => {
|
|
|
1055
1141
|
console.error('Error: TUI mode requires an interactive terminal (TTY).');
|
|
1056
1142
|
process.exit(1);
|
|
1057
1143
|
}
|
|
1058
|
-
const
|
|
1059
|
-
const
|
|
1144
|
+
const render = mockRender;
|
|
1145
|
+
const TuiApp = mockTuiApp;
|
|
1060
1146
|
render(React.createElement(TuiApp, {
|
|
1061
1147
|
targetCommitish: commitish,
|
|
1062
1148
|
baseCommitish: commitish + '^',
|
|
@@ -1065,13 +1151,43 @@ describe('CLI index.ts', () => {
|
|
|
1065
1151
|
}
|
|
1066
1152
|
});
|
|
1067
1153
|
await program.parseAsync(['main', '--tui'], { from: 'user' });
|
|
1068
|
-
|
|
1069
|
-
|
|
1070
|
-
|
|
1071
|
-
|
|
1072
|
-
|
|
1073
|
-
|
|
1074
|
-
|
|
1154
|
+
expectRenderedTuiProps({
|
|
1155
|
+
targetCommitish: 'main',
|
|
1156
|
+
baseCommitish: 'main^',
|
|
1157
|
+
mode: 'split',
|
|
1158
|
+
});
|
|
1159
|
+
});
|
|
1160
|
+
it('passes context option to TUI app', async () => {
|
|
1161
|
+
mockFindUntrackedFiles.mockResolvedValue([]);
|
|
1162
|
+
const program = new Command();
|
|
1163
|
+
program
|
|
1164
|
+
.argument('[commit-ish]', 'commit-ish', 'HEAD')
|
|
1165
|
+
.argument('[compare-with]', 'compare-with')
|
|
1166
|
+
.option('--port <port>', 'port', parseInt)
|
|
1167
|
+
.option('--host <host>', 'host', '')
|
|
1168
|
+
.option('--no-open', 'no-open')
|
|
1169
|
+
.option('--mode <mode>', 'mode', normalizeDiffViewMode, DEFAULT_DIFF_VIEW_MODE)
|
|
1170
|
+
.option('--context <lines>', 'context', parseInt)
|
|
1171
|
+
.option('--tui', 'tui')
|
|
1172
|
+
.option('--pr <url>', 'pr')
|
|
1173
|
+
.action(async (commitish, _compareWith, options) => {
|
|
1174
|
+
if (options.tui) {
|
|
1175
|
+
const render = mockRender;
|
|
1176
|
+
const TuiApp = mockTuiApp;
|
|
1177
|
+
render(React.createElement(TuiApp, {
|
|
1178
|
+
targetCommitish: commitish,
|
|
1179
|
+
baseCommitish: commitish + '^',
|
|
1180
|
+
mode: options.mode,
|
|
1181
|
+
contextLines: options.context,
|
|
1182
|
+
}));
|
|
1183
|
+
}
|
|
1184
|
+
});
|
|
1185
|
+
await program.parseAsync(['--tui', '--context', '2'], { from: 'user' });
|
|
1186
|
+
expectRenderedTuiProps({
|
|
1187
|
+
targetCommitish: 'HEAD',
|
|
1188
|
+
baseCommitish: 'HEAD^',
|
|
1189
|
+
mode: 'split',
|
|
1190
|
+
contextLines: 2,
|
|
1075
1191
|
});
|
|
1076
1192
|
});
|
|
1077
1193
|
it('passes mode option to TUI app', async () => {
|
|
@@ -1092,8 +1208,8 @@ describe('CLI index.ts', () => {
|
|
|
1092
1208
|
console.error('Error: TUI mode requires an interactive terminal (TTY).');
|
|
1093
1209
|
process.exit(1);
|
|
1094
1210
|
}
|
|
1095
|
-
const
|
|
1096
|
-
const
|
|
1211
|
+
const render = mockRender;
|
|
1212
|
+
const TuiApp = mockTuiApp;
|
|
1097
1213
|
render(React.createElement(TuiApp, {
|
|
1098
1214
|
targetCommitish: commitish,
|
|
1099
1215
|
baseCommitish: commitish + '^',
|
|
@@ -1102,13 +1218,10 @@ describe('CLI index.ts', () => {
|
|
|
1102
1218
|
}
|
|
1103
1219
|
});
|
|
1104
1220
|
await program.parseAsync(['--tui', '--mode', 'unified'], { from: 'user' });
|
|
1105
|
-
|
|
1106
|
-
|
|
1107
|
-
|
|
1108
|
-
|
|
1109
|
-
baseCommitish: 'HEAD^',
|
|
1110
|
-
mode: 'unified',
|
|
1111
|
-
},
|
|
1221
|
+
expectRenderedTuiProps({
|
|
1222
|
+
targetCommitish: 'HEAD',
|
|
1223
|
+
baseCommitish: 'HEAD^',
|
|
1224
|
+
mode: 'unified',
|
|
1112
1225
|
});
|
|
1113
1226
|
});
|
|
1114
1227
|
it('handles special arguments with TUI mode', async () => {
|
|
@@ -1125,8 +1238,8 @@ describe('CLI index.ts', () => {
|
|
|
1125
1238
|
.option('--pr <url>', 'pr')
|
|
1126
1239
|
.action(async (commitish, _compareWith, options) => {
|
|
1127
1240
|
if (options.tui) {
|
|
1128
|
-
const
|
|
1129
|
-
const
|
|
1241
|
+
const render = mockRender;
|
|
1242
|
+
const TuiApp = mockTuiApp;
|
|
1130
1243
|
let targetCommitish = commitish;
|
|
1131
1244
|
let baseCommitish;
|
|
1132
1245
|
if (commitish === 'working') {
|
|
@@ -1146,13 +1259,10 @@ describe('CLI index.ts', () => {
|
|
|
1146
1259
|
}
|
|
1147
1260
|
});
|
|
1148
1261
|
await program.parseAsync(['working', '--tui', '--mode', 'unified'], { from: 'user' });
|
|
1149
|
-
|
|
1150
|
-
|
|
1151
|
-
|
|
1152
|
-
|
|
1153
|
-
baseCommitish: 'staged',
|
|
1154
|
-
mode: 'unified',
|
|
1155
|
-
},
|
|
1262
|
+
expectRenderedTuiProps({
|
|
1263
|
+
targetCommitish: 'working',
|
|
1264
|
+
baseCommitish: 'staged',
|
|
1265
|
+
mode: 'unified',
|
|
1156
1266
|
});
|
|
1157
1267
|
});
|
|
1158
1268
|
it('rejects TUI mode in non-TTY environment', async () => {
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { waitForEnter } from './utils.js';
|
|
2
|
+
const TUI_DEPRECATION_ISSUES_URL = 'https://github.com/yoshiko-pg/difit/issues';
|
|
3
|
+
export const TUI_DEPRECATION_NOTICE_LINES = [
|
|
4
|
+
`⚠️ TUI mode will be removed in the next major release because ongoing implementation of core features is difficult. If you have feedback, please open an issue: ${TUI_DEPRECATION_ISSUES_URL}`,
|
|
5
|
+
`⚠️ tuiモードは継続的な主要機能の実装が難しいため次回のメジャーリリースで削除予定です。もしご意見がある場合はissueの起票をお願いします。 ${TUI_DEPRECATION_ISSUES_URL}`,
|
|
6
|
+
];
|
|
7
|
+
export const TUI_DEPRECATION_PROMPT = [
|
|
8
|
+
'Press Enter to start TUI mode.',
|
|
9
|
+
'Enterを押すとtuiモードを起動します。',
|
|
10
|
+
].join('\n');
|
|
11
|
+
export async function warnAboutTuiDeprecation(waitForEnterFn = waitForEnter) {
|
|
12
|
+
for (const line of TUI_DEPRECATION_NOTICE_LINES) {
|
|
13
|
+
console.warn(line);
|
|
14
|
+
}
|
|
15
|
+
await waitForEnterFn(`\n${TUI_DEPRECATION_PROMPT}\n`);
|
|
16
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { afterEach, describe, expect, it, vi } from 'vitest';
|
|
2
|
+
import { TUI_DEPRECATION_NOTICE_LINES, TUI_DEPRECATION_PROMPT, warnAboutTuiDeprecation, } from './tuiDeprecation.js';
|
|
3
|
+
describe('TUI deprecation warning', () => {
|
|
4
|
+
afterEach(() => {
|
|
5
|
+
vi.restoreAllMocks();
|
|
6
|
+
});
|
|
7
|
+
it('shows bilingual warnings and waits for Enter before continuing', async () => {
|
|
8
|
+
const consoleWarn = vi.spyOn(console, 'warn').mockImplementation(() => { });
|
|
9
|
+
const waitForEnter = vi.fn().mockResolvedValue(undefined);
|
|
10
|
+
await warnAboutTuiDeprecation(waitForEnter);
|
|
11
|
+
expect(consoleWarn).toHaveBeenNthCalledWith(1, TUI_DEPRECATION_NOTICE_LINES[0]);
|
|
12
|
+
expect(consoleWarn).toHaveBeenNthCalledWith(2, TUI_DEPRECATION_NOTICE_LINES[1]);
|
|
13
|
+
expect(waitForEnter).toHaveBeenCalledWith(`\n${TUI_DEPRECATION_PROMPT}\n`);
|
|
14
|
+
expect(consoleWarn.mock.invocationCallOrder[1]).toBeLessThan(waitForEnter.mock.invocationCallOrder[0]);
|
|
15
|
+
});
|
|
16
|
+
});
|
package/dist/cli/utils.d.ts
CHANGED
|
@@ -24,4 +24,5 @@ export declare function validateDiffArguments(targetCommitish: string, baseCommi
|
|
|
24
24
|
export declare function findUntrackedFiles(git: SimpleGit): Promise<string[]>;
|
|
25
25
|
export declare function markFilesIntentToAdd(git: SimpleGit, files: string[]): Promise<void>;
|
|
26
26
|
export declare function promptUser(message: string): Promise<boolean>;
|
|
27
|
+
export declare function waitForEnter(message: string): Promise<void>;
|
|
27
28
|
export {};
|
package/dist/cli/utils.js
CHANGED
|
@@ -191,3 +191,20 @@ export async function promptUser(message) {
|
|
|
191
191
|
const trimmed = answer.trim().toLowerCase();
|
|
192
192
|
return trimmed === '' || ['y', 'yes'].includes(trimmed);
|
|
193
193
|
}
|
|
194
|
+
export async function waitForEnter(message) {
|
|
195
|
+
const rl = createInterface({
|
|
196
|
+
input: process.stdin,
|
|
197
|
+
output: process.stdout,
|
|
198
|
+
});
|
|
199
|
+
try {
|
|
200
|
+
while (true) {
|
|
201
|
+
const answer = await rl.question(message);
|
|
202
|
+
if (answer.trim() === '') {
|
|
203
|
+
return;
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
finally {
|
|
208
|
+
rl.close();
|
|
209
|
+
}
|
|
210
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
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};
|
|
@@ -0,0 +1 @@
|
|
|
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};
|