├── .github └── workflows │ ├── compute_impacted_tests.yaml │ ├── pr.yaml │ └── update-main-version.yaml ├── .gitignore ├── .trunk ├── .gitignore ├── configs │ └── .markdownlint.yaml └── trunk.yaml ├── LICENSE.txt ├── README.md ├── action.yaml ├── jest.config.js ├── package.json ├── pnpm-lock.yaml ├── src └── scripts │ ├── BUILD │ ├── compute_impacted_targets.sh │ ├── prerequisites.sh │ └── upload_impacted_targets.sh ├── tests ├── simple_bazel_workspace │ ├── WORKSPACE │ └── lib │ │ ├── BUILD │ │ └── foo.txt └── upload.test.ts └── tsconfig.json /.github/workflows/compute_impacted_tests.yaml: -------------------------------------------------------------------------------- 1 | name: Pull Request 2 | on: pull_request 3 | 4 | permissions: read-all 5 | 6 | jobs: 7 | tests: 8 | runs-on: ubuntu-latest 9 | name: Compute Impacted Targets Tests 10 | steps: 11 | - name: Checkout 12 | uses: actions/checkout@v3 13 | with: 14 | fetch-depth: 0 15 | 16 | - name: Setup Bazel 17 | # trunk-ignore(semgrep): Trust third-party `bazelbuild` GH Action 18 | uses: bazelbuild/setup-bazelisk@v2 19 | 20 | - name: Compute Impacted Targets 21 | id: compute 22 | run: ./src/scripts/compute_impacted_targets.sh 23 | shell: bash 24 | env: 25 | MERGE_INSTANCE_BRANCH: do_not_delete/stable_test_branch 26 | MERGE_INSTANCE_BRANCH_HEAD_SHA: 097c8259c2e18da92f6189849ebc0f7f6dc624e5 27 | PR_BRANCH: do_not_delete/stable_test_branch 28 | PR_BRANCH_HEAD_SHA: 097c8259c2e18da92f6189849ebc0f7f6dc624e5 29 | VERBOSE: 1 30 | WORKSPACE_PATH: ./tests/simple_bazel_workspace 31 | BAZEL_STARTUP_OPTIONS: --host_jvm_args=-Xmx12G,--block_for_lock,--client_debug 32 | BAZEL_PATH: bazel 33 | 34 | - name: Validate Impacted Targets Computation 35 | shell: bash 36 | run: | 37 | target_count=`cat ${{ steps.compute.outputs.impacted_targets_out }} | wc -l` 38 | if [[ $target_count -ne 0 ]]; then 39 | exit 1 40 | fi 41 | -------------------------------------------------------------------------------- /.github/workflows/pr.yaml: -------------------------------------------------------------------------------- 1 | name: Pull Request 2 | on: pull_request 3 | 4 | jobs: 5 | tests: 6 | runs-on: ubuntu-latest 7 | name: Tests 8 | steps: 9 | - name: Checkout 10 | uses: actions/checkout@v3 11 | 12 | - name: Install pnpm 13 | uses: pnpm/action-setup@v2 14 | with: 15 | version: 8.7.5 16 | 17 | - name: Run Tests 18 | run: | 19 | pnpm install 20 | pnpm test 21 | -------------------------------------------------------------------------------- /.github/workflows/update-main-version.yaml: -------------------------------------------------------------------------------- 1 | name: Update release version 2 | run-name: Move ${{ github.event.inputs.major_version }} to ${{ github.event.inputs.target }} 3 | 4 | on: 5 | workflow_dispatch: 6 | inputs: 7 | target: 8 | description: The tag to use 9 | required: true 10 | major_version: 11 | type: choice 12 | description: Target major version 13 | options: 14 | - v1 15 | 16 | jobs: 17 | tag: 18 | runs-on: ubuntu-latest 19 | steps: 20 | - uses: actions/checkout@v3 21 | with: 22 | fetch-depth: 0 23 | - name: Git config 24 | run: | 25 | git config user.name trunkio 26 | git config user.email github-actions@trunk.io 27 | - name: Tag new target 28 | run: git tag -f ${{ github.event.inputs.major_version }} ${{ github.event.inputs.target }} 29 | - name: Push new tag 30 | run: git push origin ${{ github.event.inputs.major_version }} --force 31 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/** 2 | *_tmp 3 | -------------------------------------------------------------------------------- /.trunk/.gitignore: -------------------------------------------------------------------------------- 1 | *out 2 | *logs 3 | *actions 4 | *notifications 5 | plugins 6 | user_trunk.yaml 7 | user.yaml 8 | # TODO(lauri): Remove shims after a release or two 9 | shims 10 | tools 11 | -------------------------------------------------------------------------------- /.trunk/configs/.markdownlint.yaml: -------------------------------------------------------------------------------- 1 | # Autoformatter friendly markdownlint config (all formatting rules disabled) 2 | default: true 3 | blank_lines: false 4 | bullet: false 5 | html: false 6 | indentation: false 7 | line_length: false 8 | spaces: false 9 | url: false 10 | whitespace: false 11 | -------------------------------------------------------------------------------- /.trunk/trunk.yaml: -------------------------------------------------------------------------------- 1 | version: 0.1 2 | cli: 3 | version: 1.19.0 4 | plugins: 5 | sources: 6 | - id: trunk 7 | ref: v1.4.2 8 | uri: https://github.com/trunk-io/plugins 9 | - id: configs 10 | uri: https://github.com/trunk-io/configs 11 | ref: v1.0.2 12 | lint: 13 | disabled: 14 | - eslint 15 | enabled: 16 | - prettier@3.2.5 17 | - trufflehog@3.67.5 18 | ignore: 19 | - linters: [ALL] 20 | paths: 21 | - node_modules/** 22 | runtimes: 23 | enabled: 24 | - node@18.12.1 25 | -------------------------------------------------------------------------------- /LICENSE.txt: -------------------------------------------------------------------------------- 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 | . -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # merge-action 2 | 3 | Hosts the code for the [Trunk Merge](https://docs.trunk.io/merge-graph) GitHub Action, which makes 4 | it easy to upload the required impacted targets for PRs when running your merge queues in 5 | ["Parallel" mode](https://docs.trunk.io/merge-graph/configuration#single-parallel-mode). Currently, 6 | this action supports the following build systems: 7 | 8 | - [Bazel](https://bazel.build/) 9 | 10 | More supported build systems are coming soon! If your build system is not supported by this action 11 | yet, you can still 12 | [upload impacted targets to Trunk Merge](https://docs.trunk.io/merge-graph/impacted-targets) 13 | yourself. 14 | 15 | ## Overview 16 | 17 | Trunk Merge checks and tests all PRs before they merge, guaranteeing that the branches you care 18 | about the most will always pass all tests. Trunk Merge Queues, unlike traditional merge queues, can 19 | run in "Parallel" mode, which increases throughput by dynamically creating merge queues for pull 20 | requests that affect different parts of your codebase instead of testing them all together. That 21 | means no more waiting for your backend changes to test before landing your doc changes! 22 | 23 | Running in "Parallel" mode requires providing Trunk Merge with the list of 24 | [impacted targets](https://docs.trunk.io/merge-graph/impacted-targets) resulting from the changes in 25 | your PR. If using a supported build system, this action can take care of getting that list and 26 | sending it to Trunk Merge. 27 | 28 | If you do not already have one for your repo, a Trunk Merge Queue can be created at 29 | [app.trunk.io](https://app.trunk.io). Documentation on how to do that can be found 30 | [here](https://docs.trunk.io/merge-graph/set-up-trunk-merge). 31 | 32 | ### How This Action Works 33 | 34 | When run on a pull request, the merge action will compare the merge commit of your PR + the base 35 | branch to the tip of the PR's base branch. With those two commits, we'll query your build system to 36 | get the list of targets that were impacted directly due to the PR's code changes. That list will 37 | then be uploaded to Trunk Merge. This way, when running in "Parallel" mode, Trunk Merge will create 38 | merge queues just for the PRs that share any impacted targets, only testing PRs that actually can 39 | impact one-another against each other. 40 | 41 | Marking a PR as impacting every single other PR is also possible using the `impact-all-filters-path` 42 | argument for the action. This is useful for if a PR contains a change that any PRs queued in the 43 | future should also depend on - an example would be PRs that introduce or change workflows run on 44 | every PR. 45 | 46 | Sending this list of impacted targets for your PR is required before it can be queued when running 47 | in "Parallel" mode. If you [queue your PR](https://docs.trunk.io/merge-graph/testing-pull-requests) 48 | before the action uploads the list, the PR will wait until the list has been uploaded before being 49 | queued. 50 | 51 | ## Usage 52 | 53 | Running this action in a GitHub workflow will require you knowing your Trunk Repo or Trunk Org API 54 | token. 55 | 56 | ### Example 57 | 58 | An example of how this action would be run in a GitHub workflow is below. 59 | 60 | 61 | 62 | ```yaml 63 | name: Upload Impacted Targets 64 | on: pull_request 65 | 66 | jobs: 67 | compute_impacted_targets: 68 | name: Compute Impacted Targets 69 | runs-on: ubuntu-latest 70 | steps: 71 | - name: Checkout 72 | uses: actions/checkout@v3 73 | 74 | - name: Compute Impacted Targets 75 | uses: trunk-io/merge-action@v1 76 | with: 77 | # Use your Trunk repo or org API token to authenticate impacted targets uploads. 78 | # This secret should be provided as a GitHub secret. 79 | # See https://docs.github.com/en/actions/security-guides/using-secrets-in-github-actions. 80 | trunk-token: ${{ secrets.TRUNK_API_TOKEN }} 81 | ``` 82 | 83 | 84 | 85 | For more information on each possible argument you can provide, see 86 | [action.yaml](https://github.com/trunk-io/merge-action/blob/main/action.yaml). 87 | 88 | ### Tests 89 | 90 | To run tests: 91 | 92 | ``` 93 | pnpm install 94 | pnpm test 95 | ``` 96 | 97 | ## What is an Impacted Target? 98 | 99 | An impacted target is a unit that is affected by a particular PR. For example (using Bazel), a 100 | change at `src/backend/app` will impact the Bazel `src/backend` package. Any two pull requests that 101 | share an impacted target must be tested together; otherwise, they can be tested independently. 102 | 103 | ## Under the hood 104 | 105 | Below is more information about how this action works for specific build systems. 106 | 107 | ### Bazel 108 | 109 | We use Tinder's [bazel-diff](https://github.com/Tinder/bazel-diff) tool to compute the impacted 110 | targets of a particular PR. The tool computes a mapping of package --> hash at the source and dest 111 | shas, then reports any packages which have a differing hash. 112 | 113 | ## Questions 114 | 115 | For any questions, contact us on [Slack](https://slack.trunk.io). 116 | -------------------------------------------------------------------------------- /action.yaml: -------------------------------------------------------------------------------- 1 | name: Trunk Compute Impacted Targets 2 | author: trunk.io 3 | description: Trunk.io Github Action to Compute and Upload Impacted Targets 4 | 5 | inputs: 6 | trunk-token: 7 | description: 8 | Repo or Organization API token used for authentication. Can be found at app.trunk.io. 9 | required: false # Required for any workflow not coming from a forked PR. 10 | target-branch: 11 | description: 12 | The branch that the Merge Queue merges PRs into. If unspecified, defaults to the repository's 13 | default branch. 14 | required: false 15 | bazel-workspace-path: 16 | description: 17 | The path to the bazel WORKSPACE, relative to the root of the git repository. If unspecified, 18 | defaults to the root of the repository. 19 | required: false 20 | verbose: 21 | description: Whether to enable verbose logging. Defaults to false. 22 | required: false 23 | bazel-startup-options: 24 | description: 25 | A comma separated list of startup options to pass to Bazel. See 26 | https://bazel.build/reference/command-line-reference#startup-options for a complete list. If 27 | unspecified, no startup options are specified. 28 | required: false 29 | bazel-path: 30 | description: A path to the Bazel executable. Defaults to PATH. 31 | required: false 32 | default: bazel 33 | impact-all-filters-path: 34 | description: 35 | A path to a list of filters to identify whether `ALL` impacted targets should be considered. 36 | See https://github.com/dorny/paths-filter/blob/master/.github/filters.yml for an example. If a 37 | PR changes files in any of these paths, then *any* PRs queued after this one will depend on 38 | it. 39 | required: false 40 | default: "" 41 | 42 | runs: 43 | using: composite 44 | steps: 45 | - name: Detect changed paths 46 | id: detect-changed-paths 47 | if: ${{ inputs.impact-all-filters-path != '' }} 48 | # trunk-ignore(semgrep/yaml.github-actions.security.third-party-action-not-pinned-to-commit-sha.third-party-action-not-pinned-to-commit-sha) 49 | uses: dorny/paths-filter@v2 50 | with: 51 | filters: ${{ inputs.impact-all-filters-path }} 52 | 53 | - name: Prerequisites 54 | id: prerequisites 55 | run: ${GITHUB_ACTION_PATH}/src/scripts/prerequisites.sh 56 | shell: bash 57 | env: 58 | DEFAULT_BRANCH: ${{ github.event.repository.default_branch }} 59 | TARGET_BRANCH: ${{ inputs.target-branch }} 60 | PR_BRANCH_HEAD_SHA: ${{ github.event.pull_request.head.sha }} 61 | WORKSPACE_PATH: ${{ inputs.bazel-workspace-path }} 62 | BAZEL_PATH: ${{ inputs.bazel-path }} 63 | IMPACTS_FILTERS_CHANGES: ${{ steps.detect-changed-paths.outputs.changes }} 64 | 65 | - name: Setup jq 66 | # trunk-ignore(semgrep): Trust third-party action to install JQ. Source code: https://github.com/dcarbone/install-jq-action/ 67 | uses: dcarbone/install-jq-action@v1.0.1 68 | 69 | - name: Install Bazel in PATH 70 | if: ${{ steps.prerequisites.outputs.requires_default_bazel_installation == 'true' }} 71 | # trunk-ignore(semgrep): Trust third-party `bazelbuild` GH Action 72 | uses: bazelbuild/setup-bazelisk@v2 73 | 74 | - name: Compute Impacted Targets 75 | id: compute-impacted-targets 76 | run: ${GITHUB_ACTION_PATH}/src/scripts/compute_impacted_targets.sh 77 | if: ${{ steps.prerequisites.outputs.impacts_all_detected == 'false' }} 78 | shell: bash 79 | env: 80 | MERGE_INSTANCE_BRANCH: ${{ steps.prerequisites.outputs.merge_instance_branch }} 81 | MERGE_INSTANCE_BRANCH_HEAD_SHA: 82 | ${{ steps.prerequisites.outputs.merge_instance_branch_head_sha }} 83 | PR_BRANCH_HEAD_SHA: ${{ github.event.pull_request.head.sha }} 84 | VERBOSE: ${{ inputs.verbose }} 85 | WORKSPACE_PATH: ${{ steps.prerequisites.outputs.workspace_path }} 86 | BAZEL_PATH: ${{ inputs.bazel-path }} 87 | BAZEL_STARTUP_OPTIONS: ${{ inputs.bazel-startup-options }} 88 | 89 | - name: Upload Impacted Targets 90 | run: ${GITHUB_ACTION_PATH}/src/scripts/upload_impacted_targets.sh 91 | shell: bash 92 | env: 93 | ACTOR: ${{ github.actor }} 94 | API_TOKEN: ${{ inputs.trunk-token }} 95 | REPOSITORY: ${{ github.repository }} 96 | RUN_ID: ${{ github.run_id }} 97 | IS_FORK: ${{ github.event.pull_request.head.repo.fork }} 98 | TARGET_BRANCH: ${{ steps.prerequisites.outputs.merge_instance_branch }} 99 | PR_NUMBER: ${{ github.event.pull_request.number }} 100 | PR_BRANCH_HEAD_SHA: ${{ github.event.pull_request.head.sha }} 101 | IMPACTED_TARGETS_FILE: ${{ steps.compute-impacted-targets.outputs.impacted_targets_out }} 102 | IMPACTS_ALL_DETECTED: ${{ steps.prerequisites.outputs.impacts_all_detected }} 103 | -------------------------------------------------------------------------------- /jest.config.js: -------------------------------------------------------------------------------- 1 | /** @type {import('ts-jest').JestConfigWithTsJest} */ 2 | module.exports = { 3 | preset: "ts-jest", 4 | testEnvironment: "node", 5 | }; 6 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "merge-action", 3 | "version": "1.0.0", 4 | "private": true, 5 | "description": "", 6 | "keywords": [], 7 | "license": "UNLICENSED", 8 | "author": "", 9 | "main": "index.js", 10 | "scripts": { 11 | "test": "jest tests/" 12 | }, 13 | "dependencies": { 14 | "@types/node": "20.4.2" 15 | }, 16 | "devDependencies": { 17 | "@jest/globals": "^29.7.0", 18 | "@types/express": "4.17.17", 19 | "@types/lodash": "4.14.195", 20 | "express": "4.18.2", 21 | "http-status-codes": "2.2.0", 22 | "jest": "29.6.1", 23 | "lodash": "4.17.21", 24 | "ts-jest": "29.1.1", 25 | "typescript": "5.1.6" 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: '6.0' 2 | 3 | settings: 4 | autoInstallPeers: true 5 | excludeLinksFromLockfile: false 6 | 7 | dependencies: 8 | '@types/node': 9 | specifier: 20.4.2 10 | version: 20.4.2 11 | 12 | devDependencies: 13 | '@jest/globals': 14 | specifier: ^29.7.0 15 | version: 29.7.0 16 | '@types/express': 17 | specifier: 4.17.17 18 | version: 4.17.17 19 | '@types/lodash': 20 | specifier: 4.14.195 21 | version: 4.14.195 22 | express: 23 | specifier: 4.18.2 24 | version: 4.18.2 25 | http-status-codes: 26 | specifier: 2.2.0 27 | version: 2.2.0 28 | jest: 29 | specifier: 29.6.1 30 | version: 29.6.1(@types/node@20.4.2) 31 | lodash: 32 | specifier: 4.17.21 33 | version: 4.17.21 34 | ts-jest: 35 | specifier: 29.1.1 36 | version: 29.1.1(@babel/core@7.22.9)(jest@29.6.1)(typescript@5.1.6) 37 | typescript: 38 | specifier: 5.1.6 39 | version: 5.1.6 40 | 41 | packages: 42 | 43 | /@ampproject/remapping@2.2.1: 44 | resolution: {integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==} 45 | engines: {node: '>=6.0.0'} 46 | dependencies: 47 | '@jridgewell/gen-mapping': 0.3.3 48 | '@jridgewell/trace-mapping': 0.3.18 49 | dev: true 50 | 51 | /@babel/code-frame@7.22.5: 52 | resolution: {integrity: sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ==} 53 | engines: {node: '>=6.9.0'} 54 | dependencies: 55 | '@babel/highlight': 7.22.5 56 | dev: true 57 | 58 | /@babel/compat-data@7.22.9: 59 | resolution: {integrity: sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ==} 60 | engines: {node: '>=6.9.0'} 61 | dev: true 62 | 63 | /@babel/core@7.22.9: 64 | resolution: {integrity: sha512-G2EgeufBcYw27U4hhoIwFcgc1XU7TlXJ3mv04oOv1WCuo900U/anZSPzEqNjwdjgffkk2Gs0AN0dW1CKVLcG7w==} 65 | engines: {node: '>=6.9.0'} 66 | dependencies: 67 | '@ampproject/remapping': 2.2.1 68 | '@babel/code-frame': 7.22.5 69 | '@babel/generator': 7.22.9 70 | '@babel/helper-compilation-targets': 7.22.9(@babel/core@7.22.9) 71 | '@babel/helper-module-transforms': 7.22.9(@babel/core@7.22.9) 72 | '@babel/helpers': 7.22.6 73 | '@babel/parser': 7.22.7 74 | '@babel/template': 7.22.5 75 | '@babel/traverse': 7.22.8 76 | '@babel/types': 7.22.5 77 | convert-source-map: 1.9.0 78 | debug: 4.3.4 79 | gensync: 1.0.0-beta.2 80 | json5: 2.2.3 81 | semver: 6.3.1 82 | transitivePeerDependencies: 83 | - supports-color 84 | dev: true 85 | 86 | /@babel/generator@7.22.9: 87 | resolution: {integrity: sha512-KtLMbmicyuK2Ak/FTCJVbDnkN1SlT8/kceFTiuDiiRUUSMnHMidxSCdG4ndkTOHHpoomWe/4xkvHkEOncwjYIw==} 88 | engines: {node: '>=6.9.0'} 89 | dependencies: 90 | '@babel/types': 7.22.5 91 | '@jridgewell/gen-mapping': 0.3.3 92 | '@jridgewell/trace-mapping': 0.3.18 93 | jsesc: 2.5.2 94 | dev: true 95 | 96 | /@babel/helper-compilation-targets@7.22.9(@babel/core@7.22.9): 97 | resolution: {integrity: sha512-7qYrNM6HjpnPHJbopxmb8hSPoZ0gsX8IvUS32JGVoy+pU9e5N0nLr1VjJoR6kA4d9dmGLxNYOjeB8sUDal2WMw==} 98 | engines: {node: '>=6.9.0'} 99 | peerDependencies: 100 | '@babel/core': ^7.0.0 101 | dependencies: 102 | '@babel/compat-data': 7.22.9 103 | '@babel/core': 7.22.9 104 | '@babel/helper-validator-option': 7.22.5 105 | browserslist: 4.21.9 106 | lru-cache: 5.1.1 107 | semver: 6.3.1 108 | dev: true 109 | 110 | /@babel/helper-environment-visitor@7.22.5: 111 | resolution: {integrity: sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==} 112 | engines: {node: '>=6.9.0'} 113 | dev: true 114 | 115 | /@babel/helper-function-name@7.22.5: 116 | resolution: {integrity: sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==} 117 | engines: {node: '>=6.9.0'} 118 | dependencies: 119 | '@babel/template': 7.22.5 120 | '@babel/types': 7.22.5 121 | dev: true 122 | 123 | /@babel/helper-hoist-variables@7.22.5: 124 | resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} 125 | engines: {node: '>=6.9.0'} 126 | dependencies: 127 | '@babel/types': 7.22.5 128 | dev: true 129 | 130 | /@babel/helper-module-imports@7.22.5: 131 | resolution: {integrity: sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==} 132 | engines: {node: '>=6.9.0'} 133 | dependencies: 134 | '@babel/types': 7.22.5 135 | dev: true 136 | 137 | /@babel/helper-module-transforms@7.22.9(@babel/core@7.22.9): 138 | resolution: {integrity: sha512-t+WA2Xn5K+rTeGtC8jCsdAH52bjggG5TKRuRrAGNM/mjIbO4GxvlLMFOEz9wXY5I2XQ60PMFsAG2WIcG82dQMQ==} 139 | engines: {node: '>=6.9.0'} 140 | peerDependencies: 141 | '@babel/core': ^7.0.0 142 | dependencies: 143 | '@babel/core': 7.22.9 144 | '@babel/helper-environment-visitor': 7.22.5 145 | '@babel/helper-module-imports': 7.22.5 146 | '@babel/helper-simple-access': 7.22.5 147 | '@babel/helper-split-export-declaration': 7.22.6 148 | '@babel/helper-validator-identifier': 7.22.5 149 | dev: true 150 | 151 | /@babel/helper-plugin-utils@7.22.5: 152 | resolution: {integrity: sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==} 153 | engines: {node: '>=6.9.0'} 154 | dev: true 155 | 156 | /@babel/helper-simple-access@7.22.5: 157 | resolution: {integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==} 158 | engines: {node: '>=6.9.0'} 159 | dependencies: 160 | '@babel/types': 7.22.5 161 | dev: true 162 | 163 | /@babel/helper-split-export-declaration@7.22.6: 164 | resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==} 165 | engines: {node: '>=6.9.0'} 166 | dependencies: 167 | '@babel/types': 7.22.5 168 | dev: true 169 | 170 | /@babel/helper-string-parser@7.22.5: 171 | resolution: {integrity: sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==} 172 | engines: {node: '>=6.9.0'} 173 | dev: true 174 | 175 | /@babel/helper-validator-identifier@7.22.5: 176 | resolution: {integrity: sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==} 177 | engines: {node: '>=6.9.0'} 178 | dev: true 179 | 180 | /@babel/helper-validator-option@7.22.5: 181 | resolution: {integrity: sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==} 182 | engines: {node: '>=6.9.0'} 183 | dev: true 184 | 185 | /@babel/helpers@7.22.6: 186 | resolution: {integrity: sha512-YjDs6y/fVOYFV8hAf1rxd1QvR9wJe1pDBZ2AREKq/SDayfPzgk0PBnVuTCE5X1acEpMMNOVUqoe+OwiZGJ+OaA==} 187 | engines: {node: '>=6.9.0'} 188 | dependencies: 189 | '@babel/template': 7.22.5 190 | '@babel/traverse': 7.22.8 191 | '@babel/types': 7.22.5 192 | transitivePeerDependencies: 193 | - supports-color 194 | dev: true 195 | 196 | /@babel/highlight@7.22.5: 197 | resolution: {integrity: sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw==} 198 | engines: {node: '>=6.9.0'} 199 | dependencies: 200 | '@babel/helper-validator-identifier': 7.22.5 201 | chalk: 2.4.2 202 | js-tokens: 4.0.0 203 | dev: true 204 | 205 | /@babel/parser@7.22.7: 206 | resolution: {integrity: sha512-7NF8pOkHP5o2vpmGgNGcfAeCvOYhGLyA3Z4eBQkT1RJlWu47n63bCs93QfJ2hIAFCil7L5P2IWhs1oToVgrL0Q==} 207 | engines: {node: '>=6.0.0'} 208 | hasBin: true 209 | dependencies: 210 | '@babel/types': 7.22.5 211 | dev: true 212 | 213 | /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.22.9): 214 | resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} 215 | peerDependencies: 216 | '@babel/core': ^7.0.0-0 217 | dependencies: 218 | '@babel/core': 7.22.9 219 | '@babel/helper-plugin-utils': 7.22.5 220 | dev: true 221 | 222 | /@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.22.9): 223 | resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==} 224 | peerDependencies: 225 | '@babel/core': ^7.0.0-0 226 | dependencies: 227 | '@babel/core': 7.22.9 228 | '@babel/helper-plugin-utils': 7.22.5 229 | dev: true 230 | 231 | /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.22.9): 232 | resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} 233 | peerDependencies: 234 | '@babel/core': ^7.0.0-0 235 | dependencies: 236 | '@babel/core': 7.22.9 237 | '@babel/helper-plugin-utils': 7.22.5 238 | dev: true 239 | 240 | /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.22.9): 241 | resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} 242 | peerDependencies: 243 | '@babel/core': ^7.0.0-0 244 | dependencies: 245 | '@babel/core': 7.22.9 246 | '@babel/helper-plugin-utils': 7.22.5 247 | dev: true 248 | 249 | /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.22.9): 250 | resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} 251 | peerDependencies: 252 | '@babel/core': ^7.0.0-0 253 | dependencies: 254 | '@babel/core': 7.22.9 255 | '@babel/helper-plugin-utils': 7.22.5 256 | dev: true 257 | 258 | /@babel/plugin-syntax-jsx@7.22.5(@babel/core@7.22.9): 259 | resolution: {integrity: sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg==} 260 | engines: {node: '>=6.9.0'} 261 | peerDependencies: 262 | '@babel/core': ^7.0.0-0 263 | dependencies: 264 | '@babel/core': 7.22.9 265 | '@babel/helper-plugin-utils': 7.22.5 266 | dev: true 267 | 268 | /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.22.9): 269 | resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} 270 | peerDependencies: 271 | '@babel/core': ^7.0.0-0 272 | dependencies: 273 | '@babel/core': 7.22.9 274 | '@babel/helper-plugin-utils': 7.22.5 275 | dev: true 276 | 277 | /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.22.9): 278 | resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} 279 | peerDependencies: 280 | '@babel/core': ^7.0.0-0 281 | dependencies: 282 | '@babel/core': 7.22.9 283 | '@babel/helper-plugin-utils': 7.22.5 284 | dev: true 285 | 286 | /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.22.9): 287 | resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} 288 | peerDependencies: 289 | '@babel/core': ^7.0.0-0 290 | dependencies: 291 | '@babel/core': 7.22.9 292 | '@babel/helper-plugin-utils': 7.22.5 293 | dev: true 294 | 295 | /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.22.9): 296 | resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} 297 | peerDependencies: 298 | '@babel/core': ^7.0.0-0 299 | dependencies: 300 | '@babel/core': 7.22.9 301 | '@babel/helper-plugin-utils': 7.22.5 302 | dev: true 303 | 304 | /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.22.9): 305 | resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} 306 | peerDependencies: 307 | '@babel/core': ^7.0.0-0 308 | dependencies: 309 | '@babel/core': 7.22.9 310 | '@babel/helper-plugin-utils': 7.22.5 311 | dev: true 312 | 313 | /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.22.9): 314 | resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} 315 | peerDependencies: 316 | '@babel/core': ^7.0.0-0 317 | dependencies: 318 | '@babel/core': 7.22.9 319 | '@babel/helper-plugin-utils': 7.22.5 320 | dev: true 321 | 322 | /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.22.9): 323 | resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} 324 | engines: {node: '>=6.9.0'} 325 | peerDependencies: 326 | '@babel/core': ^7.0.0-0 327 | dependencies: 328 | '@babel/core': 7.22.9 329 | '@babel/helper-plugin-utils': 7.22.5 330 | dev: true 331 | 332 | /@babel/plugin-syntax-typescript@7.22.5(@babel/core@7.22.9): 333 | resolution: {integrity: sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ==} 334 | engines: {node: '>=6.9.0'} 335 | peerDependencies: 336 | '@babel/core': ^7.0.0-0 337 | dependencies: 338 | '@babel/core': 7.22.9 339 | '@babel/helper-plugin-utils': 7.22.5 340 | dev: true 341 | 342 | /@babel/template@7.22.5: 343 | resolution: {integrity: sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==} 344 | engines: {node: '>=6.9.0'} 345 | dependencies: 346 | '@babel/code-frame': 7.22.5 347 | '@babel/parser': 7.22.7 348 | '@babel/types': 7.22.5 349 | dev: true 350 | 351 | /@babel/traverse@7.22.8: 352 | resolution: {integrity: sha512-y6LPR+wpM2I3qJrsheCTwhIinzkETbplIgPBbwvqPKc+uljeA5gP+3nP8irdYt1mjQaDnlIcG+dw8OjAco4GXw==} 353 | engines: {node: '>=6.9.0'} 354 | dependencies: 355 | '@babel/code-frame': 7.22.5 356 | '@babel/generator': 7.22.9 357 | '@babel/helper-environment-visitor': 7.22.5 358 | '@babel/helper-function-name': 7.22.5 359 | '@babel/helper-hoist-variables': 7.22.5 360 | '@babel/helper-split-export-declaration': 7.22.6 361 | '@babel/parser': 7.22.7 362 | '@babel/types': 7.22.5 363 | debug: 4.3.4 364 | globals: 11.12.0 365 | transitivePeerDependencies: 366 | - supports-color 367 | dev: true 368 | 369 | /@babel/types@7.22.5: 370 | resolution: {integrity: sha512-zo3MIHGOkPOfoRXitsgHLjEXmlDaD/5KU1Uzuc9GNiZPhSqVxVRtxuPaSBZDsYZ9qV88AjtMtWW7ww98loJ9KA==} 371 | engines: {node: '>=6.9.0'} 372 | dependencies: 373 | '@babel/helper-string-parser': 7.22.5 374 | '@babel/helper-validator-identifier': 7.22.5 375 | to-fast-properties: 2.0.0 376 | dev: true 377 | 378 | /@bcoe/v8-coverage@0.2.3: 379 | resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} 380 | dev: true 381 | 382 | /@istanbuljs/load-nyc-config@1.1.0: 383 | resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} 384 | engines: {node: '>=8'} 385 | dependencies: 386 | camelcase: 5.3.1 387 | find-up: 4.1.0 388 | get-package-type: 0.1.0 389 | js-yaml: 3.14.1 390 | resolve-from: 5.0.0 391 | dev: true 392 | 393 | /@istanbuljs/schema@0.1.3: 394 | resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} 395 | engines: {node: '>=8'} 396 | dev: true 397 | 398 | /@jest/console@29.6.1: 399 | resolution: {integrity: sha512-Aj772AYgwTSr5w8qnyoJ0eDYvN6bMsH3ORH1ivMotrInHLKdUz6BDlaEXHdM6kODaBIkNIyQGzsMvRdOv7VG7Q==} 400 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 401 | dependencies: 402 | '@jest/types': 29.6.1 403 | '@types/node': 20.4.2 404 | chalk: 4.1.2 405 | jest-message-util: 29.6.1 406 | jest-util: 29.6.1 407 | slash: 3.0.0 408 | dev: true 409 | 410 | /@jest/core@29.6.1: 411 | resolution: {integrity: sha512-CcowHypRSm5oYQ1obz1wfvkjZZ2qoQlrKKvlfPwh5jUXVU12TWr2qMeH8chLMuTFzHh5a1g2yaqlqDICbr+ukQ==} 412 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 413 | peerDependencies: 414 | node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 415 | peerDependenciesMeta: 416 | node-notifier: 417 | optional: true 418 | dependencies: 419 | '@jest/console': 29.6.1 420 | '@jest/reporters': 29.6.1 421 | '@jest/test-result': 29.6.1 422 | '@jest/transform': 29.6.1 423 | '@jest/types': 29.6.1 424 | '@types/node': 20.4.2 425 | ansi-escapes: 4.3.2 426 | chalk: 4.1.2 427 | ci-info: 3.8.0 428 | exit: 0.1.2 429 | graceful-fs: 4.2.11 430 | jest-changed-files: 29.5.0 431 | jest-config: 29.6.1(@types/node@20.4.2) 432 | jest-haste-map: 29.6.1 433 | jest-message-util: 29.6.1 434 | jest-regex-util: 29.4.3 435 | jest-resolve: 29.6.1 436 | jest-resolve-dependencies: 29.6.1 437 | jest-runner: 29.6.1 438 | jest-runtime: 29.6.1 439 | jest-snapshot: 29.6.1 440 | jest-util: 29.6.1 441 | jest-validate: 29.6.1 442 | jest-watcher: 29.6.1 443 | micromatch: 4.0.5 444 | pretty-format: 29.6.1 445 | slash: 3.0.0 446 | strip-ansi: 6.0.1 447 | transitivePeerDependencies: 448 | - supports-color 449 | - ts-node 450 | dev: true 451 | 452 | /@jest/environment@29.6.1: 453 | resolution: {integrity: sha512-RMMXx4ws+Gbvw3DfLSuo2cfQlK7IwGbpuEWXCqyYDcqYTI+9Ju3a5hDnXaxjNsa6uKh9PQF2v+qg+RLe63tz5A==} 454 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 455 | dependencies: 456 | '@jest/fake-timers': 29.6.1 457 | '@jest/types': 29.6.1 458 | '@types/node': 20.4.2 459 | jest-mock: 29.6.1 460 | dev: true 461 | 462 | /@jest/environment@29.7.0: 463 | resolution: {integrity: sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==} 464 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 465 | dependencies: 466 | '@jest/fake-timers': 29.7.0 467 | '@jest/types': 29.6.3 468 | '@types/node': 20.4.2 469 | jest-mock: 29.7.0 470 | dev: true 471 | 472 | /@jest/expect-utils@29.6.1: 473 | resolution: {integrity: sha512-o319vIf5pEMx0LmzSxxkYYxo4wrRLKHq9dP1yJU7FoPTB0LfAKSz8SWD6D/6U3v/O52t9cF5t+MeJiRsfk7zMw==} 474 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 475 | dependencies: 476 | jest-get-type: 29.4.3 477 | dev: true 478 | 479 | /@jest/expect-utils@29.7.0: 480 | resolution: {integrity: sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==} 481 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 482 | dependencies: 483 | jest-get-type: 29.6.3 484 | dev: true 485 | 486 | /@jest/expect@29.6.1: 487 | resolution: {integrity: sha512-N5xlPrAYaRNyFgVf2s9Uyyvr795jnB6rObuPx4QFvNJz8aAjpZUDfO4bh5G/xuplMID8PrnuF1+SfSyDxhsgYg==} 488 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 489 | dependencies: 490 | expect: 29.6.1 491 | jest-snapshot: 29.6.1 492 | transitivePeerDependencies: 493 | - supports-color 494 | dev: true 495 | 496 | /@jest/expect@29.7.0: 497 | resolution: {integrity: sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==} 498 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 499 | dependencies: 500 | expect: 29.7.0 501 | jest-snapshot: 29.7.0 502 | transitivePeerDependencies: 503 | - supports-color 504 | dev: true 505 | 506 | /@jest/fake-timers@29.6.1: 507 | resolution: {integrity: sha512-RdgHgbXyosCDMVYmj7lLpUwXA4c69vcNzhrt69dJJdf8azUrpRh3ckFCaTPNjsEeRi27Cig0oKDGxy5j7hOgHg==} 508 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 509 | dependencies: 510 | '@jest/types': 29.6.1 511 | '@sinonjs/fake-timers': 10.3.0 512 | '@types/node': 20.4.2 513 | jest-message-util: 29.6.1 514 | jest-mock: 29.6.1 515 | jest-util: 29.6.1 516 | dev: true 517 | 518 | /@jest/fake-timers@29.7.0: 519 | resolution: {integrity: sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==} 520 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 521 | dependencies: 522 | '@jest/types': 29.6.3 523 | '@sinonjs/fake-timers': 10.3.0 524 | '@types/node': 20.4.2 525 | jest-message-util: 29.7.0 526 | jest-mock: 29.7.0 527 | jest-util: 29.7.0 528 | dev: true 529 | 530 | /@jest/globals@29.7.0: 531 | resolution: {integrity: sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==} 532 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 533 | dependencies: 534 | '@jest/environment': 29.7.0 535 | '@jest/expect': 29.7.0 536 | '@jest/types': 29.6.3 537 | jest-mock: 29.7.0 538 | transitivePeerDependencies: 539 | - supports-color 540 | dev: true 541 | 542 | /@jest/reporters@29.6.1: 543 | resolution: {integrity: sha512-9zuaI9QKr9JnoZtFQlw4GREQbxgmNYXU6QuWtmuODvk5nvPUeBYapVR/VYMyi2WSx3jXTLJTJji8rN6+Cm4+FA==} 544 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 545 | peerDependencies: 546 | node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 547 | peerDependenciesMeta: 548 | node-notifier: 549 | optional: true 550 | dependencies: 551 | '@bcoe/v8-coverage': 0.2.3 552 | '@jest/console': 29.6.1 553 | '@jest/test-result': 29.6.1 554 | '@jest/transform': 29.6.1 555 | '@jest/types': 29.6.1 556 | '@jridgewell/trace-mapping': 0.3.18 557 | '@types/node': 20.4.2 558 | chalk: 4.1.2 559 | collect-v8-coverage: 1.0.2 560 | exit: 0.1.2 561 | glob: 7.2.0 562 | graceful-fs: 4.2.11 563 | istanbul-lib-coverage: 3.2.0 564 | istanbul-lib-instrument: 5.2.1 565 | istanbul-lib-report: 3.0.0 566 | istanbul-lib-source-maps: 4.0.1 567 | istanbul-reports: 3.1.5 568 | jest-message-util: 29.6.1 569 | jest-util: 29.6.1 570 | jest-worker: 29.6.1 571 | slash: 3.0.0 572 | string-length: 4.0.2 573 | strip-ansi: 6.0.1 574 | v8-to-istanbul: 9.1.0 575 | transitivePeerDependencies: 576 | - supports-color 577 | dev: true 578 | 579 | /@jest/schemas@29.6.0: 580 | resolution: {integrity: sha512-rxLjXyJBTL4LQeJW3aKo0M/+GkCOXsO+8i9Iu7eDb6KwtP65ayoDsitrdPBtujxQ88k4wI2FNYfa6TOGwSn6cQ==} 581 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 582 | dependencies: 583 | '@sinclair/typebox': 0.27.8 584 | dev: true 585 | 586 | /@jest/schemas@29.6.3: 587 | resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} 588 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 589 | dependencies: 590 | '@sinclair/typebox': 0.27.8 591 | dev: true 592 | 593 | /@jest/source-map@29.6.0: 594 | resolution: {integrity: sha512-oA+I2SHHQGxDCZpbrsCQSoMLb3Bz547JnM+jUr9qEbuw0vQlWZfpPS7CO9J7XiwKicEz9OFn/IYoLkkiUD7bzA==} 595 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 596 | dependencies: 597 | '@jridgewell/trace-mapping': 0.3.18 598 | callsites: 3.1.0 599 | graceful-fs: 4.2.11 600 | dev: true 601 | 602 | /@jest/test-result@29.6.1: 603 | resolution: {integrity: sha512-Ynr13ZRcpX6INak0TPUukU8GWRfm/vAytE3JbJNGAvINySWYdfE7dGZMbk36oVuK4CigpbhMn8eg1dixZ7ZJOw==} 604 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 605 | dependencies: 606 | '@jest/console': 29.6.1 607 | '@jest/types': 29.6.1 608 | '@types/istanbul-lib-coverage': 2.0.4 609 | collect-v8-coverage: 1.0.2 610 | dev: true 611 | 612 | /@jest/test-sequencer@29.6.1: 613 | resolution: {integrity: sha512-oBkC36PCDf/wb6dWeQIhaviU0l5u6VCsXa119yqdUosYAt7/FbQU2M2UoziO3igj/HBDEgp57ONQ3fm0v9uyyg==} 614 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 615 | dependencies: 616 | '@jest/test-result': 29.6.1 617 | graceful-fs: 4.2.11 618 | jest-haste-map: 29.6.1 619 | slash: 3.0.0 620 | dev: true 621 | 622 | /@jest/transform@29.6.1: 623 | resolution: {integrity: sha512-URnTneIU3ZjRSaf906cvf6Hpox3hIeJXRnz3VDSw5/X93gR8ycdfSIEy19FlVx8NFmpN7fe3Gb1xF+NjXaQLWg==} 624 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 625 | dependencies: 626 | '@babel/core': 7.22.9 627 | '@jest/types': 29.6.1 628 | '@jridgewell/trace-mapping': 0.3.18 629 | babel-plugin-istanbul: 6.1.1 630 | chalk: 4.1.2 631 | convert-source-map: 2.0.0 632 | fast-json-stable-stringify: 2.1.0 633 | graceful-fs: 4.2.11 634 | jest-haste-map: 29.6.1 635 | jest-regex-util: 29.4.3 636 | jest-util: 29.6.1 637 | micromatch: 4.0.5 638 | pirates: 4.0.6 639 | slash: 3.0.0 640 | write-file-atomic: 4.0.2 641 | transitivePeerDependencies: 642 | - supports-color 643 | dev: true 644 | 645 | /@jest/transform@29.7.0: 646 | resolution: {integrity: sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==} 647 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 648 | dependencies: 649 | '@babel/core': 7.22.9 650 | '@jest/types': 29.6.3 651 | '@jridgewell/trace-mapping': 0.3.18 652 | babel-plugin-istanbul: 6.1.1 653 | chalk: 4.1.2 654 | convert-source-map: 2.0.0 655 | fast-json-stable-stringify: 2.1.0 656 | graceful-fs: 4.2.11 657 | jest-haste-map: 29.7.0 658 | jest-regex-util: 29.6.3 659 | jest-util: 29.7.0 660 | micromatch: 4.0.5 661 | pirates: 4.0.6 662 | slash: 3.0.0 663 | write-file-atomic: 4.0.2 664 | transitivePeerDependencies: 665 | - supports-color 666 | dev: true 667 | 668 | /@jest/types@29.6.1: 669 | resolution: {integrity: sha512-tPKQNMPuXgvdOn2/Lg9HNfUvjYVGolt04Hp03f5hAk878uwOLikN+JzeLY0HcVgKgFl9Hs3EIqpu3WX27XNhnw==} 670 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 671 | dependencies: 672 | '@jest/schemas': 29.6.0 673 | '@types/istanbul-lib-coverage': 2.0.4 674 | '@types/istanbul-reports': 3.0.1 675 | '@types/node': 20.4.2 676 | '@types/yargs': 17.0.24 677 | chalk: 4.1.2 678 | dev: true 679 | 680 | /@jest/types@29.6.3: 681 | resolution: {integrity: sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==} 682 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 683 | dependencies: 684 | '@jest/schemas': 29.6.3 685 | '@types/istanbul-lib-coverage': 2.0.4 686 | '@types/istanbul-reports': 3.0.1 687 | '@types/node': 20.4.2 688 | '@types/yargs': 17.0.24 689 | chalk: 4.1.2 690 | dev: true 691 | 692 | /@jridgewell/gen-mapping@0.3.3: 693 | resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==} 694 | engines: {node: '>=6.0.0'} 695 | dependencies: 696 | '@jridgewell/set-array': 1.1.2 697 | '@jridgewell/sourcemap-codec': 1.4.15 698 | '@jridgewell/trace-mapping': 0.3.18 699 | dev: true 700 | 701 | /@jridgewell/resolve-uri@3.1.0: 702 | resolution: {integrity: sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==} 703 | engines: {node: '>=6.0.0'} 704 | dev: true 705 | 706 | /@jridgewell/set-array@1.1.2: 707 | resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} 708 | engines: {node: '>=6.0.0'} 709 | dev: true 710 | 711 | /@jridgewell/sourcemap-codec@1.4.14: 712 | resolution: {integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==} 713 | dev: true 714 | 715 | /@jridgewell/sourcemap-codec@1.4.15: 716 | resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} 717 | dev: true 718 | 719 | /@jridgewell/trace-mapping@0.3.18: 720 | resolution: {integrity: sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==} 721 | dependencies: 722 | '@jridgewell/resolve-uri': 3.1.0 723 | '@jridgewell/sourcemap-codec': 1.4.14 724 | dev: true 725 | 726 | /@sinclair/typebox@0.27.8: 727 | resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} 728 | dev: true 729 | 730 | /@sinonjs/commons@3.0.0: 731 | resolution: {integrity: sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA==} 732 | dependencies: 733 | type-detect: 4.0.8 734 | dev: true 735 | 736 | /@sinonjs/fake-timers@10.3.0: 737 | resolution: {integrity: sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==} 738 | dependencies: 739 | '@sinonjs/commons': 3.0.0 740 | dev: true 741 | 742 | /@types/babel__core@7.20.1: 743 | resolution: {integrity: sha512-aACu/U/omhdk15O4Nfb+fHgH/z3QsfQzpnvRZhYhThms83ZnAOZz7zZAWO7mn2yyNQaA4xTO8GLK3uqFU4bYYw==} 744 | dependencies: 745 | '@babel/parser': 7.22.7 746 | '@babel/types': 7.22.5 747 | '@types/babel__generator': 7.6.4 748 | '@types/babel__template': 7.4.1 749 | '@types/babel__traverse': 7.20.1 750 | dev: true 751 | 752 | /@types/babel__generator@7.6.4: 753 | resolution: {integrity: sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==} 754 | dependencies: 755 | '@babel/types': 7.22.5 756 | dev: true 757 | 758 | /@types/babel__template@7.4.1: 759 | resolution: {integrity: sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==} 760 | dependencies: 761 | '@babel/parser': 7.22.7 762 | '@babel/types': 7.22.5 763 | dev: true 764 | 765 | /@types/babel__traverse@7.20.1: 766 | resolution: {integrity: sha512-MitHFXnhtgwsGZWtT68URpOvLN4EREih1u3QtQiN4VdAxWKRVvGCSvw/Qth0M0Qq3pJpnGOu5JaM/ydK7OGbqg==} 767 | dependencies: 768 | '@babel/types': 7.22.5 769 | dev: true 770 | 771 | /@types/body-parser@1.19.2: 772 | resolution: {integrity: sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==} 773 | dependencies: 774 | '@types/connect': 3.4.35 775 | '@types/node': 20.4.2 776 | dev: true 777 | 778 | /@types/connect@3.4.35: 779 | resolution: {integrity: sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==} 780 | dependencies: 781 | '@types/node': 20.4.2 782 | dev: true 783 | 784 | /@types/express-serve-static-core@4.17.35: 785 | resolution: {integrity: sha512-wALWQwrgiB2AWTT91CB62b6Yt0sNHpznUXeZEcnPU3DRdlDIz74x8Qg1UUYKSVFi+va5vKOLYRBI1bRKiLLKIg==} 786 | dependencies: 787 | '@types/node': 20.4.2 788 | '@types/qs': 6.9.7 789 | '@types/range-parser': 1.2.4 790 | '@types/send': 0.17.1 791 | dev: true 792 | 793 | /@types/express@4.17.17: 794 | resolution: {integrity: sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q==} 795 | dependencies: 796 | '@types/body-parser': 1.19.2 797 | '@types/express-serve-static-core': 4.17.35 798 | '@types/qs': 6.9.7 799 | '@types/serve-static': 1.15.2 800 | dev: true 801 | 802 | /@types/graceful-fs@4.1.6: 803 | resolution: {integrity: sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw==} 804 | dependencies: 805 | '@types/node': 20.4.2 806 | dev: true 807 | 808 | /@types/http-errors@2.0.1: 809 | resolution: {integrity: sha512-/K3ds8TRAfBvi5vfjuz8y6+GiAYBZ0x4tXv1Av6CWBWn0IlADc+ZX9pMq7oU0fNQPnBwIZl3rmeLp6SBApbxSQ==} 810 | dev: true 811 | 812 | /@types/istanbul-lib-coverage@2.0.4: 813 | resolution: {integrity: sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==} 814 | dev: true 815 | 816 | /@types/istanbul-lib-report@3.0.0: 817 | resolution: {integrity: sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==} 818 | dependencies: 819 | '@types/istanbul-lib-coverage': 2.0.4 820 | dev: true 821 | 822 | /@types/istanbul-reports@3.0.1: 823 | resolution: {integrity: sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==} 824 | dependencies: 825 | '@types/istanbul-lib-report': 3.0.0 826 | dev: true 827 | 828 | /@types/lodash@4.14.195: 829 | resolution: {integrity: sha512-Hwx9EUgdwf2GLarOjQp5ZH8ZmblzcbTBC2wtQWNKARBSxM9ezRIAUpeDTgoQRAFB0+8CNWXVA9+MaSOzOF3nPg==} 830 | dev: true 831 | 832 | /@types/mime@1.3.2: 833 | resolution: {integrity: sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==} 834 | dev: true 835 | 836 | /@types/mime@3.0.1: 837 | resolution: {integrity: sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA==} 838 | dev: true 839 | 840 | /@types/node@20.4.2: 841 | resolution: {integrity: sha512-Dd0BYtWgnWJKwO1jkmTrzofjK2QXXcai0dmtzvIBhcA+RsG5h8R3xlyta0kGOZRNfL9GuRtb1knmPEhQrePCEw==} 842 | 843 | /@types/prettier@2.7.3: 844 | resolution: {integrity: sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==} 845 | dev: true 846 | 847 | /@types/qs@6.9.7: 848 | resolution: {integrity: sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==} 849 | dev: true 850 | 851 | /@types/range-parser@1.2.4: 852 | resolution: {integrity: sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==} 853 | dev: true 854 | 855 | /@types/send@0.17.1: 856 | resolution: {integrity: sha512-Cwo8LE/0rnvX7kIIa3QHCkcuF21c05Ayb0ZfxPiv0W8VRiZiNW/WuRupHKpqqGVGf7SUA44QSOUKaEd9lIrd/Q==} 857 | dependencies: 858 | '@types/mime': 1.3.2 859 | '@types/node': 20.4.2 860 | dev: true 861 | 862 | /@types/serve-static@1.15.2: 863 | resolution: {integrity: sha512-J2LqtvFYCzaj8pVYKw8klQXrLLk7TBZmQ4ShlcdkELFKGwGMfevMLneMMRkMgZxotOD9wg497LpC7O8PcvAmfw==} 864 | dependencies: 865 | '@types/http-errors': 2.0.1 866 | '@types/mime': 3.0.1 867 | '@types/node': 20.4.2 868 | dev: true 869 | 870 | /@types/stack-utils@2.0.1: 871 | resolution: {integrity: sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==} 872 | dev: true 873 | 874 | /@types/yargs-parser@21.0.0: 875 | resolution: {integrity: sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==} 876 | dev: true 877 | 878 | /@types/yargs@17.0.24: 879 | resolution: {integrity: sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw==} 880 | dependencies: 881 | '@types/yargs-parser': 21.0.0 882 | dev: true 883 | 884 | /accepts@1.3.8: 885 | resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} 886 | engines: {node: '>= 0.6'} 887 | dependencies: 888 | mime-types: 2.1.35 889 | negotiator: 0.6.3 890 | dev: true 891 | 892 | /ansi-escapes@4.3.2: 893 | resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} 894 | engines: {node: '>=8'} 895 | dependencies: 896 | type-fest: 0.21.3 897 | dev: true 898 | 899 | /ansi-regex@5.0.1: 900 | resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} 901 | engines: {node: '>=8'} 902 | dev: true 903 | 904 | /ansi-styles@3.2.1: 905 | resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} 906 | engines: {node: '>=4'} 907 | dependencies: 908 | color-convert: 1.9.3 909 | dev: true 910 | 911 | /ansi-styles@4.3.0: 912 | resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} 913 | engines: {node: '>=8'} 914 | dependencies: 915 | color-convert: 2.0.1 916 | dev: true 917 | 918 | /ansi-styles@5.2.0: 919 | resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} 920 | engines: {node: '>=10'} 921 | dev: true 922 | 923 | /anymatch@3.1.3: 924 | resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} 925 | engines: {node: '>= 8'} 926 | dependencies: 927 | normalize-path: 3.0.0 928 | picomatch: 2.3.1 929 | dev: true 930 | 931 | /argparse@1.0.10: 932 | resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} 933 | dependencies: 934 | sprintf-js: 1.0.3 935 | dev: true 936 | 937 | /array-flatten@1.1.1: 938 | resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} 939 | dev: true 940 | 941 | /babel-jest@29.6.1(@babel/core@7.22.9): 942 | resolution: {integrity: sha512-qu+3bdPEQC6KZSPz+4Fyjbga5OODNcp49j6GKzG1EKbkfyJBxEYGVUmVGpwCSeGouG52R4EgYMLb6p9YeEEQ4A==} 943 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 944 | peerDependencies: 945 | '@babel/core': ^7.8.0 946 | dependencies: 947 | '@babel/core': 7.22.9 948 | '@jest/transform': 29.6.1 949 | '@types/babel__core': 7.20.1 950 | babel-plugin-istanbul: 6.1.1 951 | babel-preset-jest: 29.5.0(@babel/core@7.22.9) 952 | chalk: 4.1.2 953 | graceful-fs: 4.2.11 954 | slash: 3.0.0 955 | transitivePeerDependencies: 956 | - supports-color 957 | dev: true 958 | 959 | /babel-plugin-istanbul@6.1.1: 960 | resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==} 961 | engines: {node: '>=8'} 962 | dependencies: 963 | '@babel/helper-plugin-utils': 7.22.5 964 | '@istanbuljs/load-nyc-config': 1.1.0 965 | '@istanbuljs/schema': 0.1.3 966 | istanbul-lib-instrument: 5.2.1 967 | test-exclude: 6.0.0 968 | transitivePeerDependencies: 969 | - supports-color 970 | dev: true 971 | 972 | /babel-plugin-jest-hoist@29.5.0: 973 | resolution: {integrity: sha512-zSuuuAlTMT4mzLj2nPnUm6fsE6270vdOfnpbJ+RmruU75UhLFvL0N2NgI7xpeS7NaB6hGqmd5pVpGTDYvi4Q3w==} 974 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 975 | dependencies: 976 | '@babel/template': 7.22.5 977 | '@babel/types': 7.22.5 978 | '@types/babel__core': 7.20.1 979 | '@types/babel__traverse': 7.20.1 980 | dev: true 981 | 982 | /babel-preset-current-node-syntax@1.0.1(@babel/core@7.22.9): 983 | resolution: {integrity: sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==} 984 | peerDependencies: 985 | '@babel/core': ^7.0.0 986 | dependencies: 987 | '@babel/core': 7.22.9 988 | '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.22.9) 989 | '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.22.9) 990 | '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.22.9) 991 | '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.22.9) 992 | '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.22.9) 993 | '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.22.9) 994 | '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.22.9) 995 | '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.22.9) 996 | '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.22.9) 997 | '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.22.9) 998 | '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.22.9) 999 | '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.22.9) 1000 | dev: true 1001 | 1002 | /babel-preset-jest@29.5.0(@babel/core@7.22.9): 1003 | resolution: {integrity: sha512-JOMloxOqdiBSxMAzjRaH023/vvcaSaec49zvg+2LmNsktC7ei39LTJGw02J+9uUtTZUq6xbLyJ4dxe9sSmIuAg==} 1004 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 1005 | peerDependencies: 1006 | '@babel/core': ^7.0.0 1007 | dependencies: 1008 | '@babel/core': 7.22.9 1009 | babel-plugin-jest-hoist: 29.5.0 1010 | babel-preset-current-node-syntax: 1.0.1(@babel/core@7.22.9) 1011 | dev: true 1012 | 1013 | /balanced-match@1.0.2: 1014 | resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} 1015 | dev: true 1016 | 1017 | /body-parser@1.20.1: 1018 | resolution: {integrity: sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==} 1019 | engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} 1020 | dependencies: 1021 | bytes: 3.1.2 1022 | content-type: 1.0.5 1023 | debug: 2.6.9 1024 | depd: 2.0.0 1025 | destroy: 1.2.0 1026 | http-errors: 2.0.0 1027 | iconv-lite: 0.4.24 1028 | on-finished: 2.4.1 1029 | qs: 6.11.0 1030 | raw-body: 2.5.1 1031 | type-is: 1.6.18 1032 | unpipe: 1.0.0 1033 | transitivePeerDependencies: 1034 | - supports-color 1035 | dev: true 1036 | 1037 | /brace-expansion@1.1.11: 1038 | resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} 1039 | dependencies: 1040 | balanced-match: 1.0.2 1041 | concat-map: 0.0.1 1042 | dev: true 1043 | 1044 | /braces@3.0.2: 1045 | resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} 1046 | engines: {node: '>=8'} 1047 | dependencies: 1048 | fill-range: 7.0.1 1049 | dev: true 1050 | 1051 | /browserslist@4.21.9: 1052 | resolution: {integrity: sha512-M0MFoZzbUrRU4KNfCrDLnvyE7gub+peetoTid3TBIqtunaDJyXlwhakT+/VkvSXcfIzFfK/nkCs4nmyTmxdNSg==} 1053 | engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} 1054 | hasBin: true 1055 | dependencies: 1056 | caniuse-lite: 1.0.30001515 1057 | electron-to-chromium: 1.4.461 1058 | node-releases: 2.0.13 1059 | update-browserslist-db: 1.0.11(browserslist@4.21.9) 1060 | dev: true 1061 | 1062 | /bs-logger@0.2.6: 1063 | resolution: {integrity: sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==} 1064 | engines: {node: '>= 6'} 1065 | dependencies: 1066 | fast-json-stable-stringify: 2.1.0 1067 | dev: true 1068 | 1069 | /bser@2.1.1: 1070 | resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} 1071 | dependencies: 1072 | node-int64: 0.4.0 1073 | dev: true 1074 | 1075 | /buffer-from@1.1.2: 1076 | resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} 1077 | dev: true 1078 | 1079 | /bytes@3.1.2: 1080 | resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} 1081 | engines: {node: '>= 0.8'} 1082 | dev: true 1083 | 1084 | /call-bind@1.0.2: 1085 | resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==} 1086 | dependencies: 1087 | function-bind: 1.1.1 1088 | get-intrinsic: 1.2.1 1089 | dev: true 1090 | 1091 | /callsites@3.1.0: 1092 | resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} 1093 | engines: {node: '>=6'} 1094 | dev: true 1095 | 1096 | /camelcase@5.3.1: 1097 | resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} 1098 | engines: {node: '>=6'} 1099 | dev: true 1100 | 1101 | /camelcase@6.3.0: 1102 | resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} 1103 | engines: {node: '>=10'} 1104 | dev: true 1105 | 1106 | /caniuse-lite@1.0.30001515: 1107 | resolution: {integrity: sha512-eEFDwUOZbE24sb+Ecsx3+OvNETqjWIdabMy52oOkIgcUtAsQifjUG9q4U9dgTHJM2mfk4uEPxc0+xuFdJ629QA==} 1108 | dev: true 1109 | 1110 | /chalk@2.4.2: 1111 | resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} 1112 | engines: {node: '>=4'} 1113 | dependencies: 1114 | ansi-styles: 3.2.1 1115 | escape-string-regexp: 1.0.5 1116 | supports-color: 5.5.0 1117 | dev: true 1118 | 1119 | /chalk@4.1.2: 1120 | resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} 1121 | engines: {node: '>=10'} 1122 | dependencies: 1123 | ansi-styles: 4.3.0 1124 | supports-color: 7.2.0 1125 | dev: true 1126 | 1127 | /char-regex@1.0.2: 1128 | resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} 1129 | engines: {node: '>=10'} 1130 | dev: true 1131 | 1132 | /ci-info@3.8.0: 1133 | resolution: {integrity: sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==} 1134 | engines: {node: '>=8'} 1135 | dev: true 1136 | 1137 | /cjs-module-lexer@1.2.3: 1138 | resolution: {integrity: sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==} 1139 | dev: true 1140 | 1141 | /cliui@8.0.1: 1142 | resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} 1143 | engines: {node: '>=12'} 1144 | dependencies: 1145 | string-width: 4.2.3 1146 | strip-ansi: 6.0.1 1147 | wrap-ansi: 7.0.0 1148 | dev: true 1149 | 1150 | /co@4.6.0: 1151 | resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} 1152 | engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} 1153 | dev: true 1154 | 1155 | /collect-v8-coverage@1.0.2: 1156 | resolution: {integrity: sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==} 1157 | dev: true 1158 | 1159 | /color-convert@1.9.3: 1160 | resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} 1161 | dependencies: 1162 | color-name: 1.1.3 1163 | dev: true 1164 | 1165 | /color-convert@2.0.1: 1166 | resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} 1167 | engines: {node: '>=7.0.0'} 1168 | dependencies: 1169 | color-name: 1.1.4 1170 | dev: true 1171 | 1172 | /color-name@1.1.3: 1173 | resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} 1174 | dev: true 1175 | 1176 | /color-name@1.1.4: 1177 | resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} 1178 | dev: true 1179 | 1180 | /concat-map@0.0.1: 1181 | resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} 1182 | dev: true 1183 | 1184 | /content-disposition@0.5.4: 1185 | resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} 1186 | engines: {node: '>= 0.6'} 1187 | dependencies: 1188 | safe-buffer: 5.2.1 1189 | dev: true 1190 | 1191 | /content-type@1.0.5: 1192 | resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} 1193 | engines: {node: '>= 0.6'} 1194 | dev: true 1195 | 1196 | /convert-source-map@1.9.0: 1197 | resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} 1198 | dev: true 1199 | 1200 | /convert-source-map@2.0.0: 1201 | resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} 1202 | dev: true 1203 | 1204 | /cookie-signature@1.0.6: 1205 | resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} 1206 | dev: true 1207 | 1208 | /cookie@0.5.0: 1209 | resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==} 1210 | engines: {node: '>= 0.6'} 1211 | dev: true 1212 | 1213 | /cross-spawn@7.0.3: 1214 | resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} 1215 | engines: {node: '>= 8'} 1216 | dependencies: 1217 | path-key: 3.1.1 1218 | shebang-command: 2.0.0 1219 | which: 2.0.2 1220 | dev: true 1221 | 1222 | /debug@2.6.9: 1223 | resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} 1224 | peerDependencies: 1225 | supports-color: '*' 1226 | peerDependenciesMeta: 1227 | supports-color: 1228 | optional: true 1229 | dependencies: 1230 | ms: 2.0.0 1231 | dev: true 1232 | 1233 | /debug@4.3.4: 1234 | resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} 1235 | engines: {node: '>=6.0'} 1236 | peerDependencies: 1237 | supports-color: '*' 1238 | peerDependenciesMeta: 1239 | supports-color: 1240 | optional: true 1241 | dependencies: 1242 | ms: 2.1.2 1243 | dev: true 1244 | 1245 | /dedent@0.7.0: 1246 | resolution: {integrity: sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==} 1247 | dev: true 1248 | 1249 | /deepmerge@4.3.1: 1250 | resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} 1251 | engines: {node: '>=0.10.0'} 1252 | dev: true 1253 | 1254 | /depd@2.0.0: 1255 | resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} 1256 | engines: {node: '>= 0.8'} 1257 | dev: true 1258 | 1259 | /destroy@1.2.0: 1260 | resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} 1261 | engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} 1262 | dev: true 1263 | 1264 | /detect-newline@3.1.0: 1265 | resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} 1266 | engines: {node: '>=8'} 1267 | dev: true 1268 | 1269 | /diff-sequences@29.4.3: 1270 | resolution: {integrity: sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA==} 1271 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 1272 | dev: true 1273 | 1274 | /diff-sequences@29.6.3: 1275 | resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} 1276 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 1277 | dev: true 1278 | 1279 | /ee-first@1.1.1: 1280 | resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} 1281 | dev: true 1282 | 1283 | /electron-to-chromium@1.4.461: 1284 | resolution: {integrity: sha512-1JkvV2sgEGTDXjdsaQCeSwYYuhLRphRpc+g6EHTFELJXEiznLt3/0pZ9JuAOQ5p2rI3YxKTbivtvajirIfhrEQ==} 1285 | dev: true 1286 | 1287 | /emittery@0.13.1: 1288 | resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==} 1289 | engines: {node: '>=12'} 1290 | dev: true 1291 | 1292 | /emoji-regex@8.0.0: 1293 | resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} 1294 | dev: true 1295 | 1296 | /encodeurl@1.0.2: 1297 | resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} 1298 | engines: {node: '>= 0.8'} 1299 | dev: true 1300 | 1301 | /error-ex@1.3.2: 1302 | resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} 1303 | dependencies: 1304 | is-arrayish: 0.2.1 1305 | dev: true 1306 | 1307 | /escalade@3.1.1: 1308 | resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} 1309 | engines: {node: '>=6'} 1310 | dev: true 1311 | 1312 | /escape-html@1.0.3: 1313 | resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} 1314 | dev: true 1315 | 1316 | /escape-string-regexp@1.0.5: 1317 | resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} 1318 | engines: {node: '>=0.8.0'} 1319 | dev: true 1320 | 1321 | /escape-string-regexp@2.0.0: 1322 | resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==} 1323 | engines: {node: '>=8'} 1324 | dev: true 1325 | 1326 | /esprima@4.0.1: 1327 | resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} 1328 | engines: {node: '>=4'} 1329 | hasBin: true 1330 | dev: true 1331 | 1332 | /etag@1.8.1: 1333 | resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} 1334 | engines: {node: '>= 0.6'} 1335 | dev: true 1336 | 1337 | /execa@5.1.1: 1338 | resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} 1339 | engines: {node: '>=10'} 1340 | dependencies: 1341 | cross-spawn: 7.0.3 1342 | get-stream: 6.0.1 1343 | human-signals: 2.1.0 1344 | is-stream: 2.0.1 1345 | merge-stream: 2.0.0 1346 | npm-run-path: 4.0.1 1347 | onetime: 5.1.2 1348 | signal-exit: 3.0.7 1349 | strip-final-newline: 2.0.0 1350 | dev: true 1351 | 1352 | /exit@0.1.2: 1353 | resolution: {integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==} 1354 | engines: {node: '>= 0.8.0'} 1355 | dev: true 1356 | 1357 | /expect@29.6.1: 1358 | resolution: {integrity: sha512-XEdDLonERCU1n9uR56/Stx9OqojaLAQtZf9PrCHH9Hl8YXiEIka3H4NXJ3NOIBmQJTg7+j7buh34PMHfJujc8g==} 1359 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 1360 | dependencies: 1361 | '@jest/expect-utils': 29.6.1 1362 | '@types/node': 20.4.2 1363 | jest-get-type: 29.4.3 1364 | jest-matcher-utils: 29.6.1 1365 | jest-message-util: 29.6.1 1366 | jest-util: 29.6.1 1367 | dev: true 1368 | 1369 | /expect@29.7.0: 1370 | resolution: {integrity: sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==} 1371 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 1372 | dependencies: 1373 | '@jest/expect-utils': 29.7.0 1374 | jest-get-type: 29.6.3 1375 | jest-matcher-utils: 29.7.0 1376 | jest-message-util: 29.7.0 1377 | jest-util: 29.7.0 1378 | dev: true 1379 | 1380 | /express@4.18.2: 1381 | resolution: {integrity: sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==} 1382 | engines: {node: '>= 0.10.0'} 1383 | dependencies: 1384 | accepts: 1.3.8 1385 | array-flatten: 1.1.1 1386 | body-parser: 1.20.1 1387 | content-disposition: 0.5.4 1388 | content-type: 1.0.5 1389 | cookie: 0.5.0 1390 | cookie-signature: 1.0.6 1391 | debug: 2.6.9 1392 | depd: 2.0.0 1393 | encodeurl: 1.0.2 1394 | escape-html: 1.0.3 1395 | etag: 1.8.1 1396 | finalhandler: 1.2.0 1397 | fresh: 0.5.2 1398 | http-errors: 2.0.0 1399 | merge-descriptors: 1.0.1 1400 | methods: 1.1.2 1401 | on-finished: 2.4.1 1402 | parseurl: 1.3.3 1403 | path-to-regexp: 0.1.7 1404 | proxy-addr: 2.0.7 1405 | qs: 6.11.0 1406 | range-parser: 1.2.1 1407 | safe-buffer: 5.2.1 1408 | send: 0.18.0 1409 | serve-static: 1.15.0 1410 | setprototypeof: 1.2.0 1411 | statuses: 2.0.1 1412 | type-is: 1.6.18 1413 | utils-merge: 1.0.1 1414 | vary: 1.1.2 1415 | transitivePeerDependencies: 1416 | - supports-color 1417 | dev: true 1418 | 1419 | /fast-json-stable-stringify@2.1.0: 1420 | resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} 1421 | dev: true 1422 | 1423 | /fb-watchman@2.0.2: 1424 | resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} 1425 | dependencies: 1426 | bser: 2.1.1 1427 | dev: true 1428 | 1429 | /fill-range@7.0.1: 1430 | resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} 1431 | engines: {node: '>=8'} 1432 | dependencies: 1433 | to-regex-range: 5.0.1 1434 | dev: true 1435 | 1436 | /finalhandler@1.2.0: 1437 | resolution: {integrity: sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==} 1438 | engines: {node: '>= 0.8'} 1439 | dependencies: 1440 | debug: 2.6.9 1441 | encodeurl: 1.0.2 1442 | escape-html: 1.0.3 1443 | on-finished: 2.4.1 1444 | parseurl: 1.3.3 1445 | statuses: 2.0.1 1446 | unpipe: 1.0.0 1447 | transitivePeerDependencies: 1448 | - supports-color 1449 | dev: true 1450 | 1451 | /find-up@4.1.0: 1452 | resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} 1453 | engines: {node: '>=8'} 1454 | dependencies: 1455 | locate-path: 5.0.0 1456 | path-exists: 4.0.0 1457 | dev: true 1458 | 1459 | /forwarded@0.2.0: 1460 | resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} 1461 | engines: {node: '>= 0.6'} 1462 | dev: true 1463 | 1464 | /fresh@0.5.2: 1465 | resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} 1466 | engines: {node: '>= 0.6'} 1467 | dev: true 1468 | 1469 | /fs.realpath@1.0.0: 1470 | resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} 1471 | dev: true 1472 | 1473 | /fsevents@2.3.2: 1474 | resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} 1475 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 1476 | os: [darwin] 1477 | requiresBuild: true 1478 | dev: true 1479 | optional: true 1480 | 1481 | /function-bind@1.1.1: 1482 | resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} 1483 | dev: true 1484 | 1485 | /gensync@1.0.0-beta.2: 1486 | resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} 1487 | engines: {node: '>=6.9.0'} 1488 | dev: true 1489 | 1490 | /get-caller-file@2.0.5: 1491 | resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} 1492 | engines: {node: 6.* || 8.* || >= 10.*} 1493 | dev: true 1494 | 1495 | /get-intrinsic@1.2.1: 1496 | resolution: {integrity: sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==} 1497 | dependencies: 1498 | function-bind: 1.1.1 1499 | has: 1.0.3 1500 | has-proto: 1.0.1 1501 | has-symbols: 1.0.3 1502 | dev: true 1503 | 1504 | /get-package-type@0.1.0: 1505 | resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} 1506 | engines: {node: '>=8.0.0'} 1507 | dev: true 1508 | 1509 | /get-stream@6.0.1: 1510 | resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} 1511 | engines: {node: '>=10'} 1512 | dev: true 1513 | 1514 | /glob@7.2.0: 1515 | resolution: {integrity: sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==} 1516 | dependencies: 1517 | fs.realpath: 1.0.0 1518 | inflight: 1.0.6 1519 | inherits: 2.0.4 1520 | minimatch: 3.1.2 1521 | once: 1.4.0 1522 | path-is-absolute: 1.0.1 1523 | dev: true 1524 | 1525 | /globals@11.12.0: 1526 | resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} 1527 | engines: {node: '>=4'} 1528 | dev: true 1529 | 1530 | /graceful-fs@4.2.11: 1531 | resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} 1532 | dev: true 1533 | 1534 | /has-flag@3.0.0: 1535 | resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} 1536 | engines: {node: '>=4'} 1537 | dev: true 1538 | 1539 | /has-flag@4.0.0: 1540 | resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} 1541 | engines: {node: '>=8'} 1542 | dev: true 1543 | 1544 | /has-proto@1.0.1: 1545 | resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==} 1546 | engines: {node: '>= 0.4'} 1547 | dev: true 1548 | 1549 | /has-symbols@1.0.3: 1550 | resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} 1551 | engines: {node: '>= 0.4'} 1552 | dev: true 1553 | 1554 | /has@1.0.3: 1555 | resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} 1556 | engines: {node: '>= 0.4.0'} 1557 | dependencies: 1558 | function-bind: 1.1.1 1559 | dev: true 1560 | 1561 | /html-escaper@2.0.2: 1562 | resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} 1563 | dev: true 1564 | 1565 | /http-errors@2.0.0: 1566 | resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} 1567 | engines: {node: '>= 0.8'} 1568 | dependencies: 1569 | depd: 2.0.0 1570 | inherits: 2.0.4 1571 | setprototypeof: 1.2.0 1572 | statuses: 2.0.1 1573 | toidentifier: 1.0.1 1574 | dev: true 1575 | 1576 | /http-status-codes@2.2.0: 1577 | resolution: {integrity: sha512-feERVo9iWxvnejp3SEfm/+oNG517npqL2/PIA8ORjyOZjGC7TwCRQsZylciLS64i6pJ0wRYz3rkXLRwbtFa8Ng==} 1578 | dev: true 1579 | 1580 | /human-signals@2.1.0: 1581 | resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} 1582 | engines: {node: '>=10.17.0'} 1583 | dev: true 1584 | 1585 | /iconv-lite@0.4.24: 1586 | resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} 1587 | engines: {node: '>=0.10.0'} 1588 | dependencies: 1589 | safer-buffer: 2.1.2 1590 | dev: true 1591 | 1592 | /import-local@3.1.0: 1593 | resolution: {integrity: sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==} 1594 | engines: {node: '>=8'} 1595 | hasBin: true 1596 | dependencies: 1597 | pkg-dir: 4.2.0 1598 | resolve-cwd: 3.0.0 1599 | dev: true 1600 | 1601 | /imurmurhash@0.1.4: 1602 | resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} 1603 | engines: {node: '>=0.8.19'} 1604 | dev: true 1605 | 1606 | /inflight@1.0.6: 1607 | resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} 1608 | dependencies: 1609 | once: 1.4.0 1610 | wrappy: 1.0.2 1611 | dev: true 1612 | 1613 | /inherits@2.0.4: 1614 | resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} 1615 | dev: true 1616 | 1617 | /ipaddr.js@1.9.1: 1618 | resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} 1619 | engines: {node: '>= 0.10'} 1620 | dev: true 1621 | 1622 | /is-arrayish@0.2.1: 1623 | resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} 1624 | dev: true 1625 | 1626 | /is-core-module@2.12.1: 1627 | resolution: {integrity: sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==} 1628 | dependencies: 1629 | has: 1.0.3 1630 | dev: true 1631 | 1632 | /is-fullwidth-code-point@3.0.0: 1633 | resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} 1634 | engines: {node: '>=8'} 1635 | dev: true 1636 | 1637 | /is-generator-fn@2.1.0: 1638 | resolution: {integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==} 1639 | engines: {node: '>=6'} 1640 | dev: true 1641 | 1642 | /is-number@7.0.0: 1643 | resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} 1644 | engines: {node: '>=0.12.0'} 1645 | dev: true 1646 | 1647 | /is-stream@2.0.1: 1648 | resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} 1649 | engines: {node: '>=8'} 1650 | dev: true 1651 | 1652 | /isexe@2.0.0: 1653 | resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} 1654 | dev: true 1655 | 1656 | /istanbul-lib-coverage@3.2.0: 1657 | resolution: {integrity: sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==} 1658 | engines: {node: '>=8'} 1659 | dev: true 1660 | 1661 | /istanbul-lib-instrument@5.2.1: 1662 | resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==} 1663 | engines: {node: '>=8'} 1664 | dependencies: 1665 | '@babel/core': 7.22.9 1666 | '@babel/parser': 7.22.7 1667 | '@istanbuljs/schema': 0.1.3 1668 | istanbul-lib-coverage: 3.2.0 1669 | semver: 6.3.1 1670 | transitivePeerDependencies: 1671 | - supports-color 1672 | dev: true 1673 | 1674 | /istanbul-lib-report@3.0.0: 1675 | resolution: {integrity: sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==} 1676 | engines: {node: '>=8'} 1677 | dependencies: 1678 | istanbul-lib-coverage: 3.2.0 1679 | make-dir: 3.1.0 1680 | supports-color: 7.2.0 1681 | dev: true 1682 | 1683 | /istanbul-lib-source-maps@4.0.1: 1684 | resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==} 1685 | engines: {node: '>=10'} 1686 | dependencies: 1687 | debug: 4.3.4 1688 | istanbul-lib-coverage: 3.2.0 1689 | source-map: 0.6.1 1690 | transitivePeerDependencies: 1691 | - supports-color 1692 | dev: true 1693 | 1694 | /istanbul-reports@3.1.5: 1695 | resolution: {integrity: sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==} 1696 | engines: {node: '>=8'} 1697 | dependencies: 1698 | html-escaper: 2.0.2 1699 | istanbul-lib-report: 3.0.0 1700 | dev: true 1701 | 1702 | /jest-changed-files@29.5.0: 1703 | resolution: {integrity: sha512-IFG34IUMUaNBIxjQXF/iu7g6EcdMrGRRxaUSw92I/2g2YC6vCdTltl4nHvt7Ci5nSJwXIkCu8Ka1DKF+X7Z1Ag==} 1704 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 1705 | dependencies: 1706 | execa: 5.1.1 1707 | p-limit: 3.1.0 1708 | dev: true 1709 | 1710 | /jest-circus@29.6.1: 1711 | resolution: {integrity: sha512-tPbYLEiBU4MYAL2XoZme/bgfUeotpDBd81lgHLCbDZZFaGmECk0b+/xejPFtmiBP87GgP/y4jplcRpbH+fgCzQ==} 1712 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 1713 | dependencies: 1714 | '@jest/environment': 29.6.1 1715 | '@jest/expect': 29.6.1 1716 | '@jest/test-result': 29.6.1 1717 | '@jest/types': 29.6.1 1718 | '@types/node': 20.4.2 1719 | chalk: 4.1.2 1720 | co: 4.6.0 1721 | dedent: 0.7.0 1722 | is-generator-fn: 2.1.0 1723 | jest-each: 29.6.1 1724 | jest-matcher-utils: 29.6.1 1725 | jest-message-util: 29.6.1 1726 | jest-runtime: 29.6.1 1727 | jest-snapshot: 29.6.1 1728 | jest-util: 29.6.1 1729 | p-limit: 3.1.0 1730 | pretty-format: 29.6.1 1731 | pure-rand: 6.0.2 1732 | slash: 3.0.0 1733 | stack-utils: 2.0.6 1734 | transitivePeerDependencies: 1735 | - supports-color 1736 | dev: true 1737 | 1738 | /jest-cli@29.6.1(@types/node@20.4.2): 1739 | resolution: {integrity: sha512-607dSgTA4ODIN6go9w6xY3EYkyPFGicx51a69H7yfvt7lN53xNswEVLovq+E77VsTRi5fWprLH0yl4DJgE8Ing==} 1740 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 1741 | hasBin: true 1742 | peerDependencies: 1743 | node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 1744 | peerDependenciesMeta: 1745 | node-notifier: 1746 | optional: true 1747 | dependencies: 1748 | '@jest/core': 29.6.1 1749 | '@jest/test-result': 29.6.1 1750 | '@jest/types': 29.6.1 1751 | chalk: 4.1.2 1752 | exit: 0.1.2 1753 | graceful-fs: 4.2.11 1754 | import-local: 3.1.0 1755 | jest-config: 29.6.1(@types/node@20.4.2) 1756 | jest-util: 29.6.1 1757 | jest-validate: 29.6.1 1758 | prompts: 2.4.2 1759 | yargs: 17.7.2 1760 | transitivePeerDependencies: 1761 | - '@types/node' 1762 | - supports-color 1763 | - ts-node 1764 | dev: true 1765 | 1766 | /jest-config@29.6.1(@types/node@20.4.2): 1767 | resolution: {integrity: sha512-XdjYV2fy2xYixUiV2Wc54t3Z4oxYPAELUzWnV6+mcbq0rh742X2p52pii5A3oeRzYjLnQxCsZmp0qpI6klE2cQ==} 1768 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 1769 | peerDependencies: 1770 | '@types/node': '*' 1771 | ts-node: '>=9.0.0' 1772 | peerDependenciesMeta: 1773 | '@types/node': 1774 | optional: true 1775 | ts-node: 1776 | optional: true 1777 | dependencies: 1778 | '@babel/core': 7.22.9 1779 | '@jest/test-sequencer': 29.6.1 1780 | '@jest/types': 29.6.1 1781 | '@types/node': 20.4.2 1782 | babel-jest: 29.6.1(@babel/core@7.22.9) 1783 | chalk: 4.1.2 1784 | ci-info: 3.8.0 1785 | deepmerge: 4.3.1 1786 | glob: 7.2.0 1787 | graceful-fs: 4.2.11 1788 | jest-circus: 29.6.1 1789 | jest-environment-node: 29.6.1 1790 | jest-get-type: 29.4.3 1791 | jest-regex-util: 29.4.3 1792 | jest-resolve: 29.6.1 1793 | jest-runner: 29.6.1 1794 | jest-util: 29.6.1 1795 | jest-validate: 29.6.1 1796 | micromatch: 4.0.5 1797 | parse-json: 5.2.0 1798 | pretty-format: 29.6.1 1799 | slash: 3.0.0 1800 | strip-json-comments: 3.1.1 1801 | transitivePeerDependencies: 1802 | - supports-color 1803 | dev: true 1804 | 1805 | /jest-diff@29.6.1: 1806 | resolution: {integrity: sha512-FsNCvinvl8oVxpNLttNQX7FAq7vR+gMDGj90tiP7siWw1UdakWUGqrylpsYrpvj908IYckm5Y0Q7azNAozU1Kg==} 1807 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 1808 | dependencies: 1809 | chalk: 4.1.2 1810 | diff-sequences: 29.4.3 1811 | jest-get-type: 29.4.3 1812 | pretty-format: 29.6.1 1813 | dev: true 1814 | 1815 | /jest-diff@29.7.0: 1816 | resolution: {integrity: sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==} 1817 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 1818 | dependencies: 1819 | chalk: 4.1.2 1820 | diff-sequences: 29.6.3 1821 | jest-get-type: 29.6.3 1822 | pretty-format: 29.7.0 1823 | dev: true 1824 | 1825 | /jest-docblock@29.4.3: 1826 | resolution: {integrity: sha512-fzdTftThczeSD9nZ3fzA/4KkHtnmllawWrXO69vtI+L9WjEIuXWs4AmyME7lN5hU7dB0sHhuPfcKofRsUb/2Fg==} 1827 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 1828 | dependencies: 1829 | detect-newline: 3.1.0 1830 | dev: true 1831 | 1832 | /jest-each@29.6.1: 1833 | resolution: {integrity: sha512-n5eoj5eiTHpKQCAVcNTT7DRqeUmJ01hsAL0Q1SMiBHcBcvTKDELixQOGMCpqhbIuTcfC4kMfSnpmDqRgRJcLNQ==} 1834 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 1835 | dependencies: 1836 | '@jest/types': 29.6.1 1837 | chalk: 4.1.2 1838 | jest-get-type: 29.4.3 1839 | jest-util: 29.6.1 1840 | pretty-format: 29.6.1 1841 | dev: true 1842 | 1843 | /jest-environment-node@29.6.1: 1844 | resolution: {integrity: sha512-ZNIfAiE+foBog24W+2caIldl4Irh8Lx1PUhg/GZ0odM1d/h2qORAsejiFc7zb+SEmYPn1yDZzEDSU5PmDkmVLQ==} 1845 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 1846 | dependencies: 1847 | '@jest/environment': 29.6.1 1848 | '@jest/fake-timers': 29.6.1 1849 | '@jest/types': 29.6.1 1850 | '@types/node': 20.4.2 1851 | jest-mock: 29.6.1 1852 | jest-util: 29.6.1 1853 | dev: true 1854 | 1855 | /jest-get-type@29.4.3: 1856 | resolution: {integrity: sha512-J5Xez4nRRMjk8emnTpWrlkyb9pfRQQanDrvWHhsR1+VUfbwxi30eVcZFlcdGInRibU4G5LwHXpI7IRHU0CY+gg==} 1857 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 1858 | dev: true 1859 | 1860 | /jest-get-type@29.6.3: 1861 | resolution: {integrity: sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==} 1862 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 1863 | dev: true 1864 | 1865 | /jest-haste-map@29.6.1: 1866 | resolution: {integrity: sha512-0m7f9PZXxOCk1gRACiVgX85knUKPKLPg4oRCjLoqIm9brTHXaorMA0JpmtmVkQiT8nmXyIVoZd/nnH1cfC33ig==} 1867 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 1868 | dependencies: 1869 | '@jest/types': 29.6.1 1870 | '@types/graceful-fs': 4.1.6 1871 | '@types/node': 20.4.2 1872 | anymatch: 3.1.3 1873 | fb-watchman: 2.0.2 1874 | graceful-fs: 4.2.11 1875 | jest-regex-util: 29.4.3 1876 | jest-util: 29.6.1 1877 | jest-worker: 29.6.1 1878 | micromatch: 4.0.5 1879 | walker: 1.0.8 1880 | optionalDependencies: 1881 | fsevents: 2.3.2 1882 | dev: true 1883 | 1884 | /jest-haste-map@29.7.0: 1885 | resolution: {integrity: sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==} 1886 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 1887 | dependencies: 1888 | '@jest/types': 29.6.3 1889 | '@types/graceful-fs': 4.1.6 1890 | '@types/node': 20.4.2 1891 | anymatch: 3.1.3 1892 | fb-watchman: 2.0.2 1893 | graceful-fs: 4.2.11 1894 | jest-regex-util: 29.6.3 1895 | jest-util: 29.7.0 1896 | jest-worker: 29.7.0 1897 | micromatch: 4.0.5 1898 | walker: 1.0.8 1899 | optionalDependencies: 1900 | fsevents: 2.3.2 1901 | dev: true 1902 | 1903 | /jest-leak-detector@29.6.1: 1904 | resolution: {integrity: sha512-OrxMNyZirpOEwkF3UHnIkAiZbtkBWiye+hhBweCHkVbCgyEy71Mwbb5zgeTNYWJBi1qgDVfPC1IwO9dVEeTLwQ==} 1905 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 1906 | dependencies: 1907 | jest-get-type: 29.4.3 1908 | pretty-format: 29.6.1 1909 | dev: true 1910 | 1911 | /jest-matcher-utils@29.6.1: 1912 | resolution: {integrity: sha512-SLaztw9d2mfQQKHmJXKM0HCbl2PPVld/t9Xa6P9sgiExijviSp7TnZZpw2Fpt+OI3nwUO/slJbOfzfUMKKC5QA==} 1913 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 1914 | dependencies: 1915 | chalk: 4.1.2 1916 | jest-diff: 29.6.1 1917 | jest-get-type: 29.4.3 1918 | pretty-format: 29.6.1 1919 | dev: true 1920 | 1921 | /jest-matcher-utils@29.7.0: 1922 | resolution: {integrity: sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==} 1923 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 1924 | dependencies: 1925 | chalk: 4.1.2 1926 | jest-diff: 29.7.0 1927 | jest-get-type: 29.6.3 1928 | pretty-format: 29.7.0 1929 | dev: true 1930 | 1931 | /jest-message-util@29.6.1: 1932 | resolution: {integrity: sha512-KoAW2zAmNSd3Gk88uJ56qXUWbFk787QKmjjJVOjtGFmmGSZgDBrlIL4AfQw1xyMYPNVD7dNInfIbur9B2rd/wQ==} 1933 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 1934 | dependencies: 1935 | '@babel/code-frame': 7.22.5 1936 | '@jest/types': 29.6.1 1937 | '@types/stack-utils': 2.0.1 1938 | chalk: 4.1.2 1939 | graceful-fs: 4.2.11 1940 | micromatch: 4.0.5 1941 | pretty-format: 29.6.1 1942 | slash: 3.0.0 1943 | stack-utils: 2.0.6 1944 | dev: true 1945 | 1946 | /jest-message-util@29.7.0: 1947 | resolution: {integrity: sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==} 1948 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 1949 | dependencies: 1950 | '@babel/code-frame': 7.22.5 1951 | '@jest/types': 29.6.3 1952 | '@types/stack-utils': 2.0.1 1953 | chalk: 4.1.2 1954 | graceful-fs: 4.2.11 1955 | micromatch: 4.0.5 1956 | pretty-format: 29.7.0 1957 | slash: 3.0.0 1958 | stack-utils: 2.0.6 1959 | dev: true 1960 | 1961 | /jest-mock@29.6.1: 1962 | resolution: {integrity: sha512-brovyV9HBkjXAEdRooaTQK42n8usKoSRR3gihzUpYeV/vwqgSoNfrksO7UfSACnPmxasO/8TmHM3w9Hp3G1dgw==} 1963 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 1964 | dependencies: 1965 | '@jest/types': 29.6.1 1966 | '@types/node': 20.4.2 1967 | jest-util: 29.6.1 1968 | dev: true 1969 | 1970 | /jest-mock@29.7.0: 1971 | resolution: {integrity: sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==} 1972 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 1973 | dependencies: 1974 | '@jest/types': 29.6.3 1975 | '@types/node': 20.4.2 1976 | jest-util: 29.7.0 1977 | dev: true 1978 | 1979 | /jest-pnp-resolver@1.2.3(jest-resolve@29.6.1): 1980 | resolution: {integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==} 1981 | engines: {node: '>=6'} 1982 | peerDependencies: 1983 | jest-resolve: '*' 1984 | peerDependenciesMeta: 1985 | jest-resolve: 1986 | optional: true 1987 | dependencies: 1988 | jest-resolve: 29.6.1 1989 | dev: true 1990 | 1991 | /jest-regex-util@29.4.3: 1992 | resolution: {integrity: sha512-O4FglZaMmWXbGHSQInfXewIsd1LMn9p3ZXB/6r4FOkyhX2/iP/soMG98jGvk/A3HAN78+5VWcBGO0BJAPRh4kg==} 1993 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 1994 | dev: true 1995 | 1996 | /jest-regex-util@29.6.3: 1997 | resolution: {integrity: sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==} 1998 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 1999 | dev: true 2000 | 2001 | /jest-resolve-dependencies@29.6.1: 2002 | resolution: {integrity: sha512-BbFvxLXtcldaFOhNMXmHRWx1nXQO5LoXiKSGQcA1LxxirYceZT6ch8KTE1bK3X31TNG/JbkI7OkS/ABexVahiw==} 2003 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 2004 | dependencies: 2005 | jest-regex-util: 29.4.3 2006 | jest-snapshot: 29.6.1 2007 | transitivePeerDependencies: 2008 | - supports-color 2009 | dev: true 2010 | 2011 | /jest-resolve@29.6.1: 2012 | resolution: {integrity: sha512-AeRkyS8g37UyJiP9w3mmI/VXU/q8l/IH52vj/cDAyScDcemRbSBhfX/NMYIGilQgSVwsjxrCHf3XJu4f+lxCMg==} 2013 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 2014 | dependencies: 2015 | chalk: 4.1.2 2016 | graceful-fs: 4.2.11 2017 | jest-haste-map: 29.6.1 2018 | jest-pnp-resolver: 1.2.3(jest-resolve@29.6.1) 2019 | jest-util: 29.6.1 2020 | jest-validate: 29.6.1 2021 | resolve: 1.22.2 2022 | resolve.exports: 2.0.2 2023 | slash: 3.0.0 2024 | dev: true 2025 | 2026 | /jest-runner@29.6.1: 2027 | resolution: {integrity: sha512-tw0wb2Q9yhjAQ2w8rHRDxteryyIck7gIzQE4Reu3JuOBpGp96xWgF0nY8MDdejzrLCZKDcp8JlZrBN/EtkQvPQ==} 2028 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 2029 | dependencies: 2030 | '@jest/console': 29.6.1 2031 | '@jest/environment': 29.6.1 2032 | '@jest/test-result': 29.6.1 2033 | '@jest/transform': 29.6.1 2034 | '@jest/types': 29.6.1 2035 | '@types/node': 20.4.2 2036 | chalk: 4.1.2 2037 | emittery: 0.13.1 2038 | graceful-fs: 4.2.11 2039 | jest-docblock: 29.4.3 2040 | jest-environment-node: 29.6.1 2041 | jest-haste-map: 29.6.1 2042 | jest-leak-detector: 29.6.1 2043 | jest-message-util: 29.6.1 2044 | jest-resolve: 29.6.1 2045 | jest-runtime: 29.6.1 2046 | jest-util: 29.6.1 2047 | jest-watcher: 29.6.1 2048 | jest-worker: 29.6.1 2049 | p-limit: 3.1.0 2050 | source-map-support: 0.5.13 2051 | transitivePeerDependencies: 2052 | - supports-color 2053 | dev: true 2054 | 2055 | /jest-runtime@29.6.1: 2056 | resolution: {integrity: sha512-D6/AYOA+Lhs5e5il8+5pSLemjtJezUr+8zx+Sn8xlmOux3XOqx4d8l/2udBea8CRPqqrzhsKUsN/gBDE/IcaPQ==} 2057 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 2058 | dependencies: 2059 | '@jest/environment': 29.6.1 2060 | '@jest/fake-timers': 29.6.1 2061 | '@jest/globals': 29.7.0 2062 | '@jest/source-map': 29.6.0 2063 | '@jest/test-result': 29.6.1 2064 | '@jest/transform': 29.6.1 2065 | '@jest/types': 29.6.1 2066 | '@types/node': 20.4.2 2067 | chalk: 4.1.2 2068 | cjs-module-lexer: 1.2.3 2069 | collect-v8-coverage: 1.0.2 2070 | glob: 7.2.0 2071 | graceful-fs: 4.2.11 2072 | jest-haste-map: 29.6.1 2073 | jest-message-util: 29.6.1 2074 | jest-mock: 29.6.1 2075 | jest-regex-util: 29.4.3 2076 | jest-resolve: 29.6.1 2077 | jest-snapshot: 29.6.1 2078 | jest-util: 29.6.1 2079 | slash: 3.0.0 2080 | strip-bom: 4.0.0 2081 | transitivePeerDependencies: 2082 | - supports-color 2083 | dev: true 2084 | 2085 | /jest-snapshot@29.6.1: 2086 | resolution: {integrity: sha512-G4UQE1QQ6OaCgfY+A0uR1W2AY0tGXUPQpoUClhWHq1Xdnx1H6JOrC2nH5lqnOEqaDgbHFgIwZ7bNq24HpB180A==} 2087 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 2088 | dependencies: 2089 | '@babel/core': 7.22.9 2090 | '@babel/generator': 7.22.9 2091 | '@babel/plugin-syntax-jsx': 7.22.5(@babel/core@7.22.9) 2092 | '@babel/plugin-syntax-typescript': 7.22.5(@babel/core@7.22.9) 2093 | '@babel/types': 7.22.5 2094 | '@jest/expect-utils': 29.6.1 2095 | '@jest/transform': 29.6.1 2096 | '@jest/types': 29.6.1 2097 | '@types/prettier': 2.7.3 2098 | babel-preset-current-node-syntax: 1.0.1(@babel/core@7.22.9) 2099 | chalk: 4.1.2 2100 | expect: 29.6.1 2101 | graceful-fs: 4.2.11 2102 | jest-diff: 29.6.1 2103 | jest-get-type: 29.4.3 2104 | jest-matcher-utils: 29.6.1 2105 | jest-message-util: 29.6.1 2106 | jest-util: 29.6.1 2107 | natural-compare: 1.4.0 2108 | pretty-format: 29.6.1 2109 | semver: 7.5.4 2110 | transitivePeerDependencies: 2111 | - supports-color 2112 | dev: true 2113 | 2114 | /jest-snapshot@29.7.0: 2115 | resolution: {integrity: sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==} 2116 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 2117 | dependencies: 2118 | '@babel/core': 7.22.9 2119 | '@babel/generator': 7.22.9 2120 | '@babel/plugin-syntax-jsx': 7.22.5(@babel/core@7.22.9) 2121 | '@babel/plugin-syntax-typescript': 7.22.5(@babel/core@7.22.9) 2122 | '@babel/types': 7.22.5 2123 | '@jest/expect-utils': 29.7.0 2124 | '@jest/transform': 29.7.0 2125 | '@jest/types': 29.6.3 2126 | babel-preset-current-node-syntax: 1.0.1(@babel/core@7.22.9) 2127 | chalk: 4.1.2 2128 | expect: 29.7.0 2129 | graceful-fs: 4.2.11 2130 | jest-diff: 29.7.0 2131 | jest-get-type: 29.6.3 2132 | jest-matcher-utils: 29.7.0 2133 | jest-message-util: 29.7.0 2134 | jest-util: 29.7.0 2135 | natural-compare: 1.4.0 2136 | pretty-format: 29.7.0 2137 | semver: 7.5.4 2138 | transitivePeerDependencies: 2139 | - supports-color 2140 | dev: true 2141 | 2142 | /jest-util@29.6.1: 2143 | resolution: {integrity: sha512-NRFCcjc+/uO3ijUVyNOQJluf8PtGCe/W6cix36+M3cTFgiYqFOOW5MgN4JOOcvbUhcKTYVd1CvHz/LWi8d16Mg==} 2144 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 2145 | dependencies: 2146 | '@jest/types': 29.6.1 2147 | '@types/node': 20.4.2 2148 | chalk: 4.1.2 2149 | ci-info: 3.8.0 2150 | graceful-fs: 4.2.11 2151 | picomatch: 2.3.1 2152 | dev: true 2153 | 2154 | /jest-util@29.7.0: 2155 | resolution: {integrity: sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==} 2156 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 2157 | dependencies: 2158 | '@jest/types': 29.6.3 2159 | '@types/node': 20.4.2 2160 | chalk: 4.1.2 2161 | ci-info: 3.8.0 2162 | graceful-fs: 4.2.11 2163 | picomatch: 2.3.1 2164 | dev: true 2165 | 2166 | /jest-validate@29.6.1: 2167 | resolution: {integrity: sha512-r3Ds69/0KCN4vx4sYAbGL1EVpZ7MSS0vLmd3gV78O+NAx3PDQQukRU5hNHPXlyqCgFY8XUk7EuTMLugh0KzahA==} 2168 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 2169 | dependencies: 2170 | '@jest/types': 29.6.1 2171 | camelcase: 6.3.0 2172 | chalk: 4.1.2 2173 | jest-get-type: 29.4.3 2174 | leven: 3.1.0 2175 | pretty-format: 29.6.1 2176 | dev: true 2177 | 2178 | /jest-watcher@29.6.1: 2179 | resolution: {integrity: sha512-d4wpjWTS7HEZPaaj8m36QiaP856JthRZkrgcIY/7ISoUWPIillrXM23WPboZVLbiwZBt4/qn2Jke84Sla6JhFA==} 2180 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 2181 | dependencies: 2182 | '@jest/test-result': 29.6.1 2183 | '@jest/types': 29.6.1 2184 | '@types/node': 20.4.2 2185 | ansi-escapes: 4.3.2 2186 | chalk: 4.1.2 2187 | emittery: 0.13.1 2188 | jest-util: 29.6.1 2189 | string-length: 4.0.2 2190 | dev: true 2191 | 2192 | /jest-worker@29.6.1: 2193 | resolution: {integrity: sha512-U+Wrbca7S8ZAxAe9L6nb6g8kPdia5hj32Puu5iOqBCMTMWFHXuK6dOV2IFrpedbTV8fjMFLdWNttQTBL6u2MRA==} 2194 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 2195 | dependencies: 2196 | '@types/node': 20.4.2 2197 | jest-util: 29.6.1 2198 | merge-stream: 2.0.0 2199 | supports-color: 8.1.1 2200 | dev: true 2201 | 2202 | /jest-worker@29.7.0: 2203 | resolution: {integrity: sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==} 2204 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 2205 | dependencies: 2206 | '@types/node': 20.4.2 2207 | jest-util: 29.7.0 2208 | merge-stream: 2.0.0 2209 | supports-color: 8.1.1 2210 | dev: true 2211 | 2212 | /jest@29.6.1(@types/node@20.4.2): 2213 | resolution: {integrity: sha512-Nirw5B4nn69rVUZtemCQhwxOBhm0nsp3hmtF4rzCeWD7BkjAXRIji7xWQfnTNbz9g0aVsBX6aZK3n+23LM6uDw==} 2214 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 2215 | hasBin: true 2216 | peerDependencies: 2217 | node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 2218 | peerDependenciesMeta: 2219 | node-notifier: 2220 | optional: true 2221 | dependencies: 2222 | '@jest/core': 29.6.1 2223 | '@jest/types': 29.6.1 2224 | import-local: 3.1.0 2225 | jest-cli: 29.6.1(@types/node@20.4.2) 2226 | transitivePeerDependencies: 2227 | - '@types/node' 2228 | - supports-color 2229 | - ts-node 2230 | dev: true 2231 | 2232 | /js-tokens@4.0.0: 2233 | resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} 2234 | dev: true 2235 | 2236 | /js-yaml@3.14.1: 2237 | resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} 2238 | hasBin: true 2239 | dependencies: 2240 | argparse: 1.0.10 2241 | esprima: 4.0.1 2242 | dev: true 2243 | 2244 | /jsesc@2.5.2: 2245 | resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} 2246 | engines: {node: '>=4'} 2247 | hasBin: true 2248 | dev: true 2249 | 2250 | /json-parse-even-better-errors@2.3.1: 2251 | resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} 2252 | dev: true 2253 | 2254 | /json5@2.2.3: 2255 | resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} 2256 | engines: {node: '>=6'} 2257 | hasBin: true 2258 | dev: true 2259 | 2260 | /kleur@3.0.3: 2261 | resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} 2262 | engines: {node: '>=6'} 2263 | dev: true 2264 | 2265 | /leven@3.1.0: 2266 | resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} 2267 | engines: {node: '>=6'} 2268 | dev: true 2269 | 2270 | /lines-and-columns@1.2.4: 2271 | resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} 2272 | dev: true 2273 | 2274 | /locate-path@5.0.0: 2275 | resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} 2276 | engines: {node: '>=8'} 2277 | dependencies: 2278 | p-locate: 4.1.0 2279 | dev: true 2280 | 2281 | /lodash.memoize@4.1.2: 2282 | resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} 2283 | dev: true 2284 | 2285 | /lodash@4.17.21: 2286 | resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} 2287 | dev: true 2288 | 2289 | /lru-cache@5.1.1: 2290 | resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} 2291 | dependencies: 2292 | yallist: 3.1.1 2293 | dev: true 2294 | 2295 | /lru-cache@6.0.0: 2296 | resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} 2297 | engines: {node: '>=10'} 2298 | dependencies: 2299 | yallist: 4.0.0 2300 | dev: true 2301 | 2302 | /make-dir@3.1.0: 2303 | resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} 2304 | engines: {node: '>=8'} 2305 | dependencies: 2306 | semver: 6.3.1 2307 | dev: true 2308 | 2309 | /make-error@1.3.6: 2310 | resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} 2311 | dev: true 2312 | 2313 | /makeerror@1.0.12: 2314 | resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} 2315 | dependencies: 2316 | tmpl: 1.0.5 2317 | dev: true 2318 | 2319 | /media-typer@0.3.0: 2320 | resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} 2321 | engines: {node: '>= 0.6'} 2322 | dev: true 2323 | 2324 | /merge-descriptors@1.0.1: 2325 | resolution: {integrity: sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==} 2326 | dev: true 2327 | 2328 | /merge-stream@2.0.0: 2329 | resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} 2330 | dev: true 2331 | 2332 | /methods@1.1.2: 2333 | resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} 2334 | engines: {node: '>= 0.6'} 2335 | dev: true 2336 | 2337 | /micromatch@4.0.5: 2338 | resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} 2339 | engines: {node: '>=8.6'} 2340 | dependencies: 2341 | braces: 3.0.2 2342 | picomatch: 2.3.1 2343 | dev: true 2344 | 2345 | /mime-db@1.52.0: 2346 | resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} 2347 | engines: {node: '>= 0.6'} 2348 | dev: true 2349 | 2350 | /mime-types@2.1.35: 2351 | resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} 2352 | engines: {node: '>= 0.6'} 2353 | dependencies: 2354 | mime-db: 1.52.0 2355 | dev: true 2356 | 2357 | /mime@1.6.0: 2358 | resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} 2359 | engines: {node: '>=4'} 2360 | hasBin: true 2361 | dev: true 2362 | 2363 | /mimic-fn@2.1.0: 2364 | resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} 2365 | engines: {node: '>=6'} 2366 | dev: true 2367 | 2368 | /minimatch@3.1.2: 2369 | resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} 2370 | dependencies: 2371 | brace-expansion: 1.1.11 2372 | dev: true 2373 | 2374 | /ms@2.0.0: 2375 | resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} 2376 | dev: true 2377 | 2378 | /ms@2.1.2: 2379 | resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} 2380 | dev: true 2381 | 2382 | /ms@2.1.3: 2383 | resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} 2384 | dev: true 2385 | 2386 | /natural-compare@1.4.0: 2387 | resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} 2388 | dev: true 2389 | 2390 | /negotiator@0.6.3: 2391 | resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} 2392 | engines: {node: '>= 0.6'} 2393 | dev: true 2394 | 2395 | /node-int64@0.4.0: 2396 | resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} 2397 | dev: true 2398 | 2399 | /node-releases@2.0.13: 2400 | resolution: {integrity: sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==} 2401 | dev: true 2402 | 2403 | /normalize-path@3.0.0: 2404 | resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} 2405 | engines: {node: '>=0.10.0'} 2406 | dev: true 2407 | 2408 | /npm-run-path@4.0.1: 2409 | resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} 2410 | engines: {node: '>=8'} 2411 | dependencies: 2412 | path-key: 3.1.1 2413 | dev: true 2414 | 2415 | /object-inspect@1.12.3: 2416 | resolution: {integrity: sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==} 2417 | dev: true 2418 | 2419 | /on-finished@2.4.1: 2420 | resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} 2421 | engines: {node: '>= 0.8'} 2422 | dependencies: 2423 | ee-first: 1.1.1 2424 | dev: true 2425 | 2426 | /once@1.4.0: 2427 | resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} 2428 | dependencies: 2429 | wrappy: 1.0.2 2430 | dev: true 2431 | 2432 | /onetime@5.1.2: 2433 | resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} 2434 | engines: {node: '>=6'} 2435 | dependencies: 2436 | mimic-fn: 2.1.0 2437 | dev: true 2438 | 2439 | /p-limit@2.3.0: 2440 | resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} 2441 | engines: {node: '>=6'} 2442 | dependencies: 2443 | p-try: 2.2.0 2444 | dev: true 2445 | 2446 | /p-limit@3.1.0: 2447 | resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} 2448 | engines: {node: '>=10'} 2449 | dependencies: 2450 | yocto-queue: 0.1.0 2451 | dev: true 2452 | 2453 | /p-locate@4.1.0: 2454 | resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} 2455 | engines: {node: '>=8'} 2456 | dependencies: 2457 | p-limit: 2.3.0 2458 | dev: true 2459 | 2460 | /p-try@2.2.0: 2461 | resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} 2462 | engines: {node: '>=6'} 2463 | dev: true 2464 | 2465 | /parse-json@5.2.0: 2466 | resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} 2467 | engines: {node: '>=8'} 2468 | dependencies: 2469 | '@babel/code-frame': 7.22.5 2470 | error-ex: 1.3.2 2471 | json-parse-even-better-errors: 2.3.1 2472 | lines-and-columns: 1.2.4 2473 | dev: true 2474 | 2475 | /parseurl@1.3.3: 2476 | resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} 2477 | engines: {node: '>= 0.8'} 2478 | dev: true 2479 | 2480 | /path-exists@4.0.0: 2481 | resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} 2482 | engines: {node: '>=8'} 2483 | dev: true 2484 | 2485 | /path-is-absolute@1.0.1: 2486 | resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} 2487 | engines: {node: '>=0.10.0'} 2488 | dev: true 2489 | 2490 | /path-key@3.1.1: 2491 | resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} 2492 | engines: {node: '>=8'} 2493 | dev: true 2494 | 2495 | /path-parse@1.0.7: 2496 | resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} 2497 | dev: true 2498 | 2499 | /path-to-regexp@0.1.7: 2500 | resolution: {integrity: sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==} 2501 | dev: true 2502 | 2503 | /picocolors@1.0.0: 2504 | resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} 2505 | dev: true 2506 | 2507 | /picomatch@2.3.1: 2508 | resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} 2509 | engines: {node: '>=8.6'} 2510 | dev: true 2511 | 2512 | /pirates@4.0.6: 2513 | resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} 2514 | engines: {node: '>= 6'} 2515 | dev: true 2516 | 2517 | /pkg-dir@4.2.0: 2518 | resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} 2519 | engines: {node: '>=8'} 2520 | dependencies: 2521 | find-up: 4.1.0 2522 | dev: true 2523 | 2524 | /pretty-format@29.6.1: 2525 | resolution: {integrity: sha512-7jRj+yXO0W7e4/tSJKoR7HRIHLPPjtNaUGG2xxKQnGvPNRkgWcQ0AZX6P4KBRJN4FcTBWb3sa7DVUJmocYuoog==} 2526 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 2527 | dependencies: 2528 | '@jest/schemas': 29.6.0 2529 | ansi-styles: 5.2.0 2530 | react-is: 18.2.0 2531 | dev: true 2532 | 2533 | /pretty-format@29.7.0: 2534 | resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} 2535 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 2536 | dependencies: 2537 | '@jest/schemas': 29.6.3 2538 | ansi-styles: 5.2.0 2539 | react-is: 18.2.0 2540 | dev: true 2541 | 2542 | /prompts@2.4.2: 2543 | resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} 2544 | engines: {node: '>= 6'} 2545 | dependencies: 2546 | kleur: 3.0.3 2547 | sisteransi: 1.0.5 2548 | dev: true 2549 | 2550 | /proxy-addr@2.0.7: 2551 | resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} 2552 | engines: {node: '>= 0.10'} 2553 | dependencies: 2554 | forwarded: 0.2.0 2555 | ipaddr.js: 1.9.1 2556 | dev: true 2557 | 2558 | /pure-rand@6.0.2: 2559 | resolution: {integrity: sha512-6Yg0ekpKICSjPswYOuC5sku/TSWaRYlA0qsXqJgM/d/4pLPHPuTxK7Nbf7jFKzAeedUhR8C7K9Uv63FBsSo8xQ==} 2560 | dev: true 2561 | 2562 | /qs@6.11.0: 2563 | resolution: {integrity: sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==} 2564 | engines: {node: '>=0.6'} 2565 | dependencies: 2566 | side-channel: 1.0.4 2567 | dev: true 2568 | 2569 | /range-parser@1.2.1: 2570 | resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} 2571 | engines: {node: '>= 0.6'} 2572 | dev: true 2573 | 2574 | /raw-body@2.5.1: 2575 | resolution: {integrity: sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==} 2576 | engines: {node: '>= 0.8'} 2577 | dependencies: 2578 | bytes: 3.1.2 2579 | http-errors: 2.0.0 2580 | iconv-lite: 0.4.24 2581 | unpipe: 1.0.0 2582 | dev: true 2583 | 2584 | /react-is@18.2.0: 2585 | resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==} 2586 | dev: true 2587 | 2588 | /require-directory@2.1.1: 2589 | resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} 2590 | engines: {node: '>=0.10.0'} 2591 | dev: true 2592 | 2593 | /resolve-cwd@3.0.0: 2594 | resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} 2595 | engines: {node: '>=8'} 2596 | dependencies: 2597 | resolve-from: 5.0.0 2598 | dev: true 2599 | 2600 | /resolve-from@5.0.0: 2601 | resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} 2602 | engines: {node: '>=8'} 2603 | dev: true 2604 | 2605 | /resolve.exports@2.0.2: 2606 | resolution: {integrity: sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==} 2607 | engines: {node: '>=10'} 2608 | dev: true 2609 | 2610 | /resolve@1.22.2: 2611 | resolution: {integrity: sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==} 2612 | hasBin: true 2613 | dependencies: 2614 | is-core-module: 2.12.1 2615 | path-parse: 1.0.7 2616 | supports-preserve-symlinks-flag: 1.0.0 2617 | dev: true 2618 | 2619 | /safe-buffer@5.2.1: 2620 | resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} 2621 | dev: true 2622 | 2623 | /safer-buffer@2.1.2: 2624 | resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} 2625 | dev: true 2626 | 2627 | /semver@6.3.1: 2628 | resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} 2629 | hasBin: true 2630 | dev: true 2631 | 2632 | /semver@7.5.4: 2633 | resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} 2634 | engines: {node: '>=10'} 2635 | hasBin: true 2636 | dependencies: 2637 | lru-cache: 6.0.0 2638 | dev: true 2639 | 2640 | /send@0.18.0: 2641 | resolution: {integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==} 2642 | engines: {node: '>= 0.8.0'} 2643 | dependencies: 2644 | debug: 2.6.9 2645 | depd: 2.0.0 2646 | destroy: 1.2.0 2647 | encodeurl: 1.0.2 2648 | escape-html: 1.0.3 2649 | etag: 1.8.1 2650 | fresh: 0.5.2 2651 | http-errors: 2.0.0 2652 | mime: 1.6.0 2653 | ms: 2.1.3 2654 | on-finished: 2.4.1 2655 | range-parser: 1.2.1 2656 | statuses: 2.0.1 2657 | transitivePeerDependencies: 2658 | - supports-color 2659 | dev: true 2660 | 2661 | /serve-static@1.15.0: 2662 | resolution: {integrity: sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==} 2663 | engines: {node: '>= 0.8.0'} 2664 | dependencies: 2665 | encodeurl: 1.0.2 2666 | escape-html: 1.0.3 2667 | parseurl: 1.3.3 2668 | send: 0.18.0 2669 | transitivePeerDependencies: 2670 | - supports-color 2671 | dev: true 2672 | 2673 | /setprototypeof@1.2.0: 2674 | resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} 2675 | dev: true 2676 | 2677 | /shebang-command@2.0.0: 2678 | resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} 2679 | engines: {node: '>=8'} 2680 | dependencies: 2681 | shebang-regex: 3.0.0 2682 | dev: true 2683 | 2684 | /shebang-regex@3.0.0: 2685 | resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} 2686 | engines: {node: '>=8'} 2687 | dev: true 2688 | 2689 | /side-channel@1.0.4: 2690 | resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} 2691 | dependencies: 2692 | call-bind: 1.0.2 2693 | get-intrinsic: 1.2.1 2694 | object-inspect: 1.12.3 2695 | dev: true 2696 | 2697 | /signal-exit@3.0.7: 2698 | resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} 2699 | dev: true 2700 | 2701 | /sisteransi@1.0.5: 2702 | resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} 2703 | dev: true 2704 | 2705 | /slash@3.0.0: 2706 | resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} 2707 | engines: {node: '>=8'} 2708 | dev: true 2709 | 2710 | /source-map-support@0.5.13: 2711 | resolution: {integrity: sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==} 2712 | dependencies: 2713 | buffer-from: 1.1.2 2714 | source-map: 0.6.1 2715 | dev: true 2716 | 2717 | /source-map@0.6.1: 2718 | resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} 2719 | engines: {node: '>=0.10.0'} 2720 | dev: true 2721 | 2722 | /sprintf-js@1.0.3: 2723 | resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} 2724 | dev: true 2725 | 2726 | /stack-utils@2.0.6: 2727 | resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} 2728 | engines: {node: '>=10'} 2729 | dependencies: 2730 | escape-string-regexp: 2.0.0 2731 | dev: true 2732 | 2733 | /statuses@2.0.1: 2734 | resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} 2735 | engines: {node: '>= 0.8'} 2736 | dev: true 2737 | 2738 | /string-length@4.0.2: 2739 | resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==} 2740 | engines: {node: '>=10'} 2741 | dependencies: 2742 | char-regex: 1.0.2 2743 | strip-ansi: 6.0.1 2744 | dev: true 2745 | 2746 | /string-width@4.2.3: 2747 | resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} 2748 | engines: {node: '>=8'} 2749 | dependencies: 2750 | emoji-regex: 8.0.0 2751 | is-fullwidth-code-point: 3.0.0 2752 | strip-ansi: 6.0.1 2753 | dev: true 2754 | 2755 | /strip-ansi@6.0.1: 2756 | resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} 2757 | engines: {node: '>=8'} 2758 | dependencies: 2759 | ansi-regex: 5.0.1 2760 | dev: true 2761 | 2762 | /strip-bom@4.0.0: 2763 | resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==} 2764 | engines: {node: '>=8'} 2765 | dev: true 2766 | 2767 | /strip-final-newline@2.0.0: 2768 | resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} 2769 | engines: {node: '>=6'} 2770 | dev: true 2771 | 2772 | /strip-json-comments@3.1.1: 2773 | resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} 2774 | engines: {node: '>=8'} 2775 | dev: true 2776 | 2777 | /supports-color@5.5.0: 2778 | resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} 2779 | engines: {node: '>=4'} 2780 | dependencies: 2781 | has-flag: 3.0.0 2782 | dev: true 2783 | 2784 | /supports-color@7.2.0: 2785 | resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} 2786 | engines: {node: '>=8'} 2787 | dependencies: 2788 | has-flag: 4.0.0 2789 | dev: true 2790 | 2791 | /supports-color@8.1.1: 2792 | resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} 2793 | engines: {node: '>=10'} 2794 | dependencies: 2795 | has-flag: 4.0.0 2796 | dev: true 2797 | 2798 | /supports-preserve-symlinks-flag@1.0.0: 2799 | resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} 2800 | engines: {node: '>= 0.4'} 2801 | dev: true 2802 | 2803 | /test-exclude@6.0.0: 2804 | resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} 2805 | engines: {node: '>=8'} 2806 | dependencies: 2807 | '@istanbuljs/schema': 0.1.3 2808 | glob: 7.2.0 2809 | minimatch: 3.1.2 2810 | dev: true 2811 | 2812 | /tmpl@1.0.5: 2813 | resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} 2814 | dev: true 2815 | 2816 | /to-fast-properties@2.0.0: 2817 | resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} 2818 | engines: {node: '>=4'} 2819 | dev: true 2820 | 2821 | /to-regex-range@5.0.1: 2822 | resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} 2823 | engines: {node: '>=8.0'} 2824 | dependencies: 2825 | is-number: 7.0.0 2826 | dev: true 2827 | 2828 | /toidentifier@1.0.1: 2829 | resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} 2830 | engines: {node: '>=0.6'} 2831 | dev: true 2832 | 2833 | /ts-jest@29.1.1(@babel/core@7.22.9)(jest@29.6.1)(typescript@5.1.6): 2834 | resolution: {integrity: sha512-D6xjnnbP17cC85nliwGiL+tpoKN0StpgE0TeOjXQTU6MVCfsB4v7aW05CgQ/1OywGb0x/oy9hHFnN+sczTiRaA==} 2835 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 2836 | hasBin: true 2837 | peerDependencies: 2838 | '@babel/core': '>=7.0.0-beta.0 <8' 2839 | '@jest/types': ^29.0.0 2840 | babel-jest: ^29.0.0 2841 | esbuild: '*' 2842 | jest: ^29.0.0 2843 | typescript: '>=4.3 <6' 2844 | peerDependenciesMeta: 2845 | '@babel/core': 2846 | optional: true 2847 | '@jest/types': 2848 | optional: true 2849 | babel-jest: 2850 | optional: true 2851 | esbuild: 2852 | optional: true 2853 | dependencies: 2854 | '@babel/core': 7.22.9 2855 | bs-logger: 0.2.6 2856 | fast-json-stable-stringify: 2.1.0 2857 | jest: 29.6.1(@types/node@20.4.2) 2858 | jest-util: 29.6.1 2859 | json5: 2.2.3 2860 | lodash.memoize: 4.1.2 2861 | make-error: 1.3.6 2862 | semver: 7.5.4 2863 | typescript: 5.1.6 2864 | yargs-parser: 21.1.1 2865 | dev: true 2866 | 2867 | /type-detect@4.0.8: 2868 | resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} 2869 | engines: {node: '>=4'} 2870 | dev: true 2871 | 2872 | /type-fest@0.21.3: 2873 | resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} 2874 | engines: {node: '>=10'} 2875 | dev: true 2876 | 2877 | /type-is@1.6.18: 2878 | resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} 2879 | engines: {node: '>= 0.6'} 2880 | dependencies: 2881 | media-typer: 0.3.0 2882 | mime-types: 2.1.35 2883 | dev: true 2884 | 2885 | /typescript@5.1.6: 2886 | resolution: {integrity: sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==} 2887 | engines: {node: '>=14.17'} 2888 | hasBin: true 2889 | dev: true 2890 | 2891 | /unpipe@1.0.0: 2892 | resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} 2893 | engines: {node: '>= 0.8'} 2894 | dev: true 2895 | 2896 | /update-browserslist-db@1.0.11(browserslist@4.21.9): 2897 | resolution: {integrity: sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==} 2898 | hasBin: true 2899 | peerDependencies: 2900 | browserslist: '>= 4.21.0' 2901 | dependencies: 2902 | browserslist: 4.21.9 2903 | escalade: 3.1.1 2904 | picocolors: 1.0.0 2905 | dev: true 2906 | 2907 | /utils-merge@1.0.1: 2908 | resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} 2909 | engines: {node: '>= 0.4.0'} 2910 | dev: true 2911 | 2912 | /v8-to-istanbul@9.1.0: 2913 | resolution: {integrity: sha512-6z3GW9x8G1gd+JIIgQQQxXuiJtCXeAjp6RaPEPLv62mH3iPHPxV6W3robxtCzNErRo6ZwTmzWhsbNvjyEBKzKA==} 2914 | engines: {node: '>=10.12.0'} 2915 | dependencies: 2916 | '@jridgewell/trace-mapping': 0.3.18 2917 | '@types/istanbul-lib-coverage': 2.0.4 2918 | convert-source-map: 1.9.0 2919 | dev: true 2920 | 2921 | /vary@1.1.2: 2922 | resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} 2923 | engines: {node: '>= 0.8'} 2924 | dev: true 2925 | 2926 | /walker@1.0.8: 2927 | resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} 2928 | dependencies: 2929 | makeerror: 1.0.12 2930 | dev: true 2931 | 2932 | /which@2.0.2: 2933 | resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} 2934 | engines: {node: '>= 8'} 2935 | hasBin: true 2936 | dependencies: 2937 | isexe: 2.0.0 2938 | dev: true 2939 | 2940 | /wrap-ansi@7.0.0: 2941 | resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} 2942 | engines: {node: '>=10'} 2943 | dependencies: 2944 | ansi-styles: 4.3.0 2945 | string-width: 4.2.3 2946 | strip-ansi: 6.0.1 2947 | dev: true 2948 | 2949 | /wrappy@1.0.2: 2950 | resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} 2951 | dev: true 2952 | 2953 | /write-file-atomic@4.0.2: 2954 | resolution: {integrity: sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==} 2955 | engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} 2956 | dependencies: 2957 | imurmurhash: 0.1.4 2958 | signal-exit: 3.0.7 2959 | dev: true 2960 | 2961 | /y18n@5.0.8: 2962 | resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} 2963 | engines: {node: '>=10'} 2964 | dev: true 2965 | 2966 | /yallist@3.1.1: 2967 | resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} 2968 | dev: true 2969 | 2970 | /yallist@4.0.0: 2971 | resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} 2972 | dev: true 2973 | 2974 | /yargs-parser@21.1.1: 2975 | resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} 2976 | engines: {node: '>=12'} 2977 | dev: true 2978 | 2979 | /yargs@17.7.2: 2980 | resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} 2981 | engines: {node: '>=12'} 2982 | dependencies: 2983 | cliui: 8.0.1 2984 | escalade: 3.1.1 2985 | get-caller-file: 2.0.5 2986 | require-directory: 2.1.1 2987 | string-width: 4.2.3 2988 | y18n: 5.0.8 2989 | yargs-parser: 21.1.1 2990 | dev: true 2991 | 2992 | /yocto-queue@0.1.0: 2993 | resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} 2994 | engines: {node: '>=10'} 2995 | dev: true 2996 | -------------------------------------------------------------------------------- /src/scripts/BUILD: -------------------------------------------------------------------------------- 1 | filegroup( 2 | name = "scripts", 3 | srcs = [ 4 | "compute_impacted_targets.sh", 5 | "prerequisites.sh", 6 | "upload_impacted_targets.sh", 7 | ], 8 | visibility = ["//tests:__subpackages__"], 9 | ) 10 | -------------------------------------------------------------------------------- /src/scripts/compute_impacted_targets.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | set -euo pipefail 4 | shopt -s expand_aliases 5 | 6 | if [[ -z ${MERGE_INSTANCE_BRANCH} ]]; then 7 | echo "Missing branch" 8 | exit 2 9 | fi 10 | 11 | if [[ (-z ${MERGE_INSTANCE_BRANCH_HEAD_SHA}) || (-z ${PR_BRANCH_HEAD_SHA}) ]]; then 12 | echo "Missing sha" 13 | exit 2 14 | fi 15 | 16 | if [[ -z ${WORKSPACE_PATH} ]]; then 17 | echo "Missing workspace path" 18 | exit 2 19 | fi 20 | 21 | ifVerbose() { 22 | if [[ -n ${VERBOSE} ]]; then 23 | "$@" 24 | fi 25 | } 26 | 27 | logIfVerbose() { 28 | # trunk-ignore(shellcheck/SC2312): Always query date with each echo statement. 29 | ifVerbose echo "$(date -u)" "$@" 30 | } 31 | 32 | # If specified, parse the Bazel startup options when generating hashes. 33 | bazel_startup_options="" 34 | if [[ -n ${BAZEL_STARTUP_OPTIONS} ]]; then 35 | bazel_startup_options=$(echo "${BAZEL_STARTUP_OPTIONS}" | tr ',' ' ') 36 | fi 37 | logIfVerbose "Bazel startup options" "${bazel_startup_options}" 38 | 39 | _bazel() { 40 | # trunk-ignore(shellcheck) 41 | ${BAZEL_PATH} ${bazel_startup_options} "$@" 42 | } 43 | 44 | # trunk-ignore(shellcheck) 45 | alias _java=$(_bazel info java-home)/bin/java 46 | 47 | bazelDiff() { 48 | if [[ -n ${VERBOSE} ]]; then 49 | _java -jar bazel-diff.jar "$@" --verbose 50 | else 51 | _java -jar bazel-diff.jar "$@" 52 | fi 53 | } 54 | 55 | ## Verbose logging for the Merge Instance and PR branch. 56 | if [[ -n ${VERBOSE} ]]; then 57 | # Find the merge base of the two branches 58 | merge_base_sha=$(git merge-base "${MERGE_INSTANCE_BRANCH_HEAD_SHA}" "${PR_BRANCH_HEAD_SHA}") 59 | echo "Merge Base= ${merge_base_sha}" 60 | 61 | # Find the number of commits between the merge base and the merge instance's HEAD 62 | merge_instance_depth=$(git rev-list "${merge_base_sha}".."${MERGE_INSTANCE_BRANCH_HEAD_SHA}" | wc -l) 63 | echo "Merge Instance Depth= ${merge_instance_depth}" 64 | 65 | git checkout "${MERGE_INSTANCE_BRANCH}" 66 | git clean -dfx -f --exclude=".trunk" . 67 | git submodule update --recursive 68 | git log -n "${merge_instance_depth}" --oneline 69 | 70 | # Find the number of commits between the merge base and the PR's HEAD 71 | pr_depth=$(git rev-list "${merge_base_sha}".."${PR_BRANCH_HEAD_SHA}" | wc -l) 72 | echo "PR Depth= ${pr_depth}" 73 | 74 | git checkout "${PR_BRANCH_HEAD_SHA}" 75 | git clean -dfx -f --exclude=".trunk" . 76 | git submodule update --recursive 77 | git log -n "${pr_depth}" --oneline 78 | fi 79 | 80 | # Install the bazel-diff JAR. Avoid cloning the repo, as there will be conflicting WORKSPACES. 81 | curl --retry 5 -Lo bazel-diff.jar https://github.com/Tinder/bazel-diff/releases/latest/download/bazel-diff_deploy.jar 82 | _java -jar bazel-diff.jar -V 83 | _bazel version # Does not require running with startup options. 84 | 85 | # Output Files 86 | merge_instance_branch_out=./${MERGE_INSTANCE_BRANCH_HEAD_SHA} 87 | merge_instance_with_pr_branch_out=./${PR_BRANCH_HEAD_SHA}_${MERGE_INSTANCE_BRANCH_HEAD_SHA} 88 | impacted_targets_out=./impacted_targets_${PR_BRANCH_HEAD_SHA} 89 | 90 | # Generate Hashes for the Merge Instance Branch 91 | git switch "${MERGE_INSTANCE_BRANCH}" 92 | git clean -dfx -f --exclude=".trunk" --exclude="bazel-diff.jar" . 93 | git submodule update --recursive 94 | bazelDiff generate-hashes --bazelPath="${BAZEL_PATH}" --workspacePath="${WORKSPACE_PATH}" "-so=${bazel_startup_options}" "${merge_instance_branch_out}" 95 | 96 | # Generate Hashes for the Merge Instance Branch + PR Branch 97 | git -c "user.name=Trunk Actions" -c "user.email=actions@trunk.io" merge --squash "${PR_BRANCH_HEAD_SHA}" 98 | git clean -dfx -f --exclude=".trunk" --exclude="${MERGE_INSTANCE_BRANCH_HEAD_SHA}" --exclude="bazel-diff.jar" . 99 | git submodule update --recursive 100 | bazelDiff generate-hashes --bazelPath="${BAZEL_PATH}" --workspacePath="${WORKSPACE_PATH}" "-so=${bazel_startup_options}" "${merge_instance_with_pr_branch_out}" 101 | 102 | # Compute impacted targets 103 | bazelDiff get-impacted-targets --startingHashes="${merge_instance_branch_out}" --finalHashes="${merge_instance_with_pr_branch_out}" --output="${impacted_targets_out}" 104 | 105 | num_impacted_targets=$(wc -l <"${impacted_targets_out}") 106 | echo "Computed ${num_impacted_targets} targets for sha ${PR_BRANCH_HEAD_SHA}" 107 | 108 | # Outputs 109 | echo "impacted_targets_out=${impacted_targets_out}" >>"${GITHUB_OUTPUT}" 110 | -------------------------------------------------------------------------------- /src/scripts/prerequisites.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | set -euo pipefail 4 | 5 | # NOTE: We cannot assume that the checked out Git repo (e.g. via actions-checkout) 6 | # was a shallow vs a complete clone. The `--depth` options deepens the commit history 7 | # in both clone modes: https://git-scm.com/docs/fetch-options#Documentation/fetch-options.txt---depthltdepthgt 8 | fetchRemoteGitHistory() { 9 | git fetch --quiet --depth=2147483647 origin "$@" 10 | } 11 | 12 | pr_head_sha="${PR_BRANCH_HEAD_SHA}" 13 | merge_instance_branch="${TARGET_BRANCH}" 14 | if [[ -z ${merge_instance_branch} ]]; then 15 | merge_instance_branch="${DEFAULT_BRANCH}" 16 | fi 17 | 18 | if [[ -z ${merge_instance_branch} ]]; then 19 | echo "Could not identify merge instance branch" 20 | exit 2 21 | fi 22 | 23 | # trunk-ignore(shellcheck/SC2153): Passed in as env variable 24 | workspace_path="${WORKSPACE_PATH}" 25 | if [[ -z ${workspace_path} ]]; then 26 | workspace_path=$(pwd) 27 | fi 28 | 29 | requires_default_bazel_installation="false" 30 | if [[ ${BAZEL_PATH} == "bazel" ]]; then 31 | if ! command -v bazel; then 32 | requires_default_bazel_installation="true" 33 | fi 34 | fi 35 | 36 | changes_count=0 37 | impacts_all_detected="false" 38 | if [[ -n ${IMPACTS_FILTERS_CHANGES+x} ]]; then 39 | changes_count=$(echo "${IMPACTS_FILTERS_CHANGES}" | jq length) 40 | if [[ ${changes_count} -gt 0 ]]; then 41 | impacts_all_detected="true" 42 | requires_default_bazel_installation="false" 43 | fi 44 | fi 45 | 46 | fetchRemoteGitHistory "${merge_instance_branch}" 47 | fetchRemoteGitHistory "${pr_head_sha}" 48 | 49 | merge_instance_branch_head_sha=$(git rev-parse "origin/${merge_instance_branch}") 50 | if [[ -z ${merge_instance_branch_head_sha} ]]; then 51 | echo "Could not identify merge instance branch head sha" 52 | exit 2 53 | fi 54 | 55 | echo "Identified changes: " "${impacts_all_detected}" 56 | 57 | # Outputs 58 | # trunk-ignore(shellcheck/SC2129) 59 | echo "merge_instance_branch=${merge_instance_branch}" >>"${GITHUB_OUTPUT}" 60 | echo "merge_instance_branch_head_sha=${merge_instance_branch_head_sha}" >>"${GITHUB_OUTPUT}" 61 | echo "impacts_all_detected=${impacts_all_detected}" >>"${GITHUB_OUTPUT}" 62 | echo "workspace_path=${workspace_path}" >>"${GITHUB_OUTPUT}" 63 | echo "requires_default_bazel_installation=${requires_default_bazel_installation}" >>"${GITHUB_OUTPUT}" 64 | -------------------------------------------------------------------------------- /src/scripts/upload_impacted_targets.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | set -euo pipefail 4 | 5 | IS_FORK_BOOL="${IS_FORK:=false}" 6 | 7 | # API Token is required if PR is not from a fork, or 8 | # RUN ID is required if PR is from a fork 9 | if [[ (-z ${API_TOKEN-}) && (${IS_FORK_BOOL} == 'false') ]]; then 10 | echo "Missing API Token when PR is not from a fork" 11 | exit 2 12 | elif [[ (-z ${RUN_ID-}) && (${IS_FORK_BOOL} == 'true') ]]; then 13 | echo "Missing workflow run id when PR is from a fork" 14 | exit 2 15 | fi 16 | 17 | # POST Body Parameters 18 | if [[ (-z ${REPOSITORY}) || (-z ${TARGET_BRANCH}) ]]; then 19 | echo "Missing Repo params" 20 | exit 2 21 | fi 22 | 23 | REPO_OWNER=$(echo "${REPOSITORY}" | cut -d "/" -f 1) 24 | REPO_NAME=$(echo "${REPOSITORY}" | cut -d "/" -f 2) 25 | 26 | if [[ (-z ${PR_NUMBER}) || (-z ${PR_BRANCH_HEAD_SHA}) ]]; then 27 | echo "Missing PR params" 28 | exit 2 29 | fi 30 | 31 | # API URL 32 | if [[ -z ${API_URL+x} ]]; then 33 | API_URL="https://api.trunk.io:443/v1/setImpactedTargets" 34 | fi 35 | 36 | REPO_BODY=$( 37 | jq --null-input \ 38 | --arg host "github.com" \ 39 | --arg owner "${REPO_OWNER}" \ 40 | --arg name "${REPO_NAME}" \ 41 | '{ "host": $host, "owner": $owner, "name": $name }' 42 | ) 43 | 44 | PR_BODY=$( 45 | jq --null-input \ 46 | --arg number "${PR_NUMBER}" \ 47 | --arg sha "${PR_BRANCH_HEAD_SHA}" \ 48 | '{ "number": $number, "sha": $sha }' 49 | ) 50 | 51 | num_impacted_targets="" 52 | POST_BODY="./post_body_tmp" 53 | if [[ ${IMPACTS_ALL_DETECTED} == 'true' ]]; then 54 | jq --null-input \ 55 | --argjson repo "${REPO_BODY}" \ 56 | --argjson pr "${PR_BODY}" \ 57 | --arg impactedTargets "ALL" \ 58 | --arg targetBranch "${TARGET_BRANCH}" \ 59 | '{ "repo": $repo, "pr": $pr, "targetBranch": $targetBranch, "impactedTargets": $impactedTargets }' \ 60 | >"${POST_BODY}" 61 | 62 | num_impacted_targets="'ALL'" 63 | else 64 | # Reformat the impacted targets into JSON array and pipe into a new file. 65 | IMPACTED_TARGETS_JSON_TMP="./impacted_targets_json_tmp" 66 | touch "${IMPACTED_TARGETS_JSON_TMP}" 67 | mapfile -t impacted_targets_array <"${IMPACTED_TARGETS_FILE}" 68 | IMPACTED_TARGETS=$(printf '%s\n' "${impacted_targets_array[@]}" | jq -R . | jq -s .) 69 | if [[ -z ${IMPACTED_TARGETS} ]]; then 70 | echo "[]" >"${IMPACTED_TARGETS_JSON_TMP}" 71 | else 72 | echo "${IMPACTED_TARGETS}" >"${IMPACTED_TARGETS_JSON_TMP}" 73 | fi 74 | 75 | jq --null-input \ 76 | --argjson repo "${REPO_BODY}" \ 77 | --argjson pr "${PR_BODY}" \ 78 | --slurpfile impactedTargets "${IMPACTED_TARGETS_JSON_TMP}" \ 79 | --arg targetBranch "${TARGET_BRANCH}" \ 80 | '{ "repo": $repo, "pr": $pr, "targetBranch": $targetBranch, "impactedTargets": $impactedTargets | .[0] | map(select(length > 0)) }' \ 81 | >"${POST_BODY}" 82 | 83 | num_impacted_targets=$(wc -l <"${IMPACTED_TARGETS_FILE}") 84 | fi 85 | 86 | RESPONSE_BODY_FILE="./response.txt" 87 | 88 | HTTP_STATUS_CODE=$( 89 | curl -s -o "${RESPONSE_BODY_FILE}" -w '%{http_code}' -X POST \ 90 | -H "Content-Type: application/json" -H "x-api-token:${API_TOKEN-}" -H "x-forked-workflow-run-id:${RUN_ID-}" \ 91 | -d "@${POST_BODY}" \ 92 | "${API_URL}" 93 | ) 94 | 95 | EXIT_CODE=0 96 | COMMENT_TEXT="" 97 | if [[ ${HTTP_STATUS_CODE} == 200 ]]; then 98 | COMMENT_TEXT="✨ Uploaded ${num_impacted_targets} impacted targets for ${PR_NUMBER} @ ${PR_BRANCH_HEAD_SHA}" 99 | else 100 | EXIT_CODE=1 101 | COMMENT_TEXT="❌ Unable to upload impacted targets. Encountered ${HTTP_STATUS_CODE} @ ${PR_BRANCH_HEAD_SHA}. Please contact us at slack.trunk.io." 102 | 103 | # Dependabot doesn't have access to GitHub action Secrets. 104 | # On authn failure, prompt the user to update their token. 105 | # https://docs.github.com/en/code-security/dependabot/working-with-dependabot/automating-dependabot-with-github-actions#accessing-secrets 106 | if [[ ${HTTP_STATUS_CODE} -eq 401 ]]; then 107 | if [[ ${ACTOR} == 'dependabot[bot]' ]]; then 108 | COMMENT_TEXT="❌ Unable to upload impacted targets. Did you update your Dependabot secrets with your repo's token? See https://docs.github.com/en/code-security/dependabot/working-with-dependabot/automating-dependabot-with-github-actions#accessing-secrets for more details." 109 | elif [[ ${ACTOR} == *"[bot]" ]]; then 110 | COMMENT_TEXT="❌ Unable to upload impacted targets. Please verify that this bot has access to your repo's token." 111 | fi 112 | fi 113 | fi 114 | 115 | echo "${COMMENT_TEXT}" 116 | 117 | if [[ ${HTTP_STATUS_CODE} != 200 ]]; then 118 | echo "Response Body:" 119 | cat "${RESPONSE_BODY_FILE}" 120 | fi 121 | 122 | exit "${EXIT_CODE}" 123 | -------------------------------------------------------------------------------- /tests/simple_bazel_workspace/WORKSPACE: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trunk-io/merge-action/e574577caca24c6e21eefe064a1279bd8bbbee3c/tests/simple_bazel_workspace/WORKSPACE -------------------------------------------------------------------------------- /tests/simple_bazel_workspace/lib/BUILD: -------------------------------------------------------------------------------- 1 | filegroup( 2 | name = "lib", 3 | srcs = ["foo.txt"], 4 | ) 5 | -------------------------------------------------------------------------------- /tests/simple_bazel_workspace/lib/foo.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trunk-io/merge-action/e574577caca24c6e21eefe064a1279bd8bbbee3c/tests/simple_bazel_workspace/lib/foo.txt -------------------------------------------------------------------------------- /tests/upload.test.ts: -------------------------------------------------------------------------------- 1 | /** Test the compute_impacted_targets actions. */ 2 | import express from "express"; 3 | import { StatusCodes } from "http-status-codes"; 4 | import * as _ from "lodash"; 5 | import exec from "node:child_process"; 6 | import fs from "node:fs"; 7 | import http from "node:http"; 8 | import util from "node:util"; 9 | import { describe, beforeEach, beforeAll, afterAll, it, expect, afterEach } from "@jest/globals"; 10 | import { strict as assert } from "node:assert"; 11 | 12 | const PORT = 4567; 13 | const RESPONSE_FILE = "./response.txt"; 14 | 15 | type ImpactedTargets = string[] | "ALL"; 16 | 17 | type EnvVar = 18 | | "API_TOKEN" 19 | | "REPOSITORY" 20 | | "TARGET_BRANCH" 21 | | "PR_NUMBER" 22 | | "PR_BRANCH_HEAD_SHA" 23 | | "IMPACTED_TARGETS_FILE" 24 | | "IMPACTS_ALL_DETECTED" 25 | | "API_URL" 26 | | "RUN_ID" 27 | | "IS_FORK"; 28 | 29 | type EnvVarSet = Record; 30 | 31 | const fetchUrl = (path: string) => `http://localhost:${PORT}${path}`; 32 | const UPLOAD_IMPACTED_TARGETS_SCRIPT = "src/scripts/upload_impacted_targets.sh"; 33 | const DEFAULT_ENV_VARIABLES: EnvVarSet = { 34 | API_TOKEN: "test-api-token", 35 | REPOSITORY: "test-repo-owner/test-repo-name", 36 | TARGET_BRANCH: "test-target-branch", 37 | PR_NUMBER: "123", 38 | PR_BRANCH_HEAD_SHA: "test-pr-sha", 39 | IMPACTED_TARGETS_FILE: "/tmp/test-impacted-targets-file", 40 | IMPACTS_ALL_DETECTED: "false", 41 | API_URL: fetchUrl("/testUploadImpactedTargets"), 42 | RUN_ID: "123456", 43 | IS_FORK: "false", 44 | }; 45 | 46 | describe("upload_impacted_targets", () => { 47 | let server: http.Server; 48 | let uploadedImpactedTargetsPayload: { 49 | apiTokenHeader: string | null; 50 | forkedWorkflowIdHeader: string | null; 51 | requestBody: typeof express.request | null; 52 | } | null = null; 53 | let exportedEnvVars: EnvVarSet | null = null; 54 | let forceUnauthorized = false; 55 | 56 | const exportEnv = (env: EnvVarSet): string => { 57 | exportedEnvVars = env; 58 | return Object.entries(env) 59 | .map(([key, value]) => `${key}=${value}`) 60 | .join(" "); 61 | }; 62 | 63 | const runUploadTargets = async ( 64 | impactedTargets: ImpactedTargets, 65 | envOverrides: Partial = {}, 66 | ) => { 67 | const env: EnvVarSet = { ...DEFAULT_ENV_VARIABLES, ...envOverrides }; 68 | // The bazel / glob / ... scripts are responsible for populating these files. 69 | // Verify that the upload works as intended. 70 | if (impactedTargets !== "ALL") { 71 | fs.writeFileSync(env.IMPACTED_TARGETS_FILE, impactedTargets.join("\n")); 72 | } 73 | 74 | const runScript = util.promisify(exec.exec)( 75 | `${exportEnv(env)} ${UPLOAD_IMPACTED_TARGETS_SCRIPT}`, 76 | ); 77 | 78 | await runScript; 79 | }; 80 | 81 | const expectImpactedTargetsUpload = (impactedTargets: ImpactedTargets): void => { 82 | assert(exportedEnvVars); 83 | assert(uploadedImpactedTargetsPayload); 84 | 85 | const { API_TOKEN, REPOSITORY, TARGET_BRANCH, PR_NUMBER, PR_BRANCH_HEAD_SHA, RUN_ID } = 86 | exportedEnvVars; 87 | const { apiTokenHeader, forkedWorkflowIdHeader, requestBody } = uploadedImpactedTargetsPayload; 88 | 89 | expect(apiTokenHeader).toEqual(API_TOKEN); 90 | expect(forkedWorkflowIdHeader).toEqual(RUN_ID); 91 | expect(requestBody).toEqual({ 92 | repo: { 93 | host: "github.com", 94 | owner: REPOSITORY.split("/")[0], 95 | name: REPOSITORY.split("/")[1], 96 | }, 97 | pr: { 98 | number: PR_NUMBER, 99 | sha: PR_BRANCH_HEAD_SHA, 100 | }, 101 | targetBranch: TARGET_BRANCH, 102 | impactedTargets, 103 | }); 104 | }; 105 | 106 | beforeAll(function () { 107 | const app = express(); 108 | 109 | app.use(express.json({ limit: "10mb" })); 110 | 111 | app.post("/testUploadImpactedTargets", (req, res) => { 112 | const actualApiToken = req.headers["x-api-token"]; 113 | const actualRunId = req.headers["x-forked-workflow-run-id"]; 114 | 115 | uploadedImpactedTargetsPayload = { 116 | apiTokenHeader: (actualApiToken ?? "") as string, 117 | forkedWorkflowIdHeader: (actualRunId ?? "") as string, 118 | requestBody: req.body, 119 | }; 120 | 121 | assert(exportedEnvVars); 122 | res.sendStatus(forceUnauthorized ? StatusCodes.UNAUTHORIZED : StatusCodes.OK); 123 | }); 124 | 125 | server = app.listen(PORT); 126 | }); 127 | 128 | beforeEach(function () { 129 | uploadedImpactedTargetsPayload = null; 130 | exportedEnvVars = null; 131 | forceUnauthorized = false; 132 | }); 133 | 134 | afterEach(function () { 135 | fs.rmSync(DEFAULT_ENV_VARIABLES.IMPACTED_TARGETS_FILE, { force: true }); 136 | fs.rmSync(RESPONSE_FILE, { force: true }); 137 | }); 138 | 139 | afterAll(function () { 140 | server.close(); 141 | }); 142 | 143 | it("rejects if missing required input", async function () { 144 | await expect(() => 145 | util.promisify(exec.exec)(`${UPLOAD_IMPACTED_TARGETS_SCRIPT}`), 146 | ).rejects.toBeTruthy(); 147 | }); 148 | 149 | it("hits the endpoint", async function () { 150 | const impactedTargets = ["target-1", "target-2", "target-3"]; 151 | await runUploadTargets(impactedTargets); 152 | expectImpactedTargetsUpload(impactedTargets); 153 | }); 154 | 155 | it("supports empty targets", async function () { 156 | const impactedTargets: string[] = []; 157 | await runUploadTargets(impactedTargets); 158 | expectImpactedTargetsUpload(impactedTargets); 159 | }); 160 | 161 | it("supports 1K targets", async function () { 162 | const impactedTargets = [...new Array(1_000)].map((_, i) => `target-${i}`); 163 | await runUploadTargets(impactedTargets); 164 | expectImpactedTargetsUpload(impactedTargets); 165 | }); 166 | 167 | it("supports 100K targets", async function () { 168 | const impactedTargets = [...new Array(100_000)].map((_, i) => `target-${i}`); 169 | await runUploadTargets(impactedTargets); 170 | expectImpactedTargetsUpload(impactedTargets); 171 | }); 172 | 173 | it("supports IMPACTS_ALL", async function () { 174 | await runUploadTargets("ALL", { IMPACTS_ALL_DETECTED: "true" }); 175 | expectImpactedTargetsUpload("ALL"); 176 | }); 177 | 178 | it("allows missing API token if PR is coming from a fork", async function () { 179 | const impactedTargets = ["target-1", "target-2", "target-3"]; 180 | await runUploadTargets(impactedTargets, { API_TOKEN: "", IS_FORK: "true" }); 181 | expectImpactedTargetsUpload(impactedTargets); 182 | }); 183 | 184 | it("rejects when missing API token and is not a fork", async function () { 185 | await expect(runUploadTargets(["a"], { API_TOKEN: "" })).rejects.toBeTruthy(); 186 | }); 187 | 188 | it("rejects when missing API token and fork env vars", async function () { 189 | await expect(runUploadTargets(["a"], { API_TOKEN: "", IS_FORK: "" })).rejects.toBeTruthy(); 190 | }); 191 | 192 | it("rejects when missing forked workflow ID and is a fork", async function () { 193 | await expect( 194 | runUploadTargets(["a"], { API_TOKEN: "", RUN_ID: "", IS_FORK: "true" }), 195 | ).rejects.toBeTruthy(); 196 | }); 197 | 198 | it("rejects on http 401", async function () { 199 | forceUnauthorized = true; 200 | await expect(runUploadTargets([])).rejects.toBeTruthy(); 201 | }); 202 | }); 203 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | /* Basic Options */ 4 | // "incremental": true, /* Enable incremental compilation */ 5 | "target": "ES2020" /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019', 'ES2020', or 'ESNEXT'. */, 6 | "module": "commonjs" /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', 'es2020', or 'ESNext'. */, 7 | "lib": ["es2019", "dom"] /* Specify library files to be included in the compilation. */, 8 | "resolveJsonModule": true, 9 | "allowJs": false /* Allow javascript files to be compiled. */, 10 | // "checkJs": true, /* Report errors in .js files. */ 11 | // "jsx": "preserve", /* Specify JSX code generation: 'preserve', 'react-native', or 'react'. */ 12 | "declaration": true /* Generates corresponding '.d.ts' file. */, 13 | // "declarationMap": true, /* Generates a sourcemap for each corresponding '.d.ts' file. */ 14 | "sourceMap": true /* Generates corresponding '.map' file. */, 15 | // "outFile": "./", /* Concatenate and emit output to single file. */ 16 | // "outDir": "./", /* Redirect output structure to the directory. */ 17 | // "rootDir": "./", /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */ 18 | // "composite": true /* Enable project compilation */, 19 | // "tsBuildInfoFile": "./", /* Specify file to store incremental compilation information */ 20 | // "removeComments": true, /* Do not emit comments to output. */ 21 | // "noEmit": true, /* Do not emit outputs. */ 22 | // "importHelpers": true, /* Import emit helpers from 'tslib'. */ 23 | // "downlevelIteration": true, /* Provide full support for iterables in 'for-of', spread, and destructuring when targeting 'ES5' or 'ES3'. */ 24 | // "isolatedModules": true, /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */ 25 | 26 | /* Strict Type-Checking Options */ 27 | "strict": true /* Enable all strict type-checking options. */, 28 | // "noImplicitAny": true, /* Raise error on expressions and declarations with an implied 'any' type. */ 29 | // "strictNullChecks": true, /* Enable strict null checks. */ 30 | // "strictFunctionTypes": true, /* Enable strict checking of function types. */ 31 | // "strictBindCallApply": true, /* Enable strict 'bind', 'call', and 'apply' methods on functions. */ 32 | // "strictPropertyInitialization": true, /* Enable strict checking of property initialization in classes. */ 33 | // "noImplicitThis": true, /* Raise error on 'this' expressions with an implied 'any' type. */ 34 | // "alwaysStrict": true, /* Parse in strict mode and emit "use strict" for each source file. */ 35 | 36 | /* Additional Checks */ 37 | // "noUnusedLocals": true, /* Report errors on unused locals. */ 38 | // "noUnusedParameters": true, /* Report errors on unused parameters. */ 39 | // "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */ 40 | // "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */ 41 | 42 | /* Module Resolution Options */ 43 | // "moduleResolution": "node", /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */ 44 | "baseUrl": "." /* Base directory to resolve non-absolute module names. */, 45 | // "paths": {}, /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */ 46 | // "rootDirs": [], /* List of root folders whose combined content represents the structure of the project at runtime. */ 47 | // "typeRoots": [], /* List of folders to include type definitions from. */ 48 | // "types": [], /* Type declaration files to be included in compilation. */ 49 | // "allowSyntheticDefaultImports": true, /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */ 50 | "esModuleInterop": true /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */, 51 | // "preserveSymlinks": true, /* Do not resolve the real path of symlinks. */ 52 | // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */ 53 | 54 | /* Source Map Options */ 55 | // "sourceRoot": "", /* Specify the location where debugger should locate TypeScript files instead of source locations. */ 56 | // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ 57 | // "inlineSourceMap": true, /* Emit a single file with source maps instead of having a separate file. */ 58 | // "inlineSources": true, /* Emit the source alongside the sourcemaps within a single file; requires '--inlineSourceMap' or '--sourceMap' to be set. */ 59 | 60 | /* Experimental Options */ 61 | "experimentalDecorators": true /* Enables experimental support for ES7 decorators. */, 62 | "emitDecoratorMetadata": true /* Enables experimental support for emitting type metadata for decorators. */, 63 | 64 | /* Advanced Options */ 65 | "skipLibCheck": true /* Skip type checking of declaration files. */, 66 | "forceConsistentCasingInFileNames": true /* Disallow inconsistently-cased references to the same file. */, 67 | // "plugins": [], 68 | "traceResolution": false /* Enable tracing of module resolution */ 69 | }, 70 | "exclude": ["node_modules"] 71 | } 72 | --------------------------------------------------------------------------------