diff --git a/tgui/.eslintignore b/tgui/.eslintignore index a59187b933ae..ae28a3fcf483 100644 --- a/tgui/.eslintignore +++ b/tgui/.eslintignore @@ -3,4 +3,4 @@ /**/*.bundle.* /**/*.chunk.* /**/*.hot-update.* -/packages/inferno/** +/public diff --git a/tgui/.eslintrc.yml b/tgui/.eslintrc.yml index 4dfc54e854c5..3b3035a113a0 100644 --- a/tgui/.eslintrc.yml +++ b/tgui/.eslintrc.yml @@ -15,7 +15,7 @@ plugins: - unused-imports settings: react: - version: '16.10' + version: '18.3.1' rules: ## Possible Errors ## ---------------------------------------- @@ -649,7 +649,7 @@ rules: ## Enforce ES5 or ES6 class for React Components react/prefer-es6-class: error ## Enforce that props are read-only - react/prefer-read-only-props: error + react/prefer-read-only-props: off ## Enforce stateless React Components to be written as a pure function react/prefer-stateless-function: error ## Prevent missing props validation in a React component definition diff --git a/tgui/.swcrc b/tgui/.swcrc new file mode 100644 index 000000000000..c0402a41f0bf --- /dev/null +++ b/tgui/.swcrc @@ -0,0 +1,15 @@ +{ + "$schema": "https://json.schemastore.org/swcrc", + "jsc": { + "loose": true, + "parser": { + "syntax": "typescript", + "tsx": true + }, + "transform": { + "react": { + "runtime": "automatic" + } + } + } +} diff --git a/tgui/README.md b/tgui/README.md index 4a1915d5c897..1bae91fd1325 100644 --- a/tgui/README.md +++ b/tgui/README.md @@ -16,10 +16,9 @@ If you are completely new to frontend and prefer to **learn by doing**, start wi ### Guides -This project uses **Inferno** - a very fast UI rendering engine with a similar API to React. Take your time to read these guides: +This project uses React. Take your time to read the guide: -- [React guide](https://reactjs.org/docs/hello-world.html) -- [Inferno documentation](https://infernojs.org/docs/guides/components) - highlights differences with React. +- [React guide](https://react.dev/learn) If you were already familiar with an older, Ractive-based tgui, and want to translate concepts between old and new tgui, read this [interface conversion guide](docs/converting-old-tgui-interfaces.md). diff --git a/tgui/babel.config.js b/tgui/babel.config.js deleted file mode 100644 index 959dc3be7adb..000000000000 --- a/tgui/babel.config.js +++ /dev/null @@ -1,52 +0,0 @@ -/** - * @file - * @copyright 2020 Aleksej Komarov - * @license MIT - */ - -const createBabelConfig = (options) => { - const { presets = [], plugins = [], removeConsole } = options; - return { - presets: [ - [ - require.resolve('@babel/preset-typescript'), - { - allowDeclareFields: true, - }, - ], - [ - require.resolve('@babel/preset-env'), - { - modules: 'commonjs', - useBuiltIns: 'entry', - corejs: '3', - spec: false, - loose: true, - targets: [], - }, - ], - ...presets, - ].filter(Boolean), - plugins: [ - [ - require.resolve('@babel/plugin-proposal-class-properties'), - { - loose: true, - }, - ], - require.resolve('@babel/plugin-transform-jscript'), - require.resolve('babel-plugin-inferno'), - removeConsole && require.resolve('babel-plugin-transform-remove-console'), - require.resolve('common/string.babel-plugin.cjs'), - ...plugins, - ].filter(Boolean), - }; -}; - -module.exports = (api) => { - api.cache(true); - const mode = process.env.NODE_ENV; - return createBabelConfig({ mode }); -}; - -module.exports.createBabelConfig = createBabelConfig; diff --git a/tgui/docs/component-reference.md b/tgui/docs/component-reference.md index bccdc59661d8..5501680e30aa 100644 --- a/tgui/docs/component-reference.md +++ b/tgui/docs/component-reference.md @@ -65,17 +65,13 @@ it is used a lot in this framework. **Event handlers.** Event handlers are callbacks that you can attack to various element to -listen for browser events. Inferno supports camelcase (`onClick`) and -lowercase (`onclick`) event names. - -- Camel case names are what's called *synthetic* events, and are the -**preferred way** of handling events in React, for efficiency and -performance reasons. Please read -[Inferno Event Handling](https://infernojs.org/docs/guides/event-handling) -to understand what this is about. -- Lower case names are native browser events and should be used sparingly, -for example when you need an explicit IE8 support. **DO NOT** use -lowercase event handlers unless you really know what you are doing. +listen for browser events. React supports camelcase (`onClick`) event names. + +- Camel case names are what's called _synthetic_ events, and are the + **preferred way** of handling events in React, for efficiency and + performance reasons. Please read + [React Event Handling](https://react.dev/learn/responding-to-events) + to understand what this is about. ## `tgui/components` @@ -87,13 +83,13 @@ This component provides animations for numeric values. - `value: number` - Value to animate. - `initial: number` - Initial value to use in animation when element -first appears. If you set initial to `0` for example, number will always -animate starting from `0`, and if omitted, it will not play an initial -animation. + first appears. If you set initial to `0` for example, number will always + animate starting from `0`, and if omitted, it will not play an initial + animation. - `format: value => value` - Output formatter. - Example: `value => Math.round(value)`. - `children: (formattedValue, rawValue) => any` - Pull the animated number to -animate more complex things deeper in the DOM tree. + animate more complex things deeper in the DOM tree. - Example: `(_, value) => ` ### `BlockQuote` @@ -129,9 +125,7 @@ To workaround this problem, the Box children accept a render props function. This way, `Button` can pull out the `className` generated by the `Box`. ```jsx - - {props => + ``` @@ -409,17 +399,17 @@ effectively places the last flex item to the very end of the flex container. - See inherited props: [Box](#box) - ~~`spacing: number`~~ - **Removed in tgui 4.3**, -use [Stack](#stack) instead. + use [Stack](#stack) instead. - `inline: boolean` - Makes flexbox container inline, with similar behavior -to an `inline` property on a `Box`. + to an `inline` property on a `Box`. - `direction: string` - This establishes the main-axis, thus defining the -direction flex items are placed in the flex container. + direction flex items are placed in the flex container. - `row` (default) - left to right. - `row-reverse` - right to left. - `column` - top to bottom. - `column-reverse` - bottom to top. - `wrap: string` - By default, flex items will all try to fit onto one line. -You can change that and allow the items to wrap as needed with this property. + You can change that and allow the items to wrap as needed with this property. - `nowrap` (default) - all flex items will be on one line - `wrap` - flex items will wrap onto multiple lines, from top to bottom. - `wrap-reverse` - flex items will wrap onto multiple lines from bottom to top. @@ -430,22 +420,22 @@ You can change that and allow the items to wrap as needed with this property. - `center` - items are centered on the cross axis. - `baseline` - items are aligned such as their baselines align. - `justify: string` - This defines the alignment along the main axis. -It helps distribute extra free space leftover when either all the flex -items on a line are inflexible, or are flexible but have reached their -maximum size. It also exerts some control over the alignment of items -when they overflow the line. + It helps distribute extra free space leftover when either all the flex + items on a line are inflexible, or are flexible but have reached their + maximum size. It also exerts some control over the alignment of items + when they overflow the line. - `flex-start` (default) - items are packed toward the start of the - flex-direction. + flex-direction. - `flex-end` - items are packed toward the end of the flex-direction. - `space-between` - items are evenly distributed in the line; first item is - on the start line, last item on the end line + on the start line, last item on the end line - `space-around` - items are evenly distributed in the line with equal space - around them. Note that visually the spaces aren't equal, since all the items - have equal space on both sides. The first item will have one unit of space - against the container edge, but two units of space between the next item - because that next item has its own spacing that applies. + around them. Note that visually the spaces aren't equal, since all the items + have equal space on both sides. The first item will have one unit of space + against the container edge, but two units of space between the next item + because that next item has its own spacing that applies. - `space-evenly` - items are distributed so that the spacing between any two - items (and the space to the edges) is equal. + items (and the space to the edges) is equal. - TBD (not all properties are supported in IE11). ### `Flex.Item` @@ -454,24 +444,24 @@ when they overflow the line. - See inherited props: [Box](#box) - `order: number` - By default, flex items are laid out in the source order. -However, the order property controls the order in which they appear in the -flex container. + However, the order property controls the order in which they appear in the + flex container. - `grow: number | boolean` - This defines the ability for a flex item to grow -if necessary. It accepts a unitless value that serves as a proportion. It -dictates what amount of the available space inside the flex container the -item should take up. This number is unit-less and is relative to other -siblings. + if necessary. It accepts a unitless value that serves as a proportion. It + dictates what amount of the available space inside the flex container the + item should take up. This number is unit-less and is relative to other + siblings. - `shrink: number | boolean` - This defines the ability for a flex item to -shrink if necessary. Inverse of `grow`. + shrink if necessary. Inverse of `grow`. - `basis: number | string` - This defines the default size of an element -before any flex-related calculations are done. Has to be a length -(e.g. `20%`, `5rem`), an `auto` or `content` keyword. + before any flex-related calculations are done. Has to be a length + (e.g. `20%`, `5rem`), an `auto` or `content` keyword. - **Important:** IE11 flex is buggy, and auto width/height calculations - can sometimes end up in a circular dependency. This usually happens, when - working with tables inside flex (they have wacky internal widths and such). - Setting basis to `0` breaks the loop and fixes all of the problems. + can sometimes end up in a circular dependency. This usually happens, when + working with tables inside flex (they have wacky internal widths and such). + Setting basis to `0` breaks the loop and fixes all of the problems. - `align: string` - This allows the default alignment (or the one specified by -align-items) to be overridden for individual flex items. See: [Flex](#flex). + align-items) to be overridden for individual flex items. See: [Flex](#flex). ### `Grid` @@ -487,14 +477,10 @@ Example: ```jsx -
- Hello world! -
+
Hello world!
-
- Hello world! -
+
Hello world!
``` @@ -520,6 +506,7 @@ Renders one of the FontAwesome icons of your choice. To smoothen the transition from v4 to v5, we have added a v4 semantic to transform names with `-o` suffixes to FA Regular icons. For example: + - `square` will get transformed to `fas square` - `square-o` will get transformed to `far square` @@ -528,10 +515,10 @@ transform names with `-o` suffixes to FA Regular icons. For example: - See inherited props: [Box](#box) - `name: string` - Icon name. - `size: number` - Icon size. `1` is normal size, `2` is two times bigger. -Fractional numbers are supported. + Fractional numbers are supported. - `rotation: number` - Icon rotation, in degrees. - `spin: boolean` - Whether an icon should be spinning. Good for load -indicators. + indicators. ### `Icon.Stack` @@ -561,12 +548,12 @@ A basic text input, which allow users to enter text into a UI. - See inherited props: [Box](#box) - `value: string` - Value of an input. - `placeholder: string` - Text placed into Input box when it's empty, -otherwise nothing. Clears automatically when focused. + otherwise nothing. Clears automatically when focused. - `fluid: boolean` - Fill all available horizontal space. - `selfClear: boolean` - Clear after hitting enter, as well as remain focused -when this happens. Useful for things like chat inputs. + when this happens. Useful for things like chat inputs. - `onChange: (e, value) => void` - An event, which fires when you commit -the text by either unfocusing the input box, or by pressing the Enter key. + the text by either unfocusing the input box, or by pressing the Enter key. - `onInput: (e, value) => void` - An event, which fires on every keypress. ### `Knob` @@ -582,30 +569,30 @@ Single click opens an input box to manually type in a number. - `animated: boolean` - Animates the value if it was changed externally. - `bipolar: boolean` - Knob can be bipolar or unipolar. - `size: number` - Relative size of the knob. `1` is normal size, `2` is two -times bigger. Fractional numbers are supported. + times bigger. Fractional numbers are supported. - `color: string` - Color of the outer ring around the knob. - `value: number` - Value itself, controls the position of the cursor. - `unit: string` - Unit to display to the right of value. - `minValue: number` - Lowest possible value. - `maxValue: number` - Highest possible value. - `fillValue: number` - If set, this value will be used to set the fill -percentage of the outer ring independently of the main value. + percentage of the outer ring independently of the main value. - `ranges: { color: [from, to] }` - Applies a `color` to the outer ring around -the knob based on whether the value lands in the range between `from` and `to`. -See an example of this prop in [ProgressBar](#progressbar). + the knob based on whether the value lands in the range between `from` and `to`. + See an example of this prop in [ProgressBar](#progressbar). - `step: number` (default: 1) - Adjust value by this amount when -dragging the input. + dragging the input. - `stepPixelSize: number` (default: 1) - Screen distance mouse needs -to travel to adjust value by one `step`. + to travel to adjust value by one `step`. - `format: value => value` - Format value using this function before -displaying it. + displaying it. - `suppressFlicker: number` - A number in milliseconds, for which the input -will hold off from updating while events propagate through the backend. -Default is about 250ms, increase it if you still see flickering. + will hold off from updating while events propagate through the backend. + Default is about 250ms, increase it if you still see flickering. - `onChange: (e, value) => void` - An event, which fires when you release -the input, or successfully enter a number. + the input, or successfully enter a number. - `onDrag: (e, value) => void` - An event, which fires about every 500ms -when you drag the input up and down, on release and on manual editing. + when you drag the input up and down, on release and on manual editing. ### `LabeledControls` @@ -633,9 +620,7 @@ column is labels, and second column is content. ```jsx - - Content - + Content ``` @@ -644,13 +629,7 @@ to perform some sort of action), there is a way to do that: ```jsx - - Click me! - - )}> + Click me!}> Content @@ -664,7 +643,7 @@ to perform some sort of action), there is a way to do that: **Props:** -- `label: string|InfernoNode` - Item label. +- `label: ReactNode` - Item label. - `color: string` - Sets the color of the text. - `buttons: any` - Buttons to render aside the content. - `children: any` - Content of this labeled item. @@ -677,9 +656,7 @@ Example: ```jsx - - Content - + Content ``` @@ -725,22 +702,22 @@ to fine tune the value, or single click it to manually type a number. - `minValue: number` - Lowest possible value. - `maxValue: number` - Highest possible value. - `step: number` (default: 1) - Adjust value by this amount when -dragging the input. + dragging the input. - `stepPixelSize: number` (default: 1) - Screen distance mouse needs -to travel to adjust value by one `step`. + to travel to adjust value by one `step`. - `width: string|number` - Width of the element, in `Box` units or pixels. - `height: string|numer` - Height of the element, in `Box` units or pixels. - `lineHeight: string|number` - lineHeight of the element, in `Box` units or pixels. - `fontSize: string|number` - fontSize of the element, in `Box` units or pixels. - `format: value => value` - Format value using this function before -displaying it. + displaying it. - `suppressFlicker: number` - A number in milliseconds, for which the input -will hold off from updating while events propagate through the backend. -Default is about 250ms, increase it if you still see flickering. + will hold off from updating while events propagate through the backend. + Default is about 250ms, increase it if you still see flickering. - `onChange: (e, value) => void` - An event, which fires when you release -the input, or successfully enter a number. + the input, or successfully enter a number. - `onDrag: (e, value) => void` - An event, which fires about every 500ms -when you drag the input up and down, on release and on manual editing. + when you drag the input up and down, on release and on manual editing. ### `Popper` @@ -748,7 +725,7 @@ Popper lets you position elements so that they don't go out of the bounds of the **Props:** -- `popperContent: InfernoNode` - The content that will be put inside the popper. +- `popperContent: ReactNode` - The content that will be put inside the popper. - `options?: { ... }` - An object of options to pass to `createPopper`. See [https://popper.js.org/docs/v2/constructors/#options], but the one you want most is `placement`. Valid placements are "bottom", "top", "left", and "right". You can affix "-start" and "-end" to achieve something like top left or top right respectively. You can also use "auto" (with an optional "-start" or "-end"), where a best fit will be chosen. - `additionalStyles: { ... }` - A map of CSS styles to add to the element that will contain the popper. @@ -769,18 +746,19 @@ Usage of `ranges` prop: average: [0.25, 0.5], bad: [-Infinity, 0.25], }} - value={0.6} /> + value={0.6} +/> ``` **Props:** - `value: number` - Current progress as a floating point number between -`minValue` (default: 0) and `maxValue` (default: 1). Determines the -percentage and how filled the bar is. + `minValue` (default: 0) and `maxValue` (default: 1). Determines the + percentage and how filled the bar is. - `minValue: number` - Lowest possible value. - `maxValue: number` - Highest possible value. - `ranges: { color: [from, to] }` - Applies a `color` to the progress bar -based on whether the value lands in the range between `from` and `to`. + based on whether the value lands in the range between `from` and `to`. - `color: string` - Color of the progress bar. Can take any of the following formats: - `#ffffff` - Hex format - `rgb(r,g,b) / rgba(r,g,b,a)` - RGB format @@ -798,13 +776,14 @@ The RoundGauge component provides a visual representation of a single metric, as value={tankPressure} minValue={0} maxValue={pressureLimit} - alertAfter={pressureLimit * 0.70} + alertAfter={pressureLimit * 0.7} ranges={{ - "good": [0, pressureLimit * 0.70], - "average": [pressureLimit * 0.70, pressureLimit * 0.85], - "bad": [pressureLimit * 0.85, pressureLimit], + good: [0, pressureLimit * 0.7], + average: [pressureLimit * 0.7, pressureLimit * 0.85], + bad: [pressureLimit * 0.85, pressureLimit], }} - format={formatPressure} /> + format={formatPressure} +/> ``` The alert on the gauge is optional, and will only be shown if the `alertAfter` prop is defined. When defined, the alert will begin to flash the respective color upon which the needle currently rests, as defined in the `ranges` prop. @@ -832,22 +811,14 @@ clearly indicates hierarchy. Section can also be titled to clearly define its purpose. ```jsx -
- Here you can order supply crates. -
+
Here you can order supply crates.
``` If you want to have a button on the right side of an section title (for example, to perform some sort of action), there is a way to do that: ```jsx -
- Send shuttle - - )}> +
Send shuttle}> Here you can order supply crates.
``` @@ -881,23 +852,23 @@ Single click opens an input box to manually type in a number. - `minValue: number` - Lowest possible value. - `maxValue: number` - Highest possible value. - `fillValue: number` - If set, this value will be used to set the fill -percentage of the progress bar filler independently of the main value. + percentage of the progress bar filler independently of the main value. - `ranges: { color: [from, to] }` - Applies a `color` to the slider -based on whether the value lands in the range between `from` and `to`. -See an example of this prop in [ProgressBar](#progressbar). + based on whether the value lands in the range between `from` and `to`. + See an example of this prop in [ProgressBar](#progressbar). - `step: number` (default: 1) - Adjust value by this amount when -dragging the input. + dragging the input. - `stepPixelSize: number` (default: 1) - Screen distance mouse needs -to travel to adjust value by one `step`. + to travel to adjust value by one `step`. - `format: value => value` - Format value using this function before -displaying it. + displaying it. - `suppressFlicker: number` - A number in milliseconds, for which the input -will hold off from updating while events propagate through the backend. -Default is about 250ms, increase it if you still see flickering. + will hold off from updating while events propagate through the backend. + Default is about 250ms, increase it if you still see flickering. - `onChange: (e, value) => void` - An event, which fires when you release -the input, or successfully enter a number. + the input, or successfully enter a number. - `onDrag: (e, value) => void` - An event, which fires about every 500ms -when you drag the input up and down, on release and on manual editing. + when you drag the input up and down, on release and on manual editing. ### `Stack` @@ -913,13 +884,9 @@ Stacks can be vertical by adding a `vertical` property. ```jsx - - Button description - + Button description - + ``` @@ -934,9 +901,7 @@ Make sure to use the `fill` property. -
- Sidebar -
+
Sidebar
@@ -946,9 +911,7 @@ Make sure to use the `fill` property.
-
- Bottom pane -
+
Bottom pane
@@ -980,9 +943,7 @@ Example: ```jsx - - Hello world! - + Hello world! Label @@ -1011,7 +972,7 @@ A straight forward mapping to `
` element. - See inherited props: [Box](#box) - `collapsing: boolean` - Collapses table cell to the smallest possible size, -and stops any text inside from wrapping. + and stops any text inside from wrapping. ### `Tabs` @@ -1047,9 +1008,7 @@ Tabs also support a vertical configuration. This is usually paired with ```jsx - - ... - + ... Tab content. @@ -1063,9 +1022,7 @@ component: ```jsx
- - ... - + ... ... other things ...
``` @@ -1075,9 +1032,9 @@ component: - See inherited props: [Box](#box) - `fluid: boolean` - If true, tabs will take all available horizontal space. - `fill: boolean` - Similarly to `fill` on [Section](#section), tabs will fill -all available vertical space. Only makes sense in a vertical configuration. + all available vertical space. Only makes sense in a vertical configuration. - `vertical: boolean` - Use a vertical configuration, where tabs will be -stacked vertically. + stacked vertically. - `children: Tab[]` - This component only accepts tabs as its children. ### `Tabs.Tab` @@ -1089,8 +1046,8 @@ a lot of `Button` props. - See inherited props: [Button](#button) - `altSelection` - Whether the tab buttons select via standard select (color -change) or by adding a white indicator to the selected tab. -Intended for usage on interfaces where tab color has relevance. + change) or by adding a white indicator to the selected tab. + Intended for usage on interfaces where tab color has relevance. - `icon: string` - Tab icon. - `children: any` - Tab text. - `onClick: function` - Called when element is clicked. @@ -1107,9 +1064,7 @@ Usage: ```jsx - - Sample text. - + Sample text. ``` @@ -1117,7 +1072,7 @@ Usage: - `position?: string` - Tooltip position. See [`Popper`](#Popper) for valid options. Defaults to "auto". - `content: string` - Content of the tooltip. Must be a plain string. -Fragments or other elements are **not** supported. + Fragments or other elements are **not** supported. ## `tgui/layouts` @@ -1131,9 +1086,7 @@ Example: ```jsx - - Hello, world! - + Hello, world! ``` @@ -1148,9 +1101,9 @@ Example: - `height: number` - Window height. - `canClose: boolean` - Controls the ability to close the window. - `children: any` - Child elements, which are rendered directly inside the -window. If you use a [Dimmer](#dimmer) or [Modal](#modal) in your UI, -they should be put as direct childs of a Window, otherwise you should be -putting your content into [Window.Content](#windowcontent). + window. If you use a [Dimmer](#dimmer) or [Modal](#modal) in your UI, + they should be put as direct childs of a Window, otherwise you should be + putting your content into [Window.Content](#windowcontent). ### `Window.Content` diff --git a/tgui/jest.config.js b/tgui/jest.config.js index 8b78818004be..d8b4ac3e41a8 100644 --- a/tgui/jest.config.js +++ b/tgui/jest.config.js @@ -8,7 +8,7 @@ module.exports = { testEnvironment: 'jsdom', testRunner: require.resolve('jest-circus/runner'), transform: { - '^.+\\.(js|cjs|ts|tsx)$': require.resolve('babel-jest'), + '^.+\\.(js|cjs|ts|tsx)$': require.resolve('@swc/jest'), }, moduleFileExtensions: ['js', 'cjs', 'ts', 'tsx', 'json'], resetMocks: true, diff --git a/tgui/package.json b/tgui/package.json index 227644791f22..add7b7478999 100644 --- a/tgui/package.json +++ b/tgui/package.json @@ -22,22 +22,14 @@ "tgui:eslint-fix": "eslint --fix packages --ext .js,.jsx,.cjs,.ts,.tsx" }, "dependencies": { - "@babel/core": "^7.15.0", - "@babel/eslint-parser": "^7.15.0", - "@babel/plugin-proposal-class-properties": "^7.14.5", - "@babel/plugin-transform-jscript": "^7.14.5", - "@babel/preset-env": "^7.15.0", - "@babel/preset-typescript": "^7.15.0", + "@swc/core": "^1.5.24", + "@swc/jest": "^0.2.36", "@types/jest": "^27.0.1", "@types/jsdom": "^16.2.13", "@types/node": "^14.17.9", "@types/webpack": "^5.28.0", "@types/webpack-env": "^1.16.2", "@typescript-eslint/parser": "^4.29.1", - "babel-jest": "^27.0.6", - "babel-loader": "^8.2.2", - "babel-plugin-inferno": "^6.3.0", - "babel-plugin-transform-remove-console": "^6.9.4", "common": "workspace:*", "css-loader": "^5.2.7", "esbuild-loader": "^4.1.0", @@ -47,7 +39,6 @@ "eslint-plugin-react": "^7.24.0", "eslint-plugin-unused-imports": "^1.1.4", "file-loader": "^6.2.0", - "inferno": "^7.4.8", "jest": "^27.0.6", "jest-circus": "^27.0.6", "jsdom": "^16.7.0", @@ -56,6 +47,7 @@ "sass": "^1.37.5", "sass-loader": "^11.1.1", "style-loader": "^2.0.0", + "swc-loader": "^0.2.6", "typescript": "^4.3.5", "url-loader": "^4.1.1", "webpack": "^5.75.0", diff --git a/tgui/packages/common/package.json b/tgui/packages/common/package.json index 54d73251a65a..ebae63c887f9 100644 --- a/tgui/packages/common/package.json +++ b/tgui/packages/common/package.json @@ -1,5 +1,5 @@ { "private": true, "name": "common", - "version": "4.3.0" + "version": "5.0.0" } diff --git a/tgui/packages/common/react.ts b/tgui/packages/common/react.ts index 6789bb4edc65..938a1e303a16 100644 --- a/tgui/packages/common/react.ts +++ b/tgui/packages/common/react.ts @@ -51,15 +51,6 @@ export const shallowDiffers = (a: object, b: object) => { return false; }; -/** - * Default inferno hooks for pure components. - */ -export const pureComponentHooks = { - onComponentShouldUpdate: (lastProps, nextProps) => { - return shallowDiffers(lastProps, nextProps); - }, -}; - /** * A helper to determine whether the object is renderable by React. */ diff --git a/tgui/packages/common/string.babel-plugin.cjs b/tgui/packages/common/string.babel-plugin.cjs deleted file mode 100644 index 97ca67c6ea4c..000000000000 --- a/tgui/packages/common/string.babel-plugin.cjs +++ /dev/null @@ -1,73 +0,0 @@ -/** - * This plugin saves overall about 10KB on the final bundle size, so it's - * sort of worth it. - * - * We are using a .cjs extension because: - * - * 1. Webpack CLI only supports CommonJS modules; - * 2. tgui-dev-server supports both, but we still need to signal NodeJS - * to import it as a CommonJS module, hence .cjs extension. - * - * We need to copy-paste the whole "multiline" function because we can't - * synchronously import an ES module from a CommonJS module. - * - * @file - * @copyright 2020 Aleksej Komarov - * @license MIT - */ - -/** - * Removes excess whitespace and indentation from the string. - */ -const multiline = (str) => { - const lines = str.split('\n'); - // Determine base indentation - let minIndent; - for (let line of lines) { - for (let indent = 0; indent < line.length; indent++) { - const char = line[indent]; - if (char !== ' ') { - if (minIndent === undefined || indent < minIndent) { - minIndent = indent; - } - break; - } - } - } - if (!minIndent) { - minIndent = 0; - } - // Remove this base indentation and trim the resulting string - // from both ends. - return lines - .map((line) => line.substr(minIndent).trimRight()) - .join('\n') - .trim(); -}; - -const StringPlugin = (ref) => { - return { - visitor: { - TaggedTemplateExpression: (path) => { - if (path.node.tag.name === 'multiline') { - const { quasi } = path.node; - if (quasi.expressions.length > 0) { - throw new Error('Multiline tag does not support expressions!'); - } - if (quasi.quasis.length > 1) { - throw new Error('Quasis is longer than 1'); - } - const { value } = quasi.quasis[0]; - value.raw = multiline(value.raw); - value.cooked = multiline(value.cooked); - path.replaceWith(quasi); - } - }, - }, - }; -}; - -module.exports = { - __esModule: true, - default: StringPlugin, -}; diff --git a/tgui/packages/common/string.js b/tgui/packages/common/string.js index 7ed73a0b2860..f13b23592e9f 100644 --- a/tgui/packages/common/string.js +++ b/tgui/packages/common/string.js @@ -4,39 +4,6 @@ * @license MIT */ -/** - * Removes excess whitespace and indentation from the string. - */ -export const multiline = (str) => { - if (Array.isArray(str)) { - // Small stub to allow usage as a template tag - return multiline(str.join('')); - } - const lines = str.split('\n'); - // Determine base indentation - let minIndent; - for (let line of lines) { - for (let indent = 0; indent < line.length; indent++) { - const char = line[indent]; - if (char !== ' ') { - if (minIndent === undefined || indent < minIndent) { - minIndent = indent; - } - break; - } - } - } - if (!minIndent) { - minIndent = 0; - } - // Remove this base indentation and trim the resulting string - // from both ends. - return lines - .map((line) => line.substr(minIndent).trimRight()) - .join('\n') - .trim(); -}; - /** * Creates a glob pattern matcher. * diff --git a/tgui/packages/tgui-bench/package.json b/tgui/packages/tgui-bench/package.json index 3641e2cbf258..5a77fe33393f 100644 --- a/tgui/packages/tgui-bench/package.json +++ b/tgui/packages/tgui-bench/package.json @@ -1,16 +1,15 @@ { "private": true, "name": "tgui-bench", - "version": "4.3.0", + "version": "5.0.0", "dependencies": { "@types/node": "^14.17.9", "common": "workspace:*", "fastify": "^3.20.2", "fastify-static": "^4.2.3", - "inferno": "^7.4.8", - "inferno-vnode-flags": "^7.4.8", "lodash": "^4.17.21", "platform": "^1.3.6", + "react": "^18.3.1", "tgui": "workspace:*" } } diff --git a/tgui/packages/tgui-bench/tests/Button.test.tsx b/tgui/packages/tgui-bench/tests/Button.test.tsx index 6b806d720ab8..70e7219d4437 100644 --- a/tgui/packages/tgui-bench/tests/Button.test.tsx +++ b/tgui/packages/tgui-bench/tests/Button.test.tsx @@ -1,4 +1,3 @@ -import { linkEvent } from 'inferno'; import { Button } from 'tgui/components'; import { createRenderer } from 'tgui/renderer'; @@ -16,13 +15,6 @@ export const SingleButtonWithCallback = () => { render(node); }; -export const SingleButtonWithLinkEvent = () => { - const node = ( - - ); - render(node); -}; - export const ListOfButtons = () => { const nodes: JSX.Element[] = []; for (let i = 0; i < 100; i++) { @@ -45,19 +37,6 @@ export const ListOfButtonsWithCallback = () => { render(
{nodes}
); }; -export const ListOfButtonsWithLinkEvent = () => { - const nodes: JSX.Element[] = []; - for (let i = 0; i < 100; i++) { - const node = ( - - ); - nodes.push(node); - } - render(
{nodes}
); -}; - export const ListOfButtonsWithIcons = () => { const nodes: JSX.Element[] = []; for (let i = 0; i < 100; i++) { diff --git a/tgui/packages/tgui-bench/tests/DisposalUnit.test.tsx b/tgui/packages/tgui-bench/tests/DisposalUnit.test.tsx index 3832d4fc9ca4..3497c41e8fa0 100644 --- a/tgui/packages/tgui-bench/tests/DisposalUnit.test.tsx +++ b/tgui/packages/tgui-bench/tests/DisposalUnit.test.tsx @@ -1,21 +1,19 @@ -import { backendUpdate } from 'tgui/backend'; +import { backendUpdate, setGlobalStore } from 'tgui/backend'; import { DisposalUnit } from 'tgui/interfaces/DisposalUnit'; import { createRenderer } from 'tgui/renderer'; -import { configureStore, StoreProvider } from 'tgui/store'; +import { configureStore } from 'tgui/store'; const store = configureStore({ sideEffets: false }); const renderUi = createRenderer((dataJson: string) => { + setGlobalStore(store); + store.dispatch( backendUpdate({ data: Byond.parseJson(dataJson), }), ); - return ( - - - - ); + return ; }); export const data = JSON.stringify({ diff --git a/tgui/packages/tgui-dev-server/package.json b/tgui/packages/tgui-dev-server/package.json index 8ee0e019ee0a..51e7271fc99b 100644 --- a/tgui/packages/tgui-dev-server/package.json +++ b/tgui/packages/tgui-dev-server/package.json @@ -1,7 +1,7 @@ { "private": true, "name": "tgui-dev-server", - "version": "4.3.0", + "version": "5.0.0", "type": "module", "dependencies": { "axios": "^0.21.1", diff --git a/tgui/packages/tgui-panel/Panel.jsx b/tgui/packages/tgui-panel/Panel.tsx similarity index 99% rename from tgui/packages/tgui-panel/Panel.jsx rename to tgui/packages/tgui-panel/Panel.tsx index 82d4d4624ab3..04182f5eb6ed 100644 --- a/tgui/packages/tgui-panel/Panel.jsx +++ b/tgui/packages/tgui-panel/Panel.tsx @@ -25,6 +25,7 @@ export const Panel = (props) => { return ; } } + return ( diff --git a/tgui/packages/tgui-panel/audio/NowPlayingWidget.jsx b/tgui/packages/tgui-panel/audio/NowPlayingWidget.jsx index abe9191fad4f..8fd6d0bc4f98 100644 --- a/tgui/packages/tgui-panel/audio/NowPlayingWidget.jsx +++ b/tgui/packages/tgui-panel/audio/NowPlayingWidget.jsx @@ -26,9 +26,9 @@ export const NowPlayingWidget = (props) => { mx={0.5} grow={1} style={{ - 'white-space': 'nowrap', + whiteSpace: 'nowrap', overflow: 'hidden', - 'text-overflow': 'ellipsis', + textOverflow: 'ellipsis', }} > {title || 'Unknown Track'} diff --git a/tgui/packages/tgui-panel/chat/ChatPanel.jsx b/tgui/packages/tgui-panel/chat/ChatPanel.jsx index 1577e933fb4c..36e86876f509 100644 --- a/tgui/packages/tgui-panel/chat/ChatPanel.jsx +++ b/tgui/packages/tgui-panel/chat/ChatPanel.jsx @@ -5,13 +5,13 @@ */ import { shallowDiffers } from 'common/react'; -import { Component, createRef } from 'inferno'; +import { Component, createRef } from 'react'; import { Button } from 'tgui/components'; import { chatRenderer } from './renderer'; export class ChatPanel extends Component { - constructor() { - super(); + constructor(props) { + super(props); this.ref = createRef(); this.state = { scrollTracking: true, diff --git a/tgui/packages/tgui-panel/chat/ChatTabs.jsx b/tgui/packages/tgui-panel/chat/ChatTabs.jsx index 9ef736bd554a..ed3a285c204f 100644 --- a/tgui/packages/tgui-panel/chat/ChatTabs.jsx +++ b/tgui/packages/tgui-panel/chat/ChatTabs.jsx @@ -13,11 +13,11 @@ import { openChatSettings } from '../settings/actions'; const UnreadCountWidget = ({ value }) => ( diff --git a/tgui/packages/tgui-panel/chat/constants.js b/tgui/packages/tgui-panel/chat/constants.ts similarity index 100% rename from tgui/packages/tgui-panel/chat/constants.js rename to tgui/packages/tgui-panel/chat/constants.ts diff --git a/tgui/packages/tgui-panel/chat/index.js b/tgui/packages/tgui-panel/chat/index.ts similarity index 100% rename from tgui/packages/tgui-panel/chat/index.js rename to tgui/packages/tgui-panel/chat/index.ts diff --git a/tgui/packages/tgui-panel/chat/renderer.js b/tgui/packages/tgui-panel/chat/renderer.jsx similarity index 97% rename from tgui/packages/tgui-panel/chat/renderer.js rename to tgui/packages/tgui-panel/chat/renderer.jsx index f84137261ede..45b9654613d6 100644 --- a/tgui/packages/tgui-panel/chat/renderer.js +++ b/tgui/packages/tgui-panel/chat/renderer.jsx @@ -16,15 +16,16 @@ import { MAX_PERSISTED_MESSAGES, MAX_VISIBLE_MESSAGES, MESSAGE_PRUNE_INTERVAL, + MESSAGE_TYPES, MESSAGE_TYPE_COMBAT, MESSAGE_TYPE_INTERNAL, MESSAGE_TYPE_LOCALCHAT, MESSAGE_TYPE_UNKNOWN, } from './constants'; -import { render } from 'inferno'; import { canPageAcceptType, createMessage, isSameMessage } from './model'; import { highlightNode, linkifyNode } from './replaceInTextNode'; -import { Tooltip } from '../../tgui/components'; +import { Tooltip } from 'tgui/components'; +import { createRoot } from 'react-dom/client'; const logger = createLogger('chatRenderer'); @@ -363,14 +364,16 @@ class ChatRenderer { childNode.removeChild(childNode.firstChild); } const Element = TGUI_CHAT_COMPONENTS[targetName]; + + const reactRoot = createRoot(childNode); + /* eslint-disable react/no-danger */ - render( + reactRoot.render( , childNode, ); - /* eslint-enable react/no-danger */ } // Highlight text @@ -400,7 +403,10 @@ class ChatRenderer { message.node = node; // Query all possible selectors to find out the message type if (!message.type) { - message.type = MESSAGE_TYPE_UNKNOWN; + const typeDef = MESSAGE_TYPES.find( + (typeDef) => typeDef.selector && node.querySelector(typeDef.selector), + ); + message.type = typeDef?.type || MESSAGE_TYPE_UNKNOWN; } updateMessageBadge(message); if (!countByType[message.type]) { diff --git a/tgui/packages/tgui-panel/chat/selectors.js b/tgui/packages/tgui-panel/chat/selectors.ts similarity index 66% rename from tgui/packages/tgui-panel/chat/selectors.js rename to tgui/packages/tgui-panel/chat/selectors.ts index 6352b7cddf0a..b8c1c5a373df 100644 --- a/tgui/packages/tgui-panel/chat/selectors.js +++ b/tgui/packages/tgui-panel/chat/selectors.ts @@ -9,9 +9,10 @@ import { map } from 'common/collections'; export const selectChat = (state) => state.chat; export const selectChatPages = (state) => - map((id) => state.chat.pageById[id])(state.chat.pages); + map((id: string) => state.chat.pageById[id])(state.chat.pages); export const selectCurrentChatPage = (state) => state.chat.pageById[state.chat.currentPageId]; -export const selectChatPageById = (id) => (state) => state.chat.pageById[id]; +export const selectChatPageById = (id: string) => (state) => + state.chat.pageById[id]; diff --git a/tgui/packages/tgui-panel/index.jsx b/tgui/packages/tgui-panel/index.jsx index 40bb85984414..e626553727ae 100644 --- a/tgui/packages/tgui-panel/index.jsx +++ b/tgui/packages/tgui-panel/index.jsx @@ -14,7 +14,7 @@ import { setupHotReloading } from 'tgui-dev-server/link/client.cjs'; import { setupGlobalEvents } from 'tgui/events'; import { captureExternalLinks } from 'tgui/links'; import { createRenderer } from 'tgui/renderer'; -import { configureStore, StoreProvider } from 'tgui/store'; +import { configureStore } from 'tgui/store'; import { audioMiddleware, audioReducer } from './audio'; import { chatMiddleware, chatReducer } from './chat'; import { gameMiddleware, gameReducer } from './game'; @@ -51,11 +51,7 @@ const renderApp = createRenderer(() => { setGlobalStore(store); const { Panel } = require('./Panel'); - return ( - - - - ); + return ; }); const setupApp = () => { diff --git a/tgui/packages/tgui-panel/package.json b/tgui/packages/tgui-panel/package.json index b627ec7015be..b0c238421dd8 100644 --- a/tgui/packages/tgui-panel/package.json +++ b/tgui/packages/tgui-panel/package.json @@ -1,11 +1,14 @@ { "private": true, "name": "tgui-panel", - "version": "4.3.0", + "version": "5.0.0", "dependencies": { + "@types/react": "^18.3.3", + "@types/react-dom": "^18.3.0", "common": "workspace:*", "dompurify": "^2.3.1", - "inferno": "^7.4.8", + "react": "^18.3.1", + "react-dom": "^18.3.1", "tgui": "workspace:*", "tgui-dev-server": "workspace:*", "tgui-polyfill": "workspace:*" diff --git a/tgui/packages/tgui-panel/reconnect.tsx b/tgui/packages/tgui-panel/reconnect.tsx index c170726a3463..b1c871b325b6 100644 --- a/tgui/packages/tgui-panel/reconnect.tsx +++ b/tgui/packages/tgui-panel/reconnect.tsx @@ -12,28 +12,27 @@ setInterval(() => { }, 5000); export const ReconnectButton = (props) => { + if (!url) return null; return ( - url && ( - <> - + <> + - - - ) + + ); }; diff --git a/tgui/packages/tgui-polyfill/1-misc.js b/tgui/packages/tgui-polyfill/1-misc.js index d519ef9e66cc..d10588c32151 100644 --- a/tgui/packages/tgui-polyfill/1-misc.js +++ b/tgui/packages/tgui-polyfill/1-misc.js @@ -8,11 +8,6 @@ (function () { 'use strict'; - // Inferno needs Int32Array, and it is not covered by core-js. - if (!window.Int32Array) { - window.Int32Array = Array; - } - // ie11 polyfills !(function () { // append diff --git a/tgui/packages/tgui-polyfill/package.json b/tgui/packages/tgui-polyfill/package.json index c1374c20c64a..eaffa9f7a096 100644 --- a/tgui/packages/tgui-polyfill/package.json +++ b/tgui/packages/tgui-polyfill/package.json @@ -1,16 +1,16 @@ { "private": true, "name": "tgui-polyfill", - "version": "4.3.0", + "version": "5.0.0", "scripts": { "tgui-polyfill:build": "terser 1-misc.js -f ascii_only,comments=false -o ../../public/tgui-polyfill.min.js" }, "dependencies": { - "core-js": "^3.16.1", - "regenerator-runtime": "^0.13.9", - "unfetch": "^4.2.0" + "core-js": "^3.37.1", + "regenerator-runtime": "^0.14.1", + "unfetch": "^5.0.0" }, "devDependencies": { - "terser": "^5.12.1" + "terser": "^5.31.0" } } diff --git a/tgui/packages/tgui/components/AnimatedNumber.jsx b/tgui/packages/tgui/components/AnimatedNumber.jsx index a763becfd405..b67263a02ef3 100644 --- a/tgui/packages/tgui/components/AnimatedNumber.jsx +++ b/tgui/packages/tgui/components/AnimatedNumber.jsx @@ -5,7 +5,7 @@ */ import { clamp, toFixed } from 'common/math'; -import { Component } from 'inferno'; +import { Component } from 'react'; const FPS = 20; const Q = 0.5; diff --git a/tgui/packages/tgui/components/Autofocus.tsx b/tgui/packages/tgui/components/Autofocus.tsx index 28945dd7aa48..3edfed822d01 100644 --- a/tgui/packages/tgui/components/Autofocus.tsx +++ b/tgui/packages/tgui/components/Autofocus.tsx @@ -1,6 +1,6 @@ -import { Component, createRef } from 'inferno'; +import { Component, createRef, PropsWithChildren } from 'react'; -export class Autofocus extends Component { +export class Autofocus extends Component { ref = createRef(); componentDidMount() { diff --git a/tgui/packages/tgui/components/Blink.jsx b/tgui/packages/tgui/components/Blink.jsx index e1cd50dcb549..7d7bb16170a9 100644 --- a/tgui/packages/tgui/components/Blink.jsx +++ b/tgui/packages/tgui/components/Blink.jsx @@ -1,11 +1,11 @@ -import { Component } from 'inferno'; +import { Component } from 'react'; const DEFAULT_BLINKING_INTERVAL = 1000; const DEFAULT_BLINKING_TIME = 1000; export class Blink extends Component { - constructor() { - super(); + constructor(props) { + super(props); this.state = { hidden: false, }; diff --git a/tgui/packages/tgui/components/BodyZoneSelector.tsx b/tgui/packages/tgui/components/BodyZoneSelector.tsx index 234751f271e3..4ddfabba8939 100644 --- a/tgui/packages/tgui/components/BodyZoneSelector.tsx +++ b/tgui/packages/tgui/components/BodyZoneSelector.tsx @@ -1,4 +1,4 @@ -import { Component, createRef } from 'inferno'; +import { Component, createRef } from 'react'; import { DmIcon } from './DMIcon'; export enum BodyZone { @@ -114,7 +114,6 @@ export class BodyZoneSelector extends Component< }); }} style={{ - '-ms-interpolation-mode': 'nearest-neighbor', position: 'absolute', width: `${32 * scale}px`, height: `${32 * scale}px`, @@ -126,8 +125,7 @@ export class BodyZoneSelector extends Component< icon="icons/hud/screen_gen.dmi" icon_state={selectedZone} style={{ - '-ms-interpolation-mode': 'nearest-neighbor', - 'pointer-events': 'none', + pointerEvents: 'none', position: 'absolute', width: `${32 * scale}px`, height: `${32 * scale}px`, @@ -140,9 +138,8 @@ export class BodyZoneSelector extends Component< icon="icons/hud/screen_gen.dmi" icon_state={hoverZone} style={{ - '-ms-interpolation-mode': 'nearest-neighbor', - opacity: 0.5, - 'pointer-events': 'none', + opacity: '0.5', + pointerEvents: 'none', position: 'absolute', width: `${32 * scale}px`, height: `${32 * scale}px`, diff --git a/tgui/packages/tgui/components/Box.tsx b/tgui/packages/tgui/components/Box.tsx index 39402699c151..e5808277914a 100644 --- a/tgui/packages/tgui/components/Box.tsx +++ b/tgui/packages/tgui/components/Box.tsx @@ -4,65 +4,57 @@ * @license MIT */ -import { BooleanLike, classes, pureComponentHooks } from 'common/react'; -import { createVNode, InfernoNode, SFC } from 'inferno'; -import { ChildFlags, VNodeFlags } from 'inferno-vnode-flags'; +import { BooleanLike, classes } from 'common/react'; +import { + createElement, + KeyboardEventHandler, + MouseEventHandler, + ReactNode, + UIEventHandler, +} from 'react'; + import { CSS_COLORS } from '../constants'; +import { logger } from '../logging'; + +type BooleanProps = Partial>; +type StringProps = Partial< + Record +>; + +export type EventHandlers = Partial<{ + onClick: MouseEventHandler; + onContextMenu: MouseEventHandler; + onDoubleClick: MouseEventHandler; + onKeyDown: KeyboardEventHandler; + onKeyUp: KeyboardEventHandler; + onMouseDown: MouseEventHandler; + onMouseMove: MouseEventHandler; + onMouseOver: MouseEventHandler; + onMouseUp: MouseEventHandler; + onScroll: UIEventHandler; +}>; -export interface BoxProps { - [key: string]: any; - as?: string; - className?: string | BooleanLike; - children?: InfernoNode; - position?: string | BooleanLike; - overflow?: string | BooleanLike; - overflowX?: string | BooleanLike; - overflowY?: string | BooleanLike; - top?: string | BooleanLike; - bottom?: string | BooleanLike; - left?: string | BooleanLike; - right?: string | BooleanLike; - width?: string | BooleanLike; - minWidth?: string | BooleanLike; - maxWidth?: string | BooleanLike; - height?: string | BooleanLike; - minHeight?: string | BooleanLike; - maxHeight?: string | BooleanLike; - fontSize?: string | BooleanLike; - fontFamily?: string; - lineHeight?: string | BooleanLike; - opacity?: number; - textAlign?: string | BooleanLike; - verticalAlign?: string | BooleanLike; - inline?: BooleanLike; - bold?: BooleanLike; - italic?: BooleanLike; - nowrap?: BooleanLike; - preserveWhitespace?: BooleanLike; - m?: string | BooleanLike; - mx?: string | BooleanLike; - my?: string | BooleanLike; - mt?: string | BooleanLike; - mb?: string | BooleanLike; - ml?: string | BooleanLike; - mr?: string | BooleanLike; - p?: string | BooleanLike; - px?: string | BooleanLike; - py?: string | BooleanLike; - pt?: string | BooleanLike; - pb?: string | BooleanLike; - pl?: string | BooleanLike; - pr?: string | BooleanLike; - color?: string | BooleanLike; - textColor?: string | BooleanLike; - backgroundColor?: string | BooleanLike; - fillPositionedParent?: boolean; -} +export type BoxProps = Partial<{ + as: string; + children: ReactNode; + className: string | BooleanLike; + style: Partial; +}> & + BooleanProps & + StringProps & + EventHandlers; + +// Don't you dare put this elsewhere +type DangerDoNotUse = { + dangerouslySetInnerHTML?: { + __html: any; + }; +}; /** * Coverts our rem-like spacing unit into a CSS unit. */ -export const unit = (value: unknown): string | undefined => { +export const unit = (value: unknown) => { if (typeof value === 'string') { // Transparently convert pixels into rem units if (value.endsWith('px')) { @@ -78,7 +70,7 @@ export const unit = (value: unknown): string | undefined => { /** * Same as `unit`, but half the size for integers numbers. */ -export const halfUnit = (value: unknown): string | undefined => { +export const halfUnit = (value: unknown) => { if (typeof value === 'string') { return unit(value); } @@ -90,7 +82,7 @@ export const halfUnit = (value: unknown): string | undefined => { const isColorCode = (str: unknown) => !isColorClass(str); const isColorClass = (str: unknown): boolean => { - return typeof str === 'string' && CSS_COLORS.includes(str); + return typeof str === 'string' && CSS_COLORS.includes(str as any); }; const mapRawPropTo = (attrName) => (style, value) => { @@ -125,71 +117,72 @@ const mapColorPropTo = (attrName) => (style, value) => { } }; -const styleMapperByPropName = { - // Direct mapping - position: mapRawPropTo('position'), - overflow: mapRawPropTo('overflow'), - overflowX: mapRawPropTo('overflow-x'), - overflowY: mapRawPropTo('overflow-y'), - top: mapUnitPropTo('top', unit), +// String / number props +const stringStyleMap = { + align: mapRawPropTo('textAlign'), bottom: mapUnitPropTo('bottom', unit), + fontFamily: mapRawPropTo('fontFamily'), + fontSize: mapUnitPropTo('fontSize', unit), + fontWeight: mapRawPropTo('fontWeight'), + height: mapUnitPropTo('height', unit), left: mapUnitPropTo('left', unit), + maxHeight: mapUnitPropTo('maxHeight', unit), + maxWidth: mapUnitPropTo('maxWidth', unit), + minHeight: mapUnitPropTo('minHeight', unit), + minWidth: mapUnitPropTo('minWidth', unit), + opacity: mapRawPropTo('opacity'), + overflow: mapRawPropTo('overflow'), + overflowX: mapRawPropTo('overflowX'), + overflowY: mapRawPropTo('overflowY'), + position: mapRawPropTo('position'), right: mapUnitPropTo('right', unit), + textAlign: mapRawPropTo('textAlign'), + top: mapUnitPropTo('top', unit), + verticalAlign: mapRawPropTo('verticalAlign'), width: mapUnitPropTo('width', unit), - minWidth: mapUnitPropTo('min-width', unit), - maxWidth: mapUnitPropTo('max-width', unit), - height: mapUnitPropTo('height', unit), - minHeight: mapUnitPropTo('min-height', unit), - maxHeight: mapUnitPropTo('max-height', unit), - fontSize: mapUnitPropTo('font-size', unit), - fontFamily: mapRawPropTo('font-family'), + lineHeight: (style, value) => { if (typeof value === 'number') { - style['line-height'] = value; + style['lineHeight'] = value; } else if (typeof value === 'string') { - style['line-height'] = unit(value); + style['lineHeight'] = unit(value); } }, - opacity: mapRawPropTo('opacity'), - textAlign: mapRawPropTo('text-align'), - verticalAlign: mapRawPropTo('vertical-align'), - // Boolean props - inline: mapBooleanPropTo('display', 'inline-block'), - bold: mapBooleanPropTo('font-weight', 'bold'), - italic: mapBooleanPropTo('font-style', 'italic'), - nowrap: mapBooleanPropTo('white-space', 'nowrap'), - preserveWhitespace: mapBooleanPropTo('white-space', 'pre-wrap'), - // Margins + // Margin m: mapDirectionalUnitPropTo('margin', halfUnit, [ - 'top', - 'bottom', - 'left', - 'right', + 'Top', + 'Bottom', + 'Left', + 'Right', ]), - mx: mapDirectionalUnitPropTo('margin', halfUnit, ['left', 'right']), - my: mapDirectionalUnitPropTo('margin', halfUnit, ['top', 'bottom']), - mt: mapUnitPropTo('margin-top', halfUnit), - mb: mapUnitPropTo('margin-bottom', halfUnit), - ml: mapUnitPropTo('margin-left', halfUnit), - mr: mapUnitPropTo('margin-right', halfUnit), - // Margins + mb: mapUnitPropTo('marginBottom', halfUnit), + ml: mapUnitPropTo('marginLeft', halfUnit), + mr: mapUnitPropTo('marginRight', halfUnit), + mt: mapUnitPropTo('marginTop', halfUnit), + mx: mapDirectionalUnitPropTo('margin', halfUnit, ['Left', 'Right']), + my: mapDirectionalUnitPropTo('margin', halfUnit, ['Top', 'Bottom']), + // Padding p: mapDirectionalUnitPropTo('padding', halfUnit, [ - 'top', - 'bottom', - 'left', - 'right', + 'Top', + 'Bottom', + 'Left', + 'Right', ]), - px: mapDirectionalUnitPropTo('padding', halfUnit, ['left', 'right']), - py: mapDirectionalUnitPropTo('padding', halfUnit, ['top', 'bottom']), - pt: mapUnitPropTo('padding-top', halfUnit), - pb: mapUnitPropTo('padding-bottom', halfUnit), - pl: mapUnitPropTo('padding-left', halfUnit), - pr: mapUnitPropTo('padding-right', halfUnit), + pb: mapUnitPropTo('paddingBottom', halfUnit), + pl: mapUnitPropTo('paddingLeft', halfUnit), + pr: mapUnitPropTo('paddingRight', halfUnit), + pt: mapUnitPropTo('paddingTop', halfUnit), + px: mapDirectionalUnitPropTo('padding', halfUnit, ['Left', 'Right']), + py: mapDirectionalUnitPropTo('padding', halfUnit, ['Top', 'Bottom']), // Color props color: mapColorPropTo('color'), textColor: mapColorPropTo('color'), - backgroundColor: mapColorPropTo('background-color'), - // Utility props + backgroundColor: mapColorPropTo('backgroundColor'), +} as const; + +// Boolean props +const booleanStyleMap = { + bold: mapBooleanPropTo('fontWeight', 'bold'), fillPositionedParent: (style, value) => { if (value) { style['position'] = 'absolute'; @@ -199,11 +192,16 @@ const styleMapperByPropName = { style['right'] = 0; } }, -}; + inline: mapBooleanPropTo('display', 'inline-block'), + italic: mapBooleanPropTo('fontStyle', 'italic'), + nowrap: mapBooleanPropTo('whiteSpace', 'nowrap'), + preserveWhitespace: mapBooleanPropTo('whiteSpace', 'pre-wrap'), +} as const; + +export const computeBoxProps = (props) => { + const computedProps: Record = {}; + const computedStyles: Record = {}; -export const computeBoxProps = (props: BoxProps) => { - const computedProps: HTMLAttributes = {}; - const computedStyles = {}; // Compute props for (let propName of Object.keys(props)) { if (propName === 'style') { @@ -211,28 +209,20 @@ export const computeBoxProps = (props: BoxProps) => { } const propValue = props[propName]; - const mapPropToStyle = styleMapperByPropName[propName]; + + const mapPropToStyle = + stringStyleMap[propName] || booleanStyleMap[propName]; + if (mapPropToStyle) { mapPropToStyle(computedStyles, propValue); } else { computedProps[propName] = propValue; } } - // Concatenate styles - let style = ''; - for (let attrName of Object.keys(computedStyles)) { - const attrValue = computedStyles[attrName]; - style += attrName + ':' + attrValue + ';'; - } - if (props.style) { - for (let attrName of Object.keys(props.style)) { - const attrValue = props.style[attrName]; - style += attrName + ':' + attrValue + ';'; - } - } - if (style.length > 0) { - computedProps.style = style; - } + + // Merge computed styles and any directly provided styles + computedProps.style = { ...computedStyles, ...props.style }; + return computedProps; }; @@ -245,27 +235,28 @@ export const computeBoxClassName = (props: BoxProps) => { ]); }; -export const Box: SFC = (props: BoxProps) => { +export const Box = (props: BoxProps & DangerDoNotUse) => { const { as = 'div', className, children, ...rest } = props; - // Render props - if (typeof children === 'function') { - return children(computeBoxProps(props)); - } - const computedClassName = - typeof className === 'string' - ? className + ' ' + computeBoxClassName(rest) - : computeBoxClassName(rest); + + // Compute class name and styles + const computedClassName = className + ? `${className} ${computeBoxClassName(rest)}` + : computeBoxClassName(rest); const computedProps = computeBoxProps(rest); - // Render a wrapper element - return createVNode( - VNodeFlags.HtmlElement, - as, - computedClassName, + + if (as === 'img') { + logger.error( + 'Box component cannot be used as an image. Use Image component instead.', + ); + } + + // Render the component + return createElement( + typeof as === 'string' ? as : 'div', + { + ...computedProps, + className: computedClassName, + }, children, - ChildFlags.UnknownChildren, - computedProps, - undefined, ); }; - -Box.defaultHooks = pureComponentHooks; diff --git a/tgui/packages/tgui/components/Button.jsx b/tgui/packages/tgui/components/Button.jsx index 6142e5c567cb..ecf74129e2cc 100644 --- a/tgui/packages/tgui/components/Button.jsx +++ b/tgui/packages/tgui/components/Button.jsx @@ -5,8 +5,8 @@ */ import { KEY_ENTER, KEY_ESCAPE, KEY_SPACE } from 'common/keycodes'; -import { classes, pureComponentHooks } from 'common/react'; -import { Component, createRef } from 'inferno'; +import { classes } from 'common/react'; +import { Component, createRef } from 'react'; import { createLogger } from '../logging'; import { Box, computeBoxClassName, computeBoxProps } from './Box'; import { Icon } from './Icon'; @@ -39,15 +39,7 @@ export const Button = (props) => { ...rest } = props; const hasContent = !!(content || children); - // A warning about the lowercase onclick - if (onclick) { - logger.warn( - `Lowercase 'onclick' is not supported on Button and lowercase` + - ` prop names are discouraged in general. Please use a camelCase` + - `'onClick' instead and read: ` + - `https://infernojs.org/docs/guides/event-handling`, - ); - } + rest.onClick = (e) => { if (!disabled && onClick) { onClick(e); @@ -132,8 +124,6 @@ export const Button = (props) => { return buttonContent; }; -Button.defaultHooks = pureComponentHooks; - export const ButtonCheckbox = (props) => { const { checked, ...rest } = props; return ( @@ -149,8 +139,8 @@ export const ButtonCheckbox = (props) => { Button.Checkbox = ButtonCheckbox; export class ButtonConfirm extends Component { - constructor() { - super(); + constructor(props) { + super(props); this.state = { clickedOnce: false, }; @@ -200,8 +190,8 @@ export class ButtonConfirm extends Component { Button.Confirm = ButtonConfirm; export class ButtonInput extends Component { - constructor() { - super(); + constructor(props) { + super(props); this.inputRef = createRef(); this.state = { inInput: false, @@ -272,7 +262,7 @@ export class ButtonInput extends Component { className="NumberInput__input" style={{ display: !this.state.inInput ? 'none' : undefined, - 'text-align': 'left', + textAlign: 'left', }} onBlur={(e) => { if (!this.state.inInput) { diff --git a/tgui/packages/tgui/components/ByondUi.jsx b/tgui/packages/tgui/components/ByondUi.jsx index a0ad921802f2..2e751645e57d 100644 --- a/tgui/packages/tgui/components/ByondUi.jsx +++ b/tgui/packages/tgui/components/ByondUi.jsx @@ -6,7 +6,7 @@ import { shallowDiffers } from 'common/react'; import { debounce } from 'common/timer'; -import { Component, createRef } from 'inferno'; +import { Component, createRef } from 'react'; import { createLogger } from '../logging'; import { computeBoxProps } from './Box'; @@ -115,7 +115,7 @@ export class ByondUi extends Component { return (
{/* Filler */} -
+
); } diff --git a/tgui/packages/tgui/components/Chart.jsx b/tgui/packages/tgui/components/Chart.jsx index 6bfa1445e084..1e856135c659 100644 --- a/tgui/packages/tgui/components/Chart.jsx +++ b/tgui/packages/tgui/components/Chart.jsx @@ -5,8 +5,7 @@ */ import { map, zipWith } from 'common/collections'; -import { pureComponentHooks } from 'common/react'; -import { Component, createRef } from 'inferno'; +import { Component, createRef } from 'react'; import { Box } from './Box'; const normalizeData = (data, scale, rangeX, rangeY) => { @@ -50,6 +49,7 @@ class LineChart extends Component { }; this.handleResize = () => { const element = this.ref.current; + if (!element) return; this.setState({ viewBox: [element.offsetWidth, element.offsetHeight], }); @@ -118,8 +118,6 @@ class LineChart extends Component { } } -LineChart.defaultHooks = pureComponentHooks; - export const Chart = { Line: LineChart, }; diff --git a/tgui/packages/tgui/components/Collapsible.jsx b/tgui/packages/tgui/components/Collapsible.jsx index 7d59a11417cc..9fda360b0aa0 100644 --- a/tgui/packages/tgui/components/Collapsible.jsx +++ b/tgui/packages/tgui/components/Collapsible.jsx @@ -4,7 +4,7 @@ * @license MIT */ -import { Component } from 'inferno'; +import { Component } from 'react'; import { Box } from './Box'; import { Button } from './Button'; diff --git a/tgui/packages/tgui/components/ColorBox.jsx b/tgui/packages/tgui/components/ColorBox.jsx index b78b216b5000..045fae311a9d 100644 --- a/tgui/packages/tgui/components/ColorBox.jsx +++ b/tgui/packages/tgui/components/ColorBox.jsx @@ -4,7 +4,7 @@ * @license MIT */ -import { classes, pureComponentHooks } from 'common/react'; +import { classes } from 'common/react'; import { computeBoxClassName, computeBoxProps } from './Box'; export const ColorBox = (props) => { @@ -21,5 +21,3 @@ export const ColorBox = (props) => {
); }; - -ColorBox.defaultHooks = pureComponentHooks; diff --git a/tgui/packages/tgui/components/DMIcon.tsx b/tgui/packages/tgui/components/DMIcon.tsx index 1e07bb530609..c3471beb0d4e 100644 --- a/tgui/packages/tgui/components/DMIcon.tsx +++ b/tgui/packages/tgui/components/DMIcon.tsx @@ -1,4 +1,4 @@ -import { Component, InfernoNode } from 'inferno'; +import { Component, ReactNode } from 'react'; import { logger } from '../logging'; import { resolveAsset } from '../assets'; @@ -26,7 +26,7 @@ type Props = { /** Facing direction. See direction enum. Default is South */ direction: Direction; /** Fallback icon. */ - fallback: InfernoNode; + fallback: ReactNode; /** Frame number. Default is 1 */ frame: number; /** Movement state. Default is false */ @@ -45,6 +45,10 @@ export class DmIcon extends Component { iconRef: '', }; + constructor(props) { + super(props); + } + componentDidMount() { this.fetchRefMap(); } diff --git a/tgui/packages/tgui/components/DraggableControl.jsx b/tgui/packages/tgui/components/DraggableControl.jsx index 691a9b78cae1..c02c73444f26 100644 --- a/tgui/packages/tgui/components/DraggableControl.jsx +++ b/tgui/packages/tgui/components/DraggableControl.jsx @@ -5,8 +5,7 @@ */ import { clamp } from 'common/math'; -import { pureComponentHooks } from 'common/react'; -import { Component, createRef } from 'inferno'; +import { Component, createRef } from 'react'; import { AnimatedNumber } from './AnimatedNumber'; const DEFAULT_UPDATE_RATE = 400; @@ -189,8 +188,8 @@ export class DraggableControl extends Component { style={{ display: !editing ? 'none' : undefined, height: height, - 'line-height': lineHeight, - 'font-size': fontSize, + lineHeight: lineHeight, + fontSize: fontSize, }} onBlur={(e) => { if (!editing) { @@ -269,7 +268,6 @@ export class DraggableControl extends Component { } } -DraggableControl.defaultHooks = pureComponentHooks; DraggableControl.defaultProps = { minValue: -Infinity, maxValue: +Infinity, diff --git a/tgui/packages/tgui/components/Dropdown.jsx b/tgui/packages/tgui/components/Dropdown.jsx index a9ca84b48498..1bfe83568d9d 100644 --- a/tgui/packages/tgui/components/Dropdown.jsx +++ b/tgui/packages/tgui/components/Dropdown.jsx @@ -5,7 +5,7 @@ */ import { classes } from 'common/react'; -import { Component } from 'inferno'; +import { Component } from 'react'; import { Box } from './Box'; import { Icon } from './Icon'; @@ -31,7 +31,7 @@ export class Dropdown extends Component { this.setState({ open: open }); if (open) { setTimeout(() => window.addEventListener('click', this.handleClick)); - this.menuRef.focus(); + this.menuRef?.focus(); } else { window.removeEventListener('click', this.handleClick); } diff --git a/tgui/packages/tgui/components/FitText.tsx b/tgui/packages/tgui/components/FitText.tsx index 707002e46aa9..1d70096ac136 100644 --- a/tgui/packages/tgui/components/FitText.tsx +++ b/tgui/packages/tgui/components/FitText.tsx @@ -1,4 +1,10 @@ -import { Component, createRef, RefObject } from 'inferno'; +import { + Component, + createRef, + HTMLAttributes, + ReactNode, + RefObject, +} from 'react'; const DEFAULT_ACCEPTABLE_DIFFERENCE = 5; @@ -8,6 +14,7 @@ export class FitText extends Component< maxWidth: number; maxFontSize: number; native?: HTMLAttributes; + children: ReactNode; }, { fontSize: number; @@ -18,8 +25,8 @@ export class FitText extends Component< fontSize: 0, }; - constructor() { - super(); + constructor(props) { + super(props); this.resize = this.resize.bind(this); @@ -79,7 +86,7 @@ export class FitText extends Component< { @@ -28,10 +29,10 @@ export const computeFlexProps = (props: FlexProps) => { return computeBoxProps({ style: { ...rest.style, - 'flex-direction': direction, - 'flex-wrap': wrap === true ? 'wrap' : wrap, - 'align-items': align, - 'justify-content': justify, + flexDirection: direction, + flexWrap: wrap === true ? 'wrap' : wrap, + alignItems: align, + justifyContent: justify, }, ...rest, }); @@ -47,12 +48,10 @@ export const Flex = (props) => { ); }; -Flex.defaultHooks = pureComponentHooks; - export type FlexItemProps = BoxProps & { - grow?: number; + grow?: number | true; order?: number; - shrink?: number; + shrink?: number | true; basis?: string | BooleanLike; align?: string | BooleanLike; }; @@ -75,11 +74,11 @@ export const computeFlexItemProps = (props: FlexItemProps) => { return computeBoxProps({ style: { ...style, - 'flex-grow': grow !== undefined && Number(grow), - 'flex-shrink': shrink !== undefined && Number(shrink), - 'flex-basis': unit(computedBasis), + flexGrow: grow !== undefined && Number(grow), + flexShrink: shrink !== undefined && Number(shrink), + flexBasis: unit(computedBasis), order: order, - 'align-self': align, + alignSelf: align, }, ...rest, }); @@ -95,6 +94,4 @@ const FlexItem = (props) => { ); }; -FlexItem.defaultHooks = pureComponentHooks; - Flex.Item = FlexItem; diff --git a/tgui/packages/tgui/components/Grid.jsx b/tgui/packages/tgui/components/Grid.jsx index 7ad3fd1dfdbf..f5593c9e00a5 100644 --- a/tgui/packages/tgui/components/Grid.jsx +++ b/tgui/packages/tgui/components/Grid.jsx @@ -5,7 +5,6 @@ */ import { Table } from './Table'; -import { pureComponentHooks } from 'common/react'; /** @deprecated */ export const Grid = (props) => { @@ -17,8 +16,6 @@ export const Grid = (props) => { ); }; -Grid.defaultHooks = pureComponentHooks; - /** @deprecated */ export const GridColumn = (props) => { const { size = 1, style, ...rest } = props; @@ -33,6 +30,4 @@ export const GridColumn = (props) => { ); }; -Grid.defaultHooks = pureComponentHooks; - Grid.Column = GridColumn; diff --git a/tgui/packages/tgui/components/Icon.jsx b/tgui/packages/tgui/components/Icon.jsx index 482f323b7c5c..2798615c332c 100644 --- a/tgui/packages/tgui/components/Icon.jsx +++ b/tgui/packages/tgui/components/Icon.jsx @@ -6,7 +6,7 @@ * @license MIT */ -import { classes, pureComponentHooks } from 'common/react'; +import { classes } from 'common/react'; import { computeBoxClassName, computeBoxProps } from './Box'; const FA_OUTLINE_REGEX = /-o$/; @@ -18,7 +18,7 @@ export const Icon = (props) => { if (!rest.style) { rest.style = {}; } - rest.style['font-size'] = size * 100 + '%'; + rest.style['fontSize'] = size * 100 + '%'; } if (typeof rotation === 'number') { if (!rest.style) { @@ -53,8 +53,6 @@ export const Icon = (props) => { ); }; -Icon.defaultHooks = pureComponentHooks; - export const IconStack = (props) => { const { className, children, ...rest } = props; return ( diff --git a/tgui/packages/tgui/components/Image.tsx b/tgui/packages/tgui/components/Image.tsx index 493195ab8a9e..0900f3f63dab 100644 --- a/tgui/packages/tgui/components/Image.tsx +++ b/tgui/packages/tgui/components/Image.tsx @@ -1,4 +1,4 @@ -import { Component } from 'inferno'; +import { Component } from 'react'; import { BoxProps, computeBoxProps } from './Box'; @@ -52,7 +52,7 @@ export class Image extends Component { return ( { + onError={(event) => { if (fixErrors && this.attempts < maxAttempts) { const imgElement = event.currentTarget; diff --git a/tgui/packages/tgui/components/InfinitePlane.jsx b/tgui/packages/tgui/components/InfinitePlane.jsx index ad87d01ffe33..3f2bf598c234 100644 --- a/tgui/packages/tgui/components/InfinitePlane.jsx +++ b/tgui/packages/tgui/components/InfinitePlane.jsx @@ -2,7 +2,7 @@ import { computeBoxProps } from './Box'; import { Stack } from './Stack'; import { ProgressBar } from './ProgressBar'; import { Button } from './Button'; -import { Component } from 'inferno'; +import { Component } from 'react'; const ZOOM_MIN_VAL = 0.5; const ZOOM_MAX_VAL = 1.5; @@ -10,8 +10,8 @@ const ZOOM_MAX_VAL = 1.5; const ZOOM_INCREMENT = 0.1; export class InfinitePlane extends Component { - constructor() { - super(); + constructor(props) { + super(props); this.state = { mouseDown: false, @@ -148,10 +148,10 @@ export class InfinitePlane extends Component { position: 'fixed', height: '100%', width: '100%', - 'background-image': `url("${backgroundImage}")`, - 'background-position': `${finalLeft}px ${finalTop}px`, - 'background-repeat': 'repeat', - 'background-size': `${zoom * imageWidth}px`, + backgroundImage: `url("${backgroundImage}")`, + backgroundPosition: `${finalLeft}px ${finalTop}px`, + backgroundRepeat: 'repeat', + backgroundSize: `${zoom * imageWidth}px`, }} />
typeof value !== 'number' && typeof value !== 'string' ? '' : String(value); export class Input extends Component { - constructor() { - super(); + constructor(props) { + super(props); this.inputRef = createRef(); this.state = { editing: false, diff --git a/tgui/packages/tgui/components/KeyListener.tsx b/tgui/packages/tgui/components/KeyListener.tsx index 62509cae96d6..d401642a3cff 100644 --- a/tgui/packages/tgui/components/KeyListener.tsx +++ b/tgui/packages/tgui/components/KeyListener.tsx @@ -1,4 +1,4 @@ -import { Component } from 'inferno'; +import { Component } from 'react'; import { KeyEvent } from '../events'; import { listenForKeyEvents } from '../hotkeys'; @@ -11,8 +11,8 @@ type KeyListenerProps = Partial<{ export class KeyListener extends Component { dispose: () => void; - constructor() { - super(); + constructor(props) { + super(props); this.dispose = listenForKeyEvents((key) => { if (this.props.onKey) { diff --git a/tgui/packages/tgui/components/Knob.jsx b/tgui/packages/tgui/components/Knob.jsx index 60370e141910..5702c16129a1 100644 --- a/tgui/packages/tgui/components/Knob.jsx +++ b/tgui/packages/tgui/components/Knob.jsx @@ -83,7 +83,7 @@ export const Knob = (props) => { ])} {...computeBoxProps({ style: { - 'font-size': size + 'em', + fontSize: size + 'em', ...style, }, ...rest, @@ -116,7 +116,7 @@ export const Knob = (props) => { { return {children}
; }; -LabeledList.defaultHooks = pureComponentHooks; - type LabeledListItemProps = { className?: string | BooleanLike; - label?: string | InfernoNode | BooleanLike; + label?: string | ReactNode | BooleanLike; labelColor?: string | BooleanLike; color?: string | BooleanLike; textAlign?: string | BooleanLike; - buttons?: InfernoNode; + buttons?: ReactNode; /** @deprecated */ content?: any; - children?: InfernoNode; + children?: ReactNode; verticalAlign?: string; }; @@ -60,6 +58,7 @@ const LabeledListItem = (props: LabeledListItemProps) => { color={color} textAlign={textAlign} className={classes(['LabeledList__cell', 'LabeledList__content'])} + // @ts-ignore colSpan={buttons ? undefined : 2} verticalAlign={verticalAlign} > @@ -73,8 +72,6 @@ const LabeledListItem = (props: LabeledListItemProps) => { ); }; -LabeledListItem.defaultHooks = pureComponentHooks; - type LabeledListDividerProps = { size?: number; }; @@ -86,8 +83,8 @@ const LabeledListDivider = (props: LabeledListDividerProps) => {
@@ -96,7 +93,5 @@ const LabeledListDivider = (props: LabeledListDividerProps) => { ); }; -LabeledListDivider.defaultHooks = pureComponentHooks; - LabeledList.Item = LabeledListItem; LabeledList.Divider = LabeledListDivider; diff --git a/tgui/packages/tgui/components/NoticeBox.jsx b/tgui/packages/tgui/components/NoticeBox.jsx index 1c3b49b16a53..09e205b46bef 100644 --- a/tgui/packages/tgui/components/NoticeBox.jsx +++ b/tgui/packages/tgui/components/NoticeBox.jsx @@ -4,7 +4,7 @@ * @license MIT */ -import { classes, pureComponentHooks } from 'common/react'; +import { classes } from 'common/react'; import { Box } from './Box'; export const NoticeBox = (props) => { @@ -23,5 +23,3 @@ export const NoticeBox = (props) => { /> ); }; - -NoticeBox.defaultHooks = pureComponentHooks; diff --git a/tgui/packages/tgui/components/NumberInput.jsx b/tgui/packages/tgui/components/NumberInput.jsx index 331764c476f6..20b50c733ec2 100644 --- a/tgui/packages/tgui/components/NumberInput.jsx +++ b/tgui/packages/tgui/components/NumberInput.jsx @@ -5,8 +5,8 @@ */ import { clamp } from 'common/math'; -import { classes, pureComponentHooks } from 'common/react'; -import { Component, createRef } from 'inferno'; +import { classes } from 'common/react'; +import { Component, createRef } from 'react'; import { AnimatedNumber } from './AnimatedNumber'; import { Box } from './Box'; @@ -209,8 +209,8 @@ export class NumberInput extends Component { style={{ display: !editing ? 'none' : undefined, height: height, - 'line-height': lineHeight, - 'font-size': fontSize, + lineHeight: lineHeight, + fontSize: fontSize, }} onBlur={(e) => { if (!editing) { @@ -274,7 +274,6 @@ export class NumberInput extends Component { } } -NumberInput.defaultHooks = pureComponentHooks; NumberInput.defaultProps = { minValue: -Infinity, maxValue: +Infinity, diff --git a/tgui/packages/tgui/components/Popper.tsx b/tgui/packages/tgui/components/Popper.tsx index 95a0c9490a43..a11905b3cccc 100644 --- a/tgui/packages/tgui/components/Popper.tsx +++ b/tgui/packages/tgui/components/Popper.tsx @@ -1,12 +1,20 @@ import { createPopper } from '@popperjs/core'; import { ArgumentsOf } from 'common/types'; -import { Component, findDOMfromVNode, InfernoNode, render } from 'inferno'; +import { + Component, + CSSProperties, + JSXElementConstructor, + PropsWithChildren, + ReactElement, +} from 'react'; +// eslint-disable-next-line react/no-deprecated +import { findDOMNode, render } from 'react-dom'; type PopperProps = { - popperContent: InfernoNode; + popperContent: ReactElement> | false; options?: ArgumentsOf[2]; additionalStyles?: CSSProperties; -}; +} & PropsWithChildren; export class Popper extends Component { static id: number = 0; @@ -14,8 +22,8 @@ export class Popper extends Component { renderedContent: HTMLDivElement; popperInstance: ReturnType; - constructor() { - super(); + constructor(props) { + super(props); Popper.id += 1; } @@ -35,15 +43,16 @@ export class Popper extends Component { document.body.appendChild(this.renderedContent); // HACK: We don't want to create a wrapper, as it could break the layout - // of consumers, so we do the inferno equivalent of `findDOMNode(this)`. + // of consumers, so we use findDOMNode. // This is usually bad as refs are usually better, but refs did // not work in this case, as they weren't propagating correctly. // A previous attempt was made as a render prop that passed an ID, // but this made consuming use too unwieldly. - // This code is copied from `findDOMNode` in inferno-extras. // Because this component is written in TypeScript, we will know // immediately if this internal variable is removed. - const domNode = findDOMfromVNode(this.$LI, true); + // + // eslint-disable-next-line react/no-find-dom-node + const domNode = findDOMNode(this) as Element; if (!domNode) { return; } @@ -62,7 +71,7 @@ export class Popper extends Component { componentWillUnmount() { this.popperInstance?.destroy(); - render(null, this.renderedContent, () => { + render(<> , this.renderedContent, () => { this.renderedContent.remove(); }); } @@ -70,7 +79,7 @@ export class Popper extends Component { renderPopperContent(callback: () => void) { // `render` errors when given false, so we convert it to `null`, // which is supported. - render(this.props.popperContent || null, this.renderedContent, callback); + render(this.props.popperContent || <> , this.renderedContent, callback); } render() { diff --git a/tgui/packages/tgui/components/ProgressBar.jsx b/tgui/packages/tgui/components/ProgressBar.jsx index affa05d84d8c..a2cbd596cd14 100644 --- a/tgui/packages/tgui/components/ProgressBar.jsx +++ b/tgui/packages/tgui/components/ProgressBar.jsx @@ -5,7 +5,7 @@ */ import { clamp01, scale, keyOfMatchingRange, toFixed } from 'common/math'; -import { classes, pureComponentHooks } from 'common/react'; +import { classes } from 'common/react'; import { computeBoxClassName, computeBoxProps } from './Box'; import { CSS_COLORS } from '../constants'; @@ -38,8 +38,8 @@ export const ProgressBar = (props) => { } else { // Otherwise, set styles directly. outerProps.style = - (outerProps.style || '') + `border-color: ${effectiveColor};`; - fillStyles['background-color'] = effectiveColor; + (outerProps.style || '') + `borderClor: ${effectiveColor};`; + fillStyles['backgroundColor'] = effectiveColor; } return ( @@ -54,5 +54,3 @@ export const ProgressBar = (props) => { ); }; - -ProgressBar.defaultHooks = pureComponentHooks; diff --git a/tgui/packages/tgui/components/RestrictedInput.jsx b/tgui/packages/tgui/components/RestrictedInput.jsx index d6f17d16b3a3..a53471e1e549 100644 --- a/tgui/packages/tgui/components/RestrictedInput.jsx +++ b/tgui/packages/tgui/components/RestrictedInput.jsx @@ -1,6 +1,6 @@ import { classes } from 'common/react'; import { clamp } from 'common/math'; -import { Component, createRef } from 'inferno'; +import { Component, createRef } from 'react'; import { Box } from './Box'; import { KEY_ESCAPE, KEY_ENTER } from 'common/keycodes'; @@ -27,8 +27,8 @@ const getClampedNumber = (value, minValue, maxValue) => { }; export class RestrictedInput extends Component { - constructor() { - super(); + constructor(props) { + super(props); this.inputRef = createRef(); this.state = { editing: false, diff --git a/tgui/packages/tgui/components/RoundGauge.jsx b/tgui/packages/tgui/components/RoundGauge.jsx index 1c6b1b0ed9f8..92de363f060d 100644 --- a/tgui/packages/tgui/components/RoundGauge.jsx +++ b/tgui/packages/tgui/components/RoundGauge.jsx @@ -67,7 +67,7 @@ export const RoundGauge = (props) => { ])} {...computeBoxProps({ style: { - 'font-size': size + 'em', + fontSize: size + 'em', ...style, }, ...rest, @@ -95,7 +95,7 @@ export const RoundGauge = (props) => { className={`RoundGauge__ringFill RoundGauge--color--${x}`} key={i} style={{ - 'stroke-dashoffset': Math.max( + strokeDashoffset: Math.max( (2.0 - (col_ranges[1] - col_ranges[0])) * Math.PI * 50, 0, ), diff --git a/tgui/packages/tgui/components/Section.tsx b/tgui/packages/tgui/components/Section.tsx index c2a670b447e0..707a745088f7 100644 --- a/tgui/packages/tgui/components/Section.tsx +++ b/tgui/packages/tgui/components/Section.tsx @@ -5,14 +5,14 @@ */ import { canRender, classes } from 'common/react'; -import { Component, createRef, InfernoNode, RefObject } from 'inferno'; +import { Component, createRef, ReactNode, RefObject } from 'react'; import { addScrollableNode, removeScrollableNode } from '../events'; import { BoxProps, computeBoxClassName, computeBoxProps } from './Box'; interface SectionProps extends BoxProps { className?: string; - title?: InfernoNode; - buttons?: InfernoNode; + title?: ReactNode; + buttons?: ReactNode; fill?: boolean; fitted?: boolean; scrollable?: boolean; diff --git a/tgui/packages/tgui/components/Stack.tsx b/tgui/packages/tgui/components/Stack.tsx index 49b8a1539b5d..74e1bf8309cb 100644 --- a/tgui/packages/tgui/components/Stack.tsx +++ b/tgui/packages/tgui/components/Stack.tsx @@ -5,7 +5,7 @@ */ import { classes } from 'common/react'; -import { RefObject } from 'inferno'; +import { RefObject } from 'react'; import { computeFlexClassName, computeFlexItemClassName, @@ -18,6 +18,7 @@ import { type StackProps = FlexProps & { vertical?: boolean; fill?: boolean; + zebra?: boolean; }; export const Stack = (props: StackProps) => { @@ -40,7 +41,7 @@ export const Stack = (props: StackProps) => { ); }; -type StackItemProps = FlexProps & { +type StackItemProps = FlexItemProps & { innerRef?: RefObject; }; diff --git a/tgui/packages/tgui/components/Table.jsx b/tgui/packages/tgui/components/Table.jsx index aae47df427c3..f9a59b36c7ff 100644 --- a/tgui/packages/tgui/components/Table.jsx +++ b/tgui/packages/tgui/components/Table.jsx @@ -4,7 +4,7 @@ * @license MIT */ -import { classes, pureComponentHooks } from 'common/react'; +import { classes } from 'common/react'; import { computeBoxClassName, computeBoxProps } from './Box'; export const Table = (props) => { @@ -24,8 +24,6 @@ export const Table = (props) => { ); }; -Table.defaultHooks = pureComponentHooks; - export const TableRow = (props) => { const { className, header, ...rest } = props; return ( @@ -41,8 +39,6 @@ export const TableRow = (props) => { ); }; -TableRow.defaultHooks = pureComponentHooks; - export const TableCell = (props) => { const { className, collapsing, header, ...rest } = props; return ( @@ -59,7 +55,5 @@ export const TableCell = (props) => { ); }; -TableCell.defaultHooks = pureComponentHooks; - Table.Row = TableRow; Table.Cell = TableCell; diff --git a/tgui/packages/tgui/components/TextArea.jsx b/tgui/packages/tgui/components/TextArea.jsx index b516e0517f16..d24a2e4ce5b4 100644 --- a/tgui/packages/tgui/components/TextArea.jsx +++ b/tgui/packages/tgui/components/TextArea.jsx @@ -6,7 +6,7 @@ */ import { classes } from 'common/react'; -import { Component, createRef } from 'inferno'; +import { Component, createRef } from 'react'; import { Box } from './Box'; import { toInputValue } from './Input'; import { KEY_ESCAPE } from 'common/keycodes'; diff --git a/tgui/packages/tgui/components/TimeDisplay.jsx b/tgui/packages/tgui/components/TimeDisplay.jsx index 6b87ee5260ac..bbdd747701cc 100644 --- a/tgui/packages/tgui/components/TimeDisplay.jsx +++ b/tgui/packages/tgui/components/TimeDisplay.jsx @@ -1,5 +1,5 @@ import { formatTime } from '../format'; -import { Component } from 'inferno'; +import { Component } from 'react'; // AnimatedNumber Copypaste const isSafeNumber = (value) => { diff --git a/tgui/packages/tgui/components/Tooltip.tsx b/tgui/packages/tgui/components/Tooltip.tsx index 2d8d10a26633..0ab3e8fca93e 100644 --- a/tgui/packages/tgui/components/Tooltip.tsx +++ b/tgui/packages/tgui/components/Tooltip.tsx @@ -1,9 +1,11 @@ import { createPopper, Placement, VirtualElement } from '@popperjs/core'; -import { Component, findDOMfromVNode, InfernoNode, render } from 'inferno'; +import { ReactNode, Component } from 'react'; +// eslint-disable-next-line react/no-deprecated +import { findDOMNode, render } from 'react-dom'; type TooltipProps = { - children?: InfernoNode; - content: InfernoNode; + children?: ReactNode; + content: ReactNode; position?: Placement; }; @@ -20,13 +22,16 @@ const DEFAULT_OPTIONS = { ], }; -const NULL_RECT = { +const NULL_RECT: DOMRect = { width: 0, height: 0, top: 0, right: 0, bottom: 0, left: 0, + x: 0, + y: 0, + toJSON: () => null, }; export class Tooltip extends Component { @@ -44,14 +49,15 @@ export class Tooltip extends Component { getDOMNode() { // HACK: We don't want to create a wrapper, as it could break the layout - // of consumers, so we do the inferno equivalent of `findDOMNode(this)`. + // of consumers, so we use findDOMNode. // My attempt to avoid this was a render prop that passed in // callbacks to onmouseenter and onmouseleave, but this was unwiedly // to consumers, specifically buttons. - // This code is copied from `findDOMNode` in inferno-extras. // Because this component is written in TypeScript, we will know // immediately if this internal variable is removed. - return findDOMfromVNode(this.$LI, true); + // + // eslint-disable-next-line react/no-find-dom-node + return findDOMNode(this) as Element; } componentDidMount() { diff --git a/tgui/packages/tgui/components/TrackOutsideClicks.tsx b/tgui/packages/tgui/components/TrackOutsideClicks.tsx index 7b3914ecb271..68665a3eb31d 100644 --- a/tgui/packages/tgui/components/TrackOutsideClicks.tsx +++ b/tgui/packages/tgui/components/TrackOutsideClicks.tsx @@ -1,12 +1,13 @@ -import { Component, createRef } from 'inferno'; +import { Component, createRef } from 'react'; export class TrackOutsideClicks extends Component<{ onOutsideClick: () => void; + children: React.ReactNode; }> { ref = createRef(); - constructor() { - super(); + constructor(props) { + super(props); this.handleOutsideClick = this.handleOutsideClick.bind(this); diff --git a/tgui/packages/tgui/index.jsx b/tgui/packages/tgui/index.jsx index 6686f2424acf..b6cc8a5db2b3 100644 --- a/tgui/packages/tgui/index.jsx +++ b/tgui/packages/tgui/index.jsx @@ -28,7 +28,7 @@ import { setupHotReloading } from 'tgui-dev-server/link/client.cjs'; import { setupHotKeys } from './hotkeys'; import { captureExternalLinks } from './links'; import { createRenderer } from './renderer'; -import { configureStore, StoreProvider } from './store'; +import { configureStore } from './store'; import { setupGlobalEvents } from './events'; import { setGlobalStore } from './backend'; @@ -42,11 +42,7 @@ const renderApp = createRenderer(() => { const { getRoutedComponent } = require('./routes'); const Component = getRoutedComponent(store); - return ( - - - - ); + return ; }); const setupApp = () => { diff --git a/tgui/packages/tgui/interfaces/Adminhelp.tsx b/tgui/packages/tgui/interfaces/Adminhelp.tsx index 597c8c535a0e..51ba58ffd75a 100644 --- a/tgui/packages/tgui/interfaces/Adminhelp.tsx +++ b/tgui/packages/tgui/interfaces/Adminhelp.tsx @@ -33,7 +33,7 @@ export const Adminhelp = (props) => { @@ -57,7 +57,7 @@ export const Adminhelp = (props) => { fontFamily="arial" backgroundColor="grey" style={{ - 'font-style': 'normal', + fontStyle: 'normal', }} > Input '{confirmationText}' to proceed. diff --git a/tgui/packages/tgui/interfaces/AirAlarm.jsx b/tgui/packages/tgui/interfaces/AirAlarm.jsx index 86d26f78213b..583e4fc1bd1b 100644 --- a/tgui/packages/tgui/interfaces/AirAlarm.jsx +++ b/tgui/packages/tgui/interfaces/AirAlarm.jsx @@ -1,5 +1,5 @@ import { toFixed } from 'common/math'; -import { Fragment } from 'inferno'; +import { Fragment } from 'react'; import { useBackend, useLocalState } from '../backend'; import { Box, diff --git a/tgui/packages/tgui/interfaces/AntagInfoChangeling.tsx b/tgui/packages/tgui/interfaces/AntagInfoChangeling.tsx index 0fc08ae3a122..6ee574bd4512 100644 --- a/tgui/packages/tgui/interfaces/AntagInfoChangeling.tsx +++ b/tgui/packages/tgui/interfaces/AntagInfoChangeling.tsx @@ -1,4 +1,3 @@ -import { multiline } from 'common/string'; import { useBackend, useSharedState } from '../backend'; import { Box, Button, Dimmer, Dropdown, Section, Stack } from '../components'; import { Window } from '../layouts'; @@ -157,7 +156,7 @@ const MemoriesSection = (props) => { @@ -1048,7 +1047,7 @@ const Bays = (props) => { } > - - + {decodeHtmlEntities(chosenPainting.title)} diff --git a/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/base.tsx b/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/base.tsx index 5e19656cbad9..a5bd303b3940 100644 --- a/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/base.tsx +++ b/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/base.tsx @@ -1,7 +1,6 @@ import { sortBy, sortStrings } from 'common/collections'; import { BooleanLike, classes } from 'common/react'; -import { ComponentType, createComponentVNode, InfernoNode } from 'inferno'; -import { VNodeFlags } from 'inferno-vnode-flags'; +import { ComponentType, createElement, ReactNode } from 'react'; import { sendAct, useBackend, useLocalState } from '../../../../backend'; import { Box, @@ -15,7 +14,7 @@ import { import { createSetPreference, PreferencesMenuData } from '../../data'; import { ServerPreferencesFetcher } from '../../ServerPreferencesFetcher'; -export const sortChoices = sortBy<[string, InfernoNode]>(([name]) => name); +export const sortChoices = sortBy<[string, ReactNode]>(([name]) => name); export type Feature< TReceiving, @@ -44,14 +43,14 @@ export type FeatureValueProps< TReceiving, TSending = TReceiving, TServerData = undefined, -> = { +> = Readonly<{ act: typeof sendAct; featureId: string; handleSetValue: (newValue: TSending) => void; serverData: TServerData | undefined; shrink?: boolean; value: TReceiving; -}; +}>; export const FeatureColorInput = (props: FeatureValueProps) => { return ( @@ -70,7 +69,7 @@ export const FeatureColorInput = (props: FeatureValueProps) => { ? props.value : `#${props.value}`, border: '2px solid white', - 'box-sizing': 'content-box', + boxSizing: 'content-box', height: '11px', width: '11px', ...(props.shrink @@ -118,7 +117,7 @@ export const CheckboxInputInverse = ( export const createDropdownInput = ( // Map of value to display texts - choices: Record, + choices: Record, dropdownProps?: Record, ): FeatureValue => { return (props: FeatureValueProps) => { @@ -156,7 +155,7 @@ const capitalizeFirstLetter = (text: string) => export const StandardizedDropdown = (props: { choices: string[]; disabled?: boolean; - displayNames: Record; + displayNames: Record; onSetValue: (newValue: string) => void; value: string; }) => { @@ -242,7 +241,7 @@ export const FeatureIconnedDropdownInput = ( const displayNames = Object.fromEntries( Object.entries(textNames).map(([choice, textName]) => { - let element: InfernoNode = textName; + let element: ReactNode = textName; if (icons && icons[choice]) { const icon = icons[choice]; @@ -329,19 +328,15 @@ export const FeatureValueInput = (props: { return ( { - return createComponentVNode( - VNodeFlags.ComponentUnknown, - feature.component, - { - act: props.act, - featureId: props.featureId, - serverData: serverData && serverData[props.featureId], - shrink: props.shrink, - - handleSetValue: changeValue, - value: predictedValue, - }, - ); + return createElement(feature.component, { + act: props.act, + featureId: props.featureId, + serverData: serverData?.[props.featureId] as any, + shrink: props.shrink, + + handleSetValue: changeValue, + value: predictedValue, + }); }} /> ); @@ -389,7 +384,7 @@ export const FeatureTriColorInput = (props: FeatureValueProps) => { ? props.value[index] : `#${props.value[index]}`, border: '2px solid white', - 'box-sizing': 'content-box', + boxSizing: 'content-box', height: '11px', width: '11px', ...(props.shrink diff --git a/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/game_preferences/broadcast_login_logout.tsx b/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/game_preferences/broadcast_login_logout.tsx index f8252412fc99..772e619bc573 100644 --- a/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/game_preferences/broadcast_login_logout.tsx +++ b/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/game_preferences/broadcast_login_logout.tsx @@ -1,10 +1,9 @@ -import { multiline } from 'common/string'; import { CheckboxInput, FeatureToggle } from '../base'; export const broadcast_login_logout: FeatureToggle = { name: 'Broadcast login/logout', category: 'GAMEPLAY', - description: multiline` + description: ` When enabled, disconnecting and reconnecting will announce to deadchat. `, component: CheckboxInput, diff --git a/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/game_preferences/darkened_flash.tsx b/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/game_preferences/darkened_flash.tsx index 0703c7ef04c0..3184b43a456b 100644 --- a/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/game_preferences/darkened_flash.tsx +++ b/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/game_preferences/darkened_flash.tsx @@ -1,10 +1,9 @@ -import { multiline } from 'common/string'; import { CheckboxInput, FeatureToggle } from '../base'; export const darkened_flash: FeatureToggle = { name: 'Enable darkened flashes', category: 'GAMEPLAY', - description: multiline` + description: ` When toggled, being flashed will show a dark screen rather than a bright one. `, diff --git a/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/game_preferences/ghost.tsx b/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/game_preferences/ghost.tsx index 3f1c0a865707..4a1fcaa92e17 100644 --- a/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/game_preferences/ghost.tsx +++ b/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/game_preferences/ghost.tsx @@ -1,4 +1,3 @@ -import { multiline } from 'common/string'; import { CheckboxInput, FeatureChoiced, @@ -20,7 +19,7 @@ export const ghost_hud: FeatureToggle = { export const ghost_orbit: FeatureChoiced = { name: 'Ghost orbit', category: 'GHOST', - description: multiline` + description: ` The shape in which your ghost will orbit. Requires BYOND membership. `, diff --git a/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/game_preferences/legacy_chat_toggles.tsx b/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/game_preferences/legacy_chat_toggles.tsx index 58b1a5b99146..ddd9be2ad777 100644 --- a/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/game_preferences/legacy_chat_toggles.tsx +++ b/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/game_preferences/legacy_chat_toggles.tsx @@ -1,4 +1,3 @@ -import { multiline } from 'common/string'; import { FeatureToggle, CheckboxInput } from '../base'; export const chat_bankcard: FeatureToggle = { @@ -17,7 +16,7 @@ export const chat_dead: FeatureToggle = { export const chat_ghostears: FeatureToggle = { name: 'Hear all messages', category: 'GHOST', - description: multiline` + description: ` When enabled, you will be able to hear all speech as a ghost. When disabled, you will only be able to hear nearby speech. `, @@ -55,7 +54,7 @@ export const chat_ghostsight: FeatureToggle = { export const chat_ghostwhisper: FeatureToggle = { name: 'See all whispers', category: 'GHOST', - description: multiline` + description: ` When enabled, you will be able to hear all whispers as a ghost. When disabled, you will only be able to hear nearby whispers. `, diff --git a/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/game_preferences/legacy_toggles.tsx b/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/game_preferences/legacy_toggles.tsx index 07156fe6b02f..4bde004fa20c 100644 --- a/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/game_preferences/legacy_toggles.tsx +++ b/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/game_preferences/legacy_toggles.tsx @@ -1,10 +1,9 @@ -import { multiline } from 'common/string'; import { FeatureToggle, CheckboxInput, CheckboxInputInverse } from '../base'; export const admin_ignore_cult_ghost: FeatureToggle = { name: 'Prevent being summoned as a cult ghost', category: 'ADMIN', - description: multiline` + description: ` When enabled and observing, prevents Spirit Realm from forcing you into a cult ghost. `, diff --git a/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/game_preferences/preferred_map.tsx b/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/game_preferences/preferred_map.tsx index 8d3c8b174269..23ab23bfaf66 100644 --- a/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/game_preferences/preferred_map.tsx +++ b/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/game_preferences/preferred_map.tsx @@ -1,10 +1,9 @@ -import { multiline } from 'common/string'; import { Feature, FeatureDropdownInput } from '../base'; export const preferred_map: Feature = { name: 'Preferred map', category: 'GAMEPLAY', - description: multiline` + description: ` During map rotation, prefer this map be chosen. This does not affect the map vote, only random rotation when a vote is not held. diff --git a/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/game_preferences/screentips.tsx b/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/game_preferences/screentips.tsx index a391e61855c5..60f8b1d11263 100644 --- a/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/game_preferences/screentips.tsx +++ b/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/game_preferences/screentips.tsx @@ -1,4 +1,3 @@ -import { multiline } from 'common/string'; import { FeatureColorInput, Feature, @@ -9,7 +8,7 @@ import { export const screentip_color: Feature = { name: 'Screentips color', category: 'UI', - description: multiline` + description: ` The color of screen tips, the text you see when hovering over something. `, component: FeatureColorInput, @@ -18,7 +17,7 @@ export const screentip_color: Feature = { export const screentip_pref: FeatureChoiced = { name: 'Enable screentips', category: 'UI', - description: multiline` + description: ` Enables screen tips, the text you see when hovering over something. When set to "Only with tips", will only show when there is more information than just the name, such as what right-clicking it does. diff --git a/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/game_preferences/tooltips.tsx b/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/game_preferences/tooltips.tsx index 34d668642599..edbdb25ef1cb 100644 --- a/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/game_preferences/tooltips.tsx +++ b/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/game_preferences/tooltips.tsx @@ -1,4 +1,3 @@ -import { multiline } from 'common/string'; import { CheckboxInput, Feature, @@ -9,7 +8,7 @@ import { export const enable_tips: FeatureToggle = { name: 'Enable tooltips', category: 'TOOLTIPS', - description: multiline` + description: ` Do you want to see tooltips when hovering over items? `, component: CheckboxInput, @@ -18,7 +17,7 @@ export const enable_tips: FeatureToggle = { export const tip_delay: Feature = { name: 'Tooltip delay (in milliseconds)', category: 'TOOLTIPS', - description: multiline` + description: ` How long should it take to see a tooltip when hovering over items? `, component: FeatureNumberInput, diff --git a/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/game_preferences/window_flashing.tsx b/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/game_preferences/window_flashing.tsx index c4b7b6c2768d..d8b0ce0b4ae6 100644 --- a/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/game_preferences/window_flashing.tsx +++ b/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/game_preferences/window_flashing.tsx @@ -1,10 +1,9 @@ -import { multiline } from 'common/string'; import { CheckboxInput, FeatureToggle } from '../base'; export const windowflashing: FeatureToggle = { name: 'Enable window flashing', category: 'UI', - description: multiline` + description: ` When toggled, some important events will make your game icon flash on your task tray. `, diff --git a/tgui/packages/tgui/interfaces/ProcCallMenu.tsx b/tgui/packages/tgui/interfaces/ProcCallMenu.tsx index b3414cd942f0..bb8ec931e521 100644 --- a/tgui/packages/tgui/interfaces/ProcCallMenu.tsx +++ b/tgui/packages/tgui/interfaces/ProcCallMenu.tsx @@ -36,7 +36,7 @@ export const ProcCallMenu = (props) => { return ( - +
diff --git a/tgui/packages/tgui/interfaces/ProduceConsole.jsx b/tgui/packages/tgui/interfaces/ProduceConsole.jsx index 22953df64d1e..c658c561cea6 100644 --- a/tgui/packages/tgui/interfaces/ProduceConsole.jsx +++ b/tgui/packages/tgui/interfaces/ProduceConsole.jsx @@ -1,4 +1,3 @@ -import { multiline } from 'common/string'; import { useBackend, useLocalState } from '../backend'; import { Box, @@ -170,7 +169,7 @@ const CheckoutTab = (props) => { fluid icon="plane-departure" content="Purchase" - tooltip={multiline` + tooltip={` Your groceries will arrive at cargo, and hopefully get delivered by them. `} @@ -184,7 +183,7 @@ const CheckoutTab = (props) => { icon="parachute-box" color="yellow" content="Express" - tooltip={multiline` + tooltip={` Sends the ingredients instantly, and locks the console longer. Doubles the price! `} diff --git a/tgui/packages/tgui/interfaces/RapidPipeDispenser.jsx b/tgui/packages/tgui/interfaces/RapidPipeDispenser.jsx index 5a867baa18b3..ce20d513f21e 100644 --- a/tgui/packages/tgui/interfaces/RapidPipeDispenser.jsx +++ b/tgui/packages/tgui/interfaces/RapidPipeDispenser.jsx @@ -1,5 +1,4 @@ import { classes } from 'common/react'; -import { multiline } from 'common/string'; import { useBackend, useLocalState } from '../backend'; import { Box, @@ -255,7 +254,7 @@ export const SmartPipeBlockSection = (props) => { color="transparent" icon="info" tooltipPosition="right" - tooltip={multiline` + tooltip={` This is a panel for blocking certain connection directions for the smart pipes. The button in the center resets to diff --git a/tgui/packages/tgui/interfaces/Safe.jsx b/tgui/packages/tgui/interfaces/Safe.jsx index 8796a564b8fc..bf0fcdb91f20 100644 --- a/tgui/packages/tgui/interfaces/Safe.jsx +++ b/tgui/packages/tgui/interfaces/Safe.jsx @@ -1,4 +1,4 @@ -import { Fragment } from 'inferno'; +import { Fragment } from 'react'; import { resolveAsset } from '../assets'; import { useBackend } from '../backend'; import { Box, Button, Icon, Section } from '../components'; diff --git a/tgui/packages/tgui/interfaces/SelectEquipment.jsx b/tgui/packages/tgui/interfaces/SelectEquipment.jsx index b0668b49abb1..f417e48b4787 100644 --- a/tgui/packages/tgui/interfaces/SelectEquipment.jsx +++ b/tgui/packages/tgui/interfaces/SelectEquipment.jsx @@ -191,8 +191,8 @@ const CurrentlySelectedDisplay = (props) => { title={entry?.path} style={{ overflow: 'hidden', - 'white-space': 'nowrap', - 'text-overflow': 'ellipsis', + whiteSpace: 'nowrap', + textOverflow: 'ellipsis', }} > {entry?.name} diff --git a/tgui/packages/tgui/interfaces/SimpleBot.tsx b/tgui/packages/tgui/interfaces/SimpleBot.tsx index 0e7b206fede9..7dba3e8cd31f 100644 --- a/tgui/packages/tgui/interfaces/SimpleBot.tsx +++ b/tgui/packages/tgui/interfaces/SimpleBot.tsx @@ -1,4 +1,3 @@ -import { multiline } from '../../common/string'; import { useBackend } from '../backend'; import { Button, @@ -122,7 +121,7 @@ const PaiButton = (_) => { @@ -133,7 +132,7 @@ const PaiButton = (_) => { disabled={!card_inserted} icon="eject" onClick={() => act('eject_pai')} - tooltip={multiline`Ejects the current PAI.`} + tooltip={`Ejects the current PAI.`} > Eject PAI @@ -270,7 +269,7 @@ const MedbotSync = (_) => { return ( {
diff --git a/tgui/packages/tgui/interfaces/Vending.tsx b/tgui/packages/tgui/interfaces/Vending.tsx index 24c749401661..2e16980a9c68 100644 --- a/tgui/packages/tgui/interfaces/Vending.tsx +++ b/tgui/packages/tgui/interfaces/Vending.tsx @@ -239,8 +239,7 @@ const ProductImage = (props) => { ) : ( @@ -248,8 +247,7 @@ const ProductImage = (props) => { icon={product.icon} icon_state={product.icon_state} style={{ - 'vertical-align': 'middle', - 'horizontal-align': 'middle', + verticalAlign: 'middle', }} /> ); diff --git a/tgui/packages/tgui/interfaces/common/AtmosHandbook.tsx b/tgui/packages/tgui/interfaces/common/AtmosHandbook.tsx index 9b080e3d2bee..b708b22d64a5 100644 --- a/tgui/packages/tgui/interfaces/common/AtmosHandbook.tsx +++ b/tgui/packages/tgui/interfaces/common/AtmosHandbook.tsx @@ -1,4 +1,4 @@ -import { InfernoNode } from 'inferno'; +import { ReactNode } from 'react'; import { useBackend, useLocalState } from '../../backend'; import { Box, @@ -45,7 +45,7 @@ type Gas = { }; const GasSearchBar = (props: { - title: InfernoNode; + title: ReactNode; onChange: (inputValue: string) => void; activeInput: boolean; setActiveInput: (toggle: boolean) => void; @@ -180,7 +180,7 @@ const ReactionHandbook = (props) => { {factor.factor_name + ':'} diff --git a/tgui/packages/tgui/interfaces/common/RecipeLookup.jsx b/tgui/packages/tgui/interfaces/common/RecipeLookup.jsx index 9e0872c4795a..2d3153d1de51 100644 --- a/tgui/packages/tgui/interfaces/common/RecipeLookup.jsx +++ b/tgui/packages/tgui/interfaces/common/RecipeLookup.jsx @@ -177,7 +177,7 @@ export const RecipeLookup = (props) => { height="50px" position="relative" style={{ - 'background-color': 'black', + backgroundColor: 'black', }} > { const { className, theme = 'nanotrasen', children, ...rest } = props; @@ -39,9 +38,4 @@ const LayoutContent = (props) => { ); }; -LayoutContent.defaultHooks = { - onComponentDidMount: (node) => addScrollableNode(node), - onComponentWillUnmount: (node) => removeScrollableNode(node), -}; - Layout.Content = LayoutContent; diff --git a/tgui/packages/tgui/layouts/Pane.jsx b/tgui/packages/tgui/layouts/Pane.jsx index abc9047a77fc..37773637f1e8 100644 --- a/tgui/packages/tgui/layouts/Pane.jsx +++ b/tgui/packages/tgui/layouts/Pane.jsx @@ -13,7 +13,7 @@ import { Layout } from './Layout'; export const Pane = (props) => { const { theme, children, className, ...rest } = props; const { suspended } = useBackend(); - const { debugLayout } = useDebug(); + const { debugLayout = false } = useDebug(); return ( @@ -30,7 +30,9 @@ const PaneContent = (props) => { className={classes(['Window__content', className])} {...rest} > - {(fitted && children) || ( + {fitted ? ( + children + ) : (
{children}
)} diff --git a/tgui/packages/tgui/layouts/Window.jsx b/tgui/packages/tgui/layouts/Window.jsx index 403fe33c1913..0baf09438634 100644 --- a/tgui/packages/tgui/layouts/Window.jsx +++ b/tgui/packages/tgui/layouts/Window.jsx @@ -6,7 +6,7 @@ import { classes } from 'common/react'; import { decodeHtmlEntities, toTitleCase } from 'common/string'; -import { Component } from 'inferno'; +import { Component } from 'react'; import { backendSuspendStart, globalStore, useBackend } from '../backend'; import { Icon } from '../components'; import { UI_DISABLED, UI_INTERACTIVE, UI_UPDATE } from '../constants'; @@ -26,6 +26,10 @@ const logger = createLogger('Window'); const DEFAULT_SIZE = [400, 600]; export class Window extends Component { + constructor(props) { + super(props); + } + componentDidMount() { const { suspended } = useBackend(); const { canClose = true } = this.props; @@ -101,15 +105,15 @@ export class Window extends Component { <>
)} @@ -171,7 +175,7 @@ const TitleBar = (props) => { )}
fancy && onDragStart(e)} + onMouseDown={(e) => fancy && onDragStart(e)} />
{(typeof title === 'string' && diff --git a/tgui/packages/tgui/package.json b/tgui/packages/tgui/package.json index 0f9cba52939d..057f3017bd12 100644 --- a/tgui/packages/tgui/package.json +++ b/tgui/packages/tgui/package.json @@ -1,16 +1,18 @@ { "private": true, "name": "tgui", - "version": "4.3.0", + "version": "5.0.0", "dependencies": { "@popperjs/core": "^2.9.3", + "@types/react": "^18.3.3", + "@types/react-dom": "^18.3.0", "common": "workspace:*", "dateformat": "^4.5.1", "dompurify": "^2.3.1", - "inferno": "^7.4.8", - "inferno-vnode-flags": "^7.4.8", "js-yaml": "^4.1.0", "marked": "^4.0.10", + "react": "^18.3.1", + "react-dom": "^18.3.1", "tgui-dev-server": "workspace:*", "tgui-polyfill": "workspace:*" } diff --git a/tgui/packages/tgui/renderer.ts b/tgui/packages/tgui/renderer.ts index a17d71bfa38a..50ba4814662a 100644 --- a/tgui/packages/tgui/renderer.ts +++ b/tgui/packages/tgui/renderer.ts @@ -1,10 +1,11 @@ import { perf } from 'common/perf'; -import { render } from 'inferno'; +import { ReactNode } from 'react'; import { createLogger } from './logging'; +import { createRoot, Root } from 'react-dom/client'; const logger = createLogger('renderer'); -let reactRoot: any; +let reactRoot: Root; let initialRender: string | boolean = true; let suspended = false; @@ -19,7 +20,7 @@ export const suspendRenderer = () => { }; type CreateRenderer = ( - getVNode?: (...args: T) => any, + getVNode?: (...args: T) => ReactNode, ) => (...args: T) => void; export const createRenderer: CreateRenderer = @@ -28,12 +29,13 @@ export const createRenderer: CreateRenderer = perf.mark('render/start'); // Start rendering if (!reactRoot) { - reactRoot = document.getElementById('react-root'); + const element = document.getElementById('react-root'); + reactRoot = createRoot(element!); } if (getVNode) { - render(getVNode(...args), reactRoot); + reactRoot.render(getVNode(...args)); } else { - render(args[0] as any, reactRoot); + reactRoot.render(args[0] as any); } perf.mark('render/finish'); if (suspended) { diff --git a/tgui/packages/tgui/store.js b/tgui/packages/tgui/store.js index 3afc41607c47..ab582e844adf 100644 --- a/tgui/packages/tgui/store.js +++ b/tgui/packages/tgui/store.js @@ -6,7 +6,6 @@ import { flow } from 'common/fp'; import { applyMiddleware, combineReducers, createStore } from 'common/redux'; -import { Component } from 'inferno'; import { assetMiddleware } from './assets'; import { backendMiddleware, backendReducer } from './backend'; import { debugMiddleware, debugReducer, relayMiddleware } from './debug'; @@ -81,18 +80,3 @@ const createStackAugmentor = (store) => (stack, error) => { }); return augmentedStack; }; - -/** - * Store provider for Inferno apps. - * This can be removed when Inferno is removed - */ -export class StoreProvider extends Component { - getChildContext() { - const { store } = this.props; - return { store }; - } - - render() { - return this.props.children; - } -} diff --git a/tgui/packages/tgui/styles/layouts/Window.scss b/tgui/packages/tgui/styles/layouts/Window.scss index 232dd8396bbf..93b6edd37581 100644 --- a/tgui/packages/tgui/styles/layouts/Window.scss +++ b/tgui/packages/tgui/styles/layouts/Window.scss @@ -44,8 +44,6 @@ .Window__contentPadding { margin: 0.5rem; - // IE8: Calc not supported - height: 100%; // 0.01 is needed to make the scrollbar not appear // due to rem rendering inaccuracies in IE11. height: calc(100% - 1.01rem); diff --git a/tgui/public/tgui-polyfill.min.js b/tgui/public/tgui-polyfill.min.js index 68c21147e6d9..fc7c7a512876 100644 --- a/tgui/public/tgui-polyfill.min.js +++ b/tgui/public/tgui-polyfill.min.js @@ -1 +1 @@ -(function(){"use strict";if(!window.Int32Array){window.Int32Array=Array}!function(){function t(){var e=Array.prototype.slice.call(arguments),n=document.createDocumentFragment();e.forEach((function(e){var t=e instanceof Node;n.appendChild(t?e:document.createTextNode(String(e)))})),this.appendChild(n)}function n(){this.parentNode&&this.parentNode.removeChild(this)}[Element.prototype,Document.prototype,DocumentFragment.prototype].forEach((function(e){e.hasOwnProperty("append")||Object.defineProperty(e,"append",{configurable:!0,enumerable:!0,writable:!0,value:t});e.hasOwnProperty("remove")||Object.defineProperty(e,"remove",{configurable:!0,enumerable:!0,writable:!0,value:n})}))}()})(); \ No newline at end of file +(function(){"use strict";!function(){function t(){var e=Array.prototype.slice.call(arguments),n=document.createDocumentFragment();e.forEach((function(e){var t=e instanceof Node;n.appendChild(t?e:document.createTextNode(String(e)))})),this.appendChild(n)}function n(){this.parentNode&&this.parentNode.removeChild(this)}[Element.prototype,Document.prototype,DocumentFragment.prototype].forEach((function(e){e.hasOwnProperty("append")||Object.defineProperty(e,"append",{configurable:!0,enumerable:!0,writable:!0,value:t});e.hasOwnProperty("remove")||Object.defineProperty(e,"remove",{configurable:!0,enumerable:!0,writable:!0,value:n})}))}()})(); \ No newline at end of file diff --git a/tgui/webpack.config.js b/tgui/webpack.config.js index d9cce2a63bda..287c4ad2c5bd 100644 --- a/tgui/webpack.config.js +++ b/tgui/webpack.config.js @@ -7,7 +7,6 @@ const webpack = require('webpack'); const path = require('path'); const ExtractCssPlugin = require('mini-css-extract-plugin'); -const { createBabelConfig } = require('./babel.config.js'); const createStats = (verbose) => ({ assets: verbose, @@ -52,12 +51,10 @@ module.exports = (env = {}, argv) => { rules: [ { test: /\.([tj]s(x)?|cjs)$/, + exclude: /node_modules[\\/]core-js/, use: [ { - loader: require.resolve('babel-loader'), - options: createBabelConfig({ - removeConsole: !bench, - }), + loader: require.resolve('swc-loader'), }, ], }, @@ -138,6 +135,7 @@ module.exports = (env = {}, argv) => { new EsbuildPlugin({ target: 'ie11', css: true, + legalComments: 'none', }), ]; } diff --git a/tgui/yarn.lock b/tgui/yarn.lock index cc7164eb6525..2d080fb6ebb5 100644 --- a/tgui/yarn.lock +++ b/tgui/yarn.lock @@ -23,14 +23,14 @@ __metadata: languageName: node linkType: hard -"@babel/compat-data@npm:^7.13.11, @babel/compat-data@npm:^7.14.7, @babel/compat-data@npm:^7.15.0": +"@babel/compat-data@npm:^7.15.0": version: 7.15.0 resolution: "@babel/compat-data@npm:7.15.0" checksum: 65088d87b14966dcdba397c799f312beb1e7a4dac178e7daa922a17ee9b65d8cfd9f35ff8352ccb6e20bb9a169df1171263ef5fd5967aa25d544ea3f62681993 languageName: node linkType: hard -"@babel/core@npm:^7.1.0, @babel/core@npm:^7.15.0, @babel/core@npm:^7.7.2, @babel/core@npm:^7.7.5": +"@babel/core@npm:^7.1.0, @babel/core@npm:^7.7.2, @babel/core@npm:^7.7.5": version: 7.15.0 resolution: "@babel/core@npm:7.15.0" dependencies: @@ -53,20 +53,6 @@ __metadata: languageName: node linkType: hard -"@babel/eslint-parser@npm:^7.15.0": - version: 7.15.0 - resolution: "@babel/eslint-parser@npm:7.15.0" - dependencies: - eslint-scope: ^5.1.1 - eslint-visitor-keys: ^2.1.0 - semver: ^6.3.0 - peerDependencies: - "@babel/core": ">=7.11.0" - eslint: ">=7.5.0" - checksum: fe2a6f59be3bc976b7b01432cab107462b2c8a0af936f4ab0db9ea597df97e6c029fa647ce95505f4b655830bdff42918da0fb6eafbe989aa24f989fed1aa92e - languageName: node - linkType: hard - "@babel/generator@npm:^7.15.0, @babel/generator@npm:^7.7.2": version: 7.15.0 resolution: "@babel/generator@npm:7.15.0" @@ -78,26 +64,7 @@ __metadata: languageName: node linkType: hard -"@babel/helper-annotate-as-pure@npm:^7.14.5": - version: 7.14.5 - resolution: "@babel/helper-annotate-as-pure@npm:7.14.5" - dependencies: - "@babel/types": ^7.14.5 - checksum: 18cefedda60003c2551dabe0e4ad278ef0507682680892c60e9f7cb75ae1dc9a065cddb3ce9964da76f220bf972af5262619eeac4b84c2b8aba1b031961215cc - languageName: node - linkType: hard - -"@babel/helper-builder-binary-assignment-operator-visitor@npm:^7.14.5": - version: 7.14.5 - resolution: "@babel/helper-builder-binary-assignment-operator-visitor@npm:7.14.5" - dependencies: - "@babel/helper-explode-assignable-expression": ^7.14.5 - "@babel/types": ^7.14.5 - checksum: 0d3571edff0a96d625503a3fd79643f66f8a5204e75c4351276c0d194240e1debe322a70ef9ff47952bd77ac76792f42d732922b00b5bd8b6e2c99909dc4f49b - languageName: node - linkType: hard - -"@babel/helper-compilation-targets@npm:^7.13.0, @babel/helper-compilation-targets@npm:^7.14.5, @babel/helper-compilation-targets@npm:^7.15.0": +"@babel/helper-compilation-targets@npm:^7.15.0": version: 7.15.0 resolution: "@babel/helper-compilation-targets@npm:7.15.0" dependencies: @@ -111,61 +78,6 @@ __metadata: languageName: node linkType: hard -"@babel/helper-create-class-features-plugin@npm:^7.14.5, @babel/helper-create-class-features-plugin@npm:^7.15.0": - version: 7.15.0 - resolution: "@babel/helper-create-class-features-plugin@npm:7.15.0" - dependencies: - "@babel/helper-annotate-as-pure": ^7.14.5 - "@babel/helper-function-name": ^7.14.5 - "@babel/helper-member-expression-to-functions": ^7.15.0 - "@babel/helper-optimise-call-expression": ^7.14.5 - "@babel/helper-replace-supers": ^7.15.0 - "@babel/helper-split-export-declaration": ^7.14.5 - peerDependencies: - "@babel/core": ^7.0.0 - checksum: d09136e31fce0c172a36a09532003423b6c263fe1fc51bc3b740fcea5134abed71faab0131b4264890c5cc5ebacbe200c9ba7904bd21a74070adfe46001dd178 - languageName: node - linkType: hard - -"@babel/helper-create-regexp-features-plugin@npm:^7.14.5": - version: 7.14.5 - resolution: "@babel/helper-create-regexp-features-plugin@npm:7.14.5" - dependencies: - "@babel/helper-annotate-as-pure": ^7.14.5 - regexpu-core: ^4.7.1 - peerDependencies: - "@babel/core": ^7.0.0 - checksum: c2636d0a6ea6d57eb3603ba9b223fd6ec273a3d8171eb8d84a357ff028cd747ab383b1d7cef84a4df5f9aebb321d43599895f562f3c8aa96314d4847aa59710e - languageName: node - linkType: hard - -"@babel/helper-define-polyfill-provider@npm:^0.2.2": - version: 0.2.3 - resolution: "@babel/helper-define-polyfill-provider@npm:0.2.3" - dependencies: - "@babel/helper-compilation-targets": ^7.13.0 - "@babel/helper-module-imports": ^7.12.13 - "@babel/helper-plugin-utils": ^7.13.0 - "@babel/traverse": ^7.13.0 - debug: ^4.1.1 - lodash.debounce: ^4.0.8 - resolve: ^1.14.2 - semver: ^6.1.2 - peerDependencies: - "@babel/core": ^7.4.0-0 - checksum: 797699fe870e45bdbc7c4128963427f7d6240609b700b3f2c0a2f2f187e5f848ba704bcfe58d7d91796cabc5001fae01746b3efda113beb5b5b824927cf59fdb - languageName: node - linkType: hard - -"@babel/helper-explode-assignable-expression@npm:^7.14.5": - version: 7.14.5 - resolution: "@babel/helper-explode-assignable-expression@npm:7.14.5" - dependencies: - "@babel/types": ^7.14.5 - checksum: f3b34c54ad26e48e1409f21aaac8ee5b5fa3bd2917ce4df496f57daec12b6132b2d5c2618da807458e97bc2d7894c5bf505cc96789e0c289dcc9948d7844bb03 - languageName: node - linkType: hard - "@babel/helper-function-name@npm:^7.14.5": version: 7.14.5 resolution: "@babel/helper-function-name@npm:7.14.5" @@ -204,7 +116,7 @@ __metadata: languageName: node linkType: hard -"@babel/helper-module-imports@npm:^7.12.13, @babel/helper-module-imports@npm:^7.14.5": +"@babel/helper-module-imports@npm:^7.14.5": version: 7.14.5 resolution: "@babel/helper-module-imports@npm:7.14.5" dependencies: @@ -213,7 +125,7 @@ __metadata: languageName: node linkType: hard -"@babel/helper-module-transforms@npm:^7.14.5, @babel/helper-module-transforms@npm:^7.15.0": +"@babel/helper-module-transforms@npm:^7.15.0": version: 7.15.0 resolution: "@babel/helper-module-transforms@npm:7.15.0" dependencies: @@ -238,25 +150,14 @@ __metadata: languageName: node linkType: hard -"@babel/helper-plugin-utils@npm:^7.0.0, @babel/helper-plugin-utils@npm:^7.10.4, @babel/helper-plugin-utils@npm:^7.12.13, @babel/helper-plugin-utils@npm:^7.13.0, @babel/helper-plugin-utils@npm:^7.14.5, @babel/helper-plugin-utils@npm:^7.8.0, @babel/helper-plugin-utils@npm:^7.8.3": +"@babel/helper-plugin-utils@npm:^7.0.0, @babel/helper-plugin-utils@npm:^7.10.4, @babel/helper-plugin-utils@npm:^7.12.13, @babel/helper-plugin-utils@npm:^7.14.5, @babel/helper-plugin-utils@npm:^7.8.0": version: 7.14.5 resolution: "@babel/helper-plugin-utils@npm:7.14.5" checksum: fe20e90a24d02770a60ebe80ab9f0dfd7258503cea8006c71709ac9af1aa3e47b0de569499673f11ea6c99597f8c0e4880ae1d505986e61101b69716820972fe languageName: node linkType: hard -"@babel/helper-remap-async-to-generator@npm:^7.14.5": - version: 7.14.5 - resolution: "@babel/helper-remap-async-to-generator@npm:7.14.5" - dependencies: - "@babel/helper-annotate-as-pure": ^7.14.5 - "@babel/helper-wrap-function": ^7.14.5 - "@babel/types": ^7.14.5 - checksum: 022594a15caed0d3bbac52e27eef0f20f9dceb85921b682df55f3bb21dee6fea645b03663e84fdfaadc6b88f4b83b012858520813c15e88728bbc5e16bf3fa29 - languageName: node - linkType: hard - -"@babel/helper-replace-supers@npm:^7.14.5, @babel/helper-replace-supers@npm:^7.15.0": +"@babel/helper-replace-supers@npm:^7.15.0": version: 7.15.0 resolution: "@babel/helper-replace-supers@npm:7.15.0" dependencies: @@ -277,15 +178,6 @@ __metadata: languageName: node linkType: hard -"@babel/helper-skip-transparent-expression-wrappers@npm:^7.14.5": - version: 7.14.5 - resolution: "@babel/helper-skip-transparent-expression-wrappers@npm:7.14.5" - dependencies: - "@babel/types": ^7.14.5 - checksum: d16937eb08d57d2577902fa6d05ac4b1695602babd9dff9890fa8e56b593fdc997ad24de13fdaf15617036bfacf3493ea569898a5ac0538c2a831aa163f18985 - languageName: node - linkType: hard - "@babel/helper-split-export-declaration@npm:^7.14.5": version: 7.14.5 resolution: "@babel/helper-split-export-declaration@npm:7.14.5" @@ -309,965 +201,177 @@ __metadata: languageName: node linkType: hard -"@babel/helper-wrap-function@npm:^7.14.5": - version: 7.14.5 - resolution: "@babel/helper-wrap-function@npm:7.14.5" - dependencies: - "@babel/helper-function-name": ^7.14.5 - "@babel/template": ^7.14.5 - "@babel/traverse": ^7.14.5 - "@babel/types": ^7.14.5 - checksum: d5c4bec02396f00d305ae2b60cfa5f3ec27d196a71b88107745b6be4fe257ebe54deedb6ee3997c8c9a2cc5c2571d567c22e9b866109490a2aa7f79a1a2272e2 - languageName: node - linkType: hard - -"@babel/helpers@npm:^7.14.8": - version: 7.15.3 - resolution: "@babel/helpers@npm:7.15.3" - dependencies: - "@babel/template": ^7.14.5 - "@babel/traverse": ^7.15.0 - "@babel/types": ^7.15.0 - checksum: cd70614d610b01189812c83b505b076dca0822df55ed6cd41232416f3a10ae9200a07315683942e0adbc1833481920c2fc7a23a08064ced5a8770259aa0ad707 - languageName: node - linkType: hard - -"@babel/highlight@npm:^7.10.4, @babel/highlight@npm:^7.14.5": - version: 7.14.5 - resolution: "@babel/highlight@npm:7.14.5" - dependencies: - "@babel/helper-validator-identifier": ^7.14.5 - chalk: ^2.0.0 - js-tokens: ^4.0.0 - checksum: 4e4b22fb886c939551d73307de16232c186fdb4d8ec8f514541b058feaecdba5234788a0740ca5bcd28777f4108596c39ac4b7463684c63b3812f6071e3fb88f - languageName: node - linkType: hard - -"@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.14.5, @babel/parser@npm:^7.15.0, @babel/parser@npm:^7.7.2": - version: 7.15.3 - resolution: "@babel/parser@npm:7.15.3" - bin: - parser: ./bin/babel-parser.js - checksum: 4b9ba7e8ffe0a3d0dd8c61dee975c79863f7744177de677cb7d12f96549eb5c8b9ffc70ca2b1b2488b06e056da99a6273e2d7d68fc31f498d01483dfac149e13 - languageName: node - linkType: hard - -"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@npm:^7.14.5": - version: 7.14.5 - resolution: "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@npm:7.14.5" - dependencies: - "@babel/helper-plugin-utils": ^7.14.5 - "@babel/helper-skip-transparent-expression-wrappers": ^7.14.5 - "@babel/plugin-proposal-optional-chaining": ^7.14.5 - peerDependencies: - "@babel/core": ^7.13.0 - checksum: 17331fd4c1de860ac78aa3195eb5bd058c4eb24a8f2c6e719f079f9c86cbdb53d9a8affc2f9f78b6fc257afef03811922c2d16addad5d5f6224d2820da1c9f45 - languageName: node - linkType: hard - -"@babel/plugin-proposal-async-generator-functions@npm:^7.14.9": - version: 7.14.9 - resolution: "@babel/plugin-proposal-async-generator-functions@npm:7.14.9" - dependencies: - "@babel/helper-plugin-utils": ^7.14.5 - "@babel/helper-remap-async-to-generator": ^7.14.5 - "@babel/plugin-syntax-async-generators": ^7.8.4 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 2c03f8ccb8cefc37d62fbd1e5af9570b14df80334f2bb8351381675d6c8f945596479ea51e59478dff9c80e1c234cd1e94675b3b3ccf694e06dde880c78495fa - languageName: node - linkType: hard - -"@babel/plugin-proposal-class-properties@npm:^7.14.5": - version: 7.14.5 - resolution: "@babel/plugin-proposal-class-properties@npm:7.14.5" - dependencies: - "@babel/helper-create-class-features-plugin": ^7.14.5 - "@babel/helper-plugin-utils": ^7.14.5 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: fe2aa0a44f8ea121e10c856d6fb4fca418dc42451258ef6ed29321ca740080fba420ebd3d6700d0456c34c2ab2044f9ce4308498321f52a93184ff5adb015aae - languageName: node - linkType: hard - -"@babel/plugin-proposal-class-static-block@npm:^7.14.5": - version: 7.14.5 - resolution: "@babel/plugin-proposal-class-static-block@npm:7.14.5" - dependencies: - "@babel/helper-create-class-features-plugin": ^7.14.5 - "@babel/helper-plugin-utils": ^7.14.5 - "@babel/plugin-syntax-class-static-block": ^7.14.5 - peerDependencies: - "@babel/core": ^7.12.0 - checksum: 0275d0643dacd08638c2d3c129158ad0c2dea6a26e78fa4b2129811a29460ff9a6459d1955a19bfa3b9ed67ba2bb3c88676823ad207b2de4f0c65e0c3751d75c - languageName: node - linkType: hard - -"@babel/plugin-proposal-dynamic-import@npm:^7.14.5": - version: 7.14.5 - resolution: "@babel/plugin-proposal-dynamic-import@npm:7.14.5" - dependencies: - "@babel/helper-plugin-utils": ^7.14.5 - "@babel/plugin-syntax-dynamic-import": ^7.8.3 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 47be4b5f8824f8690b47d99a34d52de0e6c19d0b99f26c1f9a2e4cc49e05082bcef7248c610bb3830ae84cec928713c7774f4929fca4fa72df570df7a76a9d2b - languageName: node - linkType: hard - -"@babel/plugin-proposal-export-namespace-from@npm:^7.14.5": - version: 7.14.5 - resolution: "@babel/plugin-proposal-export-namespace-from@npm:7.14.5" - dependencies: - "@babel/helper-plugin-utils": ^7.14.5 - "@babel/plugin-syntax-export-namespace-from": ^7.8.3 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: b3f4e0cc196f7ad9132816bb350124e8932bc047ab946e431f85bae9649b0de384c54261a60c050a2b8220703408fc089f90349ad008ed69a70944a6f3048d0e - languageName: node - linkType: hard - -"@babel/plugin-proposal-json-strings@npm:^7.14.5": - version: 7.14.5 - resolution: "@babel/plugin-proposal-json-strings@npm:7.14.5" - dependencies: - "@babel/helper-plugin-utils": ^7.14.5 - "@babel/plugin-syntax-json-strings": ^7.8.3 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 51dafe70237860569c9c27dc6a0db83e149bf7babb0fcafa9dbcd55a960b443f7b5bb695956c6e116e46b3dbd2a6777ead62bcad843aff8c1916c1be56e2f504 - languageName: node - linkType: hard - -"@babel/plugin-proposal-logical-assignment-operators@npm:^7.14.5": - version: 7.14.5 - resolution: "@babel/plugin-proposal-logical-assignment-operators@npm:7.14.5" - dependencies: - "@babel/helper-plugin-utils": ^7.14.5 - "@babel/plugin-syntax-logical-assignment-operators": ^7.10.4 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 08b6dbc991c4824b0d8bfabf46c8254fce02d2df04627b8849cf15a4b6de75629c10c7c83d1e6834cdcebfc98b16264ce2dd32aa9c0fae900ed2af807d5ac42b - languageName: node - linkType: hard - -"@babel/plugin-proposal-nullish-coalescing-operator@npm:^7.14.5": - version: 7.14.5 - resolution: "@babel/plugin-proposal-nullish-coalescing-operator@npm:7.14.5" - dependencies: - "@babel/helper-plugin-utils": ^7.14.5 - "@babel/plugin-syntax-nullish-coalescing-operator": ^7.8.3 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 033d9483c2feb74928fbb83a73948eb1179c8852d2ae507fbfc37752d2dbf702c9ad0daaf1eaa029f81b12b7e2470061b4f611db88b7293f0e9a71eba288a430 - languageName: node - linkType: hard - -"@babel/plugin-proposal-numeric-separator@npm:^7.14.5": - version: 7.14.5 - resolution: "@babel/plugin-proposal-numeric-separator@npm:7.14.5" - dependencies: - "@babel/helper-plugin-utils": ^7.14.5 - "@babel/plugin-syntax-numeric-separator": ^7.10.4 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 22093297ec9aed3938b39f4efa1b518252fe7b0835902c3066f0ae6a864ac253b986a4a21a6092aa068d0702d7b09bed74e56cf39f2da8b4f3f43e0747bffb62 - languageName: node - linkType: hard - -"@babel/plugin-proposal-object-rest-spread@npm:^7.14.7": - version: 7.14.7 - resolution: "@babel/plugin-proposal-object-rest-spread@npm:7.14.7" - dependencies: - "@babel/compat-data": ^7.14.7 - "@babel/helper-compilation-targets": ^7.14.5 - "@babel/helper-plugin-utils": ^7.14.5 - "@babel/plugin-syntax-object-rest-spread": ^7.8.3 - "@babel/plugin-transform-parameters": ^7.14.5 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: a35192868166fb5a62003a56ce2c266f74ae680f1d9589652c4495145240dd138a9505301bb5adca069cb874d6f0f733dc2f3d1d05f71a06019735c29c4d1a11 - languageName: node - linkType: hard - -"@babel/plugin-proposal-optional-catch-binding@npm:^7.14.5": - version: 7.14.5 - resolution: "@babel/plugin-proposal-optional-catch-binding@npm:7.14.5" - dependencies: - "@babel/helper-plugin-utils": ^7.14.5 - "@babel/plugin-syntax-optional-catch-binding": ^7.8.3 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: f9c1b2b34fef1bde85feeb0b438131f526056161e10b6fb91c74a5828ad39d2a20521b5c3cefc7367a7e5fc792b7c7e607bf278d7999b5d89824c34af3174eae - languageName: node - linkType: hard - -"@babel/plugin-proposal-optional-chaining@npm:^7.14.5": - version: 7.14.5 - resolution: "@babel/plugin-proposal-optional-chaining@npm:7.14.5" - dependencies: - "@babel/helper-plugin-utils": ^7.14.5 - "@babel/helper-skip-transparent-expression-wrappers": ^7.14.5 - "@babel/plugin-syntax-optional-chaining": ^7.8.3 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 9e39e20d162bea2241b4c24ea8a339f872a04954a5155c606bf2437edaa1a15b8a517daee4b2b09cfd42d826b93c57f080aa9fbb13c60a8f3a7a72963badf2df - languageName: node - linkType: hard - -"@babel/plugin-proposal-private-methods@npm:^7.14.5": - version: 7.14.5 - resolution: "@babel/plugin-proposal-private-methods@npm:7.14.5" - dependencies: - "@babel/helper-create-class-features-plugin": ^7.14.5 - "@babel/helper-plugin-utils": ^7.14.5 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: badacc1d68c8cf92a7ba973e3c283bc3aebf586a6573b6d18a96461ce18039d4cdc0135edac1b810df8d92cfca628115d98a0ad83ed8f15bf15eaff21539bf32 - languageName: node - linkType: hard - -"@babel/plugin-proposal-private-property-in-object@npm:^7.14.5": - version: 7.14.5 - resolution: "@babel/plugin-proposal-private-property-in-object@npm:7.14.5" - dependencies: - "@babel/helper-annotate-as-pure": ^7.14.5 - "@babel/helper-create-class-features-plugin": ^7.14.5 - "@babel/helper-plugin-utils": ^7.14.5 - "@babel/plugin-syntax-private-property-in-object": ^7.14.5 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: a11da6a52eb13d6dcb6ed36993a81e9746404f6e83d32be16142911b7e5768293d8c4c5373d182ef25cb94d0b18c0c27a07f4553be042ee2dc49f7179f8cbfe2 - languageName: node - linkType: hard - -"@babel/plugin-proposal-unicode-property-regex@npm:^7.14.5, @babel/plugin-proposal-unicode-property-regex@npm:^7.4.4": - version: 7.14.5 - resolution: "@babel/plugin-proposal-unicode-property-regex@npm:7.14.5" - dependencies: - "@babel/helper-create-regexp-features-plugin": ^7.14.5 - "@babel/helper-plugin-utils": ^7.14.5 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 58bd3277a972a33d101d29ab4f52e964b6e8ec218eb84f764b4ea67bf8ed362909760812d3f7451ee5e54dc273bd81bc5a00cd2c13e8fb64a47ec117cb69d51b - languageName: node - linkType: hard - -"@babel/plugin-syntax-async-generators@npm:^7.8.4": - version: 7.8.4 - resolution: "@babel/plugin-syntax-async-generators@npm:7.8.4" - dependencies: - "@babel/helper-plugin-utils": ^7.8.0 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 7ed1c1d9b9e5b64ef028ea5e755c0be2d4e5e4e3d6cf7df757b9a8c4cfa4193d268176d0f1f7fbecdda6fe722885c7fda681f480f3741d8a2d26854736f05367 - languageName: node - linkType: hard - -"@babel/plugin-syntax-bigint@npm:^7.8.3": - version: 7.8.3 - resolution: "@babel/plugin-syntax-bigint@npm:7.8.3" - dependencies: - "@babel/helper-plugin-utils": ^7.8.0 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 3a10849d83e47aec50f367a9e56a6b22d662ddce643334b087f9828f4c3dd73bdc5909aaeabe123fed78515767f9ca43498a0e621c438d1cd2802d7fae3c9648 - languageName: node - linkType: hard - -"@babel/plugin-syntax-class-properties@npm:^7.12.13, @babel/plugin-syntax-class-properties@npm:^7.8.3": - version: 7.12.13 - resolution: "@babel/plugin-syntax-class-properties@npm:7.12.13" - dependencies: - "@babel/helper-plugin-utils": ^7.12.13 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 24f34b196d6342f28d4bad303612d7ff566ab0a013ce89e775d98d6f832969462e7235f3e7eaf17678a533d4be0ba45d3ae34ab4e5a9dcbda5d98d49e5efa2fc - languageName: node - linkType: hard - -"@babel/plugin-syntax-class-static-block@npm:^7.14.5": - version: 7.14.5 - resolution: "@babel/plugin-syntax-class-static-block@npm:7.14.5" - dependencies: - "@babel/helper-plugin-utils": ^7.14.5 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 3e80814b5b6d4fe17826093918680a351c2d34398a914ce6e55d8083d72a9bdde4fbaf6a2dcea0e23a03de26dc2917ae3efd603d27099e2b98380345703bf948 - languageName: node - linkType: hard - -"@babel/plugin-syntax-dynamic-import@npm:^7.8.3": - version: 7.8.3 - resolution: "@babel/plugin-syntax-dynamic-import@npm:7.8.3" - dependencies: - "@babel/helper-plugin-utils": ^7.8.0 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: ce307af83cf433d4ec42932329fad25fa73138ab39c7436882ea28742e1c0066626d224e0ad2988724c82644e41601cef607b36194f695cb78a1fcdc959637bd - languageName: node - linkType: hard - -"@babel/plugin-syntax-export-namespace-from@npm:^7.8.3": - version: 7.8.3 - resolution: "@babel/plugin-syntax-export-namespace-from@npm:7.8.3" - dependencies: - "@babel/helper-plugin-utils": ^7.8.3 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 85740478be5b0de185228e7814451d74ab8ce0a26fcca7613955262a26e99e8e15e9da58f60c754b84515d4c679b590dbd3f2148f0f58025f4ae706f1c5a5d4a - languageName: node - linkType: hard - -"@babel/plugin-syntax-import-meta@npm:^7.8.3": - version: 7.10.4 - resolution: "@babel/plugin-syntax-import-meta@npm:7.10.4" - dependencies: - "@babel/helper-plugin-utils": ^7.10.4 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 166ac1125d10b9c0c430e4156249a13858c0366d38844883d75d27389621ebe651115cb2ceb6dc011534d5055719fa1727b59f39e1ab3ca97820eef3dcab5b9b - languageName: node - linkType: hard - -"@babel/plugin-syntax-json-strings@npm:^7.8.3": - version: 7.8.3 - resolution: "@babel/plugin-syntax-json-strings@npm:7.8.3" - dependencies: - "@babel/helper-plugin-utils": ^7.8.0 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: bf5aea1f3188c9a507e16efe030efb996853ca3cadd6512c51db7233cc58f3ac89ff8c6bdfb01d30843b161cfe7d321e1bf28da82f7ab8d7e6bc5464666f354a - languageName: node - linkType: hard - -"@babel/plugin-syntax-jsx@npm:^7": - version: 7.12.13 - resolution: "@babel/plugin-syntax-jsx@npm:7.12.13" - dependencies: - "@babel/helper-plugin-utils": ^7.12.13 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 30697ad4607a9339b06c2648c2d128ce6865c3d2d14049b422c5ca060d6532978bb1008e086df402d365fda04fbafe9bd4ad9f62d78ef2e7a7063459b59645c0 - languageName: node - linkType: hard - -"@babel/plugin-syntax-logical-assignment-operators@npm:^7.10.4, @babel/plugin-syntax-logical-assignment-operators@npm:^7.8.3": - version: 7.10.4 - resolution: "@babel/plugin-syntax-logical-assignment-operators@npm:7.10.4" - dependencies: - "@babel/helper-plugin-utils": ^7.10.4 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: aff33577037e34e515911255cdbb1fd39efee33658aa00b8a5fd3a4b903585112d037cce1cc9e4632f0487dc554486106b79ccd5ea63a2e00df4363f6d4ff886 - languageName: node - linkType: hard - -"@babel/plugin-syntax-nullish-coalescing-operator@npm:^7.8.3": - version: 7.8.3 - resolution: "@babel/plugin-syntax-nullish-coalescing-operator@npm:7.8.3" - dependencies: - "@babel/helper-plugin-utils": ^7.8.0 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 87aca4918916020d1fedba54c0e232de408df2644a425d153be368313fdde40d96088feed6c4e5ab72aac89be5d07fef2ddf329a15109c5eb65df006bf2580d1 - languageName: node - linkType: hard - -"@babel/plugin-syntax-numeric-separator@npm:^7.10.4, @babel/plugin-syntax-numeric-separator@npm:^7.8.3": - version: 7.10.4 - resolution: "@babel/plugin-syntax-numeric-separator@npm:7.10.4" - dependencies: - "@babel/helper-plugin-utils": ^7.10.4 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 01ec5547bd0497f76cc903ff4d6b02abc8c05f301c88d2622b6d834e33a5651aa7c7a3d80d8d57656a4588f7276eba357f6b7e006482f5b564b7a6488de493a1 - languageName: node - linkType: hard - -"@babel/plugin-syntax-object-rest-spread@npm:^7.8.3": - version: 7.8.3 - resolution: "@babel/plugin-syntax-object-rest-spread@npm:7.8.3" - dependencies: - "@babel/helper-plugin-utils": ^7.8.0 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: fddcf581a57f77e80eb6b981b10658421bc321ba5f0a5b754118c6a92a5448f12a0c336f77b8abf734841e102e5126d69110a306eadb03ca3e1547cab31f5cbf - languageName: node - linkType: hard - -"@babel/plugin-syntax-optional-catch-binding@npm:^7.8.3": - version: 7.8.3 - resolution: "@babel/plugin-syntax-optional-catch-binding@npm:7.8.3" - dependencies: - "@babel/helper-plugin-utils": ^7.8.0 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 910d90e72bc90ea1ce698e89c1027fed8845212d5ab588e35ef91f13b93143845f94e2539d831dc8d8ededc14ec02f04f7bd6a8179edd43a326c784e7ed7f0b9 - languageName: node - linkType: hard - -"@babel/plugin-syntax-optional-chaining@npm:^7.8.3": - version: 7.8.3 - resolution: "@babel/plugin-syntax-optional-chaining@npm:7.8.3" - dependencies: - "@babel/helper-plugin-utils": ^7.8.0 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: eef94d53a1453361553c1f98b68d17782861a04a392840341bc91780838dd4e695209c783631cf0de14c635758beafb6a3a65399846ffa4386bff90639347f30 - languageName: node - linkType: hard - -"@babel/plugin-syntax-private-property-in-object@npm:^7.14.5": - version: 7.14.5 - resolution: "@babel/plugin-syntax-private-property-in-object@npm:7.14.5" - dependencies: - "@babel/helper-plugin-utils": ^7.14.5 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: b317174783e6e96029b743ccff2a67d63d38756876e7e5d0ba53a322e38d9ca452c13354a57de1ad476b4c066dbae699e0ca157441da611117a47af88985ecda - languageName: node - linkType: hard - -"@babel/plugin-syntax-top-level-await@npm:^7.14.5, @babel/plugin-syntax-top-level-await@npm:^7.8.3": - version: 7.14.5 - resolution: "@babel/plugin-syntax-top-level-await@npm:7.14.5" - dependencies: - "@babel/helper-plugin-utils": ^7.14.5 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: bbd1a56b095be7820029b209677b194db9b1d26691fe999856462e66b25b281f031f3dfd91b1619e9dcf95bebe336211833b854d0fb8780d618e35667c2d0d7e - languageName: node - linkType: hard - -"@babel/plugin-syntax-typescript@npm:^7.14.5, @babel/plugin-syntax-typescript@npm:^7.7.2": - version: 7.14.5 - resolution: "@babel/plugin-syntax-typescript@npm:7.14.5" - dependencies: - "@babel/helper-plugin-utils": ^7.14.5 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 5447d13b31aeeeaa5c2b945e60a598642dedca480f11d3232b0927aeb6a6bb8201a0025f509bc23851da4bf126f69b0522790edbd58f4560f0a4984cabd0d126 - languageName: node - linkType: hard - -"@babel/plugin-transform-arrow-functions@npm:^7.14.5": - version: 7.14.5 - resolution: "@babel/plugin-transform-arrow-functions@npm:7.14.5" - dependencies: - "@babel/helper-plugin-utils": ^7.14.5 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 126196ea0107e97f711c0d48d8d1e01a30f5a5e127628f7367658b4c5832182c4e28914294408374690c5bfbb4ad4fe6560068d8bf370cafe8d4fe23599aaa95 - languageName: node - linkType: hard - -"@babel/plugin-transform-async-to-generator@npm:^7.14.5": - version: 7.14.5 - resolution: "@babel/plugin-transform-async-to-generator@npm:7.14.5" - dependencies: - "@babel/helper-module-imports": ^7.14.5 - "@babel/helper-plugin-utils": ^7.14.5 - "@babel/helper-remap-async-to-generator": ^7.14.5 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 4c47016c5f65adaa5836054fcc99402f1d295aedd7ebd44e6df128a90977952f2a8abdf3b3d0aa5a9e1186184da538452c4d9a3b1482376759c6962627201da5 - languageName: node - linkType: hard - -"@babel/plugin-transform-block-scoped-functions@npm:^7.14.5": - version: 7.14.5 - resolution: "@babel/plugin-transform-block-scoped-functions@npm:7.14.5" - dependencies: - "@babel/helper-plugin-utils": ^7.14.5 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 9994d9f107308b21be043de115fe1d06956807d93a3039ddab54333d1fbb39ad50cc5f9eccaedf5317f4699230e923662254974f3a974c4f000e986837bc020a - languageName: node - linkType: hard - -"@babel/plugin-transform-block-scoping@npm:^7.14.5": - version: 7.15.3 - resolution: "@babel/plugin-transform-block-scoping@npm:7.15.3" - dependencies: - "@babel/helper-plugin-utils": ^7.14.5 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: ee28f51711b5f6569a9bb86be5b2a5456f3e6e22e68488ee77f8082fae5563f45c858dc8323e0e51085d880db1be73e28dc5d108c8a855c831fb29310a01b549 - languageName: node - linkType: hard - -"@babel/plugin-transform-classes@npm:^7.14.9": - version: 7.14.9 - resolution: "@babel/plugin-transform-classes@npm:7.14.9" - dependencies: - "@babel/helper-annotate-as-pure": ^7.14.5 - "@babel/helper-function-name": ^7.14.5 - "@babel/helper-optimise-call-expression": ^7.14.5 - "@babel/helper-plugin-utils": ^7.14.5 - "@babel/helper-replace-supers": ^7.14.5 - "@babel/helper-split-export-declaration": ^7.14.5 - globals: ^11.1.0 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 9cb8e78b1249734de6d518a5e63fe429beed9d096298cd79cd1bd36836704cc3644d889d762ce079077bc007dbe4c950d66a58456d9472a123ab3c1100cff7b2 - languageName: node - linkType: hard - -"@babel/plugin-transform-computed-properties@npm:^7.14.5": - version: 7.14.5 - resolution: "@babel/plugin-transform-computed-properties@npm:7.14.5" - dependencies: - "@babel/helper-plugin-utils": ^7.14.5 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 87bd4c46255359ab8d53d0e9b5aa5e1ef218c1447874bd8c2eff759d3a2b5fe6b3ec55046babe0087f7e3890f6167524c729737e912080ea1c9758a559765130 - languageName: node - linkType: hard - -"@babel/plugin-transform-destructuring@npm:^7.14.7": - version: 7.14.7 - resolution: "@babel/plugin-transform-destructuring@npm:7.14.7" - dependencies: - "@babel/helper-plugin-utils": ^7.14.5 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 0b0cf8ed9fb92c53e3888c17402c4f1e8f329f05a759829b559df883b19b442d3950b7f319df419d0cff122ea76fc8b3b55779fdbb9e394e5f058419a8d5ba14 - languageName: node - linkType: hard - -"@babel/plugin-transform-dotall-regex@npm:^7.14.5, @babel/plugin-transform-dotall-regex@npm:^7.4.4": - version: 7.14.5 - resolution: "@babel/plugin-transform-dotall-regex@npm:7.14.5" - dependencies: - "@babel/helper-create-regexp-features-plugin": ^7.14.5 - "@babel/helper-plugin-utils": ^7.14.5 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 4da3dac9580823c1fe8aaedf6109d3a26d17ad7ef7d1b278ddbcd7c148e02c465cf49250794529a34bac0bda6b53db558ae08d185a96b76efaaa17a5da3911df - languageName: node - linkType: hard - -"@babel/plugin-transform-duplicate-keys@npm:^7.14.5": - version: 7.14.5 - resolution: "@babel/plugin-transform-duplicate-keys@npm:7.14.5" - dependencies: - "@babel/helper-plugin-utils": ^7.14.5 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: c6c951d2f7ed528a8103d08293d4aaf95efa38c697e7b2b27b7e6c9780280484373e2f7ef8d77daf17dffdc86748fbf75e776e0542b1c7b17e29308bc31ebd8c - languageName: node - linkType: hard - -"@babel/plugin-transform-exponentiation-operator@npm:^7.14.5": - version: 7.14.5 - resolution: "@babel/plugin-transform-exponentiation-operator@npm:7.14.5" - dependencies: - "@babel/helper-builder-binary-assignment-operator-visitor": ^7.14.5 - "@babel/helper-plugin-utils": ^7.14.5 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 7588a582d0bc5c80fda7f1c631354a35a9a7d284dd80ccaf2bbfd086a39a9d6461718dc7dd45a3ca59228593270a7c6a907a9cbe7ddc349d80c7342af0263c5c - languageName: node - linkType: hard - -"@babel/plugin-transform-for-of@npm:^7.14.5": - version: 7.14.5 - resolution: "@babel/plugin-transform-for-of@npm:7.14.5" - dependencies: - "@babel/helper-plugin-utils": ^7.14.5 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: aeb76eb11d10b2390996001e2fd529bbaf3695edd306d24e4eba87b8137c10a6afda3896017f88fcf40fd2334cc424c0a111fad34e10c747e81e577e5957e328 - languageName: node - linkType: hard - -"@babel/plugin-transform-function-name@npm:^7.14.5": - version: 7.14.5 - resolution: "@babel/plugin-transform-function-name@npm:7.14.5" - dependencies: - "@babel/helper-function-name": ^7.14.5 - "@babel/helper-plugin-utils": ^7.14.5 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 3db2fa1bcd21b76a91ce78db8ebca047fdadbf198f816e2621e531a751a0d40976cf2a25262dee9352fd0c53bff5b25fddefadebdbb4ba3da6d89b849ab075b6 - languageName: node - linkType: hard - -"@babel/plugin-transform-jscript@npm:^7.14.5": - version: 7.14.5 - resolution: "@babel/plugin-transform-jscript@npm:7.14.5" - dependencies: - "@babel/helper-plugin-utils": ^7.14.5 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 1f1faa800f705e6cd3a3dc6d12422d63278e09c2117f06584d1f8f69b9e07510ff7dbd659078c6c9dd094975cfb5d8780eb82dfe6acded1ce973c9f104537c76 - languageName: node - linkType: hard - -"@babel/plugin-transform-literals@npm:^7.14.5": - version: 7.14.5 - resolution: "@babel/plugin-transform-literals@npm:7.14.5" - dependencies: - "@babel/helper-plugin-utils": ^7.14.5 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 2341cfaaf8ac7199c578407ea4de41205d3d74c5a48899aa96c41b08c09d18c46d9018fdc6a2f69f0bccc2662223afc47b60130ae4ff36a79351fface71a61f3 - languageName: node - linkType: hard - -"@babel/plugin-transform-member-expression-literals@npm:^7.14.5": - version: 7.14.5 - resolution: "@babel/plugin-transform-member-expression-literals@npm:7.14.5" - dependencies: - "@babel/helper-plugin-utils": ^7.14.5 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: a94ff910e8d0e28effd58c64f2d15c9772ea4c209644f116fd81dc5c93ce232304f42ef14d5ec2baf095c824786698fcf6c1d4c91952dc3762350f4ec0eb1f17 - languageName: node - linkType: hard - -"@babel/plugin-transform-modules-amd@npm:^7.14.5": - version: 7.14.5 - resolution: "@babel/plugin-transform-modules-amd@npm:7.14.5" - dependencies: - "@babel/helper-module-transforms": ^7.14.5 - "@babel/helper-plugin-utils": ^7.14.5 - babel-plugin-dynamic-import-node: ^2.3.3 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 963d9ebb11b282d5c5f462e3e1ad6991e60fb4d190b5a7aa0d9937e0fa83d89cf5f94268f0b0b343576f2cee0cf545bcaf40da40eb8b9dca5c79840fd86a65ed - languageName: node - linkType: hard - -"@babel/plugin-transform-modules-commonjs@npm:^7.15.0": - version: 7.15.0 - resolution: "@babel/plugin-transform-modules-commonjs@npm:7.15.0" - dependencies: - "@babel/helper-module-transforms": ^7.15.0 - "@babel/helper-plugin-utils": ^7.14.5 - "@babel/helper-simple-access": ^7.14.8 - babel-plugin-dynamic-import-node: ^2.3.3 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: ef55fb736cc8dd984d1a39a74a108b0c52326e93c2e94264da2800ba7027369b64c5d4bd67f274d5386d5346beec264bd8d52e4f1fe6b59802984472e28e4f68 - languageName: node - linkType: hard - -"@babel/plugin-transform-modules-systemjs@npm:^7.14.5": - version: 7.14.5 - resolution: "@babel/plugin-transform-modules-systemjs@npm:7.14.5" - dependencies: - "@babel/helper-hoist-variables": ^7.14.5 - "@babel/helper-module-transforms": ^7.14.5 - "@babel/helper-plugin-utils": ^7.14.5 - "@babel/helper-validator-identifier": ^7.14.5 - babel-plugin-dynamic-import-node: ^2.3.3 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 3ca0bb1c0c22a3d705476186afa9fc86398ae4662afc259ff29c1942e3c8770f4bdadaf67418a21816964d4e1eaf07412eeabccccfaa9d45eac735f971ad148b - languageName: node - linkType: hard - -"@babel/plugin-transform-modules-umd@npm:^7.14.5": - version: 7.14.5 - resolution: "@babel/plugin-transform-modules-umd@npm:7.14.5" - dependencies: - "@babel/helper-module-transforms": ^7.14.5 - "@babel/helper-plugin-utils": ^7.14.5 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 455ff383bed47e104d4b2b32f11bc5a44a25c797fad26b5eab9b8a81856f9945350b45ad28b9b20b0bbf324832c7a826c9c3d6f865e85c26a1771663132e4145 - languageName: node - linkType: hard - -"@babel/plugin-transform-named-capturing-groups-regex@npm:^7.14.9": - version: 7.14.9 - resolution: "@babel/plugin-transform-named-capturing-groups-regex@npm:7.14.9" - dependencies: - "@babel/helper-create-regexp-features-plugin": ^7.14.5 - peerDependencies: - "@babel/core": ^7.0.0 - checksum: 81dda376c0af4c07ae252703481e8bd16d49045bd624697ff6b6635326f3f20fca9c574a2f0036bf7f4aa8c36baa9d926912538de486a189a3515bec7f72e16a - languageName: node - linkType: hard - -"@babel/plugin-transform-new-target@npm:^7.14.5": - version: 7.14.5 - resolution: "@babel/plugin-transform-new-target@npm:7.14.5" - dependencies: - "@babel/helper-plugin-utils": ^7.14.5 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 5b806c86926cd0b03fa2f22cf21a6d6a86e5831b80e8a1e898877acd3a03fd07078e45da33b671200ec98a5c7ac9be2f3592cd88933e262feffba248ca7ca4e7 - languageName: node - linkType: hard - -"@babel/plugin-transform-object-super@npm:^7.14.5": - version: 7.14.5 - resolution: "@babel/plugin-transform-object-super@npm:7.14.5" +"@babel/helpers@npm:^7.14.8": + version: 7.15.3 + resolution: "@babel/helpers@npm:7.15.3" dependencies: - "@babel/helper-plugin-utils": ^7.14.5 - "@babel/helper-replace-supers": ^7.14.5 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 88477a8b27e76042ffbff1345088422f5b3135346d69f264e71d90b3749a3d73d5a579c97a33cd11c61c5d499a655911c7cd97dbe68edb36e090dfd5f154d777 + "@babel/template": ^7.14.5 + "@babel/traverse": ^7.15.0 + "@babel/types": ^7.15.0 + checksum: cd70614d610b01189812c83b505b076dca0822df55ed6cd41232416f3a10ae9200a07315683942e0adbc1833481920c2fc7a23a08064ced5a8770259aa0ad707 languageName: node linkType: hard -"@babel/plugin-transform-parameters@npm:^7.14.5": +"@babel/highlight@npm:^7.10.4, @babel/highlight@npm:^7.14.5": version: 7.14.5 - resolution: "@babel/plugin-transform-parameters@npm:7.14.5" + resolution: "@babel/highlight@npm:7.14.5" dependencies: - "@babel/helper-plugin-utils": ^7.14.5 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 932bc616be7b5542ba2371c85cfcc579a8556b9e5a5ea5535b7f0ec5b68284ed2a3724ae181f1a22719b5ea6539c82f5fcee37d9f45f08ed72eb9e43a0940b56 + "@babel/helper-validator-identifier": ^7.14.5 + chalk: ^2.0.0 + js-tokens: ^4.0.0 + checksum: 4e4b22fb886c939551d73307de16232c186fdb4d8ec8f514541b058feaecdba5234788a0740ca5bcd28777f4108596c39ac4b7463684c63b3812f6071e3fb88f languageName: node linkType: hard -"@babel/plugin-transform-property-literals@npm:^7.14.5": - version: 7.14.5 - resolution: "@babel/plugin-transform-property-literals@npm:7.14.5" - dependencies: - "@babel/helper-plugin-utils": ^7.14.5 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 426e7b13a048220314e35bd4e6732640293c616173ef05ceca3a2bfadd043199e35ec693f1604f77178c3a88bea241b6d7ce92d8fc837faeb37117ad7866350f +"@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.14.5, @babel/parser@npm:^7.15.0, @babel/parser@npm:^7.7.2": + version: 7.15.3 + resolution: "@babel/parser@npm:7.15.3" + bin: + parser: ./bin/babel-parser.js + checksum: 4b9ba7e8ffe0a3d0dd8c61dee975c79863f7744177de677cb7d12f96549eb5c8b9ffc70ca2b1b2488b06e056da99a6273e2d7d68fc31f498d01483dfac149e13 languageName: node linkType: hard -"@babel/plugin-transform-regenerator@npm:^7.14.5": - version: 7.14.5 - resolution: "@babel/plugin-transform-regenerator@npm:7.14.5" +"@babel/plugin-syntax-async-generators@npm:^7.8.4": + version: 7.8.4 + resolution: "@babel/plugin-syntax-async-generators@npm:7.8.4" dependencies: - regenerator-transform: ^0.14.2 + "@babel/helper-plugin-utils": ^7.8.0 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: f606bc04da7d0cfd651914cb144e85a0ea6fe20ee453ed21d002747cc47b09c853bc97166c32dc47e959581b772d9883f7d96d1c8e795c81ed21dbbb300e3aa7 + checksum: 7ed1c1d9b9e5b64ef028ea5e755c0be2d4e5e4e3d6cf7df757b9a8c4cfa4193d268176d0f1f7fbecdda6fe722885c7fda681f480f3741d8a2d26854736f05367 languageName: node linkType: hard -"@babel/plugin-transform-reserved-words@npm:^7.14.5": - version: 7.14.5 - resolution: "@babel/plugin-transform-reserved-words@npm:7.14.5" +"@babel/plugin-syntax-bigint@npm:^7.8.3": + version: 7.8.3 + resolution: "@babel/plugin-syntax-bigint@npm:7.8.3" dependencies: - "@babel/helper-plugin-utils": ^7.14.5 + "@babel/helper-plugin-utils": ^7.8.0 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 8a40d7b48e1b4a549272d603e7b28ead70213e12353d65edd07156b7169d7933cee8b79987b54f374f3c41b835d941aca4b13b8aa23a922c94113af2131ca686 + checksum: 3a10849d83e47aec50f367a9e56a6b22d662ddce643334b087f9828f4c3dd73bdc5909aaeabe123fed78515767f9ca43498a0e621c438d1cd2802d7fae3c9648 languageName: node linkType: hard -"@babel/plugin-transform-shorthand-properties@npm:^7.14.5": - version: 7.14.5 - resolution: "@babel/plugin-transform-shorthand-properties@npm:7.14.5" +"@babel/plugin-syntax-class-properties@npm:^7.8.3": + version: 7.12.13 + resolution: "@babel/plugin-syntax-class-properties@npm:7.12.13" dependencies: - "@babel/helper-plugin-utils": ^7.14.5 + "@babel/helper-plugin-utils": ^7.12.13 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 60cdd17e347a6a0973c8ea5c08ae4b3f8e59ce0e188453c4bda045d2a5c34495af8e0e9393631aa9f3fd51282455b9c5d6ba07e262576171dbe2b4094bdaf8ad + checksum: 24f34b196d6342f28d4bad303612d7ff566ab0a013ce89e775d98d6f832969462e7235f3e7eaf17678a533d4be0ba45d3ae34ab4e5a9dcbda5d98d49e5efa2fc languageName: node linkType: hard -"@babel/plugin-transform-spread@npm:^7.14.6": - version: 7.14.6 - resolution: "@babel/plugin-transform-spread@npm:7.14.6" +"@babel/plugin-syntax-import-meta@npm:^7.8.3": + version: 7.10.4 + resolution: "@babel/plugin-syntax-import-meta@npm:7.10.4" dependencies: - "@babel/helper-plugin-utils": ^7.14.5 - "@babel/helper-skip-transparent-expression-wrappers": ^7.14.5 + "@babel/helper-plugin-utils": ^7.10.4 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 20c11de962dd7ddab110d6c4ab9f3c0bea97393ce09cbe4e46be53182c3df0577eaf0e31aaa2d76344ae21ed3a3b7e779fe814b845d188e11a6031c619648b89 + checksum: 166ac1125d10b9c0c430e4156249a13858c0366d38844883d75d27389621ebe651115cb2ceb6dc011534d5055719fa1727b59f39e1ab3ca97820eef3dcab5b9b languageName: node linkType: hard -"@babel/plugin-transform-sticky-regex@npm:^7.14.5": - version: 7.14.5 - resolution: "@babel/plugin-transform-sticky-regex@npm:7.14.5" +"@babel/plugin-syntax-json-strings@npm:^7.8.3": + version: 7.8.3 + resolution: "@babel/plugin-syntax-json-strings@npm:7.8.3" dependencies: - "@babel/helper-plugin-utils": ^7.14.5 + "@babel/helper-plugin-utils": ^7.8.0 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 6d77e0641c4c72203d592d54fdb11770de22a34d659d3335e4c537e95b930d03142b11f1d41d103da3de063c628a0f34bdd4c6534b591bc59d9ce67fafb836dc + checksum: bf5aea1f3188c9a507e16efe030efb996853ca3cadd6512c51db7233cc58f3ac89ff8c6bdfb01d30843b161cfe7d321e1bf28da82f7ab8d7e6bc5464666f354a languageName: node linkType: hard -"@babel/plugin-transform-template-literals@npm:^7.14.5": - version: 7.14.5 - resolution: "@babel/plugin-transform-template-literals@npm:7.14.5" +"@babel/plugin-syntax-logical-assignment-operators@npm:^7.8.3": + version: 7.10.4 + resolution: "@babel/plugin-syntax-logical-assignment-operators@npm:7.10.4" dependencies: - "@babel/helper-plugin-utils": ^7.14.5 + "@babel/helper-plugin-utils": ^7.10.4 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 56d273470c16e83bac1bfab5057a64f23191b51460a009b522b3b29806d7a9f64cbd94323836ceb997c4f331b85564f952eb5566c7bd140d0b278f0191a31985 + checksum: aff33577037e34e515911255cdbb1fd39efee33658aa00b8a5fd3a4b903585112d037cce1cc9e4632f0487dc554486106b79ccd5ea63a2e00df4363f6d4ff886 languageName: node linkType: hard -"@babel/plugin-transform-typeof-symbol@npm:^7.14.5": - version: 7.14.5 - resolution: "@babel/plugin-transform-typeof-symbol@npm:7.14.5" +"@babel/plugin-syntax-nullish-coalescing-operator@npm:^7.8.3": + version: 7.8.3 + resolution: "@babel/plugin-syntax-nullish-coalescing-operator@npm:7.8.3" dependencies: - "@babel/helper-plugin-utils": ^7.14.5 + "@babel/helper-plugin-utils": ^7.8.0 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 1e71ec00ea8b64522b8677c030f334cc5b3833a5b7269a152a2ba7a6b36f0e0a4333a61072e69113e4062e71554d4751ef2e3ddd5e81994978123323f266981c + checksum: 87aca4918916020d1fedba54c0e232de408df2644a425d153be368313fdde40d96088feed6c4e5ab72aac89be5d07fef2ddf329a15109c5eb65df006bf2580d1 languageName: node linkType: hard -"@babel/plugin-transform-typescript@npm:^7.15.0": - version: 7.15.0 - resolution: "@babel/plugin-transform-typescript@npm:7.15.0" +"@babel/plugin-syntax-numeric-separator@npm:^7.8.3": + version: 7.10.4 + resolution: "@babel/plugin-syntax-numeric-separator@npm:7.10.4" dependencies: - "@babel/helper-create-class-features-plugin": ^7.15.0 - "@babel/helper-plugin-utils": ^7.14.5 - "@babel/plugin-syntax-typescript": ^7.14.5 + "@babel/helper-plugin-utils": ^7.10.4 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: ec94df8917879c3ef908a20cf9e73ab3379074f7a972a615a8248af29d35d0a145b32feb70e610ac59548947996b6ec3135f4663ed26c7396013424a171e4635 + checksum: 01ec5547bd0497f76cc903ff4d6b02abc8c05f301c88d2622b6d834e33a5651aa7c7a3d80d8d57656a4588f7276eba357f6b7e006482f5b564b7a6488de493a1 languageName: node linkType: hard -"@babel/plugin-transform-unicode-escapes@npm:^7.14.5": - version: 7.14.5 - resolution: "@babel/plugin-transform-unicode-escapes@npm:7.14.5" +"@babel/plugin-syntax-object-rest-spread@npm:^7.8.3": + version: 7.8.3 + resolution: "@babel/plugin-syntax-object-rest-spread@npm:7.8.3" dependencies: - "@babel/helper-plugin-utils": ^7.14.5 + "@babel/helper-plugin-utils": ^7.8.0 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 2a6979c5b886d9c7d9d3887374d75384542fe05a71eb7738b2cde659386089a930d37d1a34ffb4b87def98fbed3526d78b7cd5dd9bffde4d406b368faba81b7d + checksum: fddcf581a57f77e80eb6b981b10658421bc321ba5f0a5b754118c6a92a5448f12a0c336f77b8abf734841e102e5126d69110a306eadb03ca3e1547cab31f5cbf languageName: node linkType: hard -"@babel/plugin-transform-unicode-regex@npm:^7.14.5": - version: 7.14.5 - resolution: "@babel/plugin-transform-unicode-regex@npm:7.14.5" +"@babel/plugin-syntax-optional-catch-binding@npm:^7.8.3": + version: 7.8.3 + resolution: "@babel/plugin-syntax-optional-catch-binding@npm:7.8.3" dependencies: - "@babel/helper-create-regexp-features-plugin": ^7.14.5 - "@babel/helper-plugin-utils": ^7.14.5 + "@babel/helper-plugin-utils": ^7.8.0 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 1b7a4c0dc6b07390f991e7cac8409f7a1ae74495d94b9e1fb5a716d5362a349a35717cfad883074e3f80e16bb630bbd1986a3436f739f6b01c30a96ef3f9ea9a + checksum: 910d90e72bc90ea1ce698e89c1027fed8845212d5ab588e35ef91f13b93143845f94e2539d831dc8d8ededc14ec02f04f7bd6a8179edd43a326c784e7ed7f0b9 languageName: node linkType: hard -"@babel/preset-env@npm:^7.15.0": - version: 7.15.0 - resolution: "@babel/preset-env@npm:7.15.0" +"@babel/plugin-syntax-optional-chaining@npm:^7.8.3": + version: 7.8.3 + resolution: "@babel/plugin-syntax-optional-chaining@npm:7.8.3" dependencies: - "@babel/compat-data": ^7.15.0 - "@babel/helper-compilation-targets": ^7.15.0 - "@babel/helper-plugin-utils": ^7.14.5 - "@babel/helper-validator-option": ^7.14.5 - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": ^7.14.5 - "@babel/plugin-proposal-async-generator-functions": ^7.14.9 - "@babel/plugin-proposal-class-properties": ^7.14.5 - "@babel/plugin-proposal-class-static-block": ^7.14.5 - "@babel/plugin-proposal-dynamic-import": ^7.14.5 - "@babel/plugin-proposal-export-namespace-from": ^7.14.5 - "@babel/plugin-proposal-json-strings": ^7.14.5 - "@babel/plugin-proposal-logical-assignment-operators": ^7.14.5 - "@babel/plugin-proposal-nullish-coalescing-operator": ^7.14.5 - "@babel/plugin-proposal-numeric-separator": ^7.14.5 - "@babel/plugin-proposal-object-rest-spread": ^7.14.7 - "@babel/plugin-proposal-optional-catch-binding": ^7.14.5 - "@babel/plugin-proposal-optional-chaining": ^7.14.5 - "@babel/plugin-proposal-private-methods": ^7.14.5 - "@babel/plugin-proposal-private-property-in-object": ^7.14.5 - "@babel/plugin-proposal-unicode-property-regex": ^7.14.5 - "@babel/plugin-syntax-async-generators": ^7.8.4 - "@babel/plugin-syntax-class-properties": ^7.12.13 - "@babel/plugin-syntax-class-static-block": ^7.14.5 - "@babel/plugin-syntax-dynamic-import": ^7.8.3 - "@babel/plugin-syntax-export-namespace-from": ^7.8.3 - "@babel/plugin-syntax-json-strings": ^7.8.3 - "@babel/plugin-syntax-logical-assignment-operators": ^7.10.4 - "@babel/plugin-syntax-nullish-coalescing-operator": ^7.8.3 - "@babel/plugin-syntax-numeric-separator": ^7.10.4 - "@babel/plugin-syntax-object-rest-spread": ^7.8.3 - "@babel/plugin-syntax-optional-catch-binding": ^7.8.3 - "@babel/plugin-syntax-optional-chaining": ^7.8.3 - "@babel/plugin-syntax-private-property-in-object": ^7.14.5 - "@babel/plugin-syntax-top-level-await": ^7.14.5 - "@babel/plugin-transform-arrow-functions": ^7.14.5 - "@babel/plugin-transform-async-to-generator": ^7.14.5 - "@babel/plugin-transform-block-scoped-functions": ^7.14.5 - "@babel/plugin-transform-block-scoping": ^7.14.5 - "@babel/plugin-transform-classes": ^7.14.9 - "@babel/plugin-transform-computed-properties": ^7.14.5 - "@babel/plugin-transform-destructuring": ^7.14.7 - "@babel/plugin-transform-dotall-regex": ^7.14.5 - "@babel/plugin-transform-duplicate-keys": ^7.14.5 - "@babel/plugin-transform-exponentiation-operator": ^7.14.5 - "@babel/plugin-transform-for-of": ^7.14.5 - "@babel/plugin-transform-function-name": ^7.14.5 - "@babel/plugin-transform-literals": ^7.14.5 - "@babel/plugin-transform-member-expression-literals": ^7.14.5 - "@babel/plugin-transform-modules-amd": ^7.14.5 - "@babel/plugin-transform-modules-commonjs": ^7.15.0 - "@babel/plugin-transform-modules-systemjs": ^7.14.5 - "@babel/plugin-transform-modules-umd": ^7.14.5 - "@babel/plugin-transform-named-capturing-groups-regex": ^7.14.9 - "@babel/plugin-transform-new-target": ^7.14.5 - "@babel/plugin-transform-object-super": ^7.14.5 - "@babel/plugin-transform-parameters": ^7.14.5 - "@babel/plugin-transform-property-literals": ^7.14.5 - "@babel/plugin-transform-regenerator": ^7.14.5 - "@babel/plugin-transform-reserved-words": ^7.14.5 - "@babel/plugin-transform-shorthand-properties": ^7.14.5 - "@babel/plugin-transform-spread": ^7.14.6 - "@babel/plugin-transform-sticky-regex": ^7.14.5 - "@babel/plugin-transform-template-literals": ^7.14.5 - "@babel/plugin-transform-typeof-symbol": ^7.14.5 - "@babel/plugin-transform-unicode-escapes": ^7.14.5 - "@babel/plugin-transform-unicode-regex": ^7.14.5 - "@babel/preset-modules": ^0.1.4 - "@babel/types": ^7.15.0 - babel-plugin-polyfill-corejs2: ^0.2.2 - babel-plugin-polyfill-corejs3: ^0.2.2 - babel-plugin-polyfill-regenerator: ^0.2.2 - core-js-compat: ^3.16.0 - semver: ^6.3.0 + "@babel/helper-plugin-utils": ^7.8.0 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 22768426910f23d288b3ef280c89b64e36bebfc236e08d6989294a242c4f6844aa1d3f0d64f57f1c2850ce25bfa886b9ad060a62d25f18cff1673d22b0e6727d + checksum: eef94d53a1453361553c1f98b68d17782861a04a392840341bc91780838dd4e695209c783631cf0de14c635758beafb6a3a65399846ffa4386bff90639347f30 languageName: node linkType: hard -"@babel/preset-modules@npm:^0.1.4": - version: 0.1.4 - resolution: "@babel/preset-modules@npm:0.1.4" +"@babel/plugin-syntax-top-level-await@npm:^7.8.3": + version: 7.14.5 + resolution: "@babel/plugin-syntax-top-level-await@npm:7.14.5" dependencies: - "@babel/helper-plugin-utils": ^7.0.0 - "@babel/plugin-proposal-unicode-property-regex": ^7.4.4 - "@babel/plugin-transform-dotall-regex": ^7.4.4 - "@babel/types": ^7.4.4 - esutils: ^2.0.2 + "@babel/helper-plugin-utils": ^7.14.5 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 7c6500be06be9a341e377eb63292a4a22d0da2b4fb8c68714aff703ddb341cbd58e37d4119d64fc3e602f73801103af471fca2c60b4c1e48e08eea3e6b1afc93 + checksum: bbd1a56b095be7820029b209677b194db9b1d26691fe999856462e66b25b281f031f3dfd91b1619e9dcf95bebe336211833b854d0fb8780d618e35667c2d0d7e languageName: node linkType: hard -"@babel/preset-typescript@npm:^7.15.0": - version: 7.15.0 - resolution: "@babel/preset-typescript@npm:7.15.0" +"@babel/plugin-syntax-typescript@npm:^7.7.2": + version: 7.14.5 + resolution: "@babel/plugin-syntax-typescript@npm:7.14.5" dependencies: "@babel/helper-plugin-utils": ^7.14.5 - "@babel/helper-validator-option": ^7.14.5 - "@babel/plugin-transform-typescript": ^7.15.0 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 2c480bb0ef76418357d92ccfae67df544a069ca8f59785e8bd0d1d3111bfc671f9f04672583506f1ee62afc3872bf21ed85d6d0c97ba1bc09a6efd1f7c20a10f - languageName: node - linkType: hard - -"@babel/runtime@npm:^7.8.4": - version: 7.15.3 - resolution: "@babel/runtime@npm:7.15.3" - dependencies: - regenerator-runtime: ^0.13.4 - checksum: 2f0b8d2d4e36035ab1d84af0ec26aafa098536870f27c8e07de0a0e398f7a394fdea68a88165535ffb52ded6a68912bdc3450bdf91f229eb132e1c89470789f5 + checksum: 5447d13b31aeeeaa5c2b945e60a598642dedca480f11d3232b0927aeb6a6bb8201a0025f509bc23851da4bf126f69b0522790edbd58f4560f0a4984cabd0d126 languageName: node linkType: hard @@ -1282,7 +386,7 @@ __metadata: languageName: node linkType: hard -"@babel/traverse@npm:^7.1.0, @babel/traverse@npm:^7.13.0, @babel/traverse@npm:^7.14.5, @babel/traverse@npm:^7.15.0, @babel/traverse@npm:^7.7.2": +"@babel/traverse@npm:^7.1.0, @babel/traverse@npm:^7.15.0, @babel/traverse@npm:^7.7.2": version: 7.15.0 resolution: "@babel/traverse@npm:7.15.0" dependencies: @@ -1299,7 +403,7 @@ __metadata: languageName: node linkType: hard -"@babel/types@npm:^7, @babel/types@npm:^7.0.0, @babel/types@npm:^7.14.5, @babel/types@npm:^7.14.8, @babel/types@npm:^7.15.0, @babel/types@npm:^7.3.0, @babel/types@npm:^7.3.3, @babel/types@npm:^7.4.4, @babel/types@npm:^7.8.3": +"@babel/types@npm:^7.0.0, @babel/types@npm:^7.14.5, @babel/types@npm:^7.14.8, @babel/types@npm:^7.15.0, @babel/types@npm:^7.3.0, @babel/types@npm:^7.3.3, @babel/types@npm:^7.8.3": version: 7.15.0 resolution: "@babel/types@npm:7.15.0" dependencies: @@ -1604,6 +708,15 @@ __metadata: languageName: node linkType: hard +"@jest/create-cache-key-function@npm:^29.7.0": + version: 29.7.0 + resolution: "@jest/create-cache-key-function@npm:29.7.0" + dependencies: + "@jest/types": ^29.6.3 + checksum: 681bc761fa1d6fa3dd77578d444f97f28296ea80755e90e46d1c8fa68661b9e67f54dd38b988742db636d26cf160450dc6011892cec98b3a7ceb58cad8ff3aae + languageName: node + linkType: hard + "@jest/environment@npm:^27.0.6": version: 27.0.6 resolution: "@jest/environment@npm:27.0.6" @@ -1678,6 +791,15 @@ __metadata: languageName: node linkType: hard +"@jest/schemas@npm:^29.6.3": + version: 29.6.3 + resolution: "@jest/schemas@npm:29.6.3" + dependencies: + "@sinclair/typebox": ^0.27.8 + checksum: 910040425f0fc93cd13e68c750b7885590b8839066dfa0cd78e7def07bbb708ad869381f725945d66f2284de5663bbecf63e8fdd856e2ae6e261ba30b1687e93 + languageName: node + linkType: hard + "@jest/source-map@npm:^27.0.6": version: 27.0.6 resolution: "@jest/source-map@npm:27.0.6" @@ -1749,6 +871,72 @@ __metadata: languageName: node linkType: hard +"@jest/types@npm:^29.6.3": + version: 29.6.3 + resolution: "@jest/types@npm:29.6.3" + dependencies: + "@jest/schemas": ^29.6.3 + "@types/istanbul-lib-coverage": ^2.0.0 + "@types/istanbul-reports": ^3.0.0 + "@types/node": "*" + "@types/yargs": ^17.0.8 + chalk: ^4.0.0 + checksum: a0bcf15dbb0eca6bdd8ce61a3fb055349d40268622a7670a3b2eb3c3dbafe9eb26af59938366d520b86907b9505b0f9b29b85cec11579a9e580694b87cd90fcc + languageName: node + linkType: hard + +"@jridgewell/gen-mapping@npm:^0.3.5": + version: 0.3.5 + resolution: "@jridgewell/gen-mapping@npm:0.3.5" + dependencies: + "@jridgewell/set-array": ^1.2.1 + "@jridgewell/sourcemap-codec": ^1.4.10 + "@jridgewell/trace-mapping": ^0.3.24 + checksum: ff7a1764ebd76a5e129c8890aa3e2f46045109dabde62b0b6c6a250152227647178ff2069ea234753a690d8f3c4ac8b5e7b267bbee272bffb7f3b0a370ab6e52 + languageName: node + linkType: hard + +"@jridgewell/resolve-uri@npm:^3.1.0": + version: 3.1.2 + resolution: "@jridgewell/resolve-uri@npm:3.1.2" + checksum: 83b85f72c59d1c080b4cbec0fef84528963a1b5db34e4370fa4bd1e3ff64a0d80e0cee7369d11d73c704e0286fb2865b530acac7a871088fbe92b5edf1000870 + languageName: node + linkType: hard + +"@jridgewell/set-array@npm:^1.2.1": + version: 1.2.1 + resolution: "@jridgewell/set-array@npm:1.2.1" + checksum: 832e513a85a588f8ed4f27d1279420d8547743cc37fcad5a5a76fc74bb895b013dfe614d0eed9cb860048e6546b798f8f2652020b4b2ba0561b05caa8c654b10 + languageName: node + linkType: hard + +"@jridgewell/source-map@npm:^0.3.3": + version: 0.3.6 + resolution: "@jridgewell/source-map@npm:0.3.6" + dependencies: + "@jridgewell/gen-mapping": ^0.3.5 + "@jridgewell/trace-mapping": ^0.3.25 + checksum: c9dc7d899397df95e3c9ec287b93c0b56f8e4453cd20743e2b9c8e779b1949bc3cccf6c01bb302779e46560eb45f62ea38d19fedd25370d814734268450a9f30 + languageName: node + linkType: hard + +"@jridgewell/sourcemap-codec@npm:^1.4.10, @jridgewell/sourcemap-codec@npm:^1.4.14": + version: 1.4.15 + resolution: "@jridgewell/sourcemap-codec@npm:1.4.15" + checksum: b881c7e503db3fc7f3c1f35a1dd2655a188cc51a3612d76efc8a6eb74728bef5606e6758ee77423e564092b4a518aba569bbb21c9bac5ab7a35b0c6ae7e344c8 + languageName: node + linkType: hard + +"@jridgewell/trace-mapping@npm:^0.3.24, @jridgewell/trace-mapping@npm:^0.3.25": + version: 0.3.25 + resolution: "@jridgewell/trace-mapping@npm:0.3.25" + dependencies: + "@jridgewell/resolve-uri": ^3.1.0 + "@jridgewell/sourcemap-codec": ^1.4.14 + checksum: 9d3c40d225e139987b50c48988f8717a54a8c994d8a948ee42e1412e08988761d0754d7d10b803061cc3aebf35f92a5dbbab493bd0e1a9ef9e89a2130e83ba34 + languageName: node + linkType: hard + "@nodelib/fs.scandir@npm:2.1.4": version: 2.1.4 resolution: "@nodelib/fs.scandir@npm:2.1.4" @@ -1759,62 +947,214 @@ __metadata: languageName: node linkType: hard -"@nodelib/fs.stat@npm:2.0.4, @nodelib/fs.stat@npm:^2.0.2": - version: 2.0.4 - resolution: "@nodelib/fs.stat@npm:2.0.4" - checksum: d0d9745f878816d041a8b36faf5797d88ba961274178f0ad1f7fe0efef8118ca9bd0e43e4d0d85a9af911bd35122ec1580e626a83d7595fc4d60f2c1c70e2665 +"@nodelib/fs.stat@npm:2.0.4, @nodelib/fs.stat@npm:^2.0.2": + version: 2.0.4 + resolution: "@nodelib/fs.stat@npm:2.0.4" + checksum: d0d9745f878816d041a8b36faf5797d88ba961274178f0ad1f7fe0efef8118ca9bd0e43e4d0d85a9af911bd35122ec1580e626a83d7595fc4d60f2c1c70e2665 + languageName: node + linkType: hard + +"@nodelib/fs.walk@npm:^1.2.3": + version: 1.2.6 + resolution: "@nodelib/fs.walk@npm:1.2.6" + dependencies: + "@nodelib/fs.scandir": 2.1.4 + fastq: ^1.6.0 + checksum: d156901823b3d3de368ad68047a964523e0ce5f796c0aa7712443b1f748d8e7fc24ce2c0f18d22a177e1f1c6092bca609ab5e4cb1792c41cdc8a6989bc391139 + languageName: node + linkType: hard + +"@npmcli/move-file@npm:^1.0.1": + version: 1.1.2 + resolution: "@npmcli/move-file@npm:1.1.2" + dependencies: + mkdirp: ^1.0.4 + rimraf: ^3.0.2 + checksum: c96381d4a37448ea280951e46233f7e541058cf57a57d4094dd4bdcaae43fa5872b5f2eb6bfb004591a68e29c5877abe3cdc210cb3588cbf20ab2877f31a7de7 + languageName: node + linkType: hard + +"@polka/url@npm:^1.0.0-next.9": + version: 1.0.0-next.11 + resolution: "@polka/url@npm:1.0.0-next.11" + checksum: db1626fb6d7167ce2de6223c95f0a5ff8e1e7c56b2e8709f904f219d8fcc7b075de842ea8bf0ed7af9f5bc350b166b286b241636982f10d0f02964f34215a0e0 + languageName: node + linkType: hard + +"@popperjs/core@npm:^2.9.3": + version: 2.9.3 + resolution: "@popperjs/core@npm:2.9.3" + checksum: 4cb94c271eaa13416ab8169c6af778c5b6160614351a79c68e8219d6ee0a40b8f71080ca29e139591c7c0c8e08fc1627d0e18d40a64609713a42b58d683a009d + languageName: node + linkType: hard + +"@sinclair/typebox@npm:^0.27.8": + version: 0.27.8 + resolution: "@sinclair/typebox@npm:0.27.8" + checksum: 00bd7362a3439021aa1ea51b0e0d0a0e8ca1351a3d54c606b115fdcc49b51b16db6e5f43b4fe7a28c38688523e22a94d49dd31168868b655f0d4d50f032d07a1 + languageName: node + linkType: hard + +"@sinonjs/commons@npm:^1.7.0": + version: 1.8.2 + resolution: "@sinonjs/commons@npm:1.8.2" + dependencies: + type-detect: 4.0.8 + checksum: 67aa47d4a19e688da5c291286786635625356d6dc379d86f255c8425b9da3dfd26d07cfef82aad755ad51bd1a889bde07abd1e1592f9f5b3e29013045738e344 + languageName: node + linkType: hard + +"@sinonjs/fake-timers@npm:^7.0.2": + version: 7.1.2 + resolution: "@sinonjs/fake-timers@npm:7.1.2" + dependencies: + "@sinonjs/commons": ^1.7.0 + checksum: c84773d7973edad5511a31d2cc75023447b5cf714a84de9bb50eda45dda88a0d3bd2c30bf6e6e936da50a048d5352e2151c694e13e59b97d187ba1f329e9a00c + languageName: node + linkType: hard + +"@swc/core-darwin-arm64@npm:1.5.24": + version: 1.5.24 + resolution: "@swc/core-darwin-arm64@npm:1.5.24" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + +"@swc/core-darwin-x64@npm:1.5.24": + version: 1.5.24 + resolution: "@swc/core-darwin-x64@npm:1.5.24" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + +"@swc/core-linux-arm-gnueabihf@npm:1.5.24": + version: 1.5.24 + resolution: "@swc/core-linux-arm-gnueabihf@npm:1.5.24" + conditions: os=linux & cpu=arm + languageName: node + linkType: hard + +"@swc/core-linux-arm64-gnu@npm:1.5.24": + version: 1.5.24 + resolution: "@swc/core-linux-arm64-gnu@npm:1.5.24" + conditions: os=linux & cpu=arm64 & libc=glibc + languageName: node + linkType: hard + +"@swc/core-linux-arm64-musl@npm:1.5.24": + version: 1.5.24 + resolution: "@swc/core-linux-arm64-musl@npm:1.5.24" + conditions: os=linux & cpu=arm64 & libc=musl + languageName: node + linkType: hard + +"@swc/core-linux-x64-gnu@npm:1.5.24": + version: 1.5.24 + resolution: "@swc/core-linux-x64-gnu@npm:1.5.24" + conditions: os=linux & cpu=x64 & libc=glibc + languageName: node + linkType: hard + +"@swc/core-linux-x64-musl@npm:1.5.24": + version: 1.5.24 + resolution: "@swc/core-linux-x64-musl@npm:1.5.24" + conditions: os=linux & cpu=x64 & libc=musl + languageName: node + linkType: hard + +"@swc/core-win32-arm64-msvc@npm:1.5.24": + version: 1.5.24 + resolution: "@swc/core-win32-arm64-msvc@npm:1.5.24" + conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"@nodelib/fs.walk@npm:^1.2.3": - version: 1.2.6 - resolution: "@nodelib/fs.walk@npm:1.2.6" - dependencies: - "@nodelib/fs.scandir": 2.1.4 - fastq: ^1.6.0 - checksum: d156901823b3d3de368ad68047a964523e0ce5f796c0aa7712443b1f748d8e7fc24ce2c0f18d22a177e1f1c6092bca609ab5e4cb1792c41cdc8a6989bc391139 +"@swc/core-win32-ia32-msvc@npm:1.5.24": + version: 1.5.24 + resolution: "@swc/core-win32-ia32-msvc@npm:1.5.24" + conditions: os=win32 & cpu=ia32 languageName: node linkType: hard -"@npmcli/move-file@npm:^1.0.1": - version: 1.1.2 - resolution: "@npmcli/move-file@npm:1.1.2" - dependencies: - mkdirp: ^1.0.4 - rimraf: ^3.0.2 - checksum: c96381d4a37448ea280951e46233f7e541058cf57a57d4094dd4bdcaae43fa5872b5f2eb6bfb004591a68e29c5877abe3cdc210cb3588cbf20ab2877f31a7de7 +"@swc/core-win32-x64-msvc@npm:1.5.24": + version: 1.5.24 + resolution: "@swc/core-win32-x64-msvc@npm:1.5.24" + conditions: os=win32 & cpu=x64 languageName: node linkType: hard -"@polka/url@npm:^1.0.0-next.9": - version: 1.0.0-next.11 - resolution: "@polka/url@npm:1.0.0-next.11" - checksum: db1626fb6d7167ce2de6223c95f0a5ff8e1e7c56b2e8709f904f219d8fcc7b075de842ea8bf0ed7af9f5bc350b166b286b241636982f10d0f02964f34215a0e0 +"@swc/core@npm:^1.5.24": + version: 1.5.24 + resolution: "@swc/core@npm:1.5.24" + dependencies: + "@swc/core-darwin-arm64": 1.5.24 + "@swc/core-darwin-x64": 1.5.24 + "@swc/core-linux-arm-gnueabihf": 1.5.24 + "@swc/core-linux-arm64-gnu": 1.5.24 + "@swc/core-linux-arm64-musl": 1.5.24 + "@swc/core-linux-x64-gnu": 1.5.24 + "@swc/core-linux-x64-musl": 1.5.24 + "@swc/core-win32-arm64-msvc": 1.5.24 + "@swc/core-win32-ia32-msvc": 1.5.24 + "@swc/core-win32-x64-msvc": 1.5.24 + "@swc/counter": ^0.1.3 + "@swc/types": ^0.1.7 + peerDependencies: + "@swc/helpers": "*" + dependenciesMeta: + "@swc/core-darwin-arm64": + optional: true + "@swc/core-darwin-x64": + optional: true + "@swc/core-linux-arm-gnueabihf": + optional: true + "@swc/core-linux-arm64-gnu": + optional: true + "@swc/core-linux-arm64-musl": + optional: true + "@swc/core-linux-x64-gnu": + optional: true + "@swc/core-linux-x64-musl": + optional: true + "@swc/core-win32-arm64-msvc": + optional: true + "@swc/core-win32-ia32-msvc": + optional: true + "@swc/core-win32-x64-msvc": + optional: true + peerDependenciesMeta: + "@swc/helpers": + optional: true + checksum: eafbcf5ea93540dc7cb0802c8ae8df5e995f586611195647e70d966bb6407e8233d31c3d954da58eb158a0c9a57d9207e52bb1518579de64cd34b67b025acc14 languageName: node linkType: hard -"@popperjs/core@npm:^2.9.3": - version: 2.9.3 - resolution: "@popperjs/core@npm:2.9.3" - checksum: 4cb94c271eaa13416ab8169c6af778c5b6160614351a79c68e8219d6ee0a40b8f71080ca29e139591c7c0c8e08fc1627d0e18d40a64609713a42b58d683a009d +"@swc/counter@npm:^0.1.3": + version: 0.1.3 + resolution: "@swc/counter@npm:0.1.3" + checksum: df8f9cfba9904d3d60f511664c70d23bb323b3a0803ec9890f60133954173047ba9bdeabce28cd70ba89ccd3fd6c71c7b0bd58be85f611e1ffbe5d5c18616598 languageName: node linkType: hard -"@sinonjs/commons@npm:^1.7.0": - version: 1.8.2 - resolution: "@sinonjs/commons@npm:1.8.2" +"@swc/jest@npm:^0.2.36": + version: 0.2.36 + resolution: "@swc/jest@npm:0.2.36" dependencies: - type-detect: 4.0.8 - checksum: 67aa47d4a19e688da5c291286786635625356d6dc379d86f255c8425b9da3dfd26d07cfef82aad755ad51bd1a889bde07abd1e1592f9f5b3e29013045738e344 + "@jest/create-cache-key-function": ^29.7.0 + "@swc/counter": ^0.1.3 + jsonc-parser: ^3.2.0 + peerDependencies: + "@swc/core": "*" + checksum: 14f2e696ac093e23dae1e2e57d894bbcde4de6fe80341a26c8d0d8cbae5aae31832f8fa32dc698529f128d19a76aeedf2227f59480de6dab5eb3f30bfdf9b71a languageName: node linkType: hard -"@sinonjs/fake-timers@npm:^7.0.2": - version: 7.1.2 - resolution: "@sinonjs/fake-timers@npm:7.1.2" +"@swc/types@npm:^0.1.7": + version: 0.1.7 + resolution: "@swc/types@npm:0.1.7" dependencies: - "@sinonjs/commons": ^1.7.0 - checksum: c84773d7973edad5511a31d2cc75023447b5cf714a84de9bb50eda45dda88a0d3bd2c30bf6e6e936da50a048d5352e2151c694e13e59b97d187ba1f329e9a00c + "@swc/counter": ^0.1.3 + checksum: e251f6994de12a2a81ed79d902a521398feda346022e09567c758eee1cca606743c9bb296de74d6fbe339f953eaf69176202babc8ef9c911d5d538fc0790df28 languageName: node linkType: hard @@ -1948,7 +1288,7 @@ __metadata: languageName: node linkType: hard -"@types/json-schema@npm:*, @types/json-schema@npm:^7.0.5, @types/json-schema@npm:^7.0.8": +"@types/json-schema@npm:*, @types/json-schema@npm:^7.0.8": version: 7.0.9 resolution: "@types/json-schema@npm:7.0.9" checksum: 259d0e25f11a21ba5c708f7ea47196bd396e379fddb79c76f9f4f62c945879dc21657904914313ec2754e443c5018ea8372362f323f30e0792897fdb2098a705 @@ -1983,6 +1323,32 @@ __metadata: languageName: node linkType: hard +"@types/prop-types@npm:*": + version: 15.7.12 + resolution: "@types/prop-types@npm:15.7.12" + checksum: ac16cc3d0a84431ffa5cfdf89579ad1e2269549f32ce0c769321fdd078f84db4fbe1b461ed5a1a496caf09e637c0e367d600c541435716a55b1d9713f5035dfe + languageName: node + linkType: hard + +"@types/react-dom@npm:^18.3.0": + version: 18.3.0 + resolution: "@types/react-dom@npm:18.3.0" + dependencies: + "@types/react": "*" + checksum: a0cd9b1b815a6abd2a367a9eabdd8df8dd8f13f95897b2f9e1359ea3ac6619f957c1432ece004af7d95e2a7caddbba19faa045f831f32d6263483fc5404a7596 + languageName: node + linkType: hard + +"@types/react@npm:*, @types/react@npm:^18.3.3": + version: 18.3.3 + resolution: "@types/react@npm:18.3.3" + dependencies: + "@types/prop-types": "*" + csstype: ^3.0.2 + checksum: c63d6a78163244e2022b01ef79b0baec4fe4da3475dc4a90bb8accefad35ef0c43560fd0312e5974f92a0f1108aa4d669ac72d73d66396aa060ea03b5d2e3873 + languageName: node + linkType: hard + "@types/stack-utils@npm:^2.0.0": version: 2.0.0 resolution: "@types/stack-utils@npm:2.0.0" @@ -2031,6 +1397,15 @@ __metadata: languageName: node linkType: hard +"@types/yargs@npm:^17.0.8": + version: 17.0.32 + resolution: "@types/yargs@npm:17.0.32" + dependencies: + "@types/yargs-parser": "*" + checksum: 4505bdebe8716ff383640c6e928f855b5d337cb3c68c81f7249fc6b983d0aa48de3eee26062b84f37e0d75a5797bc745e0c6e76f42f81771252a758c638f36ba + languageName: node + linkType: hard + "@typescript-eslint/parser@npm:^4.29.1": version: 4.29.1 resolution: "@typescript-eslint/parser@npm:4.29.1" @@ -2372,6 +1747,15 @@ __metadata: languageName: node linkType: hard +"acorn@npm:^8.8.2": + version: 8.11.3 + resolution: "acorn@npm:8.11.3" + bin: + acorn: bin/acorn + checksum: 76d8e7d559512566b43ab4aadc374f11f563f0a9e21626dd59cb2888444e9445923ae9f3699972767f18af61df89cd89f5eaaf772d1327b055b45cb829b4a88c + languageName: node + linkType: hard + "agent-base@npm:6, agent-base@npm:^6.0.2": version: 6.0.2 resolution: "agent-base@npm:6.0.2" @@ -2669,43 +2053,6 @@ __metadata: languageName: node linkType: hard -"babel-loader@npm:^8.2.2": - version: 8.2.2 - resolution: "babel-loader@npm:8.2.2" - dependencies: - find-cache-dir: ^3.3.1 - loader-utils: ^1.4.0 - make-dir: ^3.1.0 - schema-utils: ^2.6.5 - peerDependencies: - "@babel/core": ^7.0.0 - webpack: ">=2" - checksum: df5092ef9886bb49aacb7c58ac40ed0681ced031c8d91e49d680cedace2aa1703390a31fbe7c0e409f739836e911c5c991119133d90d9289f681c0a8ff2447a1 - languageName: node - linkType: hard - -"babel-plugin-dynamic-import-node@npm:^2.3.3": - version: 2.3.3 - resolution: "babel-plugin-dynamic-import-node@npm:2.3.3" - dependencies: - object.assign: ^4.1.0 - checksum: c9d24415bcc608d0db7d4c8540d8002ac2f94e2573d2eadced137a29d9eab7e25d2cbb4bc6b9db65cf6ee7430f7dd011d19c911a9a778f0533b4a05ce8292c9b - languageName: node - linkType: hard - -"babel-plugin-inferno@npm:^6.3.0": - version: 6.3.0 - resolution: "babel-plugin-inferno@npm:6.3.0" - dependencies: - "@babel/plugin-syntax-jsx": ^7 - "@babel/types": ^7 - peerDependencies: - "@babel/core": ^7 - inferno: ">=7" - checksum: 74b20f53083160a1edb96256881a14c347a1eee4942baa6d0143e8b9e10eecf55fb4ee8f3ff05a45041950df4cb2103820a647f5da2e7cd1766b4c4d13412751 - languageName: node - linkType: hard - "babel-plugin-istanbul@npm:^6.0.0": version: 6.0.0 resolution: "babel-plugin-istanbul@npm:6.0.0" @@ -2731,49 +2078,6 @@ __metadata: languageName: node linkType: hard -"babel-plugin-polyfill-corejs2@npm:^0.2.2": - version: 0.2.2 - resolution: "babel-plugin-polyfill-corejs2@npm:0.2.2" - dependencies: - "@babel/compat-data": ^7.13.11 - "@babel/helper-define-polyfill-provider": ^0.2.2 - semver: ^6.1.1 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: eee45ecce743e06840d29936a7f4a9f9eca19552ba010e9f3676c6a2697ab815230f39953296b72f09665de0e8fffe260e52b348011a9ddba36cfa7eec6f8c51 - languageName: node - linkType: hard - -"babel-plugin-polyfill-corejs3@npm:^0.2.2": - version: 0.2.4 - resolution: "babel-plugin-polyfill-corejs3@npm:0.2.4" - dependencies: - "@babel/helper-define-polyfill-provider": ^0.2.2 - core-js-compat: ^3.14.0 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 49e9b1709fd76bff8b577da38548d05ec0317acaa9cba893bf447af7b0f26494d635b70814452782d079b2b6f25c09dd8fa76e151c0e4ae1397e8295af14e685 - languageName: node - linkType: hard - -"babel-plugin-polyfill-regenerator@npm:^0.2.2": - version: 0.2.2 - resolution: "babel-plugin-polyfill-regenerator@npm:0.2.2" - dependencies: - "@babel/helper-define-polyfill-provider": ^0.2.2 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 3e32e318fd91d65c3af2bb363189f00d3839f07a73a08813b553553e07da205162091b428dd5b6ffb6ea4caf531ff43ebc54197b0a5a9dc2fc5c7e9a650e946d - languageName: node - linkType: hard - -"babel-plugin-transform-remove-console@npm:^6.9.4": - version: 6.9.4 - resolution: "babel-plugin-transform-remove-console@npm:6.9.4" - checksum: 1123c3816c6f89c064752199c8796f30265d937f5d8e1e43d3837f1c0e87ed0e6bbd0afa6117ce021c8b93ec1de7154e158674bb22331c7ed6609d10121359df - languageName: node - linkType: hard - "babel-preset-current-node-syntax@npm:^1.0.0": version: 1.0.1 resolution: "babel-preset-current-node-syntax@npm:1.0.1" @@ -2873,7 +2177,7 @@ __metadata: languageName: node linkType: hard -"browserslist@npm:^4.14.5, browserslist@npm:^4.16.6, browserslist@npm:^4.16.7": +"browserslist@npm:^4.14.5, browserslist@npm:^4.16.6": version: 4.16.7 resolution: "browserslist@npm:4.16.7" dependencies: @@ -3240,13 +2544,6 @@ __metadata: languageName: unknown linkType: soft -"commondir@npm:^1.0.1": - version: 1.0.1 - resolution: "commondir@npm:1.0.1" - checksum: 59715f2fc456a73f68826285718503340b9f0dd89bfffc42749906c5cf3d4277ef11ef1cca0350d0e79204f00f1f6d83851ececc9095dc88512a697ac0b9bdcb - languageName: node - linkType: hard - "concat-map@npm:0.0.1": version: 0.0.1 resolution: "concat-map@npm:0.0.1" @@ -3297,20 +2594,10 @@ __metadata: languageName: node linkType: hard -"core-js-compat@npm:^3.14.0, core-js-compat@npm:^3.16.0": - version: 3.16.1 - resolution: "core-js-compat@npm:3.16.1" - dependencies: - browserslist: ^4.16.7 - semver: 7.0.0 - checksum: fbbc054f6d1cc0e172846b39b264c7c9ef5405390a6d5e1ff7bda7c71457932e112fcf861e1c6171505a2e407407db32b99cd24badcc79a5d08fd04e46076c4d - languageName: node - linkType: hard - -"core-js@npm:^3.16.1": - version: 3.16.1 - resolution: "core-js@npm:3.16.1" - checksum: 7924fa2a7f00e3a33bbe92fe42ba59fbbe7e01557a59824d000976300be3ba224cca20161f61654b3861ea80d244d6adfee6ed3ae6d6d9931210a37510fb7c9b +"core-js@npm:^3.37.1": + version: 3.37.1 + resolution: "core-js@npm:3.37.1" + checksum: 2d58a5c599f05c3e04abc8bc5e64b88eb17d914c0f552f670fb800afa74ec54b4fcc7f231ad6bd45badaf62c0fb0ce30e6fe89cedb6bb6d54e6f19115c3c17ff languageName: node linkType: hard @@ -3384,6 +2671,13 @@ __metadata: languageName: node linkType: hard +"csstype@npm:^3.0.2": + version: 3.1.3 + resolution: "csstype@npm:3.1.3" + checksum: 8db785cc92d259102725b3c694ec0c823f5619a84741b5c7991b8ad135dfaa66093038a1cc63e03361a6cd28d122be48f2106ae72334e067dd619a51f49eddf7 + languageName: node + linkType: hard + "cubic2quad@npm:^1.0.0": version: 1.1.1 resolution: "cubic2quad@npm:1.1.1" @@ -4023,7 +3317,7 @@ __metadata: languageName: node linkType: hard -"eslint-visitor-keys@npm:^2.0.0, eslint-visitor-keys@npm:^2.1.0": +"eslint-visitor-keys@npm:^2.0.0": version: 2.1.0 resolution: "eslint-visitor-keys@npm:2.1.0" checksum: e3081d7dd2611a35f0388bbdc2f5da60b3a3c5b8b6e928daffff7391146b434d691577aa95064c8b7faad0b8a680266bcda0a42439c18c717b80e6718d7e267d @@ -4442,17 +3736,6 @@ __metadata: languageName: node linkType: hard -"find-cache-dir@npm:^3.3.1": - version: 3.3.1 - resolution: "find-cache-dir@npm:3.3.1" - dependencies: - commondir: ^1.0.1 - make-dir: ^3.0.2 - pkg-dir: ^4.1.0 - checksum: 0f7c22b65e07f9b486b4560227d014fab1e79ffbbfbafb87d113a2e878510bd620ef6fdff090e5248bb2846d28851d19e42bfdc7c50687966acc106328e7abf1 - languageName: node - linkType: hard - "find-my-way@npm:^4.1.0": version: 4.3.3 resolution: "find-my-way@npm:4.3.3" @@ -5030,31 +4313,6 @@ __metadata: languageName: node linkType: hard -"inferno-shared@npm:7.4.8": - version: 7.4.8 - resolution: "inferno-shared@npm:7.4.8" - checksum: d9a3204ce75ee2133d2efb5f4f247d82c087631f900ab088a0c87a0259d4cd4719ace583e1dd88b4bc32cacac975995ee3cc16f6603a620f7cd061e2f7d3d650 - languageName: node - linkType: hard - -"inferno-vnode-flags@npm:7.4.8, inferno-vnode-flags@npm:^7.4.8": - version: 7.4.8 - resolution: "inferno-vnode-flags@npm:7.4.8" - checksum: 72f26ebb361482a3312a30c89606c1eee85d7c7a790b2614d0d8567291d6cd7079b7536285b749dbfd5ead77e1546a2f4a676692e3fb08eb90eef009cbabbce0 - languageName: node - linkType: hard - -"inferno@npm:^7.4.8": - version: 7.4.8 - resolution: "inferno@npm:7.4.8" - dependencies: - inferno-shared: 7.4.8 - inferno-vnode-flags: 7.4.8 - opencollective-postinstall: ^2.0.3 - checksum: fa814fcb5f7e865ec29ceee00e6e6d7688cd0dcc9db57ab9619d62de08076ee823ee81c4e47ff3fa6632e896817bda1b45ac8a30b60357197ffcc9a1ef9e0ac0 - languageName: node - linkType: hard - "inflight@npm:^1.0.4": version: 1.0.6 resolution: "inflight@npm:1.0.6" @@ -5972,15 +5230,6 @@ __metadata: languageName: node linkType: hard -"jsesc@npm:~0.5.0": - version: 0.5.0 - resolution: "jsesc@npm:0.5.0" - bin: - jsesc: bin/jsesc - checksum: b8b44cbfc92f198ad972fba706ee6a1dfa7485321ee8c0b25f5cedd538dcb20cde3197de16a7265430fce8277a12db066219369e3d51055038946039f6e20e17 - languageName: node - linkType: hard - "json-parse-even-better-errors@npm:^2.3.1": version: 2.3.1 resolution: "json-parse-even-better-errors@npm:2.3.1" @@ -6023,17 +5272,6 @@ __metadata: languageName: node linkType: hard -"json5@npm:^1.0.1": - version: 1.0.1 - resolution: "json5@npm:1.0.1" - dependencies: - minimist: ^1.2.0 - bin: - json5: lib/cli.js - checksum: e76ea23dbb8fc1348c143da628134a98adf4c5a4e8ea2adaa74a80c455fc2cdf0e2e13e6398ef819bfe92306b610ebb2002668ed9fc1af386d593691ef346fc3 - languageName: node - linkType: hard - "json5@npm:^2.1.2": version: 2.2.0 resolution: "json5@npm:2.2.0" @@ -6045,6 +5283,13 @@ __metadata: languageName: node linkType: hard +"jsonc-parser@npm:^3.2.0": + version: 3.2.1 + resolution: "jsonc-parser@npm:3.2.1" + checksum: 656d9027b91de98d8ab91b3aa0d0a4cab7dc798a6830845ca664f3e76c82d46b973675bbe9b500fae1de37fd3e81aceacbaa2a57884bf2f8f29192150d2d1ef7 + languageName: node + linkType: hard + "jsprim@npm:^1.2.2": version: 1.4.1 resolution: "jsprim@npm:1.4.1" @@ -6135,17 +5380,6 @@ __metadata: languageName: node linkType: hard -"loader-utils@npm:^1.4.0": - version: 1.4.0 - resolution: "loader-utils@npm:1.4.0" - dependencies: - big.js: ^5.2.2 - emojis-list: ^3.0.0 - json5: ^1.0.1 - checksum: d150b15e7a42ac47d935c8b484b79e44ff6ab4c75df7cc4cb9093350cf014ec0b17bdb60c5d6f91a37b8b218bd63b973e263c65944f58ca2573e402b9a27e717 - languageName: node - linkType: hard - "loader-utils@npm:^2.0.0": version: 2.0.0 resolution: "loader-utils@npm:2.0.0" @@ -6184,13 +5418,6 @@ __metadata: languageName: node linkType: hard -"lodash.debounce@npm:^4.0.8": - version: 4.0.8 - resolution: "lodash.debounce@npm:4.0.8" - checksum: a3f527d22c548f43ae31c861ada88b2637eb48ac6aa3eb56e82d44917971b8aa96fbb37aa60efea674dc4ee8c42074f90f7b1f772e9db375435f6c83a19b3bc6 - languageName: node - linkType: hard - "lodash.merge@npm:^4.6.2": version: 4.6.2 resolution: "lodash.merge@npm:4.6.2" @@ -6212,7 +5439,7 @@ __metadata: languageName: node linkType: hard -"loose-envify@npm:^1.4.0": +"loose-envify@npm:^1.1.0, loose-envify@npm:^1.4.0": version: 1.4.0 resolution: "loose-envify@npm:1.4.0" dependencies: @@ -6250,7 +5477,7 @@ __metadata: languageName: node linkType: hard -"make-dir@npm:^3.0.0, make-dir@npm:^3.0.2, make-dir@npm:^3.1.0": +"make-dir@npm:^3.0.0": version: 3.1.0 resolution: "make-dir@npm:3.1.0" dependencies: @@ -6410,7 +5637,7 @@ __metadata: languageName: node linkType: hard -"minimist@npm:^1.2.0, minimist@npm:^1.2.5": +"minimist@npm:^1.2.5": version: 1.2.5 resolution: "minimist@npm:1.2.5" checksum: 86706ce5b36c16bfc35c5fe3dbb01d5acdc9a22f2b6cc810b6680656a1d2c0e44a0159c9a3ba51fb072bb5c203e49e10b51dcd0eec39c481f4c42086719bae52 @@ -6731,7 +5958,7 @@ __metadata: languageName: node linkType: hard -"object.assign@npm:^4.1.0, object.assign@npm:^4.1.2": +"object.assign@npm:^4.1.2": version: 4.1.2 resolution: "object.assign@npm:4.1.2" dependencies: @@ -6804,15 +6031,6 @@ __metadata: languageName: node linkType: hard -"opencollective-postinstall@npm:^2.0.3": - version: 2.0.3 - resolution: "opencollective-postinstall@npm:2.0.3" - bin: - opencollective-postinstall: index.js - checksum: 0a68c5cef135e46d11e665d5077398285d1ce5311c948e8327b435791c409744d4a6bb9c55bd6507fb5f2ef34b0ad920565adcdaf974cbdae701aead6f32b396 - languageName: node - linkType: hard - "opener@npm:^1.5.2": version: 1.5.2 resolution: "opener@npm:1.5.2" @@ -7035,7 +6253,7 @@ __metadata: languageName: node linkType: hard -"pkg-dir@npm:^4.1.0, pkg-dir@npm:^4.2.0": +"pkg-dir@npm:^4.2.0": version: 4.2.0 resolution: "pkg-dir@npm:4.2.0" dependencies: @@ -7273,6 +6491,18 @@ __metadata: languageName: node linkType: hard +"react-dom@npm:^18.3.1": + version: 18.3.1 + resolution: "react-dom@npm:18.3.1" + dependencies: + loose-envify: ^1.1.0 + scheduler: ^0.23.2 + peerDependencies: + react: ^18.3.1 + checksum: 298954ecd8f78288dcaece05e88b570014d8f6dce5db6f66e6ee91448debeb59dcd31561dddb354eee47e6c1bb234669459060deb238ed0213497146e555a0b9 + languageName: node + linkType: hard + "react-is@npm:^16.8.1": version: 16.13.1 resolution: "react-is@npm:16.13.1" @@ -7287,6 +6517,15 @@ __metadata: languageName: node linkType: hard +"react@npm:^18.3.1": + version: 18.3.1 + resolution: "react@npm:18.3.1" + dependencies: + loose-envify: ^1.1.0 + checksum: a27bcfa8ff7c15a1e50244ad0d0c1cb2ad4375eeffefd266a64889beea6f6b64c4966c9b37d14ee32d6c9fcd5aa6ba183b6988167ab4d127d13e7cb5b386a376 + languageName: node + linkType: hard + "readable-stream@npm:^1.0.33": version: 1.1.14 resolution: "readable-stream@npm:1.1.14" @@ -7343,35 +6582,10 @@ __metadata: languageName: node linkType: hard -"regenerate-unicode-properties@npm:^8.2.0": - version: 8.2.0 - resolution: "regenerate-unicode-properties@npm:8.2.0" - dependencies: - regenerate: ^1.4.0 - checksum: ee7db70ab25b95f2e3f39537089fc3eddba0b39fc9b982d6602f127996ce873d8c55584d5428486ca00dc0a85d174d943354943cd4a745cda475c8fe314b4f8a - languageName: node - linkType: hard - -"regenerate@npm:^1.4.0": - version: 1.4.2 - resolution: "regenerate@npm:1.4.2" - checksum: 3317a09b2f802da8db09aa276e469b57a6c0dd818347e05b8862959c6193408242f150db5de83c12c3fa99091ad95fb42a6db2c3329bfaa12a0ea4cbbeb30cb0 - languageName: node - linkType: hard - -"regenerator-runtime@npm:^0.13.4, regenerator-runtime@npm:^0.13.9": - version: 0.13.9 - resolution: "regenerator-runtime@npm:0.13.9" - checksum: 65ed455fe5afd799e2897baf691ca21c2772e1a969d19bb0c4695757c2d96249eb74ee3553ea34a91062b2a676beedf630b4c1551cc6299afb937be1426ec55e - languageName: node - linkType: hard - -"regenerator-transform@npm:^0.14.2": - version: 0.14.5 - resolution: "regenerator-transform@npm:0.14.5" - dependencies: - "@babel/runtime": ^7.8.4 - checksum: a467a3b652b4ec26ff964e9c5f1817523a73fc44cb928b8d21ff11aebeac5d10a84d297fe02cea9f282bcec81a0b0d562237da69ef0f40a0160b30a4fa98bc94 +"regenerator-runtime@npm:^0.14.1": + version: 0.14.1 + resolution: "regenerator-runtime@npm:0.14.1" + checksum: 9f57c93277b5585d3c83b0cf76be47b473ae8c6d9142a46ce8b0291a04bb2cf902059f0f8445dcabb3fb7378e5fe4bb4ea1e008876343d42e46d3b484534ce38 languageName: node linkType: hard @@ -7392,38 +6606,6 @@ __metadata: languageName: node linkType: hard -"regexpu-core@npm:^4.7.1": - version: 4.7.1 - resolution: "regexpu-core@npm:4.7.1" - dependencies: - regenerate: ^1.4.0 - regenerate-unicode-properties: ^8.2.0 - regjsgen: ^0.5.1 - regjsparser: ^0.6.4 - unicode-match-property-ecmascript: ^1.0.4 - unicode-match-property-value-ecmascript: ^1.2.0 - checksum: 368b4aab72132ba3c8bd114822572c920d390ae99d3d219e0c7f872c6a0a3b1fbe30c88188ff90ec6f8e681667fa8e51d84a78bb05c460996a0df6a060b7ae80 - languageName: node - linkType: hard - -"regjsgen@npm:^0.5.1": - version: 0.5.2 - resolution: "regjsgen@npm:0.5.2" - checksum: 87c83d8488affae2493a823904de1a29a1867a07433c5e1142ad749b5606c5589b305fe35bfcc0972cf5a3b0d66b1f7999009e541be39a5d42c6041c59e2fb52 - languageName: node - linkType: hard - -"regjsparser@npm:^0.6.4": - version: 0.6.7 - resolution: "regjsparser@npm:0.6.7" - dependencies: - jsesc: ~0.5.0 - bin: - regjsparser: bin/parser - checksum: e03e83714c419cdfb4c87160f2d4b4a66dd579d699a21bff2a0795a9178eb79219b0ec5a9fa8b34e75f746f1e82aa8c90fcb0d14c0a2f9d0d678208394b11d6e - languageName: node - linkType: hard - "request@npm:^2.88.2": version: 2.88.2 resolution: "request@npm:2.88.2" @@ -7496,7 +6678,7 @@ __metadata: languageName: node linkType: hard -"resolve@^1.14.2, resolve@^1.20.0, resolve@^1.9.0": +"resolve@^1.20.0, resolve@^1.9.0": version: 1.20.0 resolution: "resolve@npm:1.20.0" dependencies: @@ -7516,7 +6698,7 @@ resolve@^2.0.0-next.3: languageName: node linkType: hard -"resolve@patch:resolve@^1.14.2#~builtin, resolve@patch:resolve@^1.20.0#~builtin, resolve@patch:resolve@^1.9.0#~builtin": +"resolve@patch:resolve@^1.20.0#~builtin, resolve@patch:resolve@^1.9.0#~builtin": version: 1.20.0 resolution: "resolve@patch:resolve@npm%3A1.20.0#~builtin::version=1.20.0&hash=c3c19d" dependencies: @@ -7663,14 +6845,12 @@ resolve@^2.0.0-next.3: languageName: node linkType: hard -"schema-utils@npm:^2.6.5": - version: 2.7.1 - resolution: "schema-utils@npm:2.7.1" +"scheduler@npm:^0.23.2": + version: 0.23.2 + resolution: "scheduler@npm:0.23.2" dependencies: - "@types/json-schema": ^7.0.5 - ajv: ^6.12.4 - ajv-keywords: ^3.5.2 - checksum: 32c62fc9e28edd101e1bd83453a4216eb9bd875cc4d3775e4452b541908fa8f61a7bbac8ffde57484f01d7096279d3ba0337078e85a918ecbeb72872fb09fb2b + loose-envify: ^1.1.0 + checksum: 3e82d1f419e240ef6219d794ff29c7ee415fbdc19e038f680a10c067108e06284f1847450a210b29bbaf97b9d8a97ced5f624c31c681248ac84c80d56ad5a2c4 languageName: node linkType: hard @@ -7699,16 +6879,7 @@ resolve@^2.0.0-next.3: languageName: node linkType: hard -"semver@npm:7.0.0": - version: 7.0.0 - resolution: "semver@npm:7.0.0" - bin: - semver: bin/semver.js - checksum: 272c11bf8d083274ef79fe40a81c55c184dff84dd58e3c325299d0927ba48cece1f020793d138382b85f89bab5002a35a5ba59a3a68a7eebbb597eb733838778 - languageName: node - linkType: hard - -"semver@npm:^6.0.0, semver@npm:^6.1.1, semver@npm:^6.1.2, semver@npm:^6.3.0": +"semver@npm:^6.0.0, semver@npm:^6.3.0": version: 6.3.0 resolution: "semver@npm:6.3.0" bin: @@ -8302,6 +7473,18 @@ resolve@^2.0.0-next.3: languageName: node linkType: hard +"swc-loader@npm:^0.2.6": + version: 0.2.6 + resolution: "swc-loader@npm:0.2.6" + dependencies: + "@swc/counter": ^0.1.3 + peerDependencies: + "@swc/core": ^1.2.147 + webpack: ">=2" + checksum: fe90948c02a51bb8ffcff1ce3590e01dc12860b0bb7c9e22052b14fa846ed437781ae265614a5e14344bea22001108780f00a6e350e28c0b3499bc4cd11335fb + languageName: node + linkType: hard + "symbol-tree@npm:^3.2.4": version: 3.2.4 resolution: "symbol-tree@npm:3.2.4" @@ -8370,7 +7553,21 @@ resolve@^2.0.0-next.3: languageName: node linkType: hard -"terser@npm:^5.12.1, terser@npm:^5.7.0": +"terser@npm:^5.31.0": + version: 5.31.0 + resolution: "terser@npm:5.31.0" + dependencies: + "@jridgewell/source-map": ^0.3.3 + acorn: ^8.8.2 + commander: ^2.20.0 + source-map-support: ~0.5.20 + bin: + terser: bin/terser + checksum: 48f14229618866bba8a9464e9d0e7fdcb6b6488b3a6c4690fcf4d48df65bf45959d5ae8c02f1a0b3f3dd035a9ae340b715e1e547645b112dc3963daa3564699a + languageName: node + linkType: hard + +"terser@npm:^5.7.0": version: 5.12.1 resolution: "terser@npm:5.12.1" dependencies: @@ -8418,10 +7615,9 @@ resolve@^2.0.0-next.3: common: "workspace:*" fastify: ^3.20.2 fastify-static: ^4.2.3 - inferno: ^7.4.8 - inferno-vnode-flags: ^7.4.8 lodash: ^4.17.21 platform: ^1.3.6 + react: ^18.3.1 tgui: "workspace:*" languageName: unknown linkType: soft @@ -8442,9 +7638,12 @@ resolve@^2.0.0-next.3: version: 0.0.0-use.local resolution: "tgui-panel@workspace:packages/tgui-panel" dependencies: + "@types/react": ^18.3.3 + "@types/react-dom": ^18.3.0 common: "workspace:*" dompurify: ^2.3.1 - inferno: ^7.4.8 + react: ^18.3.1 + react-dom: ^18.3.1 tgui: "workspace:*" tgui-dev-server: "workspace:*" tgui-polyfill: "workspace:*" @@ -8455,10 +7654,10 @@ resolve@^2.0.0-next.3: version: 0.0.0-use.local resolution: "tgui-polyfill@workspace:packages/tgui-polyfill" dependencies: - core-js: ^3.16.1 - regenerator-runtime: ^0.13.9 - terser: ^5.12.1 - unfetch: ^4.2.0 + core-js: ^3.37.1 + regenerator-runtime: ^0.14.1 + terser: ^5.31.0 + unfetch: ^5.0.0 languageName: unknown linkType: soft @@ -8466,22 +7665,14 @@ resolve@^2.0.0-next.3: version: 0.0.0-use.local resolution: "tgui-workspace@workspace:." dependencies: - "@babel/core": ^7.15.0 - "@babel/eslint-parser": ^7.15.0 - "@babel/plugin-proposal-class-properties": ^7.14.5 - "@babel/plugin-transform-jscript": ^7.14.5 - "@babel/preset-env": ^7.15.0 - "@babel/preset-typescript": ^7.15.0 + "@swc/core": ^1.5.24 + "@swc/jest": ^0.2.36 "@types/jest": ^27.0.1 "@types/jsdom": ^16.2.13 "@types/node": ^14.17.9 "@types/webpack": ^5.28.0 "@types/webpack-env": ^1.16.2 "@typescript-eslint/parser": ^4.29.1 - babel-jest: ^27.0.6 - babel-loader: ^8.2.2 - babel-plugin-inferno: ^6.3.0 - babel-plugin-transform-remove-console: ^6.9.4 common: "workspace:*" css-loader: ^5.2.7 esbuild-loader: ^4.1.0 @@ -8491,7 +7682,6 @@ resolve@^2.0.0-next.3: eslint-plugin-react: ^7.24.0 eslint-plugin-unused-imports: ^1.1.4 file-loader: ^6.2.0 - inferno: ^7.4.8 jest: ^27.0.6 jest-circus: ^27.0.6 jsdom: ^16.7.0 @@ -8500,6 +7690,7 @@ resolve@^2.0.0-next.3: sass: ^1.37.5 sass-loader: ^11.1.1 style-loader: ^2.0.0 + swc-loader: ^0.2.6 typescript: ^4.3.5 url-loader: ^4.1.1 webpack: ^5.75.0 @@ -8513,13 +7704,15 @@ resolve@^2.0.0-next.3: resolution: "tgui@workspace:packages/tgui" dependencies: "@popperjs/core": ^2.9.3 + "@types/react": ^18.3.3 + "@types/react-dom": ^18.3.0 common: "workspace:*" dateformat: ^4.5.1 dompurify: ^2.3.1 - inferno: ^7.4.8 - inferno-vnode-flags: ^7.4.8 js-yaml: ^4.1.0 marked: ^4.0.10 + react: ^18.3.1 + react-dom: ^18.3.1 tgui-dev-server: "workspace:*" tgui-polyfill: "workspace:*" languageName: unknown @@ -8813,41 +8006,10 @@ typescript@^4.3.5: languageName: node linkType: hard -"unfetch@npm:^4.2.0": - version: 4.2.0 - resolution: "unfetch@npm:4.2.0" - checksum: 6a4b2557e1d921eaa80c4425ce27a404945ec26491ed06e62598f333996a91a44c7908cb26dc7c2746d735762b13276cf4aa41829b4c8f438dde63add3045d7a - languageName: node - linkType: hard - -"unicode-canonical-property-names-ecmascript@npm:^1.0.4": - version: 1.0.4 - resolution: "unicode-canonical-property-names-ecmascript@npm:1.0.4" - checksum: cc1973b18d0e1a151711e5551f87f4b3086c4f542cd5142aa691307d5720fd725fa7d36c24e12e944e108b91c72554237b0c236772d35592839434da5506c40f - languageName: node - linkType: hard - -"unicode-match-property-ecmascript@npm:^1.0.4": - version: 1.0.4 - resolution: "unicode-match-property-ecmascript@npm:1.0.4" - dependencies: - unicode-canonical-property-names-ecmascript: ^1.0.4 - unicode-property-aliases-ecmascript: ^1.0.4 - checksum: 08e269fac71b5ace0f8331df9e87b9b533fe97b00c43ea58de69ae81816581490f846050e0c472279a3e7434524feba99915a93816f90dbbc0a30bcbd082da88 - languageName: node - linkType: hard - -"unicode-match-property-value-ecmascript@npm:^1.2.0": - version: 1.2.0 - resolution: "unicode-match-property-value-ecmascript@npm:1.2.0" - checksum: 2e663cfec8e2cf317b69613566314979f717034ea8f58a237dd63234795044a87337410064fe839774d71e1d7e12195520e9edd69ed8e28f2a9eb28a2db38595 - languageName: node - linkType: hard - -"unicode-property-aliases-ecmascript@npm:^1.0.4": - version: 1.1.0 - resolution: "unicode-property-aliases-ecmascript@npm:1.1.0" - checksum: 1a96dc462d251bb1c5237f7bc77956b29f01cefce7f3e7448430742930961557c3d1515a9669715ebb06209bf01072e2f78ba1627247017daa84346414bc02f1 +"unfetch@npm:^5.0.0": + version: 5.0.0 + resolution: "unfetch@npm:5.0.0" + checksum: 005133bcdc85cefea60890af4ac265799356b69c6a7719c1330484165af7109c06b9eedd3e03d620c14dcc8b43bcf329148f4c1f06016390162f845e0d0a62c5 languageName: node linkType: hard