@sanurb/ringi 0.2.1 → 0.3.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.mjs +505 -114
- package/dist/cli.mjs.map +1 -1
- package/dist/mcp.mjs +35 -39
- package/dist/mcp.mjs.map +1 -1
- package/dist/runtime.mjs +569 -428
- package/dist/runtime.mjs.map +1 -1
- package/package.json +9 -8
- package/server/nitro.json +17 -0
- package/server/public/assets/ClientOnly-QdfAxyFs.js +1 -0
- package/server/public/assets/_reviewId-CmXHvWLn.js +1 -0
- package/server/public/assets/_reviewId-DdOpDx4U.js +1 -0
- package/server/public/assets/abap-B1dkBSPn.js +1 -0
- package/server/public/assets/action-bar-DLRNvLjj.js +45 -0
- package/server/public/assets/actionscript-3-BT4ibYlP.js +1 -0
- package/server/public/assets/ada-CD92zeps.js +1 -0
- package/server/public/assets/andromeeda-DqSmgxi0.js +1 -0
- package/server/public/assets/angular-html-BDC0PfKr.js +1 -0
- package/server/public/assets/angular-ts-B9yoQMtj.js +1 -0
- package/server/public/assets/apache-D5suuoa_.js +1 -0
- package/server/public/assets/apex-BL-m4VHy.js +1 -0
- package/server/public/assets/apl-CldhY0Pn.js +1 -0
- package/server/public/assets/applescript-CLiBqvKT.js +1 -0
- package/server/public/assets/ara-LdDF8cmv.js +1 -0
- package/server/public/assets/asciidoc-2DZ9hC2N.js +1 -0
- package/server/public/assets/asm-0ZPGRSUy.js +1 -0
- package/server/public/assets/astro-DR6labZJ.js +1 -0
- package/server/public/assets/aurora-x-Da7Zfvbg.js +1 -0
- package/server/public/assets/awk-Bn0gn_B_.js +1 -0
- package/server/public/assets/ayu-dark-bqYKoqpM.js +1 -0
- package/server/public/assets/ayu-light-C45jTIzZ.js +1 -0
- package/server/public/assets/ayu-mirage-BV_FCTQi.js +1 -0
- package/server/public/assets/ballerina-D2nw_w8Q.js +1 -0
- package/server/public/assets/bat-ByUBN5gS.js +1 -0
- package/server/public/assets/beancount-BTb2W6Mp.js +1 -0
- package/server/public/assets/berry-5SO2uITG.js +1 -0
- package/server/public/assets/bibtex-CDBTNfUI.js +1 -0
- package/server/public/assets/bicep-fgxG_4rP.js +1 -0
- package/server/public/assets/bird2-BCwzDhwX.js +1 -0
- package/server/public/assets/blade-BBTRu2-g.js +1 -0
- package/server/public/assets/bsl-CG-fq4sc.js +1 -0
- package/server/public/assets/c-CEvNj7xl.js +1 -0
- package/server/public/assets/c3-Dlaci63_.js +1 -0
- package/server/public/assets/cadence-DHbRuEmm.js +1 -0
- package/server/public/assets/cairo-Ds0kTeYT.js +1 -0
- package/server/public/assets/catppuccin-frappe-DrL1fUuH.js +1 -0
- package/server/public/assets/catppuccin-latte-C0REgVjl.js +1 -0
- package/server/public/assets/catppuccin-macchiato-ChQpylWO.js +1 -0
- package/server/public/assets/catppuccin-mocha-Dd0JU1T0.js +1 -0
- package/server/public/assets/clarity-DMoTOm4G.js +1 -0
- package/server/public/assets/clojure-DBhE3PpS.js +1 -0
- package/server/public/assets/cmake-DwMc40Or.js +1 -0
- package/server/public/assets/cobol-BdNJSMRt.js +1 -0
- package/server/public/assets/codeowners-1lVr8wqV.js +1 -0
- package/server/public/assets/codeql-DWflolvo.js +1 -0
- package/server/public/assets/coffee-RA4xA24H.js +1 -0
- package/server/public/assets/common-lisp-CrVQ5xT-.js +1 -0
- package/server/public/assets/compiler-runtime-DZXZ41-q.js +1 -0
- package/server/public/assets/coq-CjfoyYSh.js +1 -0
- package/server/public/assets/cpp-BoW7e2Ow.js +1 -0
- package/server/public/assets/createServerFn-DTk395iP.js +9 -0
- package/server/public/assets/crystal-CYKRo3F9.js +1 -0
- package/server/public/assets/csharp-C7bIWP5y.js +1 -0
- package/server/public/assets/css-Ck2tii2d.js +1 -0
- package/server/public/assets/csv-DsAkDVtA.js +1 -0
- package/server/public/assets/cue-BWmQgbOB.js +1 -0
- package/server/public/assets/cypher-D-jVC50Q.js +1 -0
- package/server/public/assets/d-CaviyOrm.js +1 -0
- package/server/public/assets/dark-plus-DIrnwZt9.js +1 -0
- package/server/public/assets/dart-CZEi7JgC.js +1 -0
- package/server/public/assets/dax-BK-8zffy.js +1 -0
- package/server/public/assets/desktop-D3cjbL4D.js +1 -0
- package/server/public/assets/diff-sHAzLvlp.js +1 -0
- package/server/public/assets/docker--xs2Ng3w.js +1 -0
- package/server/public/assets/dotenv-Cm4nwcJ7.js +1 -0
- package/server/public/assets/dracula-CAUSusef.js +1 -0
- package/server/public/assets/dracula-soft-cjNkMFza.js +1 -0
- package/server/public/assets/dream-maker-fjmWTFCO.js +1 -0
- package/server/public/assets/edge-DxycC9wl.js +1 -0
- package/server/public/assets/elixir-B-50Er3p.js +1 -0
- package/server/public/assets/elm-B4-ygIVo.js +1 -0
- package/server/public/assets/emacs-lisp-CJzqStIa.js +1 -0
- package/server/public/assets/erb-DJvYE1L1.js +1 -0
- package/server/public/assets/erlang-C-m_88FN.js +1 -0
- package/server/public/assets/everforest-dark-DBpaSMx1.js +1 -0
- package/server/public/assets/everforest-light-CiGrXwia.js +1 -0
- package/server/public/assets/fennel-DRaXF7k8.js +1 -0
- package/server/public/assets/file-tree-CI3Xwwid.js +1907 -0
- package/server/public/assets/fish-Bn-Yh3Jj.js +1 -0
- package/server/public/assets/fluent-DF5F8Ks_.js +1 -0
- package/server/public/assets/fortran-fixed-form-Cx1lv7HN.js +1 -0
- package/server/public/assets/fortran-free-form-hCQHRqew.js +1 -0
- package/server/public/assets/fsharp-DC5k9sy2.js +1 -0
- package/server/public/assets/gdresource-D0EsKdgH.js +1 -0
- package/server/public/assets/gdscript-_C9_Hi_w.js +1 -0
- package/server/public/assets/gdshader-BW7b1X1Y.js +1 -0
- package/server/public/assets/geist-cyrillic-wght-normal-CHSlOQsW.woff2 +0 -0
- package/server/public/assets/geist-latin-ext-wght-normal-DMtmJ5ZE.woff2 +0 -0
- package/server/public/assets/geist-latin-wght-normal-Dm3htQBi.woff2 +0 -0
- package/server/public/assets/genie-Ch_6TCHd.js +1 -0
- package/server/public/assets/gherkin-CaNUsmTq.js +1 -0
- package/server/public/assets/git-commit-BcFsuO5E.js +1 -0
- package/server/public/assets/git-rebase-ChGA-z50.js +1 -0
- package/server/public/assets/github-dark-B9ygjgg6.js +1 -0
- package/server/public/assets/github-dark-default-Br2bgYSx.js +1 -0
- package/server/public/assets/github-dark-dimmed-CmtqpPJ-.js +1 -0
- package/server/public/assets/github-dark-high-contrast-fSfmrZcC.js +1 -0
- package/server/public/assets/github-light-BZjUqfZl.js +1 -0
- package/server/public/assets/github-light-default-lIytXXhR.js +1 -0
- package/server/public/assets/github-light-high-contrast-BRrjFb7n.js +1 -0
- package/server/public/assets/gleam-DALMDpNs.js +1 -0
- package/server/public/assets/glimmer-js-maLb6ysA.js +1 -0
- package/server/public/assets/glimmer-ts-DGNr-OBA.js +1 -0
- package/server/public/assets/glsl-CmplqyQ1.js +1 -0
- package/server/public/assets/gn-DGjqrYN9.js +1 -0
- package/server/public/assets/gnuplot-BYckvgQI.js +1 -0
- package/server/public/assets/go-JycvP538.js +1 -0
- package/server/public/assets/graphql-VhP7n4--.js +1 -0
- package/server/public/assets/groovy-D5qMRONT.js +1 -0
- package/server/public/assets/gruvbox-dark-hard-M1dj1e6V.js +1 -0
- package/server/public/assets/gruvbox-dark-medium-cqq_ncQu.js +1 -0
- package/server/public/assets/gruvbox-dark-soft-B4QwL2a9.js +1 -0
- package/server/public/assets/gruvbox-light-hard-DLayMKOQ.js +1 -0
- package/server/public/assets/gruvbox-light-medium-D52XgPKf.js +1 -0
- package/server/public/assets/gruvbox-light-soft-Dola3KdD.js +1 -0
- package/server/public/assets/hack-BVSQ2bxM.js +1 -0
- package/server/public/assets/haml-CwTtRHoj.js +1 -0
- package/server/public/assets/handlebars-CcO01SVo.js +1 -0
- package/server/public/assets/haskell-ys7wPPEd.js +1 -0
- package/server/public/assets/haxe-94kiChn7.js +1 -0
- package/server/public/assets/hcl-DmHt_-wq.js +1 -0
- package/server/public/assets/hjson-xMmoJ0Gx.js +1 -0
- package/server/public/assets/hlsl-b-Pskdze.js +1 -0
- package/server/public/assets/horizon-BKMqttiR.js +1 -0
- package/server/public/assets/horizon-bright-HNkBlnm5.js +1 -0
- package/server/public/assets/houston-BkBSBSOQ.js +1 -0
- package/server/public/assets/html-derivative-Cz-cKMi2.js +1 -0
- package/server/public/assets/html-zQbUS8Is.js +1 -0
- package/server/public/assets/http-CaGQ9BgA.js +1 -0
- package/server/public/assets/hurl-BBoki9bg.js +1 -0
- package/server/public/assets/hxml-iQTOTWpM.js +1 -0
- package/server/public/assets/hy-DKl1XhBq.js +1 -0
- package/server/public/assets/imba-DPxkOTAg.js +1 -0
- package/server/public/assets/ini-lkLGq_1x.js +1 -0
- package/server/public/assets/java-LAx6oszV.js +1 -0
- package/server/public/assets/javascript-COqx-gKX.js +1 -0
- package/server/public/assets/jinja-x-G_qSCP.js +1 -0
- package/server/public/assets/jison-7oSeVkKJ.js +1 -0
- package/server/public/assets/json-sTLOVXhc.js +1 -0
- package/server/public/assets/json5-Cy6ypJuJ.js +1 -0
- package/server/public/assets/jsonc-Cw2ugYAK.js +1 -0
- package/server/public/assets/jsonl-Dp5_qBVH.js +1 -0
- package/server/public/assets/jsonnet-BTbmg_-u.js +1 -0
- package/server/public/assets/jssm-CnT7nPea.js +1 -0
- package/server/public/assets/jsx-zXeIBQLI.js +1 -0
- package/server/public/assets/julia-E-6Xm9nd.js +1 -0
- package/server/public/assets/just-D9n74gZy.js +1 -0
- package/server/public/assets/kanagawa-dragon-CxsBnuhV.js +1 -0
- package/server/public/assets/kanagawa-lotus-vHdxDDOS.js +1 -0
- package/server/public/assets/kanagawa-wave-CIkfTKWk.js +1 -0
- package/server/public/assets/kdl-BwK60g80.js +1 -0
- package/server/public/assets/kotlin-Dbd9Vi-v.js +1 -0
- package/server/public/assets/kusto-BuTk9usc.js +1 -0
- package/server/public/assets/laserwave-C0wf_d3o.js +1 -0
- package/server/public/assets/latex-D0t4RtEU.js +1 -0
- package/server/public/assets/lean-CYAW8bRN.js +1 -0
- package/server/public/assets/less-D4uen21c.js +1 -0
- package/server/public/assets/light-plus-oqYyWKEE.js +1 -0
- package/server/public/assets/liquid-BzXN12F6.js +1 -0
- package/server/public/assets/llvm-Z1xJzteV.js +1 -0
- package/server/public/assets/log-BGUxlsk3.js +1 -0
- package/server/public/assets/logo-wVUhvQ1b.js +1 -0
- package/server/public/assets/lua-B0Cg8RP4.js +1 -0
- package/server/public/assets/luau-rPFZzCmq.js +1 -0
- package/server/public/assets/main-FvxVz-kD.js +15 -0
- package/server/public/assets/make-BmPf6m0P.js +1 -0
- package/server/public/assets/markdown-AseU6zcW.js +1 -0
- package/server/public/assets/marko-BlRPXWOe.js +1 -0
- package/server/public/assets/material-theme-6_W6rQhR.js +1 -0
- package/server/public/assets/material-theme-darker-VPEo3Sem.js +1 -0
- package/server/public/assets/material-theme-lighter-CUhzCcZ9.js +1 -0
- package/server/public/assets/material-theme-ocean-B2JdsaGb.js +1 -0
- package/server/public/assets/material-theme-palenight-DhY-sklA.js +1 -0
- package/server/public/assets/matlab-BOj_BDQv.js +1 -0
- package/server/public/assets/mdc-FiVDZSZ4.js +1 -0
- package/server/public/assets/mdx-Cm6cDkDI.js +1 -0
- package/server/public/assets/mermaid-DLO-R4hv.js +1 -0
- package/server/public/assets/min-dark-D34a_pX7.js +1 -0
- package/server/public/assets/min-light-Cdd4KORE.js +1 -0
- package/server/public/assets/mipsasm-DYpHF-GA.js +1 -0
- package/server/public/assets/mojo-DqYVFv_G.js +1 -0
- package/server/public/assets/monokai-CDR4sQ2n.js +1 -0
- package/server/public/assets/moonbit-DRKee9wk.js +1 -0
- package/server/public/assets/move-DbRk6Vn9.js +1 -0
- package/server/public/assets/narrat-IOfmaXfb.js +1 -0
- package/server/public/assets/new-DOyplRwM.js +1 -0
- package/server/public/assets/nextflow-D-Ec_bsY.js +1 -0
- package/server/public/assets/nextflow-groovy-EYl0c2BQ.js +1 -0
- package/server/public/assets/nginx-3JLAqmJa.js +1 -0
- package/server/public/assets/night-owl-light-Bedht9b4.js +1 -0
- package/server/public/assets/night-owl-yQJ3-I0I.js +1 -0
- package/server/public/assets/nim-DyjFVMzT.js +1 -0
- package/server/public/assets/nix-C2IovEl2.js +1 -0
- package/server/public/assets/nord-BjZ63GNL.js +1 -0
- package/server/public/assets/nushell-BflTrRB5.js +1 -0
- package/server/public/assets/objective-c-GRClK1S7.js +1 -0
- package/server/public/assets/objective-cpp-l3qYw-v5.js +1 -0
- package/server/public/assets/ocaml-BBDyhyMH.js +1 -0
- package/server/public/assets/odin-jCJ7Js99.js +1 -0
- package/server/public/assets/one-dark-pro-PIx2Diul.js +1 -0
- package/server/public/assets/one-light-BFMEz49S.js +1 -0
- package/server/public/assets/openscad-Drf0LgCX.js +1 -0
- package/server/public/assets/pascal-BT2XAUTl.js +1 -0
- package/server/public/assets/perl-Dr47G_2Q.js +1 -0
- package/server/public/assets/php-BhBDWTJe.js +1 -0
- package/server/public/assets/pierre-dark-CTXzTLfO.js +1 -0
- package/server/public/assets/pierre-light-C_5rlJRo.js +1 -0
- package/server/public/assets/pkl-ML-dWShO.js +1 -0
- package/server/public/assets/plastic-BFI-Z5Z2.js +1 -0
- package/server/public/assets/plsql-0vd5cLro.js +1 -0
- package/server/public/assets/po-CbZ_uqQA.js +1 -0
- package/server/public/assets/poimandres-Cayhd01L.js +1 -0
- package/server/public/assets/polar-C4hfV8Nc.js +1 -0
- package/server/public/assets/postcss-osFUbTLw.js +1 -0
- package/server/public/assets/powerquery-CTlGUQPj.js +1 -0
- package/server/public/assets/powershell-DyZsOmuq.js +1 -0
- package/server/public/assets/preload-helper-D7oT-Xwl.js +20 -0
- package/server/public/assets/prisma-SS92PO_I.js +1 -0
- package/server/public/assets/prolog-B1O1NNVC.js +1 -0
- package/server/public/assets/proto-BWu3eZTs.js +1 -0
- package/server/public/assets/pug-Dij_IK5w.js +1 -0
- package/server/public/assets/puppet-tvtRVdr6.js +1 -0
- package/server/public/assets/purescript-Dtbpb7D-.js +1 -0
- package/server/public/assets/python-Dlk0Acio.js +1 -0
- package/server/public/assets/qml-qUwk3nhh.js +1 -0
- package/server/public/assets/qmldir-B-iEOngH.js +1 -0
- package/server/public/assets/qss-Ba0p-aHw.js +1 -0
- package/server/public/assets/r-WmtNicKM.js +1 -0
- package/server/public/assets/racket-BXDsxf2U.js +1 -0
- package/server/public/assets/raku-Dw1WWFXK.js +1 -0
- package/server/public/assets/razor-DaqiVx3Q.js +1 -0
- package/server/public/assets/red-BC3Ds49b.js +1 -0
- package/server/public/assets/reg-DXFHGaM4.js +1 -0
- package/server/public/assets/regexp-CiSWN5Ne.js +1 -0
- package/server/public/assets/rel-Dc5_Ytx2.js +1 -0
- package/server/public/assets/reviews-CJvVXRLH.js +1 -0
- package/server/public/assets/reviews-CfbuF6ib.js +1 -0
- package/server/public/assets/riscv-ZgswiWij.js +1 -0
- package/server/public/assets/ron-YghabWAH.js +1 -0
- package/server/public/assets/rose-pine-ByWLnVr3.js +1 -0
- package/server/public/assets/rose-pine-dawn-DBmeySrz.js +1 -0
- package/server/public/assets/rose-pine-moon-B9J-N3nK.js +1 -0
- package/server/public/assets/rosmsg-DTKmAsVH.js +1 -0
- package/server/public/assets/routes-DNxq1Fba.js +1 -0
- package/server/public/assets/routes-Dp0ODZ55.js +2 -0
- package/server/public/assets/rst-CP6xOYlY.js +1 -0
- package/server/public/assets/ruby-BXYLc1CM.js +1 -0
- package/server/public/assets/rust-nfXwuE6F.js +1 -0
- package/server/public/assets/sas-CFdtZutF.js +1 -0
- package/server/public/assets/sass-CbRjkld3.js +1 -0
- package/server/public/assets/scala-BzD3eypx.js +1 -0
- package/server/public/assets/scheme-D4d1PV1y.js +1 -0
- package/server/public/assets/scss-D8KhdObH.js +1 -0
- package/server/public/assets/sdbl-Cf-Ydnvx.js +1 -0
- package/server/public/assets/shaderlab-DGohHMiF.js +1 -0
- package/server/public/assets/shellscript-BHdEbumI.js +1 -0
- package/server/public/assets/shellsession-Dh-bxrap.js +1 -0
- package/server/public/assets/slack-dark-MszIyPZ2.js +1 -0
- package/server/public/assets/slack-ochin-tQ3Q0gE9.js +1 -0
- package/server/public/assets/smalltalk-_uWoArwn.js +1 -0
- package/server/public/assets/snazzy-light-9sniMEk5.js +1 -0
- package/server/public/assets/solarized-dark-CdD0Hxzv.js +1 -0
- package/server/public/assets/solarized-light-C-nsEdqF.js +1 -0
- package/server/public/assets/solidity-D6uC-xwP.js +1 -0
- package/server/public/assets/soy-cDuODfbT.js +1 -0
- package/server/public/assets/sparql-BgU2QITA.js +1 -0
- package/server/public/assets/splunk-LQYHRu14.js +1 -0
- package/server/public/assets/sql-CKZpK620.js +1 -0
- package/server/public/assets/ssh-config-B7BUl8Rd.js +1 -0
- package/server/public/assets/stata-BLJTbKOO.js +1 -0
- package/server/public/assets/styles-UDowwF7S.css +2 -0
- package/server/public/assets/stylus-Byjxdx_q.js +1 -0
- package/server/public/assets/surrealql-C96KvYaj.js +1 -0
- package/server/public/assets/svelte-Qnbj2GWx.js +1 -0
- package/server/public/assets/swift-BexLlMrU.js +1 -0
- package/server/public/assets/synthwave-84-BxMBwQMS.js +1 -0
- package/server/public/assets/system-verilog-DVGwm0mw.js +1 -0
- package/server/public/assets/systemd-H2IT3-p5.js +1 -0
- package/server/public/assets/talonscript-mKZIGM8n.js +1 -0
- package/server/public/assets/tasl-B7he_Ugr.js +1 -0
- package/server/public/assets/tcl-5mT3RxHH.js +1 -0
- package/server/public/assets/templ-CQPDll3D.js +1 -0
- package/server/public/assets/terraform-BZP0GLsT.js +1 -0
- package/server/public/assets/test-D7JRfog1.js +1 -0
- package/server/public/assets/tex-97QNLoBJ.js +1 -0
- package/server/public/assets/tokyo-night-CTPVdZt9.js +1 -0
- package/server/public/assets/toml-CTFA98he.js +1 -0
- package/server/public/assets/ts-tags-B8zlXe2n.js +1 -0
- package/server/public/assets/tsv-BayJtYdY.js +1 -0
- package/server/public/assets/tsx-VqRU8NCz.js +1 -0
- package/server/public/assets/turtle-TVCBh_kY.js +1 -0
- package/server/public/assets/twig-FTTF8rVk.js +1 -0
- package/server/public/assets/typescript-CuX0hIVY.js +1 -0
- package/server/public/assets/typespec-BUvaJDLF.js +1 -0
- package/server/public/assets/typst-8NBaY7Ec.js +1 -0
- package/server/public/assets/useStore-M3H8PB1v.js +1 -0
- package/server/public/assets/utils-DElCu2hq.js +1 -0
- package/server/public/assets/v-VihyTigi.js +1 -0
- package/server/public/assets/vala-DyFAPyX6.js +1 -0
- package/server/public/assets/vb-Dg1Iqi4J.js +1 -0
- package/server/public/assets/verilog-D2Xc-vhD.js +1 -0
- package/server/public/assets/vesper-DJbtqYNr.js +1 -0
- package/server/public/assets/vhdl-CU3BVeE7.js +1 -0
- package/server/public/assets/viml-hG2shuOW.js +1 -0
- package/server/public/assets/vitesse-black-DbG2gsc0.js +1 -0
- package/server/public/assets/vitesse-dark-B6WV4xXH.js +1 -0
- package/server/public/assets/vitesse-light-DC1pdD02.js +1 -0
- package/server/public/assets/vue-DXwaEU0U.js +1 -0
- package/server/public/assets/vue-html-QD7AJ6JJ.js +1 -0
- package/server/public/assets/vue-vine-Bh2m1D2Z.js +1 -0
- package/server/public/assets/vyper-C1wojIuk.js +1 -0
- package/server/public/assets/wasm-C6Y0s02M.js +1 -0
- package/server/public/assets/wasm-qTvCOSHz.js +1 -0
- package/server/public/assets/wenyan-BG5vPQF0.js +1 -0
- package/server/public/assets/wgsl-DrVb-Cub.js +1 -0
- package/server/public/assets/wikitext-PRC4s8sH.js +1 -0
- package/server/public/assets/wit-ChW5qvg_.js +1 -0
- package/server/public/assets/wolfram-B8mKuZSQ.js +1 -0
- package/server/public/assets/xml-BK-rcb5a.js +1 -0
- package/server/public/assets/xsl-dt-d2R7p.js +1 -0
- package/server/public/assets/yaml-UiXU3hGj.js +1 -0
- package/server/public/assets/zenscript-C-jEPC9j.js +1 -0
- package/server/public/assets/zig-EbnRGjcz.js +1 -0
- package/server/public/favicon.ico +0 -0
- package/server/public/logo192.png +0 -0
- package/server/public/logo512.png +0 -0
- package/server/public/manifest.json +25 -0
- package/server/public/robots.txt +3 -0
- package/server/public/tanstack-circle-logo.png +0 -0
- package/server/public/tanstack-word-logo-white.svg +1 -0
- package/server/server/_chunks/ssr-renderer.mjs +15 -0
- package/server/server/_libs/@floating-ui/core+[...].mjs +698 -0
- package/server/server/_libs/@floating-ui/dom+[...].mjs +644 -0
- package/server/server/_libs/@floating-ui/react-dom+[...].mjs +839 -0
- package/server/server/_libs/@pierre/diffs+[...].mjs +18578 -0
- package/server/server/_libs/@radix-ui/react-arrow+[...].mjs +174 -0
- package/server/server/_libs/@radix-ui/react-collection+[...].mjs +162 -0
- package/server/server/_libs/@radix-ui/react-dialog+[...].mjs +1666 -0
- package/server/server/_libs/@radix-ui/react-popper+[...].mjs +289 -0
- package/server/server/_libs/@radix-ui/react-radio-group+[...].mjs +420 -0
- package/server/server/_libs/@radix-ui/react-select+[...].mjs +990 -0
- package/server/server/_libs/@tanstack/react-router+[...].mjs +14113 -0
- package/server/server/_libs/_.mjs +2 -0
- package/server/server/_libs/chokidar+readdirp.mjs +1599 -0
- package/server/server/_libs/class-variance-authority+clsx.mjs +69 -0
- package/server/server/_libs/effect+[...].mjs +34047 -0
- package/server/server/_libs/h3+rou3+srvx.mjs +1195 -0
- package/server/server/_libs/hookable.mjs +41 -0
- package/server/server/_libs/lucide-react.mjs +298 -0
- package/server/server/_libs/pierre__theme.mjs +2668 -0
- package/server/server/_libs/radix-ui__number.mjs +6 -0
- package/server/server/_libs/radix-ui__primitive.mjs +9 -0
- package/server/server/_libs/radix-ui__react-direction.mjs +11 -0
- package/server/server/_libs/shiki.mjs +16 -0
- package/server/server/_libs/shikijs__langs.mjs +1355 -0
- package/server/server/_libs/shikijs__themes.mjs +262 -0
- package/server/server/_libs/tailwind-merge.mjs +1962 -0
- package/server/server/_libs/tanstack__history.mjs +342 -0
- package/server/server/_libs/tanstack__router-core.mjs +6 -0
- package/server/server/_libs/ufo.mjs +64 -0
- package/server/server/_reviewId-AWnOGz5k.mjs +33 -0
- package/server/server/_reviewId-Com4yOlc.mjs +29 -0
- package/server/server/_reviewId-DAhmekJ2.mjs +277 -0
- package/server/server/_reviewId-p9mhYVwa.mjs +18 -0
- package/server/server/_runtime.mjs +35 -0
- package/server/server/_ssr/action-bar-C68xGnWW.mjs +592 -0
- package/server/server/_ssr/api-handler-CstW2n82.mjs +189 -0
- package/server/server/_ssr/client-runtime-BoPuAEoA.mjs +245 -0
- package/server/server/_ssr/createServerRpc--0mcGlWK.mjs +12 -0
- package/server/server/_ssr/createSsrRpc-AwdiLXmF.mjs +16 -0
- package/server/server/_ssr/domain-rpc-3Ds9DPr0.mjs +287 -0
- package/server/server/_ssr/file-tree-CQ5w2GHh.mjs +1951 -0
- package/server/server/_ssr/load-scoped-diff-NL2XAcdz.mjs +45 -0
- package/server/server/_ssr/new-BKl_G2Ks.mjs +37 -0
- package/server/server/_ssr/new-BREdMFAM.mjs +12 -0
- package/server/server/_ssr/new-DCz5eHkb.mjs +137 -0
- package/server/server/_ssr/reviews-BL5Nsgst.mjs +7 -0
- package/server/server/_ssr/reviews-BoaEgGKs.mjs +100 -0
- package/server/server/_ssr/reviews-C7_NIhY8.mjs +19 -0
- package/server/server/_ssr/reviews-Dd69YBDa.mjs +12 -0
- package/server/server/_ssr/router-DLxN8FOm.mjs +415 -0
- package/server/server/_ssr/routes-D25G8OuS.mjs +80 -0
- package/server/server/_ssr/routes-lz0AN75A.mjs +929 -0
- package/server/server/_ssr/runtime-D9IbnMlF.mjs +1401 -0
- package/server/server/_ssr/server-runtime-D99qpmma.mjs +12 -0
- package/server/server/_ssr/ssr.mjs +5318 -0
- package/server/server/_ssr/start-BIQfOZtj.mjs +4 -0
- package/server/server/_ssr/test-CQdMYlqa.mjs +6 -0
- package/server/server/_ssr/todo-m_uUvxca.mjs +88 -0
- package/server/server/_ssr/use-keyboard-shortcuts-D5b1Mxpq.mjs +25 -0
- package/server/server/_ssr/utils-BuOt9_LA.mjs +8 -0
- package/server/server/_tanstack-start-manifest_v-CnL10NRH.mjs +71 -0
- package/server/server/index.mjs +2615 -0
- package/server/server/node_modules/detect-libc/lib/detect-libc.js +313 -0
- package/server/server/node_modules/detect-libc/lib/elf.js +39 -0
- package/server/server/node_modules/detect-libc/lib/filesystem.js +51 -0
- package/server/server/node_modules/detect-libc/lib/process.js +24 -0
- package/server/server/node_modules/detect-libc/package.json +44 -0
- package/server/server/node_modules/msgpackr-extract/index.js +1 -0
- package/server/server/node_modules/msgpackr-extract/package.json +50 -0
- package/server/server/node_modules/node-gyp-build-optional-packages/index.js +6 -0
- package/server/server/node_modules/node-gyp-build-optional-packages/node-gyp-build.js +236 -0
- package/server/server/node_modules/node-gyp-build-optional-packages/package.json +32 -0
- package/server/server/node_modules/tslib/modules/index.js +70 -0
- package/server/server/node_modules/tslib/modules/package.json +3 -0
- package/server/server/node_modules/tslib/package.json +47 -0
- package/server/server/node_modules/tslib/tslib.js +484 -0
- package/server/server/package.json +12 -0
package/dist/runtime.mjs
CHANGED
|
@@ -2,27 +2,35 @@ import { execFile, spawn } from "node:child_process";
|
|
|
2
2
|
import { mkdirSync, stat, unwatchFile, watch, watchFile } from "node:fs";
|
|
3
3
|
import * as sp from "node:path";
|
|
4
4
|
import { dirname, join, relative, resolve, sep } from "node:path";
|
|
5
|
-
import * as HttpApiSchema from "@effect/platform/HttpApiSchema";
|
|
6
5
|
import * as Schema from "effect/Schema";
|
|
7
6
|
import { lstat, open, readFile, readdir, realpath, stat as stat$1 } from "node:fs/promises";
|
|
8
7
|
import { randomUUID } from "node:crypto";
|
|
8
|
+
import { ServiceMap } from "effect";
|
|
9
9
|
import * as Effect from "effect/Effect";
|
|
10
|
+
import * as Layer from "effect/Layer";
|
|
10
11
|
import * as Option from "effect/Option";
|
|
11
12
|
import { DatabaseSync } from "node:sqlite";
|
|
12
13
|
import * as Config from "effect/Config";
|
|
13
14
|
import * as Exit from "effect/Exit";
|
|
14
|
-
import * as Layer from "effect/Layer";
|
|
15
15
|
import "effect/ManagedRuntime";
|
|
16
16
|
import { platform, type } from "node:os";
|
|
17
17
|
import { EventEmitter } from "node:events";
|
|
18
18
|
import { Readable } from "node:stream";
|
|
19
19
|
import * as Queue from "effect/Queue";
|
|
20
|
-
import * as Runtime from "effect/Runtime";
|
|
21
20
|
import * as Stream from "effect/Stream";
|
|
22
21
|
//#region ../../packages/core/src/schemas/review.ts
|
|
23
22
|
const ReviewId = Schema.String.pipe(Schema.brand("ReviewId"));
|
|
24
|
-
const ReviewStatus = Schema.
|
|
25
|
-
|
|
23
|
+
const ReviewStatus = Schema.Literals([
|
|
24
|
+
"in_progress",
|
|
25
|
+
"approved",
|
|
26
|
+
"changes_requested"
|
|
27
|
+
]);
|
|
28
|
+
const ReviewSourceType = Schema.Literals([
|
|
29
|
+
"staged",
|
|
30
|
+
"branch",
|
|
31
|
+
"commits",
|
|
32
|
+
"pull_request"
|
|
33
|
+
]);
|
|
26
34
|
Schema.Struct({
|
|
27
35
|
baseRef: Schema.NullOr(Schema.String),
|
|
28
36
|
createdAt: Schema.String,
|
|
@@ -35,11 +43,11 @@ Schema.Struct({
|
|
|
35
43
|
updatedAt: Schema.String
|
|
36
44
|
});
|
|
37
45
|
Schema.Struct({
|
|
38
|
-
sourceRef: Schema.
|
|
39
|
-
sourceType: Schema.
|
|
46
|
+
sourceRef: Schema.NullOr(Schema.String).pipe(Schema.optionalKey, Schema.withDecodingDefaultKey(() => null)),
|
|
47
|
+
sourceType: ReviewSourceType.pipe(Schema.optionalKey, Schema.withDecodingDefaultKey(() => "staged"))
|
|
40
48
|
});
|
|
41
|
-
Schema.Struct({ status: Schema.
|
|
42
|
-
var ReviewNotFound = class extends Schema.
|
|
49
|
+
Schema.Struct({ status: Schema.OptionFromNullOr(ReviewStatus).pipe(Schema.optionalKey) });
|
|
50
|
+
var ReviewNotFound = class extends Schema.TaggedErrorClass()("ReviewNotFound", { id: ReviewId }) {};
|
|
43
51
|
//#endregion
|
|
44
52
|
//#region ../../packages/core/src/schemas/todo.ts
|
|
45
53
|
const TodoId = Schema.String.pipe(Schema.brand("TodoId"));
|
|
@@ -53,14 +61,14 @@ Schema.Struct({
|
|
|
53
61
|
updatedAt: Schema.String
|
|
54
62
|
});
|
|
55
63
|
Schema.Struct({
|
|
56
|
-
content: Schema.String.pipe(Schema.
|
|
57
|
-
reviewId: Schema.
|
|
64
|
+
content: Schema.String.pipe(Schema.check(Schema.isMinLength(1))),
|
|
65
|
+
reviewId: Schema.NullOr(ReviewId).pipe(Schema.optionalKey, Schema.withDecodingDefaultKey(() => null))
|
|
58
66
|
});
|
|
59
67
|
Schema.Struct({
|
|
60
|
-
completed: Schema.
|
|
61
|
-
content: Schema.
|
|
68
|
+
completed: Schema.OptionFromNullOr(Schema.Boolean).pipe(Schema.optionalKey),
|
|
69
|
+
content: Schema.OptionFromNullOr(Schema.String.pipe(Schema.check(Schema.isMinLength(1)))).pipe(Schema.optionalKey)
|
|
62
70
|
});
|
|
63
|
-
var TodoNotFound = class extends Schema.
|
|
71
|
+
var TodoNotFound = class extends Schema.TaggedErrorClass()("TodoNotFound", { id: TodoId }) {};
|
|
64
72
|
//#endregion
|
|
65
73
|
//#region ../../packages/core/src/db/migrations.ts
|
|
66
74
|
const migrations = [
|
|
@@ -127,15 +135,17 @@ const withTransaction = (db, body) => Effect.acquireUseRelease(Effect.sync(() =>
|
|
|
127
135
|
if (Exit.isSuccess(exit)) db.exec("COMMIT");
|
|
128
136
|
else db.exec("ROLLBACK");
|
|
129
137
|
}));
|
|
130
|
-
var SqliteService = class extends
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
138
|
+
var SqliteService = class SqliteService extends ServiceMap.Service()("@ringi/SqliteService") {
|
|
139
|
+
static Default = Layer.effect(SqliteService, Effect.gen(function* () {
|
|
140
|
+
const dbPath = yield* Config.string("DB_PATH").pipe(Config.withDefault(".ringi/reviews.db"));
|
|
141
|
+
mkdirSync(dirname(dbPath), { recursive: true });
|
|
142
|
+
const db = new DatabaseSync(dbPath);
|
|
143
|
+
db.exec("PRAGMA journal_mode=WAL");
|
|
144
|
+
db.exec("PRAGMA foreign_keys=ON");
|
|
145
|
+
runMigrations(db);
|
|
146
|
+
return SqliteService.of({ db });
|
|
147
|
+
}));
|
|
148
|
+
};
|
|
139
149
|
//#endregion
|
|
140
150
|
//#region ../../packages/core/src/repos/comment.repo.ts
|
|
141
151
|
const rowToComment = (row) => ({
|
|
@@ -150,9 +160,8 @@ const rowToComment = (row) => ({
|
|
|
150
160
|
suggestion: row.suggestion,
|
|
151
161
|
updatedAt: row.updated_at
|
|
152
162
|
});
|
|
153
|
-
var CommentRepo = class extends
|
|
154
|
-
|
|
155
|
-
effect: Effect.gen(function* effect() {
|
|
163
|
+
var CommentRepo = class CommentRepo extends ServiceMap.Service()("@ringi/CommentRepo") {
|
|
164
|
+
static Default = Layer.effect(CommentRepo, Effect.gen(function* () {
|
|
156
165
|
const { db } = yield* SqliteService;
|
|
157
166
|
const stmtFindById = db.prepare("SELECT * FROM comments WHERE id = ?");
|
|
158
167
|
const stmtFindByReview = db.prepare("SELECT * FROM comments WHERE review_id = ? ORDER BY created_at ASC");
|
|
@@ -225,7 +234,7 @@ var CommentRepo = class extends Effect.Service()("@ringi/CommentRepo", {
|
|
|
225
234
|
withSuggestions: row.with_suggestions
|
|
226
235
|
};
|
|
227
236
|
});
|
|
228
|
-
return {
|
|
237
|
+
return CommentRepo.of({
|
|
229
238
|
countByReview,
|
|
230
239
|
create,
|
|
231
240
|
findByFile,
|
|
@@ -235,13 +244,17 @@ var CommentRepo = class extends Effect.Service()("@ringi/CommentRepo", {
|
|
|
235
244
|
removeByReview,
|
|
236
245
|
setResolved,
|
|
237
246
|
update
|
|
238
|
-
};
|
|
239
|
-
})
|
|
240
|
-
}
|
|
247
|
+
});
|
|
248
|
+
}));
|
|
249
|
+
};
|
|
241
250
|
//#endregion
|
|
242
251
|
//#region ../../packages/core/src/schemas/comment.ts
|
|
243
252
|
const CommentId = Schema.String.pipe(Schema.brand("CommentId"));
|
|
244
|
-
const LineType = Schema.
|
|
253
|
+
const LineType = Schema.Literals([
|
|
254
|
+
"added",
|
|
255
|
+
"removed",
|
|
256
|
+
"context"
|
|
257
|
+
]);
|
|
245
258
|
Schema.Struct({
|
|
246
259
|
content: Schema.String,
|
|
247
260
|
createdAt: Schema.String,
|
|
@@ -255,84 +268,77 @@ Schema.Struct({
|
|
|
255
268
|
updatedAt: Schema.String
|
|
256
269
|
});
|
|
257
270
|
Schema.Struct({
|
|
258
|
-
content: Schema.String.pipe(Schema.
|
|
259
|
-
filePath: Schema.String.pipe(Schema.
|
|
260
|
-
lineNumber: Schema.
|
|
261
|
-
lineType: Schema.
|
|
262
|
-
suggestion: Schema.
|
|
271
|
+
content: Schema.String.pipe(Schema.check(Schema.isMinLength(1))),
|
|
272
|
+
filePath: Schema.String.pipe(Schema.check(Schema.isMinLength(1))),
|
|
273
|
+
lineNumber: Schema.NullOr(Schema.Number).pipe(Schema.optionalKey, Schema.withDecodingDefaultKey(() => null)),
|
|
274
|
+
lineType: Schema.NullOr(LineType).pipe(Schema.optionalKey, Schema.withDecodingDefaultKey(() => null)),
|
|
275
|
+
suggestion: Schema.NullOr(Schema.String).pipe(Schema.optionalKey, Schema.withDecodingDefaultKey(() => null))
|
|
263
276
|
});
|
|
264
277
|
Schema.Struct({
|
|
265
|
-
content: Schema.
|
|
266
|
-
suggestion: Schema.
|
|
278
|
+
content: Schema.OptionFromNullOr(Schema.String.pipe(Schema.check(Schema.isMinLength(1)))).pipe(Schema.optionalKey),
|
|
279
|
+
suggestion: Schema.OptionFromNullOr(Schema.NullOr(Schema.String)).pipe(Schema.optionalKey)
|
|
267
280
|
});
|
|
268
|
-
var CommentNotFound = class extends Schema.
|
|
281
|
+
var CommentNotFound = class extends Schema.TaggedErrorClass()("CommentNotFound", { id: CommentId }) {};
|
|
269
282
|
//#endregion
|
|
270
283
|
//#region ../../packages/core/src/services/comment.service.ts
|
|
271
|
-
var CommentService = class extends
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
const create =
|
|
275
|
-
const repo = yield* CommentRepo;
|
|
284
|
+
var CommentService = class CommentService extends ServiceMap.Service()("@ringi/CommentService") {
|
|
285
|
+
static Default = Layer.effect(CommentService, Effect.gen(function* () {
|
|
286
|
+
const repo = yield* CommentRepo;
|
|
287
|
+
const create = (reviewId, input) => {
|
|
276
288
|
const id = randomUUID();
|
|
277
|
-
return
|
|
289
|
+
return repo.create({
|
|
278
290
|
content: input.content,
|
|
279
291
|
filePath: input.filePath,
|
|
280
292
|
id,
|
|
281
|
-
lineNumber: input.lineNumber,
|
|
282
|
-
lineType: input.lineType,
|
|
293
|
+
lineNumber: input.lineNumber ?? null,
|
|
294
|
+
lineType: input.lineType ?? null,
|
|
283
295
|
reviewId,
|
|
284
|
-
suggestion: input.suggestion
|
|
296
|
+
suggestion: input.suggestion ?? null
|
|
285
297
|
});
|
|
286
|
-
}
|
|
287
|
-
const getById = Effect.
|
|
288
|
-
const comment = yield*
|
|
298
|
+
};
|
|
299
|
+
const getById = (id) => Effect.gen(function* () {
|
|
300
|
+
const comment = yield* repo.findById(id);
|
|
289
301
|
if (!comment) return yield* new CommentNotFound({ id });
|
|
290
302
|
return comment;
|
|
291
303
|
});
|
|
292
|
-
const getByReview =
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
const getByFile = Effect.fn("CommentService.getByFile")(function* getByFile(reviewId, filePath) {
|
|
296
|
-
return yield* (yield* CommentRepo).findByFile(reviewId, filePath);
|
|
297
|
-
});
|
|
298
|
-
const update = Effect.fn("CommentService.update")(function* update(id, input) {
|
|
299
|
-
const repo = yield* CommentRepo;
|
|
304
|
+
const getByReview = (reviewId) => repo.findByReview(reviewId);
|
|
305
|
+
const getByFile = (reviewId, filePath) => repo.findByFile(reviewId, filePath);
|
|
306
|
+
const update = (id, input) => Effect.gen(function* () {
|
|
300
307
|
const updates = {};
|
|
301
|
-
if (Option.isSome(input.content)) updates.content = input.content.value;
|
|
302
|
-
if (Option.isSome(input.suggestion)) updates.suggestion = input.suggestion.value;
|
|
308
|
+
if (input.content && Option.isSome(input.content)) updates.content = input.content.value;
|
|
309
|
+
if (input.suggestion && Option.isSome(input.suggestion)) updates.suggestion = input.suggestion.value;
|
|
303
310
|
const comment = yield* repo.update(id, updates);
|
|
304
311
|
if (!comment) return yield* new CommentNotFound({ id });
|
|
305
312
|
return comment;
|
|
306
313
|
});
|
|
307
|
-
const resolve = Effect.
|
|
308
|
-
const comment = yield*
|
|
314
|
+
const resolve = (id) => Effect.gen(function* () {
|
|
315
|
+
const comment = yield* repo.setResolved(id, true);
|
|
309
316
|
if (!comment) return yield* new CommentNotFound({ id });
|
|
310
317
|
return comment;
|
|
311
318
|
});
|
|
312
|
-
const unresolve = Effect.
|
|
313
|
-
const comment = yield*
|
|
319
|
+
const unresolve = (id) => Effect.gen(function* () {
|
|
320
|
+
const comment = yield* repo.setResolved(id, false);
|
|
314
321
|
if (!comment) return yield* new CommentNotFound({ id });
|
|
315
322
|
return comment;
|
|
316
323
|
});
|
|
317
|
-
const remove = Effect.
|
|
318
|
-
if (!(yield*
|
|
324
|
+
const remove = (id) => Effect.gen(function* () {
|
|
325
|
+
if (!(yield* repo.remove(id))) return yield* new CommentNotFound({ id });
|
|
319
326
|
return { success: true };
|
|
320
327
|
});
|
|
321
|
-
|
|
328
|
+
const getStats = (reviewId) => repo.countByReview(reviewId);
|
|
329
|
+
return CommentService.of({
|
|
322
330
|
create,
|
|
323
331
|
getByFile,
|
|
324
332
|
getById,
|
|
325
333
|
getByReview,
|
|
326
|
-
getStats
|
|
327
|
-
return yield* (yield* CommentRepo).countByReview(reviewId);
|
|
328
|
-
}),
|
|
334
|
+
getStats,
|
|
329
335
|
remove,
|
|
330
336
|
resolve,
|
|
331
337
|
unresolve,
|
|
332
338
|
update
|
|
333
|
-
};
|
|
334
|
-
})
|
|
335
|
-
}
|
|
339
|
+
});
|
|
340
|
+
}));
|
|
341
|
+
};
|
|
336
342
|
//#endregion
|
|
337
343
|
//#region ../../packages/core/src/services/diff.service.ts
|
|
338
344
|
const HUNK_HEADER = /@@ -(\d+)(?:,(\d+))? \+(\d+)(?:,(\d+))? @@/;
|
|
@@ -450,11 +456,13 @@ const getDiffSummary = (files) => {
|
|
|
450
456
|
};
|
|
451
457
|
//#endregion
|
|
452
458
|
//#region ../../packages/core/src/repos/review-file.repo.ts
|
|
453
|
-
const parseHunks = (hunksData) => hunksData == null ? Effect.succeed([]) : Effect.try(
|
|
459
|
+
const parseHunks = (hunksData) => hunksData == null ? Effect.succeed([]) : Effect.try({
|
|
460
|
+
try: () => JSON.parse(hunksData),
|
|
461
|
+
catch: () => []
|
|
462
|
+
}).pipe(Effect.orElseSucceed(() => []));
|
|
454
463
|
const serializeHunks = (hunks) => JSON.stringify(hunks);
|
|
455
|
-
var ReviewFileRepo = class extends
|
|
456
|
-
|
|
457
|
-
effect: Effect.gen(function* effect() {
|
|
464
|
+
var ReviewFileRepo = class ReviewFileRepo extends ServiceMap.Service()("@ringi/ReviewFileRepo") {
|
|
465
|
+
static Default = Layer.effect(ReviewFileRepo, Effect.gen(function* () {
|
|
458
466
|
const { db } = yield* SqliteService;
|
|
459
467
|
const stmtFindByReview = db.prepare(`SELECT id, review_id, file_path, old_path, status, additions, deletions, created_at
|
|
460
468
|
FROM review_files WHERE review_id = ? ORDER BY file_path`);
|
|
@@ -477,15 +485,15 @@ var ReviewFileRepo = class extends Effect.Service()("@ringi/ReviewFileRepo", {
|
|
|
477
485
|
const countByReview = (reviewId) => Effect.sync(() => {
|
|
478
486
|
return stmtCountByReview.get(reviewId).count;
|
|
479
487
|
});
|
|
480
|
-
return {
|
|
488
|
+
return ReviewFileRepo.of({
|
|
481
489
|
countByReview,
|
|
482
490
|
createBulk,
|
|
483
491
|
deleteByReview,
|
|
484
492
|
findByReview,
|
|
485
493
|
findByReviewAndPath
|
|
486
|
-
};
|
|
487
|
-
})
|
|
488
|
-
}
|
|
494
|
+
});
|
|
495
|
+
}));
|
|
496
|
+
};
|
|
489
497
|
//#endregion
|
|
490
498
|
//#region ../../packages/core/src/repos/review.repo.ts
|
|
491
499
|
const rowToReview = (row) => ({
|
|
@@ -499,14 +507,14 @@ const rowToReview = (row) => ({
|
|
|
499
507
|
status: row.status,
|
|
500
508
|
updatedAt: row.updated_at
|
|
501
509
|
});
|
|
502
|
-
var ReviewRepo = class extends
|
|
503
|
-
|
|
504
|
-
effect: Effect.gen(function* effect() {
|
|
510
|
+
var ReviewRepo = class ReviewRepo extends ServiceMap.Service()("@ringi/ReviewRepo") {
|
|
511
|
+
static Default = Layer.effect(ReviewRepo, Effect.gen(function* () {
|
|
505
512
|
const { db } = yield* SqliteService;
|
|
506
513
|
const stmtFindById = db.prepare("SELECT * FROM reviews WHERE id = ?");
|
|
507
514
|
const stmtInsert = db.prepare(`INSERT INTO reviews (id, repository_path, base_ref, source_type, source_ref, snapshot_data, status, created_at, updated_at)
|
|
508
515
|
VALUES (?, ?, ?, ?, ?, ?, ?, datetime('now'), datetime('now'))`);
|
|
509
516
|
const stmtUpdate = db.prepare(`UPDATE reviews SET status = COALESCE(?, status), updated_at = datetime('now') WHERE id = ?`);
|
|
517
|
+
const stmtUpdateSnapshot = db.prepare(`UPDATE reviews SET snapshot_data = ?, updated_at = datetime('now') WHERE id = ?`);
|
|
510
518
|
const stmtDelete = db.prepare("DELETE FROM reviews WHERE id = ?");
|
|
511
519
|
const stmtCountAll = db.prepare("SELECT COUNT(*) as count FROM reviews");
|
|
512
520
|
const stmtCountByStatus = db.prepare("SELECT COUNT(*) as count FROM reviews WHERE status = ?");
|
|
@@ -548,6 +556,11 @@ var ReviewRepo = class extends Effect.Service()("@ringi/ReviewRepo", {
|
|
|
548
556
|
const row = stmtFindById.get(id);
|
|
549
557
|
return row ? rowToReview(row) : null;
|
|
550
558
|
});
|
|
559
|
+
const updateSnapshotData = (id, snapshotData) => Effect.sync(() => {
|
|
560
|
+
stmtUpdateSnapshot.run(snapshotData, id);
|
|
561
|
+
const row = stmtFindById.get(id);
|
|
562
|
+
return row ? rowToReview(row) : null;
|
|
563
|
+
});
|
|
551
564
|
const remove = (id) => Effect.sync(() => {
|
|
552
565
|
const result = stmtDelete.run(id);
|
|
553
566
|
return Number(result.changes) > 0;
|
|
@@ -558,22 +571,23 @@ var ReviewRepo = class extends Effect.Service()("@ringi/ReviewRepo", {
|
|
|
558
571
|
const countByStatus = (status) => Effect.sync(() => {
|
|
559
572
|
return stmtCountByStatus.get(status).count;
|
|
560
573
|
});
|
|
561
|
-
return {
|
|
574
|
+
return ReviewRepo.of({
|
|
562
575
|
countAll,
|
|
563
576
|
countByStatus,
|
|
564
577
|
create,
|
|
565
578
|
findAll,
|
|
566
579
|
findById,
|
|
567
580
|
remove,
|
|
568
|
-
update
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
})
|
|
581
|
+
update,
|
|
582
|
+
updateSnapshotData
|
|
583
|
+
});
|
|
584
|
+
}));
|
|
585
|
+
};
|
|
572
586
|
//#endregion
|
|
573
587
|
//#region ../../packages/core/src/services/git.service.ts
|
|
574
|
-
var GitError = class extends Schema.
|
|
588
|
+
var GitError = class extends Schema.TaggedErrorClass()("GitError", { message: Schema.String }) {};
|
|
575
589
|
/** Max bytes to collect from a git command before truncating (200 MB). */
|
|
576
|
-
const MAX_STDOUT_BYTES = 200 * 1024 * 1024;
|
|
590
|
+
const MAX_STDOUT_BYTES$1 = 200 * 1024 * 1024;
|
|
577
591
|
const execGit = (args, repoPath) => Effect.tryPromise({
|
|
578
592
|
catch: (error) => new GitError({ message: String(error) }),
|
|
579
593
|
try: () => new Promise((resolve, reject) => {
|
|
@@ -584,7 +598,7 @@ const execGit = (args, repoPath) => Effect.tryPromise({
|
|
|
584
598
|
child.stdout.on("data", (chunk) => {
|
|
585
599
|
if (truncated) return;
|
|
586
600
|
bytes += chunk.length;
|
|
587
|
-
if (bytes > MAX_STDOUT_BYTES) {
|
|
601
|
+
if (bytes > MAX_STDOUT_BYTES$1) {
|
|
588
602
|
truncated = true;
|
|
589
603
|
child.kill();
|
|
590
604
|
return;
|
|
@@ -616,187 +630,189 @@ const parseNameStatus = (output) => lines(output).map((line) => {
|
|
|
616
630
|
status
|
|
617
631
|
};
|
|
618
632
|
});
|
|
619
|
-
var GitService = class extends
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
const
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
"--cached",
|
|
642
|
-
"--no-color",
|
|
643
|
-
"--unified=3"
|
|
644
|
-
], repoPath).pipe(Effect.withSpan("GitService.getStagedDiff"));
|
|
645
|
-
const getUncommittedDiff = hasCommits.pipe(Effect.flatMap((has) => has ? execGit([
|
|
646
|
-
"diff",
|
|
647
|
-
"HEAD",
|
|
648
|
-
"--no-color",
|
|
649
|
-
"--unified=3"
|
|
650
|
-
], repoPath) : Effect.succeed("")), Effect.withSpan("GitService.getUncommittedDiff"));
|
|
651
|
-
const getUnstagedDiff = execGit([
|
|
652
|
-
"diff",
|
|
653
|
-
"--no-color",
|
|
654
|
-
"--unified=3"
|
|
655
|
-
], repoPath).pipe(Effect.withSpan("GitService.getUnstagedDiff"));
|
|
656
|
-
const getLastCommitDiff = hasCommits.pipe(Effect.flatMap((has) => has ? execGit([
|
|
657
|
-
"show",
|
|
658
|
-
"HEAD",
|
|
659
|
-
"--format=",
|
|
660
|
-
"--no-color",
|
|
661
|
-
"--unified=3"
|
|
662
|
-
], repoPath) : Effect.succeed("")), Effect.withSpan("GitService.getLastCommitDiff"));
|
|
663
|
-
const getBranchDiff = Effect.fn("GitService.getBranchDiff")(function* getBranchDiff(branch) {
|
|
664
|
-
return yield* execGit([
|
|
633
|
+
var GitService = class GitService extends ServiceMap.Service()("@ringi/GitService") {
|
|
634
|
+
static Default = Layer.effect(GitService, Effect.gen(function* () {
|
|
635
|
+
const repoPath = yield* Config.string("REPOSITORY_PATH").pipe(Config.withDefault(process.cwd()));
|
|
636
|
+
const hasCommits = execGit(["rev-parse", "HEAD"], repoPath).pipe(Effect.as(true), Effect.catchTag("GitError", () => Effect.succeed(false)), Effect.withSpan("GitService.hasCommits"));
|
|
637
|
+
const getRepositoryInfo = Effect.gen(function* () {
|
|
638
|
+
const name = yield* execGit(["rev-parse", "--show-toplevel"], repoPath).pipe(Effect.map((s) => s.trim().split("/").pop() ?? "unknown"));
|
|
639
|
+
return {
|
|
640
|
+
branch: yield* execGit([
|
|
641
|
+
"rev-parse",
|
|
642
|
+
"--abbrev-ref",
|
|
643
|
+
"HEAD"
|
|
644
|
+
], repoPath).pipe(Effect.map((s) => s.trim())),
|
|
645
|
+
name,
|
|
646
|
+
path: repoPath,
|
|
647
|
+
remote: yield* execGit([
|
|
648
|
+
"config",
|
|
649
|
+
"--get",
|
|
650
|
+
"remote.origin.url"
|
|
651
|
+
], repoPath).pipe(Effect.map((s) => s.trim() || null), Effect.catchTag("GitError", () => Effect.succeed(null)))
|
|
652
|
+
};
|
|
653
|
+
}).pipe(Effect.withSpan("GitService.getRepositoryInfo"));
|
|
654
|
+
const getStagedDiff = execGit([
|
|
665
655
|
"diff",
|
|
666
|
-
|
|
656
|
+
"--cached",
|
|
667
657
|
"--no-color",
|
|
668
658
|
"--unified=3"
|
|
669
|
-
], repoPath);
|
|
670
|
-
|
|
671
|
-
|
|
672
|
-
|
|
673
|
-
"show",
|
|
674
|
-
shas[0],
|
|
675
|
-
"--format=",
|
|
659
|
+
], repoPath).pipe(Effect.withSpan("GitService.getStagedDiff"));
|
|
660
|
+
const getUncommittedDiff = hasCommits.pipe(Effect.flatMap((has) => has ? execGit([
|
|
661
|
+
"diff",
|
|
662
|
+
"HEAD",
|
|
676
663
|
"--no-color",
|
|
677
664
|
"--unified=3"
|
|
678
|
-
], repoPath);
|
|
679
|
-
const
|
|
680
|
-
const last = shas[0];
|
|
681
|
-
return yield* execGit([
|
|
665
|
+
], repoPath) : Effect.succeed("")), Effect.withSpan("GitService.getUncommittedDiff"));
|
|
666
|
+
const getUnstagedDiff = execGit([
|
|
682
667
|
"diff",
|
|
683
|
-
`${first}~1..${last}`,
|
|
684
668
|
"--no-color",
|
|
685
669
|
"--unified=3"
|
|
686
|
-
], repoPath);
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
"diff",
|
|
690
|
-
"--cached",
|
|
691
|
-
"--name-status"
|
|
692
|
-
], repoPath).pipe(Effect.map(parseNameStatus), Effect.withSpan("GitService.getStagedFiles"));
|
|
693
|
-
const getUncommittedFiles = hasCommits.pipe(Effect.flatMap((has) => has ? execGit([
|
|
694
|
-
"diff",
|
|
695
|
-
"HEAD",
|
|
696
|
-
"--name-status"
|
|
697
|
-
], repoPath).pipe(Effect.map(parseNameStatus)) : Effect.succeed([])), Effect.withSpan("GitService.getUncommittedFiles"));
|
|
698
|
-
const getUnstagedFiles = execGit(["diff", "--name-status"], repoPath).pipe(Effect.map(parseNameStatus), Effect.withSpan("GitService.getUnstagedFiles"));
|
|
699
|
-
const getLastCommitFiles = hasCommits.pipe(Effect.flatMap((has) => has ? execGit([
|
|
700
|
-
"show",
|
|
701
|
-
"HEAD",
|
|
702
|
-
"--format=",
|
|
703
|
-
"--name-status"
|
|
704
|
-
], repoPath).pipe(Effect.map(parseNameStatus)) : Effect.succeed([])), Effect.withSpan("GitService.getLastCommitFiles"));
|
|
705
|
-
const getFileContent = Effect.fn("GitService.getFileContent")(function* getFileContent(filePath, version) {
|
|
706
|
-
switch (version) {
|
|
707
|
-
case "staged": return yield* execGit(["show", `:${filePath}`], repoPath);
|
|
708
|
-
case "head": return yield* execGit(["show", `HEAD:${filePath}`], repoPath);
|
|
709
|
-
default: return yield* Effect.tryPromise({
|
|
710
|
-
catch: (error) => new GitError({ message: `Failed to read ${filePath}: ${String(error)}` }),
|
|
711
|
-
try: () => readFile(join(repoPath, filePath), "utf8")
|
|
712
|
-
});
|
|
713
|
-
}
|
|
714
|
-
});
|
|
715
|
-
const getFileTree = Effect.fn("GitService.getFileTree")(function* getFileTree(ref) {
|
|
716
|
-
return yield* execGit([
|
|
717
|
-
"ls-tree",
|
|
718
|
-
"-r",
|
|
719
|
-
"--name-only",
|
|
720
|
-
ref
|
|
721
|
-
], repoPath).pipe(Effect.map(lines));
|
|
722
|
-
});
|
|
723
|
-
const getBranches = execGit(["branch", "--format=%(refname:short) %(HEAD)"], repoPath).pipe(Effect.map((output) => lines(output).map((line) => {
|
|
724
|
-
const [name, head] = line.split(" ");
|
|
725
|
-
return {
|
|
726
|
-
current: head === "*",
|
|
727
|
-
name
|
|
728
|
-
};
|
|
729
|
-
})), Effect.withSpan("GitService.getBranches"));
|
|
730
|
-
const getCommits = Effect.fn("GitService.getCommits")(function* getCommits(opts) {
|
|
731
|
-
const limit = (opts.limit ?? 20) + 1;
|
|
732
|
-
const args = [
|
|
733
|
-
"log",
|
|
734
|
-
`--max-count=${limit}`,
|
|
735
|
-
`--skip=${opts.offset ?? 0}`,
|
|
736
|
-
"--format=%H %s %an %aI"
|
|
737
|
-
];
|
|
738
|
-
if (opts.search) args.push(`--grep=${opts.search}`, "-i");
|
|
739
|
-
const rows = lines(yield* execGit(args, repoPath));
|
|
740
|
-
const hasMore = rows.length === limit;
|
|
741
|
-
return {
|
|
742
|
-
commits: (hasMore ? rows.slice(0, -1) : rows).map((line) => {
|
|
743
|
-
const [hash, message, author, date] = line.split(" ");
|
|
744
|
-
return {
|
|
745
|
-
author,
|
|
746
|
-
date,
|
|
747
|
-
hash,
|
|
748
|
-
message
|
|
749
|
-
};
|
|
750
|
-
}),
|
|
751
|
-
hasMore
|
|
752
|
-
};
|
|
753
|
-
});
|
|
754
|
-
const stageFiles = Effect.fn("GitService.stageFiles")(function* stageFiles(files) {
|
|
755
|
-
return yield* execGit([
|
|
756
|
-
"add",
|
|
757
|
-
"--",
|
|
758
|
-
...files
|
|
759
|
-
], repoPath).pipe(Effect.as(files));
|
|
760
|
-
});
|
|
761
|
-
const stageAll = execGit(["add", "-A"], repoPath).pipe(Effect.flatMap(() => getStagedFiles), Effect.map((files) => files.map((f) => f.path)), Effect.withSpan("GitService.stageAll"));
|
|
762
|
-
const unstageFiles = Effect.fn("GitService.unstageFiles")(function* unstageFiles(files) {
|
|
763
|
-
return yield* execGit([
|
|
764
|
-
"reset",
|
|
670
|
+
], repoPath).pipe(Effect.withSpan("GitService.getUnstagedDiff"));
|
|
671
|
+
const getLastCommitDiff = hasCommits.pipe(Effect.flatMap((has) => has ? execGit([
|
|
672
|
+
"show",
|
|
765
673
|
"HEAD",
|
|
766
|
-
"--",
|
|
767
|
-
|
|
768
|
-
|
|
769
|
-
|
|
770
|
-
|
|
771
|
-
|
|
772
|
-
|
|
773
|
-
|
|
774
|
-
|
|
775
|
-
|
|
776
|
-
|
|
777
|
-
|
|
778
|
-
|
|
779
|
-
|
|
780
|
-
|
|
781
|
-
|
|
782
|
-
|
|
783
|
-
|
|
784
|
-
|
|
785
|
-
|
|
786
|
-
|
|
787
|
-
|
|
788
|
-
|
|
789
|
-
|
|
790
|
-
|
|
791
|
-
|
|
792
|
-
|
|
674
|
+
"--format=",
|
|
675
|
+
"--no-color",
|
|
676
|
+
"--unified=3"
|
|
677
|
+
], repoPath) : Effect.succeed("")), Effect.withSpan("GitService.getLastCommitDiff"));
|
|
678
|
+
const getBranchDiff = Effect.fn("GitService.getBranchDiff")(function* (branch) {
|
|
679
|
+
return yield* execGit([
|
|
680
|
+
"diff",
|
|
681
|
+
`${branch}...HEAD`,
|
|
682
|
+
"--no-color",
|
|
683
|
+
"--unified=3"
|
|
684
|
+
], repoPath);
|
|
685
|
+
});
|
|
686
|
+
const getCommitDiff = Effect.fn("GitService.getCommitDiff")(function* (shas) {
|
|
687
|
+
if (shas.length === 1) return yield* execGit([
|
|
688
|
+
"show",
|
|
689
|
+
shas[0],
|
|
690
|
+
"--format=",
|
|
691
|
+
"--no-color",
|
|
692
|
+
"--unified=3"
|
|
693
|
+
], repoPath);
|
|
694
|
+
const first = shas.at(-1);
|
|
695
|
+
const last = shas[0];
|
|
696
|
+
return yield* execGit([
|
|
697
|
+
"diff",
|
|
698
|
+
`${first}~1..${last}`,
|
|
699
|
+
"--no-color",
|
|
700
|
+
"--unified=3"
|
|
701
|
+
], repoPath);
|
|
702
|
+
});
|
|
703
|
+
const getStagedFiles = execGit([
|
|
704
|
+
"diff",
|
|
705
|
+
"--cached",
|
|
706
|
+
"--name-status"
|
|
707
|
+
], repoPath).pipe(Effect.map(parseNameStatus), Effect.withSpan("GitService.getStagedFiles"));
|
|
708
|
+
const getUncommittedFiles = hasCommits.pipe(Effect.flatMap((has) => has ? execGit([
|
|
709
|
+
"diff",
|
|
710
|
+
"HEAD",
|
|
711
|
+
"--name-status"
|
|
712
|
+
], repoPath).pipe(Effect.map(parseNameStatus)) : Effect.succeed([])), Effect.withSpan("GitService.getUncommittedFiles"));
|
|
713
|
+
const getUnstagedFiles = execGit(["diff", "--name-status"], repoPath).pipe(Effect.map(parseNameStatus), Effect.withSpan("GitService.getUnstagedFiles"));
|
|
714
|
+
const getLastCommitFiles = hasCommits.pipe(Effect.flatMap((has) => has ? execGit([
|
|
715
|
+
"show",
|
|
716
|
+
"HEAD",
|
|
717
|
+
"--format=",
|
|
718
|
+
"--name-status"
|
|
719
|
+
], repoPath).pipe(Effect.map(parseNameStatus)) : Effect.succeed([])), Effect.withSpan("GitService.getLastCommitFiles"));
|
|
720
|
+
const getFileContent = Effect.fn("GitService.getFileContent")(function* (filePath, version) {
|
|
721
|
+
switch (version) {
|
|
722
|
+
case "staged": return yield* execGit(["show", `:${filePath}`], repoPath);
|
|
723
|
+
case "head": return yield* execGit(["show", `HEAD:${filePath}`], repoPath);
|
|
724
|
+
default: return yield* Effect.tryPromise({
|
|
725
|
+
catch: (error) => new GitError({ message: `Failed to read ${filePath}: ${String(error)}` }),
|
|
726
|
+
try: () => readFile(join(repoPath, filePath), "utf8")
|
|
727
|
+
});
|
|
728
|
+
}
|
|
729
|
+
});
|
|
730
|
+
const getFileTree = Effect.fn("GitService.getFileTree")(function* (ref) {
|
|
731
|
+
return yield* execGit([
|
|
732
|
+
"ls-tree",
|
|
733
|
+
"-r",
|
|
734
|
+
"--name-only",
|
|
735
|
+
ref
|
|
736
|
+
], repoPath).pipe(Effect.map(lines));
|
|
737
|
+
});
|
|
738
|
+
const getBranches = execGit(["branch", "--format=%(refname:short) %(HEAD)"], repoPath).pipe(Effect.map((output) => lines(output).map((line) => {
|
|
739
|
+
const [name, head] = line.split(" ");
|
|
740
|
+
return {
|
|
741
|
+
current: head === "*",
|
|
742
|
+
name
|
|
743
|
+
};
|
|
744
|
+
})), Effect.withSpan("GitService.getBranches"));
|
|
745
|
+
const getCommits = Effect.fn("GitService.getCommits")(function* (opts) {
|
|
746
|
+
const limit = (opts.limit ?? 20) + 1;
|
|
747
|
+
const args = [
|
|
748
|
+
"log",
|
|
749
|
+
`--max-count=${limit}`,
|
|
750
|
+
`--skip=${opts.offset ?? 0}`,
|
|
751
|
+
"--format=%H %s %an %aI"
|
|
752
|
+
];
|
|
753
|
+
if (opts.search) args.push(`--grep=${opts.search}`, "-i");
|
|
754
|
+
const rows = lines(yield* execGit(args, repoPath));
|
|
755
|
+
const hasMore = rows.length === limit;
|
|
756
|
+
return {
|
|
757
|
+
commits: (hasMore ? rows.slice(0, -1) : rows).map((line) => {
|
|
758
|
+
const [hash, message, author, date] = line.split(" ");
|
|
759
|
+
return {
|
|
760
|
+
author,
|
|
761
|
+
date,
|
|
762
|
+
hash,
|
|
763
|
+
message
|
|
764
|
+
};
|
|
765
|
+
}),
|
|
766
|
+
hasMore
|
|
767
|
+
};
|
|
768
|
+
});
|
|
769
|
+
const stageFiles = Effect.fn("GitService.stageFiles")(function* (files) {
|
|
770
|
+
return yield* execGit([
|
|
771
|
+
"add",
|
|
772
|
+
"--",
|
|
773
|
+
...files
|
|
774
|
+
], repoPath).pipe(Effect.as(files));
|
|
775
|
+
});
|
|
776
|
+
const stageAll = execGit(["add", "-A"], repoPath).pipe(Effect.flatMap(() => getStagedFiles), Effect.map((files) => files.map((f) => f.path)), Effect.withSpan("GitService.stageAll"));
|
|
777
|
+
const unstageFiles = Effect.fn("GitService.unstageFiles")(function* (files) {
|
|
778
|
+
return yield* execGit([
|
|
779
|
+
"reset",
|
|
780
|
+
"HEAD",
|
|
781
|
+
"--",
|
|
782
|
+
...files
|
|
783
|
+
], repoPath).pipe(Effect.as(files));
|
|
784
|
+
});
|
|
785
|
+
const getRepositoryPath = execGit(["rev-parse", "--show-toplevel"], repoPath).pipe(Effect.map((s) => s.trim()), Effect.withSpan("GitService.getRepositoryPath"));
|
|
786
|
+
return GitService.of({
|
|
787
|
+
getBranchDiff,
|
|
788
|
+
getBranches,
|
|
789
|
+
getCommitDiff,
|
|
790
|
+
getCommits,
|
|
791
|
+
getFileContent,
|
|
792
|
+
getFileTree,
|
|
793
|
+
getLastCommitDiff,
|
|
794
|
+
getLastCommitFiles,
|
|
795
|
+
getRepositoryInfo,
|
|
796
|
+
getRepositoryPath,
|
|
797
|
+
getStagedDiff,
|
|
798
|
+
getStagedFiles,
|
|
799
|
+
getUncommittedDiff,
|
|
800
|
+
getUncommittedFiles,
|
|
801
|
+
getUnstagedDiff,
|
|
802
|
+
getUnstagedFiles,
|
|
803
|
+
hasCommits,
|
|
804
|
+
stageAll,
|
|
805
|
+
stageFiles,
|
|
806
|
+
unstageFiles
|
|
807
|
+
});
|
|
808
|
+
}));
|
|
809
|
+
};
|
|
793
810
|
//#endregion
|
|
794
811
|
//#region ../../packages/core/src/services/review.service.ts
|
|
795
|
-
var ReviewError = class extends Schema.
|
|
812
|
+
var ReviewError = class extends Schema.TaggedErrorClass()("ReviewError", {
|
|
796
813
|
code: Schema.String,
|
|
797
814
|
message: Schema.String
|
|
798
|
-
}
|
|
799
|
-
/** Get HEAD SHA via git rev-parse. */
|
|
815
|
+
}) {};
|
|
800
816
|
const getHeadSha = (repoPath) => Effect.tryPromise({
|
|
801
817
|
catch: () => new ReviewError({
|
|
802
818
|
code: "GIT_ERROR",
|
|
@@ -809,23 +825,16 @@ const getHeadSha = (repoPath) => Effect.tryPromise({
|
|
|
809
825
|
});
|
|
810
826
|
})
|
|
811
827
|
});
|
|
812
|
-
|
|
813
|
-
|
|
814
|
-
|
|
815
|
-
|
|
816
|
-
|
|
817
|
-
|
|
818
|
-
|
|
819
|
-
|
|
820
|
-
|
|
821
|
-
|
|
822
|
-
GitService.Default
|
|
823
|
-
],
|
|
824
|
-
effect: Effect.sync(() => {
|
|
825
|
-
const create = Effect.fn("ReviewService.create")(function* create(input) {
|
|
826
|
-
const git = yield* GitService;
|
|
827
|
-
const repo = yield* ReviewRepo;
|
|
828
|
-
const fileRepo = yield* ReviewFileRepo;
|
|
828
|
+
const parseSnapshotData = (s) => Effect.try({
|
|
829
|
+
try: () => JSON.parse(s),
|
|
830
|
+
catch: () => ({})
|
|
831
|
+
}).pipe(Effect.orElseSucceed(() => ({})));
|
|
832
|
+
var ReviewService = class ReviewService extends ServiceMap.Service()("@ringi/ReviewService") {
|
|
833
|
+
static Default = Layer.effect(ReviewService, Effect.gen(function* () {
|
|
834
|
+
const git = yield* GitService;
|
|
835
|
+
const repo = yield* ReviewRepo;
|
|
836
|
+
const fileRepo = yield* ReviewFileRepo;
|
|
837
|
+
const create = (input) => Effect.gen(function* () {
|
|
829
838
|
const repoPath = yield* git.getRepositoryPath;
|
|
830
839
|
if (!(yield* git.hasCommits)) return yield* new ReviewError({
|
|
831
840
|
code: "NO_COMMITS",
|
|
@@ -903,9 +912,7 @@ var ReviewService = class extends Effect.Service()("@ringi/ReviewService", {
|
|
|
903
912
|
yield* fileRepo.createBulk(fileInputs);
|
|
904
913
|
return review;
|
|
905
914
|
});
|
|
906
|
-
const list = Effect.
|
|
907
|
-
const repo = yield* ReviewRepo;
|
|
908
|
-
const fileRepo = yield* ReviewFileRepo;
|
|
915
|
+
const list = (opts) => Effect.gen(function* () {
|
|
909
916
|
const page = opts.page ?? 1;
|
|
910
917
|
const pageSize = opts.pageSize ?? 20;
|
|
911
918
|
const result = yield* repo.findAll({
|
|
@@ -933,9 +940,7 @@ var ReviewService = class extends Effect.Service()("@ringi/ReviewService", {
|
|
|
933
940
|
total: result.total
|
|
934
941
|
};
|
|
935
942
|
});
|
|
936
|
-
const getById = Effect.
|
|
937
|
-
const repo = yield* ReviewRepo;
|
|
938
|
-
const fileRepo = yield* ReviewFileRepo;
|
|
943
|
+
const getById = (id) => Effect.gen(function* () {
|
|
939
944
|
const review = yield* repo.findById(id);
|
|
940
945
|
if (!review) return yield* new ReviewNotFound({ id });
|
|
941
946
|
const files = (yield* fileRepo.findByReview(id)).map((r) => ({
|
|
@@ -962,10 +967,7 @@ var ReviewService = class extends Effect.Service()("@ringi/ReviewService", {
|
|
|
962
967
|
summary
|
|
963
968
|
};
|
|
964
969
|
});
|
|
965
|
-
const getFileHunks = Effect.
|
|
966
|
-
const repo = yield* ReviewRepo;
|
|
967
|
-
const fileRepo = yield* ReviewFileRepo;
|
|
968
|
-
const git = yield* GitService;
|
|
970
|
+
const getFileHunks = (reviewId, filePath) => Effect.gen(function* () {
|
|
969
971
|
const review = yield* repo.findById(reviewId);
|
|
970
972
|
if (!review) return yield* new ReviewNotFound({ id: reviewId });
|
|
971
973
|
const fileRecord = yield* fileRepo.findByReviewAndPath(reviewId, filePath);
|
|
@@ -979,43 +981,40 @@ var ReviewService = class extends Effect.Service()("@ringi/ReviewService", {
|
|
|
979
981
|
if (snapshot.files) return snapshot.files.find((f) => f.newPath === filePath)?.hunks ?? [];
|
|
980
982
|
return [];
|
|
981
983
|
});
|
|
982
|
-
const update = Effect.
|
|
983
|
-
const repo = yield* ReviewRepo;
|
|
984
|
+
const update = (id, input) => Effect.gen(function* () {
|
|
984
985
|
if (!(yield* repo.findById(id))) return yield* new ReviewNotFound({ id });
|
|
985
|
-
const status = Option.getOrNull(input.status);
|
|
986
|
+
const status = input.status ? Option.getOrNull(input.status) : null;
|
|
986
987
|
const review = yield* repo.update(id, status);
|
|
987
988
|
if (!review) return yield* new ReviewNotFound({ id });
|
|
988
989
|
return review;
|
|
989
990
|
});
|
|
990
|
-
const remove = Effect.
|
|
991
|
-
const repo = yield* ReviewRepo;
|
|
992
|
-
const fileRepo = yield* ReviewFileRepo;
|
|
991
|
+
const remove = (id) => Effect.gen(function* () {
|
|
993
992
|
if (!(yield* repo.findById(id))) return yield* new ReviewNotFound({ id });
|
|
994
993
|
yield* fileRepo.deleteByReview(id);
|
|
995
994
|
yield* repo.remove(id);
|
|
996
995
|
return { success: true };
|
|
997
996
|
});
|
|
998
|
-
|
|
997
|
+
const getStats = () => Effect.gen(function* () {
|
|
998
|
+
const total = yield* repo.countAll();
|
|
999
|
+
const inProgress = yield* repo.countByStatus("in_progress");
|
|
1000
|
+
return {
|
|
1001
|
+
approved: yield* repo.countByStatus("approved"),
|
|
1002
|
+
changesRequested: yield* repo.countByStatus("changes_requested"),
|
|
1003
|
+
inProgress,
|
|
1004
|
+
total
|
|
1005
|
+
};
|
|
1006
|
+
});
|
|
1007
|
+
return ReviewService.of({
|
|
999
1008
|
create,
|
|
1000
1009
|
getById,
|
|
1001
1010
|
getFileHunks,
|
|
1002
|
-
getStats
|
|
1003
|
-
const repo = yield* ReviewRepo;
|
|
1004
|
-
const total = yield* repo.countAll();
|
|
1005
|
-
const inProgress = yield* repo.countByStatus("in_progress");
|
|
1006
|
-
return {
|
|
1007
|
-
approved: yield* repo.countByStatus("approved"),
|
|
1008
|
-
changesRequested: yield* repo.countByStatus("changes_requested"),
|
|
1009
|
-
inProgress,
|
|
1010
|
-
total
|
|
1011
|
-
};
|
|
1012
|
-
}),
|
|
1011
|
+
getStats,
|
|
1013
1012
|
list,
|
|
1014
1013
|
remove,
|
|
1015
1014
|
update
|
|
1016
|
-
};
|
|
1017
|
-
})
|
|
1018
|
-
}
|
|
1015
|
+
});
|
|
1016
|
+
}));
|
|
1017
|
+
};
|
|
1019
1018
|
//#endregion
|
|
1020
1019
|
//#region ../../packages/core/src/repos/todo.repo.ts
|
|
1021
1020
|
const rowToTodo = (row) => ({
|
|
@@ -1027,9 +1026,8 @@ const rowToTodo = (row) => ({
|
|
|
1027
1026
|
reviewId: row.review_id,
|
|
1028
1027
|
updatedAt: row.updated_at
|
|
1029
1028
|
});
|
|
1030
|
-
var TodoRepo = class extends
|
|
1031
|
-
|
|
1032
|
-
effect: Effect.gen(function* effect() {
|
|
1029
|
+
var TodoRepo = class TodoRepo extends ServiceMap.Service()("@ringi/TodoRepo") {
|
|
1030
|
+
static Default = Layer.effect(TodoRepo, Effect.gen(function* () {
|
|
1033
1031
|
const { db } = yield* SqliteService;
|
|
1034
1032
|
const stmtFindById = db.prepare("SELECT * FROM todos WHERE id = ?");
|
|
1035
1033
|
const stmtInsert = db.prepare(`INSERT INTO todos (id, content, completed, review_id, position, created_at, updated_at)
|
|
@@ -1118,7 +1116,7 @@ var TodoRepo = class extends Effect.Service()("@ringi/TodoRepo", {
|
|
|
1118
1116
|
}
|
|
1119
1117
|
return updated;
|
|
1120
1118
|
}));
|
|
1121
|
-
const move = (id, newPosition) => Effect.gen(function*
|
|
1119
|
+
const move = (id, newPosition) => Effect.gen(function* () {
|
|
1122
1120
|
const row = stmtFindById.get(id);
|
|
1123
1121
|
if (!row) return null;
|
|
1124
1122
|
const oldPosition = row.position;
|
|
@@ -1138,7 +1136,7 @@ var TodoRepo = class extends Effect.Service()("@ringi/TodoRepo", {
|
|
|
1138
1136
|
const countPending = () => Effect.sync(() => {
|
|
1139
1137
|
return stmtCountPending.get().count;
|
|
1140
1138
|
});
|
|
1141
|
-
return {
|
|
1139
|
+
return TodoRepo.of({
|
|
1142
1140
|
countAll,
|
|
1143
1141
|
countCompleted,
|
|
1144
1142
|
countPending,
|
|
@@ -1151,30 +1149,29 @@ var TodoRepo = class extends Effect.Service()("@ringi/TodoRepo", {
|
|
|
1151
1149
|
reorder,
|
|
1152
1150
|
toggle,
|
|
1153
1151
|
update
|
|
1154
|
-
};
|
|
1155
|
-
})
|
|
1156
|
-
}
|
|
1152
|
+
});
|
|
1153
|
+
}));
|
|
1154
|
+
};
|
|
1157
1155
|
//#endregion
|
|
1158
1156
|
//#region ../../packages/core/src/services/todo.service.ts
|
|
1159
|
-
var TodoService = class extends
|
|
1160
|
-
|
|
1161
|
-
|
|
1162
|
-
const create =
|
|
1163
|
-
const repo = yield* TodoRepo;
|
|
1157
|
+
var TodoService = class TodoService extends ServiceMap.Service()("@ringi/TodoService") {
|
|
1158
|
+
static Default = Layer.effect(TodoService, Effect.gen(function* () {
|
|
1159
|
+
const repo = yield* TodoRepo;
|
|
1160
|
+
const create = (input) => {
|
|
1164
1161
|
const id = randomUUID();
|
|
1165
|
-
return
|
|
1162
|
+
return repo.create({
|
|
1166
1163
|
content: input.content,
|
|
1167
1164
|
id,
|
|
1168
|
-
reviewId: input.reviewId
|
|
1165
|
+
reviewId: input.reviewId ?? null
|
|
1169
1166
|
});
|
|
1170
|
-
}
|
|
1171
|
-
const getById = Effect.
|
|
1172
|
-
const todo = yield*
|
|
1167
|
+
};
|
|
1168
|
+
const getById = (id) => Effect.gen(function* () {
|
|
1169
|
+
const todo = yield* repo.findById(id);
|
|
1173
1170
|
if (!todo) return yield* new TodoNotFound({ id });
|
|
1174
1171
|
return todo;
|
|
1175
1172
|
});
|
|
1176
|
-
const list =
|
|
1177
|
-
const result = yield*
|
|
1173
|
+
const list = (opts = {}) => Effect.gen(function* () {
|
|
1174
|
+
const result = yield* repo.findAll(opts);
|
|
1178
1175
|
return {
|
|
1179
1176
|
data: result.data,
|
|
1180
1177
|
limit: opts.limit ?? null,
|
|
@@ -1182,50 +1179,48 @@ var TodoService = class extends Effect.Service()("@ringi/TodoService", {
|
|
|
1182
1179
|
total: result.total
|
|
1183
1180
|
};
|
|
1184
1181
|
});
|
|
1185
|
-
const update = Effect.
|
|
1186
|
-
const repo = yield* TodoRepo;
|
|
1182
|
+
const update = (id, input) => Effect.gen(function* () {
|
|
1187
1183
|
if (!(yield* repo.findById(id))) return yield* new TodoNotFound({ id });
|
|
1188
1184
|
const updates = {};
|
|
1189
|
-
if (Option.isSome(input.content)) updates.content = input.content.value;
|
|
1190
|
-
if (Option.isSome(input.completed)) updates.completed = input.completed.value;
|
|
1185
|
+
if (input.content && Option.isSome(input.content)) updates.content = input.content.value;
|
|
1186
|
+
if (input.completed && Option.isSome(input.completed)) updates.completed = input.completed.value;
|
|
1191
1187
|
const todo = yield* repo.update(id, updates);
|
|
1192
1188
|
if (!todo) return yield* new TodoNotFound({ id });
|
|
1193
1189
|
return todo;
|
|
1194
1190
|
});
|
|
1195
|
-
const toggle = Effect.
|
|
1196
|
-
const todo = yield*
|
|
1191
|
+
const toggle = (id) => Effect.gen(function* () {
|
|
1192
|
+
const todo = yield* repo.toggle(id);
|
|
1197
1193
|
if (!todo) return yield* new TodoNotFound({ id });
|
|
1198
1194
|
return todo;
|
|
1199
1195
|
});
|
|
1200
|
-
const remove = Effect.
|
|
1201
|
-
const repo = yield* TodoRepo;
|
|
1196
|
+
const remove = (id) => Effect.gen(function* () {
|
|
1202
1197
|
if (!(yield* repo.findById(id))) return yield* new TodoNotFound({ id });
|
|
1203
1198
|
yield* repo.remove(id);
|
|
1204
1199
|
return { success: true };
|
|
1205
1200
|
});
|
|
1206
|
-
const removeCompleted = Effect.
|
|
1207
|
-
return { deleted: yield*
|
|
1201
|
+
const removeCompleted = () => Effect.gen(function* () {
|
|
1202
|
+
return { deleted: yield* repo.removeCompleted() };
|
|
1208
1203
|
});
|
|
1209
|
-
const reorder = Effect.
|
|
1210
|
-
return { updated: yield*
|
|
1204
|
+
const reorder = (orderedIds) => Effect.gen(function* () {
|
|
1205
|
+
return { updated: yield* repo.reorder(orderedIds) };
|
|
1211
1206
|
});
|
|
1212
|
-
const move = Effect.
|
|
1213
|
-
const todo = yield*
|
|
1207
|
+
const move = (id, position) => Effect.gen(function* () {
|
|
1208
|
+
const todo = yield* repo.move(id, position);
|
|
1214
1209
|
if (!todo) return yield* new TodoNotFound({ id });
|
|
1215
1210
|
return todo;
|
|
1216
1211
|
});
|
|
1217
|
-
|
|
1212
|
+
const getStats = () => Effect.gen(function* () {
|
|
1213
|
+
const total = yield* repo.countAll();
|
|
1214
|
+
return {
|
|
1215
|
+
completed: yield* repo.countCompleted(),
|
|
1216
|
+
pending: yield* repo.countPending(),
|
|
1217
|
+
total
|
|
1218
|
+
};
|
|
1219
|
+
});
|
|
1220
|
+
return TodoService.of({
|
|
1218
1221
|
create,
|
|
1219
1222
|
getById,
|
|
1220
|
-
getStats
|
|
1221
|
-
const repo = yield* TodoRepo;
|
|
1222
|
-
const total = yield* repo.countAll();
|
|
1223
|
-
return {
|
|
1224
|
-
completed: yield* repo.countCompleted(),
|
|
1225
|
-
pending: yield* repo.countPending(),
|
|
1226
|
-
total
|
|
1227
|
-
};
|
|
1228
|
-
}),
|
|
1223
|
+
getStats,
|
|
1229
1224
|
list,
|
|
1230
1225
|
move,
|
|
1231
1226
|
remove,
|
|
@@ -1233,22 +1228,17 @@ var TodoService = class extends Effect.Service()("@ringi/TodoService", {
|
|
|
1233
1228
|
reorder,
|
|
1234
1229
|
toggle,
|
|
1235
1230
|
update
|
|
1236
|
-
};
|
|
1237
|
-
})
|
|
1238
|
-
}
|
|
1231
|
+
});
|
|
1232
|
+
}));
|
|
1233
|
+
};
|
|
1239
1234
|
//#endregion
|
|
1240
1235
|
//#region ../../packages/core/src/services/export.service.ts
|
|
1241
|
-
var ExportService = class extends
|
|
1242
|
-
|
|
1243
|
-
ReviewService
|
|
1244
|
-
CommentService
|
|
1245
|
-
TodoService
|
|
1246
|
-
|
|
1247
|
-
effect: Effect.sync(() => {
|
|
1248
|
-
return { exportReview: Effect.fn("ExportService.exportReview")(function* exportReview(reviewId) {
|
|
1249
|
-
const reviewSvc = yield* ReviewService;
|
|
1250
|
-
const commentSvc = yield* CommentService;
|
|
1251
|
-
const todoSvc = yield* TodoService;
|
|
1236
|
+
var ExportService = class ExportService extends ServiceMap.Service()("@ringi/ExportService") {
|
|
1237
|
+
static Default = Layer.effect(ExportService, Effect.gen(function* () {
|
|
1238
|
+
const reviewSvc = yield* ReviewService;
|
|
1239
|
+
const commentSvc = yield* CommentService;
|
|
1240
|
+
const todoSvc = yield* TodoService;
|
|
1241
|
+
const exportReview = (reviewId) => Effect.gen(function* () {
|
|
1252
1242
|
const review = yield* reviewSvc.getById(reviewId);
|
|
1253
1243
|
const repo = review.repository;
|
|
1254
1244
|
const repoName = repo?.name ?? "Unknown";
|
|
@@ -1313,9 +1303,154 @@ var ExportService = class extends Effect.Service()("@ringi/ExportService", {
|
|
|
1313
1303
|
}
|
|
1314
1304
|
lines.push("");
|
|
1315
1305
|
return lines.join("\n");
|
|
1316
|
-
})
|
|
1317
|
-
|
|
1306
|
+
});
|
|
1307
|
+
return ExportService.of({ exportReview });
|
|
1308
|
+
}));
|
|
1309
|
+
};
|
|
1310
|
+
//#endregion
|
|
1311
|
+
//#region ../../packages/core/src/services/gh.service.ts
|
|
1312
|
+
var GhNotInstalled = class extends Schema.TaggedErrorClass()("GhNotInstalled", { message: Schema.String }) {};
|
|
1313
|
+
var GhAuthError = class extends Schema.TaggedErrorClass()("GhAuthError", {
|
|
1314
|
+
host: Schema.String,
|
|
1315
|
+
message: Schema.String
|
|
1316
|
+
}) {};
|
|
1317
|
+
var GhApiError = class extends Schema.TaggedErrorClass()("GhApiError", {
|
|
1318
|
+
message: Schema.String,
|
|
1319
|
+
statusCode: Schema.NullOr(Schema.Number)
|
|
1318
1320
|
}) {};
|
|
1321
|
+
/** Max bytes to collect from gh output (50 MB — PR diffs can be large). */
|
|
1322
|
+
const MAX_STDOUT_BYTES = 50 * 1024 * 1024;
|
|
1323
|
+
const execGh = (args) => Effect.tryPromise({
|
|
1324
|
+
catch: (error) => new GhApiError({
|
|
1325
|
+
message: String(error),
|
|
1326
|
+
statusCode: null
|
|
1327
|
+
}),
|
|
1328
|
+
try: () => new Promise((resolve, reject) => {
|
|
1329
|
+
const child = spawn("gh", [...args], { stdio: [
|
|
1330
|
+
"ignore",
|
|
1331
|
+
"pipe",
|
|
1332
|
+
"pipe"
|
|
1333
|
+
] });
|
|
1334
|
+
const chunks = [];
|
|
1335
|
+
let bytes = 0;
|
|
1336
|
+
let truncated = false;
|
|
1337
|
+
child.stdout.on("data", (chunk) => {
|
|
1338
|
+
if (truncated) return;
|
|
1339
|
+
bytes += chunk.length;
|
|
1340
|
+
if (bytes > MAX_STDOUT_BYTES) {
|
|
1341
|
+
truncated = true;
|
|
1342
|
+
child.kill();
|
|
1343
|
+
return;
|
|
1344
|
+
}
|
|
1345
|
+
chunks.push(chunk);
|
|
1346
|
+
});
|
|
1347
|
+
let stderr = "";
|
|
1348
|
+
child.stderr.on("data", (chunk) => {
|
|
1349
|
+
stderr += chunk.toString();
|
|
1350
|
+
});
|
|
1351
|
+
child.on("error", (err) => {
|
|
1352
|
+
reject(/* @__PURE__ */ new Error(`Failed to spawn gh: ${err.message}`));
|
|
1353
|
+
});
|
|
1354
|
+
child.on("close", (code) => {
|
|
1355
|
+
if (truncated) {
|
|
1356
|
+
resolve(Buffer.concat(chunks).toString("utf8"));
|
|
1357
|
+
return;
|
|
1358
|
+
}
|
|
1359
|
+
if (code !== 0) reject(/* @__PURE__ */ new Error(`gh ${args[0]} exited with code ${code}: ${stderr}`));
|
|
1360
|
+
else resolve(Buffer.concat(chunks).toString("utf8"));
|
|
1361
|
+
});
|
|
1362
|
+
})
|
|
1363
|
+
});
|
|
1364
|
+
/** PR metadata fields requested from gh in a single JSON call. */
|
|
1365
|
+
const PR_JSON_FIELDS = [
|
|
1366
|
+
"additions",
|
|
1367
|
+
"author",
|
|
1368
|
+
"baseRefName",
|
|
1369
|
+
"baseRefOid",
|
|
1370
|
+
"body",
|
|
1371
|
+
"changedFiles",
|
|
1372
|
+
"createdAt",
|
|
1373
|
+
"deletions",
|
|
1374
|
+
"headRefName",
|
|
1375
|
+
"headRefOid",
|
|
1376
|
+
"headRepository",
|
|
1377
|
+
"isDraft",
|
|
1378
|
+
"mergeable",
|
|
1379
|
+
"number",
|
|
1380
|
+
"reviewDecision",
|
|
1381
|
+
"state",
|
|
1382
|
+
"title",
|
|
1383
|
+
"updatedAt",
|
|
1384
|
+
"url"
|
|
1385
|
+
].join(",");
|
|
1386
|
+
var GhService = class GhService extends ServiceMap.Service()("@ringi/GhService") {
|
|
1387
|
+
static Default = Layer.effect(GhService, Effect.gen(function* () {
|
|
1388
|
+
const ensureInstalled = execGh(["version"]).pipe(Effect.asVoid, Effect.mapError(() => new GhNotInstalled({ message: "GitHub CLI (gh) not found. Install: https://cli.github.com" })), Effect.withSpan("GhService.ensureInstalled"));
|
|
1389
|
+
const ensureAuthenticated = Effect.fn("GhService.ensureAuthenticated")(function* (host) {
|
|
1390
|
+
yield* execGh([
|
|
1391
|
+
"auth",
|
|
1392
|
+
"status",
|
|
1393
|
+
"--hostname",
|
|
1394
|
+
host
|
|
1395
|
+
]).pipe(Effect.asVoid, Effect.mapError(() => new GhAuthError({
|
|
1396
|
+
host,
|
|
1397
|
+
message: `Not authenticated to ${host}. Run: gh auth login --hostname ${host}`
|
|
1398
|
+
})));
|
|
1399
|
+
});
|
|
1400
|
+
const fetchPrMetadata = Effect.fn("GhService.fetchPrMetadata")(function* (target) {
|
|
1401
|
+
const json = yield* execGh([
|
|
1402
|
+
"pr",
|
|
1403
|
+
"view",
|
|
1404
|
+
String(target.prNumber),
|
|
1405
|
+
"--repo",
|
|
1406
|
+
target.nwoRef,
|
|
1407
|
+
"--json",
|
|
1408
|
+
PR_JSON_FIELDS
|
|
1409
|
+
]);
|
|
1410
|
+
return yield* Effect.try({
|
|
1411
|
+
catch: () => new GhApiError({
|
|
1412
|
+
message: "Failed to parse PR metadata JSON from gh output",
|
|
1413
|
+
statusCode: null
|
|
1414
|
+
}),
|
|
1415
|
+
try: () => JSON.parse(json)
|
|
1416
|
+
});
|
|
1417
|
+
});
|
|
1418
|
+
const fetchPrDiff = Effect.fn("GhService.fetchPrDiff")(function* (target) {
|
|
1419
|
+
return yield* execGh([
|
|
1420
|
+
"pr",
|
|
1421
|
+
"diff",
|
|
1422
|
+
String(target.prNumber),
|
|
1423
|
+
"--repo",
|
|
1424
|
+
target.nwoRef
|
|
1425
|
+
]);
|
|
1426
|
+
});
|
|
1427
|
+
const fetchPrHeadOid = Effect.fn("GhService.fetchPrHeadOid")(function* (target) {
|
|
1428
|
+
const json = yield* execGh([
|
|
1429
|
+
"pr",
|
|
1430
|
+
"view",
|
|
1431
|
+
String(target.prNumber),
|
|
1432
|
+
"--repo",
|
|
1433
|
+
target.nwoRef,
|
|
1434
|
+
"--json",
|
|
1435
|
+
"headRefOid"
|
|
1436
|
+
]);
|
|
1437
|
+
return yield* Effect.try({
|
|
1438
|
+
catch: () => new GhApiError({
|
|
1439
|
+
message: "Failed to parse head OID from gh output",
|
|
1440
|
+
statusCode: null
|
|
1441
|
+
}),
|
|
1442
|
+
try: () => JSON.parse(json).headRefOid
|
|
1443
|
+
});
|
|
1444
|
+
});
|
|
1445
|
+
return GhService.of({
|
|
1446
|
+
ensureAuthenticated,
|
|
1447
|
+
ensureInstalled,
|
|
1448
|
+
fetchPrDiff,
|
|
1449
|
+
fetchPrHeadOid,
|
|
1450
|
+
fetchPrMetadata
|
|
1451
|
+
});
|
|
1452
|
+
}));
|
|
1453
|
+
};
|
|
1319
1454
|
//#endregion
|
|
1320
1455
|
//#region ../../node_modules/.pnpm/readdirp@5.0.0/node_modules/readdirp/index.js
|
|
1321
1456
|
const EntryTypes = {
|
|
@@ -2909,67 +3044,73 @@ var chokidar_default = {
|
|
|
2909
3044
|
};
|
|
2910
3045
|
//#endregion
|
|
2911
3046
|
//#region ../../packages/core/src/services/event.service.ts
|
|
2912
|
-
var EventService = class extends
|
|
2913
|
-
|
|
2914
|
-
|
|
2915
|
-
|
|
2916
|
-
|
|
2917
|
-
|
|
2918
|
-
|
|
2919
|
-
|
|
2920
|
-
|
|
2921
|
-
|
|
2922
|
-
|
|
2923
|
-
|
|
2924
|
-
|
|
2925
|
-
|
|
2926
|
-
|
|
2927
|
-
|
|
2928
|
-
|
|
2929
|
-
|
|
2930
|
-
|
|
2931
|
-
}
|
|
2932
|
-
};
|
|
2933
|
-
|
|
2934
|
-
|
|
2935
|
-
|
|
2936
|
-
|
|
2937
|
-
|
|
2938
|
-
|
|
2939
|
-
|
|
2940
|
-
|
|
2941
|
-
|
|
2942
|
-
|
|
2943
|
-
|
|
2944
|
-
|
|
2945
|
-
|
|
2946
|
-
|
|
2947
|
-
|
|
2948
|
-
}
|
|
2949
|
-
|
|
2950
|
-
|
|
2951
|
-
|
|
2952
|
-
|
|
2953
|
-
|
|
2954
|
-
|
|
2955
|
-
|
|
2956
|
-
|
|
2957
|
-
|
|
2958
|
-
|
|
2959
|
-
|
|
2960
|
-
|
|
2961
|
-
|
|
2962
|
-
|
|
2963
|
-
|
|
2964
|
-
|
|
2965
|
-
|
|
2966
|
-
|
|
2967
|
-
|
|
2968
|
-
})
|
|
3047
|
+
var EventService = class EventService extends ServiceMap.Service()("@ringi/EventService") {
|
|
3048
|
+
static Default = Layer.effect(EventService, Effect.sync(() => {
|
|
3049
|
+
const subscribers = /* @__PURE__ */ new Set();
|
|
3050
|
+
const broadcast = (type, data) => Effect.gen(function* () {
|
|
3051
|
+
const event = {
|
|
3052
|
+
data,
|
|
3053
|
+
timestamp: Date.now(),
|
|
3054
|
+
type
|
|
3055
|
+
};
|
|
3056
|
+
for (const queue of subscribers) yield* Queue.offer(queue, event);
|
|
3057
|
+
});
|
|
3058
|
+
const subscribe = () => Effect.gen(function* () {
|
|
3059
|
+
const queue = yield* Queue.sliding(100);
|
|
3060
|
+
subscribers.add(queue);
|
|
3061
|
+
return {
|
|
3062
|
+
stream: Stream.fromQueue(queue),
|
|
3063
|
+
unsubscribe: Effect.sync(() => {
|
|
3064
|
+
subscribers.delete(queue);
|
|
3065
|
+
}).pipe(Effect.andThen(Queue.shutdown(queue)))
|
|
3066
|
+
};
|
|
3067
|
+
});
|
|
3068
|
+
const startFileWatcher = (repoPath) => Effect.acquireRelease(Effect.sync(() => {
|
|
3069
|
+
let debounceTimer = null;
|
|
3070
|
+
const watcher = chokidar_default.watch(repoPath, {
|
|
3071
|
+
ignoreInitial: true,
|
|
3072
|
+
ignored: [
|
|
3073
|
+
"**/node_modules/**",
|
|
3074
|
+
"**/.git/**",
|
|
3075
|
+
"**/.ringi/**",
|
|
3076
|
+
"**/dist/**"
|
|
3077
|
+
],
|
|
3078
|
+
persistent: true,
|
|
3079
|
+
...platform() === "darwin" ? {
|
|
3080
|
+
interval: 1e3,
|
|
3081
|
+
usePolling: true
|
|
3082
|
+
} : {}
|
|
3083
|
+
});
|
|
3084
|
+
const debouncedBroadcast = (filePath) => {
|
|
3085
|
+
if (debounceTimer) clearTimeout(debounceTimer);
|
|
3086
|
+
debounceTimer = setTimeout(() => {
|
|
3087
|
+
const rel = relative(repoPath, filePath);
|
|
3088
|
+
Effect.runFork(broadcast("files", { path: rel }));
|
|
3089
|
+
}, 300);
|
|
3090
|
+
};
|
|
3091
|
+
watcher.on("add", debouncedBroadcast);
|
|
3092
|
+
watcher.on("change", debouncedBroadcast);
|
|
3093
|
+
watcher.on("unlink", debouncedBroadcast);
|
|
3094
|
+
return watcher;
|
|
3095
|
+
}), (watcher) => Effect.promise(() => watcher.close()));
|
|
3096
|
+
const getClientCount = () => Effect.sync(() => subscribers.size);
|
|
3097
|
+
return EventService.of({
|
|
3098
|
+
broadcast,
|
|
3099
|
+
getClientCount,
|
|
3100
|
+
startFileWatcher,
|
|
3101
|
+
subscribe
|
|
3102
|
+
});
|
|
3103
|
+
}));
|
|
3104
|
+
};
|
|
2969
3105
|
//#endregion
|
|
2970
3106
|
//#region ../../packages/core/src/runtime.ts
|
|
2971
|
-
const
|
|
3107
|
+
const RepoLive = Layer.mergeAll(ReviewRepo.Default, ReviewFileRepo.Default, CommentRepo.Default, TodoRepo.Default).pipe(Layer.provide(SqliteService.Default));
|
|
3108
|
+
const CommentServiceLive = CommentService.Default.pipe(Layer.provide(CommentRepo.Default), Layer.provide(SqliteService.Default));
|
|
3109
|
+
const TodoServiceLive = TodoService.Default.pipe(Layer.provide(TodoRepo.Default), Layer.provide(SqliteService.Default));
|
|
3110
|
+
const ReviewServiceLive = ReviewService.Default.pipe(Layer.provide(ReviewRepo.Default), Layer.provide(ReviewFileRepo.Default), Layer.provide(GitService.Default), Layer.provide(SqliteService.Default));
|
|
3111
|
+
const ExportServiceLive = ExportService.Default.pipe(Layer.provide(ReviewServiceLive), Layer.provide(CommentServiceLive), Layer.provide(TodoServiceLive));
|
|
3112
|
+
const CoreLive = Layer.mergeAll(ReviewServiceLive, CommentServiceLive, TodoServiceLive, GitService.Default, GhService.Default, EventService.Default, ExportServiceLive, RepoLive, SqliteService.Default);
|
|
2972
3113
|
//#endregion
|
|
2973
|
-
export {
|
|
3114
|
+
export { ReviewSourceType as _, ReviewService as a, ReviewFileRepo as c, parseDiff as d, CommentService as f, ReviewNotFound as g, ReviewId as h, TodoService as i, serializeHunks as l, TodoNotFound as m, GhService as n, GitService as o, TodoId as p, ExportService as r, ReviewRepo as s, CoreLive as t, getDiffSummary as u };
|
|
2974
3115
|
|
|
2975
3116
|
//# sourceMappingURL=runtime.mjs.map
|