├── .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 |
--------------------------------------------------------------------------------