├── .dir-locals.el ├── .github ├── dependabot.yml └── workflows │ ├── build-proxy.yml │ └── test-elisp.yml ├── .gitignore ├── CHANGELOG.md ├── Eask ├── LICENSE ├── Makefile ├── README.md ├── bin ├── .gitignore ├── install-ellsp └── install-ellsp.bat ├── ellsp-client.el ├── ellsp-code-action.el ├── ellsp-completion.el ├── ellsp-hover.el ├── ellsp-log.el ├── ellsp-signature.el ├── ellsp-tdsync.el ├── ellsp-util.el ├── ellsp.el ├── etc ├── completion.png ├── hover.png └── signature.png └── proxy ├── .gitignore ├── LICENSE ├── README.md ├── env.js ├── package-lock.json ├── package.json ├── scripts └── build.bat ├── start.js └── util.js /.dir-locals.el: -------------------------------------------------------------------------------- 1 | ;;; Directory Local Variables 2 | ;;; For more information see (info "(emacs) Directory Variables") 3 | 4 | ((js-mode . ((lsp-enabled-clients . (jsts-ls)))) 5 | (markdown-mode . ((fill-column . 80)))) 6 | -------------------------------------------------------------------------------- /.github/dependabot.yml: -------------------------------------------------------------------------------- 1 | version: 2 2 | updates: 3 | # Maintain dependencies for GitHub Actions 4 | - package-ecosystem: 'github-actions' 5 | directory: '/' 6 | schedule: 7 | interval: 'daily' 8 | 9 | # Maintain dependencies for npm 10 | - package-ecosystem: 'npm' 11 | directory: '/proxy' 12 | schedule: 13 | interval: 'daily' 14 | -------------------------------------------------------------------------------- /.github/workflows/build-proxy.yml: -------------------------------------------------------------------------------- 1 | name: Build Proxy 2 | 3 | on: 4 | push: 5 | branches: 6 | - master 7 | paths: 8 | - '**.yml' 9 | - proxy/** 10 | pull_request: 11 | branches: 12 | - master 13 | paths-ignore: 14 | - '**.md' 15 | workflow_dispatch: 16 | 17 | concurrency: 18 | group: ${{ github.workflow }}-${{ github.ref }} 19 | cancel-in-progress: true 20 | 21 | env: 22 | VERSION: 0.2.0 23 | 24 | jobs: 25 | build: 26 | runs-on: ubuntu-latest 27 | strategy: 28 | fail-fast: false 29 | matrix: 30 | target: 31 | - linux-arm64 32 | - linux-x64 33 | - macos-arm64 34 | - macos-x64 35 | - win-arm64 36 | - win-x64 37 | 38 | steps: 39 | - uses: actions/checkout@v4 40 | 41 | - name: Install dependencies 42 | run: | 43 | sudo apt-get update 44 | sudo apt-get install --assume-yes qemu-user-binfmt 45 | 46 | - uses: MOZGIII/install-ldid-action@master 47 | with: 48 | tag: v2.1.5-procursus7 49 | 50 | - name: Preparing... 51 | working-directory: proxy 52 | run: npm install --include=dev 53 | 54 | - name: Building... 55 | working-directory: proxy 56 | run: npm run-script pkg-${{ matrix.target }} 57 | 58 | - name: Prepare content... (Unix) 59 | if: contains(fromJSON('["linux-arm64", "linux-x64", "macos-arm64", "macos-x64"]'), matrix.target) 60 | working-directory: proxy 61 | run: | 62 | mkdir dist 63 | mv LICENSE dist 64 | mv README.md dist 65 | mv ../bin/ellsp dist 66 | 67 | - name: Prepare content... (Windows) 68 | if: contains(fromJSON('["win-arm64", "win-x64"]'), matrix.target) 69 | working-directory: proxy 70 | run: | 71 | mkdir dist 72 | mv LICENSE dist 73 | mv README.md dist 74 | mv ../bin/ellsp.exe dist 75 | 76 | - name: Setup environment (Unix) 77 | if: contains(fromJSON('["linux-arm64", "linux-x64", "macos-arm64", "macos-x64"]'), matrix.target) 78 | run: | 79 | echo "_EXT=tar.gz" >> $GITHUB_ENV 80 | 81 | - name: Setup environment (Windows) 82 | if: contains(fromJSON('["win-arm64", "win-x64"]'), matrix.target) 83 | run: | 84 | echo "_EXT=zip" >> $GITHUB_ENV 85 | 86 | - name: Change permissions (Unix) 87 | if: contains(fromJSON('["linux-arm64", "linux-x64", "macos-arm64", "macos-x64"]'), matrix.target) 88 | run: | 89 | chmod -R 777 ./bin/ 90 | 91 | - name: Change permissions (Unix) 92 | if: contains(fromJSON('["linux-arm64", "linux-x64", "macos-arm64", "macos-x64"]'), matrix.target) 93 | working-directory: proxy 94 | run: | 95 | chmod -R 777 ./dist 96 | 97 | - name: Tar dist (Unix) 98 | if: contains(fromJSON('["linux-arm64", "linux-x64", "macos-arm64", "macos-x64"]'), matrix.target) 99 | working-directory: proxy 100 | run: | 101 | tar czf ${{ matrix.target }}.${{ env._EXT }} -C ./dist/ . 102 | cp ${{ matrix.target }}.${{ env._EXT }} ellsp_${{ matrix.target }}.${{ env._EXT }} 103 | 104 | - name: Zipping dist (Windows) 105 | if: contains(fromJSON('["win-arm64", "win-x64"]'), matrix.target) 106 | working-directory: proxy/dist 107 | run: | 108 | zip -r ${{ matrix.target }}.${{ env._EXT }} . 109 | mv ${{ matrix.target }}.${{ env._EXT }} ../ 110 | cd .. 111 | cp ${{ matrix.target }}.${{ env._EXT }} ellsp_${{ matrix.target }}.${{ env._EXT }} 112 | 113 | - name: Upload for prerelease 114 | if: github.ref == 'refs/heads/master' 115 | uses: softprops/action-gh-release@v2.2.1 116 | with: 117 | tag_name: ${{ env.VERSION }} 118 | token: ${{ secrets.PAT }} 119 | prerelease: true 120 | files: proxy/ellsp_${{ matrix.target }}.${{ env._EXT }} 121 | 122 | #### Upload an artifact for testing purposes 123 | 124 | - name: Upload for tests 125 | uses: actions/upload-artifact@v4 126 | with: 127 | name: ${{ matrix.target }} 128 | path: proxy/ellsp_${{ matrix.target }}.${{ env._EXT }} 129 | -------------------------------------------------------------------------------- /.github/workflows/test-elisp.yml: -------------------------------------------------------------------------------- 1 | name: CI Elisp 2 | 3 | on: 4 | push: 5 | branches: 6 | - master 7 | pull_request: 8 | workflow_dispatch: 9 | 10 | concurrency: 11 | group: ${{ github.workflow }}-${{ github.ref }} 12 | cancel-in-progress: true 13 | 14 | jobs: 15 | test: 16 | runs-on: ${{ matrix.os }} 17 | continue-on-error: ${{ matrix.experimental }} 18 | strategy: 19 | fail-fast: false 20 | matrix: 21 | os: [ubuntu-latest, macos-latest, windows-latest] 22 | emacs-version: 23 | - 28.2 24 | - 29.4 25 | - 30.1 26 | experimental: [false] 27 | include: 28 | - os: ubuntu-latest 29 | emacs-version: snapshot 30 | experimental: true 31 | - os: macos-latest 32 | emacs-version: snapshot 33 | experimental: true 34 | - os: windows-latest 35 | emacs-version: snapshot 36 | experimental: true 37 | 38 | steps: 39 | - uses: actions/checkout@v4 40 | 41 | - uses: jcs090218/setup-emacs@master 42 | with: 43 | version: ${{ matrix.emacs-version }} 44 | 45 | - uses: emacs-eask/setup-eask@master 46 | with: 47 | version: 'snapshot' 48 | 49 | - name: Run tests 50 | run: 51 | make ci 52 | 53 | - name: Change permissions (Unix) 54 | if: runner.os == 'Linux' || runner.os == 'macOS' 55 | run: | 56 | chmod -R 777 ./.eask 57 | 58 | - name: Run tests 59 | run: 60 | make test-install 61 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # ignore these directories 2 | /.git 3 | /recipes 4 | 5 | # ignore log files 6 | /.log 7 | 8 | # ignore generated files 9 | *.elc 10 | 11 | # eask packages 12 | .eask/ 13 | dist/ 14 | 15 | # packaging 16 | *-autoloads.el 17 | *-pkg.el 18 | 19 | # personal test 20 | /_test 21 | 22 | # OS generated 23 | .DS_Store 24 | 25 | # executable 26 | /bin/ellsp 27 | /bin/ellsp.exe 28 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Change Log 2 | 3 | All notable changes to the "vscode-shader" extension will be documented in this file. 4 | 5 | Check [Keep a Changelog](http://keepachangelog.com/) for recommendations on how to structure this file. 6 | 7 | ## 0.2.0 (Unreleased) 8 | > Released N/A 9 | 10 | - N/A 11 | 12 | ## 0.1.0 13 | > Released Jan 08, 2025 14 | 15 | * Initial release 16 | 17 | ## 0.0.0 18 | > Released Nov 17, 2023 19 | 20 | * Working release 21 | -------------------------------------------------------------------------------- /Eask: -------------------------------------------------------------------------------- 1 | ;; -*- mode: eask; lexical-binding: t -*- 2 | 3 | (package "ellsp" 4 | "0.2.0" 5 | "Elisp Language Server") 6 | 7 | (website-url "https://github.com/elisp-lsp/ellsp") 8 | (keywords "convenience" "lsp") 9 | 10 | (package-file "ellsp.el") 11 | 12 | (files "ellsp-*.el" "bin") 13 | 14 | (script "test" "echo \"Error: no test specified\" && exit 1") 15 | 16 | (source 'gnu) 17 | (source 'melpa) 18 | (source 'jcs-elpa) 19 | 20 | (source-priority 'gnu) 21 | (source-priority 'melpa) 22 | 23 | (depends-on "emacs" "28.1") 24 | (depends-on "lsp-mode") 25 | (depends-on "company") 26 | (depends-on "log4e") 27 | (depends-on "dash") 28 | (depends-on "s") 29 | (depends-on "msgu") 30 | 31 | (development 32 | (depends-on "ic")) 33 | 34 | (setq network-security-level 'low) ; see https://github.com/jcs090218/setup-emacs-windows/issues/156#issuecomment-932956432 35 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | GNU GENERAL PUBLIC LICENSE 2 | Version 3, 29 June 2007 3 | 4 | Copyright (C) 2007 Free Software Foundation, Inc. 5 | Everyone is permitted to copy and distribute verbatim copies 6 | of this license document, but changing it is not allowed. 7 | 8 | Preamble 9 | 10 | The GNU General Public License is a free, copyleft license for 11 | software and other kinds of works. 12 | 13 | The licenses for most software and other practical works are designed 14 | to take away your freedom to share and change the works. By contrast, 15 | the GNU General Public License is intended to guarantee your freedom to 16 | share and change all versions of a program--to make sure it remains free 17 | software for all its users. We, the Free Software Foundation, use the 18 | GNU General Public License for most of our software; it applies also to 19 | any other work released this way by its authors. You can apply it to 20 | your programs, too. 21 | 22 | When we speak of free software, we are referring to freedom, not 23 | price. Our General Public Licenses are designed to make sure that you 24 | have the freedom to distribute copies of free software (and charge for 25 | them if you wish), that you receive source code or can get it if you 26 | want it, that you can change the software or use pieces of it in new 27 | free programs, and that you know you can do these things. 28 | 29 | To protect your rights, we need to prevent others from denying you 30 | these rights or asking you to surrender the rights. Therefore, you have 31 | certain responsibilities if you distribute copies of the software, or if 32 | you modify it: responsibilities to respect the freedom of others. 33 | 34 | For example, if you distribute copies of such a program, whether 35 | gratis or for a fee, you must pass on to the recipients the same 36 | freedoms that you received. You must make sure that they, too, receive 37 | or can get the source code. And you must show them these terms so they 38 | know their rights. 39 | 40 | Developers that use the GNU GPL protect your rights with two steps: 41 | (1) assert copyright on the software, and (2) offer you this License 42 | giving you legal permission to copy, distribute and/or modify it. 43 | 44 | For the developers' and authors' protection, the GPL clearly explains 45 | that there is no warranty for this free software. For both users' and 46 | authors' sake, the GPL requires that modified versions be marked as 47 | changed, so that their problems will not be attributed erroneously to 48 | authors of previous versions. 49 | 50 | Some devices are designed to deny users access to install or run 51 | modified versions of the software inside them, although the manufacturer 52 | can do so. This is fundamentally incompatible with the aim of 53 | protecting users' freedom to change the software. The systematic 54 | pattern of such abuse occurs in the area of products for individuals to 55 | use, which is precisely where it is most unacceptable. Therefore, we 56 | have designed this version of the GPL to prohibit the practice for those 57 | products. If such problems arise substantially in other domains, we 58 | stand ready to extend this provision to those domains in future versions 59 | of the GPL, as needed to protect the freedom of users. 60 | 61 | Finally, every program is threatened constantly by software patents. 62 | States should not allow patents to restrict development and use of 63 | software on general-purpose computers, but in those that do, we wish to 64 | avoid the special danger that patents applied to a free program could 65 | make it effectively proprietary. To prevent this, the GPL assures that 66 | patents cannot be used to render the program non-free. 67 | 68 | The precise terms and conditions for copying, distribution and 69 | modification follow. 70 | 71 | TERMS AND CONDITIONS 72 | 73 | 0. Definitions. 74 | 75 | "This License" refers to version 3 of the GNU General Public License. 76 | 77 | "Copyright" also means copyright-like laws that apply to other kinds of 78 | works, such as semiconductor masks. 79 | 80 | "The Program" refers to any copyrightable work licensed under this 81 | License. Each licensee is addressed as "you". "Licensees" and 82 | "recipients" may be individuals or organizations. 83 | 84 | To "modify" a work means to copy from or adapt all or part of the work 85 | in a fashion requiring copyright permission, other than the making of an 86 | exact copy. The resulting work is called a "modified version" of the 87 | earlier work or a work "based on" the earlier work. 88 | 89 | A "covered work" means either the unmodified Program or a work based 90 | on the Program. 91 | 92 | To "propagate" a work means to do anything with it that, without 93 | permission, would make you directly or secondarily liable for 94 | infringement under applicable copyright law, except executing it on a 95 | computer or modifying a private copy. Propagation includes copying, 96 | distribution (with or without modification), making available to the 97 | public, and in some countries other activities as well. 98 | 99 | To "convey" a work means any kind of propagation that enables other 100 | parties to make or receive copies. Mere interaction with a user through 101 | a computer network, with no transfer of a copy, is not conveying. 102 | 103 | An interactive user interface displays "Appropriate Legal Notices" 104 | to the extent that it includes a convenient and prominently visible 105 | feature that (1) displays an appropriate copyright notice, and (2) 106 | tells the user that there is no warranty for the work (except to the 107 | extent that warranties are provided), that licensees may convey the 108 | work under this License, and how to view a copy of this License. If 109 | the interface presents a list of user commands or options, such as a 110 | menu, a prominent item in the list meets this criterion. 111 | 112 | 1. Source Code. 113 | 114 | The "source code" for a work means the preferred form of the work 115 | for making modifications to it. "Object code" means any non-source 116 | form of a work. 117 | 118 | A "Standard Interface" means an interface that either is an official 119 | standard defined by a recognized standards body, or, in the case of 120 | interfaces specified for a particular programming language, one that 121 | is widely used among developers working in that language. 122 | 123 | The "System Libraries" of an executable work include anything, other 124 | than the work as a whole, that (a) is included in the normal form of 125 | packaging a Major Component, but which is not part of that Major 126 | Component, and (b) serves only to enable use of the work with that 127 | Major Component, or to implement a Standard Interface for which an 128 | implementation is available to the public in source code form. A 129 | "Major Component", in this context, means a major essential component 130 | (kernel, window system, and so on) of the specific operating system 131 | (if any) on which the executable work runs, or a compiler used to 132 | produce the work, or an object code interpreter used to run it. 133 | 134 | The "Corresponding Source" for a work in object code form means all 135 | the source code needed to generate, install, and (for an executable 136 | work) run the object code and to modify the work, including scripts to 137 | control those activities. However, it does not include the work's 138 | System Libraries, or general-purpose tools or generally available free 139 | programs which are used unmodified in performing those activities but 140 | which are not part of the work. For example, Corresponding Source 141 | includes interface definition files associated with source files for 142 | the work, and the source code for shared libraries and dynamically 143 | linked subprograms that the work is specifically designed to require, 144 | such as by intimate data communication or control flow between those 145 | subprograms and other parts of the work. 146 | 147 | The Corresponding Source need not include anything that users 148 | can regenerate automatically from other parts of the Corresponding 149 | Source. 150 | 151 | The Corresponding Source for a work in source code form is that 152 | same work. 153 | 154 | 2. Basic Permissions. 155 | 156 | All rights granted under this License are granted for the term of 157 | copyright on the Program, and are irrevocable provided the stated 158 | conditions are met. This License explicitly affirms your unlimited 159 | permission to run the unmodified Program. The output from running a 160 | covered work is covered by this License only if the output, given its 161 | content, constitutes a covered work. This License acknowledges your 162 | rights of fair use or other equivalent, as provided by copyright law. 163 | 164 | You may make, run and propagate covered works that you do not 165 | convey, without conditions so long as your license otherwise remains 166 | in force. You may convey covered works to others for the sole purpose 167 | of having them make modifications exclusively for you, or provide you 168 | with facilities for running those works, provided that you comply with 169 | the terms of this License in conveying all material for which you do 170 | not control copyright. Those thus making or running the covered works 171 | for you must do so exclusively on your behalf, under your direction 172 | and control, on terms that prohibit them from making any copies of 173 | your copyrighted material outside their relationship with you. 174 | 175 | Conveying under any other circumstances is permitted solely under 176 | the conditions stated below. Sublicensing is not allowed; section 10 177 | makes it unnecessary. 178 | 179 | 3. Protecting Users' Legal Rights From Anti-Circumvention Law. 180 | 181 | No covered work shall be deemed part of an effective technological 182 | measure under any applicable law fulfilling obligations under article 183 | 11 of the WIPO copyright treaty adopted on 20 December 1996, or 184 | similar laws prohibiting or restricting circumvention of such 185 | measures. 186 | 187 | When you convey a covered work, you waive any legal power to forbid 188 | circumvention of technological measures to the extent such circumvention 189 | is effected by exercising rights under this License with respect to 190 | the covered work, and you disclaim any intention to limit operation or 191 | modification of the work as a means of enforcing, against the work's 192 | users, your or third parties' legal rights to forbid circumvention of 193 | technological measures. 194 | 195 | 4. Conveying Verbatim Copies. 196 | 197 | You may convey verbatim copies of the Program's source code as you 198 | receive it, in any medium, provided that you conspicuously and 199 | appropriately publish on each copy an appropriate copyright notice; 200 | keep intact all notices stating that this License and any 201 | non-permissive terms added in accord with section 7 apply to the code; 202 | keep intact all notices of the absence of any warranty; and give all 203 | recipients a copy of this License along with the Program. 204 | 205 | You may charge any price or no price for each copy that you convey, 206 | and you may offer support or warranty protection for a fee. 207 | 208 | 5. Conveying Modified Source Versions. 209 | 210 | You may convey a work based on the Program, or the modifications to 211 | produce it from the Program, in the form of source code under the 212 | terms of section 4, provided that you also meet all of these conditions: 213 | 214 | a) The work must carry prominent notices stating that you modified 215 | it, and giving a relevant date. 216 | 217 | b) The work must carry prominent notices stating that it is 218 | released under this License and any conditions added under section 219 | 7. This requirement modifies the requirement in section 4 to 220 | "keep intact all notices". 221 | 222 | c) You must license the entire work, as a whole, under this 223 | License to anyone who comes into possession of a copy. This 224 | License will therefore apply, along with any applicable section 7 225 | additional terms, to the whole of the work, and all its parts, 226 | regardless of how they are packaged. This License gives no 227 | permission to license the work in any other way, but it does not 228 | invalidate such permission if you have separately received it. 229 | 230 | d) If the work has interactive user interfaces, each must display 231 | Appropriate Legal Notices; however, if the Program has interactive 232 | interfaces that do not display Appropriate Legal Notices, your 233 | work need not make them do so. 234 | 235 | A compilation of a covered work with other separate and independent 236 | works, which are not by their nature extensions of the covered work, 237 | and which are not combined with it such as to form a larger program, 238 | in or on a volume of a storage or distribution medium, is called an 239 | "aggregate" if the compilation and its resulting copyright are not 240 | used to limit the access or legal rights of the compilation's users 241 | beyond what the individual works permit. Inclusion of a covered work 242 | in an aggregate does not cause this License to apply to the other 243 | parts of the aggregate. 244 | 245 | 6. Conveying Non-Source Forms. 246 | 247 | You may convey a covered work in object code form under the terms 248 | of sections 4 and 5, provided that you also convey the 249 | machine-readable Corresponding Source under the terms of this License, 250 | in one of these ways: 251 | 252 | a) Convey the object code in, or embodied in, a physical product 253 | (including a physical distribution medium), accompanied by the 254 | Corresponding Source fixed on a durable physical medium 255 | customarily used for software interchange. 256 | 257 | b) Convey the object code in, or embodied in, a physical product 258 | (including a physical distribution medium), accompanied by a 259 | written offer, valid for at least three years and valid for as 260 | long as you offer spare parts or customer support for that product 261 | model, to give anyone who possesses the object code either (1) a 262 | copy of the Corresponding Source for all the software in the 263 | product that is covered by this License, on a durable physical 264 | medium customarily used for software interchange, for a price no 265 | more than your reasonable cost of physically performing this 266 | conveying of source, or (2) access to copy the 267 | Corresponding Source from a network server at no charge. 268 | 269 | c) Convey individual copies of the object code with a copy of the 270 | written offer to provide the Corresponding Source. This 271 | alternative is allowed only occasionally and noncommercially, and 272 | only if you received the object code with such an offer, in accord 273 | with subsection 6b. 274 | 275 | d) Convey the object code by offering access from a designated 276 | place (gratis or for a charge), and offer equivalent access to the 277 | Corresponding Source in the same way through the same place at no 278 | further charge. You need not require recipients to copy the 279 | Corresponding Source along with the object code. If the place to 280 | copy the object code is a network server, the Corresponding Source 281 | may be on a different server (operated by you or a third party) 282 | that supports equivalent copying facilities, provided you maintain 283 | clear directions next to the object code saying where to find the 284 | Corresponding Source. Regardless of what server hosts the 285 | Corresponding Source, you remain obligated to ensure that it is 286 | available for as long as needed to satisfy these requirements. 287 | 288 | e) Convey the object code using peer-to-peer transmission, provided 289 | you inform other peers where the object code and Corresponding 290 | Source of the work are being offered to the general public at no 291 | charge under subsection 6d. 292 | 293 | A separable portion of the object code, whose source code is excluded 294 | from the Corresponding Source as a System Library, need not be 295 | included in conveying the object code work. 296 | 297 | A "User Product" is either (1) a "consumer product", which means any 298 | tangible personal property which is normally used for personal, family, 299 | or household purposes, or (2) anything designed or sold for incorporation 300 | into a dwelling. In determining whether a product is a consumer product, 301 | doubtful cases shall be resolved in favor of coverage. For a particular 302 | product received by a particular user, "normally used" refers to a 303 | typical or common use of that class of product, regardless of the status 304 | of the particular user or of the way in which the particular user 305 | actually uses, or expects or is expected to use, the product. A product 306 | is a consumer product regardless of whether the product has substantial 307 | commercial, industrial or non-consumer uses, unless such uses represent 308 | the only significant mode of use of the product. 309 | 310 | "Installation Information" for a User Product means any methods, 311 | procedures, authorization keys, or other information required to install 312 | and execute modified versions of a covered work in that User Product from 313 | a modified version of its Corresponding Source. The information must 314 | suffice to ensure that the continued functioning of the modified object 315 | code is in no case prevented or interfered with solely because 316 | modification has been made. 317 | 318 | If you convey an object code work under this section in, or with, or 319 | specifically for use in, a User Product, and the conveying occurs as 320 | part of a transaction in which the right of possession and use of the 321 | User Product is transferred to the recipient in perpetuity or for a 322 | fixed term (regardless of how the transaction is characterized), the 323 | Corresponding Source conveyed under this section must be accompanied 324 | by the Installation Information. But this requirement does not apply 325 | if neither you nor any third party retains the ability to install 326 | modified object code on the User Product (for example, the work has 327 | been installed in ROM). 328 | 329 | The requirement to provide Installation Information does not include a 330 | requirement to continue to provide support service, warranty, or updates 331 | for a work that has been modified or installed by the recipient, or for 332 | the User Product in which it has been modified or installed. Access to a 333 | network may be denied when the modification itself materially and 334 | adversely affects the operation of the network or violates the rules and 335 | protocols for communication across the network. 336 | 337 | Corresponding Source conveyed, and Installation Information provided, 338 | in accord with this section must be in a format that is publicly 339 | documented (and with an implementation available to the public in 340 | source code form), and must require no special password or key for 341 | unpacking, reading or copying. 342 | 343 | 7. Additional Terms. 344 | 345 | "Additional permissions" are terms that supplement the terms of this 346 | License by making exceptions from one or more of its conditions. 347 | Additional permissions that are applicable to the entire Program shall 348 | be treated as though they were included in this License, to the extent 349 | that they are valid under applicable law. If additional permissions 350 | apply only to part of the Program, that part may be used separately 351 | under those permissions, but the entire Program remains governed by 352 | this License without regard to the additional permissions. 353 | 354 | When you convey a copy of a covered work, you may at your option 355 | remove any additional permissions from that copy, or from any part of 356 | it. (Additional permissions may be written to require their own 357 | removal in certain cases when you modify the work.) You may place 358 | additional permissions on material, added by you to a covered work, 359 | for which you have or can give appropriate copyright permission. 360 | 361 | Notwithstanding any other provision of this License, for material you 362 | add to a covered work, you may (if authorized by the copyright holders of 363 | that material) supplement the terms of this License with terms: 364 | 365 | a) Disclaiming warranty or limiting liability differently from the 366 | terms of sections 15 and 16 of this License; or 367 | 368 | b) Requiring preservation of specified reasonable legal notices or 369 | author attributions in that material or in the Appropriate Legal 370 | Notices displayed by works containing it; or 371 | 372 | c) Prohibiting misrepresentation of the origin of that material, or 373 | requiring that modified versions of such material be marked in 374 | reasonable ways as different from the original version; or 375 | 376 | d) Limiting the use for publicity purposes of names of licensors or 377 | authors of the material; or 378 | 379 | e) Declining to grant rights under trademark law for use of some 380 | trade names, trademarks, or service marks; or 381 | 382 | f) Requiring indemnification of licensors and authors of that 383 | material by anyone who conveys the material (or modified versions of 384 | it) with contractual assumptions of liability to the recipient, for 385 | any liability that these contractual assumptions directly impose on 386 | those licensors and authors. 387 | 388 | All other non-permissive additional terms are considered "further 389 | restrictions" within the meaning of section 10. If the Program as you 390 | received it, or any part of it, contains a notice stating that it is 391 | governed by this License along with a term that is a further 392 | restriction, you may remove that term. If a license document contains 393 | a further restriction but permits relicensing or conveying under this 394 | License, you may add to a covered work material governed by the terms 395 | of that license document, provided that the further restriction does 396 | not survive such relicensing or conveying. 397 | 398 | If you add terms to a covered work in accord with this section, you 399 | must place, in the relevant source files, a statement of the 400 | additional terms that apply to those files, or a notice indicating 401 | where to find the applicable terms. 402 | 403 | Additional terms, permissive or non-permissive, may be stated in the 404 | form of a separately written license, or stated as exceptions; 405 | the above requirements apply either way. 406 | 407 | 8. Termination. 408 | 409 | You may not propagate or modify a covered work except as expressly 410 | provided under this License. Any attempt otherwise to propagate or 411 | modify it is void, and will automatically terminate your rights under 412 | this License (including any patent licenses granted under the third 413 | paragraph of section 11). 414 | 415 | However, if you cease all violation of this License, then your 416 | license from a particular copyright holder is reinstated (a) 417 | provisionally, unless and until the copyright holder explicitly and 418 | finally terminates your license, and (b) permanently, if the copyright 419 | holder fails to notify you of the violation by some reasonable means 420 | prior to 60 days after the cessation. 421 | 422 | Moreover, your license from a particular copyright holder is 423 | reinstated permanently if the copyright holder notifies you of the 424 | violation by some reasonable means, this is the first time you have 425 | received notice of violation of this License (for any work) from that 426 | copyright holder, and you cure the violation prior to 30 days after 427 | your receipt of the notice. 428 | 429 | Termination of your rights under this section does not terminate the 430 | licenses of parties who have received copies or rights from you under 431 | this License. If your rights have been terminated and not permanently 432 | reinstated, you do not qualify to receive new licenses for the same 433 | material under section 10. 434 | 435 | 9. Acceptance Not Required for Having Copies. 436 | 437 | You are not required to accept this License in order to receive or 438 | run a copy of the Program. Ancillary propagation of a covered work 439 | occurring solely as a consequence of using peer-to-peer transmission 440 | to receive a copy likewise does not require acceptance. However, 441 | nothing other than this License grants you permission to propagate or 442 | modify any covered work. These actions infringe copyright if you do 443 | not accept this License. Therefore, by modifying or propagating a 444 | covered work, you indicate your acceptance of this License to do so. 445 | 446 | 10. Automatic Licensing of Downstream Recipients. 447 | 448 | Each time you convey a covered work, the recipient automatically 449 | receives a license from the original licensors, to run, modify and 450 | propagate that work, subject to this License. You are not responsible 451 | for enforcing compliance by third parties with this License. 452 | 453 | An "entity transaction" is a transaction transferring control of an 454 | organization, or substantially all assets of one, or subdividing an 455 | organization, or merging organizations. If propagation of a covered 456 | work results from an entity transaction, each party to that 457 | transaction who receives a copy of the work also receives whatever 458 | licenses to the work the party's predecessor in interest had or could 459 | give under the previous paragraph, plus a right to possession of the 460 | Corresponding Source of the work from the predecessor in interest, if 461 | the predecessor has it or can get it with reasonable efforts. 462 | 463 | You may not impose any further restrictions on the exercise of the 464 | rights granted or affirmed under this License. For example, you may 465 | not impose a license fee, royalty, or other charge for exercise of 466 | rights granted under this License, and you may not initiate litigation 467 | (including a cross-claim or counterclaim in a lawsuit) alleging that 468 | any patent claim is infringed by making, using, selling, offering for 469 | sale, or importing the Program or any portion of it. 470 | 471 | 11. Patents. 472 | 473 | A "contributor" is a copyright holder who authorizes use under this 474 | License of the Program or a work on which the Program is based. The 475 | work thus licensed is called the contributor's "contributor version". 476 | 477 | A contributor's "essential patent claims" are all patent claims 478 | owned or controlled by the contributor, whether already acquired or 479 | hereafter acquired, that would be infringed by some manner, permitted 480 | by this License, of making, using, or selling its contributor version, 481 | but do not include claims that would be infringed only as a 482 | consequence of further modification of the contributor version. For 483 | purposes of this definition, "control" includes the right to grant 484 | patent sublicenses in a manner consistent with the requirements of 485 | this License. 486 | 487 | Each contributor grants you a non-exclusive, worldwide, royalty-free 488 | patent license under the contributor's essential patent claims, to 489 | make, use, sell, offer for sale, import and otherwise run, modify and 490 | propagate the contents of its contributor version. 491 | 492 | In the following three paragraphs, a "patent license" is any express 493 | agreement or commitment, however denominated, not to enforce a patent 494 | (such as an express permission to practice a patent or covenant not to 495 | sue for patent infringement). To "grant" such a patent license to a 496 | party means to make such an agreement or commitment not to enforce a 497 | patent against the party. 498 | 499 | If you convey a covered work, knowingly relying on a patent license, 500 | and the Corresponding Source of the work is not available for anyone 501 | to copy, free of charge and under the terms of this License, through a 502 | publicly available network server or other readily accessible means, 503 | then you must either (1) cause the Corresponding Source to be so 504 | available, or (2) arrange to deprive yourself of the benefit of the 505 | patent license for this particular work, or (3) arrange, in a manner 506 | consistent with the requirements of this License, to extend the patent 507 | license to downstream recipients. "Knowingly relying" means you have 508 | actual knowledge that, but for the patent license, your conveying the 509 | covered work in a country, or your recipient's use of the covered work 510 | in a country, would infringe one or more identifiable patents in that 511 | country that you have reason to believe are valid. 512 | 513 | If, pursuant to or in connection with a single transaction or 514 | arrangement, you convey, or propagate by procuring conveyance of, a 515 | covered work, and grant a patent license to some of the parties 516 | receiving the covered work authorizing them to use, propagate, modify 517 | or convey a specific copy of the covered work, then the patent license 518 | you grant is automatically extended to all recipients of the covered 519 | work and works based on it. 520 | 521 | A patent license is "discriminatory" if it does not include within 522 | the scope of its coverage, prohibits the exercise of, or is 523 | conditioned on the non-exercise of one or more of the rights that are 524 | specifically granted under this License. You may not convey a covered 525 | work if you are a party to an arrangement with a third party that is 526 | in the business of distributing software, under which you make payment 527 | to the third party based on the extent of your activity of conveying 528 | the work, and under which the third party grants, to any of the 529 | parties who would receive the covered work from you, a discriminatory 530 | patent license (a) in connection with copies of the covered work 531 | conveyed by you (or copies made from those copies), or (b) primarily 532 | for and in connection with specific products or compilations that 533 | contain the covered work, unless you entered into that arrangement, 534 | or that patent license was granted, prior to 28 March 2007. 535 | 536 | Nothing in this License shall be construed as excluding or limiting 537 | any implied license or other defenses to infringement that may 538 | otherwise be available to you under applicable patent law. 539 | 540 | 12. No Surrender of Others' Freedom. 541 | 542 | If conditions are imposed on you (whether by court order, agreement or 543 | otherwise) that contradict the conditions of this License, they do not 544 | excuse you from the conditions of this License. If you cannot convey a 545 | covered work so as to satisfy simultaneously your obligations under this 546 | License and any other pertinent obligations, then as a consequence you may 547 | not convey it at all. For example, if you agree to terms that obligate you 548 | to collect a royalty for further conveying from those to whom you convey 549 | the Program, the only way you could satisfy both those terms and this 550 | License would be to refrain entirely from conveying the Program. 551 | 552 | 13. Use with the GNU Affero General Public License. 553 | 554 | Notwithstanding any other provision of this License, you have 555 | permission to link or combine any covered work with a work licensed 556 | under version 3 of the GNU Affero General Public License into a single 557 | combined work, and to convey the resulting work. The terms of this 558 | License will continue to apply to the part which is the covered work, 559 | but the special requirements of the GNU Affero General Public License, 560 | section 13, concerning interaction through a network will apply to the 561 | combination as such. 562 | 563 | 14. Revised Versions of this License. 564 | 565 | The Free Software Foundation may publish revised and/or new versions of 566 | the GNU General Public License from time to time. Such new versions will 567 | be similar in spirit to the present version, but may differ in detail to 568 | address new problems or concerns. 569 | 570 | Each version is given a distinguishing version number. If the 571 | Program specifies that a certain numbered version of the GNU General 572 | Public License "or any later version" applies to it, you have the 573 | option of following the terms and conditions either of that numbered 574 | version or of any later version published by the Free Software 575 | Foundation. If the Program does not specify a version number of the 576 | GNU General Public License, you may choose any version ever published 577 | by the Free Software Foundation. 578 | 579 | If the Program specifies that a proxy can decide which future 580 | versions of the GNU General Public License can be used, that proxy's 581 | public statement of acceptance of a version permanently authorizes you 582 | to choose that version for the Program. 583 | 584 | Later license versions may give you additional or different 585 | permissions. However, no additional obligations are imposed on any 586 | author or copyright holder as a result of your choosing to follow a 587 | later version. 588 | 589 | 15. Disclaimer of Warranty. 590 | 591 | THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY 592 | APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT 593 | HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY 594 | OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, 595 | THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 596 | PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM 597 | IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF 598 | ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 599 | 600 | 16. Limitation of Liability. 601 | 602 | IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING 603 | WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS 604 | THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY 605 | GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE 606 | USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF 607 | DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD 608 | PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), 609 | EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF 610 | SUCH DAMAGES. 611 | 612 | 17. Interpretation of Sections 15 and 16. 613 | 614 | If the disclaimer of warranty and limitation of liability provided 615 | above cannot be given local legal effect according to their terms, 616 | reviewing courts shall apply local law that most closely approximates 617 | an absolute waiver of all civil liability in connection with the 618 | Program, unless a warranty or assumption of liability accompanies a 619 | copy of the Program in return for a fee. 620 | 621 | END OF TERMS AND CONDITIONS 622 | 623 | How to Apply These Terms to Your New Programs 624 | 625 | If you develop a new program, and you want it to be of the greatest 626 | possible use to the public, the best way to achieve this is to make it 627 | free software which everyone can redistribute and change under these terms. 628 | 629 | To do so, attach the following notices to the program. It is safest 630 | to attach them to the start of each source file to most effectively 631 | state the exclusion of warranty; and each file should have at least 632 | the "copyright" line and a pointer to where the full notice is found. 633 | 634 | 635 | Copyright (C) 636 | 637 | This program is free software: you can redistribute it and/or modify 638 | it under the terms of the GNU General Public License as published by 639 | the Free Software Foundation, either version 3 of the License, or 640 | (at your option) any later version. 641 | 642 | This program is distributed in the hope that it will be useful, 643 | but WITHOUT ANY WARRANTY; without even the implied warranty of 644 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 645 | GNU General Public License for more details. 646 | 647 | You should have received a copy of the GNU General Public License 648 | along with this program. If not, see . 649 | 650 | Also add information on how to contact you by electronic and paper mail. 651 | 652 | If the program does terminal interaction, make it output a short 653 | notice like this when it starts in an interactive mode: 654 | 655 | Copyright (C) 656 | This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. 657 | This is free software, and you are welcome to redistribute it 658 | under certain conditions; type `show c' for details. 659 | 660 | The hypothetical commands `show w' and `show c' should show the appropriate 661 | parts of the General Public License. Of course, your program's commands 662 | might be different; for a GUI interface, you would use an "about box". 663 | 664 | You should also get your employer (if you work as a programmer) or school, 665 | if any, to sign a "copyright disclaimer" for the program, if necessary. 666 | For more information on this, and how to apply and follow the GNU GPL, see 667 | . 668 | 669 | The GNU General Public License does not permit incorporating your program 670 | into proprietary programs. If your program is a subroutine library, you 671 | may consider it more useful to permit linking proprietary applications with 672 | the library. If this is what you want to do, use the GNU Lesser General 673 | Public License instead of this License. But first, please read 674 | . 675 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | EMACS ?= emacs 2 | EASK ?= eask 3 | 4 | .PHONY: clean checkdoc lint package install compile test 5 | 6 | ci: clean package install compile 7 | 8 | package: 9 | @echo "Packaging..." 10 | $(EASK) package 11 | 12 | install: 13 | @echo "Installing..." 14 | $(EASK) install 15 | 16 | compile: 17 | @echo "Compiling..." 18 | $(EASK) compile 19 | 20 | test: 21 | @echo "Testing..." 22 | $(EASK) test ert ./test/*.el 23 | 24 | test-install: 25 | $(EASK) exec install-ellsp 26 | 27 | checkdoc: 28 | @echo "Run checkdoc..." 29 | $(EASK) lint checkdoc 30 | 31 | lint: 32 | @echo "Run package-lint..." 33 | $(EASK) lint package 34 | 35 | clean: 36 | $(EASK) clean all 37 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | [![License: GPL v3](https://img.shields.io/badge/License-GPL%20v3-blue.svg)](https://www.gnu.org/licenses/gpl-3.0) 2 | [![Release](https://img.shields.io/github/release/elisp-lsp/ellsp.svg?logo=github)](https://github.com/elisp-lsp/ellsp/releases/latest) 3 | [![JCS-ELPA](https://raw.githubusercontent.com/jcs-emacs/badges/master/elpa/v/ellsp.svg)](https://jcs-emacs.github.io/jcs-elpa/#/ellsp) 4 | 5 | # Ellsp 6 | > Elisp Language Server 7 | 8 | [![CI Elisp](https://github.com/elisp-lsp/ellsp/actions/workflows/test-elisp.yml/badge.svg)](https://github.com/elisp-lsp/ellsp/actions/workflows/test-elisp.yml) 9 | [![Build Proxy](https://github.com/elisp-lsp/ellsp/actions/workflows/build-proxy.yml/badge.svg)](https://github.com/elisp-lsp/ellsp/actions/workflows/build-proxy.yml) 10 | 11 | This software is intended for use with editors other than Emacs. 12 | If you're already an Emacs user, we recommend using Emacs directly. 13 | 14 | Here is the list of currently supported editors: 15 | 16 | - [Emacs]() (`M-x ellsp-register`) 17 | - [VSCode](https://marketplace.visualstudio.com/items?itemName=jcs090218.Ellsp) 18 | 19 | ## ✒️ Rationale 20 | 21 | This software is intended to support editors beyond Emacs, targeting users who 22 | wish to work with Emacs Lisp in a more performant and responsive environment. 23 | Due to its single-threaded architecture, Emacs can become unresponsive when 24 | executing computationally intensive tasks. 25 | 26 | A strong reference implementation is Emacs [Elsa][], which utilizes the Language 27 | Server Protocol (LSP) to delegate static analysis and other heavy operations 28 | to a separate Emacs process. This decoupling not only improves responsiveness 29 | in the primary editor but also enables parallelism, making large-scale analysis 30 | more practical. 31 | 32 | ## 🖼️ Gallery 33 | 34 | ### Completion 35 | 36 | 37 | 38 | ### Hover 39 | 40 | 41 | 42 | ### Signature Help 43 | 44 | 45 | 46 | ## 🔧 Prerequisites 47 | 48 | Before installation, make sure you have all the following software installed! 49 | 50 | - [Emacs](https://www.gnu.org/software/emacs/) 51 | - [Eask](https://github.com/emacs-eask/cli) 52 | 53 | ## 💾 Installation 54 | 55 | > [!IMPORTANT] 56 | > 57 | > Ellsp can only be used with projects that utilize Eask as their package manager. 58 | > Ensure your project is properly set up with Eask before using Ellsp. 59 | 60 | Add these lines to your `Eask`-file: 61 | 62 | ```elisp 63 | (source 'gnu) 64 | (source 'melpa) 65 | (source 'jcs-elpa) 66 | 67 | (development 68 | (depends-on "ellsp")) 69 | ``` 70 | 71 | Then install the language server: 72 | 73 | ```sh 74 | # Install ellsp package. 75 | eask install-deps --dev 76 | 77 | # Install the proxy server. 78 | eask exec install-ellsp 79 | ``` 80 | 81 | To test to see if the server installed successfully, execute the following command: 82 | 83 | ```sh 84 | eask exec ellsp 85 | ``` 86 | 87 | If you see the following screen (no error), you successfully installed the language server! 🎉🥳 88 | 89 | ```sh 90 | Updating environment variables... done v 91 | Exporting environment variables... done v 92 | 18:45:59 [INFO ] Starting the language server... 93 | ``` 94 | 95 | *🔊 P.S. Nothing output afterward because the language server is waiting for the 96 | language client to connect!* 97 | 98 | ## 🔬 Development 99 | 100 | To test the language server locally: 101 | 102 | ```sh 103 | # Add link to current package 104 | eask link add ellsp ./ 105 | ``` 106 | 107 | Then follow the same steps as installation: 108 | 109 | ```sh 110 | # Install the proxy server. 111 | eask exec install-ellsp 112 | 113 | # Test the language server. 114 | eask exec ellsp 115 | ``` 116 | 117 | ## 🔗 References 118 | 119 | - [Language Server Protocol Specification][LSP Specification] 120 | - [Elsa][] 121 | 122 | ## Contribute 123 | 124 | [![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg)](http://makeapullrequest.com) 125 | [![Elisp styleguide](https://img.shields.io/badge/elisp-style%20guide-purple)](https://github.com/bbatsov/emacs-lisp-style-guide) 126 | [![Donate on paypal](https://img.shields.io/badge/paypal-donate-1?logo=paypal&color=blue)](https://www.paypal.me/jcs090218) 127 | [![Become a patron](https://img.shields.io/badge/patreon-become%20a%20patron-orange.svg?logo=patreon)](https://www.patreon.com/jcs090218) 128 | 129 | If you would like to contribute to this project, you may either 130 | clone or make pull requests to this repository. Or you can 131 | clone the project and establish your branch of this tool. 132 | Any methods are welcome! 133 | 134 | ## ⚜️ License 135 | 136 | This program is free software; you can redistribute it and/or modify 137 | it under the terms of the GNU General Public License as published by 138 | the Free Software Foundation, either version 3 of the License, or 139 | (at your option) any later version. 140 | 141 | This program is distributed in the hope that it will be useful, 142 | but WITHOUT ANY WARRANTY; without even the implied warranty of 143 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 144 | GNU General Public License for more details. 145 | 146 | You should have received a copy of the GNU General Public License 147 | along with this program. If not, see . 148 | 149 | See [`LICENSE`](./LICENSE) for details. 150 | 151 | 152 | 153 | 154 | [LSP Specification]: https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification/ 155 | [Elsa]: https://github.com/emacs-elsa/Elsa 156 | -------------------------------------------------------------------------------- /bin/.gitignore: -------------------------------------------------------------------------------- 1 | # ignore these directories 2 | /.git 3 | /recipes 4 | 5 | # ignore log files 6 | /.log 7 | 8 | # ignore generated files 9 | *.elc 10 | 11 | # eask packages 12 | .eask/ 13 | dist/ 14 | 15 | # packaging 16 | *-autoloads.el 17 | *-pkg.el 18 | 19 | # personal test 20 | /_test 21 | 22 | # ignore executables 23 | ellsp-linux 24 | ellsp-macos 25 | ellsp-win.exe 26 | ellsp 27 | 28 | # local development 29 | /LICENSE 30 | /README.md -------------------------------------------------------------------------------- /bin/install-ellsp: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | # Copyright (C) 2023-2025 the Ellsp authors. 4 | 5 | # This program is free software; you can redistribute it and/or modify 6 | # it under the terms of the GNU General Public License as published by 7 | # the Free Software Foundation; either version 3, or (at your option) 8 | # any later version. 9 | 10 | # This program is distributed in the hope that it will be useful, 11 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | # GNU General Public License for more details. 14 | 15 | # You should have received a copy of the GNU General Public License 16 | # along with this program. If not, see . 17 | 18 | ## Commentary: 19 | # 20 | # TODO(everyone): Keep this script simple and easily auditable. 21 | # 22 | 23 | set -e 24 | 25 | if ! command -v unzip >/dev/null; then 26 | echo "Error: unzip is required to install Ellsp." 1>&2 27 | exit 1 28 | fi 29 | 30 | if [ "$OS" = "Windows_NT" ]; then 31 | ext="zip" 32 | else 33 | ext="tar.gz" 34 | fi 35 | 36 | if [ "$OS" = "Windows_NT" ]; then 37 | target="win-x64" 38 | else 39 | case $(uname -sm) in 40 | "Darwin x86_64") target="macos-x64" ;; 41 | "Darwin arm64") target="macos-arm64" ;; 42 | "Linux aarch64") target="linux-arm64" ;; 43 | *) target="linux-x64" ;; 44 | esac 45 | fi 46 | 47 | ellsp_uri="https://github.com/elisp-lsp/ellsp/releases/latest/download/ellsp_${target}.${ext}" 48 | 49 | SDIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd ) 50 | 51 | ellsp_bin_dir=${SDIR} 52 | dwd_file=$ellsp_bin_dir/ellsp.${ext} 53 | 54 | mkdir -p $ellsp_bin_dir 55 | 56 | curl -fsSL $ellsp_uri -o $dwd_file 57 | 58 | if [ "$OS" = "Windows_NT" ]; then 59 | unzip -d "$ellsp_bin_dir" -o "$dwd_file" 60 | else 61 | tar -xvzf "$dwd_file" -C "$ellsp_bin_dir" 62 | fi 63 | 64 | rm $dwd_file 65 | 66 | echo 67 | echo "✓ Ellsp is installed in ${ellsp_bin_dir}." 68 | echo 69 | -------------------------------------------------------------------------------- /bin/install-ellsp.bat: -------------------------------------------------------------------------------- 1 | @echo off 2 | 3 | :: Copyright (C) 2023-2025 the Ellsp authors. 4 | 5 | :: This program is free software; you can redistribute it and/or modify 6 | :: it under the terms of the GNU General Public License as published by 7 | :: the Free Software Foundation; either version 3, or (at your option) 8 | :: any later version. 9 | 10 | :: This program is distributed in the hope that it will be useful, 11 | :: but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | :: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | :: GNU General Public License for more details. 14 | 15 | :: You should have received a copy of the GNU General Public License 16 | :: along with this program. If not, see . 17 | 18 | ::: Commentary: 19 | :: 20 | :: TODO(everyone): Keep this script simple and easily auditable. 21 | :: 22 | 23 | if "%PROCESSOR_ARCHITECTURE%" == "AMD64" ( 24 | set ARCH=x64 25 | ) else if "%PROCESSOR_ARCHITECTURE%" == "ARM64" ( 26 | set ARCH=arm64 27 | ) else ( 28 | echo Error: Unsupported architecture detected: `%PROCESSOR_ARCHITECTURE%`. 29 | exit /b 1 30 | ) 31 | 32 | set URL=https://github.com/elisp-lsp/ellsp/releases/latest/download/ellsp_win-%ARCH%.zip 33 | set ELLSP_BIN_DIR=%~dp0 34 | set ZIP=%ELLSP_BIN_DIR%\ellsp.zip 35 | 36 | curl.exe -fsSL %URL% -o %ZIP% 37 | 38 | tar.exe -xf %ZIP% -C %ELLSP_BIN_DIR% 39 | 40 | del %ZIP% 41 | 42 | echo. 43 | echo ✓ Ellsp is installed in %ELLSP_BIN_DIR%. 44 | echo. 45 | -------------------------------------------------------------------------------- /ellsp-client.el: -------------------------------------------------------------------------------- 1 | ;;; ellsp-client.el --- Language client -*- lexical-binding: t; -*- 2 | 3 | ;; Copyright (C) 2025 Shen, Jen-Chieh 4 | 5 | ;; This file is not part of GNU Emacs. 6 | 7 | ;; This program is free software: you can redistribute it and/or modify 8 | ;; it under the terms of the GNU General Public License as published by 9 | ;; the Free Software Foundation, either version 3 of the License, or 10 | ;; (at your option) any later version. 11 | 12 | ;; This program is distributed in the hope that it will be useful, 13 | ;; but WITHOUT ANY WARRANTY; without even the implied warranty of 14 | ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 | ;; GNU General Public License for more details. 16 | 17 | ;; You should have received a copy of the GNU General Public License 18 | ;; along with this program. If not, see . 19 | 20 | ;;; Commentary: 21 | ;; 22 | ;; Language client. 23 | ;; 24 | 25 | ;;; Code: 26 | 27 | (require 'lsp-mode) 28 | 29 | (require 'ellsp-util) 30 | (require 'ellsp) 31 | 32 | (defun ellsp--executable () 33 | "Return the language server executable name." 34 | (pcase system-type 35 | (`windows-nt "ellsp.exe") 36 | (_ "ellsp"))) 37 | 38 | ;;;###autoload 39 | (defun ellsp-register () 40 | "Register to start using this language server." 41 | (interactive) 42 | (add-to-list 'lsp-language-id-configuration '(emacs-lisp-mode . "emacs-lisp")) 43 | (lsp-register-client 44 | (make-lsp-client 45 | :new-connection 46 | (lsp-stdio-connection 47 | (lambda () 48 | (cond ((locate-dominating-file (buffer-file-name) "Eask") 49 | (list "eask" "exec" (ellsp--executable))) 50 | (t (error "Ellsp Language Server can only run with Eask"))))) 51 | :major-modes '(emacs-lisp-mode) 52 | :priority 1 53 | :server-id 'ellsp))) 54 | 55 | (provide 'ellsp-client) 56 | ;;; ellsp-client.el ends here 57 | -------------------------------------------------------------------------------- /ellsp-code-action.el: -------------------------------------------------------------------------------- 1 | ;;; ellsp-code-action.el --- Code action -*- lexical-binding: t; -*- 2 | 3 | ;; Copyright (C) 2025 Shen, Jen-Chieh 4 | 5 | ;; This file is not part of GNU Emacs. 6 | 7 | ;; This program is free software: you can redistribute it and/or modify 8 | ;; it under the terms of the GNU General Public License as published by 9 | ;; the Free Software Foundation, either version 3 of the License, or 10 | ;; (at your option) any later version. 11 | 12 | ;; This program is distributed in the hope that it will be useful, 13 | ;; but WITHOUT ANY WARRANTY; without even the implied warranty of 14 | ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 | ;; GNU General Public License for more details. 16 | 17 | ;; You should have received a copy of the GNU General Public License 18 | ;; along with this program. If not, see . 19 | 20 | ;;; Commentary: 21 | ;; 22 | ;; Code action. 23 | ;; 24 | 25 | ;;; Code: 26 | 27 | (require 'ellsp-util) 28 | 29 | (defun ellsp--handle-textDocument/codeAction (id params) 30 | "Handle method `textDocument/codeAction'." 31 | (-let* (((&CodeActionParams :text-document (&TextDocumentIdentifier :uri) 32 | :context (&CodeActionContext :diagnostics) 33 | :range (&Range :start :end)) 34 | params) 35 | (file (lsp--uri-to-path uri)) 36 | (buffer (ellsp-get-buffer ellsp-workspace file))) 37 | (ellsp-current-buffer buffer 38 | (forward-line line) 39 | (forward-char character) 40 | ;; TODO: .. 41 | ))) 42 | 43 | (provide 'ellsp-code-action) 44 | ;;; ellsp-code-action.el ends here 45 | -------------------------------------------------------------------------------- /ellsp-completion.el: -------------------------------------------------------------------------------- 1 | ;;; ellsp-completion.el --- Completion Handler -*- lexical-binding: t; -*- 2 | 3 | ;; Copyright (C) 2023-2025 Shen, Jen-Chieh 4 | 5 | ;; This file is not part of GNU Emacs. 6 | 7 | ;; This program is free software: you can redistribute it and/or modify 8 | ;; it under the terms of the GNU General Public License as published by 9 | ;; the Free Software Foundation, either version 3 of the License, or 10 | ;; (at your option) any later version. 11 | 12 | ;; This program is distributed in the hope that it will be useful, 13 | ;; but WITHOUT ANY WARRANTY; without even the implied warranty of 14 | ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 | ;; GNU General Public License for more details. 16 | 17 | ;; You should have received a copy of the GNU General Public License 18 | ;; along with this program. If not, see . 19 | 20 | ;;; Commentary: 21 | ;; 22 | ;; Completion Handler. 23 | ;; 24 | 25 | ;;; Code: 26 | 27 | (require 'company) 28 | (require 'company-capf) 29 | (require 'lsp-completion) 30 | 31 | (require 'ellsp-util) 32 | 33 | (defun ellsp--convert-kind (kind) 34 | "Convert company's KIND to lsp-mode's kind." 35 | (setq kind (ellsp-2str kind)) 36 | (or (cl-position (capitalize kind) lsp-completion--item-kind :test #'equal) 37 | lsp/completion-item-kind-text)) 38 | 39 | (defun ellsp--capf-completions () 40 | "Fallback completions engine is the `elisp-completion-at-point'." 41 | (let* ((prefix (company-capf 'prefix)) 42 | (candidates (apply #'company-capf (cons 'candidates prefix)))) 43 | (mapcar (lambda (candidate) 44 | (lsp-make-completion-item 45 | :label candidate 46 | ;; XXX: The documentation take so much performance, so it's 47 | ;; currently disabled! Hopefully, I am able to figure this out 48 | ;; in the future! 49 | ;;:documentation? (or (ignore-errors (documentation (intern candidate))) 50 | ;; "No documentation") 51 | :deprecated? (if (null (company-capf 'deprecated candidate)) 52 | json-false 53 | t) 54 | :kind? (ellsp--convert-kind (company-capf 'kind candidate)))) 55 | candidates))) 56 | 57 | (defun ellsp--handle-textDocument/completion (id params) 58 | "Handle method `textDocument/completion'." 59 | (-let* (((&CompletionParams :text-document (&TextDocumentIdentifier :uri) 60 | :position (&Position :line :character)) 61 | params) 62 | (file (lsp--uri-to-path uri)) 63 | (buffer (ellsp-get-buffer ellsp-workspace file))) 64 | (ellsp-current-buffer buffer 65 | (forward-line line) 66 | (forward-char character) 67 | (lsp--make-response 68 | id 69 | (lsp-make-completion-list 70 | :is-incomplete json-false 71 | :items (apply #'vector (ellsp--capf-completions))))))) 72 | 73 | (provide 'ellsp-completion) 74 | ;;; ellsp-completion.el ends here 75 | -------------------------------------------------------------------------------- /ellsp-hover.el: -------------------------------------------------------------------------------- 1 | ;;; ellsp-hover.el --- Hover Handler -*- lexical-binding: t; -*- 2 | 3 | ;; Copyright (C) 2023-2025 Shen, Jen-Chieh 4 | 5 | ;; This file is not part of GNU Emacs. 6 | 7 | ;; This program is free software: you can redistribute it and/or modify 8 | ;; it under the terms of the GNU General Public License as published by 9 | ;; the Free Software Foundation, either version 3 of the License, or 10 | ;; (at your option) any later version. 11 | 12 | ;; This program is distributed in the hope that it will be useful, 13 | ;; but WITHOUT ANY WARRANTY; without even the implied warranty of 14 | ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 | ;; GNU General Public License for more details. 16 | 17 | ;; You should have received a copy of the GNU General Public License 18 | ;; along with this program. If not, see . 19 | 20 | ;;; Commentary: 21 | ;; 22 | ;; Hover Handler. 23 | ;; 24 | 25 | ;;; Code: 26 | 27 | (require 'ellsp-util) 28 | 29 | (defun ellsp--describe-string () 30 | "Return the describe symbol string." 31 | (let ((thing (symbol-at-point))) 32 | (with-current-buffer (help-buffer) 33 | (let (buffer-read-only) (erase-buffer)) 34 | (msgu-silent (describe-symbol thing)) 35 | (buffer-string)))) 36 | 37 | (defun ellsp--describe-at-point () 38 | "Describe symbol at point." 39 | (when-let* (((derived-mode-p 'lisp-data-mode)) 40 | (desc (ellsp--describe-string))) 41 | (if (or (string-empty-p desc) 42 | (string= (string-trim desc) "[back]")) 43 | nil 44 | desc))) 45 | 46 | (defun ellsp--handle-textDocument/hover (id params) 47 | "Handle method `textDocument/hover'." 48 | (-let* (((&HoverParams :text-document (&TextDocumentIdentifier :uri) 49 | :position (&Position :line :character)) 50 | params) 51 | (file (lsp--uri-to-path uri)) 52 | (buffer (ellsp-get-buffer ellsp-workspace file))) 53 | (ellsp-current-buffer buffer 54 | (forward-line line) 55 | (forward-char character) 56 | (when-let* ((desc (ellsp--describe-at-point)) 57 | (line (line-number-at-pos nil t)) 58 | (line (1- line)) ; zero-based 59 | (column-beg (save-excursion (forward-symbol -1) (current-column))) 60 | (column-end (save-excursion (forward-symbol 1) (current-column)))) 61 | (lsp--make-response 62 | id 63 | (lsp-make-hover 64 | :contents (lsp-make-markup-content 65 | :kind "plaintext" 66 | :value desc) 67 | :range (lsp-make-range 68 | :start (lsp-make-position 69 | :line line 70 | :character column-beg) 71 | :end (lsp-make-position 72 | :line line 73 | :character column-end)))))))) 74 | 75 | (provide 'ellsp-hover) 76 | ;;; ellsp-hover.el ends here 77 | -------------------------------------------------------------------------------- /ellsp-log.el: -------------------------------------------------------------------------------- 1 | ;;; ellsp-log.el --- Logger module -*- lexical-binding: t; -*- 2 | 3 | ;; Copyright (C) 2023-2025 Shen, Jen-Chieh 4 | 5 | ;; This file is not part of GNU Emacs. 6 | 7 | ;; This program is free software: you can redistribute it and/or modify 8 | ;; it under the terms of the GNU General Public License as published by 9 | ;; the Free Software Foundation, either version 3 of the License, or 10 | ;; (at your option) any later version. 11 | 12 | ;; This program is distributed in the hope that it will be useful, 13 | ;; but WITHOUT ANY WARRANTY; without even the implied warranty of 14 | ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 | ;; GNU General Public License for more details. 16 | 17 | ;; You should have received a copy of the GNU General Public License 18 | ;; along with this program. If not, see . 19 | 20 | ;;; Commentary: 21 | ;; 22 | ;; Logger module. 23 | ;; 24 | 25 | ;;; Code: 26 | 27 | (require 'log4e) 28 | 29 | ;; XXX: The enitre module is unusable on Unix-like system since they will 30 | ;; interfere the standard ouput. 31 | 32 | (with-no-warnings 33 | (log4e:deflogger "ellsp" "%t [%l] %m" "%H:%M:%S" '((fatal . "fatal") 34 | (error . "error") 35 | (warn . "warn") 36 | (info . "info") 37 | (debug . "debug") 38 | (trace . "trace")))) 39 | 40 | ;;(ellsp--log-enable-debugging) 41 | ;;(ellsp--log-enable-messaging) 42 | ;;(ellsp--log-enable-logging) 43 | 44 | (defun ellsp-output (&rest _) 45 | "Output log file." 46 | ;; (let ((log-file "./.log/ellsp.log")) 47 | ;; (ignore-errors (make-directory (file-name-directory log-file) t)) 48 | ;; (with-temp-buffer 49 | ;; (ellsp--log-open-log) 50 | ;; (write-region (point-min) (point-max) log-file))) 51 | ) 52 | 53 | (advice-add #'ellsp--fatal :after #'ellsp-output) 54 | (advice-add #'ellsp--error :after #'ellsp-output) 55 | (advice-add #'ellsp--warn :after #'ellsp-output) 56 | (advice-add #'ellsp--info :after #'ellsp-output) 57 | (advice-add #'ellsp--debug :after #'ellsp-output) 58 | (advice-add #'ellsp--trace :after #'ellsp-output) 59 | 60 | (provide 'ellsp-log) 61 | ;;; ellsp-log.el ends here 62 | -------------------------------------------------------------------------------- /ellsp-signature.el: -------------------------------------------------------------------------------- 1 | ;;; ellsp-signature.el --- Signature Handler -*- lexical-binding: t; -*- 2 | 3 | ;; Copyright (C) 2023-2025 Shen, Jen-Chieh 4 | 5 | ;; This file is not part of GNU Emacs. 6 | 7 | ;; This program is free software: you can redistribute it and/or modify 8 | ;; it under the terms of the GNU General Public License as published by 9 | ;; the Free Software Foundation, either version 3 of the License, or 10 | ;; (at your option) any later version. 11 | 12 | ;; This program is distributed in the hope that it will be useful, 13 | ;; but WITHOUT ANY WARRANTY; without even the implied warranty of 14 | ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 | ;; GNU General Public License for more details. 16 | 17 | ;; You should have received a copy of the GNU General Public License 18 | ;; along with this program. If not, see . 19 | 20 | ;;; Commentary: 21 | ;; 22 | ;; Signature Handler. 23 | ;; 24 | 25 | ;;; Code: 26 | 27 | (require 'cl-lib) 28 | (require 'eldoc) 29 | 30 | (require 'ellsp-util) 31 | 32 | (defvar ellsp-signature--full-string nil 33 | "Record current label.") 34 | 35 | (defvar ellsp-signature--function-name nil 36 | "Record current function name.") 37 | 38 | (defvar ellsp-signature--parameters nil 39 | "Record current parameters name.") 40 | 41 | (defvar ellsp-signature--active-parameter 0 42 | "Record current parameters index.") 43 | 44 | (defun ellsp-chop (string separator) 45 | "Split a STRING without consuming the SEPARATOR." 46 | (cl-loop with seplen = (length separator) 47 | with len = (length string) 48 | with start = 0 49 | with next = seplen 50 | for end = (or (cl-search separator string :start2 next) len) 51 | for chunk = (substring string start end) 52 | collect chunk 53 | while (< end len) 54 | do (setf start end next (+ seplen end)))) 55 | 56 | (defun ellsp-signature--display (docs _interactive) 57 | "Function used to get all the signature information." 58 | (setq ellsp-signature--parameters nil) ; Reset 59 | (let* ((data (car docs)) 60 | (params (car data)) ; string 61 | (metadata (cdr data))) ; plist 62 | (setq ellsp-signature--function-name (plist-get metadata :thing)) 63 | (let* ((params (s-replace "(" "" params)) 64 | (params (s-replace ")" "" params)) 65 | (params (ellsp-chop params "&")) 66 | (count 0)) 67 | (dolist (param params) 68 | (setq param (string-trim param)) 69 | (push param ellsp-signature--parameters) 70 | (when (equal 'eldoc-highlight-function-argument 71 | (get-text-property (1- (length param)) 'face param)) 72 | (setq ellsp-signature--active-parameter count)) 73 | (cl-incf count))) 74 | (setq ellsp-signature--parameters (reverse ellsp-signature--parameters)))) 75 | 76 | (defun ellsp-signature--initialized () 77 | "Initialized event." 78 | (global-eldoc-mode 1) 79 | (setq eldoc-display-functions (append eldoc-display-functions 80 | '( ellsp-signature--display)))) 81 | 82 | (add-hook 'ellsp-initialized-hook #'ellsp-signature--initialized) 83 | 84 | (defun ellsp-signature--parameter-items () 85 | "Return a list of parameter information." 86 | (mapcar (lambda (param) 87 | (lsp-make-parameter-information :label param)) 88 | ellsp-signature--parameters)) 89 | 90 | (defun ellsp-signature--signature-items () 91 | "Return a list of signature items." 92 | ;; XXX: No function overloard. There is function overload but the signature 93 | ;; is the same; therefore, there are no differences in this case. 94 | (list (lsp-make-signature-information 95 | :label ellsp-signature--full-string 96 | :documentation? (documentation ellsp-signature--function-name) 97 | :parameters? (apply #'vector (ellsp-signature--parameter-items))))) 98 | 99 | (defun ellsp--handle-textDocument/signatureHelp (id params) 100 | "Handle method `textDocument/signatureHelp'." 101 | (-let* (((&SignatureHelpParams :text-document (&TextDocumentIdentifier :uri) 102 | :position (&Position :line :character)) 103 | params) 104 | (file (lsp--uri-to-path uri)) 105 | (buffer (ellsp-get-buffer ellsp-workspace file))) 106 | (ellsp-current-buffer buffer 107 | (forward-line line) 108 | (forward-char character) 109 | (cond ((eldoc-print-current-symbol-info) 110 | (setq ellsp-signature--full-string 111 | (with-current-buffer eldoc--doc-buffer (buffer-string))) 112 | (lsp--make-response 113 | id 114 | (lsp-make-signature-help 115 | :active-signature? 0 116 | :signatures (apply #'vector (ellsp-signature--signature-items)) 117 | :active-parameter? ellsp-signature--active-parameter))) 118 | ;; XXX: Send empty signature to cancel popup window! 119 | ;; But, do we really need to do this? 120 | (t 121 | (lsp--make-response id (lsp-make-signature-help :signatures nil))))))) 122 | 123 | (provide 'ellsp-signature) 124 | ;;; ellsp-signature.el ends here 125 | -------------------------------------------------------------------------------- /ellsp-tdsync.el: -------------------------------------------------------------------------------- 1 | ;;; ellsp-tdsync.el --- Text document sync -*- lexical-binding: t; -*- 2 | 3 | ;; Copyright (C) 2023-2025 Shen, Jen-Chieh 4 | 5 | ;; This file is not part of GNU Emacs. 6 | 7 | ;; This program is free software: you can redistribute it and/or modify 8 | ;; it under the terms of the GNU General Public License as published by 9 | ;; the Free Software Foundation, either version 3 of the License, or 10 | ;; (at your option) any later version. 11 | 12 | ;; This program is distributed in the hope that it will be useful, 13 | ;; but WITHOUT ANY WARRANTY; without even the implied warranty of 14 | ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 | ;; GNU General Public License for more details. 16 | 17 | ;; You should have received a copy of the GNU General Public License 18 | ;; along with this program. If not, see . 19 | 20 | ;;; Commentary: 21 | ;; 22 | ;; Text document sync. 23 | ;; 24 | 25 | ;;; Code: 26 | 27 | (require 'ellsp-util) 28 | 29 | (defclass ellsp-file () 30 | ((name :type string :initarg :name) 31 | (buffer :type buffer :initarg :buffer)) 32 | "Tracked buffer file.") 33 | 34 | (defclass ellsp-state () 35 | ((files 36 | :type hash-table :initform (make-hash-table :test #'equal) 37 | :documentation "Workspace files.") 38 | (dependencies 39 | :type list :initform nil 40 | :documentation "Loaded dependencies. 41 | 42 | We use this list to remove dependencies which don't need to 43 | be re-analysed during textDocument/didOpen handler."))) 44 | 45 | (defvar ellsp-workspace (ellsp-state) 46 | "Workspace state.") 47 | 48 | (cl-defmethod ellsp-get-file ((state ellsp-state) (file string)) 49 | "Return the file if found." 50 | (gethash file (oref state files))) 51 | 52 | (cl-defmethod ellsp-get-buffer ((state ellsp-state) (file string)) 53 | "Get the buffer from workspace state." 54 | (when-let* ((file (ellsp-get-file state file))) 55 | (oref file buffer))) 56 | 57 | (cl-defmethod ellsp-update-file-buffer ((state ellsp-state) (file string) &optional content) 58 | "Sync the text document buffer." 59 | (message "Trying to update file %s" file) 60 | (when-let* ((buffer (ellsp-get-buffer state file))) 61 | (with-current-buffer buffer 62 | (erase-buffer) 63 | (if (and content (stringp content)) 64 | (insert content) 65 | (insert-file-contents file))) 66 | (message "Updated file %s" file))) 67 | 68 | (cl-defmethod ellsp-add-file ((state ellsp-state) (file string)) 69 | "Add a file to workspace." 70 | (message "Added file %s to state" file) 71 | (puthash file 72 | (ellsp-file 73 | :name file 74 | :buffer (with-current-buffer 75 | (get-buffer-create (format "*ellsp:%s*" file)) 76 | (emacs-lisp-mode) 77 | (current-buffer))) 78 | (oref state files)) 79 | (ellsp-update-file-buffer state file)) 80 | 81 | (defun ellsp--handle-textDocument/didOpen (params) 82 | "On method `textDocument/didOpen'." 83 | (-let* (((&DidOpenTextDocumentParams :text-document (&TextDocumentItem :uri :version)) params) 84 | (file (lsp--uri-to-path uri))) 85 | (ellsp-add-file ellsp-workspace file) 86 | nil)) 87 | 88 | (defun ellsp--handle-textDocument/didSave (params) 89 | "On method `textDocument/didSave'." 90 | (-let* (((&DidSaveTextDocumentParams :text-document (&TextDocumentItem :uri :version)) params) 91 | (file (lsp--uri-to-path uri))) 92 | (ellsp-update-file-buffer ellsp-workspace file) 93 | nil)) 94 | 95 | (defun ellsp--handle-textDocument/didChange (params) 96 | "On method `textDocument/didChange'." 97 | (-let* (((&DidChangeTextDocumentParams 98 | :text-document (&VersionedTextDocumentIdentifier :uri :version?) 99 | :content-changes [(&TextDocumentContentChangeEvent :text)]) 100 | params) 101 | (file (lsp--uri-to-path uri)) 102 | (buffer (ellsp-get-buffer ellsp-workspace file))) 103 | (ellsp-update-file-buffer ellsp-workspace file text) 104 | nil)) 105 | 106 | (provide 'ellsp-tdsync) 107 | ;;; ellsp-tdsync.el ends here 108 | -------------------------------------------------------------------------------- /ellsp-util.el: -------------------------------------------------------------------------------- 1 | ;;; ellsp-util.el --- Util module -*- lexical-binding: t; -*- 2 | 3 | ;; Copyright (C) 2025 Shen, Jen-Chieh 4 | 5 | ;; This file is not part of GNU Emacs. 6 | 7 | ;; This program is free software: you can redistribute it and/or modify 8 | ;; it under the terms of the GNU General Public License as published by 9 | ;; the Free Software Foundation, either version 3 of the License, or 10 | ;; (at your option) any later version. 11 | 12 | ;; This program is distributed in the hope that it will be useful, 13 | ;; but WITHOUT ANY WARRANTY; without even the implied warranty of 14 | ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 | ;; GNU General Public License for more details. 16 | 17 | ;; You should have received a copy of the GNU General Public License 18 | ;; along with this program. If not, see . 19 | 20 | ;;; Commentary: 21 | ;; 22 | ;; Util module. 23 | ;; 24 | 25 | ;;; Code: 26 | 27 | (defun ellsp-2str (obj) 28 | "Convert OBJ to string." 29 | (format "%s" obj)) 30 | 31 | (defmacro ellsp-current-buffer (buffer &rest body) 32 | "Execute BODY with in a valid BUFFER." 33 | (declare (indent 1)) 34 | `(when ,buffer 35 | (with-current-buffer ,buffer 36 | (goto-char (point-min)) 37 | ,@body))) 38 | 39 | (provide 'ellsp-util) 40 | ;;; ellsp-util.el ends here 41 | -------------------------------------------------------------------------------- /ellsp.el: -------------------------------------------------------------------------------- 1 | ;;; ellsp.el --- Elisp Language Server -*- lexical-binding: t; -*- 2 | 3 | ;; Copyright (C) 2023-2025 Shen, Jen-Chieh 4 | 5 | ;; Author: Shen, Jen-Chieh 6 | ;; Maintainer: Shen, Jen-Chieh 7 | ;; URL: https://github.com/elisp-lsp/ellsp 8 | ;; Version: 0.2.0 9 | ;; Package-Requires: ((emacs "28.1") (lsp-mode "6.0.1") (log4e "0.1.0") (dash "2.14.1") (s "1.12.0") (company "0.8.12") (msgu "0.1.0")) 10 | ;; Keywords: convenience lsp 11 | 12 | ;; This file is not part of GNU Emacs. 13 | 14 | ;; This program is free software: you can redistribute it and/or modify 15 | ;; it under the terms of the GNU General Public License as published by 16 | ;; the Free Software Foundation, either version 3 of the License, or 17 | ;; (at your option) any later version. 18 | 19 | ;; This program is distributed in the hope that it will be useful, 20 | ;; but WITHOUT ANY WARRANTY; without even the implied warranty of 21 | ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 22 | ;; GNU General Public License for more details. 23 | 24 | ;; You should have received a copy of the GNU General Public License 25 | ;; along with this program. If not, see . 26 | 27 | ;;; Commentary: 28 | ;; 29 | ;; Elisp Language Server. 30 | ;; 31 | 32 | ;;; Code: 33 | 34 | (require 'cl-lib) 35 | (require 'pcase) 36 | (require 'lsp-mode) 37 | (require 'dash) 38 | (require 's) 39 | (require 'msgu) 40 | 41 | (require 'ellsp-util) 42 | (require 'ellsp-log) 43 | (require 'ellsp-tdsync) 44 | (require 'ellsp-completion) 45 | (require 'ellsp-hover) 46 | (require 'ellsp-signature) 47 | (require 'ellsp-code-action) 48 | 49 | (defconst ellsp-version "0.2.0" 50 | "The elisp langauge server version.") 51 | 52 | (defgroup ellsp nil 53 | "Elisp Language Server." 54 | :prefix "ellsp-" 55 | :group 'tool 56 | :link '(url-link :tag "Repository" "https://github.com/elisp-lsp/ellsp")) 57 | 58 | (defcustom ellsp-eol (pcase system-type 59 | ;; XXX: Don't know why `\r\n' does not work with VSCode 60 | ;; on Window; and don't know why `\n' will work... 61 | (`windows-nt "\n") 62 | (_ "\r\n")) 63 | "EOL for send messages." 64 | :type 'string 65 | :group 'ellsp) 66 | 67 | (defvar ellsp--running-p t 68 | "Non-nil when the server is still running.") 69 | 70 | (defvar ellsp--initialized-p nil 71 | "Non-nil when it initialize successfully.") 72 | 73 | (defcustom ellsp-initialized-hook nil 74 | "Hook runs after the server is initialized." 75 | :type 'hook 76 | :group 'ellsp) 77 | 78 | (defun ellsp-send-response (msg) 79 | "Send response MSG." 80 | (when (or (hash-table-p msg) 81 | (and (listp msg) (plist-get msg :jsonrpc))) 82 | (setq msg (lsp--json-serialize msg))) 83 | (setq msg (concat "Content-Length: " 84 | (ellsp-2str (string-bytes msg)) 85 | ellsp-eol ellsp-eol 86 | msg)) 87 | (princ msg) 88 | (terpri) 89 | msg) 90 | 91 | (defun ellsp--initialize (id) 92 | "Initialize the language server." 93 | (lsp--make-response 94 | id 95 | (lsp-make-initialize-result 96 | :server-info (lsp-make-server-info 97 | :name "ellsp" 98 | :version? ellsp-version) 99 | :capabilities (lsp-make-server-capabilities 100 | :hover-provider? t 101 | :text-document-sync? (lsp-make-text-document-sync-options 102 | :open-close? t 103 | :save? t 104 | :change? 1) 105 | ;; :code-action-provider? (lsp-make-code-action-options 106 | ;; :resolve-provider? json-false) 107 | :completion-provider? (lsp-make-completion-options 108 | :resolve-provider? json-false) 109 | :signature-help-provider? (lsp-make-signature-help-options 110 | :trigger-characters? [" "]))))) 111 | 112 | (defun ellsp--initialized () 113 | "After server initialization." 114 | (setq ellsp--initialized-p t) 115 | (run-hooks 'ellsp-initialized-hook) 116 | nil) 117 | 118 | (defun ellsp--shutdown () 119 | "Shutdown language server." 120 | (setq ellsp--running-p nil)) 121 | 122 | (defun ellsp--on-request (id method params) 123 | "On request callback." 124 | (message "method: %s" method) 125 | (let ((res 126 | (pcase method 127 | ("initialize" (ellsp--initialize id)) 128 | ("initialized" (ellsp--initialized)) 129 | ("shutdown" (ellsp--shutdown)) 130 | ("textDocument/didOpen" (ellsp--handle-textDocument/didOpen params)) 131 | ("textDocument/didSave" (ellsp--handle-textDocument/didSave params)) 132 | ("textDocument/didChange" (ellsp--handle-textDocument/didChange params)) 133 | ("textDocument/codeAction" (ellsp--handle-textDocument/codeAction id params)) 134 | ("textDocument/completion" (ellsp--handle-textDocument/completion id params)) 135 | ("textDocument/hover" (ellsp--handle-textDocument/hover id params)) 136 | ("textDocument/signatureHelp" (ellsp--handle-textDocument/signatureHelp id params)) 137 | ;; Emacs is single threaded, skip it. 138 | ("$/cancelRequest" nil)))) 139 | (cond ((not res) 140 | (message "<< %s" "no response")) 141 | ((when-let* ((res (ignore-errors (lsp--json-serialize res)))) 142 | (message "<< %s" res) 143 | (ellsp-send-response res))) 144 | ((when-let* ((res (ignore-errors (json-encode res)))) 145 | (message "<< %s" res) 146 | (ellsp-send-response res))) 147 | (t 148 | (message "<< %s" "failed to send response"))))) 149 | 150 | (defun ellsp--get-content-length (input) 151 | "Return the content length from INPUT." 152 | (string-to-number (nth 1 (split-string input ": ")))) 153 | 154 | (defvar ellsp-next-input nil) 155 | 156 | (defun ellsp-stdin-loop () 157 | "Reads from standard input in a loop and process incoming requests." 158 | (ellsp--info "Starting the language server...") 159 | (let ((input) 160 | (content-length)) 161 | (while (and ellsp--running-p 162 | (progn 163 | (setq input (or ellsp-next-input 164 | (read-from-minibuffer ""))) 165 | input)) 166 | (unless (string-empty-p input) 167 | ;; XXX: Function `s-replace' is used to avoid the following error: 168 | ;; 169 | ;; Invalid use of `\' in replacement text ... 170 | (ellsp--info (s-replace "\\" "\\\\" input))) 171 | (setq ellsp-next-input nil) ; Reset 172 | (cond 173 | ((string-empty-p input) ) 174 | ((and (null content-length) 175 | (string-prefix-p "content-length: " input t)) 176 | (setq content-length (ellsp--get-content-length input))) 177 | (content-length 178 | (when (string-match-p "content-length: [0-9\r\n]+$" input) 179 | (with-temp-buffer 180 | (insert input) 181 | (when (search-backward "content-length: " nil t) 182 | (setq input (buffer-substring-no-properties (point-min) (point)) 183 | ellsp-next-input (buffer-substring-no-properties (point) (point-max)))))) 184 | (-let* (((&JSONResponse :params :method :id) (lsp--read-json input))) 185 | (condition-case err 186 | (ellsp--on-request id method params) 187 | (error (ellsp--error "Ellsp error: %s" 188 | (error-message-string err))))) 189 | (setq content-length nil)))))) 190 | 191 | (provide 'ellsp) 192 | ;;; ellsp.el ends here 193 | -------------------------------------------------------------------------------- /etc/completion.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/elisp-lsp/ellsp/d9438092ba4eb4859fa902c325bede7b94d64a81/etc/completion.png -------------------------------------------------------------------------------- /etc/hover.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/elisp-lsp/ellsp/d9438092ba4eb4859fa902c325bede7b94d64a81/etc/hover.png -------------------------------------------------------------------------------- /etc/signature.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/elisp-lsp/ellsp/d9438092ba4eb4859fa902c325bede7b94d64a81/etc/signature.png -------------------------------------------------------------------------------- /proxy/.gitignore: -------------------------------------------------------------------------------- 1 | ### Node ### 2 | # Logs 3 | logs 4 | *.log 5 | npm-debug.log* 6 | yarn-debug.log* 7 | yarn-error.log* 8 | lerna-debug.log* 9 | .pnpm-debug.log* 10 | 11 | # Diagnostic reports (https://nodejs.org/api/report.html) 12 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json 13 | 14 | # Runtime data 15 | pids 16 | *.pid 17 | *.seed 18 | *.pid.lock 19 | 20 | # Directory for instrumented libs generated by jscoverage/JSCover 21 | lib-cov 22 | 23 | # Coverage directory used by tools like istanbul 24 | coverage 25 | *.lcov 26 | 27 | # nyc test coverage 28 | .nyc_output 29 | 30 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) 31 | .grunt 32 | 33 | # Bower dependency directory (https://bower.io/) 34 | bower_components 35 | 36 | # node-waf configuration 37 | .lock-wscript 38 | 39 | # Compiled binary addons (https://nodejs.org/api/addons.html) 40 | build/Release 41 | 42 | # Dependency directories 43 | node_modules/ 44 | jspm_packages/ 45 | 46 | # Snowpack dependency directory (https://snowpack.dev/) 47 | web_modules/ 48 | 49 | # TypeScript cache 50 | *.tsbuildinfo 51 | 52 | # Optional npm cache directory 53 | .npm 54 | 55 | # Optional eslint cache 56 | .eslintcache 57 | 58 | # Optional stylelint cache 59 | .stylelintcache 60 | 61 | # Microbundle cache 62 | .rpt2_cache/ 63 | .rts2_cache_cjs/ 64 | .rts2_cache_es/ 65 | .rts2_cache_umd/ 66 | 67 | # Optional REPL history 68 | .node_repl_history 69 | 70 | # Output of 'npm pack' 71 | *.tgz 72 | 73 | # Yarn Integrity file 74 | .yarn-integrity 75 | 76 | # dotenv environment variable files 77 | .env 78 | .env.development.local 79 | .env.test.local 80 | .env.production.local 81 | .env.local 82 | 83 | # parcel-bundler cache (https://parceljs.org/) 84 | .cache 85 | .parcel-cache 86 | 87 | # Next.js build output 88 | .next 89 | out 90 | 91 | # Nuxt.js build / generate output 92 | .nuxt 93 | dist 94 | 95 | # Gatsby files 96 | .cache/ 97 | # Comment in the public line in if your project uses Gatsby and not Next.js 98 | # https://nextjs.org/blog/next-9-1#public-directory-support 99 | # public 100 | 101 | # vuepress build output 102 | .vuepress/dist 103 | 104 | # vuepress v2.x temp and cache directory 105 | .temp 106 | 107 | # Docusaurus cache and generated files 108 | .docusaurus 109 | 110 | # Serverless directories 111 | .serverless/ 112 | 113 | # FuseBox cache 114 | .fusebox/ 115 | 116 | # DynamoDB Local files 117 | .dynamodb/ 118 | 119 | # TernJS port file 120 | .tern-port 121 | 122 | # Stores VSCode versions used for testing VSCode extensions 123 | .vscode-test 124 | 125 | # yarn v2 126 | .yarn/cache 127 | .yarn/unplugged 128 | .yarn/build-state.yml 129 | .yarn/install-state.gz 130 | .pnp.* 131 | 132 | ### Node Patch ### 133 | # Serverless Webpack directories 134 | .webpack/ 135 | 136 | # Optional stylelint cache 137 | 138 | # SvelteKit build / generate output 139 | .svelte-kit 140 | 141 | ### Emacs Specific ### 142 | 143 | # emacs 144 | emacs_backtrace.txt 145 | -------------------------------------------------------------------------------- /proxy/LICENSE: -------------------------------------------------------------------------------- 1 | GNU GENERAL PUBLIC LICENSE 2 | Version 3, 29 June 2007 3 | 4 | Copyright (C) 2007 Free Software Foundation, Inc. 5 | Everyone is permitted to copy and distribute verbatim copies 6 | of this license document, but changing it is not allowed. 7 | 8 | Preamble 9 | 10 | The GNU General Public License is a free, copyleft license for 11 | software and other kinds of works. 12 | 13 | The licenses for most software and other practical works are designed 14 | to take away your freedom to share and change the works. By contrast, 15 | the GNU General Public License is intended to guarantee your freedom to 16 | share and change all versions of a program--to make sure it remains free 17 | software for all its users. We, the Free Software Foundation, use the 18 | GNU General Public License for most of our software; it applies also to 19 | any other work released this way by its authors. You can apply it to 20 | your programs, too. 21 | 22 | When we speak of free software, we are referring to freedom, not 23 | price. Our General Public Licenses are designed to make sure that you 24 | have the freedom to distribute copies of free software (and charge for 25 | them if you wish), that you receive source code or can get it if you 26 | want it, that you can change the software or use pieces of it in new 27 | free programs, and that you know you can do these things. 28 | 29 | To protect your rights, we need to prevent others from denying you 30 | these rights or asking you to surrender the rights. Therefore, you have 31 | certain responsibilities if you distribute copies of the software, or if 32 | you modify it: responsibilities to respect the freedom of others. 33 | 34 | For example, if you distribute copies of such a program, whether 35 | gratis or for a fee, you must pass on to the recipients the same 36 | freedoms that you received. You must make sure that they, too, receive 37 | or can get the source code. And you must show them these terms so they 38 | know their rights. 39 | 40 | Developers that use the GNU GPL protect your rights with two steps: 41 | (1) assert copyright on the software, and (2) offer you this License 42 | giving you legal permission to copy, distribute and/or modify it. 43 | 44 | For the developers' and authors' protection, the GPL clearly explains 45 | that there is no warranty for this free software. For both users' and 46 | authors' sake, the GPL requires that modified versions be marked as 47 | changed, so that their problems will not be attributed erroneously to 48 | authors of previous versions. 49 | 50 | Some devices are designed to deny users access to install or run 51 | modified versions of the software inside them, although the manufacturer 52 | can do so. This is fundamentally incompatible with the aim of 53 | protecting users' freedom to change the software. The systematic 54 | pattern of such abuse occurs in the area of products for individuals to 55 | use, which is precisely where it is most unacceptable. Therefore, we 56 | have designed this version of the GPL to prohibit the practice for those 57 | products. If such problems arise substantially in other domains, we 58 | stand ready to extend this provision to those domains in future versions 59 | of the GPL, as needed to protect the freedom of users. 60 | 61 | Finally, every program is threatened constantly by software patents. 62 | States should not allow patents to restrict development and use of 63 | software on general-purpose computers, but in those that do, we wish to 64 | avoid the special danger that patents applied to a free program could 65 | make it effectively proprietary. To prevent this, the GPL assures that 66 | patents cannot be used to render the program non-free. 67 | 68 | The precise terms and conditions for copying, distribution and 69 | modification follow. 70 | 71 | TERMS AND CONDITIONS 72 | 73 | 0. Definitions. 74 | 75 | "This License" refers to version 3 of the GNU General Public License. 76 | 77 | "Copyright" also means copyright-like laws that apply to other kinds of 78 | works, such as semiconductor masks. 79 | 80 | "The Program" refers to any copyrightable work licensed under this 81 | License. Each licensee is addressed as "you". "Licensees" and 82 | "recipients" may be individuals or organizations. 83 | 84 | To "modify" a work means to copy from or adapt all or part of the work 85 | in a fashion requiring copyright permission, other than the making of an 86 | exact copy. The resulting work is called a "modified version" of the 87 | earlier work or a work "based on" the earlier work. 88 | 89 | A "covered work" means either the unmodified Program or a work based 90 | on the Program. 91 | 92 | To "propagate" a work means to do anything with it that, without 93 | permission, would make you directly or secondarily liable for 94 | infringement under applicable copyright law, except executing it on a 95 | computer or modifying a private copy. Propagation includes copying, 96 | distribution (with or without modification), making available to the 97 | public, and in some countries other activities as well. 98 | 99 | To "convey" a work means any kind of propagation that enables other 100 | parties to make or receive copies. Mere interaction with a user through 101 | a computer network, with no transfer of a copy, is not conveying. 102 | 103 | An interactive user interface displays "Appropriate Legal Notices" 104 | to the extent that it includes a convenient and prominently visible 105 | feature that (1) displays an appropriate copyright notice, and (2) 106 | tells the user that there is no warranty for the work (except to the 107 | extent that warranties are provided), that licensees may convey the 108 | work under this License, and how to view a copy of this License. If 109 | the interface presents a list of user commands or options, such as a 110 | menu, a prominent item in the list meets this criterion. 111 | 112 | 1. Source Code. 113 | 114 | The "source code" for a work means the preferred form of the work 115 | for making modifications to it. "Object code" means any non-source 116 | form of a work. 117 | 118 | A "Standard Interface" means an interface that either is an official 119 | standard defined by a recognized standards body, or, in the case of 120 | interfaces specified for a particular programming language, one that 121 | is widely used among developers working in that language. 122 | 123 | The "System Libraries" of an executable work include anything, other 124 | than the work as a whole, that (a) is included in the normal form of 125 | packaging a Major Component, but which is not part of that Major 126 | Component, and (b) serves only to enable use of the work with that 127 | Major Component, or to implement a Standard Interface for which an 128 | implementation is available to the public in source code form. A 129 | "Major Component", in this context, means a major essential component 130 | (kernel, window system, and so on) of the specific operating system 131 | (if any) on which the executable work runs, or a compiler used to 132 | produce the work, or an object code interpreter used to run it. 133 | 134 | The "Corresponding Source" for a work in object code form means all 135 | the source code needed to generate, install, and (for an executable 136 | work) run the object code and to modify the work, including scripts to 137 | control those activities. However, it does not include the work's 138 | System Libraries, or general-purpose tools or generally available free 139 | programs which are used unmodified in performing those activities but 140 | which are not part of the work. For example, Corresponding Source 141 | includes interface definition files associated with source files for 142 | the work, and the source code for shared libraries and dynamically 143 | linked subprograms that the work is specifically designed to require, 144 | such as by intimate data communication or control flow between those 145 | subprograms and other parts of the work. 146 | 147 | The Corresponding Source need not include anything that users 148 | can regenerate automatically from other parts of the Corresponding 149 | Source. 150 | 151 | The Corresponding Source for a work in source code form is that 152 | same work. 153 | 154 | 2. Basic Permissions. 155 | 156 | All rights granted under this License are granted for the term of 157 | copyright on the Program, and are irrevocable provided the stated 158 | conditions are met. This License explicitly affirms your unlimited 159 | permission to run the unmodified Program. The output from running a 160 | covered work is covered by this License only if the output, given its 161 | content, constitutes a covered work. This License acknowledges your 162 | rights of fair use or other equivalent, as provided by copyright law. 163 | 164 | You may make, run and propagate covered works that you do not 165 | convey, without conditions so long as your license otherwise remains 166 | in force. You may convey covered works to others for the sole purpose 167 | of having them make modifications exclusively for you, or provide you 168 | with facilities for running those works, provided that you comply with 169 | the terms of this License in conveying all material for which you do 170 | not control copyright. Those thus making or running the covered works 171 | for you must do so exclusively on your behalf, under your direction 172 | and control, on terms that prohibit them from making any copies of 173 | your copyrighted material outside their relationship with you. 174 | 175 | Conveying under any other circumstances is permitted solely under 176 | the conditions stated below. Sublicensing is not allowed; section 10 177 | makes it unnecessary. 178 | 179 | 3. Protecting Users' Legal Rights From Anti-Circumvention Law. 180 | 181 | No covered work shall be deemed part of an effective technological 182 | measure under any applicable law fulfilling obligations under article 183 | 11 of the WIPO copyright treaty adopted on 20 December 1996, or 184 | similar laws prohibiting or restricting circumvention of such 185 | measures. 186 | 187 | When you convey a covered work, you waive any legal power to forbid 188 | circumvention of technological measures to the extent such circumvention 189 | is effected by exercising rights under this License with respect to 190 | the covered work, and you disclaim any intention to limit operation or 191 | modification of the work as a means of enforcing, against the work's 192 | users, your or third parties' legal rights to forbid circumvention of 193 | technological measures. 194 | 195 | 4. Conveying Verbatim Copies. 196 | 197 | You may convey verbatim copies of the Program's source code as you 198 | receive it, in any medium, provided that you conspicuously and 199 | appropriately publish on each copy an appropriate copyright notice; 200 | keep intact all notices stating that this License and any 201 | non-permissive terms added in accord with section 7 apply to the code; 202 | keep intact all notices of the absence of any warranty; and give all 203 | recipients a copy of this License along with the Program. 204 | 205 | You may charge any price or no price for each copy that you convey, 206 | and you may offer support or warranty protection for a fee. 207 | 208 | 5. Conveying Modified Source Versions. 209 | 210 | You may convey a work based on the Program, or the modifications to 211 | produce it from the Program, in the form of source code under the 212 | terms of section 4, provided that you also meet all of these conditions: 213 | 214 | a) The work must carry prominent notices stating that you modified 215 | it, and giving a relevant date. 216 | 217 | b) The work must carry prominent notices stating that it is 218 | released under this License and any conditions added under section 219 | 7. This requirement modifies the requirement in section 4 to 220 | "keep intact all notices". 221 | 222 | c) You must license the entire work, as a whole, under this 223 | License to anyone who comes into possession of a copy. This 224 | License will therefore apply, along with any applicable section 7 225 | additional terms, to the whole of the work, and all its parts, 226 | regardless of how they are packaged. This License gives no 227 | permission to license the work in any other way, but it does not 228 | invalidate such permission if you have separately received it. 229 | 230 | d) If the work has interactive user interfaces, each must display 231 | Appropriate Legal Notices; however, if the Program has interactive 232 | interfaces that do not display Appropriate Legal Notices, your 233 | work need not make them do so. 234 | 235 | A compilation of a covered work with other separate and independent 236 | works, which are not by their nature extensions of the covered work, 237 | and which are not combined with it such as to form a larger program, 238 | in or on a volume of a storage or distribution medium, is called an 239 | "aggregate" if the compilation and its resulting copyright are not 240 | used to limit the access or legal rights of the compilation's users 241 | beyond what the individual works permit. Inclusion of a covered work 242 | in an aggregate does not cause this License to apply to the other 243 | parts of the aggregate. 244 | 245 | 6. Conveying Non-Source Forms. 246 | 247 | You may convey a covered work in object code form under the terms 248 | of sections 4 and 5, provided that you also convey the 249 | machine-readable Corresponding Source under the terms of this License, 250 | in one of these ways: 251 | 252 | a) Convey the object code in, or embodied in, a physical product 253 | (including a physical distribution medium), accompanied by the 254 | Corresponding Source fixed on a durable physical medium 255 | customarily used for software interchange. 256 | 257 | b) Convey the object code in, or embodied in, a physical product 258 | (including a physical distribution medium), accompanied by a 259 | written offer, valid for at least three years and valid for as 260 | long as you offer spare parts or customer support for that product 261 | model, to give anyone who possesses the object code either (1) a 262 | copy of the Corresponding Source for all the software in the 263 | product that is covered by this License, on a durable physical 264 | medium customarily used for software interchange, for a price no 265 | more than your reasonable cost of physically performing this 266 | conveying of source, or (2) access to copy the 267 | Corresponding Source from a network server at no charge. 268 | 269 | c) Convey individual copies of the object code with a copy of the 270 | written offer to provide the Corresponding Source. This 271 | alternative is allowed only occasionally and noncommercially, and 272 | only if you received the object code with such an offer, in accord 273 | with subsection 6b. 274 | 275 | d) Convey the object code by offering access from a designated 276 | place (gratis or for a charge), and offer equivalent access to the 277 | Corresponding Source in the same way through the same place at no 278 | further charge. You need not require recipients to copy the 279 | Corresponding Source along with the object code. If the place to 280 | copy the object code is a network server, the Corresponding Source 281 | may be on a different server (operated by you or a third party) 282 | that supports equivalent copying facilities, provided you maintain 283 | clear directions next to the object code saying where to find the 284 | Corresponding Source. Regardless of what server hosts the 285 | Corresponding Source, you remain obligated to ensure that it is 286 | available for as long as needed to satisfy these requirements. 287 | 288 | e) Convey the object code using peer-to-peer transmission, provided 289 | you inform other peers where the object code and Corresponding 290 | Source of the work are being offered to the general public at no 291 | charge under subsection 6d. 292 | 293 | A separable portion of the object code, whose source code is excluded 294 | from the Corresponding Source as a System Library, need not be 295 | included in conveying the object code work. 296 | 297 | A "User Product" is either (1) a "consumer product", which means any 298 | tangible personal property which is normally used for personal, family, 299 | or household purposes, or (2) anything designed or sold for incorporation 300 | into a dwelling. In determining whether a product is a consumer product, 301 | doubtful cases shall be resolved in favor of coverage. For a particular 302 | product received by a particular user, "normally used" refers to a 303 | typical or common use of that class of product, regardless of the status 304 | of the particular user or of the way in which the particular user 305 | actually uses, or expects or is expected to use, the product. A product 306 | is a consumer product regardless of whether the product has substantial 307 | commercial, industrial or non-consumer uses, unless such uses represent 308 | the only significant mode of use of the product. 309 | 310 | "Installation Information" for a User Product means any methods, 311 | procedures, authorization keys, or other information required to install 312 | and execute modified versions of a covered work in that User Product from 313 | a modified version of its Corresponding Source. The information must 314 | suffice to ensure that the continued functioning of the modified object 315 | code is in no case prevented or interfered with solely because 316 | modification has been made. 317 | 318 | If you convey an object code work under this section in, or with, or 319 | specifically for use in, a User Product, and the conveying occurs as 320 | part of a transaction in which the right of possession and use of the 321 | User Product is transferred to the recipient in perpetuity or for a 322 | fixed term (regardless of how the transaction is characterized), the 323 | Corresponding Source conveyed under this section must be accompanied 324 | by the Installation Information. But this requirement does not apply 325 | if neither you nor any third party retains the ability to install 326 | modified object code on the User Product (for example, the work has 327 | been installed in ROM). 328 | 329 | The requirement to provide Installation Information does not include a 330 | requirement to continue to provide support service, warranty, or updates 331 | for a work that has been modified or installed by the recipient, or for 332 | the User Product in which it has been modified or installed. Access to a 333 | network may be denied when the modification itself materially and 334 | adversely affects the operation of the network or violates the rules and 335 | protocols for communication across the network. 336 | 337 | Corresponding Source conveyed, and Installation Information provided, 338 | in accord with this section must be in a format that is publicly 339 | documented (and with an implementation available to the public in 340 | source code form), and must require no special password or key for 341 | unpacking, reading or copying. 342 | 343 | 7. Additional Terms. 344 | 345 | "Additional permissions" are terms that supplement the terms of this 346 | License by making exceptions from one or more of its conditions. 347 | Additional permissions that are applicable to the entire Program shall 348 | be treated as though they were included in this License, to the extent 349 | that they are valid under applicable law. If additional permissions 350 | apply only to part of the Program, that part may be used separately 351 | under those permissions, but the entire Program remains governed by 352 | this License without regard to the additional permissions. 353 | 354 | When you convey a copy of a covered work, you may at your option 355 | remove any additional permissions from that copy, or from any part of 356 | it. (Additional permissions may be written to require their own 357 | removal in certain cases when you modify the work.) You may place 358 | additional permissions on material, added by you to a covered work, 359 | for which you have or can give appropriate copyright permission. 360 | 361 | Notwithstanding any other provision of this License, for material you 362 | add to a covered work, you may (if authorized by the copyright holders of 363 | that material) supplement the terms of this License with terms: 364 | 365 | a) Disclaiming warranty or limiting liability differently from the 366 | terms of sections 15 and 16 of this License; or 367 | 368 | b) Requiring preservation of specified reasonable legal notices or 369 | author attributions in that material or in the Appropriate Legal 370 | Notices displayed by works containing it; or 371 | 372 | c) Prohibiting misrepresentation of the origin of that material, or 373 | requiring that modified versions of such material be marked in 374 | reasonable ways as different from the original version; or 375 | 376 | d) Limiting the use for publicity purposes of names of licensors or 377 | authors of the material; or 378 | 379 | e) Declining to grant rights under trademark law for use of some 380 | trade names, trademarks, or service marks; or 381 | 382 | f) Requiring indemnification of licensors and authors of that 383 | material by anyone who conveys the material (or modified versions of 384 | it) with contractual assumptions of liability to the recipient, for 385 | any liability that these contractual assumptions directly impose on 386 | those licensors and authors. 387 | 388 | All other non-permissive additional terms are considered "further 389 | restrictions" within the meaning of section 10. If the Program as you 390 | received it, or any part of it, contains a notice stating that it is 391 | governed by this License along with a term that is a further 392 | restriction, you may remove that term. If a license document contains 393 | a further restriction but permits relicensing or conveying under this 394 | License, you may add to a covered work material governed by the terms 395 | of that license document, provided that the further restriction does 396 | not survive such relicensing or conveying. 397 | 398 | If you add terms to a covered work in accord with this section, you 399 | must place, in the relevant source files, a statement of the 400 | additional terms that apply to those files, or a notice indicating 401 | where to find the applicable terms. 402 | 403 | Additional terms, permissive or non-permissive, may be stated in the 404 | form of a separately written license, or stated as exceptions; 405 | the above requirements apply either way. 406 | 407 | 8. Termination. 408 | 409 | You may not propagate or modify a covered work except as expressly 410 | provided under this License. Any attempt otherwise to propagate or 411 | modify it is void, and will automatically terminate your rights under 412 | this License (including any patent licenses granted under the third 413 | paragraph of section 11). 414 | 415 | However, if you cease all violation of this License, then your 416 | license from a particular copyright holder is reinstated (a) 417 | provisionally, unless and until the copyright holder explicitly and 418 | finally terminates your license, and (b) permanently, if the copyright 419 | holder fails to notify you of the violation by some reasonable means 420 | prior to 60 days after the cessation. 421 | 422 | Moreover, your license from a particular copyright holder is 423 | reinstated permanently if the copyright holder notifies you of the 424 | violation by some reasonable means, this is the first time you have 425 | received notice of violation of this License (for any work) from that 426 | copyright holder, and you cure the violation prior to 30 days after 427 | your receipt of the notice. 428 | 429 | Termination of your rights under this section does not terminate the 430 | licenses of parties who have received copies or rights from you under 431 | this License. If your rights have been terminated and not permanently 432 | reinstated, you do not qualify to receive new licenses for the same 433 | material under section 10. 434 | 435 | 9. Acceptance Not Required for Having Copies. 436 | 437 | You are not required to accept this License in order to receive or 438 | run a copy of the Program. Ancillary propagation of a covered work 439 | occurring solely as a consequence of using peer-to-peer transmission 440 | to receive a copy likewise does not require acceptance. However, 441 | nothing other than this License grants you permission to propagate or 442 | modify any covered work. These actions infringe copyright if you do 443 | not accept this License. Therefore, by modifying or propagating a 444 | covered work, you indicate your acceptance of this License to do so. 445 | 446 | 10. Automatic Licensing of Downstream Recipients. 447 | 448 | Each time you convey a covered work, the recipient automatically 449 | receives a license from the original licensors, to run, modify and 450 | propagate that work, subject to this License. You are not responsible 451 | for enforcing compliance by third parties with this License. 452 | 453 | An "entity transaction" is a transaction transferring control of an 454 | organization, or substantially all assets of one, or subdividing an 455 | organization, or merging organizations. If propagation of a covered 456 | work results from an entity transaction, each party to that 457 | transaction who receives a copy of the work also receives whatever 458 | licenses to the work the party's predecessor in interest had or could 459 | give under the previous paragraph, plus a right to possession of the 460 | Corresponding Source of the work from the predecessor in interest, if 461 | the predecessor has it or can get it with reasonable efforts. 462 | 463 | You may not impose any further restrictions on the exercise of the 464 | rights granted or affirmed under this License. For example, you may 465 | not impose a license fee, royalty, or other charge for exercise of 466 | rights granted under this License, and you may not initiate litigation 467 | (including a cross-claim or counterclaim in a lawsuit) alleging that 468 | any patent claim is infringed by making, using, selling, offering for 469 | sale, or importing the Program or any portion of it. 470 | 471 | 11. Patents. 472 | 473 | A "contributor" is a copyright holder who authorizes use under this 474 | License of the Program or a work on which the Program is based. The 475 | work thus licensed is called the contributor's "contributor version". 476 | 477 | A contributor's "essential patent claims" are all patent claims 478 | owned or controlled by the contributor, whether already acquired or 479 | hereafter acquired, that would be infringed by some manner, permitted 480 | by this License, of making, using, or selling its contributor version, 481 | but do not include claims that would be infringed only as a 482 | consequence of further modification of the contributor version. For 483 | purposes of this definition, "control" includes the right to grant 484 | patent sublicenses in a manner consistent with the requirements of 485 | this License. 486 | 487 | Each contributor grants you a non-exclusive, worldwide, royalty-free 488 | patent license under the contributor's essential patent claims, to 489 | make, use, sell, offer for sale, import and otherwise run, modify and 490 | propagate the contents of its contributor version. 491 | 492 | In the following three paragraphs, a "patent license" is any express 493 | agreement or commitment, however denominated, not to enforce a patent 494 | (such as an express permission to practice a patent or covenant not to 495 | sue for patent infringement). To "grant" such a patent license to a 496 | party means to make such an agreement or commitment not to enforce a 497 | patent against the party. 498 | 499 | If you convey a covered work, knowingly relying on a patent license, 500 | and the Corresponding Source of the work is not available for anyone 501 | to copy, free of charge and under the terms of this License, through a 502 | publicly available network server or other readily accessible means, 503 | then you must either (1) cause the Corresponding Source to be so 504 | available, or (2) arrange to deprive yourself of the benefit of the 505 | patent license for this particular work, or (3) arrange, in a manner 506 | consistent with the requirements of this License, to extend the patent 507 | license to downstream recipients. "Knowingly relying" means you have 508 | actual knowledge that, but for the patent license, your conveying the 509 | covered work in a country, or your recipient's use of the covered work 510 | in a country, would infringe one or more identifiable patents in that 511 | country that you have reason to believe are valid. 512 | 513 | If, pursuant to or in connection with a single transaction or 514 | arrangement, you convey, or propagate by procuring conveyance of, a 515 | covered work, and grant a patent license to some of the parties 516 | receiving the covered work authorizing them to use, propagate, modify 517 | or convey a specific copy of the covered work, then the patent license 518 | you grant is automatically extended to all recipients of the covered 519 | work and works based on it. 520 | 521 | A patent license is "discriminatory" if it does not include within 522 | the scope of its coverage, prohibits the exercise of, or is 523 | conditioned on the non-exercise of one or more of the rights that are 524 | specifically granted under this License. You may not convey a covered 525 | work if you are a party to an arrangement with a third party that is 526 | in the business of distributing software, under which you make payment 527 | to the third party based on the extent of your activity of conveying 528 | the work, and under which the third party grants, to any of the 529 | parties who would receive the covered work from you, a discriminatory 530 | patent license (a) in connection with copies of the covered work 531 | conveyed by you (or copies made from those copies), or (b) primarily 532 | for and in connection with specific products or compilations that 533 | contain the covered work, unless you entered into that arrangement, 534 | or that patent license was granted, prior to 28 March 2007. 535 | 536 | Nothing in this License shall be construed as excluding or limiting 537 | any implied license or other defenses to infringement that may 538 | otherwise be available to you under applicable patent law. 539 | 540 | 12. No Surrender of Others' Freedom. 541 | 542 | If conditions are imposed on you (whether by court order, agreement or 543 | otherwise) that contradict the conditions of this License, they do not 544 | excuse you from the conditions of this License. If you cannot convey a 545 | covered work so as to satisfy simultaneously your obligations under this 546 | License and any other pertinent obligations, then as a consequence you may 547 | not convey it at all. For example, if you agree to terms that obligate you 548 | to collect a royalty for further conveying from those to whom you convey 549 | the Program, the only way you could satisfy both those terms and this 550 | License would be to refrain entirely from conveying the Program. 551 | 552 | 13. Use with the GNU Affero General Public License. 553 | 554 | Notwithstanding any other provision of this License, you have 555 | permission to link or combine any covered work with a work licensed 556 | under version 3 of the GNU Affero General Public License into a single 557 | combined work, and to convey the resulting work. The terms of this 558 | License will continue to apply to the part which is the covered work, 559 | but the special requirements of the GNU Affero General Public License, 560 | section 13, concerning interaction through a network will apply to the 561 | combination as such. 562 | 563 | 14. Revised Versions of this License. 564 | 565 | The Free Software Foundation may publish revised and/or new versions of 566 | the GNU General Public License from time to time. Such new versions will 567 | be similar in spirit to the present version, but may differ in detail to 568 | address new problems or concerns. 569 | 570 | Each version is given a distinguishing version number. If the 571 | Program specifies that a certain numbered version of the GNU General 572 | Public License "or any later version" applies to it, you have the 573 | option of following the terms and conditions either of that numbered 574 | version or of any later version published by the Free Software 575 | Foundation. If the Program does not specify a version number of the 576 | GNU General Public License, you may choose any version ever published 577 | by the Free Software Foundation. 578 | 579 | If the Program specifies that a proxy can decide which future 580 | versions of the GNU General Public License can be used, that proxy's 581 | public statement of acceptance of a version permanently authorizes you 582 | to choose that version for the Program. 583 | 584 | Later license versions may give you additional or different 585 | permissions. However, no additional obligations are imposed on any 586 | author or copyright holder as a result of your choosing to follow a 587 | later version. 588 | 589 | 15. Disclaimer of Warranty. 590 | 591 | THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY 592 | APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT 593 | HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY 594 | OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, 595 | THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 596 | PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM 597 | IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF 598 | ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 599 | 600 | 16. Limitation of Liability. 601 | 602 | IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING 603 | WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS 604 | THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY 605 | GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE 606 | USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF 607 | DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD 608 | PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), 609 | EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF 610 | SUCH DAMAGES. 611 | 612 | 17. Interpretation of Sections 15 and 16. 613 | 614 | If the disclaimer of warranty and limitation of liability provided 615 | above cannot be given local legal effect according to their terms, 616 | reviewing courts shall apply local law that most closely approximates 617 | an absolute waiver of all civil liability in connection with the 618 | Program, unless a warranty or assumption of liability accompanies a 619 | copy of the Program in return for a fee. 620 | 621 | END OF TERMS AND CONDITIONS 622 | 623 | How to Apply These Terms to Your New Programs 624 | 625 | If you develop a new program, and you want it to be of the greatest 626 | possible use to the public, the best way to achieve this is to make it 627 | free software which everyone can redistribute and change under these terms. 628 | 629 | To do so, attach the following notices to the program. It is safest 630 | to attach them to the start of each source file to most effectively 631 | state the exclusion of warranty; and each file should have at least 632 | the "copyright" line and a pointer to where the full notice is found. 633 | 634 | 635 | Copyright (C) 636 | 637 | This program is free software: you can redistribute it and/or modify 638 | it under the terms of the GNU General Public License as published by 639 | the Free Software Foundation, either version 3 of the License, or 640 | (at your option) any later version. 641 | 642 | This program is distributed in the hope that it will be useful, 643 | but WITHOUT ANY WARRANTY; without even the implied warranty of 644 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 645 | GNU General Public License for more details. 646 | 647 | You should have received a copy of the GNU General Public License 648 | along with this program. If not, see . 649 | 650 | Also add information on how to contact you by electronic and paper mail. 651 | 652 | If the program does terminal interaction, make it output a short 653 | notice like this when it starts in an interactive mode: 654 | 655 | Copyright (C) 656 | This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. 657 | This is free software, and you are welcome to redistribute it 658 | under certain conditions; type `show c' for details. 659 | 660 | The hypothetical commands `show w' and `show c' should show the appropriate 661 | parts of the General Public License. Of course, your program's commands 662 | might be different; for a GUI interface, you would use an "about box". 663 | 664 | You should also get your employer (if you work as a programmer) or school, 665 | if any, to sign a "copyright disclaimer" for the program, if necessary. 666 | For more information on this, and how to apply and follow the GNU GPL, see 667 | . 668 | 669 | The GNU General Public License does not permit incorporating your program 670 | into proprietary programs. If your program is a subroutine library, you 671 | may consider it more useful to permit linking proprietary applications with 672 | the library. If this is what you want to do, use the GNU Lesser General 673 | Public License instead of this License. But first, please read 674 | . 675 | -------------------------------------------------------------------------------- /proxy/README.md: -------------------------------------------------------------------------------- 1 | [![License: GPL v3](https://img.shields.io/badge/License-GPL%20v3-blue.svg)](https://www.gnu.org/licenses/gpl-3.0) 2 | 3 | # ellsp-proxy 4 | > Elisp Language Server (proxy) 5 | 6 | WIP. 7 | -------------------------------------------------------------------------------- /proxy/env.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright (C) 2023-2025 the Ellsp authors. 3 | * 4 | * This program is free software; you can redistribute it and/or modify 5 | * it under the terms of the GNU General Public License as published by 6 | * the Free Software Foundation; either version 3, or (at your option) 7 | * any later version. 8 | * 9 | * This program is distributed in the hope that it will be useful, 10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | * GNU General Public License for more details. 13 | * 14 | * You should have received a copy of the GNU General Public License 15 | * along with this program. If not, see . 16 | */ 17 | 18 | "use strict"; 19 | 20 | global.UTIL = require('./util'); 21 | 22 | global.ELLSP_EMACS = process.env.EMACS || process.env.ELLSP_EMACS || "emacs"; 23 | 24 | -------------------------------------------------------------------------------- /proxy/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "ellsp-proxy", 3 | "version": "0.1.0", 4 | "lockfileVersion": 3, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "ellsp-proxy", 9 | "version": "0.1.0", 10 | "license": "GPL-3.0-or-later", 11 | "dependencies": { 12 | "which": "^5.0.0" 13 | }, 14 | "bin": { 15 | "ellsp": "start.js" 16 | }, 17 | "devDependencies": { 18 | "@yao-pkg/pkg": "^6.0.0" 19 | } 20 | }, 21 | "node_modules/@babel/generator": { 22 | "version": "7.26.3", 23 | "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.3.tgz", 24 | "integrity": "sha512-6FF/urZvD0sTeO7k6/B15pMLC4CHUv1426lzr3N01aHJTl046uCAh9LXW/fzeXXjPNCJ6iABW5XaWOsIZB93aQ==", 25 | "dev": true, 26 | "license": "MIT", 27 | "dependencies": { 28 | "@babel/parser": "^7.26.3", 29 | "@babel/types": "^7.26.3", 30 | "@jridgewell/gen-mapping": "^0.3.5", 31 | "@jridgewell/trace-mapping": "^0.3.25", 32 | "jsesc": "^3.0.2" 33 | }, 34 | "engines": { 35 | "node": ">=6.9.0" 36 | } 37 | }, 38 | "node_modules/@babel/helper-string-parser": { 39 | "version": "7.25.9", 40 | "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", 41 | "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", 42 | "dev": true, 43 | "license": "MIT", 44 | "engines": { 45 | "node": ">=6.9.0" 46 | } 47 | }, 48 | "node_modules/@babel/helper-validator-identifier": { 49 | "version": "7.25.9", 50 | "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", 51 | "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", 52 | "dev": true, 53 | "license": "MIT", 54 | "engines": { 55 | "node": ">=6.9.0" 56 | } 57 | }, 58 | "node_modules/@babel/parser": { 59 | "version": "7.26.3", 60 | "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.3.tgz", 61 | "integrity": "sha512-WJ/CvmY8Mea8iDXo6a7RK2wbmJITT5fN3BEkRuFlxVyNx8jOKIIhmC4fSkTcPcf8JyavbBwIe6OpiCOBXt/IcA==", 62 | "dev": true, 63 | "license": "MIT", 64 | "dependencies": { 65 | "@babel/types": "^7.26.3" 66 | }, 67 | "bin": { 68 | "parser": "bin/babel-parser.js" 69 | }, 70 | "engines": { 71 | "node": ">=6.0.0" 72 | } 73 | }, 74 | "node_modules/@babel/types": { 75 | "version": "7.26.3", 76 | "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.3.tgz", 77 | "integrity": "sha512-vN5p+1kl59GVKMvTHt55NzzmYVxprfJD+ql7U9NFIfKCBkYE55LYtS+WtPlaYOyzydrKI8Nezd+aZextrd+FMA==", 78 | "dev": true, 79 | "license": "MIT", 80 | "dependencies": { 81 | "@babel/helper-string-parser": "^7.25.9", 82 | "@babel/helper-validator-identifier": "^7.25.9" 83 | }, 84 | "engines": { 85 | "node": ">=6.9.0" 86 | } 87 | }, 88 | "node_modules/@isaacs/cliui": { 89 | "version": "8.0.2", 90 | "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", 91 | "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", 92 | "dev": true, 93 | "license": "ISC", 94 | "dependencies": { 95 | "string-width": "^5.1.2", 96 | "string-width-cjs": "npm:string-width@^4.2.0", 97 | "strip-ansi": "^7.0.1", 98 | "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", 99 | "wrap-ansi": "^8.1.0", 100 | "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" 101 | }, 102 | "engines": { 103 | "node": ">=12" 104 | } 105 | }, 106 | "node_modules/@isaacs/fs-minipass": { 107 | "version": "4.0.1", 108 | "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", 109 | "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", 110 | "dev": true, 111 | "license": "ISC", 112 | "dependencies": { 113 | "minipass": "^7.0.4" 114 | }, 115 | "engines": { 116 | "node": ">=18.0.0" 117 | } 118 | }, 119 | "node_modules/@jridgewell/gen-mapping": { 120 | "version": "0.3.8", 121 | "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", 122 | "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", 123 | "dev": true, 124 | "license": "MIT", 125 | "dependencies": { 126 | "@jridgewell/set-array": "^1.2.1", 127 | "@jridgewell/sourcemap-codec": "^1.4.10", 128 | "@jridgewell/trace-mapping": "^0.3.24" 129 | }, 130 | "engines": { 131 | "node": ">=6.0.0" 132 | } 133 | }, 134 | "node_modules/@jridgewell/resolve-uri": { 135 | "version": "3.1.2", 136 | "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", 137 | "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", 138 | "dev": true, 139 | "license": "MIT", 140 | "engines": { 141 | "node": ">=6.0.0" 142 | } 143 | }, 144 | "node_modules/@jridgewell/set-array": { 145 | "version": "1.2.1", 146 | "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", 147 | "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", 148 | "dev": true, 149 | "license": "MIT", 150 | "engines": { 151 | "node": ">=6.0.0" 152 | } 153 | }, 154 | "node_modules/@jridgewell/sourcemap-codec": { 155 | "version": "1.5.0", 156 | "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", 157 | "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", 158 | "dev": true, 159 | "license": "MIT" 160 | }, 161 | "node_modules/@jridgewell/trace-mapping": { 162 | "version": "0.3.25", 163 | "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", 164 | "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", 165 | "dev": true, 166 | "license": "MIT", 167 | "dependencies": { 168 | "@jridgewell/resolve-uri": "^3.1.0", 169 | "@jridgewell/sourcemap-codec": "^1.4.14" 170 | } 171 | }, 172 | "node_modules/@pkgjs/parseargs": { 173 | "version": "0.11.0", 174 | "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", 175 | "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", 176 | "dev": true, 177 | "license": "MIT", 178 | "optional": true, 179 | "engines": { 180 | "node": ">=14" 181 | } 182 | }, 183 | "node_modules/@yao-pkg/pkg": { 184 | "version": "6.2.0", 185 | "resolved": "https://registry.npmjs.org/@yao-pkg/pkg/-/pkg-6.2.0.tgz", 186 | "integrity": "sha512-kq1aDs9aa+fEtKQQ2AsxcL4Z82LsYw9ZQIwD3Q/wDq8ZPN69wCf2+OQp271lnqMybYInXwwBJ3swIb/nvaXS/g==", 187 | "dev": true, 188 | "license": "MIT", 189 | "dependencies": { 190 | "@babel/generator": "^7.23.0", 191 | "@babel/parser": "^7.23.0", 192 | "@babel/types": "^7.23.0", 193 | "@yao-pkg/pkg-fetch": "3.5.18", 194 | "into-stream": "^6.0.0", 195 | "minimist": "^1.2.6", 196 | "multistream": "^4.1.0", 197 | "picocolors": "^1.1.0", 198 | "picomatch": "^4.0.2", 199 | "prebuild-install": "^7.1.1", 200 | "resolve": "^1.22.0", 201 | "stream-meter": "^1.0.4", 202 | "tar": "^7.4.3", 203 | "tinyglobby": "^0.2.9", 204 | "unzipper": "^0.12.3" 205 | }, 206 | "bin": { 207 | "pkg": "lib-es5/bin.js" 208 | }, 209 | "engines": { 210 | "node": ">=18.0.0" 211 | } 212 | }, 213 | "node_modules/@yao-pkg/pkg-fetch": { 214 | "version": "3.5.18", 215 | "resolved": "https://registry.npmjs.org/@yao-pkg/pkg-fetch/-/pkg-fetch-3.5.18.tgz", 216 | "integrity": "sha512-tdUT7zS2lyXeJwkA8lDI4aVxHwauAc5lKj6Xui3/BtDe6vDsQ8KP+f66u07AI28DuTzKxjRJKNNXVdyGv2Ndsg==", 217 | "dev": true, 218 | "license": "MIT", 219 | "dependencies": { 220 | "https-proxy-agent": "^5.0.0", 221 | "node-fetch": "^2.6.6", 222 | "picocolors": "^1.1.0", 223 | "progress": "^2.0.3", 224 | "semver": "^7.3.5", 225 | "tar-fs": "^2.1.1", 226 | "yargs": "^16.2.0" 227 | }, 228 | "bin": { 229 | "pkg-fetch": "lib-es5/bin.js" 230 | } 231 | }, 232 | "node_modules/agent-base": { 233 | "version": "6.0.2", 234 | "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", 235 | "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", 236 | "dev": true, 237 | "license": "MIT", 238 | "dependencies": { 239 | "debug": "4" 240 | }, 241 | "engines": { 242 | "node": ">= 6.0.0" 243 | } 244 | }, 245 | "node_modules/ansi-regex": { 246 | "version": "6.1.0", 247 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", 248 | "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", 249 | "dev": true, 250 | "license": "MIT", 251 | "engines": { 252 | "node": ">=12" 253 | }, 254 | "funding": { 255 | "url": "https://github.com/chalk/ansi-regex?sponsor=1" 256 | } 257 | }, 258 | "node_modules/ansi-styles": { 259 | "version": "6.2.1", 260 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", 261 | "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", 262 | "dev": true, 263 | "license": "MIT", 264 | "engines": { 265 | "node": ">=12" 266 | }, 267 | "funding": { 268 | "url": "https://github.com/chalk/ansi-styles?sponsor=1" 269 | } 270 | }, 271 | "node_modules/balanced-match": { 272 | "version": "1.0.2", 273 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 274 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", 275 | "dev": true, 276 | "license": "MIT" 277 | }, 278 | "node_modules/base64-js": { 279 | "version": "1.5.1", 280 | "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", 281 | "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", 282 | "dev": true, 283 | "funding": [ 284 | { 285 | "type": "github", 286 | "url": "https://github.com/sponsors/feross" 287 | }, 288 | { 289 | "type": "patreon", 290 | "url": "https://www.patreon.com/feross" 291 | }, 292 | { 293 | "type": "consulting", 294 | "url": "https://feross.org/support" 295 | } 296 | ], 297 | "license": "MIT" 298 | }, 299 | "node_modules/bl": { 300 | "version": "4.1.0", 301 | "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", 302 | "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", 303 | "dev": true, 304 | "license": "MIT", 305 | "dependencies": { 306 | "buffer": "^5.5.0", 307 | "inherits": "^2.0.4", 308 | "readable-stream": "^3.4.0" 309 | } 310 | }, 311 | "node_modules/bl/node_modules/readable-stream": { 312 | "version": "3.6.2", 313 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", 314 | "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", 315 | "dev": true, 316 | "license": "MIT", 317 | "dependencies": { 318 | "inherits": "^2.0.3", 319 | "string_decoder": "^1.1.1", 320 | "util-deprecate": "^1.0.1" 321 | }, 322 | "engines": { 323 | "node": ">= 6" 324 | } 325 | }, 326 | "node_modules/bluebird": { 327 | "version": "3.7.2", 328 | "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", 329 | "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", 330 | "dev": true, 331 | "license": "MIT" 332 | }, 333 | "node_modules/brace-expansion": { 334 | "version": "2.0.1", 335 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", 336 | "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", 337 | "dev": true, 338 | "license": "MIT", 339 | "dependencies": { 340 | "balanced-match": "^1.0.0" 341 | } 342 | }, 343 | "node_modules/buffer": { 344 | "version": "5.7.1", 345 | "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", 346 | "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", 347 | "dev": true, 348 | "funding": [ 349 | { 350 | "type": "github", 351 | "url": "https://github.com/sponsors/feross" 352 | }, 353 | { 354 | "type": "patreon", 355 | "url": "https://www.patreon.com/feross" 356 | }, 357 | { 358 | "type": "consulting", 359 | "url": "https://feross.org/support" 360 | } 361 | ], 362 | "license": "MIT", 363 | "dependencies": { 364 | "base64-js": "^1.3.1", 365 | "ieee754": "^1.1.13" 366 | } 367 | }, 368 | "node_modules/chownr": { 369 | "version": "3.0.0", 370 | "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", 371 | "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", 372 | "dev": true, 373 | "license": "BlueOak-1.0.0", 374 | "engines": { 375 | "node": ">=18" 376 | } 377 | }, 378 | "node_modules/cliui": { 379 | "version": "7.0.4", 380 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", 381 | "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", 382 | "dev": true, 383 | "license": "ISC", 384 | "dependencies": { 385 | "string-width": "^4.2.0", 386 | "strip-ansi": "^6.0.0", 387 | "wrap-ansi": "^7.0.0" 388 | } 389 | }, 390 | "node_modules/cliui/node_modules/ansi-regex": { 391 | "version": "5.0.1", 392 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 393 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 394 | "dev": true, 395 | "license": "MIT", 396 | "engines": { 397 | "node": ">=8" 398 | } 399 | }, 400 | "node_modules/cliui/node_modules/ansi-styles": { 401 | "version": "4.3.0", 402 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 403 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 404 | "dev": true, 405 | "license": "MIT", 406 | "dependencies": { 407 | "color-convert": "^2.0.1" 408 | }, 409 | "engines": { 410 | "node": ">=8" 411 | }, 412 | "funding": { 413 | "url": "https://github.com/chalk/ansi-styles?sponsor=1" 414 | } 415 | }, 416 | "node_modules/cliui/node_modules/emoji-regex": { 417 | "version": "8.0.0", 418 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 419 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", 420 | "dev": true, 421 | "license": "MIT" 422 | }, 423 | "node_modules/cliui/node_modules/string-width": { 424 | "version": "4.2.3", 425 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", 426 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 427 | "dev": true, 428 | "license": "MIT", 429 | "dependencies": { 430 | "emoji-regex": "^8.0.0", 431 | "is-fullwidth-code-point": "^3.0.0", 432 | "strip-ansi": "^6.0.1" 433 | }, 434 | "engines": { 435 | "node": ">=8" 436 | } 437 | }, 438 | "node_modules/cliui/node_modules/strip-ansi": { 439 | "version": "6.0.1", 440 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 441 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 442 | "dev": true, 443 | "license": "MIT", 444 | "dependencies": { 445 | "ansi-regex": "^5.0.1" 446 | }, 447 | "engines": { 448 | "node": ">=8" 449 | } 450 | }, 451 | "node_modules/cliui/node_modules/wrap-ansi": { 452 | "version": "7.0.0", 453 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", 454 | "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", 455 | "dev": true, 456 | "license": "MIT", 457 | "dependencies": { 458 | "ansi-styles": "^4.0.0", 459 | "string-width": "^4.1.0", 460 | "strip-ansi": "^6.0.0" 461 | }, 462 | "engines": { 463 | "node": ">=10" 464 | }, 465 | "funding": { 466 | "url": "https://github.com/chalk/wrap-ansi?sponsor=1" 467 | } 468 | }, 469 | "node_modules/color-convert": { 470 | "version": "2.0.1", 471 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 472 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 473 | "dev": true, 474 | "license": "MIT", 475 | "dependencies": { 476 | "color-name": "~1.1.4" 477 | }, 478 | "engines": { 479 | "node": ">=7.0.0" 480 | } 481 | }, 482 | "node_modules/color-name": { 483 | "version": "1.1.4", 484 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 485 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 486 | "dev": true, 487 | "license": "MIT" 488 | }, 489 | "node_modules/core-util-is": { 490 | "version": "1.0.3", 491 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", 492 | "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", 493 | "dev": true, 494 | "license": "MIT" 495 | }, 496 | "node_modules/cross-spawn": { 497 | "version": "7.0.6", 498 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", 499 | "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", 500 | "dev": true, 501 | "license": "MIT", 502 | "dependencies": { 503 | "path-key": "^3.1.0", 504 | "shebang-command": "^2.0.0", 505 | "which": "^2.0.1" 506 | }, 507 | "engines": { 508 | "node": ">= 8" 509 | } 510 | }, 511 | "node_modules/cross-spawn/node_modules/isexe": { 512 | "version": "2.0.0", 513 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 514 | "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", 515 | "dev": true, 516 | "license": "ISC" 517 | }, 518 | "node_modules/cross-spawn/node_modules/which": { 519 | "version": "2.0.2", 520 | "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", 521 | "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", 522 | "dev": true, 523 | "license": "ISC", 524 | "dependencies": { 525 | "isexe": "^2.0.0" 526 | }, 527 | "bin": { 528 | "node-which": "bin/node-which" 529 | }, 530 | "engines": { 531 | "node": ">= 8" 532 | } 533 | }, 534 | "node_modules/debug": { 535 | "version": "4.4.0", 536 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", 537 | "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", 538 | "dev": true, 539 | "license": "MIT", 540 | "dependencies": { 541 | "ms": "^2.1.3" 542 | }, 543 | "engines": { 544 | "node": ">=6.0" 545 | }, 546 | "peerDependenciesMeta": { 547 | "supports-color": { 548 | "optional": true 549 | } 550 | } 551 | }, 552 | "node_modules/decompress-response": { 553 | "version": "6.0.0", 554 | "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", 555 | "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", 556 | "dev": true, 557 | "license": "MIT", 558 | "dependencies": { 559 | "mimic-response": "^3.1.0" 560 | }, 561 | "engines": { 562 | "node": ">=10" 563 | }, 564 | "funding": { 565 | "url": "https://github.com/sponsors/sindresorhus" 566 | } 567 | }, 568 | "node_modules/deep-extend": { 569 | "version": "0.6.0", 570 | "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", 571 | "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", 572 | "dev": true, 573 | "license": "MIT", 574 | "engines": { 575 | "node": ">=4.0.0" 576 | } 577 | }, 578 | "node_modules/detect-libc": { 579 | "version": "2.0.3", 580 | "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", 581 | "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==", 582 | "dev": true, 583 | "license": "Apache-2.0", 584 | "engines": { 585 | "node": ">=8" 586 | } 587 | }, 588 | "node_modules/duplexer2": { 589 | "version": "0.1.4", 590 | "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", 591 | "integrity": "sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==", 592 | "dev": true, 593 | "license": "BSD-3-Clause", 594 | "dependencies": { 595 | "readable-stream": "^2.0.2" 596 | } 597 | }, 598 | "node_modules/eastasianwidth": { 599 | "version": "0.2.0", 600 | "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", 601 | "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", 602 | "dev": true, 603 | "license": "MIT" 604 | }, 605 | "node_modules/emoji-regex": { 606 | "version": "9.2.2", 607 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", 608 | "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", 609 | "dev": true, 610 | "license": "MIT" 611 | }, 612 | "node_modules/end-of-stream": { 613 | "version": "1.4.4", 614 | "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", 615 | "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", 616 | "dev": true, 617 | "license": "MIT", 618 | "dependencies": { 619 | "once": "^1.4.0" 620 | } 621 | }, 622 | "node_modules/escalade": { 623 | "version": "3.2.0", 624 | "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", 625 | "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", 626 | "dev": true, 627 | "license": "MIT", 628 | "engines": { 629 | "node": ">=6" 630 | } 631 | }, 632 | "node_modules/expand-template": { 633 | "version": "2.0.3", 634 | "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", 635 | "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", 636 | "dev": true, 637 | "license": "(MIT OR WTFPL)", 638 | "engines": { 639 | "node": ">=6" 640 | } 641 | }, 642 | "node_modules/fdir": { 643 | "version": "6.4.2", 644 | "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.2.tgz", 645 | "integrity": "sha512-KnhMXsKSPZlAhp7+IjUkRZKPb4fUyccpDrdFXbi4QL1qkmFh9kVY09Yox+n4MaOb3lHZ1Tv829C3oaaXoMYPDQ==", 646 | "dev": true, 647 | "license": "MIT", 648 | "peerDependencies": { 649 | "picomatch": "^3 || ^4" 650 | }, 651 | "peerDependenciesMeta": { 652 | "picomatch": { 653 | "optional": true 654 | } 655 | } 656 | }, 657 | "node_modules/foreground-child": { 658 | "version": "3.3.0", 659 | "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz", 660 | "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==", 661 | "dev": true, 662 | "license": "ISC", 663 | "dependencies": { 664 | "cross-spawn": "^7.0.0", 665 | "signal-exit": "^4.0.1" 666 | }, 667 | "engines": { 668 | "node": ">=14" 669 | }, 670 | "funding": { 671 | "url": "https://github.com/sponsors/isaacs" 672 | } 673 | }, 674 | "node_modules/from2": { 675 | "version": "2.3.0", 676 | "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", 677 | "integrity": "sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==", 678 | "dev": true, 679 | "license": "MIT", 680 | "dependencies": { 681 | "inherits": "^2.0.1", 682 | "readable-stream": "^2.0.0" 683 | } 684 | }, 685 | "node_modules/fs-constants": { 686 | "version": "1.0.0", 687 | "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", 688 | "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", 689 | "dev": true, 690 | "license": "MIT" 691 | }, 692 | "node_modules/fs-extra": { 693 | "version": "11.2.0", 694 | "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", 695 | "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", 696 | "dev": true, 697 | "license": "MIT", 698 | "dependencies": { 699 | "graceful-fs": "^4.2.0", 700 | "jsonfile": "^6.0.1", 701 | "universalify": "^2.0.0" 702 | }, 703 | "engines": { 704 | "node": ">=14.14" 705 | } 706 | }, 707 | "node_modules/function-bind": { 708 | "version": "1.1.2", 709 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", 710 | "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", 711 | "dev": true, 712 | "license": "MIT", 713 | "funding": { 714 | "url": "https://github.com/sponsors/ljharb" 715 | } 716 | }, 717 | "node_modules/get-caller-file": { 718 | "version": "2.0.5", 719 | "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", 720 | "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", 721 | "dev": true, 722 | "license": "ISC", 723 | "engines": { 724 | "node": "6.* || 8.* || >= 10.*" 725 | } 726 | }, 727 | "node_modules/github-from-package": { 728 | "version": "0.0.0", 729 | "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", 730 | "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==", 731 | "dev": true, 732 | "license": "MIT" 733 | }, 734 | "node_modules/glob": { 735 | "version": "10.4.5", 736 | "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", 737 | "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", 738 | "dev": true, 739 | "license": "ISC", 740 | "dependencies": { 741 | "foreground-child": "^3.1.0", 742 | "jackspeak": "^3.1.2", 743 | "minimatch": "^9.0.4", 744 | "minipass": "^7.1.2", 745 | "package-json-from-dist": "^1.0.0", 746 | "path-scurry": "^1.11.1" 747 | }, 748 | "bin": { 749 | "glob": "dist/esm/bin.mjs" 750 | }, 751 | "funding": { 752 | "url": "https://github.com/sponsors/isaacs" 753 | } 754 | }, 755 | "node_modules/graceful-fs": { 756 | "version": "4.2.11", 757 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", 758 | "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", 759 | "dev": true, 760 | "license": "ISC" 761 | }, 762 | "node_modules/hasown": { 763 | "version": "2.0.2", 764 | "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", 765 | "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", 766 | "dev": true, 767 | "license": "MIT", 768 | "dependencies": { 769 | "function-bind": "^1.1.2" 770 | }, 771 | "engines": { 772 | "node": ">= 0.4" 773 | } 774 | }, 775 | "node_modules/https-proxy-agent": { 776 | "version": "5.0.1", 777 | "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", 778 | "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", 779 | "dev": true, 780 | "license": "MIT", 781 | "dependencies": { 782 | "agent-base": "6", 783 | "debug": "4" 784 | }, 785 | "engines": { 786 | "node": ">= 6" 787 | } 788 | }, 789 | "node_modules/ieee754": { 790 | "version": "1.2.1", 791 | "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", 792 | "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", 793 | "dev": true, 794 | "funding": [ 795 | { 796 | "type": "github", 797 | "url": "https://github.com/sponsors/feross" 798 | }, 799 | { 800 | "type": "patreon", 801 | "url": "https://www.patreon.com/feross" 802 | }, 803 | { 804 | "type": "consulting", 805 | "url": "https://feross.org/support" 806 | } 807 | ], 808 | "license": "BSD-3-Clause" 809 | }, 810 | "node_modules/inherits": { 811 | "version": "2.0.4", 812 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 813 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", 814 | "dev": true, 815 | "license": "ISC" 816 | }, 817 | "node_modules/ini": { 818 | "version": "1.3.8", 819 | "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", 820 | "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", 821 | "dev": true, 822 | "license": "ISC" 823 | }, 824 | "node_modules/into-stream": { 825 | "version": "6.0.0", 826 | "resolved": "https://registry.npmjs.org/into-stream/-/into-stream-6.0.0.tgz", 827 | "integrity": "sha512-XHbaOAvP+uFKUFsOgoNPRjLkwB+I22JFPFe5OjTkQ0nwgj6+pSjb4NmB6VMxaPshLiOf+zcpOCBQuLwC1KHhZA==", 828 | "dev": true, 829 | "license": "MIT", 830 | "dependencies": { 831 | "from2": "^2.3.0", 832 | "p-is-promise": "^3.0.0" 833 | }, 834 | "engines": { 835 | "node": ">=10" 836 | }, 837 | "funding": { 838 | "url": "https://github.com/sponsors/sindresorhus" 839 | } 840 | }, 841 | "node_modules/is-core-module": { 842 | "version": "2.16.1", 843 | "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", 844 | "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", 845 | "dev": true, 846 | "license": "MIT", 847 | "dependencies": { 848 | "hasown": "^2.0.2" 849 | }, 850 | "engines": { 851 | "node": ">= 0.4" 852 | }, 853 | "funding": { 854 | "url": "https://github.com/sponsors/ljharb" 855 | } 856 | }, 857 | "node_modules/is-fullwidth-code-point": { 858 | "version": "3.0.0", 859 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", 860 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", 861 | "dev": true, 862 | "license": "MIT", 863 | "engines": { 864 | "node": ">=8" 865 | } 866 | }, 867 | "node_modules/isarray": { 868 | "version": "1.0.0", 869 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 870 | "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", 871 | "dev": true, 872 | "license": "MIT" 873 | }, 874 | "node_modules/isexe": { 875 | "version": "3.1.1", 876 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", 877 | "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", 878 | "engines": { 879 | "node": ">=16" 880 | } 881 | }, 882 | "node_modules/jackspeak": { 883 | "version": "3.4.3", 884 | "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", 885 | "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", 886 | "dev": true, 887 | "license": "BlueOak-1.0.0", 888 | "dependencies": { 889 | "@isaacs/cliui": "^8.0.2" 890 | }, 891 | "funding": { 892 | "url": "https://github.com/sponsors/isaacs" 893 | }, 894 | "optionalDependencies": { 895 | "@pkgjs/parseargs": "^0.11.0" 896 | } 897 | }, 898 | "node_modules/jsesc": { 899 | "version": "3.1.0", 900 | "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", 901 | "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", 902 | "dev": true, 903 | "license": "MIT", 904 | "bin": { 905 | "jsesc": "bin/jsesc" 906 | }, 907 | "engines": { 908 | "node": ">=6" 909 | } 910 | }, 911 | "node_modules/jsonfile": { 912 | "version": "6.1.0", 913 | "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", 914 | "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", 915 | "dev": true, 916 | "license": "MIT", 917 | "dependencies": { 918 | "universalify": "^2.0.0" 919 | }, 920 | "optionalDependencies": { 921 | "graceful-fs": "^4.1.6" 922 | } 923 | }, 924 | "node_modules/lru-cache": { 925 | "version": "10.4.3", 926 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", 927 | "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", 928 | "dev": true, 929 | "license": "ISC" 930 | }, 931 | "node_modules/mimic-response": { 932 | "version": "3.1.0", 933 | "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", 934 | "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", 935 | "dev": true, 936 | "license": "MIT", 937 | "engines": { 938 | "node": ">=10" 939 | }, 940 | "funding": { 941 | "url": "https://github.com/sponsors/sindresorhus" 942 | } 943 | }, 944 | "node_modules/minimatch": { 945 | "version": "9.0.5", 946 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", 947 | "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", 948 | "dev": true, 949 | "license": "ISC", 950 | "dependencies": { 951 | "brace-expansion": "^2.0.1" 952 | }, 953 | "engines": { 954 | "node": ">=16 || 14 >=14.17" 955 | }, 956 | "funding": { 957 | "url": "https://github.com/sponsors/isaacs" 958 | } 959 | }, 960 | "node_modules/minimist": { 961 | "version": "1.2.8", 962 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", 963 | "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", 964 | "dev": true, 965 | "license": "MIT", 966 | "funding": { 967 | "url": "https://github.com/sponsors/ljharb" 968 | } 969 | }, 970 | "node_modules/minipass": { 971 | "version": "7.1.2", 972 | "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", 973 | "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", 974 | "dev": true, 975 | "license": "ISC", 976 | "engines": { 977 | "node": ">=16 || 14 >=14.17" 978 | } 979 | }, 980 | "node_modules/minizlib": { 981 | "version": "3.0.1", 982 | "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.0.1.tgz", 983 | "integrity": "sha512-umcy022ILvb5/3Djuu8LWeqUa8D68JaBzlttKeMWen48SjabqS3iY5w/vzeMzMUNhLDifyhbOwKDSznB1vvrwg==", 984 | "dev": true, 985 | "license": "MIT", 986 | "dependencies": { 987 | "minipass": "^7.0.4", 988 | "rimraf": "^5.0.5" 989 | }, 990 | "engines": { 991 | "node": ">= 18" 992 | } 993 | }, 994 | "node_modules/mkdirp": { 995 | "version": "3.0.1", 996 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz", 997 | "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==", 998 | "dev": true, 999 | "license": "MIT", 1000 | "bin": { 1001 | "mkdirp": "dist/cjs/src/bin.js" 1002 | }, 1003 | "engines": { 1004 | "node": ">=10" 1005 | }, 1006 | "funding": { 1007 | "url": "https://github.com/sponsors/isaacs" 1008 | } 1009 | }, 1010 | "node_modules/mkdirp-classic": { 1011 | "version": "0.5.3", 1012 | "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", 1013 | "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", 1014 | "dev": true, 1015 | "license": "MIT" 1016 | }, 1017 | "node_modules/ms": { 1018 | "version": "2.1.3", 1019 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 1020 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", 1021 | "dev": true, 1022 | "license": "MIT" 1023 | }, 1024 | "node_modules/multistream": { 1025 | "version": "4.1.0", 1026 | "resolved": "https://registry.npmjs.org/multistream/-/multistream-4.1.0.tgz", 1027 | "integrity": "sha512-J1XDiAmmNpRCBfIWJv+n0ymC4ABcf/Pl+5YvC5B/D2f/2+8PtHvCNxMPKiQcZyi922Hq69J2YOpb1pTywfifyw==", 1028 | "dev": true, 1029 | "funding": [ 1030 | { 1031 | "type": "github", 1032 | "url": "https://github.com/sponsors/feross" 1033 | }, 1034 | { 1035 | "type": "patreon", 1036 | "url": "https://www.patreon.com/feross" 1037 | }, 1038 | { 1039 | "type": "consulting", 1040 | "url": "https://feross.org/support" 1041 | } 1042 | ], 1043 | "license": "MIT", 1044 | "dependencies": { 1045 | "once": "^1.4.0", 1046 | "readable-stream": "^3.6.0" 1047 | } 1048 | }, 1049 | "node_modules/multistream/node_modules/readable-stream": { 1050 | "version": "3.6.2", 1051 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", 1052 | "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", 1053 | "dev": true, 1054 | "license": "MIT", 1055 | "dependencies": { 1056 | "inherits": "^2.0.3", 1057 | "string_decoder": "^1.1.1", 1058 | "util-deprecate": "^1.0.1" 1059 | }, 1060 | "engines": { 1061 | "node": ">= 6" 1062 | } 1063 | }, 1064 | "node_modules/napi-build-utils": { 1065 | "version": "1.0.2", 1066 | "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", 1067 | "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==", 1068 | "dev": true, 1069 | "license": "MIT" 1070 | }, 1071 | "node_modules/node-abi": { 1072 | "version": "3.71.0", 1073 | "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.71.0.tgz", 1074 | "integrity": "sha512-SZ40vRiy/+wRTf21hxkkEjPJZpARzUMVcJoQse2EF8qkUWbbO2z7vd5oA/H6bVH6SZQ5STGcu0KRDS7biNRfxw==", 1075 | "dev": true, 1076 | "license": "MIT", 1077 | "dependencies": { 1078 | "semver": "^7.3.5" 1079 | }, 1080 | "engines": { 1081 | "node": ">=10" 1082 | } 1083 | }, 1084 | "node_modules/node-fetch": { 1085 | "version": "2.7.0", 1086 | "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", 1087 | "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", 1088 | "dev": true, 1089 | "license": "MIT", 1090 | "dependencies": { 1091 | "whatwg-url": "^5.0.0" 1092 | }, 1093 | "engines": { 1094 | "node": "4.x || >=6.0.0" 1095 | }, 1096 | "peerDependencies": { 1097 | "encoding": "^0.1.0" 1098 | }, 1099 | "peerDependenciesMeta": { 1100 | "encoding": { 1101 | "optional": true 1102 | } 1103 | } 1104 | }, 1105 | "node_modules/node-int64": { 1106 | "version": "0.4.0", 1107 | "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", 1108 | "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", 1109 | "dev": true, 1110 | "license": "MIT" 1111 | }, 1112 | "node_modules/once": { 1113 | "version": "1.4.0", 1114 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 1115 | "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", 1116 | "dev": true, 1117 | "license": "ISC", 1118 | "dependencies": { 1119 | "wrappy": "1" 1120 | } 1121 | }, 1122 | "node_modules/p-is-promise": { 1123 | "version": "3.0.0", 1124 | "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-3.0.0.tgz", 1125 | "integrity": "sha512-Wo8VsW4IRQSKVXsJCn7TomUaVtyfjVDn3nUP7kE967BQk0CwFpdbZs0X0uk5sW9mkBa9eNM7hCMaG93WUAwxYQ==", 1126 | "dev": true, 1127 | "license": "MIT", 1128 | "engines": { 1129 | "node": ">=8" 1130 | } 1131 | }, 1132 | "node_modules/package-json-from-dist": { 1133 | "version": "1.0.1", 1134 | "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", 1135 | "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", 1136 | "dev": true, 1137 | "license": "BlueOak-1.0.0" 1138 | }, 1139 | "node_modules/path-key": { 1140 | "version": "3.1.1", 1141 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", 1142 | "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", 1143 | "dev": true, 1144 | "license": "MIT", 1145 | "engines": { 1146 | "node": ">=8" 1147 | } 1148 | }, 1149 | "node_modules/path-parse": { 1150 | "version": "1.0.7", 1151 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", 1152 | "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", 1153 | "dev": true, 1154 | "license": "MIT" 1155 | }, 1156 | "node_modules/path-scurry": { 1157 | "version": "1.11.1", 1158 | "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", 1159 | "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", 1160 | "dev": true, 1161 | "license": "BlueOak-1.0.0", 1162 | "dependencies": { 1163 | "lru-cache": "^10.2.0", 1164 | "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" 1165 | }, 1166 | "engines": { 1167 | "node": ">=16 || 14 >=14.18" 1168 | }, 1169 | "funding": { 1170 | "url": "https://github.com/sponsors/isaacs" 1171 | } 1172 | }, 1173 | "node_modules/picocolors": { 1174 | "version": "1.1.1", 1175 | "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", 1176 | "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", 1177 | "dev": true, 1178 | "license": "ISC" 1179 | }, 1180 | "node_modules/picomatch": { 1181 | "version": "4.0.2", 1182 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", 1183 | "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", 1184 | "dev": true, 1185 | "license": "MIT", 1186 | "engines": { 1187 | "node": ">=12" 1188 | }, 1189 | "funding": { 1190 | "url": "https://github.com/sponsors/jonschlinkert" 1191 | } 1192 | }, 1193 | "node_modules/prebuild-install": { 1194 | "version": "7.1.2", 1195 | "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.2.tgz", 1196 | "integrity": "sha512-UnNke3IQb6sgarcZIDU3gbMeTp/9SSU1DAIkil7PrqG1vZlBtY5msYccSKSHDqa3hNg436IXK+SNImReuA1wEQ==", 1197 | "dev": true, 1198 | "license": "MIT", 1199 | "dependencies": { 1200 | "detect-libc": "^2.0.0", 1201 | "expand-template": "^2.0.3", 1202 | "github-from-package": "0.0.0", 1203 | "minimist": "^1.2.3", 1204 | "mkdirp-classic": "^0.5.3", 1205 | "napi-build-utils": "^1.0.1", 1206 | "node-abi": "^3.3.0", 1207 | "pump": "^3.0.0", 1208 | "rc": "^1.2.7", 1209 | "simple-get": "^4.0.0", 1210 | "tar-fs": "^2.0.0", 1211 | "tunnel-agent": "^0.6.0" 1212 | }, 1213 | "bin": { 1214 | "prebuild-install": "bin.js" 1215 | }, 1216 | "engines": { 1217 | "node": ">=10" 1218 | } 1219 | }, 1220 | "node_modules/process-nextick-args": { 1221 | "version": "2.0.1", 1222 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", 1223 | "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", 1224 | "dev": true, 1225 | "license": "MIT" 1226 | }, 1227 | "node_modules/progress": { 1228 | "version": "2.0.3", 1229 | "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", 1230 | "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", 1231 | "dev": true, 1232 | "license": "MIT", 1233 | "engines": { 1234 | "node": ">=0.4.0" 1235 | } 1236 | }, 1237 | "node_modules/pump": { 1238 | "version": "3.0.2", 1239 | "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.2.tgz", 1240 | "integrity": "sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==", 1241 | "dev": true, 1242 | "license": "MIT", 1243 | "dependencies": { 1244 | "end-of-stream": "^1.1.0", 1245 | "once": "^1.3.1" 1246 | } 1247 | }, 1248 | "node_modules/rc": { 1249 | "version": "1.2.8", 1250 | "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", 1251 | "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", 1252 | "dev": true, 1253 | "license": "(BSD-2-Clause OR MIT OR Apache-2.0)", 1254 | "dependencies": { 1255 | "deep-extend": "^0.6.0", 1256 | "ini": "~1.3.0", 1257 | "minimist": "^1.2.0", 1258 | "strip-json-comments": "~2.0.1" 1259 | }, 1260 | "bin": { 1261 | "rc": "cli.js" 1262 | } 1263 | }, 1264 | "node_modules/readable-stream": { 1265 | "version": "2.3.8", 1266 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", 1267 | "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", 1268 | "dev": true, 1269 | "license": "MIT", 1270 | "dependencies": { 1271 | "core-util-is": "~1.0.0", 1272 | "inherits": "~2.0.3", 1273 | "isarray": "~1.0.0", 1274 | "process-nextick-args": "~2.0.0", 1275 | "safe-buffer": "~5.1.1", 1276 | "string_decoder": "~1.1.1", 1277 | "util-deprecate": "~1.0.1" 1278 | } 1279 | }, 1280 | "node_modules/require-directory": { 1281 | "version": "2.1.1", 1282 | "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", 1283 | "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", 1284 | "dev": true, 1285 | "license": "MIT", 1286 | "engines": { 1287 | "node": ">=0.10.0" 1288 | } 1289 | }, 1290 | "node_modules/resolve": { 1291 | "version": "1.22.10", 1292 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", 1293 | "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", 1294 | "dev": true, 1295 | "license": "MIT", 1296 | "dependencies": { 1297 | "is-core-module": "^2.16.0", 1298 | "path-parse": "^1.0.7", 1299 | "supports-preserve-symlinks-flag": "^1.0.0" 1300 | }, 1301 | "bin": { 1302 | "resolve": "bin/resolve" 1303 | }, 1304 | "engines": { 1305 | "node": ">= 0.4" 1306 | }, 1307 | "funding": { 1308 | "url": "https://github.com/sponsors/ljharb" 1309 | } 1310 | }, 1311 | "node_modules/rimraf": { 1312 | "version": "5.0.10", 1313 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.10.tgz", 1314 | "integrity": "sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ==", 1315 | "dev": true, 1316 | "license": "ISC", 1317 | "dependencies": { 1318 | "glob": "^10.3.7" 1319 | }, 1320 | "bin": { 1321 | "rimraf": "dist/esm/bin.mjs" 1322 | }, 1323 | "funding": { 1324 | "url": "https://github.com/sponsors/isaacs" 1325 | } 1326 | }, 1327 | "node_modules/safe-buffer": { 1328 | "version": "5.1.2", 1329 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 1330 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", 1331 | "dev": true, 1332 | "license": "MIT" 1333 | }, 1334 | "node_modules/semver": { 1335 | "version": "7.6.3", 1336 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", 1337 | "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", 1338 | "dev": true, 1339 | "license": "ISC", 1340 | "bin": { 1341 | "semver": "bin/semver.js" 1342 | }, 1343 | "engines": { 1344 | "node": ">=10" 1345 | } 1346 | }, 1347 | "node_modules/shebang-command": { 1348 | "version": "2.0.0", 1349 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", 1350 | "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", 1351 | "dev": true, 1352 | "license": "MIT", 1353 | "dependencies": { 1354 | "shebang-regex": "^3.0.0" 1355 | }, 1356 | "engines": { 1357 | "node": ">=8" 1358 | } 1359 | }, 1360 | "node_modules/shebang-regex": { 1361 | "version": "3.0.0", 1362 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", 1363 | "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", 1364 | "dev": true, 1365 | "license": "MIT", 1366 | "engines": { 1367 | "node": ">=8" 1368 | } 1369 | }, 1370 | "node_modules/signal-exit": { 1371 | "version": "4.1.0", 1372 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", 1373 | "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", 1374 | "dev": true, 1375 | "license": "ISC", 1376 | "engines": { 1377 | "node": ">=14" 1378 | }, 1379 | "funding": { 1380 | "url": "https://github.com/sponsors/isaacs" 1381 | } 1382 | }, 1383 | "node_modules/simple-concat": { 1384 | "version": "1.0.1", 1385 | "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", 1386 | "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", 1387 | "dev": true, 1388 | "funding": [ 1389 | { 1390 | "type": "github", 1391 | "url": "https://github.com/sponsors/feross" 1392 | }, 1393 | { 1394 | "type": "patreon", 1395 | "url": "https://www.patreon.com/feross" 1396 | }, 1397 | { 1398 | "type": "consulting", 1399 | "url": "https://feross.org/support" 1400 | } 1401 | ], 1402 | "license": "MIT" 1403 | }, 1404 | "node_modules/simple-get": { 1405 | "version": "4.0.1", 1406 | "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", 1407 | "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", 1408 | "dev": true, 1409 | "funding": [ 1410 | { 1411 | "type": "github", 1412 | "url": "https://github.com/sponsors/feross" 1413 | }, 1414 | { 1415 | "type": "patreon", 1416 | "url": "https://www.patreon.com/feross" 1417 | }, 1418 | { 1419 | "type": "consulting", 1420 | "url": "https://feross.org/support" 1421 | } 1422 | ], 1423 | "license": "MIT", 1424 | "dependencies": { 1425 | "decompress-response": "^6.0.0", 1426 | "once": "^1.3.1", 1427 | "simple-concat": "^1.0.0" 1428 | } 1429 | }, 1430 | "node_modules/stream-meter": { 1431 | "version": "1.0.4", 1432 | "resolved": "https://registry.npmjs.org/stream-meter/-/stream-meter-1.0.4.tgz", 1433 | "integrity": "sha512-4sOEtrbgFotXwnEuzzsQBYEV1elAeFSO8rSGeTwabuX1RRn/kEq9JVH7I0MRBhKVRR0sJkr0M0QCH7yOLf9fhQ==", 1434 | "dev": true, 1435 | "license": "MIT", 1436 | "dependencies": { 1437 | "readable-stream": "^2.1.4" 1438 | } 1439 | }, 1440 | "node_modules/string_decoder": { 1441 | "version": "1.1.1", 1442 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 1443 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 1444 | "dev": true, 1445 | "license": "MIT", 1446 | "dependencies": { 1447 | "safe-buffer": "~5.1.0" 1448 | } 1449 | }, 1450 | "node_modules/string-width": { 1451 | "version": "5.1.2", 1452 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", 1453 | "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", 1454 | "dev": true, 1455 | "license": "MIT", 1456 | "dependencies": { 1457 | "eastasianwidth": "^0.2.0", 1458 | "emoji-regex": "^9.2.2", 1459 | "strip-ansi": "^7.0.1" 1460 | }, 1461 | "engines": { 1462 | "node": ">=12" 1463 | }, 1464 | "funding": { 1465 | "url": "https://github.com/sponsors/sindresorhus" 1466 | } 1467 | }, 1468 | "node_modules/string-width-cjs": { 1469 | "name": "string-width", 1470 | "version": "4.2.3", 1471 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", 1472 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 1473 | "dev": true, 1474 | "license": "MIT", 1475 | "dependencies": { 1476 | "emoji-regex": "^8.0.0", 1477 | "is-fullwidth-code-point": "^3.0.0", 1478 | "strip-ansi": "^6.0.1" 1479 | }, 1480 | "engines": { 1481 | "node": ">=8" 1482 | } 1483 | }, 1484 | "node_modules/string-width-cjs/node_modules/ansi-regex": { 1485 | "version": "5.0.1", 1486 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 1487 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 1488 | "dev": true, 1489 | "license": "MIT", 1490 | "engines": { 1491 | "node": ">=8" 1492 | } 1493 | }, 1494 | "node_modules/string-width-cjs/node_modules/emoji-regex": { 1495 | "version": "8.0.0", 1496 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 1497 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", 1498 | "dev": true, 1499 | "license": "MIT" 1500 | }, 1501 | "node_modules/string-width-cjs/node_modules/strip-ansi": { 1502 | "version": "6.0.1", 1503 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 1504 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 1505 | "dev": true, 1506 | "license": "MIT", 1507 | "dependencies": { 1508 | "ansi-regex": "^5.0.1" 1509 | }, 1510 | "engines": { 1511 | "node": ">=8" 1512 | } 1513 | }, 1514 | "node_modules/strip-ansi": { 1515 | "version": "7.1.0", 1516 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", 1517 | "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", 1518 | "dev": true, 1519 | "license": "MIT", 1520 | "dependencies": { 1521 | "ansi-regex": "^6.0.1" 1522 | }, 1523 | "engines": { 1524 | "node": ">=12" 1525 | }, 1526 | "funding": { 1527 | "url": "https://github.com/chalk/strip-ansi?sponsor=1" 1528 | } 1529 | }, 1530 | "node_modules/strip-ansi-cjs": { 1531 | "name": "strip-ansi", 1532 | "version": "6.0.1", 1533 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 1534 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 1535 | "dev": true, 1536 | "license": "MIT", 1537 | "dependencies": { 1538 | "ansi-regex": "^5.0.1" 1539 | }, 1540 | "engines": { 1541 | "node": ">=8" 1542 | } 1543 | }, 1544 | "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { 1545 | "version": "5.0.1", 1546 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 1547 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 1548 | "dev": true, 1549 | "license": "MIT", 1550 | "engines": { 1551 | "node": ">=8" 1552 | } 1553 | }, 1554 | "node_modules/strip-json-comments": { 1555 | "version": "2.0.1", 1556 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", 1557 | "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", 1558 | "dev": true, 1559 | "license": "MIT", 1560 | "engines": { 1561 | "node": ">=0.10.0" 1562 | } 1563 | }, 1564 | "node_modules/supports-preserve-symlinks-flag": { 1565 | "version": "1.0.0", 1566 | "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", 1567 | "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", 1568 | "dev": true, 1569 | "license": "MIT", 1570 | "engines": { 1571 | "node": ">= 0.4" 1572 | }, 1573 | "funding": { 1574 | "url": "https://github.com/sponsors/ljharb" 1575 | } 1576 | }, 1577 | "node_modules/tar": { 1578 | "version": "7.4.3", 1579 | "resolved": "https://registry.npmjs.org/tar/-/tar-7.4.3.tgz", 1580 | "integrity": "sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==", 1581 | "dev": true, 1582 | "license": "ISC", 1583 | "dependencies": { 1584 | "@isaacs/fs-minipass": "^4.0.0", 1585 | "chownr": "^3.0.0", 1586 | "minipass": "^7.1.2", 1587 | "minizlib": "^3.0.1", 1588 | "mkdirp": "^3.0.1", 1589 | "yallist": "^5.0.0" 1590 | }, 1591 | "engines": { 1592 | "node": ">=18" 1593 | } 1594 | }, 1595 | "node_modules/tar-fs": { 1596 | "version": "2.1.2", 1597 | "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.2.tgz", 1598 | "integrity": "sha512-EsaAXwxmx8UB7FRKqeozqEPop69DXcmYwTQwXvyAPF352HJsPdkVhvTaDPYqfNgruveJIJy3TA2l+2zj8LJIJA==", 1599 | "dev": true, 1600 | "license": "MIT", 1601 | "dependencies": { 1602 | "chownr": "^1.1.1", 1603 | "mkdirp-classic": "^0.5.2", 1604 | "pump": "^3.0.0", 1605 | "tar-stream": "^2.1.4" 1606 | } 1607 | }, 1608 | "node_modules/tar-fs/node_modules/chownr": { 1609 | "version": "1.1.4", 1610 | "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", 1611 | "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", 1612 | "dev": true, 1613 | "license": "ISC" 1614 | }, 1615 | "node_modules/tar-stream": { 1616 | "version": "2.2.0", 1617 | "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", 1618 | "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", 1619 | "dev": true, 1620 | "license": "MIT", 1621 | "dependencies": { 1622 | "bl": "^4.0.3", 1623 | "end-of-stream": "^1.4.1", 1624 | "fs-constants": "^1.0.0", 1625 | "inherits": "^2.0.3", 1626 | "readable-stream": "^3.1.1" 1627 | }, 1628 | "engines": { 1629 | "node": ">=6" 1630 | } 1631 | }, 1632 | "node_modules/tar-stream/node_modules/readable-stream": { 1633 | "version": "3.6.2", 1634 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", 1635 | "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", 1636 | "dev": true, 1637 | "license": "MIT", 1638 | "dependencies": { 1639 | "inherits": "^2.0.3", 1640 | "string_decoder": "^1.1.1", 1641 | "util-deprecate": "^1.0.1" 1642 | }, 1643 | "engines": { 1644 | "node": ">= 6" 1645 | } 1646 | }, 1647 | "node_modules/tinyglobby": { 1648 | "version": "0.2.10", 1649 | "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.10.tgz", 1650 | "integrity": "sha512-Zc+8eJlFMvgatPZTl6A9L/yht8QqdmUNtURHaKZLmKBE12hNPSrqNkUp2cs3M/UKmNVVAMFQYSjYIVHDjW5zew==", 1651 | "dev": true, 1652 | "license": "MIT", 1653 | "dependencies": { 1654 | "fdir": "^6.4.2", 1655 | "picomatch": "^4.0.2" 1656 | }, 1657 | "engines": { 1658 | "node": ">=12.0.0" 1659 | } 1660 | }, 1661 | "node_modules/tr46": { 1662 | "version": "0.0.3", 1663 | "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", 1664 | "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", 1665 | "dev": true, 1666 | "license": "MIT" 1667 | }, 1668 | "node_modules/tunnel-agent": { 1669 | "version": "0.6.0", 1670 | "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", 1671 | "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", 1672 | "dev": true, 1673 | "license": "Apache-2.0", 1674 | "dependencies": { 1675 | "safe-buffer": "^5.0.1" 1676 | }, 1677 | "engines": { 1678 | "node": "*" 1679 | } 1680 | }, 1681 | "node_modules/universalify": { 1682 | "version": "2.0.1", 1683 | "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", 1684 | "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", 1685 | "dev": true, 1686 | "license": "MIT", 1687 | "engines": { 1688 | "node": ">= 10.0.0" 1689 | } 1690 | }, 1691 | "node_modules/unzipper": { 1692 | "version": "0.12.3", 1693 | "resolved": "https://registry.npmjs.org/unzipper/-/unzipper-0.12.3.tgz", 1694 | "integrity": "sha512-PZ8hTS+AqcGxsaQntl3IRBw65QrBI6lxzqDEL7IAo/XCEqRTKGfOX56Vea5TH9SZczRVxuzk1re04z/YjuYCJA==", 1695 | "dev": true, 1696 | "license": "MIT", 1697 | "dependencies": { 1698 | "bluebird": "~3.7.2", 1699 | "duplexer2": "~0.1.4", 1700 | "fs-extra": "^11.2.0", 1701 | "graceful-fs": "^4.2.2", 1702 | "node-int64": "^0.4.0" 1703 | } 1704 | }, 1705 | "node_modules/util-deprecate": { 1706 | "version": "1.0.2", 1707 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 1708 | "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", 1709 | "dev": true, 1710 | "license": "MIT" 1711 | }, 1712 | "node_modules/webidl-conversions": { 1713 | "version": "3.0.1", 1714 | "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", 1715 | "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", 1716 | "dev": true, 1717 | "license": "BSD-2-Clause" 1718 | }, 1719 | "node_modules/whatwg-url": { 1720 | "version": "5.0.0", 1721 | "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", 1722 | "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", 1723 | "dev": true, 1724 | "license": "MIT", 1725 | "dependencies": { 1726 | "tr46": "~0.0.3", 1727 | "webidl-conversions": "^3.0.0" 1728 | } 1729 | }, 1730 | "node_modules/which": { 1731 | "version": "5.0.0", 1732 | "resolved": "https://registry.npmjs.org/which/-/which-5.0.0.tgz", 1733 | "integrity": "sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==", 1734 | "license": "ISC", 1735 | "dependencies": { 1736 | "isexe": "^3.1.1" 1737 | }, 1738 | "bin": { 1739 | "node-which": "bin/which.js" 1740 | }, 1741 | "engines": { 1742 | "node": "^18.17.0 || >=20.5.0" 1743 | } 1744 | }, 1745 | "node_modules/wrap-ansi": { 1746 | "version": "8.1.0", 1747 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", 1748 | "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", 1749 | "dev": true, 1750 | "license": "MIT", 1751 | "dependencies": { 1752 | "ansi-styles": "^6.1.0", 1753 | "string-width": "^5.0.1", 1754 | "strip-ansi": "^7.0.1" 1755 | }, 1756 | "engines": { 1757 | "node": ">=12" 1758 | }, 1759 | "funding": { 1760 | "url": "https://github.com/chalk/wrap-ansi?sponsor=1" 1761 | } 1762 | }, 1763 | "node_modules/wrap-ansi-cjs": { 1764 | "name": "wrap-ansi", 1765 | "version": "7.0.0", 1766 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", 1767 | "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", 1768 | "dev": true, 1769 | "license": "MIT", 1770 | "dependencies": { 1771 | "ansi-styles": "^4.0.0", 1772 | "string-width": "^4.1.0", 1773 | "strip-ansi": "^6.0.0" 1774 | }, 1775 | "engines": { 1776 | "node": ">=10" 1777 | }, 1778 | "funding": { 1779 | "url": "https://github.com/chalk/wrap-ansi?sponsor=1" 1780 | } 1781 | }, 1782 | "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { 1783 | "version": "5.0.1", 1784 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 1785 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 1786 | "dev": true, 1787 | "license": "MIT", 1788 | "engines": { 1789 | "node": ">=8" 1790 | } 1791 | }, 1792 | "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { 1793 | "version": "4.3.0", 1794 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 1795 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 1796 | "dev": true, 1797 | "license": "MIT", 1798 | "dependencies": { 1799 | "color-convert": "^2.0.1" 1800 | }, 1801 | "engines": { 1802 | "node": ">=8" 1803 | }, 1804 | "funding": { 1805 | "url": "https://github.com/chalk/ansi-styles?sponsor=1" 1806 | } 1807 | }, 1808 | "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { 1809 | "version": "8.0.0", 1810 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 1811 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", 1812 | "dev": true, 1813 | "license": "MIT" 1814 | }, 1815 | "node_modules/wrap-ansi-cjs/node_modules/string-width": { 1816 | "version": "4.2.3", 1817 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", 1818 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 1819 | "dev": true, 1820 | "license": "MIT", 1821 | "dependencies": { 1822 | "emoji-regex": "^8.0.0", 1823 | "is-fullwidth-code-point": "^3.0.0", 1824 | "strip-ansi": "^6.0.1" 1825 | }, 1826 | "engines": { 1827 | "node": ">=8" 1828 | } 1829 | }, 1830 | "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { 1831 | "version": "6.0.1", 1832 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 1833 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 1834 | "dev": true, 1835 | "license": "MIT", 1836 | "dependencies": { 1837 | "ansi-regex": "^5.0.1" 1838 | }, 1839 | "engines": { 1840 | "node": ">=8" 1841 | } 1842 | }, 1843 | "node_modules/wrappy": { 1844 | "version": "1.0.2", 1845 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 1846 | "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", 1847 | "dev": true, 1848 | "license": "ISC" 1849 | }, 1850 | "node_modules/y18n": { 1851 | "version": "5.0.8", 1852 | "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", 1853 | "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", 1854 | "dev": true, 1855 | "license": "ISC", 1856 | "engines": { 1857 | "node": ">=10" 1858 | } 1859 | }, 1860 | "node_modules/yallist": { 1861 | "version": "5.0.0", 1862 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", 1863 | "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", 1864 | "dev": true, 1865 | "license": "BlueOak-1.0.0", 1866 | "engines": { 1867 | "node": ">=18" 1868 | } 1869 | }, 1870 | "node_modules/yargs": { 1871 | "version": "16.2.0", 1872 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", 1873 | "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", 1874 | "dev": true, 1875 | "license": "MIT", 1876 | "dependencies": { 1877 | "cliui": "^7.0.2", 1878 | "escalade": "^3.1.1", 1879 | "get-caller-file": "^2.0.5", 1880 | "require-directory": "^2.1.1", 1881 | "string-width": "^4.2.0", 1882 | "y18n": "^5.0.5", 1883 | "yargs-parser": "^20.2.2" 1884 | }, 1885 | "engines": { 1886 | "node": ">=10" 1887 | } 1888 | }, 1889 | "node_modules/yargs-parser": { 1890 | "version": "20.2.9", 1891 | "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", 1892 | "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", 1893 | "dev": true, 1894 | "license": "ISC", 1895 | "engines": { 1896 | "node": ">=10" 1897 | } 1898 | }, 1899 | "node_modules/yargs/node_modules/ansi-regex": { 1900 | "version": "5.0.1", 1901 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 1902 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 1903 | "dev": true, 1904 | "license": "MIT", 1905 | "engines": { 1906 | "node": ">=8" 1907 | } 1908 | }, 1909 | "node_modules/yargs/node_modules/emoji-regex": { 1910 | "version": "8.0.0", 1911 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 1912 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", 1913 | "dev": true, 1914 | "license": "MIT" 1915 | }, 1916 | "node_modules/yargs/node_modules/string-width": { 1917 | "version": "4.2.3", 1918 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", 1919 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 1920 | "dev": true, 1921 | "license": "MIT", 1922 | "dependencies": { 1923 | "emoji-regex": "^8.0.0", 1924 | "is-fullwidth-code-point": "^3.0.0", 1925 | "strip-ansi": "^6.0.1" 1926 | }, 1927 | "engines": { 1928 | "node": ">=8" 1929 | } 1930 | }, 1931 | "node_modules/yargs/node_modules/strip-ansi": { 1932 | "version": "6.0.1", 1933 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 1934 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 1935 | "dev": true, 1936 | "license": "MIT", 1937 | "dependencies": { 1938 | "ansi-regex": "^5.0.1" 1939 | }, 1940 | "engines": { 1941 | "node": ">=8" 1942 | } 1943 | } 1944 | } 1945 | } 1946 | -------------------------------------------------------------------------------- /proxy/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "ellsp-proxy", 3 | "version": "0.1.0", 4 | "description": "Elisp Language Server (proxy)", 5 | "main": "start.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1", 8 | "pkg-all": "pkg package.json --output ../bin/ellsp", 9 | "pkg-linux-arm64": "pkg package.json -t node*-linuxstatic-arm64 --output ../bin/ellsp --public", 10 | "pkg-linux-x64": "pkg package.json -t node*-linuxstatic-x64 --output ../bin/ellsp --public", 11 | "pkg-macos-arm64": "pkg package.json -t node*-macos-arm64 --output ../bin/ellsp --public", 12 | "pkg-macos-x64": "pkg package.json -t node*-macos-x64 --output ../bin/ellsp --public", 13 | "pkg-win-arm64": "pkg package.json -t node*-win-arm64 --output ../bin/ellsp --public", 14 | "pkg-win-x64": "pkg package.json -t node*-win-x64 --output ../bin/ellsp --public" 15 | }, 16 | "bin": { 17 | "ellsp": "start.js" 18 | }, 19 | "repository": { 20 | "type": "git", 21 | "url": "git+https://github.com/elisp-lsp/ellsp.git" 22 | }, 23 | "keywords": [ 24 | "ellsp", 25 | "elisp", 26 | "emacs", 27 | "language-server" 28 | ], 29 | "author": "Jen-Chieh Shen", 30 | "license": "GPL-3.0-or-later", 31 | "bugs": { 32 | "url": "https://github.com/elisp-lsp/ellsp/issues" 33 | }, 34 | "homepage": "https://github.com/elisp-lsp/ellsp#readme", 35 | "dependencies": { 36 | "which": "^5.0.0" 37 | }, 38 | "devDependencies": { 39 | "@yao-pkg/pkg": "^6.0.0" 40 | }, 41 | "publishConfig": { 42 | "access": "public" 43 | }, 44 | "pkg": { 45 | "scripts": [ 46 | "*.js" 47 | ], 48 | "targets": [ 49 | "node*-linux-x64", 50 | "node*-macos-x64", 51 | "node*-win-x64" 52 | ], 53 | "outputPath": "bin" 54 | } 55 | } 56 | -------------------------------------------------------------------------------- /proxy/scripts/build.bat: -------------------------------------------------------------------------------- 1 | @echo off 2 | 3 | :: Copyright (C) 2023-2025 the Ellsp authors. 4 | 5 | :: This program is free software; you can redistribute it and/or modify 6 | :: it under the terms of the GNU General Public License as published by 7 | :: the Free Software Foundation; either version 3, or (at your option) 8 | :: any later version. 9 | 10 | :: This program is distributed in the hope that it will be useful, 11 | :: but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | :: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | :: GNU General Public License for more details. 14 | 15 | :: You should have received a copy of the GNU General Public License 16 | :: along with this program. If not, see . 17 | 18 | cd .. 19 | 20 | npm run pkg-all 21 | -------------------------------------------------------------------------------- /proxy/start.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright (C) 2023-2025 the Ellsp authors. 3 | * 4 | * This program is free software; you can redistribute it and/or modify 5 | * it under the terms of the GNU General Public License as published by 6 | * the Free Software Foundation; either version 3, or (at your option) 7 | * any later version. 8 | * 9 | * This program is distributed in the hope that it will be useful, 10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | * GNU General Public License for more details. 13 | * 14 | * You should have received a copy of the GNU General Public License 15 | * along with this program. If not, see . 16 | */ 17 | 18 | "use strict"; 19 | 20 | const env = require('./env'); 21 | 22 | const child_process = require("child_process"); 23 | const stream = require('stream'); 24 | 25 | /** 26 | * Start Emacs process. 27 | */ 28 | function startEmacs() { 29 | if (!UTIL.which(ELLSP_EMACS)) { 30 | console.log("Emacs is not installed (cannot find `emacs' executable)"); 31 | return null; 32 | } 33 | 34 | let proc = child_process 35 | .spawn(ELLSP_EMACS, 36 | ['--batch', '--no-init-file', '--no-site-file', '--no-splash', 37 | '--load=ellsp', 38 | '--funcall=ellsp-stdin-loop'], 39 | { stdio: ['pipe', 'inherit', 'inherit'], shell: true } 40 | ); 41 | 42 | proc.on('close', function (code) { 43 | if (code == 0) return; 44 | process.exit(code); 45 | }); 46 | 47 | return proc; 48 | } 49 | 50 | /** 51 | * Program entry. 52 | */ 53 | function main() { 54 | let proc = startEmacs(); 55 | if (proc === null) 56 | return; 57 | 58 | process.stdin.on('data', function(data) { 59 | let input = data.toString(); 60 | //console.error(input); // XXX: It's use for debugging! 61 | //proc.stdin.write(input); 62 | proc.stdin.write(input + '\r\n'); 63 | }); 64 | } 65 | 66 | main(); // Start the program! 67 | -------------------------------------------------------------------------------- /proxy/util.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright (C) 2023-2025 the Ellsp authors. 3 | * 4 | * This program is free software; you can redistribute it and/or modify 5 | * it under the terms of the GNU General Public License as published by 6 | * the Free Software Foundation; either version 3, or (at your option) 7 | * any later version. 8 | * 9 | * This program is distributed in the hope that it will be useful, 10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | * GNU General Public License for more details. 13 | * 14 | * You should have received a copy of the GNU General Public License 15 | * along with this program. If not, see . 16 | */ 17 | 18 | "use strict"; 19 | 20 | /** 21 | * Check to see if a program is installed and exists on the path. 22 | * @param { String } command - Program name. 23 | * @return Return path or null if not found. 24 | */ 25 | function which(command) { 26 | return require('which').sync(command, { nothrow: true }); 27 | } 28 | 29 | 30 | /* 31 | * Module Exports 32 | */ 33 | module.exports.which = which; 34 | --------------------------------------------------------------------------------