diff --git a/.babelrc b/.babelrc deleted file mode 100644 index b0b9a96e..00000000 --- a/.babelrc +++ /dev/null @@ -1,3 +0,0 @@ -{ - "stage": 0 -} diff --git a/.babelrc.js b/.babelrc.js new file mode 100644 index 00000000..1d936d79 --- /dev/null +++ b/.babelrc.js @@ -0,0 +1,19 @@ +'use strict'; + +module.exports = { + "presets": [ + [ + "@babel/preset-env", + { + targets: "> 0.25%, not dead" + }, + ], + "@babel/react", + "@babel/preset-flow" + ], + "plugins": [ + "@babel/plugin-transform-flow-comments", + "@babel/plugin-transform-class-properties", + "transform-inline-environment-variables" + ] +} diff --git a/.browserslistrc b/.browserslistrc new file mode 100644 index 00000000..53565ed3 --- /dev/null +++ b/.browserslistrc @@ -0,0 +1,3 @@ +> 0.25% +ie 11 +not dead \ No newline at end of file diff --git a/.eslintrc b/.eslintrc index 2bbb0e27..ab322f57 100644 --- a/.eslintrc +++ b/.eslintrc @@ -1,22 +1,35 @@ { - "parser": "babel-eslint", + "parser": "@babel/eslint-parser", + "extends": "eslint:recommended", "plugins": [ "react" ], + "ignorePatterns": ["build/**/*.js"], "rules": { "strict": 0, "quotes": [1, "single"], "curly": [1, "multi-line"], "camelcase": 0, - "comma-dangle": 1, + "comma-dangle": 0, + "no-console": 2, "no-use-before-define": [1, "nofunc"], "no-underscore-dangle": 0, - "no-unused-vars": 1, + "no-unused-vars": [1, {ignoreRestSiblings: true}], "new-cap": 0, + "prefer-const": 1, "semi": 1 }, env: { "browser": true, "node": true + }, + globals: { + // For Flow + "ReactElement", + "ReactClass", + "$Exact", + "Partial", + "$Keys", + "MouseTouchEvent", } } diff --git a/.flowconfig b/.flowconfig new file mode 100644 index 00000000..386b3433 --- /dev/null +++ b/.flowconfig @@ -0,0 +1,11 @@ +[ignore] +/node_modules/webpack-cli.* +/node_modules/.*malformed_package_json.* + +[include] +lib/ +index.js + +[options] +sharedmemory.heap_size=3221225472 +exact_by_default=true diff --git a/.gitignore b/.gitignore index cf9cb086..466f3266 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ .idea *.iml node_modules/ +build/ diff --git a/.npmignore b/.npmignore deleted file mode 100644 index cb29538e..00000000 --- a/.npmignore +++ /dev/null @@ -1,7 +0,0 @@ -**/.* -example -script -specs -karma.conf.js -webpack.config.js -dist/ diff --git a/.travis.yml b/.travis.yml index cff37c5b..e5838902 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,10 +1,18 @@ language: node_js node_js: - - "0.10" - - "0.12" -before_script: - - export DISPLAY=:99.0 - - sh -e /etc/init.d/xvfb start + - "10" + - "12" + - "node" # latest +cache: yarn +env: + - MOZ_HEADLESS=1 +addons: + firefox: latest +script: + - make lint + - make test + - make test-phantom email: on_failure: change on_success: never + diff --git a/CHANGELOG.md b/CHANGELOG.md index eac75be6..2ac7a79a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,448 @@ # Changelog +### 4.5.0 (Jun 25, 2025) + +- Internal: Update clsx version (#754) +- Fix: bounds="selector" functionality when in a Shadow DOM tree. (#763) +- Perf: Update nodeRef type for React v19 compatibility (#769) +- Fix: forgotten requestAnimationFrame call (#773) +- Perf: setState in lifecycles + forced reflow (#556) +- Fix: add allowMobileScroll prop to allow for clicks to optionally pass through on mobile (#760) + +### 4.4.6 (Sep 27, 2023) + +- Fix: state inconsistency in React 18 #699 +- Internal: devDependencies updates + +### 4.4.5 (Apr 26, 2022) + +- Fix: `grid` prop unused in `handleDragStop` #621 +- Fix: `children` prop missing in TypeScript definition #648 +- Internal: Various devDep updates + +### 4.4.4 (Aug 27, 2021) + +- Fix: Ensure `documentElement.style` actually exists. Fixes crashes in some obscure environments. #574 #575 +- Fix: Add react/react-dom as `peerDependencies` again to fix Yarn PnP +- Size: Replace `classnames` with `clsx` to save a few bytes +- Internal: Additional tests on `ref` functionality and additional README content on `nodeRef` +- Internal: Lots of devDependencies updates +- Docs: Various README and demo updates, see git commits + +### 4.4.3 (June 8, 2020) + +- Add `nodeRef` to TypeScript definitions + +### 4.4.2 (May 14, 2020) + +- Fix: Remove "module" from package.json (it is no longer being built) + - Fixes #482 + +### 4.4.1 (May 12, 2020) + +- Fix: Remove "module" definition in package.json + - Giving up on this: there isn't a great reason to publish modules + here as they won't be significantly tree-shook, and it bloats + the published package. + - Fixes incompatiblity in 4.4.0 with webpack, where webpack is now + selecting "module" because "browser" is no longer present. + +### 4.4.0 (May 12, 2020) + +- Add `nodeRef`: + - If running in React Strict mode, ReactDOM.findDOMNode() is deprecated. + Unfortunately, in order for `` to work properly, we need raw access + to the underlying DOM node. If you want to avoid the warning, pass a `nodeRef` + as in this example: + ```js + function MyComponent() { + const nodeRef = React.useRef(null); + return ( + +
Example Target
+
+ ); + } + ```` + This can be used for arbitrarily nested components, so long as the ref ends up + pointing to the actual child DOM node and not a custom component. + Thanks to react-transition-group for the inspiration. + `nodeRef` is also available on ``. +- Remove "browser" field in "package.json": + - There is nothing special in the browser build that is actually practical + for modern use. The "browser" field, as defined in + https://github.com/defunctzombie/package-browser-field-spec#overview, + indicates that you should use it if you are directly accessing globals, + using browser-specific features, dom manipulation, etc. + + React components like react-draggable are built to do minimal raw + DOM manipulation, and to always gate this behind conditionals to ensure + that server-side rendering still works. We don't make any changes + to any of that for the "browser" build, so it's entirely redundant. + + This should also fix the "Super expression must either be null or + a function" error (#472) that some users have experienced with particular + bundler configurations. + + The browser build may still be imported at "build/web/react-draggable.min.js". + This is to prevent breakage only. The file is no longer minified to prevent + possible [terser bugs](https://github.com/terser/terser/issues/308). + - The browser build will likely be removed entirely in 5.0. +- Fix: Make `bounds` optional in TypeScript [#473](https://github.com/strml/react-draggable/pull/473) + +### 4.3.1 (Apr 11, 2020) + +> This is a bugfix release. + +- Happy Easter! +- Fixed a serious bug that caused `` not to pass styles. + - `React.cloneElement` has an odd quirk. When you do: + ```js + return React.cloneElement(this.props.children, {style: this.props.children.props.style}); + ``` + , `style` ends up undefined. +- Fixed a bug that caused debug output to show up in the build. + - `babel-loader` cache does not invalidate when it should. I had modified webpack.config.js in the last version but it reused stale cache. + +### 4.3.0 (Apr 10, 2020) + +- Fix setState warning after dismount if drag still active. Harmless, but prints a warning. [#424](https://github.com/mzabriskie/react-draggable/pull/424) +- Fix a long-standing issue where text inputs would unfocus upon dismounting a ``. + - Thanks @schnerd, [#450](https://github.com/mzabriskie/react-draggable/pull/450) +- Fix an issue where the insides of a `` were not scrollable on touch devices due to the outer container having `touch-action: none`. + - This was a long-standing hack for mobile devices. Without it, the page will scroll while you drag the element. + - The new solution will simply cancel the touch event `e.preventDefault()`. However, due to changes in Chrome >= 56, this is only possible on + non-passive event handlers. To fix this, we now add/remove the touchEvent on lifecycle events rather than using React's event system. + - [#465](https://github.com/mzabriskie/react-draggable/pull/465) +- Upgrade devDeps and fix security warnings. None of them actually applied to this module. + +### 4.2.0 (Dec 2, 2019) + +- Fix: Apply `scale` parameter also while dragging an element. [#438](https://github.com/mzabriskie/react-draggable/pull/438) +- Fix: Don't ship `process.env.DRAGGABLE_DEBUG` checks in cjs/esm. [#445](https://github.com/mzabriskie/react-draggable/pull/445) + +### 4.1.0 (Oct 25, 2019) + +- Add `"module"` to `package.json`. There are now three builds: + * **`"main"`**: ES5-compatible CJS build, suitable for most use cases with maximum compatibility. + - For legacy reasons, this has exports of the following shape, which ensures no surprises in CJS or ESM polyfilled environments: + ```js + module.exports = Draggable; + module.exports.default = Draggable; + module.exports.DraggableCore = DraggableCore; + ``` + * **`"web"`**: Minified UMD bundle exporting to `window.ReactDraggable` with the same ES compatibility as the "main" build. + * **`"module"`**: ES6-compatible build using import/export. + + This should fix issues like https://github.com/STRML/react-resizable/issues/113 while allowing modern bundlers to consume esm modules in the future. + + No compatibility changes are expected. + +### 4.0.3 (Sep 10, 2019) + +- Add typings and sourcemap to published npm package. + - This compresses well so it does not bloat the package by much. Would be nice if npm had another delivery mechanism for optional modes, like web/TS. + +### 4.0.2 (Sep 9, 2019) + +- Republish to fix packaging errors. Fixes #426 + +### 4.0.1 (Sep 7, 2019) + +- Republish of 4.0.0 to fix a mistake where webpack working files were erroneously included in the package. Use this release instead as it is much smaller. + +### 4.0.0 (Aug 26, 2019) + +> This is a major release due to a React compatibility change. If you are already on React >= 16.3, this upgrade is non-breaking. + +- *Requires React 16.3+ due to use of `getDerivedStateFromProps`. + - See https://reactjs.org/blog/2018/03/27/update-on-async-rendering.html for why this was done. +- Upgraded build environment to Babel 7. +- Switched build from rollup to webpack@4 to simplify. +- Added CJS build that does not bundle `classNames` & `prop-types` into the build. This should result in marginally smaller bundle sizes for applications that use bundlers. +- Removed Bower build. + +### 3.3.2 (Aug 16, 2019) + +- Use `all: inherit` instead of `background: transparent;` to fix selection styles. + - Fixes https://github.com/mzabriskie/react-draggable/issues/315 + +### 3.3.1 (Aug 12, 2019) + +- Fix React 16.9 `componentWillMount` deprecation. + +### 3.3.0 (Apr 18, 2019) + +- Addition of `positionOffset` prop, which can be Numbers (px) or string percentages (like `"10%"`). See the README for more. + +### 3.2.1 (Mar 1, 2019) + +- Reverted https://github.com/mzabriskie/react-draggable/pull/361. + +### ~3.2.0 (Feb 27, 2019)~ + +> Note: this release has been pulled due to an inadvertent breaking change. See https://github.com/mzabriskie/react-draggable/issues/391 + +- Feature: `defaultPosition` now allows string offsets (like {x: '10%', y: '10%'}) then calculates deltas from there. See the examples and the PR [#361](https://github.com/mzabriskie/react-draggable/pull/361/). Thanks to @tnrich and @eric-burel. +- Bugfix: Export `DraggableEvent` type for Flow consumers. Thanks @elie222. + +### 3.1.1 (Dec 21, 2018) + +- Bugfix: Minor type change on DraggableEventHandler TypeScript export ([#374](https://github.com/mzabriskie/react-draggable/pull/374)) + +### 3.1.0 (Dec 21, 2018) + +- Feature: Added `scale` prop ([#352](https://github.com/mzabriskie/react-draggable/pull/352)) + - Thanks, @wootencl +- Bugfix: Remove process.browser which is missing in browser ([#329]((https://github.com/mzabriskie/react-draggable/pull/329)) +- Bugfix: Fix selection api on IE ([#292](https://github.com/mzabriskie/react-draggable/pull/292)) +- Bugfix: Fixes some issues in the type definitions for TypeScript ([#331]((https://github.com/mzabriskie/react-draggable/pull/331)) +- Bugfix: Fix compare where portal elements are different instance to main window ([#359]((https://github.com/mzabriskie/react-draggable/pull/359)) + +### 3.0.5 (Jan 11, 2018) + +- Bugfix: Fix crash in test environments during removeUserSelectStyles(). + +### 3.0.4 (Nov 27, 2017) + +- Bugfix: Fix "Cannot call property 'call' of undefined" (matchesSelector) + - Fixes [#300](https://github.com/mzabriskie/react-draggable/issues/300) + +### 3.0.3 (Aug 31, 2017) + +- Bugfix: Fix deprecation warnings caused by `import * as React` (Flow best practice). + - See https://github.com/facebook/react/issues/10583 + +### 3.0.2 (Aug 22, 2017) + +> 3.0.0 and 3.0.1 have been unpublished due to a large logfile making it into the package. + +- Bugfix: Tweaked `.npmignore`. + +### 3.0.1 (Aug 21, 2017) + +- Bugfix: Flow-type should no longer throw errors for consumers. + - It appears Flow can't resolve a sub-package's interfaces. + +### 3.0.0 (Aug 21, 2017) + +> Due to an export change, this is semver-major. + +- Breaking: For TypeScript users, `` is now exported as `module.exports` and `module.exports.default`. +- Potentially Breaking: We no longer set `user-select: none` on all elements while dragging. Instead, + the [`::selection` psuedo element](https://developer.mozilla.org/en-US/docs/Web/CSS/::selection) is used. + - Depending on your application, this could cause issues, so be sure to test. +- Bugfix: Pass bounded `x`/`y` to callbacks. See [#226](https://github.com/mzabriskie/react-draggable/pull/226). +- Internal: Upgraded dependencies. + +### 2.2.6 (Apr 30, 2017) + +- Bugfix: Missing export default on TS definition (thanks @lostfictions) +- Internal: TS test suite (thanks @lostfictions) + +### 2.2.5 (Apr 28, 2017) + +- Bugfix: Typescript definition was incorrect. [#244](https://github.com/mzabriskie/react-draggable/issues/244) + +### 2.2.4 (Apr 27, 2017) + +- Internal: Moved `PropTypes` access to `prop-types` package for React 15.5 (prep for 16) +- Feature: Added TypeScript definitions (thanks @erfangc) +- Bugfix: No longer can erroneously add user-select style multiple times +- Bugfix: OffsetParent with padding problem, fixes [#218](https://github.com/mzabriskie/react-draggable/issues/218) +- Refactor: Misc example updates. + +### 2.2.3 (Nov 21, 2016) + +- Bugfix: Fix an issue with the entire window scrolling on a drag on iDevices. Thanks @JaneCoder. See #183 + +### 2.2.2 (Sep 14, 2016) + +- Bugfix: Fix references to global when grabbing `SVGElement`, see [#162](https://github.com/mzabriskie/react-draggable/issues/162) +- Bugfix: Get `ownerDocument` before `onStop`, fixes [#198](https://github.com/mzabriskie/react-draggable/issues/198) + +### 2.2.1 (Aug 11, 2016) + +- Bugfix: Fix `getComputedStyle` error: see [#186](https://github.com/mzabriskie/react-draggable/issues/186), #190 + +### 2.2.0 (Jul 29, 2016) + +- Addition: `offsetParent` property for an arbitrary ancestor for offset calculations. + - Fixes e.g. dragging with a floating `offsetParent`. + - Ref: https://github.com/mzabriskie/react-draggable/issues/170 +- Enhancement: Make this library iframe-aware. + - Ref: https://github.com/mzabriskie/react-draggable/pull/177 + - Thanks to @acusti for tests +- Bugfix: Lint/Test Fixes for new Flow & React versions + +### 2.1.2 (Jun 5, 2016) + +- Bugfix: Fix `return false` to cancel `onDrag` breaking on both old and new browsers due to missing `typeArg` and/or + unsupported `MouseEventConstructor`. Fixes [#164](https://github.com/mzabriskie/react-draggable/issues/164). + +### 2.1.1 (May 22, 2016) + +- Bugfix: `` wasn't calling back with the DOM node. +- Internal: Rework test suite to use power-assert. + +### 2.1.0 (May 20, 2016) + +- Fix improperly missed `handle` or `cancel` selectors if the event originates from a child of the handle or cancel. + - Fixes a longstanding issue, [#88](https://github.com/mzabriskie/react-draggable/pull/88) + - This was pushed to a minor release as there may be edge cases (perhaps workarounds) where this changes behavior. + +### 2.0.2 (May 19, 2016) + +- Fix `cannot access clientX of undefined` on some touch-enabled platforms. + - Fixes [#159](https://github.com/mzabriskie/react-draggable/pull/159), + [#118](https://github.com/mzabriskie/react-draggable/pull/118) +- Fixed a bug with multi-finger multitouch if > 1 finger triggered an event at the same time. + +### 2.0.1 (May 19, 2016) + +- Finally fixed the IE10 constructor bug. Thanks @davidstubbs [#158](https://github.com/mzabriskie/react-draggable/pull/158) + +### 2.0.0 (May 10, 2016) + +- This is a breaking change. See the changes below in the beta releases. + - Note the changes to event callbacks and `position` / `defaultPosition`. +- Changes from 2.0.0-beta3: + - Small bugfixes for Flow 0.24 compatibility. + - Don't assume `global.SVGElement`. Fixes JSDOM & [#123](https://github.com/mzabriskie/react-draggable/issues/123). + +### 2.0.0-beta3 (Apr 19, 2016) + +- Flow comments are now in the build. Other projects, such as React-Grid-Layout and React-Resizable, will + rely on them in their build and export their own comments. + +### 2.0.0-beta2 (Apr 14, 2016) + +- We're making a small deviation from React Core's controlled vs. uncontrolled scheme; for convenience, + ``s with a `position` property will still be draggable, but will revert to their old position + on drag stop. Attach an `onStop` or `onDrag` handler to synchronize state. + - A warning has been added informing users of this. If you make `` controlled but attach no callback + handlers, a warning will be printed. + +### 2.0.0-beta1 (Apr 14, 2016) + +- Due to API changes, this is a major release. + +#### Breaking Changes: + +- Both `` and `` have had their callback types changed and unified. + +```js +type DraggableEventHandler = (e: Event, data: DraggableData) => void | false; +type DraggableData = { + node: HTMLElement, + // lastX + deltaX === x + x: number, y: number, + deltaX: number, deltaY: number, + lastX: number, lastY: number +}; +``` + +- The `start` option has been renamed to `defaultPosition`. +- The `zIndex` option has been removed. + +#### Possibly Breaking Changes: + +- When determining deltas, we now use a new method that checks the delta against the Draggable's `offsetParent`. + This method allows us to support arbitrary nested scrollable ancestors without scroll handlers! + - This may cause issues in certain layouts. If you find one, please open an issue. + +#### Enhancements: + +- `` now has a `position` attribute. Its relationship to `defaultPosition` is much like + `value` to `defaultValue` on React `` nodes. If set, the position is fixed and cannot be mutated. + If empty, the component will manage its own state. See [#140](https://github.com/mzabriskie/react-draggable/pull/140) + for more info & motivations. +- Misc. bugfixes. + +### 1.4.0-beta1 (Apr 13, 2016) + +- Major improvements to drag tracking that now support even nested scroll boxes. + - This revision is being done as a pre-release to ensure there are no unforeseen issues with the offset changes. + +### 1.3.7 (Apr 8, 2016) + +- Fix `user-select` prefixing, which may be different than the prefix required for `transform`. + +### 1.3.6 (Apr 8, 2016) + +- Republished after 1.3.5 contained a bundling error. + +### 1.3.5 (Apr 8, 2016) + +- Add React v15 to devDeps. `` supports both `v0.14` and `v15`. +- Enhancement: Clean up usage of browser prefixes; modern browsers will no longer use them. + - This also removes the duplicated `user-select` style that is created on the `` while dragging. +- Internal: Test fixes. + +### 1.3.4 (Mar 5, 2016) + +- Bugfix: Scrolling while dragging caused items to move unpredictably. + +### 1.3.3 (Feb 11, 2016) + +- Bugfix: #116: Android/Chrome are finicky; give up on canceling ghost clicks entirely. + +### 1.3.2 (Feb 11, 2016) + +- Bugfix: #116: Child inputs not focusing on touch events. + +### 1.3.1 (Feb 10, 2016) + +- Internal: Babel 6 and Flow definitions +- Bugfix: 1.3.0 broke string bounds ('parent', selectors, etc.). +- Bugfix: 1.3.0 wasn't updating deltaX and deltaY on a bounds hit. + +### 1.3.0 (Feb 10, 2016) + +- Possibly breaking change: bounds are calculated before `` fires `drag` events, as they should have been. +- Added `'none'` axis type. This allows using `` somewhat like `` - state will be kept + internally (which makes bounds checks etc possible), but updates will not be flushed to the DOM. +- Performance tweaks. + +### 1.2.0 (Feb 5, 2016) + +- Added arbitrary boundary selector. Now you don't have to just use `'parent'`, you can select any element + on the page, including `'body'`. +- Bugfix: Prevent invariant if a `` is unmounted while dragging. +- Bugfix: Fix #133, where items would eagerly start dragging off the mouse cursor if you hit boundaries and + came back. This is due to how `` handles deltas only and does not keep state. Added new state + properties `slackX` and `slackY` to `` to handle this and restore pre-v1 behavior. + +### 1.1.3 (Nov 25, 2015) + +- Bugfix: Server-side rendering with react-rails, which does bad things like mock `window` + +### 1.1.2 (Nov 23, 2015) + +- Bugfix: `` was calling back with clientX/Y, not offsetX/Y as it did pre-1.0. This unintended + behavior has been fixed and a test has been added. + +### 1.1.1 (Nov 14, 2015) + +- Bugfix: Clean up scroll events if a component is unmounted before drag stops. +- Bugfix: `NaN` was returning from scroll events due to event structure change. +- Add scroll drag modulation test. + +### 1.1.0 (Nov 14, 2015) + +- Move `grid` into `` directly. It will continue to work on ``. +- Development fixes. + +### 1.0.2 (Nov 7, 2015) + +- Fix `enableUserSelectHack` not properly disabling. +- Fix a crash when the user scrolls the page with a Draggable active. + +### 1.0.1 (Oct 28, 2015) + +- Fix missing dist files for webpack. +- Ignore non-primary clicks. Added `allowAnyClick` option to allow other click types. + ### 1.0.0 (Oct 27, 2015) - Breaking: Removed `resetState()` instance method diff --git a/LICENSE b/LICENSE index 3040bf8b..8b1d6c98 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ (MIT License) -Copyright (c) 2014 Matt Zabriskie. All rights reserved. +Copyright (c) 2014-2016 Matt Zabriskie. All rights reserved. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), diff --git a/Makefile b/Makefile index e7e9133d..a297eaf6 100644 --- a/Makefile +++ b/Makefile @@ -1,38 +1,41 @@ # Mostly lifted from https://andreypopp.com/posts/2013-05-16-makefile-recipes-for-node-js.html # Thanks @andreypopp -BIN := $(shell npm bin) -DIST = dist -LIB = $(DIST)/react-draggable.js -MIN = $(DIST)/react-draggable.min.js - -.PHONY: test dev build clean +# Make it parallel +MAKEFLAGS += j4 +export BIN := $(shell yarn bin) +.PHONY: test dev lint build build-cjs build-esm build-web clean install link publish +.DEFAULT_GOAL := build clean: - rm -rf dist + rm -rf build + mkdir -p build -build: $(LIB) $(MIN) +lint: + @$(BIN)/flow + @$(BIN)/eslint lib/* lib/utils/* specs/* + @$(BIN)/tsc -p typings -# Allows usage of `make install`, `make link` -install link: - @npm $@ +build: clean build-cjs build-esm build-web -dist/%.min.js: $(LIB) $(BIN) - @$(BIN)/uglifyjs $< \ - --output $@ \ - --source-map $@.map \ - --source-map-url $(basename $@.map) \ - --in-source-map $<.map \ - --compress warnings=false +build-cjs: $(BIN) + $(BIN)/babel --out-dir ./build/cjs ./lib -dist/%.js: $(BIN) - @$(BIN)/webpack --devtool source-map +build-web: $(BIN) + $(BIN)/webpack --mode=production + +# Allows usage of `make install`, `make link` +install link: + @yarn $@ test: $(BIN) - @$(BIN)/karma start --single-run + @$(BIN)/karma start + +test-phantom: $(BIN) + @$(BIN)/karma start karma-phantomjs.conf.js -dev: $(BIN) - script/build-watch +dev: $(BIN) clean + env DRAGGABLE_DEBUG=1 $(BIN)/webpack serve --mode=development node_modules/.bin: install @@ -40,27 +43,26 @@ define release VERSION=`node -pe "require('./package.json').version"` && \ NEXT_VERSION=`node -pe "require('semver').inc(\"$$VERSION\", '$(1)')"` && \ node -e "\ - ['./package.json', './bower.json'].forEach(function(fileName) {\ + ['./package.json'].forEach(function(fileName) {\ var j = require(fileName);\ j.version = \"$$NEXT_VERSION\";\ var s = JSON.stringify(j, null, 2);\ require('fs').writeFileSync(fileName, s);\ });" && \ - git add package.json bower.json CHANGELOG.md && \ - git add -f dist/ && \ + git add package.json CHANGELOG.md && \ git commit -m "release v$$NEXT_VERSION" && \ git tag "v$$NEXT_VERSION" -m "release v$$NEXT_VERSION" endef -release-patch: test clean build +release-patch: test @$(call release,patch) -release-minor: test clean build +release-minor: test @$(call release,minor) -release-major: test clean build +release-major: test @$(call release,major) -publish: clean build +publish: build git push --tags origin HEAD:master - npm publish + yarn publish diff --git a/README.md b/README.md index ac7ff3d2..cdffebc0 100644 --- a/README.md +++ b/README.md @@ -1,12 +1,48 @@ -# React-Draggable [![Build Status](https://travis-ci.org/mzabriskie/react-draggable.svg?branch=master)](https://travis-ci.org/mzabriskie/react-draggable) +# React-Draggable + +[![TravisCI Build Status](https://api.travis-ci.org/react-grid-layout/react-draggable.svg?branch=master)](https://travis-ci.org/react-grid-layout/react-draggable) +[![Appveyor Build Status](https://ci.appveyor.com/api/projects/status/32r7s2skrgm9ubva?svg=true)](https://ci.appveyor.com/project/react-grid-layout/react-draggable) +[![npm downloads](https://img.shields.io/npm/dt/react-draggable.svg?maxAge=2592000)](http://npmjs.com/package/react-draggable) +[![gzip size](http://img.badgesize.io/https://npmcdn.com/react-draggable/build/web/react-draggable.min.js?compression=gzip)]() +[![version](https://img.shields.io/npm/v/react-draggable.svg)]() + +

+ +

A simple component for making elements draggable. -[View the Changelog](CHANGELOG.md) +```js + +
I can now be moved around!
+
+``` + +- [Demo](http://react-grid-layout.github.io/react-draggable/example/) +- [Changelog](CHANGELOG.md) -### Demo -[View Demo](http://mzabriskie.github.io/react-draggable/example/) +|Version | Compatibility| +|------------|--------------| +|4.x | React 16.3+ | +|3.x | React 15-16 | +|2.x | React 0.14 - 15 | +|1.x | React 0.13 - 0.14 | +|0.x | React 0.10 - 0.13 | + +------ + +#### Technical Documentation + +- [Installing](#installing) +- [Exports](#exports) +- [Draggable](#draggable) +- [Draggable Usage](#draggable-usage) +- [Draggable API](#draggable-api) +- [Controlled vs. Uncontrolled](#controlled-vs-uncontrolled) +- [DraggableCore](#draggablecore) +- [DraggableCore API](#draggablecore-api) + ### Installing @@ -22,7 +58,23 @@ This bundle is also what is loaded when installing from npm. It expects external If you want a UMD version of the latest `master` revision, you can generate it yourself from master by cloning this repository and running `$ make`. This will create umd dist files in the `dist/` folder. -## Draggable +### Exports + +The default export is ``. At the `.DraggableCore` property is [``](#draggablecore). +Here's how to use it: + +```js +// ES6 +import Draggable from 'react-draggable'; // The default +import {DraggableCore} from 'react-draggable'; // +import Draggable, {DraggableCore} from 'react-draggable'; // Both at the same time + +// CommonJS +let Draggable = require('react-draggable'); +let DraggableCore = Draggable.DraggableCore; +``` + +## `` A `` element wraps an existing element and extends it with new event handlers and styles. It does not create a wrapper element in the DOM. @@ -33,74 +85,210 @@ positioning (relative, absolute, or static). Elements can also be moved between If the item you are dragging already has a CSS Transform applied, it will be overwritten by ``. Use an intermediate wrapper (`...`) in this case. +### Draggable Usage + +View the [Demo](http://react-grid-layout.github.io/react-draggable/example/) and its +[source](/example/example.js) for more. + +```js +import React from 'react'; +import ReactDOM from 'react-dom'; +import Draggable from 'react-draggable'; + +class App extends React.Component { + + eventLogger = (e: MouseEvent, data: Object) => { + console.log('Event: ', e); + console.log('Data: ', data); + }; + + render() { + return ( + +
+
Drag from here
+
This readme is really dragging on...
+
+
+ ); + } +} + +ReactDOM.render(, document.body); +``` ### Draggable API -The `` component transparently adds draggable to whatever element is supplied as `this.props.children`. -**Note**: Only a single element is allowed or an Error will be thrown. +The `` component transparently adds draggability to its children. + +**Note**: Only a single child is allowed or an Error will be thrown. + +For the `` component to correctly attach itself to its child, the child element must provide support +for the following props: +- `style` is used to give the transform css to the child. +- `className` is used to apply the proper classes to the object being dragged. +- `onMouseDown`, `onMouseUp`, `onTouchStart`, and `onTouchEnd` are used to keep track of dragging state. + +React.DOM elements support the above properties by default, so you may use those elements as children without +any changes. If you wish to use a React component you created, you'll need to be sure to +[transfer prop](https://facebook.github.io/react/docs/transferring-props.html). -Props: +#### `` Props: ```js +// +// Types: +// +type DraggableEventHandler = (e: Event, data: DraggableData) => void | false; +type DraggableData = { + node: HTMLElement, + // lastX + deltaX === x + x: number, y: number, + deltaX: number, deltaY: number, + lastX: number, lastY: number +}; + +// +// Props: +// { -// Called when dragging starts. If `false` is returned from this method, -// dragging will cancel. -// These callbacks are called with the arity -// (event: Event, -// { -// position: {left: number, top: number}, -// deltaX: number, -// deltaY: number -// } -// ) -onStart: Function, +// If set to `true`, will allow dragging on non left-button clicks. +allowAnyClick: boolean, + +// Default `false` and default behavior before 4.5.0. +// If set to `true`, the 'touchstart' event will not be prevented, +// which will allow scrolling inside containers. We recommend +// using the 'handle' / 'cancel' props when possible instead of enabling this. +// +// See https://github.com/react-grid-layout/react-draggable/issues/728 +allowMobileScroll: boolean, + +// Determines which axis the draggable can move. This only affects +// flushing to the DOM. Callbacks will still include all values. +// Accepted values: +// - `both` allows movement horizontally and vertically (default). +// - `x` limits movement to horizontal axis. +// - `y` limits movement to vertical axis. +// - 'none' stops all movement. +axis: string, -// Called while dragging. -onDrag: Function, +// Specifies movement boundaries. Accepted values: +// - `parent` restricts movement within the node's offsetParent +// (nearest node with position relative or absolute), or +// - a selector, restricts movement within the targeted node +// - An object with `left, top, right, and bottom` properties. +// These indicate how far in each direction the draggable +// can be moved. +bounds: {left?: number, top?: number, right?: number, bottom?: number} | string, -// Called when dragging stops. -onStop: Function, +// Specifies a selector to be used to prevent drag initialization. The string is passed to +// Element.matches, so it's possible to use multiple selectors like `.first, .second`. +// Example: '.body' +cancel: string, -// Called whenever the user mouses down. Called regardless of handle or -// disabled status. -onMouseDown: Function, +// Class names for draggable UI. +// Default to 'react-draggable', 'react-draggable-dragging', and 'react-draggable-dragged' +defaultClassName: string, +defaultClassNameDragging: string, +defaultClassNameDragged: string, // Specifies the `x` and `y` that the dragged item should start at. // This is generally not necessary to use (you can use absolute or relative // positioning of the child directly), but can be helpful for uniformity in // your callbacks and with css transforms. -start: {x: number, y: number}, +defaultPosition: {x: number, y: number}, // If true, will not call any drag handlers. disabled: boolean, -// Specifies a selector to be used to prevent drag initialization. -// Example: '.body' -cancel: string, +// Default `true`. Adds "user-select: none" while dragging to avoid selecting text. +enableUserSelectHack: boolean, + +// Specifies the x and y that dragging should snap to. +grid: [number, number], // Specifies a selector to be used as the handle that initiates drag. // Example: '.handle' handle: string, -// Determines which axis the draggable can move. Accepted values: -// - `both` allows movement horizontally and vertically (default). -// - `x` limits movement to horizontal axis. -// - `y` limits movement to vertical axis. -axis: string, +// If desired, you can provide your own offsetParent for drag calculations. +// By default, we use the Draggable's offsetParent. This can be useful for elements +// with odd display types or floats. +offsetParent: HTMLElement, -// Specifies movement boundaries. Accepted values: -// - `parent` restricts movement within the node's offsetParent -// (nearest node with position relative or absolute), or -// - An object with `left, top, right, and bottom` properties. -// These indicate how far in each direction the draggable -// can be moved. -bounds: {left: number, top: number, right: number, bottom: number} | string, +// Called whenever the user mouses down. Called regardless of handle or +// disabled status. +onMouseDown: (e: MouseEvent) => void, -// Specifies the x and y that dragging should snap to. -grid: [number, number], +// Called when dragging starts. If `false` is returned any handler, +// the action will cancel. +onStart: DraggableEventHandler, -// Specifies the zIndex to use while dragging. -zIndex: number +// Called while dragging. +onDrag: DraggableEventHandler, + +// Called when dragging stops. +onStop: DraggableEventHandler, + +// If running in React Strict mode, ReactDOM.findDOMNode() is deprecated. +// Unfortunately, in order for to work properly, we need raw access +// to the underlying DOM node. If you want to avoid the warning, pass a `nodeRef` +// as in this example: +// +// function MyComponent() { +// const nodeRef = React.useRef(null); +// return ( +// +//
Example Target
+//
+// ); +// } +// +// This can be used for arbitrarily nested components, so long as the ref ends up +// pointing to the actual child DOM node and not a custom component. +// +// For rich components, you need to both forward the ref *and props* to the underlying DOM +// element. Props must be forwarded so that DOM event handlers can be attached. +// For example: +// +// const Component1 = React.forwardRef(function (props, ref) { +// return
Nested component
; +// }); +// +// const nodeRef = React.useRef(null); +// +// +// +// +// Thanks to react-transition-group for the inspiration. +// +// `nodeRef` is also available on . +nodeRef: React.Ref, + +// Much like React form elements, if this property is present, the item +// becomes 'controlled' and is not responsive to user input. Use `position` +// if you need to have direct control of the element. +position: {x: number, y: number} + +// A position offset to start with. Useful for giving an initial position +// to the element. Differs from `defaultPosition` in that it does not +// affect the position returned in draggable callbacks, and in that it +// accepts strings, like `{x: '10%', y: '10%'}`. +positionOffset: {x: number | string, y: number | string}, + +// Specifies the scale of the canvas your are dragging this element on. This allows +// you to, for example, get the correct drag deltas while you are zoomed in or out via +// a transform or matrix in the parent of this element. +scale: number } ``` @@ -109,88 +297,65 @@ Note that sending `className`, `style`, or `transform` as properties will error directly. -### Draggable Usage +## Controlled vs. Uncontrolled -```js -/** @jsx React.DOM */ -var React = require('react'), - Draggable = require('react-draggable'); - -var App = React.createClass({ - handleStart: function (event, ui) { - console.log('Event: ', event); - console.log('Position: ', ui.position); - }, - - handleDrag: function (event, ui) { - console.log('Event: ', event); - console.log('Position: ', ui.position); - }, - - handleStop: function (event, ui) { - console.log('Event: ', event); - console.log('Position: ', ui.position); - }, - - render: function () { - return ( - -
-
Drag from here
-
This readme is really dragging on...
-
-
- ); - } -}); - -React.renderComponent(, document.body); -``` +`` is a 'batteries-included' component that manages its own state. If you want to completely +control the lifecycle of the component, use ``. + +For some users, they may want the nice state management that `` provides, but occasionally want +to programmatically reposition their components. `` allows this customization via a system that +is similar to how React handles form components. + +If the prop `position: {x: number, y: number}` is defined, the `` will ignore its internal state and use +the provided position instead. Alternatively, you can seed the position using `defaultPosition`. Technically, since +`` works only on position deltas, you could also seed the initial position using CSS `top/left`. -## +We make one modification to the React philosophy here - we still allow dragging while a component is controlled. +We then expect you to use at least an `onDrag` or `onStop` handler to synchronize state. -For users that require more control, a `` element is available. This is useful for more programmatic -usage of the element. See [React-Resizable](https://github.com/STRML/react-resizable) and -[React-Grid-Layout](https://github.com/STRML/react-grid-layout) for some examples of this. +To disable dragging while controlled, send the prop `disabled={true}` - at this point the `` will operate +like a completely static component. + +## `` + +For users that require absolute control, a `` element is available. This is useful as an abstraction +over touch and mouse events, but with full control. `` has no internal state. + +See [React-Resizable](https://github.com/react-grid-layout/react-resizable) and +[React-Grid-Layout](https://github.com/react-grid-layout/react-grid-layout) for some usage examples. `` is a useful building block for other libraries that simply want to abstract browser-specific quirks and receive callbacks when a user attempts to move an element. It does not set styles or transforms -on itself. +on itself and thus must have callbacks attached to be useful. ### DraggableCore API -`` takes all of the above `` options, with the exception of: - -* `axis` -* `bounds` -* `grid` -* `start` -* `zIndex` - -Drag callbacks are called with the following parameters: +`` takes a limited subset of options: ```js { - node: Node - position: - { - // lastX + deltaX === clientX - deltaX: number, deltaY: number, - lastX: number, lastY: number, - clientX: number, clientY: number - } -}; + allowAnyClick: boolean, + allowMobileScroll: boolean, + cancel: string, + disabled: boolean, + enableUserSelectHack: boolean, + offsetParent: HTMLElement, + grid: [number, number], + handle: string, + onStart: DraggableEventHandler, + onDrag: DraggableEventHandler, + onStop: DraggableEventHandler, + onMouseDown: (e: MouseEvent) => void, + scale: number +} ``` +Note that there is no start position. `` simply calls `drag` handlers with the below parameters, +indicating its position (as inferred from the underlying MouseEvent) and deltas. It is up to the parent +to set actual positions on ``. + +Drag callbacks (`onStart`, `onDrag`, `onStop`) are called with the [same arguments as ``](#draggable-api). + ---- ### Contributing diff --git a/appveyor.yml b/appveyor.yml new file mode 100644 index 00000000..e478bf3b --- /dev/null +++ b/appveyor.yml @@ -0,0 +1,18 @@ +# https://www.appveyor.com/docs/appveyor-yml/ + +environment: + matrix: + - node_version: "12" + - node_version: "10" + - node_version: "8" + IE_BIN: "%PROGRAMFILES%\\Internet Explorer\\iexplore.exe" + +cache: + - node_modules + - "%LOCALAPPDATA%/Yarn" + +build_script: + - cmd: yarn install + +test_script: + - cmd: yarn run test-ie diff --git a/bower.json b/bower.json deleted file mode 100644 index 3fbc4ed8..00000000 --- a/bower.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "name": "react-draggable", - "version": "0.8.1", - "homepage": "https://github.com/mzabriskie/react-draggable", - "authors": [ - "Matt Zabriskie" - ], - "description": "React draggable component", - "main": "./dist/react-draggable.js", - "keywords": [ - "react", - "draggable" - ], - "license": "MIT", - "ignore": [ - "**/.*", - "example", - "lib", - "node_modules", - "script", - "specs", - "index.js", - "karma.conf.js", - "webpack.config.js", - "package.json" - ] -} \ No newline at end of file diff --git a/dist/react-draggable.js b/dist/react-draggable.js deleted file mode 100644 index eb1d28e4..00000000 --- a/dist/react-draggable.js +++ /dev/null @@ -1,1329 +0,0 @@ -(function webpackUniversalModuleDefinition(root, factory) { - if(typeof exports === 'object' && typeof module === 'object') - module.exports = factory(require("react"), require("react-dom")); - else if(typeof define === 'function' && define.amd) - define(["react", "react-dom"], factory); - else if(typeof exports === 'object') - exports["ReactDraggable"] = factory(require("react"), require("react-dom")); - else - root["ReactDraggable"] = factory(root["React"], root["ReactDOM"]); -})(this, function(__WEBPACK_EXTERNAL_MODULE_2__, __WEBPACK_EXTERNAL_MODULE_3__) { -return /******/ (function(modules) { // webpackBootstrap -/******/ // The module cache -/******/ var installedModules = {}; -/******/ -/******/ // The require function -/******/ function __webpack_require__(moduleId) { -/******/ -/******/ // Check if module is in cache -/******/ if(installedModules[moduleId]) -/******/ return installedModules[moduleId].exports; -/******/ -/******/ // Create a new module (and put it into the cache) -/******/ var module = installedModules[moduleId] = { -/******/ exports: {}, -/******/ id: moduleId, -/******/ loaded: false -/******/ }; -/******/ -/******/ // Execute the module function -/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); -/******/ -/******/ // Flag the module as loaded -/******/ module.loaded = true; -/******/ -/******/ // Return the exports of the module -/******/ return module.exports; -/******/ } -/******/ -/******/ -/******/ // expose the modules object (__webpack_modules__) -/******/ __webpack_require__.m = modules; -/******/ -/******/ // expose the module cache -/******/ __webpack_require__.c = installedModules; -/******/ -/******/ // __webpack_public_path__ -/******/ __webpack_require__.p = ""; -/******/ -/******/ // Load entry module and return exports -/******/ return __webpack_require__(0); -/******/ }) -/************************************************************************/ -/******/ ([ -/* 0 */ -/***/ function(module, exports, __webpack_require__) { - - 'use strict'; - - module.exports = __webpack_require__(1); - module.exports.DraggableCore = __webpack_require__(10); - -/***/ }, -/* 1 */ -/***/ function(module, exports, __webpack_require__) { - - 'use strict'; - - Object.defineProperty(exports, '__esModule', { - value: true - }); - - var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; - - var _slicedToArray = (function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i['return']) _i['return'](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError('Invalid attempt to destructure non-iterable instance'); } }; })(); - - var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })(); - - var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } }; - - function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } - - function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } - - function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } - - var _react = __webpack_require__(2); - - var _react2 = _interopRequireDefault(_react); - - var _reactDom = __webpack_require__(3); - - var _reactDom2 = _interopRequireDefault(_reactDom); - - var _classnames = __webpack_require__(4); - - var _classnames2 = _interopRequireDefault(_classnames); - - var _objectAssign = __webpack_require__(5); - - var _objectAssign2 = _interopRequireDefault(_objectAssign); - - var _utilsDomFns = __webpack_require__(6); - - var _utilsPositionFns = __webpack_require__(9); - - var _utilsShims = __webpack_require__(7); - - var _DraggableCore2 = __webpack_require__(10); - - var _DraggableCore3 = _interopRequireDefault(_DraggableCore2); - - var _utilsLog = __webpack_require__(11); - - var _utilsLog2 = _interopRequireDefault(_utilsLog); - - // - // Define - // - - var Draggable = (function (_DraggableCore) { - _inherits(Draggable, _DraggableCore); - - function Draggable() { - var _this = this; - - _classCallCheck(this, Draggable); - - _get(Object.getPrototypeOf(Draggable.prototype), 'constructor', this).apply(this, arguments); - - this.state = { - // Whether or not we are currently dragging. - dragging: false, - - // Current transform x and y. - clientX: this.props.start.x, clientY: this.props.start.y, - - // Can only determine if SVG after mounting - isElementSVG: false - }; - - this.onDragStart = function (e, coreEvent) { - (0, _utilsLog2['default'])('Draggable: onDragStart: %j', coreEvent.position); - - // Short-circuit if user's callback killed it. - var shouldStart = _this.props.onStart(e, (0, _utilsDomFns.createUIEvent)(_this, coreEvent)); - // Kills start event on core as well, so move handlers are never bound. - if (shouldStart === false) return false; - - _this.setState({ - dragging: true - }); - }; - - this.onDrag = function (e, coreEvent) { - if (!_this.state.dragging) return false; - (0, _utilsLog2['default'])('Draggable: onDrag: %j', coreEvent.position); - - // Short-circuit if user's callback killed it. - var shouldUpdate = _this.props.onDrag(e, (0, _utilsDomFns.createUIEvent)(_this, coreEvent)); - if (shouldUpdate === false) return false; - - var newState = { - clientX: _this.state.clientX + coreEvent.position.deltaX, - clientY: _this.state.clientY + coreEvent.position.deltaY - }; - - // Snap to grid if prop has been provided - if (Array.isArray(_this.props.grid)) { - newState.lastX = (_this.state.lastX || newState.clientX) + coreEvent.position.deltaX; - newState.lastY = (_this.state.lastY || newState.clientY) + coreEvent.position.deltaY; - // Eslint bug, it thinks newState.clientY is undefined - /*eslint no-undef:0*/ - - var _snapToGrid = (0, _utilsPositionFns.snapToGrid)(_this.props.grid, newState.lastX, newState.lastY); - - var _snapToGrid2 = _slicedToArray(_snapToGrid, 2); - - newState.clientX = _snapToGrid2[0]; - newState.clientY = _snapToGrid2[1]; - } - - // Keep within bounds. - if (_this.props.bounds) { - var _getBoundPosition = (0, _utilsPositionFns.getBoundPosition)(_this, newState.clientX, newState.clientY); - - var _getBoundPosition2 = _slicedToArray(_getBoundPosition, 2); - - newState.clientX = _getBoundPosition2[0]; - newState.clientY = _getBoundPosition2[1]; - } - - _this.setState(newState); - }; - - this.onDragStop = function (e, coreEvent) { - if (!_this.state.dragging) return false; - - // Short-circuit if user's callback killed it. - var shouldStop = _this.props.onStop(e, (0, _utilsDomFns.createUIEvent)(_this, coreEvent)); - if (shouldStop === false) return false; - - (0, _utilsLog2['default'])('Draggable: onDragStop: %j', coreEvent.position); - - _this.setState({ - dragging: false - }); - }; - } - - _createClass(Draggable, [{ - key: 'componentDidMount', - value: function componentDidMount() { - // Check to see if the element passed is an instanceof SVGElement - if (_reactDom2['default'].findDOMNode(this) instanceof SVGElement) { - this.setState({ isElementSVG: true }); - } - } - }, { - key: 'render', - value: function render() { - var style = undefined, - svgTransform = null; - // Add a CSS transform to move the element around. This allows us to move the element around - // without worrying about whether or not it is relatively or absolutely positioned. - // If the item you are dragging already has a transform set, wrap it in a so - // has a clean slate. - style = (0, _utilsDomFns.createTransform)({ - // Set left if horizontal drag is enabled - x: (0, _utilsPositionFns.canDragX)(this) ? this.state.clientX : this.props.start.x, - - // Set top if vertical drag is enabled - y: (0, _utilsPositionFns.canDragY)(this) ? this.state.clientY : this.props.start.y - }, this.state.isElementSVG); - - // If this element was SVG, we use the `transform` attribute. - if (this.state.isElementSVG) { - svgTransform = style; - style = {}; - } - - // zIndex option - if (this.state.dragging && !isNaN(this.props.zIndex)) { - style.zIndex = this.props.zIndex; - } - - // Mark with class while dragging - var className = (0, _classnames2['default'])(this.props.children.props.className || '', 'react-draggable', { - 'react-draggable-dragging': this.state.dragging, - 'react-draggable-dragged': this.state.dragged - }); - - // Reuse the child provided - // This makes it flexible to use whatever element is wanted (div, ul, etc) - return _react2['default'].createElement( - _DraggableCore3['default'], - _extends({}, this.props, { onStart: this.onDragStart, onDrag: this.onDrag, onStop: this.onDragStop }), - _react2['default'].cloneElement(_react2['default'].Children.only(this.props.children), { - className: className, - style: (0, _objectAssign2['default'])({}, this.props.children.props.style, style), - transform: svgTransform - }) - ); - } - }], [{ - key: 'displayName', - value: 'Draggable', - enumerable: true - }, { - key: 'propTypes', - value: (0, _objectAssign2['default'])({}, _DraggableCore3['default'].propTypes, { - /** - * `axis` determines which axis the draggable can move. - * - * 'both' allows movement horizontally and vertically. - * 'x' limits movement to horizontal axis. - * 'y' limits movement to vertical axis. - * - * Defaults to 'both'. - */ - axis: _react.PropTypes.oneOf(['both', 'x', 'y']), - - /** - * `bounds` determines the range of movement available to the element. - * Available values are: - * - * 'parent' restricts movement within the Draggable's parent node. - * - * Alternatively, pass an object with the following properties, all of which are optional: - * - * {left: LEFT_BOUND, right: RIGHT_BOUND, bottom: BOTTOM_BOUND, top: TOP_BOUND} - * - * All values are in px. - * - * Example: - * - * ```jsx - * let App = React.createClass({ - * render: function () { - * return ( - * - *
Content
- *
- * ); - * } - * }); - * ``` - */ - bounds: _react.PropTypes.oneOfType([_react.PropTypes.shape({ - left: _react.PropTypes.Number, - right: _react.PropTypes.Number, - top: _react.PropTypes.Number, - bottom: _react.PropTypes.Number - }), _react.PropTypes.oneOf(['parent', false])]), - - /** - * `grid` specifies the x and y that dragging should snap to. - * - * Example: - * - * ```jsx - * let App = React.createClass({ - * render: function () { - * return ( - * - *
I snap to a 25 x 25 grid
- *
- * ); - * } - * }); - * ``` - */ - grid: _react.PropTypes.arrayOf(_react.PropTypes.number), - - /** - * `start` specifies the x and y that the dragged item should start at - * - * Example: - * - * ```jsx - * let App = React.createClass({ - * render: function () { - * return ( - * - *
I start with transformX: 25px and transformY: 25px;
- *
- * ); - * } - * }); - * ``` - */ - start: _react.PropTypes.shape({ - x: _react.PropTypes.number, - y: _react.PropTypes.number - }), - - /** - * `zIndex` specifies the zIndex to use while dragging. - * - * Example: - * - * ```jsx - * let App = React.createClass({ - * render: function () { - * return ( - * - *
I have a zIndex
- *
- * ); - * } - * }); - * ``` - */ - zIndex: _react.PropTypes.number, - - /** - * These properties should be defined on the child, not here. - */ - className: _utilsShims.dontSetMe, - style: _utilsShims.dontSetMe, - transform: _utilsShims.dontSetMe - }), - enumerable: true - }, { - key: 'defaultProps', - value: (0, _objectAssign2['default'])({}, _DraggableCore3['default'].defaultProps, { - axis: 'both', - bounds: false, - grid: null, - start: { x: 0, y: 0 }, - zIndex: NaN - }), - enumerable: true - }]); - - return Draggable; - })(_DraggableCore3['default']); - - exports['default'] = Draggable; - module.exports = exports['default']; - -/***/ }, -/* 2 */ -/***/ function(module, exports) { - - module.exports = __WEBPACK_EXTERNAL_MODULE_2__; - -/***/ }, -/* 3 */ -/***/ function(module, exports) { - - module.exports = __WEBPACK_EXTERNAL_MODULE_3__; - -/***/ }, -/* 4 */ -/***/ function(module, exports, __webpack_require__) { - - var __WEBPACK_AMD_DEFINE_RESULT__;/*! - Copyright (c) 2015 Jed Watson. - Licensed under the MIT License (MIT), see - http://jedwatson.github.io/classnames - */ - /* global define */ - - (function () { - 'use strict'; - - var hasOwn = {}.hasOwnProperty; - - function classNames () { - var classes = ''; - - for (var i = 0; i < arguments.length; i++) { - var arg = arguments[i]; - if (!arg) continue; - - var argType = typeof arg; - - if (argType === 'string' || argType === 'number') { - classes += ' ' + arg; - } else if (Array.isArray(arg)) { - classes += ' ' + classNames.apply(null, arg); - } else if (argType === 'object') { - for (var key in arg) { - if (hasOwn.call(arg, key) && arg[key]) { - classes += ' ' + key; - } - } - } - } - - return classes.substr(1); - } - - if (typeof module !== 'undefined' && module.exports) { - module.exports = classNames; - } else if (true) { - // register as 'classnames', consistent with npm package name - !(__WEBPACK_AMD_DEFINE_RESULT__ = function () { - return classNames; - }.call(exports, __webpack_require__, exports, module), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)); - } else { - window.classNames = classNames; - } - }()); - - -/***/ }, -/* 5 */ -/***/ function(module, exports) { - - /* eslint-disable no-unused-vars */ - 'use strict'; - var hasOwnProperty = Object.prototype.hasOwnProperty; - var propIsEnumerable = Object.prototype.propertyIsEnumerable; - - function toObject(val) { - if (val === null || val === undefined) { - throw new TypeError('Object.assign cannot be called with null or undefined'); - } - - return Object(val); - } - - module.exports = Object.assign || function (target, source) { - var from; - var to = toObject(target); - var symbols; - - for (var s = 1; s < arguments.length; s++) { - from = Object(arguments[s]); - - for (var key in from) { - if (hasOwnProperty.call(from, key)) { - to[key] = from[key]; - } - } - - if (Object.getOwnPropertySymbols) { - symbols = Object.getOwnPropertySymbols(from); - for (var i = 0; i < symbols.length; i++) { - if (propIsEnumerable.call(from, symbols[i])) { - to[symbols[i]] = from[symbols[i]]; - } - } - } - } - - return to; - }; - - -/***/ }, -/* 6 */ -/***/ function(module, exports, __webpack_require__) { - - 'use strict'; - - Object.defineProperty(exports, '__esModule', { - value: true - }); - exports.matchesSelector = matchesSelector; - exports.addEvent = addEvent; - exports.removeEvent = removeEvent; - exports.outerHeight = outerHeight; - exports.outerWidth = outerWidth; - exports.innerHeight = innerHeight; - exports.innerWidth = innerWidth; - exports.createTransform = createTransform; - exports.createCSSTransform = createCSSTransform; - exports.createSVGTransform = createSVGTransform; - exports.addUserSelectStyles = addUserSelectStyles; - exports.removeUserSelectStyles = removeUserSelectStyles; - exports.styleHacks = styleHacks; - exports.createCoreEvent = createCoreEvent; - exports.createUIEvent = createUIEvent; - - function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } - - var _shims = __webpack_require__(7); - - var _getPrefix = __webpack_require__(8); - - var _getPrefix2 = _interopRequireDefault(_getPrefix); - - var _objectAssign = __webpack_require__(5); - - var _objectAssign2 = _interopRequireDefault(_objectAssign); - - var _reactDom = __webpack_require__(3); - - var _reactDom2 = _interopRequireDefault(_reactDom); - - var matchesSelectorFunc = ''; - - function matchesSelector(el, selector) { - if (!matchesSelectorFunc) { - matchesSelectorFunc = (0, _shims.findInArray)(['matches', 'webkitMatchesSelector', 'mozMatchesSelector', 'msMatchesSelector', 'oMatchesSelector'], function (method) { - return (0, _shims.isFunction)(el[method]); - }); - } - - return el[matchesSelectorFunc].call(el, selector); - } - - function addEvent(el, event, handler) { - if (!el) { - return; - } - if (el.attachEvent) { - el.attachEvent('on' + event, handler); - } else if (el.addEventListener) { - el.addEventListener(event, handler, true); - } else { - el['on' + event] = handler; - } - } - - function removeEvent(el, event, handler) { - if (!el) { - return; - } - if (el.detachEvent) { - el.detachEvent('on' + event, handler); - } else if (el.removeEventListener) { - el.removeEventListener(event, handler, true); - } else { - el['on' + event] = null; - } - } - - function outerHeight(node) { - // This is deliberately excluding margin for our calculations, since we are using - // offsetTop which is including margin. See getBoundPosition - var height = node.clientHeight; - var computedStyle = window.getComputedStyle(node); - height += (0, _shims.int)(computedStyle.borderTopWidth); - height += (0, _shims.int)(computedStyle.borderBottomWidth); - return height; - } - - function outerWidth(node) { - // This is deliberately excluding margin for our calculations, since we are using - // offsetLeft which is including margin. See getBoundPosition - var width = node.clientWidth; - var computedStyle = window.getComputedStyle(node); - width += (0, _shims.int)(computedStyle.borderLeftWidth); - width += (0, _shims.int)(computedStyle.borderRightWidth); - return width; - } - - function innerHeight(node) { - var height = node.clientHeight; - var computedStyle = window.getComputedStyle(node); - height -= (0, _shims.int)(computedStyle.paddingTop); - height -= (0, _shims.int)(computedStyle.paddingBottom); - return height; - } - - function innerWidth(node) { - var width = node.clientWidth; - var computedStyle = window.getComputedStyle(node); - width -= (0, _shims.int)(computedStyle.paddingLeft); - width -= (0, _shims.int)(computedStyle.paddingRight); - return width; - } - - function createTransform(position, isSVG) { - if (isSVG) return createSVGTransform(position); - return createCSSTransform(position); - } - - function createCSSTransform(_ref) { - var x = _ref.x; - var y = _ref.y; - return (function () { - // Replace unitless items with px - var out = { transform: 'translate(' + x + 'px,' + y + 'px)' }; - // Add single prefixed property as well - if (_getPrefix2['default']) { - out[_getPrefix2['default'] + 'Transform'] = out.transform; - } - return out; - })(); - } - - function createSVGTransform(_ref2) { - var x = _ref2.x; - var y = _ref2.y; - return (function () { - return 'translate(' + x + ',' + y + ')'; - })(); - } - - // User-select Hacks: - // - // Useful for preventing blue highlights all over everything when dragging. - var userSelectStyle = ';user-select: none;'; - if (_getPrefix2['default']) { - userSelectStyle += '-' + _getPrefix2['default'].toLowerCase() + '-user-select: none;'; - } - - function addUserSelectStyles() { - var style = document.body.getAttribute('style') || ''; - document.body.setAttribute('style', style + userSelectStyle); - } - - function removeUserSelectStyles() { - var style = document.body.getAttribute('style') || ''; - document.body.setAttribute('style', style.replace(userSelectStyle, '')); - } - - function styleHacks() { - var childStyle = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0]; - - // Workaround IE pointer events; see #51 - // https://github.com/mzabriskie/react-draggable/issues/51#issuecomment-103488278 - var touchHacks = { - touchAction: 'none' - }; - - return (0, _objectAssign2['default'])(touchHacks, childStyle); - } - - // Create an event exposed by - - function createCoreEvent(draggable, clientX, clientY) { - // State changes are often (but not always!) async. We want the latest value. - var state = draggable._pendingState || draggable.state; - var isStart = !(0, _shims.isNum)(state.lastX); - - return { - node: _reactDom2['default'].findDOMNode(draggable), - position: isStart ? - // If this is our first move, use the clientX and clientY as last coords. - { - deltaX: 0, deltaY: 0, - lastX: clientX, lastY: clientY, - clientX: clientX, clientY: clientY - } : - // Otherwise calculate proper values. - { - deltaX: clientX - state.lastX, deltaY: clientY - state.lastY, - lastX: state.lastX, lastY: state.lastY, - clientX: clientX, clientY: clientY - } - }; - } - - // Create an event exposed by - - function createUIEvent(draggable, coreEvent) { - return { - node: _reactDom2['default'].findDOMNode(draggable), - position: { - top: coreEvent.position.clientY, - left: coreEvent.position.clientX - }, - deltaX: coreEvent.position.deltaX, - deltaY: coreEvent.position.deltaY - }; - } - -/***/ }, -/* 7 */ -/***/ function(module, exports) { - - // @credits https://gist.github.com/rogozhnikoff/a43cfed27c41e4e68cdc - 'use strict'; - - Object.defineProperty(exports, '__esModule', { - value: true - }); - exports.findInArray = findInArray; - exports.isFunction = isFunction; - exports.isNum = isNum; - exports.int = int; - exports.dontSetMe = dontSetMe; - - function findInArray(array, callback) { - for (var i = 0, _length = array.length; i < _length; i++) { - if (callback.apply(callback, [array[i], i, array])) return array[i]; - } - } - - function isFunction(func) { - return typeof func === 'function' || Object.prototype.toString.call(func) === '[object Function]'; - } - - function isNum(num) { - return typeof num === 'number' && !isNaN(num); - } - - function int(a) { - return parseInt(a, 10); - } - - function dontSetMe(props, propName, componentName) { - if (props[propName]) { - throw new Error('Invalid prop ' + propName + ' passed to ' + componentName + ' - do not set this, set it on the child.'); - } - } - -/***/ }, -/* 8 */ -/***/ function(module, exports) { - - 'use strict'; - - Object.defineProperty(exports, '__esModule', { - value: true - }); - - exports['default'] = (function () { - if (typeof window === 'undefined') return ''; - // Thanks David Walsh - var styles = window.getComputedStyle(document.documentElement, ''), - pre = (Array.prototype.slice.call(styles).join('').match(/-(moz|webkit|ms)-/) || styles.OLink === '' && ['', 'o'])[1]; - // 'ms' is not titlecased - if (pre === 'ms') return pre; - if (pre === undefined || pre === null) return ''; - return pre.slice(0, 1).toUpperCase() + pre.slice(1); - })(); - - module.exports = exports['default']; - -/***/ }, -/* 9 */ -/***/ function(module, exports, __webpack_require__) { - - 'use strict'; - - Object.defineProperty(exports, '__esModule', { - value: true - }); - exports.getBoundPosition = getBoundPosition; - exports.snapToGrid = snapToGrid; - exports.canDragX = canDragX; - exports.canDragY = canDragY; - exports.getControlPosition = getControlPosition; - - function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } - - var _shims = __webpack_require__(7); - - var _reactDom = __webpack_require__(3); - - var _reactDom2 = _interopRequireDefault(_reactDom); - - var _domFns = __webpack_require__(6); - - function getBoundPosition(draggable, clientX, clientY) { - // If no bounds, short-circuit and move on - if (!draggable.props.bounds) return [clientX, clientY]; - - var bounds = JSON.parse(JSON.stringify(draggable.props.bounds)); - var node = _reactDom2['default'].findDOMNode(draggable); - var parent = node.parentNode; - - if (bounds === 'parent') { - var nodeStyle = window.getComputedStyle(node); - var parentStyle = window.getComputedStyle(parent); - // Compute bounds. This is a pain with padding and offsets but this gets it exactly right. - bounds = { - left: -node.offsetLeft + (0, _shims.int)(parentStyle.paddingLeft) + (0, _shims.int)(nodeStyle.borderLeftWidth) + (0, _shims.int)(nodeStyle.marginLeft), - top: -node.offsetTop + (0, _shims.int)(parentStyle.paddingTop) + (0, _shims.int)(nodeStyle.borderTopWidth) + (0, _shims.int)(nodeStyle.marginTop), - right: (0, _domFns.innerWidth)(parent) - (0, _domFns.outerWidth)(node) - node.offsetLeft, - bottom: (0, _domFns.innerHeight)(parent) - (0, _domFns.outerHeight)(node) - node.offsetTop - }; - } - - // Keep x and y below right and bottom limits... - if ((0, _shims.isNum)(bounds.right)) clientX = Math.min(clientX, bounds.right); - if ((0, _shims.isNum)(bounds.bottom)) clientY = Math.min(clientY, bounds.bottom); - - // But above left and top limits. - if ((0, _shims.isNum)(bounds.left)) clientX = Math.max(clientX, bounds.left); - if ((0, _shims.isNum)(bounds.top)) clientY = Math.max(clientY, bounds.top); - - return [clientX, clientY]; - } - - function snapToGrid(grid, pendingX, pendingY) { - var x = Math.round(pendingX / grid[0]) * grid[0]; - var y = Math.round(pendingY / grid[1]) * grid[1]; - return [x, y]; - } - - function canDragX(draggable) { - return draggable.props.axis === 'both' || draggable.props.axis === 'x'; - } - - function canDragY(draggable) { - return draggable.props.axis === 'both' || draggable.props.axis === 'y'; - } - - // Get {clientX, clientY} positions from event. - - function getControlPosition(e) { - var position = e.targetTouches && e.targetTouches[0] || e; - return { - clientX: position.clientX, - clientY: position.clientY - }; - } - -/***/ }, -/* 10 */ -/***/ function(module, exports, __webpack_require__) { - - 'use strict'; - - Object.defineProperty(exports, '__esModule', { - value: true - }); - - var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })(); - - var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } }; - - function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } - - function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } - - function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } - - var _react = __webpack_require__(2); - - var _react2 = _interopRequireDefault(_react); - - var _utilsDomFns = __webpack_require__(6); - - var _utilsPositionFns = __webpack_require__(9); - - var _utilsShims = __webpack_require__(7); - - var _utilsLog = __webpack_require__(11); - - var _utilsLog2 = _interopRequireDefault(_utilsLog); - - // Simple abstraction for dragging events names. - var eventsFor = { - touch: { - start: 'touchstart', - move: 'touchmove', - stop: 'touchend' - }, - mouse: { - start: 'mousedown', - move: 'mousemove', - stop: 'mouseup' - } - }; - - // Default to mouse events. - var dragEventFor = eventsFor.mouse; - - // - // Define . - // - // is for advanced usage of . It maintains minimal internal state so it can - // work well with libraries that require more control over the element. - // - - var DraggableCore = (function (_React$Component) { - _inherits(DraggableCore, _React$Component); - - function DraggableCore() { - var _this = this; - - _classCallCheck(this, DraggableCore); - - _get(Object.getPrototypeOf(DraggableCore.prototype), 'constructor', this).apply(this, arguments); - - this.state = { - dragging: false, - // Used while dragging to determine deltas. - lastX: null, lastY: null - }; - - this.handleDragStart = function (e) { - // Make it possible to attach event handlers on top of this one. - _this.props.onMouseDown(e); - - // Short circuit if handle or cancel prop was provided and selector doesn't match. - if (_this.props.disabled || _this.props.handle && !(0, _utilsDomFns.matchesSelector)(e.target, _this.props.handle) || _this.props.cancel && (0, _utilsDomFns.matchesSelector)(e.target, _this.props.cancel)) { - return; - } - - // Set touch identifier in component state if this is a touch event. This allows us to - // distinguish between individual touches on multitouch screens by identifying which - // touchpoint was set to this element. - if (e.targetTouches) { - _this.setState({ touchIdentifier: e.targetTouches[0].identifier }); - } - - // Add a style to the body to disable user-select. This prevents text from - // being selected all over the page. - (0, _utilsDomFns.addUserSelectStyles)(); - - // Get the current drag point from the event. This is used as the offset. - - var _getControlPosition = (0, _utilsPositionFns.getControlPosition)(e); - - var clientX = _getControlPosition.clientX; - var clientY = _getControlPosition.clientY; - - // Create an event object with all the data parents need to make a decision here. - var coreEvent = (0, _utilsDomFns.createCoreEvent)(_this, clientX, clientY); - - (0, _utilsLog2['default'])('DraggableCore: handleDragStart: %j', coreEvent.position); - - // Call event handler. If it returns explicit false, cancel. - (0, _utilsLog2['default'])('calling', _this.props.onStart); - var shouldUpdate = _this.props.onStart(e, coreEvent); - if (shouldUpdate === false) return; - - // Initiate dragging. Set the current x and y as offsets - // so we know how much we've moved during the drag. This allows us - // to drag elements around even if they have been moved, without issue. - _this.setState({ - dragging: true, - - lastX: clientX, - lastY: clientY, - // Stored so we can adjust our offset if scrolled. - scrollX: document.body.scrollLeft, - scrollY: document.body.scrollTop - }); - - // Translate el on page scroll. - (0, _utilsDomFns.addEvent)(document, 'scroll', _this.handleScroll); - // Add events to the document directly so we catch when the user's mouse/touch moves outside of - // this element. We use different events depending on whether or not we have detected that this - // is a touch-capable device. - (0, _utilsDomFns.addEvent)(document, dragEventFor.move, _this.handleDrag); - (0, _utilsDomFns.addEvent)(document, dragEventFor.stop, _this.handleDragStop); - }; - - this.handleDrag = function (e) { - // Return if this is a touch event, but not the correct one for this element - if (e.targetTouches && e.targetTouches[0].identifier !== _this.state.touchIdentifier) return; - - var _getControlPosition2 = (0, _utilsPositionFns.getControlPosition)(e); - - var clientX = _getControlPosition2.clientX; - var clientY = _getControlPosition2.clientY; - - var coreEvent = (0, _utilsDomFns.createCoreEvent)(_this, clientX, clientY); - - (0, _utilsLog2['default'])('DraggableCore: handleDrag: %j', coreEvent.position); - - // Call event handler. If it returns explicit false, trigger end. - var shouldUpdate = _this.props.onDrag(e, coreEvent); - if (shouldUpdate === false) { - _this.handleDragStop({}); - return; - } - - _this.setState({ - lastX: clientX, - lastY: clientY - }); - }; - - this.handleDragStop = function (e) { - if (!_this.state.dragging) return; - - // Short circuit if this is not the correct touch event. `changedTouches` contains all - // touch points that have been removed from the surface. - if (e.changedTouches && e.changedTouches[0].identifier !== _this.state.touchIdentifier) return; - - // Remove user-select hack - if (_this.props.enableUserSelectHack) (0, _utilsDomFns.removeUserSelectStyles)(); - - var _getControlPosition3 = (0, _utilsPositionFns.getControlPosition)(e); - - var clientX = _getControlPosition3.clientX; - var clientY = _getControlPosition3.clientY; - - var coreEvent = (0, _utilsDomFns.createCoreEvent)(_this, clientX, clientY); - - (0, _utilsLog2['default'])('DraggableCore: handleDragStop: %j', coreEvent.position); - - // Reset the el. - _this.setState({ - dragging: false, - lastX: null, - lastY: null - }); - - // Call event handler - _this.props.onStop(e, coreEvent); - - // Remove event handlers - (0, _utilsLog2['default'])('DraggableCore: Removing handlers'); - (0, _utilsDomFns.removeEvent)(document, 'scroll', _this.handleScroll); - (0, _utilsDomFns.removeEvent)(document, dragEventFor.move, _this.handleDrag); - (0, _utilsDomFns.removeEvent)(document, dragEventFor.stop, _this.handleDragStop); - }; - - this.handleScroll = function () { - var s = _this.state, - x = document.body.scrollLeft, - y = document.body.scrollTop; - - // Create the usual event, but make the scroll offset our deltas. - var coreEvent = (0, _utilsDomFns.createCoreEvent)(_this); - coreEvent.deltaX = x - s.scrollX; - coreEvent.deltaY = y - s.scrollY; - - _this.setState({ - lastX: s.lastX + coreEvent.deltaX, - lastY: s.lastY + coreEvent.deltaY - }); - - _this.props.onDrag(coreEvent); - }; - - this.onMouseDown = function (e) { - // HACK: Prevent 'ghost click' which happens 300ms after touchstart if the event isn't cancelled. - // We don't cancel the event on touchstart because of #37; we might want to make a scrollable item draggable. - // More on ghost clicks: http://ariatemplates.com/blog/2014/05/ghost-clicks-in-mobile-browsers/ - if (dragEventFor === eventsFor.touch) { - return e.preventDefault(); - } - - return _this.handleDragStart(e); - }; - - this.onTouchStart = function (e) { - // We're on a touch device now, so change the event handlers - dragEventFor = eventsFor.touch; - - return _this.handleDragStart(e); - }; - } - - _createClass(DraggableCore, [{ - key: 'componentWillUnmount', - value: function componentWillUnmount() { - // Remove any leftover event handlers. Remove both touch and mouse handlers in case - // some browser quirk caused a touch event to fire during a mouse move, or vice versa. - (0, _utilsDomFns.removeEvent)(document, eventsFor.mouse.move, this.handleDrag); - (0, _utilsDomFns.removeEvent)(document, eventsFor.touch.move, this.handleDrag); - (0, _utilsDomFns.removeEvent)(document, eventsFor.mouse.stop, this.handleDragStop); - (0, _utilsDomFns.removeEvent)(document, eventsFor.touch.stop, this.handleDragStop); - if (this.props.enableUserSelectHack) (0, _utilsDomFns.removeUserSelectStyles)(); - } - }, { - key: 'render', - value: function render() { - // Reuse the child provided - // This makes it flexible to use whatever element is wanted (div, ul, etc) - return _react2['default'].cloneElement(_react2['default'].Children.only(this.props.children), { - style: (0, _utilsDomFns.styleHacks)(this.props.children.props.style), - - // Note: mouseMove handler is attached to document so it will still function - // when the user drags quickly and leaves the bounds of the element. - onMouseDown: this.onMouseDown, - onTouchStart: this.onTouchStart, - onMouseUp: this.handleDragStop, - onTouchEnd: this.handleDragStop - }); - } - }], [{ - key: 'displayName', - value: 'DraggableCore', - enumerable: true - }, { - key: 'propTypes', - value: { - /** - * `disabled`, if true, stops the from dragging. All handlers, - * with the exception of `onMouseDown`, will not fire. - * - * Example: - * - * ```jsx - * let App = React.createClass({ - * render: function () { - * return ( - * - *
I can't be dragged
- *
- * ); - * } - * }); - * ``` - */ - disabled: _react.PropTypes.bool, - - /** - * By default, we add 'user-select:none' attributes to the document body - * to prevent ugly text selection during drag. If this is causing problems - * for your app, set this to `false`. - */ - enableUserSelectHack: _react.PropTypes.bool, - - /** - * `handle` specifies a selector to be used as the handle that initiates drag. - * - * Example: - * - * ```jsx - * let App = React.createClass({ - * render: function () { - * return ( - * - *
- *
Click me to drag
- *
This is some other content
- *
- *
- * ); - * } - * }); - * ``` - */ - handle: _react.PropTypes.string, - - /** - * `cancel` specifies a selector to be used to prevent drag initialization. - * - * Example: - * - * ```jsx - * let App = React.createClass({ - * render: function () { - * return( - * - *
- *
You can't drag from here
- *
Dragging here works fine
- *
- *
- * ); - * } - * }); - * ``` - */ - cancel: _react.PropTypes.string, - - /** - * Called when dragging starts. - * If this function returns the boolean false, dragging will be canceled. - * - * Example: - * - * ```js - * function (event, ui) {} - * ``` - * - * `event` is the Event that was triggered. - * `ui` is an object: - * - * ```js - * { - * position: {top: 0, left: 0} - * } - * ``` - */ - onStart: _react.PropTypes.func, - - /** - * Called while dragging. - * If this function returns the boolean false, dragging will be canceled. - * - * Example: - * - * ```js - * function (event, ui) {} - * ``` - * - * `event` is the Event that was triggered. - * `ui` is an object: - * - * ```js - * { - * position: {top: 0, left: 0} - * } - * ``` - */ - onDrag: _react.PropTypes.func, - - /** - * Called when dragging stops. - * - * Example: - * - * ```js - * function (event, ui) {} - * ``` - * - * `event` is the Event that was triggered. - * `ui` is an object: - * - * ```js - * { - * position: {top: 0, left: 0} - * } - * ``` - */ - onStop: _react.PropTypes.func, - - /** - * A workaround option which can be passed if onMouseDown needs to be accessed, - * since it'll always be blocked (due to that there's internal use of onMouseDown) - */ - onMouseDown: _react.PropTypes.func, - - /** - * These properties should be defined on the child, not here. - */ - className: _utilsShims.dontSetMe, - style: _utilsShims.dontSetMe, - transform: _utilsShims.dontSetMe - }, - enumerable: true - }, { - key: 'defaultProps', - value: { - cancel: null, - disabled: false, - enableUserSelectHack: true, - handle: null, - transform: null, - onStart: function onStart() {}, - onDrag: function onDrag() {}, - onStop: function onStop() {}, - onMouseDown: function onMouseDown() {} - }, - enumerable: true - }]); - - return DraggableCore; - })(_react2['default'].Component); - - exports['default'] = DraggableCore; - module.exports = exports['default']; - - // When the user scrolls, adjust internal state so the draggable moves along the page properly. - // This only fires when a drag is active. - - // On mousedown, consider the drag started. - - // Same as onMouseDown (start drag), but now consider this a touch device. - -/***/ }, -/* 11 */ -/***/ function(module, exports, __webpack_require__) { - - "use strict"; - - Object.defineProperty(exports, "__esModule", { - value: true - }); - exports["default"] = log; - - function log() { - if ((undefined)) console.log.apply(console, arguments); - } - - module.exports = exports["default"]; - -/***/ } -/******/ ]) -}); -; -//# sourceMappingURL=react-draggable.js.map \ No newline at end of file diff --git a/dist/react-draggable.js.map b/dist/react-draggable.js.map deleted file mode 100644 index 0b8cb195..00000000 --- a/dist/react-draggable.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["../webpack/universalModuleDefinition","../webpack/bootstrap ab255d085dc93d25cddd",".././index.js",".././lib/Draggable.es6","../external {\"commonjs\":\"react\",\"commonjs2\":\"react\",\"amd\":\"react\",\"root\":\"React\"}","../external {\"commonjs\":\"react-dom\",\"commonjs2\":\"react-dom\",\"amd\":\"react-dom\",\"root\":\"ReactDOM\"}",".././~/classnames/index.js",".././~/object-assign/index.js",".././lib/utils/domFns.es6",".././lib/utils/shims.es6",".././lib/utils/getPrefix.es6",".././lib/utils/positionFns.es6",".././lib/DraggableCore.es6",".././lib/utils/log.es6"],"names":[],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AACD,O;ACVA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,uBAAe;AACf;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;;;;;;;;ACtCA,OAAM,CAAC,OAAO,GAAG,mBAAO,CAAC,CAAiB,CAAC,CAAC;AAC5C,OAAM,CAAC,OAAO,CAAC,aAAa,GAAG,mBAAO,CAAC,EAAqB,CAAC,C;;;;;;;;;;;;;;;;;;;;;;;;;;kCCDnB,CAAO;;;;qCAC5B,CAAW;;;;uCACT,CAAY;;;;yCAChB,CAAe;;;;wCACW,CAAgB;;6CACE,CAAqB;;uCAC5D,CAAe;;2CACb,EAAiB;;;;qCAC3B,EAAa;;;;;;;;KAMR,SAAS;aAAT,SAAS;;YAAT,SAAS;;;2BAAT,SAAS;;gCAAT,SAAS;;UAgI5B,KAAK,GAAG;;AAEN,eAAQ,EAAE,KAAK;;;AAGf,cAAO,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;;;AAGxD,mBAAY,EAAE,KAAK;MACpB;;UASD,WAAW,GAAG,UAAC,CAAC,EAAE,SAAS,EAAK;AAC9B,kCAAI,4BAA4B,EAAE,SAAS,CAAC,QAAQ,CAAC,CAAC;;;AAGtD,WAAI,WAAW,GAAG,MAAK,KAAK,CAAC,OAAO,CAAC,CAAC,EAAE,uCAAoB,SAAS,CAAC,CAAC,CAAC;;AAExE,WAAI,WAAW,KAAK,KAAK,EAAE,OAAO,KAAK,CAAC;;AAExC,aAAK,QAAQ,CAAC;AACZ,iBAAQ,EAAE,IAAI;QACf,CAAC,CAAC;MACJ;;UAED,MAAM,GAAG,UAAC,CAAC,EAAE,SAAS,EAAK;AACzB,WAAI,CAAC,MAAK,KAAK,CAAC,QAAQ,EAAE,OAAO,KAAK,CAAC;AACvC,kCAAI,uBAAuB,EAAE,SAAS,CAAC,QAAQ,CAAC,CAAC;;;AAGjD,WAAI,YAAY,GAAG,MAAK,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,uCAAoB,SAAS,CAAC,CAAC,CAAC;AACxE,WAAI,YAAY,KAAK,KAAK,EAAE,OAAO,KAAK,CAAC;;AAEzC,WAAI,QAAQ,GAAG;AACb,gBAAO,EAAE,MAAK,KAAK,CAAC,OAAO,GAAG,SAAS,CAAC,QAAQ,CAAC,MAAM;AACvD,gBAAO,EAAE,MAAK,KAAK,CAAC,OAAO,GAAG,SAAS,CAAC,QAAQ,CAAC,MAAM;QACxD,CAAC;;;AAGF,WAAI,KAAK,CAAC,OAAO,CAAC,MAAK,KAAK,CAAC,IAAI,CAAC,EAAE;AAClC,iBAAQ,CAAC,KAAK,GAAG,CAAC,MAAK,KAAK,CAAC,KAAK,IAAI,QAAQ,CAAC,OAAO,IAAI,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC;AACpF,iBAAQ,CAAC,KAAK,GAAG,CAAC,MAAK,KAAK,CAAC,KAAK,IAAI,QAAQ,CAAC,OAAO,IAAI,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC;;;;2BAG7C,kCAAW,MAAK,KAAK,CAAC,IAAI,EAAE,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,KAAK,CAAC;;;;AAAjG,iBAAQ,CAAC,OAAO;AAAE,iBAAQ,CAAC,OAAO;QACpC;;;AAGD,WAAI,MAAK,KAAK,CAAC,MAAM,EAAE;iCACkB,+CAAuB,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,OAAO,CAAC;;;;AAAhG,iBAAQ,CAAC,OAAO;AAAE,iBAAQ,CAAC,OAAO;QACpC;;AAED,aAAK,QAAQ,CAAC,QAAQ,CAAC,CAAC;MACzB;;UAED,UAAU,GAAG,UAAC,CAAC,EAAE,SAAS,EAAK;AAC7B,WAAI,CAAC,MAAK,KAAK,CAAC,QAAQ,EAAE,OAAO,KAAK,CAAC;;;AAGvC,WAAI,UAAU,GAAG,MAAK,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,uCAAoB,SAAS,CAAC,CAAC,CAAC;AACtE,WAAI,UAAU,KAAK,KAAK,EAAE,OAAO,KAAK,CAAC;;AAEvC,kCAAI,2BAA2B,EAAE,SAAS,CAAC,QAAQ,CAAC,CAAC;;AAErD,aAAK,QAAQ,CAAC;AACZ,iBAAQ,EAAE,KAAK;QAChB,CAAC,CAAC;MACJ;;;gBAzMkB,SAAS;;YA2IX,6BAAG;;AAElB,WAAG,sBAAS,WAAW,CAAC,IAAI,CAAC,YAAY,UAAU,EAAE;AACnD,aAAI,CAAC,QAAQ,CAAC,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC;QACvC;MACF;;;YA2DK,kBAAG;AACP,WAAI,KAAK;WAAE,YAAY,GAAG,IAAI,CAAC;;;;;AAK/B,YAAK,GAAG,kCAAgB;;AAEtB,UAAC,EAAE,gCAAS,IAAI,CAAC,GACf,IAAI,CAAC,KAAK,CAAC,OAAO,GAClB,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;;;AAGpB,UAAC,EAAE,gCAAS,IAAI,CAAC,GACf,IAAI,CAAC,KAAK,CAAC,OAAO,GAClB,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACrB,EAAE,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;;;AAG5B,WAAI,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE;AAC3B,qBAAY,GAAG,KAAK,CAAC;AACrB,cAAK,GAAG,EAAE,CAAC;QACZ;;;AAGD,WAAI,IAAI,CAAC,KAAK,CAAC,QAAQ,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE;AACpD,cAAK,CAAC,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;QAClC;;;AAGD,WAAI,SAAS,GAAG,6BAAY,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,SAAS,IAAI,EAAE,EAAG,iBAAiB,EAAE;AACzF,mCAA0B,EAAE,IAAI,CAAC,KAAK,CAAC,QAAQ;AAC/C,kCAAyB,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO;QAC9C,CAAC,CAAC;;;;AAIH,cACE;;sBAAmB,IAAI,CAAC,KAAK,IAAE,OAAO,EAAE,IAAI,CAAC,WAAY,EAAC,MAAM,EAAE,IAAI,CAAC,MAAO,EAAC,MAAM,EAAE,IAAI,CAAC,UAAW;SACpG,mBAAM,YAAY,CAAC,mBAAM,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE;AAC5D,oBAAS,EAAE,SAAS;AACpB,gBAAK,EAAE,+BAAO,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC;AACzD,oBAAS,EAAE,YAAY;UACxB,CAAC;QACY,CAChB;MACH;;;YAvPoB,WAAW;;;;YAEb,+BAAO,EAAE,EAAE,2BAAc,SAAS,EAAE;;;;;;;;;;AAUrD,WAAI,EAAE,iBAAU,KAAK,CAAC,CAAC,MAAM,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA4BzC,aAAM,EAAE,iBAAU,SAAS,CAAC,CAC1B,iBAAU,KAAK,CAAC;AACd,aAAI,EAAE,iBAAU,MAAM;AACtB,cAAK,EAAE,iBAAU,MAAM;AACvB,YAAG,EAAE,iBAAU,MAAM;AACrB,eAAM,EAAE,iBAAU,MAAM;QACzB,CAAC,EACF,iBAAU,KAAK,CAAC,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC,CACnC,CAAC;;;;;;;;;;;;;;;;;;;AAmBF,WAAI,EAAE,iBAAU,OAAO,CAAC,iBAAU,MAAM,CAAC;;;;;;;;;;;;;;;;;;;AAmBzC,YAAK,EAAE,iBAAU,KAAK,CAAC;AACrB,UAAC,EAAE,iBAAU,MAAM;AACnB,UAAC,EAAE,iBAAU,MAAM;QACpB,CAAC;;;;;;;;;;;;;;;;;;;AAmBF,aAAM,EAAE,iBAAU,MAAM;;;;;AAKxB,gBAAS,uBAAW;AACpB,YAAK,uBAAW;AAChB,gBAAS,uBAAW;MACrB,CAAC;;;;YAEoB,+BAAO,EAAE,EAAE,2BAAc,YAAY,EAAE;AAC3D,WAAI,EAAE,MAAM;AACZ,aAAM,EAAE,KAAK;AACb,WAAI,EAAE,IAAI;AACV,YAAK,EAAE,EAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAC;AACnB,aAAM,EAAE,GAAG;MACZ,CAAC;;;;UA9HiB,SAAS;;;sBAAT,SAAS;;;;;;;ACd9B,gD;;;;;;ACAA,gD;;;;;;ACAA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA,iBAAgB;;AAEhB;AACA;;AAEA,kBAAiB,sBAAsB;AACvC;AACA;;AAEA;;AAEA;AACA;AACA,KAAI;AACJ;AACA,KAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,GAAE;AACF;AACA;AACA;AACA,IAAG;AACH,GAAE;AACF;AACA;AACA,EAAC;;;;;;;AC/CD;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,iBAAgB,sBAAsB;AACtC;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,mBAAkB,oBAAoB;AACtC;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kCCtCkD,CAAS;;sCACjC,CAAa;;;;yCACpB,CAAe;;;;qCACb,CAAW;;;;AAEhC,KAAI,mBAAmB,GAAG,EAAE,CAAC;;AACtB,UAAS,eAAe,CAAC,EAAQ,EAAE,QAAgB,EAAE;AAC1D,OAAI,CAAC,mBAAmB,EAAE;AACxB,wBAAmB,GAAG,wBAAY,CAChC,SAAS,EACT,uBAAuB,EACvB,oBAAoB,EACpB,mBAAmB,EACnB,kBAAkB,CACnB,EAAE,UAAS,MAAM,EAAC;AACjB,cAAO,uBAAW,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;MAC/B,CAAC,CAAC;IACJ;;AAED,UAAO,EAAE,CAAC,mBAAmB,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;EACnD;;AAEM,UAAS,QAAQ,CAAC,EAAS,EAAE,KAAa,EAAE,OAAiB,EAAE;AACpE,OAAI,CAAC,EAAE,EAAE;AAAE,YAAO;IAAE;AACpB,OAAI,EAAE,CAAC,WAAW,EAAE;AAClB,OAAE,CAAC,WAAW,CAAC,IAAI,GAAG,KAAK,EAAE,OAAO,CAAC,CAAC;IACvC,MAAM,IAAI,EAAE,CAAC,gBAAgB,EAAE;AAC9B,OAAE,CAAC,gBAAgB,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;IAC3C,MAAM;AACL,OAAE,CAAC,IAAI,GAAG,KAAK,CAAC,GAAG,OAAO,CAAC;IAC5B;EACF;;AAEM,UAAS,WAAW,CAAC,EAAS,EAAE,KAAa,EAAE,OAAiB,EAAE;AACvE,OAAI,CAAC,EAAE,EAAE;AAAE,YAAO;IAAE;AACpB,OAAI,EAAE,CAAC,WAAW,EAAE;AAClB,OAAE,CAAC,WAAW,CAAC,IAAI,GAAG,KAAK,EAAE,OAAO,CAAC,CAAC;IACvC,MAAM,IAAI,EAAE,CAAC,mBAAmB,EAAE;AACjC,OAAE,CAAC,mBAAmB,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;IAC9C,MAAM;AACL,OAAE,CAAC,IAAI,GAAG,KAAK,CAAC,GAAG,IAAI,CAAC;IACzB;EACF;;AAEM,UAAS,WAAW,CAAC,IAAU,EAAE;;;AAGtC,OAAI,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC;AAC/B,OAAI,aAAa,GAAG,MAAM,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC;AAClD,SAAM,IAAI,gBAAI,aAAa,CAAC,cAAc,CAAC,CAAC;AAC5C,SAAM,IAAI,gBAAI,aAAa,CAAC,iBAAiB,CAAC,CAAC;AAC/C,UAAO,MAAM,CAAC;EACf;;AAEM,UAAS,UAAU,CAAC,IAAU,EAAE;;;AAGrC,OAAI,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC;AAC7B,OAAI,aAAa,GAAG,MAAM,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC;AAClD,QAAK,IAAI,gBAAI,aAAa,CAAC,eAAe,CAAC,CAAC;AAC5C,QAAK,IAAI,gBAAI,aAAa,CAAC,gBAAgB,CAAC,CAAC;AAC7C,UAAO,KAAK,CAAC;EACd;;AACM,UAAS,WAAW,CAAC,IAAU,EAAE;AACtC,OAAI,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC;AAC/B,OAAI,aAAa,GAAG,MAAM,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC;AAClD,SAAM,IAAI,gBAAI,aAAa,CAAC,UAAU,CAAC,CAAC;AACxC,SAAM,IAAI,gBAAI,aAAa,CAAC,aAAa,CAAC,CAAC;AAC3C,UAAO,MAAM,CAAC;EACf;;AAEM,UAAS,UAAU,CAAC,IAAU,EAAE;AACrC,OAAI,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC;AAC7B,OAAI,aAAa,GAAG,MAAM,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC;AAClD,QAAK,IAAI,gBAAI,aAAa,CAAC,WAAW,CAAC,CAAC;AACxC,QAAK,IAAI,gBAAI,aAAa,CAAC,YAAY,CAAC,CAAC;AACzC,UAAO,KAAK,CAAC;EACd;;AAEM,UAAS,eAAe,CAAC,QAAgB,EAAE,KAAe,EAAE;AACjE,OAAI,KAAK,EAAE,OAAO,kBAAkB,CAAC,QAAQ,CAAC,CAAC;AAC/C,UAAO,kBAAkB,CAAC,QAAQ,CAAC,CAAC;EACrC;;AAEM,UAAS,kBAAkB,CAAC,IAA8B;OAA7B,CAAC,GAAF,IAA8B,CAA7B,CAAC;OAAE,CAAC,GAAL,IAA8B,CAA1B,CAAC;uBAA2B;;AAEjE,SAAI,GAAG,GAAG,EAAC,SAAS,EAAE,YAAY,GAAG,CAAC,GAAG,KAAK,GAAG,CAAC,GAAG,KAAK,EAAC,CAAC;;AAE5D,iCAAmB;AACjB,UAAG,CAAC,yBAAgB,WAAW,CAAC,GAAG,GAAG,CAAC,SAAS,CAAC;MAClD;AACD,YAAO,GAAG,CAAC;IACZ;EAAA;;AAEM,UAAS,kBAAkB,CAAC,KAA8B;OAA7B,CAAC,GAAF,KAA8B,CAA7B,CAAC;OAAE,CAAC,GAAL,KAA8B,CAA1B,CAAC;uBAA2B;AACjE,YAAO,YAAY,GAAG,CAAC,GAAG,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC;IACzC;EAAA;;;;;AAKD,KAAI,eAAe,GAAG,qBAAqB,CAAC;AAC5C,6BAAmB;AACjB,kBAAe,IAAI,GAAG,GAAG,uBAAc,WAAW,EAAE,GAAG,qBAAqB,CAAC;EAC9E;;AAEM,UAAS,mBAAmB,GAAG;AACpC,OAAI,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;AACtD,WAAQ,CAAC,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,KAAK,GAAG,eAAe,CAAC,CAAC;EAC9D;;AAEM,UAAS,sBAAsB,GAAG;AACvC,OAAI,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;AACtD,WAAQ,CAAC,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,eAAe,EAAE,EAAE,CAAC,CAAC,CAAC;EACzE;;AAEM,UAAS,UAAU,GAAkB;OAAjB,UAAU,yDAAG,EAAE;;;;AAGxC,OAAI,UAAU,GAAG;AACf,gBAAW,EAAE,MAAM;IACpB,CAAC;;AAEF,UAAO,+BAAO,UAAU,EAAE,UAAU,CAAC,CAAC;EACvC;;;;AAGM,UAAS,eAAe,CAAC,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE;;AAE3D,OAAI,KAAK,GAAG,SAAS,CAAC,aAAa,IAAI,SAAS,CAAC,KAAK,CAAC;AACvD,OAAI,OAAO,GAAG,CAAC,kBAAM,KAAK,CAAC,KAAK,CAAC,CAAC;;AAElC,UAAO;AACL,SAAI,EAAE,sBAAS,WAAW,CAAC,SAAS,CAAC;AACrC,aAAQ,EAAE,OAAO;;AAEf;AACE,aAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC;AACpB,YAAK,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO;AAC9B,cAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO;MACnC;;AAED;AACE,aAAM,EAAE,OAAO,GAAG,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,GAAG,KAAK,CAAC,KAAK;AAC5D,YAAK,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK;AACtC,cAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO;MACnC;IACJ,CAAC;EACH;;;;AAGM,UAAS,aAAa,CAAC,SAAS,EAAE,SAAS,EAAE;AAClD,UAAO;AACL,SAAI,EAAE,sBAAS,WAAW,CAAC,SAAS,CAAC;AACrC,aAAQ,EAAE;AACR,UAAG,EAAE,SAAS,CAAC,QAAQ,CAAC,OAAO;AAC/B,WAAI,EAAE,SAAS,CAAC,QAAQ,CAAC,OAAO;MACjC;AACD,WAAM,EAAE,SAAS,CAAC,QAAQ,CAAC,MAAM;AACjC,WAAM,EAAE,SAAS,CAAC,QAAQ,CAAC,MAAM;IAClC,CAAC;;;;;;;;;;;;;;;;;;;AC/JG,UAAS,WAAW,CAAC,KAAK,EAAE,QAAQ,EAAE;AAC3C,QAAK,IAAI,CAAC,GAAG,CAAC,EAAE,OAAM,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,GAAG,OAAM,EAAE,CAAC,EAAE,EAAE;AACtD,SAAI,QAAQ,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC;IACrE;EACF;;AAEM,UAAS,UAAU,CAAC,IAAI,EAAE;AAC/B,UAAO,OAAO,IAAI,KAAK,UAAU,IAAI,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,mBAAmB,CAAC;EACnG;;AAEM,UAAS,KAAK,CAAC,GAAG,EAAE;AACzB,UAAO,OAAO,GAAG,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;EAC/C;;AAEM,UAAS,GAAG,CAAC,CAAC,EAAE;AACrB,UAAO,QAAQ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;EACxB;;AAEM,UAAS,SAAS,CAAC,KAAK,EAAE,QAAQ,EAAE,aAAa,EAAE;AACxD,OAAI,KAAK,CAAC,QAAQ,CAAC,EAAE;AACnB,WAAM,IAAI,KAAK,mBAAiB,QAAQ,mBAAc,aAAa,8CAA2C,CAAC;IAChH;;;;;;;;;;;;;sBCtBY,CAAC,YAAW;AACzB,OAAI,OAAO,MAAM,KAAK,WAAW,EAAE,OAAO,EAAE,CAAC;;AAE7C,OAAI,MAAM,GAAG,MAAM,CAAC,gBAAgB,CAAC,QAAQ,CAAC,eAAe,EAAE,EAAE,CAAC;OAClE,GAAG,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,KAAK,CACrB,IAAI,CAAC,MAAM,CAAC,CACZ,IAAI,CAAC,EAAE,CAAC,CACR,KAAK,CAAC,mBAAmB,CAAC,IAAK,MAAM,CAAC,KAAK,KAAK,EAAE,IAAI,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC,CACjE,CAAC,CAAC,CAAC;;AAET,OAAI,GAAG,KAAK,IAAI,EAAE,OAAO,GAAG,CAAC;AAC7B,OAAI,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,IAAI,EAAE,OAAO,EAAE,CAAC;AACjD,UAAO,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;EACrD,GAAG;;;;;;;;;;;;;;;;;;;;;kCCbqB,CAAS;;qCACb,CAAW;;;;mCAC+B,CAAU;;AAElE,UAAS,gBAAgB,CAAC,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE;;AAE5D,OAAI,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,EAAE,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;;AAEvD,OAAI,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;AAChE,OAAI,IAAI,GAAG,sBAAS,WAAW,CAAC,SAAS,CAAC,CAAC;AAC3C,OAAI,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC;;AAE7B,OAAI,MAAM,KAAK,QAAQ,EAAE;AACvB,SAAI,SAAS,GAAG,MAAM,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC;AAC9C,SAAI,WAAW,GAAG,MAAM,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC;;AAElD,WAAM,GAAG;AACP,WAAI,EAAE,CAAC,IAAI,CAAC,UAAU,GAAG,gBAAI,WAAW,CAAC,WAAW,CAAC,GAC/C,gBAAI,SAAS,CAAC,eAAe,CAAC,GAAG,gBAAI,SAAS,CAAC,UAAU,CAAC;AAChE,UAAG,EAAE,CAAC,IAAI,CAAC,SAAS,GAAG,gBAAI,WAAW,CAAC,UAAU,CAAC,GAC5C,gBAAI,SAAS,CAAC,cAAc,CAAC,GAAG,gBAAI,SAAS,CAAC,SAAS,CAAC;AAC9D,YAAK,EAAE,wBAAW,MAAM,CAAC,GAAG,wBAAW,IAAI,CAAC,GAAG,IAAI,CAAC,UAAU;AAC9D,aAAM,EAAE,yBAAY,MAAM,CAAC,GAAG,yBAAY,IAAI,CAAC,GAAG,IAAI,CAAC,SAAS;MACjE,CAAC;IACH;;;AAGD,OAAI,kBAAM,MAAM,CAAC,KAAK,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;AACnE,OAAI,kBAAM,MAAM,CAAC,MAAM,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;;;AAGrE,OAAI,kBAAM,MAAM,CAAC,IAAI,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;AACjE,OAAI,kBAAM,MAAM,CAAC,GAAG,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC;;AAE/D,UAAO,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;EAC3B;;AAEM,UAAS,UAAU,CAAC,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE;AACnD,OAAI,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;AACjD,OAAI,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;AACjD,UAAO,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;EACf;;AAEM,UAAS,QAAQ,CAAC,SAAS,EAAE;AAClC,UAAO,SAAS,CAAC,KAAK,CAAC,IAAI,KAAK,MAAM,IAAI,SAAS,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC;EACxE;;AAEM,UAAS,QAAQ,CAAC,SAAS,EAAE;AAClC,UAAO,SAAS,CAAC,KAAK,CAAC,IAAI,KAAK,MAAM,IAAI,SAAS,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC;EACxE;;;;AAGM,UAAS,kBAAkB,CAAC,CAAC,EAAE;AACpC,OAAI,QAAQ,GAAI,CAAC,CAAC,aAAa,IAAI,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,IAAK,CAAC,CAAC;AAC5D,UAAO;AACL,YAAO,EAAE,QAAQ,CAAC,OAAO;AACzB,YAAO,EAAE,QAAQ,CAAC,OAAO;IAC1B,CAAC;;;;;;;;;;;;;;;;;;;;;;;kCCzDsC,CAAO;;;;wCAEA,CAAgB;;6CAChC,CAAqB;;uCAC9B,CAAe;;qCACvB,EAAa;;;;;AAG7B,KAAI,SAAS,GAAG;AACd,QAAK,EAAE;AACL,UAAK,EAAE,YAAY;AACnB,SAAI,EAAE,WAAW;AACjB,SAAI,EAAE,UAAU;IACjB;AACD,QAAK,EAAE;AACL,UAAK,EAAE,WAAW;AAClB,SAAI,EAAE,WAAW;AACjB,SAAI,EAAE,SAAS;IAChB;EACF,CAAC;;;AAGF,KAAI,YAAY,GAAG,SAAS,CAAC,KAAK,CAAC;;;;;;;;;KASd,aAAa;aAAb,aAAa;;YAAb,aAAa;;;2BAAb,aAAa;;gCAAb,aAAa;;UAoKhC,KAAK,GAAG;AACN,eAAQ,EAAE,KAAK;;AAEf,YAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI;MACzB;;UAYD,eAAe,GAAG,UAAC,CAAC,EAAK;;AAEvB,aAAK,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;;;AAG1B,WAAI,MAAK,KAAK,CAAC,QAAQ,IACpB,MAAK,KAAK,CAAC,MAAM,IAAI,CAAC,kCAAgB,CAAC,CAAC,MAAM,EAAE,MAAK,KAAK,CAAC,MAAM,CAAE,IACnE,MAAK,KAAK,CAAC,MAAM,IAAI,kCAAgB,CAAC,CAAC,MAAM,EAAE,MAAK,KAAK,CAAC,MAAM,CAAE,EAAE;AACrE,gBAAO;QACR;;;;;AAKD,WAAI,CAAC,CAAC,aAAa,EAAC;AAClB,eAAK,QAAQ,CAAC,EAAC,eAAe,EAAE,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,UAAU,EAAC,CAAC,CAAC;QACjE;;;;AAID,8CAAqB,CAAC;;;;iCAGG,0CAAmB,CAAC,CAAC;;WAAzC,OAAO,uBAAP,OAAO;WAAE,OAAO,uBAAP,OAAO;;;AAGrB,WAAI,SAAS,GAAG,yCAAsB,OAAO,EAAE,OAAO,CAAC,CAAC;;AAExD,kCAAI,oCAAoC,EAAE,SAAS,CAAC,QAAQ,CAAC,CAAC;;;AAG9D,kCAAI,SAAS,EAAE,MAAK,KAAK,CAAC,OAAO,CAAC,CAAC;AACnC,WAAI,YAAY,GAAG,MAAK,KAAK,CAAC,OAAO,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;AACpD,WAAI,YAAY,KAAK,KAAK,EAAE,OAAO;;;;;AAMnC,aAAK,QAAQ,CAAC;AACZ,iBAAQ,EAAE,IAAI;;AAEd,cAAK,EAAE,OAAO;AACd,cAAK,EAAE,OAAO;;AAEd,gBAAO,EAAE,QAAQ,CAAC,IAAI,CAAC,UAAU;AACjC,gBAAO,EAAE,QAAQ,CAAC,IAAI,CAAC,SAAS;QACjC,CAAC,CAAC;;;AAGH,kCAAS,QAAQ,EAAE,QAAQ,EAAE,MAAK,YAAY,CAAC,CAAC;;;;AAIhD,kCAAS,QAAQ,EAAE,YAAY,CAAC,IAAI,EAAE,MAAK,UAAU,CAAC,CAAC;AACvD,kCAAS,QAAQ,EAAE,YAAY,CAAC,IAAI,EAAE,MAAK,cAAc,CAAC,CAAC;MAC5D;;UAED,UAAU,GAAG,UAAC,CAAC,EAAK;;AAElB,WAAI,CAAC,CAAC,aAAa,IAAK,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,UAAU,KAAK,MAAK,KAAK,CAAC,eAAgB,EAAE,OAAO;;kCAErE,0CAAmB,CAAC,CAAC;;WAAzC,OAAO,wBAAP,OAAO;WAAE,OAAO,wBAAP,OAAO;;AAErB,WAAI,SAAS,GAAG,yCAAsB,OAAO,EAAE,OAAO,CAAC,CAAC;;AAExD,kCAAI,+BAA+B,EAAE,SAAS,CAAC,QAAQ,CAAC,CAAC;;;AAGzD,WAAI,YAAY,GAAG,MAAK,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;AACnD,WAAI,YAAY,KAAK,KAAK,EAAE;AAC1B,eAAK,cAAc,CAAC,EAAE,CAAC,CAAC;AACxB,gBAAO;QACR;;AAED,aAAK,QAAQ,CAAC;AACZ,cAAK,EAAE,OAAO;AACd,cAAK,EAAE,OAAO;QACf,CAAC,CAAC;MACJ;;UAED,cAAc,GAAG,UAAC,CAAC,EAAK;AACtB,WAAI,CAAC,MAAK,KAAK,CAAC,QAAQ,EAAE,OAAO;;;;AAIjC,WAAI,CAAC,CAAC,cAAc,IAAK,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,UAAU,KAAK,MAAK,KAAK,CAAC,eAAgB,EAAE,OAAO;;;AAGhG,WAAI,MAAK,KAAK,CAAC,oBAAoB,EAAE,0CAAwB,CAAC;;kCAErC,0CAAmB,CAAC,CAAC;;WAAzC,OAAO,wBAAP,OAAO;WAAE,OAAO,wBAAP,OAAO;;AACrB,WAAI,SAAS,GAAG,yCAAsB,OAAO,EAAE,OAAO,CAAC,CAAC;;AAExD,kCAAI,mCAAmC,EAAE,SAAS,CAAC,QAAQ,CAAC,CAAC;;;AAG7D,aAAK,QAAQ,CAAC;AACZ,iBAAQ,EAAE,KAAK;AACf,cAAK,EAAE,IAAI;AACX,cAAK,EAAE,IAAI;QACZ,CAAC,CAAC;;;AAGH,aAAK,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;;;AAGhC,kCAAI,kCAAkC,CAAC,CAAC;AACxC,qCAAY,QAAQ,EAAE,QAAQ,EAAE,MAAK,YAAY,CAAC,CAAC;AACnD,qCAAY,QAAQ,EAAE,YAAY,CAAC,IAAI,EAAE,MAAK,UAAU,CAAC,CAAC;AAC1D,qCAAY,QAAQ,EAAE,YAAY,CAAC,IAAI,EAAE,MAAK,cAAc,CAAC,CAAC;MAC/D;;UAID,YAAY,GAAG,YAAM;AACnB,WAAI,CAAC,GAAG,MAAK,KAAK;WAAE,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,UAAU;WAAE,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC;;;AAG9E,WAAI,SAAS,GAAG,wCAAqB,CAAC;AACtC,gBAAS,CAAC,MAAM,GAAG,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC;AACjC,gBAAS,CAAC,MAAM,GAAG,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC;;AAEjC,aAAK,QAAQ,CAAC;AACZ,cAAK,EAAE,CAAC,CAAC,KAAK,GAAG,SAAS,CAAC,MAAM;AACjC,cAAK,EAAE,CAAC,CAAC,KAAK,GAAG,SAAS,CAAC,MAAM;QAClC,CAAC,CAAC;;AAEH,aAAK,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;MAC9B;;UAGD,WAAW,GAAG,UAAC,CAAC,EAAK;;;;AAInB,WAAI,YAAY,KAAK,SAAS,CAAC,KAAK,EAAE;AACpC,gBAAO,CAAC,CAAC,cAAc,EAAE,CAAC;QAC3B;;AAED,cAAO,MAAK,eAAe,CAAC,CAAC,CAAC,CAAC;MAChC;;UAGD,YAAY,GAAG,UAAC,CAAC,EAAK;;AAEpB,mBAAY,GAAG,SAAS,CAAC,KAAK,CAAC;;AAE/B,cAAO,MAAK,eAAe,CAAC,CAAC,CAAC,CAAC;MAChC;;;gBAzUkB,aAAa;;YA0KZ,gCAAG;;;AAGrB,qCAAY,QAAQ,EAAE,SAAS,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;AAC7D,qCAAY,QAAQ,EAAE,SAAS,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;AAC7D,qCAAY,QAAQ,EAAE,SAAS,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;AACjE,qCAAY,QAAQ,EAAE,SAAS,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;AACjE,WAAI,IAAI,CAAC,KAAK,CAAC,oBAAoB,EAAE,0CAAwB,CAAC;MAC/D;;;YAyJK,kBAAG;;;AAGP,cAAO,mBAAM,YAAY,CAAC,mBAAM,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE;AAClE,cAAK,EAAE,6BAAW,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC;;;;AAIlD,oBAAW,EAAE,IAAI,CAAC,WAAW;AAC7B,qBAAY,EAAE,IAAI,CAAC,YAAY;AAC/B,kBAAS,EAAE,IAAI,CAAC,cAAc;AAC9B,mBAAU,EAAE,IAAI,CAAC,cAAc;QAChC,CAAC,CAAC;MACJ;;;YAtVoB,eAAe;;;;YAEjB;;;;;;;;;;;;;;;;;;;AAmBjB,eAAQ,EAAE,iBAAU,IAAI;;;;;;;AAOxB,2BAAoB,EAAE,iBAAU,IAAI;;;;;;;;;;;;;;;;;;;;;;AAsBpC,aAAM,EAAE,iBAAU,MAAM;;;;;;;;;;;;;;;;;;;;;;AAsBxB,aAAM,EAAE,iBAAU,MAAM;;;;;;;;;;;;;;;;;;;;;AAqBxB,cAAO,EAAE,iBAAU,IAAI;;;;;;;;;;;;;;;;;;;;;AAqBvB,aAAM,EAAE,iBAAU,IAAI;;;;;;;;;;;;;;;;;;;;AAoBtB,aAAM,EAAE,iBAAU,IAAI;;;;;;AAMtB,kBAAW,EAAE,iBAAU,IAAI;;;;;AAK3B,gBAAS,uBAAW;AACpB,YAAK,uBAAW;AAChB,gBAAS,uBAAW;MACrB;;;;YAEqB;AACpB,aAAM,EAAE,IAAI;AACZ,eAAQ,EAAE,KAAK;AACf,2BAAoB,EAAE,IAAI;AAC1B,aAAM,EAAE,IAAI;AACZ,gBAAS,EAAE,IAAI;AACf,cAAO,EAAE,mBAAU,EAAE;AACrB,aAAM,EAAE,kBAAU,EAAE;AACpB,aAAM,EAAE,kBAAU,EAAE;AACpB,kBAAW,EAAE,uBAAU,EAAE;MAC1B;;;;UAlKkB,aAAa;IAAS,mBAAM,SAAS;;sBAArC,aAAa;;;;;;;;;;;;;;;;;;;sBC/BV,GAAG;;AAAZ,UAAS,GAAG,GAAG;AAC5B,OAAI,WAA2B,EAAE,OAAO,CAAC,GAAG,OAAX,OAAO,EAAQ,SAAS,CAAC,CAAC;EAC5D","file":"./dist/react-draggable.js","sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory(require(\"react\"), require(\"react-dom\"));\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([\"react\", \"react-dom\"], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"ReactDraggable\"] = factory(require(\"react\"), require(\"react-dom\"));\n\telse\n\t\troot[\"ReactDraggable\"] = factory(root[\"React\"], root[\"ReactDOM\"]);\n})(this, function(__WEBPACK_EXTERNAL_MODULE_2__, __WEBPACK_EXTERNAL_MODULE_3__) {\nreturn \n\n\n/** WEBPACK FOOTER **\n ** webpack/universalModuleDefinition\n **/"," \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId])\n \t\t\treturn installedModules[moduleId].exports;\n\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\texports: {},\n \t\t\tid: moduleId,\n \t\t\tloaded: false\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.loaded = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(0);\n\n\n\n/** WEBPACK FOOTER **\n ** webpack/bootstrap ab255d085dc93d25cddd\n **/","module.exports = require('./lib/Draggable');\nmodule.exports.DraggableCore = require('./lib/DraggableCore');\n\n\n\n/** WEBPACK FOOTER **\n ** ./index.js\n **/","import {default as React, PropTypes} from 'react';\nimport ReactDOM from 'react-dom';\nimport classNames from 'classnames';\nimport assign from 'object-assign';\nimport {createUIEvent, createTransform} from './utils/domFns';\nimport {canDragX, canDragY, getBoundPosition, snapToGrid} from './utils/positionFns';\nimport {dontSetMe} from './utils/shims';\nimport DraggableCore from './DraggableCore';\nimport log from './utils/log';\n\n//\n// Define \n//\n\nexport default class Draggable extends DraggableCore {\n\n static displayName = 'Draggable';\n\n static propTypes = assign({}, DraggableCore.propTypes, {\n /**\n * `axis` determines which axis the draggable can move.\n *\n * 'both' allows movement horizontally and vertically.\n * 'x' limits movement to horizontal axis.\n * 'y' limits movement to vertical axis.\n *\n * Defaults to 'both'.\n */\n axis: PropTypes.oneOf(['both', 'x', 'y']),\n\n /**\n * `bounds` determines the range of movement available to the element.\n * Available values are:\n *\n * 'parent' restricts movement within the Draggable's parent node.\n *\n * Alternatively, pass an object with the following properties, all of which are optional:\n *\n * {left: LEFT_BOUND, right: RIGHT_BOUND, bottom: BOTTOM_BOUND, top: TOP_BOUND}\n *\n * All values are in px.\n *\n * Example:\n *\n * ```jsx\n * let App = React.createClass({\n * render: function () {\n * return (\n * \n *
Content
\n *
\n * );\n * }\n * });\n * ```\n */\n bounds: PropTypes.oneOfType([\n PropTypes.shape({\n left: PropTypes.Number,\n right: PropTypes.Number,\n top: PropTypes.Number,\n bottom: PropTypes.Number\n }),\n PropTypes.oneOf(['parent', false])\n ]),\n\n /**\n * `grid` specifies the x and y that dragging should snap to.\n *\n * Example:\n *\n * ```jsx\n * let App = React.createClass({\n * render: function () {\n * return (\n * \n *
I snap to a 25 x 25 grid
\n *
\n * );\n * }\n * });\n * ```\n */\n grid: PropTypes.arrayOf(PropTypes.number),\n\n /**\n * `start` specifies the x and y that the dragged item should start at\n *\n * Example:\n *\n * ```jsx\n * let App = React.createClass({\n * render: function () {\n * return (\n * \n *
I start with transformX: 25px and transformY: 25px;
\n *
\n * );\n * }\n * });\n * ```\n */\n start: PropTypes.shape({\n x: PropTypes.number,\n y: PropTypes.number\n }),\n\n /**\n * `zIndex` specifies the zIndex to use while dragging.\n *\n * Example:\n *\n * ```jsx\n * let App = React.createClass({\n * render: function () {\n * return (\n * \n *
I have a zIndex
\n *
\n * );\n * }\n * });\n * ```\n */\n zIndex: PropTypes.number,\n\n /**\n * These properties should be defined on the child, not here.\n */\n className: dontSetMe,\n style: dontSetMe,\n transform: dontSetMe\n });\n\n static defaultProps = assign({}, DraggableCore.defaultProps, {\n axis: 'both',\n bounds: false,\n grid: null,\n start: {x: 0, y: 0},\n zIndex: NaN\n });\n\n state = {\n // Whether or not we are currently dragging.\n dragging: false,\n\n // Current transform x and y.\n clientX: this.props.start.x, clientY: this.props.start.y,\n\n // Can only determine if SVG after mounting\n isElementSVG: false\n };\n\n componentDidMount() {\n // Check to see if the element passed is an instanceof SVGElement\n if(ReactDOM.findDOMNode(this) instanceof SVGElement) {\n this.setState({ isElementSVG: true });\n }\n }\n\n onDragStart = (e, coreEvent) => {\n log('Draggable: onDragStart: %j', coreEvent.position);\n\n // Short-circuit if user's callback killed it.\n let shouldStart = this.props.onStart(e, createUIEvent(this, coreEvent));\n // Kills start event on core as well, so move handlers are never bound.\n if (shouldStart === false) return false;\n\n this.setState({\n dragging: true\n });\n };\n\n onDrag = (e, coreEvent) => {\n if (!this.state.dragging) return false;\n log('Draggable: onDrag: %j', coreEvent.position);\n\n // Short-circuit if user's callback killed it.\n let shouldUpdate = this.props.onDrag(e, createUIEvent(this, coreEvent));\n if (shouldUpdate === false) return false;\n\n let newState = {\n clientX: this.state.clientX + coreEvent.position.deltaX,\n clientY: this.state.clientY + coreEvent.position.deltaY\n };\n\n // Snap to grid if prop has been provided\n if (Array.isArray(this.props.grid)) {\n newState.lastX = (this.state.lastX || newState.clientX) + coreEvent.position.deltaX;\n newState.lastY = (this.state.lastY || newState.clientY) + coreEvent.position.deltaY;\n // Eslint bug, it thinks newState.clientY is undefined\n /*eslint no-undef:0*/\n [newState.clientX, newState.clientY] = snapToGrid(this.props.grid, newState.lastX, newState.lastY);\n }\n\n // Keep within bounds.\n if (this.props.bounds) {\n [newState.clientX, newState.clientY] = getBoundPosition(this, newState.clientX, newState.clientY);\n }\n\n this.setState(newState);\n };\n\n onDragStop = (e, coreEvent) => {\n if (!this.state.dragging) return false;\n\n // Short-circuit if user's callback killed it.\n let shouldStop = this.props.onStop(e, createUIEvent(this, coreEvent));\n if (shouldStop === false) return false;\n\n log('Draggable: onDragStop: %j', coreEvent.position);\n\n this.setState({\n dragging: false\n });\n };\n\n render() {\n let style, svgTransform = null;\n // Add a CSS transform to move the element around. This allows us to move the element around\n // without worrying about whether or not it is relatively or absolutely positioned.\n // If the item you are dragging already has a transform set, wrap it in a so \n // has a clean slate.\n style = createTransform({\n // Set left if horizontal drag is enabled\n x: canDragX(this) ?\n this.state.clientX :\n this.props.start.x,\n\n // Set top if vertical drag is enabled\n y: canDragY(this) ?\n this.state.clientY :\n this.props.start.y\n }, this.state.isElementSVG);\n\n // If this element was SVG, we use the `transform` attribute.\n if (this.state.isElementSVG) {\n svgTransform = style;\n style = {};\n }\n\n // zIndex option\n if (this.state.dragging && !isNaN(this.props.zIndex)) {\n style.zIndex = this.props.zIndex;\n }\n\n // Mark with class while dragging\n let className = classNames((this.props.children.props.className || ''), 'react-draggable', {\n 'react-draggable-dragging': this.state.dragging,\n 'react-draggable-dragged': this.state.dragged\n });\n\n // Reuse the child provided\n // This makes it flexible to use whatever element is wanted (div, ul, etc)\n return (\n \n {React.cloneElement(React.Children.only(this.props.children), {\n className: className,\n style: assign({}, this.props.children.props.style, style),\n transform: svgTransform\n })}\n \n );\n }\n}\n\n\n\n/** WEBPACK FOOTER **\n ** ./lib/Draggable.es6\n **/","module.exports = __WEBPACK_EXTERNAL_MODULE_2__;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** external {\"commonjs\":\"react\",\"commonjs2\":\"react\",\"amd\":\"react\",\"root\":\"React\"}\n ** module id = 2\n ** module chunks = 0\n **/","module.exports = __WEBPACK_EXTERNAL_MODULE_3__;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** external {\"commonjs\":\"react-dom\",\"commonjs2\":\"react-dom\",\"amd\":\"react-dom\",\"root\":\"ReactDOM\"}\n ** module id = 3\n ** module chunks = 0\n **/","/*!\n Copyright (c) 2015 Jed Watson.\n Licensed under the MIT License (MIT), see\n http://jedwatson.github.io/classnames\n*/\n/* global define */\n\n(function () {\n\t'use strict';\n\n\tvar hasOwn = {}.hasOwnProperty;\n\n\tfunction classNames () {\n\t\tvar classes = '';\n\n\t\tfor (var i = 0; i < arguments.length; i++) {\n\t\t\tvar arg = arguments[i];\n\t\t\tif (!arg) continue;\n\n\t\t\tvar argType = typeof arg;\n\n\t\t\tif (argType === 'string' || argType === 'number') {\n\t\t\t\tclasses += ' ' + arg;\n\t\t\t} else if (Array.isArray(arg)) {\n\t\t\t\tclasses += ' ' + classNames.apply(null, arg);\n\t\t\t} else if (argType === 'object') {\n\t\t\t\tfor (var key in arg) {\n\t\t\t\t\tif (hasOwn.call(arg, key) && arg[key]) {\n\t\t\t\t\t\tclasses += ' ' + key;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn classes.substr(1);\n\t}\n\n\tif (typeof module !== 'undefined' && module.exports) {\n\t\tmodule.exports = classNames;\n\t} else if (typeof define === 'function' && typeof define.amd === 'object' && define.amd) {\n\t\t// register as 'classnames', consistent with npm package name\n\t\tdefine('classnames', function () {\n\t\t\treturn classNames;\n\t\t});\n\t} else {\n\t\twindow.classNames = classNames;\n\t}\n}());\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/classnames/index.js\n ** module id = 4\n ** module chunks = 0\n **/","/* eslint-disable no-unused-vars */\n'use strict';\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\nvar propIsEnumerable = Object.prototype.propertyIsEnumerable;\n\nfunction toObject(val) {\n\tif (val === null || val === undefined) {\n\t\tthrow new TypeError('Object.assign cannot be called with null or undefined');\n\t}\n\n\treturn Object(val);\n}\n\nmodule.exports = Object.assign || function (target, source) {\n\tvar from;\n\tvar to = toObject(target);\n\tvar symbols;\n\n\tfor (var s = 1; s < arguments.length; s++) {\n\t\tfrom = Object(arguments[s]);\n\n\t\tfor (var key in from) {\n\t\t\tif (hasOwnProperty.call(from, key)) {\n\t\t\t\tto[key] = from[key];\n\t\t\t}\n\t\t}\n\n\t\tif (Object.getOwnPropertySymbols) {\n\t\t\tsymbols = Object.getOwnPropertySymbols(from);\n\t\t\tfor (var i = 0; i < symbols.length; i++) {\n\t\t\t\tif (propIsEnumerable.call(from, symbols[i])) {\n\t\t\t\t\tto[symbols[i]] = from[symbols[i]];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn to;\n};\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/object-assign/index.js\n ** module id = 5\n ** module chunks = 0\n **/","import {findInArray, isFunction, isNum, int} from './shims';\nimport browserPrefix from './getPrefix';\nimport assign from 'object-assign';\nimport ReactDOM from 'react-dom';\n\nlet matchesSelectorFunc = '';\nexport function matchesSelector(el: Node, selector: string) {\n if (!matchesSelectorFunc) {\n matchesSelectorFunc = findInArray([\n 'matches',\n 'webkitMatchesSelector',\n 'mozMatchesSelector',\n 'msMatchesSelector',\n 'oMatchesSelector'\n ], function(method){\n return isFunction(el[method]);\n });\n }\n\n return el[matchesSelectorFunc].call(el, selector);\n}\n\nexport function addEvent(el: ?Node, event: string, handler: Function) {\n if (!el) { return; }\n if (el.attachEvent) {\n el.attachEvent('on' + event, handler);\n } else if (el.addEventListener) {\n el.addEventListener(event, handler, true);\n } else {\n el['on' + event] = handler;\n }\n}\n\nexport function removeEvent(el: ?Node, event: string, handler: Function) {\n if (!el) { return; }\n if (el.detachEvent) {\n el.detachEvent('on' + event, handler);\n } else if (el.removeEventListener) {\n el.removeEventListener(event, handler, true);\n } else {\n el['on' + event] = null;\n }\n}\n\nexport function outerHeight(node: Node) {\n // This is deliberately excluding margin for our calculations, since we are using\n // offsetTop which is including margin. See getBoundPosition\n let height = node.clientHeight;\n let computedStyle = window.getComputedStyle(node);\n height += int(computedStyle.borderTopWidth);\n height += int(computedStyle.borderBottomWidth);\n return height;\n}\n\nexport function outerWidth(node: Node) {\n // This is deliberately excluding margin for our calculations, since we are using\n // offsetLeft which is including margin. See getBoundPosition\n let width = node.clientWidth;\n let computedStyle = window.getComputedStyle(node);\n width += int(computedStyle.borderLeftWidth);\n width += int(computedStyle.borderRightWidth);\n return width;\n}\nexport function innerHeight(node: Node) {\n let height = node.clientHeight;\n let computedStyle = window.getComputedStyle(node);\n height -= int(computedStyle.paddingTop);\n height -= int(computedStyle.paddingBottom);\n return height;\n}\n\nexport function innerWidth(node: Node) {\n let width = node.clientWidth;\n let computedStyle = window.getComputedStyle(node);\n width -= int(computedStyle.paddingLeft);\n width -= int(computedStyle.paddingRight);\n return width;\n}\n\nexport function createTransform(position: Object, isSVG: ?boolean) {\n if (isSVG) return createSVGTransform(position);\n return createCSSTransform(position);\n}\n\nexport function createCSSTransform({x, y}: {x: number, y: number}) {\n // Replace unitless items with px\n let out = {transform: 'translate(' + x + 'px,' + y + 'px)'};\n // Add single prefixed property as well\n if (browserPrefix) {\n out[browserPrefix + 'Transform'] = out.transform;\n }\n return out;\n}\n\nexport function createSVGTransform({x, y}: {x: number, y: number}) {\n return 'translate(' + x + ',' + y + ')';\n}\n\n// User-select Hacks:\n//\n// Useful for preventing blue highlights all over everything when dragging.\nlet userSelectStyle = ';user-select: none;';\nif (browserPrefix) {\n userSelectStyle += '-' + browserPrefix.toLowerCase() + '-user-select: none;';\n}\n\nexport function addUserSelectStyles() {\n let style = document.body.getAttribute('style') || '';\n document.body.setAttribute('style', style + userSelectStyle);\n}\n\nexport function removeUserSelectStyles() {\n let style = document.body.getAttribute('style') || '';\n document.body.setAttribute('style', style.replace(userSelectStyle, ''));\n}\n\nexport function styleHacks(childStyle = {}) {\n // Workaround IE pointer events; see #51\n // https://github.com/mzabriskie/react-draggable/issues/51#issuecomment-103488278\n let touchHacks = {\n touchAction: 'none'\n };\n\n return assign(touchHacks, childStyle);\n}\n\n// Create an event exposed by \nexport function createCoreEvent(draggable, clientX, clientY) {\n // State changes are often (but not always!) async. We want the latest value.\n let state = draggable._pendingState || draggable.state;\n let isStart = !isNum(state.lastX);\n\n return {\n node: ReactDOM.findDOMNode(draggable),\n position: isStart ?\n // If this is our first move, use the clientX and clientY as last coords.\n {\n deltaX: 0, deltaY: 0,\n lastX: clientX, lastY: clientY,\n clientX: clientX, clientY: clientY\n } :\n // Otherwise calculate proper values.\n {\n deltaX: clientX - state.lastX, deltaY: clientY - state.lastY,\n lastX: state.lastX, lastY: state.lastY,\n clientX: clientX, clientY: clientY\n }\n };\n}\n\n// Create an event exposed by \nexport function createUIEvent(draggable, coreEvent) {\n return {\n node: ReactDOM.findDOMNode(draggable),\n position: {\n top: coreEvent.position.clientY,\n left: coreEvent.position.clientX\n },\n deltaX: coreEvent.position.deltaX,\n deltaY: coreEvent.position.deltaY\n };\n}\n\n\n\n/** WEBPACK FOOTER **\n ** ./lib/utils/domFns.es6\n **/","// @credits https://gist.github.com/rogozhnikoff/a43cfed27c41e4e68cdc\nexport function findInArray(array, callback) {\n for (let i = 0, length = array.length; i < length; i++) {\n if (callback.apply(callback, [array[i], i, array])) return array[i];\n }\n}\n\nexport function isFunction(func) {\n return typeof func === 'function' || Object.prototype.toString.call(func) === '[object Function]';\n}\n\nexport function isNum(num) {\n return typeof num === 'number' && !isNaN(num);\n}\n\nexport function int(a) {\n return parseInt(a, 10);\n}\n\nexport function dontSetMe(props, propName, componentName) {\n if (props[propName]) {\n throw new Error(`Invalid prop ${propName} passed to ${componentName} - do not set this, set it on the child.`);\n }\n}\n\n\n\n/** WEBPACK FOOTER **\n ** ./lib/utils/shims.es6\n **/","export default (function() {\n if (typeof window === 'undefined') return '';\n // Thanks David Walsh\n let styles = window.getComputedStyle(document.documentElement, ''),\n pre = (Array.prototype.slice\n .call(styles)\n .join('')\n .match(/-(moz|webkit|ms)-/) || (styles.OLink === '' && ['', 'o'])\n )[1];\n // 'ms' is not titlecased\n if (pre === 'ms') return pre;\n if (pre === undefined || pre === null) return '';\n return pre.slice(0, 1).toUpperCase() + pre.slice(1);\n})();\n\n\n\n/** WEBPACK FOOTER **\n ** ./lib/utils/getPrefix.es6\n **/","import {isNum, int} from './shims';\nimport ReactDOM from 'react-dom';\nimport {innerWidth, innerHeight, outerWidth, outerHeight} from './domFns';\n\nexport function getBoundPosition(draggable, clientX, clientY) {\n // If no bounds, short-circuit and move on\n if (!draggable.props.bounds) return [clientX, clientY];\n\n let bounds = JSON.parse(JSON.stringify(draggable.props.bounds));\n let node = ReactDOM.findDOMNode(draggable);\n let parent = node.parentNode;\n\n if (bounds === 'parent') {\n let nodeStyle = window.getComputedStyle(node);\n let parentStyle = window.getComputedStyle(parent);\n // Compute bounds. This is a pain with padding and offsets but this gets it exactly right.\n bounds = {\n left: -node.offsetLeft + int(parentStyle.paddingLeft) +\n int(nodeStyle.borderLeftWidth) + int(nodeStyle.marginLeft),\n top: -node.offsetTop + int(parentStyle.paddingTop) +\n int(nodeStyle.borderTopWidth) + int(nodeStyle.marginTop),\n right: innerWidth(parent) - outerWidth(node) - node.offsetLeft,\n bottom: innerHeight(parent) - outerHeight(node) - node.offsetTop\n };\n }\n\n // Keep x and y below right and bottom limits...\n if (isNum(bounds.right)) clientX = Math.min(clientX, bounds.right);\n if (isNum(bounds.bottom)) clientY = Math.min(clientY, bounds.bottom);\n\n // But above left and top limits.\n if (isNum(bounds.left)) clientX = Math.max(clientX, bounds.left);\n if (isNum(bounds.top)) clientY = Math.max(clientY, bounds.top);\n\n return [clientX, clientY];\n}\n\nexport function snapToGrid(grid, pendingX, pendingY) {\n let x = Math.round(pendingX / grid[0]) * grid[0];\n let y = Math.round(pendingY / grid[1]) * grid[1];\n return [x, y];\n}\n\nexport function canDragX(draggable) {\n return draggable.props.axis === 'both' || draggable.props.axis === 'x';\n}\n\nexport function canDragY(draggable) {\n return draggable.props.axis === 'both' || draggable.props.axis === 'y';\n}\n\n// Get {clientX, clientY} positions from event.\nexport function getControlPosition(e) {\n let position = (e.targetTouches && e.targetTouches[0]) || e;\n return {\n clientX: position.clientX,\n clientY: position.clientY\n };\n}\n\n\n\n/** WEBPACK FOOTER **\n ** ./lib/utils/positionFns.es6\n **/","import {default as React, PropTypes} from 'react';\nimport {matchesSelector, createCoreEvent, addEvent, removeEvent, addUserSelectStyles,\n removeUserSelectStyles, styleHacks} from './utils/domFns';\nimport {getControlPosition} from './utils/positionFns';\nimport {dontSetMe} from './utils/shims';\nimport log from './utils/log';\n\n// Simple abstraction for dragging events names.\nlet eventsFor = {\n touch: {\n start: 'touchstart',\n move: 'touchmove',\n stop: 'touchend'\n },\n mouse: {\n start: 'mousedown',\n move: 'mousemove',\n stop: 'mouseup'\n }\n};\n\n// Default to mouse events.\nlet dragEventFor = eventsFor.mouse;\n\n//\n// Define .\n//\n// is for advanced usage of . It maintains minimal internal state so it can\n// work well with libraries that require more control over the element.\n//\n\nexport default class DraggableCore extends React.Component {\n\n static displayName = 'DraggableCore';\n\n static propTypes = {\n /**\n * `disabled`, if true, stops the from dragging. All handlers,\n * with the exception of `onMouseDown`, will not fire.\n *\n * Example:\n *\n * ```jsx\n * let App = React.createClass({\n * render: function () {\n * return (\n * \n *
I can't be dragged
\n *
\n * );\n * }\n * });\n * ```\n */\n disabled: PropTypes.bool,\n\n /**\n * By default, we add 'user-select:none' attributes to the document body\n * to prevent ugly text selection during drag. If this is causing problems\n * for your app, set this to `false`.\n */\n enableUserSelectHack: PropTypes.bool,\n\n /**\n * `handle` specifies a selector to be used as the handle that initiates drag.\n *\n * Example:\n *\n * ```jsx\n * let App = React.createClass({\n * render: function () {\n * return (\n * \n *
\n *
Click me to drag
\n *
This is some other content
\n *
\n *
\n * );\n * }\n * });\n * ```\n */\n handle: PropTypes.string,\n\n /**\n * `cancel` specifies a selector to be used to prevent drag initialization.\n *\n * Example:\n *\n * ```jsx\n * let App = React.createClass({\n * render: function () {\n * return(\n * \n *
\n *
You can't drag from here
\n *
Dragging here works fine
\n *
\n *
\n * );\n * }\n * });\n * ```\n */\n cancel: PropTypes.string,\n\n /**\n * Called when dragging starts.\n * If this function returns the boolean false, dragging will be canceled.\n *\n * Example:\n *\n * ```js\n * function (event, ui) {}\n * ```\n *\n * `event` is the Event that was triggered.\n * `ui` is an object:\n *\n * ```js\n * {\n * position: {top: 0, left: 0}\n * }\n * ```\n */\n onStart: PropTypes.func,\n\n /**\n * Called while dragging.\n * If this function returns the boolean false, dragging will be canceled.\n *\n * Example:\n *\n * ```js\n * function (event, ui) {}\n * ```\n *\n * `event` is the Event that was triggered.\n * `ui` is an object:\n *\n * ```js\n * {\n * position: {top: 0, left: 0}\n * }\n * ```\n */\n onDrag: PropTypes.func,\n\n /**\n * Called when dragging stops.\n *\n * Example:\n *\n * ```js\n * function (event, ui) {}\n * ```\n *\n * `event` is the Event that was triggered.\n * `ui` is an object:\n *\n * ```js\n * {\n * position: {top: 0, left: 0}\n * }\n * ```\n */\n onStop: PropTypes.func,\n\n /**\n * A workaround option which can be passed if onMouseDown needs to be accessed,\n * since it'll always be blocked (due to that there's internal use of onMouseDown)\n */\n onMouseDown: PropTypes.func,\n\n /**\n * These properties should be defined on the child, not here.\n */\n className: dontSetMe,\n style: dontSetMe,\n transform: dontSetMe\n };\n\n static defaultProps = {\n cancel: null,\n disabled: false,\n enableUserSelectHack: true,\n handle: null,\n transform: null,\n onStart: function(){},\n onDrag: function(){},\n onStop: function(){},\n onMouseDown: function(){}\n };\n\n state = {\n dragging: false,\n // Used while dragging to determine deltas.\n lastX: null, lastY: null\n };\n\n componentWillUnmount() {\n // Remove any leftover event handlers. Remove both touch and mouse handlers in case\n // some browser quirk caused a touch event to fire during a mouse move, or vice versa.\n removeEvent(document, eventsFor.mouse.move, this.handleDrag);\n removeEvent(document, eventsFor.touch.move, this.handleDrag);\n removeEvent(document, eventsFor.mouse.stop, this.handleDragStop);\n removeEvent(document, eventsFor.touch.stop, this.handleDragStop);\n if (this.props.enableUserSelectHack) removeUserSelectStyles();\n }\n\n handleDragStart = (e) => {\n // Make it possible to attach event handlers on top of this one.\n this.props.onMouseDown(e);\n\n // Short circuit if handle or cancel prop was provided and selector doesn't match.\n if (this.props.disabled ||\n (this.props.handle && !matchesSelector(e.target, this.props.handle)) ||\n (this.props.cancel && matchesSelector(e.target, this.props.cancel))) {\n return;\n }\n\n // Set touch identifier in component state if this is a touch event. This allows us to\n // distinguish between individual touches on multitouch screens by identifying which\n // touchpoint was set to this element.\n if (e.targetTouches){\n this.setState({touchIdentifier: e.targetTouches[0].identifier});\n }\n\n // Add a style to the body to disable user-select. This prevents text from\n // being selected all over the page.\n addUserSelectStyles();\n\n // Get the current drag point from the event. This is used as the offset.\n let {clientX, clientY} = getControlPosition(e);\n\n // Create an event object with all the data parents need to make a decision here.\n let coreEvent = createCoreEvent(this, clientX, clientY);\n\n log('DraggableCore: handleDragStart: %j', coreEvent.position);\n\n // Call event handler. If it returns explicit false, cancel.\n log('calling', this.props.onStart);\n let shouldUpdate = this.props.onStart(e, coreEvent);\n if (shouldUpdate === false) return;\n\n\n // Initiate dragging. Set the current x and y as offsets\n // so we know how much we've moved during the drag. This allows us\n // to drag elements around even if they have been moved, without issue.\n this.setState({\n dragging: true,\n\n lastX: clientX,\n lastY: clientY,\n // Stored so we can adjust our offset if scrolled.\n scrollX: document.body.scrollLeft,\n scrollY: document.body.scrollTop\n });\n\n // Translate el on page scroll.\n addEvent(document, 'scroll', this.handleScroll);\n // Add events to the document directly so we catch when the user's mouse/touch moves outside of\n // this element. We use different events depending on whether or not we have detected that this\n // is a touch-capable device.\n addEvent(document, dragEventFor.move, this.handleDrag);\n addEvent(document, dragEventFor.stop, this.handleDragStop);\n };\n\n handleDrag = (e) => {\n // Return if this is a touch event, but not the correct one for this element\n if (e.targetTouches && (e.targetTouches[0].identifier !== this.state.touchIdentifier)) return;\n\n let {clientX, clientY} = getControlPosition(e);\n\n let coreEvent = createCoreEvent(this, clientX, clientY);\n\n log('DraggableCore: handleDrag: %j', coreEvent.position);\n\n // Call event handler. If it returns explicit false, trigger end.\n let shouldUpdate = this.props.onDrag(e, coreEvent);\n if (shouldUpdate === false) {\n this.handleDragStop({});\n return;\n }\n\n this.setState({\n lastX: clientX,\n lastY: clientY\n });\n };\n\n handleDragStop = (e) => {\n if (!this.state.dragging) return;\n\n // Short circuit if this is not the correct touch event. `changedTouches` contains all\n // touch points that have been removed from the surface.\n if (e.changedTouches && (e.changedTouches[0].identifier !== this.state.touchIdentifier)) return;\n\n // Remove user-select hack\n if (this.props.enableUserSelectHack) removeUserSelectStyles();\n\n let {clientX, clientY} = getControlPosition(e);\n let coreEvent = createCoreEvent(this, clientX, clientY);\n\n log('DraggableCore: handleDragStop: %j', coreEvent.position);\n\n // Reset the el.\n this.setState({\n dragging: false,\n lastX: null,\n lastY: null\n });\n\n // Call event handler\n this.props.onStop(e, coreEvent);\n\n // Remove event handlers\n log('DraggableCore: Removing handlers');\n removeEvent(document, 'scroll', this.handleScroll);\n removeEvent(document, dragEventFor.move, this.handleDrag);\n removeEvent(document, dragEventFor.stop, this.handleDragStop);\n };\n\n // When the user scrolls, adjust internal state so the draggable moves along the page properly.\n // This only fires when a drag is active.\n handleScroll = () => {\n let s = this.state, x = document.body.scrollLeft, y = document.body.scrollTop;\n\n // Create the usual event, but make the scroll offset our deltas.\n let coreEvent = createCoreEvent(this);\n coreEvent.deltaX = x - s.scrollX;\n coreEvent.deltaY = y - s.scrollY;\n\n this.setState({\n lastX: s.lastX + coreEvent.deltaX,\n lastY: s.lastY + coreEvent.deltaY\n });\n\n this.props.onDrag(coreEvent);\n };\n\n // On mousedown, consider the drag started.\n onMouseDown = (e) => {\n // HACK: Prevent 'ghost click' which happens 300ms after touchstart if the event isn't cancelled.\n // We don't cancel the event on touchstart because of #37; we might want to make a scrollable item draggable.\n // More on ghost clicks: http://ariatemplates.com/blog/2014/05/ghost-clicks-in-mobile-browsers/\n if (dragEventFor === eventsFor.touch) {\n return e.preventDefault();\n }\n\n return this.handleDragStart(e);\n };\n\n // Same as onMouseDown (start drag), but now consider this a touch device.\n onTouchStart = (e) => {\n // We're on a touch device now, so change the event handlers\n dragEventFor = eventsFor.touch;\n\n return this.handleDragStart(e);\n };\n\n render() {\n // Reuse the child provided\n // This makes it flexible to use whatever element is wanted (div, ul, etc)\n return React.cloneElement(React.Children.only(this.props.children), {\n style: styleHacks(this.props.children.props.style),\n\n // Note: mouseMove handler is attached to document so it will still function\n // when the user drags quickly and leaves the bounds of the element.\n onMouseDown: this.onMouseDown,\n onTouchStart: this.onTouchStart,\n onMouseUp: this.handleDragStop,\n onTouchEnd: this.handleDragStop\n });\n }\n}\n\n\n\n/** WEBPACK FOOTER **\n ** ./lib/DraggableCore.es6\n **/","export default function log() {\n if (process.env.DRAGGABLE_DEBUG) console.log(...arguments);\n}\n\n\n\n/** WEBPACK FOOTER **\n ** ./lib/utils/log.es6\n **/"],"sourceRoot":""} \ No newline at end of file diff --git a/dist/react-draggable.min.js b/dist/react-draggable.min.js deleted file mode 100644 index a0d99f55..00000000 --- a/dist/react-draggable.min.js +++ /dev/null @@ -1,2 +0,0 @@ -!function(root,factory){"object"==typeof exports&&"object"==typeof module?module.exports=factory(require("react"),require("react-dom")):"function"==typeof define&&define.amd?define(["react","react-dom"],factory):"object"==typeof exports?exports.ReactDraggable=factory(require("react"),require("react-dom")):root.ReactDraggable=factory(root.React,root.ReactDOM)}(this,function(__WEBPACK_EXTERNAL_MODULE_2__,__WEBPACK_EXTERNAL_MODULE_3__){return function(modules){function __webpack_require__(moduleId){if(installedModules[moduleId])return installedModules[moduleId].exports;var module=installedModules[moduleId]={exports:{},id:moduleId,loaded:!1};return modules[moduleId].call(module.exports,module,module.exports,__webpack_require__),module.loaded=!0,module.exports}var installedModules={};return __webpack_require__.m=modules,__webpack_require__.c=installedModules,__webpack_require__.p="",__webpack_require__(0)}([function(module,exports,__webpack_require__){"use strict";module.exports=__webpack_require__(1),module.exports.DraggableCore=__webpack_require__(10)},function(module,exports,__webpack_require__){"use strict";function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{"default":obj}}function _classCallCheck(instance,Constructor){if(!(instance instanceof Constructor))throw new TypeError("Cannot call a class as a function")}function _inherits(subClass,superClass){if("function"!=typeof superClass&&null!==superClass)throw new TypeError("Super expression must either be null or a function, not "+typeof superClass);subClass.prototype=Object.create(superClass&&superClass.prototype,{constructor:{value:subClass,enumerable:!1,writable:!0,configurable:!0}}),superClass&&(Object.setPrototypeOf?Object.setPrototypeOf(subClass,superClass):subClass.__proto__=superClass)}Object.defineProperty(exports,"__esModule",{value:!0});var _extends=Object.assign||function(target){for(var i=1;ii;i++)if(callback.apply(callback,[array[i],i,array]))return array[i]}function isFunction(func){return"function"==typeof func||"[object Function]"===Object.prototype.toString.call(func)}function isNum(num){return"number"==typeof num&&!isNaN(num)}function int(a){return parseInt(a,10)}function dontSetMe(props,propName,componentName){if(props[propName])throw new Error("Invalid prop "+propName+" passed to "+componentName+" - do not set this, set it on the child.")}Object.defineProperty(exports,"__esModule",{value:!0}),exports.findInArray=findInArray,exports.isFunction=isFunction,exports.isNum=isNum,exports["int"]=int,exports.dontSetMe=dontSetMe},function(module,exports){"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports["default"]=function(){if("undefined"==typeof window)return"";var styles=window.getComputedStyle(document.documentElement,""),pre=(Array.prototype.slice.call(styles).join("").match(/-(moz|webkit|ms)-/)||""===styles.OLink&&["","o"])[1];return"ms"===pre?pre:void 0===pre||null===pre?"":pre.slice(0,1).toUpperCase()+pre.slice(1)}(),module.exports=exports["default"]},function(module,exports,__webpack_require__){"use strict";function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{"default":obj}}function getBoundPosition(draggable,clientX,clientY){if(!draggable.props.bounds)return[clientX,clientY];var bounds=JSON.parse(JSON.stringify(draggable.props.bounds)),node=_reactDom2["default"].findDOMNode(draggable),parent=node.parentNode;if("parent"===bounds){var nodeStyle=window.getComputedStyle(node),parentStyle=window.getComputedStyle(parent);bounds={left:-node.offsetLeft+(0,_shims["int"])(parentStyle.paddingLeft)+(0,_shims["int"])(nodeStyle.borderLeftWidth)+(0,_shims["int"])(nodeStyle.marginLeft),top:-node.offsetTop+(0,_shims["int"])(parentStyle.paddingTop)+(0,_shims["int"])(nodeStyle.borderTopWidth)+(0,_shims["int"])(nodeStyle.marginTop),right:(0,_domFns.innerWidth)(parent)-(0,_domFns.outerWidth)(node)-node.offsetLeft,bottom:(0,_domFns.innerHeight)(parent)-(0,_domFns.outerHeight)(node)-node.offsetTop}}return(0,_shims.isNum)(bounds.right)&&(clientX=Math.min(clientX,bounds.right)),(0,_shims.isNum)(bounds.bottom)&&(clientY=Math.min(clientY,bounds.bottom)),(0,_shims.isNum)(bounds.left)&&(clientX=Math.max(clientX,bounds.left)),(0,_shims.isNum)(bounds.top)&&(clientY=Math.max(clientY,bounds.top)),[clientX,clientY]}function snapToGrid(grid,pendingX,pendingY){var x=Math.round(pendingX/grid[0])*grid[0],y=Math.round(pendingY/grid[1])*grid[1];return[x,y]}function canDragX(draggable){return"both"===draggable.props.axis||"x"===draggable.props.axis}function canDragY(draggable){return"both"===draggable.props.axis||"y"===draggable.props.axis}function getControlPosition(e){var position=e.targetTouches&&e.targetTouches[0]||e;return{clientX:position.clientX,clientY:position.clientY}}Object.defineProperty(exports,"__esModule",{value:!0}),exports.getBoundPosition=getBoundPosition,exports.snapToGrid=snapToGrid,exports.canDragX=canDragX,exports.canDragY=canDragY,exports.getControlPosition=getControlPosition;var _shims=__webpack_require__(7),_reactDom=__webpack_require__(3),_reactDom2=_interopRequireDefault(_reactDom),_domFns=__webpack_require__(6)},function(module,exports,__webpack_require__){"use strict";function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{"default":obj}}function _classCallCheck(instance,Constructor){if(!(instance instanceof Constructor))throw new TypeError("Cannot call a class as a function")}function _inherits(subClass,superClass){if("function"!=typeof superClass&&null!==superClass)throw new TypeError("Super expression must either be null or a function, not "+typeof superClass);subClass.prototype=Object.create(superClass&&superClass.prototype,{constructor:{value:subClass,enumerable:!1,writable:!0,configurable:!0}}),superClass&&(Object.setPrototypeOf?Object.setPrototypeOf(subClass,superClass):subClass.__proto__=superClass)}Object.defineProperty(exports,"__esModule",{value:!0});var _createClass=function(){function defineProperties(target,props){for(var i=0;i\n//\n\nexport default class Draggable extends DraggableCore {\n\n static displayName = 'Draggable';\n\n static propTypes = assign({}, DraggableCore.propTypes, {\n /**\n * `axis` determines which axis the draggable can move.\n *\n * 'both' allows movement horizontally and vertically.\n * 'x' limits movement to horizontal axis.\n * 'y' limits movement to vertical axis.\n *\n * Defaults to 'both'.\n */\n axis: PropTypes.oneOf(['both', 'x', 'y']),\n\n /**\n * `bounds` determines the range of movement available to the element.\n * Available values are:\n *\n * 'parent' restricts movement within the Draggable's parent node.\n *\n * Alternatively, pass an object with the following properties, all of which are optional:\n *\n * {left: LEFT_BOUND, right: RIGHT_BOUND, bottom: BOTTOM_BOUND, top: TOP_BOUND}\n *\n * All values are in px.\n *\n * Example:\n *\n * ```jsx\n * let App = React.createClass({\n * render: function () {\n * return (\n * \n *
Content
\n *
\n * );\n * }\n * });\n * ```\n */\n bounds: PropTypes.oneOfType([\n PropTypes.shape({\n left: PropTypes.Number,\n right: PropTypes.Number,\n top: PropTypes.Number,\n bottom: PropTypes.Number\n }),\n PropTypes.oneOf(['parent', false])\n ]),\n\n /**\n * `grid` specifies the x and y that dragging should snap to.\n *\n * Example:\n *\n * ```jsx\n * let App = React.createClass({\n * render: function () {\n * return (\n * \n *
I snap to a 25 x 25 grid
\n *
\n * );\n * }\n * });\n * ```\n */\n grid: PropTypes.arrayOf(PropTypes.number),\n\n /**\n * `start` specifies the x and y that the dragged item should start at\n *\n * Example:\n *\n * ```jsx\n * let App = React.createClass({\n * render: function () {\n * return (\n * \n *
I start with transformX: 25px and transformY: 25px;
\n *
\n * );\n * }\n * });\n * ```\n */\n start: PropTypes.shape({\n x: PropTypes.number,\n y: PropTypes.number\n }),\n\n /**\n * `zIndex` specifies the zIndex to use while dragging.\n *\n * Example:\n *\n * ```jsx\n * let App = React.createClass({\n * render: function () {\n * return (\n * \n *
I have a zIndex
\n *
\n * );\n * }\n * });\n * ```\n */\n zIndex: PropTypes.number,\n\n /**\n * These properties should be defined on the child, not here.\n */\n className: dontSetMe,\n style: dontSetMe,\n transform: dontSetMe\n });\n\n static defaultProps = assign({}, DraggableCore.defaultProps, {\n axis: 'both',\n bounds: false,\n grid: null,\n start: {x: 0, y: 0},\n zIndex: NaN\n });\n\n state = {\n // Whether or not we are currently dragging.\n dragging: false,\n\n // Current transform x and y.\n clientX: this.props.start.x, clientY: this.props.start.y,\n\n // Can only determine if SVG after mounting\n isElementSVG: false\n };\n\n componentDidMount() {\n // Check to see if the element passed is an instanceof SVGElement\n if(ReactDOM.findDOMNode(this) instanceof SVGElement) {\n this.setState({ isElementSVG: true });\n }\n }\n\n onDragStart = (e, coreEvent) => {\n log('Draggable: onDragStart: %j', coreEvent.position);\n\n // Short-circuit if user's callback killed it.\n let shouldStart = this.props.onStart(e, createUIEvent(this, coreEvent));\n // Kills start event on core as well, so move handlers are never bound.\n if (shouldStart === false) return false;\n\n this.setState({\n dragging: true\n });\n };\n\n onDrag = (e, coreEvent) => {\n if (!this.state.dragging) return false;\n log('Draggable: onDrag: %j', coreEvent.position);\n\n // Short-circuit if user's callback killed it.\n let shouldUpdate = this.props.onDrag(e, createUIEvent(this, coreEvent));\n if (shouldUpdate === false) return false;\n\n let newState = {\n clientX: this.state.clientX + coreEvent.position.deltaX,\n clientY: this.state.clientY + coreEvent.position.deltaY\n };\n\n // Snap to grid if prop has been provided\n if (Array.isArray(this.props.grid)) {\n newState.lastX = (this.state.lastX || newState.clientX) + coreEvent.position.deltaX;\n newState.lastY = (this.state.lastY || newState.clientY) + coreEvent.position.deltaY;\n // Eslint bug, it thinks newState.clientY is undefined\n /*eslint no-undef:0*/\n [newState.clientX, newState.clientY] = snapToGrid(this.props.grid, newState.lastX, newState.lastY);\n }\n\n // Keep within bounds.\n if (this.props.bounds) {\n [newState.clientX, newState.clientY] = getBoundPosition(this, newState.clientX, newState.clientY);\n }\n\n this.setState(newState);\n };\n\n onDragStop = (e, coreEvent) => {\n if (!this.state.dragging) return false;\n\n // Short-circuit if user's callback killed it.\n let shouldStop = this.props.onStop(e, createUIEvent(this, coreEvent));\n if (shouldStop === false) return false;\n\n log('Draggable: onDragStop: %j', coreEvent.position);\n\n this.setState({\n dragging: false\n });\n };\n\n render() {\n let style, svgTransform = null;\n // Add a CSS transform to move the element around. This allows us to move the element around\n // without worrying about whether or not it is relatively or absolutely positioned.\n // If the item you are dragging already has a transform set, wrap it in a so \n // has a clean slate.\n style = createTransform({\n // Set left if horizontal drag is enabled\n x: canDragX(this) ?\n this.state.clientX :\n this.props.start.x,\n\n // Set top if vertical drag is enabled\n y: canDragY(this) ?\n this.state.clientY :\n this.props.start.y\n }, this.state.isElementSVG);\n\n // If this element was SVG, we use the `transform` attribute.\n if (this.state.isElementSVG) {\n svgTransform = style;\n style = {};\n }\n\n // zIndex option\n if (this.state.dragging && !isNaN(this.props.zIndex)) {\n style.zIndex = this.props.zIndex;\n }\n\n // Mark with class while dragging\n let className = classNames((this.props.children.props.className || ''), 'react-draggable', {\n 'react-draggable-dragging': this.state.dragging,\n 'react-draggable-dragged': this.state.dragged\n });\n\n // Reuse the child provided\n // This makes it flexible to use whatever element is wanted (div, ul, etc)\n return (\n \n {React.cloneElement(React.Children.only(this.props.children), {\n className: className,\n style: assign({}, this.props.children.props.style, style),\n transform: svgTransform\n })}\n \n );\n }\n}\n\n\n\n/** WEBPACK FOOTER **\n ** ./lib/Draggable.es6\n **/","module.exports = __WEBPACK_EXTERNAL_MODULE_2__;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** external {\"commonjs\":\"react\",\"commonjs2\":\"react\",\"amd\":\"react\",\"root\":\"React\"}\n ** module id = 2\n ** module chunks = 0\n **/","module.exports = __WEBPACK_EXTERNAL_MODULE_3__;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** external {\"commonjs\":\"react-dom\",\"commonjs2\":\"react-dom\",\"amd\":\"react-dom\",\"root\":\"ReactDOM\"}\n ** module id = 3\n ** module chunks = 0\n **/","/*!\n Copyright (c) 2015 Jed Watson.\n Licensed under the MIT License (MIT), see\n http://jedwatson.github.io/classnames\n*/\n/* global define */\n\n(function () {\n\t'use strict';\n\n\tvar hasOwn = {}.hasOwnProperty;\n\n\tfunction classNames () {\n\t\tvar classes = '';\n\n\t\tfor (var i = 0; i < arguments.length; i++) {\n\t\t\tvar arg = arguments[i];\n\t\t\tif (!arg) continue;\n\n\t\t\tvar argType = typeof arg;\n\n\t\t\tif (argType === 'string' || argType === 'number') {\n\t\t\t\tclasses += ' ' + arg;\n\t\t\t} else if (Array.isArray(arg)) {\n\t\t\t\tclasses += ' ' + classNames.apply(null, arg);\n\t\t\t} else if (argType === 'object') {\n\t\t\t\tfor (var key in arg) {\n\t\t\t\t\tif (hasOwn.call(arg, key) && arg[key]) {\n\t\t\t\t\t\tclasses += ' ' + key;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn classes.substr(1);\n\t}\n\n\tif (typeof module !== 'undefined' && module.exports) {\n\t\tmodule.exports = classNames;\n\t} else if (typeof define === 'function' && typeof define.amd === 'object' && define.amd) {\n\t\t// register as 'classnames', consistent with npm package name\n\t\tdefine('classnames', function () {\n\t\t\treturn classNames;\n\t\t});\n\t} else {\n\t\twindow.classNames = classNames;\n\t}\n}());\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/classnames/index.js\n ** module id = 4\n ** module chunks = 0\n **/","/* eslint-disable no-unused-vars */\n'use strict';\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\nvar propIsEnumerable = Object.prototype.propertyIsEnumerable;\n\nfunction toObject(val) {\n\tif (val === null || val === undefined) {\n\t\tthrow new TypeError('Object.assign cannot be called with null or undefined');\n\t}\n\n\treturn Object(val);\n}\n\nmodule.exports = Object.assign || function (target, source) {\n\tvar from;\n\tvar to = toObject(target);\n\tvar symbols;\n\n\tfor (var s = 1; s < arguments.length; s++) {\n\t\tfrom = Object(arguments[s]);\n\n\t\tfor (var key in from) {\n\t\t\tif (hasOwnProperty.call(from, key)) {\n\t\t\t\tto[key] = from[key];\n\t\t\t}\n\t\t}\n\n\t\tif (Object.getOwnPropertySymbols) {\n\t\t\tsymbols = Object.getOwnPropertySymbols(from);\n\t\t\tfor (var i = 0; i < symbols.length; i++) {\n\t\t\t\tif (propIsEnumerable.call(from, symbols[i])) {\n\t\t\t\t\tto[symbols[i]] = from[symbols[i]];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn to;\n};\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/object-assign/index.js\n ** module id = 5\n ** module chunks = 0\n **/","import {findInArray, isFunction, isNum, int} from './shims';\nimport browserPrefix from './getPrefix';\nimport assign from 'object-assign';\nimport ReactDOM from 'react-dom';\n\nlet matchesSelectorFunc = '';\nexport function matchesSelector(el: Node, selector: string) {\n if (!matchesSelectorFunc) {\n matchesSelectorFunc = findInArray([\n 'matches',\n 'webkitMatchesSelector',\n 'mozMatchesSelector',\n 'msMatchesSelector',\n 'oMatchesSelector'\n ], function(method){\n return isFunction(el[method]);\n });\n }\n\n return el[matchesSelectorFunc].call(el, selector);\n}\n\nexport function addEvent(el: ?Node, event: string, handler: Function) {\n if (!el) { return; }\n if (el.attachEvent) {\n el.attachEvent('on' + event, handler);\n } else if (el.addEventListener) {\n el.addEventListener(event, handler, true);\n } else {\n el['on' + event] = handler;\n }\n}\n\nexport function removeEvent(el: ?Node, event: string, handler: Function) {\n if (!el) { return; }\n if (el.detachEvent) {\n el.detachEvent('on' + event, handler);\n } else if (el.removeEventListener) {\n el.removeEventListener(event, handler, true);\n } else {\n el['on' + event] = null;\n }\n}\n\nexport function outerHeight(node: Node) {\n // This is deliberately excluding margin for our calculations, since we are using\n // offsetTop which is including margin. See getBoundPosition\n let height = node.clientHeight;\n let computedStyle = window.getComputedStyle(node);\n height += int(computedStyle.borderTopWidth);\n height += int(computedStyle.borderBottomWidth);\n return height;\n}\n\nexport function outerWidth(node: Node) {\n // This is deliberately excluding margin for our calculations, since we are using\n // offsetLeft which is including margin. See getBoundPosition\n let width = node.clientWidth;\n let computedStyle = window.getComputedStyle(node);\n width += int(computedStyle.borderLeftWidth);\n width += int(computedStyle.borderRightWidth);\n return width;\n}\nexport function innerHeight(node: Node) {\n let height = node.clientHeight;\n let computedStyle = window.getComputedStyle(node);\n height -= int(computedStyle.paddingTop);\n height -= int(computedStyle.paddingBottom);\n return height;\n}\n\nexport function innerWidth(node: Node) {\n let width = node.clientWidth;\n let computedStyle = window.getComputedStyle(node);\n width -= int(computedStyle.paddingLeft);\n width -= int(computedStyle.paddingRight);\n return width;\n}\n\nexport function createTransform(position: Object, isSVG: ?boolean) {\n if (isSVG) return createSVGTransform(position);\n return createCSSTransform(position);\n}\n\nexport function createCSSTransform({x, y}: {x: number, y: number}) {\n // Replace unitless items with px\n let out = {transform: 'translate(' + x + 'px,' + y + 'px)'};\n // Add single prefixed property as well\n if (browserPrefix) {\n out[browserPrefix + 'Transform'] = out.transform;\n }\n return out;\n}\n\nexport function createSVGTransform({x, y}: {x: number, y: number}) {\n return 'translate(' + x + ',' + y + ')';\n}\n\n// User-select Hacks:\n//\n// Useful for preventing blue highlights all over everything when dragging.\nlet userSelectStyle = ';user-select: none;';\nif (browserPrefix) {\n userSelectStyle += '-' + browserPrefix.toLowerCase() + '-user-select: none;';\n}\n\nexport function addUserSelectStyles() {\n let style = document.body.getAttribute('style') || '';\n document.body.setAttribute('style', style + userSelectStyle);\n}\n\nexport function removeUserSelectStyles() {\n let style = document.body.getAttribute('style') || '';\n document.body.setAttribute('style', style.replace(userSelectStyle, ''));\n}\n\nexport function styleHacks(childStyle = {}) {\n // Workaround IE pointer events; see #51\n // https://github.com/mzabriskie/react-draggable/issues/51#issuecomment-103488278\n let touchHacks = {\n touchAction: 'none'\n };\n\n return assign(touchHacks, childStyle);\n}\n\n// Create an event exposed by \nexport function createCoreEvent(draggable, clientX, clientY) {\n // State changes are often (but not always!) async. We want the latest value.\n let state = draggable._pendingState || draggable.state;\n let isStart = !isNum(state.lastX);\n\n return {\n node: ReactDOM.findDOMNode(draggable),\n position: isStart ?\n // If this is our first move, use the clientX and clientY as last coords.\n {\n deltaX: 0, deltaY: 0,\n lastX: clientX, lastY: clientY,\n clientX: clientX, clientY: clientY\n } :\n // Otherwise calculate proper values.\n {\n deltaX: clientX - state.lastX, deltaY: clientY - state.lastY,\n lastX: state.lastX, lastY: state.lastY,\n clientX: clientX, clientY: clientY\n }\n };\n}\n\n// Create an event exposed by \nexport function createUIEvent(draggable, coreEvent) {\n return {\n node: ReactDOM.findDOMNode(draggable),\n position: {\n top: coreEvent.position.clientY,\n left: coreEvent.position.clientX\n },\n deltaX: coreEvent.position.deltaX,\n deltaY: coreEvent.position.deltaY\n };\n}\n\n\n\n/** WEBPACK FOOTER **\n ** ./lib/utils/domFns.es6\n **/","// @credits https://gist.github.com/rogozhnikoff/a43cfed27c41e4e68cdc\nexport function findInArray(array, callback) {\n for (let i = 0, length = array.length; i < length; i++) {\n if (callback.apply(callback, [array[i], i, array])) return array[i];\n }\n}\n\nexport function isFunction(func) {\n return typeof func === 'function' || Object.prototype.toString.call(func) === '[object Function]';\n}\n\nexport function isNum(num) {\n return typeof num === 'number' && !isNaN(num);\n}\n\nexport function int(a) {\n return parseInt(a, 10);\n}\n\nexport function dontSetMe(props, propName, componentName) {\n if (props[propName]) {\n throw new Error(`Invalid prop ${propName} passed to ${componentName} - do not set this, set it on the child.`);\n }\n}\n\n\n\n/** WEBPACK FOOTER **\n ** ./lib/utils/shims.es6\n **/","export default (function() {\n if (typeof window === 'undefined') return '';\n // Thanks David Walsh\n let styles = window.getComputedStyle(document.documentElement, ''),\n pre = (Array.prototype.slice\n .call(styles)\n .join('')\n .match(/-(moz|webkit|ms)-/) || (styles.OLink === '' && ['', 'o'])\n )[1];\n // 'ms' is not titlecased\n if (pre === 'ms') return pre;\n if (pre === undefined || pre === null) return '';\n return pre.slice(0, 1).toUpperCase() + pre.slice(1);\n})();\n\n\n\n/** WEBPACK FOOTER **\n ** ./lib/utils/getPrefix.es6\n **/","import {isNum, int} from './shims';\nimport ReactDOM from 'react-dom';\nimport {innerWidth, innerHeight, outerWidth, outerHeight} from './domFns';\n\nexport function getBoundPosition(draggable, clientX, clientY) {\n // If no bounds, short-circuit and move on\n if (!draggable.props.bounds) return [clientX, clientY];\n\n let bounds = JSON.parse(JSON.stringify(draggable.props.bounds));\n let node = ReactDOM.findDOMNode(draggable);\n let parent = node.parentNode;\n\n if (bounds === 'parent') {\n let nodeStyle = window.getComputedStyle(node);\n let parentStyle = window.getComputedStyle(parent);\n // Compute bounds. This is a pain with padding and offsets but this gets it exactly right.\n bounds = {\n left: -node.offsetLeft + int(parentStyle.paddingLeft) +\n int(nodeStyle.borderLeftWidth) + int(nodeStyle.marginLeft),\n top: -node.offsetTop + int(parentStyle.paddingTop) +\n int(nodeStyle.borderTopWidth) + int(nodeStyle.marginTop),\n right: innerWidth(parent) - outerWidth(node) - node.offsetLeft,\n bottom: innerHeight(parent) - outerHeight(node) - node.offsetTop\n };\n }\n\n // Keep x and y below right and bottom limits...\n if (isNum(bounds.right)) clientX = Math.min(clientX, bounds.right);\n if (isNum(bounds.bottom)) clientY = Math.min(clientY, bounds.bottom);\n\n // But above left and top limits.\n if (isNum(bounds.left)) clientX = Math.max(clientX, bounds.left);\n if (isNum(bounds.top)) clientY = Math.max(clientY, bounds.top);\n\n return [clientX, clientY];\n}\n\nexport function snapToGrid(grid, pendingX, pendingY) {\n let x = Math.round(pendingX / grid[0]) * grid[0];\n let y = Math.round(pendingY / grid[1]) * grid[1];\n return [x, y];\n}\n\nexport function canDragX(draggable) {\n return draggable.props.axis === 'both' || draggable.props.axis === 'x';\n}\n\nexport function canDragY(draggable) {\n return draggable.props.axis === 'both' || draggable.props.axis === 'y';\n}\n\n// Get {clientX, clientY} positions from event.\nexport function getControlPosition(e) {\n let position = (e.targetTouches && e.targetTouches[0]) || e;\n return {\n clientX: position.clientX,\n clientY: position.clientY\n };\n}\n\n\n\n/** WEBPACK FOOTER **\n ** ./lib/utils/positionFns.es6\n **/","import {default as React, PropTypes} from 'react';\nimport {matchesSelector, createCoreEvent, addEvent, removeEvent, addUserSelectStyles,\n removeUserSelectStyles, styleHacks} from './utils/domFns';\nimport {getControlPosition} from './utils/positionFns';\nimport {dontSetMe} from './utils/shims';\nimport log from './utils/log';\n\n// Simple abstraction for dragging events names.\nlet eventsFor = {\n touch: {\n start: 'touchstart',\n move: 'touchmove',\n stop: 'touchend'\n },\n mouse: {\n start: 'mousedown',\n move: 'mousemove',\n stop: 'mouseup'\n }\n};\n\n// Default to mouse events.\nlet dragEventFor = eventsFor.mouse;\n\n//\n// Define .\n//\n// is for advanced usage of . It maintains minimal internal state so it can\n// work well with libraries that require more control over the element.\n//\n\nexport default class DraggableCore extends React.Component {\n\n static displayName = 'DraggableCore';\n\n static propTypes = {\n /**\n * `disabled`, if true, stops the from dragging. All handlers,\n * with the exception of `onMouseDown`, will not fire.\n *\n * Example:\n *\n * ```jsx\n * let App = React.createClass({\n * render: function () {\n * return (\n * \n *
I can't be dragged
\n *
\n * );\n * }\n * });\n * ```\n */\n disabled: PropTypes.bool,\n\n /**\n * By default, we add 'user-select:none' attributes to the document body\n * to prevent ugly text selection during drag. If this is causing problems\n * for your app, set this to `false`.\n */\n enableUserSelectHack: PropTypes.bool,\n\n /**\n * `handle` specifies a selector to be used as the handle that initiates drag.\n *\n * Example:\n *\n * ```jsx\n * let App = React.createClass({\n * render: function () {\n * return (\n * \n *
\n *
Click me to drag
\n *
This is some other content
\n *
\n *
\n * );\n * }\n * });\n * ```\n */\n handle: PropTypes.string,\n\n /**\n * `cancel` specifies a selector to be used to prevent drag initialization.\n *\n * Example:\n *\n * ```jsx\n * let App = React.createClass({\n * render: function () {\n * return(\n * \n *
\n *
You can't drag from here
\n *
Dragging here works fine
\n *
\n *
\n * );\n * }\n * });\n * ```\n */\n cancel: PropTypes.string,\n\n /**\n * Called when dragging starts.\n * If this function returns the boolean false, dragging will be canceled.\n *\n * Example:\n *\n * ```js\n * function (event, ui) {}\n * ```\n *\n * `event` is the Event that was triggered.\n * `ui` is an object:\n *\n * ```js\n * {\n * position: {top: 0, left: 0}\n * }\n * ```\n */\n onStart: PropTypes.func,\n\n /**\n * Called while dragging.\n * If this function returns the boolean false, dragging will be canceled.\n *\n * Example:\n *\n * ```js\n * function (event, ui) {}\n * ```\n *\n * `event` is the Event that was triggered.\n * `ui` is an object:\n *\n * ```js\n * {\n * position: {top: 0, left: 0}\n * }\n * ```\n */\n onDrag: PropTypes.func,\n\n /**\n * Called when dragging stops.\n *\n * Example:\n *\n * ```js\n * function (event, ui) {}\n * ```\n *\n * `event` is the Event that was triggered.\n * `ui` is an object:\n *\n * ```js\n * {\n * position: {top: 0, left: 0}\n * }\n * ```\n */\n onStop: PropTypes.func,\n\n /**\n * A workaround option which can be passed if onMouseDown needs to be accessed,\n * since it'll always be blocked (due to that there's internal use of onMouseDown)\n */\n onMouseDown: PropTypes.func,\n\n /**\n * These properties should be defined on the child, not here.\n */\n className: dontSetMe,\n style: dontSetMe,\n transform: dontSetMe\n };\n\n static defaultProps = {\n cancel: null,\n disabled: false,\n enableUserSelectHack: true,\n handle: null,\n transform: null,\n onStart: function(){},\n onDrag: function(){},\n onStop: function(){},\n onMouseDown: function(){}\n };\n\n state = {\n dragging: false,\n // Used while dragging to determine deltas.\n lastX: null, lastY: null\n };\n\n componentWillUnmount() {\n // Remove any leftover event handlers. Remove both touch and mouse handlers in case\n // some browser quirk caused a touch event to fire during a mouse move, or vice versa.\n removeEvent(document, eventsFor.mouse.move, this.handleDrag);\n removeEvent(document, eventsFor.touch.move, this.handleDrag);\n removeEvent(document, eventsFor.mouse.stop, this.handleDragStop);\n removeEvent(document, eventsFor.touch.stop, this.handleDragStop);\n if (this.props.enableUserSelectHack) removeUserSelectStyles();\n }\n\n handleDragStart = (e) => {\n // Make it possible to attach event handlers on top of this one.\n this.props.onMouseDown(e);\n\n // Short circuit if handle or cancel prop was provided and selector doesn't match.\n if (this.props.disabled ||\n (this.props.handle && !matchesSelector(e.target, this.props.handle)) ||\n (this.props.cancel && matchesSelector(e.target, this.props.cancel))) {\n return;\n }\n\n // Set touch identifier in component state if this is a touch event. This allows us to\n // distinguish between individual touches on multitouch screens by identifying which\n // touchpoint was set to this element.\n if (e.targetTouches){\n this.setState({touchIdentifier: e.targetTouches[0].identifier});\n }\n\n // Add a style to the body to disable user-select. This prevents text from\n // being selected all over the page.\n addUserSelectStyles();\n\n // Get the current drag point from the event. This is used as the offset.\n let {clientX, clientY} = getControlPosition(e);\n\n // Create an event object with all the data parents need to make a decision here.\n let coreEvent = createCoreEvent(this, clientX, clientY);\n\n log('DraggableCore: handleDragStart: %j', coreEvent.position);\n\n // Call event handler. If it returns explicit false, cancel.\n log('calling', this.props.onStart);\n let shouldUpdate = this.props.onStart(e, coreEvent);\n if (shouldUpdate === false) return;\n\n\n // Initiate dragging. Set the current x and y as offsets\n // so we know how much we've moved during the drag. This allows us\n // to drag elements around even if they have been moved, without issue.\n this.setState({\n dragging: true,\n\n lastX: clientX,\n lastY: clientY,\n // Stored so we can adjust our offset if scrolled.\n scrollX: document.body.scrollLeft,\n scrollY: document.body.scrollTop\n });\n\n // Translate el on page scroll.\n addEvent(document, 'scroll', this.handleScroll);\n // Add events to the document directly so we catch when the user's mouse/touch moves outside of\n // this element. We use different events depending on whether or not we have detected that this\n // is a touch-capable device.\n addEvent(document, dragEventFor.move, this.handleDrag);\n addEvent(document, dragEventFor.stop, this.handleDragStop);\n };\n\n handleDrag = (e) => {\n // Return if this is a touch event, but not the correct one for this element\n if (e.targetTouches && (e.targetTouches[0].identifier !== this.state.touchIdentifier)) return;\n\n let {clientX, clientY} = getControlPosition(e);\n\n let coreEvent = createCoreEvent(this, clientX, clientY);\n\n log('DraggableCore: handleDrag: %j', coreEvent.position);\n\n // Call event handler. If it returns explicit false, trigger end.\n let shouldUpdate = this.props.onDrag(e, coreEvent);\n if (shouldUpdate === false) {\n this.handleDragStop({});\n return;\n }\n\n this.setState({\n lastX: clientX,\n lastY: clientY\n });\n };\n\n handleDragStop = (e) => {\n if (!this.state.dragging) return;\n\n // Short circuit if this is not the correct touch event. `changedTouches` contains all\n // touch points that have been removed from the surface.\n if (e.changedTouches && (e.changedTouches[0].identifier !== this.state.touchIdentifier)) return;\n\n // Remove user-select hack\n if (this.props.enableUserSelectHack) removeUserSelectStyles();\n\n let {clientX, clientY} = getControlPosition(e);\n let coreEvent = createCoreEvent(this, clientX, clientY);\n\n log('DraggableCore: handleDragStop: %j', coreEvent.position);\n\n // Reset the el.\n this.setState({\n dragging: false,\n lastX: null,\n lastY: null\n });\n\n // Call event handler\n this.props.onStop(e, coreEvent);\n\n // Remove event handlers\n log('DraggableCore: Removing handlers');\n removeEvent(document, 'scroll', this.handleScroll);\n removeEvent(document, dragEventFor.move, this.handleDrag);\n removeEvent(document, dragEventFor.stop, this.handleDragStop);\n };\n\n // When the user scrolls, adjust internal state so the draggable moves along the page properly.\n // This only fires when a drag is active.\n handleScroll = () => {\n let s = this.state, x = document.body.scrollLeft, y = document.body.scrollTop;\n\n // Create the usual event, but make the scroll offset our deltas.\n let coreEvent = createCoreEvent(this);\n coreEvent.deltaX = x - s.scrollX;\n coreEvent.deltaY = y - s.scrollY;\n\n this.setState({\n lastX: s.lastX + coreEvent.deltaX,\n lastY: s.lastY + coreEvent.deltaY\n });\n\n this.props.onDrag(coreEvent);\n };\n\n // On mousedown, consider the drag started.\n onMouseDown = (e) => {\n // HACK: Prevent 'ghost click' which happens 300ms after touchstart if the event isn't cancelled.\n // We don't cancel the event on touchstart because of #37; we might want to make a scrollable item draggable.\n // More on ghost clicks: http://ariatemplates.com/blog/2014/05/ghost-clicks-in-mobile-browsers/\n if (dragEventFor === eventsFor.touch) {\n return e.preventDefault();\n }\n\n return this.handleDragStart(e);\n };\n\n // Same as onMouseDown (start drag), but now consider this a touch device.\n onTouchStart = (e) => {\n // We're on a touch device now, so change the event handlers\n dragEventFor = eventsFor.touch;\n\n return this.handleDragStart(e);\n };\n\n render() {\n // Reuse the child provided\n // This makes it flexible to use whatever element is wanted (div, ul, etc)\n return React.cloneElement(React.Children.only(this.props.children), {\n style: styleHacks(this.props.children.props.style),\n\n // Note: mouseMove handler is attached to document so it will still function\n // when the user drags quickly and leaves the bounds of the element.\n onMouseDown: this.onMouseDown,\n onTouchStart: this.onTouchStart,\n onMouseUp: this.handleDragStop,\n onTouchEnd: this.handleDragStop\n });\n }\n}\n\n\n\n/** WEBPACK FOOTER **\n ** ./lib/DraggableCore.es6\n **/","export default function log() {\n if (process.env.DRAGGABLE_DEBUG) console.log(...arguments);\n}\n\n\n\n/** WEBPACK FOOTER **\n ** ./lib/utils/log.es6\n **/"]} \ No newline at end of file diff --git a/eslint.config.mjs b/eslint.config.mjs new file mode 100644 index 00000000..11cf50d9 --- /dev/null +++ b/eslint.config.mjs @@ -0,0 +1,58 @@ +import { defineConfig, globalIgnores } from "eslint/config"; +import react from "eslint-plugin-react"; +import globals from "globals"; +import babelParser from "@babel/eslint-parser"; +import path from "node:path"; +import { fileURLToPath } from "node:url"; +import js from "@eslint/js"; +import { FlatCompat } from "@eslint/eslintrc"; + +const __filename = fileURLToPath(import.meta.url); +const __dirname = path.dirname(__filename); +const compat = new FlatCompat({ + baseDirectory: __dirname, + recommendedConfig: js.configs.recommended, + allConfig: js.configs.all +}); + +export default defineConfig([globalIgnores(["build/**/*.js"]), { + extends: compat.extends("eslint:recommended"), + + plugins: { + react, + }, + + languageOptions: { + globals: { + ...globals.browser, + ...globals.node, + ReactElement: null, + ReactClass: null, + $Exact: null, + Partial: null, + $Keys: null, + MouseTouchEvent: null, + }, + + parser: babelParser, + }, + + rules: { + strict: 0, + quotes: [1, "single"], + curly: [1, "multi-line"], + camelcase: 0, + "comma-dangle": 0, + "no-console": 2, + "no-use-before-define": [1, "nofunc"], + "no-underscore-dangle": 0, + + "no-unused-vars": [1, { + ignoreRestSiblings: true, + }], + + "new-cap": 0, + "prefer-const": 1, + semi: 1, + }, +}]); \ No newline at end of file diff --git a/example/example.js b/example/example.js new file mode 100644 index 00000000..e5effe93 --- /dev/null +++ b/example/example.js @@ -0,0 +1,255 @@ +const {ReactDraggable: Draggable, React, ReactDOM} = window; + +class App extends React.Component { + state = { + activeDrags: 0, + deltaPosition: { + x: 0, y: 0 + }, + controlledPosition: { + x: -400, y: 200 + } + }; + + handleDrag = (e, ui) => { + const {x, y} = this.state.deltaPosition; + this.setState({ + deltaPosition: { + x: x + ui.deltaX, + y: y + ui.deltaY, + } + }); + }; + + onStart = () => { + this.setState({activeDrags: ++this.state.activeDrags}); + }; + + onStop = () => { + this.setState({activeDrags: --this.state.activeDrags}); + }; + onDrop = (e) => { + this.setState({activeDrags: --this.state.activeDrags}); + if (e.target.classList.contains("drop-target")) { + alert("Dropped!"); + e.target.classList.remove('hovered'); + } + }; + onDropAreaMouseEnter = (e) => { + if (this.state.activeDrags) { + e.target.classList.add('hovered'); + } + } + onDropAreaMouseLeave = (e) => { + e.target.classList.remove('hovered'); + } + + // For controlled component + adjustXPos = (e) => { + e.preventDefault(); + e.stopPropagation(); + const {x, y} = this.state.controlledPosition; + this.setState({controlledPosition: {x: x - 10, y}}); + }; + + adjustYPos = (e) => { + e.preventDefault(); + e.stopPropagation(); + const {controlledPosition} = this.state; + const {x, y} = controlledPosition; + this.setState({controlledPosition: {x, y: y - 10}}); + }; + + onControlledDrag = (e, position) => { + const {x, y} = position; + this.setState({controlledPosition: {x, y}}); + }; + + onControlledDragStop = (e, position) => { + this.onControlledDrag(e, position); + this.onStop(); + }; + + render() { + const dragHandlers = {onStart: this.onStart, onStop: this.onStop}; + const {deltaPosition, controlledPosition} = this.state; + return ( +
+

React Draggable

+

Active DragHandlers: {this.state.activeDrags}

+

+ Demo Source +

+ +
I can be dragged anywhere
+
+ +
I can only be dragged horizonally (x axis)
+
+ +
I can only be dragged vertically (y axis)
+
+ false}> +
I don't want to be dragged
+
+ +
+
I track my deltas
+
x: {deltaPosition.x.toFixed(0)}, y: {deltaPosition.y.toFixed(0)}
+
+
+ +
+
Drag here
+
You must click my handle to drag me
+
+
+ +
+
Drag here
+
+
+ I have long scrollable content with a handle + {'\n' + Array(40).fill('x').join('\n')} +
+
+
+
+ +
+ Can't drag here +
Dragging here works
+
+
+ +
I snap to a 25 x 25 grid
+
+ +
I snap to a 50 x 50 grid
+
+ +
I can only be moved 100px in any direction.
+
+ +
I can detect drops from the next box.
+
+ +
I can be dropped onto another box.
+
+
+
+ +
+ I can only be moved within my offsetParent.

+ Both parent padding and child margin work properly. +
+
+ +
+ I also can only be moved within my offsetParent.

+ Both parent padding and child margin work properly. +
+
+
+
+ +
+ I can only be moved within the confines of the body element. +
+
+ +
+ I already have an absolute position. +
+
+ + +
+ I use rem instead of px for my transforms. I also have absolute positioning. + +

+ I depend on a CSS hack to avoid double absolute positioning. +
+
+
+ +
+ {"I have a default position of {x: 25, y: 25}, so I'm slightly offset."} +
+
+ +
+ {'I have a default position based on percents {x: \'-10%\', y: \'-10%\'}, so I\'m slightly offset.'} +
+
+ +
+ My position can be changed programmatically.
+ I have a drag handler to sync state. + + +
+
+ +
+ My position can be changed programmatically.
+ I have a dragStop handler to sync state. + + +
+
+ +
+ ); + } +} + +class RemWrapper extends React.Component { + // PropTypes is not available in this environment, but here they are. + // static propTypes = { + // style: PropTypes.shape({ + // transform: PropTypes.string.isRequired + // }), + // children: PropTypes.node.isRequired, + // remBaseline: PropTypes.number, + // } + + translateTransformToRem(transform, remBaseline = 16) { + const convertedValues = transform.replace('translate(', '').replace(')', '') + .split(',') + .map(px => px.replace('px', '')) + .map(px => parseInt(px, 10) / remBaseline) + .map(x => `${x}rem`) + const [x, y] = convertedValues + + return `translate(${x}, ${y})` + } + + render() { + const { children, remBaseline = 16, style } = this.props + const child = React.Children.only(children) + + const editedStyle = { + ...child.props.style, + ...style, + transform: this.translateTransformToRem(style.transform, remBaseline), + } + + return React.cloneElement(child, { + ...child.props, + ...this.props, + style: editedStyle + }) + } +} + + +ReactDOM.render(, document.getElementById('container')); diff --git a/example/index.html b/example/index.html index e932a72b..eccbe04c 100644 --- a/example/index.html +++ b/example/index.html @@ -4,6 +4,13 @@ React Draggable - - - - - - - + + + +
+ + + + + + diff --git a/index.js b/index.js deleted file mode 100644 index 75d03860..00000000 --- a/index.js +++ /dev/null @@ -1,2 +0,0 @@ -module.exports = require('./lib/Draggable'); -module.exports.DraggableCore = require('./lib/DraggableCore'); diff --git a/karma-phantomjs.conf.js b/karma-phantomjs.conf.js new file mode 100644 index 00000000..78600a02 --- /dev/null +++ b/karma-phantomjs.conf.js @@ -0,0 +1,30 @@ +'use strict'; + +const baseConfig = require('./karma.conf.js'); + +module.exports = function(config) { + // Set base config options. + baseConfig(config); + // Then set some of our own, to run PhantomJS. It's a bit older, which is the idea. + // We want to make sure our CJS build still works on old environments. + config.set({ + // Shim required for phantom + frameworks: ['phantomjs-shim', 'jasmine'], + browsers: ['PhantomJS_custom'], + // Includes Map/Set + files: [ + 'specs/draggable-phantom.spec.jsx' + ], + preprocessors: { + 'specs/draggable-phantom.spec.jsx': ['webpack'] + }, + customLaunchers: { + PhantomJS_custom: { + base: 'PhantomJS', + options: { + viewportSize: {width: 1024, height: 768} + } + } + }, + }); +}; diff --git a/karma.conf.js b/karma.conf.js index 608cdecd..65304c18 100644 --- a/karma.conf.js +++ b/karma.conf.js @@ -1,55 +1,53 @@ -var webpack = require('webpack'); +'use strict'; + +const _ = require('lodash'); +const webpack = require('webpack'); +process.env.NODE_ENV = 'development'; +process.env.CHROME_BIN = require('puppeteer').executablePath(); module.exports = function(config) { + const webpackConfig = _.merge( + require('./webpack.config.js')({}, {}), + { + mode: 'development', + cache: true, + performance: { + hints: false, + }, + // zero out externals; we want to bundle React + externals: '', + } + ); + + delete webpackConfig.entry; // karma-webpack complains + delete webpackConfig.output; // karma-webpack complains + // Make sure `process.env` is present as an object + webpackConfig.plugins.push(new webpack.DefinePlugin({ + process: {env: {}}, + })); + config.set({ basePath: '', - frameworks: ['phantomjs-shim', 'jasmine'], + frameworks: ['webpack', 'jasmine'], files: [ - 'specs/main.js' + 'specs/draggable.spec.jsx' ], exclude: [ ], preprocessors: { - 'specs/main.js': ['webpack'] + 'specs/draggable.spec.jsx': ['webpack'] }, - webpack: { - cache: true, - devtool: 'eval', - module: { - loaders: [ - { - test: /\.(?:js|es).?$/, - loader: 'babel-loader', - query: { - cacheDirectory: true, - plugins: [ - 'typecheck' - ] - }, - exclude: /(node_modules)/ - } - ] - }, - plugins: [ - new webpack.DefinePlugin({ - 'process.env': { - NODE_ENV: '"test"' - } - }) - ], - resolve: { - extensions: ['', '.webpack.js', '.web.js', '.js', '.es6'] - } - }, + webpack: webpackConfig, webpackServer: { stats: { + chunks: false, colors: true } }, @@ -64,17 +62,11 @@ module.exports = function(config) { autoWatch: false, - browsers: ['PhantomJS', 'Firefox', 'Chrome'], - - singleRun: false, + browsers: [ + 'Firefox', + 'ChromeHeadless' + ], - plugins: [ - require('karma-jasmine'), - require('karma-phantomjs-launcher'), - require('karma-firefox-launcher'), - require('karma-chrome-launcher'), - require('karma-webpack'), - require('karma-phantomjs-shim') - ] + singleRun: true, }); }; diff --git a/lib/Draggable.es6 b/lib/Draggable.es6 deleted file mode 100644 index 03525dc4..00000000 --- a/lib/Draggable.es6 +++ /dev/null @@ -1,265 +0,0 @@ -import {default as React, PropTypes} from 'react'; -import ReactDOM from 'react-dom'; -import classNames from 'classnames'; -import assign from 'object-assign'; -import {createUIEvent, createTransform} from './utils/domFns'; -import {canDragX, canDragY, getBoundPosition, snapToGrid} from './utils/positionFns'; -import {dontSetMe} from './utils/shims'; -import DraggableCore from './DraggableCore'; -import log from './utils/log'; - -// -// Define -// - -export default class Draggable extends DraggableCore { - - static displayName = 'Draggable'; - - static propTypes = assign({}, DraggableCore.propTypes, { - /** - * `axis` determines which axis the draggable can move. - * - * 'both' allows movement horizontally and vertically. - * 'x' limits movement to horizontal axis. - * 'y' limits movement to vertical axis. - * - * Defaults to 'both'. - */ - axis: PropTypes.oneOf(['both', 'x', 'y']), - - /** - * `bounds` determines the range of movement available to the element. - * Available values are: - * - * 'parent' restricts movement within the Draggable's parent node. - * - * Alternatively, pass an object with the following properties, all of which are optional: - * - * {left: LEFT_BOUND, right: RIGHT_BOUND, bottom: BOTTOM_BOUND, top: TOP_BOUND} - * - * All values are in px. - * - * Example: - * - * ```jsx - * let App = React.createClass({ - * render: function () { - * return ( - * - *
Content
- *
- * ); - * } - * }); - * ``` - */ - bounds: PropTypes.oneOfType([ - PropTypes.shape({ - left: PropTypes.Number, - right: PropTypes.Number, - top: PropTypes.Number, - bottom: PropTypes.Number - }), - PropTypes.oneOf(['parent', false]) - ]), - - /** - * `grid` specifies the x and y that dragging should snap to. - * - * Example: - * - * ```jsx - * let App = React.createClass({ - * render: function () { - * return ( - * - *
I snap to a 25 x 25 grid
- *
- * ); - * } - * }); - * ``` - */ - grid: PropTypes.arrayOf(PropTypes.number), - - /** - * `start` specifies the x and y that the dragged item should start at - * - * Example: - * - * ```jsx - * let App = React.createClass({ - * render: function () { - * return ( - * - *
I start with transformX: 25px and transformY: 25px;
- *
- * ); - * } - * }); - * ``` - */ - start: PropTypes.shape({ - x: PropTypes.number, - y: PropTypes.number - }), - - /** - * `zIndex` specifies the zIndex to use while dragging. - * - * Example: - * - * ```jsx - * let App = React.createClass({ - * render: function () { - * return ( - * - *
I have a zIndex
- *
- * ); - * } - * }); - * ``` - */ - zIndex: PropTypes.number, - - /** - * These properties should be defined on the child, not here. - */ - className: dontSetMe, - style: dontSetMe, - transform: dontSetMe - }); - - static defaultProps = assign({}, DraggableCore.defaultProps, { - axis: 'both', - bounds: false, - grid: null, - start: {x: 0, y: 0}, - zIndex: NaN - }); - - state = { - // Whether or not we are currently dragging. - dragging: false, - - // Current transform x and y. - clientX: this.props.start.x, clientY: this.props.start.y, - - // Can only determine if SVG after mounting - isElementSVG: false - }; - - componentDidMount() { - // Check to see if the element passed is an instanceof SVGElement - if(ReactDOM.findDOMNode(this) instanceof SVGElement) { - this.setState({ isElementSVG: true }); - } - } - - onDragStart = (e, coreEvent) => { - log('Draggable: onDragStart: %j', coreEvent.position); - - // Short-circuit if user's callback killed it. - let shouldStart = this.props.onStart(e, createUIEvent(this, coreEvent)); - // Kills start event on core as well, so move handlers are never bound. - if (shouldStart === false) return false; - - this.setState({ - dragging: true - }); - }; - - onDrag = (e, coreEvent) => { - if (!this.state.dragging) return false; - log('Draggable: onDrag: %j', coreEvent.position); - - // Short-circuit if user's callback killed it. - let shouldUpdate = this.props.onDrag(e, createUIEvent(this, coreEvent)); - if (shouldUpdate === false) return false; - - let newState = { - clientX: this.state.clientX + coreEvent.position.deltaX, - clientY: this.state.clientY + coreEvent.position.deltaY - }; - - // Snap to grid if prop has been provided - if (Array.isArray(this.props.grid)) { - newState.lastX = (this.state.lastX || newState.clientX) + coreEvent.position.deltaX; - newState.lastY = (this.state.lastY || newState.clientY) + coreEvent.position.deltaY; - // Eslint bug, it thinks newState.clientY is undefined - /*eslint no-undef:0*/ - [newState.clientX, newState.clientY] = snapToGrid(this.props.grid, newState.lastX, newState.lastY); - } - - // Keep within bounds. - if (this.props.bounds) { - [newState.clientX, newState.clientY] = getBoundPosition(this, newState.clientX, newState.clientY); - } - - this.setState(newState); - }; - - onDragStop = (e, coreEvent) => { - if (!this.state.dragging) return false; - - // Short-circuit if user's callback killed it. - let shouldStop = this.props.onStop(e, createUIEvent(this, coreEvent)); - if (shouldStop === false) return false; - - log('Draggable: onDragStop: %j', coreEvent.position); - - this.setState({ - dragging: false - }); - }; - - render() { - let style, svgTransform = null; - // Add a CSS transform to move the element around. This allows us to move the element around - // without worrying about whether or not it is relatively or absolutely positioned. - // If the item you are dragging already has a transform set, wrap it in a so - // has a clean slate. - style = createTransform({ - // Set left if horizontal drag is enabled - x: canDragX(this) ? - this.state.clientX : - this.props.start.x, - - // Set top if vertical drag is enabled - y: canDragY(this) ? - this.state.clientY : - this.props.start.y - }, this.state.isElementSVG); - - // If this element was SVG, we use the `transform` attribute. - if (this.state.isElementSVG) { - svgTransform = style; - style = {}; - } - - // zIndex option - if (this.state.dragging && !isNaN(this.props.zIndex)) { - style.zIndex = this.props.zIndex; - } - - // Mark with class while dragging - let className = classNames((this.props.children.props.className || ''), 'react-draggable', { - 'react-draggable-dragging': this.state.dragging, - 'react-draggable-dragged': this.state.dragged - }); - - // Reuse the child provided - // This makes it flexible to use whatever element is wanted (div, ul, etc) - return ( - - {React.cloneElement(React.Children.only(this.props.children), { - className: className, - style: assign({}, this.props.children.props.style, style), - transform: svgTransform - })} - - ); - } -} diff --git a/lib/Draggable.js b/lib/Draggable.js new file mode 100644 index 00000000..1ce95ee1 --- /dev/null +++ b/lib/Draggable.js @@ -0,0 +1,401 @@ +// @flow +import * as React from 'react'; +import PropTypes from 'prop-types'; +import ReactDOM from 'react-dom'; +import { clsx } from 'clsx'; +import {createCSSTransform, createSVGTransform} from './utils/domFns'; +import {canDragX, canDragY, createDraggableData, getBoundPosition} from './utils/positionFns'; +import {dontSetMe} from './utils/shims'; +import DraggableCore from './DraggableCore'; +import type {ControlPosition, PositionOffsetControlPosition, DraggableCoreProps, DraggableCoreDefaultProps} from './DraggableCore'; +import log from './utils/log'; +import type {Bounds, DraggableEventHandler} from './utils/types'; +import type {Element as ReactElement} from 'react'; + +type DraggableState = { + dragging: boolean, + dragged: boolean, + x: number, y: number, + slackX: number, slackY: number, + isElementSVG: boolean, + prevPropsPosition: ?ControlPosition, +}; + +export type DraggableDefaultProps = { + ...DraggableCoreDefaultProps, + axis: 'both' | 'x' | 'y' | 'none', + bounds: Bounds | string | false, + defaultClassName: string, + defaultClassNameDragging: string, + defaultClassNameDragged: string, + defaultPosition: ControlPosition, + scale: number, +}; + +export type DraggableProps = { + ...DraggableCoreProps, + ...DraggableDefaultProps, + positionOffset: PositionOffsetControlPosition, + position: ControlPosition, +}; + +// +// Define +// + +class Draggable extends React.Component { + + static displayName: ?string = 'Draggable'; + + static propTypes: DraggableProps = { + // Accepts all props accepts. + ...DraggableCore.propTypes, + + /** + * `axis` determines which axis the draggable can move. + * + * Note that all callbacks will still return data as normal. This only + * controls flushing to the DOM. + * + * 'both' allows movement horizontally and vertically. + * 'x' limits movement to horizontal axis. + * 'y' limits movement to vertical axis. + * 'none' limits all movement. + * + * Defaults to 'both'. + */ + axis: PropTypes.oneOf(['both', 'x', 'y', 'none']), + + /** + * `bounds` determines the range of movement available to the element. + * Available values are: + * + * 'parent' restricts movement within the Draggable's parent node. + * + * Alternatively, pass an object with the following properties, all of which are optional: + * + * {left: LEFT_BOUND, right: RIGHT_BOUND, bottom: BOTTOM_BOUND, top: TOP_BOUND} + * + * All values are in px. + * + * Example: + * + * ```jsx + * let App = React.createClass({ + * render: function () { + * return ( + * + *
Content
+ *
+ * ); + * } + * }); + * ``` + */ + bounds: PropTypes.oneOfType([ + PropTypes.shape({ + left: PropTypes.number, + right: PropTypes.number, + top: PropTypes.number, + bottom: PropTypes.number + }), + PropTypes.string, + PropTypes.oneOf([false]) + ]), + + defaultClassName: PropTypes.string, + defaultClassNameDragging: PropTypes.string, + defaultClassNameDragged: PropTypes.string, + + /** + * `defaultPosition` specifies the x and y that the dragged item should start at + * + * Example: + * + * ```jsx + * let App = React.createClass({ + * render: function () { + * return ( + * + *
I start with transformX: 25px and transformY: 25px;
+ *
+ * ); + * } + * }); + * ``` + */ + defaultPosition: PropTypes.shape({ + x: PropTypes.number, + y: PropTypes.number + }), + positionOffset: PropTypes.shape({ + x: PropTypes.oneOfType([PropTypes.number, PropTypes.string]), + y: PropTypes.oneOfType([PropTypes.number, PropTypes.string]) + }), + + /** + * `position`, if present, defines the current position of the element. + * + * This is similar to how form elements in React work - if no `position` is supplied, the component + * is uncontrolled. + * + * Example: + * + * ```jsx + * let App = React.createClass({ + * render: function () { + * return ( + * + *
I start with transformX: 25px and transformY: 25px;
+ *
+ * ); + * } + * }); + * ``` + */ + position: PropTypes.shape({ + x: PropTypes.number, + y: PropTypes.number + }), + + /** + * These properties should be defined on the child, not here. + */ + className: dontSetMe, + style: dontSetMe, + transform: dontSetMe + }; + + static defaultProps: DraggableDefaultProps = { + ...DraggableCore.defaultProps, + axis: 'both', + bounds: false, + defaultClassName: 'react-draggable', + defaultClassNameDragging: 'react-draggable-dragging', + defaultClassNameDragged: 'react-draggable-dragged', + defaultPosition: {x: 0, y: 0}, + scale: 1 + }; + + // React 16.3+ + // Arity (props, state) + static getDerivedStateFromProps({position}: DraggableProps, {prevPropsPosition}: DraggableState): ?Partial { + // Set x/y if a new position is provided in props that is different than the previous. + if ( + position && + (!prevPropsPosition || + position.x !== prevPropsPosition.x || position.y !== prevPropsPosition.y + ) + ) { + log('Draggable: getDerivedStateFromProps %j', {position, prevPropsPosition}); + return { + x: position.x, + y: position.y, + prevPropsPosition: {...position} + }; + } + return null; + } + + constructor(props: DraggableProps) { + super(props); + + this.state = { + // Whether or not we are currently dragging. + dragging: false, + + // Whether or not we have been dragged before. + dragged: false, + + // Current transform x and y. + x: props.position ? props.position.x : props.defaultPosition.x, + y: props.position ? props.position.y : props.defaultPosition.y, + + prevPropsPosition: {...props.position}, + + // Used for compensating for out-of-bounds drags + slackX: 0, slackY: 0, + + // Can only determine if SVG after mounting + isElementSVG: false + }; + + if (props.position && !(props.onDrag || props.onStop)) { + // eslint-disable-next-line no-console + console.warn('A `position` was applied to this , without drag handlers. This will make this ' + + 'component effectively undraggable. Please attach `onDrag` or `onStop` handlers so you can adjust the ' + + '`position` of this element.'); + } + } + + componentDidMount() { + // Check to see if the element passed is an instanceof SVGElement + if(typeof window.SVGElement !== 'undefined' && this.findDOMNode() instanceof window.SVGElement) { + this.setState({isElementSVG: true}); + } + } + + componentWillUnmount() { + if (this.state.dragging) { + this.setState({dragging: false}); // prevents invariant if unmounted while dragging + } + } + + // React Strict Mode compatibility: if `nodeRef` is passed, we will use it instead of trying to find + // the underlying DOM node ourselves. See the README for more information. + findDOMNode(): ?HTMLElement { + return this.props?.nodeRef?.current ?? ReactDOM.findDOMNode(this); + } + + onDragStart: DraggableEventHandler = (e, coreData) => { + log('Draggable: onDragStart: %j', coreData); + + // Short-circuit if user's callback killed it. + const shouldStart = this.props.onStart(e, createDraggableData(this, coreData)); + // Kills start event on core as well, so move handlers are never bound. + if (shouldStart === false) return false; + + this.setState({dragging: true, dragged: true}); + }; + + onDrag: DraggableEventHandler = (e, coreData) => { + if (!this.state.dragging) return false; + log('Draggable: onDrag: %j', coreData); + + const uiData = createDraggableData(this, coreData); + + const newState = { + x: uiData.x, + y: uiData.y, + slackX: 0, + slackY: 0, + }; + + // Keep within bounds. + if (this.props.bounds) { + // Save original x and y. + const {x, y} = newState; + + // Add slack to the values used to calculate bound position. This will ensure that if + // we start removing slack, the element won't react to it right away until it's been + // completely removed. + newState.x += this.state.slackX; + newState.y += this.state.slackY; + + // Get bound position. This will ceil/floor the x and y within the boundaries. + const [newStateX, newStateY] = getBoundPosition(this, newState.x, newState.y); + newState.x = newStateX; + newState.y = newStateY; + + // Recalculate slack by noting how much was shaved by the boundPosition handler. + newState.slackX = this.state.slackX + (x - newState.x); + newState.slackY = this.state.slackY + (y - newState.y); + + // Update the event we fire to reflect what really happened after bounds took effect. + uiData.x = newState.x; + uiData.y = newState.y; + uiData.deltaX = newState.x - this.state.x; + uiData.deltaY = newState.y - this.state.y; + } + + // Short-circuit if user's callback killed it. + const shouldUpdate = this.props.onDrag(e, uiData); + if (shouldUpdate === false) return false; + + this.setState(newState); + }; + + onDragStop: DraggableEventHandler = (e, coreData) => { + if (!this.state.dragging) return false; + + // Short-circuit if user's callback killed it. + const shouldContinue = this.props.onStop(e, createDraggableData(this, coreData)); + if (shouldContinue === false) return false; + + log('Draggable: onDragStop: %j', coreData); + + const newState: Partial = { + dragging: false, + slackX: 0, + slackY: 0 + }; + + // If this is a controlled component, the result of this operation will be to + // revert back to the old position. We expect a handler on `onDragStop`, at the least. + const controlled = Boolean(this.props.position); + if (controlled) { + const {x, y} = this.props.position; + newState.x = x; + newState.y = y; + } + + this.setState(newState); + }; + + render(): ReactElement { + const { + axis, + bounds, + children, + defaultPosition, + defaultClassName, + defaultClassNameDragging, + defaultClassNameDragged, + position, + positionOffset, + scale, + ...draggableCoreProps + } = this.props; + + let style = {}; + let svgTransform = null; + + // If this is controlled, we don't want to move it - unless it's dragging. + const controlled = Boolean(position); + const draggable = !controlled || this.state.dragging; + + const validPosition = position || defaultPosition; + const transformOpts = { + // Set left if horizontal drag is enabled + x: canDragX(this) && draggable ? + this.state.x : + validPosition.x, + + // Set top if vertical drag is enabled + y: canDragY(this) && draggable ? + this.state.y : + validPosition.y + }; + + // If this element was SVG, we use the `transform` attribute. + if (this.state.isElementSVG) { + svgTransform = createSVGTransform(transformOpts, positionOffset); + } else { + // Add a CSS transform to move the element around. This allows us to move the element around + // without worrying about whether or not it is relatively or absolutely positioned. + // If the item you are dragging already has a transform set, wrap it in a so + // has a clean slate. + style = createCSSTransform(transformOpts, positionOffset); + } + + // Mark with class while dragging + const className = clsx((children.props.className || ''), defaultClassName, { + [defaultClassNameDragging]: this.state.dragging, + [defaultClassNameDragged]: this.state.dragged + }); + + // Reuse the child provided + // This makes it flexible to use whatever element is wanted (div, ul, etc) + return ( + + {React.cloneElement(React.Children.only(children), { + className: className, + style: {...children.props.style, ...style}, + transform: svgTransform + })} + + ); + } +} + +export {Draggable as default, DraggableCore}; diff --git a/lib/DraggableCore.es6 b/lib/DraggableCore.es6 deleted file mode 100644 index f8f490b4..00000000 --- a/lib/DraggableCore.es6 +++ /dev/null @@ -1,377 +0,0 @@ -import {default as React, PropTypes} from 'react'; -import {matchesSelector, createCoreEvent, addEvent, removeEvent, addUserSelectStyles, - removeUserSelectStyles, styleHacks} from './utils/domFns'; -import {getControlPosition} from './utils/positionFns'; -import {dontSetMe} from './utils/shims'; -import log from './utils/log'; - -// Simple abstraction for dragging events names. -let eventsFor = { - touch: { - start: 'touchstart', - move: 'touchmove', - stop: 'touchend' - }, - mouse: { - start: 'mousedown', - move: 'mousemove', - stop: 'mouseup' - } -}; - -// Default to mouse events. -let dragEventFor = eventsFor.mouse; - -// -// Define . -// -// is for advanced usage of . It maintains minimal internal state so it can -// work well with libraries that require more control over the element. -// - -export default class DraggableCore extends React.Component { - - static displayName = 'DraggableCore'; - - static propTypes = { - /** - * `disabled`, if true, stops the from dragging. All handlers, - * with the exception of `onMouseDown`, will not fire. - * - * Example: - * - * ```jsx - * let App = React.createClass({ - * render: function () { - * return ( - * - *
I can't be dragged
- *
- * ); - * } - * }); - * ``` - */ - disabled: PropTypes.bool, - - /** - * By default, we add 'user-select:none' attributes to the document body - * to prevent ugly text selection during drag. If this is causing problems - * for your app, set this to `false`. - */ - enableUserSelectHack: PropTypes.bool, - - /** - * `handle` specifies a selector to be used as the handle that initiates drag. - * - * Example: - * - * ```jsx - * let App = React.createClass({ - * render: function () { - * return ( - * - *
- *
Click me to drag
- *
This is some other content
- *
- *
- * ); - * } - * }); - * ``` - */ - handle: PropTypes.string, - - /** - * `cancel` specifies a selector to be used to prevent drag initialization. - * - * Example: - * - * ```jsx - * let App = React.createClass({ - * render: function () { - * return( - * - *
- *
You can't drag from here
- *
Dragging here works fine
- *
- *
- * ); - * } - * }); - * ``` - */ - cancel: PropTypes.string, - - /** - * Called when dragging starts. - * If this function returns the boolean false, dragging will be canceled. - * - * Example: - * - * ```js - * function (event, ui) {} - * ``` - * - * `event` is the Event that was triggered. - * `ui` is an object: - * - * ```js - * { - * position: {top: 0, left: 0} - * } - * ``` - */ - onStart: PropTypes.func, - - /** - * Called while dragging. - * If this function returns the boolean false, dragging will be canceled. - * - * Example: - * - * ```js - * function (event, ui) {} - * ``` - * - * `event` is the Event that was triggered. - * `ui` is an object: - * - * ```js - * { - * position: {top: 0, left: 0} - * } - * ``` - */ - onDrag: PropTypes.func, - - /** - * Called when dragging stops. - * - * Example: - * - * ```js - * function (event, ui) {} - * ``` - * - * `event` is the Event that was triggered. - * `ui` is an object: - * - * ```js - * { - * position: {top: 0, left: 0} - * } - * ``` - */ - onStop: PropTypes.func, - - /** - * A workaround option which can be passed if onMouseDown needs to be accessed, - * since it'll always be blocked (due to that there's internal use of onMouseDown) - */ - onMouseDown: PropTypes.func, - - /** - * These properties should be defined on the child, not here. - */ - className: dontSetMe, - style: dontSetMe, - transform: dontSetMe - }; - - static defaultProps = { - cancel: null, - disabled: false, - enableUserSelectHack: true, - handle: null, - transform: null, - onStart: function(){}, - onDrag: function(){}, - onStop: function(){}, - onMouseDown: function(){} - }; - - state = { - dragging: false, - // Used while dragging to determine deltas. - lastX: null, lastY: null - }; - - componentWillUnmount() { - // Remove any leftover event handlers. Remove both touch and mouse handlers in case - // some browser quirk caused a touch event to fire during a mouse move, or vice versa. - removeEvent(document, eventsFor.mouse.move, this.handleDrag); - removeEvent(document, eventsFor.touch.move, this.handleDrag); - removeEvent(document, eventsFor.mouse.stop, this.handleDragStop); - removeEvent(document, eventsFor.touch.stop, this.handleDragStop); - if (this.props.enableUserSelectHack) removeUserSelectStyles(); - } - - handleDragStart = (e) => { - // Make it possible to attach event handlers on top of this one. - this.props.onMouseDown(e); - - // Short circuit if handle or cancel prop was provided and selector doesn't match. - if (this.props.disabled || - (this.props.handle && !matchesSelector(e.target, this.props.handle)) || - (this.props.cancel && matchesSelector(e.target, this.props.cancel))) { - return; - } - - // Set touch identifier in component state if this is a touch event. This allows us to - // distinguish between individual touches on multitouch screens by identifying which - // touchpoint was set to this element. - if (e.targetTouches){ - this.setState({touchIdentifier: e.targetTouches[0].identifier}); - } - - // Add a style to the body to disable user-select. This prevents text from - // being selected all over the page. - addUserSelectStyles(); - - // Get the current drag point from the event. This is used as the offset. - let {clientX, clientY} = getControlPosition(e); - - // Create an event object with all the data parents need to make a decision here. - let coreEvent = createCoreEvent(this, clientX, clientY); - - log('DraggableCore: handleDragStart: %j', coreEvent.position); - - // Call event handler. If it returns explicit false, cancel. - log('calling', this.props.onStart); - let shouldUpdate = this.props.onStart(e, coreEvent); - if (shouldUpdate === false) return; - - - // Initiate dragging. Set the current x and y as offsets - // so we know how much we've moved during the drag. This allows us - // to drag elements around even if they have been moved, without issue. - this.setState({ - dragging: true, - - lastX: clientX, - lastY: clientY, - // Stored so we can adjust our offset if scrolled. - scrollX: document.body.scrollLeft, - scrollY: document.body.scrollTop - }); - - // Translate el on page scroll. - addEvent(document, 'scroll', this.handleScroll); - // Add events to the document directly so we catch when the user's mouse/touch moves outside of - // this element. We use different events depending on whether or not we have detected that this - // is a touch-capable device. - addEvent(document, dragEventFor.move, this.handleDrag); - addEvent(document, dragEventFor.stop, this.handleDragStop); - }; - - handleDrag = (e) => { - // Return if this is a touch event, but not the correct one for this element - if (e.targetTouches && (e.targetTouches[0].identifier !== this.state.touchIdentifier)) return; - - let {clientX, clientY} = getControlPosition(e); - - let coreEvent = createCoreEvent(this, clientX, clientY); - - log('DraggableCore: handleDrag: %j', coreEvent.position); - - // Call event handler. If it returns explicit false, trigger end. - let shouldUpdate = this.props.onDrag(e, coreEvent); - if (shouldUpdate === false) { - this.handleDragStop({}); - return; - } - - this.setState({ - lastX: clientX, - lastY: clientY - }); - }; - - handleDragStop = (e) => { - if (!this.state.dragging) return; - - // Short circuit if this is not the correct touch event. `changedTouches` contains all - // touch points that have been removed from the surface. - if (e.changedTouches && (e.changedTouches[0].identifier !== this.state.touchIdentifier)) return; - - // Remove user-select hack - if (this.props.enableUserSelectHack) removeUserSelectStyles(); - - let {clientX, clientY} = getControlPosition(e); - let coreEvent = createCoreEvent(this, clientX, clientY); - - log('DraggableCore: handleDragStop: %j', coreEvent.position); - - // Reset the el. - this.setState({ - dragging: false, - lastX: null, - lastY: null - }); - - // Call event handler - this.props.onStop(e, coreEvent); - - // Remove event handlers - log('DraggableCore: Removing handlers'); - removeEvent(document, 'scroll', this.handleScroll); - removeEvent(document, dragEventFor.move, this.handleDrag); - removeEvent(document, dragEventFor.stop, this.handleDragStop); - }; - - // When the user scrolls, adjust internal state so the draggable moves along the page properly. - // This only fires when a drag is active. - handleScroll = () => { - let s = this.state, x = document.body.scrollLeft, y = document.body.scrollTop; - - // Create the usual event, but make the scroll offset our deltas. - let coreEvent = createCoreEvent(this); - coreEvent.deltaX = x - s.scrollX; - coreEvent.deltaY = y - s.scrollY; - - this.setState({ - lastX: s.lastX + coreEvent.deltaX, - lastY: s.lastY + coreEvent.deltaY - }); - - this.props.onDrag(coreEvent); - }; - - // On mousedown, consider the drag started. - onMouseDown = (e) => { - // HACK: Prevent 'ghost click' which happens 300ms after touchstart if the event isn't cancelled. - // We don't cancel the event on touchstart because of #37; we might want to make a scrollable item draggable. - // More on ghost clicks: http://ariatemplates.com/blog/2014/05/ghost-clicks-in-mobile-browsers/ - if (dragEventFor === eventsFor.touch) { - return e.preventDefault(); - } - - return this.handleDragStart(e); - }; - - // Same as onMouseDown (start drag), but now consider this a touch device. - onTouchStart = (e) => { - // We're on a touch device now, so change the event handlers - dragEventFor = eventsFor.touch; - - return this.handleDragStart(e); - }; - - render() { - // Reuse the child provided - // This makes it flexible to use whatever element is wanted (div, ul, etc) - return React.cloneElement(React.Children.only(this.props.children), { - style: styleHacks(this.props.children.props.style), - - // Note: mouseMove handler is attached to document so it will still function - // when the user drags quickly and leaves the bounds of the element. - onMouseDown: this.onMouseDown, - onTouchStart: this.onTouchStart, - onMouseUp: this.handleDragStop, - onTouchEnd: this.handleDragStop - }); - } -} diff --git a/lib/DraggableCore.js b/lib/DraggableCore.js new file mode 100644 index 00000000..e673e024 --- /dev/null +++ b/lib/DraggableCore.js @@ -0,0 +1,466 @@ +// @flow +import * as React from 'react'; +import PropTypes from 'prop-types'; +import ReactDOM from 'react-dom'; +import {matchesSelectorAndParentsTo, addEvent, removeEvent, addUserSelectStyles, getTouchIdentifier, + scheduleRemoveUserSelectStyles} from './utils/domFns'; +import {createCoreData, getControlPosition, snapToGrid} from './utils/positionFns'; +import {dontSetMe} from './utils/shims'; +import log from './utils/log'; + +import type {EventHandler, MouseTouchEvent} from './utils/types'; +import type {Element as ReactElement} from 'react'; + +// Simple abstraction for dragging events names. +const eventsFor = { + touch: { + start: 'touchstart', + move: 'touchmove', + stop: 'touchend' + }, + mouse: { + start: 'mousedown', + move: 'mousemove', + stop: 'mouseup' + } +}; + +// Default to mouse events. +let dragEventFor = eventsFor.mouse; + +export type DraggableData = { + node: HTMLElement, + x: number, y: number, + deltaX: number, deltaY: number, + lastX: number, lastY: number, +}; + +export type DraggableEventHandler = (e: MouseEvent, data: DraggableData) => void | false; + +export type ControlPosition = {x: number, y: number}; +export type PositionOffsetControlPosition = {x: number|string, y: number|string}; + +export type DraggableCoreDefaultProps = { + allowAnyClick: boolean, + allowMobileScroll: boolean, + disabled: boolean, + enableUserSelectHack: boolean, + onStart: DraggableEventHandler, + onDrag: DraggableEventHandler, + onStop: DraggableEventHandler, + onMouseDown: (e: MouseEvent) => void, + scale: number, +}; + +export type DraggableCoreProps = { + ...DraggableCoreDefaultProps, + cancel: string, + children: ReactElement, + offsetParent: HTMLElement, + grid: [number, number], + handle: string, + nodeRef?: ?React.ElementRef, +}; + +// +// Define . +// +// is for advanced usage of . It maintains minimal internal state so it can +// work well with libraries that require more control over the element. +// + +export default class DraggableCore extends React.Component { + + static displayName: ?string = 'DraggableCore'; + + static propTypes: Object = { + /** + * `allowAnyClick` allows dragging using any mouse button. + * By default, we only accept the left button. + * + * Defaults to `false`. + */ + allowAnyClick: PropTypes.bool, + + /** + * `allowMobileScroll` turns off cancellation of the 'touchstart' event + * on mobile devices. Only enable this if you are having trouble with click + * events. Prefer using 'handle' / 'cancel' instead. + * + * Defaults to `false`. + */ + allowMobileScroll: PropTypes.bool, + + children: PropTypes.node.isRequired, + + /** + * `disabled`, if true, stops the from dragging. All handlers, + * with the exception of `onMouseDown`, will not fire. + */ + disabled: PropTypes.bool, + + /** + * By default, we add 'user-select:none' attributes to the document body + * to prevent ugly text selection during drag. If this is causing problems + * for your app, set this to `false`. + */ + enableUserSelectHack: PropTypes.bool, + + /** + * `offsetParent`, if set, uses the passed DOM node to compute drag offsets + * instead of using the parent node. + */ + offsetParent: function(props: DraggableCoreProps, propName: $Keys) { + if (props[propName] && props[propName].nodeType !== 1) { + throw new Error('Draggable\'s offsetParent must be a DOM Node.'); + } + }, + + /** + * `grid` specifies the x and y that dragging should snap to. + */ + grid: PropTypes.arrayOf(PropTypes.number), + + /** + * `handle` specifies a selector to be used as the handle that initiates drag. + * + * Example: + * + * ```jsx + * let App = React.createClass({ + * render: function () { + * return ( + * + *
+ *
Click me to drag
+ *
This is some other content
+ *
+ *
+ * ); + * } + * }); + * ``` + */ + handle: PropTypes.string, + + /** + * `cancel` specifies a selector to be used to prevent drag initialization. + * + * Example: + * + * ```jsx + * let App = React.createClass({ + * render: function () { + * return( + * + *
+ *
You can't drag from here
+ *
Dragging here works fine
+ *
+ *
+ * ); + * } + * }); + * ``` + */ + cancel: PropTypes.string, + + /* If running in React Strict mode, ReactDOM.findDOMNode() is deprecated. + * Unfortunately, in order for to work properly, we need raw access + * to the underlying DOM node. If you want to avoid the warning, pass a `nodeRef` + * as in this example: + * + * function MyComponent() { + * const nodeRef = React.useRef(null); + * return ( + * + *
Example Target
+ *
+ * ); + * } + * + * This can be used for arbitrarily nested components, so long as the ref ends up + * pointing to the actual child DOM node and not a custom component. + */ + nodeRef: PropTypes.object, + + /** + * Called when dragging starts. + * If this function returns the boolean false, dragging will be canceled. + */ + onStart: PropTypes.func, + + /** + * Called while dragging. + * If this function returns the boolean false, dragging will be canceled. + */ + onDrag: PropTypes.func, + + /** + * Called when dragging stops. + * If this function returns the boolean false, the drag will remain active. + */ + onStop: PropTypes.func, + + /** + * A workaround option which can be passed if onMouseDown needs to be accessed, + * since it'll always be blocked (as there is internal use of onMouseDown) + */ + onMouseDown: PropTypes.func, + + /** + * `scale`, if set, applies scaling while dragging an element + */ + scale: PropTypes.number, + + /** + * These properties should be defined on the child, not here. + */ + className: dontSetMe, + style: dontSetMe, + transform: dontSetMe + }; + + static defaultProps: DraggableCoreDefaultProps = { + allowAnyClick: false, // by default only accept left click + allowMobileScroll: false, + disabled: false, + enableUserSelectHack: true, + onStart: function(){}, + onDrag: function(){}, + onStop: function(){}, + onMouseDown: function(){}, + scale: 1, + }; + + dragging: boolean = false; + + // Used while dragging to determine deltas. + lastX: number = NaN; + lastY: number = NaN; + + touchIdentifier: ?number = null; + + mounted: boolean = false; + + componentDidMount() { + this.mounted = true; + // Touch handlers must be added with {passive: false} to be cancelable. + // https://developers.google.com/web/updates/2017/01/scrolling-intervention + const thisNode = this.findDOMNode(); + if (thisNode) { + addEvent(thisNode, eventsFor.touch.start, this.onTouchStart, {passive: false}); + } + } + + componentWillUnmount() { + this.mounted = false; + // Remove any leftover event handlers. Remove both touch and mouse handlers in case + // some browser quirk caused a touch event to fire during a mouse move, or vice versa. + const thisNode = this.findDOMNode(); + if (thisNode) { + const {ownerDocument} = thisNode; + removeEvent(ownerDocument, eventsFor.mouse.move, this.handleDrag); + removeEvent(ownerDocument, eventsFor.touch.move, this.handleDrag); + removeEvent(ownerDocument, eventsFor.mouse.stop, this.handleDragStop); + removeEvent(ownerDocument, eventsFor.touch.stop, this.handleDragStop); + removeEvent(thisNode, eventsFor.touch.start, this.onTouchStart, {passive: false}); + if (this.props.enableUserSelectHack) scheduleRemoveUserSelectStyles(ownerDocument); + } + } + + // React Strict Mode compatibility: if `nodeRef` is passed, we will use it instead of trying to find + // the underlying DOM node ourselves. See the README for more information. + findDOMNode(): ?HTMLElement { + return this.props?.nodeRef ? this.props?.nodeRef?.current : ReactDOM.findDOMNode(this); + } + + handleDragStart: EventHandler = (e) => { + // Make it possible to attach event handlers on top of this one. + this.props.onMouseDown(e); + + // Only accept left-clicks. + if (!this.props.allowAnyClick && typeof e.button === 'number' && e.button !== 0) return false; + + // Get nodes. Be sure to grab relative document (could be iframed) + const thisNode = this.findDOMNode(); + if (!thisNode || !thisNode.ownerDocument || !thisNode.ownerDocument.body) { + throw new Error(' not mounted on DragStart!'); + } + const {ownerDocument} = thisNode; + + // Short circuit if handle or cancel prop was provided and selector doesn't match. + if (this.props.disabled || + (!(e.target instanceof ownerDocument.defaultView.Node)) || + (this.props.handle && !matchesSelectorAndParentsTo(e.target, this.props.handle, thisNode)) || + (this.props.cancel && matchesSelectorAndParentsTo(e.target, this.props.cancel, thisNode))) { + return; + } + + // Prevent scrolling on mobile devices, like ipad/iphone. + // Important that this is after handle/cancel. + if (e.type === 'touchstart' && !this.props.allowMobileScroll) e.preventDefault(); + + // Set touch identifier in component state if this is a touch event. This allows us to + // distinguish between individual touches on multitouch screens by identifying which + // touchpoint was set to this element. + const touchIdentifier = getTouchIdentifier(e); + this.touchIdentifier = touchIdentifier; + + // Get the current drag point from the event. This is used as the offset. + const position = getControlPosition(e, touchIdentifier, this); + if (position == null) return; // not possible but satisfies flow + const {x, y} = position; + + // Create an event object with all the data parents need to make a decision here. + const coreEvent = createCoreData(this, x, y); + + log('DraggableCore: handleDragStart: %j', coreEvent); + + // Call event handler. If it returns explicit false, cancel. + log('calling', this.props.onStart); + const shouldUpdate = this.props.onStart(e, coreEvent); + if (shouldUpdate === false || this.mounted === false) return; + + // Add a style to the body to disable user-select. This prevents text from + // being selected all over the page. + if (this.props.enableUserSelectHack) addUserSelectStyles(ownerDocument); + + // Initiate dragging. Set the current x and y as offsets + // so we know how much we've moved during the drag. This allows us + // to drag elements around even if they have been moved, without issue. + this.dragging = true; + this.lastX = x; + this.lastY = y; + + // Add events to the document directly so we catch when the user's mouse/touch moves outside of + // this element. We use different events depending on whether or not we have detected that this + // is a touch-capable device. + addEvent(ownerDocument, dragEventFor.move, this.handleDrag); + addEvent(ownerDocument, dragEventFor.stop, this.handleDragStop); + }; + + handleDrag: EventHandler = (e) => { + + // Get the current drag point from the event. This is used as the offset. + const position = getControlPosition(e, this.touchIdentifier, this); + if (position == null) return; + let {x, y} = position; + + // Snap to grid if prop has been provided + if (Array.isArray(this.props.grid)) { + let deltaX = x - this.lastX, deltaY = y - this.lastY; + [deltaX, deltaY] = snapToGrid(this.props.grid, deltaX, deltaY); + if (!deltaX && !deltaY) return; // skip useless drag + x = this.lastX + deltaX, y = this.lastY + deltaY; + } + + const coreEvent = createCoreData(this, x, y); + + log('DraggableCore: handleDrag: %j', coreEvent); + + // Call event handler. If it returns explicit false, trigger end. + const shouldUpdate = this.props.onDrag(e, coreEvent); + if (shouldUpdate === false || this.mounted === false) { + try { + // $FlowIgnore + this.handleDragStop(new MouseEvent('mouseup')); + } catch (err) { + // Old browsers + const event = ((document.createEvent('MouseEvents'): any): MouseTouchEvent); + // I see why this insanity was deprecated + // $FlowIgnore + event.initMouseEvent('mouseup', true, true, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null); + this.handleDragStop(event); + } + return; + } + + this.lastX = x; + this.lastY = y; + }; + + handleDragStop: EventHandler = (e) => { + if (!this.dragging) return; + + const position = getControlPosition(e, this.touchIdentifier, this); + if (position == null) return; + let {x, y} = position; + + // Snap to grid if prop has been provided + if (Array.isArray(this.props.grid)) { + let deltaX = x - this.lastX || 0; + let deltaY = y - this.lastY || 0; + [deltaX, deltaY] = snapToGrid(this.props.grid, deltaX, deltaY); + x = this.lastX + deltaX, y = this.lastY + deltaY; + } + + const coreEvent = createCoreData(this, x, y); + + // Call event handler + const shouldContinue = this.props.onStop(e, coreEvent); + if (shouldContinue === false || this.mounted === false) return false; + + const thisNode = this.findDOMNode(); + if (thisNode) { + // Remove user-select hack + if (this.props.enableUserSelectHack) scheduleRemoveUserSelectStyles(thisNode.ownerDocument); + } + + log('DraggableCore: handleDragStop: %j', coreEvent); + + // Reset the el. + this.dragging = false; + this.lastX = NaN; + this.lastY = NaN; + + if (thisNode) { + // Remove event handlers + log('DraggableCore: Removing handlers'); + removeEvent(thisNode.ownerDocument, dragEventFor.move, this.handleDrag); + removeEvent(thisNode.ownerDocument, dragEventFor.stop, this.handleDragStop); + } + }; + + onMouseDown: EventHandler = (e) => { + dragEventFor = eventsFor.mouse; // on touchscreen laptops we could switch back to mouse + + return this.handleDragStart(e); + }; + + onMouseUp: EventHandler = (e) => { + dragEventFor = eventsFor.mouse; + + return this.handleDragStop(e); + }; + + // Same as onMouseDown (start drag), but now consider this a touch device. + onTouchStart: EventHandler = (e) => { + // We're on a touch device now, so change the event handlers + dragEventFor = eventsFor.touch; + + return this.handleDragStart(e); + }; + + onTouchEnd: EventHandler = (e) => { + // We're on a touch device now, so change the event handlers + dragEventFor = eventsFor.touch; + + return this.handleDragStop(e); + }; + + render(): React.Element { + // Reuse the child provided + // This makes it flexible to use whatever element is wanted (div, ul, etc) + return React.cloneElement(React.Children.only(this.props.children), { + // Note: mouseMove handler is attached to document so it will still function + // when the user drags quickly and leaves the bounds of the element. + onMouseDown: this.onMouseDown, + onMouseUp: this.onMouseUp, + // onTouchStart is added on `componentDidMount` so they can be added with + // {passive: false}, which allows it to cancel. See + // https://developers.google.com/web/updates/2017/01/scrolling-intervention + onTouchEnd: this.onTouchEnd + }); + } +} diff --git a/lib/cjs.js b/lib/cjs.js new file mode 100644 index 00000000..7b560bb0 --- /dev/null +++ b/lib/cjs.js @@ -0,0 +1,8 @@ +const {default: Draggable, DraggableCore} = require('./Draggable'); + +// Previous versions of this lib exported as the root export. As to no-// them, or TypeScript, we export *both* as the root and as 'default'. +// See https://github.com/mzabriskie/react-draggable/pull/254 +// and https://github.com/mzabriskie/react-draggable/issues/266 +module.exports = Draggable; +module.exports.default = Draggable; +module.exports.DraggableCore = DraggableCore; diff --git a/lib/utils/domFns.es6 b/lib/utils/domFns.es6 deleted file mode 100644 index ef88e7b8..00000000 --- a/lib/utils/domFns.es6 +++ /dev/null @@ -1,162 +0,0 @@ -import {findInArray, isFunction, isNum, int} from './shims'; -import browserPrefix from './getPrefix'; -import assign from 'object-assign'; -import ReactDOM from 'react-dom'; - -let matchesSelectorFunc = ''; -export function matchesSelector(el: Node, selector: string) { - if (!matchesSelectorFunc) { - matchesSelectorFunc = findInArray([ - 'matches', - 'webkitMatchesSelector', - 'mozMatchesSelector', - 'msMatchesSelector', - 'oMatchesSelector' - ], function(method){ - return isFunction(el[method]); - }); - } - - return el[matchesSelectorFunc].call(el, selector); -} - -export function addEvent(el: ?Node, event: string, handler: Function) { - if (!el) { return; } - if (el.attachEvent) { - el.attachEvent('on' + event, handler); - } else if (el.addEventListener) { - el.addEventListener(event, handler, true); - } else { - el['on' + event] = handler; - } -} - -export function removeEvent(el: ?Node, event: string, handler: Function) { - if (!el) { return; } - if (el.detachEvent) { - el.detachEvent('on' + event, handler); - } else if (el.removeEventListener) { - el.removeEventListener(event, handler, true); - } else { - el['on' + event] = null; - } -} - -export function outerHeight(node: Node) { - // This is deliberately excluding margin for our calculations, since we are using - // offsetTop which is including margin. See getBoundPosition - let height = node.clientHeight; - let computedStyle = window.getComputedStyle(node); - height += int(computedStyle.borderTopWidth); - height += int(computedStyle.borderBottomWidth); - return height; -} - -export function outerWidth(node: Node) { - // This is deliberately excluding margin for our calculations, since we are using - // offsetLeft which is including margin. See getBoundPosition - let width = node.clientWidth; - let computedStyle = window.getComputedStyle(node); - width += int(computedStyle.borderLeftWidth); - width += int(computedStyle.borderRightWidth); - return width; -} -export function innerHeight(node: Node) { - let height = node.clientHeight; - let computedStyle = window.getComputedStyle(node); - height -= int(computedStyle.paddingTop); - height -= int(computedStyle.paddingBottom); - return height; -} - -export function innerWidth(node: Node) { - let width = node.clientWidth; - let computedStyle = window.getComputedStyle(node); - width -= int(computedStyle.paddingLeft); - width -= int(computedStyle.paddingRight); - return width; -} - -export function createTransform(position: Object, isSVG: ?boolean) { - if (isSVG) return createSVGTransform(position); - return createCSSTransform(position); -} - -export function createCSSTransform({x, y}: {x: number, y: number}) { - // Replace unitless items with px - let out = {transform: 'translate(' + x + 'px,' + y + 'px)'}; - // Add single prefixed property as well - if (browserPrefix) { - out[browserPrefix + 'Transform'] = out.transform; - } - return out; -} - -export function createSVGTransform({x, y}: {x: number, y: number}) { - return 'translate(' + x + ',' + y + ')'; -} - -// User-select Hacks: -// -// Useful for preventing blue highlights all over everything when dragging. -let userSelectStyle = ';user-select: none;'; -if (browserPrefix) { - userSelectStyle += '-' + browserPrefix.toLowerCase() + '-user-select: none;'; -} - -export function addUserSelectStyles() { - let style = document.body.getAttribute('style') || ''; - document.body.setAttribute('style', style + userSelectStyle); -} - -export function removeUserSelectStyles() { - let style = document.body.getAttribute('style') || ''; - document.body.setAttribute('style', style.replace(userSelectStyle, '')); -} - -export function styleHacks(childStyle = {}) { - // Workaround IE pointer events; see #51 - // https://github.com/mzabriskie/react-draggable/issues/51#issuecomment-103488278 - let touchHacks = { - touchAction: 'none' - }; - - return assign(touchHacks, childStyle); -} - -// Create an event exposed by -export function createCoreEvent(draggable, clientX, clientY) { - // State changes are often (but not always!) async. We want the latest value. - let state = draggable._pendingState || draggable.state; - let isStart = !isNum(state.lastX); - - return { - node: ReactDOM.findDOMNode(draggable), - position: isStart ? - // If this is our first move, use the clientX and clientY as last coords. - { - deltaX: 0, deltaY: 0, - lastX: clientX, lastY: clientY, - clientX: clientX, clientY: clientY - } : - // Otherwise calculate proper values. - { - deltaX: clientX - state.lastX, deltaY: clientY - state.lastY, - lastX: state.lastX, lastY: state.lastY, - clientX: clientX, clientY: clientY - } - }; -} - -// Create an event exposed by -export function createUIEvent(draggable, coreEvent) { - return { - node: ReactDOM.findDOMNode(draggable), - position: { - top: coreEvent.position.clientY, - left: coreEvent.position.clientX - }, - deltaX: coreEvent.position.deltaX, - deltaY: coreEvent.position.deltaY - }; -} diff --git a/lib/utils/domFns.js b/lib/utils/domFns.js new file mode 100644 index 00000000..3744af01 --- /dev/null +++ b/lib/utils/domFns.js @@ -0,0 +1,217 @@ +// @flow +import {findInArray, isFunction, int} from './shims'; +import browserPrefix, {browserPrefixToKey} from './getPrefix'; + +import type {ControlPosition, PositionOffsetControlPosition, MouseTouchEvent} from './types'; + +let matchesSelectorFunc = ''; +export function matchesSelector(el: Node, selector: string): boolean { + if (!matchesSelectorFunc) { + matchesSelectorFunc = findInArray([ + 'matches', + 'webkitMatchesSelector', + 'mozMatchesSelector', + 'msMatchesSelector', + 'oMatchesSelector' + ], function(method){ + // $FlowIgnore: Doesn't think elements are indexable + return isFunction(el[method]); + }); + } + + // Might not be found entirely (not an Element?) - in that case, bail + // $FlowIgnore: Doesn't think elements are indexable + if (!isFunction(el[matchesSelectorFunc])) return false; + + // $FlowIgnore: Doesn't think elements are indexable + return el[matchesSelectorFunc](selector); +} + +// Works up the tree to the draggable itself attempting to match selector. +export function matchesSelectorAndParentsTo(el: Node, selector: string, baseNode: Node): boolean { + let node = el; + do { + if (matchesSelector(node, selector)) return true; + if (node === baseNode) return false; + // $FlowIgnore[incompatible-type] + node = node.parentNode; + } while (node); + + return false; +} + +export function addEvent(el: ?Node, event: string, handler: Function, inputOptions?: Object): void { + if (!el) return; + const options = {capture: true, ...inputOptions}; + // $FlowIgnore[method-unbinding] + if (el.addEventListener) { + el.addEventListener(event, handler, options); + } else if (el.attachEvent) { + el.attachEvent('on' + event, handler); + } else { + // $FlowIgnore: Doesn't think elements are indexable + el['on' + event] = handler; + } +} + +export function removeEvent(el: ?Node, event: string, handler: Function, inputOptions?: Object): void { + if (!el) return; + const options = {capture: true, ...inputOptions}; + // $FlowIgnore[method-unbinding] + if (el.removeEventListener) { + el.removeEventListener(event, handler, options); + } else if (el.detachEvent) { + el.detachEvent('on' + event, handler); + } else { + // $FlowIgnore: Doesn't think elements are indexable + el['on' + event] = null; + } +} + +export function outerHeight(node: HTMLElement): number { + // This is deliberately excluding margin for our calculations, since we are using + // offsetTop which is including margin. See getBoundPosition + let height = node.clientHeight; + const computedStyle = node.ownerDocument.defaultView.getComputedStyle(node); + height += int(computedStyle.borderTopWidth); + height += int(computedStyle.borderBottomWidth); + return height; +} + +export function outerWidth(node: HTMLElement): number { + // This is deliberately excluding margin for our calculations, since we are using + // offsetLeft which is including margin. See getBoundPosition + let width = node.clientWidth; + const computedStyle = node.ownerDocument.defaultView.getComputedStyle(node); + width += int(computedStyle.borderLeftWidth); + width += int(computedStyle.borderRightWidth); + return width; +} +export function innerHeight(node: HTMLElement): number { + let height = node.clientHeight; + const computedStyle = node.ownerDocument.defaultView.getComputedStyle(node); + height -= int(computedStyle.paddingTop); + height -= int(computedStyle.paddingBottom); + return height; +} + +export function innerWidth(node: HTMLElement): number { + let width = node.clientWidth; + const computedStyle = node.ownerDocument.defaultView.getComputedStyle(node); + width -= int(computedStyle.paddingLeft); + width -= int(computedStyle.paddingRight); + return width; +} + +interface EventWithOffset { + clientX: number, clientY: number +} + +// Get from offsetParent +export function offsetXYFromParent(evt: EventWithOffset, offsetParent: HTMLElement, scale: number): ControlPosition { + const isBody = offsetParent === offsetParent.ownerDocument.body; + const offsetParentRect = isBody ? {left: 0, top: 0} : offsetParent.getBoundingClientRect(); + + const x = (evt.clientX + offsetParent.scrollLeft - offsetParentRect.left) / scale; + const y = (evt.clientY + offsetParent.scrollTop - offsetParentRect.top) / scale; + + return {x, y}; +} + +export function createCSSTransform(controlPos: ControlPosition, positionOffset: PositionOffsetControlPosition): Object { + const translation = getTranslation(controlPos, positionOffset, 'px'); + return {[browserPrefixToKey('transform', browserPrefix)]: translation }; +} + +export function createSVGTransform(controlPos: ControlPosition, positionOffset: PositionOffsetControlPosition): string { + const translation = getTranslation(controlPos, positionOffset, ''); + return translation; +} +export function getTranslation({x, y}: ControlPosition, positionOffset: PositionOffsetControlPosition, unitSuffix: string): string { + let translation = `translate(${x}${unitSuffix},${y}${unitSuffix})`; + if (positionOffset) { + const defaultX = `${(typeof positionOffset.x === 'string') ? positionOffset.x : positionOffset.x + unitSuffix}`; + const defaultY = `${(typeof positionOffset.y === 'string') ? positionOffset.y : positionOffset.y + unitSuffix}`; + translation = `translate(${defaultX}, ${defaultY})` + translation; + } + return translation; +} + +export function getTouch(e: MouseTouchEvent, identifier: number): ?{clientX: number, clientY: number} { + return (e.targetTouches && findInArray(e.targetTouches, t => identifier === t.identifier)) || + (e.changedTouches && findInArray(e.changedTouches, t => identifier === t.identifier)); +} + +export function getTouchIdentifier(e: MouseTouchEvent): ?number { + if (e.targetTouches && e.targetTouches[0]) return e.targetTouches[0].identifier; + if (e.changedTouches && e.changedTouches[0]) return e.changedTouches[0].identifier; +} + +// User-select Hacks: +// +// Useful for preventing blue highlights all over everything when dragging. + +// Note we're passing `document` b/c we could be iframed +export function addUserSelectStyles(doc: ?Document) { + if (!doc) return; + let styleEl = doc.getElementById('react-draggable-style-el'); + if (!styleEl) { + styleEl = doc.createElement('style'); + styleEl.type = 'text/css'; + styleEl.id = 'react-draggable-style-el'; + styleEl.innerHTML = '.react-draggable-transparent-selection *::-moz-selection {all: inherit;}\n'; + styleEl.innerHTML += '.react-draggable-transparent-selection *::selection {all: inherit;}\n'; + doc.getElementsByTagName('head')[0].appendChild(styleEl); + } + if (doc.body) addClassName(doc.body, 'react-draggable-transparent-selection'); +} + +export function scheduleRemoveUserSelectStyles(doc: ?Document) { + // Prevent a possible "forced reflow" + if (window.requestAnimationFrame) { + window.requestAnimationFrame(() => { + removeUserSelectStyles(doc); + }); + } else { + removeUserSelectStyles(doc); + } +} + +function removeUserSelectStyles(doc: ?Document) { + if (!doc) return; + try { + if (doc.body) removeClassName(doc.body, 'react-draggable-transparent-selection'); + // $FlowIgnore: IE + if (doc.selection) { + // $FlowIgnore: IE + doc.selection.empty(); + } else { + // Remove selection caused by scroll, unless it's a focused input + // (we use doc.defaultView in case we're in an iframe) + const selection = (doc.defaultView || window).getSelection(); + if (selection && selection.type !== 'Caret') { + selection.removeAllRanges(); + } + } + } catch (e) { + // probably IE + } +} + +export function addClassName(el: HTMLElement, className: string) { + if (el.classList) { + el.classList.add(className); + } else { + if (!el.className.match(new RegExp(`(?:^|\\s)${className}(?!\\S)`))) { + el.className += ` ${className}`; + } + } +} + +export function removeClassName(el: HTMLElement, className: string) { + if (el.classList) { + el.classList.remove(className); + } else { + el.className = el.className.replace(new RegExp(`(?:^|\\s)${className}(?!\\S)`, 'g'), ''); + } +} diff --git a/lib/utils/getPrefix.es6 b/lib/utils/getPrefix.es6 deleted file mode 100644 index 0222c140..00000000 --- a/lib/utils/getPrefix.es6 +++ /dev/null @@ -1,14 +0,0 @@ -export default (function() { - if (typeof window === 'undefined') return ''; - // Thanks David Walsh - let styles = window.getComputedStyle(document.documentElement, ''), - pre = (Array.prototype.slice - .call(styles) - .join('') - .match(/-(moz|webkit|ms)-/) || (styles.OLink === '' && ['', 'o']) - )[1]; - // 'ms' is not titlecased - if (pre === 'ms') return pre; - if (pre === undefined || pre === null) return ''; - return pre.slice(0, 1).toUpperCase() + pre.slice(1); -})(); diff --git a/lib/utils/getPrefix.js b/lib/utils/getPrefix.js new file mode 100644 index 00000000..9d38a9c4 --- /dev/null +++ b/lib/utils/getPrefix.js @@ -0,0 +1,49 @@ +// @flow +const prefixes = ['Moz', 'Webkit', 'O', 'ms']; +export function getPrefix(prop: string='transform'): string { + // Ensure we're running in an environment where there is actually a global + // `window` obj + if (typeof window === 'undefined') return ''; + + // If we're in a pseudo-browser server-side environment, this access + // path may not exist, so bail out if it doesn't. + const style = window.document?.documentElement?.style; + if (!style) return ''; + + if (prop in style) return ''; + + for (let i = 0; i < prefixes.length; i++) { + if (browserPrefixToKey(prop, prefixes[i]) in style) return prefixes[i]; + } + + return ''; +} + +export function browserPrefixToKey(prop: string, prefix: string): string { + return prefix ? `${prefix}${kebabToTitleCase(prop)}` : prop; +} + +export function browserPrefixToStyle(prop: string, prefix: string): string { + return prefix ? `-${prefix.toLowerCase()}-${prop}` : prop; +} + +function kebabToTitleCase(str: string): string { + let out = ''; + let shouldCapitalize = true; + for (let i = 0; i < str.length; i++) { + if (shouldCapitalize) { + out += str[i].toUpperCase(); + shouldCapitalize = false; + } else if (str[i] === '-') { + shouldCapitalize = true; + } else { + out += str[i]; + } + } + return out; +} + +// Default export is the prefix itself, like 'Moz', 'Webkit', etc +// Note that you may have to re-test for certain things; for instance, Chrome 50 +// can handle unprefixed `transform`, but not unprefixed `user-select` +export default (getPrefix(): string); diff --git a/lib/utils/log.es6 b/lib/utils/log.es6 deleted file mode 100644 index 2cddd4d4..00000000 --- a/lib/utils/log.es6 +++ /dev/null @@ -1,3 +0,0 @@ -export default function log() { - if (process.env.DRAGGABLE_DEBUG) console.log(...arguments); -} diff --git a/lib/utils/log.js b/lib/utils/log.js new file mode 100644 index 00000000..ee2c37f2 --- /dev/null +++ b/lib/utils/log.js @@ -0,0 +1,5 @@ +// @flow +/*eslint no-console:0*/ +export default function log(...args: any) { + if (process.env.DRAGGABLE_DEBUG) console.log(...args); +} diff --git a/lib/utils/positionFns.es6 b/lib/utils/positionFns.es6 deleted file mode 100644 index 93e68861..00000000 --- a/lib/utils/positionFns.es6 +++ /dev/null @@ -1,59 +0,0 @@ -import {isNum, int} from './shims'; -import ReactDOM from 'react-dom'; -import {innerWidth, innerHeight, outerWidth, outerHeight} from './domFns'; - -export function getBoundPosition(draggable, clientX, clientY) { - // If no bounds, short-circuit and move on - if (!draggable.props.bounds) return [clientX, clientY]; - - let bounds = JSON.parse(JSON.stringify(draggable.props.bounds)); - let node = ReactDOM.findDOMNode(draggable); - let parent = node.parentNode; - - if (bounds === 'parent') { - let nodeStyle = window.getComputedStyle(node); - let parentStyle = window.getComputedStyle(parent); - // Compute bounds. This is a pain with padding and offsets but this gets it exactly right. - bounds = { - left: -node.offsetLeft + int(parentStyle.paddingLeft) + - int(nodeStyle.borderLeftWidth) + int(nodeStyle.marginLeft), - top: -node.offsetTop + int(parentStyle.paddingTop) + - int(nodeStyle.borderTopWidth) + int(nodeStyle.marginTop), - right: innerWidth(parent) - outerWidth(node) - node.offsetLeft, - bottom: innerHeight(parent) - outerHeight(node) - node.offsetTop - }; - } - - // Keep x and y below right and bottom limits... - if (isNum(bounds.right)) clientX = Math.min(clientX, bounds.right); - if (isNum(bounds.bottom)) clientY = Math.min(clientY, bounds.bottom); - - // But above left and top limits. - if (isNum(bounds.left)) clientX = Math.max(clientX, bounds.left); - if (isNum(bounds.top)) clientY = Math.max(clientY, bounds.top); - - return [clientX, clientY]; -} - -export function snapToGrid(grid, pendingX, pendingY) { - let x = Math.round(pendingX / grid[0]) * grid[0]; - let y = Math.round(pendingY / grid[1]) * grid[1]; - return [x, y]; -} - -export function canDragX(draggable) { - return draggable.props.axis === 'both' || draggable.props.axis === 'x'; -} - -export function canDragY(draggable) { - return draggable.props.axis === 'both' || draggable.props.axis === 'y'; -} - -// Get {clientX, clientY} positions from event. -export function getControlPosition(e) { - let position = (e.targetTouches && e.targetTouches[0]) || e; - return { - clientX: position.clientX, - clientY: position.clientY - }; -} diff --git a/lib/utils/positionFns.js b/lib/utils/positionFns.js new file mode 100644 index 00000000..248d4d0b --- /dev/null +++ b/lib/utils/positionFns.js @@ -0,0 +1,140 @@ +// @flow +import {isNum, int} from './shims'; +import {getTouch, innerWidth, innerHeight, offsetXYFromParent, outerWidth, outerHeight} from './domFns'; + +import type Draggable from '../Draggable'; +import type {Bounds, ControlPosition, DraggableData, MouseTouchEvent} from './types'; +import type DraggableCore from '../DraggableCore'; + +export function getBoundPosition(draggable: Draggable, x: number, y: number): [number, number] { + // If no bounds, short-circuit and move on + if (!draggable.props.bounds) return [x, y]; + + // Clone new bounds + let {bounds} = draggable.props; + bounds = typeof bounds === 'string' ? bounds : cloneBounds(bounds); + const node = findDOMNode(draggable); + + if (typeof bounds === 'string') { + const {ownerDocument} = node; + const ownerWindow = ownerDocument.defaultView; + let boundNode; + if (bounds === 'parent') { + boundNode = node.parentNode; + } else { + // Flow assigns the wrong return type (Node) for getRootNode(), + // so we cast it to one of the correct types (Element). + // The others are Document and ShadowRoot. + // All three implement querySelector() so it's safe to call. + const rootNode = (((node.getRootNode()): any): Element); + boundNode = rootNode.querySelector(bounds); + } + + if (!(boundNode instanceof ownerWindow.HTMLElement)) { + throw new Error('Bounds selector "' + bounds + '" could not find an element.'); + } + const boundNodeEl: HTMLElement = boundNode; // for Flow, can't seem to refine correctly + const nodeStyle = ownerWindow.getComputedStyle(node); + const boundNodeStyle = ownerWindow.getComputedStyle(boundNodeEl); + // Compute bounds. This is a pain with padding and offsets but this gets it exactly right. + bounds = { + left: -node.offsetLeft + int(boundNodeStyle.paddingLeft) + int(nodeStyle.marginLeft), + top: -node.offsetTop + int(boundNodeStyle.paddingTop) + int(nodeStyle.marginTop), + right: innerWidth(boundNodeEl) - outerWidth(node) - node.offsetLeft + + int(boundNodeStyle.paddingRight) - int(nodeStyle.marginRight), + bottom: innerHeight(boundNodeEl) - outerHeight(node) - node.offsetTop + + int(boundNodeStyle.paddingBottom) - int(nodeStyle.marginBottom) + }; + } + + // Keep x and y below right and bottom limits... + if (isNum(bounds.right)) x = Math.min(x, bounds.right); + if (isNum(bounds.bottom)) y = Math.min(y, bounds.bottom); + + // But above left and top limits. + if (isNum(bounds.left)) x = Math.max(x, bounds.left); + if (isNum(bounds.top)) y = Math.max(y, bounds.top); + + return [x, y]; +} + +export function snapToGrid(grid: [number, number], pendingX: number, pendingY: number): [number, number] { + const x = Math.round(pendingX / grid[0]) * grid[0]; + const y = Math.round(pendingY / grid[1]) * grid[1]; + return [x, y]; +} + +export function canDragX(draggable: Draggable): boolean { + return draggable.props.axis === 'both' || draggable.props.axis === 'x'; +} + +export function canDragY(draggable: Draggable): boolean { + return draggable.props.axis === 'both' || draggable.props.axis === 'y'; +} + +// Get {x, y} positions from event. +export function getControlPosition(e: MouseTouchEvent, touchIdentifier: ?number, draggableCore: DraggableCore): ?ControlPosition { + const touchObj = typeof touchIdentifier === 'number' ? getTouch(e, touchIdentifier) : null; + if (typeof touchIdentifier === 'number' && !touchObj) return null; // not the right touch + const node = findDOMNode(draggableCore); + // User can provide an offsetParent if desired. + const offsetParent = draggableCore.props.offsetParent || node.offsetParent || node.ownerDocument.body; + return offsetXYFromParent(touchObj || e, offsetParent, draggableCore.props.scale); +} + +// Create an data object exposed by 's events +export function createCoreData(draggable: DraggableCore, x: number, y: number): DraggableData { + const isStart = !isNum(draggable.lastX); + const node = findDOMNode(draggable); + + if (isStart) { + // If this is our first move, use the x and y as last coords. + return { + node, + deltaX: 0, deltaY: 0, + lastX: x, lastY: y, + x, y, + }; + } else { + // Otherwise calculate proper values. + return { + node, + deltaX: x - draggable.lastX, deltaY: y - draggable.lastY, + lastX: draggable.lastX, lastY: draggable.lastY, + x, y, + }; + } +} + +// Create an data exposed by 's events +export function createDraggableData(draggable: Draggable, coreData: DraggableData): DraggableData { + const scale = draggable.props.scale; + return { + node: coreData.node, + x: draggable.state.x + (coreData.deltaX / scale), + y: draggable.state.y + (coreData.deltaY / scale), + deltaX: (coreData.deltaX / scale), + deltaY: (coreData.deltaY / scale), + lastX: draggable.state.x, + lastY: draggable.state.y + }; +} + +// A lot faster than stringify/parse +function cloneBounds(bounds: Bounds): Bounds { + return { + left: bounds.left, + top: bounds.top, + right: bounds.right, + bottom: bounds.bottom + }; +} + +function findDOMNode(draggable: Draggable | DraggableCore): HTMLElement { + const node = draggable.findDOMNode(); + if (!node) { + throw new Error(': Unmounted during event!'); + } + // $FlowIgnore we can't assert on HTMLElement due to tests... FIXME + return node; +} diff --git a/lib/utils/shims.es6 b/lib/utils/shims.es6 deleted file mode 100644 index 0d1b8c11..00000000 --- a/lib/utils/shims.es6 +++ /dev/null @@ -1,24 +0,0 @@ -// @credits https://gist.github.com/rogozhnikoff/a43cfed27c41e4e68cdc -export function findInArray(array, callback) { - for (let i = 0, length = array.length; i < length; i++) { - if (callback.apply(callback, [array[i], i, array])) return array[i]; - } -} - -export function isFunction(func) { - return typeof func === 'function' || Object.prototype.toString.call(func) === '[object Function]'; -} - -export function isNum(num) { - return typeof num === 'number' && !isNaN(num); -} - -export function int(a) { - return parseInt(a, 10); -} - -export function dontSetMe(props, propName, componentName) { - if (props[propName]) { - throw new Error(`Invalid prop ${propName} passed to ${componentName} - do not set this, set it on the child.`); - } -} diff --git a/lib/utils/shims.js b/lib/utils/shims.js new file mode 100644 index 00000000..e87b6341 --- /dev/null +++ b/lib/utils/shims.js @@ -0,0 +1,26 @@ +// @flow +// @credits https://gist.github.com/rogozhnikoff/a43cfed27c41e4e68cdc +export function findInArray(array: Array | TouchList, callback: Function): any { + for (let i = 0, length = array.length; i < length; i++) { + if (callback.apply(callback, [array[i], i, array])) return array[i]; + } +} + +export function isFunction(func: any): boolean %checks { + // $FlowIgnore[method-unbinding] + return typeof func === 'function' || Object.prototype.toString.call(func) === '[object Function]'; +} + +export function isNum(num: any): boolean %checks { + return typeof num === 'number' && !isNaN(num); +} + +export function int(a: string): number { + return parseInt(a, 10); +} + +export function dontSetMe(props: Object, propName: string, componentName: string): ?Error { + if (props[propName]) { + return new Error(`Invalid prop ${propName} passed to ${componentName} - do not set this, set it on the child.`); + } +} diff --git a/lib/utils/types.js b/lib/utils/types.js new file mode 100644 index 00000000..31d58136 --- /dev/null +++ b/lib/utils/types.js @@ -0,0 +1,30 @@ +// @flow + +// eslint-disable-next-line no-use-before-define +export type DraggableEventHandler = (e: MouseEvent, data: DraggableData) => void | false; + +export type DraggableData = { + node: HTMLElement, + x: number, y: number, + deltaX: number, deltaY: number, + lastX: number, lastY: number +}; + +export type Bounds = { + left?: number, top?: number, right?: number, bottom?: number +}; +export type ControlPosition = {x: number, y: number}; +export type PositionOffsetControlPosition = {x: number|string, y: number|string}; +export type EventHandler = (e: T) => void | false; + +// Missing in Flow +export class SVGElement extends HTMLElement { +} + +// Missing targetTouches +export class TouchEvent2 extends TouchEvent { + changedTouches: TouchList; + targetTouches: TouchList; +} + +export type MouseTouchEvent = MouseEvent & TouchEvent2; diff --git a/package.json b/package.json index cfea91c8..9dc93af1 100644 --- a/package.json +++ b/package.json @@ -1,18 +1,31 @@ { "name": "react-draggable", - "version": "0.8.1", + "version": "4.5.0", "description": "React draggable component", - "main": "dist/react-draggable.js", + "main": "build/cjs/cjs.js", + "unpkg": "build/web/react-draggable.min.js", "scripts": { "test": "make test", - "test-debug": "karma start --browsers=Chrome --single-run=false", + "test-phantom": "make test-phantom", + "test-debug": "karma start --browsers=Chrome --single-run=false --auto-watch=true", + "test-firefox": "karma start --browsers=Firefox --single-run=false --auto-watch=true", + "test-ie": "karma start --browsers=IE --single-run=false --auto-watch=true", "dev": "make dev", "build": "make clean build", - "lint": "eslint lib/* lib/utils/* specs/*" + "lint": "make lint", + "flow": "flow" }, + "files": [ + "/build", + "/typings", + "/web/react-draggable.min.js", + "/web/react-draggable.min.js.map" + ], + "typings": "./typings/index.d.ts", + "types": "./typings/index.d.ts", "repository": { "type": "git", - "url": "https://github.com/mzabriskie/react-draggable.git" + "url": "https://github.com/react-grid-layout/react-draggable.git" }, "keywords": [ "react", @@ -20,44 +33,74 @@ "react-component" ], "author": "Matt Zabriskie", + "contributors": [ + "Samuel Reed (http://strml.net/)" + ], "license": "MIT", "bugs": { - "url": "https://github.com/mzabriskie/react-draggable/issues" + "url": "https://github.com/react-grid-layout/react-draggable/issues" }, - "homepage": "https://github.com/mzabriskie/react-draggable", + "homepage": "https://github.com/react-grid-layout/react-draggable", "devDependencies": { - "babel-core": "^5.8.29", - "babel-eslint": "^4.1.3", - "babel-loader": "^5.3.2", - "babel-plugin-typecheck": "^1.3.0", - "eslint": "^1.7.3", - "eslint-plugin-react": "^3.6.3", - "karma": "^0.13.14", - "karma-chrome-launcher": "^0.2.1", - "karma-cli": "0.1.1", - "karma-firefox-launcher": "^0.1.6", - "karma-jasmine": "^0.3.6", - "karma-phantomjs-launcher": "^0.2.1", - "karma-phantomjs-shim": "^1.1.1", - "karma-webpack": "^1.7.0", - "lodash": "^3.10.1", - "open": "0.0.5", - "phantomjs": "^1.9.18", - "pre-commit": "^1.1.2", - "react": "^0.14.0", - "react-dom": "^0.14.0", - "semver": "^5.0.3", - "static-server": "^2.0.0", - "uglify-js": "^2.5.0", - "webpack": "^1.12.2", - "webpack-dev-server": "^1.12.1" + "@types/react": "^18.2.23", + "@types/react-dom": "^18.2.8", + "@babel/cli": "^7.27.2", + "@babel/core": "^7.27.4", + "@babel/eslint-parser": "^7.27.5", + "@babel/plugin-transform-class-properties": "^7.27.1", + "@babel/plugin-transform-flow-comments": "^7.27.3", + "@babel/preset-env": "^7.27.2", + "@babel/preset-flow": "^7.27.1", + "@babel/preset-react": "^7.27.1", + "@eslint/eslintrc": "^3.3.1", + "@eslint/js": "^9.29.0", + "@types/node": "^24.0.4", + "assert": "^2.1.0", + "babel-loader": "^10.0.0", + "babel-plugin-transform-inline-environment-variables": "^0.4.4", + "eslint": "^9.29.0", + "eslint-plugin-react": "^7.37.5", + "flow-bin": "^0.217.0", + "globals": "^16.2.0", + "jasmine-core": "^5.8.0", + "karma": "^6.4.4", + "karma-chrome-launcher": "^3.2.0", + "karma-cli": "2.0.0", + "karma-firefox-launcher": "^2.1.3", + "karma-ie-launcher": "^1.0.0", + "karma-jasmine": "^5.1.0", + "karma-phantomjs-launcher": "^1.0.4", + "karma-phantomjs-shim": "^1.5.0", + "karma-webpack": "^5.0.1", + "lodash": "^4.17.4", + "phantomjs-prebuilt": "^2.1.16", + "pre-commit": "^1.2.2", + "process": "^0.11.10", + "puppeteer": "^24.10.2", + "react": "^16.13.1", + "react-dom": "^16.13.1", + "react-frame-component": "^5.2.7", + "react-test-renderer": "^16.13.1", + "semver": "^7.7.2", + "static-server": "^3.0.0", + "typescript": "^5.8.3", + "webpack": "^5.99.9", + "webpack-cli": "^6.0.1", + "webpack-dev-server": "^5.2.2" + }, + "resolutions": { + "minimist": "^1.2.5" }, "precommit": [ "lint", "test" ], "dependencies": { - "classnames": "^2.2.0", - "object-assign": "^4.0.1" + "clsx": "^2.1.1", + "prop-types": "^15.8.1" + }, + "peerDependencies": { + "react": ">= 16.3.0", + "react-dom": ">= 16.3.0" } -} +} \ No newline at end of file diff --git a/script/build-watch b/script/build-watch deleted file mode 100755 index 63433fba..00000000 --- a/script/build-watch +++ /dev/null @@ -1,24 +0,0 @@ -#!/bin/bash -e - -function finish { - echo -e "\nExiting..." - kill $WEBPACK_PID - kill $SERVER_PID -} - -DRAGGABLE_DEBUG=true webpack --watch --devtool inline-source-map & -WEBPACK_PID=$! - -# # Run a static server and run the example in it. -static-server . & -SERVER_PID=$! - -# Open browser -node -e "\ - var open = require('open'); open('http://localhost:9080/example'); \ -" - -# Kill webpack on exit. -trap finish EXIT - -wait diff --git a/specs/.eslintrc b/specs/.eslintrc new file mode 100644 index 00000000..87a5693f --- /dev/null +++ b/specs/.eslintrc @@ -0,0 +1,5 @@ +{ + env: { + jasmine: true + } +} diff --git a/specs/draggable-phantom.spec.jsx b/specs/draggable-phantom.spec.jsx new file mode 100644 index 00000000..1e4dcc39 --- /dev/null +++ b/specs/draggable-phantom.spec.jsx @@ -0,0 +1,9 @@ +// PhantomJS2 doesn't have Map +if (!global.Map) { + require('core-js/es6/map'); +} +if (!global.Set) { + require('core-js/es6/set'); +} + +require('./draggable.spec.jsx'); diff --git a/specs/draggable.spec.jsx b/specs/draggable.spec.jsx index 4e835b80..3c4c5bce 100644 --- a/specs/draggable.spec.jsx +++ b/specs/draggable.spec.jsx @@ -1,25 +1,38 @@ -/*eslint no-unused-vars:0*/ -var React = require('react'); -var ReactDOM = require('react-dom'); -var TestUtils = require('react/lib/ReactTestUtils'); -var Draggable = require('../index'); -var DraggableCore = require('../index').DraggableCore; -var _ = require('lodash'); -var browserPrefix = require('../lib/utils/getPrefix.es6'); -var dashedBrowserPrefix = browserPrefix ? '-' + browserPrefix.toLowerCase() + '-' : ''; - -/*global describe,it,expect,afterEach */ +/*eslint no-unused-vars:0, no-console:0*/ +import React from 'react'; +import ReactDOM from 'react-dom'; +import TestUtils from 'react-dom/test-utils'; +import ShallowRenderer from 'react-test-renderer/shallow'; +import Draggable, {DraggableCore} from '../lib/Draggable'; +import FrameComponent from 'react-frame-component'; +import assert from 'assert'; +import _ from 'lodash'; +import {getPrefix, browserPrefixToKey, browserPrefixToStyle} from '../lib/utils/getPrefix'; +const transformStyle = browserPrefixToStyle('transform', getPrefix('transform')); +const transformKey = browserPrefixToKey('transform', getPrefix('transform')); +const userSelectStyle = browserPrefixToStyle('user-select', getPrefix('user-select')); + describe('react-draggable', function () { var drag; + // Remove body margin so offsetParent calculations work properly + beforeAll(function() { + const styleNode = document.createElement('style'); + // browser detection (based on prototype.js) + const styleText = document.createTextNode('body {margin: 0;}'); + styleNode.appendChild(styleText); + document.getElementsByTagName('head')[0].appendChild(styleNode); + }); + beforeEach(function() { spyOn(console, 'error'); + spyOn(window, 'requestAnimationFrame').and.callFake(function(fn) { fn(); }); }); afterEach(function() { try { - ReactDOM.findDOMNode(drag); - drag.componentWillUnmount(); + TestUtils.Simulate.mouseUp(ReactDOM.findDOMNode(drag)); // reset user-select + ReactDOM.unmountComponentAtNode(ReactDOM.findDOMNode(drag).parentNode); } catch(e) { return; } }); @@ -27,48 +40,68 @@ describe('react-draggable', function () { it('should have default properties', function () { drag = TestUtils.renderIntoDocument(
); - expect(drag.props.axis).toEqual('both'); - expect(drag.props.handle).toEqual(null); - expect(drag.props.cancel).toEqual(null); - expect(drag.props.bounds).toBeFalsy(); - expect(isNaN(drag.props.zIndex)).toEqual(true); - expect(typeof drag.props.onStart).toEqual('function'); - expect(typeof drag.props.onDrag).toEqual('function'); - expect(typeof drag.props.onStop).toEqual('function'); + assert.equal(drag.props.axis, 'both'); + assert(drag.props.bounds == false); + assert.equal(typeof drag.props.onStart, 'function'); + assert.equal(typeof drag.props.onDrag, 'function'); + assert.equal(typeof drag.props.onStop, 'function'); }); it('should pass style and className properly from child', function () { drag = (
); - expect(renderToHTML(drag)).toEqual('
'); + const node = renderToNode(drag); + // Touch-action hack has been removed + if ('touchAction' in document.body.style) { + assert.equal(node.getAttribute('style').indexOf('touch-action: none'), -1); + } + assert(node.getAttribute('style').indexOf('color: black') >= 0); + assert(new RegExp(transformStyle + ': translate\\(0px(?:, 0px)?\\)').test(node.getAttribute('style'))); + assert.equal(node.getAttribute('class'), 'foo react-draggable'); + }); + + it('should set the appropriate custom className when dragging or dragged', function () { + drag = TestUtils.renderIntoDocument( + +
+ + ); + var node = ReactDOM.findDOMNode(drag); + assert(node.getAttribute('class').indexOf('foo') >= 0); + TestUtils.Simulate.mouseDown(node); + assert(node.getAttribute('class').indexOf('bar') >= 0); + TestUtils.Simulate.mouseUp(node); + assert(node.getAttribute('class').indexOf('baz') >= 0); }); // NOTE: this runs a shallow renderer, which DOES NOT actually render it('should pass handle on to ', function () { drag =
; - var renderer = TestUtils.createRenderer(); + const renderer = new ShallowRenderer(); renderer.render(drag); - var output = renderer.getRenderOutput(); + const output = renderer.getRenderOutput(); - var expected = ( - + const expected = ( +
); + // Not easy to actually test equality here. The functions are bound as static props so we can't test those easily. - var toOmit = ['onStart', 'onStop', 'onDrag']; - expect(_.isEqual( + const toOmit = ['onStart', 'onStop', 'onDrag', 'onMouseDown', 'children']; + assert.deepEqual( _.omit(output.props, toOmit), - _.omit(expected.props, toOmit)) - ).toEqual(true); + _.omit(expected.props, toOmit) + ); }); it('should honor props', function () { @@ -82,7 +115,6 @@ describe('react-draggable', function () { handle=".handle" cancel=".cancel" grid={[10, 10]} - zIndex={1000} onStart={handleStart} onDrag={handleDrag} onStop={handleStop}> @@ -93,14 +125,31 @@ describe('react-draggable', function () { ); - expect(drag.props.axis).toEqual('y'); - expect(drag.props.handle).toEqual('.handle'); - expect(drag.props.cancel).toEqual('.cancel'); - expect(drag.props.grid).toEqual([10, 10]); - expect(drag.props.zIndex).toEqual(1000); - expect(drag.props.onStart).toEqual(handleStart); - expect(drag.props.onDrag).toEqual(handleDrag); - expect(drag.props.onStop).toEqual(handleStop); + assert.equal(drag.props.axis, 'y'); + assert.equal(drag.props.handle, '.handle'); + assert.equal(drag.props.cancel, '.cancel'); + assert(_.isEqual(drag.props.grid, [10, 10])); + assert.equal(drag.props.onStart, handleStart); + assert.equal(drag.props.onDrag, handleDrag); + assert.equal(drag.props.onStop, handleStop); + }); + + it('should adjust draggable data output when `scale` prop supplied', function () { + function onDrag(event, data) { + assert.equal(data.x, 200); + assert.equal(data.y, 200); + assert.equal(data.deltaX, 200); + assert.equal(data.deltaY, 200); + } + drag = TestUtils.renderIntoDocument( + +
+ + ); + + simulateMovementFromTo(drag, 0, 0, 100, 100); }); it('should throw when setting className', function () { @@ -108,7 +157,11 @@ describe('react-draggable', function () { TestUtils.renderIntoDocument(drag); - expect(console.error).toHaveBeenCalledWith('Warning: Failed propType: Invalid prop className passed to Draggable - do not set this, set it on the child.'); + expect( + console.error.calls.argsFor(0)[0].replace('propType:', 'prop type:').split('\n')[0] + ).toBe( + 'Warning: Failed prop type: Invalid prop className passed to Draggable - do not set this, set it on the child.' + ); }); it('should throw when setting style', function () { @@ -116,7 +169,11 @@ describe('react-draggable', function () { TestUtils.renderIntoDocument(drag); - expect(console.error).toHaveBeenCalledWith('Warning: Failed propType: Invalid prop style passed to Draggable - do not set this, set it on the child.'); + expect( + console.error.calls.argsFor(0)[0].replace('propType:', 'prop type:').split('\n')[0] + ).toBe( + 'Warning: Failed prop type: Invalid prop style passed to Draggable - do not set this, set it on the child.' + ); }); it('should throw when setting transform', function () { @@ -124,11 +181,15 @@ describe('react-draggable', function () { TestUtils.renderIntoDocument(drag); - expect(console.error).toHaveBeenCalledWith('Warning: Failed propType: Invalid prop transform passed to Draggable - do not set this, set it on the child.'); + expect( + console.error.calls.argsFor(0)[0].replace('propType:', 'prop type:').split('\n')[0] + ).toBe( + 'Warning: Failed prop type: Invalid prop transform passed to Draggable - do not set this, set it on the child.' + ); }); it('should call onStart when dragging begins', function () { - var called = false; + let called = false; drag = TestUtils.renderIntoDocument(
@@ -136,11 +197,11 @@ describe('react-draggable', function () { ); TestUtils.Simulate.mouseDown(ReactDOM.findDOMNode(drag)); - expect(called).toEqual(true); + assert.equal(called, true); }); it('should call onStop when dragging ends', function () { - var called = false; + let called = false; drag = TestUtils.renderIntoDocument(
@@ -149,11 +210,11 @@ describe('react-draggable', function () { TestUtils.Simulate.mouseDown(ReactDOM.findDOMNode(drag)); TestUtils.Simulate.mouseUp(ReactDOM.findDOMNode(drag)); - expect(called).toEqual(true); + assert.equal(called, true); }); it('should not call onStart when dragging begins and disabled', function () { - var called = false; + let called = false; drag = TestUtils.renderIntoDocument(
@@ -161,53 +222,123 @@ describe('react-draggable', function () { ); TestUtils.Simulate.mouseDown(ReactDOM.findDOMNode(drag)); - expect(called).toEqual(false); + assert.equal(called, false); + }); + + it('should immediately call onStop if onDrag returns false', function () { + let called = false; + drag = TestUtils.renderIntoDocument( + +
+ + ); + + TestUtils.Simulate.mouseDown(ReactDOM.findDOMNode(drag)); + assert.equal(called, false); + mouseMove(10, 10); + assert.equal(called, true); + assert.equal(drag.state.x, 0); + assert.equal(drag.state.y, 0); }); it('should render with style translate() for DOM nodes', function () { - var dragged = false; + let dragged = false; drag = TestUtils.renderIntoDocument(
); - var node = ReactDOM.findDOMNode(drag); + const node = ReactDOM.findDOMNode(drag); + simulateMovementFromTo(drag, 0, 0, 100, 100); - TestUtils.Simulate.mouseDown(node, {clientX: 0, clientY: 0}); - // Simulate a movement; can't use TestUtils here because it uses react's event system only, - // but attaches event listeners directly to the document. - // Would love to new MouseEvent() here but it doesn't work with PhantomJS / old browsers. - // var e = new MouseEvent('mousemove', {clientX: 100, clientY: 100}); - var evt = document.createEvent('MouseEvents'); - evt.initMouseEvent('mousemove', true, true, window, - 0, 0, 0, 100, 100, false, false, false, false, 0, null); - document.dispatchEvent(evt); - TestUtils.Simulate.mouseUp(node); + const style = node.getAttribute('style'); + assert.equal(dragged, true); + assert(style.indexOf('transform: translate(100px, 100px);') >= 0); + }); - var style = node.getAttribute('style'); - expect(dragged).toEqual(true); - expect(style.indexOf('transform: translate(100px, 100px);')).not.toEqual(-1); + it('should render with positionOffset set as string transform and handle subsequent translate() for DOM nodes', function () { + let dragged = false; + drag = TestUtils.renderIntoDocument( + +
+ + ); + + const node = ReactDOM.findDOMNode(drag); + simulateMovementFromTo(drag, 0, 0, 100, 100); + + const style = node.getAttribute('style'); + assert.equal(dragged, true); + assert(style.indexOf('translate(10%, 10%) translate(100px, 100px);') >= 0); + }); + + it('should honor "x" axis', function () { + let dragged = false; + drag = TestUtils.renderIntoDocument( + +
+ + ); + + const node = ReactDOM.findDOMNode(drag); + simulateMovementFromTo(drag, 0, 0, 100, 100); + + const style = node.getAttribute('style'); + assert.equal(dragged, true); + assert(/transform: translate\(100px(?:, 0px)?\);/.test(style)); + }); + + it('should honor "y" axis', function () { + let dragged = false; + drag = TestUtils.renderIntoDocument( + +
+ + ); + + const node = ReactDOM.findDOMNode(drag); + simulateMovementFromTo(drag, 0, 0, 100, 100); + + const style = node.getAttribute('style'); + assert.equal(dragged, true); + assert(style.indexOf('transform: translate(0px, 100px);') >= 0); + }); + + it('should honor "none" axis', function () { + let dragged = false; + drag = TestUtils.renderIntoDocument( + +
+ + ); + + const node = ReactDOM.findDOMNode(drag); + simulateMovementFromTo(drag, 0, 0, 100, 100); + + const style = node.getAttribute('style'); + assert.equal(dragged, true); + assert(/transform: translate\(0px(?:, 0px)?\);/.test(style)); }); it('should detect if an element is instanceof SVGElement and set state.isElementSVG to true', function() { - drag = TestUtils.renderIntoDocument( + drag = TestUtils.renderIntoDocument( ); - expect(drag.state.isElementSVG).toEqual(true); + assert.equal(drag.state.isElementSVG, true); }); it('should detect if an element is NOT an instanceof SVGElement and set state.isElementSVG to false', function() { - drag = TestUtils.renderIntoDocument( + drag = TestUtils.renderIntoDocument(
); - expect(drag.state.isElementSVG).toEqual(false); + assert.equal(drag.state.isElementSVG, false); }); it('should render with transform translate() for SVG nodes', function () { @@ -217,50 +348,188 @@ describe('react-draggable', function () { ); - var node = ReactDOM.findDOMNode(drag); + const node = ReactDOM.findDOMNode(drag); + simulateMovementFromTo(drag, 0, 0, 100, 100); + + const transform = node.getAttribute('transform'); + assert(transform.indexOf('translate(100,100)') >= 0); + }); + + it('should add and remove transparent selection class', function () { + drag = TestUtils.renderIntoDocument( + +
+ + ); + + const node = ReactDOM.findDOMNode(drag); + + assert(!document.body.classList.contains('react-draggable-transparent-selection')); + TestUtils.Simulate.mouseDown(node, {clientX: 0, clientY: 0}); + assert(document.body.classList.contains('react-draggable-transparent-selection')); + TestUtils.Simulate.mouseUp(node); + assert(!document.body.classList.contains('react-draggable-transparent-selection')); + + assert(window.requestAnimationFrame.calls.any()); // should have been called + }); + + it('should not add and remove transparent selection class when disabled', function () { + + drag = TestUtils.renderIntoDocument( + +
+ + ); + + const node = ReactDOM.findDOMNode(drag); + assert(!document.body.classList.contains('react-draggable-transparent-selection')); TestUtils.Simulate.mouseDown(node, {clientX: 0, clientY: 0}); - // Simulate a movement; can't use TestUtils here because it uses react's event system only, - // but attaches event listeners directly to the document. - // Would love to new MouseEvent() here but it doesn't work with PhantomJS / old browsers. - // var e = new MouseEvent('mousemove', {clientX: 100, clientY: 100}); - var evt = document.createEvent('MouseEvents'); - evt.initMouseEvent('mousemove', true, true, window, - 0, 0, 0, 100, 100, false, false, false, false, 0, null); - document.dispatchEvent(evt); + assert(!document.body.classList.contains('react-draggable-transparent-selection')); TestUtils.Simulate.mouseUp(node); + assert(!document.body.classList.contains('react-draggable-transparent-selection')); - var transform = node.getAttribute('transform'); - expect(transform.indexOf('translate(100,100)')).not.toEqual(-1); - + assert(!window.requestAnimationFrame.calls.any()); // should not have been called }); - it('should add and remove user-select styles', function () { - // Karma runs in firefox in our tests - var userSelectStyle = ';user-select: none;' + dashedBrowserPrefix + 'user-select: none;'; + it('should not add and remove transparent selection class when onStart returns false', function () { + function onStart() { return false; } drag = TestUtils.renderIntoDocument( - +
); - var node = ReactDOM.findDOMNode(drag); + const node = ReactDOM.findDOMNode(drag); - expect(document.body.getAttribute('style')).toEqual(''); + assert(!document.body.classList.contains('react-draggable-transparent-selection')); TestUtils.Simulate.mouseDown(node, {clientX: 0, clientY: 0}); - expect(document.body.getAttribute('style')).toEqual(userSelectStyle); + assert(!document.body.classList.contains('react-draggable-transparent-selection')); TestUtils.Simulate.mouseUp(node); - expect(document.body.getAttribute('style')).toEqual(''); + assert(!document.body.classList.contains('react-draggable-transparent-selection')); + + assert(!window.requestAnimationFrame.calls.any()); // should not have been called + }); + + it('should not defocus inputs when unmounting', function () { + // Have only successfully gotten this to run on Chrome unfortunately, otherwise the initial + // select does not work. + // As of April 2020 we have verified this works in other browsers manually + if (!/Chrome/.test(window.navigator.userAgent)) { + return pending(); + } + + class TestCase extends React.Component { + constructor() { + super(); + this.state = {text: false}; + } + render() { + return ( +
+ this.setState({text: e.target.value})} size={5} /> + {!this.state.text && ( + +
+ + )} +
+ ); + } + } + + drag = TestUtils.renderIntoDocument(); + const dragEl = ReactDOM.findDOMNode(drag); + // Need to append to a real document to test focus/selection, can't just be a fragment + document.body.appendChild(dragEl); + const input = dragEl.querySelector('input'); + input.focus(); + + assert.equal(window.getSelection().type, 'Caret', 'Element should be focused before draggable unmounts'); + TestUtils.Simulate.keyDown(input, {key: 'a', keyCode: 65, which: 65}); + assert.equal(window.getSelection().type, 'Caret', 'Element should be focused after draggable unmounts'); + document.body.removeChild(dragEl); + }); + + it('should be draggable when in an iframe', function (done) { + let dragged = false; + const dragElement = ( + +
+ + ); + const renderRoot = document.body.appendChild(document.createElement('div')); + const ref = React.createRef(); + const frame = ReactDOM.render({ dragElement }, renderRoot); + + setTimeout(function checkIframe() { + const iframeDoc = ref.current?.contentDocument; + if (!iframeDoc) return setTimeout(checkIframe, 50); + const node = iframeDoc.querySelector('.react-draggable'); + if (!node) return setTimeout(checkIframe, 50); + simulateMovementFromTo(node, 0, 0, 100, 100); + + const style = node.getAttribute('style'); + assert.equal(dragged, true); + assert(style.indexOf('transform: translate(100px, 100px);') >= 0); + + renderRoot.parentNode.removeChild(renderRoot); + done(); + }, 0); + }); + + it('should add and remove transparent selection class to iframe\'s body when in an iframe', function (done) { + const dragElement = ( + +
+ + ); + const renderRoot = document.body.appendChild(document.createElement('div')); + const ref = React.createRef(); + ReactDOM.render({ dragElement }, renderRoot); + + setTimeout(function checkIframe() { + const iframeDoc = ref.current?.contentDocument; + if (!iframeDoc) return setTimeout(checkIframe, 50); + const node = iframeDoc.querySelector('.react-draggable'); + if (!node) return setTimeout(checkIframe, 50); + + assert(!document.body.classList.contains('react-draggable-transparent-selection')); + assert(!iframeDoc.body.classList.contains('react-draggable-transparent-selection')); + TestUtils.Simulate.mouseDown(node, {clientX: 0, clientY: 0}); + assert(!document.body.classList.contains('react-draggable-transparent-selection')); + assert(iframeDoc.body.classList.contains('react-draggable-transparent-selection')); + TestUtils.Simulate.mouseUp(node); + assert(!document.body.classList.contains('react-draggable-transparent-selection')); + assert(!iframeDoc.body.classList.contains('react-draggable-transparent-selection')); + + renderRoot.parentNode.removeChild(renderRoot); + done(); + }, 0); }); }); describe('interaction', function () { + + function mouseDownOn(drag, selector, shouldDrag) { + resetDragging(drag); + const node = ReactDOM.findDOMNode(drag).querySelector(selector); + if (!node) throw new Error(`Selector not found: ${selector}`); + TestUtils.Simulate.mouseDown(node); + assert.equal(drag.state.dragging, shouldDrag); + } + + function resetDragging(drag) { + TestUtils.Simulate.mouseUp(ReactDOM.findDOMNode(drag)); + assert.equal(drag.state.dragging, false); + } + it('should initialize dragging onmousedown', function () { drag = TestUtils.renderIntoDocument(
); TestUtils.Simulate.mouseDown(ReactDOM.findDOMNode(drag)); - expect(drag.state.dragging).toEqual(true); + assert.equal(drag.state.dragging, true); }); it('should only initialize dragging onmousedown of handle', function () { @@ -273,11 +542,27 @@ describe('react-draggable', function () { ); - TestUtils.Simulate.mouseDown(ReactDOM.findDOMNode(drag).querySelector('.content')); - expect(drag.state.dragging).toEqual(false); + mouseDownOn(drag, '.content', false); + mouseDownOn(drag, '.handle', true); + }); - TestUtils.Simulate.mouseDown(ReactDOM.findDOMNode(drag).querySelector('.handle')); - expect(drag.state.dragging).toEqual(true); + it('should only initialize dragging onmousedown of handle, even if children fire event', function () { + drag = TestUtils.renderIntoDocument( + +
+
+
Handle
+
+
Lorem ipsum...
+
+
+ ); + + mouseDownOn(drag, '.content', false); + mouseDownOn(drag, '.deep', true); + mouseDownOn(drag, '.handle > div', true); + mouseDownOn(drag, '.handle span', true); + mouseDownOn(drag, '.handle', true); }); it('should not initialize dragging onmousedown of cancel', function () { @@ -290,53 +575,600 @@ describe('react-draggable', function () { ); - TestUtils.Simulate.mouseDown(ReactDOM.findDOMNode(drag).querySelector('.cancel')); - expect(drag.state.dragging).toEqual(false); + mouseDownOn(drag, '.cancel', false); + mouseDownOn(drag, '.content', true); + }); + + it('should not initialize dragging onmousedown of handle, even if children fire event', function () { + drag = TestUtils.renderIntoDocument( + +
+
+
Cancel
+
+
Lorem ipsum...
+
+
+ ); - TestUtils.Simulate.mouseDown(ReactDOM.findDOMNode(drag).querySelector('.content')); - expect(drag.state.dragging).toEqual(true); + mouseDownOn(drag, '.content', true); + mouseDownOn(drag, '.deep', false); + mouseDownOn(drag, '.cancel > div', false); + mouseDownOn(drag, '.cancel span', false); + mouseDownOn(drag, '.cancel', false); }); it('should discontinue dragging onmouseup', function () { drag = TestUtils.renderIntoDocument(
); TestUtils.Simulate.mouseDown(ReactDOM.findDOMNode(drag)); - expect(drag.state.dragging).toEqual(true); + assert.equal(drag.state.dragging, true); - TestUtils.Simulate.mouseUp(ReactDOM.findDOMNode(drag)); - expect(drag.state.dragging).toEqual(false); + resetDragging(drag); + }); + + it('should initialize dragging ontouchstart', function () { + drag = TestUtils.renderIntoDocument(
); + + // Need to dispatch this ourselves as there is no onTouchStart handler (due to passive) + // so TestUtils.Simulate will not work + const e = new Event('touchstart'); + ReactDOM.findDOMNode(drag).dispatchEvent(e); + assert.equal(drag.state.dragging, true); + }); + + it('should call preventDefault on touchStart event', function () { + drag = TestUtils.renderIntoDocument(
); + + const e = new Event('touchstart'); + // Oddly `e.defaultPrevented` is not changing here. Maybe because we're not mounted to a real doc? + let pdCalled = false; + e.preventDefault = function() { pdCalled = true; }; + ReactDOM.findDOMNode(drag).dispatchEvent(e); + assert(pdCalled); + assert.equal(drag.state.dragging, true); + }); + + it('should *not* call preventDefault on touchStart event if "allowMobileScroll"', function () { + drag = TestUtils.renderIntoDocument(
); + + const e = new Event('touchstart'); + // Oddly `e.defaultPrevented` is not changing here. Maybe because we're not mounted to a real doc? + let pdCalled = false; + e.preventDefault = function() { pdCalled = true; }; + ReactDOM.findDOMNode(drag).dispatchEvent(e); + assert(!pdCalled); + assert.equal(drag.state.dragging, true); + }); + + it('should not call preventDefault on touchStart event if not on handle', function () { + drag = TestUtils.renderIntoDocument( + +
+
+
Handle
+
+
Lorem ipsum...
+
+
+ ); + + const e = new Event('touchstart'); + let pdCalled = false; + e.preventDefault = function() { pdCalled = true; }; + ReactDOM.findDOMNode(drag).querySelector('.content').dispatchEvent(e); + assert(!pdCalled); + assert(drag.state.dragging !== true); + }); + + it('should modulate position on scroll', function (done) { + let dragCalled = false; + + function onDrag(e, coreEvent) { + assert.equal(Math.round(coreEvent.deltaY), 500); + dragCalled = true; + } + drag = TestUtils.renderIntoDocument(
); + const node = ReactDOM.findDOMNode(drag); + + // Create a container we can scroll. I'm doing it this way so we can still access . + // Enzyme (airbnb project) would make this a lot easier. + const fragment = fragmentFromString(` +
+
+
+
+ `); + transplantNodeInto(node, fragment, (f) => f.children[0]); + + TestUtils.Simulate.mouseDown(node, {clientX: 0, clientY: 0}); + assert.equal(drag.state.dragging, true); + + // Scroll the inner container & trigger a scroll + fragment.scrollTop = 500; + mouseMove(0, 0); + TestUtils.Simulate.mouseUp(node); + setTimeout(function() { + assert.equal(drag.state.dragging, false); + assert.equal(dragCalled, true); + assert.equal(drag.state.y, 500); + // Cleanup + document.body.removeChild(fragment); + done(); + }, 50); + + }); + + it('should respect offsetParent on nested div scroll', function (done) { + let dragCalled = false; + function onDrag(e, coreEvent) { + dragCalled = true; + // Because the offsetParent is the body, we technically haven't moved at all relative to it + assert.equal(coreEvent.deltaY, 0); + } + drag = TestUtils.renderIntoDocument(
); + const node = ReactDOM.findDOMNode(drag); + + // Create a container we can scroll. I'm doing it this way so we can still access . + // Enzyme (airbnb project) would make this a lot easier. + const fragment = fragmentFromString(` +
+
+
+
+ `); + transplantNodeInto(node, fragment, (f) => f.children[0]); + + TestUtils.Simulate.mouseDown(node, {clientX: 0, clientY: 0}); + fragment.scrollTop = 500; + + mouseMove(0, 0); + TestUtils.Simulate.mouseUp(node); + setTimeout(function() { + assert(dragCalled); + // Cleanup + document.body.removeChild(fragment); + done(); + }, 50); }); }); - describe('validation', function () { - it('should result with invariant when there isn\'t a child', function () { - drag = (); + describe('draggable callbacks', function () { + it('should call back on drag', function (done) { + function onDrag(event, data) { + assert.equal(data.x, 100); + assert.equal(data.y, 100); + assert.equal(data.deltaX, 100); + assert.equal(data.deltaY, 100); + assert.equal(data.node, ReactDOM.findDOMNode(drag)); + done(); + } + drag = TestUtils.renderIntoDocument( + +
+ + ); + + // (element, fromX, fromY, toX, toY) + simulateMovementFromTo(drag, 0, 0, 100, 100); + }); - var error = false; - try { - TestUtils.renderIntoDocument(drag); - } catch (e) { - error = true; + it('should call back with correct dom node with nodeRef', function (done) { + function onDrag(event, data) { + // Being tricky here and installing the ref on the inner child, to ensure it's working + // and not just falling back on ReactDOM.findDOMNode() + assert.equal(data.node, ReactDOM.findDOMNode(drag).firstChild); + done(); } + const nodeRef = React.createRef(); + drag = TestUtils.renderIntoDocument( + + +
+ + + ); - expect(error).toEqual(true); + // (element, fromX, fromY, toX, toY) + simulateMovementFromTo(drag, 0, 0, 100, 100); }); - it('should result with invariant if there\'s more than a single child', function () { - drag = (
); + it('should call back with correct dom node with nodeRef (forwardRef)', function (done) { + + const Component1 = React.forwardRef(function (props, ref) { + return
Nested component
; + }); - var error = false; - try { - TestUtils.renderIntoDocument(drag); - } catch (e) { - error = true; + function onDrag(event, data) { + assert.equal(data.node, ReactDOM.findDOMNode(drag)); + assert.equal(data.node.innerText, 'Nested component'); + done(); } + const nodeRef = React.createRef(); + drag = TestUtils.renderIntoDocument( + + + + ); - expect(error).toEqual(true); + // (element, fromX, fromY, toX, toY) + simulateMovementFromTo(drag, 0, 0, 100, 100); + }); + + it('should call back on drag, with values within the defined bounds', function(done){ + function onDrag(event, data) { + assert.equal(data.x, 90); + assert.equal(data.y, 90); + assert.equal(data.deltaX, 90); + assert.equal(data.deltaY, 90); + done(); + } + drag = TestUtils.renderIntoDocument( + +
+ + ); + + // (element, fromX, fromY, toX, toY) + simulateMovementFromTo(drag, 0, 0, 100, 100); + + }); + + it('should clip dragging to parent, with bounds set to "parent"', function(done){ + function onDrag(event, data) { + assert.equal(data.x, 100); + assert.equal(data.y, 100); + assert.equal(data.deltaX, 50); + assert.equal(data.deltaY, 50); + done(); + } + drag = TestUtils.renderIntoDocument( + +
+ + ); + const node = ReactDOM.findDOMNode(drag); + + // Create a parent container. + const fragment = fragmentFromString(` +
+
+ `); + transplantNodeInto(node, fragment, (f) => f); + + + // (element, fromX, fromY, toX, toY) + simulateMovementFromTo(drag, 50, 50, 350, 350); + + }); + + it('should clip dragging to parent, with bounds set to "parent", in a shadow tree', function(done){ + function onDrag(event, data) { + assert.equal(data.x, 100); + assert.equal(data.y, 100); + assert.equal(data.deltaX, 50); + assert.equal(data.deltaY, 50); + done(); + } + drag = TestUtils.renderIntoDocument( + +
+ + ); + const node = ReactDOM.findDOMNode(drag); + + // Create a parent container. + const fragment = fragmentFromString(` +
+
+ `); + + // Add the parent fragment to a shadow root + const div = document.createElement('div'); + const shadowRoot = div.attachShadow({mode: 'open'}); + shadowRoot.appendChild(fragment); + + transplantNodeInto(node, shadowRoot, (f) => f.children[0]); + + + // (element, fromX, fromY, toX, toY) + simulateMovementFromTo(drag, 50, 50, 350, 350); + + }); + + it('should clip dragging to parent, with bounds set to selector', function(done){ + function onDrag(event, data) { + assert.equal(data.x, 100); + assert.equal(data.y, 100); + assert.equal(data.deltaX, 50); + assert.equal(data.deltaY, 50); + done(); + } + drag = TestUtils.renderIntoDocument( + +
+ + ); + const node = ReactDOM.findDOMNode(drag); + + // Create a parent container. + const fragment = fragmentFromString(` +
+
+ `); + transplantNodeInto(node, fragment, (f) => f); + + + // (element, fromX, fromY, toX, toY) + simulateMovementFromTo(drag, 50, 50, 350, 350); + + }); + + it('should clip dragging to parent, with bounds set to selector, in a shadow tree', function(done){ + function onDrag(event, data) { + assert.equal(data.x, 100); + assert.equal(data.y, 100); + assert.equal(data.deltaX, 50); + assert.equal(data.deltaY, 50); + done(); + } + drag = TestUtils.renderIntoDocument( + +
+ + ); + const node = ReactDOM.findDOMNode(drag); + + // Create a parent container. + const fragment = fragmentFromString(` +
+
+ `); + + // Add the parent fragment to a shadow root + const div = document.createElement('div'); + const shadowRoot = div.attachShadow({mode: 'open'}); + shadowRoot.appendChild(fragment); + + transplantNodeInto(node, shadowRoot, (f) => f.children[0]); + + // (element, fromX, fromY, toX, toY) + simulateMovementFromTo(drag, 50, 50, 350, 350); + + }); + + it('should call back with offset left/top, not client', function(done) { + function onDrag(event, data) { + assert.equal(data.x, 100); + assert.equal(data.y, 100); + assert.equal(data.deltaX, 100); + assert.equal(data.deltaY, 100); + done(); + } + drag = TestUtils.renderIntoDocument( + +
+ + ); + + simulateMovementFromTo(drag, 200, 200, 300, 300); + }); + + it('should call back with correct position when parent element is 2x scaled', function(done) { + function onDrag(event, data) { + // visually it will look like 100, because parent is 2x scaled + assert.equal(data.x, 50); + assert.equal(data.y, 50); + assert.equal(data.deltaX, 50); + assert.equal(data.deltaY, 50); + assert.equal(data.node, ReactDOM.findDOMNode(drag)); + done(); + } + drag = TestUtils.renderIntoDocument( + +
+ + ); + + // (element, fromX, fromY, toX, toY) + simulateMovementFromTo(drag, 0, 0, 100, 100); + }); + + it('should call back with correct position when parent element is 0.5x scaled', function(done) { + function onDrag(event, data) { + // visually it will look like 100, because parent is 0.5x scaled + assert.equal(data.x, 200); + assert.equal(data.y, 200); + assert.equal(data.deltaX, 200); + assert.equal(data.deltaY, 200); + assert.equal(data.node, ReactDOM.findDOMNode(drag)); + done(); + } + drag = TestUtils.renderIntoDocument( + +
+ + ); + + // (element, fromX, fromY, toX, toY) + simulateMovementFromTo(drag, 0, 0, 100, 100); + }); + + it('should not throw an error if unmounted during a callback', function () { + function App(props) { + const [firstVisible, setFirstVisible] = React.useState(true); + // Callback with ref to draggable + const dragRef = React.useRef(null); + props.draggableRefCb(dragRef); + return ( +
+ + + {firstVisible && ( + setFirstVisible(false)} ref={dragRef}> +

1. Drag me!

+
+ )} +
+ ); + } + let dragRef; + const appContainer = TestUtils.renderIntoDocument( + {dragRef = _ref;}}/> + ); + + // (element, fromX, fromY, toX, toY) + simulateMovementFromTo(dragRef.current, 0, 0, 100, 100); + + // ok, was a setstate warning thrown? + // Assert unmounted + assert.equal(dragRef.current, null); + }); + + }); + + describe('DraggableCore callbacks', function () { + it('should call back with node on drag', function(done) { + function onDrag(event, data) { + assert.equal(data.x, 100); + assert.equal(data.y, 100); + assert.equal(data.deltaX, 100); + assert.equal(data.deltaY, 100); + assert.equal(data.node, ReactDOM.findDOMNode(drag)); + done(); + } + drag = TestUtils.renderIntoDocument( + +
+ + ); + + // (element, fromX, fromY, toX, toY) + simulateMovementFromTo(drag, 0, 0, 100, 100); + }); + + it('should call back with correct position when parent element is 2x scaled', function(done) { + function onDrag(event, data) { + // visually it will look like 100, because parent is 2x scaled + assert.equal(data.x, 50); + assert.equal(data.y, 50); + assert.equal(data.deltaX, 50); + assert.equal(data.deltaY, 50); + assert.equal(data.node, ReactDOM.findDOMNode(drag)); + done(); + } + drag = TestUtils.renderIntoDocument( + +
+ + ); + + // (element, fromX, fromY, toX, toY) + simulateMovementFromTo(drag, 0, 0, 100, 100); + }); + + it('should call back with correct position when parent element is 0.5x scaled', function(done) { + function onDrag(event, data) { + // visually it will look like 100, because parent is 0.5x scaled + assert.equal(data.x, 200); + assert.equal(data.y, 200); + assert.equal(data.deltaX, 200); + assert.equal(data.deltaY, 200); + assert.equal(data.node, ReactDOM.findDOMNode(drag)); + done(); + } + drag = TestUtils.renderIntoDocument( + +
+ + ); + + // (element, fromX, fromY, toX, toY) + simulateMovementFromTo(drag, 0, 0, 100, 100); + }); + + it('should call back with snapped data output when grid prop is provided', function(done) { + function onDrag(event, data) { + assert.equal(data.x, 99); + assert.equal(data.y, 96); + assert.equal(data.deltaX, 99); + assert.equal(data.deltaY, 96); + assert.equal(data.node, ReactDOM.findDOMNode(drag)); + } + function onStop(event, data) { + assert.equal(data.x, 99); + assert.equal(data.y, 96); + // Single drag-and-stop so stop {x, y} is same as drag {x, y}. + assert.equal(data.deltaX, 0); + assert.equal(data.deltaY, 0); + assert.equal(data.node, ReactDOM.findDOMNode(drag)); + done(); + } + drag = TestUtils.renderIntoDocument( + +
+ + ); + + // (element, fromX, fromY, toX, toY) + simulateMovementFromTo(drag, 0, 0, 100, 100); + }); + }); + + + describe('validation', function () { + it('should result with invariant when there isn\'t a child', function () { + const renderer = new ShallowRenderer(); + + assert.throws(() => renderer.render()); + }); + + it('should result with invariant if there\'s more than a single child', function () { + const renderer = new ShallowRenderer(); + + assert.throws(() => renderer.render(
)); }); }); }); function renderToHTML(component) { - return ReactDOM.findDOMNode(TestUtils.renderIntoDocument(component)).outerHTML; + return renderToNode(component).outerHTML; +} + +function renderToNode(component) { + return ReactDOM.findDOMNode(TestUtils.renderIntoDocument(component)); +} + +// Simulate a movement; can't use TestUtils here because it uses react's event system only, +// but attaches event listeners directly to the document. +// Would love to new MouseEvent() here but it doesn't work with PhantomJS / old browsers. +// var e = new MouseEvent('mousemove', {clientX: 100, clientY: 100}); +function mouseMove(x, y, node) { + const doc = node ? node.ownerDocument : document; + const evt = doc.createEvent('MouseEvents'); + evt.initMouseEvent('mousemove', true, true, window, + 0, 0, 0, x, y, false, false, false, false, 0, null); + doc.dispatchEvent(evt); + return evt; +} + + +function simulateMovementFromTo(drag, fromX, fromY, toX, toY) { + const node = ReactDOM.findDOMNode(drag); + + TestUtils.Simulate.mouseDown(node, {clientX: fromX, clientY: fromY}); + mouseMove(toX, toY, node); + TestUtils.Simulate.mouseUp(node); +} + +function fragmentFromString(strHTML) { + var temp = document.createElement('div'); + temp.innerHTML = strHTML; + return temp.children[0]; +} + +function transplantNodeInto(node, into, selector) { + node.parentNode.removeChild(node); + selector(into).appendChild(node); + document.body.appendChild(into); } diff --git a/specs/main.js b/specs/main.js deleted file mode 100644 index c2fcd20b..00000000 --- a/specs/main.js +++ /dev/null @@ -1,10 +0,0 @@ -// PhantomJS STILL doesn't support bind yet -/*eslint no-extend-native:0*/ -Function.prototype.bind = Function.prototype.bind || function (thisp) { - var fn = this; - return function () { - return fn.apply(thisp, arguments); - }; -}; - -require('./draggable.spec.jsx'); diff --git a/typings/index.d.ts b/typings/index.d.ts new file mode 100644 index 00000000..14d29b8c --- /dev/null +++ b/typings/index.d.ts @@ -0,0 +1,68 @@ +declare module 'react-draggable' { + import * as React from 'react'; + + export interface DraggableBounds { + left?: number + right?: number + top?: number + bottom?: number + } + + export interface DraggableProps extends DraggableCoreProps { + axis: 'both' | 'x' | 'y' | 'none', + bounds: DraggableBounds | string | false , + defaultClassName: string, + defaultClassNameDragging: string, + defaultClassNameDragged: string, + defaultPosition: ControlPosition, + positionOffset: PositionOffsetControlPosition, + position: ControlPosition + } + + export type DraggableEvent = React.MouseEvent + | React.TouchEvent + | MouseEvent + | TouchEvent + + export type DraggableEventHandler = ( + e: DraggableEvent, + data: DraggableData + ) => void | false; + + export interface DraggableData { + node: HTMLElement, + x: number, y: number, + deltaX: number, deltaY: number, + lastX: number, lastY: number + } + + export type ControlPosition = {x: number, y: number}; + + export type PositionOffsetControlPosition = {x: number|string, y: number|string}; + + export interface DraggableCoreProps { + allowAnyClick: boolean, + allowMobileScroll: boolean, + cancel: string, + children?: React.ReactNode, + disabled: boolean, + enableUserSelectHack: boolean, + offsetParent: HTMLElement, + grid: [number, number], + handle: string, + nodeRef?: React.RefObject, + onStart: DraggableEventHandler, + onDrag: DraggableEventHandler, + onStop: DraggableEventHandler, + onMouseDown: (e: MouseEvent) => void, + scale: number + } + + export default class Draggable extends React.Component, {}> { + static defaultProps : DraggableProps; + } + + export class DraggableCore extends React.Component, {}> { + static defaultProps : DraggableCoreProps; + } +} diff --git a/typings/test.tsx b/typings/test.tsx new file mode 100644 index 00000000..0532f949 --- /dev/null +++ b/typings/test.tsx @@ -0,0 +1,71 @@ +import * as React from 'react'; +import * as ReactDOM from 'react-dom'; +import Draggable, {DraggableCore} from 'react-draggable'; + +const root = document.getElementById('root') + +function handleStart() {} +function handleDrag() {} +function handleStop() {} +function handleMouseDown() {} + +const nodeRef = React.createRef(); +ReactDOM.render( + +
+
+
+
+ , + root +); + +const nodeRefCore = React.createRef(); +ReactDOM.render( + +
+
+
+
+ , + root +); + + +ReactDOM.render(
, root); + +ReactDOM.render(
, root); diff --git a/typings/tsconfig.json b/typings/tsconfig.json new file mode 100644 index 00000000..9ad2ddb3 --- /dev/null +++ b/typings/tsconfig.json @@ -0,0 +1,11 @@ +{ + "compilerOptions": { + "noEmit": true, + "jsx": "preserve", + "strict": true + }, + "files": [ + "index.d.ts", + "test.tsx" + ] +} \ No newline at end of file diff --git a/webpack.config.js b/webpack.config.js index 8793442a..1b0af4f0 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -1,14 +1,34 @@ -var webpack = require('webpack'); +const path = require('path'); +const webpack = require('webpack'); -module.exports = { - entry: './index.js', +// Builds web module. Only really used in example code / static site. +module.exports = (env, argv) => ({ + entry: { + 'react-draggable.min': './lib/cjs.js', + }, output: { - filename: './dist/react-draggable.js', - sourceMapFilename: './dist/react-draggable.js.map', + filename: '[name].js', + sourceMapFilename: '[name].js.map', devtoolModuleFilenameTemplate: '../[resource-path]', library: 'ReactDraggable', - libraryTarget: 'umd' + libraryTarget: 'umd', + path: path.resolve(__dirname, 'build', 'web'), }, + devServer: { + hot: true, + open: 'example/index.html', + client: { + overlay: true, + }, + devMiddleware: { + // disableHostCheck: true, + writeToDisk: true, + }, + static: { + directory: '.', + } + }, + devtool: 'source-map', externals: { 'react': { 'commonjs': 'react', @@ -25,22 +45,30 @@ module.exports = { } }, module: { - loaders: [ + rules: [ { test: /\.(?:js|es).?$/, - loader: 'babel-loader?cacheDirectory', + loader: 'babel-loader', + options: { + cacheDirectory: false, // intended, have had bugs with env like DRAGGABLE_DEBUG in the past + }, exclude: /(node_modules)/ } ] }, - resolve: { - extensions: ['', '.webpack.js', '.web.js', '.js', '.es6'] - }, plugins: [ - new webpack.DefinePlugin({ - 'process.env': { - DRAGGABLE_DEBUG: process.env.DRAGGABLE_DEBUG - } - }) - ] -}; + new webpack.EnvironmentPlugin({ + // these are default values + DRAGGABLE_DEBUG: false, + NODE_ENV: ['development', 'production'].includes(argv.mode) ? argv.mode : 'production' + }), + // Scope hoisting + new webpack.optimize.ModuleConcatenationPlugin(), + ], + optimization: { + minimize: false, + }, + stats: { + errorDetails: true, + } +}); diff --git a/yarn.lock b/yarn.lock new file mode 100644 index 00000000..0c731a59 --- /dev/null +++ b/yarn.lock @@ -0,0 +1,6150 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@aashutoshrathi/word-wrap@^1.2.3": + version "1.2.6" + resolved "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz" + integrity sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA== + +"@ampproject/remapping@^2.2.0": + version "2.2.1" + resolved "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz" + integrity sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg== + dependencies: + "@jridgewell/gen-mapping" "^0.3.0" + "@jridgewell/trace-mapping" "^0.3.9" + +"@babel/cli@^7.27.2": + version "7.27.2" + resolved "https://registry.npmjs.org/@babel/cli/-/cli-7.27.2.tgz" + integrity sha512-cfd7DnGlhH6OIyuPSSj3vcfIdnbXukhAyKY8NaZrFadC7pXyL9mOL5WgjcptiEJLi5k3j8aYvLIVCzezrWTaiA== + dependencies: + "@jridgewell/trace-mapping" "^0.3.25" + commander "^6.2.0" + convert-source-map "^2.0.0" + fs-readdir-recursive "^1.1.0" + glob "^7.2.0" + make-dir "^2.1.0" + slash "^2.0.0" + optionalDependencies: + "@nicolo-ribaudo/chokidar-2" "2.1.8-no-fsevents.3" + chokidar "^3.6.0" + +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.27.1": + version "7.27.1" + resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz" + integrity sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg== + dependencies: + "@babel/helper-validator-identifier" "^7.27.1" + js-tokens "^4.0.0" + picocolors "^1.1.1" + +"@babel/compat-data@^7.22.6", "@babel/compat-data@^7.27.2": + version "7.27.5" + resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.27.5.tgz" + integrity sha512-KiRAp/VoJaWkkte84TvUd9qjdbZAdiqyvMxrGl1N6vzFogKmaLgoM3L1kgtLicp2HP5fBJS8JrZKLVIZGVJAVg== + +"@babel/core@^7.27.4": + version "7.27.4" + resolved "https://registry.npmjs.org/@babel/core/-/core-7.27.4.tgz" + integrity sha512-bXYxrXFubeYdvB0NhD/NBB3Qi6aZeV20GOWVI47t2dkecCEoneR4NPVcb7abpXDEvejgrUfFtG6vG/zxAKmg+g== + dependencies: + "@ampproject/remapping" "^2.2.0" + "@babel/code-frame" "^7.27.1" + "@babel/generator" "^7.27.3" + "@babel/helper-compilation-targets" "^7.27.2" + "@babel/helper-module-transforms" "^7.27.3" + "@babel/helpers" "^7.27.4" + "@babel/parser" "^7.27.4" + "@babel/template" "^7.27.2" + "@babel/traverse" "^7.27.4" + "@babel/types" "^7.27.3" + convert-source-map "^2.0.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.2.3" + semver "^6.3.1" + +"@babel/eslint-parser@^7.27.5": + version "7.27.5" + resolved "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.27.5.tgz" + integrity sha512-HLkYQfRICudzcOtjGwkPvGc5nF1b4ljLZh1IRDj50lRZ718NAKVgQpIAUX8bfg6u/yuSKY3L7E0YzIV+OxrB8Q== + dependencies: + "@nicolo-ribaudo/eslint-scope-5-internals" "5.1.1-v1" + eslint-visitor-keys "^2.1.0" + semver "^6.3.1" + +"@babel/generator@^7.27.3": + version "7.27.5" + resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.27.5.tgz" + integrity sha512-ZGhA37l0e/g2s1Cnzdix0O3aLYm66eF8aufiVteOgnwxgnRP8GoyMj7VWsgWnQbVKXyge7hqrFh2K2TQM6t1Hw== + dependencies: + "@babel/parser" "^7.27.5" + "@babel/types" "^7.27.3" + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.25" + jsesc "^3.0.2" + +"@babel/helper-annotate-as-pure@^7.27.1": + version "7.27.3" + resolved "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.3.tgz" + integrity sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg== + dependencies: + "@babel/types" "^7.27.3" + +"@babel/helper-compilation-targets@^7.22.6", "@babel/helper-compilation-targets@^7.27.1", "@babel/helper-compilation-targets@^7.27.2": + version "7.27.2" + resolved "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz" + integrity sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ== + dependencies: + "@babel/compat-data" "^7.27.2" + "@babel/helper-validator-option" "^7.27.1" + browserslist "^4.24.0" + lru-cache "^5.1.1" + semver "^6.3.1" + +"@babel/helper-create-class-features-plugin@^7.27.1": + version "7.27.1" + resolved "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.27.1.tgz" + integrity sha512-QwGAmuvM17btKU5VqXfb+Giw4JcN0hjuufz3DYnpeVDvZLAObloM77bhMXiqry3Iio+Ai4phVRDwl6WU10+r5A== + dependencies: + "@babel/helper-annotate-as-pure" "^7.27.1" + "@babel/helper-member-expression-to-functions" "^7.27.1" + "@babel/helper-optimise-call-expression" "^7.27.1" + "@babel/helper-replace-supers" "^7.27.1" + "@babel/helper-skip-transparent-expression-wrappers" "^7.27.1" + "@babel/traverse" "^7.27.1" + semver "^6.3.1" + +"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.27.1": + version "7.27.1" + resolved "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.27.1.tgz" + integrity sha512-uVDC72XVf8UbrH5qQTc18Agb8emwjTiZrQE11Nv3CuBEZmVvTwwE9CBUEvHku06gQCAyYf8Nv6ja1IN+6LMbxQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.27.1" + regexpu-core "^6.2.0" + semver "^6.3.1" + +"@babel/helper-define-polyfill-provider@^0.6.3", "@babel/helper-define-polyfill-provider@^0.6.4": + version "0.6.4" + resolved "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.4.tgz" + integrity sha512-jljfR1rGnXXNWnmQg2K3+bvhkxB51Rl32QRaOTuwwjviGrHzIbSc8+x9CpraDtbT7mfyjXObULP4w/adunNwAw== + dependencies: + "@babel/helper-compilation-targets" "^7.22.6" + "@babel/helper-plugin-utils" "^7.22.5" + debug "^4.1.1" + lodash.debounce "^4.0.8" + resolve "^1.14.2" + +"@babel/helper-member-expression-to-functions@^7.27.1": + version "7.27.1" + resolved "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.27.1.tgz" + integrity sha512-E5chM8eWjTp/aNoVpcbfM7mLxu9XGLWYise2eBKGQomAk/Mb4XoxyqXTZbuTohbsl8EKqdlMhnDI2CCLfcs9wA== + dependencies: + "@babel/traverse" "^7.27.1" + "@babel/types" "^7.27.1" + +"@babel/helper-module-imports@^7.27.1": + version "7.27.1" + resolved "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz" + integrity sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w== + dependencies: + "@babel/traverse" "^7.27.1" + "@babel/types" "^7.27.1" + +"@babel/helper-module-transforms@^7.27.1", "@babel/helper-module-transforms@^7.27.3": + version "7.27.3" + resolved "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.27.3.tgz" + integrity sha512-dSOvYwvyLsWBeIRyOeHXp5vPj5l1I011r52FM1+r1jCERv+aFXYk4whgQccYEGYxK2H3ZAIA8nuPkQ0HaUo3qg== + dependencies: + "@babel/helper-module-imports" "^7.27.1" + "@babel/helper-validator-identifier" "^7.27.1" + "@babel/traverse" "^7.27.3" + +"@babel/helper-optimise-call-expression@^7.27.1": + version "7.27.1" + resolved "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.27.1.tgz" + integrity sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw== + dependencies: + "@babel/types" "^7.27.1" + +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.27.1": + version "7.27.1" + resolved "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz" + integrity sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw== + +"@babel/helper-remap-async-to-generator@^7.27.1": + version "7.27.1" + resolved "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.27.1.tgz" + integrity sha512-7fiA521aVw8lSPeI4ZOD3vRFkoqkJcS+z4hFo82bFSH/2tNd6eJ5qCVMS5OzDmZh/kaHQeBaeyxK6wljcPtveA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.27.1" + "@babel/helper-wrap-function" "^7.27.1" + "@babel/traverse" "^7.27.1" + +"@babel/helper-replace-supers@^7.27.1": + version "7.27.1" + resolved "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.27.1.tgz" + integrity sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA== + dependencies: + "@babel/helper-member-expression-to-functions" "^7.27.1" + "@babel/helper-optimise-call-expression" "^7.27.1" + "@babel/traverse" "^7.27.1" + +"@babel/helper-skip-transparent-expression-wrappers@^7.27.1": + version "7.27.1" + resolved "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.27.1.tgz" + integrity sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg== + dependencies: + "@babel/traverse" "^7.27.1" + "@babel/types" "^7.27.1" + +"@babel/helper-string-parser@^7.27.1": + version "7.27.1" + resolved "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz" + integrity sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA== + +"@babel/helper-validator-identifier@^7.27.1": + version "7.27.1" + resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz" + integrity sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow== + +"@babel/helper-validator-option@^7.27.1": + version "7.27.1" + resolved "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz" + integrity sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg== + +"@babel/helper-wrap-function@^7.27.1": + version "7.27.1" + resolved "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.27.1.tgz" + integrity sha512-NFJK2sHUvrjo8wAU/nQTWU890/zB2jj0qBcCbZbbf+005cAsv6tMjXz31fBign6M5ov1o0Bllu+9nbqkfsjjJQ== + dependencies: + "@babel/template" "^7.27.1" + "@babel/traverse" "^7.27.1" + "@babel/types" "^7.27.1" + +"@babel/helpers@^7.27.4": + version "7.27.6" + resolved "https://registry.npmjs.org/@babel/helpers/-/helpers-7.27.6.tgz" + integrity sha512-muE8Tt8M22638HU31A3CgfSUciwz1fhATfoVai05aPXGor//CdWDCbnlY1yvBPo07njuVOCNGCSp/GTt12lIug== + dependencies: + "@babel/template" "^7.27.2" + "@babel/types" "^7.27.6" + +"@babel/parser@^7.27.2", "@babel/parser@^7.27.4", "@babel/parser@^7.27.5": + version "7.27.5" + resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.27.5.tgz" + integrity sha512-OsQd175SxWkGlzbny8J3K8TnnDD0N3lrIUtB92xwyRpzaenGZhxDvxN/JgU00U3CDZNj9tPuDJ5H0WS4Nt3vKg== + dependencies: + "@babel/types" "^7.27.3" + +"@babel/plugin-bugfix-firefox-class-in-computed-class-key@^7.27.1": + version "7.27.1" + resolved "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.27.1.tgz" + integrity sha512-QPG3C9cCVRQLxAVwmefEmwdTanECuUBMQZ/ym5kiw3XKCGA7qkuQLcjWWHcrD/GKbn/WmJwaezfuuAOcyKlRPA== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + "@babel/traverse" "^7.27.1" + +"@babel/plugin-bugfix-safari-class-field-initializer-scope@^7.27.1": + version "7.27.1" + resolved "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.27.1.tgz" + integrity sha512-qNeq3bCKnGgLkEXUuFry6dPlGfCdQNZbn7yUAPCInwAJHMU7THJfrBSozkcWq5sNM6RcF3S8XyQL2A52KNR9IA== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + +"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.27.1": + version "7.27.1" + resolved "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.27.1.tgz" + integrity sha512-g4L7OYun04N1WyqMNjldFwlfPCLVkgB54A/YCXICZYBsvJJE3kByKv9c9+R/nAfmIfjl2rKYLNyMHboYbZaWaA== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + +"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.27.1": + version "7.27.1" + resolved "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.27.1.tgz" + integrity sha512-oO02gcONcD5O1iTLi/6frMJBIwWEHceWGSGqrpCmEL8nogiS6J9PBlE48CaK20/Jx1LuRml9aDftLgdjXT8+Cw== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-skip-transparent-expression-wrappers" "^7.27.1" + "@babel/plugin-transform-optional-chaining" "^7.27.1" + +"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@^7.27.1": + version "7.27.1" + resolved "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.27.1.tgz" + integrity sha512-6BpaYGDavZqkI6yT+KSPdpZFfpnd68UKXbcjI9pJ13pvHhPrCKWOOLp+ysvMeA+DxnhuPpgIaRpxRxo5A9t5jw== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + "@babel/traverse" "^7.27.1" + +"@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2": + version "7.21.0-placeholder-for-preset-env.2" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz" + integrity sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w== + +"@babel/plugin-syntax-flow@^7.27.1": + version "7.27.1" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.27.1.tgz" + integrity sha512-p9OkPbZ5G7UT1MofwYFigGebnrzGJacoBSQM0/6bi/PUMVE+qlWDD/OalvQKbwgQzU6dl0xAv6r4X7Jme0RYxA== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + +"@babel/plugin-syntax-import-assertions@^7.27.1": + version "7.27.1" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.27.1.tgz" + integrity sha512-UT/Jrhw57xg4ILHLFnzFpPDlMbcdEicaAtjPQpbj9wa8T4r5KVWCimHcL/460g8Ht0DMxDyjsLgiWSkVjnwPFg== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + +"@babel/plugin-syntax-import-attributes@^7.27.1": + version "7.27.1" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.27.1.tgz" + integrity sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + +"@babel/plugin-syntax-jsx@^7.27.1": + version "7.27.1" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.27.1.tgz" + integrity sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + +"@babel/plugin-syntax-unicode-sets-regex@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz" + integrity sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-arrow-functions@^7.27.1": + version "7.27.1" + resolved "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.27.1.tgz" + integrity sha512-8Z4TGic6xW70FKThA5HYEKKyBpOOsucTOD1DjU3fZxDg+K3zBJcXMFnt/4yQiZnf5+MiOMSXQ9PaEK/Ilh1DeA== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + +"@babel/plugin-transform-async-generator-functions@^7.27.1": + version "7.27.1" + resolved "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.27.1.tgz" + integrity sha512-eST9RrwlpaoJBDHShc+DS2SG4ATTi2MYNb4OxYkf3n+7eb49LWpnS+HSpVfW4x927qQwgk8A2hGNVaajAEw0EA== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-remap-async-to-generator" "^7.27.1" + "@babel/traverse" "^7.27.1" + +"@babel/plugin-transform-async-to-generator@^7.27.1": + version "7.27.1" + resolved "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.27.1.tgz" + integrity sha512-NREkZsZVJS4xmTr8qzE5y8AfIPqsdQfRuUiLRTEzb7Qii8iFWCyDKaUV2c0rCuh4ljDZ98ALHP/PetiBV2nddA== + dependencies: + "@babel/helper-module-imports" "^7.27.1" + "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-remap-async-to-generator" "^7.27.1" + +"@babel/plugin-transform-block-scoped-functions@^7.27.1": + version "7.27.1" + resolved "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.27.1.tgz" + integrity sha512-cnqkuOtZLapWYZUYM5rVIdv1nXYuFVIltZ6ZJ7nIj585QsjKM5dhL2Fu/lICXZ1OyIAFc7Qy+bvDAtTXqGrlhg== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + +"@babel/plugin-transform-block-scoping@^7.27.1": + version "7.27.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.27.5.tgz" + integrity sha512-JF6uE2s67f0y2RZcm2kpAUEbD50vH62TyWVebxwHAlbSdM49VqPz8t4a1uIjp4NIOIZ4xzLfjY5emt/RCyC7TQ== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + +"@babel/plugin-transform-class-properties@^7.27.1": + version "7.27.1" + resolved "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.27.1.tgz" + integrity sha512-D0VcalChDMtuRvJIu3U/fwWjf8ZMykz5iZsg77Nuj821vCKI3zCyRLwRdWbsuJ/uRwZhZ002QtCqIkwC/ZkvbA== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.27.1" + "@babel/helper-plugin-utils" "^7.27.1" + +"@babel/plugin-transform-class-static-block@^7.27.1": + version "7.27.1" + resolved "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.27.1.tgz" + integrity sha512-s734HmYU78MVzZ++joYM+NkJusItbdRcbm+AGRgJCt3iA+yux0QpD9cBVdz3tKyrjVYWRl7j0mHSmv4lhV0aoA== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.27.1" + "@babel/helper-plugin-utils" "^7.27.1" + +"@babel/plugin-transform-classes@^7.27.1": + version "7.27.1" + resolved "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.27.1.tgz" + integrity sha512-7iLhfFAubmpeJe/Wo2TVuDrykh/zlWXLzPNdL0Jqn/Xu8R3QQ8h9ff8FQoISZOsw74/HFqFI7NX63HN7QFIHKA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.27.1" + "@babel/helper-compilation-targets" "^7.27.1" + "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-replace-supers" "^7.27.1" + "@babel/traverse" "^7.27.1" + globals "^11.1.0" + +"@babel/plugin-transform-computed-properties@^7.27.1": + version "7.27.1" + resolved "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.27.1.tgz" + integrity sha512-lj9PGWvMTVksbWiDT2tW68zGS/cyo4AkZ/QTp0sQT0mjPopCmrSkzxeXkznjqBxzDI6TclZhOJbBmbBLjuOZUw== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + "@babel/template" "^7.27.1" + +"@babel/plugin-transform-destructuring@^7.27.1", "@babel/plugin-transform-destructuring@^7.27.3": + version "7.27.3" + resolved "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.27.3.tgz" + integrity sha512-s4Jrok82JpiaIprtY2nHsYmrThKvvwgHwjgd7UMiYhZaN0asdXNLr0y+NjTfkA7SyQE5i2Fb7eawUOZmLvyqOA== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + +"@babel/plugin-transform-dotall-regex@^7.27.1": + version "7.27.1" + resolved "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.27.1.tgz" + integrity sha512-gEbkDVGRvjj7+T1ivxrfgygpT7GUd4vmODtYpbs0gZATdkX8/iSnOtZSxiZnsgm1YjTgjI6VKBGSJJevkrclzw== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.27.1" + "@babel/helper-plugin-utils" "^7.27.1" + +"@babel/plugin-transform-duplicate-keys@^7.27.1": + version "7.27.1" + resolved "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.27.1.tgz" + integrity sha512-MTyJk98sHvSs+cvZ4nOauwTTG1JeonDjSGvGGUNHreGQns+Mpt6WX/dVzWBHgg+dYZhkC4X+zTDfkTU+Vy9y7Q== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + +"@babel/plugin-transform-duplicate-named-capturing-groups-regex@^7.27.1": + version "7.27.1" + resolved "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.27.1.tgz" + integrity sha512-hkGcueTEzuhB30B3eJCbCYeCaaEQOmQR0AdvzpD4LoN0GXMWzzGSuRrxR2xTnCrvNbVwK9N6/jQ92GSLfiZWoQ== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.27.1" + "@babel/helper-plugin-utils" "^7.27.1" + +"@babel/plugin-transform-dynamic-import@^7.27.1": + version "7.27.1" + resolved "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.27.1.tgz" + integrity sha512-MHzkWQcEmjzzVW9j2q8LGjwGWpG2mjwaaB0BNQwst3FIjqsg8Ct/mIZlvSPJvfi9y2AC8mi/ktxbFVL9pZ1I4A== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + +"@babel/plugin-transform-exponentiation-operator@^7.27.1": + version "7.27.1" + resolved "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.27.1.tgz" + integrity sha512-uspvXnhHvGKf2r4VVtBpeFnuDWsJLQ6MF6lGJLC89jBR1uoVeqM416AZtTuhTezOfgHicpJQmoD5YUakO/YmXQ== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + +"@babel/plugin-transform-export-namespace-from@^7.27.1": + version "7.27.1" + resolved "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.27.1.tgz" + integrity sha512-tQvHWSZ3/jH2xuq/vZDy0jNn+ZdXJeM8gHvX4lnJmsc3+50yPlWdZXIc5ay+umX+2/tJIqHqiEqcJvxlmIvRvQ== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + +"@babel/plugin-transform-flow-comments@^7.27.3": + version "7.27.3" + resolved "https://registry.npmjs.org/@babel/plugin-transform-flow-comments/-/plugin-transform-flow-comments-7.27.3.tgz" + integrity sha512-TBx8ip3mpiWUBBXdYOipxon6f9nM5udhiYaW+h3FhVBEAmuRvRIx6Q7uhtrLacLSNQJoweFaUe+UzAU32BaziA== + dependencies: + "@babel/generator" "^7.27.3" + "@babel/helper-plugin-utils" "^7.27.1" + "@babel/plugin-syntax-flow" "^7.27.1" + +"@babel/plugin-transform-flow-strip-types@^7.27.1": + version "7.27.1" + resolved "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.27.1.tgz" + integrity sha512-G5eDKsu50udECw7DL2AcsysXiQyB7Nfg521t2OAJ4tbfTJ27doHLeF/vlI1NZGlLdbb/v+ibvtL1YBQqYOwJGg== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + "@babel/plugin-syntax-flow" "^7.27.1" + +"@babel/plugin-transform-for-of@^7.27.1": + version "7.27.1" + resolved "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.27.1.tgz" + integrity sha512-BfbWFFEJFQzLCQ5N8VocnCtA8J1CLkNTe2Ms2wocj75dd6VpiqS5Z5quTYcUoo4Yq+DN0rtikODccuv7RU81sw== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-skip-transparent-expression-wrappers" "^7.27.1" + +"@babel/plugin-transform-function-name@^7.27.1": + version "7.27.1" + resolved "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.27.1.tgz" + integrity sha512-1bQeydJF9Nr1eBCMMbC+hdwmRlsv5XYOMu03YSWFwNs0HsAmtSxxF1fyuYPqemVldVyFmlCU7w8UE14LupUSZQ== + dependencies: + "@babel/helper-compilation-targets" "^7.27.1" + "@babel/helper-plugin-utils" "^7.27.1" + "@babel/traverse" "^7.27.1" + +"@babel/plugin-transform-json-strings@^7.27.1": + version "7.27.1" + resolved "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.27.1.tgz" + integrity sha512-6WVLVJiTjqcQauBhn1LkICsR2H+zm62I3h9faTDKt1qP4jn2o72tSvqMwtGFKGTpojce0gJs+76eZ2uCHRZh0Q== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + +"@babel/plugin-transform-literals@^7.27.1": + version "7.27.1" + resolved "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.27.1.tgz" + integrity sha512-0HCFSepIpLTkLcsi86GG3mTUzxV5jpmbv97hTETW3yzrAij8aqlD36toB1D0daVFJM8NK6GvKO0gslVQmm+zZA== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + +"@babel/plugin-transform-logical-assignment-operators@^7.27.1": + version "7.27.1" + resolved "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.27.1.tgz" + integrity sha512-SJvDs5dXxiae4FbSL1aBJlG4wvl594N6YEVVn9e3JGulwioy6z3oPjx/sQBO3Y4NwUu5HNix6KJ3wBZoewcdbw== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + +"@babel/plugin-transform-member-expression-literals@^7.27.1": + version "7.27.1" + resolved "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.27.1.tgz" + integrity sha512-hqoBX4dcZ1I33jCSWcXrP+1Ku7kdqXf1oeah7ooKOIiAdKQ+uqftgCFNOSzA5AMS2XIHEYeGFg4cKRCdpxzVOQ== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + +"@babel/plugin-transform-modules-amd@^7.27.1": + version "7.27.1" + resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.27.1.tgz" + integrity sha512-iCsytMg/N9/oFq6n+gFTvUYDZQOMK5kEdeYxmxt91fcJGycfxVP9CnrxoliM0oumFERba2i8ZtwRUCMhvP1LnA== + dependencies: + "@babel/helper-module-transforms" "^7.27.1" + "@babel/helper-plugin-utils" "^7.27.1" + +"@babel/plugin-transform-modules-commonjs@^7.27.1": + version "7.27.1" + resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.27.1.tgz" + integrity sha512-OJguuwlTYlN0gBZFRPqwOGNWssZjfIUdS7HMYtN8c1KmwpwHFBwTeFZrg9XZa+DFTitWOW5iTAG7tyCUPsCCyw== + dependencies: + "@babel/helper-module-transforms" "^7.27.1" + "@babel/helper-plugin-utils" "^7.27.1" + +"@babel/plugin-transform-modules-systemjs@^7.27.1": + version "7.27.1" + resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.27.1.tgz" + integrity sha512-w5N1XzsRbc0PQStASMksmUeqECuzKuTJer7kFagK8AXgpCMkeDMO5S+aaFb7A51ZYDF7XI34qsTX+fkHiIm5yA== + dependencies: + "@babel/helper-module-transforms" "^7.27.1" + "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-validator-identifier" "^7.27.1" + "@babel/traverse" "^7.27.1" + +"@babel/plugin-transform-modules-umd@^7.27.1": + version "7.27.1" + resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.27.1.tgz" + integrity sha512-iQBE/xC5BV1OxJbp6WG7jq9IWiD+xxlZhLrdwpPkTX3ydmXdvoCpyfJN7acaIBZaOqTfr76pgzqBJflNbeRK+w== + dependencies: + "@babel/helper-module-transforms" "^7.27.1" + "@babel/helper-plugin-utils" "^7.27.1" + +"@babel/plugin-transform-named-capturing-groups-regex@^7.27.1": + version "7.27.1" + resolved "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.27.1.tgz" + integrity sha512-SstR5JYy8ddZvD6MhV0tM/j16Qds4mIpJTOd1Yu9J9pJjH93bxHECF7pgtc28XvkzTD6Pxcm/0Z73Hvk7kb3Ng== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.27.1" + "@babel/helper-plugin-utils" "^7.27.1" + +"@babel/plugin-transform-new-target@^7.27.1": + version "7.27.1" + resolved "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.27.1.tgz" + integrity sha512-f6PiYeqXQ05lYq3TIfIDu/MtliKUbNwkGApPUvyo6+tc7uaR4cPjPe7DFPr15Uyycg2lZU6btZ575CuQoYh7MQ== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + +"@babel/plugin-transform-nullish-coalescing-operator@^7.27.1": + version "7.27.1" + resolved "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.27.1.tgz" + integrity sha512-aGZh6xMo6q9vq1JGcw58lZ1Z0+i0xB2x0XaauNIUXd6O1xXc3RwoWEBlsTQrY4KQ9Jf0s5rgD6SiNkaUdJegTA== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + +"@babel/plugin-transform-numeric-separator@^7.27.1": + version "7.27.1" + resolved "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.27.1.tgz" + integrity sha512-fdPKAcujuvEChxDBJ5c+0BTaS6revLV7CJL08e4m3de8qJfNIuCc2nc7XJYOjBoTMJeqSmwXJ0ypE14RCjLwaw== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + +"@babel/plugin-transform-object-rest-spread@^7.27.2": + version "7.27.3" + resolved "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.27.3.tgz" + integrity sha512-7ZZtznF9g4l2JCImCo5LNKFHB5eXnN39lLtLY5Tg+VkR0jwOt7TBciMckuiQIOIW7L5tkQOCh3bVGYeXgMx52Q== + dependencies: + "@babel/helper-compilation-targets" "^7.27.2" + "@babel/helper-plugin-utils" "^7.27.1" + "@babel/plugin-transform-destructuring" "^7.27.3" + "@babel/plugin-transform-parameters" "^7.27.1" + +"@babel/plugin-transform-object-super@^7.27.1": + version "7.27.1" + resolved "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.27.1.tgz" + integrity sha512-SFy8S9plRPbIcxlJ8A6mT/CxFdJx/c04JEctz4jf8YZaVS2px34j7NXRrlGlHkN/M2gnpL37ZpGRGVFLd3l8Ng== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-replace-supers" "^7.27.1" + +"@babel/plugin-transform-optional-catch-binding@^7.27.1": + version "7.27.1" + resolved "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.27.1.tgz" + integrity sha512-txEAEKzYrHEX4xSZN4kJ+OfKXFVSWKB2ZxM9dpcE3wT7smwkNmXo5ORRlVzMVdJbD+Q8ILTgSD7959uj+3Dm3Q== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + +"@babel/plugin-transform-optional-chaining@^7.27.1": + version "7.27.1" + resolved "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.27.1.tgz" + integrity sha512-BQmKPPIuc8EkZgNKsv0X4bPmOoayeu4F1YCwx2/CfmDSXDbp7GnzlUH+/ul5VGfRg1AoFPsrIThlEBj2xb4CAg== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-skip-transparent-expression-wrappers" "^7.27.1" + +"@babel/plugin-transform-parameters@^7.27.1": + version "7.27.1" + resolved "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.27.1.tgz" + integrity sha512-018KRk76HWKeZ5l4oTj2zPpSh+NbGdt0st5S6x0pga6HgrjBOJb24mMDHorFopOOd6YHkLgOZ+zaCjZGPO4aKg== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + +"@babel/plugin-transform-private-methods@^7.27.1": + version "7.27.1" + resolved "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.27.1.tgz" + integrity sha512-10FVt+X55AjRAYI9BrdISN9/AQWHqldOeZDUoLyif1Kn05a56xVBXb8ZouL8pZ9jem8QpXaOt8TS7RHUIS+GPA== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.27.1" + "@babel/helper-plugin-utils" "^7.27.1" + +"@babel/plugin-transform-private-property-in-object@^7.27.1": + version "7.27.1" + resolved "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.27.1.tgz" + integrity sha512-5J+IhqTi1XPa0DXF83jYOaARrX+41gOewWbkPyjMNRDqgOCqdffGh8L3f/Ek5utaEBZExjSAzcyjmV9SSAWObQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.27.1" + "@babel/helper-create-class-features-plugin" "^7.27.1" + "@babel/helper-plugin-utils" "^7.27.1" + +"@babel/plugin-transform-property-literals@^7.27.1": + version "7.27.1" + resolved "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.27.1.tgz" + integrity sha512-oThy3BCuCha8kDZ8ZkgOg2exvPYUlprMukKQXI1r1pJ47NCvxfkEy8vK+r/hT9nF0Aa4H1WUPZZjHTFtAhGfmQ== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + +"@babel/plugin-transform-react-display-name@^7.27.1": + version "7.27.1" + resolved "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.27.1.tgz" + integrity sha512-p9+Vl3yuHPmkirRrg021XiP+EETmPMQTLr6Ayjj85RLNEbb3Eya/4VI0vAdzQG9SEAl2Lnt7fy5lZyMzjYoZQQ== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + +"@babel/plugin-transform-react-jsx-development@^7.27.1": + version "7.27.1" + resolved "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.27.1.tgz" + integrity sha512-ykDdF5yI4f1WrAolLqeF3hmYU12j9ntLQl/AOG1HAS21jxyg1Q0/J/tpREuYLfatGdGmXp/3yS0ZA76kOlVq9Q== + dependencies: + "@babel/plugin-transform-react-jsx" "^7.27.1" + +"@babel/plugin-transform-react-jsx@^7.27.1": + version "7.27.1" + resolved "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.27.1.tgz" + integrity sha512-2KH4LWGSrJIkVf5tSiBFYuXDAoWRq2MMwgivCf+93dd0GQi8RXLjKA/0EvRnVV5G0hrHczsquXuD01L8s6dmBw== + dependencies: + "@babel/helper-annotate-as-pure" "^7.27.1" + "@babel/helper-module-imports" "^7.27.1" + "@babel/helper-plugin-utils" "^7.27.1" + "@babel/plugin-syntax-jsx" "^7.27.1" + "@babel/types" "^7.27.1" + +"@babel/plugin-transform-react-pure-annotations@^7.27.1": + version "7.27.1" + resolved "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.27.1.tgz" + integrity sha512-JfuinvDOsD9FVMTHpzA/pBLisxpv1aSf+OIV8lgH3MuWrks19R27e6a6DipIg4aX1Zm9Wpb04p8wljfKrVSnPA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.27.1" + "@babel/helper-plugin-utils" "^7.27.1" + +"@babel/plugin-transform-regenerator@^7.27.1": + version "7.27.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.27.5.tgz" + integrity sha512-uhB8yHerfe3MWnuLAhEbeQ4afVoqv8BQsPqrTv7e/jZ9y00kJL6l9a/f4OWaKxotmjzewfEyXE1vgDJenkQ2/Q== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + +"@babel/plugin-transform-regexp-modifiers@^7.27.1": + version "7.27.1" + resolved "https://registry.npmjs.org/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.27.1.tgz" + integrity sha512-TtEciroaiODtXvLZv4rmfMhkCv8jx3wgKpL68PuiPh2M4fvz5jhsA7697N1gMvkvr/JTF13DrFYyEbY9U7cVPA== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.27.1" + "@babel/helper-plugin-utils" "^7.27.1" + +"@babel/plugin-transform-reserved-words@^7.27.1": + version "7.27.1" + resolved "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.27.1.tgz" + integrity sha512-V2ABPHIJX4kC7HegLkYoDpfg9PVmuWy/i6vUM5eGK22bx4YVFD3M5F0QQnWQoDs6AGsUWTVOopBiMFQgHaSkVw== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + +"@babel/plugin-transform-shorthand-properties@^7.27.1": + version "7.27.1" + resolved "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.27.1.tgz" + integrity sha512-N/wH1vcn4oYawbJ13Y/FxcQrWk63jhfNa7jef0ih7PHSIHX2LB7GWE1rkPrOnka9kwMxb6hMl19p7lidA+EHmQ== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + +"@babel/plugin-transform-spread@^7.27.1": + version "7.27.1" + resolved "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.27.1.tgz" + integrity sha512-kpb3HUqaILBJcRFVhFUs6Trdd4mkrzcGXss+6/mxUd273PfbWqSDHRzMT2234gIg2QYfAjvXLSquP1xECSg09Q== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-skip-transparent-expression-wrappers" "^7.27.1" + +"@babel/plugin-transform-sticky-regex@^7.27.1": + version "7.27.1" + resolved "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.27.1.tgz" + integrity sha512-lhInBO5bi/Kowe2/aLdBAawijx+q1pQzicSgnkB6dUPc1+RC8QmJHKf2OjvU+NZWitguJHEaEmbV6VWEouT58g== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + +"@babel/plugin-transform-template-literals@^7.27.1": + version "7.27.1" + resolved "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.27.1.tgz" + integrity sha512-fBJKiV7F2DxZUkg5EtHKXQdbsbURW3DZKQUWphDum0uRP6eHGGa/He9mc0mypL680pb+e/lDIthRohlv8NCHkg== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + +"@babel/plugin-transform-typeof-symbol@^7.27.1": + version "7.27.1" + resolved "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.27.1.tgz" + integrity sha512-RiSILC+nRJM7FY5srIyc4/fGIwUhyDuuBSdWn4y6yT6gm652DpCHZjIipgn6B7MQ1ITOUnAKWixEUjQRIBIcLw== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + +"@babel/plugin-transform-unicode-escapes@^7.27.1": + version "7.27.1" + resolved "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.27.1.tgz" + integrity sha512-Ysg4v6AmF26k9vpfFuTZg8HRfVWzsh1kVfowA23y9j/Gu6dOuahdUVhkLqpObp3JIv27MLSii6noRnuKN8H0Mg== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + +"@babel/plugin-transform-unicode-property-regex@^7.27.1": + version "7.27.1" + resolved "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.27.1.tgz" + integrity sha512-uW20S39PnaTImxp39O5qFlHLS9LJEmANjMG7SxIhap8rCHqu0Ik+tLEPX5DKmHn6CsWQ7j3lix2tFOa5YtL12Q== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.27.1" + "@babel/helper-plugin-utils" "^7.27.1" + +"@babel/plugin-transform-unicode-regex@^7.27.1": + version "7.27.1" + resolved "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.27.1.tgz" + integrity sha512-xvINq24TRojDuyt6JGtHmkVkrfVV3FPT16uytxImLeBZqW3/H52yN+kM1MGuyPkIQxrzKwPHs5U/MP3qKyzkGw== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.27.1" + "@babel/helper-plugin-utils" "^7.27.1" + +"@babel/plugin-transform-unicode-sets-regex@^7.27.1": + version "7.27.1" + resolved "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.27.1.tgz" + integrity sha512-EtkOujbc4cgvb0mlpQefi4NTPBzhSIevblFevACNLUspmrALgmEBdL/XfnyyITfd8fKBZrZys92zOWcik7j9Tw== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.27.1" + "@babel/helper-plugin-utils" "^7.27.1" + +"@babel/preset-env@^7.27.2": + version "7.27.2" + resolved "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.27.2.tgz" + integrity sha512-Ma4zSuYSlGNRlCLO+EAzLnCmJK2vdstgv+n7aUP+/IKZrOfWHOJVdSJtuub8RzHTj3ahD37k5OKJWvzf16TQyQ== + dependencies: + "@babel/compat-data" "^7.27.2" + "@babel/helper-compilation-targets" "^7.27.2" + "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-validator-option" "^7.27.1" + "@babel/plugin-bugfix-firefox-class-in-computed-class-key" "^7.27.1" + "@babel/plugin-bugfix-safari-class-field-initializer-scope" "^7.27.1" + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.27.1" + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.27.1" + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly" "^7.27.1" + "@babel/plugin-proposal-private-property-in-object" "7.21.0-placeholder-for-preset-env.2" + "@babel/plugin-syntax-import-assertions" "^7.27.1" + "@babel/plugin-syntax-import-attributes" "^7.27.1" + "@babel/plugin-syntax-unicode-sets-regex" "^7.18.6" + "@babel/plugin-transform-arrow-functions" "^7.27.1" + "@babel/plugin-transform-async-generator-functions" "^7.27.1" + "@babel/plugin-transform-async-to-generator" "^7.27.1" + "@babel/plugin-transform-block-scoped-functions" "^7.27.1" + "@babel/plugin-transform-block-scoping" "^7.27.1" + "@babel/plugin-transform-class-properties" "^7.27.1" + "@babel/plugin-transform-class-static-block" "^7.27.1" + "@babel/plugin-transform-classes" "^7.27.1" + "@babel/plugin-transform-computed-properties" "^7.27.1" + "@babel/plugin-transform-destructuring" "^7.27.1" + "@babel/plugin-transform-dotall-regex" "^7.27.1" + "@babel/plugin-transform-duplicate-keys" "^7.27.1" + "@babel/plugin-transform-duplicate-named-capturing-groups-regex" "^7.27.1" + "@babel/plugin-transform-dynamic-import" "^7.27.1" + "@babel/plugin-transform-exponentiation-operator" "^7.27.1" + "@babel/plugin-transform-export-namespace-from" "^7.27.1" + "@babel/plugin-transform-for-of" "^7.27.1" + "@babel/plugin-transform-function-name" "^7.27.1" + "@babel/plugin-transform-json-strings" "^7.27.1" + "@babel/plugin-transform-literals" "^7.27.1" + "@babel/plugin-transform-logical-assignment-operators" "^7.27.1" + "@babel/plugin-transform-member-expression-literals" "^7.27.1" + "@babel/plugin-transform-modules-amd" "^7.27.1" + "@babel/plugin-transform-modules-commonjs" "^7.27.1" + "@babel/plugin-transform-modules-systemjs" "^7.27.1" + "@babel/plugin-transform-modules-umd" "^7.27.1" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.27.1" + "@babel/plugin-transform-new-target" "^7.27.1" + "@babel/plugin-transform-nullish-coalescing-operator" "^7.27.1" + "@babel/plugin-transform-numeric-separator" "^7.27.1" + "@babel/plugin-transform-object-rest-spread" "^7.27.2" + "@babel/plugin-transform-object-super" "^7.27.1" + "@babel/plugin-transform-optional-catch-binding" "^7.27.1" + "@babel/plugin-transform-optional-chaining" "^7.27.1" + "@babel/plugin-transform-parameters" "^7.27.1" + "@babel/plugin-transform-private-methods" "^7.27.1" + "@babel/plugin-transform-private-property-in-object" "^7.27.1" + "@babel/plugin-transform-property-literals" "^7.27.1" + "@babel/plugin-transform-regenerator" "^7.27.1" + "@babel/plugin-transform-regexp-modifiers" "^7.27.1" + "@babel/plugin-transform-reserved-words" "^7.27.1" + "@babel/plugin-transform-shorthand-properties" "^7.27.1" + "@babel/plugin-transform-spread" "^7.27.1" + "@babel/plugin-transform-sticky-regex" "^7.27.1" + "@babel/plugin-transform-template-literals" "^7.27.1" + "@babel/plugin-transform-typeof-symbol" "^7.27.1" + "@babel/plugin-transform-unicode-escapes" "^7.27.1" + "@babel/plugin-transform-unicode-property-regex" "^7.27.1" + "@babel/plugin-transform-unicode-regex" "^7.27.1" + "@babel/plugin-transform-unicode-sets-regex" "^7.27.1" + "@babel/preset-modules" "0.1.6-no-external-plugins" + babel-plugin-polyfill-corejs2 "^0.4.10" + babel-plugin-polyfill-corejs3 "^0.11.0" + babel-plugin-polyfill-regenerator "^0.6.1" + core-js-compat "^3.40.0" + semver "^6.3.1" + +"@babel/preset-flow@^7.27.1": + version "7.27.1" + resolved "https://registry.npmjs.org/@babel/preset-flow/-/preset-flow-7.27.1.tgz" + integrity sha512-ez3a2it5Fn6P54W8QkbfIyyIbxlXvcxyWHHvno1Wg0Ej5eiJY5hBb8ExttoIOJJk7V2dZE6prP7iby5q2aQ0Lg== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-validator-option" "^7.27.1" + "@babel/plugin-transform-flow-strip-types" "^7.27.1" + +"@babel/preset-modules@0.1.6-no-external-plugins": + version "0.1.6-no-external-plugins" + resolved "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz" + integrity sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/types" "^7.4.4" + esutils "^2.0.2" + +"@babel/preset-react@^7.27.1": + version "7.27.1" + resolved "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.27.1.tgz" + integrity sha512-oJHWh2gLhU9dW9HHr42q0cI0/iHHXTLGe39qvpAZZzagHy0MzYLCnCVV0symeRvzmjHyVU7mw2K06E6u/JwbhA== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-validator-option" "^7.27.1" + "@babel/plugin-transform-react-display-name" "^7.27.1" + "@babel/plugin-transform-react-jsx" "^7.27.1" + "@babel/plugin-transform-react-jsx-development" "^7.27.1" + "@babel/plugin-transform-react-pure-annotations" "^7.27.1" + +"@babel/template@^7.27.1", "@babel/template@^7.27.2": + version "7.27.2" + resolved "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz" + integrity sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw== + dependencies: + "@babel/code-frame" "^7.27.1" + "@babel/parser" "^7.27.2" + "@babel/types" "^7.27.1" + +"@babel/traverse@^7.27.1", "@babel/traverse@^7.27.3", "@babel/traverse@^7.27.4": + version "7.27.4" + resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.27.4.tgz" + integrity sha512-oNcu2QbHqts9BtOWJosOVJapWjBDSxGCpFvikNR5TGDYDQf3JwpIoMzIKrvfoti93cLfPJEG4tH9SPVeyCGgdA== + dependencies: + "@babel/code-frame" "^7.27.1" + "@babel/generator" "^7.27.3" + "@babel/parser" "^7.27.4" + "@babel/template" "^7.27.2" + "@babel/types" "^7.27.3" + debug "^4.3.1" + globals "^11.1.0" + +"@babel/types@^7.27.1", "@babel/types@^7.27.3", "@babel/types@^7.27.6", "@babel/types@^7.4.4": + version "7.27.6" + resolved "https://registry.npmjs.org/@babel/types/-/types-7.27.6.tgz" + integrity sha512-ETyHEk2VHHvl9b9jZP5IHPavHYk57EhanlRRuae9XCpb/j5bDCbPPMOBfCWhnl/7EDJz0jEMCi/RhccCE8r1+Q== + dependencies: + "@babel/helper-string-parser" "^7.27.1" + "@babel/helper-validator-identifier" "^7.27.1" + +"@colors/colors@1.5.0": + version "1.5.0" + resolved "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz" + integrity sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ== + +"@discoveryjs/json-ext@^0.6.1": + version "0.6.3" + resolved "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.6.3.tgz" + integrity sha512-4B4OijXeVNOPZlYA2oEwWOTkzyltLao+xbotHQeqN++Rv27Y6s818+n2Qkp8q+Fxhn0t/5lA5X1Mxktud8eayQ== + +"@eslint-community/eslint-utils@^4.2.0": + version "4.4.0" + resolved "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz" + integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA== + dependencies: + eslint-visitor-keys "^3.3.0" + +"@eslint-community/regexpp@^4.12.1": + version "4.12.1" + resolved "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz" + integrity sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ== + +"@eslint/config-array@^0.20.1": + version "0.20.1" + resolved "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.20.1.tgz" + integrity sha512-OL0RJzC/CBzli0DrrR31qzj6d6i6Mm3HByuhflhl4LOBiWxN+3i6/t/ZQQNii4tjksXi8r2CRW1wMpWA2ULUEw== + dependencies: + "@eslint/object-schema" "^2.1.6" + debug "^4.3.1" + minimatch "^3.1.2" + +"@eslint/config-helpers@^0.2.1": + version "0.2.3" + resolved "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.2.3.tgz" + integrity sha512-u180qk2Um1le4yf0ruXH3PYFeEZeYC3p/4wCTKrr2U1CmGdzGi3KtY0nuPDH48UJxlKCC5RDzbcbh4X0XlqgHg== + +"@eslint/core@^0.14.0": + version "0.14.0" + resolved "https://registry.npmjs.org/@eslint/core/-/core-0.14.0.tgz" + integrity sha512-qIbV0/JZr7iSDjqAc60IqbLdsj9GDt16xQtWD+B78d/HAlvysGdZZ6rpJHGAc2T0FQx1X6thsSPdnoiGKdNtdg== + dependencies: + "@types/json-schema" "^7.0.15" + +"@eslint/core@^0.15.1": + version "0.15.1" + resolved "https://registry.npmjs.org/@eslint/core/-/core-0.15.1.tgz" + integrity sha512-bkOp+iumZCCbt1K1CmWf0R9pM5yKpDv+ZXtvSyQpudrI9kuFLp+bM2WOPXImuD/ceQuaa8f5pj93Y7zyECIGNA== + dependencies: + "@types/json-schema" "^7.0.15" + +"@eslint/eslintrc@^3.3.1": + version "3.3.1" + resolved "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.1.tgz" + integrity sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ== + dependencies: + ajv "^6.12.4" + debug "^4.3.2" + espree "^10.0.1" + globals "^14.0.0" + ignore "^5.2.0" + import-fresh "^3.2.1" + js-yaml "^4.1.0" + minimatch "^3.1.2" + strip-json-comments "^3.1.1" + +"@eslint/js@9.29.0", "@eslint/js@^9.29.0": + version "9.29.0" + resolved "https://registry.npmjs.org/@eslint/js/-/js-9.29.0.tgz" + integrity sha512-3PIF4cBw/y+1u2EazflInpV+lYsSG0aByVIQzAgb1m1MhHFSbqTyNqtBKHgWf/9Ykud+DhILS9EGkmekVhbKoQ== + +"@eslint/object-schema@^2.1.6": + version "2.1.6" + resolved "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.6.tgz" + integrity sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA== + +"@eslint/plugin-kit@^0.3.1": + version "0.3.3" + resolved "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.3.3.tgz" + integrity sha512-1+WqvgNMhmlAambTvT3KPtCl/Ibr68VldY2XY40SL1CE0ZXiakFR/cbTspaF5HsnpDMvcYYoJHfl4980NBjGag== + dependencies: + "@eslint/core" "^0.15.1" + levn "^0.4.1" + +"@humanfs/core@^0.19.1": + version "0.19.1" + resolved "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz" + integrity sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA== + +"@humanfs/node@^0.16.6": + version "0.16.6" + resolved "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz" + integrity sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw== + dependencies: + "@humanfs/core" "^0.19.1" + "@humanwhocodes/retry" "^0.3.0" + +"@humanwhocodes/module-importer@^1.0.1": + version "1.0.1" + resolved "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz" + integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== + +"@humanwhocodes/retry@^0.3.0": + version "0.3.1" + resolved "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz" + integrity sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA== + +"@humanwhocodes/retry@^0.4.2": + version "0.4.3" + resolved "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz" + integrity sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ== + +"@jridgewell/gen-mapping@^0.3.0", "@jridgewell/gen-mapping@^0.3.5": + version "0.3.8" + resolved "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz" + integrity sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA== + dependencies: + "@jridgewell/set-array" "^1.2.1" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/trace-mapping" "^0.3.24" + +"@jridgewell/resolve-uri@^3.1.0": + version "3.1.1" + resolved "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz" + integrity sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA== + +"@jridgewell/set-array@^1.2.1": + version "1.2.1" + resolved "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz" + integrity sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A== + +"@jridgewell/source-map@^0.3.3": + version "0.3.5" + resolved "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz" + integrity sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ== + dependencies: + "@jridgewell/gen-mapping" "^0.3.0" + "@jridgewell/trace-mapping" "^0.3.9" + +"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14": + version "1.4.15" + resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz" + integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== + +"@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25", "@jridgewell/trace-mapping@^0.3.9": + version "0.3.25" + resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz" + integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ== + dependencies: + "@jridgewell/resolve-uri" "^3.1.0" + "@jridgewell/sourcemap-codec" "^1.4.14" + +"@jsonjoy.com/base64@^1.1.1": + version "1.1.2" + resolved "https://registry.npmjs.org/@jsonjoy.com/base64/-/base64-1.1.2.tgz" + integrity sha512-q6XAnWQDIMA3+FTiOYajoYqySkO+JSat0ytXGSuRdq9uXE7o92gzuQwQM14xaCRlBLGq3v5miDGC4vkVTn54xA== + +"@jsonjoy.com/json-pack@^1.0.3": + version "1.2.0" + resolved "https://registry.npmjs.org/@jsonjoy.com/json-pack/-/json-pack-1.2.0.tgz" + integrity sha512-io1zEbbYcElht3tdlqEOFxZ0dMTYrHz9iMf0gqn1pPjZFTCgM5R4R5IMA20Chb2UPYYsxjzs8CgZ7Nb5n2K2rA== + dependencies: + "@jsonjoy.com/base64" "^1.1.1" + "@jsonjoy.com/util" "^1.1.2" + hyperdyperid "^1.2.0" + thingies "^1.20.0" + +"@jsonjoy.com/util@^1.1.2", "@jsonjoy.com/util@^1.3.0": + version "1.6.0" + resolved "https://registry.npmjs.org/@jsonjoy.com/util/-/util-1.6.0.tgz" + integrity sha512-sw/RMbehRhN68WRtcKCpQOPfnH6lLP4GJfqzi3iYej8tnzpZUDr6UkZYJjcjjC0FWEJOJbyM3PTIwxucUmDG2A== + +"@leichtgewicht/ip-codec@^2.0.1": + version "2.0.3" + resolved "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.3.tgz" + integrity sha512-nkalE/f1RvRGChwBnEIoBfSEYOXnCRdleKuv6+lePbMDrMZXeDQnqak5XDOeBgrPPyPfAdcCu/B5z+v3VhplGg== + +"@nicolo-ribaudo/chokidar-2@2.1.8-no-fsevents.3": + version "2.1.8-no-fsevents.3" + resolved "https://registry.npmjs.org/@nicolo-ribaudo/chokidar-2/-/chokidar-2-2.1.8-no-fsevents.3.tgz" + integrity sha512-s88O1aVtXftvp5bCPB7WnmXc5IwOZZ7YPuwNPt+GtOOXpPvad1LfbmjYv+qII7zP6RU2QGnqve27dnLycEnyEQ== + +"@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1": + version "5.1.1-v1" + resolved "https://registry.npmjs.org/@nicolo-ribaudo/eslint-scope-5-internals/-/eslint-scope-5-internals-5.1.1-v1.tgz" + integrity sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg== + dependencies: + eslint-scope "5.1.1" + +"@puppeteer/browsers@2.10.5": + version "2.10.5" + resolved "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-2.10.5.tgz" + integrity sha512-eifa0o+i8dERnngJwKrfp3dEq7ia5XFyoqB17S4gK8GhsQE4/P8nxOfQSE0zQHxzzLo/cmF+7+ywEQ7wK7Fb+w== + dependencies: + debug "^4.4.1" + extract-zip "^2.0.1" + progress "^2.0.3" + proxy-agent "^6.5.0" + semver "^7.7.2" + tar-fs "^3.0.8" + yargs "^17.7.2" + +"@socket.io/component-emitter@~3.1.0": + version "3.1.2" + resolved "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz" + integrity sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA== + +"@tootallnate/quickjs-emscripten@^0.23.0": + version "0.23.0" + resolved "https://registry.npmjs.org/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz" + integrity sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA== + +"@types/body-parser@*": + version "1.19.2" + resolved "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz" + integrity sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g== + dependencies: + "@types/connect" "*" + "@types/node" "*" + +"@types/bonjour@^3.5.13": + version "3.5.13" + resolved "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.13.tgz" + integrity sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ== + dependencies: + "@types/node" "*" + +"@types/connect-history-api-fallback@^1.5.4": + version "1.5.4" + resolved "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.4.tgz" + integrity sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw== + dependencies: + "@types/express-serve-static-core" "*" + "@types/node" "*" + +"@types/connect@*": + version "3.4.35" + resolved "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz" + integrity sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ== + dependencies: + "@types/node" "*" + +"@types/cors@^2.8.12": + version "2.8.12" + resolved "https://registry.npmjs.org/@types/cors/-/cors-2.8.12.tgz" + integrity sha512-vt+kDhq/M2ayberEtJcIN/hxXy1Pk+59g2FV/ZQceeaTyCtCucjL2Q7FXlFjtWn4n15KCr1NE2lNNFhp0lEThw== + +"@types/eslint-scope@^3.7.7": + version "3.7.7" + resolved "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz" + integrity sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg== + dependencies: + "@types/eslint" "*" + "@types/estree" "*" + +"@types/eslint@*": + version "8.4.1" + resolved "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.1.tgz" + integrity sha512-GE44+DNEyxxh2Kc6ro/VkIj+9ma0pO0bwv9+uHSyBrikYOHr8zYcdPvnBOp1aw8s+CjRvuSx7CyWqRrNFQ59mA== + dependencies: + "@types/estree" "*" + "@types/json-schema" "*" + +"@types/estree@*", "@types/estree@^1.0.6": + version "1.0.8" + resolved "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz" + integrity sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w== + +"@types/express-serve-static-core@*", "@types/express-serve-static-core@^4.17.21", "@types/express-serve-static-core@^4.17.33": + version "4.19.6" + resolved "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.6.tgz" + integrity sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A== + dependencies: + "@types/node" "*" + "@types/qs" "*" + "@types/range-parser" "*" + "@types/send" "*" + +"@types/express@*", "@types/express@^4.17.21": + version "4.17.23" + resolved "https://registry.npmjs.org/@types/express/-/express-4.17.23.tgz" + integrity sha512-Crp6WY9aTYP3qPi2wGDo9iUe/rceX01UMhnF1jmwDcKCFM6cx7YhGP/Mpr3y9AASpfHixIG0E6azCcL5OcDHsQ== + dependencies: + "@types/body-parser" "*" + "@types/express-serve-static-core" "^4.17.33" + "@types/qs" "*" + "@types/serve-static" "*" + +"@types/http-errors@*": + version "2.0.2" + resolved "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.2.tgz" + integrity sha512-lPG6KlZs88gef6aD85z3HNkztpj7w2R7HmR3gygjfXCQmsLloWNARFkMuzKiiY8FGdh1XDpgBdrSf4aKDiA7Kg== + +"@types/http-proxy@^1.17.8": + version "1.17.8" + resolved "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.8.tgz" + integrity sha512-5kPLG5BKpWYkw/LVOGWpiq3nEVqxiN32rTgI53Sk12/xHFQ2rG3ehI9IO+O3W2QoKeyB92dJkoka8SUm6BX1pA== + dependencies: + "@types/node" "*" + +"@types/json-schema@*", "@types/json-schema@^7.0.15", "@types/json-schema@^7.0.9": + version "7.0.15" + resolved "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz" + integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== + +"@types/mime@^1": + version "1.3.5" + resolved "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz" + integrity sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w== + +"@types/node-forge@^1.3.0": + version "1.3.11" + resolved "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.11.tgz" + integrity sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ== + dependencies: + "@types/node" "*" + +"@types/node@*", "@types/node@>=10.0.0", "@types/node@^24.0.4": + version "24.0.4" + resolved "https://registry.npmjs.org/@types/node/-/node-24.0.4.tgz" + integrity sha512-ulyqAkrhnuNq9pB76DRBTkcS6YsmDALy6Ua63V8OhrOBgbcYt6IOdzpw5P1+dyRIyMerzLkeYWBeOXPpA9GMAA== + dependencies: + undici-types "~7.8.0" + +"@types/prop-types@*": + version "15.7.15" + resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.15.tgz#e6e5a86d602beaca71ce5163fadf5f95d70931c7" + integrity sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw== + +"@types/qs@*": + version "6.9.7" + resolved "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz" + integrity sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw== + +"@types/range-parser@*": + version "1.2.4" + resolved "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz" + integrity sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw== + +"@types/react-dom@^18.2.8": + version "18.3.7" + resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.3.7.tgz#b89ddf2cd83b4feafcc4e2ea41afdfb95a0d194f" + integrity sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ== + +"@types/react@^18.2.23": + version "18.3.23" + resolved "https://registry.yarnpkg.com/@types/react/-/react-18.3.23.tgz#86ae6f6b95a48c418fecdaccc8069e0fbb63696a" + integrity sha512-/LDXMQh55EzZQ0uVAZmKKhfENivEvWz6E+EYzh+/MCjMhNsotd+ZHhBGIjFDTi6+fz0OhQQQLbTgdQIxxCsC0w== + dependencies: + "@types/prop-types" "*" + csstype "^3.0.2" + +"@types/retry@0.12.2": + version "0.12.2" + resolved "https://registry.npmjs.org/@types/retry/-/retry-0.12.2.tgz" + integrity sha512-XISRgDJ2Tc5q4TRqvgJtzsRkFYNJzZrhTdtMoGVBttwzzQJkPnS3WWTFc7kuDRoPtPakl+T+OfdEUjYJj7Jbow== + +"@types/send@*": + version "0.17.5" + resolved "https://registry.npmjs.org/@types/send/-/send-0.17.5.tgz" + integrity sha512-z6F2D3cOStZvuk2SaP6YrwkNO65iTZcwA2ZkSABegdkAh/lf+Aa/YQndZVfmEXT5vgAp6zv06VQ3ejSVjAny4w== + dependencies: + "@types/mime" "^1" + "@types/node" "*" + +"@types/serve-index@^1.9.4": + version "1.9.4" + resolved "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.4.tgz" + integrity sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug== + dependencies: + "@types/express" "*" + +"@types/serve-static@*", "@types/serve-static@^1.15.5": + version "1.15.8" + resolved "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.8.tgz" + integrity sha512-roei0UY3LhpOJvjbIP6ZZFngyLKl5dskOtDhxY5THRSpO+ZI+nzJ+m5yUMzGrp89YRa7lvknKkMYjqQFGwA7Sg== + dependencies: + "@types/http-errors" "*" + "@types/node" "*" + "@types/send" "*" + +"@types/sockjs@^0.3.36": + version "0.3.36" + resolved "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.36.tgz" + integrity sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q== + dependencies: + "@types/node" "*" + +"@types/ws@^8.5.10": + version "8.18.1" + resolved "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz" + integrity sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg== + dependencies: + "@types/node" "*" + +"@types/yauzl@^2.9.1": + version "2.10.0" + resolved "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.0.tgz" + integrity sha512-Cn6WYCm0tXv8p6k+A8PvbDG763EDpBoTzHdA+Q/MF6H3sapGjCm9NzoaJncJS9tUKSuCoDs9XHxYYsQDgxR6kw== + dependencies: + "@types/node" "*" + +"@webassemblyjs/ast@1.14.1", "@webassemblyjs/ast@^1.14.1": + version "1.14.1" + resolved "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz" + integrity sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ== + dependencies: + "@webassemblyjs/helper-numbers" "1.13.2" + "@webassemblyjs/helper-wasm-bytecode" "1.13.2" + +"@webassemblyjs/floating-point-hex-parser@1.13.2": + version "1.13.2" + resolved "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz" + integrity sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA== + +"@webassemblyjs/helper-api-error@1.13.2": + version "1.13.2" + resolved "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz" + integrity sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ== + +"@webassemblyjs/helper-buffer@1.14.1": + version "1.14.1" + resolved "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz" + integrity sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA== + +"@webassemblyjs/helper-numbers@1.13.2": + version "1.13.2" + resolved "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz" + integrity sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA== + dependencies: + "@webassemblyjs/floating-point-hex-parser" "1.13.2" + "@webassemblyjs/helper-api-error" "1.13.2" + "@xtuc/long" "4.2.2" + +"@webassemblyjs/helper-wasm-bytecode@1.13.2": + version "1.13.2" + resolved "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz" + integrity sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA== + +"@webassemblyjs/helper-wasm-section@1.14.1": + version "1.14.1" + resolved "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz" + integrity sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw== + dependencies: + "@webassemblyjs/ast" "1.14.1" + "@webassemblyjs/helper-buffer" "1.14.1" + "@webassemblyjs/helper-wasm-bytecode" "1.13.2" + "@webassemblyjs/wasm-gen" "1.14.1" + +"@webassemblyjs/ieee754@1.13.2": + version "1.13.2" + resolved "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz" + integrity sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw== + dependencies: + "@xtuc/ieee754" "^1.2.0" + +"@webassemblyjs/leb128@1.13.2": + version "1.13.2" + resolved "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz" + integrity sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw== + dependencies: + "@xtuc/long" "4.2.2" + +"@webassemblyjs/utf8@1.13.2": + version "1.13.2" + resolved "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz" + integrity sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ== + +"@webassemblyjs/wasm-edit@^1.14.1": + version "1.14.1" + resolved "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz" + integrity sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ== + dependencies: + "@webassemblyjs/ast" "1.14.1" + "@webassemblyjs/helper-buffer" "1.14.1" + "@webassemblyjs/helper-wasm-bytecode" "1.13.2" + "@webassemblyjs/helper-wasm-section" "1.14.1" + "@webassemblyjs/wasm-gen" "1.14.1" + "@webassemblyjs/wasm-opt" "1.14.1" + "@webassemblyjs/wasm-parser" "1.14.1" + "@webassemblyjs/wast-printer" "1.14.1" + +"@webassemblyjs/wasm-gen@1.14.1": + version "1.14.1" + resolved "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz" + integrity sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg== + dependencies: + "@webassemblyjs/ast" "1.14.1" + "@webassemblyjs/helper-wasm-bytecode" "1.13.2" + "@webassemblyjs/ieee754" "1.13.2" + "@webassemblyjs/leb128" "1.13.2" + "@webassemblyjs/utf8" "1.13.2" + +"@webassemblyjs/wasm-opt@1.14.1": + version "1.14.1" + resolved "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz" + integrity sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw== + dependencies: + "@webassemblyjs/ast" "1.14.1" + "@webassemblyjs/helper-buffer" "1.14.1" + "@webassemblyjs/wasm-gen" "1.14.1" + "@webassemblyjs/wasm-parser" "1.14.1" + +"@webassemblyjs/wasm-parser@1.14.1", "@webassemblyjs/wasm-parser@^1.14.1": + version "1.14.1" + resolved "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz" + integrity sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ== + dependencies: + "@webassemblyjs/ast" "1.14.1" + "@webassemblyjs/helper-api-error" "1.13.2" + "@webassemblyjs/helper-wasm-bytecode" "1.13.2" + "@webassemblyjs/ieee754" "1.13.2" + "@webassemblyjs/leb128" "1.13.2" + "@webassemblyjs/utf8" "1.13.2" + +"@webassemblyjs/wast-printer@1.14.1": + version "1.14.1" + resolved "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz" + integrity sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw== + dependencies: + "@webassemblyjs/ast" "1.14.1" + "@xtuc/long" "4.2.2" + +"@webpack-cli/configtest@^3.0.1": + version "3.0.1" + resolved "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-3.0.1.tgz" + integrity sha512-u8d0pJ5YFgneF/GuvEiDA61Tf1VDomHHYMjv/wc9XzYj7nopltpG96nXN5dJRstxZhcNpV1g+nT6CydO7pHbjA== + +"@webpack-cli/info@^3.0.1": + version "3.0.1" + resolved "https://registry.npmjs.org/@webpack-cli/info/-/info-3.0.1.tgz" + integrity sha512-coEmDzc2u/ffMvuW9aCjoRzNSPDl/XLuhPdlFRpT9tZHmJ/039az33CE7uH+8s0uL1j5ZNtfdv0HkfaKRBGJsQ== + +"@webpack-cli/serve@^3.0.1": + version "3.0.1" + resolved "https://registry.npmjs.org/@webpack-cli/serve/-/serve-3.0.1.tgz" + integrity sha512-sbgw03xQaCLiT6gcY/6u3qBDn01CWw/nbaXl3gTdTFuJJ75Gffv3E3DBpgvY2fkkrdS1fpjaXNOmJlnbtKauKg== + +"@xtuc/ieee754@^1.2.0": + version "1.2.0" + resolved "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz" + integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA== + +"@xtuc/long@4.2.2": + version "4.2.2" + resolved "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz" + integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== + +accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.8: + version "1.3.8" + resolved "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz" + integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== + dependencies: + mime-types "~2.1.34" + negotiator "0.6.3" + +acorn-jsx@^5.3.2: + version "5.3.2" + resolved "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz" + integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== + +acorn@^8.14.0, acorn@^8.15.0: + version "8.15.0" + resolved "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz" + integrity sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg== + +agent-base@^7.1.0, agent-base@^7.1.2: + version "7.1.3" + resolved "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz" + integrity sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw== + +ajv-formats@^2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz" + integrity sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA== + dependencies: + ajv "^8.0.0" + +ajv-keywords@^5.1.0: + version "5.1.0" + resolved "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz" + integrity sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw== + dependencies: + fast-deep-equal "^3.1.3" + +ajv@^6.12.3, ajv@^6.12.4: + version "6.12.6" + resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +ajv@^8.0.0, ajv@^8.9.0: + version "8.17.1" + resolved "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz" + integrity sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g== + dependencies: + fast-deep-equal "^3.1.3" + fast-uri "^3.0.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + +ansi-html-community@^0.0.8: + version "0.0.8" + resolved "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz" + integrity sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw== + +ansi-regex@^0.2.0, ansi-regex@^0.2.1: + version "0.2.1" + resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-0.2.1.tgz" + integrity sha1-DY6UaWej2BQ/k+JOKYUl/BsiNfk= + +ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== + +ansi-styles@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.1.0.tgz" + integrity sha1-6uy/Zs1waIJ2Cy9GkVgrj1XXp94= + +ansi-styles@^4.0.0, ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +anymatch@~3.1.2: + version "3.1.2" + resolved "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz" + integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== + +array-buffer-byte-length@^1.0.1, array-buffer-byte-length@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz" + integrity sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw== + dependencies: + call-bound "^1.0.3" + is-array-buffer "^3.0.5" + +array-flatten@1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz" + integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI= + +array-includes@^3.1.4, array-includes@^3.1.8: + version "3.1.9" + resolved "https://registry.npmjs.org/array-includes/-/array-includes-3.1.9.tgz" + integrity sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ== + dependencies: + call-bind "^1.0.8" + call-bound "^1.0.4" + define-properties "^1.2.1" + es-abstract "^1.24.0" + es-object-atoms "^1.1.1" + get-intrinsic "^1.3.0" + is-string "^1.1.1" + math-intrinsics "^1.1.0" + +array.prototype.findlast@^1.2.5: + version "1.2.5" + resolved "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz" + integrity sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + es-errors "^1.3.0" + es-object-atoms "^1.0.0" + es-shim-unscopables "^1.0.2" + +array.prototype.flatmap@^1.3.3: + version "1.3.3" + resolved "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz" + integrity sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg== + dependencies: + call-bind "^1.0.8" + define-properties "^1.2.1" + es-abstract "^1.23.5" + es-shim-unscopables "^1.0.2" + +array.prototype.tosorted@^1.1.4: + version "1.1.4" + resolved "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz" + integrity sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.3" + es-errors "^1.3.0" + es-shim-unscopables "^1.0.2" + +arraybuffer.prototype.slice@^1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz" + integrity sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ== + dependencies: + array-buffer-byte-length "^1.0.1" + call-bind "^1.0.8" + define-properties "^1.2.1" + es-abstract "^1.23.5" + es-errors "^1.3.0" + get-intrinsic "^1.2.6" + is-array-buffer "^3.0.4" + +asn1@~0.2.3: + version "0.2.6" + resolved "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz" + integrity sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ== + dependencies: + safer-buffer "~2.1.0" + +assert-plus@1.0.0, assert-plus@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz" + integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU= + +assert@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/assert/-/assert-2.1.0.tgz" + integrity sha512-eLHpSK/Y4nhMJ07gDaAzoX/XAKS8PSaojml3M0DM4JpV1LAi5JOJ/p6H/XWrl8L+DzVEvVCW1z3vWAaB9oTsQw== + dependencies: + call-bind "^1.0.2" + is-nan "^1.3.2" + object-is "^1.1.5" + object.assign "^4.1.4" + util "^0.12.5" + +ast-types@^0.13.4: + version "0.13.4" + resolved "https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz" + integrity sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w== + dependencies: + tslib "^2.0.1" + +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz" + integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= + +available-typed-arrays@^1.0.7: + version "1.0.7" + resolved "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz" + integrity sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ== + dependencies: + possible-typed-array-names "^1.0.0" + +aws-sign2@~0.7.0: + version "0.7.0" + resolved "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz" + integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg= + +aws4@^1.8.0: + version "1.11.0" + resolved "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz" + integrity sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA== + +b4a@^1.6.4: + version "1.6.4" + resolved "https://registry.npmjs.org/b4a/-/b4a-1.6.4.tgz" + integrity sha512-fpWrvyVHEKyeEvbKZTVOeZF3VSKKWtJxFIxX/jaVPf+cLbGUSitjb49pHLqPV2BUNNZ0LcoeEGfE/YCpyDYHIw== + +babel-loader@^10.0.0: + version "10.0.0" + resolved "https://registry.npmjs.org/babel-loader/-/babel-loader-10.0.0.tgz" + integrity sha512-z8jt+EdS61AMw22nSfoNJAZ0vrtmhPRVi6ghL3rCeRZI8cdNYFiV5xeV3HbE7rlZZNmGH8BVccwWt8/ED0QOHA== + dependencies: + find-up "^5.0.0" + +babel-plugin-polyfill-corejs2@^0.4.10: + version "0.4.13" + resolved "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.13.tgz" + integrity sha512-3sX/eOms8kd3q2KZ6DAhKPc0dgm525Gqq5NtWKZ7QYYZEv57OQ54KtblzJzH1lQF/eQxO8KjWGIK9IPUJNus5g== + dependencies: + "@babel/compat-data" "^7.22.6" + "@babel/helper-define-polyfill-provider" "^0.6.4" + semver "^6.3.1" + +babel-plugin-polyfill-corejs3@^0.11.0: + version "0.11.1" + resolved "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.11.1.tgz" + integrity sha512-yGCqvBT4rwMczo28xkH/noxJ6MZ4nJfkVYdoDaC/utLtWrXxv27HVrzAeSbqR8SxDsp46n0YF47EbHoixy6rXQ== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.6.3" + core-js-compat "^3.40.0" + +babel-plugin-polyfill-regenerator@^0.6.1: + version "0.6.4" + resolved "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.4.tgz" + integrity sha512-7gD3pRadPrbjhjLyxebmx/WrFYcuSjZ0XbdUujQMZ/fcE9oeewk2U/7PCvez84UeuK3oSjmPZ0Ch0dlupQvGzw== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.6.4" + +babel-plugin-transform-inline-environment-variables@^0.4.4: + version "0.4.4" + resolved "https://registry.npmjs.org/babel-plugin-transform-inline-environment-variables/-/babel-plugin-transform-inline-environment-variables-0.4.4.tgz" + integrity sha512-bJILBtn5a11SmtR2j/3mBOjX4K3weC6cq+NNZ7hG22wCAqpc3qtj/iN7dSe9HDiS46lgp1nHsQgeYrea/RUe+g== + +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +bare-events@^2.2.0, bare-events@^2.5.4: + version "2.5.4" + resolved "https://registry.npmjs.org/bare-events/-/bare-events-2.5.4.tgz" + integrity sha512-+gFfDkR8pj4/TrWCGUGWmJIkBwuxPS5F+a5yWjOHQt2hHvNZd5YLzadjmDUtFmMM4y429bnKLa8bYBMHcYdnQA== + +bare-fs@^4.0.1: + version "4.1.5" + resolved "https://registry.npmjs.org/bare-fs/-/bare-fs-4.1.5.tgz" + integrity sha512-1zccWBMypln0jEE05LzZt+V/8y8AQsQQqxtklqaIyg5nu6OAYFhZxPXinJTSG+kU5qyNmeLgcn9AW7eHiCHVLA== + dependencies: + bare-events "^2.5.4" + bare-path "^3.0.0" + bare-stream "^2.6.4" + +bare-os@^3.0.1: + version "3.6.1" + resolved "https://registry.npmjs.org/bare-os/-/bare-os-3.6.1.tgz" + integrity sha512-uaIjxokhFidJP+bmmvKSgiMzj2sV5GPHaZVAIktcxcpCyBFFWO+YlikVAdhmUo2vYFvFhOXIAlldqV29L8126g== + +bare-path@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/bare-path/-/bare-path-3.0.0.tgz" + integrity sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw== + dependencies: + bare-os "^3.0.1" + +bare-stream@^2.6.4: + version "2.6.5" + resolved "https://registry.npmjs.org/bare-stream/-/bare-stream-2.6.5.tgz" + integrity sha512-jSmxKJNJmHySi6hC42zlZnq00rga4jjxcgNZjY9N5WlOe/iOoGRtdwGsHzQv2RlH2KOYMwGUXhf2zXd32BA9RA== + dependencies: + streamx "^2.21.0" + +base64id@2.0.0, base64id@~2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz" + integrity sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog== + +basic-ftp@^5.0.2: + version "5.0.3" + resolved "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.0.3.tgz" + integrity sha512-QHX8HLlncOLpy54mh+k/sWIFd0ThmRqwe9ZjELybGZK+tZ8rUb9VO0saKJUROTbE+KhzDUT7xziGpGrW8Kmd+g== + +batch@0.6.1: + version "0.6.1" + resolved "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz" + integrity sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY= + +bcrypt-pbkdf@^1.0.0: + version "1.0.2" + resolved "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz" + integrity sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4= + dependencies: + tweetnacl "^0.14.3" + +binary-extensions@^2.0.0: + version "2.2.0" + resolved "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz" + integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== + +body-parser@1.20.3, body-parser@^1.19.0: + version "1.20.3" + resolved "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz" + integrity sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g== + dependencies: + bytes "3.1.2" + content-type "~1.0.5" + debug "2.6.9" + depd "2.0.0" + destroy "1.2.0" + http-errors "2.0.0" + iconv-lite "0.4.24" + on-finished "2.4.1" + qs "6.13.0" + raw-body "2.5.2" + type-is "~1.6.18" + unpipe "1.0.0" + +bonjour-service@^1.2.1: + version "1.3.0" + resolved "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.3.0.tgz" + integrity sha512-3YuAUiSkWykd+2Azjgyxei8OWf8thdn8AITIog2M4UICzoqfjlqr64WIjEXZllf/W6vK1goqleSR6brGomxQqA== + dependencies: + fast-deep-equal "^3.1.3" + multicast-dns "^7.2.5" + +brace-expansion@^1.1.7: + version "1.1.12" + resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz" + integrity sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +brace-expansion@^2.0.1: + version "2.0.2" + resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz" + integrity sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ== + dependencies: + balanced-match "^1.0.0" + +braces@^3.0.2, braces@^3.0.3, braces@~3.0.2: + version "3.0.3" + resolved "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz" + integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== + dependencies: + fill-range "^7.1.1" + +browserslist@^4.24.0, browserslist@^4.25.0: + version "4.25.1" + resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.25.1.tgz" + integrity sha512-KGj0KoOMXLpSNkkEI6Z6mShmQy0bc1I+T7K9N81k4WWMrfz+6fQ6es80B/YLAeRoKvjYE1YSHHOW1qe9xIVzHw== + dependencies: + caniuse-lite "^1.0.30001726" + electron-to-chromium "^1.5.173" + node-releases "^2.0.19" + update-browserslist-db "^1.1.3" + +buffer-crc32@~0.2.3: + version "0.2.13" + resolved "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz" + integrity sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI= + +buffer-from@^1.0.0: + version "1.1.2" + resolved "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz" + integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== + +bundle-name@^4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.0.tgz" + integrity sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q== + dependencies: + run-applescript "^7.0.0" + +bytes@3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz" + integrity sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg= + +bytes@3.1.2: + version "3.1.2" + resolved "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz" + integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== + +call-bind-apply-helpers@^1.0.0, call-bind-apply-helpers@^1.0.1, call-bind-apply-helpers@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz" + integrity sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ== + dependencies: + es-errors "^1.3.0" + function-bind "^1.1.2" + +call-bind@^1.0.0, call-bind@^1.0.2, call-bind@^1.0.7, call-bind@^1.0.8: + version "1.0.8" + resolved "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz" + integrity sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww== + dependencies: + call-bind-apply-helpers "^1.0.0" + es-define-property "^1.0.0" + get-intrinsic "^1.2.4" + set-function-length "^1.2.2" + +call-bound@^1.0.2, call-bound@^1.0.3, call-bound@^1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz" + integrity sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg== + dependencies: + call-bind-apply-helpers "^1.0.2" + get-intrinsic "^1.3.0" + +callsites@^3.0.0: + version "3.1.0" + resolved "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz" + integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== + +caniuse-lite@^1.0.30001726: + version "1.0.30001726" + resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001726.tgz" + integrity sha512-VQAUIUzBiZ/UnlM28fSp2CRF3ivUn1BWEvxMcVTNwpw91Py1pGbPIyIKtd+tzct9C3ouceCVdGAXxZOpZAsgdw== + +caseless@~0.12.0: + version "0.12.0" + resolved "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz" + integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= + +chalk@^0.5.1: + version "0.5.1" + resolved "https://registry.npmjs.org/chalk/-/chalk-0.5.1.tgz" + integrity sha1-Zjs6ZItotV0EaQ1JFnqoN4WPIXQ= + dependencies: + ansi-styles "^1.1.0" + escape-string-regexp "^1.0.0" + has-ansi "^0.1.0" + strip-ansi "^0.3.0" + supports-color "^0.2.0" + +chalk@^4.0.0: + version "4.1.2" + resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +chokidar@^3.5.1, chokidar@^3.6.0: + version "3.6.0" + resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz" + integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw== + dependencies: + anymatch "~3.1.2" + braces "~3.0.2" + glob-parent "~5.1.2" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.6.0" + optionalDependencies: + fsevents "~2.3.2" + +chrome-trace-event@^1.0.2: + version "1.0.3" + resolved "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz" + integrity sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg== + +chromium-bidi@5.1.0: + version "5.1.0" + resolved "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-5.1.0.tgz" + integrity sha512-9MSRhWRVoRPDG0TgzkHrshFSJJNZzfY5UFqUMuksg7zL1yoZIZ3jLB0YAgHclbiAxPI86pBnwDX1tbzoiV8aFw== + dependencies: + mitt "^3.0.1" + zod "^3.24.1" + +cliui@^7.0.2: + version "7.0.4" + resolved "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz" + integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.0" + wrap-ansi "^7.0.0" + +cliui@^8.0.1: + version "8.0.1" + resolved "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz" + integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.1" + wrap-ansi "^7.0.0" + +clone-deep@^4.0.1: + version "4.0.1" + resolved "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz" + integrity sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ== + dependencies: + is-plain-object "^2.0.4" + kind-of "^6.0.2" + shallow-clone "^3.0.0" + +clsx@^2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz" + integrity sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA== + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +colorette@^2.0.10, colorette@^2.0.14: + version "2.0.16" + resolved "https://registry.npmjs.org/colorette/-/colorette-2.0.16.tgz" + integrity sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g== + +combined-stream@^1.0.6, combined-stream@~1.0.6: + version "1.0.8" + resolved "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz" + integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== + dependencies: + delayed-stream "~1.0.0" + +commander@^12.1.0: + version "12.1.0" + resolved "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz" + integrity sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA== + +commander@^2.20.0, commander@^2.3.0: + version "2.20.3" + resolved "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz" + integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== + +commander@^6.2.0: + version "6.2.1" + resolved "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz" + integrity sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA== + +compressible@~2.0.16: + version "2.0.18" + resolved "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz" + integrity sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg== + dependencies: + mime-db ">= 1.43.0 < 2" + +compression@^1.7.4: + version "1.7.4" + resolved "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz" + integrity sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ== + dependencies: + accepts "~1.3.5" + bytes "3.0.0" + compressible "~2.0.16" + debug "2.6.9" + on-headers "~1.0.2" + safe-buffer "5.1.2" + vary "~1.1.2" + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" + integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= + +concat-stream@^1.4.7, concat-stream@^1.6.2: + version "1.6.2" + resolved "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz" + integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== + dependencies: + buffer-from "^1.0.0" + inherits "^2.0.3" + readable-stream "^2.2.2" + typedarray "^0.0.6" + +connect-history-api-fallback@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz" + integrity sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA== + +connect@^3.7.0: + version "3.7.0" + resolved "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz" + integrity sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ== + dependencies: + debug "2.6.9" + finalhandler "1.1.2" + parseurl "~1.3.3" + utils-merge "1.0.1" + +content-disposition@0.5.4: + version "0.5.4" + resolved "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz" + integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ== + dependencies: + safe-buffer "5.2.1" + +content-type@~1.0.4, content-type@~1.0.5: + version "1.0.5" + resolved "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz" + integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA== + +convert-source-map@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz" + integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== + +cookie-signature@1.0.6: + version "1.0.6" + resolved "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz" + integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw= + +cookie@0.7.1: + version "0.7.1" + resolved "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz" + integrity sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w== + +cookie@~0.7.2: + version "0.7.2" + resolved "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz" + integrity sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w== + +core-js-compat@^3.40.0: + version "3.43.0" + resolved "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.43.0.tgz" + integrity sha512-2GML2ZsCc5LR7hZYz4AXmjQw8zuy2T//2QntwdnpuYI7jteT6GVYJL7F6C2C57R7gSYrcqVW3lAALefdbhBLDA== + dependencies: + browserslist "^4.25.0" + +core-util-is@1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz" + integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= + +core-util-is@~1.0.0: + version "1.0.3" + resolved "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz" + integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== + +cors@~2.8.5: + version "2.8.5" + resolved "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz" + integrity sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g== + dependencies: + object-assign "^4" + vary "^1" + +cosmiconfig@^9.0.0: + version "9.0.0" + resolved "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz" + integrity sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg== + dependencies: + env-paths "^2.2.1" + import-fresh "^3.3.0" + js-yaml "^4.1.0" + parse-json "^5.2.0" + +cross-spawn@^5.0.1: + version "5.1.0" + resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz" + integrity sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A== + dependencies: + lru-cache "^4.0.1" + shebang-command "^1.2.0" + which "^1.2.9" + +cross-spawn@^7.0.3, cross-spawn@^7.0.6: + version "7.0.6" + resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz" + integrity sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +csstype@^3.0.2: + version "3.0.11" + resolved "https://registry.npmjs.org/csstype/-/csstype-3.0.11.tgz" + integrity sha512-sa6P2wJ+CAbgyy4KFssIb/JNMLxFvKF1pCYCSXS8ZMuqZnMsrxqI2E5sPyoTpxoPU/gVZMzr2zjOfg8GIZOMsw== + +custom-event@~1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/custom-event/-/custom-event-1.0.1.tgz" + integrity sha1-XQKkaFCt8bSjF5RqOSj8y1v9BCU= + +dashdash@^1.12.0: + version "1.14.1" + resolved "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz" + integrity sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA= + dependencies: + assert-plus "^1.0.0" + +data-uri-to-buffer@^5.0.1: + version "5.0.1" + resolved "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-5.0.1.tgz" + integrity sha512-a9l6T1qqDogvvnw0nKlfZzqsyikEBZBClF39V3TFoKhDtGBqHu2HkuomJc02j5zft8zrUaXEuoicLeW54RkzPg== + +data-view-buffer@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz" + integrity sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ== + dependencies: + call-bound "^1.0.3" + es-errors "^1.3.0" + is-data-view "^1.0.2" + +data-view-byte-length@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz" + integrity sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ== + dependencies: + call-bound "^1.0.3" + es-errors "^1.3.0" + is-data-view "^1.0.2" + +data-view-byte-offset@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz" + integrity sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ== + dependencies: + call-bound "^1.0.2" + es-errors "^1.3.0" + is-data-view "^1.0.1" + +date-format@^4.0.9: + version "4.0.9" + resolved "https://registry.npmjs.org/date-format/-/date-format-4.0.9.tgz" + integrity sha512-+8J+BOUpSrlKLQLeF8xJJVTxS8QfRSuJgwxSVvslzgO3E6khbI0F5mMEPf5mTYhCCm4h99knYP6H3W9n3BQFrg== + +debug@2.6.9, debug@^2.6.9: + version "2.6.9" + resolved "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + +debug@4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4, debug@^4.4.1: + version "4.4.1" + resolved "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz" + integrity sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ== + dependencies: + ms "^2.1.3" + +debug@~4.3.1, debug@~4.3.2, debug@~4.3.4: + version "4.3.7" + resolved "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz" + integrity sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ== + dependencies: + ms "^2.1.3" + +deep-is@^0.1.3: + version "0.1.4" + resolved "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz" + integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== + +default-browser-id@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.0.tgz" + integrity sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA== + +default-browser@^5.2.1: + version "5.2.1" + resolved "https://registry.npmjs.org/default-browser/-/default-browser-5.2.1.tgz" + integrity sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg== + dependencies: + bundle-name "^4.1.0" + default-browser-id "^5.0.0" + +define-data-property@^1.0.1, define-data-property@^1.1.4: + version "1.1.4" + resolved "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz" + integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A== + dependencies: + es-define-property "^1.0.0" + es-errors "^1.3.0" + gopd "^1.0.1" + +define-lazy-prop@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz" + integrity sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg== + +define-properties@^1.1.3, define-properties@^1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz" + integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg== + dependencies: + define-data-property "^1.0.1" + has-property-descriptors "^1.0.0" + object-keys "^1.1.1" + +degenerator@^5.0.0: + version "5.0.1" + resolved "https://registry.npmjs.org/degenerator/-/degenerator-5.0.1.tgz" + integrity sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ== + dependencies: + ast-types "^0.13.4" + escodegen "^2.1.0" + esprima "^4.0.1" + +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz" + integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= + +depd@2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz" + integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== + +depd@~1.1.2: + version "1.1.2" + resolved "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz" + integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= + +destroy@1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz" + integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== + +detect-node@^2.0.4: + version "2.1.0" + resolved "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz" + integrity sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g== + +devtools-protocol@0.0.1452169: + version "0.0.1452169" + resolved "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1452169.tgz" + integrity sha512-FOFDVMGrAUNp0dDKsAU1TorWJUx2JOU1k9xdgBKKJF3IBh/Uhl2yswG5r3TEAOrCiGY2QRp1e6LVDQrCsTKO4g== + +di@^0.0.1: + version "0.0.1" + resolved "https://registry.npmjs.org/di/-/di-0.0.1.tgz" + integrity sha1-gGZJMmzqp8qjMG112YXqJ0i6kTw= + +dns-packet@^5.2.2: + version "5.3.1" + resolved "https://registry.npmjs.org/dns-packet/-/dns-packet-5.3.1.tgz" + integrity sha512-spBwIj0TK0Ey3666GwIdWVfUpLyubpU53BTCu8iPn4r4oXd9O14Hjg3EHw3ts2oed77/SeckunUYCyRlSngqHw== + dependencies: + "@leichtgewicht/ip-codec" "^2.0.1" + +doctrine@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz" + integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== + dependencies: + esutils "^2.0.2" + +dom-serialize@^2.2.1: + version "2.2.1" + resolved "https://registry.npmjs.org/dom-serialize/-/dom-serialize-2.2.1.tgz" + integrity sha1-ViromZ9Evl6jB29UGdzVnrQ6yVs= + dependencies: + custom-event "~1.0.0" + ent "~2.2.0" + extend "^3.0.0" + void-elements "^2.0.0" + +dunder-proto@^1.0.0, dunder-proto@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz" + integrity sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A== + dependencies: + call-bind-apply-helpers "^1.0.1" + es-errors "^1.3.0" + gopd "^1.2.0" + +ecc-jsbn@~0.1.1: + version "0.1.2" + resolved "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz" + integrity sha1-OoOpBOVDUyh4dMVkt1SThoSamMk= + dependencies: + jsbn "~0.1.0" + safer-buffer "^2.1.0" + +ee-first@1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz" + integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= + +electron-to-chromium@^1.5.173: + version "1.5.174" + resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.174.tgz" + integrity sha512-HE43yYdUUiJVjewV2A9EP8o89Kb4AqMKplMQP2IxEPUws1Etu/ZkdsgUDabUZ/WmbP4ZbvJDOcunvbBUPPIfmw== + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +encodeurl@~1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz" + integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= + +encodeurl@~2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz" + integrity sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg== + +end-of-stream@^1.1.0: + version "1.4.4" + resolved "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz" + integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== + dependencies: + once "^1.4.0" + +engine.io-parser@~5.2.1: + version "5.2.3" + resolved "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.3.tgz" + integrity sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q== + +engine.io@~6.6.0: + version "6.6.4" + resolved "https://registry.npmjs.org/engine.io/-/engine.io-6.6.4.tgz" + integrity sha512-ZCkIjSYNDyGn0R6ewHDtXgns/Zre/NT6Agvq1/WobF7JXgFff4SeDroKiCO3fNJreU9YG429Sc81o4w5ok/W5g== + dependencies: + "@types/cors" "^2.8.12" + "@types/node" ">=10.0.0" + accepts "~1.3.4" + base64id "2.0.0" + cookie "~0.7.2" + cors "~2.8.5" + debug "~4.3.1" + engine.io-parser "~5.2.1" + ws "~8.17.1" + +enhanced-resolve@^5.17.1: + version "5.18.2" + resolved "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.2.tgz" + integrity sha512-6Jw4sE1maoRJo3q8MsSIn2onJFbLTOjY9hlx4DZXmOKvLRd1Ok2kXmAGXaafL2+ijsJZ1ClYbl/pmqr9+k4iUQ== + dependencies: + graceful-fs "^4.2.4" + tapable "^2.2.0" + +ent@~2.2.0: + version "2.2.0" + resolved "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz" + integrity sha1-6WQhkyWiHQX0RGai9obtbOX13R0= + +env-paths@^2.2.1: + version "2.2.1" + resolved "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz" + integrity sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A== + +envinfo@^7.14.0: + version "7.14.0" + resolved "https://registry.npmjs.org/envinfo/-/envinfo-7.14.0.tgz" + integrity sha512-CO40UI41xDQzhLB1hWyqUKgFhs250pNcGbyGKe1l/e4FSaI/+YE4IMG76GDt0In67WLPACIITC+sOi08x4wIvg== + +error-ex@^1.3.1: + version "1.3.2" + resolved "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz" + integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== + dependencies: + is-arrayish "^0.2.1" + +es-abstract@^1.17.5, es-abstract@^1.23.2, es-abstract@^1.23.3, es-abstract@^1.23.5, es-abstract@^1.23.6, es-abstract@^1.23.9, es-abstract@^1.24.0: + version "1.24.0" + resolved "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.0.tgz" + integrity sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg== + dependencies: + array-buffer-byte-length "^1.0.2" + arraybuffer.prototype.slice "^1.0.4" + available-typed-arrays "^1.0.7" + call-bind "^1.0.8" + call-bound "^1.0.4" + data-view-buffer "^1.0.2" + data-view-byte-length "^1.0.2" + data-view-byte-offset "^1.0.1" + es-define-property "^1.0.1" + es-errors "^1.3.0" + es-object-atoms "^1.1.1" + es-set-tostringtag "^2.1.0" + es-to-primitive "^1.3.0" + function.prototype.name "^1.1.8" + get-intrinsic "^1.3.0" + get-proto "^1.0.1" + get-symbol-description "^1.1.0" + globalthis "^1.0.4" + gopd "^1.2.0" + has-property-descriptors "^1.0.2" + has-proto "^1.2.0" + has-symbols "^1.1.0" + hasown "^2.0.2" + internal-slot "^1.1.0" + is-array-buffer "^3.0.5" + is-callable "^1.2.7" + is-data-view "^1.0.2" + is-negative-zero "^2.0.3" + is-regex "^1.2.1" + is-set "^2.0.3" + is-shared-array-buffer "^1.0.4" + is-string "^1.1.1" + is-typed-array "^1.1.15" + is-weakref "^1.1.1" + math-intrinsics "^1.1.0" + object-inspect "^1.13.4" + object-keys "^1.1.1" + object.assign "^4.1.7" + own-keys "^1.0.1" + regexp.prototype.flags "^1.5.4" + safe-array-concat "^1.1.3" + safe-push-apply "^1.0.0" + safe-regex-test "^1.1.0" + set-proto "^1.0.0" + stop-iteration-iterator "^1.1.0" + string.prototype.trim "^1.2.10" + string.prototype.trimend "^1.0.9" + string.prototype.trimstart "^1.0.8" + typed-array-buffer "^1.0.3" + typed-array-byte-length "^1.0.3" + typed-array-byte-offset "^1.0.4" + typed-array-length "^1.0.7" + unbox-primitive "^1.1.0" + which-typed-array "^1.1.19" + +es-define-property@^1.0.0, es-define-property@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz" + integrity sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g== + +es-errors@^1.3.0: + version "1.3.0" + resolved "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz" + integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== + +es-iterator-helpers@^1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.2.1.tgz" + integrity sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w== + dependencies: + call-bind "^1.0.8" + call-bound "^1.0.3" + define-properties "^1.2.1" + es-abstract "^1.23.6" + es-errors "^1.3.0" + es-set-tostringtag "^2.0.3" + function-bind "^1.1.2" + get-intrinsic "^1.2.6" + globalthis "^1.0.4" + gopd "^1.2.0" + has-property-descriptors "^1.0.2" + has-proto "^1.2.0" + has-symbols "^1.1.0" + internal-slot "^1.1.0" + iterator.prototype "^1.1.4" + safe-array-concat "^1.1.3" + +es-module-lexer@^1.2.1: + version "1.3.1" + resolved "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.3.1.tgz" + integrity sha512-JUFAyicQV9mXc3YRxPnDlrfBKpqt6hUYzz9/boprUJHs4e4KVr3XwOF70doO6gwXUor6EWZJAyWAfKki84t20Q== + +es-object-atoms@^1.0.0, es-object-atoms@^1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz" + integrity sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA== + dependencies: + es-errors "^1.3.0" + +es-set-tostringtag@^2.0.3, es-set-tostringtag@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz" + integrity sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA== + dependencies: + es-errors "^1.3.0" + get-intrinsic "^1.2.6" + has-tostringtag "^1.0.2" + hasown "^2.0.2" + +es-shim-unscopables@^1.0.2: + version "1.1.0" + resolved "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz" + integrity sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw== + dependencies: + hasown "^2.0.2" + +es-to-primitive@^1.3.0: + version "1.3.0" + resolved "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz" + integrity sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g== + dependencies: + is-callable "^1.2.7" + is-date-object "^1.0.5" + is-symbol "^1.0.4" + +es6-promise@^4.0.3: + version "4.2.8" + resolved "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz" + integrity sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w== + +escalade@^3.1.1, escalade@^3.2.0: + version "3.2.0" + resolved "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz" + integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA== + +escape-html@~1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz" + integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= + +escape-string-regexp@^1.0.0: + version "1.0.5" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" + integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= + +escape-string-regexp@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== + +escodegen@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz" + integrity sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w== + dependencies: + esprima "^4.0.1" + estraverse "^5.2.0" + esutils "^2.0.2" + optionalDependencies: + source-map "~0.6.1" + +eslint-plugin-react@^7.37.5: + version "7.37.5" + resolved "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.5.tgz" + integrity sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA== + dependencies: + array-includes "^3.1.8" + array.prototype.findlast "^1.2.5" + array.prototype.flatmap "^1.3.3" + array.prototype.tosorted "^1.1.4" + doctrine "^2.1.0" + es-iterator-helpers "^1.2.1" + estraverse "^5.3.0" + hasown "^2.0.2" + jsx-ast-utils "^2.4.1 || ^3.0.0" + minimatch "^3.1.2" + object.entries "^1.1.9" + object.fromentries "^2.0.8" + object.values "^1.2.1" + prop-types "^15.8.1" + resolve "^2.0.0-next.5" + semver "^6.3.1" + string.prototype.matchall "^4.0.12" + string.prototype.repeat "^1.0.0" + +eslint-scope@5.1.1: + version "5.1.1" + resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz" + integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== + dependencies: + esrecurse "^4.3.0" + estraverse "^4.1.1" + +eslint-scope@^8.4.0: + version "8.4.0" + resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz" + integrity sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg== + dependencies: + esrecurse "^4.3.0" + estraverse "^5.2.0" + +eslint-visitor-keys@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz" + integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== + +eslint-visitor-keys@^3.3.0: + version "3.4.3" + resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz" + integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== + +eslint-visitor-keys@^4.2.1: + version "4.2.1" + resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz" + integrity sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ== + +eslint@^9.29.0: + version "9.29.0" + resolved "https://registry.npmjs.org/eslint/-/eslint-9.29.0.tgz" + integrity sha512-GsGizj2Y1rCWDu6XoEekL3RLilp0voSePurjZIkxL3wlm5o5EC9VpgaP7lrCvjnkuLvzFBQWB3vWB3K5KQTveQ== + dependencies: + "@eslint-community/eslint-utils" "^4.2.0" + "@eslint-community/regexpp" "^4.12.1" + "@eslint/config-array" "^0.20.1" + "@eslint/config-helpers" "^0.2.1" + "@eslint/core" "^0.14.0" + "@eslint/eslintrc" "^3.3.1" + "@eslint/js" "9.29.0" + "@eslint/plugin-kit" "^0.3.1" + "@humanfs/node" "^0.16.6" + "@humanwhocodes/module-importer" "^1.0.1" + "@humanwhocodes/retry" "^0.4.2" + "@types/estree" "^1.0.6" + "@types/json-schema" "^7.0.15" + ajv "^6.12.4" + chalk "^4.0.0" + cross-spawn "^7.0.6" + debug "^4.3.2" + escape-string-regexp "^4.0.0" + eslint-scope "^8.4.0" + eslint-visitor-keys "^4.2.1" + espree "^10.4.0" + esquery "^1.5.0" + esutils "^2.0.2" + fast-deep-equal "^3.1.3" + file-entry-cache "^8.0.0" + find-up "^5.0.0" + glob-parent "^6.0.2" + ignore "^5.2.0" + imurmurhash "^0.1.4" + is-glob "^4.0.0" + json-stable-stringify-without-jsonify "^1.0.1" + lodash.merge "^4.6.2" + minimatch "^3.1.2" + natural-compare "^1.4.0" + optionator "^0.9.3" + +espree@^10.0.1, espree@^10.4.0: + version "10.4.0" + resolved "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz" + integrity sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ== + dependencies: + acorn "^8.15.0" + acorn-jsx "^5.3.2" + eslint-visitor-keys "^4.2.1" + +esprima@^4.0.1: + version "4.0.1" + resolved "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz" + integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== + +esquery@^1.5.0: + version "1.6.0" + resolved "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz" + integrity sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg== + dependencies: + estraverse "^5.1.0" + +esrecurse@^4.3.0: + version "4.3.0" + resolved "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz" + integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== + dependencies: + estraverse "^5.2.0" + +estraverse@^4.1.1: + version "4.3.0" + resolved "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz" + integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== + +estraverse@^5.1.0, estraverse@^5.2.0, estraverse@^5.3.0: + version "5.3.0" + resolved "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz" + integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== + +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + +etag@~1.8.1: + version "1.8.1" + resolved "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz" + integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= + +eventemitter3@^4.0.0: + version "4.0.7" + resolved "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz" + integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== + +events@^3.2.0: + version "3.3.0" + resolved "https://registry.npmjs.org/events/-/events-3.3.0.tgz" + integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== + +express@^4.21.2: + version "4.21.2" + resolved "https://registry.npmjs.org/express/-/express-4.21.2.tgz" + integrity sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA== + dependencies: + accepts "~1.3.8" + array-flatten "1.1.1" + body-parser "1.20.3" + content-disposition "0.5.4" + content-type "~1.0.4" + cookie "0.7.1" + cookie-signature "1.0.6" + debug "2.6.9" + depd "2.0.0" + encodeurl "~2.0.0" + escape-html "~1.0.3" + etag "~1.8.1" + finalhandler "1.3.1" + fresh "0.5.2" + http-errors "2.0.0" + merge-descriptors "1.0.3" + methods "~1.1.2" + on-finished "2.4.1" + parseurl "~1.3.3" + path-to-regexp "0.1.12" + proxy-addr "~2.0.7" + qs "6.13.0" + range-parser "~1.2.1" + safe-buffer "5.2.1" + send "0.19.0" + serve-static "1.16.2" + setprototypeof "1.2.0" + statuses "2.0.1" + type-is "~1.6.18" + utils-merge "1.0.1" + vary "~1.1.2" + +extend@^3.0.0, extend@~3.0.2: + version "3.0.2" + resolved "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz" + integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== + +extract-zip@^1.6.5: + version "1.7.0" + resolved "https://registry.npmjs.org/extract-zip/-/extract-zip-1.7.0.tgz" + integrity sha512-xoh5G1W/PB0/27lXgMQyIhP5DSY/LhoCsOyZgb+6iMmRtCwVBo55uKaMoEYrDCKQhWvqEip5ZPKAc6eFNyf/MA== + dependencies: + concat-stream "^1.6.2" + debug "^2.6.9" + mkdirp "^0.5.4" + yauzl "^2.10.0" + +extract-zip@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz" + integrity sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg== + dependencies: + debug "^4.1.1" + get-stream "^5.1.0" + yauzl "^2.10.0" + optionalDependencies: + "@types/yauzl" "^2.9.1" + +extsprintf@1.3.0: + version "1.3.0" + resolved "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz" + integrity sha1-lpGEQOMEGnpBT4xS48V06zw+HgU= + +extsprintf@^1.2.0: + version "1.4.1" + resolved "https://registry.npmjs.org/extsprintf/-/extsprintf-1.4.1.tgz" + integrity sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA== + +fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: + version "3.1.3" + resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== + +fast-fifo@^1.2.0, fast-fifo@^1.3.2: + version "1.3.2" + resolved "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz" + integrity sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ== + +fast-json-stable-stringify@^2.0.0: + version "2.1.0" + resolved "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + +fast-levenshtein@^2.0.6: + version "2.0.6" + resolved "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz" + integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= + +fast-uri@^3.0.1: + version "3.0.6" + resolved "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.6.tgz" + integrity sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw== + +fastest-levenshtein@^1.0.12: + version "1.0.12" + resolved "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.12.tgz" + integrity sha512-On2N+BpYJ15xIC974QNVuYGMOlEVt4s0EOI3wwMqOmK1fdDY+FN/zltPV8vosq4ad4c/gJ1KHScUn/6AWIgiow== + +faye-websocket@^0.11.3: + version "0.11.4" + resolved "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz" + integrity sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g== + dependencies: + websocket-driver ">=0.5.1" + +fd-slicer@~1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz" + integrity sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4= + dependencies: + pend "~1.2.0" + +file-entry-cache@^8.0.0: + version "8.0.0" + resolved "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz" + integrity sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ== + dependencies: + flat-cache "^4.0.0" + +file-size@0.0.5: + version "0.0.5" + resolved "https://registry.npmjs.org/file-size/-/file-size-0.0.5.tgz" + integrity sha1-BX1Dw6Ptc12j+Q1gUqs4Dx5tXjs= + +fill-range@^7.1.1: + version "7.1.1" + resolved "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz" + integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== + dependencies: + to-regex-range "^5.0.1" + +finalhandler@1.1.2: + version "1.1.2" + resolved "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz" + integrity sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA== + dependencies: + debug "2.6.9" + encodeurl "~1.0.2" + escape-html "~1.0.3" + on-finished "~2.3.0" + parseurl "~1.3.3" + statuses "~1.5.0" + unpipe "~1.0.0" + +finalhandler@1.3.1: + version "1.3.1" + resolved "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz" + integrity sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ== + dependencies: + debug "2.6.9" + encodeurl "~2.0.0" + escape-html "~1.0.3" + on-finished "2.4.1" + parseurl "~1.3.3" + statuses "2.0.1" + unpipe "~1.0.0" + +find-up@^4.0.0: + version "4.1.0" + resolved "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz" + integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== + dependencies: + locate-path "^5.0.0" + path-exists "^4.0.0" + +find-up@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== + dependencies: + locate-path "^6.0.0" + path-exists "^4.0.0" + +flat-cache@^4.0.0: + version "4.0.1" + resolved "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz" + integrity sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw== + dependencies: + flatted "^3.2.9" + keyv "^4.5.4" + +flat@^5.0.2: + version "5.0.2" + resolved "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz" + integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== + +flatted@^3.2.5, flatted@^3.2.9: + version "3.3.3" + resolved "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz" + integrity sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg== + +flow-bin@^0.217.0: + version "0.217.0" + resolved "https://registry.npmjs.org/flow-bin/-/flow-bin-0.217.0.tgz" + integrity sha512-AbbDE6QUpR+jpY9ejNROAk0P5D/2PxJzjU4D5vfmMwtS+QjjPjzfZGuatEJIn2k4PTZ2agbncaCtyHGO0AvG7A== + +follow-redirects@^1.0.0: + version "1.15.9" + resolved "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz" + integrity sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ== + +for-each@^0.3.3, for-each@^0.3.5: + version "0.3.5" + resolved "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz" + integrity sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg== + dependencies: + is-callable "^1.2.7" + +forever-agent@~0.6.1: + version "0.6.1" + resolved "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz" + integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= + +form-data@~2.3.2: + version "2.3.3" + resolved "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz" + integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.6" + mime-types "^2.1.12" + +forwarded@0.2.0: + version "0.2.0" + resolved "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz" + integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== + +fresh@0.5.2: + version "0.5.2" + resolved "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz" + integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= + +fs-extra@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-1.0.0.tgz" + integrity sha1-zTzl9+fLYUWIP8rjGR6Yd/hYeVA= + dependencies: + graceful-fs "^4.1.2" + jsonfile "^2.1.0" + klaw "^1.0.0" + +fs-extra@^10.1.0: + version "10.1.0" + resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz" + integrity sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + +fs-extra@^8.1.0: + version "8.1.0" + resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz" + integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^4.0.0" + universalify "^0.1.0" + +fs-readdir-recursive@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz" + integrity sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA== + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" + integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= + +fsevents@~2.3.2: + version "2.3.2" + resolved "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz" + integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== + +function-bind@^1.1.1, function-bind@^1.1.2: + version "1.1.2" + resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz" + integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== + +function.prototype.name@^1.1.6, function.prototype.name@^1.1.8: + version "1.1.8" + resolved "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz" + integrity sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q== + dependencies: + call-bind "^1.0.8" + call-bound "^1.0.3" + define-properties "^1.2.1" + functions-have-names "^1.2.3" + hasown "^2.0.2" + is-callable "^1.2.7" + +functions-have-names@^1.2.3: + version "1.2.3" + resolved "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz" + integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== + +gensync@^1.0.0-beta.2: + version "1.0.0-beta.2" + resolved "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz" + integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== + +get-caller-file@^2.0.5: + version "2.0.5" + resolved "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + +get-intrinsic@^1.2.4, get-intrinsic@^1.2.5, get-intrinsic@^1.2.6, get-intrinsic@^1.2.7, get-intrinsic@^1.3.0: + version "1.3.0" + resolved "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz" + integrity sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ== + dependencies: + call-bind-apply-helpers "^1.0.2" + es-define-property "^1.0.1" + es-errors "^1.3.0" + es-object-atoms "^1.1.1" + function-bind "^1.1.2" + get-proto "^1.0.1" + gopd "^1.2.0" + has-symbols "^1.1.0" + hasown "^2.0.2" + math-intrinsics "^1.1.0" + +get-proto@^1.0.0, get-proto@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz" + integrity sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g== + dependencies: + dunder-proto "^1.0.1" + es-object-atoms "^1.0.0" + +get-stream@^5.1.0: + version "5.2.0" + resolved "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz" + integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== + dependencies: + pump "^3.0.0" + +get-symbol-description@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz" + integrity sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg== + dependencies: + call-bound "^1.0.3" + es-errors "^1.3.0" + get-intrinsic "^1.2.6" + +get-uri@^6.0.1: + version "6.0.1" + resolved "https://registry.npmjs.org/get-uri/-/get-uri-6.0.1.tgz" + integrity sha512-7ZqONUVqaabogsYNWlYj0t3YZaL6dhuEueZXGF+/YVmf6dHmaFg8/6psJKqhx9QykIDKzpGcy2cn4oV4YC7V/Q== + dependencies: + basic-ftp "^5.0.2" + data-uri-to-buffer "^5.0.1" + debug "^4.3.4" + fs-extra "^8.1.0" + +getpass@^0.1.1: + version "0.1.7" + resolved "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz" + integrity sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo= + dependencies: + assert-plus "^1.0.0" + +glob-parent@^6.0.2: + version "6.0.2" + resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz" + integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== + dependencies: + is-glob "^4.0.3" + +glob-parent@~5.1.2: + version "5.1.2" + resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + +glob-to-regexp@^0.4.1: + version "0.4.1" + resolved "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz" + integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== + +glob@^7.1.3, glob@^7.1.7, glob@^7.2.0: + version "7.2.3" + resolved "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz" + integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.1.1" + once "^1.3.0" + path-is-absolute "^1.0.0" + +globals@^11.1.0: + version "11.12.0" + resolved "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz" + integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== + +globals@^14.0.0: + version "14.0.0" + resolved "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz" + integrity sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ== + +globals@^16.2.0: + version "16.2.0" + resolved "https://registry.npmjs.org/globals/-/globals-16.2.0.tgz" + integrity sha512-O+7l9tPdHCU320IigZZPj5zmRCFG9xHmx9cU8FqU2Rp+JN714seHV+2S9+JslCpY4gJwU2vOGox0wzgae/MCEg== + +globalthis@^1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz" + integrity sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ== + dependencies: + define-properties "^1.2.1" + gopd "^1.0.1" + +gopd@^1.0.1, gopd@^1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz" + integrity sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg== + +graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.1.9, graceful-fs@^4.2.0, graceful-fs@^4.2.11, graceful-fs@^4.2.4, graceful-fs@^4.2.6: + version "4.2.11" + resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz" + integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== + +handle-thing@^2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz" + integrity sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg== + +har-schema@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz" + integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI= + +har-validator@~5.1.3: + version "5.1.5" + resolved "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz" + integrity sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w== + dependencies: + ajv "^6.12.3" + har-schema "^2.0.0" + +has-ansi@^0.1.0: + version "0.1.0" + resolved "https://registry.npmjs.org/has-ansi/-/has-ansi-0.1.0.tgz" + integrity sha1-hPJlqujA5qiKEtcCKJS3VoiUxi4= + dependencies: + ansi-regex "^0.2.0" + +has-bigints@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz" + integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +has-property-descriptors@^1.0.0, has-property-descriptors@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz" + integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg== + dependencies: + es-define-property "^1.0.0" + +has-proto@^1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz" + integrity sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ== + dependencies: + dunder-proto "^1.0.0" + +has-symbols@^1.0.3, has-symbols@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz" + integrity sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ== + +has-tostringtag@^1.0.0, has-tostringtag@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz" + integrity sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw== + dependencies: + has-symbols "^1.0.3" + +has@^1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/has/-/has-1.0.3.tgz" + integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== + dependencies: + function-bind "^1.1.1" + +hasha@^2.2.0: + version "2.2.0" + resolved "https://registry.npmjs.org/hasha/-/hasha-2.2.0.tgz" + integrity sha1-eNfL/B5tZjA/55g3NlmEUXsvbuE= + dependencies: + is-stream "^1.0.1" + pinkie-promise "^2.0.0" + +hasown@^2.0.2: + version "2.0.2" + resolved "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz" + integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== + dependencies: + function-bind "^1.1.2" + +hpack.js@^2.1.6: + version "2.1.6" + resolved "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz" + integrity sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI= + dependencies: + inherits "^2.0.1" + obuf "^1.0.0" + readable-stream "^2.0.1" + wbuf "^1.1.0" + +http-deceiver@^1.2.7: + version "1.2.7" + resolved "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz" + integrity sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc= + +http-errors@2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz" + integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== + dependencies: + depd "2.0.0" + inherits "2.0.4" + setprototypeof "1.2.0" + statuses "2.0.1" + toidentifier "1.0.1" + +http-errors@~1.6.2: + version "1.6.3" + resolved "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz" + integrity sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0= + dependencies: + depd "~1.1.2" + inherits "2.0.3" + setprototypeof "1.1.0" + statuses ">= 1.4.0 < 2" + +http-parser-js@>=0.5.1: + version "0.5.6" + resolved "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.6.tgz" + integrity sha512-vDlkRPDJn93swjcjqMSaGSPABbIarsr1TLAui/gLDXzV5VsJNdXNzMYDyNBLQkjWQCJ1uizu8T2oDMhmGt0PRA== + +http-proxy-agent@^7.0.0, http-proxy-agent@^7.0.1: + version "7.0.2" + resolved "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz" + integrity sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig== + dependencies: + agent-base "^7.1.0" + debug "^4.3.4" + +http-proxy-middleware@^2.0.9: + version "2.0.9" + resolved "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.9.tgz" + integrity sha512-c1IyJYLYppU574+YI7R4QyX2ystMtVXZwIdzazUIPIJsHuWNd+mho2j+bKoHftndicGj9yh+xjd+l0yj7VeT1Q== + dependencies: + "@types/http-proxy" "^1.17.8" + http-proxy "^1.18.1" + is-glob "^4.0.1" + is-plain-obj "^3.0.0" + micromatch "^4.0.2" + +http-proxy@^1.18.1: + version "1.18.1" + resolved "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz" + integrity sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ== + dependencies: + eventemitter3 "^4.0.0" + follow-redirects "^1.0.0" + requires-port "^1.0.0" + +http-signature@~1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz" + integrity sha1-muzZJRFHcvPZW2WmCruPfBj7rOE= + dependencies: + assert-plus "^1.0.0" + jsprim "^1.2.2" + sshpk "^1.7.0" + +https-proxy-agent@^7.0.6: + version "7.0.6" + resolved "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz" + integrity sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw== + dependencies: + agent-base "^7.1.2" + debug "4" + +hyperdyperid@^1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/hyperdyperid/-/hyperdyperid-1.2.0.tgz" + integrity sha512-Y93lCzHYgGWdrJ66yIktxiaGULYc6oGiABxhcO5AufBeOyoIdZF7bIfLaOrbM0iGIOXQQgxxRrFEnb+Y6w1n4A== + +iconv-lite@0.4.24: + version "0.4.24" + resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + +ignore@^5.2.0: + version "5.2.0" + resolved "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz" + integrity sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ== + +import-fresh@^3.2.1, import-fresh@^3.3.0: + version "3.3.0" + resolved "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz" + integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + +import-local@^3.0.2: + version "3.1.0" + resolved "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz" + integrity sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg== + dependencies: + pkg-dir "^4.2.0" + resolve-cwd "^3.0.0" + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz" + integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz" + integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.3: + version "2.0.4" + resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +inherits@2.0.3: + version "2.0.3" + resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz" + integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= + +internal-slot@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz" + integrity sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw== + dependencies: + es-errors "^1.3.0" + hasown "^2.0.2" + side-channel "^1.1.0" + +interpret@^3.1.1: + version "3.1.1" + resolved "https://registry.npmjs.org/interpret/-/interpret-3.1.1.tgz" + integrity sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ== + +ip-address@^9.0.5: + version "9.0.5" + resolved "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz" + integrity sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g== + dependencies: + jsbn "1.1.0" + sprintf-js "^1.1.3" + +ipaddr.js@1.9.1: + version "1.9.1" + resolved "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz" + integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== + +ipaddr.js@^2.1.0: + version "2.2.0" + resolved "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.2.0.tgz" + integrity sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA== + +is-arguments@^1.0.4: + version "1.1.1" + resolved "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz" + integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-array-buffer@^3.0.4, is-array-buffer@^3.0.5: + version "3.0.5" + resolved "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz" + integrity sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A== + dependencies: + call-bind "^1.0.8" + call-bound "^1.0.3" + get-intrinsic "^1.2.6" + +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz" + integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== + +is-async-function@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz" + integrity sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA== + dependencies: + has-tostringtag "^1.0.0" + +is-bigint@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz" + integrity sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ== + dependencies: + has-bigints "^1.0.2" + +is-binary-path@~2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + dependencies: + binary-extensions "^2.0.0" + +is-boolean-object@^1.2.1: + version "1.2.2" + resolved "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz" + integrity sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A== + dependencies: + call-bound "^1.0.3" + has-tostringtag "^1.0.2" + +is-callable@^1.2.7: + version "1.2.7" + resolved "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz" + integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== + +is-core-module@^2.13.0: + version "2.13.0" + resolved "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz" + integrity sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ== + dependencies: + has "^1.0.3" + +is-data-view@^1.0.1, is-data-view@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz" + integrity sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw== + dependencies: + call-bound "^1.0.2" + get-intrinsic "^1.2.6" + is-typed-array "^1.1.13" + +is-date-object@^1.0.5, is-date-object@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz" + integrity sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg== + dependencies: + call-bound "^1.0.2" + has-tostringtag "^1.0.2" + +is-docker@^2.0.0: + version "2.2.1" + resolved "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz" + integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== + +is-docker@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz" + integrity sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ== + +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz" + integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= + +is-finalizationregistry@^1.1.0: + version "1.1.1" + resolved "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz" + integrity sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg== + dependencies: + call-bound "^1.0.3" + +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + +is-generator-function@^1.0.10, is-generator-function@^1.0.7: + version "1.0.10" + resolved "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz" + integrity sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A== + dependencies: + has-tostringtag "^1.0.0" + +is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: + version "4.0.3" + resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== + dependencies: + is-extglob "^2.1.1" + +is-inside-container@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz" + integrity sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA== + dependencies: + is-docker "^3.0.0" + +is-map@^2.0.3: + version "2.0.3" + resolved "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz" + integrity sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw== + +is-nan@^1.3.2: + version "1.3.2" + resolved "https://registry.npmjs.org/is-nan/-/is-nan-1.3.2.tgz" + integrity sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w== + dependencies: + call-bind "^1.0.0" + define-properties "^1.1.3" + +is-negative-zero@^2.0.3: + version "2.0.3" + resolved "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz" + integrity sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw== + +is-network-error@^1.0.0: + version "1.1.0" + resolved "https://registry.npmjs.org/is-network-error/-/is-network-error-1.1.0.tgz" + integrity sha512-tUdRRAnhT+OtCZR/LxZelH/C7QtjtFrTu5tXCA8pl55eTUElUHT+GPYV8MBMBvea/j+NxQqVt3LbWMRir7Gx9g== + +is-number-object@^1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz" + integrity sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw== + dependencies: + call-bound "^1.0.3" + has-tostringtag "^1.0.2" + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-plain-obj@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz" + integrity sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA== + +is-plain-object@^2.0.4: + version "2.0.4" + resolved "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz" + integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== + dependencies: + isobject "^3.0.1" + +is-regex@^1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz" + integrity sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g== + dependencies: + call-bound "^1.0.2" + gopd "^1.2.0" + has-tostringtag "^1.0.2" + hasown "^2.0.2" + +is-set@^2.0.3: + version "2.0.3" + resolved "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz" + integrity sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg== + +is-shared-array-buffer@^1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz" + integrity sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A== + dependencies: + call-bound "^1.0.3" + +is-stream@^1.0.1: + version "1.1.0" + resolved "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz" + integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= + +is-string@^1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz" + integrity sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA== + dependencies: + call-bound "^1.0.3" + has-tostringtag "^1.0.2" + +is-symbol@^1.0.4, is-symbol@^1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz" + integrity sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w== + dependencies: + call-bound "^1.0.2" + has-symbols "^1.1.0" + safe-regex-test "^1.1.0" + +is-typed-array@^1.1.13, is-typed-array@^1.1.14, is-typed-array@^1.1.15, is-typed-array@^1.1.3: + version "1.1.15" + resolved "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz" + integrity sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ== + dependencies: + which-typed-array "^1.1.16" + +is-typedarray@~1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz" + integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= + +is-weakmap@^2.0.2: + version "2.0.2" + resolved "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz" + integrity sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w== + +is-weakref@^1.0.2, is-weakref@^1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz" + integrity sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew== + dependencies: + call-bound "^1.0.3" + +is-weakset@^2.0.3: + version "2.0.4" + resolved "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz" + integrity sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ== + dependencies: + call-bound "^1.0.3" + get-intrinsic "^1.2.6" + +is-wsl@^2.2.0: + version "2.2.0" + resolved "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz" + integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== + dependencies: + is-docker "^2.0.0" + +is-wsl@^3.1.0: + version "3.1.0" + resolved "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.0.tgz" + integrity sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw== + dependencies: + is-inside-container "^1.0.0" + +isarray@^2.0.5: + version "2.0.5" + resolved "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz" + integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== + +isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz" + integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= + +isbinaryfile@^4.0.8: + version "4.0.10" + resolved "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.10.tgz" + integrity sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw== + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" + integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= + +isobject@^3.0.1: + version "3.0.1" + resolved "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz" + integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= + +isstream@~0.1.2: + version "0.1.2" + resolved "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz" + integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= + +iterator.prototype@^1.1.4: + version "1.1.5" + resolved "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.5.tgz" + integrity sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g== + dependencies: + define-data-property "^1.1.4" + es-object-atoms "^1.0.0" + get-intrinsic "^1.2.6" + get-proto "^1.0.0" + has-symbols "^1.1.0" + set-function-name "^2.0.2" + +jasmine-core@^4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/jasmine-core/-/jasmine-core-4.1.0.tgz" + integrity sha512-8E8BiffCL8sBwK1zU9cbavLe8xpJAgOduSJ6N8PJVv8VosQ/nxVTuXj2kUeHxTlZBVvh24G19ga7xdiaxlceKg== + +jasmine-core@^5.8.0: + version "5.8.0" + resolved "https://registry.npmjs.org/jasmine-core/-/jasmine-core-5.8.0.tgz" + integrity sha512-Q9dqmpUAfptwyueW3+HqBOkSuYd9I/clZSSfN97wXE/Nr2ROFNCwIBEC1F6kb3QXS9Fcz0LjFYSDQT+BiwjuhA== + +jest-worker@^27.4.5: + version "27.5.1" + resolved "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz" + integrity sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg== + dependencies: + "@types/node" "*" + merge-stream "^2.0.0" + supports-color "^8.0.0" + +"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +js-yaml@^4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz" + integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== + dependencies: + argparse "^2.0.1" + +jsbn@1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz" + integrity sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A== + +jsbn@~0.1.0: + version "0.1.1" + resolved "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz" + integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= + +jsesc@^3.0.2: + version "3.1.0" + resolved "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz" + integrity sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA== + +jsesc@~3.0.2: + version "3.0.2" + resolved "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz" + integrity sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g== + +json-buffer@3.0.1: + version "3.0.1" + resolved "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz" + integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== + +json-parse-even-better-errors@^2.3.0, json-parse-even-better-errors@^2.3.1: + version "2.3.1" + resolved "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz" + integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== + +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + +json-schema-traverse@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz" + integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== + +json-schema@0.4.0: + version "0.4.0" + resolved "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz" + integrity sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA== + +json-stable-stringify-without-jsonify@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz" + integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= + +json-stringify-safe@~5.0.1: + version "5.0.1" + resolved "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz" + integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= + +json5@^2.2.3: + version "2.2.3" + resolved "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz" + integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== + +jsonfile@^2.1.0: + version "2.4.0" + resolved "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz" + integrity sha1-NzaitCi4e72gzIO1P6PWM6NcKug= + optionalDependencies: + graceful-fs "^4.1.6" + +jsonfile@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz" + integrity sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg== + optionalDependencies: + graceful-fs "^4.1.6" + +jsonfile@^6.0.1: + version "6.1.0" + resolved "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz" + integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== + dependencies: + universalify "^2.0.0" + optionalDependencies: + graceful-fs "^4.1.6" + +jsprim@^1.2.2: + version "1.4.2" + resolved "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz" + integrity sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw== + dependencies: + assert-plus "1.0.0" + extsprintf "1.3.0" + json-schema "0.4.0" + verror "1.10.0" + +"jsx-ast-utils@^2.4.1 || ^3.0.0": + version "3.2.2" + resolved "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.2.2.tgz" + integrity sha512-HDAyJ4MNQBboGpUnHAVUNJs6X0lh058s6FuixsFGP7MgJYpD6Vasd6nzSG5iIfXu1zAYlHJ/zsOKNlrenTUBnw== + dependencies: + array-includes "^3.1.4" + object.assign "^4.1.2" + +karma-chrome-launcher@^3.2.0: + version "3.2.0" + resolved "https://registry.npmjs.org/karma-chrome-launcher/-/karma-chrome-launcher-3.2.0.tgz" + integrity sha512-rE9RkUPI7I9mAxByQWkGJFXfFD6lE4gC5nPuZdobf/QdTEJI6EU4yIay/cfU/xV4ZxlM5JiTv7zWYgA64NpS5Q== + dependencies: + which "^1.2.1" + +karma-cli@2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/karma-cli/-/karma-cli-2.0.0.tgz" + integrity sha512-1Kb28UILg1ZsfqQmeELbPzuEb5C6GZJfVIk0qOr8LNYQuYWmAaqP16WpbpKEjhejDrDYyYOwwJXSZO6u7q5Pvw== + dependencies: + resolve "^1.3.3" + +karma-firefox-launcher@^2.1.3: + version "2.1.3" + resolved "https://registry.npmjs.org/karma-firefox-launcher/-/karma-firefox-launcher-2.1.3.tgz" + integrity sha512-LMM2bseebLbYjODBOVt7TCPP9OI2vZIXCavIXhkO9m+10Uj5l7u/SKoeRmYx8FYHTVGZSpk6peX+3BMHC1WwNw== + dependencies: + is-wsl "^2.2.0" + which "^3.0.0" + +karma-ie-launcher@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/karma-ie-launcher/-/karma-ie-launcher-1.0.0.tgz" + integrity sha1-SXmGhCxJAZA0bNifVJTKmDDG1Zw= + dependencies: + lodash "^4.6.1" + +karma-jasmine@^5.1.0: + version "5.1.0" + resolved "https://registry.npmjs.org/karma-jasmine/-/karma-jasmine-5.1.0.tgz" + integrity sha512-i/zQLFrfEpRyQoJF9fsCdTMOF5c2dK7C7OmsuKg2D0YSsuZSfQDiLuaiktbuio6F2wiCsZSnSnieIQ0ant/uzQ== + dependencies: + jasmine-core "^4.1.0" + +karma-phantomjs-launcher@^1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/karma-phantomjs-launcher/-/karma-phantomjs-launcher-1.0.4.tgz" + integrity sha512-tf4P3plsE7wb5Pqh8GJ6RnElxfI/UM4MtVnjbSIZFpdFJlKnjRzfIx8MLCcSYJBwZ1+qSKFz4uBe3XNoq2t3KA== + dependencies: + lodash "^4.0.1" + phantomjs-prebuilt "^2.1.7" + +karma-phantomjs-shim@^1.5.0: + version "1.5.0" + resolved "https://registry.npmjs.org/karma-phantomjs-shim/-/karma-phantomjs-shim-1.5.0.tgz" + integrity sha512-t0h1x7btXROaGElv36TLpuoWqTnVZ/f+GJHH/qVerjbX6AENoM5brQoB9ISO3hQ6zO1k9rDSRLrY5ZZb83ANdg== + +karma-webpack@^5.0.1: + version "5.0.1" + resolved "https://registry.npmjs.org/karma-webpack/-/karma-webpack-5.0.1.tgz" + integrity sha512-oo38O+P3W2mSPCSUrQdySSPv1LvPpXP+f+bBimNomS5sW+1V4SuhCuW8TfJzV+rDv921w2fDSDw0xJbPe6U+kQ== + dependencies: + glob "^7.1.3" + minimatch "^9.0.3" + webpack-merge "^4.1.5" + +karma@^6.4.4: + version "6.4.4" + resolved "https://registry.npmjs.org/karma/-/karma-6.4.4.tgz" + integrity sha512-LrtUxbdvt1gOpo3gxG+VAJlJAEMhbWlM4YrFQgql98FwF7+K8K12LYO4hnDdUkNjeztYrOXEMqgTajSWgmtI/w== + dependencies: + "@colors/colors" "1.5.0" + body-parser "^1.19.0" + braces "^3.0.2" + chokidar "^3.5.1" + connect "^3.7.0" + di "^0.0.1" + dom-serialize "^2.2.1" + glob "^7.1.7" + graceful-fs "^4.2.6" + http-proxy "^1.18.1" + isbinaryfile "^4.0.8" + lodash "^4.17.21" + log4js "^6.4.1" + mime "^2.5.2" + minimatch "^3.0.4" + mkdirp "^0.5.5" + qjobs "^1.2.0" + range-parser "^1.2.1" + rimraf "^3.0.2" + socket.io "^4.7.2" + source-map "^0.6.1" + tmp "^0.2.1" + ua-parser-js "^0.7.30" + yargs "^16.1.1" + +kew@^0.7.0: + version "0.7.0" + resolved "https://registry.npmjs.org/kew/-/kew-0.7.0.tgz" + integrity sha1-edk9LTM2PW/dKXCzNdkUGtWR15s= + +keyv@^4.5.4: + version "4.5.4" + resolved "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz" + integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== + dependencies: + json-buffer "3.0.1" + +kind-of@^6.0.2: + version "6.0.3" + resolved "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz" + integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== + +klaw@^1.0.0: + version "1.3.1" + resolved "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz" + integrity sha1-QIhDO0azsbolnXh4XY6W9zugJDk= + optionalDependencies: + graceful-fs "^4.1.9" + +launch-editor@^2.6.1: + version "2.10.0" + resolved "https://registry.npmjs.org/launch-editor/-/launch-editor-2.10.0.tgz" + integrity sha512-D7dBRJo/qcGX9xlvt/6wUYzQxjh5G1RvZPgPv8vi4KRU99DVQL/oW7tnVOCCTm2HGeo3C5HvGE5Yrh6UBoZ0vA== + dependencies: + picocolors "^1.0.0" + shell-quote "^1.8.1" + +levn@^0.4.1: + version "0.4.1" + resolved "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz" + integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== + dependencies: + prelude-ls "^1.2.1" + type-check "~0.4.0" + +lines-and-columns@^1.1.6: + version "1.2.4" + resolved "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz" + integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== + +loader-runner@^4.2.0: + version "4.3.0" + resolved "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz" + integrity sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg== + +locate-path@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz" + integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== + dependencies: + p-locate "^4.1.0" + +locate-path@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz" + integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== + dependencies: + p-locate "^5.0.0" + +lodash.debounce@^4.0.8: + version "4.0.8" + resolved "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz" + integrity sha1-gteb/zCmfEAF/9XiUVMArZyk168= + +lodash.merge@^4.6.2: + version "4.6.2" + resolved "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz" + integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== + +lodash@^4.0.1, lodash@^4.17.15, lodash@^4.17.21, lodash@^4.17.4, lodash@^4.6.1: + version "4.17.21" + resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + +log4js@^6.4.1: + version "6.4.6" + resolved "https://registry.npmjs.org/log4js/-/log4js-6.4.6.tgz" + integrity sha512-1XMtRBZszmVZqPAOOWczH+Q94AI42mtNWjvjA5RduKTSWjEc56uOBbyM1CJnfN4Ym0wSd8cQ43zOojlSHgRDAw== + dependencies: + date-format "^4.0.9" + debug "^4.3.4" + flatted "^3.2.5" + rfdc "^1.3.0" + streamroller "^3.0.8" + +loose-envify@^1.1.0, loose-envify@^1.4.0: + version "1.4.0" + resolved "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz" + integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== + dependencies: + js-tokens "^3.0.0 || ^4.0.0" + +lru-cache@^4.0.1: + version "4.1.5" + resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz" + integrity sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g== + dependencies: + pseudomap "^1.0.2" + yallist "^2.1.2" + +lru-cache@^5.1.1: + version "5.1.1" + resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz" + integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== + dependencies: + yallist "^3.0.2" + +lru-cache@^7.14.1: + version "7.18.3" + resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz" + integrity sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA== + +make-dir@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz" + integrity sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA== + dependencies: + pify "^4.0.1" + semver "^5.6.0" + +math-intrinsics@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz" + integrity sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g== + +media-typer@0.3.0: + version "0.3.0" + resolved "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz" + integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= + +memfs@^4.6.0: + version "4.17.2" + resolved "https://registry.npmjs.org/memfs/-/memfs-4.17.2.tgz" + integrity sha512-NgYhCOWgovOXSzvYgUW0LQ7Qy72rWQMGGFJDoWg4G30RHd3z77VbYdtJ4fembJXBy8pMIUA31XNAupobOQlwdg== + dependencies: + "@jsonjoy.com/json-pack" "^1.0.3" + "@jsonjoy.com/util" "^1.3.0" + tree-dump "^1.0.1" + tslib "^2.0.0" + +merge-descriptors@1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz" + integrity sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ== + +merge-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz" + integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== + +methods@~1.1.2: + version "1.1.2" + resolved "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz" + integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= + +micromatch@^4.0.2: + version "4.0.8" + resolved "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz" + integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA== + dependencies: + braces "^3.0.3" + picomatch "^2.3.1" + +mime-db@1.52.0, "mime-db@>= 1.43.0 < 2": + version "1.52.0" + resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz" + integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== + +mime-types@^2.1.12, mime-types@^2.1.27, mime-types@^2.1.31, mime-types@~2.1.17, mime-types@~2.1.19, mime-types@~2.1.24, mime-types@~2.1.34: + version "2.1.35" + resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz" + integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== + dependencies: + mime-db "1.52.0" + +mime@1.6.0, mime@^1.2.11: + version "1.6.0" + resolved "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz" + integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== + +mime@^2.5.2: + version "2.6.0" + resolved "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz" + integrity sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg== + +minimalistic-assert@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz" + integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== + +minimatch@^3.0.4, minimatch@^3.1.1, minimatch@^3.1.2: + version "3.1.2" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + +minimatch@^9.0.3: + version "9.0.5" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz" + integrity sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow== + dependencies: + brace-expansion "^2.0.1" + +minimist@^1.2.5, minimist@^1.2.6: + version "1.2.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" + integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== + +mitt@^3.0.1: + version "3.0.1" + resolved "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz" + integrity sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw== + +mkdirp@^0.5.4, mkdirp@^0.5.5: + version "0.5.6" + resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz" + integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== + dependencies: + minimist "^1.2.6" + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz" + integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= + +ms@2.1.3, ms@^2.1.3: + version "2.1.3" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +multicast-dns@^7.2.5: + version "7.2.5" + resolved "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz" + integrity sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg== + dependencies: + dns-packet "^5.2.2" + thunky "^1.0.2" + +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz" + integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= + +negotiator@0.6.3: + version "0.6.3" + resolved "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz" + integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== + +neo-async@^2.6.2: + version "2.6.2" + resolved "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz" + integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== + +netmask@^2.0.2: + version "2.0.2" + resolved "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz" + integrity sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg== + +node-forge@^1: + version "1.3.1" + resolved "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz" + integrity sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA== + +node-releases@^2.0.19: + version "2.0.19" + resolved "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz" + integrity sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw== + +normalize-path@^3.0.0, normalize-path@~3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +oauth-sign@~0.9.0: + version "0.9.0" + resolved "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz" + integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== + +object-assign@^4, object-assign@^4.1.1: + version "4.1.1" + resolved "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" + integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= + +object-inspect@^1.13.3, object-inspect@^1.13.4: + version "1.13.4" + resolved "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz" + integrity sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew== + +object-is@^1.1.5: + version "1.1.5" + resolved "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz" + integrity sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + +object-keys@^1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== + +object.assign@^4.1.2, object.assign@^4.1.4, object.assign@^4.1.7: + version "4.1.7" + resolved "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz" + integrity sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw== + dependencies: + call-bind "^1.0.8" + call-bound "^1.0.3" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" + has-symbols "^1.1.0" + object-keys "^1.1.1" + +object.entries@^1.1.9: + version "1.1.9" + resolved "https://registry.npmjs.org/object.entries/-/object.entries-1.1.9.tgz" + integrity sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw== + dependencies: + call-bind "^1.0.8" + call-bound "^1.0.4" + define-properties "^1.2.1" + es-object-atoms "^1.1.1" + +object.fromentries@^2.0.8: + version "2.0.8" + resolved "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz" + integrity sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + es-object-atoms "^1.0.0" + +object.values@^1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/object.values/-/object.values-1.2.1.tgz" + integrity sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA== + dependencies: + call-bind "^1.0.8" + call-bound "^1.0.3" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" + +obuf@^1.0.0, obuf@^1.1.2: + version "1.1.2" + resolved "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz" + integrity sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg== + +on-finished@2.4.1, on-finished@^2.4.1: + version "2.4.1" + resolved "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz" + integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== + dependencies: + ee-first "1.1.1" + +on-finished@~2.3.0: + version "2.3.0" + resolved "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz" + integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc= + dependencies: + ee-first "1.1.1" + +on-headers@~1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz" + integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA== + +once@^1.3.0, once@^1.3.1, once@^1.4.0: + version "1.4.0" + resolved "https://registry.npmjs.org/once/-/once-1.4.0.tgz" + integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= + dependencies: + wrappy "1" + +open@^10.0.3: + version "10.1.2" + resolved "https://registry.npmjs.org/open/-/open-10.1.2.tgz" + integrity sha512-cxN6aIDPz6rm8hbebcP7vrQNhvRcveZoJU72Y7vskh4oIm+BZwBECnx5nTmrlres1Qapvx27Qo1Auukpf8PKXw== + dependencies: + default-browser "^5.2.1" + define-lazy-prop "^3.0.0" + is-inside-container "^1.0.0" + is-wsl "^3.1.0" + +optionator@^0.9.3: + version "0.9.3" + resolved "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz" + integrity sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg== + dependencies: + "@aashutoshrathi/word-wrap" "^1.2.3" + deep-is "^0.1.3" + fast-levenshtein "^2.0.6" + levn "^0.4.1" + prelude-ls "^1.2.1" + type-check "^0.4.0" + +os-shim@^0.1.2: + version "0.1.3" + resolved "https://registry.npmjs.org/os-shim/-/os-shim-0.1.3.tgz" + integrity sha1-a2LDeRz3kJ6jXtRuF2WLtBfLORc= + +own-keys@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz" + integrity sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg== + dependencies: + get-intrinsic "^1.2.6" + object-keys "^1.1.1" + safe-push-apply "^1.0.0" + +p-limit@^2.2.0: + version "2.3.0" + resolved "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz" + integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== + dependencies: + p-try "^2.0.0" + +p-limit@^3.0.2: + version "3.1.0" + resolved "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== + dependencies: + yocto-queue "^0.1.0" + +p-locate@^4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz" + integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== + dependencies: + p-limit "^2.2.0" + +p-locate@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz" + integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== + dependencies: + p-limit "^3.0.2" + +p-retry@^6.2.0: + version "6.2.1" + resolved "https://registry.npmjs.org/p-retry/-/p-retry-6.2.1.tgz" + integrity sha512-hEt02O4hUct5wtwg4H4KcWgDdm+l1bOaEy/hWzd8xtXB9BqxTWBBhb+2ImAtH4Cv4rPjV76xN3Zumqk3k3AhhQ== + dependencies: + "@types/retry" "0.12.2" + is-network-error "^1.0.0" + retry "^0.13.1" + +p-try@^2.0.0: + version "2.2.0" + resolved "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz" + integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== + +pac-proxy-agent@^7.1.0: + version "7.2.0" + resolved "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-7.2.0.tgz" + integrity sha512-TEB8ESquiLMc0lV8vcd5Ql/JAKAoyzHFXaStwjkzpOpC5Yv+pIzLfHvjTSdf3vpa2bMiUQrg9i6276yn8666aA== + dependencies: + "@tootallnate/quickjs-emscripten" "^0.23.0" + agent-base "^7.1.2" + debug "^4.3.4" + get-uri "^6.0.1" + http-proxy-agent "^7.0.0" + https-proxy-agent "^7.0.6" + pac-resolver "^7.0.1" + socks-proxy-agent "^8.0.5" + +pac-resolver@^7.0.1: + version "7.0.1" + resolved "https://registry.npmjs.org/pac-resolver/-/pac-resolver-7.0.1.tgz" + integrity sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg== + dependencies: + degenerator "^5.0.0" + netmask "^2.0.2" + +parent-module@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz" + integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== + dependencies: + callsites "^3.0.0" + +parse-json@^5.2.0: + version "5.2.0" + resolved "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz" + integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== + dependencies: + "@babel/code-frame" "^7.0.0" + error-ex "^1.3.1" + json-parse-even-better-errors "^2.3.0" + lines-and-columns "^1.1.6" + +parseurl@~1.3.2, parseurl@~1.3.3: + version "1.3.3" + resolved "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz" + integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== + +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" + integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= + +path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + +path-parse@^1.0.7: + version "1.0.7" + resolved "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== + +path-to-regexp@0.1.12: + version "0.1.12" + resolved "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz" + integrity sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ== + +pend@~1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz" + integrity sha1-elfrVQpng/kRUzH89GY9XI4AelA= + +performance-now@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz" + integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= + +phantomjs-prebuilt@^2.1.16, phantomjs-prebuilt@^2.1.7: + version "2.1.16" + resolved "https://registry.npmjs.org/phantomjs-prebuilt/-/phantomjs-prebuilt-2.1.16.tgz" + integrity sha512-PIiRzBhW85xco2fuj41FmsyuYHKjKuXWmhjy3A/Y+CMpN/63TV+s9uzfVhsUwFe0G77xWtHBG8xmXf5BqEUEuQ== + dependencies: + es6-promise "^4.0.3" + extract-zip "^1.6.5" + fs-extra "^1.0.0" + hasha "^2.2.0" + kew "^0.7.0" + progress "^1.1.8" + request "^2.81.0" + request-progress "^2.0.1" + which "^1.2.10" + +picocolors@^1.0.0, picocolors@^1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz" + integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== + +picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: + version "2.3.1" + resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + +pify@^4.0.1: + version "4.0.1" + resolved "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz" + integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== + +pinkie-promise@^2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz" + integrity sha1-ITXW36ejWMBprJsXh3YogihFD/o= + dependencies: + pinkie "^2.0.0" + +pinkie@^2.0.0: + version "2.0.4" + resolved "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz" + integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA= + +pkg-dir@^4.2.0: + version "4.2.0" + resolved "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz" + integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== + dependencies: + find-up "^4.0.0" + +possible-typed-array-names@^1.0.0: + version "1.1.0" + resolved "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz" + integrity sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg== + +pre-commit@^1.2.2: + version "1.2.2" + resolved "https://registry.npmjs.org/pre-commit/-/pre-commit-1.2.2.tgz" + integrity sha512-qokTiqxD6GjODy5ETAIgzsRgnBWWQHQH2ghy86PU7mIn/wuWeTwF3otyNQZxWBwVn8XNr8Tdzj/QfUXpH+gRZA== + dependencies: + cross-spawn "^5.0.1" + spawn-sync "^1.0.15" + which "1.2.x" + +prelude-ls@^1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz" + integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== + +process-nextick-args@~2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz" + integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== + +process@^0.11.10: + version "0.11.10" + resolved "https://registry.npmjs.org/process/-/process-0.11.10.tgz" + integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI= + +progress@^1.1.8: + version "1.1.8" + resolved "https://registry.npmjs.org/progress/-/progress-1.1.8.tgz" + integrity sha1-4mDHj2Fhzdmw5WzD4Khd4Xx6V74= + +progress@^2.0.3: + version "2.0.3" + resolved "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz" + integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== + +prop-types@^15.6.2, prop-types@^15.8.1: + version "15.8.1" + resolved "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz" + integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== + dependencies: + loose-envify "^1.4.0" + object-assign "^4.1.1" + react-is "^16.13.1" + +proxy-addr@~2.0.7: + version "2.0.7" + resolved "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz" + integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== + dependencies: + forwarded "0.2.0" + ipaddr.js "1.9.1" + +proxy-agent@^6.5.0: + version "6.5.0" + resolved "https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.5.0.tgz" + integrity sha512-TmatMXdr2KlRiA2CyDu8GqR8EjahTG3aY3nXjdzFyoZbmB8hrBsTyMezhULIXKnC0jpfjlmiZ3+EaCzoInSu/A== + dependencies: + agent-base "^7.1.2" + debug "^4.3.4" + http-proxy-agent "^7.0.1" + https-proxy-agent "^7.0.6" + lru-cache "^7.14.1" + pac-proxy-agent "^7.1.0" + proxy-from-env "^1.1.0" + socks-proxy-agent "^8.0.5" + +proxy-from-env@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz" + integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== + +pseudomap@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz" + integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM= + +psl@^1.1.28: + version "1.8.0" + resolved "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz" + integrity sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ== + +pump@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz" + integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +punycode@^2.1.0, punycode@^2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz" + integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== + +puppeteer-core@24.10.2: + version "24.10.2" + resolved "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-24.10.2.tgz" + integrity sha512-CnzhOgrZj8DvkDqI+Yx+9or33i3Y9uUYbKyYpP4C13jWwXx/keQ38RMTMmxuLCWQlxjZrOH0Foq7P2fGP7adDQ== + dependencies: + "@puppeteer/browsers" "2.10.5" + chromium-bidi "5.1.0" + debug "^4.4.1" + devtools-protocol "0.0.1452169" + typed-query-selector "^2.12.0" + ws "^8.18.2" + +puppeteer@^24.10.2: + version "24.10.2" + resolved "https://registry.npmjs.org/puppeteer/-/puppeteer-24.10.2.tgz" + integrity sha512-+k26rCz6akFZntx0hqUoFjCojgOLIxZs6p2k53LmEicwsT8F/FMBKfRfiBw1sitjiCvlR/15K7lBqfjXa251FA== + dependencies: + "@puppeteer/browsers" "2.10.5" + chromium-bidi "5.1.0" + cosmiconfig "^9.0.0" + devtools-protocol "0.0.1452169" + puppeteer-core "24.10.2" + typed-query-selector "^2.12.0" + +qjobs@^1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/qjobs/-/qjobs-1.2.0.tgz" + integrity sha512-8YOJEHtxpySA3fFDyCRxA+UUV+fA+rTWnuWvylOK/NCjhY+b4ocCtmu8TtsWb+mYeU+GCHf/S66KZF/AsteKHg== + +qs@6.13.0: + version "6.13.0" + resolved "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz" + integrity sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg== + dependencies: + side-channel "^1.0.6" + +qs@~6.5.2: + version "6.5.3" + resolved "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz" + integrity sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA== + +randombytes@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz" + integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== + dependencies: + safe-buffer "^5.1.0" + +range-parser@^1.2.1, range-parser@~1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz" + integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== + +raw-body@2.5.2: + version "2.5.2" + resolved "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz" + integrity sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA== + dependencies: + bytes "3.1.2" + http-errors "2.0.0" + iconv-lite "0.4.24" + unpipe "1.0.0" + +react-dom@^16.13.1: + version "16.14.0" + resolved "https://registry.npmjs.org/react-dom/-/react-dom-16.14.0.tgz" + integrity sha512-1gCeQXDLoIqMgqD3IO2Ah9bnf0w9kzhwN5q4FGnHZ67hBm9yePzB5JJAIQCc8x3pFnNlwFq4RidZggNAAkzWWw== + dependencies: + loose-envify "^1.1.0" + object-assign "^4.1.1" + prop-types "^15.6.2" + scheduler "^0.19.1" + +react-frame-component@^5.2.7: + version "5.2.7" + resolved "https://registry.npmjs.org/react-frame-component/-/react-frame-component-5.2.7.tgz" + integrity sha512-ROjHtSLoSVYUBfTieazj/nL8jIX9rZFmHC0yXEU+dx6Y82OcBEGgU9o7VyHMrBFUN9FuQ849MtIPNNLsb4krbg== + +react-is@^16.13.1, react-is@^16.8.6: + version "16.13.1" + resolved "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz" + integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== + +react-test-renderer@^16.13.1: + version "16.14.0" + resolved "https://registry.npmjs.org/react-test-renderer/-/react-test-renderer-16.14.0.tgz" + integrity sha512-L8yPjqPE5CZO6rKsKXRO/rVPiaCOy0tQQJbC+UjPNlobl5mad59lvPjwFsQHTvL03caVDIVr9x9/OSgDe6I5Eg== + dependencies: + object-assign "^4.1.1" + prop-types "^15.6.2" + react-is "^16.8.6" + scheduler "^0.19.1" + +react@^16.13.1: + version "16.14.0" + resolved "https://registry.npmjs.org/react/-/react-16.14.0.tgz" + integrity sha512-0X2CImDkJGApiAlcf0ODKIneSwBPhqJawOa5wCtKbu7ZECrmS26NvtSILynQ66cgkT/RJ4LidJOc3bUESwmU8g== + dependencies: + loose-envify "^1.1.0" + object-assign "^4.1.1" + prop-types "^15.6.2" + +readable-stream@^2.0.1, readable-stream@^2.2.2: + version "2.3.7" + resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz" + integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.1.1" + util-deprecate "~1.0.1" + +readable-stream@^3.0.6: + version "3.6.0" + resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz" + integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + +readdirp@~3.6.0: + version "3.6.0" + resolved "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz" + integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== + dependencies: + picomatch "^2.2.1" + +rechoir@^0.8.0: + version "0.8.0" + resolved "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz" + integrity sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ== + dependencies: + resolve "^1.20.0" + +reflect.getprototypeof@^1.0.6, reflect.getprototypeof@^1.0.9: + version "1.0.10" + resolved "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz" + integrity sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw== + dependencies: + call-bind "^1.0.8" + define-properties "^1.2.1" + es-abstract "^1.23.9" + es-errors "^1.3.0" + es-object-atoms "^1.0.0" + get-intrinsic "^1.2.7" + get-proto "^1.0.1" + which-builtin-type "^1.2.1" + +regenerate-unicode-properties@^10.2.0: + version "10.2.0" + resolved "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.0.tgz" + integrity sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA== + dependencies: + regenerate "^1.4.2" + +regenerate@^1.4.2: + version "1.4.2" + resolved "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz" + integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A== + +regexp.prototype.flags@^1.5.3, regexp.prototype.flags@^1.5.4: + version "1.5.4" + resolved "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz" + integrity sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA== + dependencies: + call-bind "^1.0.8" + define-properties "^1.2.1" + es-errors "^1.3.0" + get-proto "^1.0.1" + gopd "^1.2.0" + set-function-name "^2.0.2" + +regexpu-core@^6.2.0: + version "6.2.0" + resolved "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.2.0.tgz" + integrity sha512-H66BPQMrv+V16t8xtmq+UC0CBpiTBA60V8ibS1QVReIp8T1z8hwFxqcGzm9K6lgsN7sB5edVH8a+ze6Fqm4weA== + dependencies: + regenerate "^1.4.2" + regenerate-unicode-properties "^10.2.0" + regjsgen "^0.8.0" + regjsparser "^0.12.0" + unicode-match-property-ecmascript "^2.0.0" + unicode-match-property-value-ecmascript "^2.1.0" + +regjsgen@^0.8.0: + version "0.8.0" + resolved "https://registry.npmjs.org/regjsgen/-/regjsgen-0.8.0.tgz" + integrity sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q== + +regjsparser@^0.12.0: + version "0.12.0" + resolved "https://registry.npmjs.org/regjsparser/-/regjsparser-0.12.0.tgz" + integrity sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ== + dependencies: + jsesc "~3.0.2" + +request-progress@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/request-progress/-/request-progress-2.0.1.tgz" + integrity sha1-XTa7V5YcZzqlt4jbyBQf3yO0Tgg= + dependencies: + throttleit "^1.0.0" + +request@^2.81.0: + version "2.88.2" + resolved "https://registry.npmjs.org/request/-/request-2.88.2.tgz" + integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw== + dependencies: + aws-sign2 "~0.7.0" + aws4 "^1.8.0" + caseless "~0.12.0" + combined-stream "~1.0.6" + extend "~3.0.2" + forever-agent "~0.6.1" + form-data "~2.3.2" + har-validator "~5.1.3" + http-signature "~1.2.0" + is-typedarray "~1.0.0" + isstream "~0.1.2" + json-stringify-safe "~5.0.1" + mime-types "~2.1.19" + oauth-sign "~0.9.0" + performance-now "^2.1.0" + qs "~6.5.2" + safe-buffer "^5.1.2" + tough-cookie "~2.5.0" + tunnel-agent "^0.6.0" + uuid "^3.3.2" + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz" + integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= + +require-from-string@^2.0.2: + version "2.0.2" + resolved "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz" + integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== + +requires-port@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz" + integrity sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8= + +resolve-cwd@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz" + integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg== + dependencies: + resolve-from "^5.0.0" + +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== + +resolve-from@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz" + integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== + +resolve@^1.14.2, resolve@^1.20.0, resolve@^1.3.3: + version "1.22.6" + resolved "https://registry.npmjs.org/resolve/-/resolve-1.22.6.tgz" + integrity sha512-njhxM7mV12JfufShqGy3Rz8j11RPdLy4xi15UurGJeoHLfJpVXKdh3ueuOqbYUcDZnffr6X739JBo5LzyahEsw== + dependencies: + is-core-module "^2.13.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +resolve@^2.0.0-next.5: + version "2.0.0-next.5" + resolved "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz" + integrity sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA== + dependencies: + is-core-module "^2.13.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +retry@^0.13.1: + version "0.13.1" + resolved "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz" + integrity sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg== + +rfdc@^1.3.0: + version "1.3.0" + resolved "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz" + integrity sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA== + +rimraf@^3.0.0, rimraf@^3.0.2: + version "3.0.2" + resolved "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== + dependencies: + glob "^7.1.3" + +run-applescript@^7.0.0: + version "7.0.0" + resolved "https://registry.npmjs.org/run-applescript/-/run-applescript-7.0.0.tgz" + integrity sha512-9by4Ij99JUr/MCFBUkDKLWK3G9HVXmabKz9U5MlIAIuvuzkiOicRYs8XJLxX+xahD+mLiiCYDqF9dKAgtzKP1A== + +safe-array-concat@^1.1.3: + version "1.1.3" + resolved "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz" + integrity sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q== + dependencies: + call-bind "^1.0.8" + call-bound "^1.0.2" + get-intrinsic "^1.2.6" + has-symbols "^1.1.0" + isarray "^2.0.5" + +safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.2" + resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + +safe-buffer@5.2.1, safe-buffer@>=5.1.0, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.2, safe-buffer@~5.2.0: + version "5.2.1" + resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +safe-push-apply@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz" + integrity sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA== + dependencies: + es-errors "^1.3.0" + isarray "^2.0.5" + +safe-regex-test@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz" + integrity sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw== + dependencies: + call-bound "^1.0.2" + es-errors "^1.3.0" + is-regex "^1.2.1" + +"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: + version "2.1.2" + resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +scheduler@^0.19.1: + version "0.19.1" + resolved "https://registry.npmjs.org/scheduler/-/scheduler-0.19.1.tgz" + integrity sha512-n/zwRWRYSUj0/3g/otKDRPMh6qv2SYMWNq85IEa8iZyAv8od9zDYpGSnpBEjNgcMNq6Scbu5KfIPxNF72R/2EA== + dependencies: + loose-envify "^1.1.0" + object-assign "^4.1.1" + +schema-utils@^4.0.0, schema-utils@^4.2.0, schema-utils@^4.3.0, schema-utils@^4.3.2: + version "4.3.2" + resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.2.tgz" + integrity sha512-Gn/JaSk/Mt9gYubxTtSn/QCV4em9mpAPiR1rqy/Ocu19u/G9J5WWdNoUT4SiV6mFC3y6cxyFcFwdzPM3FgxGAQ== + dependencies: + "@types/json-schema" "^7.0.9" + ajv "^8.9.0" + ajv-formats "^2.1.1" + ajv-keywords "^5.1.0" + +select-hose@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz" + integrity sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo= + +selfsigned@^2.4.1: + version "2.4.1" + resolved "https://registry.npmjs.org/selfsigned/-/selfsigned-2.4.1.tgz" + integrity sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q== + dependencies: + "@types/node-forge" "^1.3.0" + node-forge "^1" + +semver@^5.6.0: + version "5.7.2" + resolved "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz" + integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== + +semver@^6.3.1: + version "6.3.1" + resolved "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz" + integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== + +semver@^7.7.2: + version "7.7.2" + resolved "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz" + integrity sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA== + +send@0.19.0: + version "0.19.0" + resolved "https://registry.npmjs.org/send/-/send-0.19.0.tgz" + integrity sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw== + dependencies: + debug "2.6.9" + depd "2.0.0" + destroy "1.2.0" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + fresh "0.5.2" + http-errors "2.0.0" + mime "1.6.0" + ms "2.1.3" + on-finished "2.4.1" + range-parser "~1.2.1" + statuses "2.0.1" + +serialize-javascript@^6.0.2: + version "6.0.2" + resolved "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz" + integrity sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g== + dependencies: + randombytes "^2.1.0" + +serve-index@^1.9.1: + version "1.9.1" + resolved "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz" + integrity sha1-03aNabHn2C5c4FD/9bRTvqEqkjk= + dependencies: + accepts "~1.3.4" + batch "0.6.1" + debug "2.6.9" + escape-html "~1.0.3" + http-errors "~1.6.2" + mime-types "~2.1.17" + parseurl "~1.3.2" + +serve-static@1.16.2: + version "1.16.2" + resolved "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz" + integrity sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw== + dependencies: + encodeurl "~2.0.0" + escape-html "~1.0.3" + parseurl "~1.3.3" + send "0.19.0" + +set-function-length@^1.2.2: + version "1.2.2" + resolved "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz" + integrity sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg== + dependencies: + define-data-property "^1.1.4" + es-errors "^1.3.0" + function-bind "^1.1.2" + get-intrinsic "^1.2.4" + gopd "^1.0.1" + has-property-descriptors "^1.0.2" + +set-function-name@^2.0.2: + version "2.0.2" + resolved "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz" + integrity sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ== + dependencies: + define-data-property "^1.1.4" + es-errors "^1.3.0" + functions-have-names "^1.2.3" + has-property-descriptors "^1.0.2" + +set-proto@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz" + integrity sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw== + dependencies: + dunder-proto "^1.0.1" + es-errors "^1.3.0" + es-object-atoms "^1.0.0" + +setprototypeof@1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz" + integrity sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ== + +setprototypeof@1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz" + integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== + +shallow-clone@^3.0.0: + version "3.0.1" + resolved "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz" + integrity sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA== + dependencies: + kind-of "^6.0.2" + +shebang-command@^1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz" + integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= + dependencies: + shebang-regex "^1.0.0" + +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + +shebang-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz" + integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +shell-quote@^1.8.1: + version "1.8.3" + resolved "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.3.tgz" + integrity sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw== + +side-channel-list@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz" + integrity sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA== + dependencies: + es-errors "^1.3.0" + object-inspect "^1.13.3" + +side-channel-map@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz" + integrity sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA== + dependencies: + call-bound "^1.0.2" + es-errors "^1.3.0" + get-intrinsic "^1.2.5" + object-inspect "^1.13.3" + +side-channel-weakmap@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz" + integrity sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A== + dependencies: + call-bound "^1.0.2" + es-errors "^1.3.0" + get-intrinsic "^1.2.5" + object-inspect "^1.13.3" + side-channel-map "^1.0.1" + +side-channel@^1.0.6, side-channel@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz" + integrity sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw== + dependencies: + es-errors "^1.3.0" + object-inspect "^1.13.3" + side-channel-list "^1.0.0" + side-channel-map "^1.0.1" + side-channel-weakmap "^1.0.2" + +slash@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz" + integrity sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A== + +smart-buffer@^4.2.0: + version "4.2.0" + resolved "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz" + integrity sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg== + +socket.io-adapter@~2.5.2: + version "2.5.5" + resolved "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.5.tgz" + integrity sha512-eLDQas5dzPgOWCk9GuuJC2lBqItuhKI4uxGgo9aIV7MYbk2h9Q6uULEh8WBzThoI7l+qU9Ast9fVUmkqPP9wYg== + dependencies: + debug "~4.3.4" + ws "~8.17.1" + +socket.io-parser@~4.2.4: + version "4.2.4" + resolved "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.4.tgz" + integrity sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew== + dependencies: + "@socket.io/component-emitter" "~3.1.0" + debug "~4.3.1" + +socket.io@^4.7.2: + version "4.8.1" + resolved "https://registry.npmjs.org/socket.io/-/socket.io-4.8.1.tgz" + integrity sha512-oZ7iUCxph8WYRHHcjBEc9unw3adt5CmSNlppj/5Q4k2RIrhl8Z5yY2Xr4j9zj0+wzVZ0bxmYoGSzKJnRl6A4yg== + dependencies: + accepts "~1.3.4" + base64id "~2.0.0" + cors "~2.8.5" + debug "~4.3.2" + engine.io "~6.6.0" + socket.io-adapter "~2.5.2" + socket.io-parser "~4.2.4" + +sockjs@^0.3.24: + version "0.3.24" + resolved "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz" + integrity sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ== + dependencies: + faye-websocket "^0.11.3" + uuid "^8.3.2" + websocket-driver "^0.7.4" + +socks-proxy-agent@^8.0.5: + version "8.0.5" + resolved "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.5.tgz" + integrity sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw== + dependencies: + agent-base "^7.1.2" + debug "^4.3.4" + socks "^2.8.3" + +socks@^2.8.3: + version "2.8.5" + resolved "https://registry.npmjs.org/socks/-/socks-2.8.5.tgz" + integrity sha512-iF+tNDQla22geJdTyJB1wM/qrX9DMRwWrciEPwWLPRWAUEM8sQiyxgckLxWT1f7+9VabJS0jTGGr4QgBuvi6Ww== + dependencies: + ip-address "^9.0.5" + smart-buffer "^4.2.0" + +source-map-support@~0.5.20: + version "0.5.21" + resolved "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz" + integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: + version "0.6.1" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +spawn-sync@^1.0.15: + version "1.0.15" + resolved "https://registry.npmjs.org/spawn-sync/-/spawn-sync-1.0.15.tgz" + integrity sha1-sAeZVX63+wyDdsKdROih6mfldHY= + dependencies: + concat-stream "^1.4.7" + os-shim "^0.1.2" + +spdy-transport@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz" + integrity sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw== + dependencies: + debug "^4.1.0" + detect-node "^2.0.4" + hpack.js "^2.1.6" + obuf "^1.1.2" + readable-stream "^3.0.6" + wbuf "^1.7.3" + +spdy@^4.0.2: + version "4.0.2" + resolved "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz" + integrity sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA== + dependencies: + debug "^4.1.0" + handle-thing "^2.0.0" + http-deceiver "^1.2.7" + select-hose "^2.0.0" + spdy-transport "^3.0.0" + +sprintf-js@^1.1.3: + version "1.1.3" + resolved "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz" + integrity sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA== + +sshpk@^1.7.0: + version "1.17.0" + resolved "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz" + integrity sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ== + dependencies: + asn1 "~0.2.3" + assert-plus "^1.0.0" + bcrypt-pbkdf "^1.0.0" + dashdash "^1.12.0" + ecc-jsbn "~0.1.1" + getpass "^0.1.1" + jsbn "~0.1.0" + safer-buffer "^2.0.2" + tweetnacl "~0.14.0" + +static-server@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/static-server/-/static-server-3.0.0.tgz" + integrity sha512-eWUwBKKfugQcY80uMSXnu2enueHGZQAXylJeTdVvny5DtMfcvrQL+MjAf/w2BNc0pkI8NoGHINNuDCbDE1eg5Q== + dependencies: + chalk "^0.5.1" + commander "^2.3.0" + file-size "0.0.5" + mime "^1.2.11" + +statuses@2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz" + integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== + +"statuses@>= 1.4.0 < 2", statuses@~1.5.0: + version "1.5.0" + resolved "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz" + integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= + +stop-iteration-iterator@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz" + integrity sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ== + dependencies: + es-errors "^1.3.0" + internal-slot "^1.1.0" + +streamroller@^3.0.8: + version "3.0.8" + resolved "https://registry.npmjs.org/streamroller/-/streamroller-3.0.8.tgz" + integrity sha512-VI+ni3czbFZrd1MrlybxykWZ8sMDCMtTU7YJyhgb9M5X6d1DDxLdJr+gSnmRpXPMnIWxWKMaAE8K0WumBp3lDg== + dependencies: + date-format "^4.0.9" + debug "^4.3.4" + fs-extra "^10.1.0" + +streamx@^2.15.0, streamx@^2.21.0: + version "2.22.1" + resolved "https://registry.npmjs.org/streamx/-/streamx-2.22.1.tgz" + integrity sha512-znKXEBxfatz2GBNK02kRnCXjV+AA4kjZIUxeWSr3UGirZMJfTE9uiwKHobnbgxWyL/JWro8tTq+vOqAK1/qbSA== + dependencies: + fast-fifo "^1.3.2" + text-decoder "^1.1.0" + optionalDependencies: + bare-events "^2.2.0" + +string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: + version "4.2.3" + resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +string.prototype.matchall@^4.0.12: + version "4.0.12" + resolved "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.12.tgz" + integrity sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA== + dependencies: + call-bind "^1.0.8" + call-bound "^1.0.3" + define-properties "^1.2.1" + es-abstract "^1.23.6" + es-errors "^1.3.0" + es-object-atoms "^1.0.0" + get-intrinsic "^1.2.6" + gopd "^1.2.0" + has-symbols "^1.1.0" + internal-slot "^1.1.0" + regexp.prototype.flags "^1.5.3" + set-function-name "^2.0.2" + side-channel "^1.1.0" + +string.prototype.repeat@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz" + integrity sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.5" + +string.prototype.trim@^1.2.10: + version "1.2.10" + resolved "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz" + integrity sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA== + dependencies: + call-bind "^1.0.8" + call-bound "^1.0.2" + define-data-property "^1.1.4" + define-properties "^1.2.1" + es-abstract "^1.23.5" + es-object-atoms "^1.0.0" + has-property-descriptors "^1.0.2" + +string.prototype.trimend@^1.0.9: + version "1.0.9" + resolved "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz" + integrity sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ== + dependencies: + call-bind "^1.0.8" + call-bound "^1.0.2" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" + +string.prototype.trimstart@^1.0.8: + version "1.0.8" + resolved "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz" + integrity sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" + +string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" + +strip-ansi@^0.3.0: + version "0.3.0" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.3.0.tgz" + integrity sha1-JfSOoiynkYfzF0pNuHWTR7sSYiA= + dependencies: + ansi-regex "^0.2.1" + +strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-json-comments@^3.1.1: + version "3.1.1" + resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== + +supports-color@^0.2.0: + version "0.2.0" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-0.2.0.tgz" + integrity sha1-2S3iaU6z9nMjlz1649i1W0wiGQo= + +supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + +supports-color@^8.0.0: + version "8.1.1" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz" + integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== + dependencies: + has-flag "^4.0.0" + +supports-preserve-symlinks-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz" + integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== + +tapable@^2.1.1, tapable@^2.2.0: + version "2.2.1" + resolved "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz" + integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== + +tar-fs@^3.0.8: + version "3.0.10" + resolved "https://registry.npmjs.org/tar-fs/-/tar-fs-3.0.10.tgz" + integrity sha512-C1SwlQGNLe/jPNqapK8epDsXME7CAJR5RL3GcE6KWx1d9OUByzoHVcbu1VPI8tevg9H8Alae0AApHHFGzrD5zA== + dependencies: + pump "^3.0.0" + tar-stream "^3.1.5" + optionalDependencies: + bare-fs "^4.0.1" + bare-path "^3.0.0" + +tar-stream@^3.1.5: + version "3.1.6" + resolved "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.6.tgz" + integrity sha512-B/UyjYwPpMBv+PaFSWAmtYjwdrlEaZQEhMIBFNC5oEG8lpiW8XjcSdmEaClj28ArfKScKHs2nshz3k2le6crsg== + dependencies: + b4a "^1.6.4" + fast-fifo "^1.2.0" + streamx "^2.15.0" + +terser-webpack-plugin@^5.3.11: + version "5.3.14" + resolved "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.14.tgz" + integrity sha512-vkZjpUjb6OMS7dhV+tILUW6BhpDR7P2L/aQSAv+Uwk+m8KATX9EccViHTJR2qDtACKPIYndLGCyl3FMo+r2LMw== + dependencies: + "@jridgewell/trace-mapping" "^0.3.25" + jest-worker "^27.4.5" + schema-utils "^4.3.0" + serialize-javascript "^6.0.2" + terser "^5.31.1" + +terser@^5.31.1: + version "5.43.1" + resolved "https://registry.npmjs.org/terser/-/terser-5.43.1.tgz" + integrity sha512-+6erLbBm0+LROX2sPXlUYx/ux5PyE9K/a92Wrt6oA+WDAoFTdpHE5tCYCI5PNzq2y8df4rA+QgHLJuR4jNymsg== + dependencies: + "@jridgewell/source-map" "^0.3.3" + acorn "^8.14.0" + commander "^2.20.0" + source-map-support "~0.5.20" + +text-decoder@^1.1.0: + version "1.2.3" + resolved "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.3.tgz" + integrity sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA== + dependencies: + b4a "^1.6.4" + +thingies@^1.20.0: + version "1.21.0" + resolved "https://registry.npmjs.org/thingies/-/thingies-1.21.0.tgz" + integrity sha512-hsqsJsFMsV+aD4s3CWKk85ep/3I9XzYV/IXaSouJMYIoDlgyi11cBhsqYe9/geRfB0YIikBQg6raRaM+nIMP9g== + +throttleit@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/throttleit/-/throttleit-1.0.0.tgz" + integrity sha1-nnhYNtr0Z0MUWlmEtiaNgoUorGw= + +thunky@^1.0.2: + version "1.1.0" + resolved "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz" + integrity sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA== + +tmp@^0.2.1: + version "0.2.1" + resolved "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz" + integrity sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ== + dependencies: + rimraf "^3.0.0" + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +toidentifier@1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz" + integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== + +tough-cookie@~2.5.0: + version "2.5.0" + resolved "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz" + integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== + dependencies: + psl "^1.1.28" + punycode "^2.1.1" + +tree-dump@^1.0.1: + version "1.0.3" + resolved "https://registry.npmjs.org/tree-dump/-/tree-dump-1.0.3.tgz" + integrity sha512-il+Cv80yVHFBwokQSfd4bldvr1Md951DpgAGfmhydt04L+YzHgubm2tQ7zueWDcGENKHq0ZvGFR/hjvNXilHEg== + +tslib@^2.0.0, tslib@^2.0.1: + version "2.8.1" + resolved "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz" + integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w== + +tunnel-agent@^0.6.0: + version "0.6.0" + resolved "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz" + integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0= + dependencies: + safe-buffer "^5.0.1" + +tweetnacl@^0.14.3, tweetnacl@~0.14.0: + version "0.14.5" + resolved "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz" + integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= + +type-check@^0.4.0, type-check@~0.4.0: + version "0.4.0" + resolved "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz" + integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== + dependencies: + prelude-ls "^1.2.1" + +type-is@~1.6.18: + version "1.6.18" + resolved "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz" + integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== + dependencies: + media-typer "0.3.0" + mime-types "~2.1.24" + +typed-array-buffer@^1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz" + integrity sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw== + dependencies: + call-bound "^1.0.3" + es-errors "^1.3.0" + is-typed-array "^1.1.14" + +typed-array-byte-length@^1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz" + integrity sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg== + dependencies: + call-bind "^1.0.8" + for-each "^0.3.3" + gopd "^1.2.0" + has-proto "^1.2.0" + is-typed-array "^1.1.14" + +typed-array-byte-offset@^1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz" + integrity sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ== + dependencies: + available-typed-arrays "^1.0.7" + call-bind "^1.0.8" + for-each "^0.3.3" + gopd "^1.2.0" + has-proto "^1.2.0" + is-typed-array "^1.1.15" + reflect.getprototypeof "^1.0.9" + +typed-array-length@^1.0.7: + version "1.0.7" + resolved "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz" + integrity sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg== + dependencies: + call-bind "^1.0.7" + for-each "^0.3.3" + gopd "^1.0.1" + is-typed-array "^1.1.13" + possible-typed-array-names "^1.0.0" + reflect.getprototypeof "^1.0.6" + +typed-query-selector@^2.12.0: + version "2.12.0" + resolved "https://registry.npmjs.org/typed-query-selector/-/typed-query-selector-2.12.0.tgz" + integrity sha512-SbklCd1F0EiZOyPiW192rrHZzZ5sBijB6xM+cpmrwDqObvdtunOHHIk9fCGsoK5JVIYXoyEp4iEdE3upFH3PAg== + +typedarray@^0.0.6: + version "0.0.6" + resolved "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz" + integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= + +typescript@^5.8.3: + version "5.8.3" + resolved "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz" + integrity sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ== + +ua-parser-js@^0.7.30: + version "0.7.40" + resolved "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.40.tgz" + integrity sha512-us1E3K+3jJppDBa3Tl0L3MOJiGhe1C6P0+nIvQAFYbxlMAx0h81eOwLmU57xgqToduDDPx3y5QsdjPfDu+FgOQ== + +unbox-primitive@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz" + integrity sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw== + dependencies: + call-bound "^1.0.3" + has-bigints "^1.0.2" + has-symbols "^1.1.0" + which-boxed-primitive "^1.1.1" + +undici-types@~7.8.0: + version "7.8.0" + resolved "https://registry.npmjs.org/undici-types/-/undici-types-7.8.0.tgz" + integrity sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw== + +unicode-canonical-property-names-ecmascript@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz" + integrity sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ== + +unicode-match-property-ecmascript@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz" + integrity sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q== + dependencies: + unicode-canonical-property-names-ecmascript "^2.0.0" + unicode-property-aliases-ecmascript "^2.0.0" + +unicode-match-property-value-ecmascript@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz" + integrity sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA== + +unicode-property-aliases-ecmascript@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.0.0.tgz" + integrity sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ== + +universalify@^0.1.0: + version "0.1.2" + resolved "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz" + integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== + +universalify@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz" + integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== + +unpipe@1.0.0, unpipe@~1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz" + integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= + +update-browserslist-db@^1.1.3: + version "1.1.3" + resolved "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz" + integrity sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw== + dependencies: + escalade "^3.2.0" + picocolors "^1.1.1" + +uri-js@^4.2.2: + version "4.4.1" + resolved "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== + dependencies: + punycode "^2.1.0" + +util-deprecate@^1.0.1, util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" + integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= + +util@^0.12.5: + version "0.12.5" + resolved "https://registry.npmjs.org/util/-/util-0.12.5.tgz" + integrity sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA== + dependencies: + inherits "^2.0.3" + is-arguments "^1.0.4" + is-generator-function "^1.0.7" + is-typed-array "^1.1.3" + which-typed-array "^1.1.2" + +utils-merge@1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz" + integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= + +uuid@^3.3.2: + version "3.4.0" + resolved "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz" + integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== + +uuid@^8.3.2: + version "8.3.2" + resolved "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz" + integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== + +vary@^1, vary@~1.1.2: + version "1.1.2" + resolved "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz" + integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= + +verror@1.10.0: + version "1.10.0" + resolved "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz" + integrity sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA= + dependencies: + assert-plus "^1.0.0" + core-util-is "1.0.2" + extsprintf "^1.2.0" + +void-elements@^2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz" + integrity sha1-wGavtYK7HLQSjWDqkjkulNXp2+w= + +watchpack@^2.4.1: + version "2.4.4" + resolved "https://registry.npmjs.org/watchpack/-/watchpack-2.4.4.tgz" + integrity sha512-c5EGNOiyxxV5qmTtAB7rbiXxi1ooX1pQKMLX/MIabJjRA0SJBQOjKF+KSVfHkr9U1cADPon0mRiVe/riyaiDUA== + dependencies: + glob-to-regexp "^0.4.1" + graceful-fs "^4.1.2" + +wbuf@^1.1.0, wbuf@^1.7.3: + version "1.7.3" + resolved "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz" + integrity sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA== + dependencies: + minimalistic-assert "^1.0.0" + +webpack-cli@^6.0.1: + version "6.0.1" + resolved "https://registry.npmjs.org/webpack-cli/-/webpack-cli-6.0.1.tgz" + integrity sha512-MfwFQ6SfwinsUVi0rNJm7rHZ31GyTcpVE5pgVA3hwFRb7COD4TzjUUwhGWKfO50+xdc2MQPuEBBJoqIMGt3JDw== + dependencies: + "@discoveryjs/json-ext" "^0.6.1" + "@webpack-cli/configtest" "^3.0.1" + "@webpack-cli/info" "^3.0.1" + "@webpack-cli/serve" "^3.0.1" + colorette "^2.0.14" + commander "^12.1.0" + cross-spawn "^7.0.3" + envinfo "^7.14.0" + fastest-levenshtein "^1.0.12" + import-local "^3.0.2" + interpret "^3.1.1" + rechoir "^0.8.0" + webpack-merge "^6.0.1" + +webpack-dev-middleware@^7.4.2: + version "7.4.2" + resolved "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-7.4.2.tgz" + integrity sha512-xOO8n6eggxnwYpy1NlzUKpvrjfJTvae5/D6WOK0S2LSo7vjmo5gCM1DbLUmFqrMTJP+W/0YZNctm7jasWvLuBA== + dependencies: + colorette "^2.0.10" + memfs "^4.6.0" + mime-types "^2.1.31" + on-finished "^2.4.1" + range-parser "^1.2.1" + schema-utils "^4.0.0" + +webpack-dev-server@^5.2.2: + version "5.2.2" + resolved "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-5.2.2.tgz" + integrity sha512-QcQ72gh8a+7JO63TAx/6XZf/CWhgMzu5m0QirvPfGvptOusAxG12w2+aua1Jkjr7hzaWDnJ2n6JFeexMHI+Zjg== + dependencies: + "@types/bonjour" "^3.5.13" + "@types/connect-history-api-fallback" "^1.5.4" + "@types/express" "^4.17.21" + "@types/express-serve-static-core" "^4.17.21" + "@types/serve-index" "^1.9.4" + "@types/serve-static" "^1.15.5" + "@types/sockjs" "^0.3.36" + "@types/ws" "^8.5.10" + ansi-html-community "^0.0.8" + bonjour-service "^1.2.1" + chokidar "^3.6.0" + colorette "^2.0.10" + compression "^1.7.4" + connect-history-api-fallback "^2.0.0" + express "^4.21.2" + graceful-fs "^4.2.6" + http-proxy-middleware "^2.0.9" + ipaddr.js "^2.1.0" + launch-editor "^2.6.1" + open "^10.0.3" + p-retry "^6.2.0" + schema-utils "^4.2.0" + selfsigned "^2.4.1" + serve-index "^1.9.1" + sockjs "^0.3.24" + spdy "^4.0.2" + webpack-dev-middleware "^7.4.2" + ws "^8.18.0" + +webpack-merge@^4.1.5: + version "4.2.2" + resolved "https://registry.npmjs.org/webpack-merge/-/webpack-merge-4.2.2.tgz" + integrity sha512-TUE1UGoTX2Cd42j3krGYqObZbOD+xF7u28WB7tfUordytSjbWTIjK/8V0amkBfTYN4/pB/GIDlJZZ657BGG19g== + dependencies: + lodash "^4.17.15" + +webpack-merge@^6.0.1: + version "6.0.1" + resolved "https://registry.npmjs.org/webpack-merge/-/webpack-merge-6.0.1.tgz" + integrity sha512-hXXvrjtx2PLYx4qruKl+kyRSLc52V+cCvMxRjmKwoA+CBbbF5GfIBtR6kCvl0fYGqTUPKB+1ktVmTHqMOzgCBg== + dependencies: + clone-deep "^4.0.1" + flat "^5.0.2" + wildcard "^2.0.1" + +webpack-sources@^3.2.3: + version "3.2.3" + resolved "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz" + integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w== + +webpack@^5.99.9: + version "5.99.9" + resolved "https://registry.npmjs.org/webpack/-/webpack-5.99.9.tgz" + integrity sha512-brOPwM3JnmOa+7kd3NsmOUOwbDAj8FT9xDsG3IW0MgbN9yZV7Oi/s/+MNQ/EcSMqw7qfoRyXPoeEWT8zLVdVGg== + dependencies: + "@types/eslint-scope" "^3.7.7" + "@types/estree" "^1.0.6" + "@types/json-schema" "^7.0.15" + "@webassemblyjs/ast" "^1.14.1" + "@webassemblyjs/wasm-edit" "^1.14.1" + "@webassemblyjs/wasm-parser" "^1.14.1" + acorn "^8.14.0" + browserslist "^4.24.0" + chrome-trace-event "^1.0.2" + enhanced-resolve "^5.17.1" + es-module-lexer "^1.2.1" + eslint-scope "5.1.1" + events "^3.2.0" + glob-to-regexp "^0.4.1" + graceful-fs "^4.2.11" + json-parse-even-better-errors "^2.3.1" + loader-runner "^4.2.0" + mime-types "^2.1.27" + neo-async "^2.6.2" + schema-utils "^4.3.2" + tapable "^2.1.1" + terser-webpack-plugin "^5.3.11" + watchpack "^2.4.1" + webpack-sources "^3.2.3" + +websocket-driver@>=0.5.1, websocket-driver@^0.7.4: + version "0.7.4" + resolved "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz" + integrity sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg== + dependencies: + http-parser-js ">=0.5.1" + safe-buffer ">=5.1.0" + websocket-extensions ">=0.1.1" + +websocket-extensions@>=0.1.1: + version "0.1.4" + resolved "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz" + integrity sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg== + +which-boxed-primitive@^1.1.0, which-boxed-primitive@^1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz" + integrity sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA== + dependencies: + is-bigint "^1.1.0" + is-boolean-object "^1.2.1" + is-number-object "^1.1.1" + is-string "^1.1.1" + is-symbol "^1.1.1" + +which-builtin-type@^1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz" + integrity sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q== + dependencies: + call-bound "^1.0.2" + function.prototype.name "^1.1.6" + has-tostringtag "^1.0.2" + is-async-function "^2.0.0" + is-date-object "^1.1.0" + is-finalizationregistry "^1.1.0" + is-generator-function "^1.0.10" + is-regex "^1.2.1" + is-weakref "^1.0.2" + isarray "^2.0.5" + which-boxed-primitive "^1.1.0" + which-collection "^1.0.2" + which-typed-array "^1.1.16" + +which-collection@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz" + integrity sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw== + dependencies: + is-map "^2.0.3" + is-set "^2.0.3" + is-weakmap "^2.0.2" + is-weakset "^2.0.3" + +which-typed-array@^1.1.16, which-typed-array@^1.1.19, which-typed-array@^1.1.2: + version "1.1.19" + resolved "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.19.tgz" + integrity sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw== + dependencies: + available-typed-arrays "^1.0.7" + call-bind "^1.0.8" + call-bound "^1.0.4" + for-each "^0.3.5" + get-proto "^1.0.1" + gopd "^1.2.0" + has-tostringtag "^1.0.2" + +which@1.2.x: + version "1.2.14" + resolved "https://registry.npmjs.org/which/-/which-1.2.14.tgz" + integrity sha1-mofEN48D6CfOyvGs31bHNsAcFOU= + dependencies: + isexe "^2.0.0" + +which@^1.2.1, which@^1.2.10, which@^1.2.9: + version "1.3.1" + resolved "https://registry.npmjs.org/which/-/which-1.3.1.tgz" + integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== + dependencies: + isexe "^2.0.0" + +which@^2.0.1: + version "2.0.2" + resolved "https://registry.npmjs.org/which/-/which-2.0.2.tgz" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +which@^3.0.0: + version "3.0.1" + resolved "https://registry.npmjs.org/which/-/which-3.0.1.tgz" + integrity sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg== + dependencies: + isexe "^2.0.0" + +wildcard@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz" + integrity sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ== + +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrappy@1: + version "1.0.2" + resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" + integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= + +ws@^8.18.0, ws@^8.18.2: + version "8.18.2" + resolved "https://registry.npmjs.org/ws/-/ws-8.18.2.tgz" + integrity sha512-DMricUmwGZUVr++AEAe2uiVM7UoO9MAVZMDu05UQOaUII0lp+zOzLLU4Xqh/JvTqklB1T4uELaaPBKyjE1r4fQ== + +ws@~8.17.1: + version "8.17.1" + resolved "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz" + integrity sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ== + +y18n@^5.0.5: + version "5.0.8" + resolved "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz" + integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== + +yallist@^2.1.2: + version "2.1.2" + resolved "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz" + integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI= + +yallist@^3.0.2: + version "3.1.1" + resolved "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz" + integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== + +yargs-parser@^20.2.2: + version "20.2.9" + resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz" + integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== + +yargs-parser@^21.1.1: + version "21.1.1" + resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz" + integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== + +yargs@^16.1.1: + version "16.2.0" + resolved "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz" + integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== + dependencies: + cliui "^7.0.2" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.0" + y18n "^5.0.5" + yargs-parser "^20.2.2" + +yargs@^17.7.2: + version "17.7.2" + resolved "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz" + integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== + dependencies: + cliui "^8.0.1" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.3" + y18n "^5.0.5" + yargs-parser "^21.1.1" + +yauzl@^2.10.0: + version "2.10.0" + resolved "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz" + integrity sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk= + dependencies: + buffer-crc32 "~0.2.3" + fd-slicer "~1.1.0" + +yocto-queue@^0.1.0: + version "0.1.0" + resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz" + integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== + +zod@^3.24.1: + version "3.25.67" + resolved "https://registry.npmjs.org/zod/-/zod-3.25.67.tgz" + integrity sha512-idA2YXwpCdqUSKRCACDE6ItZD9TZzy3OZMtpfLoh6oPR47lipysRrJfjzMqFxQ3uJuUPyUeWe1r9vLH33xO/Qw==