@loxia-labs/loxia-autopilot-one 4.6.2 → 4.7.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/bin/cli.js +8 -0
- package/package.json +1 -1
- package/src/__tests__/autoUpdateConfig.test.js +44 -0
- package/src/__tests__/releaseWorkflow.test.js +72 -0
- package/src/interfaces/__tests__/accountRoutes.test.js +429 -0
- package/src/interfaces/__tests__/apiKeyManagerContract.test.js +39 -0
- package/src/interfaces/__tests__/authRoutes.test.js +8 -8
- package/src/interfaces/accountRoutes.js +250 -0
- package/src/interfaces/webServer.js +83 -32
- package/src/services/__tests__/apiKeyManager.test.js +4 -6
- package/src/services/__tests__/authCacheStore.test.js +118 -0
- package/src/services/apiKeyManager.js +12 -99
- package/src/services/authCacheStore.js +140 -0
- package/src/tools/__tests__/webTool.e2e.test.js +9 -1
- package/src/tools/webTool.js +20 -4
- package/src/utilities/__tests__/authCache.test.js +266 -0
- package/src/utilities/__tests__/secretsCipher.test.js +97 -0
- package/src/utilities/__tests__/updateNotifier.test.js +139 -0
- package/src/utilities/authCache.js +121 -0
- package/src/utilities/secretsCipher.js +116 -0
- package/src/utilities/updateNotifier.js +140 -0
- package/web-ui/build/index.html +2 -2
- package/web-ui/build/static/1c-CX8Slyuy.js +1 -0
- package/web-ui/build/static/abap-ByFP_7BL.js +1 -0
- package/web-ui/build/static/abnf-DO9lTflJ.js +1 -0
- package/web-ui/build/static/abnf-pQFXLUki.js +1 -0
- package/web-ui/build/static/accesslog-zbmvgYYy.js +1 -0
- package/web-ui/build/static/actionscript-CGSADvRR.js +1 -0
- package/web-ui/build/static/actionscript-DJxydOkG.js +1 -0
- package/web-ui/build/static/ada-C1GBdBmX.js +1 -0
- package/web-ui/build/static/ada-CYIJwIz6.js +1 -0
- package/web-ui/build/static/agda-BUBCs0Uq.js +1 -0
- package/web-ui/build/static/al-BjReRMC6.js +1 -0
- package/web-ui/build/static/angelscript-DOLMKLjX.js +1 -0
- package/web-ui/build/static/antlr4-Bu8OsL8S.js +1 -0
- package/web-ui/build/static/apache-n1bxew7r.js +1 -0
- package/web-ui/build/static/apacheconf-C5OspOQE.js +1 -0
- package/web-ui/build/static/apex-qUb6dg5p.js +1 -0
- package/web-ui/build/static/apl-B18h8M4O.js +1 -0
- package/web-ui/build/static/applescript-LLqxLsS0.js +1 -0
- package/web-ui/build/static/applescript-bW6TNKkP.js +1 -0
- package/web-ui/build/static/aql-D9MREtV9.js +1 -0
- package/web-ui/build/static/arcade-ZlvwpSV3.js +1 -0
- package/web-ui/build/static/arduino-BWoMsnYp.js +1 -0
- package/web-ui/build/static/arduino-mM6OXMgH.js +1 -0
- package/web-ui/build/static/arff-CJP3AwdL.js +1 -0
- package/web-ui/build/static/armasm-DxcYudrf.js +1 -0
- package/web-ui/build/static/asciidoc-B8dOaH5z.js +1 -0
- package/web-ui/build/static/asciidoc-C4o-XeNG.js +1 -0
- package/web-ui/build/static/asm6502-BLeKY4SL.js +1 -0
- package/web-ui/build/static/asmatmel-BYnE8jGi.js +1 -0
- package/web-ui/build/static/aspectj-vX7_GEBk.js +1 -0
- package/web-ui/build/static/aspnet-B1q_tMNw.js +1 -0
- package/web-ui/build/static/autohotkey-B_XBZG4P.js +1 -0
- package/web-ui/build/static/autohotkey-GyOypU7w.js +1 -0
- package/web-ui/build/static/autoit-BrMgC4Zp.js +1 -0
- package/web-ui/build/static/autoit-GvA8pxCa.js +1 -0
- package/web-ui/build/static/avisynth-wuoUPVPh.js +1 -0
- package/web-ui/build/static/avrasm-cI_H-qhQ.js +1 -0
- package/web-ui/build/static/avro-idl-C0ww38I4.js +1 -0
- package/web-ui/build/static/awk-D4AWwjGv.js +1 -0
- package/web-ui/build/static/axapta-knUSaGmt.js +1 -0
- package/web-ui/build/static/bash-C8l2zCmk.js +1 -0
- package/web-ui/build/static/bash-DXj2cElJ.js +1 -0
- package/web-ui/build/static/basic-B4zB2Qvl.js +1 -0
- package/web-ui/build/static/basic-Cp06c5UD.js +1 -0
- package/web-ui/build/static/batch-DswVOBab.js +1 -0
- package/web-ui/build/static/bbcode-BT0lX7B5.js +1 -0
- package/web-ui/build/static/bicep-Bt_6qKgS.js +1 -0
- package/web-ui/build/static/birb-BotQnNDI.js +1 -0
- package/web-ui/build/static/bison-iMByvPAu.js +1 -0
- package/web-ui/build/static/bnf-BLvXrrla.js +1 -0
- package/web-ui/build/static/bnf-DsZj3l-L.js +1 -0
- package/web-ui/build/static/brainfuck-CC1GhH39.js +1 -0
- package/web-ui/build/static/brainfuck-CaEkb1ts.js +1 -0
- package/web-ui/build/static/brightscript-BmAWk-eT.js +1 -0
- package/web-ui/build/static/bro-DkeeRbk2.js +1 -0
- package/web-ui/build/static/bsl-BYCojYBO.js +1 -0
- package/web-ui/build/static/c-D5lITjxk.js +1 -0
- package/web-ui/build/static/c-like-CkQeNTMK.js +1 -0
- package/web-ui/build/static/c-mpDaEuj4.js +1 -0
- package/web-ui/build/static/cal-Csy8fht-.js +1 -0
- package/web-ui/build/static/capnproto-CE-oCIvZ.js +1 -0
- package/web-ui/build/static/ceylon-D3eiRwxZ.js +1 -0
- package/web-ui/build/static/cfscript-CmcWItJj.js +1 -0
- package/web-ui/build/static/chaiscript-DkQ6SEAo.js +1 -0
- package/web-ui/build/static/cil-Ckcl1cVC.js +1 -0
- package/web-ui/build/static/clean-dxAJWNSD.js +1 -0
- package/web-ui/build/static/clojure-Bga69PRS.js +1 -0
- package/web-ui/build/static/clojure-C9Il189X.js +1 -0
- package/web-ui/build/static/clojure-repl-DF3B6Gsk.js +1 -0
- package/web-ui/build/static/cmake-BXIkFb9v.js +1 -0
- package/web-ui/build/static/cmake-_UbiBFhJ.js +1 -0
- package/web-ui/build/static/cobol-DupcTyV0.js +1 -0
- package/web-ui/build/static/coffeescript-8HO8_14O.js +1 -0
- package/web-ui/build/static/coffeescript-DPFzOoZ4.js +1 -0
- package/web-ui/build/static/concurnas-Cvabin0G.js +1 -0
- package/web-ui/build/static/coq-C1qSbAiV.js +1 -0
- package/web-ui/build/static/coq-D_Pc8ttu.js +1 -0
- package/web-ui/build/static/cos-57dtE8dv.js +1 -0
- package/web-ui/build/static/cpp-CFEgr9BN.js +1 -0
- package/web-ui/build/static/cpp-CYF-Z28E.js +1 -0
- package/web-ui/build/static/crmsh-zZn_yW59.js +1 -0
- package/web-ui/build/static/crystal-Bp0Z8JsU.js +1 -0
- package/web-ui/build/static/crystal-ReZiG2r4.js +1 -0
- package/web-ui/build/static/csharp-CqI_aPLc.js +1 -0
- package/web-ui/build/static/csharp-Da3XdCp1.js +1 -0
- package/web-ui/build/static/cshtml-BmmHjfHg.js +1 -0
- package/web-ui/build/static/csp-DpurwP5D.js +1 -0
- package/web-ui/build/static/csp-DyAchjDy.js +1 -0
- package/web-ui/build/static/css-DevpjMne.js +1 -0
- package/web-ui/build/static/css-extras-rYiN8G-4.js +1 -0
- package/web-ui/build/static/csv-BB8PxKBq.js +1 -0
- package/web-ui/build/static/cypher-t9vxQbyV.js +1 -0
- package/web-ui/build/static/d-BWuXShJ_.js +1 -0
- package/web-ui/build/static/d-C-KM8JAh.js +1 -0
- package/web-ui/build/static/dart-BubT57X6.js +1 -0
- package/web-ui/build/static/dart-u3opiHnb.js +1 -0
- package/web-ui/build/static/dataweave-De6gGz-5.js +1 -0
- package/web-ui/build/static/dax-WGOREtQE.js +1 -0
- package/web-ui/build/static/delphi-BmTWpSni.js +1 -0
- package/web-ui/build/static/dhall-D0oue5FQ.js +1 -0
- package/web-ui/build/static/diff-BtyaXg0g.js +1 -0
- package/web-ui/build/static/diff-W9I2f4Db.js +1 -0
- package/web-ui/build/static/django-Dbhnhgcb.js +1 -0
- package/web-ui/build/static/django-GmJzMqjX.js +1 -0
- package/web-ui/build/static/dns-xdZxee8h.js +1 -0
- package/web-ui/build/static/dns-zone-file-_MpgnK8X.js +1 -0
- package/web-ui/build/static/docker-Da7QHg_I.js +1 -0
- package/web-ui/build/static/dockerfile-C2QuoMkq.js +1 -0
- package/web-ui/build/static/dos-lFpn9qNL.js +1 -0
- package/web-ui/build/static/dot-Cp5lobKU.js +1 -0
- package/web-ui/build/static/dsconfig-C9kpqYHC.js +1 -0
- package/web-ui/build/static/dts-CkiHehKi.js +1 -0
- package/web-ui/build/static/dust-WajpfWv6.js +1 -0
- package/web-ui/build/static/ebnf-21h1Q35I.js +1 -0
- package/web-ui/build/static/ebnf-Dk00h-rc.js +1 -0
- package/web-ui/build/static/editorconfig-DCPpExvQ.js +1 -0
- package/web-ui/build/static/eiffel-CztIr2Hf.js +1 -0
- package/web-ui/build/static/ejs-BY8hFJJY.js +1 -0
- package/web-ui/build/static/elixir-C629vVWc.js +1 -0
- package/web-ui/build/static/elixir-DCZqZgdm.js +1 -0
- package/web-ui/build/static/elm-BMoYTwhJ.js +1 -0
- package/web-ui/build/static/elm-uRFvX7tF.js +1 -0
- package/web-ui/build/static/erb-ChZKaEOr.js +1 -0
- package/web-ui/build/static/erb-MkfZ5cYZ.js +1 -0
- package/web-ui/build/static/erlang-BghmkCmj.js +1 -0
- package/web-ui/build/static/erlang-D17FIDAb.js +1 -0
- package/web-ui/build/static/erlang-repl-4vYQtS7W.js +1 -0
- package/web-ui/build/static/etlua-DbiM7eh2.js +1 -0
- package/web-ui/build/static/excel-B4FK6fcP.js +1 -0
- package/web-ui/build/static/excel-formula-Cb0aSQ9r.js +1 -0
- package/web-ui/build/static/factor-B05Ayzf5.js +1 -0
- package/web-ui/build/static/false-wVcaJfkC.js +1 -0
- package/web-ui/build/static/firestore-security-rules-Bbv2kriy.js +1 -0
- package/web-ui/build/static/fix-0r7xZPtZ.js +1 -0
- package/web-ui/build/static/flix-C1BkiNOg.js +1 -0
- package/web-ui/build/static/flow-DAPQdrXD.js +1 -0
- package/web-ui/build/static/fortran-BCYjQoXS.js +1 -0
- package/web-ui/build/static/fortran-FE3G8IZd.js +1 -0
- package/web-ui/build/static/fsharp-BttHa9io.js +1 -0
- package/web-ui/build/static/fsharp-VwctmRYd.js +1 -0
- package/web-ui/build/static/ftl-B7oddpvt.js +1 -0
- package/web-ui/build/static/gams-CaxZUQ7u.js +1 -0
- package/web-ui/build/static/gap-DZB4QFEH.js +1 -0
- package/web-ui/build/static/gauss-MHopEXyb.js +1 -0
- package/web-ui/build/static/gcode-CLzojtUf.js +1 -0
- package/web-ui/build/static/gcode-CugoOoXS.js +1 -0
- package/web-ui/build/static/gdscript-DKnajFmn.js +1 -0
- package/web-ui/build/static/gedcom-CV7hn1hP.js +1 -0
- package/web-ui/build/static/gherkin-BitvJG6T.js +1 -0
- package/web-ui/build/static/gherkin-BnZJeipO.js +1 -0
- package/web-ui/build/static/git-CZH1XcUO.js +1 -0
- package/web-ui/build/static/glsl-CavDhmQa.js +1 -0
- package/web-ui/build/static/glsl-DQD1vrL6.js +1 -0
- package/web-ui/build/static/gml-CAd0UgxV.js +1 -0
- package/web-ui/build/static/gml-DZ85I0Pq.js +1 -0
- package/web-ui/build/static/gn-BiSQ_QEv.js +1 -0
- package/web-ui/build/static/go-DvTBJnhu.js +1 -0
- package/web-ui/build/static/go-bxBzOVIX.js +1 -0
- package/web-ui/build/static/go-module-u2R6Ghd5.js +1 -0
- package/web-ui/build/static/golo-DdZTtTc6.js +1 -0
- package/web-ui/build/static/gradle-vEIb9Hi2.js +1 -0
- package/web-ui/build/static/graphql-ReUpmrlX.js +1 -0
- package/web-ui/build/static/groovy-CFDSpKx8.js +1 -0
- package/web-ui/build/static/groovy-DRob46Gf.js +1 -0
- package/web-ui/build/static/haml-DQ4KGMuK.js +1 -0
- package/web-ui/build/static/haml-EfN0GwIO.js +1 -0
- package/web-ui/build/static/handlebars-B0YgHx-_.js +1 -0
- package/web-ui/build/static/handlebars-BG9MCVU3.js +1 -0
- package/web-ui/build/static/haskell-BSiJOeA0.js +1 -0
- package/web-ui/build/static/haskell-CGj7MLnu.js +1 -0
- package/web-ui/build/static/haxe-DWn_RhOo.js +1 -0
- package/web-ui/build/static/haxe-UnD9jWjR.js +1 -0
- package/web-ui/build/static/hcl-DyAS_bHs.js +1 -0
- package/web-ui/build/static/hlsl-CNVHenLQ.js +1 -0
- package/web-ui/build/static/hoon-B2wREB7p.js +1 -0
- package/web-ui/build/static/hpkp-_IcMcoTr.js +1 -0
- package/web-ui/build/static/hsp--I0xmKjj.js +1 -0
- package/web-ui/build/static/hsts-DaPOEr_Y.js +1 -0
- package/web-ui/build/static/htmlbars-DpQoY5Go.js +1 -0
- package/web-ui/build/static/http-BAgt0PRY.js +1 -0
- package/web-ui/build/static/http-Sr0rAnJ0.js +1 -0
- package/web-ui/build/static/hy-EVsOEJWc.js +1 -0
- package/web-ui/build/static/ichigojam-DxINQRV1.js +1 -0
- package/web-ui/build/static/icon-Dyepwmyj.js +1 -0
- package/web-ui/build/static/icu-message-format-D5CgZ_sh.js +1 -0
- package/web-ui/build/static/idris-Cpk_1dNn.js +1 -0
- package/web-ui/build/static/iecst-Tklrp8WD.js +1 -0
- package/web-ui/build/static/ignore-BgYR5coN.js +1 -0
- package/web-ui/build/static/index-CVxFdlqk.js +1 -0
- package/web-ui/build/static/index-Cjbz2j4l.js +13 -0
- package/web-ui/build/static/index-Cr9q1fNq.css +1 -0
- package/web-ui/build/static/index-a1tUPLQt.js +1162 -0
- package/web-ui/build/static/inform7-BLoDkh5x.js +1 -0
- package/web-ui/build/static/inform7-Gkek9wv7.js +1 -0
- package/web-ui/build/static/ini-CSt-q-LU.js +1 -0
- package/web-ui/build/static/ini-DrzoiG54.js +1 -0
- package/web-ui/build/static/io-D_p06qo3.js +1 -0
- package/web-ui/build/static/irpf90-CPEKUyp2.js +1 -0
- package/web-ui/build/static/isbl-CP0nmt-H.js +1 -0
- package/web-ui/build/static/j-BFWMSghm.js +1 -0
- package/web-ui/build/static/java-K1oaNRy7.js +1 -0
- package/web-ui/build/static/java-dAiDxk1O.js +1 -0
- package/web-ui/build/static/javadoc-D5_ShfmN.js +1 -0
- package/web-ui/build/static/javadoclike-BBd68KGE.js +1 -0
- package/web-ui/build/static/javascript-C2TRVGHM.js +1 -0
- package/web-ui/build/static/javastacktrace-BlkLalxe.js +1 -0
- package/web-ui/build/static/jboss-cli-CoEbYnR6.js +1 -0
- package/web-ui/build/static/jexl-BL9D9K-1.js +1 -0
- package/web-ui/build/static/jolie-ahyASuPq.js +1 -0
- package/web-ui/build/static/jq-BOvPZk2x.js +1 -0
- package/web-ui/build/static/js-extras-D3dmvoL4.js +1 -0
- package/web-ui/build/static/js-templates-QgsLHkNh.js +1 -0
- package/web-ui/build/static/jsdoc-DCD5breD.js +1 -0
- package/web-ui/build/static/json-DzNuIYtp.js +1 -0
- package/web-ui/build/static/json-Y9pcY1NZ.js +1 -0
- package/web-ui/build/static/json5-BY00UoES.js +1 -0
- package/web-ui/build/static/jsonp-BT-kz7Qm.js +1 -0
- package/web-ui/build/static/jsstacktrace-axMY0dFx.js +1 -0
- package/web-ui/build/static/jsx-DXLiKT9d.js +1 -0
- package/web-ui/build/static/julia-Cjtnsv6K.js +1 -0
- package/web-ui/build/static/julia-Pw_e1mAP.js +1 -0
- package/web-ui/build/static/julia-repl-DIMI6CM0.js +1 -0
- package/web-ui/build/static/keepalived-Bcnw3S2E.js +1 -0
- package/web-ui/build/static/keyman-CbUN9w39.js +1 -0
- package/web-ui/build/static/kotlin-CGpA8LwS.js +1 -0
- package/web-ui/build/static/kotlin-CWtILFWe.js +1 -0
- package/web-ui/build/static/kumir-lf1U5wf9.js +1 -0
- package/web-ui/build/static/kusto-Csi7OUhD.js +1 -0
- package/web-ui/build/static/lasso-B1hWfYlJ.js +1 -0
- package/web-ui/build/static/latex-2Y9XfW0D.js +1 -0
- package/web-ui/build/static/latex-CmyvSmzv.js +1 -0
- package/web-ui/build/static/latte-DuTDO-zP.js +1 -0
- package/web-ui/build/static/ldif-DbXQA4Eh.js +1 -0
- package/web-ui/build/static/leaf-2NmRMS4h.js +1 -0
- package/web-ui/build/static/less-Bg6a0dbD.js +1 -0
- package/web-ui/build/static/less-v68uPo6s.js +1 -0
- package/web-ui/build/static/lilypond-DGsETYIr.js +1 -0
- package/web-ui/build/static/liquid-DUmPhMqf.js +1 -0
- package/web-ui/build/static/lisp-Dq7qhhOC.js +1 -0
- package/web-ui/build/static/lisp-n7ZoYaZB.js +1 -0
- package/web-ui/build/static/livecodeserver-DKp-Vg3o.js +1 -0
- package/web-ui/build/static/livescript-Bc0xsHtN.js +1 -0
- package/web-ui/build/static/livescript-DGam8ClS.js +1 -0
- package/web-ui/build/static/llvm-Buvuwjv7.js +1 -0
- package/web-ui/build/static/llvm-M94JxwSe.js +1 -0
- package/web-ui/build/static/log-DNUdJW3Q.js +1 -0
- package/web-ui/build/static/lolcode-AEvltoaL.js +1 -0
- package/web-ui/build/static/lsl-Dkc-0IN7.js +1 -0
- package/web-ui/build/static/lua-Bfri8IZA.js +1 -0
- package/web-ui/build/static/lua-D9CzfWk8.js +1 -0
- package/web-ui/build/static/magma-Bj1F_e-w.js +1 -0
- package/web-ui/build/static/makefile-CV1EU3rr.js +1 -0
- package/web-ui/build/static/makefile-CmJmmJbC.js +1 -0
- package/web-ui/build/static/markdown-BciE-W2A.js +1 -0
- package/web-ui/build/static/markdown-Cby2Kne0.js +1 -0
- package/web-ui/build/static/markup-templating-C2BLotzz.js +1 -0
- package/web-ui/build/static/mathematica-DvMoySHv.js +1 -0
- package/web-ui/build/static/matlab-B3XPXHyn.js +1 -0
- package/web-ui/build/static/matlab-S7v-rWnX.js +1 -0
- package/web-ui/build/static/maxima-CrL5RGot.js +1 -0
- package/web-ui/build/static/maxscript-Cz1FxhmA.js +1 -0
- package/web-ui/build/static/mel-BeinNQPi.js +1 -0
- package/web-ui/build/static/mel-DjaUDIBw.js +1 -0
- package/web-ui/build/static/mercury-CapU4A1b.js +1 -0
- package/web-ui/build/static/mermaid-D-6hLrkc.js +1 -0
- package/web-ui/build/static/mipsasm-D97E9V3D.js +1 -0
- package/web-ui/build/static/mizar-D5KX4WfW.js +1 -0
- package/web-ui/build/static/mizar-D8-uT09d.js +1 -0
- package/web-ui/build/static/mojolicious-UpHDgQyi.js +1 -0
- package/web-ui/build/static/mongodb-B9itzJ_c.js +1 -0
- package/web-ui/build/static/monkey-CJQoKMn0.js +1 -0
- package/web-ui/build/static/monkey-CmDSvk72.js +1 -0
- package/web-ui/build/static/moonscript-C3Y7q9ZG.js +1 -0
- package/web-ui/build/static/moonscript-CO9HEL_-.js +1 -0
- package/web-ui/build/static/n1ql-BCx02Pfk.js +1 -0
- package/web-ui/build/static/n1ql-dytzeuwS.js +1 -0
- package/web-ui/build/static/n4js-l6h7_oMC.js +1 -0
- package/web-ui/build/static/nand2tetris-hdl-Cd9s97O3.js +1 -0
- package/web-ui/build/static/naniscript-CeVT49ih.js +1 -0
- package/web-ui/build/static/nasm-BsRIArJc.js +1 -0
- package/web-ui/build/static/neon-8lRVh1Ys.js +1 -0
- package/web-ui/build/static/nevod-CwL48TO8.js +1 -0
- package/web-ui/build/static/nginx-D9gBoG-W.js +1 -0
- package/web-ui/build/static/nginx-Ug3C56El.js +1 -0
- package/web-ui/build/static/nim-BcLtM1HF.js +1 -0
- package/web-ui/build/static/nim-IuzgCNTD.js +1 -0
- package/web-ui/build/static/nix-BCR9d0oF.js +1 -0
- package/web-ui/build/static/nix-zC8ApXrK.js +1 -0
- package/web-ui/build/static/node-repl-1QNkPL7r.js +1 -0
- package/web-ui/build/static/nsis-BVXhe1OQ.js +1 -0
- package/web-ui/build/static/nsis-DIoGl7O7.js +1 -0
- package/web-ui/build/static/objectivec-Cn0seATa.js +1 -0
- package/web-ui/build/static/objectivec-Cwc3QGlF.js +1 -0
- package/web-ui/build/static/ocaml-Bm-7R8W_.js +1 -0
- package/web-ui/build/static/ocaml-DZm0MSBn.js +1 -0
- package/web-ui/build/static/opencl-ClqcfInT.js +1 -0
- package/web-ui/build/static/openqasm-DQOupnbB.js +1 -0
- package/web-ui/build/static/openscad-CAlcKTt_.js +1 -0
- package/web-ui/build/static/oxygene-h1qUhF_y.js +1 -0
- package/web-ui/build/static/oz--iJdW5aI.js +1 -0
- package/web-ui/build/static/parigp-CeMf2XY0.js +1 -0
- package/web-ui/build/static/parser-C_Rhe9tG.js +1 -0
- package/web-ui/build/static/parser3-CfIhIGzL.js +1 -0
- package/web-ui/build/static/pascal-UP6W9zuu.js +1 -0
- package/web-ui/build/static/pascaligo-CcuSIjaC.js +1 -0
- package/web-ui/build/static/pcaxis-pAIt3BoI.js +1 -0
- package/web-ui/build/static/peoplecode-BER09twz.js +1 -0
- package/web-ui/build/static/perl-Cs_xnzKV.js +1 -0
- package/web-ui/build/static/perl-D72eOwd-.js +1 -0
- package/web-ui/build/static/pf-CKTl5F-c.js +1 -0
- package/web-ui/build/static/pgsql-BZQolNb5.js +1 -0
- package/web-ui/build/static/php-BvGwAAS4.js +1 -0
- package/web-ui/build/static/php-CiB7pWfs.js +1 -0
- package/web-ui/build/static/php-extras-3oCvA2rf.js +1 -0
- package/web-ui/build/static/php-template-BSQTVokD.js +1 -0
- package/web-ui/build/static/phpdoc-5t4L9kjR.js +1 -0
- package/web-ui/build/static/plaintext-DZfTddVt.js +1 -0
- package/web-ui/build/static/plsql-DHwLFIXJ.js +1 -0
- package/web-ui/build/static/pony-LtDguIDM.js +1 -0
- package/web-ui/build/static/powerquery-awzDefEX.js +1 -0
- package/web-ui/build/static/powershell-BFEaYZKk.js +1 -0
- package/web-ui/build/static/powershell-D1KqKxmm.js +1 -0
- package/web-ui/build/static/processing-D4R55DGB.js +1 -0
- package/web-ui/build/static/processing-rS7yvBsw.js +1 -0
- package/web-ui/build/static/profile-BKJQvDU1.js +1 -0
- package/web-ui/build/static/prolog-ClYiwV6V.js +1 -0
- package/web-ui/build/static/prolog-DcMMCy3p.js +1 -0
- package/web-ui/build/static/promql-D9TfU9wi.js +1 -0
- package/web-ui/build/static/properties-CfjThyg6.js +1 -0
- package/web-ui/build/static/properties-DXyGPO56.js +1 -0
- package/web-ui/build/static/protobuf-CWQI1HF4.js +1 -0
- package/web-ui/build/static/protobuf-CdYaBGrs.js +1 -0
- package/web-ui/build/static/psl-Bv5Hyoad.js +1 -0
- package/web-ui/build/static/pug-C7KNYq-O.js +1 -0
- package/web-ui/build/static/puppet-CsNk0Ac_.js +1 -0
- package/web-ui/build/static/puppet-DoRcUtOe.js +1 -0
- package/web-ui/build/static/pure-WExaiHTK.js +1 -0
- package/web-ui/build/static/purebasic-D0zFsBy5.js +1 -0
- package/web-ui/build/static/purebasic-zb4Av5A6.js +1 -0
- package/web-ui/build/static/purescript-DC_tX0Fe.js +1 -0
- package/web-ui/build/static/python-Cdc6NQKV.js +1 -0
- package/web-ui/build/static/python-Cfl-IyWz.js +1 -0
- package/web-ui/build/static/python-repl-C_02knkl.js +1 -0
- package/web-ui/build/static/q-BTpWGy4U.js +1 -0
- package/web-ui/build/static/q-ighKuCL5.js +1 -0
- package/web-ui/build/static/qml-DbrxJa--.js +1 -0
- package/web-ui/build/static/qml-JtvE0qZI.js +1 -0
- package/web-ui/build/static/qore-CuJ1SiiK.js +1 -0
- package/web-ui/build/static/qsharp-B3juxol2.js +1 -0
- package/web-ui/build/static/r-DVCoE8oa.js +1 -0
- package/web-ui/build/static/r-DnhhElkt.js +1 -0
- package/web-ui/build/static/racket-CRc96T9l.js +1 -0
- package/web-ui/build/static/reason-Byd2boaL.js +1 -0
- package/web-ui/build/static/reasonml-T89JBGF3.js +1 -0
- package/web-ui/build/static/regex-CCYx_Lzk.js +1 -0
- package/web-ui/build/static/rego-CRTNtWNZ.js +1 -0
- package/web-ui/build/static/renpy-C68VY20r.js +1 -0
- package/web-ui/build/static/rest-Bv81man5.js +1 -0
- package/web-ui/build/static/rib-CH_vBpAb.js +1 -0
- package/web-ui/build/static/rip-B8JSgJKc.js +1 -0
- package/web-ui/build/static/roboconf-79wSii7N.js +1 -0
- package/web-ui/build/static/roboconf-BdGCg5RM.js +1 -0
- package/web-ui/build/static/robotframework-DN2rtDFM.js +1 -0
- package/web-ui/build/static/routeros-Cb3zmKRC.js +1 -0
- package/web-ui/build/static/rsl-BscS3yqi.js +1 -0
- package/web-ui/build/static/ruby-CMoWtmVY.js +1 -0
- package/web-ui/build/static/ruby-CR6eTwsn.js +1 -0
- package/web-ui/build/static/ruleslanguage-CN1a7i_9.js +1 -0
- package/web-ui/build/static/rust-CCwDPN5L.js +1 -0
- package/web-ui/build/static/rust-Cr3D4zI2.js +1 -0
- package/web-ui/build/static/sas-C7Tc773U.js +1 -0
- package/web-ui/build/static/sas-pYXw0yW1.js +1 -0
- package/web-ui/build/static/sass-BXCWeprT.js +1 -0
- package/web-ui/build/static/scala-BfCgC1jZ.js +1 -0
- package/web-ui/build/static/scala-Dzul6A2C.js +1 -0
- package/web-ui/build/static/scheme-CB7LecP9.js +1 -0
- package/web-ui/build/static/scheme-dgHnQkTX.js +1 -0
- package/web-ui/build/static/scilab-CNrYKluw.js +1 -0
- package/web-ui/build/static/scss-DIacZKvh.js +1 -0
- package/web-ui/build/static/scss-qx86tAuA.js +1 -0
- package/web-ui/build/static/shell-DI7kfPhX.js +1 -0
- package/web-ui/build/static/shell-session-DauOairG.js +1 -0
- package/web-ui/build/static/smali-C-MFzLlJ.js +1 -0
- package/web-ui/build/static/smali-CBjjRSrh.js +1 -0
- package/web-ui/build/static/smalltalk-BUeVqjaK.js +1 -0
- package/web-ui/build/static/smalltalk-BpRXW4JD.js +1 -0
- package/web-ui/build/static/smarty-CviZlIaF.js +1 -0
- package/web-ui/build/static/sml-CnPb1r9G.js +1 -0
- package/web-ui/build/static/sml-vdcheLP4.js +1 -0
- package/web-ui/build/static/solidity-BIoeKpmK.js +1 -0
- package/web-ui/build/static/solution-file-DN2GfETX.js +1 -0
- package/web-ui/build/static/soy-1iRuZ68D.js +1 -0
- package/web-ui/build/static/sparql-DpNKy3Qh.js +1 -0
- package/web-ui/build/static/splunk-spl-D7p0JtO1.js +1 -0
- package/web-ui/build/static/sqf-DzGb-kgq.js +1 -0
- package/web-ui/build/static/sqf-I5-3qPXy.js +1 -0
- package/web-ui/build/static/sql-CH3JEERs.js +1 -0
- package/web-ui/build/static/sql-DZx0D1pV.js +1 -0
- package/web-ui/build/static/sql_more-CJo9JseU.js +1 -0
- package/web-ui/build/static/squirrel-TPdt5Twt.js +1 -0
- package/web-ui/build/static/stan-BW23OiEC.js +1 -0
- package/web-ui/build/static/stan-C1X_122o.js +1 -0
- package/web-ui/build/static/stata-BkrDi-vH.js +1 -0
- package/web-ui/build/static/step21-w3LD46I8.js +1 -0
- package/web-ui/build/static/stylus-BOqpbZMO.js +1 -0
- package/web-ui/build/static/stylus-xQ41J98W.js +1 -0
- package/web-ui/build/static/subunit-Qo73JzWz.js +1 -0
- package/web-ui/build/static/swift-BGAyHECl.js +1 -0
- package/web-ui/build/static/swift-CzBG3wbY.js +1 -0
- package/web-ui/build/static/systemd-w7VyDz7h.js +1 -0
- package/web-ui/build/static/t4-cs-n0p8ynM0.js +1 -0
- package/web-ui/build/static/t4-templating-DtdMTfhS.js +1 -0
- package/web-ui/build/static/t4-vb-B83e2O1s.js +1 -0
- package/web-ui/build/static/taggerscript-DKaTnSi3.js +1 -0
- package/web-ui/build/static/tap-BGL6pUAS.js +1 -0
- package/web-ui/build/static/tap-CAGXYaf5.js +1 -0
- package/web-ui/build/static/tcl-BDCD9Wxg.js +1 -0
- package/web-ui/build/static/tcl-B_HjP1Wv.js +1 -0
- package/web-ui/build/static/textile-u5pL67xJ.js +1 -0
- package/web-ui/build/static/thrift-DHA4NkFg.js +1 -0
- package/web-ui/build/static/toml-BrlroJ9y.js +1 -0
- package/web-ui/build/static/tp-DfqF7q7J.js +1 -0
- package/web-ui/build/static/tremor-Bo875BVP.js +1 -0
- package/web-ui/build/static/tsx-NbbFMK_p.js +1 -0
- package/web-ui/build/static/tt2-CiauJgHm.js +1 -0
- package/web-ui/build/static/turtle-B1lTPGGF.js +1 -0
- package/web-ui/build/static/twig-BjkntuFz.js +1 -0
- package/web-ui/build/static/twig-CcYOHGzc.js +1 -0
- package/web-ui/build/static/typescript-C-Mv4KnI.js +1 -0
- package/web-ui/build/static/typescript-CosbLbyx.js +1 -0
- package/web-ui/build/static/typoscript-RByaFfO0.js +1 -0
- package/web-ui/build/static/unrealscript-CWN5JCj9.js +1 -0
- package/web-ui/build/static/uorazor-KAU3puYn.js +1 -0
- package/web-ui/build/static/uri-_USw_C0h.js +1 -0
- package/web-ui/build/static/v-B8dk96Yk.js +1 -0
- package/web-ui/build/static/vala-BrNlVgV4.js +1 -0
- package/web-ui/build/static/vala-LbSOd50F.js +1 -0
- package/web-ui/build/static/vbnet-BD6KJOjE.js +1 -0
- package/web-ui/build/static/vbnet-Dztp7Di6.js +1 -0
- package/web-ui/build/static/vbscript-BNYuRODB.js +1 -0
- package/web-ui/build/static/vbscript-html-W2p7VOYv.js +1 -0
- package/web-ui/build/static/velocity-DYzEKmc0.js +1 -0
- package/web-ui/build/static/verilog-C-UFLFJW.js +1 -0
- package/web-ui/build/static/verilog-tep1uMgI.js +1 -0
- package/web-ui/build/static/vhdl-BE5aeF9d.js +1 -0
- package/web-ui/build/static/vhdl-DwHBKbBo.js +1 -0
- package/web-ui/build/static/vim-BBpXzim_.js +1 -0
- package/web-ui/build/static/vim-CYkTFI0g.js +1 -0
- package/web-ui/build/static/visual-basic-qsFoqRlW.js +1 -0
- package/web-ui/build/static/warpscript-BVRgxBbf.js +1 -0
- package/web-ui/build/static/wasm-BUoRHz_g.js +1 -0
- package/web-ui/build/static/web-idl-BfkZ-0Zs.js +1 -0
- package/web-ui/build/static/wiki-Bw6aH4v4.js +1 -0
- package/web-ui/build/static/wolfram-CFK3ihnW.js +1 -0
- package/web-ui/build/static/wren-aAONXREJ.js +1 -0
- package/web-ui/build/static/x86asm-CT9pzq47.js +1 -0
- package/web-ui/build/static/xeora-6xq_xEfE.js +1 -0
- package/web-ui/build/static/xl-5qF2hdo7.js +1 -0
- package/web-ui/build/static/xml-BTWk7Jci.js +1 -0
- package/web-ui/build/static/xml-doc-D540qUoQ.js +1 -0
- package/web-ui/build/static/xojo-CQ1tIdjx.js +1 -0
- package/web-ui/build/static/xquery-CYnpm8sy.js +1 -0
- package/web-ui/build/static/xquery-DXDxMCpW.js +1 -0
- package/web-ui/build/static/yaml-Bs7_xHrY.js +1 -0
- package/web-ui/build/static/yaml-CMNnp9T5.js +1 -0
- package/web-ui/build/static/yang-CPWL_sCE.js +1 -0
- package/web-ui/build/static/zephir--ZB5wSH9.js +1 -0
- package/web-ui/build/static/zig-Cs8kdr0x.js +1 -0
- package/web-ui/build/static/1c-Cq-hwO_r.js +0 -1
- package/web-ui/build/static/abap-Bj3J92o0.js +0 -1
- package/web-ui/build/static/abnf-B7dRTyYV.js +0 -1
- package/web-ui/build/static/abnf-CgIeOKW_.js +0 -1
- package/web-ui/build/static/accesslog-Brfuws0y.js +0 -1
- package/web-ui/build/static/actionscript-BtQ2t5pu.js +0 -1
- package/web-ui/build/static/actionscript-goVL5Y6e.js +0 -1
- package/web-ui/build/static/ada-B-A6_5hH.js +0 -1
- package/web-ui/build/static/ada-BjgP_FtU.js +0 -1
- package/web-ui/build/static/agda-BacrCQWL.js +0 -1
- package/web-ui/build/static/al-BWbVu8rj.js +0 -1
- package/web-ui/build/static/angelscript-DcbXRun6.js +0 -1
- package/web-ui/build/static/antlr4-CcHtLL8K.js +0 -1
- package/web-ui/build/static/apache-OAiHHzpe.js +0 -1
- package/web-ui/build/static/apacheconf-C3A7Y_U1.js +0 -1
- package/web-ui/build/static/apex-BVwOQaEZ.js +0 -1
- package/web-ui/build/static/apl-PT43VQmo.js +0 -1
- package/web-ui/build/static/applescript-Dn1LkiWJ.js +0 -1
- package/web-ui/build/static/applescript-_6TXRPac.js +0 -1
- package/web-ui/build/static/aql-gfGf0_Pw.js +0 -1
- package/web-ui/build/static/arcade-C_48BaTr.js +0 -1
- package/web-ui/build/static/arduino-BBPz8-CO.js +0 -1
- package/web-ui/build/static/arduino-CC5iDbCS.js +0 -1
- package/web-ui/build/static/arff-DGjgQSVs.js +0 -1
- package/web-ui/build/static/armasm-jLweXbby.js +0 -1
- package/web-ui/build/static/asciidoc-BkdFS48t.js +0 -1
- package/web-ui/build/static/asciidoc-DsWN0DVy.js +0 -1
- package/web-ui/build/static/asm6502-Copj29i5.js +0 -1
- package/web-ui/build/static/asmatmel-xHtRNIqR.js +0 -1
- package/web-ui/build/static/aspectj-D6QKOTTR.js +0 -1
- package/web-ui/build/static/aspnet-UnARUlEV.js +0 -1
- package/web-ui/build/static/autohotkey-B5VwtEWA.js +0 -1
- package/web-ui/build/static/autohotkey-CqzTeM4m.js +0 -1
- package/web-ui/build/static/autoit-BfbzHKiS.js +0 -1
- package/web-ui/build/static/autoit-C32ox-vP.js +0 -1
- package/web-ui/build/static/avisynth-BbrT7kC0.js +0 -1
- package/web-ui/build/static/avrasm-xzyiZtVs.js +0 -1
- package/web-ui/build/static/avro-idl-Dv8xVlxB.js +0 -1
- package/web-ui/build/static/awk-CRy92Bde.js +0 -1
- package/web-ui/build/static/axapta-BkTCS6L7.js +0 -1
- package/web-ui/build/static/bash-B7mprhYC.js +0 -1
- package/web-ui/build/static/bash-CHvd-a4J.js +0 -1
- package/web-ui/build/static/basic-COP-ShrV.js +0 -1
- package/web-ui/build/static/basic-DtUei7pT.js +0 -1
- package/web-ui/build/static/batch-DJfB6_51.js +0 -1
- package/web-ui/build/static/bbcode-CpVKyEQ3.js +0 -1
- package/web-ui/build/static/bicep-CR06L3-R.js +0 -1
- package/web-ui/build/static/birb-DHy6KGuz.js +0 -1
- package/web-ui/build/static/bison-sYVGdmNK.js +0 -1
- package/web-ui/build/static/bnf-BhNWY88k.js +0 -1
- package/web-ui/build/static/bnf-Dl361XGv.js +0 -1
- package/web-ui/build/static/brainfuck-BipgMC6i.js +0 -1
- package/web-ui/build/static/brainfuck-DCrqBkOp.js +0 -1
- package/web-ui/build/static/brightscript-CZKGAj9D.js +0 -1
- package/web-ui/build/static/bro-Bn09ZJrJ.js +0 -1
- package/web-ui/build/static/bsl-DSmhgqqT.js +0 -1
- package/web-ui/build/static/c-C6b19vHL.js +0 -1
- package/web-ui/build/static/c-like-BBz63X23.js +0 -1
- package/web-ui/build/static/c-z2cXPHr7.js +0 -1
- package/web-ui/build/static/cal-dGf8L3bC.js +0 -1
- package/web-ui/build/static/capnproto-CKcdR_89.js +0 -1
- package/web-ui/build/static/ceylon-DKFd94eN.js +0 -1
- package/web-ui/build/static/cfscript-DSXMtUck.js +0 -1
- package/web-ui/build/static/chaiscript-CIaow3hF.js +0 -1
- package/web-ui/build/static/cil-DamWSUrE.js +0 -1
- package/web-ui/build/static/clean-DfoslqN2.js +0 -1
- package/web-ui/build/static/clojure-Ci0HAhFu.js +0 -1
- package/web-ui/build/static/clojure-MDpeBL7q.js +0 -1
- package/web-ui/build/static/clojure-repl-DUh15rdu.js +0 -1
- package/web-ui/build/static/cmake-Dd-PjbmJ.js +0 -1
- package/web-ui/build/static/cmake-kWFpJh0b.js +0 -1
- package/web-ui/build/static/cobol-CbdFN9Aq.js +0 -1
- package/web-ui/build/static/coffeescript-BOZvfZXe.js +0 -1
- package/web-ui/build/static/coffeescript-C8lkA6yF.js +0 -1
- package/web-ui/build/static/concurnas-DshY3dVP.js +0 -1
- package/web-ui/build/static/coq-BK5joHcg.js +0 -1
- package/web-ui/build/static/coq-BgDArCYV.js +0 -1
- package/web-ui/build/static/cos-BhytKs2e.js +0 -1
- package/web-ui/build/static/cpp-BR6BpY8m.js +0 -1
- package/web-ui/build/static/cpp-C_8wyEl5.js +0 -1
- package/web-ui/build/static/crmsh-nsUcp_iD.js +0 -1
- package/web-ui/build/static/crystal-BVuQ7y3a.js +0 -1
- package/web-ui/build/static/crystal-BdPQWPu8.js +0 -1
- package/web-ui/build/static/csharp-DcpW4AJy.js +0 -1
- package/web-ui/build/static/csharp-mtmelfWD.js +0 -1
- package/web-ui/build/static/cshtml-DJz-D0xI.js +0 -1
- package/web-ui/build/static/csp-BzQ5E6Bu.js +0 -1
- package/web-ui/build/static/csp-RdR17lsz.js +0 -1
- package/web-ui/build/static/css-eqtWHuIF.js +0 -1
- package/web-ui/build/static/css-extras-DRjniEBA.js +0 -1
- package/web-ui/build/static/csv-oiHAEGf8.js +0 -1
- package/web-ui/build/static/cypher-B6PhWZfQ.js +0 -1
- package/web-ui/build/static/d-BSc2vjoC.js +0 -1
- package/web-ui/build/static/d-VDcHLiun.js +0 -1
- package/web-ui/build/static/dart-0iSQS_b8.js +0 -1
- package/web-ui/build/static/dart-BxSSgaKE.js +0 -1
- package/web-ui/build/static/dataweave-By2gmS3t.js +0 -1
- package/web-ui/build/static/dax-Cywwleui.js +0 -1
- package/web-ui/build/static/delphi-C4FzpL-G.js +0 -1
- package/web-ui/build/static/dhall-DJpg1Rfk.js +0 -1
- package/web-ui/build/static/diff-B3nrWdii.js +0 -1
- package/web-ui/build/static/diff-BL-tsEUu.js +0 -1
- package/web-ui/build/static/django-DB_RWHoG.js +0 -1
- package/web-ui/build/static/django-DOIzlRmz.js +0 -1
- package/web-ui/build/static/dns-CTCuK0du.js +0 -1
- package/web-ui/build/static/dns-zone-file-Bt3PjwWE.js +0 -1
- package/web-ui/build/static/docker-I3c4bB6G.js +0 -1
- package/web-ui/build/static/dockerfile-DjTSGVMW.js +0 -1
- package/web-ui/build/static/dos-CGox9yfy.js +0 -1
- package/web-ui/build/static/dot-DH505s_O.js +0 -1
- package/web-ui/build/static/dsconfig-DaIKzJvX.js +0 -1
- package/web-ui/build/static/dts-DP0MVTrt.js +0 -1
- package/web-ui/build/static/dust-DdkQ8UXz.js +0 -1
- package/web-ui/build/static/ebnf-D_zXrsCu.js +0 -1
- package/web-ui/build/static/ebnf-Dz8XUjVl.js +0 -1
- package/web-ui/build/static/editorconfig-D5cETs6D.js +0 -1
- package/web-ui/build/static/eiffel-ByIQuBxb.js +0 -1
- package/web-ui/build/static/ejs-IXzNzC2K.js +0 -1
- package/web-ui/build/static/elixir-DF00X4Q5.js +0 -1
- package/web-ui/build/static/elixir-_YieNFnB.js +0 -1
- package/web-ui/build/static/elm-D5jCsD-F.js +0 -1
- package/web-ui/build/static/elm-XJZ3qBNS.js +0 -1
- package/web-ui/build/static/erb-CMWgsBAj.js +0 -1
- package/web-ui/build/static/erb-CXbzQc1j.js +0 -1
- package/web-ui/build/static/erlang-BvHlOHvL.js +0 -1
- package/web-ui/build/static/erlang-CH3e3Jau.js +0 -1
- package/web-ui/build/static/erlang-repl-Dguaz0rL.js +0 -1
- package/web-ui/build/static/etlua-oV9c6CTH.js +0 -1
- package/web-ui/build/static/excel-CZbfsO-6.js +0 -1
- package/web-ui/build/static/excel-formula-DiY7sLGv.js +0 -1
- package/web-ui/build/static/factor-DQEChkb5.js +0 -1
- package/web-ui/build/static/false-Dm19qogz.js +0 -1
- package/web-ui/build/static/firestore-security-rules-CtSQyWr3.js +0 -1
- package/web-ui/build/static/fix-D4XFpahA.js +0 -1
- package/web-ui/build/static/flix-D_JEQ32L.js +0 -1
- package/web-ui/build/static/flow-DszRmXf2.js +0 -1
- package/web-ui/build/static/fortran-CeLKOdH6.js +0 -1
- package/web-ui/build/static/fortran-D5myOCVB.js +0 -1
- package/web-ui/build/static/fsharp-DtPM_gy7.js +0 -1
- package/web-ui/build/static/fsharp-vIuj_Bnm.js +0 -1
- package/web-ui/build/static/ftl-BUNS0s6s.js +0 -1
- package/web-ui/build/static/gams-D2ylzdDl.js +0 -1
- package/web-ui/build/static/gap-rOFlfMs0.js +0 -1
- package/web-ui/build/static/gauss-DDZ3gI6i.js +0 -1
- package/web-ui/build/static/gcode-BoLQ70FH.js +0 -1
- package/web-ui/build/static/gcode-Cmt976qD.js +0 -1
- package/web-ui/build/static/gdscript-CjMnc0X2.js +0 -1
- package/web-ui/build/static/gedcom-B98412jq.js +0 -1
- package/web-ui/build/static/gherkin-BrFCuUxf.js +0 -1
- package/web-ui/build/static/gherkin-CRRvxB4F.js +0 -1
- package/web-ui/build/static/git-d8i2pvOD.js +0 -1
- package/web-ui/build/static/glsl-Bqgs46E0.js +0 -1
- package/web-ui/build/static/glsl-DnILOWIr.js +0 -1
- package/web-ui/build/static/gml-B0epsACN.js +0 -1
- package/web-ui/build/static/gml-Cab70aFo.js +0 -1
- package/web-ui/build/static/gn-C4OTHZKr.js +0 -1
- package/web-ui/build/static/go-hVwedUNS.js +0 -1
- package/web-ui/build/static/go-module-DH0W_eXA.js +0 -1
- package/web-ui/build/static/go-pngPoFXS.js +0 -1
- package/web-ui/build/static/golo-B0GO6QRK.js +0 -1
- package/web-ui/build/static/gradle-C1z9idoO.js +0 -1
- package/web-ui/build/static/graphql-0IbxsnF-.js +0 -1
- package/web-ui/build/static/groovy-7xkgnCzv.js +0 -1
- package/web-ui/build/static/groovy-D2Lh_JPf.js +0 -1
- package/web-ui/build/static/haml-CLxKE6PK.js +0 -1
- package/web-ui/build/static/haml-XunOjScz.js +0 -1
- package/web-ui/build/static/handlebars-C8jv0dUb.js +0 -1
- package/web-ui/build/static/handlebars-C99IfyoK.js +0 -1
- package/web-ui/build/static/haskell-CWzSiyT-.js +0 -1
- package/web-ui/build/static/haskell-DE01j0GM.js +0 -1
- package/web-ui/build/static/haxe-CyNgjHdQ.js +0 -1
- package/web-ui/build/static/haxe-DY-IsjV8.js +0 -1
- package/web-ui/build/static/hcl-C91f9mbi.js +0 -1
- package/web-ui/build/static/hlsl-Cg-aML-6.js +0 -1
- package/web-ui/build/static/hoon-DdsgJ1nD.js +0 -1
- package/web-ui/build/static/hpkp-BwnyfhJ5.js +0 -1
- package/web-ui/build/static/hsp-B9ns6-4O.js +0 -1
- package/web-ui/build/static/hsts-CK4xEuMd.js +0 -1
- package/web-ui/build/static/htmlbars-CbMJbzwi.js +0 -1
- package/web-ui/build/static/http-Dn6_x4um.js +0 -1
- package/web-ui/build/static/http-DzUrXUjn.js +0 -1
- package/web-ui/build/static/hy-BI4hrOPN.js +0 -1
- package/web-ui/build/static/ichigojam-DQAwFjHg.js +0 -1
- package/web-ui/build/static/icon-DljbjsmV.js +0 -1
- package/web-ui/build/static/icu-message-format-BScYu7Pd.js +0 -1
- package/web-ui/build/static/idris-DGuape_d.js +0 -1
- package/web-ui/build/static/iecst-BXVLJcgO.js +0 -1
- package/web-ui/build/static/ignore-gGv3YITN.js +0 -1
- package/web-ui/build/static/index-BSOED9wx.js +0 -1
- package/web-ui/build/static/index-Bsv2frSs.js +0 -1156
- package/web-ui/build/static/index-f5UnFSsY.css +0 -1
- package/web-ui/build/static/index-rjZBcJJ2.js +0 -13
- package/web-ui/build/static/inform7-B5U2RbzC.js +0 -1
- package/web-ui/build/static/inform7-Mg7P7aTg.js +0 -1
- package/web-ui/build/static/ini-BwDsaS_4.js +0 -1
- package/web-ui/build/static/ini-G5U3MIZ9.js +0 -1
- package/web-ui/build/static/io-Crvny-3e.js +0 -1
- package/web-ui/build/static/irpf90-CtDlYVwl.js +0 -1
- package/web-ui/build/static/isbl-DNyPUVU5.js +0 -1
- package/web-ui/build/static/j-CVdZprNZ.js +0 -1
- package/web-ui/build/static/java-XYNFUOGI.js +0 -1
- package/web-ui/build/static/java-uKcccJc4.js +0 -1
- package/web-ui/build/static/javadoc-_Zax_O1M.js +0 -1
- package/web-ui/build/static/javadoclike-BRZhh271.js +0 -1
- package/web-ui/build/static/javascript-CzrJKg-u.js +0 -1
- package/web-ui/build/static/javastacktrace-DtrXF-Hv.js +0 -1
- package/web-ui/build/static/jboss-cli-5JqyLvtS.js +0 -1
- package/web-ui/build/static/jexl-C533Rpgl.js +0 -1
- package/web-ui/build/static/jolie-Do8aKXGV.js +0 -1
- package/web-ui/build/static/jq-Dn9wFLd3.js +0 -1
- package/web-ui/build/static/js-extras-AGPxIHGE.js +0 -1
- package/web-ui/build/static/js-templates-DNtCgC87.js +0 -1
- package/web-ui/build/static/jsdoc-hwqCC4Lp.js +0 -1
- package/web-ui/build/static/json-DEoJAiqk.js +0 -1
- package/web-ui/build/static/json-ejWyt3_H.js +0 -1
- package/web-ui/build/static/json5-DlqfLQMJ.js +0 -1
- package/web-ui/build/static/jsonp-D6RoLXPZ.js +0 -1
- package/web-ui/build/static/jsstacktrace-B079OZqT.js +0 -1
- package/web-ui/build/static/jsx-DnNBZwen.js +0 -1
- package/web-ui/build/static/julia-DAxIO9Pp.js +0 -1
- package/web-ui/build/static/julia-DVj1XagP.js +0 -1
- package/web-ui/build/static/julia-repl-BocQ8nYs.js +0 -1
- package/web-ui/build/static/keepalived-BxAnMqU-.js +0 -1
- package/web-ui/build/static/keyman-BZzRV71X.js +0 -1
- package/web-ui/build/static/kotlin-DVWSyyWq.js +0 -1
- package/web-ui/build/static/kotlin-KCaDUqWq.js +0 -1
- package/web-ui/build/static/kumir-yffxUwae.js +0 -1
- package/web-ui/build/static/kusto-cV3zbdUQ.js +0 -1
- package/web-ui/build/static/lasso-DH3oyNiE.js +0 -1
- package/web-ui/build/static/latex-BAyzngso.js +0 -1
- package/web-ui/build/static/latex-BHWKh_46.js +0 -1
- package/web-ui/build/static/latte-Blg_W9F1.js +0 -1
- package/web-ui/build/static/ldif-CkmLAuCD.js +0 -1
- package/web-ui/build/static/leaf-wp91yycn.js +0 -1
- package/web-ui/build/static/less-BcVttCav.js +0 -1
- package/web-ui/build/static/less-DavWq8Ej.js +0 -1
- package/web-ui/build/static/lilypond-BDFQdugn.js +0 -1
- package/web-ui/build/static/liquid-CEmFNNn_.js +0 -1
- package/web-ui/build/static/lisp-CZ9xnOtp.js +0 -1
- package/web-ui/build/static/lisp-DmVNCT5A.js +0 -1
- package/web-ui/build/static/livecodeserver-CnTXXbyn.js +0 -1
- package/web-ui/build/static/livescript-YtsX-KsX.js +0 -1
- package/web-ui/build/static/livescript-q7M8NvRi.js +0 -1
- package/web-ui/build/static/llvm-BZSRO8TC.js +0 -1
- package/web-ui/build/static/llvm-CIH40boh.js +0 -1
- package/web-ui/build/static/log-Db10RsDZ.js +0 -1
- package/web-ui/build/static/lolcode-p4ZflfJp.js +0 -1
- package/web-ui/build/static/lsl-DXh7pjYJ.js +0 -1
- package/web-ui/build/static/lua-C31DMdf6.js +0 -1
- package/web-ui/build/static/lua-CDtNj-WJ.js +0 -1
- package/web-ui/build/static/magma-Do8lsoaB.js +0 -1
- package/web-ui/build/static/makefile-DgO7O4GE.js +0 -1
- package/web-ui/build/static/makefile-qXSN_Sq3.js +0 -1
- package/web-ui/build/static/markdown-0DVf96AH.js +0 -1
- package/web-ui/build/static/markdown-DUvwylNF.js +0 -1
- package/web-ui/build/static/markup-templating-BEgeUnJB.js +0 -1
- package/web-ui/build/static/mathematica-BpImSdDi.js +0 -1
- package/web-ui/build/static/matlab-Bq4Kg8f5.js +0 -1
- package/web-ui/build/static/matlab-cScwCPnu.js +0 -1
- package/web-ui/build/static/maxima-DFa27ffM.js +0 -1
- package/web-ui/build/static/maxscript-FgAXJWR-.js +0 -1
- package/web-ui/build/static/mel-BB_XdWST.js +0 -1
- package/web-ui/build/static/mel-BHQ0e9FG.js +0 -1
- package/web-ui/build/static/mercury-zXc4e900.js +0 -1
- package/web-ui/build/static/mermaid-BjJdX04L.js +0 -1
- package/web-ui/build/static/mipsasm-C_8B_olq.js +0 -1
- package/web-ui/build/static/mizar-BPgzC9n4.js +0 -1
- package/web-ui/build/static/mizar-KXBoNOjg.js +0 -1
- package/web-ui/build/static/mojolicious-UXIt_n7S.js +0 -1
- package/web-ui/build/static/mongodb-KNu-iplX.js +0 -1
- package/web-ui/build/static/monkey-DtKCan0H.js +0 -1
- package/web-ui/build/static/monkey-Sk9JV1i6.js +0 -1
- package/web-ui/build/static/moonscript-BHr1aT02.js +0 -1
- package/web-ui/build/static/moonscript-C4teXzGl.js +0 -1
- package/web-ui/build/static/n1ql-6RIanocw.js +0 -1
- package/web-ui/build/static/n1ql-ova2ScLZ.js +0 -1
- package/web-ui/build/static/n4js-c8rVS7Gf.js +0 -1
- package/web-ui/build/static/nand2tetris-hdl-cMjtYBkP.js +0 -1
- package/web-ui/build/static/naniscript-CH96wAj0.js +0 -1
- package/web-ui/build/static/nasm-DDq7TMhS.js +0 -1
- package/web-ui/build/static/neon-DpyKpY9y.js +0 -1
- package/web-ui/build/static/nevod-BFMPW4vr.js +0 -1
- package/web-ui/build/static/nginx-BSEzhEoc.js +0 -1
- package/web-ui/build/static/nginx-khKNIkjU.js +0 -1
- package/web-ui/build/static/nim-BTcQu8Ir.js +0 -1
- package/web-ui/build/static/nim-QHQEY_XP.js +0 -1
- package/web-ui/build/static/nix-CtfD19iA.js +0 -1
- package/web-ui/build/static/nix-DzFReDOl.js +0 -1
- package/web-ui/build/static/node-repl-DOV4aoOq.js +0 -1
- package/web-ui/build/static/nsis-DdeJutdb.js +0 -1
- package/web-ui/build/static/nsis-m7HKG8Ck.js +0 -1
- package/web-ui/build/static/objectivec-CaBwHUVA.js +0 -1
- package/web-ui/build/static/objectivec-E2Sxhpx3.js +0 -1
- package/web-ui/build/static/ocaml-CslucHZs.js +0 -1
- package/web-ui/build/static/ocaml-PdR-Fm5g.js +0 -1
- package/web-ui/build/static/opencl-BHnw4hIn.js +0 -1
- package/web-ui/build/static/openqasm-0Yg2K--f.js +0 -1
- package/web-ui/build/static/openscad-DHU3smLY.js +0 -1
- package/web-ui/build/static/oxygene-BHgytj3y.js +0 -1
- package/web-ui/build/static/oz-BDa_7LoZ.js +0 -1
- package/web-ui/build/static/parigp-BOLbAs8r.js +0 -1
- package/web-ui/build/static/parser-B8MrBRtL.js +0 -1
- package/web-ui/build/static/parser3-DHHKIy7l.js +0 -1
- package/web-ui/build/static/pascal-fr5fg72O.js +0 -1
- package/web-ui/build/static/pascaligo-Bv9ESutQ.js +0 -1
- package/web-ui/build/static/pcaxis-CTxT44xh.js +0 -1
- package/web-ui/build/static/peoplecode-DuP5YO5Z.js +0 -1
- package/web-ui/build/static/perl-CnR6UBSD.js +0 -1
- package/web-ui/build/static/perl-VrmtJoR5.js +0 -1
- package/web-ui/build/static/pf-CdAhDTlA.js +0 -1
- package/web-ui/build/static/pgsql-izKyeRmK.js +0 -1
- package/web-ui/build/static/php-D8b_lajG.js +0 -1
- package/web-ui/build/static/php-IMt6Ky04.js +0 -1
- package/web-ui/build/static/php-extras-BCkAoLIa.js +0 -1
- package/web-ui/build/static/php-template-CpWfthU5.js +0 -1
- package/web-ui/build/static/phpdoc-LFhMcc59.js +0 -1
- package/web-ui/build/static/plaintext-Cc8p1sBl.js +0 -1
- package/web-ui/build/static/plsql-CtgL-GEj.js +0 -1
- package/web-ui/build/static/pony-ChSK1r1W.js +0 -1
- package/web-ui/build/static/powerquery-Bq9CVFLv.js +0 -1
- package/web-ui/build/static/powershell-DJhVY7mv.js +0 -1
- package/web-ui/build/static/powershell-DPCxeA_C.js +0 -1
- package/web-ui/build/static/processing-BQVkx3d5.js +0 -1
- package/web-ui/build/static/processing-Dg6Vk1EX.js +0 -1
- package/web-ui/build/static/profile-DAego1Qs.js +0 -1
- package/web-ui/build/static/prolog-C8mW1ZKs.js +0 -1
- package/web-ui/build/static/prolog-DNoEuBy4.js +0 -1
- package/web-ui/build/static/promql-HvkXQ3ai.js +0 -1
- package/web-ui/build/static/properties-BvJceoSE.js +0 -1
- package/web-ui/build/static/properties-CSR6n3Kz.js +0 -1
- package/web-ui/build/static/protobuf-C9KfKNP5.js +0 -1
- package/web-ui/build/static/protobuf-CXLzTtwT.js +0 -1
- package/web-ui/build/static/psl-DobsNRGm.js +0 -1
- package/web-ui/build/static/pug-PmM-JpHf.js +0 -1
- package/web-ui/build/static/puppet-CqR72GAW.js +0 -1
- package/web-ui/build/static/puppet-yUfG4MKq.js +0 -1
- package/web-ui/build/static/pure-D7s0bBCy.js +0 -1
- package/web-ui/build/static/purebasic-C52FzmCB.js +0 -1
- package/web-ui/build/static/purebasic-DjkzVED2.js +0 -1
- package/web-ui/build/static/purescript-D1LK7z8k.js +0 -1
- package/web-ui/build/static/python-C97TWczR.js +0 -1
- package/web-ui/build/static/python-Dop4CVEu.js +0 -1
- package/web-ui/build/static/python-repl-WhdhfdYY.js +0 -1
- package/web-ui/build/static/q-C_oxjdmr.js +0 -1
- package/web-ui/build/static/q-GDjprcRB.js +0 -1
- package/web-ui/build/static/qml-BFTo3N5w.js +0 -1
- package/web-ui/build/static/qml-BVflF1jH.js +0 -1
- package/web-ui/build/static/qore-PUVehvIq.js +0 -1
- package/web-ui/build/static/qsharp-r1qD-Qml.js +0 -1
- package/web-ui/build/static/r-CfIF5NTF.js +0 -1
- package/web-ui/build/static/r-DExb8B6q.js +0 -1
- package/web-ui/build/static/racket-2pRnv9sU.js +0 -1
- package/web-ui/build/static/reason-D3le1Ik7.js +0 -1
- package/web-ui/build/static/reasonml-B_LPCqhs.js +0 -1
- package/web-ui/build/static/regex-CUJGaatT.js +0 -1
- package/web-ui/build/static/rego-D-EIm0D3.js +0 -1
- package/web-ui/build/static/renpy-D1xy8Iy-.js +0 -1
- package/web-ui/build/static/rest-CD69jFkK.js +0 -1
- package/web-ui/build/static/rib-CPUDHLwl.js +0 -1
- package/web-ui/build/static/rip-Cxeddhze.js +0 -1
- package/web-ui/build/static/roboconf-C2H4bOQQ.js +0 -1
- package/web-ui/build/static/roboconf-DBGmRhwT.js +0 -1
- package/web-ui/build/static/robotframework-DMqmmtCh.js +0 -1
- package/web-ui/build/static/routeros-BX8G8D7_.js +0 -1
- package/web-ui/build/static/rsl-DBR_c-1r.js +0 -1
- package/web-ui/build/static/ruby-CcHtNU-6.js +0 -1
- package/web-ui/build/static/ruby-wb1QW8WC.js +0 -1
- package/web-ui/build/static/ruleslanguage-aX2-7OxM.js +0 -1
- package/web-ui/build/static/rust-Bd2sp6pf.js +0 -1
- package/web-ui/build/static/rust-DVifCW-g.js +0 -1
- package/web-ui/build/static/sas-6QrlvVKK.js +0 -1
- package/web-ui/build/static/sas-ByAinTlk.js +0 -1
- package/web-ui/build/static/sass-BKQhUGnZ.js +0 -1
- package/web-ui/build/static/scala-BhSxUbI1.js +0 -1
- package/web-ui/build/static/scala-Dn8_PN1b.js +0 -1
- package/web-ui/build/static/scheme-DtqAbiCr.js +0 -1
- package/web-ui/build/static/scheme-HiyfIgoM.js +0 -1
- package/web-ui/build/static/scilab-SrFR1XYu.js +0 -1
- package/web-ui/build/static/scss-C7zap9cM.js +0 -1
- package/web-ui/build/static/scss-ztCHTX-C.js +0 -1
- package/web-ui/build/static/shell-CnNWN3oe.js +0 -1
- package/web-ui/build/static/shell-session-DztxruRN.js +0 -1
- package/web-ui/build/static/smali-CRW3Hn6u.js +0 -1
- package/web-ui/build/static/smali-Uc8xwa45.js +0 -1
- package/web-ui/build/static/smalltalk-BJAea-kO.js +0 -1
- package/web-ui/build/static/smalltalk-DMZhndty.js +0 -1
- package/web-ui/build/static/smarty-BRqtJvDf.js +0 -1
- package/web-ui/build/static/sml-B9lfSzv2.js +0 -1
- package/web-ui/build/static/sml-DNOuaX1q.js +0 -1
- package/web-ui/build/static/solidity-CGaCcZCi.js +0 -1
- package/web-ui/build/static/solution-file-WeOld1Kf.js +0 -1
- package/web-ui/build/static/soy-CZB6ZNvF.js +0 -1
- package/web-ui/build/static/sparql-Do2fgKpd.js +0 -1
- package/web-ui/build/static/splunk-spl-C6RHRf8q.js +0 -1
- package/web-ui/build/static/sqf-BcN5vl8t.js +0 -1
- package/web-ui/build/static/sqf-Dj_a7IxO.js +0 -1
- package/web-ui/build/static/sql-B87I-FaL.js +0 -1
- package/web-ui/build/static/sql-CQzFE9Uc.js +0 -1
- package/web-ui/build/static/sql_more-IfJrJKAw.js +0 -1
- package/web-ui/build/static/squirrel-BRCBHmD6.js +0 -1
- package/web-ui/build/static/stan-BkZcpomr.js +0 -1
- package/web-ui/build/static/stan-DWGK62T_.js +0 -1
- package/web-ui/build/static/stata-C2YxAJhZ.js +0 -1
- package/web-ui/build/static/step21-DYmM5W5o.js +0 -1
- package/web-ui/build/static/stylus-BOr2WgLI.js +0 -1
- package/web-ui/build/static/stylus-CUInBPw_.js +0 -1
- package/web-ui/build/static/subunit-Dg4frc3d.js +0 -1
- package/web-ui/build/static/swift-BjspT_iz.js +0 -1
- package/web-ui/build/static/swift-rTkDrEgC.js +0 -1
- package/web-ui/build/static/systemd-CRrXJX07.js +0 -1
- package/web-ui/build/static/t4-cs-XlWVo-Wn.js +0 -1
- package/web-ui/build/static/t4-templating-Dt1Cb58v.js +0 -1
- package/web-ui/build/static/t4-vb-D42ADTJB.js +0 -1
- package/web-ui/build/static/taggerscript-N3Ft4sxA.js +0 -1
- package/web-ui/build/static/tap-CSN85wMv.js +0 -1
- package/web-ui/build/static/tap-CnqkUDXA.js +0 -1
- package/web-ui/build/static/tcl-Bt3tSIZl.js +0 -1
- package/web-ui/build/static/tcl-DpH3RZy1.js +0 -1
- package/web-ui/build/static/textile-umRMpilC.js +0 -1
- package/web-ui/build/static/thrift-QmVqpkfA.js +0 -1
- package/web-ui/build/static/toml-DnpdwodL.js +0 -1
- package/web-ui/build/static/tp-C6DUhXUh.js +0 -1
- package/web-ui/build/static/tremor-CUlFpVPg.js +0 -1
- package/web-ui/build/static/tsx-DxkoiUWp.js +0 -1
- package/web-ui/build/static/tt2-DtlKol3c.js +0 -1
- package/web-ui/build/static/turtle-CXUTzYdG.js +0 -1
- package/web-ui/build/static/twig-CKDPuEw2.js +0 -1
- package/web-ui/build/static/twig-DyUVOKrP.js +0 -1
- package/web-ui/build/static/typescript-CoOCr-sy.js +0 -1
- package/web-ui/build/static/typescript-DWRTzUkQ.js +0 -1
- package/web-ui/build/static/typoscript-DYej8cr8.js +0 -1
- package/web-ui/build/static/unrealscript-BhLFmWwl.js +0 -1
- package/web-ui/build/static/uorazor-BSVFfcGU.js +0 -1
- package/web-ui/build/static/uri-C9AomfWW.js +0 -1
- package/web-ui/build/static/v-Cymts6Dt.js +0 -1
- package/web-ui/build/static/vala-Ba0VW_4J.js +0 -1
- package/web-ui/build/static/vala-DEgjPvtK.js +0 -1
- package/web-ui/build/static/vbnet-BARjUM89.js +0 -1
- package/web-ui/build/static/vbnet-BqQ_vQ6x.js +0 -1
- package/web-ui/build/static/vbscript-0MN-MWsT.js +0 -1
- package/web-ui/build/static/vbscript-html-ChxcfYOz.js +0 -1
- package/web-ui/build/static/velocity-D-GUSd2k.js +0 -1
- package/web-ui/build/static/verilog-B3i4ra9i.js +0 -1
- package/web-ui/build/static/verilog-Ceg4SzRV.js +0 -1
- package/web-ui/build/static/vhdl-CV-wCwb-.js +0 -1
- package/web-ui/build/static/vhdl-kOCdWLTF.js +0 -1
- package/web-ui/build/static/vim-CQKKnLA5.js +0 -1
- package/web-ui/build/static/vim-D_4b4vLF.js +0 -1
- package/web-ui/build/static/visual-basic-CivDY1tN.js +0 -1
- package/web-ui/build/static/warpscript-BrpGurFU.js +0 -1
- package/web-ui/build/static/wasm-D03CVhDa.js +0 -1
- package/web-ui/build/static/web-idl-Dkpybgl6.js +0 -1
- package/web-ui/build/static/wiki-bJYJ6Gpa.js +0 -1
- package/web-ui/build/static/wolfram-CGCN9m9E.js +0 -1
- package/web-ui/build/static/wren-A6lX_oDU.js +0 -1
- package/web-ui/build/static/x86asm-jW1AxoFe.js +0 -1
- package/web-ui/build/static/xeora-ClwjRZuP.js +0 -1
- package/web-ui/build/static/xl-D4Brj665.js +0 -1
- package/web-ui/build/static/xml-FLJc8kc_.js +0 -1
- package/web-ui/build/static/xml-doc-EGzalCQd.js +0 -1
- package/web-ui/build/static/xojo-CceyP-U4.js +0 -1
- package/web-ui/build/static/xquery-AqDaorVp.js +0 -1
- package/web-ui/build/static/xquery-CC4CdVPw.js +0 -1
- package/web-ui/build/static/yaml-CSGvIXJS.js +0 -1
- package/web-ui/build/static/yaml-Dv98V3q0.js +0 -1
- package/web-ui/build/static/yang-DEa3bQVw.js +0 -1
- package/web-ui/build/static/zephir-EbYOiPVH.js +0 -1
- package/web-ui/build/static/zig-DoeoftqW.js +0 -1
package/bin/cli.js
CHANGED
|
@@ -17,10 +17,18 @@ import { dirname, join } from 'path';
|
|
|
17
17
|
import { spawn } from 'child_process';
|
|
18
18
|
import { readFileSync } from 'fs';
|
|
19
19
|
import http from 'http';
|
|
20
|
+
import { runUpdateCheck } from '../src/utilities/updateNotifier.js';
|
|
20
21
|
|
|
21
22
|
const __filename = fileURLToPath(import.meta.url);
|
|
22
23
|
const __dirname = dirname(__filename);
|
|
23
24
|
|
|
25
|
+
// Fire the update-notifier check as soon as the process starts. The
|
|
26
|
+
// helper is non-blocking (it schedules a background fetch and reads
|
|
27
|
+
// from a tiny on-disk cache for the next run) and silently skips
|
|
28
|
+
// every failure mode — missing dep, no network, kill-switch env,
|
|
29
|
+
// not-globally-installed. Worst case: the banner just doesn't appear.
|
|
30
|
+
runUpdateCheck().catch(() => { /* never propagate */ });
|
|
31
|
+
|
|
24
32
|
// Default configuration
|
|
25
33
|
const DEFAULT_PORT = 8080;
|
|
26
34
|
// Use 127.0.0.1 instead of 'localhost' to avoid IPv6 issues in WSL2
|
package/package.json
CHANGED
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tripwire for the auto-update configuration in package.json.
|
|
3
|
+
*
|
|
4
|
+
* Catches the class of regression where someone bumps deps or
|
|
5
|
+
* re-formats the build block and accidentally drops:
|
|
6
|
+
* - the `update-notifier` runtime dep (CLI banner stops working)
|
|
7
|
+
* - the `electron-updater` optional dep (Electron updates stop)
|
|
8
|
+
* - the `build.publish` block (electron-builder stops generating
|
|
9
|
+
* latest.yml + electron-updater has nothing to read)
|
|
10
|
+
*
|
|
11
|
+
* If you intentionally remove any of these, update this test in the
|
|
12
|
+
* SAME commit and explain in the test diff why.
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
import { describe, test, expect } from '@jest/globals';
|
|
16
|
+
import { readFileSync } from 'node:fs';
|
|
17
|
+
import { join, dirname } from 'node:path';
|
|
18
|
+
import { fileURLToPath } from 'node:url';
|
|
19
|
+
|
|
20
|
+
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
21
|
+
const REPO_ROOT = join(__dirname, '..', '..');
|
|
22
|
+
const pkg = JSON.parse(readFileSync(join(REPO_ROOT, 'package.json'), 'utf8'));
|
|
23
|
+
|
|
24
|
+
describe('package.json — auto-update presence', () => {
|
|
25
|
+
test('update-notifier is in dependencies (CLI banner)', () => {
|
|
26
|
+
expect(pkg.dependencies).toBeDefined();
|
|
27
|
+
expect(pkg.dependencies['update-notifier']).toBeTruthy();
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
test('electron-updater is in optionalDependencies (Electron build only)', () => {
|
|
31
|
+
expect(pkg.optionalDependencies?.['electron-updater']).toBeTruthy();
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
test('electron-builder has a publish provider configured', () => {
|
|
35
|
+
expect(pkg.build).toBeDefined();
|
|
36
|
+
expect(Array.isArray(pkg.build.publish) || typeof pkg.build.publish === 'object').toBe(true);
|
|
37
|
+
const entries = Array.isArray(pkg.build.publish) ? pkg.build.publish : [pkg.build.publish];
|
|
38
|
+
expect(entries.length).toBeGreaterThan(0);
|
|
39
|
+
// electron-updater requires a `provider` field on each publish entry.
|
|
40
|
+
for (const entry of entries) {
|
|
41
|
+
expect(entry.provider).toBeTruthy();
|
|
42
|
+
}
|
|
43
|
+
});
|
|
44
|
+
});
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tripwire: the npm-publish workflow must NOT re-introduce
|
|
3
|
+
* `javascript-obfuscator` or any other source-modifying step that
|
|
4
|
+
* would defeat the explicit decision in commit removing obfuscation.
|
|
5
|
+
*
|
|
6
|
+
* If you genuinely want to bring obfuscation back, change this test
|
|
7
|
+
* AND record the rationale in the workflow's leading comment block.
|
|
8
|
+
* Don't just delete the test.
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
import { describe, test, expect } from '@jest/globals';
|
|
12
|
+
import { readFileSync, readdirSync } from 'node:fs';
|
|
13
|
+
import { join, dirname } from 'node:path';
|
|
14
|
+
import { fileURLToPath } from 'node:url';
|
|
15
|
+
|
|
16
|
+
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
17
|
+
const REPO_ROOT = join(__dirname, '..', '..');
|
|
18
|
+
const WORKFLOWS_DIR = join(REPO_ROOT, '.github', 'workflows');
|
|
19
|
+
|
|
20
|
+
const FORBIDDEN_IN_PUBLISH = [
|
|
21
|
+
'javascript-obfuscator',
|
|
22
|
+
'javascript_obfuscator',
|
|
23
|
+
];
|
|
24
|
+
|
|
25
|
+
describe('release workflows — obfuscation absence', () => {
|
|
26
|
+
test('publish-npm-trusted.yml contains no obfuscator install or invocation', () => {
|
|
27
|
+
const yaml = readFileSync(join(WORKFLOWS_DIR, 'publish-npm-trusted.yml'), 'utf8');
|
|
28
|
+
for (const needle of FORBIDDEN_IN_PUBLISH) {
|
|
29
|
+
// Tolerate the literal mention inside a comment block that
|
|
30
|
+
// documents the removal — but not in any other context.
|
|
31
|
+
const lines = yaml.split('\n');
|
|
32
|
+
const offending = lines
|
|
33
|
+
.map((line, idx) => ({ line, idx }))
|
|
34
|
+
.filter(({ line }) => line.includes(needle))
|
|
35
|
+
.filter(({ line }) => !/^\s*#/.test(line) && !/^\s*\/\//.test(line));
|
|
36
|
+
expect(offending).toEqual([]);
|
|
37
|
+
}
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
test('workflow YAML is syntactically valid (no orphaned steps)', () => {
|
|
41
|
+
const yaml = readFileSync(join(WORKFLOWS_DIR, 'publish-npm-trusted.yml'), 'utf8');
|
|
42
|
+
// We don't bundle a YAML parser into the CLI repo; a structural
|
|
43
|
+
// smoke test is enough to catch the most common form of breakage
|
|
44
|
+
// (deleting a step without removing the leading `- name:`).
|
|
45
|
+
const stepCount = (yaml.match(/^\s{4,6}- name:/gm) || []).length;
|
|
46
|
+
expect(stepCount).toBeGreaterThan(5);
|
|
47
|
+
// Each top-level step name should be followed by either `run:` or `uses:`
|
|
48
|
+
const lines = yaml.split('\n');
|
|
49
|
+
let pendingStepLine = null;
|
|
50
|
+
for (let i = 0; i < lines.length; i++) {
|
|
51
|
+
if (/^\s{4,6}- name:/.test(lines[i])) {
|
|
52
|
+
pendingStepLine = i;
|
|
53
|
+
} else if (pendingStepLine != null && /^\s{6,8}(run|uses):/.test(lines[i])) {
|
|
54
|
+
pendingStepLine = null;
|
|
55
|
+
} else if (pendingStepLine != null && /^\s{4,6}- /.test(lines[i])) {
|
|
56
|
+
throw new Error(`step at line ${pendingStepLine + 1} has no run/uses`);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
test('every yml file in .github/workflows parses (basic balance check)', () => {
|
|
62
|
+
const files = readdirSync(WORKFLOWS_DIR).filter(f => f.endsWith('.yml') || f.endsWith('.yaml'));
|
|
63
|
+
expect(files.length).toBeGreaterThan(0);
|
|
64
|
+
for (const f of files) {
|
|
65
|
+
const yaml = readFileSync(join(WORKFLOWS_DIR, f), 'utf8');
|
|
66
|
+
// Naive but useful: every workflow should have `jobs:` and at
|
|
67
|
+
// least one step.
|
|
68
|
+
expect(yaml).toMatch(/^jobs:/m);
|
|
69
|
+
expect(yaml).toMatch(/^\s+steps:/m);
|
|
70
|
+
}
|
|
71
|
+
});
|
|
72
|
+
});
|
|
@@ -0,0 +1,429 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tests for the account-proxy router on the local CLI server.
|
|
3
|
+
*
|
|
4
|
+
* These tests cover three categories of behavior:
|
|
5
|
+
*
|
|
6
|
+
* 1. Auth gating — every route MUST return 401 + `not_signed_in`
|
|
7
|
+
* when there's no JWT, never silently fall through to the
|
|
8
|
+
* backend with no auth.
|
|
9
|
+
*
|
|
10
|
+
* 2. JWT forwarding + envelope normalisation — when a JWT is
|
|
11
|
+
* present, the backend is called with a Bearer header, and
|
|
12
|
+
* every response (200, 404, 503, JSON-shape variations) lands
|
|
13
|
+
* in our standard `{ success, error?, code? }` envelope.
|
|
14
|
+
*
|
|
15
|
+
* 3. Handoff URL building — the FE never gets to pick which
|
|
16
|
+
* portal we redirect to, and the handoff is only ever the
|
|
17
|
+
* short-lived token, never the long-lived JWT.
|
|
18
|
+
*
|
|
19
|
+
* The router is constructed with injected `getJwt`, `getBrand`, and
|
|
20
|
+
* `fetchImpl` — no real HTTP, no real `lastAuthResult` plumbing.
|
|
21
|
+
*/
|
|
22
|
+
|
|
23
|
+
import { describe, test, expect, jest } from '@jest/globals';
|
|
24
|
+
import express from 'express';
|
|
25
|
+
import { createServer } from 'http';
|
|
26
|
+
import { createAccountRouter, ERROR_CODES, __test__ } from '../accountRoutes.js';
|
|
27
|
+
|
|
28
|
+
const SAMPLE_JWT = 'eyJ.sample.jwt';
|
|
29
|
+
const BACKEND_URL = 'https://backend.test';
|
|
30
|
+
|
|
31
|
+
async function startApp(handler) {
|
|
32
|
+
const app = express();
|
|
33
|
+
app.use(express.json());
|
|
34
|
+
handler(app);
|
|
35
|
+
const server = createServer(app);
|
|
36
|
+
await new Promise(r => server.listen(0, r));
|
|
37
|
+
return { server, baseUrl: `http://127.0.0.1:${server.address().port}` };
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
async function stop(server) { if (server) await new Promise(r => server.close(r)); }
|
|
41
|
+
|
|
42
|
+
function mountRouter({ jwt = SAMPLE_JWT, brand = 'autopilot', fetchImpl, logger = { warn: () => {} } } = {}) {
|
|
43
|
+
const router = createAccountRouter({
|
|
44
|
+
getJwt: () => jwt,
|
|
45
|
+
getBrand: () => brand,
|
|
46
|
+
backendBaseUrl: BACKEND_URL,
|
|
47
|
+
fetchImpl,
|
|
48
|
+
logger,
|
|
49
|
+
});
|
|
50
|
+
return async () => {
|
|
51
|
+
return startApp(app => app.use('/api/account', router));
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
// ────────────────────────────────────────────────────────────────────
|
|
56
|
+
// Constructor guards
|
|
57
|
+
// ────────────────────────────────────────────────────────────────────
|
|
58
|
+
describe('createAccountRouter — constructor', () => {
|
|
59
|
+
test('throws when getJwt is missing', () => {
|
|
60
|
+
expect(() => createAccountRouter({ getBrand: () => 'autopilot' })).toThrow(/getJwt/);
|
|
61
|
+
});
|
|
62
|
+
test('throws when getBrand is missing', () => {
|
|
63
|
+
expect(() => createAccountRouter({ getJwt: () => null })).toThrow(/getBrand/);
|
|
64
|
+
});
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
// ────────────────────────────────────────────────────────────────────
|
|
68
|
+
// Auth gating
|
|
69
|
+
// ────────────────────────────────────────────────────────────────────
|
|
70
|
+
describe('account routes — auth gating', () => {
|
|
71
|
+
test.each([
|
|
72
|
+
['GET', '/api/account/profile', undefined],
|
|
73
|
+
['GET', '/api/account/balance', undefined],
|
|
74
|
+
['GET', '/api/account/keys', undefined],
|
|
75
|
+
['POST', '/api/account/keys', { name: 'CI key' }],
|
|
76
|
+
['DELETE', '/api/account/keys/some-id', undefined],
|
|
77
|
+
['POST', '/api/account/handoff', {}],
|
|
78
|
+
])('%s %s returns 401 not_signed_in when JWT is absent', async (method, path, body) => {
|
|
79
|
+
const startServer = mountRouter({ jwt: null, fetchImpl: jest.fn() });
|
|
80
|
+
const { server, baseUrl } = await startServer();
|
|
81
|
+
try {
|
|
82
|
+
const r = await fetch(`${baseUrl}${path}`, {
|
|
83
|
+
method,
|
|
84
|
+
headers: { 'Content-Type': 'application/json' },
|
|
85
|
+
body: body !== undefined ? JSON.stringify(body) : undefined,
|
|
86
|
+
});
|
|
87
|
+
expect(r.status).toBe(401);
|
|
88
|
+
const json = await r.json();
|
|
89
|
+
expect(json.success).toBe(false);
|
|
90
|
+
expect(json.code).toBe(ERROR_CODES.NOT_SIGNED_IN);
|
|
91
|
+
} finally {
|
|
92
|
+
await stop(server);
|
|
93
|
+
}
|
|
94
|
+
});
|
|
95
|
+
|
|
96
|
+
test('backend is never called when JWT is absent', async () => {
|
|
97
|
+
const fetchImpl = jest.fn();
|
|
98
|
+
const startServer = mountRouter({ jwt: null, fetchImpl });
|
|
99
|
+
const { server, baseUrl } = await startServer();
|
|
100
|
+
try {
|
|
101
|
+
await fetch(`${baseUrl}/api/account/profile`);
|
|
102
|
+
expect(fetchImpl).not.toHaveBeenCalled();
|
|
103
|
+
} finally {
|
|
104
|
+
await stop(server);
|
|
105
|
+
}
|
|
106
|
+
});
|
|
107
|
+
});
|
|
108
|
+
|
|
109
|
+
// ────────────────────────────────────────────────────────────────────
|
|
110
|
+
// Profile + balance + keys list
|
|
111
|
+
// ────────────────────────────────────────────────────────────────────
|
|
112
|
+
describe('GET /api/account/profile', () => {
|
|
113
|
+
test('forwards JWT and returns normalized { user } even when backend returns flat user object', async () => {
|
|
114
|
+
const fetchImpl = jest.fn().mockResolvedValue({
|
|
115
|
+
ok: true, status: 200,
|
|
116
|
+
text: async () => JSON.stringify({ id: 'u-1', email: 'a@b.com' }),
|
|
117
|
+
});
|
|
118
|
+
const startServer = mountRouter({ fetchImpl });
|
|
119
|
+
const { server, baseUrl } = await startServer();
|
|
120
|
+
try {
|
|
121
|
+
const r = await fetch(`${baseUrl}/api/account/profile`);
|
|
122
|
+
expect(r.status).toBe(200);
|
|
123
|
+
const json = await r.json();
|
|
124
|
+
expect(json).toEqual({ success: true, user: { id: 'u-1', email: 'a@b.com' } });
|
|
125
|
+
expect(fetchImpl).toHaveBeenCalledTimes(1);
|
|
126
|
+
const [url, opts] = fetchImpl.mock.calls[0];
|
|
127
|
+
expect(url).toBe(`${BACKEND_URL}/auth/me`);
|
|
128
|
+
expect(opts.headers.Authorization).toBe(`Bearer ${SAMPLE_JWT}`);
|
|
129
|
+
} finally {
|
|
130
|
+
await stop(server);
|
|
131
|
+
}
|
|
132
|
+
});
|
|
133
|
+
|
|
134
|
+
test('passes nested { user } through unchanged', async () => {
|
|
135
|
+
const fetchImpl = jest.fn().mockResolvedValue({
|
|
136
|
+
ok: true, status: 200,
|
|
137
|
+
text: async () => JSON.stringify({ user: { id: 'u-2', email: 'c@d.com' } }),
|
|
138
|
+
});
|
|
139
|
+
const startServer = mountRouter({ fetchImpl });
|
|
140
|
+
const { server, baseUrl } = await startServer();
|
|
141
|
+
try {
|
|
142
|
+
const json = await (await fetch(`${baseUrl}/api/account/profile`)).json();
|
|
143
|
+
expect(json.user).toEqual({ id: 'u-2', email: 'c@d.com' });
|
|
144
|
+
} finally {
|
|
145
|
+
await stop(server);
|
|
146
|
+
}
|
|
147
|
+
});
|
|
148
|
+
});
|
|
149
|
+
|
|
150
|
+
describe('GET /api/account/balance', () => {
|
|
151
|
+
test('proxies to /account/profile and returns the body verbatim', async () => {
|
|
152
|
+
const fetchImpl = jest.fn().mockResolvedValue({
|
|
153
|
+
ok: true, status: 200,
|
|
154
|
+
text: async () => JSON.stringify({ balance: 12.34, plan: 'pro' }),
|
|
155
|
+
});
|
|
156
|
+
const startServer = mountRouter({ fetchImpl });
|
|
157
|
+
const { server, baseUrl } = await startServer();
|
|
158
|
+
try {
|
|
159
|
+
const r = await fetch(`${baseUrl}/api/account/balance`);
|
|
160
|
+
const json = await r.json();
|
|
161
|
+
expect(json).toEqual({ balance: 12.34, plan: 'pro' });
|
|
162
|
+
expect(fetchImpl.mock.calls[0][0]).toBe(`${BACKEND_URL}/account/profile`);
|
|
163
|
+
} finally {
|
|
164
|
+
await stop(server);
|
|
165
|
+
}
|
|
166
|
+
});
|
|
167
|
+
});
|
|
168
|
+
|
|
169
|
+
describe('GET /api/account/keys', () => {
|
|
170
|
+
test('returns the backend response verbatim', async () => {
|
|
171
|
+
const fetchImpl = jest.fn().mockResolvedValue({
|
|
172
|
+
ok: true, status: 200,
|
|
173
|
+
text: async () => JSON.stringify({ apiKeys: [{ id: 'k1', name: 'CI', status: 'active' }] }),
|
|
174
|
+
});
|
|
175
|
+
const startServer = mountRouter({ fetchImpl });
|
|
176
|
+
const { server, baseUrl } = await startServer();
|
|
177
|
+
try {
|
|
178
|
+
const r = await fetch(`${baseUrl}/api/account/keys`);
|
|
179
|
+
const json = await r.json();
|
|
180
|
+
expect(json.apiKeys).toHaveLength(1);
|
|
181
|
+
expect(fetchImpl.mock.calls[0][0]).toBe(`${BACKEND_URL}/auth/apikeys`);
|
|
182
|
+
} finally {
|
|
183
|
+
await stop(server);
|
|
184
|
+
}
|
|
185
|
+
});
|
|
186
|
+
});
|
|
187
|
+
|
|
188
|
+
// ────────────────────────────────────────────────────────────────────
|
|
189
|
+
// Key create — input validation + one-time-reveal pass-through
|
|
190
|
+
// ────────────────────────────────────────────────────────────────────
|
|
191
|
+
describe('POST /api/account/keys', () => {
|
|
192
|
+
test('400 + bad_request when name is missing', async () => {
|
|
193
|
+
const fetchImpl = jest.fn();
|
|
194
|
+
const startServer = mountRouter({ fetchImpl });
|
|
195
|
+
const { server, baseUrl } = await startServer();
|
|
196
|
+
try {
|
|
197
|
+
const r = await fetch(`${baseUrl}/api/account/keys`, {
|
|
198
|
+
method: 'POST',
|
|
199
|
+
headers: { 'Content-Type': 'application/json' },
|
|
200
|
+
body: JSON.stringify({}),
|
|
201
|
+
});
|
|
202
|
+
expect(r.status).toBe(400);
|
|
203
|
+
const json = await r.json();
|
|
204
|
+
expect(json.code).toBe(ERROR_CODES.BAD_REQUEST);
|
|
205
|
+
expect(fetchImpl).not.toHaveBeenCalled();
|
|
206
|
+
} finally {
|
|
207
|
+
await stop(server);
|
|
208
|
+
}
|
|
209
|
+
});
|
|
210
|
+
|
|
211
|
+
test('400 + bad_request when name is whitespace-only', async () => {
|
|
212
|
+
const startServer = mountRouter({ fetchImpl: jest.fn() });
|
|
213
|
+
const { server, baseUrl } = await startServer();
|
|
214
|
+
try {
|
|
215
|
+
const r = await fetch(`${baseUrl}/api/account/keys`, {
|
|
216
|
+
method: 'POST',
|
|
217
|
+
headers: { 'Content-Type': 'application/json' },
|
|
218
|
+
body: JSON.stringify({ name: ' ' }),
|
|
219
|
+
});
|
|
220
|
+
expect(r.status).toBe(400);
|
|
221
|
+
} finally {
|
|
222
|
+
await stop(server);
|
|
223
|
+
}
|
|
224
|
+
});
|
|
225
|
+
|
|
226
|
+
test('forwards trimmed name + optional expiresIn, returns one-time key', async () => {
|
|
227
|
+
const fetchImpl = jest.fn().mockResolvedValue({
|
|
228
|
+
ok: true, status: 201,
|
|
229
|
+
text: async () => JSON.stringify({
|
|
230
|
+
message: 'API key generated successfully',
|
|
231
|
+
apiKey: { id: 'k-new', name: 'mykey', key: 'lx_secretvalue', createdAt: '2026-05-11', expiresAt: null },
|
|
232
|
+
}),
|
|
233
|
+
});
|
|
234
|
+
const startServer = mountRouter({ fetchImpl });
|
|
235
|
+
const { server, baseUrl } = await startServer();
|
|
236
|
+
try {
|
|
237
|
+
const r = await fetch(`${baseUrl}/api/account/keys`, {
|
|
238
|
+
method: 'POST',
|
|
239
|
+
headers: { 'Content-Type': 'application/json' },
|
|
240
|
+
body: JSON.stringify({ name: ' mykey ', expiresIn: 30 }),
|
|
241
|
+
});
|
|
242
|
+
expect(r.status).toBe(201);
|
|
243
|
+
const json = await r.json();
|
|
244
|
+
expect(json.apiKey.key).toBe('lx_secretvalue');
|
|
245
|
+
const sentBody = JSON.parse(fetchImpl.mock.calls[0][1].body);
|
|
246
|
+
expect(sentBody.name).toBe('mykey');
|
|
247
|
+
expect(sentBody.expiresIn).toBe(30);
|
|
248
|
+
} finally {
|
|
249
|
+
await stop(server);
|
|
250
|
+
}
|
|
251
|
+
});
|
|
252
|
+
});
|
|
253
|
+
|
|
254
|
+
// ────────────────────────────────────────────────────────────────────
|
|
255
|
+
// Key revoke
|
|
256
|
+
// ────────────────────────────────────────────────────────────────────
|
|
257
|
+
describe('DELETE /api/account/keys/:id', () => {
|
|
258
|
+
test('rejects an id with unsafe characters before hitting the backend', async () => {
|
|
259
|
+
const fetchImpl = jest.fn();
|
|
260
|
+
const startServer = mountRouter({ fetchImpl });
|
|
261
|
+
const { server, baseUrl } = await startServer();
|
|
262
|
+
try {
|
|
263
|
+
// Express routes won't let `..` through directly, but
|
|
264
|
+
// `<script>` would. Either way, our regex blocks it.
|
|
265
|
+
const r = await fetch(`${baseUrl}/api/account/keys/bad%20id%21`, { method: 'DELETE' });
|
|
266
|
+
expect(r.status).toBe(400);
|
|
267
|
+
expect(fetchImpl).not.toHaveBeenCalled();
|
|
268
|
+
} finally {
|
|
269
|
+
await stop(server);
|
|
270
|
+
}
|
|
271
|
+
});
|
|
272
|
+
|
|
273
|
+
test('happy path proxies the revoke', async () => {
|
|
274
|
+
const fetchImpl = jest.fn().mockResolvedValue({
|
|
275
|
+
ok: true, status: 200,
|
|
276
|
+
text: async () => JSON.stringify({ message: 'API key revoked successfully' }),
|
|
277
|
+
});
|
|
278
|
+
const startServer = mountRouter({ fetchImpl });
|
|
279
|
+
const { server, baseUrl } = await startServer();
|
|
280
|
+
try {
|
|
281
|
+
const r = await fetch(`${baseUrl}/api/account/keys/abc-123_XYZ`, { method: 'DELETE' });
|
|
282
|
+
expect(r.status).toBe(200);
|
|
283
|
+
const [url, opts] = fetchImpl.mock.calls[0];
|
|
284
|
+
expect(url).toBe(`${BACKEND_URL}/auth/apikey/abc-123_XYZ`);
|
|
285
|
+
expect(opts.method).toBe('DELETE');
|
|
286
|
+
} finally {
|
|
287
|
+
await stop(server);
|
|
288
|
+
}
|
|
289
|
+
});
|
|
290
|
+
});
|
|
291
|
+
|
|
292
|
+
// ────────────────────────────────────────────────────────────────────
|
|
293
|
+
// Handoff URL
|
|
294
|
+
// ────────────────────────────────────────────────────────────────────
|
|
295
|
+
describe('POST /api/account/handoff', () => {
|
|
296
|
+
test('mints token via backend and returns autopilot portal URL with handoff query', async () => {
|
|
297
|
+
const fetchImpl = jest.fn().mockResolvedValue({
|
|
298
|
+
ok: true, status: 200,
|
|
299
|
+
text: async () => JSON.stringify({ handoff: 'handoff-token-xyz' }),
|
|
300
|
+
});
|
|
301
|
+
const startServer = mountRouter({ brand: 'autopilot', fetchImpl });
|
|
302
|
+
const { server, baseUrl } = await startServer();
|
|
303
|
+
try {
|
|
304
|
+
const r = await fetch(`${baseUrl}/api/account/handoff`, {
|
|
305
|
+
method: 'POST',
|
|
306
|
+
headers: { 'Content-Type': 'application/json' },
|
|
307
|
+
body: JSON.stringify({ destination: 'payment' }),
|
|
308
|
+
});
|
|
309
|
+
expect(r.status).toBe(200);
|
|
310
|
+
const json = await r.json();
|
|
311
|
+
expect(json.url).toBe('https://autopilot.loxia.ai/payment?handoff=handoff-token-xyz');
|
|
312
|
+
const fetchOpts = fetchImpl.mock.calls[0][1];
|
|
313
|
+
expect(fetchOpts.method).toBe('POST');
|
|
314
|
+
expect(JSON.parse(fetchOpts.body).purpose).toBe('portal-payment');
|
|
315
|
+
} finally {
|
|
316
|
+
await stop(server);
|
|
317
|
+
}
|
|
318
|
+
});
|
|
319
|
+
|
|
320
|
+
test('switches portal host for OnBuzz brand', async () => {
|
|
321
|
+
const fetchImpl = jest.fn().mockResolvedValue({
|
|
322
|
+
ok: true, status: 200,
|
|
323
|
+
text: async () => JSON.stringify({ handoff: 'tok' }),
|
|
324
|
+
});
|
|
325
|
+
const startServer = mountRouter({ brand: 'onbuzz', fetchImpl });
|
|
326
|
+
const { server, baseUrl } = await startServer();
|
|
327
|
+
try {
|
|
328
|
+
const json = await (await fetch(`${baseUrl}/api/account/handoff`, {
|
|
329
|
+
method: 'POST', headers: { 'Content-Type': 'application/json' }, body: '{}',
|
|
330
|
+
})).json();
|
|
331
|
+
expect(json.url.startsWith(__test__.PORTAL_URLS_BY_BRAND.onbuzz)).toBe(true);
|
|
332
|
+
} finally {
|
|
333
|
+
await stop(server);
|
|
334
|
+
}
|
|
335
|
+
});
|
|
336
|
+
|
|
337
|
+
test('falls back to "payment" when destination is unknown (closed allowlist)', async () => {
|
|
338
|
+
const fetchImpl = jest.fn().mockResolvedValue({
|
|
339
|
+
ok: true, status: 200,
|
|
340
|
+
text: async () => JSON.stringify({ handoff: 'tok' }),
|
|
341
|
+
});
|
|
342
|
+
const startServer = mountRouter({ fetchImpl });
|
|
343
|
+
const { server, baseUrl } = await startServer();
|
|
344
|
+
try {
|
|
345
|
+
const json = await (await fetch(`${baseUrl}/api/account/handoff`, {
|
|
346
|
+
method: 'POST', headers: { 'Content-Type': 'application/json' },
|
|
347
|
+
body: JSON.stringify({ destination: '../evil' }),
|
|
348
|
+
})).json();
|
|
349
|
+
// Unknown destination falls back to /payment, NOT echoed as /../evil
|
|
350
|
+
expect(json.url).toContain('/payment?handoff=');
|
|
351
|
+
expect(json.url).not.toContain('evil');
|
|
352
|
+
} finally {
|
|
353
|
+
await stop(server);
|
|
354
|
+
}
|
|
355
|
+
});
|
|
356
|
+
|
|
357
|
+
test('502 when backend response lacks handoff field', async () => {
|
|
358
|
+
const fetchImpl = jest.fn().mockResolvedValue({
|
|
359
|
+
ok: true, status: 200, text: async () => JSON.stringify({ something_else: 'x' }),
|
|
360
|
+
});
|
|
361
|
+
const startServer = mountRouter({ fetchImpl });
|
|
362
|
+
const { server, baseUrl } = await startServer();
|
|
363
|
+
try {
|
|
364
|
+
const r = await fetch(`${baseUrl}/api/account/handoff`, {
|
|
365
|
+
method: 'POST', headers: { 'Content-Type': 'application/json' }, body: '{}',
|
|
366
|
+
});
|
|
367
|
+
expect(r.status).toBe(502);
|
|
368
|
+
} finally {
|
|
369
|
+
await stop(server);
|
|
370
|
+
}
|
|
371
|
+
});
|
|
372
|
+
});
|
|
373
|
+
|
|
374
|
+
// ────────────────────────────────────────────────────────────────────
|
|
375
|
+
// Backend error translation
|
|
376
|
+
// ────────────────────────────────────────────────────────────────────
|
|
377
|
+
describe('proxy error envelopes', () => {
|
|
378
|
+
test('non-OK response is converted to { success:false, code:backend_error }', async () => {
|
|
379
|
+
const fetchImpl = jest.fn().mockResolvedValue({
|
|
380
|
+
ok: false, status: 500,
|
|
381
|
+
text: async () => JSON.stringify({ error: 'something broke' }),
|
|
382
|
+
});
|
|
383
|
+
const startServer = mountRouter({ fetchImpl });
|
|
384
|
+
const { server, baseUrl } = await startServer();
|
|
385
|
+
try {
|
|
386
|
+
const r = await fetch(`${baseUrl}/api/account/profile`);
|
|
387
|
+
expect(r.status).toBe(500);
|
|
388
|
+
const json = await r.json();
|
|
389
|
+
expect(json).toEqual({
|
|
390
|
+
success: false,
|
|
391
|
+
error: 'something broke',
|
|
392
|
+
code: ERROR_CODES.BACKEND_ERROR,
|
|
393
|
+
});
|
|
394
|
+
} finally {
|
|
395
|
+
await stop(server);
|
|
396
|
+
}
|
|
397
|
+
});
|
|
398
|
+
|
|
399
|
+
test('404 maps to code:not_found', async () => {
|
|
400
|
+
const fetchImpl = jest.fn().mockResolvedValue({
|
|
401
|
+
ok: false, status: 404,
|
|
402
|
+
text: async () => JSON.stringify({ error: 'nope' }),
|
|
403
|
+
});
|
|
404
|
+
const startServer = mountRouter({ fetchImpl });
|
|
405
|
+
const { server, baseUrl } = await startServer();
|
|
406
|
+
try {
|
|
407
|
+
const r = await fetch(`${baseUrl}/api/account/keys`);
|
|
408
|
+
expect(r.status).toBe(404);
|
|
409
|
+
const json = await r.json();
|
|
410
|
+
expect(json.code).toBe(ERROR_CODES.NOT_FOUND);
|
|
411
|
+
} finally {
|
|
412
|
+
await stop(server);
|
|
413
|
+
}
|
|
414
|
+
});
|
|
415
|
+
|
|
416
|
+
test('network failure becomes 503 + code:network_error', async () => {
|
|
417
|
+
const fetchImpl = jest.fn().mockRejectedValue(new Error('ECONNREFUSED'));
|
|
418
|
+
const startServer = mountRouter({ fetchImpl });
|
|
419
|
+
const { server, baseUrl } = await startServer();
|
|
420
|
+
try {
|
|
421
|
+
const r = await fetch(`${baseUrl}/api/account/profile`);
|
|
422
|
+
expect(r.status).toBe(503);
|
|
423
|
+
const json = await r.json();
|
|
424
|
+
expect(json.code).toBe(ERROR_CODES.NETWORK_ERROR);
|
|
425
|
+
} finally {
|
|
426
|
+
await stop(server);
|
|
427
|
+
}
|
|
428
|
+
});
|
|
429
|
+
});
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Contract test: methods that `webServer.js` calls on `ApiKeyManager`
|
|
3
|
+
* MUST exist on the real class.
|
|
4
|
+
*
|
|
5
|
+
* Bug history this guards against:
|
|
6
|
+
* - 2026-05: webServer's /api/auth/signout called
|
|
7
|
+
* `apiKeyManager.removeKeys(null)` but the real method is
|
|
8
|
+
* `removeSessionKeys`. Sign-out 500'd at runtime. The existing
|
|
9
|
+
* `authRoutes.test.js` happened to pass because it built its own
|
|
10
|
+
* mock `apiKeyManager` with the wrong method names — the mock and
|
|
11
|
+
* the production caller agreed with each other, but neither agreed
|
|
12
|
+
* with the real class. Same drift hit /auth/callback's `setKeys`
|
|
13
|
+
* call, which silently failed to persist API keys from OAuth.
|
|
14
|
+
*
|
|
15
|
+
* This file imports the REAL ApiKeyManager and asserts each method
|
|
16
|
+
* webServer.js calls is a function on it. Cheap to maintain — when
|
|
17
|
+
* webServer starts calling a new method, add it here.
|
|
18
|
+
*/
|
|
19
|
+
|
|
20
|
+
import { describe, test, expect } from '@jest/globals';
|
|
21
|
+
import ApiKeyManager from '../../services/apiKeyManager.js';
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Every ApiKeyManager method invoked from webServer.js production paths.
|
|
25
|
+
* Update this list when webServer.js starts using a new method.
|
|
26
|
+
*/
|
|
27
|
+
const REQUIRED_METHODS = Object.freeze([
|
|
28
|
+
'setSessionKeys', // /auth/callback, remote-session bootstrap
|
|
29
|
+
'removeSessionKeys', // /api/auth/signout
|
|
30
|
+
'getKeysForRequest', // /api/auth/status, /api/auth/resolve, every AI call
|
|
31
|
+
]);
|
|
32
|
+
|
|
33
|
+
describe('ApiKeyManager contract (methods called by webServer.js)', () => {
|
|
34
|
+
const instance = new ApiKeyManager(/* logger */ null);
|
|
35
|
+
|
|
36
|
+
test.each(REQUIRED_METHODS)('exposes %s as a function', (methodName) => {
|
|
37
|
+
expect(typeof instance[methodName]).toBe('function');
|
|
38
|
+
});
|
|
39
|
+
});
|
|
@@ -53,7 +53,7 @@ function buildAuthApp({ apiKeyManager, broadcastToSession, config, logger, fetch
|
|
|
53
53
|
}
|
|
54
54
|
|
|
55
55
|
if (apiKey && apiKeyManager) {
|
|
56
|
-
await apiKeyManager.
|
|
56
|
+
await apiKeyManager.setSessionKeys(null, { loxiaApiKey: apiKey });
|
|
57
57
|
}
|
|
58
58
|
|
|
59
59
|
ctx.lastAuthResult = {
|
|
@@ -137,7 +137,7 @@ function buildAuthApp({ apiKeyManager, broadcastToSession, config, logger, fetch
|
|
|
137
137
|
app.post('/api/auth/signout', async (req, res) => {
|
|
138
138
|
try {
|
|
139
139
|
if (apiKeyManager) {
|
|
140
|
-
await apiKeyManager.
|
|
140
|
+
await apiKeyManager.removeSessionKeys(null);
|
|
141
141
|
}
|
|
142
142
|
ctx.lastAuthResult = null;
|
|
143
143
|
broadcastToSession(null, {
|
|
@@ -177,8 +177,8 @@ function buildAuthApp({ apiKeyManager, broadcastToSession, config, logger, fetch
|
|
|
177
177
|
function makeApiKeyManager(initialKey = null) {
|
|
178
178
|
let storedKey = initialKey;
|
|
179
179
|
return {
|
|
180
|
-
|
|
181
|
-
|
|
180
|
+
setSessionKeys: jest.fn(async (sessionId, keys) => { storedKey = keys.loxiaApiKey; }),
|
|
181
|
+
removeSessionKeys: jest.fn(async () => { storedKey = null; }),
|
|
182
182
|
getKeysForRequest: jest.fn(() => storedKey ? { loxiaApiKey: storedKey } : {}),
|
|
183
183
|
_peek: () => storedKey
|
|
184
184
|
};
|
|
@@ -254,7 +254,7 @@ describe('Auth Routes (webServer.js)', () => {
|
|
|
254
254
|
expect(await res.text()).toContain('Authenticated!');
|
|
255
255
|
|
|
256
256
|
// Verify API key was stored
|
|
257
|
-
expect(apiKeyManager.
|
|
257
|
+
expect(apiKeyManager.setSessionKeys).toHaveBeenCalledWith(null, { loxiaApiKey: 'lx_generated_key_123' });
|
|
258
258
|
|
|
259
259
|
// Verify broadcast
|
|
260
260
|
const broadcast = broadcasts[0];
|
|
@@ -438,14 +438,14 @@ describe('Auth Routes (webServer.js)', () => {
|
|
|
438
438
|
|
|
439
439
|
const body = await (await fetch(`${baseUrl}/api/auth/signout`, { method: 'POST' })).json();
|
|
440
440
|
expect(body.success).toBe(true);
|
|
441
|
-
expect(apiKeyManager.
|
|
441
|
+
expect(apiKeyManager.removeSessionKeys).toHaveBeenCalledWith(null);
|
|
442
442
|
expect(apiKeyManager._peek()).toBeNull();
|
|
443
443
|
expect(ctx.lastAuthResult).toBeNull();
|
|
444
444
|
expect(broadcasts[0].msg.type).toBe('auth_signout');
|
|
445
445
|
});
|
|
446
446
|
|
|
447
|
-
it('returns 500 when
|
|
448
|
-
const apiKeyManager = {
|
|
447
|
+
it('returns 500 when removeSessionKeys throws', async () => {
|
|
448
|
+
const apiKeyManager = { removeSessionKeys: jest.fn().mockRejectedValue(new Error('vault locked')) };
|
|
449
449
|
const app = buildAuthApp({ apiKeyManager, broadcastToSession, config: {}, logger, fetchImpl: mockFetch, ctx });
|
|
450
450
|
const { server: s, baseUrl } = await startServer(app);
|
|
451
451
|
server = s;
|