@ccview/server 0.1.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/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +43 -0
- package/dist/index.js.map +1 -0
- package/dist/plugins/db.d.ts +9 -0
- package/dist/plugins/db.d.ts.map +1 -0
- package/dist/plugins/db.js +8 -0
- package/dist/plugins/db.js.map +1 -0
- package/dist/routes/analytics.d.ts +4 -0
- package/dist/routes/analytics.d.ts.map +1 -0
- package/dist/routes/analytics.js +59 -0
- package/dist/routes/analytics.js.map +1 -0
- package/dist/routes/config.d.ts +4 -0
- package/dist/routes/config.d.ts.map +1 -0
- package/dist/routes/config.js +119 -0
- package/dist/routes/config.js.map +1 -0
- package/dist/routes/projects.d.ts +4 -0
- package/dist/routes/projects.d.ts.map +1 -0
- package/dist/routes/projects.js +46 -0
- package/dist/routes/projects.js.map +1 -0
- package/dist/routes/sessions.d.ts +4 -0
- package/dist/routes/sessions.d.ts.map +1 -0
- package/dist/routes/sessions.js +66 -0
- package/dist/routes/sessions.js.map +1 -0
- package/dist/routes/sync.d.ts +4 -0
- package/dist/routes/sync.d.ts.map +1 -0
- package/dist/routes/sync.js +49 -0
- package/dist/routes/sync.js.map +1 -0
- package/package.json +35 -0
- package/web-dist/assets/abap-DsBKuouk.js +1 -0
- package/web-dist/assets/actionscript-3-D_z4Izcz.js +1 -0
- package/web-dist/assets/ada-727ZlQH0.js +1 -0
- package/web-dist/assets/andromeeda-C3khCPGq.js +1 -0
- package/web-dist/assets/angular-html-LfdN0zeE.js +1 -0
- package/web-dist/assets/angular-ts-CKsD7JZE.js +1 -0
- package/web-dist/assets/apache-Dn00JSTd.js +1 -0
- package/web-dist/assets/apex-COJ4H7py.js +1 -0
- package/web-dist/assets/apl-BBq3IX1j.js +1 -0
- package/web-dist/assets/applescript-Bu5BbsvL.js +1 -0
- package/web-dist/assets/ara-7O62HKoU.js +1 -0
- package/web-dist/assets/asciidoc-BPT9niGB.js +1 -0
- package/web-dist/assets/asm-Dhn9LcZ4.js +1 -0
- package/web-dist/assets/astro-CqkE3fuf.js +1 -0
- package/web-dist/assets/aurora-x-D-2ljcwZ.js +1 -0
- package/web-dist/assets/awk-eg146-Ew.js +1 -0
- package/web-dist/assets/ayu-dark-Cv9koXgw.js +1 -0
- package/web-dist/assets/ballerina-Du268qiB.js +1 -0
- package/web-dist/assets/bat-fje9CFhw.js +1 -0
- package/web-dist/assets/beancount-BwXTMy5W.js +1 -0
- package/web-dist/assets/berry-3xVqZejG.js +1 -0
- package/web-dist/assets/bibtex-xW4inM5L.js +1 -0
- package/web-dist/assets/bicep-DHo0CJ0O.js +1 -0
- package/web-dist/assets/blade-a8OxSdnT.js +1 -0
- package/web-dist/assets/bsl-Dgyn0ogV.js +1 -0
- package/web-dist/assets/c-C3t2pwGQ.js +1 -0
- package/web-dist/assets/cadence-DNquZEk8.js +1 -0
- package/web-dist/assets/cairo--RitsXJZ.js +1 -0
- package/web-dist/assets/catppuccin-frappe-CD_QflpE.js +1 -0
- package/web-dist/assets/catppuccin-latte-DRW-0cLl.js +1 -0
- package/web-dist/assets/catppuccin-macchiato-C-_shW-Y.js +1 -0
- package/web-dist/assets/catppuccin-mocha-LGGdnPYs.js +1 -0
- package/web-dist/assets/clarity-BHOwM8T6.js +1 -0
- package/web-dist/assets/clojure-DxSadP1t.js +1 -0
- package/web-dist/assets/cmake-DbXoA79R.js +1 -0
- package/web-dist/assets/cobol-PTqiYgYu.js +1 -0
- package/web-dist/assets/codeowners-Bp6g37R7.js +1 -0
- package/web-dist/assets/codeql-sacFqUAJ.js +1 -0
- package/web-dist/assets/coffee-dyiR41kL.js +1 -0
- package/web-dist/assets/common-lisp-C7gG9l05.js +1 -0
- package/web-dist/assets/coq-Dsg_Bt_b.js +1 -0
- package/web-dist/assets/cpp-BksuvNSY.js +1 -0
- package/web-dist/assets/crystal-DtDmRg-F.js +1 -0
- package/web-dist/assets/csharp-D9R-vmeu.js +1 -0
- package/web-dist/assets/css-BPhBrDlE.js +1 -0
- package/web-dist/assets/csv-B0qRVHPH.js +1 -0
- package/web-dist/assets/cue-DtFQj3wx.js +1 -0
- package/web-dist/assets/cypher-m2LEI-9-.js +1 -0
- package/web-dist/assets/d-BoXegm-a.js +1 -0
- package/web-dist/assets/dark-plus-C3mMm8J8.js +1 -0
- package/web-dist/assets/dart-B9wLZaAG.js +1 -0
- package/web-dist/assets/dax-ClGRhx96.js +1 -0
- package/web-dist/assets/desktop-DEIpsLCJ.js +1 -0
- package/web-dist/assets/diff-BgYniUM_.js +1 -0
- package/web-dist/assets/docker-COcR7UxN.js +1 -0
- package/web-dist/assets/dotenv-BjQB5zDj.js +1 -0
- package/web-dist/assets/dracula-BzJJZx-M.js +1 -0
- package/web-dist/assets/dracula-soft-BXkSAIEj.js +1 -0
- package/web-dist/assets/dream-maker-C-nORZOA.js +1 -0
- package/web-dist/assets/edge-D5gP-w-T.js +1 -0
- package/web-dist/assets/elixir-CLiX3zqd.js +1 -0
- package/web-dist/assets/elm-CmHSxxaM.js +1 -0
- package/web-dist/assets/emacs-lisp-BX77sIaO.js +1 -0
- package/web-dist/assets/erb-BYTLMnw6.js +1 -0
- package/web-dist/assets/erlang-B-DoSBHF.js +1 -0
- package/web-dist/assets/everforest-dark-BgDCqdQA.js +1 -0
- package/web-dist/assets/everforest-light-C8M2exoo.js +1 -0
- package/web-dist/assets/fennel-bCA53EVm.js +1 -0
- package/web-dist/assets/fish-w-ucz2PV.js +1 -0
- package/web-dist/assets/fluent-Dayu4EKP.js +1 -0
- package/web-dist/assets/fortran-fixed-form-TqA4NnZg.js +1 -0
- package/web-dist/assets/fortran-free-form-DKXYxT9g.js +1 -0
- package/web-dist/assets/fsharp-XplgxFYe.js +1 -0
- package/web-dist/assets/gdresource-BHYsBjWJ.js +1 -0
- package/web-dist/assets/gdscript-DfxzS6Rs.js +1 -0
- package/web-dist/assets/gdshader-SKMF96pI.js +1 -0
- package/web-dist/assets/genie-ajMbGru0.js +1 -0
- package/web-dist/assets/gherkin--30QC5Em.js +1 -0
- package/web-dist/assets/git-commit-i4q6IMui.js +1 -0
- package/web-dist/assets/git-rebase-B-v9cOL2.js +1 -0
- package/web-dist/assets/github-dark-DHJKELXO.js +1 -0
- package/web-dist/assets/github-dark-default-Cuk6v7N8.js +1 -0
- package/web-dist/assets/github-dark-dimmed-DH5Ifo-i.js +1 -0
- package/web-dist/assets/github-dark-high-contrast-E3gJ1_iC.js +1 -0
- package/web-dist/assets/github-light-DAi9KRSo.js +1 -0
- package/web-dist/assets/github-light-default-D7oLnXFd.js +1 -0
- package/web-dist/assets/github-light-high-contrast-BfjtVDDH.js +1 -0
- package/web-dist/assets/gleam-B430Bg39.js +1 -0
- package/web-dist/assets/glimmer-js-D-cwc0-E.js +1 -0
- package/web-dist/assets/glimmer-ts-pgjy16dm.js +1 -0
- package/web-dist/assets/glsl-DBO2IWDn.js +1 -0
- package/web-dist/assets/gnuplot-CM8KxXT1.js +1 -0
- package/web-dist/assets/go-B1SYOhNW.js +1 -0
- package/web-dist/assets/graphql-cDcHW_If.js +1 -0
- package/web-dist/assets/groovy-DkBy-JyN.js +1 -0
- package/web-dist/assets/hack-D1yCygmZ.js +1 -0
- package/web-dist/assets/haml-B2EZWmdv.js +1 -0
- package/web-dist/assets/handlebars-BQGss363.js +1 -0
- package/web-dist/assets/haskell-BILxekzW.js +1 -0
- package/web-dist/assets/haxe-C5wWYbrZ.js +1 -0
- package/web-dist/assets/hcl-HzYwdGDm.js +1 -0
- package/web-dist/assets/hjson-T-Tgc4AT.js +1 -0
- package/web-dist/assets/hlsl-ifBTmRxC.js +1 -0
- package/web-dist/assets/houston-DnULxvSX.js +1 -0
- package/web-dist/assets/html-C2L_23MC.js +1 -0
- package/web-dist/assets/html-derivative-CSfWNPLT.js +1 -0
- package/web-dist/assets/http-FRrOvY1W.js +1 -0
- package/web-dist/assets/hxml-TIA70rKU.js +1 -0
- package/web-dist/assets/hy-BMj5Y0dO.js +1 -0
- package/web-dist/assets/imba-bv_oIlVt.js +1 -0
- package/web-dist/assets/index-BZ3l7TI9.js +149 -0
- package/web-dist/assets/index-Bg3pafSR.js +144 -0
- package/web-dist/assets/index-_CjWZdEd.css +1 -0
- package/web-dist/assets/ini-BjABl1g7.js +1 -0
- package/web-dist/assets/java-xI-RfyKK.js +1 -0
- package/web-dist/assets/javascript-ySlJ1b_l.js +1 -0
- package/web-dist/assets/jinja-DGy0s7-h.js +1 -0
- package/web-dist/assets/jison-BqZprYcd.js +1 -0
- package/web-dist/assets/json-BQoSv7ci.js +1 -0
- package/web-dist/assets/json5-w8dY5SsB.js +1 -0
- package/web-dist/assets/jsonc-TU54ms6u.js +1 -0
- package/web-dist/assets/jsonl-DREVFZK8.js +1 -0
- package/web-dist/assets/jsonnet-BfivnA6A.js +1 -0
- package/web-dist/assets/jssm-P4WzXJd0.js +1 -0
- package/web-dist/assets/jsx-BAng5TT0.js +1 -0
- package/web-dist/assets/julia-BBuGR-5E.js +1 -0
- package/web-dist/assets/kanagawa-dragon-CkXjmgJE.js +1 -0
- package/web-dist/assets/kanagawa-lotus-CfQXZHmo.js +1 -0
- package/web-dist/assets/kanagawa-wave-DWedfzmr.js +1 -0
- package/web-dist/assets/kotlin-B5lbUyaz.js +1 -0
- package/web-dist/assets/kusto-mebxcVVE.js +1 -0
- package/web-dist/assets/laserwave-DUszq2jm.js +1 -0
- package/web-dist/assets/latex-C-cWTeAZ.js +1 -0
- package/web-dist/assets/lean-XBlWyCtg.js +1 -0
- package/web-dist/assets/less-BfCpw3nA.js +1 -0
- package/web-dist/assets/light-plus-B7mTdjB0.js +1 -0
- package/web-dist/assets/liquid-D3W5UaiH.js +1 -0
- package/web-dist/assets/log-Cc5clBb7.js +1 -0
- package/web-dist/assets/logo-IuBKFhSY.js +1 -0
- package/web-dist/assets/lua-CvWAzNxB.js +1 -0
- package/web-dist/assets/luau-Du5NY7AG.js +1 -0
- package/web-dist/assets/make-Bvotw-X0.js +1 -0
- package/web-dist/assets/markdown-UIAJJxZW.js +1 -0
- package/web-dist/assets/marko-z0MBrx5-.js +1 -0
- package/web-dist/assets/material-theme-D5KoaKCx.js +1 -0
- package/web-dist/assets/material-theme-darker-BfHTSMKl.js +1 -0
- package/web-dist/assets/material-theme-lighter-B0m2ddpp.js +1 -0
- package/web-dist/assets/material-theme-ocean-CyktbL80.js +1 -0
- package/web-dist/assets/material-theme-palenight-Csfq5Kiy.js +1 -0
- package/web-dist/assets/matlab-D9-PGadD.js +1 -0
- package/web-dist/assets/mdc-DB_EDNY_.js +1 -0
- package/web-dist/assets/mdx-sdHcTMYB.js +1 -0
- package/web-dist/assets/mermaid-Ci6OQyBP.js +1 -0
- package/web-dist/assets/min-dark-CafNBF8u.js +1 -0
- package/web-dist/assets/min-light-CTRr51gU.js +1 -0
- package/web-dist/assets/mipsasm-BC5c_5Pe.js +1 -0
- package/web-dist/assets/mojo-Tz6hzZYG.js +1 -0
- package/web-dist/assets/monokai-D4h5O-jR.js +1 -0
- package/web-dist/assets/move-DB_GagMm.js +1 -0
- package/web-dist/assets/narrat-DLbgOhZU.js +1 -0
- package/web-dist/assets/nextflow-B0XVJmRM.js +1 -0
- package/web-dist/assets/nginx-D_VnBJ67.js +1 -0
- package/web-dist/assets/night-owl-C39BiMTA.js +1 -0
- package/web-dist/assets/nim-ZlGxZxc3.js +1 -0
- package/web-dist/assets/nix-shcSOmrb.js +1 -0
- package/web-dist/assets/nord-Ddv68eIx.js +1 -0
- package/web-dist/assets/nushell-D4Tzg5kh.js +1 -0
- package/web-dist/assets/objective-c-Deuh7S70.js +1 -0
- package/web-dist/assets/objective-cpp-BUEGK8hf.js +1 -0
- package/web-dist/assets/ocaml-BNioltXt.js +1 -0
- package/web-dist/assets/one-dark-pro-GBQ2dnAY.js +1 -0
- package/web-dist/assets/one-light-PoHY5YXO.js +1 -0
- package/web-dist/assets/pascal-JqZropPD.js +1 -0
- package/web-dist/assets/perl-CHQXSrWU.js +1 -0
- package/web-dist/assets/php-B5ebYQev.js +1 -0
- package/web-dist/assets/plastic-3e1v2bzS.js +1 -0
- package/web-dist/assets/plsql-LKU2TuZ1.js +1 -0
- package/web-dist/assets/po-BFLt1xDp.js +1 -0
- package/web-dist/assets/poimandres-CS3Unz2-.js +1 -0
- package/web-dist/assets/polar-DKykz6zU.js +1 -0
- package/web-dist/assets/postcss-B3ZDOciz.js +1 -0
- package/web-dist/assets/powerquery-CSHBycmS.js +1 -0
- package/web-dist/assets/powershell-BIEUsx6d.js +1 -0
- package/web-dist/assets/prisma-B48N-Iqd.js +1 -0
- package/web-dist/assets/prolog-BY-TUvya.js +1 -0
- package/web-dist/assets/proto-zocC4JxJ.js +1 -0
- package/web-dist/assets/pug-CM9l7STV.js +1 -0
- package/web-dist/assets/puppet-Cza_XSSt.js +1 -0
- package/web-dist/assets/purescript-Bg-kzb6g.js +1 -0
- package/web-dist/assets/python-DhUJRlN_.js +1 -0
- package/web-dist/assets/qml-D8XfuvdV.js +1 -0
- package/web-dist/assets/qmldir-C8lEn-DE.js +1 -0
- package/web-dist/assets/qss-DhMKtDLN.js +1 -0
- package/web-dist/assets/r-CwjWoCRV.js +1 -0
- package/web-dist/assets/racket-CzouJOBO.js +1 -0
- package/web-dist/assets/raku-B1bQXN8T.js +1 -0
- package/web-dist/assets/razor-CNLDkMZG.js +1 -0
- package/web-dist/assets/red-bN70gL4F.js +1 -0
- package/web-dist/assets/reg-5LuOXUq_.js +1 -0
- package/web-dist/assets/regexp-DWJ3fJO_.js +1 -0
- package/web-dist/assets/rel-DJlmqQ1C.js +1 -0
- package/web-dist/assets/riscv-QhoSD0DR.js +1 -0
- package/web-dist/assets/rose-pine-CmCqftbK.js +1 -0
- package/web-dist/assets/rose-pine-dawn-Ds-gbosJ.js +1 -0
- package/web-dist/assets/rose-pine-moon-CjDtw9vr.js +1 -0
- package/web-dist/assets/rst-4NLicBqY.js +1 -0
- package/web-dist/assets/ruby-DeZ3UC14.js +1 -0
- package/web-dist/assets/rust-Be6lgOlo.js +1 -0
- package/web-dist/assets/sas-BmTFh92c.js +1 -0
- package/web-dist/assets/sass-BJ4Li9vH.js +1 -0
- package/web-dist/assets/scala-DQVVAn-B.js +1 -0
- package/web-dist/assets/scheme-BJGe-b2p.js +1 -0
- package/web-dist/assets/scss-C31hgJw-.js +1 -0
- package/web-dist/assets/sdbl-BLhTXw86.js +1 -0
- package/web-dist/assets/shaderlab-B7qAK45m.js +1 -0
- package/web-dist/assets/shellscript-atvbtKCR.js +1 -0
- package/web-dist/assets/shellsession-C_rIy8kc.js +1 -0
- package/web-dist/assets/slack-dark-BthQWCQV.js +1 -0
- package/web-dist/assets/slack-ochin-DqwNpetd.js +1 -0
- package/web-dist/assets/smalltalk-DkLiglaE.js +1 -0
- package/web-dist/assets/snazzy-light-Bw305WKR.js +1 -0
- package/web-dist/assets/solarized-dark-DXbdFlpD.js +1 -0
- package/web-dist/assets/solarized-light-L9t79GZl.js +1 -0
- package/web-dist/assets/solidity-C1w2a3ep.js +1 -0
- package/web-dist/assets/soy-C-lX7w71.js +1 -0
- package/web-dist/assets/sparql-bYkjHRlG.js +1 -0
- package/web-dist/assets/splunk-Cf8iN4DR.js +1 -0
- package/web-dist/assets/sql-COK4E0Yg.js +1 -0
- package/web-dist/assets/ssh-config-BknIz3MU.js +1 -0
- package/web-dist/assets/stata-DorPZHa4.js +1 -0
- package/web-dist/assets/stylus-BeQkCIfX.js +1 -0
- package/web-dist/assets/svelte-MSaWC3Je.js +1 -0
- package/web-dist/assets/swift-BSxZ-RaX.js +1 -0
- package/web-dist/assets/synthwave-84-CbfX1IO0.js +1 -0
- package/web-dist/assets/system-verilog-C7L56vO4.js +1 -0
- package/web-dist/assets/systemd-CUnW07Te.js +1 -0
- package/web-dist/assets/talonscript-C1XDQQGZ.js +1 -0
- package/web-dist/assets/tasl-CQjiPCtT.js +1 -0
- package/web-dist/assets/tcl-DQ1-QYvQ.js +1 -0
- package/web-dist/assets/templ-dwX3ZSMB.js +1 -0
- package/web-dist/assets/terraform-BbSNqyBO.js +1 -0
- package/web-dist/assets/tex-rYs2v40G.js +1 -0
- package/web-dist/assets/tokyo-night-DBQeEorK.js +1 -0
- package/web-dist/assets/toml-CB2ApiWb.js +1 -0
- package/web-dist/assets/ts-tags-CipyTH0X.js +1 -0
- package/web-dist/assets/tsv-B_m7g4N7.js +1 -0
- package/web-dist/assets/tsx-B6W0miNI.js +1 -0
- package/web-dist/assets/turtle-BMR_PYu6.js +1 -0
- package/web-dist/assets/twig-NC5TFiHP.js +1 -0
- package/web-dist/assets/typescript-Dj6nwHGl.js +1 -0
- package/web-dist/assets/typespec-BpWG_bgh.js +1 -0
- package/web-dist/assets/typst-BVUVsWT6.js +1 -0
- package/web-dist/assets/v-CAQ2eGtk.js +1 -0
- package/web-dist/assets/vala-BFOHcciG.js +1 -0
- package/web-dist/assets/vb-CdO5JTpU.js +1 -0
- package/web-dist/assets/verilog-CJaU5se_.js +1 -0
- package/web-dist/assets/vesper-BEBZ7ncR.js +1 -0
- package/web-dist/assets/vhdl-DYoNaHQp.js +1 -0
- package/web-dist/assets/viml-m4uW47V2.js +1 -0
- package/web-dist/assets/vitesse-black-Bkuqu6BP.js +1 -0
- package/web-dist/assets/vitesse-dark-D0r3Knsf.js +1 -0
- package/web-dist/assets/vitesse-light-CVO1_9PV.js +1 -0
- package/web-dist/assets/vue-BuYVFjOK.js +1 -0
- package/web-dist/assets/vue-html-xdeiXROB.js +1 -0
- package/web-dist/assets/vyper-nyqBNV6O.js +1 -0
- package/web-dist/assets/wasm-C6j12Q_x.js +1 -0
- package/web-dist/assets/wasm-CG6Dc4jp.js +1 -0
- package/web-dist/assets/wenyan-7A4Fjokl.js +1 -0
- package/web-dist/assets/wgsl-CB0Krxn9.js +1 -0
- package/web-dist/assets/wikitext-DCE3LsBG.js +1 -0
- package/web-dist/assets/wolfram-C3FkfJm5.js +1 -0
- package/web-dist/assets/xml-e3z08dGr.js +1 -0
- package/web-dist/assets/xsl-Dd0NUgwM.js +1 -0
- package/web-dist/assets/yaml-CVw76BM1.js +1 -0
- package/web-dist/assets/zenscript-HnGAYVZD.js +1 -0
- package/web-dist/assets/zig-BVz_zdnA.js +1 -0
- package/web-dist/index.html +14 -0
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import Fastify from 'fastify';
|
|
2
|
+
export declare function createServer(port?: number): Promise<Fastify.FastifyInstance<import("http").Server<typeof import("http").IncomingMessage, typeof import("http").ServerResponse>, import("http").IncomingMessage, import("http").ServerResponse<import("http").IncomingMessage>, Fastify.FastifyBaseLogger, Fastify.FastifyTypeProviderDefault>>;
|
|
3
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,SAAS,CAAA;AAc7B,wBAAsB,YAAY,CAAC,IAAI,SAAe,sSAyBrD"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import Fastify from 'fastify';
|
|
2
|
+
import cors from '@fastify/cors';
|
|
3
|
+
import staticFiles from '@fastify/static';
|
|
4
|
+
import path from 'node:path';
|
|
5
|
+
import fs from 'node:fs';
|
|
6
|
+
import { fileURLToPath } from 'node:url';
|
|
7
|
+
import dbPlugin from './plugins/db.js';
|
|
8
|
+
import sessionsRoutes from './routes/sessions.js';
|
|
9
|
+
import projectsRoutes from './routes/projects.js';
|
|
10
|
+
import analyticsRoutes from './routes/analytics.js';
|
|
11
|
+
import configRoutes from './routes/config.js';
|
|
12
|
+
const DEFAULT_PORT = 3200;
|
|
13
|
+
export async function createServer(port = DEFAULT_PORT) {
|
|
14
|
+
const fastify = Fastify({ logger: false });
|
|
15
|
+
await fastify.register(cors, { origin: ['http://localhost:5173', 'http://localhost:3200'] });
|
|
16
|
+
await fastify.register(dbPlugin);
|
|
17
|
+
await fastify.register(sessionsRoutes, { prefix: '/api' });
|
|
18
|
+
await fastify.register(projectsRoutes, { prefix: '/api' });
|
|
19
|
+
await fastify.register(analyticsRoutes, { prefix: '/api' });
|
|
20
|
+
await fastify.register(configRoutes, { prefix: '/api' });
|
|
21
|
+
// Serve la React app buildata (se esiste)
|
|
22
|
+
// In npm package: web-dist/ è dentro @ccview/server/
|
|
23
|
+
// In monorepo dev: packages/web/dist/
|
|
24
|
+
const serverDir = path.dirname(fileURLToPath(import.meta.url));
|
|
25
|
+
const webDistNpm = path.join(serverDir, '../web-dist');
|
|
26
|
+
const webDistDev = path.join(serverDir, '../../web/dist');
|
|
27
|
+
const webDistPath = fs.existsSync(webDistNpm) ? webDistNpm : webDistDev;
|
|
28
|
+
if (fs.existsSync(webDistPath)) {
|
|
29
|
+
await fastify.register(staticFiles, { root: webDistPath, prefix: '/' });
|
|
30
|
+
fastify.setNotFoundHandler((req, reply) => {
|
|
31
|
+
void reply.sendFile('index.html');
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
return fastify;
|
|
35
|
+
}
|
|
36
|
+
// Entry point diretto
|
|
37
|
+
if (process.argv[1] === fileURLToPath(import.meta.url)) {
|
|
38
|
+
const port = parseInt(process.env['PORT'] ?? String(DEFAULT_PORT));
|
|
39
|
+
const server = await createServer(port);
|
|
40
|
+
await server.listen({ port, host: '127.0.0.1' });
|
|
41
|
+
console.log(`ccview server running at http://localhost:${port}`);
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { type Database } from '@ccview/core';
|
|
2
|
+
declare module 'fastify' {
|
|
3
|
+
interface FastifyInstance {
|
|
4
|
+
db: Database.Database;
|
|
5
|
+
}
|
|
6
|
+
}
|
|
7
|
+
declare const _default: (fastify: import("fastify").FastifyInstance<import("fastify").RawServerDefault, import("http").IncomingMessage, import("http").ServerResponse<import("http").IncomingMessage>, import("fastify").FastifyBaseLogger, import("fastify").FastifyTypeProviderDefault>) => Promise<void>;
|
|
8
|
+
export default _default;
|
|
9
|
+
//# sourceMappingURL=db.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../../src/plugins/db.ts"],"names":[],"mappings":"AACA,OAAO,EAAgB,KAAK,QAAQ,EAAE,MAAM,cAAc,CAAA;AAE1D,OAAO,QAAQ,SAAS,CAAC;IACvB,UAAU,eAAe;QACvB,EAAE,EAAE,QAAQ,CAAC,QAAQ,CAAA;KACtB;CACF;;AAED,wBAIE"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import fp from 'fastify-plugin';
|
|
2
|
+
import { openDatabase } from '@ccview/core';
|
|
3
|
+
export default fp(async (fastify) => {
|
|
4
|
+
const db = openDatabase();
|
|
5
|
+
fastify.decorate('db', db);
|
|
6
|
+
fastify.addHook('onClose', () => db.close());
|
|
7
|
+
});
|
|
8
|
+
//# sourceMappingURL=db.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"db.js","sourceRoot":"","sources":["../../src/plugins/db.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,gBAAgB,CAAA;AAC/B,OAAO,EAAE,YAAY,EAAiB,MAAM,cAAc,CAAA;AAQ1D,eAAe,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;IAClC,MAAM,EAAE,GAAG,YAAY,EAAE,CAAA;IACzB,OAAO,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC,CAAA;IAC1B,OAAO,CAAC,OAAO,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,CAAA;AAC9C,CAAC,CAAC,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"analytics.d.ts","sourceRoot":"","sources":["../../src/routes/analytics.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAA;AAGjD,QAAA,MAAM,eAAe,EAAE,kBAmEtB,CAAA;AAED,eAAe,eAAe,CAAA"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { getDailyCosts, getFileHotspots, getOverviewStats } from '@ccview/core';
|
|
2
|
+
const analyticsRoutes = async (fastify) => {
|
|
3
|
+
// GET /api/analytics/tokens — split in/out per giorno
|
|
4
|
+
fastify.get('/analytics/tokens', async (request) => {
|
|
5
|
+
const { from, to } = request.query;
|
|
6
|
+
const conditions = [];
|
|
7
|
+
const params = {};
|
|
8
|
+
if (from) {
|
|
9
|
+
conditions.push(`started_at >= @from`);
|
|
10
|
+
params['from'] = from;
|
|
11
|
+
}
|
|
12
|
+
if (to) {
|
|
13
|
+
conditions.push(`started_at <= @to`);
|
|
14
|
+
params['to'] = to + 'T23:59:59';
|
|
15
|
+
}
|
|
16
|
+
const where = conditions.length ? `WHERE ${conditions.join(' AND ')}` : '';
|
|
17
|
+
const rows = fastify.db.prepare(`
|
|
18
|
+
SELECT
|
|
19
|
+
DATE(started_at) as day,
|
|
20
|
+
SUM(total_tokens_in) as tokensIn,
|
|
21
|
+
SUM(total_tokens_out) as tokensOut,
|
|
22
|
+
COUNT(*) as sessions
|
|
23
|
+
FROM sessions
|
|
24
|
+
${where}
|
|
25
|
+
GROUP BY DATE(started_at)
|
|
26
|
+
ORDER BY day ASC
|
|
27
|
+
`).all(params);
|
|
28
|
+
return { data: rows };
|
|
29
|
+
});
|
|
30
|
+
// GET /api/analytics/costs
|
|
31
|
+
fastify.get('/analytics/costs', async (request) => {
|
|
32
|
+
const { from, to } = request.query;
|
|
33
|
+
const data = getDailyCosts(fastify.db, from ? new Date(from) : undefined, to ? new Date(to) : undefined);
|
|
34
|
+
return { data };
|
|
35
|
+
});
|
|
36
|
+
// GET /api/analytics/files
|
|
37
|
+
fastify.get('/analytics/files', async (request) => {
|
|
38
|
+
const { project, limit } = request.query;
|
|
39
|
+
const opts = {};
|
|
40
|
+
if (project)
|
|
41
|
+
opts.project = project;
|
|
42
|
+
if (limit)
|
|
43
|
+
opts.limit = parseInt(limit, 10);
|
|
44
|
+
const data = getFileHotspots(fastify.db, opts);
|
|
45
|
+
return { data };
|
|
46
|
+
});
|
|
47
|
+
// GET /api/insights — placeholder
|
|
48
|
+
fastify.get('/insights', async () => {
|
|
49
|
+
return { data: [] };
|
|
50
|
+
});
|
|
51
|
+
// GET /api/stats/overview
|
|
52
|
+
fastify.get('/stats/overview', async (request) => {
|
|
53
|
+
const { from, to } = request.query;
|
|
54
|
+
const data = getOverviewStats(fastify.db, from ? new Date(from + 'T00:00:00') : undefined, to ? new Date(to + 'T23:59:59') : undefined);
|
|
55
|
+
return { data };
|
|
56
|
+
});
|
|
57
|
+
};
|
|
58
|
+
export default analyticsRoutes;
|
|
59
|
+
//# sourceMappingURL=analytics.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"analytics.js","sourceRoot":"","sources":["../../src/routes/analytics.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/routes/config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAA;AAkCjD,QAAA,MAAM,YAAY,EAAE,kBAkHnB,CAAA;AAED,eAAe,YAAY,CAAA"}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import os from 'node:os';
|
|
4
|
+
import { findSessionFiles, parseSession, indexSession, computeFileHash, sessionExistsByHash, listSessions, estimateCost, DEFAULT_PRICING, } from '@ccview/core';
|
|
5
|
+
const CONFIG_DIR = path.join(os.homedir(), '.ccview');
|
|
6
|
+
const CONFIG_PATH = path.join(CONFIG_DIR, 'config.json');
|
|
7
|
+
function readConfig() {
|
|
8
|
+
try {
|
|
9
|
+
const raw = fs.readFileSync(CONFIG_PATH, 'utf-8');
|
|
10
|
+
return JSON.parse(raw);
|
|
11
|
+
}
|
|
12
|
+
catch {
|
|
13
|
+
return {};
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
function writeConfig(config) {
|
|
17
|
+
if (!fs.existsSync(CONFIG_DIR)) {
|
|
18
|
+
fs.mkdirSync(CONFIG_DIR, { recursive: true });
|
|
19
|
+
}
|
|
20
|
+
fs.writeFileSync(CONFIG_PATH, JSON.stringify(config, null, 2), 'utf-8');
|
|
21
|
+
}
|
|
22
|
+
const configRoutes = async (fastify) => {
|
|
23
|
+
// GET /api/config
|
|
24
|
+
fastify.get('/config', async () => {
|
|
25
|
+
return { data: readConfig() };
|
|
26
|
+
});
|
|
27
|
+
// PUT /api/config
|
|
28
|
+
fastify.put('/config', async (request) => {
|
|
29
|
+
const current = readConfig();
|
|
30
|
+
const updated = { ...current, ...request.body };
|
|
31
|
+
writeConfig(updated);
|
|
32
|
+
return { data: updated };
|
|
33
|
+
});
|
|
34
|
+
// POST /api/sync
|
|
35
|
+
fastify.post('/sync', async (request, reply) => {
|
|
36
|
+
const force = request.body?.force ?? false;
|
|
37
|
+
try {
|
|
38
|
+
const claudePath = path.join(os.homedir(), '.claude');
|
|
39
|
+
const projectsDir = path.join(claudePath, 'projects');
|
|
40
|
+
const sessionFiles = await findSessionFiles(projectsDir);
|
|
41
|
+
let newSessions = 0;
|
|
42
|
+
let skipped = 0;
|
|
43
|
+
const errors = [];
|
|
44
|
+
for (const file of sessionFiles) {
|
|
45
|
+
try {
|
|
46
|
+
const hash = await computeFileHash(file.filePath);
|
|
47
|
+
if (!force && sessionExistsByHash(fastify.db, hash)) {
|
|
48
|
+
skipped++;
|
|
49
|
+
continue;
|
|
50
|
+
}
|
|
51
|
+
const parsed = await parseSession(file.filePath);
|
|
52
|
+
if (parsed.session.model) {
|
|
53
|
+
const pricing = DEFAULT_PRICING[parsed.session.model];
|
|
54
|
+
parsed.session.totalCostUsd = estimateCost(parsed.session.totalTokensIn, parsed.session.totalTokensOut, pricing);
|
|
55
|
+
}
|
|
56
|
+
indexSession(fastify.db, parsed, file.filePath, hash);
|
|
57
|
+
newSessions++;
|
|
58
|
+
}
|
|
59
|
+
catch (err) {
|
|
60
|
+
errors.push({
|
|
61
|
+
filePath: file.filePath,
|
|
62
|
+
error: err instanceof Error ? err.message : String(err),
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
return {
|
|
67
|
+
data: {
|
|
68
|
+
sessionsFound: sessionFiles.length,
|
|
69
|
+
newSessions,
|
|
70
|
+
skippedSessions: skipped,
|
|
71
|
+
errors,
|
|
72
|
+
},
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
catch (err) {
|
|
76
|
+
return reply.code(500).send({
|
|
77
|
+
error: 'Sync failed',
|
|
78
|
+
message: err instanceof Error ? err.message : String(err),
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
});
|
|
82
|
+
// GET /api/export
|
|
83
|
+
fastify.get('/export', async (request, reply) => {
|
|
84
|
+
const { format = 'json', project, from, to } = request.query;
|
|
85
|
+
const filters = { limit: 10000 };
|
|
86
|
+
if (project)
|
|
87
|
+
filters.project = project;
|
|
88
|
+
if (from)
|
|
89
|
+
filters.from = new Date(from);
|
|
90
|
+
if (to)
|
|
91
|
+
filters.to = new Date(to);
|
|
92
|
+
const sessions = listSessions(fastify.db, filters);
|
|
93
|
+
if (format === 'csv') {
|
|
94
|
+
const header = 'id,projectName,startedAt,endedAt,durationSeconds,totalTokensIn,totalTokensOut,totalCostUsd,totalSteps,model\n';
|
|
95
|
+
const rows = sessions.map((s) => [
|
|
96
|
+
s.id,
|
|
97
|
+
s.projectName ?? '',
|
|
98
|
+
s.startedAt.toISOString(),
|
|
99
|
+
s.endedAt?.toISOString() ?? '',
|
|
100
|
+
s.durationSeconds ?? '',
|
|
101
|
+
s.totalTokensIn,
|
|
102
|
+
s.totalTokensOut,
|
|
103
|
+
s.totalCostUsd,
|
|
104
|
+
s.totalSteps,
|
|
105
|
+
s.model ?? '',
|
|
106
|
+
].join(',')).join('\n');
|
|
107
|
+
return reply
|
|
108
|
+
.header('Content-Type', 'text/csv')
|
|
109
|
+
.header('Content-Disposition', 'attachment; filename="ccview-export.csv"')
|
|
110
|
+
.send(header + rows);
|
|
111
|
+
}
|
|
112
|
+
return reply
|
|
113
|
+
.header('Content-Type', 'application/json')
|
|
114
|
+
.header('Content-Disposition', 'attachment; filename="ccview-export.json"')
|
|
115
|
+
.send(JSON.stringify({ data: sessions }, null, 2));
|
|
116
|
+
});
|
|
117
|
+
};
|
|
118
|
+
export default configRoutes;
|
|
119
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/routes/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"projects.d.ts","sourceRoot":"","sources":["../../src/routes/projects.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAA;AAiBjD,QAAA,MAAM,cAAc,EAAE,kBA6CrB,CAAA;AAED,eAAe,cAAc,CAAA"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { listProjects, getProjectStats } from '@ccview/core';
|
|
2
|
+
function findProjectPathByName(db, name) {
|
|
3
|
+
const row = db.prepare(`SELECT path FROM projects WHERE name = ? LIMIT 1`).get(name);
|
|
4
|
+
return row?.path ?? null;
|
|
5
|
+
}
|
|
6
|
+
const projectsRoutes = async (fastify) => {
|
|
7
|
+
// GET /api/projects
|
|
8
|
+
fastify.get('/projects', async () => {
|
|
9
|
+
const projects = listProjects(fastify.db);
|
|
10
|
+
// Breakdown per modello per ogni progetto
|
|
11
|
+
const breakdownRows = fastify.db.prepare(`
|
|
12
|
+
SELECT
|
|
13
|
+
project_path,
|
|
14
|
+
COALESCE(model, 'unknown') as model,
|
|
15
|
+
SUM(total_tokens_in) as tokensIn,
|
|
16
|
+
SUM(total_tokens_out) as tokensOut,
|
|
17
|
+
SUM(total_cost_usd) as costUsd
|
|
18
|
+
FROM sessions
|
|
19
|
+
WHERE project_path IS NOT NULL
|
|
20
|
+
GROUP BY project_path, model
|
|
21
|
+
`).all();
|
|
22
|
+
// Indicizza per project_path
|
|
23
|
+
const breakdownMap = new Map();
|
|
24
|
+
for (const row of breakdownRows) {
|
|
25
|
+
const list = breakdownMap.get(row.project_path) ?? [];
|
|
26
|
+
list.push({ model: row.model, tokensIn: row.tokensIn, tokensOut: row.tokensOut, costUsd: row.costUsd });
|
|
27
|
+
breakdownMap.set(row.project_path, list);
|
|
28
|
+
}
|
|
29
|
+
const enriched = projects.map((p) => ({
|
|
30
|
+
...p,
|
|
31
|
+
modelBreakdown: breakdownMap.get(p.path) ?? [],
|
|
32
|
+
}));
|
|
33
|
+
return { data: enriched };
|
|
34
|
+
});
|
|
35
|
+
// GET /api/projects/:name/stats
|
|
36
|
+
fastify.get('/projects/:name/stats', async (request, reply) => {
|
|
37
|
+
const projectPath = findProjectPathByName(fastify.db, request.params.name);
|
|
38
|
+
if (!projectPath) {
|
|
39
|
+
return reply.code(404).send({ error: 'Project not found' });
|
|
40
|
+
}
|
|
41
|
+
const stats = getProjectStats(fastify.db, projectPath);
|
|
42
|
+
return { data: stats };
|
|
43
|
+
});
|
|
44
|
+
};
|
|
45
|
+
export default projectsRoutes;
|
|
46
|
+
//# sourceMappingURL=projects.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"projects.js","sourceRoot":"","sources":["../../src/routes/projects.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,cAAc,CAAA;AAG5D,SAAS,qBAAqB,CAAC,EAAqB,EAAE,IAAY;IAChE,MAAM,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,kDAAkD,CAAC,CAAC,GAAG,CAAC,IAAI,CAAiC,CAAA;IACpH,OAAO,GAAG,EAAE,IAAI,IAAI,IAAI,CAAA;AAC1B,CAAC;AAUD,MAAM,cAAc,GAAuB,KAAK,EAAE,OAAO,EAAE,EAAE;IAC3D,oBAAoB;IACpB,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,KAAK,IAAI,EAAE;QAClC,MAAM,QAAQ,GAAG,YAAY,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;QAEzC,0CAA0C;QAC1C,MAAM,aAAa,GAAG,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC;;;;;;;;;;KAUxC,CAAC,CAAC,GAAG,EAAyB,CAAA;QAE/B,6BAA6B;QAC7B,MAAM,YAAY,GAAG,IAAI,GAAG,EAAqF,CAAA;QACjH,KAAK,MAAM,GAAG,IAAI,aAAa,EAAE,CAAC;YAChC,MAAM,IAAI,GAAG,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,EAAE,CAAA;YACrD,IAAI,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,CAAC,QAAQ,EAAE,SAAS,EAAE,GAAG,CAAC,SAAS,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC,CAAA;YACvG,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,YAAY,EAAE,IAAI,CAAC,CAAA;QAC1C,CAAC;QAED,MAAM,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC;YACzC,GAAG,CAAC;YACJ,cAAc,EAAE,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE;SAC/C,CAAC,CAAC,CAAA;QAEH,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAA;IAC3B,CAAC,CAAC,CAAA;IAEF,gCAAgC;IAChC,OAAO,CAAC,GAAG,CAER,uBAAuB,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE;QACnD,MAAM,WAAW,GAAG,qBAAqB,CAAC,OAAO,CAAC,EAAE,EAAE,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;QAC1E,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,mBAAmB,EAAE,CAAC,CAAA;QAC7D,CAAC;QACD,MAAM,KAAK,GAAG,eAAe,CAAC,OAAO,CAAC,EAAE,EAAE,WAAW,CAAC,CAAA;QACtD,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAA;IACxB,CAAC,CAAC,CAAA;AACJ,CAAC,CAAA;AAED,eAAe,cAAc,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sessions.d.ts","sourceRoot":"","sources":["../../src/routes/sessions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAA;AAIjD,QAAA,MAAM,cAAc,EAAE,kBAyErB,CAAA;AAED,eAAe,cAAc,CAAA"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { listSessions, getSessionById, listStepsBySession, listFileImpactsBySession } from '@ccview/core';
|
|
2
|
+
const sessionsRoutes = async (fastify) => {
|
|
3
|
+
// GET /api/sessions
|
|
4
|
+
fastify.get('/sessions', async (request, reply) => {
|
|
5
|
+
const { project, from, to, model, search, limit, offset } = request.query;
|
|
6
|
+
const filters = {};
|
|
7
|
+
if (project)
|
|
8
|
+
filters.project = project;
|
|
9
|
+
if (from)
|
|
10
|
+
filters.from = new Date(from + 'T00:00:00');
|
|
11
|
+
if (to)
|
|
12
|
+
filters.to = new Date(to + 'T23:59:59');
|
|
13
|
+
if (model)
|
|
14
|
+
filters.model = model;
|
|
15
|
+
if (search)
|
|
16
|
+
filters.search = search;
|
|
17
|
+
if (limit)
|
|
18
|
+
filters.limit = parseInt(limit, 10);
|
|
19
|
+
if (offset)
|
|
20
|
+
filters.offset = parseInt(offset, 10);
|
|
21
|
+
const sessions = listSessions(fastify.db, filters);
|
|
22
|
+
return { data: sessions, total: sessions.length };
|
|
23
|
+
});
|
|
24
|
+
// GET /api/sessions/:id
|
|
25
|
+
fastify.get('/sessions/:id', async (request, reply) => {
|
|
26
|
+
const session = getSessionById(fastify.db, request.params.id);
|
|
27
|
+
if (!session) {
|
|
28
|
+
return reply.code(404).send({ error: 'Session not found' });
|
|
29
|
+
}
|
|
30
|
+
return { data: session };
|
|
31
|
+
});
|
|
32
|
+
// PATCH /api/sessions/:id — aggiorna il nome (summary)
|
|
33
|
+
fastify.patch('/sessions/:id', async (request, reply) => {
|
|
34
|
+
const { id } = request.params;
|
|
35
|
+
const { summary } = request.body;
|
|
36
|
+
if (typeof summary !== 'string') {
|
|
37
|
+
return reply.code(400).send({ error: 'summary must be a string' });
|
|
38
|
+
}
|
|
39
|
+
const trimmed = summary.trim();
|
|
40
|
+
fastify.db.prepare(`UPDATE sessions SET summary = ? WHERE id = ?`).run(trimmed || null, id);
|
|
41
|
+
const updated = getSessionById(fastify.db, id);
|
|
42
|
+
if (!updated)
|
|
43
|
+
return reply.code(404).send({ error: 'Session not found' });
|
|
44
|
+
return { data: updated };
|
|
45
|
+
});
|
|
46
|
+
// GET /api/sessions/:id/steps
|
|
47
|
+
fastify.get('/sessions/:id/steps', async (request, reply) => {
|
|
48
|
+
const session = getSessionById(fastify.db, request.params.id);
|
|
49
|
+
if (!session) {
|
|
50
|
+
return reply.code(404).send({ error: 'Session not found' });
|
|
51
|
+
}
|
|
52
|
+
const steps = listStepsBySession(fastify.db, request.params.id);
|
|
53
|
+
return { data: steps };
|
|
54
|
+
});
|
|
55
|
+
// GET /api/sessions/:id/files
|
|
56
|
+
fastify.get('/sessions/:id/files', async (request, reply) => {
|
|
57
|
+
const session = getSessionById(fastify.db, request.params.id);
|
|
58
|
+
if (!session) {
|
|
59
|
+
return reply.code(404).send({ error: 'Session not found' });
|
|
60
|
+
}
|
|
61
|
+
const files = listFileImpactsBySession(fastify.db, request.params.id);
|
|
62
|
+
return { data: files };
|
|
63
|
+
});
|
|
64
|
+
};
|
|
65
|
+
export default sessionsRoutes;
|
|
66
|
+
//# sourceMappingURL=sessions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sessions.js","sourceRoot":"","sources":["../../src/routes/sessions.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../../src/routes/sync.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAA;AAkBjD,QAAA,MAAM,UAAU,EAAE,kBAuDjB,CAAA;AAED,eAAe,UAAU,CAAA"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { join } from 'node:path';
|
|
2
|
+
import { homedir } from 'node:os';
|
|
3
|
+
import { findSessionFiles, parseSession, indexSession, estimateCost, } from '@ccview/core';
|
|
4
|
+
import { DEFAULT_PRICING } from '@ccview/core';
|
|
5
|
+
const syncRoutes = async (fastify) => {
|
|
6
|
+
fastify.post('/sync', async (_request, _reply) => {
|
|
7
|
+
const db = fastify.db;
|
|
8
|
+
const projectsDir = join(homedir(), '.claude', 'projects');
|
|
9
|
+
// Mappa logPath -> log_hash delle sessioni già indicizzate
|
|
10
|
+
const existing = db
|
|
11
|
+
.prepare(`SELECT raw_log_path, log_hash FROM sessions WHERE raw_log_path IS NOT NULL`)
|
|
12
|
+
.all();
|
|
13
|
+
const existingMap = new Map(existing.map((r) => [r.raw_log_path, r.log_hash]));
|
|
14
|
+
const sessionFiles = await findSessionFiles(projectsDir);
|
|
15
|
+
const result = { added: 0, updated: 0, skipped: 0, errors: [] };
|
|
16
|
+
for (const file of sessionFiles) {
|
|
17
|
+
const existingHash = existingMap.get(file.filePath);
|
|
18
|
+
if (existingHash === file.hash) {
|
|
19
|
+
result.skipped++;
|
|
20
|
+
continue;
|
|
21
|
+
}
|
|
22
|
+
const isUpdate = existingMap.has(file.filePath);
|
|
23
|
+
try {
|
|
24
|
+
if (isUpdate) {
|
|
25
|
+
db.prepare(`DELETE FROM sessions WHERE raw_log_path = ?`).run(file.filePath);
|
|
26
|
+
}
|
|
27
|
+
const parsed = await parseSession(file.filePath);
|
|
28
|
+
if (parsed.session.model) {
|
|
29
|
+
const pricing = DEFAULT_PRICING[parsed.session.model];
|
|
30
|
+
parsed.session.totalCostUsd = estimateCost(parsed.session.totalTokensIn, parsed.session.totalTokensOut, pricing);
|
|
31
|
+
}
|
|
32
|
+
indexSession(db, parsed, file.filePath, file.hash);
|
|
33
|
+
if (isUpdate)
|
|
34
|
+
result.updated++;
|
|
35
|
+
else
|
|
36
|
+
result.added++;
|
|
37
|
+
}
|
|
38
|
+
catch (err) {
|
|
39
|
+
result.errors.push({
|
|
40
|
+
filePath: file.filePath,
|
|
41
|
+
error: err instanceof Error ? err.message : String(err),
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
return { data: result };
|
|
46
|
+
});
|
|
47
|
+
};
|
|
48
|
+
export default syncRoutes;
|
|
49
|
+
//# sourceMappingURL=sync.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync.js","sourceRoot":"","sources":["../../src/routes/sync.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@ccview/server",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Fastify API server for ccview — Claude Code session analytics",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"main": "./dist/index.js",
|
|
8
|
+
"files": [
|
|
9
|
+
"dist",
|
|
10
|
+
"web-dist"
|
|
11
|
+
],
|
|
12
|
+
"scripts": {
|
|
13
|
+
"build": "tsc",
|
|
14
|
+
"build:watch": "tsc --watch",
|
|
15
|
+
"copy-web": "node -e \"const{cpSync,mkdirSync}=require('fs');mkdirSync('./web-dist',{recursive:true});cpSync('../web/dist','./web-dist',{recursive:true,force:true});console.log('web-dist copied')\"",
|
|
16
|
+
"start": "node dist/index.js",
|
|
17
|
+
"typecheck": "tsc --noEmit",
|
|
18
|
+
"clean": "rm -rf dist web-dist"
|
|
19
|
+
},
|
|
20
|
+
"dependencies": {
|
|
21
|
+
"@ccview/core": "workspace:*",
|
|
22
|
+
"fastify": "^4.26.2",
|
|
23
|
+
"@fastify/cors": "^9.0.1",
|
|
24
|
+
"@fastify/static": "^7.0.4",
|
|
25
|
+
"fastify-plugin": "^4.5.1"
|
|
26
|
+
},
|
|
27
|
+
"devDependencies": {
|
|
28
|
+
"@types/better-sqlite3": "^7.6.10",
|
|
29
|
+
"@types/node": "^20.12.7",
|
|
30
|
+
"typescript": "^5.4.5"
|
|
31
|
+
},
|
|
32
|
+
"engines": {
|
|
33
|
+
"node": ">=18.0.0"
|
|
34
|
+
}
|
|
35
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
const n=Object.freeze(JSON.parse('{"displayName":"ABAP","fileTypes":["abap","ABAP"],"foldingStartMarker":"/\\\\*\\\\*|\\\\{\\\\s*$","foldingStopMarker":"\\\\*\\\\*/|^\\\\s*\\\\}","name":"abap","patterns":[{"captures":{"1":{"name":"punctuation.definition.comment.abap"}},"match":"^\\\\*.*\\\\n?","name":"comment.line.full.abap"},{"captures":{"1":{"name":"punctuation.definition.comment.abap"}},"match":"\\".*\\\\n?","name":"comment.line.partial.abap"},{"match":"(?<![^\\\\s])##.*?(?=([\\\\.:,\\\\s]))","name":"comment.line.pragma.abap"},{"match":"(?i)(?<=(?:\\\\s|~|-))(?<=(?:->|=>))([a-z_\\\\/][a-z_0-9\\\\/]*)(?=\\\\s+(?:=|\\\\+=|-=|\\\\*=|\\\\/=|&&=|&=)\\\\s+)","name":"variable.other.abap"},{"match":"\\\\b[0-9]+(\\\\b|\\\\.|,)","name":"constant.numeric.abap"},{"match":"(?ix)(^|\\\\s+)((PUBLIC|PRIVATE|PROTECTED)\\\\sSECTION)(?=\\\\s+|:|\\\\.)","name":"storage.modifier.class.abap"},{"begin":"(?<!\\\\\\\\)(\\\\|)(.*?)","beginCaptures":{"1":{"name":"constant.character.escape.abap"}},"end":"(?<!\\\\\\\\)(\\\\||(\\\\\\\\\\\\\\\\\\\\|))","endCaptures":{"1":{"name":"constant.character.escape.abap"}},"name":"string.interpolated.abap","patterns":[{"match":"({ )|( })","name":"constant.character.escape"},{"match":"\\\\\\\\\\\\|","name":"constant.character.escape.abap"},{"match":"(?ix)(?<=\\\\s)(align|alpha|case|country|currency|date|decimals|exponent|number|pad|sign|style|time|timestamp|timezone|width|xsd|zero)(?=\\\\s\\\\=)","name":"entity.name.property.stringtemplate.abap"},{"match":"(?ix)(?<=\\\\=\\\\s)(center|engineering|environment|in|iso|left|leftplus|leftspace|lower|no|out|raw|right|rightplus|rightspace|scale_preserving|scale_preserving_scientific|scientific|scientific_with_leading_zero|sign_as_postfix|simple|space|upper|user|yes)(?=\\\\s)","name":"entity.value.property.stringtemplate.abap"}]},{"begin":"\'","end":"\'","name":"string.quoted.single.abap","patterns":[{"match":"\'\'","name":"constant.character.escape.abap"}]},{"begin":"`","end":"`","name":"string.quoted.single.abap","patterns":[{"match":"``","name":"constant.character.escape.abap"}]},{"begin":"(?i)^\\\\s*(class)\\\\s([a-z_\\\\/][a-z_0-9\\\\/]*)","beginCaptures":{"1":{"name":"storage.type.block.abap"},"2":{"name":"entity.name.type.block.abap"}},"end":"\\\\s*\\\\.\\\\s*\\\\n?","name":"meta.block.begin.implementation.abap","patterns":[{"match":"(?ix)(^|\\\\s+)(definition|implementation|public|inheriting\\\\s+from|final|deferred|abstract|shared\\\\s+memory\\\\s+enabled|(global|local)*\\\\s*friends|(create\\\\s+(public|protected|private))|for\\\\s+behavior\\\\s+of|for\\\\s+testing|risk\\\\s+level\\\\s+(critical|dangerous|harmless))|duration\\\\s(short|medium|long)(?=\\\\s+|\\\\.)","name":"storage.modifier.class.abap"},{"begin":"(?=[A-Za-z_][A-Za-z0-9_]*)","contentName":"entity.name.type.block.abap","end":"(?![A-Za-z0-9_])","patterns":[{"include":"#generic_names"}]}]},{"begin":"(?ix)^\\\\s*(method)\\\\s(?:([a-z_\\\\/][a-z_0-9\\\\/]*)~)?([a-z_\\\\/][a-z_0-9\\\\/]*)","beginCaptures":{"1":{"name":"storage.type.block.abap"},"2":{"name":"entity.name.type.abap"},"3":{"name":"entity.name.function.abap"}},"end":"\\\\s*\\\\.\\\\s*\\\\n?","patterns":[{"match":"(?ix)(?<=^|\\\\s)(BY\\\\s+DATABASE(\\\\s+PROCEDURE|\\\\s+FUNCTION|\\\\s+GRAPH\\\\s+WORKSPACE)|BY\\\\s+KERNEL\\\\s+MODULE)(?=\\\\s+|\\\\.)","name":"storage.modifier.method.abap"},{"match":"(?ix)(?<=^|\\\\s)(FOR\\\\s+(HDB|LLANG))(?=\\\\s+|\\\\.)","name":"storage.modifier.method.abap"},{"match":"(?ix)(?<=\\\\s)(OPTIONS\\\\s+(READ-ONLY|DETERMINISTIC|SUPPRESS\\\\s+SYNTAX\\\\s+ERRORS))(?=\\\\s+|\\\\.)","name":"storage.modifier.method.abap"},{"match":"(?ix)(?<=^|\\\\s)(LANGUAGE\\\\s+(SQLSCRIPT|SQL|GRAPH))(?=\\\\s+|\\\\.)","name":"storage.modifier.method.abap"},{"captures":{"1":{"name":"storage.modifier.method.abap"}},"match":"(?ix)(?<=\\\\s)(USING)\\\\s+([a-z_\\\\/][a-z_0-9\\\\/=\\\\>]*)+(?=\\\\s+|\\\\.)"},{"begin":"(?=[A-Za-z_][A-Za-z0-9_]*)","end":"(?![A-Za-z0-9_])","patterns":[{"include":"#generic_names"}]}]},{"begin":"(?ix)^\\\\s*(INTERFACE)\\\\s([a-z_\\\\/][a-z_0-9\\\\/]*)","beginCaptures":{"1":{"name":"storage.type.block.abap"},"2":{"name":"entity.name.type.abap"}},"end":"\\\\s*\\\\.\\\\s*\\\\n?","patterns":[{"match":"(?ix)(?<=^|\\\\s)(DEFERRED|PUBLIC)(?=\\\\s+|\\\\.)","name":"storage.modifier.method.abap"}]},{"begin":"(?ix)^\\\\s*(FORM)\\\\s([a-z_\\\\/][a-z_0-9\\\\/\\\\-\\\\?]*)","beginCaptures":{"1":{"name":"storage.type.block.abap"},"2":{"name":"entity.name.type.abap"}},"end":"\\\\s*\\\\.\\\\s*\\\\n?","patterns":[{"match":"(?ix)(?<=^|\\\\s)(USING|TABLES|CHANGING|RAISING|IMPLEMENTATION|DEFINITION)(?=\\\\s+|\\\\.)","name":"storage.modifier.form.abap"},{"include":"#abaptypes"},{"include":"#keywords_followed_by_braces"}]},{"match":"(?i)(endclass|endmethod|endform|endinterface)","name":"storage.type.block.end.abap"},{"match":"(?i)(<[A-Za-z_][A-Za-z0-9_]*>)","name":"variable.other.field.symbol.abap"},{"include":"#keywords"},{"include":"#abap_constants"},{"include":"#reserved_names"},{"include":"#operators"},{"include":"#builtin_functions"},{"include":"#abaptypes"},{"include":"#system_fields"},{"include":"#sql_functions"},{"include":"#sql_types"}],"repository":{"abap_constants":{"match":"(?ix)(?<=\\\\s)(initial|null|@?space|@?abap_true|@?abap_false|@?abap_undefined|table_line|\\n %_final|%_hints|%_predefined|col_background|col_group|col_heading|col_key|col_negative|col_normal|col_positive|col_total|\\n\\t\\t\\t\\tadabas|as400|db2|db6|hdb|oracle|sybase|mssqlnt|pos_low|pos_high)(?=\\\\s|\\\\.|,)","name":"constant.language.abap"},"abaptypes":{"patterns":[{"match":"(?ix)\\\\s(abap_bool|string|xstring|any|clike|csequence|numeric|xsequence|decfloat|decfloat16|decfloat34|utclong|simple|int8|c|n|i|p|f|d|t|x)(?=\\\\s|\\\\.|,)","name":"support.type.abap"},{"match":"(?ix)\\\\s(TYPE|REF|TO|LIKE|LINE|OF|STRUCTURE|STANDARD|SORTED|HASHED|INDEX|TABLE|WITH|UNIQUE|NON-UNIQUE|SECONDARY|DEFAULT|KEY)(?=\\\\s|\\\\.|,)","name":"keyword.control.simple.abap"}]},"arithmetic_operator":{"match":"(?i)(?<=\\\\s)(\\\\+|\\\\-|\\\\*|\\\\*\\\\*|\\\\/|%|DIV|MOD|BIT-AND|BIT-OR|BIT-XOR|BIT-NOT)(?=\\\\s)","name":"keyword.control.simple.abap"},"builtin_functions":{"match":"(?ix)(?<=\\\\s)(abs|sign|ceil|floor|trunc|frac|acos|asin|atan|cos|sin|tan|cosh|sinh|tanh|exp|log|log10|sqrt|strlen|xstrlen|charlen|lines|numofchar|dbmaxlen|round|rescale|nmax|nmin|cmax|cmin|boolc|boolx|xsdbool|contains|contains_any_of|contains_any_not_of|matches|line_exists|ipow|char_off|count|count_any_of|count_any_not_of|distance|condense|concat_lines_of|escape|find|find_end|find_any_of|find_any_not_of|insert|match|repeat|replace|reverse|segment|shift_left|shift_right|substring|substring_after|substring_from|substring_before|substring_to|to_upper|to_lower|to_mixed|from_mixed|translate|bit-set|line_index)(?=\\\\()","name":"entity.name.function.builtin.abap"},"comparison_operator":{"match":"(?i)(?<=\\\\s)(<|>|<\\\\=|>\\\\=|\\\\=|<>|eq|ne|lt|le|gt|ge|cs|cp|co|cn|ca|na|ns|np|byte-co|byte-cn|byte-ca|byte-na|byte-cs|byte-ns|o|z|m)(?=\\\\s)","name":"keyword.control.simple.abap"},"control_keywords":{"match":"(?ix)(^|\\\\s)(\\n\\t at|case|catch|continue|do|elseif|else|endat|endcase|endcatch|enddo|endif|\\n\\t endloop|endon|endtry|endwhile|if|loop|on|raise|try|while)(?=\\\\s|\\\\.|:)","name":"keyword.control.flow.abap"},"generic_names":{"match":"[A-Za-z_][A-Za-z0-9_]*"},"keywords":{"patterns":[{"include":"#main_keywords"},{"include":"#text_symbols"},{"include":"#control_keywords"},{"include":"#keywords_followed_by_braces"}]},"keywords_followed_by_braces":{"captures":{"1":{"name":"keyword.control.simple.abap"},"2":{"name":"variable.other.abap"}},"match":"(?ix)\\\\b(data|value|field-symbol|final|reference|resumable)\\\\((<?[a-z_\\\\/][a-z_0-9\\\\/]*>?)\\\\)"},"logical_operator":{"match":"(?i)(?<=\\\\s)(not|or|and)(?=\\\\s)","name":"keyword.control.simple.abap"},"main_keywords":{"match":"(?ix)(?<=^|\\\\s)(\\nabap-source|\\nabstract|\\naccept|\\naccepting|\\naccess|\\naccording|\\naction|\\nactivation|\\nactual|\\nadd|\\nadd-corresponding|\\nadjacent|\\nafter|\\nalias|\\naliases|\\nall|\\nallocate|\\namdp|\\nanalysis|\\nanalyzer|\\nappend|\\nappending|\\napplication|\\narchive|\\narea|\\narithmetic|\\nas|\\nascending|\\nassert|\\nassign|\\nassigned|\\nassigning|\\nassociation|\\nasynchronous|\\nat|\\nattributes|\\nauthority|\\nauthority-check|\\nauthorization|\\nauto|\\nback|\\nbackground|\\nbackward|\\nbadi|\\nbase|\\nbefore|\\nbegin|\\nbehavior|\\nbetween|\\nbinary|\\nbit|\\nblank|\\nblanks|\\nblock|\\nblocks|\\nbound|\\nboundaries|\\nbounds|\\nboxed|\\nbreak|\\nbreak-point|\\nbuffer|\\nby|\\nbypassing|\\nbyte|\\nbyte-order|\\ncall|\\ncalling|\\ncast|\\ncasting|\\ncds|\\ncentered|\\nchange|\\nchanging|\\nchannels|\\nchar-to-hex|\\ncharacter|\\ncheck|\\ncheckbox|\\ncid|\\ncircular|\\nclass|\\nclass-data|\\nclass-events|\\nclass-method|\\nclass-methods|\\nclass-pool|\\ncleanup|\\nclear|\\nclient|\\nclients|\\nclock|\\nclone|\\nclose|\\ncnt|\\ncode|\\ncollect|\\ncolor|\\ncolumn|\\ncomment|\\ncomments|\\ncommit|\\ncommon|\\ncommunication|\\ncomparing|\\ncomponent|\\ncomponents|\\ncompression|\\ncompute|\\nconcatenate|\\ncond|\\ncondense|\\ncondition|\\nconnection|\\nconstant|\\nconstants|\\ncontext|\\ncontexts|\\ncontrol|\\ncontrols|\\nconv|\\nconversion|\\nconvert|\\ncopy|\\ncorresponding|\\ncount|\\ncountry|\\ncover|\\ncreate|\\ncurrency|\\ncurrent|\\ncursor|\\ncustomer-function|\\ndata|\\ndatabase|\\ndatainfo|\\ndataset|\\ndate|\\ndaylight|\\nddl|\\ndeallocate|\\ndecimals|\\ndeclarations|\\ndeep|\\ndefault|\\ndeferred|\\ndefine|\\ndelete|\\ndeleting|\\ndemand|\\ndescending|\\ndescribe|\\ndestination|\\ndetail|\\ndetermine|\\ndialog|\\ndid|\\ndirectory|\\ndiscarding|\\ndisplay|\\ndisplay-mode|\\ndistance|\\ndistinct|\\ndivide|\\ndivide-corresponding|\\ndummy|\\nduplicate|\\nduplicates|\\nduration|\\nduring|\\ndynpro|\\nedit|\\neditor-call|\\nempty|\\nenabled|\\nenabling|\\nencoding|\\nend|\\nend-enhancement-section|\\nend-of-definition|\\nend-of-page|\\nend-of-selection|\\nend-test-injection|\\nend-test-seam|\\nendenhancement|\\nendexec|\\nendfunction|\\nendian|\\nending|\\nendmodule|\\nendprovide|\\nendselect|\\nendwith|\\nenhancement|\\nenhancement-point|\\nenhancement-section|\\nenhancements|\\nentities|\\nentity|\\nentries|\\nentry|\\nenum|\\nequiv|\\nerrors|\\nescape|\\nescaping|\\nevent|\\nevents|\\nexact|\\nexcept|\\nexception|\\nexception-table|\\nexceptions|\\nexcluding|\\nexec|\\nexecute|\\nexists|\\nexit|\\nexit-command|\\nexpanding|\\nexplicit|\\nexponent|\\nexport|\\nexporting|\\nextended|\\nextension|\\nextract|\\nfail|\\nfailed|\\nfeatures|\\nfetch|\\nfield|\\nfield-groups|\\nfield-symbols|\\nfields|\\nfile|\\nfill|\\nfilter|\\nfilters|\\nfinal|\\nfind|\\nfirst|\\nfirst-line|\\nfixed-point|\\nflush|\\nfollowing|\\nfor|\\nformat|\\nforward|\\nfound|\\nframe|\\nframes|\\nfree|\\nfrom|\\nfull|\\nfunction|\\nfunction-pool|\\ngenerate|\\nget|\\ngiving|\\ngraph|\\ngroup|\\ngroups|\\nhandle|\\nhandler|\\nhashed|\\nhaving|\\nheader|\\nheaders|\\nheading|\\nhelp-id|\\nhelp-request|\\nhide|\\nhint|\\nhold|\\nhotspot|\\nicon|\\nid|\\nidentification|\\nidentifier|\\nignore|\\nignoring|\\nimmediately|\\nimplemented|\\nimplicit|\\nimport|\\nimporting|\\nin|\\ninactive|\\nincl|\\ninclude|\\nincludes|\\nincluding|\\nincrement|\\nindex|\\nindex-line|\\nindicators|\\ninfotypes|\\ninheriting|\\ninit|\\ninitial|\\ninitialization|\\ninner|\\ninput|\\ninsert|\\ninstance|\\ninstances|\\nintensified|\\ninterface|\\ninterface-pool|\\ninterfaces|\\ninternal|\\nintervals|\\ninto|\\ninverse|\\ninverted-date|\\nis|\\njob|\\njoin|\\nkeep|\\nkeeping|\\nkernel|\\nkey|\\nkeys|\\nkeywords|\\nkind|\\nlanguage|\\nlast|\\nlate|\\nlayout|\\nleading|\\nleave|\\nleft|\\nleft-justified|\\nlegacy|\\nlength|\\nlet|\\nlevel|\\nlevels|\\nlike|\\nline|\\nline-count|\\nline-selection|\\nline-size|\\nlinefeed|\\nlines|\\nlink|\\nlist|\\nlist-processing|\\nlistbox|\\nload|\\nload-of-program|\\nlocal|\\nlocale|\\nlock|\\nlocks|\\nlog-point|\\nlogical|\\nlower|\\nmapped|\\nmapping|\\nmargin|\\nmark|\\nmask|\\nmatch|\\nmatchcode|\\nmaximum|\\nmembers|\\nmemory|\\nmesh|\\nmessage|\\nmessage-id|\\nmessages|\\nmessaging|\\nmethod|\\nmethods|\\nmode|\\nmodif|\\nmodifier|\\nmodify|\\nmodule|\\nmove|\\nmove-corresponding|\\nmultiply|\\nmultiply-corresponding|\\nname|\\nnametab|\\nnative|\\nnested|\\nnesting|\\nnew|\\nnew-line|\\nnew-page|\\nnew-section|\\nnext|\\nno-display|\\nno-extension|\\nno-gap|\\nno-gaps|\\nno-grouping|\\nno-heading|\\nno-scrolling|\\nno-sign|\\nno-title|\\nno-zero|\\nnodes|\\nnon-unicode|\\nnon-unique|\\nnumber|\\nobject|\\nobjects|\\nobjmgr|\\nobligatory|\\noccurence|\\noccurences|\\noccurrence|\\noccurrences|\\noccurs|\\nof|\\noffset|\\non|\\nonly|\\nopen|\\noptional|\\noption|\\noptions|\\norder|\\nothers|\\nout|\\nouter|\\noutput|\\noutput-length|\\noverflow|\\noverlay|\\npack|\\npackage|\\npadding|\\npage|\\nparameter|\\nparameter-table|\\nparameters|\\npart|\\npartially|\\npcre|\\nperform|\\nperforming|\\npermissions|\\npf-status|\\nplaces|\\npool|\\nposition|\\npragmas|\\npreceding|\\nprecompiled|\\npreferred|\\npreserving|\\nprimary|\\nprint|\\nprint-control|\\nprivate|\\nprivileged|\\nprocedure|\\nprocess|\\nprogram|\\nproperty|\\nprotected|\\nprovide|\\npush|\\npushbutton|\\nput|\\nquery|\\nqueue-only|\\nqueueonly|\\nquickinfo|\\nradiobutton|\\nraising|\\nrange|\\nranges|\\nread|\\nread-only|\\nreceive|\\nreceived|\\nreceiving|\\nredefinition|\\nreduce|\\nref|\\nreference|\\nrefresh|\\nregex|\\nreject|\\nrenaming|\\nreplace|\\nreplacement|\\nreplacing|\\nreport|\\nreported|\\nrequest|\\nrequested|\\nrequired|\\nreserve|\\nreset|\\nresolution|\\nrespecting|\\nresponse|\\nrestore|\\nresult|\\nresults|\\nresumable|\\nresume|\\nretry|\\nreturn|\\nreturning|\\nright|\\nright-justified|\\nrollback|\\nrows|\\nrp-provide-from-last|\\nrun|\\nsap|\\nsap-spool|\\nsave|\\nsaving|\\nscan|\\nscreen|\\nscroll|\\nscroll-boundary|\\nscrolling|\\nsearch|\\nseconds|\\nsection|\\nselect|\\nselect-options|\\nselection|\\nselection-screen|\\nselection-set|\\nselection-sets|\\nselection-table|\\nselections|\\nsend|\\nseparate|\\nseparated|\\nsession|\\nset|\\nshared|\\nshift|\\nshortdump|\\nshortdump-id|\\nsign|\\nsimple|\\nsimulation|\\nsingle|\\nsize|\\nskip|\\nskipping|\\nsmart|\\nsome|\\nsort|\\nsortable|\\nsorted|\\nsource|\\nspecified|\\nsplit|\\nspool|\\nspots|\\nsql|\\nstable|\\nstamp|\\nstandard|\\nstart-of-selection|\\nstarting|\\nstate|\\nstatement|\\nstatements|\\nstatic|\\nstatics|\\nstatusinfo|\\nstep|\\nstep-loop|\\nstop|\\nstructure|\\nstructures|\\nstyle|\\nsubkey|\\nsubmatches|\\nsubmit|\\nsubroutine|\\nsubscreen|\\nsubstring|\\nsubtract|\\nsubtract-corresponding|\\nsuffix|\\nsum|\\nsummary|\\nsupplied|\\nsupply|\\nsuppress|\\nswitch|\\nsymbol|\\nsyntax-check|\\nsyntax-trace|\\nsystem-call|\\nsystem-exceptions|\\ntab|\\ntabbed|\\ntable|\\ntables|\\ntableview|\\ntabstrip|\\ntarget|\\ntask|\\ntasks|\\ntest|\\ntest-injection|\\ntest-seam|\\ntesting|\\ntext|\\ntextpool|\\nthen|\\nthrow|\\ntime|\\ntimes|\\ntitle|\\ntitlebar|\\nto|\\ntokens|\\ntop-lines|\\ntop-of-page|\\ntrace-file|\\ntrace-table|\\ntrailing|\\ntransaction|\\ntransfer|\\ntransformation|\\ntranslate|\\ntransporting|\\ntrmac|\\ntruncate|\\ntruncation|\\ntype|\\ntype-pool|\\ntype-pools|\\ntypes|\\nuline|\\nunassign|\\nunbounded|\\nunder|\\nunicode|\\nunion|\\nunique|\\nunit|\\nunix|\\nunpack|\\nuntil|\\nunwind|\\nup|\\nupdate|\\nupper|\\nuser|\\nuser-command|\\nusing|\\nutf-8|\\nuuid|\\nvalid|\\nvalidate|\\nvalue|\\nvalue-request|\\nvalues|\\nvary|\\nvarying|\\nversion|\\nvia|\\nvisible|\\nwait|\\nwhen|\\nwhere|\\nwindow|\\nwindows|\\nwith|\\nwith-heading|\\nwith-title|\\nwithout|\\nword|\\nwork|\\nworkspace|\\nwrite|\\nxml|\\nzone\\n\\t\\t \\t)(?=\\\\s|\\\\.|:|,)","name":"keyword.control.simple.abap"},"operators":{"patterns":[{"include":"#other_operator"},{"include":"#arithmetic_operator"},{"include":"#comparison_operator"},{"include":"#logical_operator"}]},"other_operator":{"match":"(?<=\\\\s)(&&|&|\\\\?=|\\\\+=|-=|\\\\/=|\\\\*=|&&=|&=)(?=\\\\s)","name":"keyword.control.simple.abap"},"reserved_names":{"match":"(?ix)(?<=\\\\s)(me|super)(?=\\\\s|\\\\.|,|->)","name":"constant.language.abap"},"sql_functions":{"match":"(?ix)(?<=\\\\s)(\\nabap_system_timezone|\\nabap_user_timezone|\\nabs|\\nadd_days|\\nadd_months|\\nallow_precision_loss|\\nas_geo_json|\\navg|\\nbintohex|\\ncast|\\nceil|\\ncoalesce|\\nconcat_with_space|\\nconcat|\\ncorr_spearman|\\ncorr|\\ncount|\\ncurrency_conversion|\\ndatn_add_days|\\ndatn_add_months|\\ndatn_days_between|\\ndats_add_days|\\ndats_add_months|\\ndats_days_between|\\ndats_from_datn|\\ndats_is_valid|\\ndats_tims_to_tstmp|\\ndats_to_datn|\\ndayname|\\ndays_between|\\ndense_rank|\\ndivision|\\ndiv|\\nextract_day|\\nextract_hour|\\nextract_minute|\\nextract_month|\\nextract_second|\\nextract_year|\\nfirst_value|\\nfloor|\\ngrouping|\\nhextobin|\\ninitcap|\\ninstr|\\nis_valid|\\nlag|\\nlast_value|\\nlead|\\nleft|\\nlength|\\nlike_regexpr|\\nlocate_regexpr_after|\\nlocate_regexpr|\\nlocate|\\nlower|\\nlpad|\\nltrim|\\nmax|\\nmedian|\\nmin|\\nmod|\\nmonthname|\\nntile|\\noccurrences_regexpr|\\nover|\\nproduct|\\nrank|\\nreplace_regexpr|\\nreplace|\\nrigth|\\nround|\\nrow_number|\\nrpad|\\nrtrim|\\nstddev|\\nstring_agg|\\nsubstring_regexpr|\\nsubstring|\\nsum|\\ntims_from_timn|\\ntims_is_valid|\\ntims_to_timn|\\nto_blob|\\nto_clob|\\ntstmp_add_seconds|\\ntstmp_current_utctimestamp|\\ntstmp_is_valid|\\ntstmp_seconds_between|\\ntstmp_to_dats|\\ntstmp_to_dst|\\ntstmp_to_tims|\\ntstmpl_from_utcl|\\ntstmpl_to_utcl|\\nunit_conversion|\\nupper|\\nutcl_add_seconds|\\nutcl_current|\\nutcl_seconds_between|\\nuuid|\\nvar|\\nweekday\\n )(?=\\\\()","name":"entity.name.function.sql.abap"},"sql_types":{"match":"(?ix)(?<=\\\\s)(char|clnt|cuky|curr|datn|dats|dec|decfloat16|decfloat34|fltp|int1|int2|int4|int8|lang|numc|quan|raw|sstring|timn|tims|unit|utclong)(?=\\\\s|\\\\(|\\\\))","name":"entity.name.type.sql.abap"},"system_fields":{"captures":{"1":{"name":"variable.language.abap"},"2":{"name":"variable.language.abap"}},"match":"(?ix)\\\\b(sy)-(abcde|batch|binpt|calld|callr|colno|cpage|cprog|cucol|curow|datar|datlo|datum|dayst|dbcnt|dbnam|dbsysc|dyngr|dynnr|fdayw|fdpos|host|index|langu|ldbpg|lilli|linct|linno|linsz|lisel|listi|loopc|lsind|macol|mandt|marow|modno|msgid|msgli|msgno|msgty|msgv[1-4]|opsysc|pagno|pfkey|repid|saprl|scols|slset|spono|srows|staco|staro|stepl|subrc|sysid|tabix|tcode|tfill|timlo|title|tleng|tvar[0-9]|tzone|ucomm|uline|uname|uzeit|vline|wtitl|zonlo)(?=\\\\.|\\\\s)"},"text_symbols":{"captures":{"1":{"name":"keyword.control.simple.abap"},"2":{"name":"constant.numeric.abap"}},"match":"(?ix)(?<=^|\\\\s)(text)-([A-Z0-9]{1,3})(?=\\\\s|\\\\.|:|,)"}},"scopeName":"source.abap"}')),e=[n];export{e as default};
|