├── .github └── workflows │ └── tests.yml ├── .gitignore ├── LICENSE ├── README.md ├── exports ├── application.js ├── controller.js └── index.js ├── internal └── index.js ├── package.json ├── pnpm-lock.yaml ├── tests ├── lifecycle.test.js └── targets.test.js ├── tsconfig.json ├── types └── index.d.ts └── web-test-runner.config.js /.github/workflows/tests.yml: -------------------------------------------------------------------------------- 1 | name: Tests 2 | on: 3 | push: 4 | branches: [main] 5 | pull_request: 6 | branches: [main] 7 | jobs: 8 | test: 9 | runs-on: ubuntu-latest 10 | strategy: 11 | matrix: 12 | node-version: [18] 13 | steps: 14 | - uses: actions/checkout@v3 15 | - uses: pnpm/action-setup@v2 16 | with: 17 | version: 8 18 | - name: Use Node.js ${{ matrix.node-version }} 19 | uses: actions/setup-node@v3 20 | with: 21 | node-version: ${{ matrix.node-version }} 22 | cache: 'pnpm' 23 | - name: Install dependencies 24 | run: pnpm install 25 | - name: Install Playwright Browsers 26 | run: pnpm exec playwright install --with-deps 27 | - name: Run Playwright tests 28 | run: pnpm run verify 29 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | lerna-debug.log* 8 | .pnpm-debug.log* 9 | 10 | # Diagnostic reports (https://nodejs.org/api/report.html) 11 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json 12 | 13 | # Runtime data 14 | pids 15 | *.pid 16 | *.seed 17 | *.pid.lock 18 | 19 | # Directory for instrumented libs generated by jscoverage/JSCover 20 | lib-cov 21 | 22 | # Coverage directory used by tools like istanbul 23 | coverage 24 | *.lcov 25 | 26 | # nyc test coverage 27 | .nyc_output 28 | 29 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) 30 | .grunt 31 | 32 | # Bower dependency directory (https://bower.io/) 33 | bower_components 34 | 35 | # node-waf configuration 36 | .lock-wscript 37 | 38 | # Compiled binary addons (https://nodejs.org/api/addons.html) 39 | build/Release 40 | 41 | # Dependency directories 42 | node_modules/ 43 | jspm_packages/ 44 | 45 | # Snowpack dependency directory (https://snowpack.dev/) 46 | web_modules/ 47 | 48 | # TypeScript cache 49 | *.tsbuildinfo 50 | 51 | # Optional npm cache directory 52 | .npm 53 | 54 | # Optional eslint cache 55 | .eslintcache 56 | 57 | # Optional stylelint cache 58 | .stylelintcache 59 | 60 | # Microbundle cache 61 | .rpt2_cache/ 62 | .rts2_cache_cjs/ 63 | .rts2_cache_es/ 64 | .rts2_cache_umd/ 65 | 66 | # Optional REPL history 67 | .node_repl_history 68 | 69 | # Output of 'npm pack' 70 | *.tgz 71 | 72 | # Yarn Integrity file 73 | .yarn-integrity 74 | 75 | # dotenv environment variable files 76 | .env 77 | .env.development.local 78 | .env.test.local 79 | .env.production.local 80 | .env.local 81 | 82 | # parcel-bundler cache (https://parceljs.org/) 83 | .cache 84 | .parcel-cache 85 | 86 | # Next.js build output 87 | .next 88 | out 89 | 90 | # Nuxt.js build / generate output 91 | .nuxt 92 | dist 93 | 94 | # Gatsby files 95 | .cache/ 96 | # Comment in the public line in if your project uses Gatsby and not Next.js 97 | # https://nextjs.org/blog/next-9-1#public-directory-support 98 | # public 99 | 100 | # vuepress build output 101 | .vuepress/dist 102 | 103 | # vuepress v2.x temp and cache directory 104 | .temp 105 | .cache 106 | 107 | # Docusaurus cache and generated files 108 | .docusaurus 109 | 110 | # Serverless directories 111 | .serverless/ 112 | 113 | # FuseBox cache 114 | .fusebox/ 115 | 116 | # DynamoDB Local files 117 | .dynamodb/ 118 | 119 | # TernJS port file 120 | .tern-port 121 | 122 | # Stores VSCode versions used for testing VSCode extensions 123 | .vscode-test 124 | 125 | # yarn v2 126 | .yarn/cache 127 | .yarn/unplugged 128 | .yarn/build-state.yml 129 | .yarn/install-state.gz 130 | .pnp.* 131 | 132 | exports/**/*.d.ts 133 | internal/**/*.d.ts -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2023 Konnor Rogers 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Purpose 2 | 3 | ## Coming soon... 4 | 5 | ## Why `data-lite-target` and not `data-[identifier]-target=""` 6 | 7 | Because It's verbose and I don't like it? 8 | 9 | It also means we have a static attribute to listen for so we don't need to listen to 10 | every attribute change making the attribute filter more performant. 11 | 12 | ## Why no `data-action` 13 | 14 | I have personally never liked `data-action`. I find that the markup easily gets lost when refactoring, 15 | and it also presents a CSP issue when unsafe functions are bound to controller. 16 | 17 | Further Reading: 18 | 19 | ## Why no `data-[identifier]-outlet`, `data-[value-name]-value`, `data-[identifier]-class` 20 | 21 | I don't find myself reaching for these things. 22 | -------------------------------------------------------------------------------- /exports/application.js: -------------------------------------------------------------------------------- 1 | import { Controller} from "./controller.js" 2 | /** 3 | * @typedef {object} RegistryOptions 4 | * @property {HTMLElement | ShadowRoot} [RegistryOptions.rootElement=document.documentElement] 5 | * @property {string} [RegistryOptions.controllerAttribute="lite-controller"] 6 | * @property {string} [RegistryOptions.targetAttribute="lite-target"] 7 | */ 8 | 9 | export class Application { 10 | /** 11 | * Starts the registry and listens. 12 | * @param {RegistryOptions} options 13 | */ 14 | static start (options = {}) { 15 | return new this(options).start() 16 | } 17 | 18 | /** 19 | * @param {RegistryOptions} options 20 | */ 21 | constructor(options = {}){ 22 | if (!options.rootElement) { 23 | options.rootElement = document.documentElement 24 | } 25 | 26 | if(!(options.rootElement instanceof HTMLElement)) { 27 | throw new Error(`The rootElement must an HTMLElement. Was given ${options.rootElement}`); 28 | } 29 | 30 | /** 31 | * The root element which is where query selectors will be scoped from. 32 | * @type {HTMLElement} 33 | */ 34 | this.rootElement = options.rootElement; 35 | 36 | /** 37 | * A map of all Controller constructors 38 | * @type {Map} 39 | */ 40 | this._controllerConstructorMap = new Map(); 41 | 42 | /** 43 | * A weakmap of all controller instances attach to a particular element 44 | * @type {WeakMap>} 45 | */ 46 | this._controllerInstanceMap = new Map(); 47 | 48 | /** 49 | * A weakmap to track if a target has connected or not for a particular controller. 50 | * @type {WeakMap>} 51 | */ 52 | this._targetConnectionMap = new Map(); 53 | 54 | /** 55 | * If the registry has started listening for new elements. 56 | * @type {boolean} 57 | */ 58 | this.started = false 59 | 60 | /** 61 | * The attribute to use for finding a controller. Defaults to "lite-controller". 62 | * @type {string} 63 | */ 64 | this.controllerAttribute = options.controllerAttribute || "lite-controller" 65 | 66 | /** 67 | * The attribute to use for finding targets. Defaults to "lite-target". 68 | * @type {string} 69 | */ 70 | this.targetAttribute = options.targetAttribute || "lite-target" 71 | } 72 | 73 | /** 74 | * Starts the registry and listens. 75 | * @param {RegistryOptions} options 76 | */ 77 | start (options = {}) { 78 | this.rootElement = options.rootElement || document.documentElement 79 | 80 | if (options.controllerAttribute) { 81 | this.controllerAttribute = options.controllerAttribute 82 | } 83 | 84 | if (options.targetAttribute) { 85 | this.targetAttribute = options.targetAttribute 86 | } 87 | 88 | if (!this.started) { 89 | this._observe(); 90 | this.started = true 91 | } 92 | return this 93 | } 94 | 95 | /** 96 | * Takes records, and then disconnects the observer. 97 | */ 98 | stop () { 99 | if (this.started) { 100 | this.started = false 101 | const mutations = this.observer?.takeRecords() 102 | 103 | if (mutations) { 104 | this.handleMutations(mutations) 105 | } 106 | 107 | this.observer?.disconnect() 108 | } 109 | return this 110 | } 111 | 112 | /** 113 | * Registers a new controller to listen for. 114 | * @param {typeof Controller} Constructor 115 | * @param {string} [controllerName] - Use this to override the registration name. 116 | */ 117 | register(Constructor, controllerName) { 118 | const name = Constructor.controllerName || controllerName 119 | if (!name) { 120 | console.error(`No "controllerName" given for ${Constructor}.`) 121 | return 122 | } 123 | 124 | this._controllerConstructorMap.set(name, Constructor); 125 | this._upgradeControllers(name); 126 | } 127 | 128 | /** 129 | * Finds a map of controllers based on the element and controllerName. 130 | * @param {HTMLElement} element 131 | * @param {string} controllerName 132 | * @return {null | undefined | Controller} 133 | */ 134 | getController(element, controllerName) { 135 | let map = this._controllerInstanceMap.get(element); 136 | if(!map) return; 137 | return map.get(controllerName); 138 | } 139 | 140 | /** 141 | * @param {string} controllerName 142 | * @return {undefined | null | typeof Controller} 143 | */ 144 | _getConstructor (controllerName) { 145 | return this._controllerConstructorMap.get(controllerName); 146 | } 147 | 148 | _observe () { 149 | let root = this.rootElement; 150 | 151 | if (!this.observer) { 152 | this.observer = new MutationObserver(this.handleMutations); 153 | } 154 | 155 | this.observer.observe(root, { 156 | childList: true, 157 | subtree: true, 158 | attributes: true, 159 | attributeFilter: [ 160 | this.controllerAttribute, 161 | this.targetAttribute, 162 | ], 163 | attributeOldValue: true 164 | }); 165 | } 166 | 167 | /** 168 | * @param {MutationRecord[]} mutations 169 | */ 170 | handleMutations = (mutations) => { 171 | for (const m of mutations) { 172 | if(m.type === 'attributes') { 173 | if (m.attributeName == null) continue; 174 | 175 | if (m.attributeName === this.controllerAttribute) { 176 | this._handleControllerAttributeMutation(m) 177 | continue 178 | } else if (m.attributeName === this.targetAttribute) { 179 | this._handleTargetAttributeMutation(m) 180 | } 181 | } 182 | // childList 183 | else { 184 | m.removedNodes.forEach((node) => { 185 | this._downgradeAllElements(/** @type {HTMLElement} */ (node)) 186 | }) 187 | m.addedNodes.forEach((node) => { 188 | this._upgradeAllElements(/** @type {HTMLElement} */ (node)) 189 | }) 190 | } 191 | } 192 | } 193 | 194 | /** 195 | * @param {string} controllerName 196 | * @param {HTMLElement} [rootElement] 197 | */ 198 | _upgradeControllers(controllerName, rootElement) { 199 | const root = rootElement || this.rootElement; 200 | 201 | let matches = root.querySelectorAll(this._controllerQuery(controllerName)); 202 | 203 | matches.forEach((match) => { 204 | this._createControllerInstance(controllerName, /** @type {HTMLElement} */ (match)); 205 | }) 206 | } 207 | 208 | /** 209 | * @param {HTMLElement} element 210 | */ 211 | _upgradeAllElements = (element) => { 212 | if(element.nodeType !== 1) return; 213 | 214 | this._upgradeElement(element) 215 | 216 | element.querySelectorAll("*").forEach((el) => { 217 | this._upgradeElement(/** @type {HTMLElement} */ (el)) 218 | }) 219 | } 220 | 221 | /** 222 | * @param {HTMLElement} element 223 | */ 224 | _upgradeElement(element) { 225 | if(element.nodeType !== 1) return; 226 | 227 | const controllers = element.getAttribute(this.controllerAttribute) 228 | 229 | if (controllers) { 230 | this._attributeToControllers(controllers).forEach((controllerName) => { 231 | this._createControllerInstance(controllerName, element); 232 | }) 233 | } 234 | } 235 | 236 | /** 237 | * @param {HTMLElement} element 238 | */ 239 | _downgradeAllElements = (element) => { 240 | if(element.nodeType !== 1) return; 241 | 242 | // this._downgradeTargetFromElement(element) 243 | this._downgradeTargets(element) 244 | this._downgradeElement(element); 245 | 246 | ;[...new Set(Array.from(element.querySelectorAll("*")))].forEach((el) => { 247 | this._downgradeTargets(element) 248 | this._downgradeElement(/** @type {HTMLElement} */ (el)) 249 | }) 250 | } 251 | 252 | /** 253 | * @param {HTMLElement} element 254 | * @param {string} [controllerName] - if a controllerName is given, only downgrade that specific controller. 255 | */ 256 | _downgradeElement = (element, controllerName) => { 257 | if(element.nodeType !== 1) return; 258 | 259 | let map = this._controllerInstanceMap.get(element); 260 | 261 | if(!map) { 262 | return 263 | } 264 | 265 | // Downgrade every controller 266 | let instances = new Map() 267 | 268 | if (controllerName) { 269 | const inst = map.get(controllerName) 270 | if (inst) instances.set(controllerName, inst) 271 | } else { 272 | instances = map 273 | } 274 | 275 | map.forEach((inst) => { 276 | if (!inst.isConnected) return 277 | 278 | ;/** @type {typeof Controller} */ (inst.constructor).targets.forEach((targetName) => { 279 | // @ts-expect-error 280 | ;/** @type {HTMLElement[]} */ (inst[`${targetName}Targets`]).forEach((target) => { 281 | this._downgradeTargets(target) 282 | }) 283 | }) 284 | 285 | if (inst.disconnectedCallback) { 286 | inst.disconnectedCallback(); 287 | inst.isConnected = false 288 | } 289 | }); 290 | } 291 | 292 | /** 293 | * @param {HTMLElement} target 294 | * @param {string} targetName 295 | * @param {Controller} controller 296 | */ 297 | _downgradeTargetForAttribute (target, targetName, controller) { 298 | const targetMap = this._targetConnectionMap.get(target) 299 | 300 | if (!targetMap) return 301 | 302 | if (!targetMap.get(controller)) return 303 | 304 | disconnectTarget(controller, targetName, target) 305 | // this._targetConnectionMap.delete(target) 306 | } 307 | 308 | /** 309 | * @param {string} controllerName 310 | * @param {HTMLElement} el 311 | */ 312 | _createControllerInstance(controllerName, el) { 313 | let controllerInstanceMap = this._controllerInstanceMap.get(el); 314 | 315 | if(!controllerInstanceMap) { 316 | controllerInstanceMap = new Map(); 317 | this._controllerInstanceMap.set(el, controllerInstanceMap); 318 | } 319 | 320 | let inst = this.getController(el, controllerName); 321 | 322 | let hasController = el.getAttribute(this.controllerAttribute)?.includes(controllerName); 323 | 324 | if(!inst) { 325 | let Constructor = this._getConstructor(controllerName); 326 | 327 | if (!Constructor) return 328 | 329 | inst = new Constructor({ element: el, application: this, controllerName }); 330 | 331 | inst.initialize() 332 | controllerInstanceMap.set(controllerName, inst); 333 | } 334 | 335 | if (!inst.isConnected) { 336 | inst.isConnected = true 337 | 338 | inst.connectedCallback(); 339 | 340 | // Find children targets and upgrade them 341 | setTimeout(() => { 342 | if (inst) { 343 | this._upgradeTargets(inst) 344 | } 345 | }) 346 | } 347 | 348 | // Attribute was removed 349 | if(!hasController) { 350 | inst.disconnectedCallback(); 351 | 352 | inst.isConnected = false 353 | } 354 | } 355 | 356 | /** 357 | * Takes an attribute and turns it into an array of controller names. 358 | * @param {string} str 359 | * @return {Array} 360 | */ 361 | _attributeToControllers (str) { 362 | return str?.split(/\s+/) || [] 363 | } 364 | 365 | /** 366 | * @param {MutationRecord} m 367 | */ 368 | _handleControllerAttributeMutation (m) { 369 | if (!m.attributeName) return 370 | 371 | const target = /** @type {HTMLElement} */ (m.target) 372 | const attribute = target.getAttribute(m.attributeName) 373 | 374 | // If we remove the attribute, we can just remove all controllers. 375 | if (!attribute) { 376 | this._downgradeElement(/** @type {HTMLElement} */ (target)) 377 | return 378 | } 379 | 380 | let controllersToConnect = this._attributeToControllers(attribute) 381 | 382 | if (m.oldValue && attribute !== m.oldValue) { 383 | // We need to do some diff logic here to figure out what controllers to disconnect 384 | const oldControllers = this._attributeToControllers(m.oldValue) 385 | 386 | // We could make turn these into Set and compare that way, but for such small arrays, feels wasteful. 387 | // Disconnect any controllers not found in the new attributes. 388 | oldControllers.forEach((controllerName) => { 389 | if (controllersToConnect.includes(controllerName)) return 390 | 391 | this._downgradeElement(target, controllerName) 392 | }) 393 | } 394 | 395 | controllersToConnect.forEach((controllerName) => { 396 | this._createControllerInstance(controllerName, target); 397 | }) 398 | } 399 | 400 | /** 401 | * @param {MutationRecord} mutation 402 | */ 403 | _handleTargetAttributeMutation (mutation) { 404 | if (!mutation.attributeName) return 405 | 406 | if (mutation.attributeName !== this.targetAttribute) { 407 | return 408 | } 409 | 410 | /** 411 | * @type {HTMLElement} 412 | */ 413 | // @ts-expect-error 414 | const target = mutation.target 415 | 416 | const targetAttr = target.getAttribute(this.targetAttribute) 417 | 418 | /** 419 | * @type {string[]} 420 | */ 421 | let oldControllers = [] 422 | 423 | if (mutation.oldValue) { 424 | oldControllers = this._parseControllersFromTargetAttribute(mutation.oldValue) 425 | } 426 | 427 | /** 428 | * @type {string[]} 429 | */ 430 | let currentControllers = [] 431 | 432 | if (targetAttr) { 433 | currentControllers = this._parseControllersFromTargetAttribute(targetAttr) 434 | } 435 | 436 | const controllersToFind = oldControllers.filter((controllerName) => !currentControllers.includes(controllerName)) 437 | 438 | controllersToFind.forEach((controllerName) => { 439 | /** Have to check parentElement because closest could return a controller at same level as target. */ 440 | const closestController = target?.parentElement?.closest(this._controllerQuery(controllerName)) 441 | 442 | if (!closestController) { 443 | return 444 | } 445 | 446 | const controller = this.getController(/** @type {HTMLElement} */ (closestController), controllerName) 447 | 448 | if (!controller) return 449 | 450 | this._upgradeTargets(controller) 451 | 452 | const oldVal = mutation.oldValue 453 | 454 | if (!oldVal) return 455 | 456 | const targetNames = this._parseControllersAndTargetsFromTargetAttribute(oldVal)[controller.controllerName] 457 | 458 | targetNames.forEach((targetName) => { 459 | this._downgradeTargetForAttribute(target, targetName, controller) 460 | }) 461 | }) 462 | 463 | } 464 | 465 | /** 466 | * @param {HTMLElement | Element} target 467 | */ 468 | _downgradeTargets (target) { 469 | let controllerMap = this._targetConnectionMap.get(target) 470 | 471 | if (!controllerMap) return 472 | 473 | const targetAttr = target.getAttribute(this.targetAttribute) 474 | 475 | /** @type {Record>} */ 476 | let controllersAndTargetsObj = {} 477 | 478 | if (targetAttr) { 479 | controllersAndTargetsObj = this._parseControllersAndTargetsFromTargetAttribute(targetAttr) 480 | } 481 | 482 | for (const [controller, connected] of controllerMap) { 483 | if (!connected) continue 484 | const targetNames = controllersAndTargetsObj[controller.controllerName] 485 | 486 | targetNames?.forEach((targetName) => { 487 | if (!target.isConnected) { 488 | disconnectTarget(controller, targetName, target) 489 | return 490 | } 491 | 492 | if (!targetAttr) { 493 | disconnectTarget(controller, targetName, target) 494 | return 495 | } 496 | 497 | // This preserves scope. 498 | if (target.parentElement?.closest(this._controllerQuery(controller.controllerName)) !== controller.element) { 499 | disconnectTarget(controller, targetName, target) 500 | return 501 | } 502 | }) 503 | } 504 | } 505 | 506 | /** 507 | * Finds all `[lite-target~=.]` 508 | * @param {string} controllerName - 509 | * @param {string} targetName 510 | * @return {string} 511 | */ 512 | _targetQuery (controllerName, targetName) { 513 | // Because we scope, we need to make sure the parent is not the same controller. 514 | return `[${this.targetAttribute}~='${controllerName}.${targetName}']` 515 | } 516 | 517 | /** 518 | * @param {string} controllerName 519 | * @return {string} 520 | */ 521 | _controllerQuery(controllerName) { 522 | return `[${this.controllerAttribute}~='${controllerName}']` 523 | } 524 | 525 | /** 526 | * @param {Controller} controller 527 | */ 528 | _upgradeTargets(controller) { 529 | /** @type {typeof Controller} */ (controller.constructor).targets.forEach((targetName) => { 530 | const { element, controllerName } = controller 531 | const query = this._targetQuery(controllerName, targetName) 532 | 533 | element.querySelectorAll(query).forEach((target) => { 534 | // This preserves scope. 535 | if (target.parentElement?.closest(this._controllerQuery(controllerName)) !== element) { 536 | return 537 | } 538 | 539 | let targetMap = this._targetConnectionMap.get(target) 540 | 541 | if (!targetMap) { 542 | targetMap = new Map() 543 | this._targetConnectionMap.set(target, targetMap) 544 | } 545 | 546 | const isConnected = targetMap.get(controller) 547 | 548 | if (isConnected) return 549 | 550 | targetMap.set(controller, true) 551 | 552 | /** @type {(target: Element) => void} */ 553 | // @ts-expect-error 554 | const targetConnectedFn = controller[`${targetName}TargetConnected`] 555 | 556 | if (typeof targetConnectedFn === "function") { 557 | targetConnectedFn(target) 558 | } 559 | }) 560 | }) 561 | } 562 | 563 | /** 564 | * @param {string} str 565 | * @return {Array} 566 | */ 567 | _parseControllersFromTargetAttribute (str) { 568 | /** 569 | * @type {Array} 570 | */ 571 | const ary = [] 572 | 573 | str.split(/\s+/).forEach((targetString) => { 574 | const splitStr = targetString.split(/\./) 575 | 576 | const controllerName = splitStr[0] 577 | ary.push(controllerName) 578 | }) 579 | 580 | return ary 581 | } 582 | 583 | /** 584 | * @param {string} str 585 | * @return {Record>} 586 | */ 587 | _parseControllersAndTargetsFromTargetAttribute (str) { 588 | /** 589 | * @type {Record>} 590 | */ 591 | const finalObj = {} 592 | 593 | str.split(/\s+/).forEach((targetString) => { 594 | const splitStr = targetString.split(/\./) 595 | 596 | const controllerName = splitStr[0] 597 | const targetName = splitStr[1] 598 | 599 | if (!finalObj[controllerName]) { 600 | finalObj[controllerName] = [] 601 | } 602 | 603 | finalObj[controllerName].push(targetName) 604 | }) 605 | 606 | return finalObj 607 | } 608 | } 609 | 610 | /** 611 | * @param {Controller} controller 612 | * @param {string} targetName 613 | * @param {HTMLElement | Element} target 614 | */ 615 | function disconnectTarget (controller, targetName, target) { 616 | /** @type {(target: Element) => void} */ 617 | // @ts-expect-error 618 | const targetDisconnectedFn = controller[`${targetName}TargetDisconnected`] 619 | 620 | if (typeof targetDisconnectedFn === "function") { 621 | targetDisconnectedFn(target) 622 | } 623 | } 624 | -------------------------------------------------------------------------------- /exports/controller.js: -------------------------------------------------------------------------------- 1 | /** 2 | * The base class for creating oil controllers. 3 | */ 4 | export class Controller { 5 | /** 6 | * @type {string[]} 7 | */ 8 | static targets = [] 9 | 10 | /** 11 | * @type {string | null | undefined} 12 | */ 13 | static controllerName 14 | 15 | static __finalized__ = false 16 | 17 | /** 18 | * @param {object} options 19 | * @param {HTMLElement} options.element 20 | * @param {import("./index.js").Application} options.application 21 | * @param {string} options.controllerName 22 | */ 23 | constructor ({ element, application, controllerName }) { 24 | ;/** @type {typeof Controller} */ (this.constructor).targets.forEach((targetName) => { 25 | const ctor = /** @type {typeof Controller} */ (this.constructor) 26 | // Make sure target calls are accessible in the constructor. 27 | if (!ctor.__finalized__) { 28 | ctor.__finalized__ = true; 29 | 30 | Object.defineProperties(ctor.prototype, { 31 | [`${targetName}Targets`]: { 32 | get () { 33 | /** 34 | * @type {HTMLElement[]} 35 | */ 36 | const ary = []; 37 | /** @type {NodeListOf} */ (this.element.querySelectorAll(this.application._targetQuery(this.controllerName, targetName))).forEach((el) => { 38 | if (el.closest(this.application._controllerQuery(this.controllerName)) !== this.element) { 39 | return 40 | } 41 | 42 | ary.push(el) 43 | }) 44 | 45 | return ary 46 | } 47 | }, 48 | [`has${capitalize(targetName)}Target`]: { 49 | get () { 50 | return Boolean(this[`${targetName}Target`]) 51 | }, 52 | }, 53 | [`${targetName}Target`]: { 54 | get () { 55 | return this[`${targetName}Targets`]?.[0] || null 56 | }, 57 | }, 58 | }) 59 | } 60 | }) 61 | 62 | /** 63 | * @type {Element} 64 | */ 65 | this.element = element 66 | 67 | /** 68 | * @type {import("./index.js").Application} 69 | */ 70 | this.application = application 71 | 72 | /** 73 | * @type {string} 74 | */ 75 | this.controllerName = controllerName 76 | 77 | /** 78 | * @type {boolean} 79 | */ 80 | this.isConnected = false 81 | } 82 | 83 | initialize () {} 84 | connectedCallback () {} 85 | disconnectedCallback () {} 86 | } 87 | 88 | /** 89 | * @param {string} str 90 | * @return {string} 91 | */ 92 | function capitalize (str) { 93 | return str[0].toUpperCase() + str.slice(1, str.length) 94 | } 95 | -------------------------------------------------------------------------------- /exports/index.js: -------------------------------------------------------------------------------- 1 | // @ts-check 2 | 3 | export { Controller } from "./controller.js" 4 | export { Application } from "./application.js" 5 | 6 | -------------------------------------------------------------------------------- /internal/index.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KonnorRogers/stimulite/472be072e47ec51189bd60c50b9f66541cbd9a3e/internal/index.js -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "stimulite", 3 | "version": "0.0.5", 4 | "description": "A tiny ~2kb alternative to Stimulus", 5 | "main": "./exports/index.js", 6 | "module": "./exports/index.js", 7 | "types": "./exports/index.d.ts", 8 | "exports": { 9 | ".": "./exports/index.js", 10 | "./package.json": "./package.json", 11 | "./exports/*.js": "./exports/*.js", 12 | "./exports/*": "./exports/*", 13 | "./types/*": "./types/*.d.ts" 14 | }, 15 | "type": "module", 16 | "files": [ 17 | "exports", 18 | "internal", 19 | "types", 20 | "README.md", 21 | "LICENSE" 22 | ], 23 | "scripts": { 24 | "build": "rimraf -g \"./{exports,internal}/**/*.d.ts\" && tsc", 25 | "deploy:patch": "npm run build && npm version patch && npm publish && git push --follow-tags", 26 | "deploy:minor": "npm run build && npm version minor && npm publish && git push --follow-tags", 27 | "deploy:major": "npm run build && npm version major && npm publish && git push --follow-tags", 28 | "test": "web-test-runner" 29 | }, 30 | "keywords": [], 31 | "license": "MIT", 32 | "repository": "git@github.com:KonnorRogers/stimulite.git", 33 | "bugs": { 34 | "url": "https://github.com/KonnorRogers/stimulite/issues" 35 | }, 36 | "homepage": "https://github.com/KonnorRogers/stimulite", 37 | "author": "KonnorRogers ", 38 | "publishConfig": { 39 | "access": "public" 40 | }, 41 | "devDependencies": { 42 | "@esm-bundle/chai": "4.3.4-fix.0", 43 | "@open-wc/testing-helpers": "^2.3.0", 44 | "@web/test-runner": "^0.17.2", 45 | "@web/test-runner-playwright": "^0.10.1", 46 | "stimulite": "link:.", 47 | "playwright": "^1.39.0", 48 | "rimraf": "^5.0.5", 49 | "sinon": "^16.1.0", 50 | "typescript": "^5.2.2" 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: '6.0' 2 | 3 | settings: 4 | autoInstallPeers: true 5 | excludeLinksFromLockfile: false 6 | 7 | devDependencies: 8 | '@esm-bundle/chai': 9 | specifier: 4.3.4-fix.0 10 | version: 4.3.4-fix.0 11 | '@open-wc/testing-helpers': 12 | specifier: ^2.3.0 13 | version: 2.3.0 14 | '@web/test-runner': 15 | specifier: ^0.17.2 16 | version: 0.17.2(typescript@5.2.2) 17 | '@web/test-runner-playwright': 18 | specifier: ^0.10.1 19 | version: 0.10.1 20 | playwright: 21 | specifier: ^1.39.0 22 | version: 1.39.0 23 | rimraf: 24 | specifier: ^5.0.5 25 | version: 5.0.5 26 | sinon: 27 | specifier: ^16.1.0 28 | version: 16.1.0 29 | stimulite: 30 | specifier: link:. 31 | version: 'link:' 32 | typescript: 33 | specifier: ^5.2.2 34 | version: 5.2.2 35 | 36 | packages: 37 | 38 | /@75lb/deep-merge@1.1.1: 39 | resolution: {integrity: sha512-xvgv6pkMGBA6GwdyJbNAnDmfAIR/DfWhrj9jgWh3TY7gRm3KO46x/GPjRg6wJ0nOepwqrNxFfojebh0Df4h4Tw==} 40 | engines: {node: '>=12.17'} 41 | dependencies: 42 | lodash.assignwith: 4.2.0 43 | typical: 7.1.1 44 | dev: true 45 | 46 | /@babel/code-frame@7.22.13: 47 | resolution: {integrity: sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==} 48 | engines: {node: '>=6.9.0'} 49 | dependencies: 50 | '@babel/highlight': 7.22.20 51 | chalk: 2.4.2 52 | dev: true 53 | 54 | /@babel/helper-validator-identifier@7.22.20: 55 | resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} 56 | engines: {node: '>=6.9.0'} 57 | dev: true 58 | 59 | /@babel/highlight@7.22.20: 60 | resolution: {integrity: sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==} 61 | engines: {node: '>=6.9.0'} 62 | dependencies: 63 | '@babel/helper-validator-identifier': 7.22.20 64 | chalk: 2.4.2 65 | js-tokens: 4.0.0 66 | dev: true 67 | 68 | /@esm-bundle/chai@4.3.4-fix.0: 69 | resolution: {integrity: sha512-26SKdM4uvDWlY8/OOOxSB1AqQWeBosCX3wRYUZO7enTAj03CtVxIiCimYVG2WpULcyV51qapK4qTovwkUr5Mlw==} 70 | dependencies: 71 | '@types/chai': 4.3.8 72 | dev: true 73 | 74 | /@isaacs/cliui@8.0.2: 75 | resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} 76 | engines: {node: '>=12'} 77 | dependencies: 78 | string-width: 5.1.2 79 | string-width-cjs: /string-width@4.2.3 80 | strip-ansi: 7.1.0 81 | strip-ansi-cjs: /strip-ansi@6.0.1 82 | wrap-ansi: 8.1.0 83 | wrap-ansi-cjs: /wrap-ansi@7.0.0 84 | dev: true 85 | 86 | /@jridgewell/resolve-uri@3.1.1: 87 | resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==} 88 | engines: {node: '>=6.0.0'} 89 | dev: true 90 | 91 | /@jridgewell/sourcemap-codec@1.4.15: 92 | resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} 93 | dev: true 94 | 95 | /@jridgewell/trace-mapping@0.3.19: 96 | resolution: {integrity: sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==} 97 | dependencies: 98 | '@jridgewell/resolve-uri': 3.1.1 99 | '@jridgewell/sourcemap-codec': 1.4.15 100 | dev: true 101 | 102 | /@lit-labs/ssr-dom-shim@1.1.2: 103 | resolution: {integrity: sha512-jnOD+/+dSrfTWYfSXBXlo5l5f0q1UuJo3tkbMDCYA2lKUYq79jaxqtGEvnRoh049nt1vdo1+45RinipU6FGY2g==} 104 | dev: true 105 | 106 | /@lit/reactive-element@1.6.3: 107 | resolution: {integrity: sha512-QuTgnG52Poic7uM1AN5yJ09QMe0O28e10XzSvWDz02TJiiKee4stsiownEIadWm8nYzyDAyT+gKzUoZmiWQtsQ==} 108 | dependencies: 109 | '@lit-labs/ssr-dom-shim': 1.1.2 110 | dev: true 111 | 112 | /@nodelib/fs.scandir@2.1.5: 113 | resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} 114 | engines: {node: '>= 8'} 115 | dependencies: 116 | '@nodelib/fs.stat': 2.0.5 117 | run-parallel: 1.2.0 118 | dev: true 119 | 120 | /@nodelib/fs.stat@2.0.5: 121 | resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} 122 | engines: {node: '>= 8'} 123 | dev: true 124 | 125 | /@nodelib/fs.walk@1.2.8: 126 | resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} 127 | engines: {node: '>= 8'} 128 | dependencies: 129 | '@nodelib/fs.scandir': 2.1.5 130 | fastq: 1.15.0 131 | dev: true 132 | 133 | /@open-wc/dedupe-mixin@1.4.0: 134 | resolution: {integrity: sha512-Sj7gKl1TLcDbF7B6KUhtvr+1UCxdhMbNY5KxdU5IfMFWqL8oy1ZeAcCANjoB1TL0AJTcPmcCFsCbHf8X2jGDUA==} 135 | dev: true 136 | 137 | /@open-wc/scoped-elements@2.2.1: 138 | resolution: {integrity: sha512-AWq/vhQWUQ2mgO0GsKVq/KEBuSxy30WqCWfCqxY/KZG5Z7JXRbkxrvKhFwPu467jrVDuLc+Xo9vbxZQHVM/nJA==} 139 | dependencies: 140 | '@lit/reactive-element': 1.6.3 141 | '@open-wc/dedupe-mixin': 1.4.0 142 | dev: true 143 | 144 | /@open-wc/testing-helpers@2.3.0: 145 | resolution: {integrity: sha512-wkDipkia/OMWq5Z1KkAgvqNLfIOCiPGrrtfoCKuQje8u7F0Bz9Un44EwBtWcCdYtLc40quWP7XFpFsW8poIfUA==} 146 | dependencies: 147 | '@open-wc/scoped-elements': 2.2.1 148 | lit: 2.8.0 149 | lit-html: 2.8.0 150 | dev: true 151 | 152 | /@pkgjs/parseargs@0.11.0: 153 | resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} 154 | engines: {node: '>=14'} 155 | requiresBuild: true 156 | dev: true 157 | optional: true 158 | 159 | /@puppeteer/browsers@1.4.6(typescript@5.2.2): 160 | resolution: {integrity: sha512-x4BEjr2SjOPowNeiguzjozQbsc6h437ovD/wu+JpaenxVLm3jkgzHY2xOslMTp50HoTvQreMjiexiGQw1sqZlQ==} 161 | engines: {node: '>=16.3.0'} 162 | hasBin: true 163 | peerDependencies: 164 | typescript: '>= 4.7.4' 165 | peerDependenciesMeta: 166 | typescript: 167 | optional: true 168 | dependencies: 169 | debug: 4.3.4 170 | extract-zip: 2.0.1 171 | progress: 2.0.3 172 | proxy-agent: 6.3.0 173 | tar-fs: 3.0.4 174 | typescript: 5.2.2 175 | unbzip2-stream: 1.4.3 176 | yargs: 17.7.1 177 | transitivePeerDependencies: 178 | - supports-color 179 | dev: true 180 | 181 | /@rollup/plugin-node-resolve@15.2.3(rollup@3.29.4): 182 | resolution: {integrity: sha512-j/lym8nf5E21LwBT4Df1VD6hRO2L2iwUeUmP7litikRsVp1H6NWx20NEp0Y7su+7XGc476GnXXc4kFeZNGmaSQ==} 183 | engines: {node: '>=14.0.0'} 184 | peerDependencies: 185 | rollup: ^2.78.0||^3.0.0||^4.0.0 186 | peerDependenciesMeta: 187 | rollup: 188 | optional: true 189 | dependencies: 190 | '@rollup/pluginutils': 5.0.5(rollup@3.29.4) 191 | '@types/resolve': 1.20.2 192 | deepmerge: 4.3.1 193 | is-builtin-module: 3.2.1 194 | is-module: 1.0.0 195 | resolve: 1.22.8 196 | rollup: 3.29.4 197 | dev: true 198 | 199 | /@rollup/pluginutils@5.0.5(rollup@3.29.4): 200 | resolution: {integrity: sha512-6aEYR910NyP73oHiJglti74iRyOwgFU4x3meH/H8OJx6Ry0j6cOVZ5X/wTvub7G7Ao6qaHBEaNsV3GLJkSsF+Q==} 201 | engines: {node: '>=14.0.0'} 202 | peerDependencies: 203 | rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 204 | peerDependenciesMeta: 205 | rollup: 206 | optional: true 207 | dependencies: 208 | '@types/estree': 1.0.2 209 | estree-walker: 2.0.2 210 | picomatch: 2.3.1 211 | rollup: 3.29.4 212 | dev: true 213 | 214 | /@sinonjs/commons@2.0.0: 215 | resolution: {integrity: sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==} 216 | dependencies: 217 | type-detect: 4.0.8 218 | dev: true 219 | 220 | /@sinonjs/commons@3.0.0: 221 | resolution: {integrity: sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA==} 222 | dependencies: 223 | type-detect: 4.0.8 224 | dev: true 225 | 226 | /@sinonjs/fake-timers@10.3.0: 227 | resolution: {integrity: sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==} 228 | dependencies: 229 | '@sinonjs/commons': 3.0.0 230 | dev: true 231 | 232 | /@sinonjs/samsam@8.0.0: 233 | resolution: {integrity: sha512-Bp8KUVlLp8ibJZrnvq2foVhP0IVX2CIprMJPK0vqGqgrDa0OHVKeZyBykqskkrdxV6yKBPmGasO8LVjAKR3Gew==} 234 | dependencies: 235 | '@sinonjs/commons': 2.0.0 236 | lodash.get: 4.4.2 237 | type-detect: 4.0.8 238 | dev: true 239 | 240 | /@sinonjs/text-encoding@0.7.2: 241 | resolution: {integrity: sha512-sXXKG+uL9IrKqViTtao2Ws6dy0znu9sOaP1di/jKGW1M6VssO8vlpXCQcpZ+jisQ1tTFAC5Jo/EOzFbggBagFQ==} 242 | dev: true 243 | 244 | /@tootallnate/quickjs-emscripten@0.23.0: 245 | resolution: {integrity: sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==} 246 | dev: true 247 | 248 | /@types/accepts@1.3.5: 249 | resolution: {integrity: sha512-jOdnI/3qTpHABjM5cx1Hc0sKsPoYCp+DP/GJRGtDlPd7fiV9oXGGIcjW/ZOxLIvjGz8MA+uMZI9metHlgqbgwQ==} 250 | dependencies: 251 | '@types/node': 20.8.6 252 | dev: true 253 | 254 | /@types/babel__code-frame@7.0.4: 255 | resolution: {integrity: sha512-WBxINLlATjvmpCgBbb9tOPrKtcPfu4A/Yz2iRzmdaodfvjAS/Z0WZJClV9/EXvoC9viI3lgUs7B9Uo7G/RmMGg==} 256 | dev: true 257 | 258 | /@types/body-parser@1.19.3: 259 | resolution: {integrity: sha512-oyl4jvAfTGX9Bt6Or4H9ni1Z447/tQuxnZsytsCaExKlmJiU8sFgnIBRzJUpKwB5eWn9HuBYlUlVA74q/yN0eQ==} 260 | dependencies: 261 | '@types/connect': 3.4.36 262 | '@types/node': 20.8.6 263 | dev: true 264 | 265 | /@types/chai@4.3.8: 266 | resolution: {integrity: sha512-yW/qTM4mRBBcsA9Xw9FbcImYtFPY7sgr+G/O5RDYVmxiy9a+pE5FyoFUi8JYCZY5nicj8atrr1pcfPiYpeNGOA==} 267 | dev: true 268 | 269 | /@types/co-body@6.1.1: 270 | resolution: {integrity: sha512-I9A1k7o4m8m6YPYJIGb1JyNTLqRWtSPg1JOZPWlE19w8Su2VRgRVp/SkKftQSwoxWHGUxGbON4jltONMumC8bQ==} 271 | dependencies: 272 | '@types/node': 20.8.6 273 | '@types/qs': 6.9.8 274 | dev: true 275 | 276 | /@types/command-line-args@5.2.1: 277 | resolution: {integrity: sha512-U2OcmS2tj36Yceu+mRuPyUV0ILfau/h5onStcSCzqTENsq0sBiAp2TmaXu1k8fY4McLcPKSYl9FRzn2hx5bI+w==} 278 | dev: true 279 | 280 | /@types/connect@3.4.36: 281 | resolution: {integrity: sha512-P63Zd/JUGq+PdrM1lv0Wv5SBYeA2+CORvbrXbngriYY0jzLUWfQMQQxOhjONEz/wlHOAxOdY7CY65rgQdTjq2w==} 282 | dependencies: 283 | '@types/node': 20.8.6 284 | dev: true 285 | 286 | /@types/content-disposition@0.5.6: 287 | resolution: {integrity: sha512-GmShTb4qA9+HMPPaV2+Up8tJafgi38geFi7vL4qAM7k8BwjoelgHZqEUKJZLvughUw22h6vD/wvwN4IUCaWpDA==} 288 | dev: true 289 | 290 | /@types/convert-source-map@2.0.1: 291 | resolution: {integrity: sha512-tm5Eb3AwhibN6ULRaad5TbNO83WoXVZLh2YRGAFH+qWkUz48l9Hu1jc+wJswB7T+ACWAG0cFnTeeQGpwedvlNw==} 292 | dev: true 293 | 294 | /@types/cookies@0.7.8: 295 | resolution: {integrity: sha512-y6KhF1GtsLERUpqOV+qZJrjUGzc0GE6UTa0b5Z/LZ7Nm2mKSdCXmS6Kdnl7fctPNnMSouHjxqEWI12/YqQfk5w==} 296 | dependencies: 297 | '@types/connect': 3.4.36 298 | '@types/express': 4.17.19 299 | '@types/keygrip': 1.0.3 300 | '@types/node': 20.8.6 301 | dev: true 302 | 303 | /@types/debounce@1.2.2: 304 | resolution: {integrity: sha512-ow0L7we5RXNQocEO9LNBRJCk/ecBc8M0aTg0DLrlg1nsnKAcjvFmYFUbsxujlrbngRslmKIA4mKoOxIJdUElhw==} 305 | dev: true 306 | 307 | /@types/estree@1.0.2: 308 | resolution: {integrity: sha512-VeiPZ9MMwXjO32/Xu7+OwflfmeoRwkE/qzndw42gGtgJwZopBnzy2gD//NN1+go1mADzkDcqf/KnFRSjTJ8xJA==} 309 | dev: true 310 | 311 | /@types/express-serve-static-core@4.17.37: 312 | resolution: {integrity: sha512-ZohaCYTgGFcOP7u6aJOhY9uIZQgZ2vxC2yWoArY+FeDXlqeH66ZVBjgvg+RLVAS/DWNq4Ap9ZXu1+SUQiiWYMg==} 313 | dependencies: 314 | '@types/node': 20.8.6 315 | '@types/qs': 6.9.8 316 | '@types/range-parser': 1.2.5 317 | '@types/send': 0.17.2 318 | dev: true 319 | 320 | /@types/express@4.17.19: 321 | resolution: {integrity: sha512-UtOfBtzN9OvpZPPbnnYunfjM7XCI4jyk1NvnFhTVz5krYAnW4o5DCoIekvms+8ApqhB4+9wSge1kBijdfTSmfg==} 322 | dependencies: 323 | '@types/body-parser': 1.19.3 324 | '@types/express-serve-static-core': 4.17.37 325 | '@types/qs': 6.9.8 326 | '@types/serve-static': 1.15.3 327 | dev: true 328 | 329 | /@types/http-assert@1.5.3: 330 | resolution: {integrity: sha512-FyAOrDuQmBi8/or3ns4rwPno7/9tJTijVW6aQQjK02+kOQ8zmoNg2XJtAuQhvQcy1ASJq38wirX5//9J1EqoUA==} 331 | dev: true 332 | 333 | /@types/http-errors@2.0.2: 334 | resolution: {integrity: sha512-lPG6KlZs88gef6aD85z3HNkztpj7w2R7HmR3gygjfXCQmsLloWNARFkMuzKiiY8FGdh1XDpgBdrSf4aKDiA7Kg==} 335 | dev: true 336 | 337 | /@types/istanbul-lib-coverage@2.0.4: 338 | resolution: {integrity: sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==} 339 | dev: true 340 | 341 | /@types/istanbul-lib-report@3.0.1: 342 | resolution: {integrity: sha512-gPQuzaPR5h/djlAv2apEG1HVOyj1IUs7GpfMZixU0/0KXT3pm64ylHuMUI1/Akh+sq/iikxg6Z2j+fcMDXaaTQ==} 343 | dependencies: 344 | '@types/istanbul-lib-coverage': 2.0.4 345 | dev: true 346 | 347 | /@types/istanbul-reports@3.0.2: 348 | resolution: {integrity: sha512-kv43F9eb3Lhj+lr/Hn6OcLCs/sSM8bt+fIaP11rCYngfV6NVjzWXJ17owQtDQTL9tQ8WSLUrGsSJ6rJz0F1w1A==} 349 | dependencies: 350 | '@types/istanbul-lib-report': 3.0.1 351 | dev: true 352 | 353 | /@types/keygrip@1.0.3: 354 | resolution: {integrity: sha512-tfzBBb7OV2PbUfKbG6zRE5UbmtdLVCKT/XT364Z9ny6pXNbd9GnIB6aFYpq2A5lZ6mq9bhXgK6h5MFGNwhMmuQ==} 355 | dev: true 356 | 357 | /@types/koa-compose@3.2.6: 358 | resolution: {integrity: sha512-PHiciWxH3NRyAaxUdEDE1NIZNfvhgtPlsdkjRPazHC6weqt90Jr0uLhIQs+SDwC8HQ/jnA7UQP6xOqGFB7ugWw==} 359 | dependencies: 360 | '@types/koa': 2.13.9 361 | dev: true 362 | 363 | /@types/koa@2.13.9: 364 | resolution: {integrity: sha512-tPX3cN1dGrMn+sjCDEiQqXH2AqlPoPd594S/8zxwUm/ZbPsQXKqHPUypr2gjCPhHUc+nDJLduhh5lXI/1olnGQ==} 365 | dependencies: 366 | '@types/accepts': 1.3.5 367 | '@types/content-disposition': 0.5.6 368 | '@types/cookies': 0.7.8 369 | '@types/http-assert': 1.5.3 370 | '@types/http-errors': 2.0.2 371 | '@types/keygrip': 1.0.3 372 | '@types/koa-compose': 3.2.6 373 | '@types/node': 20.8.6 374 | dev: true 375 | 376 | /@types/mime@1.3.3: 377 | resolution: {integrity: sha512-Ys+/St+2VF4+xuY6+kDIXGxbNRO0mesVg0bbxEfB97Od1Vjpjx9KD1qxs64Gcb3CWPirk9Xe+PT4YiiHQ9T+eg==} 378 | dev: true 379 | 380 | /@types/mime@3.0.2: 381 | resolution: {integrity: sha512-Wj+fqpTLtTbG7c0tH47dkahefpLKEbB+xAZuLq7b4/IDHPl/n6VoXcyUQ2bypFlbSwvCr0y+bD4euTTqTJsPxQ==} 382 | dev: true 383 | 384 | /@types/mocha@10.0.2: 385 | resolution: {integrity: sha512-NaHL0+0lLNhX6d9rs+NSt97WH/gIlRHmszXbQ/8/MV/eVcFNdeJ/GYhrFuUc8K7WuPhRhTSdMkCp8VMzhUq85w==} 386 | dev: true 387 | 388 | /@types/node@20.8.6: 389 | resolution: {integrity: sha512-eWO4K2Ji70QzKUqRy6oyJWUeB7+g2cRagT3T/nxYibYcT4y2BDL8lqolRXjTHmkZCdJfIPaY73KbJAZmcryxTQ==} 390 | dependencies: 391 | undici-types: 5.25.3 392 | dev: true 393 | 394 | /@types/parse5@6.0.3: 395 | resolution: {integrity: sha512-SuT16Q1K51EAVPz1K29DJ/sXjhSQ0zjvsypYJ6tlwVsRV9jwW5Adq2ch8Dq8kDBCkYnELS7N7VNCSB5nC56t/g==} 396 | dev: true 397 | 398 | /@types/qs@6.9.8: 399 | resolution: {integrity: sha512-u95svzDlTysU5xecFNTgfFG5RUWu1A9P0VzgpcIiGZA9iraHOdSzcxMxQ55DyeRaGCSxQi7LxXDI4rzq/MYfdg==} 400 | dev: true 401 | 402 | /@types/range-parser@1.2.5: 403 | resolution: {integrity: sha512-xrO9OoVPqFuYyR/loIHjnbvvyRZREYKLjxV4+dY6v3FQR3stQ9ZxIGkaclF7YhI9hfjpuTbu14hZEy94qKLtOA==} 404 | dev: true 405 | 406 | /@types/resolve@1.20.2: 407 | resolution: {integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==} 408 | dev: true 409 | 410 | /@types/send@0.17.2: 411 | resolution: {integrity: sha512-aAG6yRf6r0wQ29bkS+x97BIs64ZLxeE/ARwyS6wrldMm3C1MdKwCcnnEwMC1slI8wuxJOpiUH9MioC0A0i+GJw==} 412 | dependencies: 413 | '@types/mime': 1.3.3 414 | '@types/node': 20.8.6 415 | dev: true 416 | 417 | /@types/serve-static@1.15.3: 418 | resolution: {integrity: sha512-yVRvFsEMrv7s0lGhzrggJjNOSmZCdgCjw9xWrPr/kNNLp6FaDfMC1KaYl3TSJ0c58bECwNBMoQrZJ8hA8E1eFg==} 419 | dependencies: 420 | '@types/http-errors': 2.0.2 421 | '@types/mime': 3.0.2 422 | '@types/node': 20.8.6 423 | dev: true 424 | 425 | /@types/trusted-types@2.0.4: 426 | resolution: {integrity: sha512-IDaobHimLQhjwsQ/NMwRVfa/yL7L/wriQPMhw1ZJall0KX6E1oxk29XMDeilW5qTIg5aoiqf5Udy8U/51aNoQQ==} 427 | dev: true 428 | 429 | /@types/ws@7.4.7: 430 | resolution: {integrity: sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==} 431 | dependencies: 432 | '@types/node': 20.8.6 433 | dev: true 434 | 435 | /@types/yauzl@2.10.1: 436 | resolution: {integrity: sha512-CHzgNU3qYBnp/O4S3yv2tXPlvMTq0YWSTVg2/JYLqWZGHwwgJGAwd00poay/11asPq8wLFwHzubyInqHIFmmiw==} 437 | requiresBuild: true 438 | dependencies: 439 | '@types/node': 20.8.6 440 | dev: true 441 | optional: true 442 | 443 | /@web/browser-logs@0.3.3: 444 | resolution: {integrity: sha512-wt8arj0x7ghXbnipgCvLR+xQ90cFg16ae23cFbInCrJvAxvyI22bAtT24W4XOXMPXwWLBVUJwBgBcXo3oKIvDw==} 445 | engines: {node: '>=16.0.0'} 446 | dependencies: 447 | errorstacks: 2.4.0 448 | dev: true 449 | 450 | /@web/config-loader@0.2.1: 451 | resolution: {integrity: sha512-cQvTYA5lWLyyO8/R2aOReiudLa8r0LFHvMNYCwSAjzvrghb+AHxaW3BJWP9ORx6OaDcI7g5X8OATA81LSJce4A==} 452 | engines: {node: '>=16.0.0'} 453 | dependencies: 454 | semver: 7.5.4 455 | dev: true 456 | 457 | /@web/dev-server-core@0.5.2: 458 | resolution: {integrity: sha512-7YjWmwzM+K5fPvBCXldUIMTK4EnEufi1aWQWinQE81oW1CqzEwmyUNCtnWV9fcPA4kJC4qrpcjWNGF4YDWxuSg==} 459 | engines: {node: '>=16.0.0'} 460 | dependencies: 461 | '@types/koa': 2.13.9 462 | '@types/ws': 7.4.7 463 | '@web/parse5-utils': 2.0.1 464 | chokidar: 3.5.3 465 | clone: 2.1.2 466 | es-module-lexer: 1.3.1 467 | get-stream: 6.0.1 468 | is-stream: 2.0.1 469 | isbinaryfile: 5.0.0 470 | koa: 2.14.2 471 | koa-etag: 4.0.0 472 | koa-send: 5.0.1 473 | koa-static: 5.0.0 474 | lru-cache: 8.0.5 475 | mime-types: 2.1.35 476 | parse5: 6.0.1 477 | picomatch: 2.3.1 478 | ws: 7.5.9 479 | transitivePeerDependencies: 480 | - bufferutil 481 | - supports-color 482 | - utf-8-validate 483 | dev: true 484 | 485 | /@web/dev-server-rollup@0.5.2: 486 | resolution: {integrity: sha512-R1heFIOmbExKJn2auDcOcF0EPoLQotZF1HE8Bpqq4TfLRkc7w+JClLdwkOMr/+Ip608cRw8VMkc7teYDFkvSXw==} 487 | engines: {node: '>=16.0.0'} 488 | dependencies: 489 | '@rollup/plugin-node-resolve': 15.2.3(rollup@3.29.4) 490 | '@web/dev-server-core': 0.5.2 491 | nanocolors: 0.2.13 492 | parse5: 6.0.1 493 | rollup: 3.29.4 494 | whatwg-url: 11.0.0 495 | transitivePeerDependencies: 496 | - bufferutil 497 | - supports-color 498 | - utf-8-validate 499 | dev: true 500 | 501 | /@web/dev-server@0.3.3: 502 | resolution: {integrity: sha512-dILoqPa4hHh/p2jK702fDHPSRv5JSjDiDaXKE+IfCX/hNEuX7SQ65Z5JPB7T+5qbtsOxbG/KOQpo2q8ZGm7hOQ==} 503 | engines: {node: '>=16.0.0'} 504 | hasBin: true 505 | dependencies: 506 | '@babel/code-frame': 7.22.13 507 | '@types/command-line-args': 5.2.1 508 | '@web/config-loader': 0.2.1 509 | '@web/dev-server-core': 0.5.2 510 | '@web/dev-server-rollup': 0.5.2 511 | camelcase: 6.3.0 512 | command-line-args: 5.2.1 513 | command-line-usage: 7.0.1 514 | debounce: 1.2.1 515 | deepmerge: 4.3.1 516 | ip: 1.1.8 517 | nanocolors: 0.2.13 518 | open: 8.4.2 519 | portfinder: 1.0.32 520 | transitivePeerDependencies: 521 | - bufferutil 522 | - supports-color 523 | - utf-8-validate 524 | dev: true 525 | 526 | /@web/parse5-utils@2.0.1: 527 | resolution: {integrity: sha512-FQI72BU5CXhpp7gLRskOQGGCcwvagLZnMnDwAfjrxo3pm1KOQzr8Vl+438IGpHV62xvjNdF1pjXwXcf7eekWGw==} 528 | engines: {node: '>=16.0.0'} 529 | dependencies: 530 | '@types/parse5': 6.0.3 531 | parse5: 6.0.1 532 | dev: true 533 | 534 | /@web/test-runner-chrome@0.14.1(typescript@5.2.2): 535 | resolution: {integrity: sha512-snyQN5xyiTFVXQ1bmJ1T5dqgnCXofngTv2aevv5gW4FumKo96aFF7kBr+SRQnEd3yary+xJsGFT+50A6/mJ+1A==} 536 | engines: {node: '>=16.0.0'} 537 | dependencies: 538 | '@web/test-runner-core': 0.11.4 539 | '@web/test-runner-coverage-v8': 0.7.1 540 | async-mutex: 0.4.0 541 | chrome-launcher: 0.15.2 542 | puppeteer-core: 20.9.0(typescript@5.2.2) 543 | transitivePeerDependencies: 544 | - bufferutil 545 | - encoding 546 | - supports-color 547 | - typescript 548 | - utf-8-validate 549 | dev: true 550 | 551 | /@web/test-runner-commands@0.8.1: 552 | resolution: {integrity: sha512-hGzm3jNByC8++nQb3osW60jZlmpIu77YeE51zlQ+lITw1v3rRcKLFl6zi2OlWPUENB7Wcjyvd74T6SLc/P7WQA==} 553 | engines: {node: '>=16.0.0'} 554 | dependencies: 555 | '@web/test-runner-core': 0.11.4 556 | mkdirp: 1.0.4 557 | transitivePeerDependencies: 558 | - bufferutil 559 | - supports-color 560 | - utf-8-validate 561 | dev: true 562 | 563 | /@web/test-runner-core@0.11.4: 564 | resolution: {integrity: sha512-E7BsKAP8FAAEsfj4viASjmuaYfOw4UlKP9IFqo4W20eVyd1nbUWU3Amq4Jksh7W/j811qh3VaFNjDfCwklQXMg==} 565 | engines: {node: '>=16.0.0'} 566 | dependencies: 567 | '@babel/code-frame': 7.22.13 568 | '@types/babel__code-frame': 7.0.4 569 | '@types/co-body': 6.1.1 570 | '@types/convert-source-map': 2.0.1 571 | '@types/debounce': 1.2.2 572 | '@types/istanbul-lib-coverage': 2.0.4 573 | '@types/istanbul-reports': 3.0.2 574 | '@web/browser-logs': 0.3.3 575 | '@web/dev-server-core': 0.5.2 576 | chokidar: 3.5.3 577 | cli-cursor: 3.1.0 578 | co-body: 6.1.0 579 | convert-source-map: 2.0.0 580 | debounce: 1.2.1 581 | dependency-graph: 0.11.0 582 | globby: 11.1.0 583 | ip: 1.1.8 584 | istanbul-lib-coverage: 3.2.0 585 | istanbul-lib-report: 3.0.1 586 | istanbul-reports: 3.1.6 587 | log-update: 4.0.0 588 | nanocolors: 0.2.13 589 | nanoid: 3.3.6 590 | open: 8.4.2 591 | picomatch: 2.3.1 592 | source-map: 0.7.4 593 | transitivePeerDependencies: 594 | - bufferutil 595 | - supports-color 596 | - utf-8-validate 597 | dev: true 598 | 599 | /@web/test-runner-coverage-v8@0.7.1: 600 | resolution: {integrity: sha512-R0laTOxbLg7kVKHCBILEmja3w1ihlwkB+eRc7J06/ByyZoQVWxkM9SrTAUx7qCFI6o738Jj24a6TfIDbu3CwSA==} 601 | engines: {node: '>=16.0.0'} 602 | dependencies: 603 | '@web/test-runner-core': 0.11.4 604 | istanbul-lib-coverage: 3.2.0 605 | lru-cache: 8.0.5 606 | picomatch: 2.3.1 607 | v8-to-istanbul: 9.1.3 608 | transitivePeerDependencies: 609 | - bufferutil 610 | - supports-color 611 | - utf-8-validate 612 | dev: true 613 | 614 | /@web/test-runner-mocha@0.8.1: 615 | resolution: {integrity: sha512-CfYNZBbUSBiPNKkbF/dhxayecLCYZnu3g4cfgpfgmvLewlVOO6gNxaPt2c1/QhZutzTvXcMlsmaoWyk08F+V6A==} 616 | engines: {node: '>=16.0.0'} 617 | dependencies: 618 | '@types/mocha': 10.0.2 619 | '@web/test-runner-core': 0.11.4 620 | transitivePeerDependencies: 621 | - bufferutil 622 | - supports-color 623 | - utf-8-validate 624 | dev: true 625 | 626 | /@web/test-runner-playwright@0.10.1: 627 | resolution: {integrity: sha512-/sEfuKc60UT0gXdn7M6lFddh+nCepO73gLPe2Og7jfoFv2tDkkk41RYBG75jx11RMVOJ6+i1peluLZSVxLlcEg==} 628 | engines: {node: '>=16.0.0'} 629 | dependencies: 630 | '@web/test-runner-core': 0.11.4 631 | '@web/test-runner-coverage-v8': 0.7.1 632 | playwright: 1.39.0 633 | transitivePeerDependencies: 634 | - bufferutil 635 | - supports-color 636 | - utf-8-validate 637 | dev: true 638 | 639 | /@web/test-runner@0.17.2(typescript@5.2.2): 640 | resolution: {integrity: sha512-UQGw5yqD11K4ni/X0SNTmumzmUMbU7YslmIItYwBjB+2849GNfKMId2jykSz/csb86QG1+Jj739QAlT7BmnWKA==} 641 | engines: {node: '>=16.0.0'} 642 | hasBin: true 643 | dependencies: 644 | '@web/browser-logs': 0.3.3 645 | '@web/config-loader': 0.2.1 646 | '@web/dev-server': 0.3.3 647 | '@web/test-runner-chrome': 0.14.1(typescript@5.2.2) 648 | '@web/test-runner-commands': 0.8.1 649 | '@web/test-runner-core': 0.11.4 650 | '@web/test-runner-mocha': 0.8.1 651 | camelcase: 6.3.0 652 | command-line-args: 5.2.1 653 | command-line-usage: 7.0.1 654 | convert-source-map: 2.0.0 655 | diff: 5.1.0 656 | globby: 11.1.0 657 | nanocolors: 0.2.13 658 | portfinder: 1.0.32 659 | source-map: 0.7.4 660 | transitivePeerDependencies: 661 | - bufferutil 662 | - encoding 663 | - supports-color 664 | - typescript 665 | - utf-8-validate 666 | dev: true 667 | 668 | /accepts@1.3.8: 669 | resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} 670 | engines: {node: '>= 0.6'} 671 | dependencies: 672 | mime-types: 2.1.35 673 | negotiator: 0.6.3 674 | dev: true 675 | 676 | /agent-base@7.1.0: 677 | resolution: {integrity: sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==} 678 | engines: {node: '>= 14'} 679 | dependencies: 680 | debug: 4.3.4 681 | transitivePeerDependencies: 682 | - supports-color 683 | dev: true 684 | 685 | /ansi-escapes@4.3.2: 686 | resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} 687 | engines: {node: '>=8'} 688 | dependencies: 689 | type-fest: 0.21.3 690 | dev: true 691 | 692 | /ansi-regex@5.0.1: 693 | resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} 694 | engines: {node: '>=8'} 695 | dev: true 696 | 697 | /ansi-regex@6.0.1: 698 | resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} 699 | engines: {node: '>=12'} 700 | dev: true 701 | 702 | /ansi-styles@3.2.1: 703 | resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} 704 | engines: {node: '>=4'} 705 | dependencies: 706 | color-convert: 1.9.3 707 | dev: true 708 | 709 | /ansi-styles@4.3.0: 710 | resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} 711 | engines: {node: '>=8'} 712 | dependencies: 713 | color-convert: 2.0.1 714 | dev: true 715 | 716 | /ansi-styles@6.2.1: 717 | resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} 718 | engines: {node: '>=12'} 719 | dev: true 720 | 721 | /anymatch@3.1.3: 722 | resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} 723 | engines: {node: '>= 8'} 724 | dependencies: 725 | normalize-path: 3.0.0 726 | picomatch: 2.3.1 727 | dev: true 728 | 729 | /array-back@3.1.0: 730 | resolution: {integrity: sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==} 731 | engines: {node: '>=6'} 732 | dev: true 733 | 734 | /array-back@6.2.2: 735 | resolution: {integrity: sha512-gUAZ7HPyb4SJczXAMUXMGAvI976JoK3qEx9v1FTmeYuJj0IBiaKttG1ydtGKdkfqWkIkouke7nG8ufGy77+Cvw==} 736 | engines: {node: '>=12.17'} 737 | dev: true 738 | 739 | /array-union@2.1.0: 740 | resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} 741 | engines: {node: '>=8'} 742 | dev: true 743 | 744 | /ast-types@0.13.4: 745 | resolution: {integrity: sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==} 746 | engines: {node: '>=4'} 747 | dependencies: 748 | tslib: 2.6.2 749 | dev: true 750 | 751 | /astral-regex@2.0.0: 752 | resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==} 753 | engines: {node: '>=8'} 754 | dev: true 755 | 756 | /async-mutex@0.4.0: 757 | resolution: {integrity: sha512-eJFZ1YhRR8UN8eBLoNzcDPcy/jqjsg6I1AP+KvWQX80BqOSW1oJPJXDylPUEeMr2ZQvHgnQ//Lp6f3RQ1zI7HA==} 758 | dependencies: 759 | tslib: 2.6.2 760 | dev: true 761 | 762 | /async@2.6.4: 763 | resolution: {integrity: sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==} 764 | dependencies: 765 | lodash: 4.17.21 766 | dev: true 767 | 768 | /b4a@1.6.4: 769 | resolution: {integrity: sha512-fpWrvyVHEKyeEvbKZTVOeZF3VSKKWtJxFIxX/jaVPf+cLbGUSitjb49pHLqPV2BUNNZ0LcoeEGfE/YCpyDYHIw==} 770 | dev: true 771 | 772 | /balanced-match@1.0.2: 773 | resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} 774 | dev: true 775 | 776 | /base64-js@1.5.1: 777 | resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} 778 | dev: true 779 | 780 | /basic-ftp@5.0.3: 781 | resolution: {integrity: sha512-QHX8HLlncOLpy54mh+k/sWIFd0ThmRqwe9ZjELybGZK+tZ8rUb9VO0saKJUROTbE+KhzDUT7xziGpGrW8Kmd+g==} 782 | engines: {node: '>=10.0.0'} 783 | dev: true 784 | 785 | /binary-extensions@2.2.0: 786 | resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} 787 | engines: {node: '>=8'} 788 | dev: true 789 | 790 | /brace-expansion@2.0.1: 791 | resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} 792 | dependencies: 793 | balanced-match: 1.0.2 794 | dev: true 795 | 796 | /braces@3.0.2: 797 | resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} 798 | engines: {node: '>=8'} 799 | dependencies: 800 | fill-range: 7.0.1 801 | dev: true 802 | 803 | /buffer-crc32@0.2.13: 804 | resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} 805 | dev: true 806 | 807 | /buffer@5.7.1: 808 | resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} 809 | dependencies: 810 | base64-js: 1.5.1 811 | ieee754: 1.2.1 812 | dev: true 813 | 814 | /builtin-modules@3.3.0: 815 | resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} 816 | engines: {node: '>=6'} 817 | dev: true 818 | 819 | /bytes@3.1.2: 820 | resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} 821 | engines: {node: '>= 0.8'} 822 | dev: true 823 | 824 | /cache-content-type@1.0.1: 825 | resolution: {integrity: sha512-IKufZ1o4Ut42YUrZSo8+qnMTrFuKkvyoLXUywKz9GJ5BrhOFGhLdkx9sG4KAnVvbY6kEcSFjLQul+DVmBm2bgA==} 826 | engines: {node: '>= 6.0.0'} 827 | dependencies: 828 | mime-types: 2.1.35 829 | ylru: 1.3.2 830 | dev: true 831 | 832 | /call-bind@1.0.2: 833 | resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==} 834 | dependencies: 835 | function-bind: 1.1.2 836 | get-intrinsic: 1.2.1 837 | dev: true 838 | 839 | /camelcase@6.3.0: 840 | resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} 841 | engines: {node: '>=10'} 842 | dev: true 843 | 844 | /chalk-template@0.4.0: 845 | resolution: {integrity: sha512-/ghrgmhfY8RaSdeo43hNXxpoHAtxdbskUHjPpfqUWGttFgycUhYPGx3YZBCnUCvOa7Doivn1IZec3DEGFoMgLg==} 846 | engines: {node: '>=12'} 847 | dependencies: 848 | chalk: 4.1.2 849 | dev: true 850 | 851 | /chalk@2.4.2: 852 | resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} 853 | engines: {node: '>=4'} 854 | dependencies: 855 | ansi-styles: 3.2.1 856 | escape-string-regexp: 1.0.5 857 | supports-color: 5.5.0 858 | dev: true 859 | 860 | /chalk@4.1.2: 861 | resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} 862 | engines: {node: '>=10'} 863 | dependencies: 864 | ansi-styles: 4.3.0 865 | supports-color: 7.2.0 866 | dev: true 867 | 868 | /chokidar@3.5.3: 869 | resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} 870 | engines: {node: '>= 8.10.0'} 871 | dependencies: 872 | anymatch: 3.1.3 873 | braces: 3.0.2 874 | glob-parent: 5.1.2 875 | is-binary-path: 2.1.0 876 | is-glob: 4.0.3 877 | normalize-path: 3.0.0 878 | readdirp: 3.6.0 879 | optionalDependencies: 880 | fsevents: 2.3.3 881 | dev: true 882 | 883 | /chrome-launcher@0.15.2: 884 | resolution: {integrity: sha512-zdLEwNo3aUVzIhKhTtXfxhdvZhUghrnmkvcAq2NoDd+LeOHKf03H5jwZ8T/STsAlzyALkBVK552iaG1fGf1xVQ==} 885 | engines: {node: '>=12.13.0'} 886 | hasBin: true 887 | dependencies: 888 | '@types/node': 20.8.6 889 | escape-string-regexp: 4.0.0 890 | is-wsl: 2.2.0 891 | lighthouse-logger: 1.4.2 892 | transitivePeerDependencies: 893 | - supports-color 894 | dev: true 895 | 896 | /chromium-bidi@0.4.16(devtools-protocol@0.0.1147663): 897 | resolution: {integrity: sha512-7ZbXdWERxRxSwo3txsBjjmc/NLxqb1Bk30mRb0BMS4YIaiV6zvKZqL/UAH+DdqcDYayDWk2n/y8klkBDODrPvA==} 898 | peerDependencies: 899 | devtools-protocol: '*' 900 | dependencies: 901 | devtools-protocol: 0.0.1147663 902 | mitt: 3.0.0 903 | dev: true 904 | 905 | /cli-cursor@3.1.0: 906 | resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} 907 | engines: {node: '>=8'} 908 | dependencies: 909 | restore-cursor: 3.1.0 910 | dev: true 911 | 912 | /cliui@8.0.1: 913 | resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} 914 | engines: {node: '>=12'} 915 | dependencies: 916 | string-width: 4.2.3 917 | strip-ansi: 6.0.1 918 | wrap-ansi: 7.0.0 919 | dev: true 920 | 921 | /clone@2.1.2: 922 | resolution: {integrity: sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==} 923 | engines: {node: '>=0.8'} 924 | dev: true 925 | 926 | /co-body@6.1.0: 927 | resolution: {integrity: sha512-m7pOT6CdLN7FuXUcpuz/8lfQ/L77x8SchHCF4G0RBTJO20Wzmhn5Sp4/5WsKy8OSpifBSUrmg83qEqaDHdyFuQ==} 928 | dependencies: 929 | inflation: 2.1.0 930 | qs: 6.11.2 931 | raw-body: 2.5.2 932 | type-is: 1.6.18 933 | dev: true 934 | 935 | /co@4.6.0: 936 | resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} 937 | engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} 938 | dev: true 939 | 940 | /color-convert@1.9.3: 941 | resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} 942 | dependencies: 943 | color-name: 1.1.3 944 | dev: true 945 | 946 | /color-convert@2.0.1: 947 | resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} 948 | engines: {node: '>=7.0.0'} 949 | dependencies: 950 | color-name: 1.1.4 951 | dev: true 952 | 953 | /color-name@1.1.3: 954 | resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} 955 | dev: true 956 | 957 | /color-name@1.1.4: 958 | resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} 959 | dev: true 960 | 961 | /command-line-args@5.2.1: 962 | resolution: {integrity: sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg==} 963 | engines: {node: '>=4.0.0'} 964 | dependencies: 965 | array-back: 3.1.0 966 | find-replace: 3.0.0 967 | lodash.camelcase: 4.3.0 968 | typical: 4.0.0 969 | dev: true 970 | 971 | /command-line-usage@7.0.1: 972 | resolution: {integrity: sha512-NCyznE//MuTjwi3y84QVUGEOT+P5oto1e1Pk/jFPVdPPfsG03qpTIl3yw6etR+v73d0lXsoojRpvbru2sqePxQ==} 973 | engines: {node: '>=12.20.0'} 974 | dependencies: 975 | array-back: 6.2.2 976 | chalk-template: 0.4.0 977 | table-layout: 3.0.2 978 | typical: 7.1.1 979 | dev: true 980 | 981 | /content-disposition@0.5.4: 982 | resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} 983 | engines: {node: '>= 0.6'} 984 | dependencies: 985 | safe-buffer: 5.2.1 986 | dev: true 987 | 988 | /content-type@1.0.5: 989 | resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} 990 | engines: {node: '>= 0.6'} 991 | dev: true 992 | 993 | /convert-source-map@2.0.0: 994 | resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} 995 | dev: true 996 | 997 | /cookies@0.8.0: 998 | resolution: {integrity: sha512-8aPsApQfebXnuI+537McwYsDtjVxGm8gTIzQI3FDW6t5t/DAhERxtnbEPN/8RX+uZthoz4eCOgloXaE5cYyNow==} 999 | engines: {node: '>= 0.8'} 1000 | dependencies: 1001 | depd: 2.0.0 1002 | keygrip: 1.1.0 1003 | dev: true 1004 | 1005 | /cross-fetch@4.0.0: 1006 | resolution: {integrity: sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==} 1007 | dependencies: 1008 | node-fetch: 2.7.0 1009 | transitivePeerDependencies: 1010 | - encoding 1011 | dev: true 1012 | 1013 | /cross-spawn@7.0.3: 1014 | resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} 1015 | engines: {node: '>= 8'} 1016 | dependencies: 1017 | path-key: 3.1.1 1018 | shebang-command: 2.0.0 1019 | which: 2.0.2 1020 | dev: true 1021 | 1022 | /data-uri-to-buffer@6.0.1: 1023 | resolution: {integrity: sha512-MZd3VlchQkp8rdend6vrx7MmVDJzSNTBvghvKjirLkD+WTChA3KUf0jkE68Q4UyctNqI11zZO9/x2Yx+ub5Cvg==} 1024 | engines: {node: '>= 14'} 1025 | dev: true 1026 | 1027 | /debounce@1.2.1: 1028 | resolution: {integrity: sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==} 1029 | dev: true 1030 | 1031 | /debug@2.6.9: 1032 | resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} 1033 | peerDependencies: 1034 | supports-color: '*' 1035 | peerDependenciesMeta: 1036 | supports-color: 1037 | optional: true 1038 | dependencies: 1039 | ms: 2.0.0 1040 | dev: true 1041 | 1042 | /debug@3.2.7: 1043 | resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} 1044 | peerDependencies: 1045 | supports-color: '*' 1046 | peerDependenciesMeta: 1047 | supports-color: 1048 | optional: true 1049 | dependencies: 1050 | ms: 2.1.3 1051 | dev: true 1052 | 1053 | /debug@4.3.4: 1054 | resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} 1055 | engines: {node: '>=6.0'} 1056 | peerDependencies: 1057 | supports-color: '*' 1058 | peerDependenciesMeta: 1059 | supports-color: 1060 | optional: true 1061 | dependencies: 1062 | ms: 2.1.2 1063 | dev: true 1064 | 1065 | /deep-equal@1.0.1: 1066 | resolution: {integrity: sha512-bHtC0iYvWhyaTzvV3CZgPeZQqCOBGyGsVV7v4eevpdkLHfiSrXUdBG+qAuSz4RI70sszvjQ1QSZ98An1yNwpSw==} 1067 | dev: true 1068 | 1069 | /deepmerge@4.3.1: 1070 | resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} 1071 | engines: {node: '>=0.10.0'} 1072 | dev: true 1073 | 1074 | /define-lazy-prop@2.0.0: 1075 | resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} 1076 | engines: {node: '>=8'} 1077 | dev: true 1078 | 1079 | /degenerator@5.0.1: 1080 | resolution: {integrity: sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==} 1081 | engines: {node: '>= 14'} 1082 | dependencies: 1083 | ast-types: 0.13.4 1084 | escodegen: 2.1.0 1085 | esprima: 4.0.1 1086 | dev: true 1087 | 1088 | /delegates@1.0.0: 1089 | resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==} 1090 | dev: true 1091 | 1092 | /depd@1.1.2: 1093 | resolution: {integrity: sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==} 1094 | engines: {node: '>= 0.6'} 1095 | dev: true 1096 | 1097 | /depd@2.0.0: 1098 | resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} 1099 | engines: {node: '>= 0.8'} 1100 | dev: true 1101 | 1102 | /dependency-graph@0.11.0: 1103 | resolution: {integrity: sha512-JeMq7fEshyepOWDfcfHK06N3MhyPhz++vtqWhMT5O9A3K42rdsEDpfdVqjaqaAhsw6a+ZqeDvQVtD0hFHQWrzg==} 1104 | engines: {node: '>= 0.6.0'} 1105 | dev: true 1106 | 1107 | /destroy@1.2.0: 1108 | resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} 1109 | engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} 1110 | dev: true 1111 | 1112 | /devtools-protocol@0.0.1147663: 1113 | resolution: {integrity: sha512-hyWmRrexdhbZ1tcJUGpO95ivbRhWXz++F4Ko+n21AY5PNln2ovoJw+8ZMNDTtip+CNFQfrtLVh/w4009dXO/eQ==} 1114 | dev: true 1115 | 1116 | /diff@5.1.0: 1117 | resolution: {integrity: sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==} 1118 | engines: {node: '>=0.3.1'} 1119 | dev: true 1120 | 1121 | /dir-glob@3.0.1: 1122 | resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} 1123 | engines: {node: '>=8'} 1124 | dependencies: 1125 | path-type: 4.0.0 1126 | dev: true 1127 | 1128 | /eastasianwidth@0.2.0: 1129 | resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} 1130 | dev: true 1131 | 1132 | /ee-first@1.1.1: 1133 | resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} 1134 | dev: true 1135 | 1136 | /emoji-regex@8.0.0: 1137 | resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} 1138 | dev: true 1139 | 1140 | /emoji-regex@9.2.2: 1141 | resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} 1142 | dev: true 1143 | 1144 | /encodeurl@1.0.2: 1145 | resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} 1146 | engines: {node: '>= 0.8'} 1147 | dev: true 1148 | 1149 | /end-of-stream@1.4.4: 1150 | resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} 1151 | dependencies: 1152 | once: 1.4.0 1153 | dev: true 1154 | 1155 | /errorstacks@2.4.0: 1156 | resolution: {integrity: sha512-5ecWhU5gt0a5G05nmQcgCxP5HperSMxLDzvWlT5U+ZSKkuDK0rJ3dbCQny6/vSCIXjwrhwSecXBbw1alr295hQ==} 1157 | dev: true 1158 | 1159 | /es-module-lexer@1.3.1: 1160 | resolution: {integrity: sha512-JUFAyicQV9mXc3YRxPnDlrfBKpqt6hUYzz9/boprUJHs4e4KVr3XwOF70doO6gwXUor6EWZJAyWAfKki84t20Q==} 1161 | dev: true 1162 | 1163 | /escalade@3.1.1: 1164 | resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} 1165 | engines: {node: '>=6'} 1166 | dev: true 1167 | 1168 | /escape-html@1.0.3: 1169 | resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} 1170 | dev: true 1171 | 1172 | /escape-string-regexp@1.0.5: 1173 | resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} 1174 | engines: {node: '>=0.8.0'} 1175 | dev: true 1176 | 1177 | /escape-string-regexp@4.0.0: 1178 | resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} 1179 | engines: {node: '>=10'} 1180 | dev: true 1181 | 1182 | /escodegen@2.1.0: 1183 | resolution: {integrity: sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==} 1184 | engines: {node: '>=6.0'} 1185 | hasBin: true 1186 | dependencies: 1187 | esprima: 4.0.1 1188 | estraverse: 5.3.0 1189 | esutils: 2.0.3 1190 | optionalDependencies: 1191 | source-map: 0.6.1 1192 | dev: true 1193 | 1194 | /esprima@4.0.1: 1195 | resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} 1196 | engines: {node: '>=4'} 1197 | hasBin: true 1198 | dev: true 1199 | 1200 | /estraverse@5.3.0: 1201 | resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} 1202 | engines: {node: '>=4.0'} 1203 | dev: true 1204 | 1205 | /estree-walker@2.0.2: 1206 | resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} 1207 | dev: true 1208 | 1209 | /esutils@2.0.3: 1210 | resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} 1211 | engines: {node: '>=0.10.0'} 1212 | dev: true 1213 | 1214 | /etag@1.8.1: 1215 | resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} 1216 | engines: {node: '>= 0.6'} 1217 | dev: true 1218 | 1219 | /extract-zip@2.0.1: 1220 | resolution: {integrity: sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==} 1221 | engines: {node: '>= 10.17.0'} 1222 | hasBin: true 1223 | dependencies: 1224 | debug: 4.3.4 1225 | get-stream: 5.2.0 1226 | yauzl: 2.10.0 1227 | optionalDependencies: 1228 | '@types/yauzl': 2.10.1 1229 | transitivePeerDependencies: 1230 | - supports-color 1231 | dev: true 1232 | 1233 | /fast-fifo@1.3.2: 1234 | resolution: {integrity: sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==} 1235 | dev: true 1236 | 1237 | /fast-glob@3.3.1: 1238 | resolution: {integrity: sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==} 1239 | engines: {node: '>=8.6.0'} 1240 | dependencies: 1241 | '@nodelib/fs.stat': 2.0.5 1242 | '@nodelib/fs.walk': 1.2.8 1243 | glob-parent: 5.1.2 1244 | merge2: 1.4.1 1245 | micromatch: 4.0.5 1246 | dev: true 1247 | 1248 | /fastq@1.15.0: 1249 | resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} 1250 | dependencies: 1251 | reusify: 1.0.4 1252 | dev: true 1253 | 1254 | /fd-slicer@1.1.0: 1255 | resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} 1256 | dependencies: 1257 | pend: 1.2.0 1258 | dev: true 1259 | 1260 | /fill-range@7.0.1: 1261 | resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} 1262 | engines: {node: '>=8'} 1263 | dependencies: 1264 | to-regex-range: 5.0.1 1265 | dev: true 1266 | 1267 | /find-replace@3.0.0: 1268 | resolution: {integrity: sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ==} 1269 | engines: {node: '>=4.0.0'} 1270 | dependencies: 1271 | array-back: 3.1.0 1272 | dev: true 1273 | 1274 | /foreground-child@3.1.1: 1275 | resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==} 1276 | engines: {node: '>=14'} 1277 | dependencies: 1278 | cross-spawn: 7.0.3 1279 | signal-exit: 4.1.0 1280 | dev: true 1281 | 1282 | /fresh@0.5.2: 1283 | resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} 1284 | engines: {node: '>= 0.6'} 1285 | dev: true 1286 | 1287 | /fs-extra@8.1.0: 1288 | resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} 1289 | engines: {node: '>=6 <7 || >=8'} 1290 | dependencies: 1291 | graceful-fs: 4.2.11 1292 | jsonfile: 4.0.0 1293 | universalify: 0.1.2 1294 | dev: true 1295 | 1296 | /fsevents@2.3.2: 1297 | resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} 1298 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 1299 | os: [darwin] 1300 | requiresBuild: true 1301 | dev: true 1302 | optional: true 1303 | 1304 | /fsevents@2.3.3: 1305 | resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} 1306 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 1307 | os: [darwin] 1308 | requiresBuild: true 1309 | dev: true 1310 | optional: true 1311 | 1312 | /function-bind@1.1.2: 1313 | resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} 1314 | dev: true 1315 | 1316 | /get-caller-file@2.0.5: 1317 | resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} 1318 | engines: {node: 6.* || 8.* || >= 10.*} 1319 | dev: true 1320 | 1321 | /get-intrinsic@1.2.1: 1322 | resolution: {integrity: sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==} 1323 | dependencies: 1324 | function-bind: 1.1.2 1325 | has: 1.0.4 1326 | has-proto: 1.0.1 1327 | has-symbols: 1.0.3 1328 | dev: true 1329 | 1330 | /get-stream@5.2.0: 1331 | resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} 1332 | engines: {node: '>=8'} 1333 | dependencies: 1334 | pump: 3.0.0 1335 | dev: true 1336 | 1337 | /get-stream@6.0.1: 1338 | resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} 1339 | engines: {node: '>=10'} 1340 | dev: true 1341 | 1342 | /get-uri@6.0.2: 1343 | resolution: {integrity: sha512-5KLucCJobh8vBY1K07EFV4+cPZH3mrV9YeAruUseCQKHB58SGjjT2l9/eA9LD082IiuMjSlFJEcdJ27TXvbZNw==} 1344 | engines: {node: '>= 14'} 1345 | dependencies: 1346 | basic-ftp: 5.0.3 1347 | data-uri-to-buffer: 6.0.1 1348 | debug: 4.3.4 1349 | fs-extra: 8.1.0 1350 | transitivePeerDependencies: 1351 | - supports-color 1352 | dev: true 1353 | 1354 | /glob-parent@5.1.2: 1355 | resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} 1356 | engines: {node: '>= 6'} 1357 | dependencies: 1358 | is-glob: 4.0.3 1359 | dev: true 1360 | 1361 | /glob@10.3.10: 1362 | resolution: {integrity: sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==} 1363 | engines: {node: '>=16 || 14 >=14.17'} 1364 | hasBin: true 1365 | dependencies: 1366 | foreground-child: 3.1.1 1367 | jackspeak: 2.3.6 1368 | minimatch: 9.0.3 1369 | minipass: 7.0.4 1370 | path-scurry: 1.10.1 1371 | dev: true 1372 | 1373 | /globby@11.1.0: 1374 | resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} 1375 | engines: {node: '>=10'} 1376 | dependencies: 1377 | array-union: 2.1.0 1378 | dir-glob: 3.0.1 1379 | fast-glob: 3.3.1 1380 | ignore: 5.2.4 1381 | merge2: 1.4.1 1382 | slash: 3.0.0 1383 | dev: true 1384 | 1385 | /graceful-fs@4.2.11: 1386 | resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} 1387 | dev: true 1388 | 1389 | /has-flag@3.0.0: 1390 | resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} 1391 | engines: {node: '>=4'} 1392 | dev: true 1393 | 1394 | /has-flag@4.0.0: 1395 | resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} 1396 | engines: {node: '>=8'} 1397 | dev: true 1398 | 1399 | /has-proto@1.0.1: 1400 | resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==} 1401 | engines: {node: '>= 0.4'} 1402 | dev: true 1403 | 1404 | /has-symbols@1.0.3: 1405 | resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} 1406 | engines: {node: '>= 0.4'} 1407 | dev: true 1408 | 1409 | /has-tostringtag@1.0.0: 1410 | resolution: {integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==} 1411 | engines: {node: '>= 0.4'} 1412 | dependencies: 1413 | has-symbols: 1.0.3 1414 | dev: true 1415 | 1416 | /has@1.0.4: 1417 | resolution: {integrity: sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ==} 1418 | engines: {node: '>= 0.4.0'} 1419 | dev: true 1420 | 1421 | /html-escaper@2.0.2: 1422 | resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} 1423 | dev: true 1424 | 1425 | /http-assert@1.5.0: 1426 | resolution: {integrity: sha512-uPpH7OKX4H25hBmU6G1jWNaqJGpTXxey+YOUizJUAgu0AjLUeC8D73hTrhvDS5D+GJN1DN1+hhc/eF/wpxtp0w==} 1427 | engines: {node: '>= 0.8'} 1428 | dependencies: 1429 | deep-equal: 1.0.1 1430 | http-errors: 1.8.1 1431 | dev: true 1432 | 1433 | /http-errors@1.6.3: 1434 | resolution: {integrity: sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==} 1435 | engines: {node: '>= 0.6'} 1436 | dependencies: 1437 | depd: 1.1.2 1438 | inherits: 2.0.3 1439 | setprototypeof: 1.1.0 1440 | statuses: 1.5.0 1441 | dev: true 1442 | 1443 | /http-errors@1.8.1: 1444 | resolution: {integrity: sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==} 1445 | engines: {node: '>= 0.6'} 1446 | dependencies: 1447 | depd: 1.1.2 1448 | inherits: 2.0.4 1449 | setprototypeof: 1.2.0 1450 | statuses: 1.5.0 1451 | toidentifier: 1.0.1 1452 | dev: true 1453 | 1454 | /http-errors@2.0.0: 1455 | resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} 1456 | engines: {node: '>= 0.8'} 1457 | dependencies: 1458 | depd: 2.0.0 1459 | inherits: 2.0.4 1460 | setprototypeof: 1.2.0 1461 | statuses: 2.0.1 1462 | toidentifier: 1.0.1 1463 | dev: true 1464 | 1465 | /http-proxy-agent@7.0.0: 1466 | resolution: {integrity: sha512-+ZT+iBxVUQ1asugqnD6oWoRiS25AkjNfG085dKJGtGxkdwLQrMKU5wJr2bOOFAXzKcTuqq+7fZlTMgG3SRfIYQ==} 1467 | engines: {node: '>= 14'} 1468 | dependencies: 1469 | agent-base: 7.1.0 1470 | debug: 4.3.4 1471 | transitivePeerDependencies: 1472 | - supports-color 1473 | dev: true 1474 | 1475 | /https-proxy-agent@7.0.2: 1476 | resolution: {integrity: sha512-NmLNjm6ucYwtcUmL7JQC1ZQ57LmHP4lT15FQ8D61nak1rO6DH+fz5qNK2Ap5UN4ZapYICE3/0KodcLYSPsPbaA==} 1477 | engines: {node: '>= 14'} 1478 | dependencies: 1479 | agent-base: 7.1.0 1480 | debug: 4.3.4 1481 | transitivePeerDependencies: 1482 | - supports-color 1483 | dev: true 1484 | 1485 | /iconv-lite@0.4.24: 1486 | resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} 1487 | engines: {node: '>=0.10.0'} 1488 | dependencies: 1489 | safer-buffer: 2.1.2 1490 | dev: true 1491 | 1492 | /ieee754@1.2.1: 1493 | resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} 1494 | dev: true 1495 | 1496 | /ignore@5.2.4: 1497 | resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==} 1498 | engines: {node: '>= 4'} 1499 | dev: true 1500 | 1501 | /inflation@2.1.0: 1502 | resolution: {integrity: sha512-t54PPJHG1Pp7VQvxyVCJ9mBbjG3Hqryges9bXoOO6GExCPa+//i/d5GSuFtpx3ALLd7lgIAur6zrIlBQyJuMlQ==} 1503 | engines: {node: '>= 0.8.0'} 1504 | dev: true 1505 | 1506 | /inherits@2.0.3: 1507 | resolution: {integrity: sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==} 1508 | dev: true 1509 | 1510 | /inherits@2.0.4: 1511 | resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} 1512 | dev: true 1513 | 1514 | /ip@1.1.8: 1515 | resolution: {integrity: sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg==} 1516 | dev: true 1517 | 1518 | /ip@2.0.0: 1519 | resolution: {integrity: sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==} 1520 | dev: true 1521 | 1522 | /is-binary-path@2.1.0: 1523 | resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} 1524 | engines: {node: '>=8'} 1525 | dependencies: 1526 | binary-extensions: 2.2.0 1527 | dev: true 1528 | 1529 | /is-builtin-module@3.2.1: 1530 | resolution: {integrity: sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==} 1531 | engines: {node: '>=6'} 1532 | dependencies: 1533 | builtin-modules: 3.3.0 1534 | dev: true 1535 | 1536 | /is-core-module@2.13.0: 1537 | resolution: {integrity: sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==} 1538 | dependencies: 1539 | has: 1.0.4 1540 | dev: true 1541 | 1542 | /is-docker@2.2.1: 1543 | resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} 1544 | engines: {node: '>=8'} 1545 | hasBin: true 1546 | dev: true 1547 | 1548 | /is-extglob@2.1.1: 1549 | resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} 1550 | engines: {node: '>=0.10.0'} 1551 | dev: true 1552 | 1553 | /is-fullwidth-code-point@3.0.0: 1554 | resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} 1555 | engines: {node: '>=8'} 1556 | dev: true 1557 | 1558 | /is-generator-function@1.0.10: 1559 | resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==} 1560 | engines: {node: '>= 0.4'} 1561 | dependencies: 1562 | has-tostringtag: 1.0.0 1563 | dev: true 1564 | 1565 | /is-glob@4.0.3: 1566 | resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} 1567 | engines: {node: '>=0.10.0'} 1568 | dependencies: 1569 | is-extglob: 2.1.1 1570 | dev: true 1571 | 1572 | /is-module@1.0.0: 1573 | resolution: {integrity: sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==} 1574 | dev: true 1575 | 1576 | /is-number@7.0.0: 1577 | resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} 1578 | engines: {node: '>=0.12.0'} 1579 | dev: true 1580 | 1581 | /is-stream@2.0.1: 1582 | resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} 1583 | engines: {node: '>=8'} 1584 | dev: true 1585 | 1586 | /is-wsl@2.2.0: 1587 | resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} 1588 | engines: {node: '>=8'} 1589 | dependencies: 1590 | is-docker: 2.2.1 1591 | dev: true 1592 | 1593 | /isarray@0.0.1: 1594 | resolution: {integrity: sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==} 1595 | dev: true 1596 | 1597 | /isbinaryfile@5.0.0: 1598 | resolution: {integrity: sha512-UDdnyGvMajJUWCkib7Cei/dvyJrrvo4FIrsvSFWdPpXSUorzXrDJ0S+X5Q4ZlasfPjca4yqCNNsjbCeiy8FFeg==} 1599 | engines: {node: '>= 14.0.0'} 1600 | dev: true 1601 | 1602 | /isexe@2.0.0: 1603 | resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} 1604 | dev: true 1605 | 1606 | /istanbul-lib-coverage@3.2.0: 1607 | resolution: {integrity: sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==} 1608 | engines: {node: '>=8'} 1609 | dev: true 1610 | 1611 | /istanbul-lib-report@3.0.1: 1612 | resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} 1613 | engines: {node: '>=10'} 1614 | dependencies: 1615 | istanbul-lib-coverage: 3.2.0 1616 | make-dir: 4.0.0 1617 | supports-color: 7.2.0 1618 | dev: true 1619 | 1620 | /istanbul-reports@3.1.6: 1621 | resolution: {integrity: sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg==} 1622 | engines: {node: '>=8'} 1623 | dependencies: 1624 | html-escaper: 2.0.2 1625 | istanbul-lib-report: 3.0.1 1626 | dev: true 1627 | 1628 | /jackspeak@2.3.6: 1629 | resolution: {integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==} 1630 | engines: {node: '>=14'} 1631 | dependencies: 1632 | '@isaacs/cliui': 8.0.2 1633 | optionalDependencies: 1634 | '@pkgjs/parseargs': 0.11.0 1635 | dev: true 1636 | 1637 | /js-tokens@4.0.0: 1638 | resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} 1639 | dev: true 1640 | 1641 | /jsonfile@4.0.0: 1642 | resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} 1643 | optionalDependencies: 1644 | graceful-fs: 4.2.11 1645 | dev: true 1646 | 1647 | /just-extend@4.2.1: 1648 | resolution: {integrity: sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg==} 1649 | dev: true 1650 | 1651 | /keygrip@1.1.0: 1652 | resolution: {integrity: sha512-iYSchDJ+liQ8iwbSI2QqsQOvqv58eJCEanyJPJi+Khyu8smkcKSFUCbPwzFcL7YVtZ6eONjqRX/38caJ7QjRAQ==} 1653 | engines: {node: '>= 0.6'} 1654 | dependencies: 1655 | tsscmp: 1.0.6 1656 | dev: true 1657 | 1658 | /koa-compose@4.1.0: 1659 | resolution: {integrity: sha512-8ODW8TrDuMYvXRwra/Kh7/rJo9BtOfPc6qO8eAfC80CnCvSjSl0bkRM24X6/XBBEyj0v1nRUQ1LyOy3dbqOWXw==} 1660 | dev: true 1661 | 1662 | /koa-convert@2.0.0: 1663 | resolution: {integrity: sha512-asOvN6bFlSnxewce2e/DK3p4tltyfC4VM7ZwuTuepI7dEQVcvpyFuBcEARu1+Hxg8DIwytce2n7jrZtRlPrARA==} 1664 | engines: {node: '>= 10'} 1665 | dependencies: 1666 | co: 4.6.0 1667 | koa-compose: 4.1.0 1668 | dev: true 1669 | 1670 | /koa-etag@4.0.0: 1671 | resolution: {integrity: sha512-1cSdezCkBWlyuB9l6c/IFoe1ANCDdPBxkDkRiaIup40xpUub6U/wwRXoKBZw/O5BifX9OlqAjYnDyzM6+l+TAg==} 1672 | dependencies: 1673 | etag: 1.8.1 1674 | dev: true 1675 | 1676 | /koa-send@5.0.1: 1677 | resolution: {integrity: sha512-tmcyQ/wXXuxpDxyNXv5yNNkdAMdFRqwtegBXUaowiQzUKqJehttS0x2j0eOZDQAyloAth5w6wwBImnFzkUz3pQ==} 1678 | engines: {node: '>= 8'} 1679 | dependencies: 1680 | debug: 4.3.4 1681 | http-errors: 1.8.1 1682 | resolve-path: 1.4.0 1683 | transitivePeerDependencies: 1684 | - supports-color 1685 | dev: true 1686 | 1687 | /koa-static@5.0.0: 1688 | resolution: {integrity: sha512-UqyYyH5YEXaJrf9S8E23GoJFQZXkBVJ9zYYMPGz919MSX1KuvAcycIuS0ci150HCoPf4XQVhQ84Qf8xRPWxFaQ==} 1689 | engines: {node: '>= 7.6.0'} 1690 | dependencies: 1691 | debug: 3.2.7 1692 | koa-send: 5.0.1 1693 | transitivePeerDependencies: 1694 | - supports-color 1695 | dev: true 1696 | 1697 | /koa@2.14.2: 1698 | resolution: {integrity: sha512-VFI2bpJaodz6P7x2uyLiX6RLYpZmOJqNmoCst/Yyd7hQlszyPwG/I9CQJ63nOtKSxpt5M7NH67V6nJL2BwCl7g==} 1699 | engines: {node: ^4.8.4 || ^6.10.1 || ^7.10.1 || >= 8.1.4} 1700 | dependencies: 1701 | accepts: 1.3.8 1702 | cache-content-type: 1.0.1 1703 | content-disposition: 0.5.4 1704 | content-type: 1.0.5 1705 | cookies: 0.8.0 1706 | debug: 4.3.4 1707 | delegates: 1.0.0 1708 | depd: 2.0.0 1709 | destroy: 1.2.0 1710 | encodeurl: 1.0.2 1711 | escape-html: 1.0.3 1712 | fresh: 0.5.2 1713 | http-assert: 1.5.0 1714 | http-errors: 1.8.1 1715 | is-generator-function: 1.0.10 1716 | koa-compose: 4.1.0 1717 | koa-convert: 2.0.0 1718 | on-finished: 2.4.1 1719 | only: 0.0.2 1720 | parseurl: 1.3.3 1721 | statuses: 1.5.0 1722 | type-is: 1.6.18 1723 | vary: 1.1.2 1724 | transitivePeerDependencies: 1725 | - supports-color 1726 | dev: true 1727 | 1728 | /lighthouse-logger@1.4.2: 1729 | resolution: {integrity: sha512-gPWxznF6TKmUHrOQjlVo2UbaL2EJ71mb2CCeRs/2qBpi4L/g4LUVc9+3lKQ6DTUZwJswfM7ainGrLO1+fOqa2g==} 1730 | dependencies: 1731 | debug: 2.6.9 1732 | marky: 1.2.5 1733 | transitivePeerDependencies: 1734 | - supports-color 1735 | dev: true 1736 | 1737 | /lit-element@3.3.3: 1738 | resolution: {integrity: sha512-XbeRxmTHubXENkV4h8RIPyr8lXc+Ff28rkcQzw3G6up2xg5E8Zu1IgOWIwBLEQsu3cOVFqdYwiVi0hv0SlpqUA==} 1739 | dependencies: 1740 | '@lit-labs/ssr-dom-shim': 1.1.2 1741 | '@lit/reactive-element': 1.6.3 1742 | lit-html: 2.8.0 1743 | dev: true 1744 | 1745 | /lit-html@2.8.0: 1746 | resolution: {integrity: sha512-o9t+MQM3P4y7M7yNzqAyjp7z+mQGa4NS4CxiyLqFPyFWyc4O+nodLrkrxSaCTrla6M5YOLaT3RpbbqjszB5g3Q==} 1747 | dependencies: 1748 | '@types/trusted-types': 2.0.4 1749 | dev: true 1750 | 1751 | /lit@2.8.0: 1752 | resolution: {integrity: sha512-4Sc3OFX9QHOJaHbmTMk28SYgVxLN3ePDjg7hofEft2zWlehFL3LiAuapWc4U/kYwMYJSh2hTCPZ6/LIC7ii0MA==} 1753 | dependencies: 1754 | '@lit/reactive-element': 1.6.3 1755 | lit-element: 3.3.3 1756 | lit-html: 2.8.0 1757 | dev: true 1758 | 1759 | /lodash.assignwith@4.2.0: 1760 | resolution: {integrity: sha512-ZznplvbvtjK2gMvnQ1BR/zqPFZmS6jbK4p+6Up4xcRYA7yMIwxHCfbTcrYxXKzzqLsQ05eJPVznEW3tuwV7k1g==} 1761 | dev: true 1762 | 1763 | /lodash.camelcase@4.3.0: 1764 | resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} 1765 | dev: true 1766 | 1767 | /lodash.get@4.4.2: 1768 | resolution: {integrity: sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==} 1769 | dev: true 1770 | 1771 | /lodash@4.17.21: 1772 | resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} 1773 | dev: true 1774 | 1775 | /log-update@4.0.0: 1776 | resolution: {integrity: sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==} 1777 | engines: {node: '>=10'} 1778 | dependencies: 1779 | ansi-escapes: 4.3.2 1780 | cli-cursor: 3.1.0 1781 | slice-ansi: 4.0.0 1782 | wrap-ansi: 6.2.0 1783 | dev: true 1784 | 1785 | /lru-cache@10.0.1: 1786 | resolution: {integrity: sha512-IJ4uwUTi2qCccrioU6g9g/5rvvVl13bsdczUUcqbciD9iLr095yj8DQKdObriEvuNSx325N1rV1O0sJFszx75g==} 1787 | engines: {node: 14 || >=16.14} 1788 | dev: true 1789 | 1790 | /lru-cache@6.0.0: 1791 | resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} 1792 | engines: {node: '>=10'} 1793 | dependencies: 1794 | yallist: 4.0.0 1795 | dev: true 1796 | 1797 | /lru-cache@7.18.3: 1798 | resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==} 1799 | engines: {node: '>=12'} 1800 | dev: true 1801 | 1802 | /lru-cache@8.0.5: 1803 | resolution: {integrity: sha512-MhWWlVnuab1RG5/zMRRcVGXZLCXrZTgfwMikgzCegsPnG62yDQo5JnqKkrK4jO5iKqDAZGItAqN5CtKBCBWRUA==} 1804 | engines: {node: '>=16.14'} 1805 | dev: true 1806 | 1807 | /make-dir@4.0.0: 1808 | resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} 1809 | engines: {node: '>=10'} 1810 | dependencies: 1811 | semver: 7.5.4 1812 | dev: true 1813 | 1814 | /marky@1.2.5: 1815 | resolution: {integrity: sha512-q9JtQJKjpsVxCRVgQ+WapguSbKC3SQ5HEzFGPAJMStgh3QjCawp00UKv3MTTAArTmGmmPUvllHZoNbZ3gs0I+Q==} 1816 | dev: true 1817 | 1818 | /media-typer@0.3.0: 1819 | resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} 1820 | engines: {node: '>= 0.6'} 1821 | dev: true 1822 | 1823 | /merge2@1.4.1: 1824 | resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} 1825 | engines: {node: '>= 8'} 1826 | dev: true 1827 | 1828 | /micromatch@4.0.5: 1829 | resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} 1830 | engines: {node: '>=8.6'} 1831 | dependencies: 1832 | braces: 3.0.2 1833 | picomatch: 2.3.1 1834 | dev: true 1835 | 1836 | /mime-db@1.52.0: 1837 | resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} 1838 | engines: {node: '>= 0.6'} 1839 | dev: true 1840 | 1841 | /mime-types@2.1.35: 1842 | resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} 1843 | engines: {node: '>= 0.6'} 1844 | dependencies: 1845 | mime-db: 1.52.0 1846 | dev: true 1847 | 1848 | /mimic-fn@2.1.0: 1849 | resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} 1850 | engines: {node: '>=6'} 1851 | dev: true 1852 | 1853 | /minimatch@9.0.3: 1854 | resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} 1855 | engines: {node: '>=16 || 14 >=14.17'} 1856 | dependencies: 1857 | brace-expansion: 2.0.1 1858 | dev: true 1859 | 1860 | /minimist@1.2.8: 1861 | resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} 1862 | dev: true 1863 | 1864 | /minipass@7.0.4: 1865 | resolution: {integrity: sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==} 1866 | engines: {node: '>=16 || 14 >=14.17'} 1867 | dev: true 1868 | 1869 | /mitt@3.0.0: 1870 | resolution: {integrity: sha512-7dX2/10ITVyqh4aOSVI9gdape+t9l2/8QxHrFmUXu4EEUpdlxl6RudZUPZoc+zuY2hk1j7XxVroIVIan/pD/SQ==} 1871 | dev: true 1872 | 1873 | /mkdirp-classic@0.5.3: 1874 | resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} 1875 | dev: true 1876 | 1877 | /mkdirp@0.5.6: 1878 | resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} 1879 | hasBin: true 1880 | dependencies: 1881 | minimist: 1.2.8 1882 | dev: true 1883 | 1884 | /mkdirp@1.0.4: 1885 | resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} 1886 | engines: {node: '>=10'} 1887 | hasBin: true 1888 | dev: true 1889 | 1890 | /ms@2.0.0: 1891 | resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} 1892 | dev: true 1893 | 1894 | /ms@2.1.2: 1895 | resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} 1896 | dev: true 1897 | 1898 | /ms@2.1.3: 1899 | resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} 1900 | dev: true 1901 | 1902 | /nanocolors@0.2.13: 1903 | resolution: {integrity: sha512-0n3mSAQLPpGLV9ORXT5+C/D4mwew7Ebws69Hx4E2sgz2ZA5+32Q80B9tL8PbL7XHnRDiAxH/pnrUJ9a4fkTNTA==} 1904 | dev: true 1905 | 1906 | /nanoid@3.3.6: 1907 | resolution: {integrity: sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==} 1908 | engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} 1909 | hasBin: true 1910 | dev: true 1911 | 1912 | /negotiator@0.6.3: 1913 | resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} 1914 | engines: {node: '>= 0.6'} 1915 | dev: true 1916 | 1917 | /netmask@2.0.2: 1918 | resolution: {integrity: sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==} 1919 | engines: {node: '>= 0.4.0'} 1920 | dev: true 1921 | 1922 | /nise@5.1.4: 1923 | resolution: {integrity: sha512-8+Ib8rRJ4L0o3kfmyVCL7gzrohyDe0cMFTBa2d364yIrEGMEoetznKJx899YxjybU6bL9SQkYPSBBs1gyYs8Xg==} 1924 | dependencies: 1925 | '@sinonjs/commons': 2.0.0 1926 | '@sinonjs/fake-timers': 10.3.0 1927 | '@sinonjs/text-encoding': 0.7.2 1928 | just-extend: 4.2.1 1929 | path-to-regexp: 1.8.0 1930 | dev: true 1931 | 1932 | /node-fetch@2.7.0: 1933 | resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} 1934 | engines: {node: 4.x || >=6.0.0} 1935 | peerDependencies: 1936 | encoding: ^0.1.0 1937 | peerDependenciesMeta: 1938 | encoding: 1939 | optional: true 1940 | dependencies: 1941 | whatwg-url: 5.0.0 1942 | dev: true 1943 | 1944 | /normalize-path@3.0.0: 1945 | resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} 1946 | engines: {node: '>=0.10.0'} 1947 | dev: true 1948 | 1949 | /object-inspect@1.13.0: 1950 | resolution: {integrity: sha512-HQ4J+ic8hKrgIt3mqk6cVOVrW2ozL4KdvHlqpBv9vDYWx9ysAgENAdvy4FoGF+KFdhR7nQTNm5J0ctAeOwn+3g==} 1951 | dev: true 1952 | 1953 | /on-finished@2.4.1: 1954 | resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} 1955 | engines: {node: '>= 0.8'} 1956 | dependencies: 1957 | ee-first: 1.1.1 1958 | dev: true 1959 | 1960 | /once@1.4.0: 1961 | resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} 1962 | dependencies: 1963 | wrappy: 1.0.2 1964 | dev: true 1965 | 1966 | /onetime@5.1.2: 1967 | resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} 1968 | engines: {node: '>=6'} 1969 | dependencies: 1970 | mimic-fn: 2.1.0 1971 | dev: true 1972 | 1973 | /only@0.0.2: 1974 | resolution: {integrity: sha512-Fvw+Jemq5fjjyWz6CpKx6w9s7xxqo3+JCyM0WXWeCSOboZ8ABkyvP8ID4CZuChA/wxSx+XSJmdOm8rGVyJ1hdQ==} 1975 | dev: true 1976 | 1977 | /open@8.4.2: 1978 | resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} 1979 | engines: {node: '>=12'} 1980 | dependencies: 1981 | define-lazy-prop: 2.0.0 1982 | is-docker: 2.2.1 1983 | is-wsl: 2.2.0 1984 | dev: true 1985 | 1986 | /pac-proxy-agent@7.0.1: 1987 | resolution: {integrity: sha512-ASV8yU4LLKBAjqIPMbrgtaKIvxQri/yh2OpI+S6hVa9JRkUI3Y3NPFbfngDtY7oFtSMD3w31Xns89mDa3Feo5A==} 1988 | engines: {node: '>= 14'} 1989 | dependencies: 1990 | '@tootallnate/quickjs-emscripten': 0.23.0 1991 | agent-base: 7.1.0 1992 | debug: 4.3.4 1993 | get-uri: 6.0.2 1994 | http-proxy-agent: 7.0.0 1995 | https-proxy-agent: 7.0.2 1996 | pac-resolver: 7.0.0 1997 | socks-proxy-agent: 8.0.2 1998 | transitivePeerDependencies: 1999 | - supports-color 2000 | dev: true 2001 | 2002 | /pac-resolver@7.0.0: 2003 | resolution: {integrity: sha512-Fd9lT9vJbHYRACT8OhCbZBbxr6KRSawSovFpy8nDGshaK99S/EBhVIHp9+crhxrsZOuvLpgL1n23iyPg6Rl2hg==} 2004 | engines: {node: '>= 14'} 2005 | dependencies: 2006 | degenerator: 5.0.1 2007 | ip: 1.1.8 2008 | netmask: 2.0.2 2009 | dev: true 2010 | 2011 | /parse5@6.0.1: 2012 | resolution: {integrity: sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==} 2013 | dev: true 2014 | 2015 | /parseurl@1.3.3: 2016 | resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} 2017 | engines: {node: '>= 0.8'} 2018 | dev: true 2019 | 2020 | /path-is-absolute@1.0.1: 2021 | resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} 2022 | engines: {node: '>=0.10.0'} 2023 | dev: true 2024 | 2025 | /path-key@3.1.1: 2026 | resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} 2027 | engines: {node: '>=8'} 2028 | dev: true 2029 | 2030 | /path-parse@1.0.7: 2031 | resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} 2032 | dev: true 2033 | 2034 | /path-scurry@1.10.1: 2035 | resolution: {integrity: sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==} 2036 | engines: {node: '>=16 || 14 >=14.17'} 2037 | dependencies: 2038 | lru-cache: 10.0.1 2039 | minipass: 7.0.4 2040 | dev: true 2041 | 2042 | /path-to-regexp@1.8.0: 2043 | resolution: {integrity: sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==} 2044 | dependencies: 2045 | isarray: 0.0.1 2046 | dev: true 2047 | 2048 | /path-type@4.0.0: 2049 | resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} 2050 | engines: {node: '>=8'} 2051 | dev: true 2052 | 2053 | /pend@1.2.0: 2054 | resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} 2055 | dev: true 2056 | 2057 | /picomatch@2.3.1: 2058 | resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} 2059 | engines: {node: '>=8.6'} 2060 | dev: true 2061 | 2062 | /playwright-core@1.39.0: 2063 | resolution: {integrity: sha512-+k4pdZgs1qiM+OUkSjx96YiKsXsmb59evFoqv8SKO067qBA+Z2s/dCzJij/ZhdQcs2zlTAgRKfeiiLm8PQ2qvw==} 2064 | engines: {node: '>=16'} 2065 | hasBin: true 2066 | dev: true 2067 | 2068 | /playwright@1.39.0: 2069 | resolution: {integrity: sha512-naE5QT11uC/Oiq0BwZ50gDmy8c8WLPRTEWuSSFVG2egBka/1qMoSqYQcROMT9zLwJ86oPofcTH2jBY/5wWOgIw==} 2070 | engines: {node: '>=16'} 2071 | hasBin: true 2072 | dependencies: 2073 | playwright-core: 1.39.0 2074 | optionalDependencies: 2075 | fsevents: 2.3.2 2076 | dev: true 2077 | 2078 | /portfinder@1.0.32: 2079 | resolution: {integrity: sha512-on2ZJVVDXRADWE6jnQaX0ioEylzgBpQk8r55NE4wjXW1ZxO+BgDlY6DXwj20i0V8eB4SenDQ00WEaxfiIQPcxg==} 2080 | engines: {node: '>= 0.12.0'} 2081 | dependencies: 2082 | async: 2.6.4 2083 | debug: 3.2.7 2084 | mkdirp: 0.5.6 2085 | transitivePeerDependencies: 2086 | - supports-color 2087 | dev: true 2088 | 2089 | /progress@2.0.3: 2090 | resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} 2091 | engines: {node: '>=0.4.0'} 2092 | dev: true 2093 | 2094 | /proxy-agent@6.3.0: 2095 | resolution: {integrity: sha512-0LdR757eTj/JfuU7TL2YCuAZnxWXu3tkJbg4Oq3geW/qFNT/32T0sp2HnZ9O0lMR4q3vwAt0+xCA8SR0WAD0og==} 2096 | engines: {node: '>= 14'} 2097 | dependencies: 2098 | agent-base: 7.1.0 2099 | debug: 4.3.4 2100 | http-proxy-agent: 7.0.0 2101 | https-proxy-agent: 7.0.2 2102 | lru-cache: 7.18.3 2103 | pac-proxy-agent: 7.0.1 2104 | proxy-from-env: 1.1.0 2105 | socks-proxy-agent: 8.0.2 2106 | transitivePeerDependencies: 2107 | - supports-color 2108 | dev: true 2109 | 2110 | /proxy-from-env@1.1.0: 2111 | resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} 2112 | dev: true 2113 | 2114 | /pump@3.0.0: 2115 | resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} 2116 | dependencies: 2117 | end-of-stream: 1.4.4 2118 | once: 1.4.0 2119 | dev: true 2120 | 2121 | /punycode@2.3.0: 2122 | resolution: {integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==} 2123 | engines: {node: '>=6'} 2124 | dev: true 2125 | 2126 | /puppeteer-core@20.9.0(typescript@5.2.2): 2127 | resolution: {integrity: sha512-H9fYZQzMTRrkboEfPmf7m3CLDN6JvbxXA3qTtS+dFt27tR+CsFHzPsT6pzp6lYL6bJbAPaR0HaPO6uSi+F94Pg==} 2128 | engines: {node: '>=16.3.0'} 2129 | peerDependencies: 2130 | typescript: '>= 4.7.4' 2131 | peerDependenciesMeta: 2132 | typescript: 2133 | optional: true 2134 | dependencies: 2135 | '@puppeteer/browsers': 1.4.6(typescript@5.2.2) 2136 | chromium-bidi: 0.4.16(devtools-protocol@0.0.1147663) 2137 | cross-fetch: 4.0.0 2138 | debug: 4.3.4 2139 | devtools-protocol: 0.0.1147663 2140 | typescript: 5.2.2 2141 | ws: 8.13.0 2142 | transitivePeerDependencies: 2143 | - bufferutil 2144 | - encoding 2145 | - supports-color 2146 | - utf-8-validate 2147 | dev: true 2148 | 2149 | /qs@6.11.2: 2150 | resolution: {integrity: sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==} 2151 | engines: {node: '>=0.6'} 2152 | dependencies: 2153 | side-channel: 1.0.4 2154 | dev: true 2155 | 2156 | /queue-microtask@1.2.3: 2157 | resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} 2158 | dev: true 2159 | 2160 | /queue-tick@1.0.1: 2161 | resolution: {integrity: sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==} 2162 | dev: true 2163 | 2164 | /raw-body@2.5.2: 2165 | resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==} 2166 | engines: {node: '>= 0.8'} 2167 | dependencies: 2168 | bytes: 3.1.2 2169 | http-errors: 2.0.0 2170 | iconv-lite: 0.4.24 2171 | unpipe: 1.0.0 2172 | dev: true 2173 | 2174 | /readdirp@3.6.0: 2175 | resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} 2176 | engines: {node: '>=8.10.0'} 2177 | dependencies: 2178 | picomatch: 2.3.1 2179 | dev: true 2180 | 2181 | /require-directory@2.1.1: 2182 | resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} 2183 | engines: {node: '>=0.10.0'} 2184 | dev: true 2185 | 2186 | /resolve-path@1.4.0: 2187 | resolution: {integrity: sha512-i1xevIst/Qa+nA9olDxLWnLk8YZbi8R/7JPbCMcgyWaFR6bKWaexgJgEB5oc2PKMjYdrHynyz0NY+if+H98t1w==} 2188 | engines: {node: '>= 0.8'} 2189 | dependencies: 2190 | http-errors: 1.6.3 2191 | path-is-absolute: 1.0.1 2192 | dev: true 2193 | 2194 | /resolve@1.22.8: 2195 | resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} 2196 | hasBin: true 2197 | dependencies: 2198 | is-core-module: 2.13.0 2199 | path-parse: 1.0.7 2200 | supports-preserve-symlinks-flag: 1.0.0 2201 | dev: true 2202 | 2203 | /restore-cursor@3.1.0: 2204 | resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} 2205 | engines: {node: '>=8'} 2206 | dependencies: 2207 | onetime: 5.1.2 2208 | signal-exit: 3.0.7 2209 | dev: true 2210 | 2211 | /reusify@1.0.4: 2212 | resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} 2213 | engines: {iojs: '>=1.0.0', node: '>=0.10.0'} 2214 | dev: true 2215 | 2216 | /rimraf@5.0.5: 2217 | resolution: {integrity: sha512-CqDakW+hMe/Bz202FPEymy68P+G50RfMQK+Qo5YUqc9SPipvbGjCGKd0RSKEelbsfQuw3g5NZDSrlZZAJurH1A==} 2218 | engines: {node: '>=14'} 2219 | hasBin: true 2220 | dependencies: 2221 | glob: 10.3.10 2222 | dev: true 2223 | 2224 | /rollup@3.29.4: 2225 | resolution: {integrity: sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw==} 2226 | engines: {node: '>=14.18.0', npm: '>=8.0.0'} 2227 | hasBin: true 2228 | optionalDependencies: 2229 | fsevents: 2.3.3 2230 | dev: true 2231 | 2232 | /run-parallel@1.2.0: 2233 | resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} 2234 | dependencies: 2235 | queue-microtask: 1.2.3 2236 | dev: true 2237 | 2238 | /safe-buffer@5.2.1: 2239 | resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} 2240 | dev: true 2241 | 2242 | /safer-buffer@2.1.2: 2243 | resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} 2244 | dev: true 2245 | 2246 | /semver@7.5.4: 2247 | resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} 2248 | engines: {node: '>=10'} 2249 | hasBin: true 2250 | dependencies: 2251 | lru-cache: 6.0.0 2252 | dev: true 2253 | 2254 | /setprototypeof@1.1.0: 2255 | resolution: {integrity: sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==} 2256 | dev: true 2257 | 2258 | /setprototypeof@1.2.0: 2259 | resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} 2260 | dev: true 2261 | 2262 | /shebang-command@2.0.0: 2263 | resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} 2264 | engines: {node: '>=8'} 2265 | dependencies: 2266 | shebang-regex: 3.0.0 2267 | dev: true 2268 | 2269 | /shebang-regex@3.0.0: 2270 | resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} 2271 | engines: {node: '>=8'} 2272 | dev: true 2273 | 2274 | /side-channel@1.0.4: 2275 | resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} 2276 | dependencies: 2277 | call-bind: 1.0.2 2278 | get-intrinsic: 1.2.1 2279 | object-inspect: 1.13.0 2280 | dev: true 2281 | 2282 | /signal-exit@3.0.7: 2283 | resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} 2284 | dev: true 2285 | 2286 | /signal-exit@4.1.0: 2287 | resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} 2288 | engines: {node: '>=14'} 2289 | dev: true 2290 | 2291 | /sinon@16.1.0: 2292 | resolution: {integrity: sha512-ZSgzF0vwmoa8pq0GEynqfdnpEDyP1PkYmEChnkjW0Vyh8IDlyFEJ+fkMhCP0il6d5cJjPl2PUsnUSAuP5sttOQ==} 2293 | dependencies: 2294 | '@sinonjs/commons': 3.0.0 2295 | '@sinonjs/fake-timers': 10.3.0 2296 | '@sinonjs/samsam': 8.0.0 2297 | diff: 5.1.0 2298 | nise: 5.1.4 2299 | supports-color: 7.2.0 2300 | dev: true 2301 | 2302 | /slash@3.0.0: 2303 | resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} 2304 | engines: {node: '>=8'} 2305 | dev: true 2306 | 2307 | /slice-ansi@4.0.0: 2308 | resolution: {integrity: sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==} 2309 | engines: {node: '>=10'} 2310 | dependencies: 2311 | ansi-styles: 4.3.0 2312 | astral-regex: 2.0.0 2313 | is-fullwidth-code-point: 3.0.0 2314 | dev: true 2315 | 2316 | /smart-buffer@4.2.0: 2317 | resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} 2318 | engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} 2319 | dev: true 2320 | 2321 | /socks-proxy-agent@8.0.2: 2322 | resolution: {integrity: sha512-8zuqoLv1aP/66PHF5TqwJ7Czm3Yv32urJQHrVyhD7mmA6d61Zv8cIXQYPTWwmg6qlupnPvs/QKDmfa4P/qct2g==} 2323 | engines: {node: '>= 14'} 2324 | dependencies: 2325 | agent-base: 7.1.0 2326 | debug: 4.3.4 2327 | socks: 2.7.1 2328 | transitivePeerDependencies: 2329 | - supports-color 2330 | dev: true 2331 | 2332 | /socks@2.7.1: 2333 | resolution: {integrity: sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==} 2334 | engines: {node: '>= 10.13.0', npm: '>= 3.0.0'} 2335 | dependencies: 2336 | ip: 2.0.0 2337 | smart-buffer: 4.2.0 2338 | dev: true 2339 | 2340 | /source-map@0.6.1: 2341 | resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} 2342 | engines: {node: '>=0.10.0'} 2343 | requiresBuild: true 2344 | dev: true 2345 | optional: true 2346 | 2347 | /source-map@0.7.4: 2348 | resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} 2349 | engines: {node: '>= 8'} 2350 | dev: true 2351 | 2352 | /statuses@1.5.0: 2353 | resolution: {integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==} 2354 | engines: {node: '>= 0.6'} 2355 | dev: true 2356 | 2357 | /statuses@2.0.1: 2358 | resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} 2359 | engines: {node: '>= 0.8'} 2360 | dev: true 2361 | 2362 | /stream-read-all@3.0.1: 2363 | resolution: {integrity: sha512-EWZT9XOceBPlVJRrYcykW8jyRSZYbkb/0ZK36uLEmoWVO5gxBOnntNTseNzfREsqxqdfEGQrD8SXQ3QWbBmq8A==} 2364 | engines: {node: '>=10'} 2365 | dev: true 2366 | 2367 | /streamx@2.15.1: 2368 | resolution: {integrity: sha512-fQMzy2O/Q47rgwErk/eGeLu/roaFWV0jVsogDmrszM9uIw8L5OA+t+V93MgYlufNptfjmYR1tOMWhei/Eh7TQA==} 2369 | dependencies: 2370 | fast-fifo: 1.3.2 2371 | queue-tick: 1.0.1 2372 | dev: true 2373 | 2374 | /string-width@4.2.3: 2375 | resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} 2376 | engines: {node: '>=8'} 2377 | dependencies: 2378 | emoji-regex: 8.0.0 2379 | is-fullwidth-code-point: 3.0.0 2380 | strip-ansi: 6.0.1 2381 | dev: true 2382 | 2383 | /string-width@5.1.2: 2384 | resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} 2385 | engines: {node: '>=12'} 2386 | dependencies: 2387 | eastasianwidth: 0.2.0 2388 | emoji-regex: 9.2.2 2389 | strip-ansi: 7.1.0 2390 | dev: true 2391 | 2392 | /strip-ansi@6.0.1: 2393 | resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} 2394 | engines: {node: '>=8'} 2395 | dependencies: 2396 | ansi-regex: 5.0.1 2397 | dev: true 2398 | 2399 | /strip-ansi@7.1.0: 2400 | resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} 2401 | engines: {node: '>=12'} 2402 | dependencies: 2403 | ansi-regex: 6.0.1 2404 | dev: true 2405 | 2406 | /supports-color@5.5.0: 2407 | resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} 2408 | engines: {node: '>=4'} 2409 | dependencies: 2410 | has-flag: 3.0.0 2411 | dev: true 2412 | 2413 | /supports-color@7.2.0: 2414 | resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} 2415 | engines: {node: '>=8'} 2416 | dependencies: 2417 | has-flag: 4.0.0 2418 | dev: true 2419 | 2420 | /supports-preserve-symlinks-flag@1.0.0: 2421 | resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} 2422 | engines: {node: '>= 0.4'} 2423 | dev: true 2424 | 2425 | /table-layout@3.0.2: 2426 | resolution: {integrity: sha512-rpyNZYRw+/C+dYkcQ3Pr+rLxW4CfHpXjPDnG7lYhdRoUcZTUt+KEsX+94RGp/aVp/MQU35JCITv2T/beY4m+hw==} 2427 | engines: {node: '>=12.17'} 2428 | hasBin: true 2429 | dependencies: 2430 | '@75lb/deep-merge': 1.1.1 2431 | array-back: 6.2.2 2432 | command-line-args: 5.2.1 2433 | command-line-usage: 7.0.1 2434 | stream-read-all: 3.0.1 2435 | typical: 7.1.1 2436 | wordwrapjs: 5.1.0 2437 | dev: true 2438 | 2439 | /tar-fs@3.0.4: 2440 | resolution: {integrity: sha512-5AFQU8b9qLfZCX9zp2duONhPmZv0hGYiBPJsyUdqMjzq/mqVpy/rEUSeHk1+YitmxugaptgBh5oDGU3VsAJq4w==} 2441 | dependencies: 2442 | mkdirp-classic: 0.5.3 2443 | pump: 3.0.0 2444 | tar-stream: 3.1.6 2445 | dev: true 2446 | 2447 | /tar-stream@3.1.6: 2448 | resolution: {integrity: sha512-B/UyjYwPpMBv+PaFSWAmtYjwdrlEaZQEhMIBFNC5oEG8lpiW8XjcSdmEaClj28ArfKScKHs2nshz3k2le6crsg==} 2449 | dependencies: 2450 | b4a: 1.6.4 2451 | fast-fifo: 1.3.2 2452 | streamx: 2.15.1 2453 | dev: true 2454 | 2455 | /through@2.3.8: 2456 | resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} 2457 | dev: true 2458 | 2459 | /to-regex-range@5.0.1: 2460 | resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} 2461 | engines: {node: '>=8.0'} 2462 | dependencies: 2463 | is-number: 7.0.0 2464 | dev: true 2465 | 2466 | /toidentifier@1.0.1: 2467 | resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} 2468 | engines: {node: '>=0.6'} 2469 | dev: true 2470 | 2471 | /tr46@0.0.3: 2472 | resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} 2473 | dev: true 2474 | 2475 | /tr46@3.0.0: 2476 | resolution: {integrity: sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==} 2477 | engines: {node: '>=12'} 2478 | dependencies: 2479 | punycode: 2.3.0 2480 | dev: true 2481 | 2482 | /tslib@2.6.2: 2483 | resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} 2484 | dev: true 2485 | 2486 | /tsscmp@1.0.6: 2487 | resolution: {integrity: sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==} 2488 | engines: {node: '>=0.6.x'} 2489 | dev: true 2490 | 2491 | /type-detect@4.0.8: 2492 | resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} 2493 | engines: {node: '>=4'} 2494 | dev: true 2495 | 2496 | /type-fest@0.21.3: 2497 | resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} 2498 | engines: {node: '>=10'} 2499 | dev: true 2500 | 2501 | /type-is@1.6.18: 2502 | resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} 2503 | engines: {node: '>= 0.6'} 2504 | dependencies: 2505 | media-typer: 0.3.0 2506 | mime-types: 2.1.35 2507 | dev: true 2508 | 2509 | /typescript@5.2.2: 2510 | resolution: {integrity: sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==} 2511 | engines: {node: '>=14.17'} 2512 | hasBin: true 2513 | dev: true 2514 | 2515 | /typical@4.0.0: 2516 | resolution: {integrity: sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw==} 2517 | engines: {node: '>=8'} 2518 | dev: true 2519 | 2520 | /typical@7.1.1: 2521 | resolution: {integrity: sha512-T+tKVNs6Wu7IWiAce5BgMd7OZfNYUndHwc5MknN+UHOudi7sGZzuHdCadllRuqJ3fPtgFtIH9+lt9qRv6lmpfA==} 2522 | engines: {node: '>=12.17'} 2523 | dev: true 2524 | 2525 | /unbzip2-stream@1.4.3: 2526 | resolution: {integrity: sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==} 2527 | dependencies: 2528 | buffer: 5.7.1 2529 | through: 2.3.8 2530 | dev: true 2531 | 2532 | /undici-types@5.25.3: 2533 | resolution: {integrity: sha512-Ga1jfYwRn7+cP9v8auvEXN1rX3sWqlayd4HP7OKk4mZWylEmu3KzXDUGrQUN6Ol7qo1gPvB2e5gX6udnyEPgdA==} 2534 | dev: true 2535 | 2536 | /universalify@0.1.2: 2537 | resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} 2538 | engines: {node: '>= 4.0.0'} 2539 | dev: true 2540 | 2541 | /unpipe@1.0.0: 2542 | resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} 2543 | engines: {node: '>= 0.8'} 2544 | dev: true 2545 | 2546 | /v8-to-istanbul@9.1.3: 2547 | resolution: {integrity: sha512-9lDD+EVI2fjFsMWXc6dy5JJzBsVTcQ2fVkfBvncZ6xJWG9wtBhOldG+mHkSL0+V1K/xgZz0JDO5UT5hFwHUghg==} 2548 | engines: {node: '>=10.12.0'} 2549 | dependencies: 2550 | '@jridgewell/trace-mapping': 0.3.19 2551 | '@types/istanbul-lib-coverage': 2.0.4 2552 | convert-source-map: 2.0.0 2553 | dev: true 2554 | 2555 | /vary@1.1.2: 2556 | resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} 2557 | engines: {node: '>= 0.8'} 2558 | dev: true 2559 | 2560 | /webidl-conversions@3.0.1: 2561 | resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} 2562 | dev: true 2563 | 2564 | /webidl-conversions@7.0.0: 2565 | resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} 2566 | engines: {node: '>=12'} 2567 | dev: true 2568 | 2569 | /whatwg-url@11.0.0: 2570 | resolution: {integrity: sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==} 2571 | engines: {node: '>=12'} 2572 | dependencies: 2573 | tr46: 3.0.0 2574 | webidl-conversions: 7.0.0 2575 | dev: true 2576 | 2577 | /whatwg-url@5.0.0: 2578 | resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} 2579 | dependencies: 2580 | tr46: 0.0.3 2581 | webidl-conversions: 3.0.1 2582 | dev: true 2583 | 2584 | /which@2.0.2: 2585 | resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} 2586 | engines: {node: '>= 8'} 2587 | hasBin: true 2588 | dependencies: 2589 | isexe: 2.0.0 2590 | dev: true 2591 | 2592 | /wordwrapjs@5.1.0: 2593 | resolution: {integrity: sha512-JNjcULU2e4KJwUNv6CHgI46UvDGitb6dGryHajXTDiLgg1/RiGoPSDw4kZfYnwGtEXf2ZMeIewDQgFGzkCB2Sg==} 2594 | engines: {node: '>=12.17'} 2595 | dev: true 2596 | 2597 | /wrap-ansi@6.2.0: 2598 | resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} 2599 | engines: {node: '>=8'} 2600 | dependencies: 2601 | ansi-styles: 4.3.0 2602 | string-width: 4.2.3 2603 | strip-ansi: 6.0.1 2604 | dev: true 2605 | 2606 | /wrap-ansi@7.0.0: 2607 | resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} 2608 | engines: {node: '>=10'} 2609 | dependencies: 2610 | ansi-styles: 4.3.0 2611 | string-width: 4.2.3 2612 | strip-ansi: 6.0.1 2613 | dev: true 2614 | 2615 | /wrap-ansi@8.1.0: 2616 | resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} 2617 | engines: {node: '>=12'} 2618 | dependencies: 2619 | ansi-styles: 6.2.1 2620 | string-width: 5.1.2 2621 | strip-ansi: 7.1.0 2622 | dev: true 2623 | 2624 | /wrappy@1.0.2: 2625 | resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} 2626 | dev: true 2627 | 2628 | /ws@7.5.9: 2629 | resolution: {integrity: sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==} 2630 | engines: {node: '>=8.3.0'} 2631 | peerDependencies: 2632 | bufferutil: ^4.0.1 2633 | utf-8-validate: ^5.0.2 2634 | peerDependenciesMeta: 2635 | bufferutil: 2636 | optional: true 2637 | utf-8-validate: 2638 | optional: true 2639 | dev: true 2640 | 2641 | /ws@8.13.0: 2642 | resolution: {integrity: sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==} 2643 | engines: {node: '>=10.0.0'} 2644 | peerDependencies: 2645 | bufferutil: ^4.0.1 2646 | utf-8-validate: '>=5.0.2' 2647 | peerDependenciesMeta: 2648 | bufferutil: 2649 | optional: true 2650 | utf-8-validate: 2651 | optional: true 2652 | dev: true 2653 | 2654 | /y18n@5.0.8: 2655 | resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} 2656 | engines: {node: '>=10'} 2657 | dev: true 2658 | 2659 | /yallist@4.0.0: 2660 | resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} 2661 | dev: true 2662 | 2663 | /yargs-parser@21.1.1: 2664 | resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} 2665 | engines: {node: '>=12'} 2666 | dev: true 2667 | 2668 | /yargs@17.7.1: 2669 | resolution: {integrity: sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw==} 2670 | engines: {node: '>=12'} 2671 | dependencies: 2672 | cliui: 8.0.1 2673 | escalade: 3.1.1 2674 | get-caller-file: 2.0.5 2675 | require-directory: 2.1.1 2676 | string-width: 4.2.3 2677 | y18n: 5.0.8 2678 | yargs-parser: 21.1.1 2679 | dev: true 2680 | 2681 | /yauzl@2.10.0: 2682 | resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==} 2683 | dependencies: 2684 | buffer-crc32: 0.2.13 2685 | fd-slicer: 1.1.0 2686 | dev: true 2687 | 2688 | /ylru@1.3.2: 2689 | resolution: {integrity: sha512-RXRJzMiK6U2ye0BlGGZnmpwJDPgakn6aNQ0A7gHRbD4I0uvK4TW6UqkK1V0pp9jskjJBAXd3dRrbzWkqJ+6cxA==} 2690 | engines: {node: '>= 4.0.0'} 2691 | dev: true 2692 | -------------------------------------------------------------------------------- /tests/lifecycle.test.js: -------------------------------------------------------------------------------- 1 | import { aTimeout, fixture, html } from "@open-wc/testing-helpers" 2 | import { assert } from "@esm-bundle/chai" 3 | import { Application, Controller } from "stimulite" 4 | import Sinon from "sinon" 5 | 6 | setup(() => { 7 | Sinon.restore() 8 | }) 9 | 10 | test("It should bind to document and listen for new controllers (append nested)", async () => { 11 | const application = Application.start() 12 | 13 | const connectSpy = Sinon.spy() 14 | const disconnectSpy = Sinon.spy() 15 | const constructorSpy = Sinon.spy() 16 | 17 | application.register(class Example extends Controller { 18 | static controllerName = "example" 19 | 20 | constructor (element) { 21 | super(element) 22 | assert.instanceOf(this.element, HTMLElement) 23 | constructorSpy() 24 | } 25 | 26 | connectedCallback () { 27 | assert.instanceOf(this.element, HTMLElement) 28 | connectSpy() 29 | } 30 | 31 | disconnectedCallback () { 32 | assert.instanceOf(this.element, HTMLElement) 33 | disconnectSpy() 34 | } 35 | }) 36 | 37 | Sinon.assert.notCalled(constructorSpy) 38 | Sinon.assert.notCalled(connectSpy) 39 | Sinon.assert.notCalled(disconnectSpy) 40 | 41 | const el = await fixture(html` 42 |
43 |
44 |
45 | `) 46 | 47 | Sinon.assert.calledOnce(constructorSpy) 48 | Sinon.assert.calledOnce(connectSpy) 49 | Sinon.assert.notCalled(disconnectSpy) 50 | 51 | el.remove() 52 | await aTimeout(1) 53 | Sinon.assert.calledOnce(constructorSpy) 54 | Sinon.assert.calledOnce(connectSpy) 55 | Sinon.assert.calledOnce(disconnectSpy) 56 | 57 | document.body.append(el) 58 | await aTimeout(1) 59 | 60 | Sinon.assert.calledOnce(constructorSpy) 61 | Sinon.assert.calledTwice(connectSpy) 62 | Sinon.assert.calledOnce(disconnectSpy) 63 | 64 | el.remove() 65 | await aTimeout(1) 66 | Sinon.assert.calledOnce(constructorSpy) 67 | Sinon.assert.calledTwice(connectSpy) 68 | Sinon.assert.calledTwice(disconnectSpy) 69 | 70 | application.stop() 71 | }) 72 | 73 | /** 74 | * Test again, this time with a slightly different fixture. 75 | */ 76 | test("It should bind root level and listen for new controllers (append top-level)", async () => { 77 | const application = Application.start() 78 | 79 | const connectSpy = Sinon.spy() 80 | const disconnectSpy = Sinon.spy() 81 | const constructorSpy = Sinon.spy() 82 | 83 | application.register(class Example extends Controller { 84 | static controllerName = "example" 85 | constructor (element) { 86 | super(element) 87 | assert.instanceOf(this.element, HTMLElement) 88 | constructorSpy() 89 | } 90 | 91 | connectedCallback () { 92 | assert.instanceOf(this.element, HTMLElement) 93 | connectSpy() 94 | } 95 | 96 | disconnectedCallback () { 97 | assert.instanceOf(this.element, HTMLElement) 98 | disconnectSpy() 99 | } 100 | }) 101 | 102 | Sinon.assert.notCalled(constructorSpy) 103 | Sinon.assert.notCalled(connectSpy) 104 | Sinon.assert.notCalled(disconnectSpy) 105 | 106 | const el = await fixture(html` 107 |
108 | `) 109 | 110 | Sinon.assert.calledOnce(constructorSpy) 111 | Sinon.assert.calledOnce(connectSpy) 112 | Sinon.assert.notCalled(disconnectSpy) 113 | 114 | el.remove() 115 | await aTimeout(1) 116 | Sinon.assert.calledOnce(constructorSpy) 117 | Sinon.assert.calledOnce(connectSpy) 118 | Sinon.assert.calledOnce(disconnectSpy) 119 | 120 | document.body.append(el) 121 | await aTimeout(1) 122 | 123 | Sinon.assert.calledOnce(constructorSpy) 124 | Sinon.assert.calledTwice(connectSpy) 125 | Sinon.assert.calledOnce(disconnectSpy) 126 | 127 | el.remove() 128 | await aTimeout(1) 129 | Sinon.assert.calledOnce(constructorSpy) 130 | Sinon.assert.calledTwice(connectSpy) 131 | Sinon.assert.calledTwice(disconnectSpy) 132 | 133 | application.stop() 134 | }) 135 | 136 | test("It should invoke the lifecycle if the controllers already exist in the DOM.", async () => { 137 | const el = await fixture(html`
`) 138 | await aTimeout(1) 139 | 140 | const application = Application.start() 141 | 142 | const connectSpy = Sinon.spy() 143 | const disconnectSpy = Sinon.spy() 144 | const constructorSpy = Sinon.spy() 145 | 146 | application.register(class Example extends Controller { 147 | static controllerName = "example" 148 | constructor (element) { 149 | super(element) 150 | assert.instanceOf(this.element, HTMLElement) 151 | constructorSpy() 152 | } 153 | 154 | connectedCallback () { 155 | assert.instanceOf(this.element, HTMLElement) 156 | connectSpy() 157 | } 158 | 159 | disconnectedCallback () { 160 | assert.instanceOf(this.element, HTMLElement) 161 | disconnectSpy() 162 | } 163 | }) 164 | 165 | Sinon.assert.calledOnce(constructorSpy) 166 | 167 | application.stop() 168 | }) 169 | 170 | test("It should invoke lifecycles when attributes change", async () => { 171 | const el = await fixture(html`
`) 172 | await aTimeout(1) 173 | 174 | const application = Application.start() 175 | 176 | const connectSpy = Sinon.spy() 177 | const disconnectSpy = Sinon.spy() 178 | const constructorSpy = Sinon.spy() 179 | 180 | application.register(class Example extends Controller { 181 | static controllerName = "example" 182 | constructor (element) { 183 | super(element) 184 | assert.instanceOf(this.element, HTMLElement) 185 | constructorSpy() 186 | } 187 | 188 | connectedCallback () { 189 | assert.instanceOf(this.element, HTMLElement) 190 | connectSpy() 191 | } 192 | 193 | disconnectedCallback () { 194 | assert.instanceOf(this.element, HTMLElement) 195 | disconnectSpy() 196 | } 197 | }) 198 | 199 | Sinon.assert.notCalled(constructorSpy) 200 | Sinon.assert.notCalled(connectSpy) 201 | Sinon.assert.notCalled(disconnectSpy) 202 | 203 | el.setAttribute("lite-controller", "example") 204 | await aTimeout(1) 205 | 206 | Sinon.assert.calledOnce(constructorSpy) 207 | Sinon.assert.calledOnce(connectSpy) 208 | Sinon.assert.notCalled(disconnectSpy) 209 | 210 | el.removeAttribute("lite-controller") 211 | await aTimeout(1) 212 | 213 | Sinon.assert.calledOnce(constructorSpy) 214 | Sinon.assert.calledOnce(connectSpy) 215 | Sinon.assert.calledOnce(disconnectSpy) 216 | 217 | application.stop() 218 | }) 219 | -------------------------------------------------------------------------------- /tests/targets.test.js: -------------------------------------------------------------------------------- 1 | import { aTimeout, fixture, html } from "@open-wc/testing-helpers" 2 | import { assert } from "@esm-bundle/chai" 3 | import { Application, Controller } from "stimulite" 4 | import Sinon from "sinon" 5 | 6 | test("It should have target functions in the constructor", () => { 7 | class Example extends Controller { 8 | static targets = ["item"] 9 | 10 | constructor(...args) { 11 | super(...args) 12 | 13 | assert.equal(this.hasItemTarget, false) 14 | assert.equal(this.itemTarget, null) 15 | assert.equal(this.itemTargets.length, 0) 16 | } 17 | } 18 | 19 | new Example({element: document.createElement("div"), application: Application.start() }) 20 | }) 21 | 22 | test("It should record when a target connects", async () => { 23 | const application = Application.start() 24 | 25 | const itemTargetConnectedSpy = Sinon.spy() 26 | const itemTargetDisconnectedSpy = Sinon.spy() 27 | 28 | application.register(class Example extends Controller { 29 | static targets = ["item"] 30 | static controllerName = "example" 31 | 32 | itemTargetConnected () { 33 | itemTargetConnectedSpy() 34 | } 35 | 36 | itemTargetDisconnected () { 37 | itemTargetDisconnectedSpy() 38 | } 39 | }) 40 | 41 | const el = await fixture(html` 42 |
43 |
44 |
45 |
46 |
47 | `) 48 | 49 | await aTimeout(1) 50 | const controller = application.getController(el, "example") 51 | 52 | assert.equal(controller.hasItemTarget, true) 53 | assert.equal(controller.itemTargets.length, 3) 54 | assert.equal(controller.itemTarget, el.querySelector("[lite-target]")) 55 | 56 | el.querySelectorAll("[lite-target~='example.item']").forEach((target, index) => { 57 | assert.equal(target, controller.itemTargets[index]) 58 | }) 59 | }) 60 | 61 | test("It should record when a target attribute changes and disconnects", async () => { 62 | const application = Application.start() 63 | 64 | const itemTargetConnectedSpy = Sinon.spy() 65 | const itemTargetDisconnectedSpy = Sinon.spy() 66 | 67 | application.register(class Example extends Controller { 68 | static targets = ["item"] 69 | static controllerName = "example" 70 | 71 | itemTargetConnected () { 72 | itemTargetConnectedSpy() 73 | } 74 | 75 | itemTargetDisconnected () { 76 | itemTargetDisconnectedSpy() 77 | } 78 | }) 79 | 80 | const el = await fixture(html` 81 |
82 |
83 |
84 |
85 | `) 86 | 87 | await aTimeout(1) 88 | const controller = application.getController(el, "example") 89 | 90 | assert.equal(itemTargetDisconnectedSpy.calledOnce, false) 91 | 92 | el.querySelectorAll("div")[0].setAttribute("lite-target", "") 93 | await aTimeout(1) 94 | assert.equal(controller.hasItemTarget, false) 95 | assert.equal(controller.itemTarget, null) 96 | assert.equal(controller.itemTargets.length, 0) 97 | 98 | assert.equal(itemTargetDisconnectedSpy.callCount, 1) 99 | }) 100 | 101 | test("It should record when a target element changes its attribute and connects", async () => { 102 | const application = Application.start() 103 | 104 | const itemTargetConnectedSpy = Sinon.spy() 105 | const itemTargetDisconnectedSpy = Sinon.spy() 106 | 107 | application.register(class Example extends Controller { 108 | static targets = ["item"] 109 | static controllerName = "example" 110 | 111 | itemTargetConnected () { 112 | itemTargetConnectedSpy() 113 | } 114 | 115 | itemTargetDisconnected () { 116 | itemTargetDisconnectedSpy() 117 | } 118 | }) 119 | 120 | const el = await fixture(html` 121 |
122 |
123 |
124 |
125 | `) 126 | 127 | await aTimeout(1) 128 | const controller = application.getController(el, "example") 129 | 130 | assert.equal(controller.hasItemTarget, true) 131 | assert.equal(controller.itemTargets.length, 1) 132 | assert.equal(controller.itemTarget, el.querySelector("[lite-target]")) 133 | 134 | el.querySelectorAll("[lite-target~='example.item']").forEach((target, index) => { 135 | assert.equal(target, controller.itemTargets[index]) 136 | }) 137 | 138 | el.querySelectorAll("div")[1].setAttribute("lite-target", "example.item") 139 | 140 | await aTimeout(1) 141 | 142 | assert.equal(controller.hasItemTarget, true) 143 | assert.equal(controller.itemTargets.length, 2) 144 | assert.equal(controller.itemTarget, el.querySelector("[lite-target]")) 145 | 146 | el.querySelectorAll("[lite-target~='example.item']").forEach((target, index) => { 147 | assert.equal(target, controller.itemTargets[index]) 148 | }) 149 | }) 150 | 151 | test("It should not count nested targets", async () => { 152 | const application = Application.start() 153 | 154 | const itemTargetConnectedSpy = Sinon.spy() 155 | const itemTargetDisconnectedSpy = Sinon.spy() 156 | 157 | application.register(class Example extends Controller { 158 | static targets = ["item"] 159 | static controllerName = "example" 160 | 161 | itemTargetConnected () { 162 | itemTargetConnectedSpy() 163 | } 164 | 165 | itemTargetDisconnected () { 166 | itemTargetDisconnectedSpy() 167 | } 168 | }) 169 | 170 | const el = await fixture(html` 171 |
172 |
173 |
174 |
175 |
176 |
177 |
178 |
179 |
180 | `) 181 | 182 | 183 | const controller = application.getController(el, "example") 184 | const nestedController = application.getController(el.querySelector("[lite-controller~='example']"), "example") 185 | 186 | assert.equal(controller.hasItemTarget, true) 187 | assert.equal(controller.itemTargets.length, 3) 188 | assert.equal(controller.itemTarget, el.querySelector("[lite-target]")) 189 | 190 | nestedController.element.querySelectorAll(".nested[lite-target~='example.item']").forEach((target, index) => { 191 | assert.equal(target, nestedController.itemTargets[index]) 192 | }) 193 | 194 | assert.equal(itemTargetConnectedSpy.callCount, 5) 195 | }) 196 | 197 | test("Should record target disconnects when the parent disconnect", async () => { 198 | const application = Application.start() 199 | 200 | const itemTargetDisconnectedSpy = Sinon.spy() 201 | const controllerDisconnectedSpy = Sinon.spy() 202 | const callOrder = [ 203 | ] 204 | 205 | application.register(class Example extends Controller { 206 | static targets = ["item"] 207 | static controllerName = "example" 208 | 209 | connectedCallback () { 210 | callOrder.push("connectedCallback") 211 | } 212 | 213 | disconnectedCallback () { 214 | controllerDisconnectedSpy() 215 | callOrder.push("disconnectedCallback") 216 | } 217 | 218 | itemTargetConnected () { 219 | callOrder.push("itemTargetConnected") 220 | } 221 | 222 | itemTargetDisconnected () { 223 | callOrder.push("itemTargetDisconnected") 224 | itemTargetDisconnectedSpy() 225 | } 226 | }) 227 | 228 | const el = await fixture(html` 229 |
230 |
231 |
232 | `) 233 | 234 | await aTimeout(1) 235 | 236 | assert.equal(controllerDisconnectedSpy.calledOnce, false) 237 | assert.equal(itemTargetDisconnectedSpy.calledOnce, false) 238 | 239 | el.remove() 240 | 241 | await aTimeout(1) 242 | 243 | assert.equal(controllerDisconnectedSpy.calledOnce, true) 244 | assert.equal(itemTargetDisconnectedSpy.calledOnce, true) 245 | 246 | assert.equal(callOrder.length, 4) 247 | assert.deepEqual(callOrder, [ 248 | "connectedCallback", 249 | "itemTargetConnected", 250 | "itemTargetDisconnected", 251 | "disconnectedCallback" 252 | ]) 253 | }) 254 | 255 | test("It should only disconnect nested targets when using multiple controllers", async () => { 256 | const application = Application.start() 257 | 258 | const exampleOneDisconnectedSpy = Sinon.spy() 259 | const exampleTwoDisconnectedSpy = Sinon.spy() 260 | 261 | const el = document.createElement("div") 262 | el.innerHTML = ` 263 |
264 |
265 |
266 |
267 |
268 |
269 |
270 |
271 |
272 | ` 273 | 274 | document.body.append(el) 275 | 276 | application.register(class Example2 extends Controller { 277 | static targets = ["item"] 278 | static controllerName = "example-2" 279 | 280 | itemTargetDisconnected (el) { 281 | exampleTwoDisconnectedSpy() 282 | } 283 | }) 284 | 285 | application.register(class Example extends Controller { 286 | static targets = ["item"] 287 | static controllerName = "example-1" 288 | 289 | itemTargetDisconnected () { 290 | exampleOneDisconnectedSpy() 291 | } 292 | }) 293 | 294 | await aTimeout(10) 295 | 296 | assert.equal(exampleOneDisconnectedSpy.callCount, 0) 297 | assert.equal(exampleTwoDisconnectedSpy.callCount, 0) 298 | 299 | const nestedExample1 = el.querySelector("#nested-1") 300 | nestedExample1.remove() 301 | 302 | await aTimeout(10) 303 | assert.equal(exampleOneDisconnectedSpy.callCount, 1) 304 | assert.equal(exampleTwoDisconnectedSpy.callCount, 1) 305 | 306 | const nestedExample2 = el.querySelector("#nested-2") 307 | nestedExample2.remove() 308 | 309 | await aTimeout(10) 310 | assert.equal(exampleOneDisconnectedSpy.callCount, 2) 311 | assert.equal(exampleTwoDisconnectedSpy.callCount, 2) 312 | 313 | application.stop() 314 | await aTimeout(1000) 315 | el.remove() 316 | }) 317 | 318 | test("It should not count nested targets when using multiple controllers", async () => { 319 | const application = Application.start() 320 | 321 | const itemTargetConnectedSpy = Sinon.spy() 322 | const itemTargetDisconnectedSpy = Sinon.spy() 323 | 324 | application.register(class Example extends Controller { 325 | static targets = ["item"] 326 | static controllerName = "example-1" 327 | 328 | itemTargetConnected () { 329 | itemTargetConnectedSpy() 330 | } 331 | 332 | itemTargetDisconnected () { 333 | itemTargetDisconnectedSpy() 334 | } 335 | }) 336 | 337 | application.register(class Example2 extends Controller { 338 | static targets = ["item"] 339 | static controllerName = "example-2" 340 | 341 | itemTargetConnected () { 342 | itemTargetConnectedSpy() 343 | } 344 | 345 | itemTargetDisconnected () { 346 | itemTargetDisconnectedSpy() 347 | } 348 | }) 349 | 350 | const el = await fixture(html` 351 |
352 |
353 |
354 |
355 |
356 |
357 |
358 |
359 |
360 | `) 361 | 362 | await aTimeout(0) 363 | 364 | const controller = application.getController(el, "example-1") 365 | const controller2 = application.getController(el, "example-2") 366 | const nestedController = application.getController(el.querySelector("[lite-controller~='example-1']"), "example-1") 367 | 368 | assert.equal(controller2.hasItemTarget, true) 369 | assert.equal(controller2.itemTargets.length, 4) 370 | assert.equal(controller2.itemTarget, el.querySelectorAll("[lite-target]")[1]) 371 | 372 | assert.equal(controller.hasItemTarget, true) 373 | assert.equal(controller.itemTargets.length, 3) 374 | assert.equal(controller.itemTarget, el.querySelector("[lite-target]")) 375 | 376 | nestedController.element.querySelectorAll(".nested[lite-target~='example-1.item']").forEach((target, index) => { 377 | assert.equal(target, nestedController.itemTargets[index]) 378 | }) 379 | 380 | // We added 4 extra calls for example-2 381 | assert.equal(itemTargetConnectedSpy.callCount, 9) 382 | 383 | el.querySelector("#nested-1").remove() 384 | 385 | await aTimeout(1) 386 | // 1 time for example-1 and example-2 387 | assert.equal(itemTargetDisconnectedSpy.callCount, 2) 388 | 389 | el.querySelector("#nested-2").remove() 390 | 391 | await aTimeout(1) 392 | // 1 time for example-1 and example-2 393 | assert.equal(itemTargetDisconnectedSpy.callCount, 4) 394 | 395 | el.querySelector("[lite-target]").setAttribute("lite-target", "example-2.item") 396 | 397 | await aTimeout(1) 398 | assert.equal(itemTargetConnectedSpy.callCount, 9) 399 | assert.equal(itemTargetDisconnectedSpy.callCount, 5) 400 | 401 | el.querySelector("[lite-controller~='example-1']").remove() 402 | await aTimeout(1) 403 | // Should not fire any disconnects despite a controller being removed 404 | assert.equal(itemTargetDisconnectedSpy.callCount, 5) 405 | }) 406 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "include": [ 3 | "exports/**/*.js", 4 | "internal/**/*.js", 5 | "types/**/*.d.ts" 6 | ], 7 | "compilerOptions": { 8 | "strict": true, 9 | "target": "ESNext", 10 | "allowSyntheticDefaultImports": true, 11 | "moduleResolution": "nodenext", 12 | "module": "NodeNext", 13 | "lib": ["ESNext", "DOM"], 14 | "declaration": true, 15 | "emitDeclarationOnly": true, 16 | "allowJs": true, 17 | "checkJs": true, 18 | "verbatimModuleSyntax": true 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /types/index.d.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KonnorRogers/stimulite/472be072e47ec51189bd60c50b9f66541cbd9a3e/types/index.d.ts -------------------------------------------------------------------------------- /web-test-runner.config.js: -------------------------------------------------------------------------------- 1 | import { playwrightLauncher } from '@web/test-runner-playwright'; 2 | // import { esbuildPlugin } from '@web/dev-server-esbuild'; 3 | 4 | /** @type {import("@web/test-runner").TestRunnerConfig} */ 5 | export default { 6 | rootDir: '.', 7 | files: ['./tests/**/*.test.js'], // "default" group 8 | concurrentBrowsers: 3, 9 | nodeResolve: true, 10 | testFramework: { 11 | config: { 12 | ui: 'tdd', 13 | timeout: 3000, 14 | retries: 1 15 | } 16 | }, 17 | plugins: [ 18 | 19 | ], 20 | browsers: [ 21 | playwrightLauncher({ product: 'chromium' }), 22 | playwrightLauncher({ product: 'firefox' }), 23 | playwrightLauncher({ product: 'webkit' }) 24 | ], 25 | } 26 | --------------------------------------------------------------------------------