From 6618f76c646311467d9c64bcfb209b8eca25d90d Mon Sep 17 00:00:00 2001 From: Samuel Reed Date: Thu, 28 May 2026 14:16:57 -0400 Subject: [PATCH 1/5] refactor: migrate source from Flow to TypeScript Convert lib/*.js (Flow) to TypeScript (.ts/.tsx) and replace the Babel+Flow toolchain with tsup (CJS+ESM+auto-generated .d.ts), keeping webpack for the UMD bundle. Types are now generated from source instead of hand-maintained in typings/index.d.ts, eliminating Flow/TS drift. Public API is unchanged (minor-version-safe): CJS keeps module.exports===Draggable plus .default and .DraggableCore (PR #254/#266); UMD bundle still exposes global ReactDraggable with react/react-dom externals; generated .d.ts matches the previously-shipped surface and the unchanged typings/test.tsx compiles against it. DraggableCore children stays React.ReactNode in the public types (the internal Flow type was ReactElement) with a regression guard in test/typeCompat. Adds tsup.config.ts, root tsconfig.json, eslint @typescript-eslint, native-TS vitest, and extra unit tests (198 pass, up from 131). No version bump or CHANGELOG change. --- .babelrc.js | 19 - .flowconfig | 11 - Makefile | 17 +- eslint.config.mjs | 30 +- lib/{Draggable.js => Draggable.tsx} | 68 +- lib/{DraggableCore.js => DraggableCore.tsx} | 92 +- lib/cjs.js | 8 - lib/cjs.ts | 78 + lib/umd.ts | 26 + lib/utils/{domFns.js => domFns.ts} | 98 +- lib/utils/{getPrefix.js => getPrefix.ts} | 3 +- lib/utils/{log.js => log.ts} | 3 +- lib/utils/{positionFns.js => positionFns.ts} | 10 +- lib/utils/{shims.js => shims.ts} | 13 +- lib/utils/{types.js => types.ts} | 19 +- package.json | 31 +- test/typeCompat.test.ts | 70 + test/typeCompat/fixture.tsx | 193 ++ test/typeCompat/tsconfig.json | 19 + test/utils/domFns.extra.test.js | 248 +++ test/utils/getPrefix.extra.test.js | 72 + test/utils/positionFns.bounds.test.js | 199 ++ test/utils/shims.extra.test.js | 95 + tsconfig.json | 22 + tsup.config.ts | 60 + typings/index.d.ts | 66 - typings/tsconfig.json | 4 +- vitest.config.js | 19 +- webpack.config.js | 20 +- yarn.lock | 1714 ++++++++---------- 30 files changed, 2063 insertions(+), 1264 deletions(-) delete mode 100644 .babelrc.js delete mode 100644 .flowconfig rename lib/{Draggable.js => Draggable.tsx} (82%) rename lib/{DraggableCore.js => DraggableCore.tsx} (83%) delete mode 100644 lib/cjs.js create mode 100644 lib/cjs.ts create mode 100644 lib/umd.ts rename lib/utils/{domFns.js => domFns.ts} (67%) rename lib/utils/{getPrefix.js => getPrefix.ts} (96%) rename lib/utils/{log.js => log.ts} (59%) rename lib/utils/{positionFns.js => positionFns.ts} (93%) rename lib/utils/{shims.js => shims.ts} (59%) rename lib/utils/{types.js => types.ts} (52%) create mode 100644 test/typeCompat.test.ts create mode 100644 test/typeCompat/fixture.tsx create mode 100644 test/typeCompat/tsconfig.json create mode 100644 test/utils/domFns.extra.test.js create mode 100644 test/utils/getPrefix.extra.test.js create mode 100644 test/utils/positionFns.bounds.test.js create mode 100644 test/utils/shims.extra.test.js create mode 100644 tsconfig.json create mode 100644 tsup.config.ts delete mode 100644 typings/index.d.ts diff --git a/.babelrc.js b/.babelrc.js deleted file mode 100644 index 1d936d79..00000000 --- a/.babelrc.js +++ /dev/null @@ -1,19 +0,0 @@ -'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/.flowconfig b/.flowconfig deleted file mode 100644 index 386b3433..00000000 --- a/.flowconfig +++ /dev/null @@ -1,11 +0,0 @@ -[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/Makefile b/Makefile index bc3b2148..1c367ab4 100644 --- a/Makefile +++ b/Makefile @@ -4,7 +4,7 @@ # 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 +.PHONY: test dev lint build build-lib build-web clean install link publish .DEFAULT_GOAL := build clean: @@ -12,16 +12,19 @@ clean: mkdir -p build lint: - @$(BIN)/flow - @$(BIN)/eslint lib/* lib/utils/* + @$(BIN)/eslint lib + @$(BIN)/tsc --noEmit @$(BIN)/tsc -p typings -build: clean build-cjs build-esm build-web +# tsup emits cjs + esm + dts into build/cjs (and rewrites build/cjs/cjs.js to the +# legacy module.exports === Draggable shape). webpack emits the UMD global bundle. +# Both depend on `clean` so the dir is reset first even under parallel make (-j). +build: build-lib build-web -build-cjs: $(BIN) - $(BIN)/babel --out-dir ./build/cjs ./lib +build-lib: clean $(BIN) + $(BIN)/tsup -build-web: $(BIN) +build-web: clean $(BIN) $(BIN)/webpack --mode=production # Allows usage of `make install`, `make link` diff --git a/eslint.config.mjs b/eslint.config.mjs index 11cf50d9..2cca2d1e 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -1,7 +1,8 @@ import { defineConfig, globalIgnores } from "eslint/config"; import react from "eslint-plugin-react"; import globals from "globals"; -import babelParser from "@babel/eslint-parser"; +import tsParser from "@typescript-eslint/parser"; +import tsPlugin from "@typescript-eslint/eslint-plugin"; import path from "node:path"; import { fileURLToPath } from "node:url"; import js from "@eslint/js"; @@ -15,29 +16,34 @@ const compat = new FlatCompat({ allConfig: js.configs.all }); -export default defineConfig([globalIgnores(["build/**/*.js"]), { +export default defineConfig([globalIgnores(["build/**"]), { + files: ["lib/**/*.{ts,tsx}"], + extends: compat.extends("eslint:recommended"), plugins: { react, + "@typescript-eslint": tsPlugin, }, languageOptions: { globals: { ...globals.browser, ...globals.node, - ReactElement: null, - ReactClass: null, - $Exact: null, - Partial: null, - $Keys: null, - MouseTouchEvent: null, }, - parser: babelParser, + parser: tsParser, + parserOptions: { + ecmaFeatures: { + jsx: true, + }, + project: "./tsconfig.json", + }, }, rules: { + ...tsPlugin.configs.recommended.rules, + strict: 0, quotes: [1, "single"], curly: [1, "multi-line"], @@ -47,7 +53,9 @@ export default defineConfig([globalIgnores(["build/**/*.js"]), { "no-use-before-define": [1, "nofunc"], "no-underscore-dangle": 0, - "no-unused-vars": [1, { + // Use the TS-aware unused-vars rule; disable the base rule it supersedes. + "no-unused-vars": 0, + "@typescript-eslint/no-unused-vars": [1, { ignoreRestSiblings: true, }], @@ -55,4 +63,4 @@ export default defineConfig([globalIgnores(["build/**/*.js"]), { "prefer-const": 1, semi: 1, }, -}]); \ No newline at end of file +}]); diff --git a/lib/Draggable.js b/lib/Draggable.tsx similarity index 82% rename from lib/Draggable.js rename to lib/Draggable.tsx index 47968374..e64c7c13 100644 --- a/lib/Draggable.js +++ b/lib/Draggable.tsx @@ -1,4 +1,3 @@ -// @flow import * as React from 'react'; import PropTypes from 'prop-types'; import ReactDOM from 'react-dom'; @@ -10,7 +9,7 @@ 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'; +import type {ReactElement} from 'react'; type DraggableState = { dragging: boolean, @@ -18,11 +17,10 @@ type DraggableState = { x: number, y: number, slackX: number, slackY: number, isElementSVG: boolean, - prevPropsPosition: ?ControlPosition, + prevPropsPosition: ControlPosition | null, }; -export type DraggableDefaultProps = { - ...DraggableCoreDefaultProps, +export type DraggableDefaultProps = DraggableCoreDefaultProps & { axis: 'both' | 'x' | 'y' | 'none', bounds: Bounds | string | false, defaultClassName: string, @@ -32,9 +30,7 @@ export type DraggableDefaultProps = { scale: number, }; -export type DraggableProps = { - ...DraggableCoreProps, - ...DraggableDefaultProps, +export type DraggableProps = DraggableCoreProps & DraggableDefaultProps & { positionOffset: PositionOffsetControlPosition, position: ControlPosition, }; @@ -43,11 +39,19 @@ export type DraggableProps = { // Define // -class Draggable extends React.Component { +// Public-facing prop shape: every prop is optional for consumers because the +// required ones are supplied by `defaultProps`. This reproduces the historical +// hand-written declaration `React.Component, {}>` so the +// auto-generated .d.ts stays API-compatible with the old typings. +class Draggable extends React.Component, DraggableState> { - static displayName: ?string = 'Draggable'; + // Internally, defaultProps guarantees every prop is present at runtime, so we + // narrow `this.props` back to the fully-resolved type for type-safe access. + declare props: DraggableProps; - static propTypes: DraggableProps = { + static displayName?: string = 'Draggable'; + + static propTypes = { // Accepts all props accepts. ...DraggableCore.propTypes, @@ -166,7 +170,11 @@ class Draggable extends React.Component { transform: dontSetMe }; - static defaultProps: DraggableDefaultProps = { + // Typed as the full `DraggableProps` (not just the default-provided subset) so + // React's JSX LibraryManagedAttributes treats EVERY prop as optional for + // consumers, matching the historical hand-written typings. At runtime only the + // default-able props are actually populated. + static defaultProps: DraggableProps = { ...DraggableCore.defaultProps, axis: 'both', bounds: false, @@ -175,11 +183,11 @@ class Draggable extends React.Component { defaultClassNameDragged: 'react-draggable-dragged', defaultPosition: {x: 0, y: 0}, scale: 1 - }; + } as unknown as DraggableProps; // React 16.3+ // Arity (props, state) - static getDerivedStateFromProps({position}: DraggableProps, {prevPropsPosition}: DraggableState): ?Partial { + static getDerivedStateFromProps({position}: DraggableProps, {prevPropsPosition}: DraggableState): Partial | null { // Set x/y if a new position is provided in props that is different than the previous. if ( position && @@ -243,13 +251,17 @@ class Draggable extends React.Component { // React 19 removed ReactDOM.findDOMNode, so nodeRef is now required. // For backward compatibility with React 18 and earlier, we still support findDOMNode if available. - findDOMNode(): ?HTMLElement { + findDOMNode(): HTMLElement | null { if (this.props?.nodeRef) { return this.props.nodeRef.current; } - // ReactDOM.findDOMNode was removed in React 19 - if (typeof ReactDOM.findDOMNode === 'function') { - return ReactDOM.findDOMNode(this); + // ReactDOM.findDOMNode was removed from React 19's type defs (and runtime), + // so access it dynamically to stay compatible with React 18 and earlier. + const legacyReactDOM = ReactDOM as unknown as { + findDOMNode?: (instance: unknown) => HTMLElement | null; + }; + if (typeof legacyReactDOM.findDOMNode === 'function') { + return legacyReactDOM.findDOMNode(this) as HTMLElement | null; } return null; } @@ -336,10 +348,10 @@ class Draggable extends React.Component { newState.y = y; } - this.setState(newState); + this.setState(newState as Pick); }; - render(): ReactElement { + render(): ReactElement { const { axis, bounds, @@ -385,8 +397,16 @@ class Draggable extends React.Component { style = createCSSTransform(transformOpts, positionOffset); } + // React.Children.only types its return as ReactElement; narrow the + // single child to an element carrying optional DOM style/className props so + // we can read and merge them. + const onlyChild = React.Children.only(children) as ReactElement<{ + className?: string, + style?: React.CSSProperties, + }>; + // Mark with class while dragging - const className = clsx((children.props.className || ''), defaultClassName, { + const className = clsx((onlyChild.props.className || ''), defaultClassName, { [defaultClassNameDragging]: this.state.dragging, [defaultClassNameDragged]: this.state.dragged }); @@ -395,11 +415,11 @@ class Draggable extends React.Component { // This makes it flexible to use whatever element is wanted (div, ul, etc) return ( - {React.cloneElement(React.Children.only(children), { + {React.cloneElement(onlyChild, { className: className, - style: {...children.props.style, ...style}, + style: {...onlyChild.props.style, ...style}, transform: svgTransform - })} + } as Partial<{className: string, style: React.CSSProperties, transform: string | null}>)} ); } diff --git a/lib/DraggableCore.js b/lib/DraggableCore.tsx similarity index 83% rename from lib/DraggableCore.js rename to lib/DraggableCore.tsx index 505be625..4aaf3986 100644 --- a/lib/DraggableCore.js +++ b/lib/DraggableCore.tsx @@ -1,4 +1,3 @@ -// @flow import * as React from 'react'; import PropTypes from 'prop-types'; import ReactDOM from 'react-dom'; @@ -9,7 +8,10 @@ import {dontSetMe} from './utils/shims'; import log from './utils/log'; import type {EventHandler, MouseTouchEvent} from './utils/types'; -import type {Element as ReactElement} from 'react'; + +// Re-export shared types so existing imports from './DraggableCore' keep working. +export type {DraggableData, DraggableEventHandler, ControlPosition, PositionOffsetControlPosition} from './utils/types'; +import type {DraggableEventHandler} from './utils/types'; // Simple abstraction for dragging events names. const eventsFor = { @@ -28,18 +30,6 @@ const eventsFor = { // 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, @@ -52,14 +42,16 @@ export type DraggableCoreDefaultProps = { scale: number, }; -export type DraggableCoreProps = { - ...DraggableCoreDefaultProps, +export type DraggableCoreProps = DraggableCoreDefaultProps & { cancel: string, - children: ReactElement, + // Public type stays React.ReactNode for backward compatibility with the + // hand-written typings shipped through v4.5.0. At runtime React.Children.only + // still requires exactly one element (enforced in render()). + children?: React.ReactNode, offsetParent: HTMLElement, grid: [number, number], handle: string, - nodeRef?: ?React.ElementRef, + nodeRef?: React.RefObject | null, }; // @@ -69,11 +61,19 @@ export type DraggableCoreProps = { // work well with libraries that require more control over the element. // -export default class DraggableCore extends React.Component { +// Public-facing prop shape: every prop is optional for consumers because the +// required ones are supplied by `defaultProps`. This reproduces the historical +// hand-written declaration `React.Component, {}>` +// so the auto-generated .d.ts stays API-compatible with the old typings. +export default class DraggableCore extends React.Component> { + + // Internally, defaultProps guarantees every prop is present at runtime, so we + // narrow `this.props` back to the fully-resolved type for type-safe access. + declare props: DraggableCoreProps; - static displayName: ?string = 'DraggableCore'; + static displayName: string | undefined = 'DraggableCore'; - static propTypes: Object = { + static propTypes: {[key: string]: unknown} = { /** * `allowAnyClick` allows dragging using any mouse button. * By default, we only accept the left button. @@ -110,8 +110,8 @@ export default class DraggableCore extends React.Component { * `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) { + offsetParent: function(props: DraggableCoreProps, propName: keyof DraggableCoreProps) { + if (props[propName] && (props[propName] as HTMLElement).nodeType !== 1) { throw new Error('Draggable\'s offsetParent must be a DOM Node.'); } }, @@ -221,7 +221,11 @@ export default class DraggableCore extends React.Component { transform: dontSetMe }; - static defaultProps: DraggableCoreDefaultProps = { + // Typed as the full `DraggableCoreProps` (not just the default-provided subset) + // so React's JSX LibraryManagedAttributes treats EVERY prop as optional for + // consumers, matching the historical hand-written typings. At runtime only the + // default-able props are actually populated. + static defaultProps: DraggableCoreProps = { allowAnyClick: false, // by default only accept left click allowMobileScroll: false, disabled: false, @@ -231,7 +235,7 @@ export default class DraggableCore extends React.Component { onStop: function(){}, onMouseDown: function(){}, scale: 1, - }; + } as unknown as DraggableCoreProps; dragging: boolean = false; @@ -239,7 +243,7 @@ export default class DraggableCore extends React.Component { lastX: number = NaN; lastY: number = NaN; - touchIdentifier: ?number = null; + touchIdentifier: number | null | undefined = null; mounted: boolean = false; @@ -271,13 +275,14 @@ export default class DraggableCore extends React.Component { // React 19 removed ReactDOM.findDOMNode, so nodeRef is now required. // For backward compatibility with React 18 and earlier, we still support findDOMNode if available. - findDOMNode(): ?HTMLElement { + findDOMNode(): HTMLElement | null { if (this.props?.nodeRef) { return this.props.nodeRef.current; } // ReactDOM.findDOMNode was removed in React 19 - if (typeof ReactDOM.findDOMNode === 'function') { - return ReactDOM.findDOMNode(this); + const legacyReactDOM = ReactDOM as unknown as {findDOMNode?: (instance: React.Component) => HTMLElement | null}; + if (typeof legacyReactDOM.findDOMNode === 'function') { + return legacyReactDOM.findDOMNode(this); } // In React 19+, nodeRef is required - log a warning via our log utility log( @@ -303,9 +308,9 @@ export default class DraggableCore extends React.Component { // 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))) { + (!(e.target instanceof (ownerDocument.defaultView as Window & typeof globalThis).Node)) || + (this.props.handle && !matchesSelectorAndParentsTo(e.target as Node, this.props.handle, thisNode)) || + (this.props.cancel && matchesSelectorAndParentsTo(e.target as Node, this.props.cancel, thisNode))) { return; } @@ -364,7 +369,8 @@ export default class DraggableCore extends React.Component { 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; + x = this.lastX + deltaX; + y = this.lastY + deltaY; } const coreEvent = createCoreData(this, x, y); @@ -375,13 +381,11 @@ export default class DraggableCore extends React.Component { const shouldUpdate = this.props.onDrag(e, coreEvent); if (shouldUpdate === false || this.mounted === false) { try { - // $FlowIgnore - this.handleDragStop(new MouseEvent('mouseup')); - } catch (err) { + this.handleDragStop(new MouseEvent('mouseup') as MouseTouchEvent); + } catch { // Old browsers - const event = ((document.createEvent('MouseEvents'): any): MouseTouchEvent); + const event = document.createEvent('MouseEvents') as unknown as 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); } @@ -404,7 +408,8 @@ export default class DraggableCore extends React.Component { 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; + x = this.lastX + deltaX; + y = this.lastY + deltaY; } const coreEvent = createCoreData(this, x, y); @@ -461,10 +466,13 @@ export default class DraggableCore extends React.Component { return this.handleDragStop(e); }; - render(): React.Element { + render(): React.ReactElement { // 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), { + // children is typed as ReactNode for public-API compatibility; Children.only + // throws at runtime unless it is exactly one element, so the cast is safe. + // eslint-disable-next-line @typescript-eslint/no-explicit-any + return React.cloneElement(React.Children.only(this.props.children) as React.ReactElement, { // 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, @@ -473,6 +481,6 @@ export default class DraggableCore extends React.Component { // {passive: false}, which allows it to cancel. See // https://developers.google.com/web/updates/2017/01/scrolling-intervention onTouchEnd: this.onTouchEnd - }); + } as React.Attributes); } } diff --git a/lib/cjs.js b/lib/cjs.js deleted file mode 100644 index 7b560bb0..00000000 --- a/lib/cjs.js +++ /dev/null @@ -1,8 +0,0 @@ -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/cjs.ts b/lib/cjs.ts new file mode 100644 index 00000000..8886559f --- /dev/null +++ b/lib/cjs.ts @@ -0,0 +1,78 @@ +// Package entry point. +// +// This re-exports as the *default* export and as a +// named export. That is the correct shape for the ESM (`module`) build and for +// the auto-generated TypeScript declaration. +// +// ────────────────────────────────────────────────────────────────────────── +// CRITICAL CJS COMPAT CONTRACT — read before changing the build (contract #1): +// +// Historically (PR #254, issue #266) the *root* CJS export of this package IS +// the Draggable class itself, not a namespace object. All three of these access +// patterns are part of the public contract and MUST keep working in the +// CommonJS artifact (build/cjs): +// +// const Draggable = require('react-draggable'); // === Draggable class +// const Draggable = require('react-draggable').default; // === Draggable class +// const { DraggableCore } = require('react-draggable'); // === DraggableCore class +// +// i.e. the built CJS file must satisfy at runtime: +// module.exports === Draggable +// module.exports.default === Draggable +// module.exports.DraggableCore === DraggableCore +// +// A naive ESM `export default Draggable` compiled to CJS produces +// `exports.default = Draggable` but does NOT make `module.exports === Draggable`, +// which BREAKS every existing `require('react-draggable')` consumer. +// +// The BUILD PHASE owns the final reconciliation. tsup/tsc will likely NOT +// reproduce `module.exports === Draggable` from the ESM re-exports below, so the +// CJS output must be patched to the legacy shape — either via a hand-written CJS +// interop entry equivalent to the old lib/cjs.js: +// +// const { default: Draggable, DraggableCore } = require('./Draggable'); +// module.exports = Draggable; +// module.exports.default = Draggable; +// module.exports.DraggableCore = DraggableCore; +// +// or a tsup footer/onSuccess step that rewrites module.exports accordingly. +// Verify with a runtime `require()` assertion that all three identities above +// hold before shipping. +// +// References: +// https://github.com/mzabriskie/react-draggable/pull/254 +// https://github.com/mzabriskie/react-draggable/issues/266 +// ────────────────────────────────────────────────────────────────────────── + +import Draggable, {DraggableCore} from './Draggable'; + +export default Draggable; +export {DraggableCore}; + +// Re-export the public type surface so the auto-generated declaration is +// API-compatible with the historical hand-written typings/index.d.ts. The old +// typings exposed these names; consumers `import type { ... } from 'react-draggable'`. +export type {DraggableProps} from './Draggable'; +export type { + DraggableCoreProps, + DraggableData, + DraggableEventHandler, + ControlPosition, + PositionOffsetControlPosition, +} from './DraggableCore'; +// `DraggableBounds` was the public name for the internal `Bounds` type. +export type {Bounds as DraggableBounds} from './utils/types'; + +// `DraggableEvent` is the PUBLIC event type. Historically (typings/index.d.ts) it +// was the broad UNION of the React synthetic and native DOM mouse/touch events a +// consumer might receive — NOT the internal `MouseTouchEvent` (which is the +// `MouseEvent & TouchEvent` intersection the handlers use for convenient field +// access). Aliasing the public type to the intersection would be an API break: +// none of the old union members are assignable to the intersection. Keep the +// union to preserve compatibility. +import type * as React from 'react'; +export type DraggableEvent = + | React.MouseEvent + | React.TouchEvent + | MouseEvent + | TouchEvent; diff --git a/lib/umd.ts b/lib/umd.ts new file mode 100644 index 00000000..a79e421f --- /dev/null +++ b/lib/umd.ts @@ -0,0 +1,26 @@ +// UMD / global build entry (webpack only — see webpack.config.js). +// +// This file exists SEPARATELY from cjs.ts because the UMD global contract +// (contract #2) requires the root global to BE the Draggable class: +// +// window.ReactDraggable === Draggable +// window.ReactDraggable.default === Draggable +// window.ReactDraggable.DraggableCore === DraggableCore +// +// Webpack wraps whatever this module assigns to `module.exports` in the UMD +// boilerplate, so we assign the Draggable class directly (CommonJS style) to +// reproduce the legacy root-is-Draggable shape. Written with CommonJS +// require/module.exports (not ESM import/export) so webpack keeps it a CJS +// module and does not reject the `module.exports =` assignment. +// +// cjs.ts keeps the modern default+named ESM shape for the tsup cjs/esm/dts +// artifacts; this file is consumed only by webpack and is excluded from tsup. + +/* eslint-disable @typescript-eslint/no-require-imports, @typescript-eslint/no-explicit-any */ +const {default: Draggable, DraggableCore} = require('./Draggable') as typeof import('./Draggable'); + +const root = Draggable as any; +root.default = Draggable; +root.DraggableCore = DraggableCore; + +module.exports = root; diff --git a/lib/utils/domFns.js b/lib/utils/domFns.ts similarity index 67% rename from lib/utils/domFns.js rename to lib/utils/domFns.ts index 3744af01..9a4ccf9d 100644 --- a/lib/utils/domFns.js +++ b/lib/utils/domFns.ts @@ -1,9 +1,16 @@ -// @flow import {findInArray, isFunction, int} from './shims'; import browserPrefix, {browserPrefixToKey} from './getPrefix'; import type {ControlPosition, PositionOffsetControlPosition, MouseTouchEvent} from './types'; +type Indexable = {[key: string]: unknown}; + +// Drag handlers receive a more specific event type (MouseTouchEvent) than the +// DOM's `EventListener` (which takes a base `Event`). We accept any such handler +// and cast to `EventListener` only at the addEventListener/removeEventListener +// boundary, mirroring the old permissive `Function` parameter type. +type EventListenerLike = (event: never) => void | false; + let matchesSelectorFunc = ''; export function matchesSelector(el: Node, selector: string): boolean { if (!matchesSelectorFunc) { @@ -14,57 +21,67 @@ export function matchesSelector(el: Node, selector: string): boolean { 'msMatchesSelector', 'oMatchesSelector' ], function(method){ - // $FlowIgnore: Doesn't think elements are indexable - return isFunction(el[method]); - }); + // Doesn't think elements are indexable + return isFunction((el as unknown as Indexable)[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; + // Doesn't think elements are indexable + const matchFn = (el as unknown as Indexable)[matchesSelectorFunc]; + if (!isFunction(matchFn)) return false; - // $FlowIgnore: Doesn't think elements are indexable - return el[matchesSelectorFunc](selector); + // Doesn't think elements are indexable + return Boolean(matchFn.call(el, 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; + let node: Node | null = 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 { +export function addEvent( + el: Node | null | undefined, + event: string, + handler: EventListenerLike, + inputOptions?: AddEventListenerOptions +): void { if (!el) return; const options = {capture: true, ...inputOptions}; - // $FlowIgnore[method-unbinding] + const listener = handler as EventListener; if (el.addEventListener) { - el.addEventListener(event, handler, options); - } else if (el.attachEvent) { - el.attachEvent('on' + event, handler); + el.addEventListener(event, listener, options); + } else if ((el as unknown as Indexable).attachEvent) { + (el as unknown as {attachEvent(name: string, handler: EventListener): void}).attachEvent('on' + event, listener); } else { - // $FlowIgnore: Doesn't think elements are indexable - el['on' + event] = handler; + // Doesn't think elements are indexable + (el as unknown as Indexable)['on' + event] = listener; } } -export function removeEvent(el: ?Node, event: string, handler: Function, inputOptions?: Object): void { +export function removeEvent( + el: Node | null | undefined, + event: string, + handler: EventListenerLike, + inputOptions?: AddEventListenerOptions +): void { if (!el) return; const options = {capture: true, ...inputOptions}; - // $FlowIgnore[method-unbinding] + const listener = handler as EventListener; if (el.removeEventListener) { - el.removeEventListener(event, handler, options); - } else if (el.detachEvent) { - el.detachEvent('on' + event, handler); + el.removeEventListener(event, listener, options); + } else if ((el as unknown as Indexable).detachEvent) { + (el as unknown as {detachEvent(name: string, handler: EventListener): void}).detachEvent('on' + event, listener); } else { - // $FlowIgnore: Doesn't think elements are indexable - el['on' + event] = null; + // Doesn't think elements are indexable + (el as unknown as Indexable)['on' + event] = null; } } @@ -72,7 +89,7 @@ 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); + const computedStyle = (node.ownerDocument.defaultView as Window).getComputedStyle(node); height += int(computedStyle.borderTopWidth); height += int(computedStyle.borderBottomWidth); return height; @@ -82,14 +99,14 @@ 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); + const computedStyle = (node.ownerDocument.defaultView as Window).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); + const computedStyle = (node.ownerDocument.defaultView as Window).getComputedStyle(node); height -= int(computedStyle.paddingTop); height -= int(computedStyle.paddingBottom); return height; @@ -97,7 +114,7 @@ export function innerHeight(node: HTMLElement): number { export function innerWidth(node: HTMLElement): number { let width = node.clientWidth; - const computedStyle = node.ownerDocument.defaultView.getComputedStyle(node); + const computedStyle = (node.ownerDocument.defaultView as Window).getComputedStyle(node); width -= int(computedStyle.paddingLeft); width -= int(computedStyle.paddingRight); return width; @@ -118,7 +135,7 @@ export function offsetXYFromParent(evt: EventWithOffset, offsetParent: HTMLEleme return {x, y}; } -export function createCSSTransform(controlPos: ControlPosition, positionOffset: PositionOffsetControlPosition): Object { +export function createCSSTransform(controlPos: ControlPosition, positionOffset: PositionOffsetControlPosition): {[key: string]: string} { const translation = getTranslation(controlPos, positionOffset, 'px'); return {[browserPrefixToKey('transform', browserPrefix)]: translation }; } @@ -137,12 +154,12 @@ export function getTranslation({x, y}: ControlPosition, positionOffset: Position return translation; } -export function getTouch(e: MouseTouchEvent, identifier: number): ?{clientX: number, clientY: number} { +export function getTouch(e: MouseTouchEvent, identifier: number): {clientX: number, clientY: number} | null | undefined { 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 { +export function getTouchIdentifier(e: MouseTouchEvent): number | undefined { if (e.targetTouches && e.targetTouches[0]) return e.targetTouches[0].identifier; if (e.changedTouches && e.changedTouches[0]) return e.changedTouches[0].identifier; } @@ -152,9 +169,9 @@ export function getTouchIdentifier(e: MouseTouchEvent): ?number { // 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) { +export function addUserSelectStyles(doc: Document | null | undefined) { if (!doc) return; - let styleEl = doc.getElementById('react-draggable-style-el'); + let styleEl = doc.getElementById('react-draggable-style-el') as HTMLStyleElement | null; if (!styleEl) { styleEl = doc.createElement('style'); styleEl.type = 'text/css'; @@ -166,7 +183,7 @@ export function addUserSelectStyles(doc: ?Document) { if (doc.body) addClassName(doc.body, 'react-draggable-transparent-selection'); } -export function scheduleRemoveUserSelectStyles(doc: ?Document) { +export function scheduleRemoveUserSelectStyles(doc: Document | null | undefined) { // Prevent a possible "forced reflow" if (window.requestAnimationFrame) { window.requestAnimationFrame(() => { @@ -177,14 +194,15 @@ export function scheduleRemoveUserSelectStyles(doc: ?Document) { } } -function removeUserSelectStyles(doc: ?Document) { +function removeUserSelectStyles(doc: Document | null | undefined) { if (!doc) return; try { if (doc.body) removeClassName(doc.body, 'react-draggable-transparent-selection'); - // $FlowIgnore: IE - if (doc.selection) { - // $FlowIgnore: IE - doc.selection.empty(); + // IE + const ieSelection = (doc as unknown as {selection?: {empty(): void}}).selection; + if (ieSelection) { + // IE + ieSelection.empty(); } else { // Remove selection caused by scroll, unless it's a focused input // (we use doc.defaultView in case we're in an iframe) @@ -193,7 +211,7 @@ function removeUserSelectStyles(doc: ?Document) { selection.removeAllRanges(); } } - } catch (e) { + } catch { // probably IE } } diff --git a/lib/utils/getPrefix.js b/lib/utils/getPrefix.ts similarity index 96% rename from lib/utils/getPrefix.js rename to lib/utils/getPrefix.ts index 9d38a9c4..ff87bfcd 100644 --- a/lib/utils/getPrefix.js +++ b/lib/utils/getPrefix.ts @@ -1,4 +1,3 @@ -// @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 @@ -46,4 +45,4 @@ function kebabToTitleCase(str: string): string { // 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); +export default (getPrefix() as string); diff --git a/lib/utils/log.js b/lib/utils/log.ts similarity index 59% rename from lib/utils/log.js rename to lib/utils/log.ts index ee2c37f2..9a187c70 100644 --- a/lib/utils/log.js +++ b/lib/utils/log.ts @@ -1,5 +1,4 @@ -// @flow /*eslint no-console:0*/ -export default function log(...args: any) { +export default function log(...args: unknown[]): void { if (process.env.DRAGGABLE_DEBUG) console.log(...args); } diff --git a/lib/utils/positionFns.js b/lib/utils/positionFns.ts similarity index 93% rename from lib/utils/positionFns.js rename to lib/utils/positionFns.ts index 248d4d0b..66fa0226 100644 --- a/lib/utils/positionFns.js +++ b/lib/utils/positionFns.ts @@ -1,4 +1,3 @@ -// @flow import {isNum, int} from './shims'; import {getTouch, innerWidth, innerHeight, offsetXYFromParent, outerWidth, outerHeight} from './domFns'; @@ -18,6 +17,9 @@ export function getBoundPosition(draggable: Draggable, x: number, y: number): [n if (typeof bounds === 'string') { const {ownerDocument} = node; const ownerWindow = ownerDocument.defaultView; + if (!ownerWindow) { + throw new Error('Cannot resolve the owner window of the draggable node.'); + } let boundNode; if (bounds === 'parent') { boundNode = node.parentNode; @@ -26,7 +28,7 @@ export function getBoundPosition(draggable: Draggable, x: number, y: number): [n // 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); + const rootNode = (node.getRootNode() as unknown) as Element; boundNode = rootNode.querySelector(bounds); } @@ -73,13 +75,13 @@ export function canDragY(draggable: Draggable): boolean { } // Get {x, y} positions from event. -export function getControlPosition(e: MouseTouchEvent, touchIdentifier: ?number, draggableCore: DraggableCore): ?ControlPosition { +export function getControlPosition(e: MouseTouchEvent, touchIdentifier: number | null | undefined, draggableCore: DraggableCore): ControlPosition | null { 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); + return offsetXYFromParent(touchObj || e, offsetParent as HTMLElement, draggableCore.props.scale); } // Create an data object exposed by 's events diff --git a/lib/utils/shims.js b/lib/utils/shims.ts similarity index 59% rename from lib/utils/shims.js rename to lib/utils/shims.ts index e87b6341..c4e0385d 100644 --- a/lib/utils/shims.js +++ b/lib/utils/shims.ts @@ -1,17 +1,18 @@ -// @flow // @credits https://gist.github.com/rogozhnikoff/a43cfed27c41e4e68cdc -export function findInArray(array: Array | TouchList, callback: Function): any { +export function findInArray( + array: ArrayLike, + callback: (value: T, index: number, array: ArrayLike) => unknown +): T | undefined { 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] +export function isFunction(func: unknown): func is (...args: unknown[]) => unknown { return typeof func === 'function' || Object.prototype.toString.call(func) === '[object Function]'; } -export function isNum(num: any): boolean %checks { +export function isNum(num: unknown): num is number { return typeof num === 'number' && !isNaN(num); } @@ -19,7 +20,7 @@ export function int(a: string): number { return parseInt(a, 10); } -export function dontSetMe(props: Object, propName: string, componentName: string): ?Error { +export function dontSetMe(props: {[key: string]: unknown}, propName: string, componentName: string): Error | undefined { 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.ts similarity index 52% rename from lib/utils/types.js rename to lib/utils/types.ts index 31d58136..2349c164 100644 --- a/lib/utils/types.js +++ b/lib/utils/types.ts @@ -1,6 +1,3 @@ -// @flow - -// eslint-disable-next-line no-use-before-define export type DraggableEventHandler = (e: MouseEvent, data: DraggableData) => void | false; export type DraggableData = { @@ -14,17 +11,9 @@ 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 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; +// MouseEvent and TouchEvent are provided by the TS DOM lib, including +// changedTouches/targetTouches, so the Flow class shims are no longer needed. +export type MouseTouchEvent = MouseEvent & TouchEvent; diff --git a/package.json b/package.json index 24171776..dccbf22b 100644 --- a/package.json +++ b/package.json @@ -3,7 +3,16 @@ "version": "4.5.0", "description": "React draggable component", "main": "build/cjs/cjs.js", + "module": "build/cjs/cjs.mjs", "unpkg": "build/web/react-draggable.min.js", + "exports": { + ".": { + "types": "./build/cjs/cjs.d.ts", + "import": "./build/cjs/cjs.mjs", + "require": "./build/cjs/cjs.js" + }, + "./package.json": "./package.json" + }, "scripts": { "test": "vitest run --reporter=verbose", "test:watch": "vitest", @@ -15,14 +24,14 @@ "build": "make clean build", "build-example": "mkdir -p example/build/web && cp build/web/react-draggable.min.js example/build/web/ && sed -i.bak 's|../build/web/react-draggable|build/web/react-draggable|g' example/index.html && rm -f example/index.html.bak", "lint": "make lint", - "flow": "flow" + "typecheck": "tsc --noEmit" }, "files": [ "build", "typings" ], - "typings": "./typings/index.d.ts", - "types": "./typings/index.d.ts", + "typings": "./build/cjs/cjs.d.ts", + "types": "./build/cjs/cjs.d.ts", "repository": { "type": "git", "url": "https://github.com/react-grid-layout/react-draggable.git" @@ -42,28 +51,21 @@ }, "homepage": "https://github.com/react-grid-layout/react-draggable", "devDependencies": { - "@babel/cli": "^7.28.3", - "@babel/core": "^7.28.5", - "@babel/eslint-parser": "^7.28.5", - "@babel/plugin-transform-class-properties": "^7.27.1", - "@babel/plugin-transform-flow-comments": "^7.28.5", - "@babel/preset-env": "^7.28.5", - "@babel/preset-flow": "^7.27.1", - "@babel/preset-react": "^7.28.5", "@eslint/eslintrc": "^3.3.3", "@eslint/js": "^9.39.2", "@testing-library/dom": "^10.4.1", "@testing-library/react": "^16.3.1", "@types/node": "^25.0.3", + "@types/prop-types": "^15.7.15", "@types/react": "^19.2.7", "@types/react-dom": "^19.2.3", + "@typescript-eslint/eslint-plugin": "^8.18.0", + "@typescript-eslint/parser": "^8.18.0", "@vitejs/plugin-react": "^5.1.2", "@vitest/coverage-v8": "^4.0.16", - "babel-loader": "^10.0.0", - "babel-plugin-transform-inline-environment-variables": "^0.4.4", + "esbuild-loader": "^4.2.2", "eslint": "^9.39.2", "eslint-plugin-react": "^7.37.5", - "flow-bin": "^0.217.0", "globals": "^16.5.0", "jsdom": "^27.4.0", "pre-commit": "^1.2.2", @@ -73,6 +75,7 @@ "react-dom": "19", "react-frame-component": "^5.2.7", "semver": "^7.7.3", + "tsup": "^8.3.5", "typescript": "^5.9.3", "vitest": "^4.0.16", "webpack": "^5.104.1", diff --git a/test/typeCompat.test.ts b/test/typeCompat.test.ts new file mode 100644 index 00000000..5ed9ceed --- /dev/null +++ b/test/typeCompat.test.ts @@ -0,0 +1,70 @@ +import {describe, it, expect, beforeAll} from 'vitest'; +import {execFileSync} from 'node:child_process'; +import {existsSync} from 'node:fs'; +import {resolve, dirname} from 'node:path'; +import {fileURLToPath} from 'node:url'; +import {createRequire} from 'node:module'; + +// ───────────────────────────────────────────────────────────────────────────── +// Public type-surface compatibility guard. +// +// After the Flow -> TypeScript migration the public `.d.ts` is AUTO-GENERATED +// from source (build/cjs/cjs.d.ts) instead of hand-written (the old +// typings/index.d.ts, now deleted). This test asserts the generated surface is +// still API-compatible with that old surface by compiling two type-assertion +// files against the generated declaration with `tsc`: +// +// 1. test/typeCompat/fixture.tsx — exhaustively exercises every exported name +// and every prop from the old typings/index.d.ts. Removing/renaming/retyping +// any export or prop makes this stop compiling. +// 2. typings/test.tsx — the project's existing consumer-style smoke test, +// compiled UNCHANGED against the generated types (incl. zero-prop usage, +// which only works if the public props remain optional like the old +// `Partial` surface). +// +// If the CJS declaration hasn't been built yet, the test fails with an actionable +// message rather than silently passing. +// ───────────────────────────────────────────────────────────────────────────── + +const __dirname = dirname(fileURLToPath(import.meta.url)); +const repoRoot = resolve(__dirname, '..'); +const require = createRequire(import.meta.url); +const tscBin = require.resolve('typescript/bin/tsc'); +const generatedDts = resolve(repoRoot, 'build/cjs/cjs.d.ts'); + +function runTsc(projectDir: string): {ok: boolean; output: string} { + try { + execFileSync(process.execPath, [tscBin, '-p', projectDir], { + cwd: repoRoot, + stdio: 'pipe', + }); + return {ok: true, output: ''}; + } catch (err: any) { + const stdout = err.stdout ? err.stdout.toString() : ''; + const stderr = err.stderr ? err.stderr.toString() : ''; + return {ok: false, output: stdout + stderr}; + } +} + +describe('public type-surface compatibility', () => { + beforeAll(() => { + if (!existsSync(generatedDts)) { + throw new Error( + `Generated declaration not found at ${generatedDts}. Run \`yarn build\` ` + + `before running the type-compat test (it asserts against the built .d.ts).` + ); + } + }); + + it('generated .d.ts is API-compatible with the old hand-written surface', () => { + const {ok, output} = runTsc(resolve(__dirname, 'typeCompat')); + expect(output, output).toBe(''); + expect(ok).toBe(true); + }); + + it('the existing typings/test.tsx still compiles unchanged against generated types', () => { + const {ok, output} = runTsc(resolve(repoRoot, 'typings')); + expect(output, output).toBe(''); + expect(ok).toBe(true); + }); +}); diff --git a/test/typeCompat/fixture.tsx b/test/typeCompat/fixture.tsx new file mode 100644 index 00000000..d567a310 --- /dev/null +++ b/test/typeCompat/fixture.tsx @@ -0,0 +1,193 @@ +// Type-level compatibility fixture. +// +// This file is NOT run; it is compiled by `test/typeCompat.test.ts` via `tsc` +// against the AUTO-GENERATED declaration (build/cjs/cjs.d.ts, aliased to +// "react-draggable"). It asserts that the generated public type surface is +// API-compatible with the OLD hand-written typings/index.d.ts. +// +// Every exported name and every prop from the old surface is exercised here. If +// any export is removed/renamed, or any prop is removed/renamed/retyped +// incompatibly, this file STOPS COMPILING and the vitest test fails. + +import * as React from 'react'; +import Draggable, { + DraggableCore, + DraggableProps, + DraggableCoreProps, + DraggableBounds, + DraggableData, + DraggableEvent, + DraggableEventHandler, + ControlPosition, + PositionOffsetControlPosition, +} from 'react-draggable'; + +// ── Helper: assert that `value` is assignable to type `T` ──────────────────── +function expectType(_value: T): void {} + +// ── ControlPosition: {x: number, y: number} ───────────────────────────────── +const cp: ControlPosition = {x: 1, y: 2}; +expectType(cp.x); +expectType(cp.y); + +// ── PositionOffsetControlPosition: {x: number|string, y: number|string} ────── +const pocp1: PositionOffsetControlPosition = {x: 1, y: 2}; +const pocp2: PositionOffsetControlPosition = {x: '1px', y: '2%'}; +expectType(pocp1.x); +expectType(pocp2.y); + +// ── DraggableBounds: {left?,right?,top?,bottom?: number} ───────────────────── +const db1: DraggableBounds = {}; +const db2: DraggableBounds = {left: 0, right: 1, top: 2, bottom: 3}; +expectType(db2.left); +expectType(db2.right); +expectType(db2.top); +expectType(db2.bottom); +void db1; + +// ── DraggableData: full shape ──────────────────────────────────────────────── +const dd: DraggableData = { + node: document.createElement('div'), + x: 0, y: 0, + deltaX: 0, deltaY: 0, + lastX: 0, lastY: 0, +}; +expectType(dd.node); +expectType(dd.x); +expectType(dd.y); +expectType(dd.deltaX); +expectType(dd.deltaY); +expectType(dd.lastX); +expectType(dd.lastY); + +// ── DraggableEvent union members ───────────────────────────────────────────── +const ev1: DraggableEvent = {} as React.MouseEvent; +const ev2: DraggableEvent = {} as React.TouchEvent; +const ev3: DraggableEvent = {} as MouseEvent; +const ev4: DraggableEvent = {} as TouchEvent; +void ev1; void ev2; void ev3; void ev4; + +// ── DraggableEventHandler: (e, data) => void | false ───────────────────────── +const handlerVoid: DraggableEventHandler = (_e, _data) => {}; +const handlerFalse: DraggableEventHandler = (_e, _data) => false; +// data param must be DraggableData +const handlerUsesData: DraggableEventHandler = (_e, data) => { + expectType(data.x); + expectType(data.node); +}; +void handlerVoid; void handlerFalse; void handlerUsesData; + +// ── DraggableCoreProps: every documented prop, exact-ish types ─────────────── +const coreProps: DraggableCoreProps = { + allowAnyClick: true, + allowMobileScroll: false, + cancel: '.cancel', + children: React.createElement('div'), + disabled: false, + enableUserSelectHack: true, + offsetParent: document.body, + grid: [10, 10], + handle: '.handle', + nodeRef: React.createRef(), + onStart: () => {}, + onDrag: () => {}, + onStop: () => {}, + onMouseDown: (_e: MouseEvent) => {}, + scale: 1, +}; +expectType(coreProps.allowAnyClick); +expectType(coreProps.allowMobileScroll); +expectType(coreProps.cancel); +expectType(coreProps.disabled); +expectType(coreProps.enableUserSelectHack); +expectType(coreProps.offsetParent); +expectType<[number, number]>(coreProps.grid); +expectType(coreProps.handle); +expectType(coreProps.onStart); +expectType(coreProps.onDrag); +expectType(coreProps.onStop); +expectType<(e: MouseEvent) => void>(coreProps.onMouseDown); +expectType(coreProps.scale); + +// ── children must stay React.ReactNode (v4.5.0 public surface), NOT narrowed ── +// Regression guard: the hand-written typings shipped through v4.5.0 declared +// `children?: React.ReactNode`. If the generated types ever narrow this to +// React.ReactElement (as the internal Flow source did), these assignments fail. +const childString: DraggableCoreProps['children'] = 'a plain string child'; +const childNumber: DraggableCoreProps['children'] = 42; +const childFragment: DraggableCoreProps['children'] = <>{'fragment'}; +const childArray: DraggableCoreProps['children'] = [, 'text', 7]; +void childString; void childNumber; void childFragment; void childArray; + +// ── DraggableProps: extends DraggableCoreProps + the Draggable-only props ──── +const props: DraggableProps = { + ...coreProps, + axis: 'both', + bounds: false, + defaultClassName: 'react-draggable', + defaultClassNameDragging: 'react-draggable-dragging', + defaultClassNameDragged: 'react-draggable-dragged', + defaultPosition: {x: 0, y: 0}, + positionOffset: {x: 0, y: 0}, + position: {x: 0, y: 0}, +}; +expectType<'both' | 'x' | 'y' | 'none'>(props.axis); +expectType(props.bounds); +expectType(props.defaultClassName); +expectType(props.defaultClassNameDragging); +expectType(props.defaultClassNameDragged); +expectType(props.defaultPosition); +expectType(props.positionOffset); +expectType(props.position); +// axis accepts each documented literal +const axisX: DraggableProps['axis'] = 'x'; +const axisY: DraggableProps['axis'] = 'y'; +const axisNone: DraggableProps['axis'] = 'none'; +void axisX; void axisY; void axisNone; +// bounds accepts string and object forms +const boundsStr: DraggableProps['bounds'] = 'parent'; +const boundsObj: DraggableProps['bounds'] = {left: 0, top: 0}; +void boundsStr; void boundsObj; + +// DraggableProps must be assignable where DraggableCoreProps is expected (extends). +const asCore: DraggableCoreProps = props; +void asCore; + +// ── Default export is the Draggable class; DraggableCore is the named class ── +expectType(Draggable as unknown as typeof React.Component); +expectType(DraggableCore as unknown as typeof React.Component); + +// ── JSX usage: every prop is OPTIONAL for consumers (old Partial<...> surface) ─ +const node = React.createRef(); +const fullEl = ( + {}} + onDrag={() => {}} + onStop={() => {}} + offsetParent={document.body} + onMouseDown={() => {}} + allowAnyClick + allowMobileScroll={false} + disabled + enableUserSelectHack={false} + bounds={false} + defaultClassName="d" + defaultClassNameDragging="dd" + defaultClassNameDragged="ddd" + defaultPosition={{x: 0, y: 0}} + nodeRef={node} + positionOffset={{x: 0, y: 0}} + position={{x: 50, y: 50}}> +
+ +); +// Zero-prop usage must compile (this is what would break if props were required). +const bareDraggable =
; +const bareCore =
; +void fullEl; void bareDraggable; void bareCore; + +export {}; diff --git a/test/typeCompat/tsconfig.json b/test/typeCompat/tsconfig.json new file mode 100644 index 00000000..677c3f67 --- /dev/null +++ b/test/typeCompat/tsconfig.json @@ -0,0 +1,19 @@ +{ + "compilerOptions": { + "noEmit": true, + "jsx": "react", + "strict": true, + "moduleResolution": "node", + "esModuleInterop": true, + "skipLibCheck": true, + "lib": ["ES2019", "DOM", "DOM.Iterable"], + "types": ["react", "react-dom", "node"], + "baseUrl": ".", + "paths": { + "react-draggable": ["../../build/cjs/cjs.d.ts"] + } + }, + "files": [ + "fixture.tsx" + ] +} diff --git a/test/utils/domFns.extra.test.js b/test/utils/domFns.extra.test.js new file mode 100644 index 00000000..6f2c54ea --- /dev/null +++ b/test/utils/domFns.extra.test.js @@ -0,0 +1,248 @@ +import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest'; +import { + matchesSelector, + addEvent, + removeEvent, + offsetXYFromParent, + createCSSTransform, + createSVGTransform, + getTouch, + getTouchIdentifier, + addUserSelectStyles, + scheduleRemoveUserSelectStyles, + addClassName, + removeClassName, +} from '../../lib/utils/domFns'; +import browserPrefix, { browserPrefixToKey } from '../../lib/utils/getPrefix'; + +describe('domFns - additional coverage', () => { + describe('matchesSelector bail-out branch', () => { + it('returns false for a node without any matches() implementation', () => { + // A plain object has no matches/webkitMatchesSelector/etc. + const fake = {}; + expect(matchesSelector(fake, '.anything')).toBe(false); + }); + }); + + describe('addEvent / removeEvent fallback branches', () => { + it('uses attachEvent/detachEvent when present', () => { + const attachEvent = vi.fn(); + const detachEvent = vi.fn(); + const handler = () => {}; + const legacy = { attachEvent, detachEvent }; + addEvent(legacy, 'click', handler); + expect(attachEvent).toHaveBeenCalledWith('onclick', handler); + removeEvent(legacy, 'click', handler); + expect(detachEvent).toHaveBeenCalledWith('onclick', handler); + }); + + it('falls back to on assignment when neither API exists', () => { + const handler = () => {}; + const ancient = {}; + addEvent(ancient, 'click', handler); + expect(ancient.onclick).toBe(handler); + removeEvent(ancient, 'click', handler); + expect(ancient.onclick).toBe(null); + }); + }); + + describe('offsetXYFromParent', () => { + it('treats the body offsetParent as origin {0,0}', () => { + const offsetParent = document.body; + Object.defineProperty(offsetParent, 'scrollLeft', { configurable: true, value: 0 }); + Object.defineProperty(offsetParent, 'scrollTop', { configurable: true, value: 0 }); + const result = offsetXYFromParent({ clientX: 50, clientY: 60 }, offsetParent, 1); + expect(result).toEqual({ x: 50, y: 60 }); + }); + + it('subtracts the parent rect and adds scroll for non-body parents', () => { + const offsetParent = document.createElement('div'); + document.body.appendChild(offsetParent); + Object.defineProperty(offsetParent, 'scrollLeft', { configurable: true, value: 30 }); + Object.defineProperty(offsetParent, 'scrollTop', { configurable: true, value: 40 }); + vi.spyOn(offsetParent, 'getBoundingClientRect').mockReturnValue({ left: 10, top: 20 }); + const result = offsetXYFromParent({ clientX: 100, clientY: 100 }, offsetParent, 1); + // x = (100 + 30 - 10)/1 = 120 ; y = (100 + 40 - 20)/1 = 120 + expect(result).toEqual({ x: 120, y: 120 }); + document.body.removeChild(offsetParent); + }); + + it('divides by scale', () => { + const offsetParent = document.body; + Object.defineProperty(offsetParent, 'scrollLeft', { configurable: true, value: 0 }); + Object.defineProperty(offsetParent, 'scrollTop', { configurable: true, value: 0 }); + const result = offsetXYFromParent({ clientX: 80, clientY: 40 }, offsetParent, 2); + expect(result).toEqual({ x: 40, y: 20 }); + }); + }); + + describe('createCSSTransform', () => { + it('keys the transform under the browser-prefixed transform property', () => { + const out = createCSSTransform({ x: 10, y: 20 }, null); + const key = browserPrefixToKey('transform', browserPrefix); + expect(out).toEqual({ [key]: 'translate(10px,20px)' }); + }); + + it('prepends a positionOffset', () => { + const out = createCSSTransform({ x: 10, y: 20 }, { x: 5, y: 6 }); + const key = browserPrefixToKey('transform', browserPrefix); + expect(out[key]).toBe('translate(5px, 6px)translate(10px,20px)'); + }); + + it('supports string (percentage) positionOffsets', () => { + const out = createCSSTransform({ x: 10, y: 20 }, { x: '50%', y: '25%' }); + const key = browserPrefixToKey('transform', browserPrefix); + expect(out[key]).toBe('translate(50%, 25%)translate(10px,20px)'); + }); + }); + + describe('createSVGTransform', () => { + it('produces a unit-less translate string', () => { + expect(createSVGTransform({ x: 10, y: 20 }, null)).toBe('translate(10,20)'); + }); + + it('prepends a unit-less positionOffset', () => { + expect(createSVGTransform({ x: 10, y: 20 }, { x: 5, y: 6 })).toBe( + 'translate(5, 6)translate(10,20)' + ); + }); + }); + + describe('getTouch', () => { + it('finds the touch in targetTouches by identifier', () => { + const e = { + targetTouches: [{ identifier: 2, clientX: 1, clientY: 2 }], + changedTouches: [], + }; + expect(getTouch(e, 2)).toEqual({ identifier: 2, clientX: 1, clientY: 2 }); + }); + + it('falls back to changedTouches', () => { + const e = { + targetTouches: [], + changedTouches: [{ identifier: 9, clientX: 4, clientY: 5 }], + }; + expect(getTouch(e, 9)).toEqual({ identifier: 9, clientX: 4, clientY: 5 }); + }); + + it('returns undefined when no touch matches', () => { + const e = { targetTouches: [{ identifier: 1 }], changedTouches: [{ identifier: 3 }] }; + expect(getTouch(e, 99)).toBeUndefined(); + }); + }); + + describe('getTouchIdentifier', () => { + it('reads the first targetTouches identifier', () => { + const e = { targetTouches: [{ identifier: 4 }], changedTouches: [{ identifier: 8 }] }; + expect(getTouchIdentifier(e)).toBe(4); + }); + + it('falls back to changedTouches when targetTouches is empty', () => { + const e = { targetTouches: [], changedTouches: [{ identifier: 8 }] }; + expect(getTouchIdentifier(e)).toBe(8); + }); + + it('returns undefined when there are no touches', () => { + expect(getTouchIdentifier({})).toBeUndefined(); + expect(getTouchIdentifier({ targetTouches: [], changedTouches: [] })).toBeUndefined(); + }); + }); + + describe('addUserSelectStyles / scheduleRemoveUserSelectStyles', () => { + afterEach(() => { + // Clean up the injected style element and body class between tests. + const styleEl = document.getElementById('react-draggable-style-el'); + if (styleEl && styleEl.parentNode) styleEl.parentNode.removeChild(styleEl); + document.body.classList.remove('react-draggable-transparent-selection'); + vi.restoreAllMocks(); + }); + + it('is a no-op when doc is null/undefined', () => { + expect(() => addUserSelectStyles(null)).not.toThrow(); + expect(() => addUserSelectStyles(undefined)).not.toThrow(); + expect(document.getElementById('react-draggable-style-el')).toBe(null); + }); + + it('injects a style element and tags the body once', () => { + addUserSelectStyles(document); + const styleEl = document.getElementById('react-draggable-style-el'); + expect(styleEl).not.toBe(null); + expect(styleEl.tagName).toBe('STYLE'); + expect(styleEl.innerHTML).toContain('react-draggable-transparent-selection'); + expect( + document.body.classList.contains('react-draggable-transparent-selection') + ).toBe(true); + }); + + it('does not inject a second style element on repeated calls', () => { + addUserSelectStyles(document); + addUserSelectStyles(document); + const all = document.querySelectorAll('#react-draggable-style-el'); + expect(all.length).toBe(1); + }); + + it('removes the body class via requestAnimationFrame', async () => { + addUserSelectStyles(document); + expect( + document.body.classList.contains('react-draggable-transparent-selection') + ).toBe(true); + + // Drive the rAF callback synchronously. + const rafSpy = vi.spyOn(window, 'requestAnimationFrame').mockImplementation((cb) => { + cb(); + return 1; + }); + // jsdom getSelection may be undefined; provide a stub so the function runs. + const getSelectionSpy = vi + .spyOn(window, 'getSelection') + .mockReturnValue({ type: 'Range', removeAllRanges: vi.fn() }); + + scheduleRemoveUserSelectStyles(document); + expect(rafSpy).toHaveBeenCalled(); + expect(getSelectionSpy).toHaveBeenCalled(); + expect( + document.body.classList.contains('react-draggable-transparent-selection') + ).toBe(false); + }); + + it('is a no-op when scheduling removal with a null doc', () => { + vi.spyOn(window, 'requestAnimationFrame').mockImplementation((cb) => { + cb(); + return 1; + }); + expect(() => scheduleRemoveUserSelectStyles(null)).not.toThrow(); + }); + + it('does not clear a focused-input Caret selection', () => { + addUserSelectStyles(document); + vi.spyOn(window, 'requestAnimationFrame').mockImplementation((cb) => { + cb(); + return 1; + }); + const removeAllRanges = vi.fn(); + vi.spyOn(window, 'getSelection').mockReturnValue({ type: 'Caret', removeAllRanges }); + scheduleRemoveUserSelectStyles(document); + // Caret type means we leave the selection alone. + expect(removeAllRanges).not.toHaveBeenCalled(); + }); + }); + + describe('addClassName / removeClassName classList-absent fallback', () => { + it('adds via string concatenation when classList is unavailable', () => { + const el = { className: 'existing' }; + addClassName(el, 'foo'); + expect(el.className).toBe('existing foo'); + // Idempotent: does not duplicate. + addClassName(el, 'foo'); + expect(el.className).toBe('existing foo'); + }); + + it('removes via regex when classList is unavailable', () => { + const el = { className: 'foo bar baz' }; + removeClassName(el, 'bar'); + expect(el.className).not.toContain('bar'); + expect(el.className).toContain('foo'); + expect(el.className).toContain('baz'); + }); + }); +}); diff --git a/test/utils/getPrefix.extra.test.js b/test/utils/getPrefix.extra.test.js new file mode 100644 index 00000000..22f26457 --- /dev/null +++ b/test/utils/getPrefix.extra.test.js @@ -0,0 +1,72 @@ +import { describe, it, expect, beforeEach, afterEach } from 'vitest'; +import { getPrefix, browserPrefixToKey, browserPrefixToStyle } from '../../lib/utils/getPrefix'; + +describe('getPrefix - additional edge cases', () => { + describe('browserPrefixToKey edge cases', () => { + it('handles a single-character property', () => { + expect(browserPrefixToKey('x', 'Webkit')).toBe('WebkitX'); + }); + + it('handles trailing hyphen gracefully', () => { + // 'a-' -> capitalize 'A', hyphen sets shouldCapitalize but no following char + expect(browserPrefixToKey('a-', 'Moz')).toBe('MozA'); + }); + + it('emits a leading hyphen literally (no preceding char to capitalize)', () => { + // i=0 starts with shouldCapitalize=true, so the leading '-' is emitted + // as-is and the flag is consumed; the rest is appended verbatim. + expect(browserPrefixToKey('-webkit', 'Moz')).toBe('Moz-webkit'); + }); + }); + + describe('browserPrefixToStyle edge cases', () => { + it('lowercases multi-letter prefixes', () => { + expect(browserPrefixToStyle('user-select', 'Webkit')).toBe('-webkit-user-select'); + }); + + it('returns the prop untouched for an empty prefix', () => { + expect(browserPrefixToStyle('user-select', '')).toBe('user-select'); + }); + }); + + describe('getPrefix - ms / O prefixes and partial chains', () => { + let originalWindow; + beforeEach(() => { + originalWindow = global.window; + }); + afterEach(() => { + global.window = originalWindow; + }); + + it('detects the ms prefix', () => { + global.window = { + document: { documentElement: { style: { msTransform: '' } } }, + }; + expect(getPrefix('transform')).toBe('ms'); + }); + + it('detects the O prefix', () => { + global.window = { + document: { documentElement: { style: { OTransform: '' } } }, + }; + expect(getPrefix('transform')).toBe('O'); + }); + + it('returns empty string when documentElement itself is missing', () => { + global.window = { document: {} }; + expect(getPrefix('transform')).toBe(''); + }); + + it('returns empty string when document is missing entirely', () => { + global.window = {}; + expect(getPrefix('transform')).toBe(''); + }); + + it('detects prefixes for a kebab-cased property', () => { + global.window = { + document: { documentElement: { style: { WebkitUserSelect: '' } } }, + }; + expect(getPrefix('user-select')).toBe('Webkit'); + }); + }); +}); diff --git a/test/utils/positionFns.bounds.test.js b/test/utils/positionFns.bounds.test.js new file mode 100644 index 00000000..4da624f5 --- /dev/null +++ b/test/utils/positionFns.bounds.test.js @@ -0,0 +1,199 @@ +import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest'; +import { getBoundPosition, getControlPosition } from '../../lib/utils/positionFns'; + +// These tests exercise the bounds-parsing and getControlPosition branches of +// positionFns that the unit suite previously left uncovered. They live in a +// jsdom environment, so we stub the layout primitives (offsetLeft, computed +// styles, getBoundingClientRect) that jsdom does not implement, rather than +// asserting exact pixel math (that lives in test/browser/). + +describe('positionFns getBoundPosition', () => { + let container; + + beforeEach(() => { + container = document.createElement('div'); + document.body.appendChild(container); + }); + + afterEach(() => { + document.body.removeChild(container); + vi.restoreAllMocks(); + }); + + function makeDraggable(bounds, node) { + return { + props: { bounds }, + findDOMNode: () => node, + }; + } + + it('short-circuits and returns x/y unchanged when bounds is falsy', () => { + const node = document.createElement('div'); + const draggable = makeDraggable(undefined, node); + expect(getBoundPosition(draggable, 42, 99)).toEqual([42, 99]); + }); + + it('clamps to object bounds (right/bottom upper limits)', () => { + const node = document.createElement('div'); + const draggable = makeDraggable({ left: 0, top: 0, right: 100, bottom: 200 }, node); + expect(getBoundPosition(draggable, 150, 250)).toEqual([100, 200]); + }); + + it('clamps to object bounds (left/top lower limits)', () => { + const node = document.createElement('div'); + const draggable = makeDraggable({ left: 10, top: 20, right: 100, bottom: 200 }, node); + expect(getBoundPosition(draggable, -5, -5)).toEqual([10, 20]); + }); + + it('ignores limits that are not numbers (partial bounds object)', () => { + const node = document.createElement('div'); + // Only a left bound: x is clamped up to 50, but right/top/bottom are ignored. + const draggable = makeDraggable({ left: 50 }, node); + expect(getBoundPosition(draggable, 10, 9999)).toEqual([50, 9999]); + expect(getBoundPosition(draggable, 80, -9999)).toEqual([80, -9999]); + }); + + it('does not mutate the original bounds object (clone)', () => { + const node = document.createElement('div'); + const bounds = { left: 0, top: 0, right: 100, bottom: 100 }; + const draggable = makeDraggable(bounds, node); + getBoundPosition(draggable, 200, 200); + expect(bounds).toEqual({ left: 0, top: 0, right: 100, bottom: 100 }); + }); + + it('throws when the node has been unmounted', () => { + const draggable = makeDraggable({ left: 0 }, null); + expect(() => getBoundPosition(draggable, 0, 0)).toThrow('Unmounted during event'); + }); + + describe('string selector bounds', () => { + // jsdom doesn't compute layout; stub the offset/style primitives so the + // bounds math runs deterministically through every branch. + function stubLayout(node, boundNode) { + Object.defineProperty(node, 'offsetLeft', { configurable: true, value: 5 }); + Object.defineProperty(node, 'offsetTop', { configurable: true, value: 7 }); + Object.defineProperty(node, 'clientWidth', { configurable: true, value: 20 }); + Object.defineProperty(node, 'clientHeight', { configurable: true, value: 20 }); + Object.defineProperty(boundNode, 'clientWidth', { configurable: true, value: 200 }); + Object.defineProperty(boundNode, 'clientHeight', { configurable: true, value: 300 }); + + vi.spyOn(window, 'getComputedStyle').mockImplementation((el) => { + // Return zeroed box metrics for both nodes; specific values don't + // matter, we only need int()-parseable strings. + return { + paddingLeft: '0px', paddingTop: '0px', paddingRight: '0px', paddingBottom: '0px', + marginLeft: '0px', marginTop: '0px', marginRight: '0px', marginBottom: '0px', + borderTopWidth: '0px', borderBottomWidth: '0px', + borderLeftWidth: '0px', borderRightWidth: '0px', + }; + }); + } + + it('resolves bounds="parent" against the parent node', () => { + const parent = document.createElement('div'); + const node = document.createElement('div'); + parent.appendChild(node); + container.appendChild(parent); + stubLayout(node, parent); + + const draggable = makeDraggable('parent', node); + // right = innerWidth(200) - outerWidth(20) - offsetLeft(5) = 175 + // bottom = innerHeight(300) - outerHeight(20) - offsetTop(7) = 273 + // left = -offsetLeft(5), top = -offsetTop(7) + expect(getBoundPosition(draggable, 9999, 9999)).toEqual([175, 273]); + expect(getBoundPosition(draggable, -9999, -9999)).toEqual([-5, -7]); + }); + + it('resolves bounds via a CSS selector against the root node', () => { + const boundEl = document.createElement('div'); + boundEl.className = 'bound-box'; + const node = document.createElement('div'); + container.appendChild(boundEl); + container.appendChild(node); + stubLayout(node, boundEl); + + const draggable = makeDraggable('.bound-box', node); + const [x, y] = getBoundPosition(draggable, 9999, 9999); + expect(x).toBe(175); + expect(y).toBe(273); + }); + + it('throws a descriptive error when the selector matches nothing', () => { + const node = document.createElement('div'); + container.appendChild(node); + const draggable = makeDraggable('.does-not-exist', node); + expect(() => getBoundPosition(draggable, 0, 0)).toThrow( + /Bounds selector ".does-not-exist" could not find an element/ + ); + }); + }); +}); + +describe('positionFns getControlPosition', () => { + afterEach(() => vi.restoreAllMocks()); + + function makeCore(node, { offsetParent, scale = 1 } = {}) { + return { + props: { offsetParent, scale }, + findDOMNode: () => node, + }; + } + + it('returns mouse coords mapped through the document body offsetParent', () => { + const node = document.createElement('div'); + document.body.appendChild(node); + const core = makeCore(node, { scale: 1 }); + const evt = { clientX: 120, clientY: 240 }; + // body offsetParent => rect treated as {0,0}, scale 1 + expect(getControlPosition(evt, undefined, core)).toEqual({ x: 120, y: 240 }); + document.body.removeChild(node); + }); + + it('applies scale to the returned coordinates', () => { + const node = document.createElement('div'); + document.body.appendChild(node); + const core = makeCore(node, { scale: 2 }); + const evt = { clientX: 120, clientY: 240 }; + expect(getControlPosition(evt, undefined, core)).toEqual({ x: 60, y: 120 }); + document.body.removeChild(node); + }); + + it('honors a user-provided offsetParent and its scroll/rect', () => { + const node = document.createElement('div'); + const offsetParent = document.createElement('div'); + document.body.appendChild(offsetParent); + offsetParent.appendChild(node); + Object.defineProperty(offsetParent, 'scrollLeft', { configurable: true, value: 10 }); + Object.defineProperty(offsetParent, 'scrollTop', { configurable: true, value: 20 }); + vi.spyOn(offsetParent, 'getBoundingClientRect').mockReturnValue({ left: 5, top: 8 }); + + const core = makeCore(node, { offsetParent, scale: 1 }); + const evt = { clientX: 100, clientY: 100 }; + // x = (100 + 10 - 5) / 1 = 105 ; y = (100 + 20 - 8) / 1 = 112 + expect(getControlPosition(evt, undefined, core)).toEqual({ x: 105, y: 112 }); + document.body.removeChild(offsetParent); + }); + + it('returns null when a touchIdentifier is given but the touch is absent', () => { + const node = document.createElement('div'); + document.body.appendChild(node); + const core = makeCore(node, { scale: 1 }); + const evt = { targetTouches: [], changedTouches: [] }; + expect(getControlPosition(evt, 5, core)).toBe(null); + document.body.removeChild(node); + }); + + it('reads the matching touch when a touchIdentifier is provided', () => { + const node = document.createElement('div'); + document.body.appendChild(node); + const core = makeCore(node, { scale: 1 }); + const evt = { + targetTouches: [ + { identifier: 0, clientX: 1, clientY: 1 }, + { identifier: 7, clientX: 70, clientY: 90 }, + ], + }; + expect(getControlPosition(evt, 7, core)).toEqual({ x: 70, y: 90 }); + document.body.removeChild(node); + }); +}); diff --git a/test/utils/shims.extra.test.js b/test/utils/shims.extra.test.js new file mode 100644 index 00000000..72876588 --- /dev/null +++ b/test/utils/shims.extra.test.js @@ -0,0 +1,95 @@ +import { describe, it, expect } from 'vitest'; +import { findInArray, isFunction, isNum, int, dontSetMe } from '../../lib/utils/shims'; + +describe('shims - additional edge cases', () => { + describe('findInArray', () => { + it('returns undefined for an empty array', () => { + expect(findInArray([], () => true)).toBeUndefined(); + }); + + it('works over array-like (TouchList-style) objects with a length', () => { + const touchListLike = { + 0: { identifier: 1 }, + 1: { identifier: 2 }, + length: 2, + }; + const found = findInArray(touchListLike, (t) => t.identifier === 2); + expect(found).toEqual({ identifier: 2 }); + }); + + it('returns the first match when multiple satisfy the callback', () => { + expect(findInArray([2, 4, 6], (n) => n % 2 === 0)).toBe(2); + }); + + it('does not return falsy elements even if the callback is truthy at that index', () => { + // callback uses index so the matched element is 0 (falsy). The function + // returns array[i] which is 0, NOT undefined — guard this contract. + expect(findInArray([0, 1], (val, idx) => idx === 0)).toBe(0); + }); + }); + + describe('isFunction', () => { + it('recognizes class constructors as functions', () => { + class Foo {} + expect(isFunction(Foo)).toBe(true); + }); + + it('recognizes generator functions as functions', () => { + function* gen() {} + expect(isFunction(gen)).toBe(true); + }); + + it('returns false for boolean values', () => { + expect(isFunction(true)).toBe(false); + expect(isFunction(false)).toBe(false); + }); + }); + + describe('isNum', () => { + it('treats -Infinity as a number', () => { + expect(isNum(-Infinity)).toBe(true); + }); + + it('returns false for boxed Number objects', () => { + // typeof new Number(1) === 'object' + // eslint-disable-next-line no-new-wrappers + expect(isNum(new Number(1))).toBe(false); + }); + + it('returns false for arrays', () => { + expect(isNum([1])).toBe(false); + }); + }); + + describe('int', () => { + it('returns NaN for non-numeric strings', () => { + expect(Number.isNaN(int('abc'))).toBe(true); + }); + + it('returns NaN for an empty string', () => { + expect(Number.isNaN(int(''))).toBe(true); + }); + + it('parses leading sign and ignores trailing units', () => { + expect(int('+15rem')).toBe(15); + expect(int('-3.9%')).toBe(-3); + }); + }); + + describe('dontSetMe', () => { + it('flags truthy non-string prop values', () => { + const err = dontSetMe({ transform: { a: 1 } }, 'transform', 'DraggableCore'); + expect(err).toBeInstanceOf(Error); + expect(err.message).toContain('transform'); + expect(err.message).toContain('DraggableCore'); + }); + + it('returns undefined for an absent prop', () => { + expect(dontSetMe({}, 'transform', 'DraggableCore')).toBeUndefined(); + }); + + it('returns undefined for falsy NaN values', () => { + expect(dontSetMe({ transform: NaN }, 'transform', 'DraggableCore')).toBeUndefined(); + }); + }); +}); diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 00000000..c14a7cdd --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,22 @@ +{ + "compilerOptions": { + "target": "ES2019", + "module": "ESNext", + "moduleResolution": "bundler", + "lib": ["ES2019", "DOM", "DOM.Iterable"], + "jsx": "react", + "declaration": true, + "emitDeclarationOnly": false, + "outDir": "build/cjs", + "strict": true, + "esModuleInterop": true, + "allowSyntheticDefaultImports": true, + "forceConsistentCasingInFileNames": true, + "skipLibCheck": true, + "resolveJsonModule": true, + "noEmit": true, + "types": ["node", "react", "react-dom"] + }, + "include": ["lib/**/*"], + "exclude": ["node_modules", "build", "test", "typings"] +} diff --git a/tsup.config.ts b/tsup.config.ts new file mode 100644 index 00000000..b48c7e8b --- /dev/null +++ b/tsup.config.ts @@ -0,0 +1,60 @@ +import {defineConfig} from 'tsup'; +import {writeFileSync} from 'node:fs'; +import {resolve} from 'node:path'; + +// ───────────────────────────────────────────────────────────────────────────── +// CJS COMPAT CONTRACT (see lib/cjs.ts for the full history). The published CJS +// artifact MUST satisfy at runtime: +// require('react-draggable') === Draggable class +// require('react-draggable').default === Draggable class +// require('react-draggable').DraggableCore === DraggableCore class +// +// tsup's default-export CJS interop emits `exports.default = Draggable` but does +// NOT make `module.exports === Draggable`. So we let tsup emit the CJS build of +// `Draggable.tsx` (-> build/cjs/Draggable.js) and then, in `onSuccess`, write a +// hand-rolled `build/cjs/cjs.js` that reconciles module.exports to the legacy +// dual-export shape. The ESM (.mjs) and the generated .d.ts come straight from +// `lib/cjs.ts` and keep the modern default+named export shape. +// +// The UMD/global build (build/web/react-draggable.min.js) is produced by webpack +// (see webpack.config.js), NOT tsup: esbuild's IIFE format cannot map the bare +// `react`/`react-dom` imports to the browser `React`/`ReactDOM` globals the way +// webpack's `libraryTarget: 'umd'` + externals does. Webpack is retained solely +// for that one artifact. +// ───────────────────────────────────────────────────────────────────────────── + +const LEGACY_CJS_ENTRY = `'use strict'; +// Generated by tsup.config.ts onSuccess. See that file for the compat rationale. +const Draggable = require('./Draggable.js'); +const DraggableCore = Draggable.DraggableCore; +const Default = Draggable.default || Draggable; + +module.exports = Default; +module.exports.default = Default; +module.exports.DraggableCore = DraggableCore; +`; + +const external = ['react', 'react-dom', 'prop-types', 'clsx']; + +export default defineConfig({ + entry: { + cjs: 'lib/cjs.ts', + Draggable: 'lib/Draggable.tsx', + }, + outDir: 'build/cjs', + format: ['cjs', 'esm'], + dts: true, + sourcemap: true, + clean: true, + target: 'es2019', + external, + // ESM output -> .mjs, CJS output -> .js (so package "main" stays build/cjs/cjs.js). + outExtension({format}) { + return {js: format === 'cjs' ? '.js' : '.mjs'}; + }, + async onSuccess() { + // Overwrite the tsup-generated cjs.js with the legacy dual-export shape so + // `module.exports === Draggable` holds. cjs.mjs and cjs.d.ts are left as-is. + writeFileSync(resolve('build/cjs/cjs.js'), LEGACY_CJS_ENTRY); + }, +}); diff --git a/typings/index.d.ts b/typings/index.d.ts deleted file mode 100644 index 13389ede..00000000 --- a/typings/index.d.ts +++ /dev/null @@ -1,66 +0,0 @@ -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/tsconfig.json b/typings/tsconfig.json index c35385ea..cb8853d7 100644 --- a/typings/tsconfig.json +++ b/typings/tsconfig.json @@ -4,13 +4,13 @@ "jsx": "preserve", "strict": true, "moduleResolution": "node", + "esModuleInterop": true, "baseUrl": ".", "paths": { - "react-draggable": ["./index.d.ts"] + "react-draggable": ["../build/cjs/cjs.d.ts"] } }, "files": [ - "index.d.ts", "test.tsx" ] } diff --git a/vitest.config.js b/vitest.config.js index 376dab7b..4c88a85e 100644 --- a/vitest.config.js +++ b/vitest.config.js @@ -2,30 +2,21 @@ import { defineConfig } from 'vitest/config'; import react from '@vitejs/plugin-react'; export default defineConfig({ - plugins: [ - react({ - // Process all .js and .jsx files through Babel - include: [/\.[jt]sx?$/], - babel: { - presets: ['@babel/preset-flow', '@babel/preset-react'], - plugins: ['@babel/plugin-transform-flow-comments'], - }, - }), - ], - // Disable esbuild for JS files - let Babel handle them - esbuild: false, + // Vite/esbuild handles .ts/.tsx natively; @vitejs/plugin-react adds JSX + + // Fast Refresh. No Babel/Flow transform is needed anymore. + plugins: [react()], test: { environment: 'jsdom', globals: true, setupFiles: ['./test/setup.js'], - include: ['test/**/*.test.{js,jsx}'], + include: ['test/**/*.test.{js,jsx,ts,tsx}'], exclude: ['test/browser/**'], // Suppress error stack traces from expected test failures onConsoleLog: () => false, coverage: { provider: 'v8', reporter: ['text', 'html', 'lcov'], - include: ['lib/**/*.js'], + include: ['lib/**/*.{ts,tsx}'], thresholds: { lines: 70, functions: 70, diff --git a/webpack.config.js b/webpack.config.js index 1b0af4f0..b304ac4d 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -1,10 +1,19 @@ const path = require('path'); const webpack = require('webpack'); -// Builds web module. Only really used in example code / static site. +// Builds the UMD web module (build/web/react-draggable.min.js). Only really used +// in example code / the static site and shipped via the package "unpkg" field. +// +// Webpack is retained ONLY for this UMD artifact: it maps the bare react / +// react-dom imports to the global React / ReactDOM (externals below) and emits a +// real UMD wrapper (commonjs/amd/root). tsup/esbuild's IIFE format can't +// reproduce that, so the rest of the build (cjs/esm/dts) lives in tsup.config.ts. module.exports = (env, argv) => ({ entry: { - 'react-draggable.min': './lib/cjs.js', + 'react-draggable.min': './lib/umd.ts', + }, + resolve: { + extensions: ['.tsx', '.ts', '.js'], }, output: { filename: '[name].js', @@ -47,10 +56,11 @@ module.exports = (env, argv) => ({ module: { rules: [ { - test: /\.(?:js|es).?$/, - loader: 'babel-loader', + test: /\.tsx?$/, + loader: 'esbuild-loader', options: { - cacheDirectory: false, // intended, have had bugs with env like DRAGGABLE_DEBUG in the past + target: 'es2019', + tsconfig: path.resolve(__dirname, 'tsconfig.json'), }, exclude: /(node_modules)/ } diff --git a/yarn.lock b/yarn.lock index c4405671..8853b756 100644 --- a/yarn.lock +++ b/yarn.lock @@ -34,22 +34,6 @@ resolved "https://registry.yarnpkg.com/@asamuzakjp/nwsapi/-/nwsapi-2.3.9.tgz#ad5549322dfe9d153d4b4dd6f7ff2ae234b06e24" integrity sha512-n8GuYSrI9bF7FFZ/SjhwevlHc8xaVlb/7HmHelnc/PZXBD2ZR49NnN9sMMuDdEGPeeRQ5d0hqlSlEpgCX3Wl0Q== -"@babel/cli@^7.28.3": - version "7.28.3" - resolved "https://registry.yarnpkg.com/@babel/cli/-/cli-7.28.3.tgz#f33693753bc103ab0084a5776ccf8ab8a140038b" - integrity sha512-n1RU5vuCX0CsaqaXm9I0KUCNKNQMy5epmzl/xdSSm70bSqhg9GWhgeosypyQLc0bK24+Xpk1WGzZlI9pJtkZdg== - dependencies: - "@jridgewell/trace-mapping" "^0.3.28" - 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.10.4", "@babel/code-frame@^7.27.1": version "7.27.1" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.27.1.tgz#200f715e66d52a23b221a9435534a91cc13ad5be" @@ -59,7 +43,7 @@ js-tokens "^4.0.0" picocolors "^1.1.1" -"@babel/compat-data@^7.27.2", "@babel/compat-data@^7.27.7", "@babel/compat-data@^7.28.5": +"@babel/compat-data@^7.27.2": version "7.28.5" resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.28.5.tgz#a8a4962e1567121ac0b3b487f52107443b455c7f" integrity sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA== @@ -85,15 +69,6 @@ json5 "^2.2.3" semver "^6.3.1" -"@babel/eslint-parser@^7.28.5": - version "7.28.5" - resolved "https://registry.yarnpkg.com/@babel/eslint-parser/-/eslint-parser-7.28.5.tgz#0b8883a4a1c2cbed7b3cd9d7765d80e8f480b9ae" - integrity sha512-fcdRcWahONYo+JRnJg1/AekOacGvKx12Gu0qXJXFi2WBqQA1i7+O5PaxRB7kxE/Op94dExnCiiar6T09pvdHpA== - dependencies: - "@nicolo-ribaudo/eslint-scope-5-internals" "5.1.1-v1" - eslint-visitor-keys "^2.1.0" - semver "^6.3.1" - "@babel/generator@^7.28.5": version "7.28.5" resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.28.5.tgz#712722d5e50f44d07bc7ac9fe84438742dd61298" @@ -105,14 +80,7 @@ "@jridgewell/trace-mapping" "^0.3.28" jsesc "^3.0.2" -"@babel/helper-annotate-as-pure@^7.27.1", "@babel/helper-annotate-as-pure@^7.27.3": - version "7.27.3" - resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.3.tgz#f31fd86b915fc4daf1f3ac6976c59be7084ed9c5" - integrity sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg== - dependencies: - "@babel/types" "^7.27.3" - -"@babel/helper-compilation-targets@^7.27.1", "@babel/helper-compilation-targets@^7.27.2": +"@babel/helper-compilation-targets@^7.27.2": version "7.27.2" resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz#46a0f6efab808d51d29ce96858dd10ce8732733d" integrity sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ== @@ -123,52 +91,11 @@ lru-cache "^5.1.1" semver "^6.3.1" -"@babel/helper-create-class-features-plugin@^7.27.1", "@babel/helper-create-class-features-plugin@^7.28.3": - version "7.28.5" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.28.5.tgz#472d0c28028850968979ad89f173594a6995da46" - integrity sha512-q3WC4JfdODypvxArsJQROfupPBq9+lMwjKq7C33GhbFYJsufD0yd/ziwD+hJucLeWsnFPWZjsU2DNFqBPE7jwQ== - dependencies: - "@babel/helper-annotate-as-pure" "^7.27.3" - "@babel/helper-member-expression-to-functions" "^7.28.5" - "@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.28.5" - semver "^6.3.1" - -"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.27.1": - version "7.28.5" - resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.28.5.tgz#7c1ddd64b2065c7f78034b25b43346a7e19ed997" - integrity sha512-N1EhvLtHzOvj7QQOUCCS3NrPJP8c5W6ZXCHDn7Yialuy1iu4r5EmIYkXlKNqT99Ciw+W0mDqWoR6HWMZlFP3hw== - dependencies: - "@babel/helper-annotate-as-pure" "^7.27.3" - regexpu-core "^6.3.1" - semver "^6.3.1" - -"@babel/helper-define-polyfill-provider@^0.6.5": - version "0.6.5" - resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.5.tgz#742ccf1cb003c07b48859fc9fa2c1bbe40e5f753" - integrity sha512-uJnGFcPsWQK8fvjgGP5LZUZZsYGIoPeRjSF5PGwrelYgq7Q15/Ft9NGFp1zglwgIv//W0uG4BevRuSJRyylZPg== - dependencies: - "@babel/helper-compilation-targets" "^7.27.2" - "@babel/helper-plugin-utils" "^7.27.1" - debug "^4.4.1" - lodash.debounce "^4.0.8" - resolve "^1.22.10" - "@babel/helper-globals@^7.28.0": version "7.28.0" resolved "https://registry.yarnpkg.com/@babel/helper-globals/-/helper-globals-7.28.0.tgz#b9430df2aa4e17bc28665eadeae8aa1d985e6674" integrity sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw== -"@babel/helper-member-expression-to-functions@^7.27.1", "@babel/helper-member-expression-to-functions@^7.28.5": - version "7.28.5" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.28.5.tgz#f3e07a10be37ed7a63461c63e6929575945a6150" - integrity sha512-cwM7SBRZcPCLgl8a7cY0soT1SptSzAlMH39vwiRpOQkJlh53r5hdHwLSCZpQdVLT39sZt+CRpNwYG4Y2v77atg== - dependencies: - "@babel/traverse" "^7.28.5" - "@babel/types" "^7.28.5" - "@babel/helper-module-imports@^7.27.1": version "7.27.1" resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz#7ef769a323e2655e126673bb6d2d6913bbead204" @@ -177,7 +104,7 @@ "@babel/traverse" "^7.27.1" "@babel/types" "^7.27.1" -"@babel/helper-module-transforms@^7.27.1", "@babel/helper-module-transforms@^7.28.3": +"@babel/helper-module-transforms@^7.28.3": version "7.28.3" resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.28.3.tgz#a2b37d3da3b2344fe085dab234426f2b9a2fa5f6" integrity sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw== @@ -186,44 +113,11 @@ "@babel/helper-validator-identifier" "^7.27.1" "@babel/traverse" "^7.28.3" -"@babel/helper-optimise-call-expression@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.27.1.tgz#c65221b61a643f3e62705e5dd2b5f115e35f9200" - 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.27.1": +"@babel/helper-plugin-utils@^7.27.1": version "7.27.1" resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz#ddb2f876534ff8013e6c2b299bf4d39b3c51d44c" integrity sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw== -"@babel/helper-remap-async-to-generator@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.27.1.tgz#4601d5c7ce2eb2aea58328d43725523fcd362ce6" - 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.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.27.1.tgz#b1ed2d634ce3bdb730e4b52de30f8cccfd692bc0" - 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.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.27.1.tgz#62bb91b3abba8c7f1fec0252d9dbea11b3ee7a56" - 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.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz#54da796097ab19ce67ed9f88b47bb2ec49367687" @@ -239,15 +133,6 @@ resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz#fa52f5b1e7db1ab049445b421c4471303897702f" integrity sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg== -"@babel/helper-wrap-function@^7.27.1": - version "7.28.3" - resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.28.3.tgz#fe4872092bc1438ffd0ce579e6f699609f9d0a7a" - integrity sha512-zdf983tNfLZFletc0RRXYrHrucBEg95NIFMkn6K9dbeMYnsgHaSBGcQqdsCSStG2PYwRre0Qc2NNSCXbG+xc6g== - dependencies: - "@babel/template" "^7.27.2" - "@babel/traverse" "^7.28.3" - "@babel/types" "^7.28.2" - "@babel/helpers@^7.28.4": version "7.28.4" resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.28.4.tgz#fe07274742e95bdf7cf1443593eeb8926ab63827" @@ -258,664 +143,31 @@ "@babel/parser@^7.1.0", "@babel/parser@^7.20.7", "@babel/parser@^7.27.2", "@babel/parser@^7.28.5": version "7.28.5" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.28.5.tgz#0b0225ee90362f030efd644e8034c99468893b08" - integrity sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ== - dependencies: - "@babel/types" "^7.28.5" - -"@babel/plugin-bugfix-firefox-class-in-computed-class-key@^7.28.5": - version "7.28.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.28.5.tgz#fbde57974707bbfa0376d34d425ff4fa6c732421" - integrity sha512-87GDMS3tsmMSi/3bWOte1UblL+YUTFMV8SZPZ2eSEL17s74Cw/l63rR6NmGVKMYW2GYi85nE+/d6Hw5N0bEk2Q== - dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - "@babel/traverse" "^7.28.5" - -"@babel/plugin-bugfix-safari-class-field-initializer-scope@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.27.1.tgz#43f70a6d7efd52370eefbdf55ae03d91b293856d" - 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.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.27.1.tgz#beb623bd573b8b6f3047bd04c32506adc3e58a72" - 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.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.27.1.tgz#e134a5479eb2ba9c02714e8c1ebf1ec9076124fd" - 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.28.3": - version "7.28.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.28.3.tgz#373f6e2de0016f73caf8f27004f61d167743742a" - integrity sha512-b6YTX108evsvE4YgWyQ921ZAFFQm3Bn+CA3+ZXlNVnPhx+UfsVURoPjfGAPCjBgrqo30yX/C2nZGX96DxvR9Iw== - dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - "@babel/traverse" "^7.28.3" - -"@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.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz#7844f9289546efa9febac2de4cfe358a050bd703" - integrity sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w== - -"@babel/plugin-syntax-flow@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.27.1.tgz#6c83cf0d7d635b716827284b7ecd5aead9237662" - 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.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.27.1.tgz#88894aefd2b03b5ee6ad1562a7c8e1587496aecd" - 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.yarnpkg.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.27.1.tgz#34c017d54496f9b11b61474e7ea3dfd5563ffe07" - 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.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.27.1.tgz#2f9beb5eff30fa507c5532d107daac7b888fa34c" - 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.yarnpkg.com/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz#d49a3b3e6b52e5be6740022317580234a6a47357" - 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.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.27.1.tgz#6e2061067ba3ab0266d834a9f94811196f2aba9a" - integrity sha512-8Z4TGic6xW70FKThA5HYEKKyBpOOsucTOD1DjU3fZxDg+K3zBJcXMFnt/4yQiZnf5+MiOMSXQ9PaEK/Ilh1DeA== - dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - -"@babel/plugin-transform-async-generator-functions@^7.28.0": - version "7.28.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.28.0.tgz#1276e6c7285ab2cd1eccb0bc7356b7a69ff842c2" - integrity sha512-BEOdvX4+M765icNPZeidyADIvQ1m1gmunXufXxvRESy/jNNyfovIqUyE7MVgGBjWktCoJlzvFA1To2O4ymIO3Q== - dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - "@babel/helper-remap-async-to-generator" "^7.27.1" - "@babel/traverse" "^7.28.0" - -"@babel/plugin-transform-async-to-generator@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.27.1.tgz#9a93893b9379b39466c74474f55af03de78c66e7" - 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.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.27.1.tgz#558a9d6e24cf72802dd3b62a4b51e0d62c0f57f9" - integrity sha512-cnqkuOtZLapWYZUYM5rVIdv1nXYuFVIltZ6ZJ7nIj585QsjKM5dhL2Fu/lICXZ1OyIAFc7Qy+bvDAtTXqGrlhg== - dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - -"@babel/plugin-transform-block-scoping@^7.28.5": - version "7.28.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.28.5.tgz#e0d3af63bd8c80de2e567e690a54e84d85eb16f6" - integrity sha512-45DmULpySVvmq9Pj3X9B+62Xe+DJGov27QravQJU1LLcapR6/10i+gYVAucGGJpHBp5mYxIMK4nDAT/QDLr47g== - dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - -"@babel/plugin-transform-class-properties@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.27.1.tgz#dd40a6a370dfd49d32362ae206ddaf2bb082a925" - 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.28.3": - version "7.28.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.28.3.tgz#d1b8e69b54c9993bc558203e1f49bfc979bfd852" - integrity sha512-LtPXlBbRoc4Njl/oh1CeD/3jC+atytbnf/UqLoqTDcEYGUPj022+rvfkbDYieUrSj3CaV4yHDByPE+T2HwfsJg== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.28.3" - "@babel/helper-plugin-utils" "^7.27.1" - -"@babel/plugin-transform-classes@^7.28.4": - version "7.28.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.28.4.tgz#75d66175486788c56728a73424d67cbc7473495c" - integrity sha512-cFOlhIYPBv/iBoc+KS3M6et2XPtbT2HiCRfBXWtfpc9OAyostldxIf9YAYB6ypURBBbx+Qv6nyrLzASfJe+hBA== - dependencies: - "@babel/helper-annotate-as-pure" "^7.27.3" - "@babel/helper-compilation-targets" "^7.27.2" - "@babel/helper-globals" "^7.28.0" - "@babel/helper-plugin-utils" "^7.27.1" - "@babel/helper-replace-supers" "^7.27.1" - "@babel/traverse" "^7.28.4" - -"@babel/plugin-transform-computed-properties@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.27.1.tgz#81662e78bf5e734a97982c2b7f0a793288ef3caa" - integrity sha512-lj9PGWvMTVksbWiDT2tW68zGS/cyo4AkZ/QTp0sQT0mjPopCmrSkzxeXkznjqBxzDI6TclZhOJbBmbBLjuOZUw== - dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - "@babel/template" "^7.27.1" - -"@babel/plugin-transform-destructuring@^7.28.0", "@babel/plugin-transform-destructuring@^7.28.5": - version "7.28.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.28.5.tgz#b8402764df96179a2070bb7b501a1586cf8ad7a7" - integrity sha512-Kl9Bc6D0zTUcFUvkNuQh4eGXPKKNDOJQXVyyM4ZAQPMveniJdxi8XMJwLo+xSoW3MIq81bD33lcUe9kZpl0MCw== - dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - "@babel/traverse" "^7.28.5" - -"@babel/plugin-transform-dotall-regex@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.27.1.tgz#aa6821de864c528b1fecf286f0a174e38e826f4d" - 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.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.27.1.tgz#f1fbf628ece18e12e7b32b175940e68358f546d1" - 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.yarnpkg.com/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.27.1.tgz#5043854ca620a94149372e69030ff8cb6a9eb0ec" - 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.yarnpkg.com/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.27.1.tgz#4c78f35552ac0e06aa1f6e3c573d67695e8af5a4" - integrity sha512-MHzkWQcEmjzzVW9j2q8LGjwGWpG2mjwaaB0BNQwst3FIjqsg8Ct/mIZlvSPJvfi9y2AC8mi/ktxbFVL9pZ1I4A== - dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - -"@babel/plugin-transform-explicit-resource-management@^7.28.0": - version "7.28.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-explicit-resource-management/-/plugin-transform-explicit-resource-management-7.28.0.tgz#45be6211b778dbf4b9d54c4e8a2b42fa72e09a1a" - integrity sha512-K8nhUcn3f6iB+P3gwCv/no7OdzOZQcKchW6N389V6PD8NUWKZHzndOd9sPDVbMoBsbmjMqlB4L9fm+fEFNVlwQ== - dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - "@babel/plugin-transform-destructuring" "^7.28.0" - -"@babel/plugin-transform-exponentiation-operator@^7.28.5": - version "7.28.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.28.5.tgz#7cc90a8170e83532676cfa505278e147056e94fe" - integrity sha512-D4WIMaFtwa2NizOp+dnoFjRez/ClKiC2BqqImwKd1X28nqBtZEyCYJ2ozQrrzlxAFrcrjxo39S6khe9RNDlGzw== - dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - -"@babel/plugin-transform-export-namespace-from@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.27.1.tgz#71ca69d3471edd6daa711cf4dfc3400415df9c23" - integrity sha512-tQvHWSZ3/jH2xuq/vZDy0jNn+ZdXJeM8gHvX4lnJmsc3+50yPlWdZXIc5ay+umX+2/tJIqHqiEqcJvxlmIvRvQ== - dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - -"@babel/plugin-transform-flow-comments@^7.28.5": - version "7.28.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-flow-comments/-/plugin-transform-flow-comments-7.28.5.tgz#27c9d1a4f6c72d74b28a72f9372c40793ef4db30" - integrity sha512-pARs7fxB0PDO3HWImGXxAX0cn1V+Ku4ZoI95badBPPCb3ci4xszQ9H80eHD80IQu39KhUFFpd4Ux7Pe+2aMKBA== - dependencies: - "@babel/generator" "^7.28.5" - "@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.yarnpkg.com/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.27.1.tgz#5def3e1e7730f008d683144fb79b724f92c5cdf9" - 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.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.27.1.tgz#bc24f7080e9ff721b63a70ac7b2564ca15b6c40a" - 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.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.27.1.tgz#4d0bf307720e4dce6d7c30fcb1fd6ca77bdeb3a7" - 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.yarnpkg.com/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.27.1.tgz#a2e0ce6ef256376bd527f290da023983527a4f4c" - 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.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.27.1.tgz#baaefa4d10a1d4206f9dcdda50d7d5827bb70b24" - integrity sha512-0HCFSepIpLTkLcsi86GG3mTUzxV5jpmbv97hTETW3yzrAij8aqlD36toB1D0daVFJM8NK6GvKO0gslVQmm+zZA== - dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - -"@babel/plugin-transform-logical-assignment-operators@^7.28.5": - version "7.28.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.28.5.tgz#d028fd6db8c081dee4abebc812c2325e24a85b0e" - integrity sha512-axUuqnUTBuXyHGcJEVVh9pORaN6wC5bYfE7FGzPiaWa3syib9m7g+/IT/4VgCOe2Upef43PHzeAvcrVek6QuuA== - dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - -"@babel/plugin-transform-member-expression-literals@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.27.1.tgz#37b88ba594d852418e99536f5612f795f23aeaf9" - 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.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.27.1.tgz#a4145f9d87c2291fe2d05f994b65dba4e3e7196f" - 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.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.27.1.tgz#8e44ed37c2787ecc23bdc367f49977476614e832" - 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.28.5": - version "7.28.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.28.5.tgz#7439e592a92d7670dfcb95d0cbc04bd3e64801d2" - integrity sha512-vn5Jma98LCOeBy/KpeQhXcV2WZgaRUtjwQmjoBuLNlOmkg0fB5pdvYVeWRYI69wWKwK2cD1QbMiUQnoujWvrew== - dependencies: - "@babel/helper-module-transforms" "^7.28.3" - "@babel/helper-plugin-utils" "^7.27.1" - "@babel/helper-validator-identifier" "^7.28.5" - "@babel/traverse" "^7.28.5" - -"@babel/plugin-transform-modules-umd@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.27.1.tgz#63f2cf4f6dc15debc12f694e44714863d34cd334" - 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.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.27.1.tgz#f32b8f7818d8fc0cc46ee20a8ef75f071af976e1" - 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.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.27.1.tgz#259c43939728cad1706ac17351b7e6a7bea1abeb" - 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.yarnpkg.com/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.27.1.tgz#4f9d3153bf6782d73dd42785a9d22d03197bc91d" - 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.yarnpkg.com/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.27.1.tgz#614e0b15cc800e5997dadd9bd6ea524ed6c819c6" - integrity sha512-fdPKAcujuvEChxDBJ5c+0BTaS6revLV7CJL08e4m3de8qJfNIuCc2nc7XJYOjBoTMJeqSmwXJ0ypE14RCjLwaw== - dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - -"@babel/plugin-transform-object-rest-spread@^7.28.4": - version "7.28.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.28.4.tgz#9ee1ceca80b3e6c4bac9247b2149e36958f7f98d" - integrity sha512-373KA2HQzKhQCYiRVIRr+3MjpCObqzDlyrM6u4I201wL8Mp2wHf7uB8GhDwis03k2ti8Zr65Zyyqs1xOxUF/Ew== - dependencies: - "@babel/helper-compilation-targets" "^7.27.2" - "@babel/helper-plugin-utils" "^7.27.1" - "@babel/plugin-transform-destructuring" "^7.28.0" - "@babel/plugin-transform-parameters" "^7.27.7" - "@babel/traverse" "^7.28.4" - -"@babel/plugin-transform-object-super@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.27.1.tgz#1c932cd27bf3874c43a5cac4f43ebf970c9871b5" - 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.yarnpkg.com/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.27.1.tgz#84c7341ebde35ccd36b137e9e45866825072a30c" - integrity sha512-txEAEKzYrHEX4xSZN4kJ+OfKXFVSWKB2ZxM9dpcE3wT7smwkNmXo5ORRlVzMVdJbD+Q8ILTgSD7959uj+3Dm3Q== - dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - -"@babel/plugin-transform-optional-chaining@^7.27.1", "@babel/plugin-transform-optional-chaining@^7.28.5": - version "7.28.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.28.5.tgz#8238c785f9d5c1c515a90bf196efb50d075a4b26" - integrity sha512-N6fut9IZlPnjPwgiQkXNhb+cT8wQKFlJNqcZkWlcTqkcqx6/kU4ynGmLFoa4LViBSirn05YAwk+sQBbPfxtYzQ== - dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - "@babel/helper-skip-transparent-expression-wrappers" "^7.27.1" - -"@babel/plugin-transform-parameters@^7.27.7": - version "7.27.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.27.7.tgz#1fd2febb7c74e7d21cf3b05f7aebc907940af53a" - integrity sha512-qBkYTYCb76RRxUM6CcZA5KRu8K4SM8ajzVeUgVdMVO9NN9uI/GaVmBg/WKJJGnNokV9SY8FxNOVWGXzqzUidBg== - dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - -"@babel/plugin-transform-private-methods@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.27.1.tgz#fdacbab1c5ed81ec70dfdbb8b213d65da148b6af" - 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.yarnpkg.com/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.27.1.tgz#4dbbef283b5b2f01a21e81e299f76e35f900fb11" - 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.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.27.1.tgz#07eafd618800591e88073a0af1b940d9a42c6424" - integrity sha512-oThy3BCuCha8kDZ8ZkgOg2exvPYUlprMukKQXI1r1pJ47NCvxfkEy8vK+r/hT9nF0Aa4H1WUPZZjHTFtAhGfmQ== - dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - -"@babel/plugin-transform-react-display-name@^7.28.0": - version "7.28.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.28.0.tgz#6f20a7295fea7df42eb42fed8f896813f5b934de" - integrity sha512-D6Eujc2zMxKjfa4Zxl4GHMsmhKKZ9VpcqIchJLvwTxad9zWIYulwYItBovpDOoNLISpcZSXoDJ5gaGbQUDqViA== - dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - -"@babel/plugin-transform-react-jsx-development@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.27.1.tgz#47ff95940e20a3a70e68ad3d4fcb657b647f6c98" - integrity sha512-ykDdF5yI4f1WrAolLqeF3hmYU12j9ntLQl/AOG1HAS21jxyg1Q0/J/tpREuYLfatGdGmXp/3yS0ZA76kOlVq9Q== - dependencies: - "@babel/plugin-transform-react-jsx" "^7.27.1" - -"@babel/plugin-transform-react-jsx-self@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.27.1.tgz#af678d8506acf52c577cac73ff7fe6615c85fc92" - integrity sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw== - dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - -"@babel/plugin-transform-react-jsx-source@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.27.1.tgz#dcfe2c24094bb757bf73960374e7c55e434f19f0" - integrity sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw== - dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - -"@babel/plugin-transform-react-jsx@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.27.1.tgz#1023bc94b78b0a2d68c82b5e96aed573bcfb9db0" - 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.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.27.1.tgz#339f1ce355eae242e0649f232b1c68907c02e879" - 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.28.4": - version "7.28.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.28.4.tgz#9d3fa3bebb48ddd0091ce5729139cd99c67cea51" - integrity sha512-+ZEdQlBoRg9m2NnzvEeLgtvBMO4tkFBw5SQIUgLICgTrumLoU7lr+Oghi6km2PFj+dbUt2u1oby2w3BDO9YQnA== - dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - -"@babel/plugin-transform-regexp-modifiers@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.27.1.tgz#df9ba5577c974e3f1449888b70b76169998a6d09" - 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.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.27.1.tgz#40fba4878ccbd1c56605a4479a3a891ac0274bb4" - 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.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.27.1.tgz#532abdacdec87bfee1e0ef8e2fcdee543fe32b90" - 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.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.27.1.tgz#1a264d5fc12750918f50e3fe3e24e437178abb08" - 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.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.27.1.tgz#18984935d9d2296843a491d78a014939f7dcd280" - 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.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.27.1.tgz#1a0eb35d8bb3e6efc06c9fd40eb0bcef548328b8" - 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.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.27.1.tgz#70e966bb492e03509cf37eafa6dcc3051f844369" - 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.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.27.1.tgz#3e3143f8438aef842de28816ece58780190cf806" - 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.yarnpkg.com/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.27.1.tgz#bdfe2d3170c78c5691a3c3be934c8c0087525956" - 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.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.27.1.tgz#25948f5c395db15f609028e370667ed8bae9af97" - 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.yarnpkg.com/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.27.1.tgz#6ab706d10f801b5c72da8bb2548561fa04193cd1" - 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.28.5": - version "7.28.5" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.28.5.tgz#82dd159d1563f219a1ce94324b3071eb89e280b0" - integrity sha512-S36mOoi1Sb6Fz98fBfE+UZSpYw5mJm0NUHtIKrOuNcqeFauy1J6dIvXm2KRVKobOSaGq4t/hBXdN4HGU3wL9Wg== + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.28.5.tgz#0b0225ee90362f030efd644e8034c99468893b08" + integrity sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ== dependencies: - "@babel/compat-data" "^7.28.5" - "@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.28.5" - "@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.28.3" - "@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.28.0" - "@babel/plugin-transform-async-to-generator" "^7.27.1" - "@babel/plugin-transform-block-scoped-functions" "^7.27.1" - "@babel/plugin-transform-block-scoping" "^7.28.5" - "@babel/plugin-transform-class-properties" "^7.27.1" - "@babel/plugin-transform-class-static-block" "^7.28.3" - "@babel/plugin-transform-classes" "^7.28.4" - "@babel/plugin-transform-computed-properties" "^7.27.1" - "@babel/plugin-transform-destructuring" "^7.28.5" - "@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-explicit-resource-management" "^7.28.0" - "@babel/plugin-transform-exponentiation-operator" "^7.28.5" - "@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.28.5" - "@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.28.5" - "@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.28.4" - "@babel/plugin-transform-object-super" "^7.27.1" - "@babel/plugin-transform-optional-catch-binding" "^7.27.1" - "@babel/plugin-transform-optional-chaining" "^7.28.5" - "@babel/plugin-transform-parameters" "^7.27.7" - "@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.28.4" - "@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.14" - babel-plugin-polyfill-corejs3 "^0.13.0" - babel-plugin-polyfill-regenerator "^0.6.5" - core-js-compat "^3.43.0" - semver "^6.3.1" + "@babel/types" "^7.28.5" -"@babel/preset-flow@^7.27.1": +"@babel/plugin-transform-react-jsx-self@^7.27.1": version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/preset-flow/-/preset-flow-7.27.1.tgz#3050ed7c619e8c4bfd0e0eeee87a2fa86a4bb1c6" - integrity sha512-ez3a2it5Fn6P54W8QkbfIyyIbxlXvcxyWHHvno1Wg0Ej5eiJY5hBb8ExttoIOJJk7V2dZE6prP7iby5q2aQ0Lg== + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.27.1.tgz#af678d8506acf52c577cac73ff7fe6615c85fc92" + integrity sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw== 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.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz#ccb88a2c49c817236861fee7826080573b8a923a" - 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.28.5": - version "7.28.5" - resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.28.5.tgz#6fcc0400fa79698433d653092c3919bb4b0878d9" - integrity sha512-Z3J8vhRq7CeLjdC58jLv4lnZ5RKFUJWqH5emvxmv9Hv3BD1T9R/Im713R4MTKwvFaV74ejZ3sM01LyEKk4ugNQ== +"@babel/plugin-transform-react-jsx-source@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.27.1.tgz#dcfe2c24094bb757bf73960374e7c55e434f19f0" + integrity sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw== dependencies: "@babel/helper-plugin-utils" "^7.27.1" - "@babel/helper-validator-option" "^7.27.1" - "@babel/plugin-transform-react-display-name" "^7.28.0" - "@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/runtime@^7.12.5": version "7.28.4" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.28.4.tgz#a70226016fabe25c5783b2f22d3e1c9bc5ca3326" integrity sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ== -"@babel/template@^7.27.1", "@babel/template@^7.27.2": +"@babel/template@^7.27.2": version "7.27.2" resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.27.2.tgz#fa78ceed3c4e7b63ebf6cb39e5852fca45f6809d" integrity sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw== @@ -924,7 +176,7 @@ "@babel/parser" "^7.27.2" "@babel/types" "^7.27.1" -"@babel/traverse@^7.27.1", "@babel/traverse@^7.28.0", "@babel/traverse@^7.28.3", "@babel/traverse@^7.28.4", "@babel/traverse@^7.28.5": +"@babel/traverse@^7.27.1", "@babel/traverse@^7.28.3", "@babel/traverse@^7.28.5": version "7.28.5" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.28.5.tgz#450cab9135d21a7a2ca9d2d35aa05c20e68c360b" integrity sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ== @@ -937,7 +189,7 @@ "@babel/types" "^7.28.5" debug "^4.3.1" -"@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.27.1", "@babel/types@^7.27.3", "@babel/types@^7.28.2", "@babel/types@^7.28.4", "@babel/types@^7.28.5", "@babel/types@^7.4.4": +"@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.27.1", "@babel/types@^7.28.2", "@babel/types@^7.28.4", "@babel/types@^7.28.5": version "7.28.5" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.28.5.tgz#10fc405f60897c35f07e85493c932c7b5ca0592b" integrity sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA== @@ -993,131 +245,261 @@ resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.27.2.tgz#521cbd968dcf362094034947f76fa1b18d2d403c" integrity sha512-GZMB+a0mOMZs4MpDbj8RJp4cw+w1WV5NYD6xzgvzUJ5Ek2jerwfO2eADyI6ExDSUED+1X8aMbegahsJi+8mgpw== +"@esbuild/aix-ppc64@0.27.7": + version "0.27.7" + resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.27.7.tgz#82b74f92aa78d720b714162939fb248c90addf53" + integrity sha512-EKX3Qwmhz1eMdEJokhALr0YiD0lhQNwDqkPYyPhiSwKrh7/4KRjQc04sZ8db+5DVVnZ1LmbNDI1uAMPEUBnQPg== + "@esbuild/android-arm64@0.27.2": version "0.27.2" resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.27.2.tgz#61ea550962d8aa12a9b33194394e007657a6df57" integrity sha512-pvz8ZZ7ot/RBphf8fv60ljmaoydPU12VuXHImtAs0XhLLw+EXBi2BLe3OYSBslR4rryHvweW5gmkKFwTiFy6KA== +"@esbuild/android-arm64@0.27.7": + version "0.27.7" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.27.7.tgz#f78cb8a3121fc205a53285adb24972db385d185d" + integrity sha512-62dPZHpIXzvChfvfLJow3q5dDtiNMkwiRzPylSCfriLvZeq0a1bWChrGx/BbUbPwOrsWKMn8idSllklzBy+dgQ== + "@esbuild/android-arm@0.27.2": version "0.27.2" resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.27.2.tgz#554887821e009dd6d853f972fde6c5143f1de142" integrity sha512-DVNI8jlPa7Ujbr1yjU2PfUSRtAUZPG9I1RwW4F4xFB1Imiu2on0ADiI/c3td+KmDtVKNbi+nffGDQMfcIMkwIA== +"@esbuild/android-arm@0.27.7": + version "0.27.7" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.27.7.tgz#593e10a1450bbfcac6cb321f61f468453bac209d" + integrity sha512-jbPXvB4Yj2yBV7HUfE2KHe4GJX51QplCN1pGbYjvsyCZbQmies29EoJbkEc+vYuU5o45AfQn37vZlyXy4YJ8RQ== + "@esbuild/android-x64@0.27.2": version "0.27.2" resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.27.2.tgz#a7ce9d0721825fc578f9292a76d9e53334480ba2" integrity sha512-z8Ank4Byh4TJJOh4wpz8g2vDy75zFL0TlZlkUkEwYXuPSgX8yzep596n6mT7905kA9uHZsf/o2OJZubl2l3M7A== +"@esbuild/android-x64@0.27.7": + version "0.27.7" + resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.27.7.tgz#453143d073326033d2d22caf9e48de4bae274b07" + integrity sha512-x5VpMODneVDb70PYV2VQOmIUUiBtY3D3mPBG8NxVk5CogneYhkR7MmM3yR/uMdITLrC1ml/NV1rj4bMJuy9MCg== + "@esbuild/darwin-arm64@0.27.2": version "0.27.2" resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.27.2.tgz#2cb7659bd5d109803c593cfc414450d5430c8256" integrity sha512-davCD2Zc80nzDVRwXTcQP/28fiJbcOwvdolL0sOiOsbwBa72kegmVU0Wrh1MYrbuCL98Omp5dVhQFWRKR2ZAlg== +"@esbuild/darwin-arm64@0.27.7": + version "0.27.7" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.27.7.tgz#6f23000fb9b40b7e04b7d0606c0693bd0632f322" + integrity sha512-5lckdqeuBPlKUwvoCXIgI2D9/ABmPq3Rdp7IfL70393YgaASt7tbju3Ac+ePVi3KDH6N2RqePfHnXkaDtY9fkw== + "@esbuild/darwin-x64@0.27.2": version "0.27.2" resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.27.2.tgz#e741fa6b1abb0cd0364126ba34ca17fd5e7bf509" integrity sha512-ZxtijOmlQCBWGwbVmwOF/UCzuGIbUkqB1faQRf5akQmxRJ1ujusWsb3CVfk/9iZKr2L5SMU5wPBi1UWbvL+VQA== +"@esbuild/darwin-x64@0.27.7": + version "0.27.7" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.27.7.tgz#27393dd18bb1263c663979c5f1576e00c2d024be" + integrity sha512-rYnXrKcXuT7Z+WL5K980jVFdvVKhCHhUwid+dDYQpH+qu+TefcomiMAJpIiC2EM3Rjtq0sO3StMV/+3w3MyyqQ== + "@esbuild/freebsd-arm64@0.27.2": version "0.27.2" resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.2.tgz#2b64e7116865ca172d4ce034114c21f3c93e397c" integrity sha512-lS/9CN+rgqQ9czogxlMcBMGd+l8Q3Nj1MFQwBZJyoEKI50XGxwuzznYdwcav6lpOGv5BqaZXqvBSiB/kJ5op+g== +"@esbuild/freebsd-arm64@0.27.7": + version "0.27.7" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.7.tgz#22e4638fa502d1c0027077324c97640e3adf3a62" + integrity sha512-B48PqeCsEgOtzME2GbNM2roU29AMTuOIN91dsMO30t+Ydis3z/3Ngoj5hhnsOSSwNzS+6JppqWsuhTp6E82l2w== + "@esbuild/freebsd-x64@0.27.2": version "0.27.2" resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.27.2.tgz#e5252551e66f499e4934efb611812f3820e990bb" integrity sha512-tAfqtNYb4YgPnJlEFu4c212HYjQWSO/w/h/lQaBK7RbwGIkBOuNKQI9tqWzx7Wtp7bTPaGC6MJvWI608P3wXYA== +"@esbuild/freebsd-x64@0.27.7": + version "0.27.7" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.27.7.tgz#9224b8e4fea924ce2194e3efc3e9aebf822192d6" + integrity sha512-jOBDK5XEjA4m5IJK3bpAQF9/Lelu/Z9ZcdhTRLf4cajlB+8VEhFFRjWgfy3M1O4rO2GQ/b2dLwCUGpiF/eATNQ== + "@esbuild/linux-arm64@0.27.2": version "0.27.2" resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.27.2.tgz#dc4acf235531cd6984f5d6c3b13dbfb7ddb303cb" integrity sha512-hYxN8pr66NsCCiRFkHUAsxylNOcAQaxSSkHMMjcpx0si13t1LHFphxJZUiGwojB1a/Hd5OiPIqDdXONia6bhTw== +"@esbuild/linux-arm64@0.27.7": + version "0.27.7" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.27.7.tgz#4f5d1c27527d817b35684ae21419e57c2bda0966" + integrity sha512-RZPHBoxXuNnPQO9rvjh5jdkRmVizktkT7TCDkDmQ0W2SwHInKCAV95GRuvdSvA7w4VMwfCjUiPwDi0ZO6Nfe9A== + "@esbuild/linux-arm@0.27.2": version "0.27.2" resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.27.2.tgz#56a900e39240d7d5d1d273bc053daa295c92e322" integrity sha512-vWfq4GaIMP9AIe4yj1ZUW18RDhx6EPQKjwe7n8BbIecFtCQG4CfHGaHuh7fdfq+y3LIA2vGS/o9ZBGVxIDi9hw== +"@esbuild/linux-arm@0.27.7": + version "0.27.7" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.27.7.tgz#b9e9d070c8c1c0449cf12b20eac37d70a4595921" + integrity sha512-RkT/YXYBTSULo3+af8Ib0ykH8u2MBh57o7q/DAs3lTJlyVQkgQvlrPTnjIzzRPQyavxtPtfg0EopvDyIt0j1rA== + "@esbuild/linux-ia32@0.27.2": version "0.27.2" resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.27.2.tgz#d4a36d473360f6870efcd19d52bbfff59a2ed1cc" integrity sha512-MJt5BRRSScPDwG2hLelYhAAKh9imjHK5+NE/tvnRLbIqUWa+0E9N4WNMjmp/kXXPHZGqPLxggwVhz7QP8CTR8w== +"@esbuild/linux-ia32@0.27.7": + version "0.27.7" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.27.7.tgz#3f80fb696aa96051a94047f35c85b08b21c36f9e" + integrity sha512-GA48aKNkyQDbd3KtkplYWT102C5sn/EZTY4XROkxONgruHPU72l+gW+FfF8tf2cFjeHaRbWpOYa/uRBz/Xq1Pg== + "@esbuild/linux-loong64@0.27.2": version "0.27.2" resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.27.2.tgz#fcf0ab8c3eaaf45891d0195d4961cb18b579716a" integrity sha512-lugyF1atnAT463aO6KPshVCJK5NgRnU4yb3FUumyVz+cGvZbontBgzeGFO1nF+dPueHD367a2ZXe1NtUkAjOtg== +"@esbuild/linux-loong64@0.27.7": + version "0.27.7" + resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.27.7.tgz#9be1f2c28210b13ebb4156221bba356fe1675205" + integrity sha512-a4POruNM2oWsD4WKvBSEKGIiWQF8fZOAsycHOt6JBpZ+JN2n2JH9WAv56SOyu9X5IqAjqSIPTaJkqN8F7XOQ5Q== + "@esbuild/linux-mips64el@0.27.2": version "0.27.2" resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.27.2.tgz#598b67d34048bb7ee1901cb12e2a0a434c381c10" integrity sha512-nlP2I6ArEBewvJ2gjrrkESEZkB5mIoaTswuqNFRv/WYd+ATtUpe9Y09RnJvgvdag7he0OWgEZWhviS1OTOKixw== +"@esbuild/linux-mips64el@0.27.7": + version "0.27.7" + resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.27.7.tgz#4ab5ee67a3dfcbcb5e8fd7883dae6e735b1163b8" + integrity sha512-KabT5I6StirGfIz0FMgl1I+R1H73Gp0ofL9A3nG3i/cYFJzKHhouBV5VWK1CSgKvVaG4q1RNpCTR2LuTVB3fIw== + "@esbuild/linux-ppc64@0.27.2": version "0.27.2" resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.27.2.tgz#3846c5df6b2016dab9bc95dde26c40f11e43b4c0" integrity sha512-C92gnpey7tUQONqg1n6dKVbx3vphKtTHJaNG2Ok9lGwbZil6DrfyecMsp9CrmXGQJmZ7iiVXvvZH6Ml5hL6XdQ== +"@esbuild/linux-ppc64@0.27.7": + version "0.27.7" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.27.7.tgz#dac78c689f6499459c4321e5c15032c12307e7ea" + integrity sha512-gRsL4x6wsGHGRqhtI+ifpN/vpOFTQtnbsupUF5R5YTAg+y/lKelYR1hXbnBdzDjGbMYjVJLJTd2OFmMewAgwlQ== + "@esbuild/linux-riscv64@0.27.2": version "0.27.2" resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.27.2.tgz#173d4475b37c8d2c3e1707e068c174bb3f53d07d" integrity sha512-B5BOmojNtUyN8AXlK0QJyvjEZkWwy/FKvakkTDCziX95AowLZKR6aCDhG7LeF7uMCXEJqwa8Bejz5LTPYm8AvA== +"@esbuild/linux-riscv64@0.27.7": + version "0.27.7" + resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.27.7.tgz#050f7d3b355c3a98308e935bc4d6325da91b0027" + integrity sha512-hL25LbxO1QOngGzu2U5xeXtxXcW+/GvMN3ejANqXkxZ/opySAZMrc+9LY/WyjAan41unrR3YrmtTsUpwT66InQ== + "@esbuild/linux-s390x@0.27.2": version "0.27.2" resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.27.2.tgz#f7a4790105edcab8a5a31df26fbfac1aa3dacfab" integrity sha512-p4bm9+wsPwup5Z8f4EpfN63qNagQ47Ua2znaqGH6bqLlmJ4bx97Y9JdqxgGZ6Y8xVTixUnEkoKSHcpRlDnNr5w== +"@esbuild/linux-s390x@0.27.7": + version "0.27.7" + resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.27.7.tgz#d61f715ce61d43fe5844ad0d8f463f88cbe4fef6" + integrity sha512-2k8go8Ycu1Kb46vEelhu1vqEP+UeRVj2zY1pSuPdgvbd5ykAw82Lrro28vXUrRmzEsUV0NzCf54yARIK8r0fdw== + "@esbuild/linux-x64@0.27.2": version "0.27.2" resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.27.2.tgz#2ecc1284b1904aeb41e54c9ddc7fcd349b18f650" integrity sha512-uwp2Tip5aPmH+NRUwTcfLb+W32WXjpFejTIOWZFw/v7/KnpCDKG66u4DLcurQpiYTiYwQ9B7KOeMJvLCu/OvbA== +"@esbuild/linux-x64@0.27.7": + version "0.27.7" + resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.27.7.tgz#ca8e1aa478fc8209257bf3ac8f79c4dc2982f32a" + integrity sha512-hzznmADPt+OmsYzw1EE33ccA+HPdIqiCRq7cQeL1Jlq2gb1+OyWBkMCrYGBJ+sxVzve2ZJEVeePbLM2iEIZSxA== + "@esbuild/netbsd-arm64@0.27.2": version "0.27.2" resolved "https://registry.yarnpkg.com/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.2.tgz#e2863c2cd1501845995cb11adf26f7fe4be527b0" integrity sha512-Kj6DiBlwXrPsCRDeRvGAUb/LNrBASrfqAIok+xB0LxK8CHqxZ037viF13ugfsIpePH93mX7xfJp97cyDuTZ3cw== +"@esbuild/netbsd-arm64@0.27.7": + version "0.27.7" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.7.tgz#1650f2c1b948deeb3ef948f2fc30614723c09690" + integrity sha512-b6pqtrQdigZBwZxAn1UpazEisvwaIDvdbMbmrly7cDTMFnw/+3lVxxCTGOrkPVnsYIosJJXAsILG9XcQS+Yu6w== + "@esbuild/netbsd-x64@0.27.2": version "0.27.2" resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.27.2.tgz#93f7609e2885d1c0b5a1417885fba8d1fcc41272" integrity sha512-HwGDZ0VLVBY3Y+Nw0JexZy9o/nUAWq9MlV7cahpaXKW6TOzfVno3y3/M8Ga8u8Yr7GldLOov27xiCnqRZf0tCA== +"@esbuild/netbsd-x64@0.27.7": + version "0.27.7" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.27.7.tgz#65772ab342c4b3319bf0705a211050aac1b6e320" + integrity sha512-OfatkLojr6U+WN5EDYuoQhtM+1xco+/6FSzJJnuWiUw5eVcicbyK3dq5EeV/QHT1uy6GoDhGbFpprUiHUYggrw== + "@esbuild/openbsd-arm64@0.27.2": version "0.27.2" resolved "https://registry.yarnpkg.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.2.tgz#a1985604a203cdc325fd47542e106fafd698f02e" integrity sha512-DNIHH2BPQ5551A7oSHD0CKbwIA/Ox7+78/AWkbS5QoRzaqlev2uFayfSxq68EkonB+IKjiuxBFoV8ESJy8bOHA== +"@esbuild/openbsd-arm64@0.27.7": + version "0.27.7" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.7.tgz#37ed7cfa66549d7955852fce37d0c3de4e715ea1" + integrity sha512-AFuojMQTxAz75Fo8idVcqoQWEHIXFRbOc1TrVcFSgCZtQfSdc1RXgB3tjOn/krRHENUB4j00bfGjyl2mJrU37A== + "@esbuild/openbsd-x64@0.27.2": version "0.27.2" resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.27.2.tgz#8209e46c42f1ffbe6e4ef77a32e1f47d404ad42a" integrity sha512-/it7w9Nb7+0KFIzjalNJVR5bOzA9Vay+yIPLVHfIQYG/j+j9VTH84aNB8ExGKPU4AzfaEvN9/V4HV+F+vo8OEg== +"@esbuild/openbsd-x64@0.27.7": + version "0.27.7" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.27.7.tgz#01bf3d385855ef50cb33db7c4b52f957c34cd179" + integrity sha512-+A1NJmfM8WNDv5CLVQYJ5PshuRm/4cI6WMZRg1by1GwPIQPCTs1GLEUHwiiQGT5zDdyLiRM/l1G0Pv54gvtKIg== + "@esbuild/openharmony-arm64@0.27.2": version "0.27.2" resolved "https://registry.yarnpkg.com/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.2.tgz#8fade4441893d9cc44cbd7dcf3776f508ab6fb2f" integrity sha512-LRBbCmiU51IXfeXk59csuX/aSaToeG7w48nMwA6049Y4J4+VbWALAuXcs+qcD04rHDuSCSRKdmY63sruDS5qag== +"@esbuild/openharmony-arm64@0.27.7": + version "0.27.7" + resolved "https://registry.yarnpkg.com/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.7.tgz#6c1f94b34086599aabda4eac8f638294b9877410" + integrity sha512-+KrvYb/C8zA9CU/g0sR6w2RBw7IGc5J2BPnc3dYc5VJxHCSF1yNMxTV5LQ7GuKteQXZtspjFbiuW5/dOj7H4Yw== + "@esbuild/sunos-x64@0.27.2": version "0.27.2" resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.27.2.tgz#980d4b9703a16f0f07016632424fc6d9a789dfc2" integrity sha512-kMtx1yqJHTmqaqHPAzKCAkDaKsffmXkPHThSfRwZGyuqyIeBvf08KSsYXl+abf5HDAPMJIPnbBfXvP2ZC2TfHg== +"@esbuild/sunos-x64@0.27.7": + version "0.27.7" + resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.27.7.tgz#4b0dd17ae0a6941d2d0fd35a906392517071a90d" + integrity sha512-ikktIhFBzQNt/QDyOL580ti9+5mL/YZeUPKU2ivGtGjdTYoqz6jObj6nOMfhASpS4GU4Q/Clh1QtxWAvcYKamA== + "@esbuild/win32-arm64@0.27.2": version "0.27.2" resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.27.2.tgz#1c09a3633c949ead3d808ba37276883e71f6111a" integrity sha512-Yaf78O/B3Kkh+nKABUF++bvJv5Ijoy9AN1ww904rOXZFLWVc5OLOfL56W+C8F9xn5JQZa3UX6m+IktJnIb1Jjg== +"@esbuild/win32-arm64@0.27.7": + version "0.27.7" + resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.27.7.tgz#34193ab5565d6ff68ca928ac04be75102ccb2e77" + integrity sha512-7yRhbHvPqSpRUV7Q20VuDwbjW5kIMwTHpptuUzV+AA46kiPze5Z7qgt6CLCK3pWFrHeNfDd1VKgyP4O+ng17CA== + "@esbuild/win32-ia32@0.27.2": version "0.27.2" resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.27.2.tgz#1b1e3a63ad4bef82200fef4e369e0fff7009eee5" integrity sha512-Iuws0kxo4yusk7sw70Xa2E2imZU5HoixzxfGCdxwBdhiDgt9vX9VUCBhqcwY7/uh//78A1hMkkROMJq9l27oLQ== +"@esbuild/win32-ia32@0.27.7": + version "0.27.7" + resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.27.7.tgz#eb67f0e4482515d8c1894ede631c327a4da9fc4d" + integrity sha512-SmwKXe6VHIyZYbBLJrhOoCJRB/Z1tckzmgTLfFYOfpMAx63BJEaL9ExI8x7v0oAO3Zh6D/Oi1gVxEYr5oUCFhw== + "@esbuild/win32-x64@0.27.2": version "0.27.2" resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.27.2.tgz#9e585ab6086bef994c6e8a5b3a0481219ada862b" integrity sha512-sRdU18mcKf7F+YgheI/zGf5alZatMUTKj/jNS6l744f9u3WFu4v7twcUI9vu4mknF4Y9aDlblIie0IM+5xxaqQ== +"@esbuild/win32-x64@0.27.7": + version "0.27.7" + resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.27.7.tgz#8fe30b3088b89b4873c3a6cc87597ae3920c0a8b" + integrity sha512-56hiAJPhwQ1R4i+21FVF7V8kSD5zZTdHcVuRFMW0hn753vVfQN8xlx4uOPT4xoGH0Z/oVATuR82AiqSTDIpaHg== + "@eslint-community/eslint-utils@^4.8.0": version "4.9.0" resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.9.0.tgz#7308df158e064f0dd8b8fdb58aa14fa2a7f913b3" @@ -1125,7 +507,14 @@ dependencies: eslint-visitor-keys "^3.4.3" -"@eslint-community/regexpp@^4.12.1": +"@eslint-community/eslint-utils@^4.9.1": + version "4.9.1" + resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz#4e90af67bc51ddee6cdef5284edf572ec376b595" + integrity sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ== + dependencies: + eslint-visitor-keys "^3.4.3" + +"@eslint-community/regexpp@^4.12.1", "@eslint-community/regexpp@^4.12.2": version "4.12.2" resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.12.2.tgz#bccdf615bcf7b6e8db830ec0b8d21c9a25de597b" integrity sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew== @@ -1214,7 +603,7 @@ resolved "https://registry.yarnpkg.com/@humanwhocodes/retry/-/retry-0.4.3.tgz#c2b9d2e374ee62c586d3adbea87199b1d7a7a6ba" integrity sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ== -"@jridgewell/gen-mapping@^0.3.12", "@jridgewell/gen-mapping@^0.3.5": +"@jridgewell/gen-mapping@^0.3.12", "@jridgewell/gen-mapping@^0.3.2", "@jridgewell/gen-mapping@^0.3.5": version "0.3.13" resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz#6342a19f44347518c93e43b1ac69deb3c4656a1f" integrity sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA== @@ -1306,18 +695,6 @@ resolved "https://registry.yarnpkg.com/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz#4fc56c15c580b9adb7dc3c333a134e540b44bfb1" integrity sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw== -"@nicolo-ribaudo/chokidar-2@2.1.8-no-fsevents.3": - version "2.1.8-no-fsevents.3" - resolved "https://registry.yarnpkg.com/@nicolo-ribaudo/chokidar-2/-/chokidar-2-2.1.8-no-fsevents.3.tgz#323d72dd25103d0c4fbdce89dadf574a787b1f9b" - integrity sha512-s88O1aVtXftvp5bCPB7WnmXc5IwOZZ7YPuwNPt+GtOOXpPvad1LfbmjYv+qII7zP6RU2QGnqve27dnLycEnyEQ== - -"@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1": - version "5.1.1-v1" - resolved "https://registry.yarnpkg.com/@nicolo-ribaudo/eslint-scope-5-internals/-/eslint-scope-5-internals-5.1.1-v1.tgz#dbf733a965ca47b1973177dc0bb6c889edcfb129" - integrity sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg== - dependencies: - eslint-scope "5.1.1" - "@puppeteer/browsers@2.11.0": version "2.11.0" resolved "https://registry.yarnpkg.com/@puppeteer/browsers/-/browsers-2.11.0.tgz#b2dcd7cb02dd2de5909531d00e717a04bd61de73" @@ -1341,111 +718,236 @@ resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.54.0.tgz#f3ff5dbde305c4fa994d49aeb0a5db5305eff03b" integrity sha512-OywsdRHrFvCdvsewAInDKCNyR3laPA2mc9bRYJ6LBp5IyvF3fvXbbNR0bSzHlZVFtn6E0xw2oZlyjg4rKCVcng== +"@rollup/rollup-android-arm-eabi@4.60.4": + version "4.60.4" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.60.4.tgz#3a04f01e9f01392bbef5920b94aa3b88794be7ab" + integrity sha512-F5QXMSiFebS9hKZj02XhWLLnRpJ3B3AROP0tWbFBSj+6kCbg5m9j5JoHKd4mmSVy5mS/IMQloYgYxCuJC0fxEQ== + "@rollup/rollup-android-arm64@4.54.0": version "4.54.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.54.0.tgz#c97d6ee47846a7ab1cd38e968adce25444a90a19" integrity sha512-Skx39Uv+u7H224Af+bDgNinitlmHyQX1K/atIA32JP3JQw6hVODX5tkbi2zof/E69M1qH2UoN3Xdxgs90mmNYw== +"@rollup/rollup-android-arm64@4.60.4": + version "4.60.4" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.60.4.tgz#e371b653ceabc900790ae73f5548a0fd7cd63a70" + integrity sha512-GxxTKApUpzRhof7poWvCJHRF51C67u1R7D6DiluBE8wKU1u5GWE8t+v81JvJYtbawoBFX1hLv5Ei4eVjkWokaw== + "@rollup/rollup-darwin-arm64@4.54.0": version "4.54.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.54.0.tgz#a13fc2d82e01eaf8ac823634a3f5f76fd9d0f938" integrity sha512-k43D4qta/+6Fq+nCDhhv9yP2HdeKeP56QrUUTW7E6PhZP1US6NDqpJj4MY0jBHlJivVJD5P8NxrjuobZBJTCRw== +"@rollup/rollup-darwin-arm64@4.60.4": + version "4.60.4" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.60.4.tgz#2a5aa70432e39816d666d79287a7324cfc3b4e72" + integrity sha512-tua0TaJxMOB1R0V0RS1jFZ/RpURFDJIOR2A6jWwQeawuFyS4gBW+rntLRaQd0EQ4bd6Vp44Z2rXW+YYDBsj6IA== + "@rollup/rollup-darwin-x64@4.54.0": version "4.54.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.54.0.tgz#db4fa8b2b76d86f7e9b68ce4661fafe9767adf9b" integrity sha512-cOo7biqwkpawslEfox5Vs8/qj83M/aZCSSNIWpVzfU2CYHa2G3P1UN5WF01RdTHSgCkri7XOlTdtk17BezlV3A== +"@rollup/rollup-darwin-x64@4.60.4": + version "4.60.4" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.60.4.tgz#c3b5b49629379cd9cdc5d841bf00ed44ebf393dd" + integrity sha512-CSKq7MsP+5PFIcydhAiR1K0UhEI1A2jWXVKHPCBZ151yOutENwvnPocgVHkivu2kviURtCEB6zUQw0vs8RrhMg== + "@rollup/rollup-freebsd-arm64@4.54.0": version "4.54.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.54.0.tgz#b2c6039de4b75efd3f29417fcb1a795c75a4e3ee" integrity sha512-miSvuFkmvFbgJ1BevMa4CPCFt5MPGw094knM64W9I0giUIMMmRYcGW/JWZDriaw/k1kOBtsWh1z6nIFV1vPNtA== +"@rollup/rollup-freebsd-arm64@4.60.4": + version "4.60.4" + resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.60.4.tgz#f929d8e0462fae6602fc960beeabd7287d859283" + integrity sha512-+O8OkVdyvXMtJEciu2wS/pzm1IxntEEQx3z5TAVy4l32G0etZn+RsA48ARRrFm6Ri8fvqPQfgrvNxSjKAbnd3g== + "@rollup/rollup-freebsd-x64@4.54.0": version "4.54.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.54.0.tgz#9ae2a216c94f87912a596a3b3a2ec5199a689ba5" integrity sha512-KGXIs55+b/ZfZsq9aR026tmr/+7tq6VG6MsnrvF4H8VhwflTIuYh+LFUlIsRdQSgrgmtM3fVATzEAj4hBQlaqQ== +"@rollup/rollup-freebsd-x64@4.60.4": + version "4.60.4" + resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.60.4.tgz#c01cb58031226f95d0900b1ec847f4fb32c6e809" + integrity sha512-Iw3oMskH3AfNuhU0MSN7vNbdi4me/NiYo2azqPz/Le16zHSa+3RRmliCMWWQmh4lcndccU40xcJuTYJZxNo/lw== + "@rollup/rollup-linux-arm-gnueabihf@4.54.0": version "4.54.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.54.0.tgz#69d5de7f781132f138514f2b900c523e38e2461f" integrity sha512-EHMUcDwhtdRGlXZsGSIuXSYwD5kOT9NVnx9sqzYiwAc91wfYOE1g1djOEDseZJKKqtHAHGwnGPQu3kytmfaXLQ== +"@rollup/rollup-linux-arm-gnueabihf@4.60.4": + version "4.60.4" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.60.4.tgz#f29d890c4858c8e0d3be01677eef4f6a359eed9d" + integrity sha512-EIPRXTVQpHyF8WOo219AD2yEltPehLTcTMz2fn6JsatLYSzQf00hj3rulF+yauOlF9/FtM2WpkT/hJh/KJFGhA== + "@rollup/rollup-linux-arm-musleabihf@4.54.0": version "4.54.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.54.0.tgz#b6431e5699747f285306ffe8c1194d7af74f801f" integrity sha512-+pBrqEjaakN2ySv5RVrj/qLytYhPKEUwk+e3SFU5jTLHIcAtqh2rLrd/OkbNuHJpsBgxsD8ccJt5ga/SeG0JmA== +"@rollup/rollup-linux-arm-musleabihf@4.60.4": + version "4.60.4" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.60.4.tgz#1ebfc8eb9f66136ed2faae5f44995add5ca3c964" + integrity sha512-J3Yh9PzzF1Ovah2At+lHiGQdsYgArxBbXv/zHfSyaiFQEqvNv7DcW98pCrmdjCZBrqBiKrKKe2V+aaSGWuBe/w== + "@rollup/rollup-linux-arm64-gnu@4.54.0": version "4.54.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.54.0.tgz#a32931baec8a0fa7b3288afb72d400ae735112c2" integrity sha512-NSqc7rE9wuUaRBsBp5ckQ5CVz5aIRKCwsoa6WMF7G01sX3/qHUw/z4pv+D+ahL1EIKy6Enpcnz1RY8pf7bjwng== +"@rollup/rollup-linux-arm64-gnu@4.60.4": + version "4.60.4" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.60.4.tgz#c1fa823c2c4ce46ba7f61de1a4c3fdadd4fb4e7b" + integrity sha512-BFDEZMYfUvLn37ONE1yMBojPxnMlTFsdyNoqncT0qFq1mAfllL+ATMMJd8TeuVMiX84s1KbcxcZbXInmcO2mRg== + "@rollup/rollup-linux-arm64-musl@4.54.0": version "4.54.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.54.0.tgz#0ad72572b01eb946c0b1a7a6f17ab3be6689a963" integrity sha512-gr5vDbg3Bakga5kbdpqx81m2n9IX8M6gIMlQQIXiLTNeQW6CucvuInJ91EuCJ/JYvc+rcLLsDFcfAD1K7fMofg== +"@rollup/rollup-linux-arm64-musl@4.60.4": + version "4.60.4" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.60.4.tgz#a7f18854d0471b78bda8ea38f0891a4e059b571d" + integrity sha512-pc9EYOSlOgdQ2uPl1o9PF6/kLSgaUosia7gOuS8mB69IxJvlclko1MECXysjs5ryez1/5zjYqx3+xYU0TU6R1A== + "@rollup/rollup-linux-loong64-gnu@4.54.0": version "4.54.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.54.0.tgz#05681f000310906512279944b5bef38c0cd4d326" integrity sha512-gsrtB1NA3ZYj2vq0Rzkylo9ylCtW/PhpLEivlgWe0bpgtX5+9j9EZa0wtZiCjgu6zmSeZWyI/e2YRX1URozpIw== +"@rollup/rollup-linux-loong64-gnu@4.60.4": + version "4.60.4" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.60.4.tgz#83658a9a4576bcce8cef85b2c78b9b649d2200c4" + integrity sha512-NxnomyxYerDh5n4iLrNa+sH+Z+U4BMEE46V2PgQ/hoB909i8gV1M5wPojWg9fk1jWpO3IQnOs20K4wyZuFLEFQ== + +"@rollup/rollup-linux-loong64-musl@4.60.4": + version "4.60.4" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.60.4.tgz#fd2af677ae3417bb58d57ae37dd0d84686e40244" + integrity sha512-nbJnQ8a3z1mtmrwImCYhc6BGpThAyYVRQxw9uKSKG4wR6aAYno9sVjJ0zaZcW9BPJX1GbrDPf+SvdWjgTuDmnw== + "@rollup/rollup-linux-ppc64-gnu@4.54.0": version "4.54.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.54.0.tgz#9847a8c9dd76d687c3bdbe38d7f5f32c6b2743c8" integrity sha512-y3qNOfTBStmFNq+t4s7Tmc9hW2ENtPg8FeUD/VShI7rKxNW7O4fFeaYbMsd3tpFlIg1Q8IapFgy7Q9i2BqeBvA== +"@rollup/rollup-linux-ppc64-gnu@4.60.4": + version "4.60.4" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.60.4.tgz#6481647181c4cf8f1ddbd99f62c84cfc56c1a94a" + integrity sha512-2EU6acNrQLd8tYvo/LXW535wupT3m6fo7HKo6lr7ktQoItxTyOL1ZCR/GfGCuXl2vR+zmfI6eRXkSemafv+iVg== + +"@rollup/rollup-linux-ppc64-musl@4.60.4": + version "4.60.4" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.60.4.tgz#18610a1a1550e28a5042ca916f898419540f17f4" + integrity sha512-WeBtoMuaMxiiIrO2IYP3xs6GMWkJP2C0EoT8beTLkUPmzV1i/UcOSVw1d5r9KBODtHKilG5yFxsGRnBbK3wJ4A== + "@rollup/rollup-linux-riscv64-gnu@4.54.0": version "4.54.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.54.0.tgz#173f20c278ac770ae3e969663a27d172a4545e87" integrity sha512-89sepv7h2lIVPsFma8iwmccN7Yjjtgz0Rj/Ou6fEqg3HDhpCa+Et+YSufy27i6b0Wav69Qv4WBNl3Rs6pwhebQ== +"@rollup/rollup-linux-riscv64-gnu@4.60.4": + version "4.60.4" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.60.4.tgz#597bb80465a2621dbe0de0a41c66394a8a7e9a6e" + integrity sha512-FJHFfqpKUI3A10WrWKiFbBZ7yVbGT4q4B5o1qKFFojqpaYoh9LrQgqWCmmcxQzVSXYtyB5bzkXrYzlHTs21MYA== + "@rollup/rollup-linux-riscv64-musl@4.54.0": version "4.54.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.54.0.tgz#db70c2377ae1ef61ef8673354d107ecb3fa7ffed" integrity sha512-ZcU77ieh0M2Q8Ur7D5X7KvK+UxbXeDHwiOt/CPSBTI1fBmeDMivW0dPkdqkT4rOgDjrDDBUed9x4EgraIKoR2A== +"@rollup/rollup-linux-riscv64-musl@4.60.4": + version "4.60.4" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.60.4.tgz#a2a919a9f927ef7f24a60af77e3cb55f1ad59e4d" + integrity sha512-mcEl6CUT5IAUmQf1m9FYSmVqCJlpQ8r8eyftFUHG8i9OhY7BkBXSUdnLH5DOf0wCOjcP9v/QO93zpmF1SptCCw== + "@rollup/rollup-linux-s390x-gnu@4.54.0": version "4.54.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.54.0.tgz#b2c461778add1c2ee70ec07d1788611548647962" integrity sha512-2AdWy5RdDF5+4YfG/YesGDDtbyJlC9LHmL6rZw6FurBJ5n4vFGupsOBGfwMRjBYH7qRQowT8D/U4LoSvVwOhSQ== +"@rollup/rollup-linux-s390x-gnu@4.60.4": + version "4.60.4" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.60.4.tgz#3166f6ceae7df9bbfddf9f36be1937231e13e3c6" + integrity sha512-ynt3JxVd2w2buzoKDWIyiV1pJW93xlQic1THVLXilz429oijRpSHivZAgp65KBu+cMcgf1eVVjdnTLvPxgCuoQ== + "@rollup/rollup-linux-x64-gnu@4.54.0": version "4.54.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.54.0.tgz#ab140b356569601f57ab8727bd7306463841894f" integrity sha512-WGt5J8Ij/rvyqpFexxk3ffKqqbLf9AqrTBbWDk7ApGUzaIs6V+s2s84kAxklFwmMF/vBNGrVdYgbblCOFFezMQ== +"@rollup/rollup-linux-x64-gnu@4.60.4": + version "4.60.4" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.60.4.tgz#23c9bf79771d804fb87415eb0767569f273261e5" + integrity sha512-Boiz5+MsaROEWDf+GGEwF8VMHGhlUoQMtIPjOgA5fv4osupqTVnJteQNKJwUcnUog2G55jYXH7KZFFiJe0TEzQ== + "@rollup/rollup-linux-x64-musl@4.54.0": version "4.54.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.54.0.tgz#810134b4a9d0d88576938f2eed38999a653814a1" integrity sha512-JzQmb38ATzHjxlPHuTH6tE7ojnMKM2kYNzt44LO/jJi8BpceEC8QuXYA908n8r3CNuG/B3BV8VR3Hi1rYtmPiw== +"@rollup/rollup-linux-x64-musl@4.60.4": + version "4.60.4" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.60.4.tgz#97941c6b94d67fe25cde0f027c10a19f2d1fdd39" + integrity sha512-+qfSY27qIrFfI/Hom04KYFw3GKZSGU4lXus51wsb5EuySfFlWRwjkKWoE9emgRw/ukoT4Udsj4W/+xxG8VbPKg== + +"@rollup/rollup-openbsd-x64@4.60.4": + version "4.60.4" + resolved "https://registry.yarnpkg.com/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.60.4.tgz#7aeb7d92e2cd1d399f56daf75c39040b777b6c77" + integrity sha512-VpTfOPHgVXEBeeR8hZ2O0F3aSso+JDWqTWmTmzcQKted54IAdUVbxE+j/MVxUsKa8L20HJhv3vUezVPoquqWjA== + "@rollup/rollup-openharmony-arm64@4.54.0": version "4.54.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.54.0.tgz#0182bae7a54e748be806acef7a7f726f6949213c" integrity sha512-huT3fd0iC7jigGh7n3q/+lfPcXxBi+om/Rs3yiFxjvSxbSB6aohDFXbWvlspaqjeOh+hx7DDHS+5Es5qRkWkZg== +"@rollup/rollup-openharmony-arm64@4.60.4": + version "4.60.4" + resolved "https://registry.yarnpkg.com/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.60.4.tgz#925de61ae83bf99aa636e8acea87432e8c0ffaab" + integrity sha512-IPOsh5aRYuLv/nkU51X10Bf75Bsf6+gZdx1X+QP5QM6lIJFHHqbHLG0uJn/hWthzo13UAc2umiUorqZy3axoZg== + "@rollup/rollup-win32-arm64-msvc@4.54.0": version "4.54.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.54.0.tgz#1f19349bd1c5e454d03e4508a9277b6354985b9d" integrity sha512-c2V0W1bsKIKfbLMBu/WGBz6Yci8nJ/ZJdheE0EwB73N3MvHYKiKGs3mVilX4Gs70eGeDaMqEob25Tw2Gb9Nqyw== +"@rollup/rollup-win32-arm64-msvc@4.60.4": + version "4.60.4" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.60.4.tgz#888ab83842721491044c46a7407e1f38f3235bb4" + integrity sha512-4QzE9E81OohJ/HKzHhsqU+zcYYojVOXlFMs1DdyMT6qXl/niOH7AVElmmEdUNHHS/oRkc++d5k6Vy85zFs0DEw== + "@rollup/rollup-win32-ia32-msvc@4.54.0": version "4.54.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.54.0.tgz#234ff739993539f64efac6c2e59704a691a309c2" integrity sha512-woEHgqQqDCkAzrDhvDipnSirm5vxUXtSKDYTVpZG3nUdW/VVB5VdCYA2iReSj/u3yCZzXID4kuKG7OynPnB3WQ== +"@rollup/rollup-win32-ia32-msvc@4.60.4": + version "4.60.4" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.60.4.tgz#fa30ac24e3f0232139d2a47500560a28695764d4" + integrity sha512-zTPgT1YuHHcd+Tmx7h8aml0FWFVelV5N54oHow9SLj+GfoDy/huQ+UV396N/C7KpMDMiPspRktzM1/0r1usYEA== + "@rollup/rollup-win32-x64-gnu@4.54.0": version "4.54.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.54.0.tgz#a4df0507c3be09c152a795cfc0c4f0c225765c5c" integrity sha512-dzAc53LOuFvHwbCEOS0rPbXp6SIhAf2txMP5p6mGyOXXw5mWY8NGGbPMPrs4P1WItkfApDathBj/NzMLUZ9rtQ== +"@rollup/rollup-win32-x64-gnu@4.60.4": + version "4.60.4" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.60.4.tgz#223e2bc93f86e0707568e1fadb5b537e50c976c7" + integrity sha512-DRS4G7mi9lJxqEDezIkKCaUIKCrLUUDCUaCsTPCi/rtqaC6D/jjwslMQyiDU50Ka0JKpeXeRBFBAXwArY52vBw== + "@rollup/rollup-win32-x64-msvc@4.54.0": version "4.54.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.54.0.tgz#beacb356412eef5dc0164e9edfee51c563732054" integrity sha512-hYT5d3YNdSh3mbCU1gwQyPgQd3T2ne0A3KG8KSBdav5TiBg6eInVmV+TeR5uHufiIgSFg0XsOWGW5/RhNcSvPg== +"@rollup/rollup-win32-x64-msvc@4.60.4": + version "4.60.4" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.60.4.tgz#da4f1676d87e2bdf744291b504b0ab79550c3e61" + integrity sha512-QVTUovf40zgTqlFVrKA1uXMVvU2QWEFWfAH8Wdc48IxLvrJMQVMBRjuQyUpzZCDkakImib9eVazbWlC6ksWtJw== + "@standard-schema/spec@^1.0.0": version "1.1.0" resolved "https://registry.yarnpkg.com/@standard-schema/spec/-/spec-1.1.0.tgz#a79b55dbaf8604812f52d140b2c9ab41bc150bb8" @@ -1654,6 +1156,11 @@ dependencies: undici-types "~7.16.0" +"@types/prop-types@^15.7.15": + 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.14.0" resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.14.0.tgz#d8b60cecf62f2db0fb68e5e006077b9178b85de5" @@ -1741,6 +1248,102 @@ dependencies: "@types/node" "*" +"@typescript-eslint/eslint-plugin@^8.18.0": + version "8.60.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.60.0.tgz#8fc1e0a950c43270eaf0212dc060f7edaa42f9cf" + integrity sha512-QYb/sa74/s7OKMbACMjrYnGspj9Hs5YI5aaffSL65UfeBUzVzBJfVo3oWSpbzPurvm7yaCCo2Lk7lVj610HqKw== + dependencies: + "@eslint-community/regexpp" "^4.12.2" + "@typescript-eslint/scope-manager" "8.60.0" + "@typescript-eslint/type-utils" "8.60.0" + "@typescript-eslint/utils" "8.60.0" + "@typescript-eslint/visitor-keys" "8.60.0" + ignore "^7.0.5" + natural-compare "^1.4.0" + ts-api-utils "^2.5.0" + +"@typescript-eslint/parser@^8.18.0": + version "8.60.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-8.60.0.tgz#38d611b8e658cb10850d4975e8a175a222fbcd6a" + integrity sha512-fcqpj/MyK4sxDPcbe7STNPbpQL4RLZOPWuaTmwZYuc+hJKzRf58yRxfhqGpc6PIq9ZyfSBpfHgmUHmHs0KwHwg== + dependencies: + "@typescript-eslint/scope-manager" "8.60.0" + "@typescript-eslint/types" "8.60.0" + "@typescript-eslint/typescript-estree" "8.60.0" + "@typescript-eslint/visitor-keys" "8.60.0" + debug "^4.4.3" + +"@typescript-eslint/project-service@8.60.0": + version "8.60.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/project-service/-/project-service-8.60.0.tgz#b82ab12e64d005d0c7163d1240c432381f1bde0f" + integrity sha512-aZu74NNKJeUWqCjDddzdiKaS82dgYgV/vmf+Ui3ZdZejmgfXR/q+pRumgobnQ2cCJTgGTWp4ypiwsuofFubavg== + dependencies: + "@typescript-eslint/tsconfig-utils" "^8.60.0" + "@typescript-eslint/types" "^8.60.0" + debug "^4.4.3" + +"@typescript-eslint/scope-manager@8.60.0": + version "8.60.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-8.60.0.tgz#7617a4617c043fe235dcf066f9a40f106cfd2fd5" + integrity sha512-pFzqhllJMs+jghLQWzV00ds39xLzuyqPSev5pd8f4Ir0rtKR3ZLUB4/4dhjOFighWb9larvtfJvqL+4yKDI3Xw== + dependencies: + "@typescript-eslint/types" "8.60.0" + "@typescript-eslint/visitor-keys" "8.60.0" + +"@typescript-eslint/tsconfig-utils@8.60.0", "@typescript-eslint/tsconfig-utils@^8.60.0": + version "8.60.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.60.0.tgz#3af78c48956227a407dea9626b8db8ca53f130d2" + integrity sha512-BZPR3RGYlAXnly6ymAxfkVn5rCbZzQNou0rxv3GfWZ8cTQp+hhVd73khbGLAd8k1TlAPLISH337M+tAgAnaJDQ== + +"@typescript-eslint/type-utils@8.60.0": + version "8.60.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-8.60.0.tgz#6971a61bc4f3a1b2df45dcc14e26a43a88a4cb6a" + integrity sha512-SX46wEUtitCpq7AN38HkUU/+zvUpdKf7ephtWAFgckH8O7PQIyL5gvrhQgBLuEYgLfuKWOVvWVskMbuFHAz5xg== + dependencies: + "@typescript-eslint/types" "8.60.0" + "@typescript-eslint/typescript-estree" "8.60.0" + "@typescript-eslint/utils" "8.60.0" + debug "^4.4.3" + ts-api-utils "^2.5.0" + +"@typescript-eslint/types@8.60.0", "@typescript-eslint/types@^8.60.0": + version "8.60.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.60.0.tgz#e77ad768e933263b1960b2fe79de75fe1cc6e7db" + integrity sha512-AsE7x2XaAK+CVbeih0Fvbn+r1qHxtpLDJ3XUuFcIinT318T90yHMJC+Zgv+jUuDjQQd06HKwxnDu6sz1IcTilA== + +"@typescript-eslint/typescript-estree@8.60.0": + version "8.60.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.60.0.tgz#c102196a44414481190041c99eea1d854e66001b" + integrity sha512-3AcZNBGMClm6CXDyo8kYvVGT/sx29sS0oBsIb9oZI2gunA4Vm2M3YHzRLPvsUBBsl+yB5FPtltq7gGH0iTlp9g== + dependencies: + "@typescript-eslint/project-service" "8.60.0" + "@typescript-eslint/tsconfig-utils" "8.60.0" + "@typescript-eslint/types" "8.60.0" + "@typescript-eslint/visitor-keys" "8.60.0" + debug "^4.4.3" + minimatch "^10.2.2" + semver "^7.7.3" + tinyglobby "^0.2.15" + ts-api-utils "^2.5.0" + +"@typescript-eslint/utils@8.60.0": + version "8.60.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-8.60.0.tgz#6110cddaef87606ae4ca6f8bf81bb5949fc8e098" + integrity sha512-HtXuPfrHTyBDkameWpl+vJb1Uevu2tznAyahM1Oc4AENidCLTPiZDWIo4GfcxNdC/RcfGcadzzkqbRG87dUrQA== + dependencies: + "@eslint-community/eslint-utils" "^4.9.1" + "@typescript-eslint/scope-manager" "8.60.0" + "@typescript-eslint/types" "8.60.0" + "@typescript-eslint/typescript-estree" "8.60.0" + +"@typescript-eslint/visitor-keys@8.60.0": + version "8.60.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.60.0.tgz#f2c41eedd3d7b03b808369fb2e3fb40a93783ec2" + integrity sha512-9WI52t8ZGLVGrPMBet25yAftqY/n95+zmoUUtJBBQTKDSKUu7OsPTroT2op7U9JatkoRccL0YkWDNMFfC4Sjxg== + dependencies: + "@typescript-eslint/types" "8.60.0" + eslint-visitor-keys "^5.0.0" + "@vitejs/plugin-react@^5.1.2": version "5.1.2" resolved "https://registry.yarnpkg.com/@vitejs/plugin-react/-/plugin-react-5.1.2.tgz#46f47be184c05a18839cb8705d79578b469ac6eb" @@ -1997,6 +1600,11 @@ acorn@^8.15.0: resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.15.0.tgz#a360898bc415edaac46c8241f6383975b930b816" integrity sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg== +acorn@^8.16.0: + version "8.16.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.16.0.tgz#4ce79c89be40afe7afe8f3adb902a1f1ce9ac08a" + integrity sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw== + agent-base@^7.1.0, agent-base@^7.1.2: version "7.1.4" resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-7.1.4.tgz#e3cd76d4c548ee895d3c3fd8dc1f6c5b9032e7a8" @@ -2058,6 +1666,11 @@ ansi-styles@^5.0.0: resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b" integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== +any-promise@^1.0.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f" + integrity sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A== + anymatch@~3.1.2: version "3.1.3" resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" @@ -2199,47 +1812,16 @@ b4a@^1.6.4: resolved "https://registry.yarnpkg.com/b4a/-/b4a-1.7.3.tgz#24cf7ccda28f5465b66aec2bac69e32809bf112f" integrity sha512-5Q2mfq2WfGuFp3uS//0s6baOJLMoVduPYVeNmDYxu5OUA1/cBfvr2RIS7vi62LdNj/urk1hfmj867I3qt6uZ7Q== -babel-loader@^10.0.0: - version "10.0.0" - resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-10.0.0.tgz#b9743714c0e1e084b3e4adef3cd5faee33089977" - integrity sha512-z8jt+EdS61AMw22nSfoNJAZ0vrtmhPRVi6ghL3rCeRZI8cdNYFiV5xeV3HbE7rlZZNmGH8BVccwWt8/ED0QOHA== - dependencies: - find-up "^5.0.0" - -babel-plugin-polyfill-corejs2@^0.4.14: - version "0.4.14" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.14.tgz#8101b82b769c568835611542488d463395c2ef8f" - integrity sha512-Co2Y9wX854ts6U8gAAPXfn0GmAyctHuK8n0Yhfjd6t30g7yvKjspvvOo9yG+z52PZRgFErt7Ka2pYnXCjLKEpg== - dependencies: - "@babel/compat-data" "^7.27.7" - "@babel/helper-define-polyfill-provider" "^0.6.5" - semver "^6.3.1" - -babel-plugin-polyfill-corejs3@^0.13.0: - version "0.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.13.0.tgz#bb7f6aeef7addff17f7602a08a6d19a128c30164" - integrity sha512-U+GNwMdSFgzVmfhNm8GJUX88AadB3uo9KpJqS3FaqNIPKgySuvMb+bHPsOmmuWyIcuqZj/pzt1RUIUZns4y2+A== - dependencies: - "@babel/helper-define-polyfill-provider" "^0.6.5" - core-js-compat "^3.43.0" - -babel-plugin-polyfill-regenerator@^0.6.5: - version "0.6.5" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.5.tgz#32752e38ab6f6767b92650347bf26a31b16ae8c5" - integrity sha512-ISqQ2frbiNU9vIJkzg7dlPpznPZ4jOiUQ1uSmB0fEHeowtN3COYRsXr/xexn64NpU13P06jc/L5TgiJXOgrbEg== - dependencies: - "@babel/helper-define-polyfill-provider" "^0.6.5" - -babel-plugin-transform-inline-environment-variables@^0.4.4: - version "0.4.4" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-inline-environment-variables/-/babel-plugin-transform-inline-environment-variables-0.4.4.tgz#974245008b3cbbd646bd81707af147aea3acca43" - integrity sha512-bJILBtn5a11SmtR2j/3mBOjX4K3weC6cq+NNZ7hG22wCAqpc3qtj/iN7dSe9HDiS46lgp1nHsQgeYrea/RUe+g== - balanced-match@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== +balanced-match@^4.0.2: + version "4.0.4" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-4.0.4.tgz#bfb10662feed8196a2c62e7c68e17720c274179a" + integrity sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA== + bare-events@^2.5.4, bare-events@^2.7.0: version "2.8.2" resolved "https://registry.yarnpkg.com/bare-events/-/bare-events-2.8.2.tgz#7b3e10bd8e1fc80daf38bb516921678f566ab89f" @@ -2304,6 +1886,11 @@ bidi-js@^1.0.3: dependencies: require-from-string "^2.0.2" +big.js@^5.2.2: + version "5.2.2" + resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" + integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== + binary-extensions@^2.0.0: version "2.3.0" resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.3.0.tgz#f6e14a97858d327252200242d4ccfe522c445522" @@ -2343,6 +1930,13 @@ brace-expansion@^1.1.7: balanced-match "^1.0.0" concat-map "0.0.1" +brace-expansion@^5.0.5: + version "5.0.6" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-5.0.6.tgz#ec68fe0a641a29d8711579caf641d05bae1f2285" + integrity sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g== + dependencies: + balanced-match "^4.0.2" + braces@^3.0.3, braces@~3.0.2: version "3.0.3" resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789" @@ -2350,7 +1944,7 @@ braces@^3.0.3, braces@~3.0.2: dependencies: fill-range "^7.1.1" -browserslist@^4.24.0, browserslist@^4.28.0, browserslist@^4.28.1: +browserslist@^4.24.0, browserslist@^4.28.1: version "4.28.1" resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.28.1.tgz#7f534594628c53c63101079e27e40de490456a95" integrity sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA== @@ -2378,11 +1972,23 @@ bundle-name@^4.1.0: dependencies: run-applescript "^7.0.0" +bundle-require@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/bundle-require/-/bundle-require-5.1.0.tgz#8db66f41950da3d77af1ef3322f4c3e04009faee" + integrity sha512-3WrrOuZiyaaZPWiEt4G3+IffISVC9HYlWueJEBWED4ZH4aIAC2PnkdnuRrR94M+w6yGWn4AglWtJtBI8YqvgoA== + dependencies: + load-tsconfig "^0.2.3" + bytes@3.1.2, bytes@~3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== +cac@^6.7.14: + version "6.7.14" + resolved "https://registry.yarnpkg.com/cac/-/cac-6.7.14.tgz#804e1e6f506ee363cb0e3ccbb09cad5dd9870959" + integrity sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ== + 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.yarnpkg.com/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz#4b5428c222be985d79c3d82657479dbe0b59b2d6" @@ -2447,6 +2053,13 @@ chokidar@^3.6.0: optionalDependencies: fsevents "~2.3.2" +chokidar@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-4.0.3.tgz#7be37a4c03c9aee1ecfe862a4a23b2c70c205d30" + integrity sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA== + dependencies: + readdirp "^4.0.1" + chrome-trace-event@^1.0.2: version "1.0.4" resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz#05bffd7ff928465093314708c93bdfa9bd1f0f5b" @@ -2510,10 +2123,10 @@ commander@^2.20.0: resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== -commander@^6.2.0: - version "6.2.1" - resolved "https://registry.yarnpkg.com/commander/-/commander-6.2.1.tgz#0792eb682dfbc325999bb2b84fddddba110ac73c" - integrity sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA== +commander@^4.0.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068" + integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA== compressible@~2.0.18: version "2.0.18" @@ -2550,11 +2163,21 @@ concat-stream@^1.4.7: readable-stream "^2.2.2" typedarray "^0.0.6" +confbox@^0.1.8: + version "0.1.8" + resolved "https://registry.yarnpkg.com/confbox/-/confbox-0.1.8.tgz#820d73d3b3c82d9bd910652c5d4d599ef8ff8b06" + integrity sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w== + connect-history-api-fallback@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz#647264845251a0daf25b97ce87834cace0f5f1c8" integrity sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA== +consola@^3.4.0: + version "3.4.2" + resolved "https://registry.yarnpkg.com/consola/-/consola-3.4.2.tgz#5af110145397bb67afdab77013fdc34cae590ea7" + integrity sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA== + content-disposition@~0.5.4: version "0.5.4" resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe" @@ -2582,13 +2205,6 @@ cookie@~0.7.1: resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.7.2.tgz#556369c472a2ba910f2979891b526b3436237ed7" integrity sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w== -core-js-compat@^3.43.0: - version "3.47.0" - resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.47.0.tgz#698224bbdbb6f2e3f39decdda4147b161e3772a3" - integrity sha512-IGfuznZ/n7Kp9+nypamBhvwdwLsW6KC8IOaURw2doAK5e98AG3acVLdh0woOnEqCfUtS+Vu882JE4k/DAm3ItQ== - dependencies: - browserslist "^4.28.0" - core-util-is@~1.0.0: version "1.0.3" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" @@ -2691,7 +2307,7 @@ debug@2.6.9: 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, debug@^4.4.3: +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.0, debug@^4.4.3: version "4.4.3" resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.3.tgz#c6ae432d9bd9662582fce08709b038c58e9e3d6a" integrity sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA== @@ -2826,6 +2442,11 @@ emoji-regex@^8.0.0: resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== +emojis-list@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78" + integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q== + encodeurl@~2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-2.0.0.tgz#7b8ea898077d7e409d3ac45474ea38eaf0857a58" @@ -3003,6 +2624,16 @@ es-to-primitive@^1.3.0: is-date-object "^1.0.5" is-symbol "^1.0.4" +esbuild-loader@^4.2.2: + version "4.4.3" + resolved "https://registry.yarnpkg.com/esbuild-loader/-/esbuild-loader-4.4.3.tgz#0d0f302e3260b2318d1256c17807dfea4bc449ed" + integrity sha512-Wpui03EzqC151xFteKlgJQhbyZl5CgnBpUHXVuao02nItULlkaTeiLdEMPTmR2zdwpEBWkXVNoT5dDOYJluUzg== + dependencies: + esbuild "^0.27.1" + get-tsconfig "^4.10.1" + loader-utils "^2.0.4" + webpack-sources "^3.3.4" + esbuild@^0.27.0: version "0.27.2" resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.27.2.tgz#d83ed2154d5813a5367376bb2292a9296fc83717" @@ -3035,6 +2666,38 @@ esbuild@^0.27.0: "@esbuild/win32-ia32" "0.27.2" "@esbuild/win32-x64" "0.27.2" +esbuild@^0.27.1: + version "0.27.7" + resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.27.7.tgz#bcadce22b2f3fd76f257e3a64f83a64986fea11f" + integrity sha512-IxpibTjyVnmrIQo5aqNpCgoACA/dTKLTlhMHihVHhdkxKyPO1uBBthumT0rdHmcsk9uMonIWS0m4FljWzILh3w== + optionalDependencies: + "@esbuild/aix-ppc64" "0.27.7" + "@esbuild/android-arm" "0.27.7" + "@esbuild/android-arm64" "0.27.7" + "@esbuild/android-x64" "0.27.7" + "@esbuild/darwin-arm64" "0.27.7" + "@esbuild/darwin-x64" "0.27.7" + "@esbuild/freebsd-arm64" "0.27.7" + "@esbuild/freebsd-x64" "0.27.7" + "@esbuild/linux-arm" "0.27.7" + "@esbuild/linux-arm64" "0.27.7" + "@esbuild/linux-ia32" "0.27.7" + "@esbuild/linux-loong64" "0.27.7" + "@esbuild/linux-mips64el" "0.27.7" + "@esbuild/linux-ppc64" "0.27.7" + "@esbuild/linux-riscv64" "0.27.7" + "@esbuild/linux-s390x" "0.27.7" + "@esbuild/linux-x64" "0.27.7" + "@esbuild/netbsd-arm64" "0.27.7" + "@esbuild/netbsd-x64" "0.27.7" + "@esbuild/openbsd-arm64" "0.27.7" + "@esbuild/openbsd-x64" "0.27.7" + "@esbuild/openharmony-arm64" "0.27.7" + "@esbuild/sunos-x64" "0.27.7" + "@esbuild/win32-arm64" "0.27.7" + "@esbuild/win32-ia32" "0.27.7" + "@esbuild/win32-x64" "0.27.7" + escalade@^3.1.1, escalade@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.2.0.tgz#011a3f69856ba189dffa7dc8fcce99d2a87903e5" @@ -3101,11 +2764,6 @@ eslint-scope@^8.4.0: esrecurse "^4.3.0" estraverse "^5.2.0" -eslint-visitor-keys@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" - integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== - eslint-visitor-keys@^3.4.3: version "3.4.3" resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" @@ -3116,6 +2774,11 @@ eslint-visitor-keys@^4.2.1: resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz#4cfea60fe7dd0ad8e816e1ed026c1d5251b512c1" integrity sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ== +eslint-visitor-keys@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz#9e3c9489697824d2d4ce3a8ad12628f91e9f59be" + integrity sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA== + eslint@^9.39.2: version "9.39.2" resolved "https://registry.yarnpkg.com/eslint/-/eslint-9.39.2.tgz#cb60e6d16ab234c0f8369a3fe7cc87967faf4b6c" @@ -3373,6 +3036,15 @@ find-up@^5.0.0: locate-path "^6.0.0" path-exists "^4.0.0" +fix-dts-default-cjs-exports@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/fix-dts-default-cjs-exports/-/fix-dts-default-cjs-exports-1.0.1.tgz#955cb6b3d519691c57828b078adadf2cb92e9549" + integrity sha512-pVIECanWFC61Hzl2+oOCtoJ3F17kglZC/6N94eRWycFgBH35hHx0Li604ZIzhseh97mf2p0cv7vVrOZGoqhlEg== + dependencies: + magic-string "^0.30.17" + mlly "^1.7.4" + rollup "^4.34.8" + flat-cache@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-4.0.1.tgz#0ece39fcb14ee012f4b0410bd33dd9c1f011127c" @@ -3391,11 +3063,6 @@ flatted@^3.2.9: resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.3.tgz#67c8fad95454a7c7abebf74bb78ee74a44023358" integrity sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg== -flow-bin@^0.217.0: - version "0.217.2" - resolved "https://registry.yarnpkg.com/flow-bin/-/flow-bin-0.217.2.tgz#96affa17f3cb303019f740bffeb28cfab7ce1250" - integrity sha512-fk4NcfybYjzlww1sEsfk71nqXvonAYpMRFEjmZxibDWWBiaw8DGmqXWZ7XzSunVB15VkJfOstn/sYP1EYPPyWg== - follow-redirects@^1.0.0: version "1.15.11" resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.11.tgz#777d73d72a92f8ec4d2e410eb47352a56b8e8340" @@ -3418,16 +3085,6 @@ fresh@~0.5.2: resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== -fs-readdir-recursive@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz#e32fc030a2ccee44a6b5371308da54be0b397d27" - integrity sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA== - -fs.realpath@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== - fsevents@~2.3.2, fsevents@~2.3.3: version "2.3.3" resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" @@ -3510,6 +3167,13 @@ get-symbol-description@^1.1.0: es-errors "^1.3.0" get-intrinsic "^1.2.6" +get-tsconfig@^4.10.1: + version "4.14.0" + resolved "https://registry.yarnpkg.com/get-tsconfig/-/get-tsconfig-4.14.0.tgz#985d85c52a9903864280ccc2448d413fbf1efed8" + integrity sha512-yTb+8DXzDREzgvYmh6s9vHsSVCHeC0G3PI5bEXNBHtmshPnO+S5O7qgLEOn0I5QvMy6kpZN8K1NKGyilLb93wA== + dependencies: + resolve-pkg-maps "^1.0.0" + get-uri@^6.0.1: version "6.0.5" resolved "https://registry.yarnpkg.com/get-uri/-/get-uri-6.0.5.tgz#714892aa4a871db671abc5395e5e9447bc306a16" @@ -3543,18 +3207,6 @@ glob-to-regexp@^0.4.1: resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e" integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== -glob@^7.2.0: - version "7.2.3" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" - 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@^14.0.0: version "14.0.0" resolved "https://registry.yarnpkg.com/globals/-/globals-14.0.0.tgz#898d7413c29babcf6bafe56fcadded858ada724e" @@ -3737,6 +3389,11 @@ ignore@^5.2.0: resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.2.tgz#3cd40e729f3643fd87cb04e50bf0eb722bc596f5" integrity sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g== +ignore@^7.0.5: + version "7.0.5" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-7.0.5.tgz#4cb5f6cd7d4c7ab0365738c7aea888baa6d7efd9" + integrity sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg== + import-fresh@^3.2.1, import-fresh@^3.3.0: version "3.3.1" resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.1.tgz#9cecb56503c0ada1f2741dbbd6546e4b13b57ccf" @@ -3758,24 +3415,16 @@ imurmurhash@^0.1.4: resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== -inflight@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" - integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== - dependencies: - once "^1.3.0" - wrappy "1" - -inherits@2, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.3, inherits@~2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" - integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== - inherits@2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" integrity sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw== +inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.3, inherits@~2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + internal-slot@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.1.0.tgz#1eac91762947d2f7056bc838d93e13b2e9604961" @@ -4118,6 +3767,11 @@ jest-worker@^27.4.5: merge-stream "^2.0.0" supports-color "^8.0.0" +joycon@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/joycon/-/joycon-3.1.1.tgz#bce8596d6ae808f8b68168f5fc69280996894f03" + integrity sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw== + "js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" @@ -4161,7 +3815,7 @@ jsdom@^27.4.0: ws "^8.18.3" xml-name-validator "^5.0.0" -jsesc@^3.0.2, jsesc@~3.1.0: +jsesc@^3.0.2: version "3.1.0" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-3.1.0.tgz#74d335a234f67ed19907fdadfac7ccf9d409825d" integrity sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA== @@ -4191,7 +3845,7 @@ json-stable-stringify-without-jsonify@^1.0.1: resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== -json5@^2.2.3: +json5@^2.1.2, json5@^2.2.3: version "2.2.3" resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== @@ -4234,16 +3888,35 @@ levn@^0.4.1: prelude-ls "^1.2.1" type-check "~0.4.0" +lilconfig@^3.1.1: + version "3.1.3" + resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-3.1.3.tgz#a1bcfd6257f9585bf5ae14ceeebb7b559025e4c4" + integrity sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw== + lines-and-columns@^1.1.6: version "1.2.4" resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== +load-tsconfig@^0.2.3: + version "0.2.5" + resolved "https://registry.yarnpkg.com/load-tsconfig/-/load-tsconfig-0.2.5.tgz#453b8cd8961bfb912dea77eb6c168fe8cca3d3a1" + integrity sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg== + loader-runner@^4.3.1: version "4.3.1" resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-4.3.1.tgz#6c76ed29b0ccce9af379208299f07f876de737e3" integrity sha512-IWqP2SCPhyVFTBtRcgMHdzlf9ul25NwaFx4wCEH/KjAXuuHY4yNjvPXsBokp8jCB936PyWRaPKUNh8NvylLp2Q== +loader-utils@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.4.tgz#8b5cb38b5c34a9a018ee1fc0e6a066d1dfcc528c" + integrity sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw== + dependencies: + big.js "^5.2.2" + emojis-list "^3.0.0" + json5 "^2.1.2" + locate-path@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" @@ -4258,11 +3931,6 @@ locate-path@^6.0.0: dependencies: p-locate "^5.0.0" -lodash.debounce@^4.0.8: - version "4.0.8" - resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" - integrity sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow== - lodash.merge@^4.6.2: version "4.6.2" resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" @@ -4305,7 +3973,7 @@ lz-string@^1.5.0: resolved "https://registry.yarnpkg.com/lz-string/-/lz-string-1.5.0.tgz#c1ab50f77887b712621201ba9fd4e3a6ed099941" integrity sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ== -magic-string@^0.30.21: +magic-string@^0.30.17, magic-string@^0.30.21: version "0.30.21" resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.21.tgz#56763ec09a0fa8091df27879fd94d19078c00d91" integrity sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ== @@ -4321,14 +3989,6 @@ magicast@^0.5.1: "@babel/types" "^7.28.5" source-map-js "^1.2.1" -make-dir@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5" - integrity sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA== - dependencies: - pify "^4.0.1" - semver "^5.6.0" - make-dir@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-4.0.0.tgz#c3c2307a771277cd9638305f915c29ae741b614e" @@ -4420,7 +4080,14 @@ minimalistic-assert@^1.0.0: resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== -minimatch@^3.1.1, minimatch@^3.1.2: +minimatch@^10.2.2: + version "10.2.5" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-10.2.5.tgz#bd48687a0be38ed2961399105600f832095861d1" + integrity sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg== + dependencies: + brace-expansion "^5.0.5" + +minimatch@^3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== @@ -4437,6 +4104,16 @@ mitt@^3.0.1: resolved "https://registry.yarnpkg.com/mitt/-/mitt-3.0.1.tgz#ea36cf0cc30403601ae074c8f77b7092cdab36d1" integrity sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw== +mlly@^1.7.4: + version "1.8.2" + resolved "https://registry.yarnpkg.com/mlly/-/mlly-1.8.2.tgz#e7f7919a82d13b174405613117249a3f449d78bb" + integrity sha512-d+ObxMQFmbt10sretNDytwt85VrbkhhUA/JBGm1MPaWJ65Cl4wOgLaB1NYvJSZ0Ef03MMEU/0xpPMXUIQ29UfA== + dependencies: + acorn "^8.16.0" + pathe "^2.0.3" + pkg-types "^1.3.1" + ufo "^1.6.3" + ms@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" @@ -4455,6 +4132,15 @@ multicast-dns@^7.2.5: dns-packet "^5.2.2" thunky "^1.0.2" +mz@^2.7.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/mz/-/mz-2.7.0.tgz#95008057a56cafadc2bc63dde7f9ff6955948e32" + integrity sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q== + dependencies: + any-promise "^1.0.0" + object-assign "^4.0.1" + thenify-all "^1.0.0" + nanoid@^3.3.11: version "3.3.11" resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.11.tgz#4f4f112cefbe303202f2199838128936266d185b" @@ -4500,7 +4186,7 @@ normalize-path@^3.0.0, normalize-path@~3.0.0: resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== -object-assign@^4.1.1: +object-assign@^4.0.1, object-assign@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== @@ -4579,7 +4265,7 @@ on-headers@~1.1.0: resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.1.0.tgz#59da4f91c45f5f989c6e4bcedc5a3b0aed70ff65" integrity sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A== -once@^1.3.0, once@^1.3.1, once@^1.4.0: +once@^1.3.1, once@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== @@ -4720,11 +4406,6 @@ path-exists@^4.0.0: resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== -path-is-absolute@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== - path-key@^3.1.0: version "3.1.1" resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" @@ -4740,7 +4421,7 @@ path-to-regexp@~0.1.12: resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.12.tgz#d5e1a12e478a976d432ef3c58d534b9923164bb7" integrity sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ== -pathe@^2.0.3: +pathe@^2.0.1, pathe@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/pathe/-/pathe-2.0.3.tgz#3ecbec55421685b70a9da872b2cff3e1cbed1716" integrity sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w== @@ -4765,10 +4446,15 @@ picomatch@^4.0.3: resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-4.0.3.tgz#796c76136d1eead715db1e7bad785dedd695a042" integrity sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q== -pify@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" - integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== +picomatch@^4.0.4: + version "4.0.4" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-4.0.4.tgz#fd6f5e00a143086e074dffe4c924b8fb293b0589" + integrity sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A== + +pirates@^4.0.1: + version "4.0.7" + resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.7.tgz#643b4a18c4257c8a65104b73f3049ce9a0a15e22" + integrity sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA== pkg-dir@^4.2.0: version "4.2.0" @@ -4777,11 +4463,27 @@ pkg-dir@^4.2.0: dependencies: find-up "^4.0.0" +pkg-types@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/pkg-types/-/pkg-types-1.3.1.tgz#bd7cc70881192777eef5326c19deb46e890917df" + integrity sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ== + dependencies: + confbox "^0.1.8" + mlly "^1.7.4" + pathe "^2.0.1" + possible-typed-array-names@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz#93e3582bc0e5426586d9d07b79ee40fc841de4ae" integrity sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg== +postcss-load-config@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-6.0.1.tgz#6fd7dcd8ae89badcf1b2d644489cbabf83aa8096" + integrity sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g== + dependencies: + lilconfig "^3.1.1" + postcss@^8.5.6: version "8.5.6" resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.5.6.tgz#2825006615a619b4f62a9e7426cc120b349a8f3c" @@ -4991,6 +4693,11 @@ readable-stream@^3.0.6: string_decoder "^1.1.1" util-deprecate "^1.0.1" +readdirp@^4.0.1: + version "4.1.2" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-4.1.2.tgz#eb85801435fbf2a7ee58f19e0921b068fc69948d" + integrity sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg== + readdirp@~3.6.0: version "3.6.0" resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" @@ -5019,18 +4726,6 @@ reflect.getprototypeof@^1.0.6, reflect.getprototypeof@^1.0.9: get-proto "^1.0.1" which-builtin-type "^1.2.1" -regenerate-unicode-properties@^10.2.2: - version "10.2.2" - resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.2.tgz#aa113812ba899b630658c7623466be71e1f86f66" - integrity sha512-m03P+zhBeQd1RGnYxrGyDAPpWX/epKirLrp8e3qevZdVkKtnCrjjWczIbYc8+xd6vcTStVlqfycTx1KR4LOr0g== - dependencies: - regenerate "^1.4.2" - -regenerate@^1.4.2: - version "1.4.2" - resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.2.tgz#b9346d8827e8f5a32f7ba29637d398b69014848a" - 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.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz#1ad6c62d44a259007e55b3970e00f746efbcaa19" @@ -5043,30 +4738,6 @@ regexp.prototype.flags@^1.5.3, regexp.prototype.flags@^1.5.4: gopd "^1.2.0" set-function-name "^2.0.2" -regexpu-core@^6.3.1: - version "6.4.0" - resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-6.4.0.tgz#3580ce0c4faedef599eccb146612436b62a176e5" - integrity sha512-0ghuzq67LI9bLXpOX/ISfve/Mq33a4aFRzoQYhnnok1JOFpmE/A2TBGkNVenOGEeSBCjIiWcc6MVOG5HEQv0sA== - dependencies: - regenerate "^1.4.2" - regenerate-unicode-properties "^10.2.2" - regjsgen "^0.8.0" - regjsparser "^0.13.0" - unicode-match-property-ecmascript "^2.0.0" - unicode-match-property-value-ecmascript "^2.2.1" - -regjsgen@^0.8.0: - version "0.8.0" - resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.8.0.tgz#df23ff26e0c5b300a6470cad160a9d090c3a37ab" - integrity sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q== - -regjsparser@^0.13.0: - version "0.13.0" - resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.13.0.tgz#01f8351335cf7898d43686bc74d2dd71c847ecc0" - integrity sha512-NZQZdC5wOE/H3UT28fVGL+ikOZcEzfMGk/c3iN9UGxzWHMa1op7274oyiUVrAG4B2EuFhus8SvkaYnhvW92p9Q== - dependencies: - jsesc "~3.1.0" - require-directory@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" @@ -5099,7 +4770,12 @@ resolve-from@^5.0.0: resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== -resolve@^1.20.0, resolve@^1.22.10: +resolve-pkg-maps@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz#616b3dc2c57056b5588c31cdf4b3d64db133720f" + integrity sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw== + +resolve@^1.20.0: version "1.22.11" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.11.tgz#aad857ce1ffb8bfa9b0b1ac29f1156383f68c262" integrity sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ== @@ -5122,6 +4798,40 @@ retry@^0.13.1: resolved "https://registry.yarnpkg.com/retry/-/retry-0.13.1.tgz#185b1587acf67919d63b357349e03537b2484658" integrity sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg== +rollup@^4.34.8: + version "4.60.4" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.60.4.tgz#ca3814f5900da3ac3981d2e0c61944b7e6e0cb09" + integrity sha512-WHeFSbZYsPu3+bLoNRUuAO+wavNlocOPf3wSHTP7hcFKVnJeWsYlCDbr3mTS14FCizf9ccIxXA8sGL8zKeQN3g== + dependencies: + "@types/estree" "1.0.8" + optionalDependencies: + "@rollup/rollup-android-arm-eabi" "4.60.4" + "@rollup/rollup-android-arm64" "4.60.4" + "@rollup/rollup-darwin-arm64" "4.60.4" + "@rollup/rollup-darwin-x64" "4.60.4" + "@rollup/rollup-freebsd-arm64" "4.60.4" + "@rollup/rollup-freebsd-x64" "4.60.4" + "@rollup/rollup-linux-arm-gnueabihf" "4.60.4" + "@rollup/rollup-linux-arm-musleabihf" "4.60.4" + "@rollup/rollup-linux-arm64-gnu" "4.60.4" + "@rollup/rollup-linux-arm64-musl" "4.60.4" + "@rollup/rollup-linux-loong64-gnu" "4.60.4" + "@rollup/rollup-linux-loong64-musl" "4.60.4" + "@rollup/rollup-linux-ppc64-gnu" "4.60.4" + "@rollup/rollup-linux-ppc64-musl" "4.60.4" + "@rollup/rollup-linux-riscv64-gnu" "4.60.4" + "@rollup/rollup-linux-riscv64-musl" "4.60.4" + "@rollup/rollup-linux-s390x-gnu" "4.60.4" + "@rollup/rollup-linux-x64-gnu" "4.60.4" + "@rollup/rollup-linux-x64-musl" "4.60.4" + "@rollup/rollup-openbsd-x64" "4.60.4" + "@rollup/rollup-openharmony-arm64" "4.60.4" + "@rollup/rollup-win32-arm64-msvc" "4.60.4" + "@rollup/rollup-win32-ia32-msvc" "4.60.4" + "@rollup/rollup-win32-x64-gnu" "4.60.4" + "@rollup/rollup-win32-x64-msvc" "4.60.4" + fsevents "~2.3.2" + rollup@^4.43.0: version "4.54.0" resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.54.0.tgz#930f4dfc41ff94d720006f9f62503612a6c319b8" @@ -5236,11 +4946,6 @@ selfsigned@^2.4.1: "@types/node-forge" "^1.3.0" node-forge "^1" -semver@^5.6.0: - version "5.7.2" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8" - integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== - semver@^6.3.1: version "6.3.1" resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" @@ -5422,11 +5127,6 @@ siginfo@^2.0.0: resolved "https://registry.yarnpkg.com/siginfo/-/siginfo-2.0.0.tgz#32e76c70b79724e3bb567cb9d543eb858ccfaf30" integrity sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g== -slash@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-2.0.0.tgz#de552851a1759df3a8f206535442f5ec4ddeab44" - integrity sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A== - smart-buffer@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-4.2.0.tgz#6e1d71fa4f18c05f7d0ff216dd16a481d0e8d9ae" @@ -5476,6 +5176,11 @@ source-map@^0.6.0, source-map@~0.6.1: resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== +source-map@^0.7.6: + version "0.7.6" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.6.tgz#a3658ab87e5b6429c8a1f3ba0083d4c61ca3ef02" + integrity sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ== + spawn-sync@^1.0.15: version "1.0.15" resolved "https://registry.yarnpkg.com/spawn-sync/-/spawn-sync-1.0.15.tgz#b00799557eb7fb0c8376c29d44e8a1ea67e57476" @@ -5638,6 +5343,19 @@ strip-json-comments@^3.1.1: resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== +sucrase@^3.35.0: + version "3.35.1" + resolved "https://registry.yarnpkg.com/sucrase/-/sucrase-3.35.1.tgz#4619ea50393fe8bd0ae5071c26abd9b2e346bfe1" + integrity sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw== + dependencies: + "@jridgewell/gen-mapping" "^0.3.2" + commander "^4.0.0" + lines-and-columns "^1.1.6" + mz "^2.7.0" + pirates "^4.0.1" + tinyglobby "^0.2.11" + ts-interface-checker "^0.1.9" + supports-color@^7.1.0: version "7.2.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" @@ -5715,6 +5433,20 @@ text-decoder@^1.1.0: dependencies: b4a "^1.6.4" +thenify-all@^1.0.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/thenify-all/-/thenify-all-1.6.0.tgz#1a1918d402d8fc3f98fbf234db0bcc8cc10e9726" + integrity sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA== + dependencies: + thenify ">= 3.1.0 < 4" + +"thenify@>= 3.1.0 < 4": + version "3.3.1" + resolved "https://registry.yarnpkg.com/thenify/-/thenify-3.3.1.tgz#8932e686a4066038a016dd9e2ca46add9838a95f" + integrity sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw== + dependencies: + any-promise "^1.0.0" + thingies@^2.5.0: version "2.5.0" resolved "https://registry.yarnpkg.com/thingies/-/thingies-2.5.0.tgz#5f7b882c933b85989f8466b528a6247a6881e04f" @@ -5730,11 +5462,24 @@ tinybench@^2.9.0: resolved "https://registry.yarnpkg.com/tinybench/-/tinybench-2.9.0.tgz#103c9f8ba6d7237a47ab6dd1dcff77251863426b" integrity sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg== +tinyexec@^0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/tinyexec/-/tinyexec-0.3.2.tgz#941794e657a85e496577995c6eef66f53f42b3d2" + integrity sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA== + tinyexec@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/tinyexec/-/tinyexec-1.0.2.tgz#bdd2737fe2ba40bd6f918ae26642f264b99ca251" integrity sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg== +tinyglobby@^0.2.11: + version "0.2.16" + resolved "https://registry.yarnpkg.com/tinyglobby/-/tinyglobby-0.2.16.tgz#1c3b7eb953fce42b226bc5a1ee06428281aff3d6" + integrity sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg== + dependencies: + fdir "^6.5.0" + picomatch "^4.0.4" + tinyglobby@^0.2.15: version "0.2.15" resolved "https://registry.yarnpkg.com/tinyglobby/-/tinyglobby-0.2.15.tgz#e228dd1e638cea993d2fdb4fcd2d4602a79951c2" @@ -5791,11 +5536,49 @@ tree-dump@^1.0.3, tree-dump@^1.1.0: resolved "https://registry.yarnpkg.com/tree-dump/-/tree-dump-1.1.0.tgz#ab29129169dc46004414f5a9d4a3c6e89f13e8a4" integrity sha512-rMuvhU4MCDbcbnleZTFezWsaZXRFemSqAM+7jPnzUl1fo9w3YEKOxAeui0fz3OI4EU4hf23iyA7uQRVko+UaBA== +tree-kill@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/tree-kill/-/tree-kill-1.2.2.tgz#4ca09a9092c88b73a7cdc5e8a01b507b0790a0cc" + integrity sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A== + +ts-api-utils@^2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-2.5.0.tgz#4acd4a155e22734990a5ed1fe9e97f113bcb37c1" + integrity sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA== + +ts-interface-checker@^0.1.9: + version "0.1.13" + resolved "https://registry.yarnpkg.com/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz#784fd3d679722bc103b1b4b8030bcddb5db2a699" + integrity sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA== + tslib@^2.0.0, tslib@^2.0.1: version "2.8.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.8.1.tgz#612efe4ed235d567e8aba5f2a5fab70280ade83f" integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w== +tsup@^8.3.5: + version "8.5.1" + resolved "https://registry.yarnpkg.com/tsup/-/tsup-8.5.1.tgz#a9c7a875b93344bdf70600dedd78e70f88ec9a65" + integrity sha512-xtgkqwdhpKWr3tKPmCkvYmS9xnQK3m3XgxZHwSUjvfTjp7YfXe5tT3GgWi0F2N+ZSMsOeWeZFh7ZZFg5iPhing== + dependencies: + bundle-require "^5.1.0" + cac "^6.7.14" + chokidar "^4.0.3" + consola "^3.4.0" + debug "^4.4.0" + esbuild "^0.27.0" + fix-dts-default-cjs-exports "^1.0.0" + joycon "^3.1.1" + picocolors "^1.1.1" + postcss-load-config "^6.0.1" + resolve-from "^5.0.0" + rollup "^4.34.8" + source-map "^0.7.6" + sucrase "^3.35.0" + tinyexec "^0.3.2" + tinyglobby "^0.2.11" + tree-kill "^1.2.2" + type-check@^0.4.0, type-check@~0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" @@ -5871,6 +5654,11 @@ typescript@^5.9.3: resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.9.3.tgz#5b4f59e15310ab17a216f5d6cf53ee476ede670f" integrity sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw== +ufo@^1.6.3: + version "1.6.4" + resolved "https://registry.yarnpkg.com/ufo/-/ufo-1.6.4.tgz#7a8fb875fcc6382d2c7d0b3692738b0500a92467" + integrity sha512-JFNbkD1Svwe0KvGi8GOeLcP4kAWQ609twvCdcHxq1oSL8svv39ZuSvajcD8B+5D0eL4+s1Is2D/O6KN3qcTeRA== + unbox-primitive@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.1.0.tgz#8d9d2c9edeea8460c7f35033a88867944934d1e2" @@ -5886,29 +5674,6 @@ undici-types@~7.16.0: resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-7.16.0.tgz#ffccdff36aea4884cbfce9a750a0580224f58a46" integrity sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw== -unicode-canonical-property-names-ecmascript@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz#cb3173fe47ca743e228216e4a3ddc4c84d628cc2" - integrity sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg== - -unicode-match-property-ecmascript@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz#54fd16e0ecb167cf04cf1f756bdcc92eba7976c3" - 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.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.1.tgz#65a7adfad8574c219890e219285ce4c64ed67eaa" - integrity sha512-JQ84qTuMg4nVkx8ga4A16a1epI9H6uTXAknqxkGF/aFfRLw1xC/Bp24HNLaZhHSkWd3+84t8iXnp1J0kYcZHhg== - -unicode-property-aliases-ecmascript@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.2.0.tgz#301d4f8a43d2b75c97adfad87c9dd5350c9475d1" - integrity sha512-hpbDzxUY9BFwX+UeBnxv3Sh1q7HFxj48DTmXchNgRa46lO8uj3/1iEn3MiNUYTg1g9ctIqXCCERn8gYZhHC5lQ== - unpipe@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" @@ -6100,6 +5865,11 @@ webpack-sources@^3.3.3: resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-3.3.3.tgz#d4bf7f9909675d7a070ff14d0ef2a4f3c982c723" integrity sha512-yd1RBzSGanHkitROoPFd6qsrxt+oFhg/129YzheDGqeustzX0vTZJZsSsQjVQC4yzBQ56K55XU8gaNCtIzOnTg== +webpack-sources@^3.3.4: + version "3.5.0" + resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-3.5.0.tgz#87bf7f5801a4e985b1f1c92b64b9620a02f76d08" + integrity sha512-HPuy+uuoTCaaoEoI1LQ3JN9+vrPBvEesnnX1jADHy728cHSMlq4wUc4afYqahq2B1mhQVZxCXOkNTnXltr+2vQ== + webpack@^5.104.1: version "5.104.1" resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.104.1.tgz#94bd41eb5dbf06e93be165ba8be41b8260d4fb1a" From b42284d2e75d87da9a03b2e7ee0e5cc5b1bfa44f Mon Sep 17 00:00:00 2001 From: Samuel Reed Date: Thu, 28 May 2026 15:01:43 -0400 Subject: [PATCH 2/5] fix(ci): make typecheck/lint/test build-order-independent MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit CI was red because the migration left three build-order assumptions that only surfaced in a fresh checkout: the typecheck job still ran the removed `yarn flow`; `make lint` and the typeCompat test resolved `react-draggable` to the generated build/cjs/cjs.d.ts, which doesn't exist before `yarn build`. The workflow's own verify ran against a pre-populated build/, hiding it. Repoint typings/tsconfig.json and test/typeCompat/tsconfig.json at the source entry (lib/cjs.ts) instead of the built declaration — same public surface, no build dependency. Drop the build-exists guard in typeCompat.test.ts. Replace the dead `yarn flow` CI step with `yarn tsc --noEmit`. Verified lint/typecheck/test/coverage/build all green with build/ absent. --- .github/workflows/ci.yml | 6 ++--- test/typeCompat.test.ts | 43 ++++++++++++++--------------------- test/typeCompat/tsconfig.json | 2 +- typings/tsconfig.json | 2 +- 4 files changed, 22 insertions(+), 31 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 6150eb1e..5ec8e709 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -98,8 +98,8 @@ jobs: - name: Install dependencies run: yarn install --frozen-lockfile - - name: Flow check - run: yarn flow + - name: TypeScript check (source) + run: yarn tsc --noEmit - - name: TypeScript check + - name: TypeScript check (public typings) run: yarn tsc -p typings diff --git a/test/typeCompat.test.ts b/test/typeCompat.test.ts index 5ed9ceed..f69d0ddf 100644 --- a/test/typeCompat.test.ts +++ b/test/typeCompat.test.ts @@ -1,6 +1,5 @@ -import {describe, it, expect, beforeAll} from 'vitest'; +import {describe, it, expect} from 'vitest'; import {execFileSync} from 'node:child_process'; -import {existsSync} from 'node:fs'; import {resolve, dirname} from 'node:path'; import {fileURLToPath} from 'node:url'; import {createRequire} from 'node:module'; @@ -8,29 +7,30 @@ import {createRequire} from 'node:module'; // ───────────────────────────────────────────────────────────────────────────── // Public type-surface compatibility guard. // -// After the Flow -> TypeScript migration the public `.d.ts` is AUTO-GENERATED -// from source (build/cjs/cjs.d.ts) instead of hand-written (the old -// typings/index.d.ts, now deleted). This test asserts the generated surface is -// still API-compatible with that old surface by compiling two type-assertion -// files against the generated declaration with `tsc`: +// After the Flow -> TypeScript migration the public `.d.ts` is generated from the +// source entry (lib/cjs.ts) instead of hand-written (the old typings/index.d.ts, +// now deleted). The published declaration is a faithful tsc/tsup projection of +// that source surface, so this test asserts compatibility against the source +// entry directly — which keeps the check build-order-independent (no prior +// `yarn build` required) while exercising the exact public surface the shipped +// `.d.ts` is derived from. The build itself (tsup --dts) is what guarantees the +// declaration emits cleanly. // +// Both projects below map `react-draggable` -> ../lib/cjs.ts and compile with +// `tsc`: // 1. test/typeCompat/fixture.tsx — exhaustively exercises every exported name // and every prop from the old typings/index.d.ts. Removing/renaming/retyping -// any export or prop makes this stop compiling. +// any export or prop (e.g. narrowing children from ReactNode) stops it +// compiling. // 2. typings/test.tsx — the project's existing consumer-style smoke test, -// compiled UNCHANGED against the generated types (incl. zero-prop usage, -// which only works if the public props remain optional like the old -// `Partial` surface). -// -// If the CJS declaration hasn't been built yet, the test fails with an actionable -// message rather than silently passing. +// compiled UNCHANGED (incl. zero-prop usage, which only works if the public +// props remain optional like the old `Partial` surface). // ───────────────────────────────────────────────────────────────────────────── const __dirname = dirname(fileURLToPath(import.meta.url)); const repoRoot = resolve(__dirname, '..'); const require = createRequire(import.meta.url); const tscBin = require.resolve('typescript/bin/tsc'); -const generatedDts = resolve(repoRoot, 'build/cjs/cjs.d.ts'); function runTsc(projectDir: string): {ok: boolean; output: string} { try { @@ -47,22 +47,13 @@ function runTsc(projectDir: string): {ok: boolean; output: string} { } describe('public type-surface compatibility', () => { - beforeAll(() => { - if (!existsSync(generatedDts)) { - throw new Error( - `Generated declaration not found at ${generatedDts}. Run \`yarn build\` ` + - `before running the type-compat test (it asserts against the built .d.ts).` - ); - } - }); - - it('generated .d.ts is API-compatible with the old hand-written surface', () => { + it('public surface is API-compatible with the old hand-written surface', () => { const {ok, output} = runTsc(resolve(__dirname, 'typeCompat')); expect(output, output).toBe(''); expect(ok).toBe(true); }); - it('the existing typings/test.tsx still compiles unchanged against generated types', () => { + it('the existing typings/test.tsx still compiles unchanged against the public surface', () => { const {ok, output} = runTsc(resolve(repoRoot, 'typings')); expect(output, output).toBe(''); expect(ok).toBe(true); diff --git a/test/typeCompat/tsconfig.json b/test/typeCompat/tsconfig.json index 677c3f67..2f91d87d 100644 --- a/test/typeCompat/tsconfig.json +++ b/test/typeCompat/tsconfig.json @@ -10,7 +10,7 @@ "types": ["react", "react-dom", "node"], "baseUrl": ".", "paths": { - "react-draggable": ["../../build/cjs/cjs.d.ts"] + "react-draggable": ["../../lib/cjs.ts"] } }, "files": [ diff --git a/typings/tsconfig.json b/typings/tsconfig.json index cb8853d7..1c0312fc 100644 --- a/typings/tsconfig.json +++ b/typings/tsconfig.json @@ -7,7 +7,7 @@ "esModuleInterop": true, "baseUrl": ".", "paths": { - "react-draggable": ["../build/cjs/cjs.d.ts"] + "react-draggable": ["../lib/cjs.ts"] } }, "files": [ From 5c8762ebc43d5971114b7fc1ba329d23e48b498e Mon Sep 17 00:00:00 2001 From: Samuel Reed Date: Thu, 28 May 2026 18:18:45 -0400 Subject: [PATCH 3/5] fix(test): raise tsc-compile timeout in type-compat test The type-compat cases shell out to a full tsc compile of the source type graph (~6s on Node 20/22 CI runners), exceeding vitest's 5s default and timing out; the faster Node 24 runner masked it. Give both cases a 60s timeout, matching the project's other slow (browser) suites. --- test/typeCompat.test.ts | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/test/typeCompat.test.ts b/test/typeCompat.test.ts index f69d0ddf..826fb41f 100644 --- a/test/typeCompat.test.ts +++ b/test/typeCompat.test.ts @@ -46,16 +46,20 @@ function runTsc(projectDir: string): {ok: boolean; output: string} { } } +// Each case shells out to a full `tsc` compile of the source type graph, which +// can take several seconds on slower CI runners — well past vitest's 5s default. +const TSC_TIMEOUT_MS = 60_000; + describe('public type-surface compatibility', () => { it('public surface is API-compatible with the old hand-written surface', () => { const {ok, output} = runTsc(resolve(__dirname, 'typeCompat')); expect(output, output).toBe(''); expect(ok).toBe(true); - }); + }, TSC_TIMEOUT_MS); it('the existing typings/test.tsx still compiles unchanged against the public surface', () => { const {ok, output} = runTsc(resolve(repoRoot, 'typings')); expect(output, output).toBe(''); expect(ok).toBe(true); - }); + }, TSC_TIMEOUT_MS); }); From 0ea337fd8850529b930950cc89f964b91744b4a7 Mon Sep 17 00:00:00 2001 From: Samuel Reed Date: Thu, 28 May 2026 18:30:26 -0400 Subject: [PATCH 4/5] refactor: simplify migrated TS (types, casts, config) Quality cleanups from a /simplify pass, no behavior or API change: move the public DraggableEvent union into lib/utils/types.ts alongside the other public types (it was the lone public type defined in the entry file) and re-export it from cjs.ts; replace 'as Pick' with the equivalent 'as DraggableState'; drop DraggableCore's redundant propTypes index-signature annotation to match Draggable; remove inert declaration/emitDeclarationOnly/outDir keys from the root tsconfig (noEmit wins; tsup owns dts emit); fix a stale fixture comment that described build-artifact validation after it was repointed at source. --- lib/Draggable.tsx | 2 +- lib/DraggableCore.tsx | 2 +- lib/cjs.ts | 18 +++--------------- lib/utils/types.ts | 15 +++++++++++++++ test/typeCompat/fixture.tsx | 7 ++++--- tsconfig.json | 3 --- 6 files changed, 24 insertions(+), 23 deletions(-) diff --git a/lib/Draggable.tsx b/lib/Draggable.tsx index e64c7c13..00fbc93d 100644 --- a/lib/Draggable.tsx +++ b/lib/Draggable.tsx @@ -348,7 +348,7 @@ class Draggable extends React.Component, DraggableState> newState.y = y; } - this.setState(newState as Pick); + this.setState(newState as DraggableState); }; render(): ReactElement { diff --git a/lib/DraggableCore.tsx b/lib/DraggableCore.tsx index 4aaf3986..d224fe35 100644 --- a/lib/DraggableCore.tsx +++ b/lib/DraggableCore.tsx @@ -73,7 +73,7 @@ export default class DraggableCore extends React.Component - | React.TouchEvent - | MouseEvent - | TouchEvent; +// `DraggableEvent` is the public event union (defined in ./utils/types alongside +// the other public types — see the note there on why it must stay a union). +export type {Bounds as DraggableBounds, DraggableEvent} from './utils/types'; diff --git a/lib/utils/types.ts b/lib/utils/types.ts index 2349c164..1fc83250 100644 --- a/lib/utils/types.ts +++ b/lib/utils/types.ts @@ -1,3 +1,5 @@ +import type * as React from 'react'; + export type DraggableEventHandler = (e: MouseEvent, data: DraggableData) => void | false; export type DraggableData = { @@ -17,3 +19,16 @@ export type EventHandler = (e: T) => void | false; // MouseEvent and TouchEvent are provided by the TS DOM lib, including // changedTouches/targetTouches, so the Flow class shims are no longer needed. export type MouseTouchEvent = MouseEvent & TouchEvent; + +// `DraggableEvent` is the PUBLIC event type a consumer's handlers may receive. +// Historically (the old typings/index.d.ts) it was the broad UNION of React +// synthetic and native DOM mouse/touch events — NOT the internal +// `MouseTouchEvent` intersection above (which exists only for convenient field +// access inside the handlers). Aliasing the public type to the intersection +// would be an API break: none of the union members are assignable to it. Keep +// the union to preserve compatibility. +export type DraggableEvent = + | React.MouseEvent + | React.TouchEvent + | MouseEvent + | TouchEvent; diff --git a/test/typeCompat/fixture.tsx b/test/typeCompat/fixture.tsx index d567a310..151589e9 100644 --- a/test/typeCompat/fixture.tsx +++ b/test/typeCompat/fixture.tsx @@ -1,9 +1,10 @@ // Type-level compatibility fixture. // // This file is NOT run; it is compiled by `test/typeCompat.test.ts` via `tsc` -// against the AUTO-GENERATED declaration (build/cjs/cjs.d.ts, aliased to -// "react-draggable"). It asserts that the generated public type surface is -// API-compatible with the OLD hand-written typings/index.d.ts. +// against the source entry (lib/cjs.ts, aliased to "react-draggable") — the same +// public surface the shipped declaration is generated from, checked without +// requiring a prior build. It asserts that surface is API-compatible with the +// OLD hand-written typings/index.d.ts. // // Every exported name and every prop from the old surface is exercised here. If // any export is removed/renamed, or any prop is removed/renamed/retyped diff --git a/tsconfig.json b/tsconfig.json index c14a7cdd..b3008cb4 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -5,9 +5,6 @@ "moduleResolution": "bundler", "lib": ["ES2019", "DOM", "DOM.Iterable"], "jsx": "react", - "declaration": true, - "emitDeclarationOnly": false, - "outDir": "build/cjs", "strict": true, "esModuleInterop": true, "allowSyntheticDefaultImports": true, From c7fec388f43299db4412e686369c5495881276bb Mon Sep 17 00:00:00 2001 From: Samuel Reed Date: Thu, 28 May 2026 19:30:02 -0400 Subject: [PATCH 5/5] test: verify CJS/UMD export contract after every build MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit lib/cjs.ts instructs verifying the module.exports===Draggable shape with a runtime require() check, but nothing enforced it — the historical CJS dual-export contract (PR #254/#266) and the UMD global could regress invisibly and only surface when a consumer installs the package. Add scripts/verify-build.cjs: requires the built CJS and asserts root===Draggable, root===.default, and .DraggableCore present; asserts the UMD bundle exposes global ReactDraggable. Wired into the Makefile build target's recipe so it runs after build-lib + build-web on both `yarn build` and `make build`. Verified it fails on a corrupted export shape. Not build-order-coupled to the unit-test matrix. --- Makefile | 3 ++ scripts/verify-build.cjs | 61 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 64 insertions(+) create mode 100644 scripts/verify-build.cjs diff --git a/Makefile b/Makefile index 1c367ab4..e74db922 100644 --- a/Makefile +++ b/Makefile @@ -19,7 +19,10 @@ lint: # tsup emits cjs + esm + dts into build/cjs (and rewrites build/cjs/cjs.js to the # legacy module.exports === Draggable shape). webpack emits the UMD global bundle. # Both depend on `clean` so the dir is reset first even under parallel make (-j). +# The recipe runs after both prerequisites complete and verifies the published +# CJS/UMD contracts (see scripts/verify-build.cjs). build: build-lib build-web + @node scripts/verify-build.cjs build-lib: clean $(BIN) $(BIN)/tsup diff --git a/scripts/verify-build.cjs b/scripts/verify-build.cjs new file mode 100644 index 00000000..82478ad9 --- /dev/null +++ b/scripts/verify-build.cjs @@ -0,0 +1,61 @@ +#!/usr/bin/env node +'use strict'; + +// Post-build contract verification. +// +// The published artifacts carry two historical public contracts that the build +// toolchain (tsup for CJS/ESM, webpack for UMD) must preserve. They are easy to +// break invisibly — a wrong export-interop shape or a missing global only shows +// up when a consumer installs the package. This script asserts both right after +// the build, so a regression fails CI instead of shipping. It is wired into the +// Makefile `build` target (runs after build-lib + build-web). + +const assert = require('node:assert/strict'); +const fs = require('node:fs'); +const path = require('node:path'); + +const root = path.resolve(__dirname, '..'); + +// ── Contract 1: CJS export shape (PR #254 / issue #266) ────────────────────── +// require('react-draggable') returns the Draggable class ITSELF (not a namespace +// object), and also exposes .default and .DraggableCore. All three access +// patterns are part of the public API. +const cjsPath = path.join(root, 'build', 'cjs', 'cjs.js'); +assert.ok( + fs.existsSync(cjsPath), + `Missing CJS build at ${cjsPath} — run \`yarn build\` first.` +); + +// eslint-disable-next-line global-require, import/no-dynamic-require +const cjs = require(cjsPath); +assert.equal( + typeof cjs, + 'function', + `CJS root export must be the Draggable component, got ${typeof cjs}` +); +assert.equal( + cjs.name, + 'Draggable', + `CJS root export should be Draggable, got "${cjs.name}"` +); +assert.equal(cjs, cjs.default, 'require("react-draggable") must === .default'); +assert.equal( + typeof cjs.DraggableCore, + 'function', + 'require("react-draggable").DraggableCore must be exported' +); + +// ── Contract 2: UMD global ─────────────────────────────────────────────────── +// The unpkg bundle exposes the library as global `ReactDraggable`, with react / +// react-dom consumed as the external globals React / ReactDOM. +const umdPath = path.join(root, 'build', 'web', 'react-draggable.min.js'); +assert.ok(fs.existsSync(umdPath), `Missing UMD build at ${umdPath}`); +const umd = fs.readFileSync(umdPath, 'utf8'); +assert.ok( + umd.includes('ReactDraggable'), + 'UMD bundle must expose the global `ReactDraggable`' +); + +console.log( + '✓ build contract OK: CJS module.exports===Draggable (+.default, .DraggableCore); UMD global ReactDraggable' +);