├── .Rbuildignore ├── .eslintrc.js ├── .gitignore ├── .lintr ├── DESCRIPTION ├── LICENSE.md ├── NAMESPACE ├── NEWS.md ├── R ├── aaa.R ├── core.R ├── dependency.R ├── example.R ├── query-string.R ├── types.R └── utils.R ├── README.md ├── docs ├── .nojekyll ├── README.md ├── _coverpage.md ├── _sidebar.md ├── examples.md ├── index.html ├── js.md ├── logo.png └── r.md ├── inst ├── assets │ └── index.js ├── example │ └── app.R └── logo.png ├── makefile ├── man ├── args_from_query_string.Rd ├── check_args_match.Rd ├── com.Rd ├── com_serve.Rd ├── constructors.Rd ├── converters..Rd ├── create_type.Rd ├── example.Rd ├── get_args.Rd ├── get_prefix.Rd ├── http_response_json.Rd ├── make_id.Rd ├── parse_args.Rd ├── parse_query_string.Rd └── useCommunicate.Rd ├── package-lock.json ├── package.json ├── srcjs ├── config │ ├── entry_points.json │ ├── externals.json │ ├── loaders.json │ ├── misc.json │ └── output_path.json └── index.ts ├── tsconfig.json ├── webpack.common.js ├── webpack.dev.js └── webpack.prod.js /.Rbuildignore: -------------------------------------------------------------------------------- 1 | ^srcjs$ 2 | ^node_modules$ 3 | ^package\.json$ 4 | ^package-lock\.json$ 5 | ^webpack\.dev\.js$ 6 | ^webpack\.prod\.js$ 7 | ^webpack\.common\.js$ 8 | ^LICENSE\.md$ 9 | ^test\.R$ 10 | ^makefile$ 11 | ^docs$ 12 | ^lintr$ 13 | ^\.lintr$ 14 | ^\.eslintrc\.js$ 15 | ^tsconfig\.json$ 16 | -------------------------------------------------------------------------------- /.eslintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | env: { 3 | browser: true, 4 | es2021: true, 5 | }, 6 | extends: ["eslint:recommended", "plugin:@typescript-eslint/recommended"], 7 | overrides: [ 8 | { 9 | env: { 10 | node: true, 11 | }, 12 | files: [".eslintrc.{js,cjs}"], 13 | parserOptions: { 14 | sourceType: "script", 15 | }, 16 | }, 17 | ], 18 | parser: "@typescript-eslint/parser", 19 | parserOptions: { 20 | ecmaVersion: "latest", 21 | sourceType: "module", 22 | }, 23 | plugins: ["@typescript-eslint"], 24 | rules: { 25 | "@typescript-eslint/no-explicit-any": "off", 26 | "@typescript-eslint/no-inferrable-types": "on", 27 | }, 28 | }; 29 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | test.R 3 | -------------------------------------------------------------------------------- /.lintr: -------------------------------------------------------------------------------- 1 | linters: linters_with_defaults( 2 | line_length_linter(120), 3 | trailing_whitespace_linter = NULL, 4 | commented_code_linter = NULL, 5 | function_left_parentheses_linter = NULL, 6 | spaces_left_parentheses_linter = NULL, 7 | paren_body_linter = NULL, 8 | brace_linter = NULL, 9 | indentation_linter( 10 | indent = 2L, 11 | hanging_indent_style = "never" 12 | ), 13 | object_usage_linter = NULL # this uses eval() 14 | ) 15 | encoding: "UTF-8" 16 | -------------------------------------------------------------------------------- /DESCRIPTION: -------------------------------------------------------------------------------- 1 | Package: communicate 2 | Title: Communicate Between 'Shiny' Client and Server 3 | Version: 0.1.3.9000 4 | Authors@R: 5 | c( 6 | person(given = "John", 7 | family = "Coene", 8 | role = c("aut", "cre"), 9 | email = "jcoenep@gmail.com"), 10 | person(family = "Opifex", 11 | role = c("cph", "fnd"), 12 | email = "john@opifex.org") 13 | ) 14 | Description: What the package does (one paragraph). 15 | License: GPL (>= 3) 16 | Encoding: UTF-8 17 | Roxygen: list(markdown = TRUE) 18 | RoxygenNote: 7.3.1 19 | Imports: 20 | shiny, 21 | jsonlite, 22 | htmltools 23 | Suggests: 24 | methods 25 | -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | GNU General Public License 2 | ========================== 3 | 4 | _Version 3, 29 June 2007_ 5 | _Copyright © 2007 Free Software Foundation, Inc. <>_ 6 | 7 | Everyone is permitted to copy and distribute verbatim copies of this license 8 | document, but changing it is not allowed. 9 | 10 | ## Preamble 11 | 12 | The GNU General Public License is a free, copyleft license for software and other 13 | kinds of works. 14 | 15 | The licenses for most software and other practical works are designed to take away 16 | your freedom to share and change the works. By contrast, the GNU General Public 17 | License is intended to guarantee your freedom to share and change all versions of a 18 | program--to make sure it remains free software for all its users. We, the Free 19 | Software Foundation, use the GNU General Public License for most of our software; it 20 | applies also to any other work released this way by its authors. You can apply it to 21 | your programs, too. 22 | 23 | When we speak of free software, we are referring to freedom, not price. Our General 24 | Public Licenses are designed to make sure that you have the freedom to distribute 25 | copies of free software (and charge for them if you wish), that you receive source 26 | code or can get it if you want it, that you can change the software or use pieces of 27 | it in new 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 these rights or 30 | asking you to surrender the rights. Therefore, you have certain responsibilities if 31 | you distribute copies of the software, or if you modify it: responsibilities to 32 | respect the freedom of others. 33 | 34 | For example, if you distribute copies of such a program, whether gratis or for a fee, 35 | you must pass on to the recipients the same freedoms that you received. You must make 36 | sure that they, too, receive or can get the source code. And you must show them these 37 | terms so they know their rights. 38 | 39 | Developers that use the GNU GPL protect your rights with two steps: **(1)** assert 40 | copyright on the software, and **(2)** offer you this License giving you legal permission 41 | to copy, distribute and/or modify it. 42 | 43 | For the developers' and authors' protection, the GPL clearly explains that there is 44 | no warranty for this free software. For both users' and authors' sake, the GPL 45 | requires that modified versions be marked as changed, so that their problems will not 46 | be attributed erroneously to authors of previous versions. 47 | 48 | Some devices are designed to deny users access to install or run modified versions of 49 | the software inside them, although the manufacturer can do so. This is fundamentally 50 | incompatible with the aim of protecting users' freedom to change the software. The 51 | systematic pattern of such abuse occurs in the area of products for individuals to 52 | use, which is precisely where it is most unacceptable. Therefore, we have designed 53 | this version of the GPL to prohibit the practice for those products. If such problems 54 | arise substantially in other domains, we stand ready to extend this provision to 55 | those domains in future versions of the GPL, as needed to protect the freedom of 56 | users. 57 | 58 | Finally, every program is threatened constantly by software patents. States should 59 | not allow patents to restrict development and use of software on general-purpose 60 | computers, but in those that do, we wish to avoid the special danger that patents 61 | applied to a free program could make it effectively proprietary. To prevent this, the 62 | GPL assures that patents cannot be used to render the program non-free. 63 | 64 | The precise terms and conditions for copying, distribution and modification follow. 65 | 66 | ## TERMS AND CONDITIONS 67 | 68 | ### 0. Definitions 69 | 70 | “This License” refers to version 3 of the GNU General Public License. 71 | 72 | “Copyright” also means copyright-like laws that apply to other kinds of 73 | works, such as semiconductor masks. 74 | 75 | “The Program” refers to any copyrightable work licensed under this 76 | License. Each licensee is addressed as “you”. “Licensees” and 77 | “recipients” may be individuals or organizations. 78 | 79 | To “modify” a work means to copy from or adapt all or part of the work in 80 | a fashion requiring copyright permission, other than the making of an exact copy. The 81 | resulting work is called a “modified version” of the earlier work or a 82 | work “based on” the earlier work. 83 | 84 | A “covered work” means either the unmodified Program or a work based on 85 | the Program. 86 | 87 | To “propagate” a work means to do anything with it that, without 88 | permission, would make you directly or secondarily liable for infringement under 89 | applicable copyright law, except executing it on a computer or modifying a private 90 | copy. Propagation includes copying, distribution (with or without modification), 91 | making available to the public, and in some countries other activities as well. 92 | 93 | To “convey” a work means any kind of propagation that enables other 94 | parties to make or receive copies. Mere interaction with a user through a computer 95 | network, with no transfer of a copy, is not conveying. 96 | 97 | An interactive user interface displays “Appropriate Legal Notices” to the 98 | extent that it includes a convenient and prominently visible feature that **(1)** 99 | displays an appropriate copyright notice, and **(2)** tells the user that there is no 100 | warranty for the work (except to the extent that warranties are provided), that 101 | licensees may convey the work under this License, and how to view a copy of this 102 | License. If the interface presents a list of user commands or options, such as a 103 | menu, a prominent item in the list meets this criterion. 104 | 105 | ### 1. Source Code 106 | 107 | The “source code” for a work means the preferred form of the work for 108 | making modifications to it. “Object code” means any non-source form of a 109 | work. 110 | 111 | A “Standard Interface” means an interface that either is an official 112 | standard defined by a recognized standards body, or, in the case of interfaces 113 | specified for a particular programming language, one that is widely used among 114 | developers working in that language. 115 | 116 | The “System Libraries” of an executable work include anything, other than 117 | the work as a whole, that **(a)** is included in the normal form of packaging a Major 118 | Component, but which is not part of that Major Component, and **(b)** serves only to 119 | enable use of the work with that Major Component, or to implement a Standard 120 | Interface for which an implementation is available to the public in source code form. 121 | A “Major Component”, in this context, means a major essential component 122 | (kernel, window system, and so on) of the specific operating system (if any) on which 123 | the executable work runs, or a compiler used to produce the work, or an object code 124 | interpreter used to run it. 125 | 126 | The “Corresponding Source” for a work in object code form means all the 127 | source code needed to generate, install, and (for an executable work) run the object 128 | code and to modify the work, including scripts to control those activities. However, 129 | it does not include the work's System Libraries, or general-purpose tools or 130 | generally available free programs which are used unmodified in performing those 131 | activities but which are not part of the work. For example, Corresponding Source 132 | includes interface definition files associated with source files for the work, and 133 | the source code for shared libraries and dynamically linked subprograms that the work 134 | is specifically designed to require, such as by intimate data communication or 135 | control flow between those subprograms and other parts of the work. 136 | 137 | The Corresponding Source need not include anything that users can regenerate 138 | automatically from other parts of the Corresponding Source. 139 | 140 | The Corresponding Source for a work in source code form is that same work. 141 | 142 | ### 2. Basic Permissions 143 | 144 | All rights granted under this License are granted for the term of copyright on the 145 | Program, and are irrevocable provided the stated conditions are met. This License 146 | explicitly affirms your unlimited permission to run the unmodified Program. The 147 | output from running a covered work is covered by this License only if the output, 148 | given its content, constitutes a covered work. This License acknowledges your rights 149 | of fair use or other equivalent, as provided by copyright law. 150 | 151 | You may make, run and propagate covered works that you do not convey, without 152 | conditions so long as your license otherwise remains in force. You may convey covered 153 | works to others for the sole purpose of having them make modifications exclusively 154 | for you, or provide you with facilities for running those works, provided that you 155 | comply with the terms of this License in conveying all material for which you do not 156 | control copyright. Those thus making or running the covered works for you must do so 157 | exclusively on your behalf, under your direction and control, on terms that prohibit 158 | them from making any copies of your copyrighted material outside their relationship 159 | with you. 160 | 161 | Conveying under any other circumstances is permitted solely under the conditions 162 | stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 163 | 164 | ### 3. Protecting Users' Legal Rights From Anti-Circumvention Law 165 | 166 | No covered work shall be deemed part of an effective technological measure under any 167 | applicable law fulfilling obligations under article 11 of the WIPO copyright treaty 168 | adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention 169 | of such measures. 170 | 171 | When you convey a covered work, you waive any legal power to forbid circumvention of 172 | technological measures to the extent such circumvention is effected by exercising 173 | rights under this License with respect to the covered work, and you disclaim any 174 | intention to limit operation or modification of the work as a means of enforcing, 175 | against the work's users, your or third parties' legal rights to forbid circumvention 176 | of technological measures. 177 | 178 | ### 4. Conveying Verbatim Copies 179 | 180 | You may convey verbatim copies of the Program's source code as you receive it, in any 181 | medium, provided that you conspicuously and appropriately publish on each copy an 182 | appropriate copyright notice; keep intact all notices stating that this License and 183 | any non-permissive terms added in accord with section 7 apply to the code; keep 184 | intact all notices of the absence of any warranty; and give all recipients a copy of 185 | this License along with the Program. 186 | 187 | You may charge any price or no price for each copy that you convey, and you may offer 188 | support or warranty protection for a fee. 189 | 190 | ### 5. Conveying Modified Source Versions 191 | 192 | You may convey a work based on the Program, or the modifications to produce it from 193 | the Program, in the form of source code under the terms of section 4, provided that 194 | you also meet all of these conditions: 195 | 196 | * **a)** The work must carry prominent notices stating that you modified it, and giving a 197 | relevant date. 198 | * **b)** The work must carry prominent notices stating that it is released under this 199 | License and any conditions added under section 7. This requirement modifies the 200 | requirement in section 4 to “keep intact all notices”. 201 | * **c)** You must license the entire work, as a whole, under this License to anyone who 202 | comes into possession of a copy. This License will therefore apply, along with any 203 | applicable section 7 additional terms, to the whole of the work, and all its parts, 204 | regardless of how they are packaged. This License gives no permission to license the 205 | work in any other way, but it does not invalidate such permission if you have 206 | separately received it. 207 | * **d)** If the work has interactive user interfaces, each must display Appropriate Legal 208 | Notices; however, if the Program has interactive interfaces that do not display 209 | Appropriate Legal Notices, your work need not make them do so. 210 | 211 | A compilation of a covered work with other separate and independent works, which are 212 | not by their nature extensions of the covered work, and which are not combined with 213 | it such as to form a larger program, in or on a volume of a storage or distribution 214 | medium, is called an “aggregate” if the compilation and its resulting 215 | copyright are not used to limit the access or legal rights of the compilation's users 216 | beyond what the individual works permit. Inclusion of a covered work in an aggregate 217 | does not cause this License to apply to the other parts of the aggregate. 218 | 219 | ### 6. Conveying Non-Source Forms 220 | 221 | You may convey a covered work in object code form under the terms of sections 4 and 222 | 5, provided that you also convey the machine-readable Corresponding Source under the 223 | terms of this License, in one of these ways: 224 | 225 | * **a)** Convey the object code in, or embodied in, a physical product (including a 226 | physical distribution medium), accompanied by the Corresponding Source fixed on a 227 | durable physical medium customarily used for software interchange. 228 | * **b)** Convey the object code in, or embodied in, a physical product (including a 229 | physical distribution medium), accompanied by a written offer, valid for at least 230 | three years and valid for as long as you offer spare parts or customer support for 231 | that product model, to give anyone who possesses the object code either **(1)** a copy of 232 | the Corresponding Source for all the software in the product that is covered by this 233 | License, on a durable physical medium customarily used for software interchange, for 234 | a price no more than your reasonable cost of physically performing this conveying of 235 | source, or **(2)** access to copy the Corresponding Source from a network server at no 236 | charge. 237 | * **c)** Convey individual copies of the object code with a copy of the written offer to 238 | provide the Corresponding Source. This alternative is allowed only occasionally and 239 | noncommercially, and only if you received the object code with such an offer, in 240 | accord with subsection 6b. 241 | * **d)** Convey the object code by offering access from a designated place (gratis or for 242 | a charge), and offer equivalent access to the Corresponding Source in the same way 243 | through the same place at no further charge. You need not require recipients to copy 244 | the Corresponding Source along with the object code. If the place to copy the object 245 | code is a network server, the Corresponding Source may be on a different server 246 | (operated by you or a third party) that supports equivalent copying facilities, 247 | provided you maintain clear directions next to the object code saying where to find 248 | the Corresponding Source. Regardless of what server hosts the Corresponding Source, 249 | you remain obligated to ensure that it is available for as long as needed to satisfy 250 | these requirements. 251 | * **e)** Convey the object code using peer-to-peer transmission, provided you inform 252 | other peers where the object code and Corresponding Source of the work are being 253 | offered to the general public at no charge under subsection 6d. 254 | 255 | A separable portion of the object code, whose source code is excluded from the 256 | Corresponding Source as a System Library, need not be included in conveying the 257 | object code work. 258 | 259 | A “User Product” is either **(1)** a “consumer product”, which 260 | means any tangible personal property which is normally used for personal, family, or 261 | household purposes, or **(2)** anything designed or sold for incorporation into a 262 | dwelling. In determining whether a product is a consumer product, doubtful cases 263 | shall be resolved in favor of coverage. For a particular product received by a 264 | particular user, “normally used” refers to a typical or common use of 265 | that class of product, regardless of the status of the particular user or of the way 266 | in which the particular user actually uses, or expects or is expected to use, the 267 | product. A product is a consumer product regardless of whether the product has 268 | substantial commercial, industrial or non-consumer uses, unless such uses represent 269 | the only significant mode of use of the product. 270 | 271 | “Installation Information” for a User Product means any methods, 272 | procedures, authorization keys, or other information required to install and execute 273 | modified versions of a covered work in that User Product from a modified version of 274 | its Corresponding Source. The information must suffice to ensure that the continued 275 | functioning of the modified object code is in no case prevented or interfered with 276 | solely because modification has been made. 277 | 278 | If you convey an object code work under this section in, or with, or specifically for 279 | use in, a User Product, and the conveying occurs as part of a transaction in which 280 | the right of possession and use of the User Product is transferred to the recipient 281 | in perpetuity or for a fixed term (regardless of how the transaction is 282 | characterized), the Corresponding Source conveyed under this section must be 283 | accompanied by the Installation Information. But this requirement does not apply if 284 | neither you nor any third party retains the ability to install modified object code 285 | on the User Product (for example, the work has been installed in ROM). 286 | 287 | The requirement to provide Installation Information does not include a requirement to 288 | continue to provide support service, warranty, or updates for a work that has been 289 | modified or installed by the recipient, or for the User Product in which it has been 290 | modified or installed. Access to a network may be denied when the modification itself 291 | materially and adversely affects the operation of the network or violates the rules 292 | and protocols for communication across the network. 293 | 294 | Corresponding Source conveyed, and Installation Information provided, in accord with 295 | this section must be in a format that is publicly documented (and with an 296 | implementation available to the public in source code form), and must require no 297 | special password or key for unpacking, reading or copying. 298 | 299 | ### 7. Additional Terms 300 | 301 | “Additional permissions” are terms that supplement the terms of this 302 | License by making exceptions from one or more of its conditions. Additional 303 | permissions that are applicable to the entire Program shall be treated as though they 304 | were included in this License, to the extent that they are valid under applicable 305 | law. If additional permissions apply only to part of the Program, that part may be 306 | used separately under those permissions, but the entire Program remains governed by 307 | this License without regard to the additional permissions. 308 | 309 | When you convey a copy of a covered work, you may at your option remove any 310 | additional permissions from that copy, or from any part of it. (Additional 311 | permissions may be written to require their own removal in certain cases when you 312 | modify the work.) You may place additional permissions on material, added by you to a 313 | covered work, for which you have or can give appropriate copyright permission. 314 | 315 | Notwithstanding any other provision of this License, for material you add to a 316 | covered work, you may (if authorized by the copyright holders of that material) 317 | supplement the terms of this License with terms: 318 | 319 | * **a)** Disclaiming warranty or limiting liability differently from the terms of 320 | sections 15 and 16 of this License; or 321 | * **b)** Requiring preservation of specified reasonable legal notices or author 322 | attributions in that material or in the Appropriate Legal Notices displayed by works 323 | containing it; or 324 | * **c)** Prohibiting misrepresentation of the origin of that material, or requiring that 325 | modified versions of such material be marked in reasonable ways as different from the 326 | original version; or 327 | * **d)** Limiting the use for publicity purposes of names of licensors or authors of the 328 | material; or 329 | * **e)** Declining to grant rights under trademark law for use of some trade names, 330 | trademarks, or service marks; or 331 | * **f)** Requiring indemnification of licensors and authors of that material by anyone 332 | who conveys the material (or modified versions of it) with contractual assumptions of 333 | liability to the recipient, for any liability that these contractual assumptions 334 | directly impose on those licensors and authors. 335 | 336 | All other non-permissive additional terms are considered “further 337 | restrictions” within the meaning of section 10. If the Program as you received 338 | it, or any part of it, contains a notice stating that it is governed by this License 339 | along with a term that is a further restriction, you may remove that term. If a 340 | license document contains a further restriction but permits relicensing or conveying 341 | under this License, you may add to a covered work material governed by the terms of 342 | that license document, provided that the further restriction does not survive such 343 | relicensing or conveying. 344 | 345 | If you add terms to a covered work in accord with this section, you must place, in 346 | the relevant source files, a statement of the additional terms that apply to those 347 | files, or a notice indicating where to find the applicable terms. 348 | 349 | Additional terms, permissive or non-permissive, may be stated in the form of a 350 | separately written license, or stated as exceptions; the above requirements apply 351 | either way. 352 | 353 | ### 8. Termination 354 | 355 | You may not propagate or modify a covered work except as expressly provided under 356 | this License. Any attempt otherwise to propagate or modify it is void, and will 357 | automatically terminate your rights under this License (including any patent licenses 358 | granted under the third paragraph of section 11). 359 | 360 | However, if you cease all violation of this License, then your license from a 361 | particular copyright holder is reinstated **(a)** provisionally, unless and until the 362 | copyright holder explicitly and finally terminates your license, and **(b)** permanently, 363 | if the copyright holder fails to notify you of the violation by some reasonable means 364 | prior to 60 days after the cessation. 365 | 366 | Moreover, your license from a particular copyright holder is reinstated permanently 367 | if the copyright holder notifies you of the violation by some reasonable means, this 368 | is the first time you have received notice of violation of this License (for any 369 | work) from that copyright holder, and you cure the violation prior to 30 days after 370 | your receipt of the notice. 371 | 372 | Termination of your rights under this section does not terminate the licenses of 373 | parties who have received copies or rights from you under this License. If your 374 | rights have been terminated and not permanently reinstated, you do not qualify to 375 | receive new licenses for the same material under section 10. 376 | 377 | ### 9. Acceptance Not Required for Having Copies 378 | 379 | You are not required to accept this License in order to receive or run a copy of the 380 | Program. Ancillary propagation of a covered work occurring solely as a consequence of 381 | using peer-to-peer transmission to receive a copy likewise does not require 382 | acceptance. However, nothing other than this License grants you permission to 383 | propagate or modify any covered work. These actions infringe copyright if you do not 384 | accept this License. Therefore, by modifying or propagating a covered work, you 385 | indicate your acceptance of this License to do so. 386 | 387 | ### 10. Automatic Licensing of Downstream Recipients 388 | 389 | Each time you convey a covered work, the recipient automatically receives a license 390 | from the original licensors, to run, modify and propagate that work, subject to this 391 | License. You are not responsible for enforcing compliance by third parties with this 392 | License. 393 | 394 | An “entity transaction” is a transaction transferring control of an 395 | organization, or substantially all assets of one, or subdividing an organization, or 396 | merging organizations. If propagation of a covered work results from an entity 397 | transaction, each party to that transaction who receives a copy of the work also 398 | receives whatever licenses to the work the party's predecessor in interest had or 399 | could give under the previous paragraph, plus a right to possession of the 400 | Corresponding Source of the work from the predecessor in interest, if the predecessor 401 | has it or can get it with reasonable efforts. 402 | 403 | You may not impose any further restrictions on the exercise of the rights granted or 404 | affirmed under this License. For example, you may not impose a license fee, royalty, 405 | or other charge for exercise of rights granted under this License, and you may not 406 | initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging 407 | that any patent claim is infringed by making, using, selling, offering for sale, or 408 | importing the Program or any portion of it. 409 | 410 | ### 11. Patents 411 | 412 | A “contributor” is a copyright holder who authorizes use under this 413 | License of the Program or a work on which the Program is based. The work thus 414 | licensed is called the contributor's “contributor version”. 415 | 416 | A contributor's “essential patent claims” are all patent claims owned or 417 | controlled by the contributor, whether already acquired or hereafter acquired, that 418 | would be infringed by some manner, permitted by this License, of making, using, or 419 | selling its contributor version, but do not include claims that would be infringed 420 | only as a consequence of further modification of the contributor version. For 421 | purposes of this definition, “control” includes the right to grant patent 422 | sublicenses in a manner consistent with the requirements of this License. 423 | 424 | Each contributor grants you a non-exclusive, worldwide, royalty-free patent license 425 | under the contributor's essential patent claims, to make, use, sell, offer for sale, 426 | import and otherwise run, modify and propagate the contents of its contributor 427 | version. 428 | 429 | In the following three paragraphs, a “patent license” is any express 430 | agreement or commitment, however denominated, not to enforce a patent (such as an 431 | express permission to practice a patent or covenant not to sue for patent 432 | infringement). To “grant” such a patent license to a party means to make 433 | such an agreement or commitment not to enforce a patent against the party. 434 | 435 | If you convey a covered work, knowingly relying on a patent license, and the 436 | Corresponding Source of the work is not available for anyone to copy, free of charge 437 | and under the terms of this License, through a publicly available network server or 438 | other readily accessible means, then you must either **(1)** cause the Corresponding 439 | Source to be so available, or **(2)** arrange to deprive yourself of the benefit of the 440 | patent license for this particular work, or **(3)** arrange, in a manner consistent with 441 | the requirements of this License, to extend the patent license to downstream 442 | recipients. “Knowingly relying” means you have actual knowledge that, but 443 | for the patent license, your conveying the covered work in a country, or your 444 | recipient's use of the covered work in a country, would infringe one or more 445 | identifiable patents in that country that you have reason to believe are valid. 446 | 447 | If, pursuant to or in connection with a single transaction or arrangement, you 448 | convey, or propagate by procuring conveyance of, a covered work, and grant a patent 449 | license to some of the parties receiving the covered work authorizing them to use, 450 | propagate, modify or convey a specific copy of the covered work, then the patent 451 | license you grant is automatically extended to all recipients of the covered work and 452 | works based on it. 453 | 454 | A patent license is “discriminatory” if it does not include within the 455 | scope of its coverage, prohibits the exercise of, or is conditioned on the 456 | non-exercise of one or more of the rights that are specifically granted under this 457 | License. You may not convey a covered work if you are a party to an arrangement with 458 | a third party that is in the business of distributing software, under which you make 459 | payment to the third party based on the extent of your activity of conveying the 460 | work, and under which the third party grants, to any of the parties who would receive 461 | the covered work from you, a discriminatory patent license **(a)** in connection with 462 | copies of the covered work conveyed by you (or copies made from those copies), or **(b)** 463 | primarily for and in connection with specific products or compilations that contain 464 | the covered work, unless you entered into that arrangement, or that patent license 465 | was granted, prior to 28 March 2007. 466 | 467 | Nothing in this License shall be construed as excluding or limiting any implied 468 | license or other defenses to infringement that may otherwise be available to you 469 | under applicable patent law. 470 | 471 | ### 12. No Surrender of Others' Freedom 472 | 473 | If conditions are imposed on you (whether by court order, agreement or otherwise) 474 | that contradict the conditions of this License, they do not excuse you from the 475 | conditions of this License. If you cannot convey a covered work so as to satisfy 476 | simultaneously your obligations under this License and any other pertinent 477 | obligations, then as a consequence you may not convey it at all. For example, if you 478 | agree to terms that obligate you to collect a royalty for further conveying from 479 | those to whom you convey the Program, the only way you could satisfy both those terms 480 | and this License would be to refrain entirely from conveying the Program. 481 | 482 | ### 13. Use with the GNU Affero General Public License 483 | 484 | Notwithstanding any other provision of this License, you have permission to link or 485 | combine any covered work with a work licensed under version 3 of the GNU Affero 486 | General Public License into a single combined work, and to convey the resulting work. 487 | The terms of this License will continue to apply to the part which is the covered 488 | work, but the special requirements of the GNU Affero General Public License, section 489 | 13, concerning interaction through a network will apply to the combination as such. 490 | 491 | ### 14. Revised Versions of this License 492 | 493 | The Free Software Foundation may publish revised and/or new versions of the GNU 494 | General Public License from time to time. Such new versions will be similar in spirit 495 | to the present version, but may differ in detail to address new problems or concerns. 496 | 497 | Each version is given a distinguishing version number. If the Program specifies that 498 | a certain numbered version of the GNU General Public License “or any later 499 | version” applies to it, you have the option of following the terms and 500 | conditions either of that numbered version or of any later version published by the 501 | Free Software Foundation. If the Program does not specify a version number of the GNU 502 | General Public License, you may choose any version ever published by the Free 503 | Software Foundation. 504 | 505 | If the Program specifies that a proxy can decide which future versions of the GNU 506 | General Public License can be used, that proxy's public statement of acceptance of a 507 | version permanently authorizes you to choose that version for the Program. 508 | 509 | Later license versions may give you additional or different permissions. However, no 510 | additional obligations are imposed on any author or copyright holder as a result of 511 | your choosing to follow a later version. 512 | 513 | ### 15. Disclaimer of Warranty 514 | 515 | THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. 516 | EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES 517 | PROVIDE THE PROGRAM “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER 518 | EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 519 | MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE 520 | QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE 521 | DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 522 | 523 | ### 16. Limitation of Liability 524 | 525 | IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY 526 | COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS 527 | PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, 528 | INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE 529 | PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE 530 | OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE 531 | WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE 532 | POSSIBILITY OF SUCH DAMAGES. 533 | 534 | ### 17. Interpretation of Sections 15 and 16 535 | 536 | If the disclaimer of warranty and limitation of liability provided above cannot be 537 | given local legal effect according to their terms, reviewing courts shall apply local 538 | law that most closely approximates an absolute waiver of all civil liability in 539 | connection with the Program, unless a warranty or assumption of liability accompanies 540 | a copy of the Program in return for a fee. 541 | 542 | _END OF TERMS AND CONDITIONS_ 543 | 544 | ## How to Apply These Terms to Your New Programs 545 | 546 | If you develop a new program, and you want it to be of the greatest possible use to 547 | the public, the best way to achieve this is to make it free software which everyone 548 | can redistribute and change under these terms. 549 | 550 | To do so, attach the following notices to the program. It is safest to attach them 551 | to the start of each source file to most effectively state the exclusion of warranty; 552 | and each file should have at least the “copyright” line and a pointer to 553 | where the full notice is found. 554 | 555 | 556 | Copyright (C) 557 | 558 | This program is free software: you can redistribute it and/or modify 559 | it under the terms of the GNU General Public License as published by 560 | the Free Software Foundation, either version 3 of the License, or 561 | (at your option) any later version. 562 | 563 | This program is distributed in the hope that it will be useful, 564 | but WITHOUT ANY WARRANTY; without even the implied warranty of 565 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 566 | GNU General Public License for more details. 567 | 568 | You should have received a copy of the GNU General Public License 569 | along with this program. If not, see . 570 | 571 | Also add information on how to contact you by electronic and paper mail. 572 | 573 | If the program does terminal interaction, make it output a short notice like this 574 | when it starts in an interactive mode: 575 | 576 | Copyright (C) 577 | This program comes with ABSOLUTELY NO WARRANTY; for details type 'show w'. 578 | This is free software, and you are welcome to redistribute it 579 | under certain conditions; type 'show c' for details. 580 | 581 | The hypothetical commands `show w` and `show c` should show the appropriate parts of 582 | the General Public License. Of course, your program's commands might be different; 583 | for a GUI interface, you would use an “about box”. 584 | 585 | You should also get your employer (if you work as a programmer) or school, if any, to 586 | sign a “copyright disclaimer” for the program, if necessary. For more 587 | information on this, and how to apply and follow the GNU GPL, see 588 | <>. 589 | 590 | The GNU General Public License does not permit incorporating your program into 591 | proprietary programs. If your program is a subroutine library, you may consider it 592 | more useful to permit linking proprietary applications with the library. If this is 593 | what you want to do, use the GNU Lesser General Public License instead of this 594 | License. But first, please read 595 | <>. 596 | -------------------------------------------------------------------------------- /NAMESPACE: -------------------------------------------------------------------------------- 1 | # Generated by roxygen2: do not edit by hand 2 | 3 | S3method(print,converters_fn) 4 | S3method(print,defaults_fn) 5 | S3method(print,errors_fn) 6 | export(Character) 7 | export(Dataframe) 8 | export(Date) 9 | export(Function) 10 | export(Integer) 11 | export(List) 12 | export(Numeric) 13 | export(Posixct) 14 | export(Posixlt) 15 | export(com) 16 | export(com_serve) 17 | export(create_type) 18 | export(example) 19 | export(useCommunicate) 20 | importFrom(htmltools,htmlDependency) 21 | importFrom(jsonlite,fromJSON) 22 | importFrom(jsonlite,toJSON) 23 | importFrom(shiny,httpResponse) 24 | importFrom(shiny,observe) 25 | importFrom(shiny,parseQueryString) 26 | -------------------------------------------------------------------------------- /NEWS.md: -------------------------------------------------------------------------------- 1 | # communicate (development version) 2 | 3 | ## 0.0.2 4 | 5 | - Deprecate `com_serve`, it's no longer needed. 6 | - Rewritten in Typescript. 7 | 8 | ## 0.0.1 9 | 10 | * Initial version 11 | -------------------------------------------------------------------------------- /R/aaa.R: -------------------------------------------------------------------------------- 1 | # create environment for storing handlers, schemas, and defaults 2 | env <- new.env(hash = TRUE) 3 | 4 | # initialise environment 5 | env$prefix <- NULL 6 | env$handlers <- list() 7 | env$schemas <- list() 8 | env$defaults <- list() 9 | env$errors <- list() 10 | env$types <- list() 11 | env$types_sent <- FALSE 12 | -------------------------------------------------------------------------------- /R/core.R: -------------------------------------------------------------------------------- 1 | #' Get or create prefix 2 | #' 3 | #' Get or create the prefix. 4 | #' 5 | #' @details This ensures unique names. 6 | #' 7 | #' @keywords internal 8 | get_prefix <- function() { 9 | if(!is.null(env$prefix)) 10 | return(env$prefix) 11 | 12 | env$prefix <- make_id() 13 | 14 | return(env$prefix) 15 | } 16 | 17 | #' Communication 18 | #' 19 | #' Communication handler. 20 | #' 21 | #' @param id ID of communication handler. 22 | #' @param handler Callback function. 23 | #' 24 | #' @importFrom shiny observe 25 | #' 26 | #' @export 27 | com <- \(id, handler) { 28 | env$handlers[[id]] <- handler 29 | env$schemas[[id]] <- list() 30 | env$defaults[[id]] <- list() 31 | 32 | on.exit( 33 | com_send(id), 34 | add = TRUE 35 | ) 36 | 37 | fn <- \(...){ 38 | check_args_match(env$handlers[[id]], ...) 39 | env$schemas[[id]] <- list(...) 40 | 41 | on.exit( 42 | com_send(id), 43 | add = TRUE 44 | ) 45 | 46 | fn <- \(...) { 47 | # defaults may be reactives 48 | check_args_match(env$handlers[[id]], ...) 49 | env$defaults[[id]] <- list(...) 50 | 51 | on.exit( 52 | com_send(id), 53 | add = TRUE 54 | ) 55 | 56 | fn <- \(handler, ...){ 57 | if(!is.function(handler)) 58 | stop("Handler must be a function") 59 | 60 | if(length(methods::formalArgs(handler)) < 1L) 61 | stop("Handler must have at least one argument") 62 | 63 | env$errors[[id]] <- handler 64 | } |> 65 | construct_errors_fn() |> 66 | invisible() 67 | } 68 | 69 | fn |> 70 | construct_defaults_fn() |> 71 | invisible() 72 | } 73 | 74 | fn |> 75 | construct_converters_fn() |> 76 | invisible() 77 | } 78 | 79 | #' Constructors 80 | #' 81 | #' Adds classes to returned function to allow print method. 82 | #' 83 | #' @name constructors 84 | #' @keywords internal 85 | construct_defaults_fn <- \(fn) { 86 | structure( 87 | fn, 88 | class = c("defaults_fn", class(fn)) 89 | ) 90 | } 91 | 92 | #' @rdname constructors 93 | #' @keywords internal 94 | construct_converters_fn <- \(fn) { 95 | structure( 96 | fn, 97 | class = c("converters_fn", class(fn)) 98 | ) 99 | } 100 | 101 | #' @rdname constructors 102 | #' @keywords internal 103 | construct_errors_fn <- \(fn) { 104 | structure( 105 | fn, 106 | class = c("errors_fn", class(fn)) 107 | ) 108 | } 109 | 110 | #' @export 111 | print.defaults_fn <- \(x, ...) { 112 | cat("Add defaults, e.g.: (x = 1)\n") 113 | } 114 | 115 | #' @export 116 | print.converters_fn <- \(x, ...) { 117 | cat("Add converters, e.g.: (x = as_dataframe)\n") 118 | } 119 | 120 | #' @export 121 | print.errors_fn <- \(x, ...) { 122 | cat("Add error handlers, e.g.: (error_handler_fn)\n") 123 | } 124 | 125 | #' Communicate 126 | #' 127 | #' Serve communication channels. 128 | #' 129 | #' @param session Shiny session. 130 | #' 131 | #' @export 132 | com_serve <- \(session = shiny::getDefaultReactiveDomain()) { 133 | .Deprecated("com", msg = "this function is deprecated, com suffices") 134 | handlers <- env$handlers |> names() 135 | 136 | lapply(handlers, \(name) { 137 | shiny::observe({ 138 | fn <- \(data, req) { 139 | args <- parse_query_string(req$QUERY_STRING) |> 140 | parse_args(env$schemas[[name]]) 141 | 142 | args <- utils::modifyList(env$defaults[[name]], args) 143 | 144 | results <- do.call( 145 | env$handlers[[name]], 146 | args 147 | ) |> 148 | tryCatch(error = \(e) e) 149 | 150 | status <- 200L 151 | if(inherits(results, "error")) { 152 | status <- 400L 153 | results <- list( 154 | error = results$message, 155 | id = results$id 156 | ) 157 | 158 | if(env$errors[[name]]){ 159 | env$errors[[name]](results) 160 | } 161 | } 162 | 163 | http_response_json(results, status) 164 | } 165 | 166 | path <- session$registerDataObj( 167 | name, 168 | env$defaults[[name]], 169 | fn 170 | ) 171 | 172 | session$sendCustomMessage( 173 | type = "communicate-set-path", 174 | message = list( 175 | id = name, 176 | path = path, 177 | args = get_args(env$handlers[[name]], env$schemas[[name]]) 178 | ) 179 | ) 180 | }) 181 | }) 182 | } 183 | 184 | #' @keywords internal 185 | com_send <- \(name, session = shiny::getDefaultReactiveDomain()) { 186 | fn <- \(data, req) { 187 | args <- parse_query_string(req$QUERY_STRING) |> 188 | parse_args(env$schemas[[name]]) 189 | 190 | args <- utils::modifyList(env$defaults[[name]], args) 191 | 192 | results <- do.call( 193 | env$handlers[[name]], 194 | args 195 | ) |> 196 | tryCatch(error = \(e) e) 197 | 198 | status <- 200L 199 | if(inherits(results, "error")) { 200 | status <- 400L 201 | if(length(env$errors[[name]])){ 202 | env$errors[[name]](results) 203 | } 204 | 205 | results <- list( 206 | error = results$message, 207 | id = results$id 208 | ) 209 | } 210 | 211 | http_response_json(results, status) 212 | } 213 | 214 | path <- session$registerDataObj( 215 | name, 216 | env$defaults[[name]], 217 | fn 218 | ) 219 | 220 | payload = list( 221 | id = name, 222 | path = path, 223 | args = get_args(env$handlers[[name]], env$schemas[[name]]) 224 | ) 225 | 226 | if(!env$types_sent && length(env$types) > 0L) { 227 | payload$types <- env$types |> lapply(\(type) { 228 | type$r_converter <- NULL 229 | return(type) 230 | }) 231 | env$types_sent <- TRUE 232 | } 233 | 234 | session$sendCustomMessage( 235 | type = "communicate-set-path", 236 | message = payload 237 | ) 238 | } 239 | 240 | #' HTTP response JSON 241 | #' 242 | #' Sends a JSON response. 243 | #' 244 | #' @param status HTTP status code. 245 | #' @param body Body of response. 246 | #' 247 | #' @importFrom jsonlite toJSON 248 | #' @importFrom shiny httpResponse 249 | #' 250 | #' @keywords internal 251 | http_response_json <- \(body, status = 200){ 252 | httpResponse( 253 | status = status, 254 | content_type = "application/json", 255 | content = body |> 256 | toJSON( 257 | dataframe = "rows", 258 | auto_unbox = TRUE 259 | ) 260 | ) 261 | } 262 | -------------------------------------------------------------------------------- /R/dependency.R: -------------------------------------------------------------------------------- 1 | #' Dependencies for communicate 2 | #' 3 | #' Dependencies for communicate, to place withing the Shiny UI. 4 | #' 5 | #' @importFrom htmltools htmlDependency 6 | #' 7 | #' @export 8 | useCommunicate <- \() { # nolint 9 | htmlDependency( 10 | "communicate", 11 | version = utils::packageVersion("communicate"), 12 | src = "assets", 13 | package = "communicate", 14 | script = "index.js" 15 | ) 16 | } 17 | -------------------------------------------------------------------------------- /R/example.R: -------------------------------------------------------------------------------- 1 | #' Example 2 | #' 3 | #' Run example 4 | #' 5 | #' @export 6 | example <- function(){ 7 | file <- system.file( 8 | "example/app.R", 9 | package = "communicate", 10 | mustWork = TRUE 11 | ) 12 | 13 | file |> 14 | readLines() |> 15 | suppressWarnings() |> 16 | cat("\n", sep = "\n") 17 | 18 | shiny::shinyAppDir( 19 | system.file( 20 | "example", 21 | package = "communicate", 22 | mustWork = TRUE 23 | ) 24 | ) 25 | } 26 | -------------------------------------------------------------------------------- /R/query-string.R: -------------------------------------------------------------------------------- 1 | #' Parse a query string into a list 2 | #' 3 | #' Parses the query string from the request into a list. 4 | #' 5 | #' @param str Query string. 6 | #' 7 | #' @importFrom shiny parseQueryString 8 | #' 9 | #' @keywords internal 10 | parse_query_string <- \(str){ 11 | parseQueryString(str) 12 | } 13 | 14 | #' Get Arguments from Query String 15 | #' 16 | #' Get arguments from query string. 17 | #' 18 | #' @param qs Query string. 19 | #' @param schema Schema. 20 | #' 21 | #' @keywords internal 22 | args_from_query_string <- \(qs, schema){ 23 | qs <- parse_query_string(qs) 24 | 25 | schema_vars <- schema |> names() 26 | qs_names <- qs |> names() 27 | 28 | schema_vars <- schema_vars |> intersect(qs_names) 29 | 30 | args <- schema_vars |> 31 | lapply(\(name) { 32 | schema[[name]](qs[[name]]) 33 | }) 34 | 35 | names(args) <- schema_vars 36 | return(args) 37 | } 38 | -------------------------------------------------------------------------------- /R/types.R: -------------------------------------------------------------------------------- 1 | RESERVED_TYPES <- c( 2 | "character", 3 | "integer", 4 | "numeric", 5 | "date", 6 | "posix", 7 | "dataframe", 8 | "list", 9 | "function" 10 | ) 11 | 12 | #' Type Converters 13 | #' 14 | #' Type converters for convenience. 15 | #' 16 | #' @name converters. 17 | #' @export 18 | Character <- list( # nolint 19 | fn = as.character, 20 | type = "character" 21 | ) 22 | 23 | #' @rdname converters. 24 | #' @export 25 | Integer <- list( # nolint 26 | fn = as.integer, 27 | type = "integer" 28 | ) 29 | 30 | #' @rdname converters. 31 | #' @export 32 | Numeric <- list( # nolint 33 | fn = as.numeric, 34 | type = "numeric" 35 | ) 36 | 37 | #' @rdname converters. 38 | #' @export 39 | Date <- list( # nolint 40 | fn = as.Date, 41 | type = "date" 42 | ) 43 | 44 | #' @rdname converters. 45 | #' @export 46 | Posixct <- list( # nolint 47 | fn = as.POSIXct, 48 | type = "posix" 49 | ) 50 | 51 | #' @rdname converters. 52 | #' @export 53 | Posixlt <- list( # nolint 54 | fn = as.POSIXlt, 55 | type = "posix" 56 | ) 57 | 58 | #' @importFrom jsonlite fromJSON 59 | #' @rdname converters. 60 | #' @export 61 | Dataframe <- list( # nolint 62 | fn = fromJSON, 63 | type = "dataframe" 64 | ) 65 | 66 | #' @importFrom jsonlite fromJSON 67 | #' @rdname converters. 68 | #' @export 69 | List <- list( # nolint 70 | fn = \(x) fromJSON(x, simplifyMatrix = FALSE), 71 | type = "list" 72 | ) 73 | 74 | #' @importFrom jsonlite fromJSON 75 | #' @rdname converters. 76 | #' @export 77 | Function <- list( # nolint 78 | fn = as.character, 79 | type = "function" 80 | ) 81 | 82 | #' Parse Arguments 83 | #' 84 | #' Attempts to parse query string for embeds into R objects. 85 | #' 86 | #' @param args Parsed query string. 87 | #' @param converters List of converters. 88 | #' 89 | #' @keywords internal 90 | parse_args <- function(args = list(), converters = list()) { # nolint 91 | args$w <- NULL 92 | args$nonce <- NULL 93 | 94 | parsed <- lapply(seq_along(args), \(index) { 95 | arg <- args[[index]] 96 | nms <- names(args)[index] 97 | converter <- converters[[nms]] 98 | 99 | if(is.function(converter$fn)) 100 | return(converter$fn(arg)) 101 | 102 | date <- tryCatch(as.Date(arg), error = \(e) NULL) 103 | 104 | if(!is.null(date)) 105 | return(date) 106 | 107 | dttm <- tryCatch(as.POSIXct(arg), error = \(e) NULL) 108 | 109 | if(!is.null(dttm)) 110 | return(dttm) 111 | 112 | nbr <- as.integer(arg) |> 113 | suppressWarnings() 114 | 115 | if(!is.na(nbr)) 116 | return(nbr) 117 | 118 | nbr <- as.numeric(arg) |> 119 | suppressWarnings() 120 | 121 | if(!is.na(nbr)) 122 | return(nbr) 123 | 124 | if(arg %in% c("TRUE", "true")) 125 | return(TRUE) 126 | 127 | if(arg %in% c("FALSE", "false")) 128 | return(FALSE) 129 | 130 | # it must be an array or an object 131 | if(grepl("\\[", arg)) 132 | return(fromJSON(arg, simplifyMatrix = TRUE)) 133 | 134 | return(arg) 135 | }) 136 | 137 | names(parsed) <- names(args) 138 | 139 | return(parsed) 140 | } 141 | 142 | #' Get arguments from function 143 | #' 144 | #' Get arguments from handler. 145 | #' 146 | #' @param handler Function handler. 147 | #' @param schemas List of schemas. 148 | #' 149 | #' @keywords internal 150 | get_args <- \(handler, schemas){ 151 | args <- methods::formalArgs(handler) 152 | 153 | args |> 154 | lapply(\(name) { 155 | schema <- schemas[[name]] 156 | 157 | arg <- list( 158 | name = name, 159 | type = NULL 160 | ) 161 | 162 | if(length(schema) > 0) 163 | arg$type <- schema$type 164 | 165 | return(arg) 166 | }) 167 | } 168 | 169 | #' Checks that arguments passed matched that in function 170 | #' 171 | #' @param callback Callback function to check against. 172 | #' @param ... Arguments. 173 | #' 174 | #' @keywords .Internal 175 | check_args_match <- \(callback, ...) { 176 | args <- list(...) 177 | 178 | if(length(args) == 0L) 179 | return() 180 | 181 | args <- names(args) 182 | cb_args <- methods::formalArgs(callback) 183 | 184 | if(length(cb_args) == 0L) 185 | stop("handler takes no argument", call. = FALSE) 186 | 187 | extra_args <- args[!(args %in% cb_args)] 188 | 189 | if(length(extra_args) == 0L) 190 | return() 191 | 192 | extra_args_str <- paste(extra_args, collapse = ", ") 193 | 194 | sprintf( 195 | "arguments not found in handler: %s", 196 | extra_args_str 197 | ) |> 198 | stop(call. = FALSE) 199 | } 200 | 201 | #' Create type 202 | #' 203 | #' Create a new type with its associated checker and converter. 204 | #' 205 | #' @param r_converter R converter function to transform the value. 206 | #' received from the server to the desired type in R. 207 | #' @param js_checker JavaScript checker function to check if the value 208 | #' received from the client is of the desired type. 209 | #' @param name Name of the type. 210 | #' 211 | #' @export 212 | create_type <- function( 213 | r_converter, 214 | js_checker = NULL, 215 | name = NULL 216 | ){ 217 | if(missing(r_converter)) stop("missing `r_converter`") 218 | 219 | if(is.null(name)) 220 | name <- letters |> 221 | c(1:9) |> 222 | sample() |> 223 | (\(x) paste0(x, collapse = ""))() 224 | 225 | if(name %in% RESERVED_TYPES) 226 | stop("this `name` is reserved") 227 | 228 | env$types <- append( 229 | env$types, 230 | list( 231 | list( 232 | type = name, 233 | r_converter = r_converter, 234 | js_checker = js_checker 235 | ) 236 | ) 237 | ) 238 | 239 | invisible( 240 | list( 241 | fn = r_converter, 242 | type = name 243 | ) 244 | ) 245 | } 246 | -------------------------------------------------------------------------------- /R/utils.R: -------------------------------------------------------------------------------- 1 | #' Make ID 2 | #' 3 | #' Generate a random ID. 4 | #' 5 | #' @param n Length of ID. 6 | #' 7 | #' @keywords internal 8 | make_id <- \(n = 32) { 9 | 1:9 |> 10 | c(letters) |> 11 | c(LETTERS) |> 12 | sample(n) |> 13 | paste0(collapse = "") 14 | } 15 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |
2 | 3 | 4 | 5 | Small framework to communicate between Shiny client and server via HTTP requests. 6 | Run `communicate::example()` for a short demo. 7 | 8 | [Site](https://communicate.opifex.org/) 9 | 10 |
11 | 12 | ## Installation 13 | 14 | ```r 15 | # install.packages("remotes") 16 | remotes::install_github("devOpifex/communicate") 17 | ``` 18 | 19 | ## How it works 20 | 21 | Create a shiny application and "commincation channels." 22 | Add callback functions with `com`. 23 | 24 | ```r 25 | library(shiny) 26 | library(communicate) 27 | 28 | add <- \(x){ 29 | x + 2 30 | } 31 | 32 | ui <- fluidPage( 33 | h1("Hello") 34 | ) 35 | 36 | server <- \(input, output, session){ 37 | com("add", add) 38 | } 39 | 40 | shinyApp(ui, server) 41 | ``` 42 | 43 | Then use the JavaScript library to communicate. 44 | 45 | ```r 46 | library(shiny) 47 | library(communicate) 48 | 49 | add <- \(x){ 50 | x + 2 51 | } 52 | 53 | script <- " 54 | $('#btn').on('click', () => { 55 | communicate.com('add', {x: 1}) 56 | .then(res => alert(`equals: ${res}`)); 57 | }) 58 | " 59 | 60 | ui <- fluidPage( 61 | # import dependencies 62 | useCommunicate(), 63 | h1("Hello"), 64 | tags$a("Communicate", id = "btn"), 65 | tags$script(HTML(script)) 66 | ) 67 | 68 | server <- \(input, output, session){ 69 | com("add", add) 70 | } 71 | 72 | shinyApp(ui, server) 73 | ``` 74 | 75 | ### Types 76 | 77 | Though optional it is recommended to specify the types of the arguments 78 | of your callback function. This enables type conversion and type check when communicating from the 79 | client. 80 | 81 | Existing types: 82 | 83 | - `Character` 84 | - `Numeric` 85 | - `Integer` 86 | - `Date` 87 | - `Dataframe` 88 | - `Posixct` 89 | - `Posixlt` 90 | - `Character` 91 | - `List` 92 | - `Function` 93 | 94 | ```r 95 | library(shiny) 96 | library(communicate) 97 | 98 | add <- \(x){ 99 | x + 2 100 | } 101 | 102 | script <- " 103 | $('#btn').on('click', () => { 104 | communicate.com('add', {x: 1}) 105 | .then(res => alert(`equals: ${res}`)); 106 | }) 107 | " 108 | 109 | ui <- fluidPage( 110 | # import dependencies 111 | useCommunicate(), 112 | h1("Hello"), 113 | tags$a("Communicate", id = "btn"), 114 | tags$script(HTML(script)) 115 | ) 116 | 117 | server <- \(input, output, session){ 118 | com("add", add)(x = Integer) 119 | } 120 | 121 | shinyApp(ui, server) 122 | ``` 123 | 124 | ### Defaults 125 | 126 | You can also specifiy callback functions' argument defaults as done below. 127 | 128 | ```r 129 | library(shiny) 130 | library(communicate) 131 | 132 | add <- \(x, y){ 133 | x + y 134 | } 135 | 136 | script <- " 137 | $('#btn').on('click', () => { 138 | communicate.com('add', {x: 1}) 139 | .then(res => alert(`equals: ${res}`)); 140 | }) 141 | " 142 | 143 | ui <- fluidPage( 144 | # import dependencies 145 | useCommunicate(), 146 | h1("Hello"), 147 | tags$a("Communicate", id = "btn"), 148 | tags$script(HTML(script)) 149 | ) 150 | 151 | server <- \(input, output, session){ 152 | com("add", add)(x = Integer, y = Numeric)(y = 1.1) 153 | } 154 | 155 | shinyApp(ui, server) 156 | ``` 157 | 158 | ## JavaScript 159 | 160 | Accessible from `communicate`, functions: 161 | 162 | - `com` - communicate. 163 | - `hasCom` - check if communication channel registered. 164 | - `getCom` - get communication channel and its arguments. 165 | - `getComs` - get all communication channels registered. 166 | 167 | ## Dependency 168 | 169 | You import the dependency with `useCommunicate()`. 170 | Alternatively you can install the npm package, 171 | e.g.: if you use [packer](https://packer.john-coene.com/). 172 | 173 | ```bash 174 | npm install @devopifex/communicate 175 | ``` 176 | 177 | Or with packer: 178 | 179 | ```r 180 | packer::npm_install("@devopifex/communicate") 181 | ``` 182 | 183 | ### Usage 184 | 185 | ```js 186 | communicate.hasCom("add") 187 | 188 | communicate.getCom("add") 189 | 190 | communicate.com("add", {x: 1, y: 2}) 191 | .then(data => console.log(data)) 192 | .catch(error => console.error(error)) 193 | ``` 194 | 195 | -------------------------------------------------------------------------------- /docs/.nojekyll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devOpifex/communicate/de7f1a21ae99d2608385614f4af40c37426ec03a/docs/.nojekyll -------------------------------------------------------------------------------- /docs/README.md: -------------------------------------------------------------------------------- 1 | # Communicate 2 | 3 | Small framework to communicate between shiny client and server via HTTP requests. 4 | 5 | If you want an introduction to using such communication in shiny see the video 6 | below. 7 | This framework attempts to make this more robust and easier to setup. 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /docs/_coverpage.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | # communicate 0.1.2 6 | 7 | > Shiny client-server communication 8 | 9 | [GitHub](https://github.com/devOpifex/communicate) 10 | [Get Started](/r) 11 | 12 | ![color](#fff) 13 | -------------------------------------------------------------------------------- /docs/_sidebar.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | * [Home](/) 4 | * [R Package](r.md) 5 | * [JavaScript](js.md) 6 | * [Examples](examples.md) 7 | -------------------------------------------------------------------------------- /docs/examples.md: -------------------------------------------------------------------------------- 1 | # Examples 2 | 3 | Some examples below, you may also want to run `communicate::example()` for a short demo. 4 | 5 | ## Types 6 | 7 | Types are optional but are strongly recommended as it will 8 | make the usage of the framework much more robust. 9 | 10 | If types are missing it attempts to detect them but may 11 | fail for the more complex ones, below is an example of 12 | sending a data.frame to R. 13 | 14 | ```r 15 | library(shiny) 16 | library(communicate) 17 | 18 | add_df <- \(df){ 19 | df$x + 1L 20 | } 21 | 22 | script <- " 23 | $('#btn').on('click', (e) => { 24 | communicate.com('add', {df: [{x: 1}, {x: 2}]}) 25 | .then(res => console.info(`equals: ${res}`)) 26 | .catch(err => console.error(err)); 27 | }) 28 | " 29 | 30 | ui <- fluidPage( 31 | # import dependencies 32 | useCommunicate(), 33 | tags$a("Communicate", id = "btn"), 34 | tags$script(HTML(script)) 35 | ) 36 | 37 | server <- \(input, output, session){ 38 | com("add", add_df)(df = Dataframe) 39 | } 40 | 41 | shinyApp(ui, server) 42 | ``` 43 | 44 | ## Render 45 | 46 | Below we fetch a dataset and render it in a table. 47 | 48 | ```r 49 | library(shiny) 50 | library(communicate) 51 | 52 | get_dataset <- \(dataset){ 53 | data <- dataset |> get() 54 | 55 | list( 56 | header = names(data), 57 | data = data |> unname() 58 | ) 59 | } 60 | 61 | script <- " 62 | $('#btn').on('click', (e) => { 63 | const ds = $('#dataset').val(); 64 | communicate.com('get', {dataset: ds}) 65 | .then((res) => { 66 | const header = res.header.map(el => '' + el + '').join(''); 67 | const rows = res.data.map(row => { 68 | row = row.map(el => '' + el + '').join(''); 69 | return '' + row + ''; 70 | }).join(''); 71 | $('#output thead tr').html(header); 72 | $('#output tbody').html(rows); 73 | }) 74 | .catch(err => console.error(err)); 75 | }) 76 | " 77 | 78 | ui <- fluidPage( 79 | # import dependencies 80 | useCommunicate(), 81 | selectInput( 82 | "dataset", 83 | "Select Dataset", 84 | choices = c("cars", "mtcars", "iris") 85 | ), 86 | tags$a("Display table", id = "btn", class = "btn btn-primary"), 87 | tags$table( 88 | id = "output", 89 | class = "table", 90 | tags$thead(tags$tr()), 91 | tags$tbody() 92 | ), 93 | tags$script(HTML(script)) 94 | ) 95 | 96 | server <- \(input, output, session){ 97 | com("get", get_dataset)(dataset = Character)(dataset = "mtcars") 98 | } 99 | 100 | shinyApp(ui, server) 101 | ``` 102 | 103 | ## Server-side render 104 | 105 | This example implements a server-side rendered select input with 106 | [select2](https://select2.org) 107 | 108 | ```r 109 | library(shiny) 110 | library(communicate) 111 | 112 | search <- \(term, ...){ 113 | if(term == "") 114 | return(list(results = list())) 115 | 116 | # for case insensistive search 117 | term <- tolower(term) 118 | 119 | mtcars |> 120 | tibble::rownames_to_column() |> 121 | dplyr::filter(grepl(term, tolower(rowname))) |> 122 | dplyr::pull(rowname) |> 123 | head(10) |> # return max 10 results 124 | lapply(\(x) list(id = x, text = x)) |> 125 | (\(.) list(results = .))() 126 | } 127 | 128 | script <- " 129 | $(document).one('communicate:registered', (e) => { 130 | if(e.detail.id !== 'search') return; 131 | 132 | $('#models').select2({ 133 | ajax: { 134 | url: communicate.getCom('search').path, 135 | dataType: 'json' 136 | } 137 | }) 138 | }) 139 | " 140 | 141 | ui <- fluidPage( 142 | theme = bslib::bs_theme(version = 5), 143 | tags$head( 144 | tags$link( 145 | rel = "stylesheet", 146 | href = "https://cdn.jsdelivr.net/npm/select2@4.1.0-rc.0/dist/css/select2.min.css" 147 | ), 148 | tags$script( 149 | src = "https://cdn.jsdelivr.net/npm/select2@4.1.0-rc.0/dist/js/select2.min.js", 150 | type = "text/javascript" 151 | ) 152 | ), 153 | # import dependencies 154 | useCommunicate(), 155 | h1("Search a car model from mtcars"), 156 | tags$select( 157 | id = "models", 158 | style = "width: 100%;" 159 | ), 160 | tags$script(HTML(script)) 161 | ) 162 | 163 | server <- \(input, output, session){ 164 | com("search", search) 165 | } 166 | 167 | shinyApp(ui, server) 168 | ``` 169 | -------------------------------------------------------------------------------- /docs/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Document 6 | 7 | 8 | 9 | 13 | 14 | 15 |
16 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | -------------------------------------------------------------------------------- /docs/js.md: -------------------------------------------------------------------------------- 1 | # JavaScript Package 2 | 3 | ## Dependency 4 | 5 | You import the dependency with `useCommunicate()`. 6 | Alternatively you can install the npm package, 7 | e.g.: if you use [packer](https://packer.john-coene.com/). 8 | 9 | ```bash 10 | npm install @devopifex/communicate 11 | ``` 12 | 13 | Or with packer: 14 | 15 | ```r 16 | packer::npm_install("@devopifex/communicate") 17 | ``` 18 | 19 | ## Errors 20 | 21 | Ideally you'd want to catch errors as shown below, 22 | where the callback fails because there is no default for `x`. 23 | 24 | See the R Package page to see how to handle errors R-side. 25 | 26 | ```r 27 | library(shiny) 28 | library(communicate) 29 | 30 | add <- \(x, y){ 31 | x + y 32 | } 33 | 34 | script <- " 35 | $('#btn').on('click', () => { 36 | communicate.com('add') 37 | .then(res => alert(`equals: ${res}`)) 38 | .catch(e => alert(e)) 39 | }) 40 | " 41 | 42 | ui <- fluidPage( 43 | # import dependencies 44 | useCommunicate(), 45 | h1("Hello"), 46 | tags$a("Communicate", id = "btn"), 47 | tags$script(HTML(script)) 48 | ) 49 | 50 | server <- \(input, output, session){ 51 | com("add", add)(x = Integer, y = Numeric)(y = 1.1) 52 | } 53 | 54 | shinyApp(ui, server) 55 | ``` 56 | 57 | ## JavaScript 58 | 59 | Accessible from `communicate`, functions: 60 | 61 | - `com` - communicate. 62 | - `hasCom` - check if communication channel registered. 63 | - `getCom` - get communication channel and its arguments. 64 | - `getComs` - get all communication channels registered. 65 | 66 | ### Usage 67 | 68 | ```js 69 | communicate.hasCom("add") 70 | 71 | communicate.getCom("add") 72 | 73 | communicate.com("add", {x: 1, y: 2}) 74 | .then(data => console.log(data)) 75 | .catch(error => console.error(error)) 76 | ``` 77 | 78 | You can also listen to the `communicate:registered` event on the `document` for 79 | new communication channels registered. 80 | This is useful when willing to run things on load. 81 | 82 | ```js 83 | // this might fail because 84 | // it may run before the com is registered 85 | $(() => { 86 | communicate.com("add", {x: 1, y: 2}) 87 | .then(data => console.log(data)) 88 | .catch(error => console.error(error)) 89 | }); 90 | 91 | // will run when the channel is registered 92 | $(document).on("communicate:registered", (event) => { 93 | if(event.detail.id != "add") 94 | return; 95 | 96 | communicate.com("add", {x: 1, y: 2}) 97 | .then(data => console.log(data)) 98 | .catch(error => console.error(error)) 99 | }) 100 | ``` 101 | 102 | Note that reactives re-register the `com` so the above may still run multiple times, 103 | you can prevent this with. 104 | 105 | ```js 106 | $(document).one("communicate:registered", (event) => { 107 | if(event.detail.id != "add") 108 | return; 109 | 110 | communicate.com("add", {x: 1, y: 2}) 111 | .then(data => console.log(data)) 112 | .catch(error => console.error(error)) 113 | }) 114 | ``` 115 | 116 | -------------------------------------------------------------------------------- /docs/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devOpifex/communicate/de7f1a21ae99d2608385614f4af40c37426ec03a/docs/logo.png -------------------------------------------------------------------------------- /docs/r.md: -------------------------------------------------------------------------------- 1 | # R Package 2 | 3 | ## Installation 4 | 5 | ```r 6 | # install.packages("remotes") 7 | remotes::install_github("devOpifex/communicate") 8 | ``` 9 | 10 | ## Usage 11 | 12 | Create a shiny application and "commincation channels." 13 | Add callback functions with `com`. 14 | 15 | ```r 16 | library(shiny) 17 | library(communicate) 18 | 19 | add <- \(x){ 20 | x + 2 21 | } 22 | 23 | ui <- fluidPage( 24 | h1("Hello") 25 | ) 26 | 27 | server <- \(input, output, session){ 28 | com("add", add) 29 | } 30 | 31 | shinyApp(ui, server) 32 | ``` 33 | 34 | Then use the JavaScript library to communicate. 35 | 36 | ```r 37 | library(shiny) 38 | library(communicate) 39 | 40 | add <- \(x){ 41 | x + 2 42 | } 43 | 44 | script <- " 45 | $('#btn').on('click', () => { 46 | communicate.com('add', {x: 1}) 47 | .then(res => alert(`equals: ${res}`)); 48 | }) 49 | " 50 | 51 | ui <- fluidPage( 52 | # import dependencies 53 | useCommunicate(), 54 | h1("Hello"), 55 | tags$a("Communicate", id = "btn"), 56 | tags$script(HTML(script)) 57 | ) 58 | 59 | server <- \(input, output, session){ 60 | com("add", add) 61 | } 62 | 63 | shinyApp(ui, server) 64 | ``` 65 | 66 | ## Types 67 | 68 | Though optional it is recommended to specify the types of the arguments 69 | of your callback function. This enables type conversion and type check when communicating from the 70 | client. 71 | 72 | Existing types: 73 | 74 | - `Character` 75 | - `Numeric` 76 | - `Integer` 77 | - `Date` 78 | - `Posixct` 79 | - `Posixlt` 80 | - `Character` 81 | - `List` 82 | 83 | ```r 84 | library(shiny) 85 | library(communicate) 86 | 87 | add <- \(x){ 88 | x + 2 89 | } 90 | 91 | script <- " 92 | $('#btn').on('click', () => { 93 | communicate.com('add', {x: 1}) 94 | .then(res => alert(`equals: ${res}`)); 95 | }) 96 | " 97 | 98 | ui <- fluidPage( 99 | # import dependencies 100 | useCommunicate(), 101 | h1("Hello"), 102 | tags$a("Communicate", id = "btn"), 103 | tags$script(HTML(script)) 104 | ) 105 | 106 | server <- \(input, output, session){ 107 | com("add", add)(x = Integer) 108 | } 109 | 110 | shinyApp(ui, server) 111 | ``` 112 | 113 | ## Defaults 114 | 115 | You can also specifiy callback functions' argument defaults as done below. 116 | 117 | ```r 118 | library(shiny) 119 | library(communicate) 120 | 121 | add <- \(x, y){ 122 | x + y 123 | } 124 | 125 | script <- " 126 | $('#btn').on('click', () => { 127 | communicate.com('add', {x: 1}) 128 | .then(res => alert(`equals: ${res}`)); 129 | }) 130 | " 131 | 132 | ui <- fluidPage( 133 | # import dependencies 134 | useCommunicate(), 135 | h1("Hello"), 136 | tags$a("Communicate", id = "btn"), 137 | tags$script(HTML(script)) 138 | ) 139 | 140 | server <- \(input, output, session){ 141 | com("add", add)(x = Integer, y = Numeric)(y = 1.1) 142 | } 143 | 144 | shinyApp(ui, server) 145 | ``` 146 | 147 | ## Error handling 148 | 149 | Finally, you can pass an error handler. 150 | 151 | Note that the code below purposely fails. 152 | 153 | ```r 154 | library(shiny) 155 | library(communicate) 156 | 157 | add <- \(x, y){ 158 | x + y + "error" # this will cause an error 159 | } 160 | 161 | err <- \(error){ 162 | cat("Aaaaah, an error!\n") 163 | print(error) 164 | } 165 | 166 | # more on JavaScript error handling in the JavaScript page 167 | script <- " 168 | $('#btn').on('click', () => { 169 | communicate.com('add', {x: 1}) 170 | .then(res => alert(`equals: ${res}`)) 171 | .catch(error => alert('There was an error')); // catch error 172 | }) 173 | " 174 | 175 | ui <- fluidPage( 176 | # import dependencies 177 | useCommunicate(), 178 | h1("Hello"), 179 | tags$a("Communicate", id = "btn"), 180 | tags$script(HTML(script)) 181 | ) 182 | 183 | server <- \(input, output, session){ 184 | com("add", add)(x = Integer, y = Numeric)(y = 1.1)(err) 185 | } 186 | 187 | shinyApp(ui, server) 188 | ``` 189 | 190 | ## Custom types 191 | 192 | You can create custom types with the `create_type` function, 193 | this function takes 2 arguments: 194 | 195 | 1. `r_converter` The R function that converts the value received from the 196 | server to the correct type in R, e.g.: `as.numeric` 197 | 2. `js_checker` The JavaScript function that checks that the value one 198 | wants to send from the client is valid. 199 | 200 | See 2) above, Communicate checks for the type JavaScript-side, this can 201 | avoid headaches R-side: there is no need to send that value to the server 202 | if it is not valid. 203 | 204 | In the app below we create a new type that ensures the value we send is pie ~3.14. 205 | 206 | ```r 207 | library(shiny) 208 | library(communicate) 209 | 210 | add <- \(x, y){ 211 | x + y 212 | } 213 | 214 | script <- " 215 | $('#btn').on('click', () => { 216 | communicate.com('add', {x: 3.14}) 217 | .then(res => alert(`equals: ${res}`)) 218 | .catch(error => alert('There was an error')); // catch error 219 | }) 220 | " 221 | 222 | # create custom type 223 | is_pie <- create_type( 224 | r_converter = \(x) x == 3.14, 225 | js_checker = "(x) => x === 3.14" 226 | ) 227 | 228 | ui <- fluidPage( 229 | # import dependencies 230 | useCommunicate(), 231 | h1("Hello"), 232 | tags$a("Communicate", id = "btn"), 233 | tags$script(HTML(script)) 234 | ) 235 | 236 | server <- \(input, output, session){ 237 | com("add", add)(x = is_pie, y = Numeric)(y = 1.1) 238 | } 239 | 240 | shinyApp(ui, server) 241 | ``` 242 | -------------------------------------------------------------------------------- /inst/assets/index.js: -------------------------------------------------------------------------------- 1 | !function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t(require("Shiny")):"function"==typeof define&&define.amd?define(["Shiny"],t):"object"==typeof exports?exports.communicate=t(require("Shiny")):e.communicate=t(e.Shiny)}(self,(__WEBPACK_EXTERNAL_MODULE__230__=>(()=>{"use strict";var __webpack_modules__={230:e=>{e.exports=__WEBPACK_EXTERNAL_MODULE__230__}},__webpack_module_cache__={};function __webpack_require__(e){var t=__webpack_module_cache__[e];if(void 0!==t)return t.exports;var r=__webpack_module_cache__[e]={exports:{}};return __webpack_modules__[e](r,r.exports,__webpack_require__),r.exports}__webpack_require__.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return __webpack_require__.d(t,{a:t}),t},__webpack_require__.d=(e,t)=>{for(var r in t)__webpack_require__.o(t,r)&&!__webpack_require__.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})},__webpack_require__.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),__webpack_require__.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})};var __webpack_exports__={};return(()=>{__webpack_require__.r(__webpack_exports__),__webpack_require__.d(__webpack_exports__,{com:()=>com,getCom:()=>getCom,getComs:()=>getComs,hasCom:()=>hasCom});var shiny__WEBPACK_IMPORTED_MODULE_0__=__webpack_require__(230),shiny__WEBPACK_IMPORTED_MODULE_0___default=__webpack_require__.n(shiny__WEBPACK_IMPORTED_MODULE_0__),__awaiter=function(e,t,r,n){return new(r||(r=Promise))((function(o,i){function a(e){try{_(n.next(e))}catch(e){i(e)}}function c(e){try{_(n.throw(e))}catch(e){i(e)}}function _(e){var t;e.done?o(e.value):(t=e.value,t instanceof r?t:new r((function(e){e(t)}))).then(a,c)}_((n=n.apply(e,t||[])).next())}))},__generator=function(e,t){var r,n,o,i,a={label:0,sent:function(){if(1&o[0])throw o[1];return o[1]},trys:[],ops:[]};return i={next:c(0),throw:c(1),return:c(2)},"function"==typeof Symbol&&(i[Symbol.iterator]=function(){return this}),i;function c(c){return function(_){return function(c){if(r)throw new TypeError("Generator is already executing.");for(;i&&(i=0,c[0]&&(a=0)),a;)try{if(r=1,n&&(o=2&c[0]?n.return:c[0]?n.throw||((o=n.return)&&o.call(n),0):n.next)&&!(o=o.call(n,c[1])).done)return o;switch(n=0,o&&(c=[2&c[0],o.value]),c[0]){case 0:case 1:o=c;break;case 4:return a.label++,{value:c[1],done:!1};case 5:a.label++,n=c[1],c=[0];continue;case 7:c=a.ops.pop(),a.trys.pop();continue;default:if(!((o=(o=a.trys).length>0&&o[o.length-1])||6!==c[0]&&2!==c[0])){a=0;continue}if(3===c[0]&&(!o||c[1]>o[0]&&c[1] { 6 | $('#btn').on('click', (_event) => { 7 | const n = $('#slider').val(); 8 | communicate.com('data', {n: parseInt(n)}) 9 | .then(data => { 10 | const cnt = data.map(d => `

${d}

`); 11 | $('#output').html(cnt); 12 | }); 13 | }); 14 | })" 15 | 16 | get_data <- function(n){ 17 | n |> 18 | seq() |> 19 | lapply(\(i) { 20 | sample(letters, 10, replace = TRUE) |> 21 | paste0(collapse = "") 22 | }) 23 | } 24 | 25 | ui <- fluidPage( 26 | tags$head(tags$script(HTML(script))), 27 | useCommunicate(), 28 | p( 29 | "Pressing the button executes a", 30 | tags$code("GET"), 31 | "request that generates", 32 | tags$code("n"), 33 | "number of random strings", 34 | "and renders them in the output div." 35 | ), 36 | actionButton("btn", "Click me to communicate"), 37 | sliderInput("slider", "Slider", value = 4, min = 3, max = 10), 38 | div(id = "output") 39 | ) 40 | 41 | server <- \(input, output, session){ 42 | com("data", get_data)(n = Integer)(n = 5) 43 | } 44 | 45 | shinyApp(ui, server) 46 | -------------------------------------------------------------------------------- /inst/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devOpifex/communicate/de7f1a21ae99d2608385614f4af40c37426ec03a/inst/logo.png -------------------------------------------------------------------------------- /makefile: -------------------------------------------------------------------------------- 1 | check: document 2 | Rscript -e "devtools::check()" 3 | 4 | document: bundle 5 | Rscript -e "devtools::document()" 6 | 7 | install: document 8 | Rscript -e "devtools::install()" 9 | 10 | bundle: 11 | Rscript -e "packer::bundle()" 12 | 13 | bundle_dev: 14 | Rscript -e "packer::bundle_dev()" 15 | 16 | run: document bundle_dev 17 | Rscript test.R 18 | 19 | publish: 20 | npm publish --access public 21 | 22 | -------------------------------------------------------------------------------- /man/args_from_query_string.Rd: -------------------------------------------------------------------------------- 1 | % Generated by roxygen2: do not edit by hand 2 | % Please edit documentation in R/query-string.R 3 | \name{args_from_query_string} 4 | \alias{args_from_query_string} 5 | \title{Get Arguments from Query String} 6 | \usage{ 7 | args_from_query_string(qs, schema) 8 | } 9 | \arguments{ 10 | \item{qs}{Query string.} 11 | 12 | \item{schema}{Schema.} 13 | } 14 | \description{ 15 | Get arguments from query string. 16 | } 17 | \keyword{internal} 18 | -------------------------------------------------------------------------------- /man/check_args_match.Rd: -------------------------------------------------------------------------------- 1 | % Generated by roxygen2: do not edit by hand 2 | % Please edit documentation in R/types.R 3 | \name{check_args_match} 4 | \alias{check_args_match} 5 | \title{Checks that arguments passed matched that in function} 6 | \usage{ 7 | check_args_match(callback, ...) 8 | } 9 | \arguments{ 10 | \item{callback}{Callback function to check against.} 11 | 12 | \item{...}{Arguments.} 13 | } 14 | \description{ 15 | Checks that arguments passed matched that in function 16 | } 17 | \keyword{.Internal} 18 | -------------------------------------------------------------------------------- /man/com.Rd: -------------------------------------------------------------------------------- 1 | % Generated by roxygen2: do not edit by hand 2 | % Please edit documentation in R/core.R 3 | \name{com} 4 | \alias{com} 5 | \title{Communication} 6 | \usage{ 7 | com(id, handler) 8 | } 9 | \arguments{ 10 | \item{id}{ID of communication handler.} 11 | 12 | \item{handler}{Callback function.} 13 | } 14 | \description{ 15 | Communication handler. 16 | } 17 | -------------------------------------------------------------------------------- /man/com_serve.Rd: -------------------------------------------------------------------------------- 1 | % Generated by roxygen2: do not edit by hand 2 | % Please edit documentation in R/core.R 3 | \name{com_serve} 4 | \alias{com_serve} 5 | \title{Communicate} 6 | \usage{ 7 | com_serve(session = shiny::getDefaultReactiveDomain()) 8 | } 9 | \arguments{ 10 | \item{session}{Shiny session.} 11 | } 12 | \description{ 13 | Serve communication channels. 14 | } 15 | -------------------------------------------------------------------------------- /man/constructors.Rd: -------------------------------------------------------------------------------- 1 | % Generated by roxygen2: do not edit by hand 2 | % Please edit documentation in R/core.R 3 | \name{constructors} 4 | \alias{constructors} 5 | \alias{construct_defaults_fn} 6 | \alias{construct_converters_fn} 7 | \alias{construct_errors_fn} 8 | \title{Constructors} 9 | \usage{ 10 | construct_defaults_fn(fn) 11 | 12 | construct_converters_fn(fn) 13 | 14 | construct_errors_fn(fn) 15 | } 16 | \description{ 17 | Adds classes to returned function to allow print method. 18 | } 19 | \keyword{internal} 20 | -------------------------------------------------------------------------------- /man/converters..Rd: -------------------------------------------------------------------------------- 1 | % Generated by roxygen2: do not edit by hand 2 | % Please edit documentation in R/types.R 3 | \docType{data} 4 | \name{converters.} 5 | \alias{converters.} 6 | \alias{Character} 7 | \alias{Integer} 8 | \alias{Numeric} 9 | \alias{Date} 10 | \alias{Posixct} 11 | \alias{Posixlt} 12 | \alias{Dataframe} 13 | \alias{List} 14 | \alias{Function} 15 | \title{Type Converters} 16 | \format{ 17 | An object of class \code{list} of length 2. 18 | 19 | An object of class \code{list} of length 2. 20 | 21 | An object of class \code{list} of length 2. 22 | 23 | An object of class \code{list} of length 2. 24 | 25 | An object of class \code{list} of length 2. 26 | 27 | An object of class \code{list} of length 2. 28 | 29 | An object of class \code{list} of length 2. 30 | 31 | An object of class \code{list} of length 2. 32 | 33 | An object of class \code{list} of length 2. 34 | } 35 | \usage{ 36 | Character 37 | 38 | Integer 39 | 40 | Numeric 41 | 42 | Date 43 | 44 | Posixct 45 | 46 | Posixlt 47 | 48 | Dataframe 49 | 50 | List 51 | 52 | Function 53 | } 54 | \description{ 55 | Type converters for convenience. 56 | } 57 | \keyword{datasets} 58 | -------------------------------------------------------------------------------- /man/create_type.Rd: -------------------------------------------------------------------------------- 1 | % Generated by roxygen2: do not edit by hand 2 | % Please edit documentation in R/types.R 3 | \name{create_type} 4 | \alias{create_type} 5 | \title{Create type} 6 | \usage{ 7 | create_type(r_converter, js_checker = NULL, name = NULL) 8 | } 9 | \arguments{ 10 | \item{r_converter}{R converter function to transform the value. 11 | received from the server to the desired type in R.} 12 | 13 | \item{js_checker}{JavaScript checker function to check if the value 14 | received from the client is of the desired type.} 15 | 16 | \item{name}{Name of the type.} 17 | } 18 | \description{ 19 | Create a new type with its associated checker and converter. 20 | } 21 | -------------------------------------------------------------------------------- /man/example.Rd: -------------------------------------------------------------------------------- 1 | % Generated by roxygen2: do not edit by hand 2 | % Please edit documentation in R/example.R 3 | \name{example} 4 | \alias{example} 5 | \title{Example} 6 | \usage{ 7 | example() 8 | } 9 | \description{ 10 | Run example 11 | } 12 | -------------------------------------------------------------------------------- /man/get_args.Rd: -------------------------------------------------------------------------------- 1 | % Generated by roxygen2: do not edit by hand 2 | % Please edit documentation in R/types.R 3 | \name{get_args} 4 | \alias{get_args} 5 | \title{Get arguments from function} 6 | \usage{ 7 | get_args(handler, schemas) 8 | } 9 | \arguments{ 10 | \item{handler}{Function handler.} 11 | 12 | \item{schemas}{List of schemas.} 13 | } 14 | \description{ 15 | Get arguments from handler. 16 | } 17 | \keyword{internal} 18 | -------------------------------------------------------------------------------- /man/get_prefix.Rd: -------------------------------------------------------------------------------- 1 | % Generated by roxygen2: do not edit by hand 2 | % Please edit documentation in R/core.R 3 | \name{get_prefix} 4 | \alias{get_prefix} 5 | \title{Get or create prefix} 6 | \usage{ 7 | get_prefix() 8 | } 9 | \description{ 10 | Get or create the prefix. 11 | } 12 | \details{ 13 | This ensures unique names. 14 | } 15 | \keyword{internal} 16 | -------------------------------------------------------------------------------- /man/http_response_json.Rd: -------------------------------------------------------------------------------- 1 | % Generated by roxygen2: do not edit by hand 2 | % Please edit documentation in R/core.R 3 | \name{http_response_json} 4 | \alias{http_response_json} 5 | \title{HTTP response JSON} 6 | \usage{ 7 | http_response_json(body, status = 200) 8 | } 9 | \arguments{ 10 | \item{body}{Body of response.} 11 | 12 | \item{status}{HTTP status code.} 13 | } 14 | \description{ 15 | Sends a JSON response. 16 | } 17 | \keyword{internal} 18 | -------------------------------------------------------------------------------- /man/make_id.Rd: -------------------------------------------------------------------------------- 1 | % Generated by roxygen2: do not edit by hand 2 | % Please edit documentation in R/utils.R 3 | \name{make_id} 4 | \alias{make_id} 5 | \title{Make ID} 6 | \usage{ 7 | make_id(n = 32) 8 | } 9 | \arguments{ 10 | \item{n}{Length of ID.} 11 | } 12 | \description{ 13 | Generate a random ID. 14 | } 15 | \keyword{internal} 16 | -------------------------------------------------------------------------------- /man/parse_args.Rd: -------------------------------------------------------------------------------- 1 | % Generated by roxygen2: do not edit by hand 2 | % Please edit documentation in R/types.R 3 | \name{parse_args} 4 | \alias{parse_args} 5 | \title{Parse Arguments} 6 | \usage{ 7 | parse_args(args = list(), converters = list()) 8 | } 9 | \arguments{ 10 | \item{args}{Parsed query string.} 11 | 12 | \item{converters}{List of converters.} 13 | } 14 | \description{ 15 | Attempts to parse query string for embeds into R objects. 16 | } 17 | \keyword{internal} 18 | -------------------------------------------------------------------------------- /man/parse_query_string.Rd: -------------------------------------------------------------------------------- 1 | % Generated by roxygen2: do not edit by hand 2 | % Please edit documentation in R/query-string.R 3 | \name{parse_query_string} 4 | \alias{parse_query_string} 5 | \title{Parse a query string into a list} 6 | \usage{ 7 | parse_query_string(str) 8 | } 9 | \arguments{ 10 | \item{str}{Query string.} 11 | } 12 | \description{ 13 | Parses the query string from the request into a list. 14 | } 15 | \keyword{internal} 16 | -------------------------------------------------------------------------------- /man/useCommunicate.Rd: -------------------------------------------------------------------------------- 1 | % Generated by roxygen2: do not edit by hand 2 | % Please edit documentation in R/dependency.R 3 | \name{useCommunicate} 4 | \alias{useCommunicate} 5 | \title{Dependencies for communicate} 6 | \usage{ 7 | useCommunicate() 8 | } 9 | \description{ 10 | Dependencies for communicate, to place withing the Shiny UI. 11 | } 12 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@devopifex/communicate", 3 | "version": "1.0.3", 4 | "lockfileVersion": 3, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "@devopifex/communicate", 9 | "version": "1.0.3", 10 | "license": "GPL-3", 11 | "devDependencies": { 12 | "@typescript-eslint/eslint-plugin": "^6.11.0", 13 | "@typescript-eslint/parser": "^6.11.0", 14 | "eslint": "^8.53.0", 15 | "ts-loader": "^9.5.1", 16 | "typescript": "^5.2.2", 17 | "webpack": "^5.89.0", 18 | "webpack-cli": "^5.1.4", 19 | "webpack-merge": "^5.10.0" 20 | } 21 | }, 22 | "node_modules/@aashutoshrathi/word-wrap": { 23 | "version": "1.2.6", 24 | "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", 25 | "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", 26 | "dev": true, 27 | "engines": { 28 | "node": ">=0.10.0" 29 | } 30 | }, 31 | "node_modules/@discoveryjs/json-ext": { 32 | "version": "0.5.7", 33 | "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", 34 | "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", 35 | "dev": true, 36 | "engines": { 37 | "node": ">=10.0.0" 38 | } 39 | }, 40 | "node_modules/@eslint-community/eslint-utils": { 41 | "version": "4.4.0", 42 | "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", 43 | "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", 44 | "dev": true, 45 | "dependencies": { 46 | "eslint-visitor-keys": "^3.3.0" 47 | }, 48 | "engines": { 49 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 50 | }, 51 | "peerDependencies": { 52 | "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" 53 | } 54 | }, 55 | "node_modules/@eslint-community/regexpp": { 56 | "version": "4.10.0", 57 | "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", 58 | "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", 59 | "dev": true, 60 | "engines": { 61 | "node": "^12.0.0 || ^14.0.0 || >=16.0.0" 62 | } 63 | }, 64 | "node_modules/@eslint/eslintrc": { 65 | "version": "2.1.3", 66 | "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.3.tgz", 67 | "integrity": "sha512-yZzuIG+jnVu6hNSzFEN07e8BxF3uAzYtQb6uDkaYZLo6oYZDCq454c5kB8zxnzfCYyP4MIuyBn10L0DqwujTmA==", 68 | "dev": true, 69 | "dependencies": { 70 | "ajv": "^6.12.4", 71 | "debug": "^4.3.2", 72 | "espree": "^9.6.0", 73 | "globals": "^13.19.0", 74 | "ignore": "^5.2.0", 75 | "import-fresh": "^3.2.1", 76 | "js-yaml": "^4.1.0", 77 | "minimatch": "^3.1.2", 78 | "strip-json-comments": "^3.1.1" 79 | }, 80 | "engines": { 81 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 82 | }, 83 | "funding": { 84 | "url": "https://opencollective.com/eslint" 85 | } 86 | }, 87 | "node_modules/@eslint/js": { 88 | "version": "8.53.0", 89 | "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.53.0.tgz", 90 | "integrity": "sha512-Kn7K8dx/5U6+cT1yEhpX1w4PCSg0M+XyRILPgvwcEBjerFWCwQj5sbr3/VmxqV0JGHCBCzyd6LxypEuehypY1w==", 91 | "dev": true, 92 | "engines": { 93 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 94 | } 95 | }, 96 | "node_modules/@humanwhocodes/config-array": { 97 | "version": "0.11.13", 98 | "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.13.tgz", 99 | "integrity": "sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==", 100 | "dev": true, 101 | "dependencies": { 102 | "@humanwhocodes/object-schema": "^2.0.1", 103 | "debug": "^4.1.1", 104 | "minimatch": "^3.0.5" 105 | }, 106 | "engines": { 107 | "node": ">=10.10.0" 108 | } 109 | }, 110 | "node_modules/@humanwhocodes/module-importer": { 111 | "version": "1.0.1", 112 | "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", 113 | "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", 114 | "dev": true, 115 | "engines": { 116 | "node": ">=12.22" 117 | }, 118 | "funding": { 119 | "type": "github", 120 | "url": "https://github.com/sponsors/nzakas" 121 | } 122 | }, 123 | "node_modules/@humanwhocodes/object-schema": { 124 | "version": "2.0.1", 125 | "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz", 126 | "integrity": "sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==", 127 | "dev": true 128 | }, 129 | "node_modules/@jridgewell/gen-mapping": { 130 | "version": "0.3.3", 131 | "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", 132 | "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", 133 | "dev": true, 134 | "dependencies": { 135 | "@jridgewell/set-array": "^1.0.1", 136 | "@jridgewell/sourcemap-codec": "^1.4.10", 137 | "@jridgewell/trace-mapping": "^0.3.9" 138 | }, 139 | "engines": { 140 | "node": ">=6.0.0" 141 | } 142 | }, 143 | "node_modules/@jridgewell/resolve-uri": { 144 | "version": "3.1.1", 145 | "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", 146 | "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", 147 | "dev": true, 148 | "engines": { 149 | "node": ">=6.0.0" 150 | } 151 | }, 152 | "node_modules/@jridgewell/set-array": { 153 | "version": "1.1.2", 154 | "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", 155 | "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", 156 | "dev": true, 157 | "engines": { 158 | "node": ">=6.0.0" 159 | } 160 | }, 161 | "node_modules/@jridgewell/source-map": { 162 | "version": "0.3.5", 163 | "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz", 164 | "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==", 165 | "dev": true, 166 | "dependencies": { 167 | "@jridgewell/gen-mapping": "^0.3.0", 168 | "@jridgewell/trace-mapping": "^0.3.9" 169 | } 170 | }, 171 | "node_modules/@jridgewell/sourcemap-codec": { 172 | "version": "1.4.15", 173 | "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", 174 | "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", 175 | "dev": true 176 | }, 177 | "node_modules/@jridgewell/trace-mapping": { 178 | "version": "0.3.20", 179 | "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz", 180 | "integrity": "sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==", 181 | "dev": true, 182 | "dependencies": { 183 | "@jridgewell/resolve-uri": "^3.1.0", 184 | "@jridgewell/sourcemap-codec": "^1.4.14" 185 | } 186 | }, 187 | "node_modules/@nodelib/fs.scandir": { 188 | "version": "2.1.5", 189 | "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", 190 | "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", 191 | "dev": true, 192 | "dependencies": { 193 | "@nodelib/fs.stat": "2.0.5", 194 | "run-parallel": "^1.1.9" 195 | }, 196 | "engines": { 197 | "node": ">= 8" 198 | } 199 | }, 200 | "node_modules/@nodelib/fs.stat": { 201 | "version": "2.0.5", 202 | "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", 203 | "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", 204 | "dev": true, 205 | "engines": { 206 | "node": ">= 8" 207 | } 208 | }, 209 | "node_modules/@nodelib/fs.walk": { 210 | "version": "1.2.8", 211 | "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", 212 | "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", 213 | "dev": true, 214 | "dependencies": { 215 | "@nodelib/fs.scandir": "2.1.5", 216 | "fastq": "^1.6.0" 217 | }, 218 | "engines": { 219 | "node": ">= 8" 220 | } 221 | }, 222 | "node_modules/@types/eslint": { 223 | "version": "8.44.6", 224 | "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.44.6.tgz", 225 | "integrity": "sha512-P6bY56TVmX8y9J87jHNgQh43h6VVU+6H7oN7hgvivV81K2XY8qJZ5vqPy/HdUoVIelii2kChYVzQanlswPWVFw==", 226 | "dev": true, 227 | "dependencies": { 228 | "@types/estree": "*", 229 | "@types/json-schema": "*" 230 | } 231 | }, 232 | "node_modules/@types/eslint-scope": { 233 | "version": "3.7.6", 234 | "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.6.tgz", 235 | "integrity": "sha512-zfM4ipmxVKWdxtDaJ3MP3pBurDXOCoyjvlpE3u6Qzrmw4BPbfm4/ambIeTk/r/J0iq/+2/xp0Fmt+gFvXJY2PQ==", 236 | "dev": true, 237 | "dependencies": { 238 | "@types/eslint": "*", 239 | "@types/estree": "*" 240 | } 241 | }, 242 | "node_modules/@types/estree": { 243 | "version": "1.0.3", 244 | "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.3.tgz", 245 | "integrity": "sha512-CS2rOaoQ/eAgAfcTfq6amKG7bsN+EMcgGY4FAFQdvSj2y1ixvOZTUA9mOtCai7E1SYu283XNw7urKK30nP3wkQ==", 246 | "dev": true 247 | }, 248 | "node_modules/@types/json-schema": { 249 | "version": "7.0.14", 250 | "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.14.tgz", 251 | "integrity": "sha512-U3PUjAudAdJBeC2pgN8uTIKgxrb4nlDF3SF0++EldXQvQBGkpFZMSnwQiIoDU77tv45VgNkl/L4ouD+rEomujw==", 252 | "dev": true 253 | }, 254 | "node_modules/@types/node": { 255 | "version": "20.8.9", 256 | "resolved": "https://registry.npmjs.org/@types/node/-/node-20.8.9.tgz", 257 | "integrity": "sha512-UzykFsT3FhHb1h7yD4CA4YhBHq545JC0YnEz41xkipN88eKQtL6rSgocL5tbAP6Ola9Izm/Aw4Ora8He4x0BHg==", 258 | "dev": true, 259 | "dependencies": { 260 | "undici-types": "~5.26.4" 261 | } 262 | }, 263 | "node_modules/@types/semver": { 264 | "version": "7.5.5", 265 | "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.5.tgz", 266 | "integrity": "sha512-+d+WYC1BxJ6yVOgUgzK8gWvp5qF8ssV5r4nsDcZWKRWcDQLQ619tvWAxJQYGgBrO1MnLJC7a5GtiYsAoQ47dJg==", 267 | "dev": true 268 | }, 269 | "node_modules/@typescript-eslint/eslint-plugin": { 270 | "version": "6.11.0", 271 | "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.11.0.tgz", 272 | "integrity": "sha512-uXnpZDc4VRjY4iuypDBKzW1rz9T5YBBK0snMn8MaTSNd2kMlj50LnLBABELjJiOL5YHk7ZD8hbSpI9ubzqYI0w==", 273 | "dev": true, 274 | "dependencies": { 275 | "@eslint-community/regexpp": "^4.5.1", 276 | "@typescript-eslint/scope-manager": "6.11.0", 277 | "@typescript-eslint/type-utils": "6.11.0", 278 | "@typescript-eslint/utils": "6.11.0", 279 | "@typescript-eslint/visitor-keys": "6.11.0", 280 | "debug": "^4.3.4", 281 | "graphemer": "^1.4.0", 282 | "ignore": "^5.2.4", 283 | "natural-compare": "^1.4.0", 284 | "semver": "^7.5.4", 285 | "ts-api-utils": "^1.0.1" 286 | }, 287 | "engines": { 288 | "node": "^16.0.0 || >=18.0.0" 289 | }, 290 | "funding": { 291 | "type": "opencollective", 292 | "url": "https://opencollective.com/typescript-eslint" 293 | }, 294 | "peerDependencies": { 295 | "@typescript-eslint/parser": "^6.0.0 || ^6.0.0-alpha", 296 | "eslint": "^7.0.0 || ^8.0.0" 297 | }, 298 | "peerDependenciesMeta": { 299 | "typescript": { 300 | "optional": true 301 | } 302 | } 303 | }, 304 | "node_modules/@typescript-eslint/parser": { 305 | "version": "6.11.0", 306 | "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.11.0.tgz", 307 | "integrity": "sha512-+whEdjk+d5do5nxfxx73oanLL9ghKO3EwM9kBCkUtWMRwWuPaFv9ScuqlYfQ6pAD6ZiJhky7TZ2ZYhrMsfMxVQ==", 308 | "dev": true, 309 | "dependencies": { 310 | "@typescript-eslint/scope-manager": "6.11.0", 311 | "@typescript-eslint/types": "6.11.0", 312 | "@typescript-eslint/typescript-estree": "6.11.0", 313 | "@typescript-eslint/visitor-keys": "6.11.0", 314 | "debug": "^4.3.4" 315 | }, 316 | "engines": { 317 | "node": "^16.0.0 || >=18.0.0" 318 | }, 319 | "funding": { 320 | "type": "opencollective", 321 | "url": "https://opencollective.com/typescript-eslint" 322 | }, 323 | "peerDependencies": { 324 | "eslint": "^7.0.0 || ^8.0.0" 325 | }, 326 | "peerDependenciesMeta": { 327 | "typescript": { 328 | "optional": true 329 | } 330 | } 331 | }, 332 | "node_modules/@typescript-eslint/scope-manager": { 333 | "version": "6.11.0", 334 | "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.11.0.tgz", 335 | "integrity": "sha512-0A8KoVvIURG4uhxAdjSaxy8RdRE//HztaZdG8KiHLP8WOXSk0vlF7Pvogv+vlJA5Rnjj/wDcFENvDaHb+gKd1A==", 336 | "dev": true, 337 | "dependencies": { 338 | "@typescript-eslint/types": "6.11.0", 339 | "@typescript-eslint/visitor-keys": "6.11.0" 340 | }, 341 | "engines": { 342 | "node": "^16.0.0 || >=18.0.0" 343 | }, 344 | "funding": { 345 | "type": "opencollective", 346 | "url": "https://opencollective.com/typescript-eslint" 347 | } 348 | }, 349 | "node_modules/@typescript-eslint/type-utils": { 350 | "version": "6.11.0", 351 | "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.11.0.tgz", 352 | "integrity": "sha512-nA4IOXwZtqBjIoYrJcYxLRO+F9ri+leVGoJcMW1uqr4r1Hq7vW5cyWrA43lFbpRvQ9XgNrnfLpIkO3i1emDBIA==", 353 | "dev": true, 354 | "dependencies": { 355 | "@typescript-eslint/typescript-estree": "6.11.0", 356 | "@typescript-eslint/utils": "6.11.0", 357 | "debug": "^4.3.4", 358 | "ts-api-utils": "^1.0.1" 359 | }, 360 | "engines": { 361 | "node": "^16.0.0 || >=18.0.0" 362 | }, 363 | "funding": { 364 | "type": "opencollective", 365 | "url": "https://opencollective.com/typescript-eslint" 366 | }, 367 | "peerDependencies": { 368 | "eslint": "^7.0.0 || ^8.0.0" 369 | }, 370 | "peerDependenciesMeta": { 371 | "typescript": { 372 | "optional": true 373 | } 374 | } 375 | }, 376 | "node_modules/@typescript-eslint/types": { 377 | "version": "6.11.0", 378 | "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.11.0.tgz", 379 | "integrity": "sha512-ZbEzuD4DwEJxwPqhv3QULlRj8KYTAnNsXxmfuUXFCxZmO6CF2gM/y+ugBSAQhrqaJL3M+oe4owdWunaHM6beqA==", 380 | "dev": true, 381 | "engines": { 382 | "node": "^16.0.0 || >=18.0.0" 383 | }, 384 | "funding": { 385 | "type": "opencollective", 386 | "url": "https://opencollective.com/typescript-eslint" 387 | } 388 | }, 389 | "node_modules/@typescript-eslint/typescript-estree": { 390 | "version": "6.11.0", 391 | "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.11.0.tgz", 392 | "integrity": "sha512-Aezzv1o2tWJwvZhedzvD5Yv7+Lpu1by/U1LZ5gLc4tCx8jUmuSCMioPFRjliN/6SJIvY6HpTtJIWubKuYYYesQ==", 393 | "dev": true, 394 | "dependencies": { 395 | "@typescript-eslint/types": "6.11.0", 396 | "@typescript-eslint/visitor-keys": "6.11.0", 397 | "debug": "^4.3.4", 398 | "globby": "^11.1.0", 399 | "is-glob": "^4.0.3", 400 | "semver": "^7.5.4", 401 | "ts-api-utils": "^1.0.1" 402 | }, 403 | "engines": { 404 | "node": "^16.0.0 || >=18.0.0" 405 | }, 406 | "funding": { 407 | "type": "opencollective", 408 | "url": "https://opencollective.com/typescript-eslint" 409 | }, 410 | "peerDependenciesMeta": { 411 | "typescript": { 412 | "optional": true 413 | } 414 | } 415 | }, 416 | "node_modules/@typescript-eslint/utils": { 417 | "version": "6.11.0", 418 | "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.11.0.tgz", 419 | "integrity": "sha512-p23ibf68fxoZy605dc0dQAEoUsoiNoP3MD9WQGiHLDuTSOuqoTsa4oAy+h3KDkTcxbbfOtUjb9h3Ta0gT4ug2g==", 420 | "dev": true, 421 | "dependencies": { 422 | "@eslint-community/eslint-utils": "^4.4.0", 423 | "@types/json-schema": "^7.0.12", 424 | "@types/semver": "^7.5.0", 425 | "@typescript-eslint/scope-manager": "6.11.0", 426 | "@typescript-eslint/types": "6.11.0", 427 | "@typescript-eslint/typescript-estree": "6.11.0", 428 | "semver": "^7.5.4" 429 | }, 430 | "engines": { 431 | "node": "^16.0.0 || >=18.0.0" 432 | }, 433 | "funding": { 434 | "type": "opencollective", 435 | "url": "https://opencollective.com/typescript-eslint" 436 | }, 437 | "peerDependencies": { 438 | "eslint": "^7.0.0 || ^8.0.0" 439 | } 440 | }, 441 | "node_modules/@typescript-eslint/visitor-keys": { 442 | "version": "6.11.0", 443 | "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.11.0.tgz", 444 | "integrity": "sha512-+SUN/W7WjBr05uRxPggJPSzyB8zUpaYo2hByKasWbqr3PM8AXfZt8UHdNpBS1v9SA62qnSSMF3380SwDqqprgQ==", 445 | "dev": true, 446 | "dependencies": { 447 | "@typescript-eslint/types": "6.11.0", 448 | "eslint-visitor-keys": "^3.4.1" 449 | }, 450 | "engines": { 451 | "node": "^16.0.0 || >=18.0.0" 452 | }, 453 | "funding": { 454 | "type": "opencollective", 455 | "url": "https://opencollective.com/typescript-eslint" 456 | } 457 | }, 458 | "node_modules/@ungap/structured-clone": { 459 | "version": "1.2.0", 460 | "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", 461 | "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", 462 | "dev": true 463 | }, 464 | "node_modules/@webassemblyjs/ast": { 465 | "version": "1.11.6", 466 | "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz", 467 | "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==", 468 | "dev": true, 469 | "dependencies": { 470 | "@webassemblyjs/helper-numbers": "1.11.6", 471 | "@webassemblyjs/helper-wasm-bytecode": "1.11.6" 472 | } 473 | }, 474 | "node_modules/@webassemblyjs/floating-point-hex-parser": { 475 | "version": "1.11.6", 476 | "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", 477 | "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", 478 | "dev": true 479 | }, 480 | "node_modules/@webassemblyjs/helper-api-error": { 481 | "version": "1.11.6", 482 | "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", 483 | "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", 484 | "dev": true 485 | }, 486 | "node_modules/@webassemblyjs/helper-buffer": { 487 | "version": "1.11.6", 488 | "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz", 489 | "integrity": "sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==", 490 | "dev": true 491 | }, 492 | "node_modules/@webassemblyjs/helper-numbers": { 493 | "version": "1.11.6", 494 | "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", 495 | "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", 496 | "dev": true, 497 | "dependencies": { 498 | "@webassemblyjs/floating-point-hex-parser": "1.11.6", 499 | "@webassemblyjs/helper-api-error": "1.11.6", 500 | "@xtuc/long": "4.2.2" 501 | } 502 | }, 503 | "node_modules/@webassemblyjs/helper-wasm-bytecode": { 504 | "version": "1.11.6", 505 | "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", 506 | "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", 507 | "dev": true 508 | }, 509 | "node_modules/@webassemblyjs/helper-wasm-section": { 510 | "version": "1.11.6", 511 | "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz", 512 | "integrity": "sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==", 513 | "dev": true, 514 | "dependencies": { 515 | "@webassemblyjs/ast": "1.11.6", 516 | "@webassemblyjs/helper-buffer": "1.11.6", 517 | "@webassemblyjs/helper-wasm-bytecode": "1.11.6", 518 | "@webassemblyjs/wasm-gen": "1.11.6" 519 | } 520 | }, 521 | "node_modules/@webassemblyjs/ieee754": { 522 | "version": "1.11.6", 523 | "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", 524 | "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", 525 | "dev": true, 526 | "dependencies": { 527 | "@xtuc/ieee754": "^1.2.0" 528 | } 529 | }, 530 | "node_modules/@webassemblyjs/leb128": { 531 | "version": "1.11.6", 532 | "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", 533 | "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", 534 | "dev": true, 535 | "dependencies": { 536 | "@xtuc/long": "4.2.2" 537 | } 538 | }, 539 | "node_modules/@webassemblyjs/utf8": { 540 | "version": "1.11.6", 541 | "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", 542 | "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", 543 | "dev": true 544 | }, 545 | "node_modules/@webassemblyjs/wasm-edit": { 546 | "version": "1.11.6", 547 | "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz", 548 | "integrity": "sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==", 549 | "dev": true, 550 | "dependencies": { 551 | "@webassemblyjs/ast": "1.11.6", 552 | "@webassemblyjs/helper-buffer": "1.11.6", 553 | "@webassemblyjs/helper-wasm-bytecode": "1.11.6", 554 | "@webassemblyjs/helper-wasm-section": "1.11.6", 555 | "@webassemblyjs/wasm-gen": "1.11.6", 556 | "@webassemblyjs/wasm-opt": "1.11.6", 557 | "@webassemblyjs/wasm-parser": "1.11.6", 558 | "@webassemblyjs/wast-printer": "1.11.6" 559 | } 560 | }, 561 | "node_modules/@webassemblyjs/wasm-gen": { 562 | "version": "1.11.6", 563 | "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz", 564 | "integrity": "sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==", 565 | "dev": true, 566 | "dependencies": { 567 | "@webassemblyjs/ast": "1.11.6", 568 | "@webassemblyjs/helper-wasm-bytecode": "1.11.6", 569 | "@webassemblyjs/ieee754": "1.11.6", 570 | "@webassemblyjs/leb128": "1.11.6", 571 | "@webassemblyjs/utf8": "1.11.6" 572 | } 573 | }, 574 | "node_modules/@webassemblyjs/wasm-opt": { 575 | "version": "1.11.6", 576 | "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz", 577 | "integrity": "sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==", 578 | "dev": true, 579 | "dependencies": { 580 | "@webassemblyjs/ast": "1.11.6", 581 | "@webassemblyjs/helper-buffer": "1.11.6", 582 | "@webassemblyjs/wasm-gen": "1.11.6", 583 | "@webassemblyjs/wasm-parser": "1.11.6" 584 | } 585 | }, 586 | "node_modules/@webassemblyjs/wasm-parser": { 587 | "version": "1.11.6", 588 | "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz", 589 | "integrity": "sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==", 590 | "dev": true, 591 | "dependencies": { 592 | "@webassemblyjs/ast": "1.11.6", 593 | "@webassemblyjs/helper-api-error": "1.11.6", 594 | "@webassemblyjs/helper-wasm-bytecode": "1.11.6", 595 | "@webassemblyjs/ieee754": "1.11.6", 596 | "@webassemblyjs/leb128": "1.11.6", 597 | "@webassemblyjs/utf8": "1.11.6" 598 | } 599 | }, 600 | "node_modules/@webassemblyjs/wast-printer": { 601 | "version": "1.11.6", 602 | "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz", 603 | "integrity": "sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==", 604 | "dev": true, 605 | "dependencies": { 606 | "@webassemblyjs/ast": "1.11.6", 607 | "@xtuc/long": "4.2.2" 608 | } 609 | }, 610 | "node_modules/@webpack-cli/configtest": { 611 | "version": "2.1.1", 612 | "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-2.1.1.tgz", 613 | "integrity": "sha512-wy0mglZpDSiSS0XHrVR+BAdId2+yxPSoJW8fsna3ZpYSlufjvxnP4YbKTCBZnNIcGN4r6ZPXV55X4mYExOfLmw==", 614 | "dev": true, 615 | "engines": { 616 | "node": ">=14.15.0" 617 | }, 618 | "peerDependencies": { 619 | "webpack": "5.x.x", 620 | "webpack-cli": "5.x.x" 621 | } 622 | }, 623 | "node_modules/@webpack-cli/info": { 624 | "version": "2.0.2", 625 | "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-2.0.2.tgz", 626 | "integrity": "sha512-zLHQdI/Qs1UyT5UBdWNqsARasIA+AaF8t+4u2aS2nEpBQh2mWIVb8qAklq0eUENnC5mOItrIB4LiS9xMtph18A==", 627 | "dev": true, 628 | "engines": { 629 | "node": ">=14.15.0" 630 | }, 631 | "peerDependencies": { 632 | "webpack": "5.x.x", 633 | "webpack-cli": "5.x.x" 634 | } 635 | }, 636 | "node_modules/@webpack-cli/serve": { 637 | "version": "2.0.5", 638 | "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-2.0.5.tgz", 639 | "integrity": "sha512-lqaoKnRYBdo1UgDX8uF24AfGMifWK19TxPmM5FHc2vAGxrJ/qtyUyFBWoY1tISZdelsQ5fBcOusifo5o5wSJxQ==", 640 | "dev": true, 641 | "engines": { 642 | "node": ">=14.15.0" 643 | }, 644 | "peerDependencies": { 645 | "webpack": "5.x.x", 646 | "webpack-cli": "5.x.x" 647 | }, 648 | "peerDependenciesMeta": { 649 | "webpack-dev-server": { 650 | "optional": true 651 | } 652 | } 653 | }, 654 | "node_modules/@xtuc/ieee754": { 655 | "version": "1.2.0", 656 | "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", 657 | "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", 658 | "dev": true 659 | }, 660 | "node_modules/@xtuc/long": { 661 | "version": "4.2.2", 662 | "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", 663 | "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", 664 | "dev": true 665 | }, 666 | "node_modules/acorn": { 667 | "version": "8.11.2", 668 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz", 669 | "integrity": "sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==", 670 | "dev": true, 671 | "bin": { 672 | "acorn": "bin/acorn" 673 | }, 674 | "engines": { 675 | "node": ">=0.4.0" 676 | } 677 | }, 678 | "node_modules/acorn-import-assertions": { 679 | "version": "1.9.0", 680 | "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", 681 | "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", 682 | "dev": true, 683 | "peerDependencies": { 684 | "acorn": "^8" 685 | } 686 | }, 687 | "node_modules/acorn-jsx": { 688 | "version": "5.3.2", 689 | "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", 690 | "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", 691 | "dev": true, 692 | "peerDependencies": { 693 | "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" 694 | } 695 | }, 696 | "node_modules/ajv": { 697 | "version": "6.12.6", 698 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", 699 | "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", 700 | "dev": true, 701 | "dependencies": { 702 | "fast-deep-equal": "^3.1.1", 703 | "fast-json-stable-stringify": "^2.0.0", 704 | "json-schema-traverse": "^0.4.1", 705 | "uri-js": "^4.2.2" 706 | }, 707 | "funding": { 708 | "type": "github", 709 | "url": "https://github.com/sponsors/epoberezkin" 710 | } 711 | }, 712 | "node_modules/ajv-keywords": { 713 | "version": "3.5.2", 714 | "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", 715 | "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", 716 | "dev": true, 717 | "peerDependencies": { 718 | "ajv": "^6.9.1" 719 | } 720 | }, 721 | "node_modules/ansi-regex": { 722 | "version": "5.0.1", 723 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 724 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 725 | "dev": true, 726 | "engines": { 727 | "node": ">=8" 728 | } 729 | }, 730 | "node_modules/ansi-styles": { 731 | "version": "4.3.0", 732 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 733 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 734 | "dev": true, 735 | "dependencies": { 736 | "color-convert": "^2.0.1" 737 | }, 738 | "engines": { 739 | "node": ">=8" 740 | }, 741 | "funding": { 742 | "url": "https://github.com/chalk/ansi-styles?sponsor=1" 743 | } 744 | }, 745 | "node_modules/argparse": { 746 | "version": "2.0.1", 747 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", 748 | "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", 749 | "dev": true 750 | }, 751 | "node_modules/array-union": { 752 | "version": "2.1.0", 753 | "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", 754 | "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", 755 | "dev": true, 756 | "engines": { 757 | "node": ">=8" 758 | } 759 | }, 760 | "node_modules/balanced-match": { 761 | "version": "1.0.2", 762 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 763 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", 764 | "dev": true 765 | }, 766 | "node_modules/brace-expansion": { 767 | "version": "1.1.11", 768 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 769 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 770 | "dev": true, 771 | "dependencies": { 772 | "balanced-match": "^1.0.0", 773 | "concat-map": "0.0.1" 774 | } 775 | }, 776 | "node_modules/braces": { 777 | "version": "3.0.2", 778 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", 779 | "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", 780 | "dev": true, 781 | "dependencies": { 782 | "fill-range": "^7.0.1" 783 | }, 784 | "engines": { 785 | "node": ">=8" 786 | } 787 | }, 788 | "node_modules/browserslist": { 789 | "version": "4.22.1", 790 | "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.1.tgz", 791 | "integrity": "sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==", 792 | "dev": true, 793 | "funding": [ 794 | { 795 | "type": "opencollective", 796 | "url": "https://opencollective.com/browserslist" 797 | }, 798 | { 799 | "type": "tidelift", 800 | "url": "https://tidelift.com/funding/github/npm/browserslist" 801 | }, 802 | { 803 | "type": "github", 804 | "url": "https://github.com/sponsors/ai" 805 | } 806 | ], 807 | "dependencies": { 808 | "caniuse-lite": "^1.0.30001541", 809 | "electron-to-chromium": "^1.4.535", 810 | "node-releases": "^2.0.13", 811 | "update-browserslist-db": "^1.0.13" 812 | }, 813 | "bin": { 814 | "browserslist": "cli.js" 815 | }, 816 | "engines": { 817 | "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" 818 | } 819 | }, 820 | "node_modules/buffer-from": { 821 | "version": "1.1.2", 822 | "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", 823 | "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", 824 | "dev": true 825 | }, 826 | "node_modules/callsites": { 827 | "version": "3.1.0", 828 | "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", 829 | "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", 830 | "dev": true, 831 | "engines": { 832 | "node": ">=6" 833 | } 834 | }, 835 | "node_modules/caniuse-lite": { 836 | "version": "1.0.30001555", 837 | "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001555.tgz", 838 | "integrity": "sha512-NzbUFKUnJ3DTcq6YyZB6+qqhfD112uR3uoEnkmfzm2wVzUNsFkU7AwBjKQ654Sp5cau0JxhFyRSn/tQZ+XfygA==", 839 | "dev": true, 840 | "funding": [ 841 | { 842 | "type": "opencollective", 843 | "url": "https://opencollective.com/browserslist" 844 | }, 845 | { 846 | "type": "tidelift", 847 | "url": "https://tidelift.com/funding/github/npm/caniuse-lite" 848 | }, 849 | { 850 | "type": "github", 851 | "url": "https://github.com/sponsors/ai" 852 | } 853 | ] 854 | }, 855 | "node_modules/chalk": { 856 | "version": "4.1.2", 857 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", 858 | "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", 859 | "dev": true, 860 | "dependencies": { 861 | "ansi-styles": "^4.1.0", 862 | "supports-color": "^7.1.0" 863 | }, 864 | "engines": { 865 | "node": ">=10" 866 | }, 867 | "funding": { 868 | "url": "https://github.com/chalk/chalk?sponsor=1" 869 | } 870 | }, 871 | "node_modules/chalk/node_modules/supports-color": { 872 | "version": "7.2.0", 873 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", 874 | "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", 875 | "dev": true, 876 | "dependencies": { 877 | "has-flag": "^4.0.0" 878 | }, 879 | "engines": { 880 | "node": ">=8" 881 | } 882 | }, 883 | "node_modules/chrome-trace-event": { 884 | "version": "1.0.3", 885 | "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", 886 | "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", 887 | "dev": true, 888 | "engines": { 889 | "node": ">=6.0" 890 | } 891 | }, 892 | "node_modules/clone-deep": { 893 | "version": "4.0.1", 894 | "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", 895 | "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", 896 | "dev": true, 897 | "dependencies": { 898 | "is-plain-object": "^2.0.4", 899 | "kind-of": "^6.0.2", 900 | "shallow-clone": "^3.0.0" 901 | }, 902 | "engines": { 903 | "node": ">=6" 904 | } 905 | }, 906 | "node_modules/color-convert": { 907 | "version": "2.0.1", 908 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 909 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 910 | "dev": true, 911 | "dependencies": { 912 | "color-name": "~1.1.4" 913 | }, 914 | "engines": { 915 | "node": ">=7.0.0" 916 | } 917 | }, 918 | "node_modules/color-name": { 919 | "version": "1.1.4", 920 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 921 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 922 | "dev": true 923 | }, 924 | "node_modules/colorette": { 925 | "version": "2.0.20", 926 | "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", 927 | "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", 928 | "dev": true 929 | }, 930 | "node_modules/commander": { 931 | "version": "2.20.3", 932 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", 933 | "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", 934 | "dev": true 935 | }, 936 | "node_modules/concat-map": { 937 | "version": "0.0.1", 938 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 939 | "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", 940 | "dev": true 941 | }, 942 | "node_modules/cross-spawn": { 943 | "version": "7.0.3", 944 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", 945 | "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", 946 | "dev": true, 947 | "dependencies": { 948 | "path-key": "^3.1.0", 949 | "shebang-command": "^2.0.0", 950 | "which": "^2.0.1" 951 | }, 952 | "engines": { 953 | "node": ">= 8" 954 | } 955 | }, 956 | "node_modules/debug": { 957 | "version": "4.3.4", 958 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", 959 | "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", 960 | "dev": true, 961 | "dependencies": { 962 | "ms": "2.1.2" 963 | }, 964 | "engines": { 965 | "node": ">=6.0" 966 | }, 967 | "peerDependenciesMeta": { 968 | "supports-color": { 969 | "optional": true 970 | } 971 | } 972 | }, 973 | "node_modules/deep-is": { 974 | "version": "0.1.4", 975 | "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", 976 | "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", 977 | "dev": true 978 | }, 979 | "node_modules/dir-glob": { 980 | "version": "3.0.1", 981 | "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", 982 | "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", 983 | "dev": true, 984 | "dependencies": { 985 | "path-type": "^4.0.0" 986 | }, 987 | "engines": { 988 | "node": ">=8" 989 | } 990 | }, 991 | "node_modules/doctrine": { 992 | "version": "3.0.0", 993 | "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", 994 | "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", 995 | "dev": true, 996 | "dependencies": { 997 | "esutils": "^2.0.2" 998 | }, 999 | "engines": { 1000 | "node": ">=6.0.0" 1001 | } 1002 | }, 1003 | "node_modules/electron-to-chromium": { 1004 | "version": "1.4.569", 1005 | "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.569.tgz", 1006 | "integrity": "sha512-LsrJjZ0IbVy12ApW3gpYpcmHS3iRxH4bkKOW98y1/D+3cvDUWGcbzbsFinfUS8knpcZk/PG/2p/RnkMCYN7PVg==", 1007 | "dev": true 1008 | }, 1009 | "node_modules/enhanced-resolve": { 1010 | "version": "5.15.0", 1011 | "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz", 1012 | "integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==", 1013 | "dev": true, 1014 | "dependencies": { 1015 | "graceful-fs": "^4.2.4", 1016 | "tapable": "^2.2.0" 1017 | }, 1018 | "engines": { 1019 | "node": ">=10.13.0" 1020 | } 1021 | }, 1022 | "node_modules/envinfo": { 1023 | "version": "7.10.0", 1024 | "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.10.0.tgz", 1025 | "integrity": "sha512-ZtUjZO6l5mwTHvc1L9+1q5p/R3wTopcfqMW8r5t8SJSKqeVI/LtajORwRFEKpEFuekjD0VBjwu1HMxL4UalIRw==", 1026 | "dev": true, 1027 | "bin": { 1028 | "envinfo": "dist/cli.js" 1029 | }, 1030 | "engines": { 1031 | "node": ">=4" 1032 | } 1033 | }, 1034 | "node_modules/es-module-lexer": { 1035 | "version": "1.3.1", 1036 | "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.3.1.tgz", 1037 | "integrity": "sha512-JUFAyicQV9mXc3YRxPnDlrfBKpqt6hUYzz9/boprUJHs4e4KVr3XwOF70doO6gwXUor6EWZJAyWAfKki84t20Q==", 1038 | "dev": true 1039 | }, 1040 | "node_modules/escalade": { 1041 | "version": "3.1.1", 1042 | "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", 1043 | "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", 1044 | "dev": true, 1045 | "engines": { 1046 | "node": ">=6" 1047 | } 1048 | }, 1049 | "node_modules/escape-string-regexp": { 1050 | "version": "4.0.0", 1051 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", 1052 | "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", 1053 | "dev": true, 1054 | "engines": { 1055 | "node": ">=10" 1056 | }, 1057 | "funding": { 1058 | "url": "https://github.com/sponsors/sindresorhus" 1059 | } 1060 | }, 1061 | "node_modules/eslint": { 1062 | "version": "8.53.0", 1063 | "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.53.0.tgz", 1064 | "integrity": "sha512-N4VuiPjXDUa4xVeV/GC/RV3hQW9Nw+Y463lkWaKKXKYMvmRiRDAtfpuPFLN+E1/6ZhyR8J2ig+eVREnYgUsiag==", 1065 | "dev": true, 1066 | "dependencies": { 1067 | "@eslint-community/eslint-utils": "^4.2.0", 1068 | "@eslint-community/regexpp": "^4.6.1", 1069 | "@eslint/eslintrc": "^2.1.3", 1070 | "@eslint/js": "8.53.0", 1071 | "@humanwhocodes/config-array": "^0.11.13", 1072 | "@humanwhocodes/module-importer": "^1.0.1", 1073 | "@nodelib/fs.walk": "^1.2.8", 1074 | "@ungap/structured-clone": "^1.2.0", 1075 | "ajv": "^6.12.4", 1076 | "chalk": "^4.0.0", 1077 | "cross-spawn": "^7.0.2", 1078 | "debug": "^4.3.2", 1079 | "doctrine": "^3.0.0", 1080 | "escape-string-regexp": "^4.0.0", 1081 | "eslint-scope": "^7.2.2", 1082 | "eslint-visitor-keys": "^3.4.3", 1083 | "espree": "^9.6.1", 1084 | "esquery": "^1.4.2", 1085 | "esutils": "^2.0.2", 1086 | "fast-deep-equal": "^3.1.3", 1087 | "file-entry-cache": "^6.0.1", 1088 | "find-up": "^5.0.0", 1089 | "glob-parent": "^6.0.2", 1090 | "globals": "^13.19.0", 1091 | "graphemer": "^1.4.0", 1092 | "ignore": "^5.2.0", 1093 | "imurmurhash": "^0.1.4", 1094 | "is-glob": "^4.0.0", 1095 | "is-path-inside": "^3.0.3", 1096 | "js-yaml": "^4.1.0", 1097 | "json-stable-stringify-without-jsonify": "^1.0.1", 1098 | "levn": "^0.4.1", 1099 | "lodash.merge": "^4.6.2", 1100 | "minimatch": "^3.1.2", 1101 | "natural-compare": "^1.4.0", 1102 | "optionator": "^0.9.3", 1103 | "strip-ansi": "^6.0.1", 1104 | "text-table": "^0.2.0" 1105 | }, 1106 | "bin": { 1107 | "eslint": "bin/eslint.js" 1108 | }, 1109 | "engines": { 1110 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 1111 | }, 1112 | "funding": { 1113 | "url": "https://opencollective.com/eslint" 1114 | } 1115 | }, 1116 | "node_modules/eslint-scope": { 1117 | "version": "5.1.1", 1118 | "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", 1119 | "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", 1120 | "dev": true, 1121 | "dependencies": { 1122 | "esrecurse": "^4.3.0", 1123 | "estraverse": "^4.1.1" 1124 | }, 1125 | "engines": { 1126 | "node": ">=8.0.0" 1127 | } 1128 | }, 1129 | "node_modules/eslint-visitor-keys": { 1130 | "version": "3.4.3", 1131 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", 1132 | "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", 1133 | "dev": true, 1134 | "engines": { 1135 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 1136 | }, 1137 | "funding": { 1138 | "url": "https://opencollective.com/eslint" 1139 | } 1140 | }, 1141 | "node_modules/eslint/node_modules/eslint-scope": { 1142 | "version": "7.2.2", 1143 | "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", 1144 | "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", 1145 | "dev": true, 1146 | "dependencies": { 1147 | "esrecurse": "^4.3.0", 1148 | "estraverse": "^5.2.0" 1149 | }, 1150 | "engines": { 1151 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 1152 | }, 1153 | "funding": { 1154 | "url": "https://opencollective.com/eslint" 1155 | } 1156 | }, 1157 | "node_modules/eslint/node_modules/estraverse": { 1158 | "version": "5.3.0", 1159 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", 1160 | "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", 1161 | "dev": true, 1162 | "engines": { 1163 | "node": ">=4.0" 1164 | } 1165 | }, 1166 | "node_modules/eslint/node_modules/find-up": { 1167 | "version": "5.0.0", 1168 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", 1169 | "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", 1170 | "dev": true, 1171 | "dependencies": { 1172 | "locate-path": "^6.0.0", 1173 | "path-exists": "^4.0.0" 1174 | }, 1175 | "engines": { 1176 | "node": ">=10" 1177 | }, 1178 | "funding": { 1179 | "url": "https://github.com/sponsors/sindresorhus" 1180 | } 1181 | }, 1182 | "node_modules/eslint/node_modules/locate-path": { 1183 | "version": "6.0.0", 1184 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", 1185 | "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", 1186 | "dev": true, 1187 | "dependencies": { 1188 | "p-locate": "^5.0.0" 1189 | }, 1190 | "engines": { 1191 | "node": ">=10" 1192 | }, 1193 | "funding": { 1194 | "url": "https://github.com/sponsors/sindresorhus" 1195 | } 1196 | }, 1197 | "node_modules/eslint/node_modules/p-limit": { 1198 | "version": "3.1.0", 1199 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", 1200 | "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", 1201 | "dev": true, 1202 | "dependencies": { 1203 | "yocto-queue": "^0.1.0" 1204 | }, 1205 | "engines": { 1206 | "node": ">=10" 1207 | }, 1208 | "funding": { 1209 | "url": "https://github.com/sponsors/sindresorhus" 1210 | } 1211 | }, 1212 | "node_modules/eslint/node_modules/p-locate": { 1213 | "version": "5.0.0", 1214 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", 1215 | "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", 1216 | "dev": true, 1217 | "dependencies": { 1218 | "p-limit": "^3.0.2" 1219 | }, 1220 | "engines": { 1221 | "node": ">=10" 1222 | }, 1223 | "funding": { 1224 | "url": "https://github.com/sponsors/sindresorhus" 1225 | } 1226 | }, 1227 | "node_modules/espree": { 1228 | "version": "9.6.1", 1229 | "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", 1230 | "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", 1231 | "dev": true, 1232 | "dependencies": { 1233 | "acorn": "^8.9.0", 1234 | "acorn-jsx": "^5.3.2", 1235 | "eslint-visitor-keys": "^3.4.1" 1236 | }, 1237 | "engines": { 1238 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 1239 | }, 1240 | "funding": { 1241 | "url": "https://opencollective.com/eslint" 1242 | } 1243 | }, 1244 | "node_modules/esquery": { 1245 | "version": "1.5.0", 1246 | "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", 1247 | "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", 1248 | "dev": true, 1249 | "dependencies": { 1250 | "estraverse": "^5.1.0" 1251 | }, 1252 | "engines": { 1253 | "node": ">=0.10" 1254 | } 1255 | }, 1256 | "node_modules/esquery/node_modules/estraverse": { 1257 | "version": "5.3.0", 1258 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", 1259 | "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", 1260 | "dev": true, 1261 | "engines": { 1262 | "node": ">=4.0" 1263 | } 1264 | }, 1265 | "node_modules/esrecurse": { 1266 | "version": "4.3.0", 1267 | "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", 1268 | "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", 1269 | "dev": true, 1270 | "dependencies": { 1271 | "estraverse": "^5.2.0" 1272 | }, 1273 | "engines": { 1274 | "node": ">=4.0" 1275 | } 1276 | }, 1277 | "node_modules/esrecurse/node_modules/estraverse": { 1278 | "version": "5.3.0", 1279 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", 1280 | "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", 1281 | "dev": true, 1282 | "engines": { 1283 | "node": ">=4.0" 1284 | } 1285 | }, 1286 | "node_modules/estraverse": { 1287 | "version": "4.3.0", 1288 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", 1289 | "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", 1290 | "dev": true, 1291 | "engines": { 1292 | "node": ">=4.0" 1293 | } 1294 | }, 1295 | "node_modules/esutils": { 1296 | "version": "2.0.3", 1297 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", 1298 | "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", 1299 | "dev": true, 1300 | "engines": { 1301 | "node": ">=0.10.0" 1302 | } 1303 | }, 1304 | "node_modules/events": { 1305 | "version": "3.3.0", 1306 | "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", 1307 | "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", 1308 | "dev": true, 1309 | "engines": { 1310 | "node": ">=0.8.x" 1311 | } 1312 | }, 1313 | "node_modules/fast-deep-equal": { 1314 | "version": "3.1.3", 1315 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", 1316 | "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", 1317 | "dev": true 1318 | }, 1319 | "node_modules/fast-glob": { 1320 | "version": "3.3.2", 1321 | "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", 1322 | "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", 1323 | "dev": true, 1324 | "dependencies": { 1325 | "@nodelib/fs.stat": "^2.0.2", 1326 | "@nodelib/fs.walk": "^1.2.3", 1327 | "glob-parent": "^5.1.2", 1328 | "merge2": "^1.3.0", 1329 | "micromatch": "^4.0.4" 1330 | }, 1331 | "engines": { 1332 | "node": ">=8.6.0" 1333 | } 1334 | }, 1335 | "node_modules/fast-glob/node_modules/glob-parent": { 1336 | "version": "5.1.2", 1337 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 1338 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 1339 | "dev": true, 1340 | "dependencies": { 1341 | "is-glob": "^4.0.1" 1342 | }, 1343 | "engines": { 1344 | "node": ">= 6" 1345 | } 1346 | }, 1347 | "node_modules/fast-json-stable-stringify": { 1348 | "version": "2.1.0", 1349 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", 1350 | "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", 1351 | "dev": true 1352 | }, 1353 | "node_modules/fast-levenshtein": { 1354 | "version": "2.0.6", 1355 | "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", 1356 | "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", 1357 | "dev": true 1358 | }, 1359 | "node_modules/fastest-levenshtein": { 1360 | "version": "1.0.16", 1361 | "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", 1362 | "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", 1363 | "dev": true, 1364 | "engines": { 1365 | "node": ">= 4.9.1" 1366 | } 1367 | }, 1368 | "node_modules/fastq": { 1369 | "version": "1.15.0", 1370 | "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", 1371 | "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", 1372 | "dev": true, 1373 | "dependencies": { 1374 | "reusify": "^1.0.4" 1375 | } 1376 | }, 1377 | "node_modules/file-entry-cache": { 1378 | "version": "6.0.1", 1379 | "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", 1380 | "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", 1381 | "dev": true, 1382 | "dependencies": { 1383 | "flat-cache": "^3.0.4" 1384 | }, 1385 | "engines": { 1386 | "node": "^10.12.0 || >=12.0.0" 1387 | } 1388 | }, 1389 | "node_modules/fill-range": { 1390 | "version": "7.0.1", 1391 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", 1392 | "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", 1393 | "dev": true, 1394 | "dependencies": { 1395 | "to-regex-range": "^5.0.1" 1396 | }, 1397 | "engines": { 1398 | "node": ">=8" 1399 | } 1400 | }, 1401 | "node_modules/find-up": { 1402 | "version": "4.1.0", 1403 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", 1404 | "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", 1405 | "dev": true, 1406 | "dependencies": { 1407 | "locate-path": "^5.0.0", 1408 | "path-exists": "^4.0.0" 1409 | }, 1410 | "engines": { 1411 | "node": ">=8" 1412 | } 1413 | }, 1414 | "node_modules/flat": { 1415 | "version": "5.0.2", 1416 | "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", 1417 | "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", 1418 | "dev": true, 1419 | "bin": { 1420 | "flat": "cli.js" 1421 | } 1422 | }, 1423 | "node_modules/flat-cache": { 1424 | "version": "3.1.1", 1425 | "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.1.1.tgz", 1426 | "integrity": "sha512-/qM2b3LUIaIgviBQovTLvijfyOQXPtSRnRK26ksj2J7rzPIecePUIpJsZ4T02Qg+xiAEKIs5K8dsHEd+VaKa/Q==", 1427 | "dev": true, 1428 | "dependencies": { 1429 | "flatted": "^3.2.9", 1430 | "keyv": "^4.5.3", 1431 | "rimraf": "^3.0.2" 1432 | }, 1433 | "engines": { 1434 | "node": ">=12.0.0" 1435 | } 1436 | }, 1437 | "node_modules/flatted": { 1438 | "version": "3.2.9", 1439 | "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz", 1440 | "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==", 1441 | "dev": true 1442 | }, 1443 | "node_modules/fs.realpath": { 1444 | "version": "1.0.0", 1445 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 1446 | "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", 1447 | "dev": true 1448 | }, 1449 | "node_modules/function-bind": { 1450 | "version": "1.1.2", 1451 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", 1452 | "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", 1453 | "dev": true, 1454 | "funding": { 1455 | "url": "https://github.com/sponsors/ljharb" 1456 | } 1457 | }, 1458 | "node_modules/glob": { 1459 | "version": "7.2.3", 1460 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", 1461 | "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", 1462 | "dev": true, 1463 | "dependencies": { 1464 | "fs.realpath": "^1.0.0", 1465 | "inflight": "^1.0.4", 1466 | "inherits": "2", 1467 | "minimatch": "^3.1.1", 1468 | "once": "^1.3.0", 1469 | "path-is-absolute": "^1.0.0" 1470 | }, 1471 | "engines": { 1472 | "node": "*" 1473 | }, 1474 | "funding": { 1475 | "url": "https://github.com/sponsors/isaacs" 1476 | } 1477 | }, 1478 | "node_modules/glob-parent": { 1479 | "version": "6.0.2", 1480 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", 1481 | "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", 1482 | "dev": true, 1483 | "dependencies": { 1484 | "is-glob": "^4.0.3" 1485 | }, 1486 | "engines": { 1487 | "node": ">=10.13.0" 1488 | } 1489 | }, 1490 | "node_modules/glob-to-regexp": { 1491 | "version": "0.4.1", 1492 | "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", 1493 | "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", 1494 | "dev": true 1495 | }, 1496 | "node_modules/globals": { 1497 | "version": "13.23.0", 1498 | "resolved": "https://registry.npmjs.org/globals/-/globals-13.23.0.tgz", 1499 | "integrity": "sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==", 1500 | "dev": true, 1501 | "dependencies": { 1502 | "type-fest": "^0.20.2" 1503 | }, 1504 | "engines": { 1505 | "node": ">=8" 1506 | }, 1507 | "funding": { 1508 | "url": "https://github.com/sponsors/sindresorhus" 1509 | } 1510 | }, 1511 | "node_modules/globby": { 1512 | "version": "11.1.0", 1513 | "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", 1514 | "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", 1515 | "dev": true, 1516 | "dependencies": { 1517 | "array-union": "^2.1.0", 1518 | "dir-glob": "^3.0.1", 1519 | "fast-glob": "^3.2.9", 1520 | "ignore": "^5.2.0", 1521 | "merge2": "^1.4.1", 1522 | "slash": "^3.0.0" 1523 | }, 1524 | "engines": { 1525 | "node": ">=10" 1526 | }, 1527 | "funding": { 1528 | "url": "https://github.com/sponsors/sindresorhus" 1529 | } 1530 | }, 1531 | "node_modules/graceful-fs": { 1532 | "version": "4.2.11", 1533 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", 1534 | "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", 1535 | "dev": true 1536 | }, 1537 | "node_modules/graphemer": { 1538 | "version": "1.4.0", 1539 | "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", 1540 | "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", 1541 | "dev": true 1542 | }, 1543 | "node_modules/has-flag": { 1544 | "version": "4.0.0", 1545 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 1546 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", 1547 | "dev": true, 1548 | "engines": { 1549 | "node": ">=8" 1550 | } 1551 | }, 1552 | "node_modules/hasown": { 1553 | "version": "2.0.0", 1554 | "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", 1555 | "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", 1556 | "dev": true, 1557 | "dependencies": { 1558 | "function-bind": "^1.1.2" 1559 | }, 1560 | "engines": { 1561 | "node": ">= 0.4" 1562 | } 1563 | }, 1564 | "node_modules/ignore": { 1565 | "version": "5.2.4", 1566 | "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", 1567 | "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", 1568 | "dev": true, 1569 | "engines": { 1570 | "node": ">= 4" 1571 | } 1572 | }, 1573 | "node_modules/import-fresh": { 1574 | "version": "3.3.0", 1575 | "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", 1576 | "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", 1577 | "dev": true, 1578 | "dependencies": { 1579 | "parent-module": "^1.0.0", 1580 | "resolve-from": "^4.0.0" 1581 | }, 1582 | "engines": { 1583 | "node": ">=6" 1584 | }, 1585 | "funding": { 1586 | "url": "https://github.com/sponsors/sindresorhus" 1587 | } 1588 | }, 1589 | "node_modules/import-fresh/node_modules/resolve-from": { 1590 | "version": "4.0.0", 1591 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", 1592 | "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", 1593 | "dev": true, 1594 | "engines": { 1595 | "node": ">=4" 1596 | } 1597 | }, 1598 | "node_modules/import-local": { 1599 | "version": "3.1.0", 1600 | "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", 1601 | "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", 1602 | "dev": true, 1603 | "dependencies": { 1604 | "pkg-dir": "^4.2.0", 1605 | "resolve-cwd": "^3.0.0" 1606 | }, 1607 | "bin": { 1608 | "import-local-fixture": "fixtures/cli.js" 1609 | }, 1610 | "engines": { 1611 | "node": ">=8" 1612 | }, 1613 | "funding": { 1614 | "url": "https://github.com/sponsors/sindresorhus" 1615 | } 1616 | }, 1617 | "node_modules/imurmurhash": { 1618 | "version": "0.1.4", 1619 | "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", 1620 | "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", 1621 | "dev": true, 1622 | "engines": { 1623 | "node": ">=0.8.19" 1624 | } 1625 | }, 1626 | "node_modules/inflight": { 1627 | "version": "1.0.6", 1628 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 1629 | "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", 1630 | "dev": true, 1631 | "dependencies": { 1632 | "once": "^1.3.0", 1633 | "wrappy": "1" 1634 | } 1635 | }, 1636 | "node_modules/inherits": { 1637 | "version": "2.0.4", 1638 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 1639 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", 1640 | "dev": true 1641 | }, 1642 | "node_modules/interpret": { 1643 | "version": "3.1.1", 1644 | "resolved": "https://registry.npmjs.org/interpret/-/interpret-3.1.1.tgz", 1645 | "integrity": "sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==", 1646 | "dev": true, 1647 | "engines": { 1648 | "node": ">=10.13.0" 1649 | } 1650 | }, 1651 | "node_modules/is-core-module": { 1652 | "version": "2.13.1", 1653 | "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", 1654 | "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", 1655 | "dev": true, 1656 | "dependencies": { 1657 | "hasown": "^2.0.0" 1658 | }, 1659 | "funding": { 1660 | "url": "https://github.com/sponsors/ljharb" 1661 | } 1662 | }, 1663 | "node_modules/is-extglob": { 1664 | "version": "2.1.1", 1665 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 1666 | "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", 1667 | "dev": true, 1668 | "engines": { 1669 | "node": ">=0.10.0" 1670 | } 1671 | }, 1672 | "node_modules/is-glob": { 1673 | "version": "4.0.3", 1674 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", 1675 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 1676 | "dev": true, 1677 | "dependencies": { 1678 | "is-extglob": "^2.1.1" 1679 | }, 1680 | "engines": { 1681 | "node": ">=0.10.0" 1682 | } 1683 | }, 1684 | "node_modules/is-number": { 1685 | "version": "7.0.0", 1686 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", 1687 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", 1688 | "dev": true, 1689 | "engines": { 1690 | "node": ">=0.12.0" 1691 | } 1692 | }, 1693 | "node_modules/is-path-inside": { 1694 | "version": "3.0.3", 1695 | "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", 1696 | "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", 1697 | "dev": true, 1698 | "engines": { 1699 | "node": ">=8" 1700 | } 1701 | }, 1702 | "node_modules/is-plain-object": { 1703 | "version": "2.0.4", 1704 | "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", 1705 | "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", 1706 | "dev": true, 1707 | "dependencies": { 1708 | "isobject": "^3.0.1" 1709 | }, 1710 | "engines": { 1711 | "node": ">=0.10.0" 1712 | } 1713 | }, 1714 | "node_modules/isexe": { 1715 | "version": "2.0.0", 1716 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 1717 | "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", 1718 | "dev": true 1719 | }, 1720 | "node_modules/isobject": { 1721 | "version": "3.0.1", 1722 | "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", 1723 | "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", 1724 | "dev": true, 1725 | "engines": { 1726 | "node": ">=0.10.0" 1727 | } 1728 | }, 1729 | "node_modules/jest-worker": { 1730 | "version": "27.5.1", 1731 | "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", 1732 | "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", 1733 | "dev": true, 1734 | "dependencies": { 1735 | "@types/node": "*", 1736 | "merge-stream": "^2.0.0", 1737 | "supports-color": "^8.0.0" 1738 | }, 1739 | "engines": { 1740 | "node": ">= 10.13.0" 1741 | } 1742 | }, 1743 | "node_modules/js-yaml": { 1744 | "version": "4.1.0", 1745 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", 1746 | "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", 1747 | "dev": true, 1748 | "dependencies": { 1749 | "argparse": "^2.0.1" 1750 | }, 1751 | "bin": { 1752 | "js-yaml": "bin/js-yaml.js" 1753 | } 1754 | }, 1755 | "node_modules/json-buffer": { 1756 | "version": "3.0.1", 1757 | "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", 1758 | "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", 1759 | "dev": true 1760 | }, 1761 | "node_modules/json-parse-even-better-errors": { 1762 | "version": "2.3.1", 1763 | "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", 1764 | "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", 1765 | "dev": true 1766 | }, 1767 | "node_modules/json-schema-traverse": { 1768 | "version": "0.4.1", 1769 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", 1770 | "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", 1771 | "dev": true 1772 | }, 1773 | "node_modules/json-stable-stringify-without-jsonify": { 1774 | "version": "1.0.1", 1775 | "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", 1776 | "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", 1777 | "dev": true 1778 | }, 1779 | "node_modules/keyv": { 1780 | "version": "4.5.4", 1781 | "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", 1782 | "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", 1783 | "dev": true, 1784 | "dependencies": { 1785 | "json-buffer": "3.0.1" 1786 | } 1787 | }, 1788 | "node_modules/kind-of": { 1789 | "version": "6.0.3", 1790 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", 1791 | "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", 1792 | "dev": true, 1793 | "engines": { 1794 | "node": ">=0.10.0" 1795 | } 1796 | }, 1797 | "node_modules/levn": { 1798 | "version": "0.4.1", 1799 | "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", 1800 | "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", 1801 | "dev": true, 1802 | "dependencies": { 1803 | "prelude-ls": "^1.2.1", 1804 | "type-check": "~0.4.0" 1805 | }, 1806 | "engines": { 1807 | "node": ">= 0.8.0" 1808 | } 1809 | }, 1810 | "node_modules/loader-runner": { 1811 | "version": "4.3.0", 1812 | "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", 1813 | "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", 1814 | "dev": true, 1815 | "engines": { 1816 | "node": ">=6.11.5" 1817 | } 1818 | }, 1819 | "node_modules/locate-path": { 1820 | "version": "5.0.0", 1821 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", 1822 | "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", 1823 | "dev": true, 1824 | "dependencies": { 1825 | "p-locate": "^4.1.0" 1826 | }, 1827 | "engines": { 1828 | "node": ">=8" 1829 | } 1830 | }, 1831 | "node_modules/lodash.merge": { 1832 | "version": "4.6.2", 1833 | "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", 1834 | "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", 1835 | "dev": true 1836 | }, 1837 | "node_modules/lru-cache": { 1838 | "version": "6.0.0", 1839 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", 1840 | "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", 1841 | "dev": true, 1842 | "dependencies": { 1843 | "yallist": "^4.0.0" 1844 | }, 1845 | "engines": { 1846 | "node": ">=10" 1847 | } 1848 | }, 1849 | "node_modules/merge-stream": { 1850 | "version": "2.0.0", 1851 | "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", 1852 | "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", 1853 | "dev": true 1854 | }, 1855 | "node_modules/merge2": { 1856 | "version": "1.4.1", 1857 | "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", 1858 | "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", 1859 | "dev": true, 1860 | "engines": { 1861 | "node": ">= 8" 1862 | } 1863 | }, 1864 | "node_modules/micromatch": { 1865 | "version": "4.0.5", 1866 | "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", 1867 | "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", 1868 | "dev": true, 1869 | "dependencies": { 1870 | "braces": "^3.0.2", 1871 | "picomatch": "^2.3.1" 1872 | }, 1873 | "engines": { 1874 | "node": ">=8.6" 1875 | } 1876 | }, 1877 | "node_modules/mime-db": { 1878 | "version": "1.52.0", 1879 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", 1880 | "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", 1881 | "dev": true, 1882 | "engines": { 1883 | "node": ">= 0.6" 1884 | } 1885 | }, 1886 | "node_modules/mime-types": { 1887 | "version": "2.1.35", 1888 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", 1889 | "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", 1890 | "dev": true, 1891 | "dependencies": { 1892 | "mime-db": "1.52.0" 1893 | }, 1894 | "engines": { 1895 | "node": ">= 0.6" 1896 | } 1897 | }, 1898 | "node_modules/minimatch": { 1899 | "version": "3.1.2", 1900 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 1901 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 1902 | "dev": true, 1903 | "dependencies": { 1904 | "brace-expansion": "^1.1.7" 1905 | }, 1906 | "engines": { 1907 | "node": "*" 1908 | } 1909 | }, 1910 | "node_modules/ms": { 1911 | "version": "2.1.2", 1912 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 1913 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", 1914 | "dev": true 1915 | }, 1916 | "node_modules/natural-compare": { 1917 | "version": "1.4.0", 1918 | "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", 1919 | "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", 1920 | "dev": true 1921 | }, 1922 | "node_modules/neo-async": { 1923 | "version": "2.6.2", 1924 | "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", 1925 | "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", 1926 | "dev": true 1927 | }, 1928 | "node_modules/node-releases": { 1929 | "version": "2.0.13", 1930 | "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", 1931 | "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==", 1932 | "dev": true 1933 | }, 1934 | "node_modules/once": { 1935 | "version": "1.4.0", 1936 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 1937 | "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", 1938 | "dev": true, 1939 | "dependencies": { 1940 | "wrappy": "1" 1941 | } 1942 | }, 1943 | "node_modules/optionator": { 1944 | "version": "0.9.3", 1945 | "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", 1946 | "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", 1947 | "dev": true, 1948 | "dependencies": { 1949 | "@aashutoshrathi/word-wrap": "^1.2.3", 1950 | "deep-is": "^0.1.3", 1951 | "fast-levenshtein": "^2.0.6", 1952 | "levn": "^0.4.1", 1953 | "prelude-ls": "^1.2.1", 1954 | "type-check": "^0.4.0" 1955 | }, 1956 | "engines": { 1957 | "node": ">= 0.8.0" 1958 | } 1959 | }, 1960 | "node_modules/p-limit": { 1961 | "version": "2.3.0", 1962 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", 1963 | "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", 1964 | "dev": true, 1965 | "dependencies": { 1966 | "p-try": "^2.0.0" 1967 | }, 1968 | "engines": { 1969 | "node": ">=6" 1970 | }, 1971 | "funding": { 1972 | "url": "https://github.com/sponsors/sindresorhus" 1973 | } 1974 | }, 1975 | "node_modules/p-locate": { 1976 | "version": "4.1.0", 1977 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", 1978 | "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", 1979 | "dev": true, 1980 | "dependencies": { 1981 | "p-limit": "^2.2.0" 1982 | }, 1983 | "engines": { 1984 | "node": ">=8" 1985 | } 1986 | }, 1987 | "node_modules/p-try": { 1988 | "version": "2.2.0", 1989 | "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", 1990 | "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", 1991 | "dev": true, 1992 | "engines": { 1993 | "node": ">=6" 1994 | } 1995 | }, 1996 | "node_modules/parent-module": { 1997 | "version": "1.0.1", 1998 | "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", 1999 | "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", 2000 | "dev": true, 2001 | "dependencies": { 2002 | "callsites": "^3.0.0" 2003 | }, 2004 | "engines": { 2005 | "node": ">=6" 2006 | } 2007 | }, 2008 | "node_modules/path-exists": { 2009 | "version": "4.0.0", 2010 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", 2011 | "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", 2012 | "dev": true, 2013 | "engines": { 2014 | "node": ">=8" 2015 | } 2016 | }, 2017 | "node_modules/path-is-absolute": { 2018 | "version": "1.0.1", 2019 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 2020 | "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", 2021 | "dev": true, 2022 | "engines": { 2023 | "node": ">=0.10.0" 2024 | } 2025 | }, 2026 | "node_modules/path-key": { 2027 | "version": "3.1.1", 2028 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", 2029 | "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", 2030 | "dev": true, 2031 | "engines": { 2032 | "node": ">=8" 2033 | } 2034 | }, 2035 | "node_modules/path-parse": { 2036 | "version": "1.0.7", 2037 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", 2038 | "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", 2039 | "dev": true 2040 | }, 2041 | "node_modules/path-type": { 2042 | "version": "4.0.0", 2043 | "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", 2044 | "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", 2045 | "dev": true, 2046 | "engines": { 2047 | "node": ">=8" 2048 | } 2049 | }, 2050 | "node_modules/picocolors": { 2051 | "version": "1.0.0", 2052 | "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", 2053 | "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", 2054 | "dev": true 2055 | }, 2056 | "node_modules/picomatch": { 2057 | "version": "2.3.1", 2058 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", 2059 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", 2060 | "dev": true, 2061 | "engines": { 2062 | "node": ">=8.6" 2063 | }, 2064 | "funding": { 2065 | "url": "https://github.com/sponsors/jonschlinkert" 2066 | } 2067 | }, 2068 | "node_modules/pkg-dir": { 2069 | "version": "4.2.0", 2070 | "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", 2071 | "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", 2072 | "dev": true, 2073 | "dependencies": { 2074 | "find-up": "^4.0.0" 2075 | }, 2076 | "engines": { 2077 | "node": ">=8" 2078 | } 2079 | }, 2080 | "node_modules/prelude-ls": { 2081 | "version": "1.2.1", 2082 | "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", 2083 | "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", 2084 | "dev": true, 2085 | "engines": { 2086 | "node": ">= 0.8.0" 2087 | } 2088 | }, 2089 | "node_modules/punycode": { 2090 | "version": "2.3.0", 2091 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", 2092 | "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", 2093 | "dev": true, 2094 | "engines": { 2095 | "node": ">=6" 2096 | } 2097 | }, 2098 | "node_modules/queue-microtask": { 2099 | "version": "1.2.3", 2100 | "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", 2101 | "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", 2102 | "dev": true, 2103 | "funding": [ 2104 | { 2105 | "type": "github", 2106 | "url": "https://github.com/sponsors/feross" 2107 | }, 2108 | { 2109 | "type": "patreon", 2110 | "url": "https://www.patreon.com/feross" 2111 | }, 2112 | { 2113 | "type": "consulting", 2114 | "url": "https://feross.org/support" 2115 | } 2116 | ] 2117 | }, 2118 | "node_modules/randombytes": { 2119 | "version": "2.1.0", 2120 | "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", 2121 | "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", 2122 | "dev": true, 2123 | "dependencies": { 2124 | "safe-buffer": "^5.1.0" 2125 | } 2126 | }, 2127 | "node_modules/rechoir": { 2128 | "version": "0.8.0", 2129 | "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz", 2130 | "integrity": "sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==", 2131 | "dev": true, 2132 | "dependencies": { 2133 | "resolve": "^1.20.0" 2134 | }, 2135 | "engines": { 2136 | "node": ">= 10.13.0" 2137 | } 2138 | }, 2139 | "node_modules/resolve": { 2140 | "version": "1.22.8", 2141 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", 2142 | "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", 2143 | "dev": true, 2144 | "dependencies": { 2145 | "is-core-module": "^2.13.0", 2146 | "path-parse": "^1.0.7", 2147 | "supports-preserve-symlinks-flag": "^1.0.0" 2148 | }, 2149 | "bin": { 2150 | "resolve": "bin/resolve" 2151 | }, 2152 | "funding": { 2153 | "url": "https://github.com/sponsors/ljharb" 2154 | } 2155 | }, 2156 | "node_modules/resolve-cwd": { 2157 | "version": "3.0.0", 2158 | "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", 2159 | "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", 2160 | "dev": true, 2161 | "dependencies": { 2162 | "resolve-from": "^5.0.0" 2163 | }, 2164 | "engines": { 2165 | "node": ">=8" 2166 | } 2167 | }, 2168 | "node_modules/resolve-from": { 2169 | "version": "5.0.0", 2170 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", 2171 | "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", 2172 | "dev": true, 2173 | "engines": { 2174 | "node": ">=8" 2175 | } 2176 | }, 2177 | "node_modules/reusify": { 2178 | "version": "1.0.4", 2179 | "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", 2180 | "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", 2181 | "dev": true, 2182 | "engines": { 2183 | "iojs": ">=1.0.0", 2184 | "node": ">=0.10.0" 2185 | } 2186 | }, 2187 | "node_modules/rimraf": { 2188 | "version": "3.0.2", 2189 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", 2190 | "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", 2191 | "dev": true, 2192 | "dependencies": { 2193 | "glob": "^7.1.3" 2194 | }, 2195 | "bin": { 2196 | "rimraf": "bin.js" 2197 | }, 2198 | "funding": { 2199 | "url": "https://github.com/sponsors/isaacs" 2200 | } 2201 | }, 2202 | "node_modules/run-parallel": { 2203 | "version": "1.2.0", 2204 | "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", 2205 | "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", 2206 | "dev": true, 2207 | "funding": [ 2208 | { 2209 | "type": "github", 2210 | "url": "https://github.com/sponsors/feross" 2211 | }, 2212 | { 2213 | "type": "patreon", 2214 | "url": "https://www.patreon.com/feross" 2215 | }, 2216 | { 2217 | "type": "consulting", 2218 | "url": "https://feross.org/support" 2219 | } 2220 | ], 2221 | "dependencies": { 2222 | "queue-microtask": "^1.2.2" 2223 | } 2224 | }, 2225 | "node_modules/safe-buffer": { 2226 | "version": "5.2.1", 2227 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 2228 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", 2229 | "dev": true, 2230 | "funding": [ 2231 | { 2232 | "type": "github", 2233 | "url": "https://github.com/sponsors/feross" 2234 | }, 2235 | { 2236 | "type": "patreon", 2237 | "url": "https://www.patreon.com/feross" 2238 | }, 2239 | { 2240 | "type": "consulting", 2241 | "url": "https://feross.org/support" 2242 | } 2243 | ] 2244 | }, 2245 | "node_modules/schema-utils": { 2246 | "version": "3.3.0", 2247 | "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", 2248 | "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", 2249 | "dev": true, 2250 | "dependencies": { 2251 | "@types/json-schema": "^7.0.8", 2252 | "ajv": "^6.12.5", 2253 | "ajv-keywords": "^3.5.2" 2254 | }, 2255 | "engines": { 2256 | "node": ">= 10.13.0" 2257 | }, 2258 | "funding": { 2259 | "type": "opencollective", 2260 | "url": "https://opencollective.com/webpack" 2261 | } 2262 | }, 2263 | "node_modules/semver": { 2264 | "version": "7.5.4", 2265 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", 2266 | "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", 2267 | "dev": true, 2268 | "dependencies": { 2269 | "lru-cache": "^6.0.0" 2270 | }, 2271 | "bin": { 2272 | "semver": "bin/semver.js" 2273 | }, 2274 | "engines": { 2275 | "node": ">=10" 2276 | } 2277 | }, 2278 | "node_modules/serialize-javascript": { 2279 | "version": "6.0.1", 2280 | "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz", 2281 | "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==", 2282 | "dev": true, 2283 | "dependencies": { 2284 | "randombytes": "^2.1.0" 2285 | } 2286 | }, 2287 | "node_modules/shallow-clone": { 2288 | "version": "3.0.1", 2289 | "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", 2290 | "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", 2291 | "dev": true, 2292 | "dependencies": { 2293 | "kind-of": "^6.0.2" 2294 | }, 2295 | "engines": { 2296 | "node": ">=8" 2297 | } 2298 | }, 2299 | "node_modules/shebang-command": { 2300 | "version": "2.0.0", 2301 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", 2302 | "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", 2303 | "dev": true, 2304 | "dependencies": { 2305 | "shebang-regex": "^3.0.0" 2306 | }, 2307 | "engines": { 2308 | "node": ">=8" 2309 | } 2310 | }, 2311 | "node_modules/shebang-regex": { 2312 | "version": "3.0.0", 2313 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", 2314 | "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", 2315 | "dev": true, 2316 | "engines": { 2317 | "node": ">=8" 2318 | } 2319 | }, 2320 | "node_modules/slash": { 2321 | "version": "3.0.0", 2322 | "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", 2323 | "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", 2324 | "dev": true, 2325 | "engines": { 2326 | "node": ">=8" 2327 | } 2328 | }, 2329 | "node_modules/source-map": { 2330 | "version": "0.6.1", 2331 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", 2332 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", 2333 | "dev": true, 2334 | "engines": { 2335 | "node": ">=0.10.0" 2336 | } 2337 | }, 2338 | "node_modules/source-map-support": { 2339 | "version": "0.5.21", 2340 | "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", 2341 | "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", 2342 | "dev": true, 2343 | "dependencies": { 2344 | "buffer-from": "^1.0.0", 2345 | "source-map": "^0.6.0" 2346 | } 2347 | }, 2348 | "node_modules/strip-ansi": { 2349 | "version": "6.0.1", 2350 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 2351 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 2352 | "dev": true, 2353 | "dependencies": { 2354 | "ansi-regex": "^5.0.1" 2355 | }, 2356 | "engines": { 2357 | "node": ">=8" 2358 | } 2359 | }, 2360 | "node_modules/strip-json-comments": { 2361 | "version": "3.1.1", 2362 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", 2363 | "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", 2364 | "dev": true, 2365 | "engines": { 2366 | "node": ">=8" 2367 | }, 2368 | "funding": { 2369 | "url": "https://github.com/sponsors/sindresorhus" 2370 | } 2371 | }, 2372 | "node_modules/supports-color": { 2373 | "version": "8.1.1", 2374 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", 2375 | "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", 2376 | "dev": true, 2377 | "dependencies": { 2378 | "has-flag": "^4.0.0" 2379 | }, 2380 | "engines": { 2381 | "node": ">=10" 2382 | }, 2383 | "funding": { 2384 | "url": "https://github.com/chalk/supports-color?sponsor=1" 2385 | } 2386 | }, 2387 | "node_modules/supports-preserve-symlinks-flag": { 2388 | "version": "1.0.0", 2389 | "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", 2390 | "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", 2391 | "dev": true, 2392 | "engines": { 2393 | "node": ">= 0.4" 2394 | }, 2395 | "funding": { 2396 | "url": "https://github.com/sponsors/ljharb" 2397 | } 2398 | }, 2399 | "node_modules/tapable": { 2400 | "version": "2.2.1", 2401 | "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", 2402 | "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", 2403 | "dev": true, 2404 | "engines": { 2405 | "node": ">=6" 2406 | } 2407 | }, 2408 | "node_modules/terser": { 2409 | "version": "5.22.0", 2410 | "resolved": "https://registry.npmjs.org/terser/-/terser-5.22.0.tgz", 2411 | "integrity": "sha512-hHZVLgRA2z4NWcN6aS5rQDc+7Dcy58HOf2zbYwmFcQ+ua3h6eEFf5lIDKTzbWwlazPyOZsFQO8V80/IjVNExEw==", 2412 | "dev": true, 2413 | "dependencies": { 2414 | "@jridgewell/source-map": "^0.3.3", 2415 | "acorn": "^8.8.2", 2416 | "commander": "^2.20.0", 2417 | "source-map-support": "~0.5.20" 2418 | }, 2419 | "bin": { 2420 | "terser": "bin/terser" 2421 | }, 2422 | "engines": { 2423 | "node": ">=10" 2424 | } 2425 | }, 2426 | "node_modules/terser-webpack-plugin": { 2427 | "version": "5.3.9", 2428 | "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.9.tgz", 2429 | "integrity": "sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==", 2430 | "dev": true, 2431 | "dependencies": { 2432 | "@jridgewell/trace-mapping": "^0.3.17", 2433 | "jest-worker": "^27.4.5", 2434 | "schema-utils": "^3.1.1", 2435 | "serialize-javascript": "^6.0.1", 2436 | "terser": "^5.16.8" 2437 | }, 2438 | "engines": { 2439 | "node": ">= 10.13.0" 2440 | }, 2441 | "funding": { 2442 | "type": "opencollective", 2443 | "url": "https://opencollective.com/webpack" 2444 | }, 2445 | "peerDependencies": { 2446 | "webpack": "^5.1.0" 2447 | }, 2448 | "peerDependenciesMeta": { 2449 | "@swc/core": { 2450 | "optional": true 2451 | }, 2452 | "esbuild": { 2453 | "optional": true 2454 | }, 2455 | "uglify-js": { 2456 | "optional": true 2457 | } 2458 | } 2459 | }, 2460 | "node_modules/text-table": { 2461 | "version": "0.2.0", 2462 | "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", 2463 | "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", 2464 | "dev": true 2465 | }, 2466 | "node_modules/to-regex-range": { 2467 | "version": "5.0.1", 2468 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 2469 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 2470 | "dev": true, 2471 | "dependencies": { 2472 | "is-number": "^7.0.0" 2473 | }, 2474 | "engines": { 2475 | "node": ">=8.0" 2476 | } 2477 | }, 2478 | "node_modules/ts-api-utils": { 2479 | "version": "1.0.3", 2480 | "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.0.3.tgz", 2481 | "integrity": "sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==", 2482 | "dev": true, 2483 | "engines": { 2484 | "node": ">=16.13.0" 2485 | }, 2486 | "peerDependencies": { 2487 | "typescript": ">=4.2.0" 2488 | } 2489 | }, 2490 | "node_modules/ts-loader": { 2491 | "version": "9.5.1", 2492 | "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.5.1.tgz", 2493 | "integrity": "sha512-rNH3sK9kGZcH9dYzC7CewQm4NtxJTjSEVRJ2DyBZR7f8/wcta+iV44UPCXc5+nzDzivKtlzV6c9P4e+oFhDLYg==", 2494 | "dev": true, 2495 | "dependencies": { 2496 | "chalk": "^4.1.0", 2497 | "enhanced-resolve": "^5.0.0", 2498 | "micromatch": "^4.0.0", 2499 | "semver": "^7.3.4", 2500 | "source-map": "^0.7.4" 2501 | }, 2502 | "engines": { 2503 | "node": ">=12.0.0" 2504 | }, 2505 | "peerDependencies": { 2506 | "typescript": "*", 2507 | "webpack": "^5.0.0" 2508 | } 2509 | }, 2510 | "node_modules/ts-loader/node_modules/source-map": { 2511 | "version": "0.7.4", 2512 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", 2513 | "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", 2514 | "dev": true, 2515 | "engines": { 2516 | "node": ">= 8" 2517 | } 2518 | }, 2519 | "node_modules/type-check": { 2520 | "version": "0.4.0", 2521 | "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", 2522 | "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", 2523 | "dev": true, 2524 | "dependencies": { 2525 | "prelude-ls": "^1.2.1" 2526 | }, 2527 | "engines": { 2528 | "node": ">= 0.8.0" 2529 | } 2530 | }, 2531 | "node_modules/type-fest": { 2532 | "version": "0.20.2", 2533 | "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", 2534 | "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", 2535 | "dev": true, 2536 | "engines": { 2537 | "node": ">=10" 2538 | }, 2539 | "funding": { 2540 | "url": "https://github.com/sponsors/sindresorhus" 2541 | } 2542 | }, 2543 | "node_modules/typescript": { 2544 | "version": "5.2.2", 2545 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz", 2546 | "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==", 2547 | "dev": true, 2548 | "bin": { 2549 | "tsc": "bin/tsc", 2550 | "tsserver": "bin/tsserver" 2551 | }, 2552 | "engines": { 2553 | "node": ">=14.17" 2554 | } 2555 | }, 2556 | "node_modules/undici-types": { 2557 | "version": "5.26.5", 2558 | "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", 2559 | "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", 2560 | "dev": true 2561 | }, 2562 | "node_modules/update-browserslist-db": { 2563 | "version": "1.0.13", 2564 | "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", 2565 | "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", 2566 | "dev": true, 2567 | "funding": [ 2568 | { 2569 | "type": "opencollective", 2570 | "url": "https://opencollective.com/browserslist" 2571 | }, 2572 | { 2573 | "type": "tidelift", 2574 | "url": "https://tidelift.com/funding/github/npm/browserslist" 2575 | }, 2576 | { 2577 | "type": "github", 2578 | "url": "https://github.com/sponsors/ai" 2579 | } 2580 | ], 2581 | "dependencies": { 2582 | "escalade": "^3.1.1", 2583 | "picocolors": "^1.0.0" 2584 | }, 2585 | "bin": { 2586 | "update-browserslist-db": "cli.js" 2587 | }, 2588 | "peerDependencies": { 2589 | "browserslist": ">= 4.21.0" 2590 | } 2591 | }, 2592 | "node_modules/uri-js": { 2593 | "version": "4.4.1", 2594 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", 2595 | "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", 2596 | "dev": true, 2597 | "dependencies": { 2598 | "punycode": "^2.1.0" 2599 | } 2600 | }, 2601 | "node_modules/watchpack": { 2602 | "version": "2.4.0", 2603 | "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", 2604 | "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", 2605 | "dev": true, 2606 | "dependencies": { 2607 | "glob-to-regexp": "^0.4.1", 2608 | "graceful-fs": "^4.1.2" 2609 | }, 2610 | "engines": { 2611 | "node": ">=10.13.0" 2612 | } 2613 | }, 2614 | "node_modules/webpack": { 2615 | "version": "5.89.0", 2616 | "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.89.0.tgz", 2617 | "integrity": "sha512-qyfIC10pOr70V+jkmud8tMfajraGCZMBWJtrmuBymQKCrLTRejBI8STDp1MCyZu/QTdZSeacCQYpYNQVOzX5kw==", 2618 | "dev": true, 2619 | "dependencies": { 2620 | "@types/eslint-scope": "^3.7.3", 2621 | "@types/estree": "^1.0.0", 2622 | "@webassemblyjs/ast": "^1.11.5", 2623 | "@webassemblyjs/wasm-edit": "^1.11.5", 2624 | "@webassemblyjs/wasm-parser": "^1.11.5", 2625 | "acorn": "^8.7.1", 2626 | "acorn-import-assertions": "^1.9.0", 2627 | "browserslist": "^4.14.5", 2628 | "chrome-trace-event": "^1.0.2", 2629 | "enhanced-resolve": "^5.15.0", 2630 | "es-module-lexer": "^1.2.1", 2631 | "eslint-scope": "5.1.1", 2632 | "events": "^3.2.0", 2633 | "glob-to-regexp": "^0.4.1", 2634 | "graceful-fs": "^4.2.9", 2635 | "json-parse-even-better-errors": "^2.3.1", 2636 | "loader-runner": "^4.2.0", 2637 | "mime-types": "^2.1.27", 2638 | "neo-async": "^2.6.2", 2639 | "schema-utils": "^3.2.0", 2640 | "tapable": "^2.1.1", 2641 | "terser-webpack-plugin": "^5.3.7", 2642 | "watchpack": "^2.4.0", 2643 | "webpack-sources": "^3.2.3" 2644 | }, 2645 | "bin": { 2646 | "webpack": "bin/webpack.js" 2647 | }, 2648 | "engines": { 2649 | "node": ">=10.13.0" 2650 | }, 2651 | "funding": { 2652 | "type": "opencollective", 2653 | "url": "https://opencollective.com/webpack" 2654 | }, 2655 | "peerDependenciesMeta": { 2656 | "webpack-cli": { 2657 | "optional": true 2658 | } 2659 | } 2660 | }, 2661 | "node_modules/webpack-cli": { 2662 | "version": "5.1.4", 2663 | "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-5.1.4.tgz", 2664 | "integrity": "sha512-pIDJHIEI9LR0yxHXQ+Qh95k2EvXpWzZ5l+d+jIo+RdSm9MiHfzazIxwwni/p7+x4eJZuvG1AJwgC4TNQ7NRgsg==", 2665 | "dev": true, 2666 | "dependencies": { 2667 | "@discoveryjs/json-ext": "^0.5.0", 2668 | "@webpack-cli/configtest": "^2.1.1", 2669 | "@webpack-cli/info": "^2.0.2", 2670 | "@webpack-cli/serve": "^2.0.5", 2671 | "colorette": "^2.0.14", 2672 | "commander": "^10.0.1", 2673 | "cross-spawn": "^7.0.3", 2674 | "envinfo": "^7.7.3", 2675 | "fastest-levenshtein": "^1.0.12", 2676 | "import-local": "^3.0.2", 2677 | "interpret": "^3.1.1", 2678 | "rechoir": "^0.8.0", 2679 | "webpack-merge": "^5.7.3" 2680 | }, 2681 | "bin": { 2682 | "webpack-cli": "bin/cli.js" 2683 | }, 2684 | "engines": { 2685 | "node": ">=14.15.0" 2686 | }, 2687 | "funding": { 2688 | "type": "opencollective", 2689 | "url": "https://opencollective.com/webpack" 2690 | }, 2691 | "peerDependencies": { 2692 | "webpack": "5.x.x" 2693 | }, 2694 | "peerDependenciesMeta": { 2695 | "@webpack-cli/generators": { 2696 | "optional": true 2697 | }, 2698 | "webpack-bundle-analyzer": { 2699 | "optional": true 2700 | }, 2701 | "webpack-dev-server": { 2702 | "optional": true 2703 | } 2704 | } 2705 | }, 2706 | "node_modules/webpack-cli/node_modules/commander": { 2707 | "version": "10.0.1", 2708 | "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", 2709 | "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", 2710 | "dev": true, 2711 | "engines": { 2712 | "node": ">=14" 2713 | } 2714 | }, 2715 | "node_modules/webpack-merge": { 2716 | "version": "5.10.0", 2717 | "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", 2718 | "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==", 2719 | "dev": true, 2720 | "dependencies": { 2721 | "clone-deep": "^4.0.1", 2722 | "flat": "^5.0.2", 2723 | "wildcard": "^2.0.0" 2724 | }, 2725 | "engines": { 2726 | "node": ">=10.0.0" 2727 | } 2728 | }, 2729 | "node_modules/webpack-sources": { 2730 | "version": "3.2.3", 2731 | "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", 2732 | "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", 2733 | "dev": true, 2734 | "engines": { 2735 | "node": ">=10.13.0" 2736 | } 2737 | }, 2738 | "node_modules/which": { 2739 | "version": "2.0.2", 2740 | "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", 2741 | "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", 2742 | "dev": true, 2743 | "dependencies": { 2744 | "isexe": "^2.0.0" 2745 | }, 2746 | "bin": { 2747 | "node-which": "bin/node-which" 2748 | }, 2749 | "engines": { 2750 | "node": ">= 8" 2751 | } 2752 | }, 2753 | "node_modules/wildcard": { 2754 | "version": "2.0.1", 2755 | "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", 2756 | "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==", 2757 | "dev": true 2758 | }, 2759 | "node_modules/wrappy": { 2760 | "version": "1.0.2", 2761 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 2762 | "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", 2763 | "dev": true 2764 | }, 2765 | "node_modules/yallist": { 2766 | "version": "4.0.0", 2767 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", 2768 | "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", 2769 | "dev": true 2770 | }, 2771 | "node_modules/yocto-queue": { 2772 | "version": "0.1.0", 2773 | "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", 2774 | "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", 2775 | "dev": true, 2776 | "engines": { 2777 | "node": ">=10" 2778 | }, 2779 | "funding": { 2780 | "url": "https://github.com/sponsors/sindresorhus" 2781 | } 2782 | } 2783 | } 2784 | } 2785 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@devopifex/communicate", 3 | "version": "1.0.3", 4 | "description": "Companion package for the communicate R package", 5 | "main": "srcjs/index.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1", 8 | "none": "webpack --config webpack.dev.js --mode=none", 9 | "development": "webpack --config webpack.dev.js", 10 | "production": "webpack --config webpack.prod.js", 11 | "watch": "webpack --config webpack.dev.js -d --watch" 12 | }, 13 | "keywords": [], 14 | "author": "", 15 | "license": "GPL-3", 16 | "devDependencies": { 17 | "@typescript-eslint/eslint-plugin": "^6.11.0", 18 | "@typescript-eslint/parser": "^6.11.0", 19 | "eslint": "^8.53.0", 20 | "ts-loader": "^9.5.1", 21 | "typescript": "^5.2.2", 22 | "webpack": "^5.89.0", 23 | "webpack-cli": "^5.1.4", 24 | "webpack-merge": "^5.10.0" 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /srcjs/config/entry_points.json: -------------------------------------------------------------------------------- 1 | { 2 | "index": "./srcjs/index.ts" 3 | } 4 | -------------------------------------------------------------------------------- /srcjs/config/externals.json: -------------------------------------------------------------------------------- 1 | { 2 | "shiny": "Shiny", 3 | "jquery": "jQuery" 4 | } 5 | -------------------------------------------------------------------------------- /srcjs/config/loaders.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "test": "\\.tsx?$", 4 | "use": "ts-loader", 5 | "exclude": "/node_modules/" 6 | } 7 | ] 8 | -------------------------------------------------------------------------------- /srcjs/config/misc.json: -------------------------------------------------------------------------------- 1 | [] 2 | -------------------------------------------------------------------------------- /srcjs/config/output_path.json: -------------------------------------------------------------------------------- 1 | "./inst/assets" 2 | -------------------------------------------------------------------------------- /srcjs/index.ts: -------------------------------------------------------------------------------- 1 | import "shiny"; 2 | 3 | declare global { 4 | interface Window { 5 | Shiny: { 6 | addCustomMessageHandler: ( 7 | id: string, 8 | fn: (msg: setPathMsg) => void, 9 | ) => void; 10 | }; 11 | } 12 | } 13 | 14 | const endpoints: any = {}; 15 | const timeouts: any = {}; 16 | let types: any = []; 17 | 18 | interface setPathMsg { 19 | id: string; 20 | types: any; 21 | } 22 | 23 | // eslint-disable-next-line 24 | window.Shiny.addCustomMessageHandler( 25 | "communicate-set-path", 26 | (msg: setPathMsg) => { 27 | endpoints[msg.id] = msg; 28 | 29 | if (msg.types) types = msg.types; 30 | 31 | const event = new CustomEvent("communicate:registered", { 32 | detail: getCom(msg.id) || {}, 33 | }); 34 | 35 | // avoid duplicate calls 36 | clearTimeout(timeouts[msg.id]); 37 | timeouts[msg.id] = setTimeout(() => { 38 | document.dispatchEvent(event); 39 | }, 250); 40 | }, 41 | ); 42 | 43 | async function com(id: string, args: any) { 44 | if (!id) { 45 | throw new Error("No id provided"); 46 | } 47 | 48 | if (!hasCom(id)) { 49 | throw new Error(`No com found for ${id}`); 50 | } 51 | 52 | if (!args) args = {}; 53 | 54 | if (Object.keys(endpoints).length === 0) { 55 | throw new Error( 56 | "No coms registered, did you forget to registers channels with `com()`", 57 | ); 58 | } 59 | 60 | const qs = makeQuery(id, args); 61 | 62 | const response = await fetch(`${endpoints[id].path}&${qs}`); 63 | const data = await response.json(); 64 | if (data.error) { 65 | throw new Error(data.error); 66 | } 67 | return data; 68 | } 69 | 70 | interface argDef { 71 | fn: string; 72 | type: string; 73 | } 74 | 75 | type argsDefs = argDef[]; 76 | 77 | interface comDef { 78 | id: string; 79 | path: string; 80 | args: argsDefs; 81 | } 82 | 83 | type comsDef = comDef[]; 84 | 85 | function getComs(): comsDef { 86 | const ep: comsDef = []; 87 | for (const property in endpoints) { 88 | const prop: comDef = { 89 | id: endpoints[property].id, 90 | path: endpoints[property].path, 91 | args: endpoints[property].args, 92 | }; 93 | ep.push(prop); 94 | } 95 | return ep; 96 | } 97 | 98 | function getCom(id: string): comDef { 99 | if (!id) { 100 | throw new Error("No id provided"); 101 | } 102 | 103 | if (!hasCom(id)) { 104 | throw new Error(`No com found for ${id}`); 105 | } 106 | 107 | return getComs().filter((com) => com.id === id)[0]; 108 | } 109 | 110 | function hasCom(id: string): boolean { 111 | if (!id) { 112 | throw new Error("No id provided"); 113 | } 114 | 115 | return getComs().some((com) => com.id === id); 116 | } 117 | 118 | function makeQuery(id: string, args: any): string { 119 | if (!id) { 120 | throw new Error("No id provided"); 121 | } 122 | 123 | if (!args) { 124 | throw new Error("No args provided"); 125 | } 126 | 127 | const valids = endpoints[id].args; 128 | const argNames = Object.keys(args); 129 | 130 | return argNames 131 | .map((argName) => { 132 | let arg = args[argName]; 133 | const valid = valids.find((valid: any) => valid.name === argName); 134 | 135 | if (!valid) { 136 | throw new Error( 137 | `Invalid argument: ${argName}, not handled by R function`, 138 | ); 139 | } 140 | 141 | if (!typeMatch(arg, valid)) { 142 | throw new Error( 143 | `Invalid argument: ${argName}, type mismatch, expected ${ 144 | valid.type 145 | }, got ${typeof arg}`, 146 | ); 147 | } 148 | 149 | arg = convertArg(arg); 150 | 151 | return `${argName}=${encodeURIComponent(arg)}`; 152 | }) 153 | .join("&"); 154 | } 155 | 156 | function isDate(x: any): boolean { 157 | return x instanceof Date; 158 | } 159 | 160 | function convertArg(arg: any): string { 161 | if (isDate(arg)) { 162 | return arg; 163 | } 164 | 165 | if (typeof arg === "object") { 166 | arg = JSON.stringify(arg); 167 | } 168 | 169 | return arg; 170 | } 171 | 172 | const RESERVED_TYPE = [ 173 | "character", 174 | "integer", 175 | "numeric", 176 | "date", 177 | "posix", 178 | "dataframe", 179 | "list", 180 | "function", 181 | ]; 182 | 183 | function typeMatch(value: any, valid: any): boolean { 184 | if (!valid.type) { 185 | return true; 186 | } 187 | 188 | if (!RESERVED_TYPE.includes(valid.type)) { 189 | const checker = types.find((type: any) => type.type === valid.type); 190 | 191 | if (!checker) return false; 192 | 193 | if (!checker.js_checker) return true; 194 | 195 | const fn = eval(checker.js_checker); 196 | const result = fn(value); 197 | 198 | if (typeof result === "boolean") return result; 199 | 200 | console.error("custom type checker must return a boolean value"); 201 | return false; 202 | } 203 | 204 | if (isDate(value) && valid.type === "date") { 205 | return true; 206 | } 207 | 208 | if (isDate(value) && valid.type === "posix") { 209 | return true; 210 | } 211 | 212 | if (typeof value === "object" && valid.type === "dataframe") { 213 | return true; 214 | } 215 | 216 | if (typeof value === "object" && valid.type === "list") { 217 | return true; 218 | } 219 | 220 | if (typeof value === "number" && valid.type === "numeric") { 221 | return true; 222 | } 223 | 224 | if (typeof value === "number" && valid.type === "integer") { 225 | return true; 226 | } 227 | 228 | if (typeof value === "string" && valid.type === "character") { 229 | return true; 230 | } 231 | 232 | return false; 233 | } 234 | 235 | export { com, getCom, getComs, hasCom }; 236 | export type { argsDefs, comsDef, argDef, comDef }; 237 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "outDir": "./inst/assets", 4 | "noImplicitAny": false, 5 | "module": "es6", 6 | "target": "es5" 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /webpack.common.js: -------------------------------------------------------------------------------- 1 | const path = require('path'); 2 | const fs = require('fs'); 3 | 4 | // defaults 5 | var outputPath = [], 6 | entryPoints = [], 7 | externals = [], 8 | misc = [], 9 | loaders = []; 10 | 11 | var outputPathFile = './srcjs/config/output_path.json', 12 | entryPointsFile = './srcjs/config/entry_points.json', 13 | externalsFile = './srcjs/config/externals.json', 14 | miscFile = './srcjs/config/misc.json', 15 | loadersFile = './srcjs/config/loaders.json'; 16 | 17 | // Read config files 18 | if(fs.existsSync(outputPathFile)){ 19 | outputPath = fs.readFileSync(outputPathFile, 'utf8'); 20 | } 21 | 22 | if(fs.existsSync(entryPointsFile)){ 23 | entryPoints = fs.readFileSync(entryPointsFile, 'utf8'); 24 | } 25 | 26 | if(fs.existsSync(externalsFile)){ 27 | externals = fs.readFileSync(externalsFile, 'utf8'); 28 | } 29 | 30 | if(fs.existsSync(miscFile)){ 31 | misc = fs.readFileSync(miscFile, 'utf8'); 32 | } 33 | 34 | if(fs.existsSync(loadersFile)){ 35 | loaders = fs.readFileSync(loadersFile, 'utf8'); 36 | } 37 | 38 | if(fs.existsSync(loadersFile)){ 39 | loaders = fs.readFileSync(loadersFile, 'utf8'); 40 | } 41 | 42 | // parse 43 | loaders = JSON.parse(loaders); 44 | misc = JSON.parse(misc); 45 | externals = JSON.parse(externals); 46 | entryPoints = JSON.parse(entryPoints); 47 | 48 | // parse regex 49 | loaders.forEach((loader) => { 50 | loader.test = RegExp(loader.test); 51 | return(loader); 52 | }) 53 | 54 | // placeholder for plugins 55 | var plugins = [ 56 | ]; 57 | 58 | // define options 59 | var options = { 60 | entry: entryPoints, 61 | output: { 62 | filename: '[name].js', 63 | library: {name: 'communicate', type: 'umd'}, 64 | path: path.resolve(__dirname, JSON.parse(outputPath)), 65 | }, 66 | externals: externals, 67 | module: { 68 | rules: loaders 69 | }, 70 | resolve: { 71 | extensions: ['.tsx', '.ts', '.js'], 72 | }, 73 | plugins: plugins 74 | }; 75 | 76 | // add misc 77 | if(misc.resolve) 78 | options.resolve = misc.resolve; 79 | 80 | // export 81 | module.exports = options; 82 | -------------------------------------------------------------------------------- /webpack.dev.js: -------------------------------------------------------------------------------- 1 | const { merge } = require('webpack-merge'); 2 | const common = require('./webpack.common.js'); 3 | 4 | module.exports = merge(common, { 5 | mode: 'development', 6 | devtool: 'inline-source-map' 7 | }); 8 | -------------------------------------------------------------------------------- /webpack.prod.js: -------------------------------------------------------------------------------- 1 | const { merge } = require('webpack-merge'); 2 | const common = require('./webpack.common.js'); 3 | 4 | module.exports = merge(common, { 5 | mode: 'production', 6 | }); 7 | --------------------------------------------------------------------------------