diff --git a/packages/website/data/sponsors.json b/packages/website/data/sponsors.json index 35838c1afb45..d9675b816b97 100644 --- a/packages/website/data/sponsors.json +++ b/packages/website/data/sponsors.json @@ -229,4 +229,4 @@ "totalDonations": 1500, "website": "https://www.mysportsinjury.co.uk" } -] \ No newline at end of file +] diff --git a/packages/website/src/components/ErrorsViewer.module.css b/packages/website/src/components/ErrorsViewer.module.css new file mode 100644 index 000000000000..fab012b69e88 --- /dev/null +++ b/packages/website/src/components/ErrorsViewer.module.css @@ -0,0 +1,21 @@ +.list { + font-family: var(--ifm-font-family-monospace); + background: transparent; + border: none; + padding-left: 1.5rem; + padding-right: 1.5rem; + font-size: 13px; + line-height: 18px; + letter-spacing: 0; + font-feature-settings: 'liga' 0, 'calt' 0; + box-sizing: border-box; + white-space: break-spaces; + margin: 0; +} + +.fixer { + margin: 0.5rem 1.5rem; + display: flex; + justify-content: space-between; + align-items: center; +} diff --git a/packages/website/src/components/ErrorsViewer.tsx b/packages/website/src/components/ErrorsViewer.tsx new file mode 100644 index 000000000000..fa1b56c937fb --- /dev/null +++ b/packages/website/src/components/ErrorsViewer.tsx @@ -0,0 +1,111 @@ +import React, { useEffect, useMemo, useState } from 'react'; +import type Monaco from 'monaco-editor'; +import type { ErrorItem } from './types'; + +import styles from './ErrorsViewer.module.css'; + +export interface ErrorsViewerProps { + readonly value?: ErrorItem[]; +} + +export interface ErrorBlockProps { + readonly item: ErrorItem; + readonly setIsLocked: (value: boolean) => void; + readonly isLocked: boolean; +} + +function severityClass(severity: Monaco.MarkerSeverity): string { + switch (severity) { + case 8: + return 'danger'; + case 4: + return 'caution'; + case 2: + return 'note'; + } + return 'info'; +} + +function groupErrorItems(items: ErrorItem[]): [string, ErrorItem[]][] { + return Object.entries( + items.reduce>((acc, obj) => { + if (!acc[obj.group]) { + acc[obj.group] = []; + } + acc[obj.group].push(obj); + return acc; + }, {}), + ).sort(([a], [b]) => a.localeCompare(b)); +} + +function ErrorBlock({ + item, + setIsLocked, + isLocked, +}: ErrorBlockProps): JSX.Element { + return ( +
+
+
+
+ {item.message} {item.location} +
+ {item.hasFixers && ( +
+ {item.fixers.map((fixer, index) => ( +
+ > {fixer.message} + +
+ ))} +
+ )} +
+
+
+ ); +} + +export default function ErrorsViewer({ + value, +}: ErrorsViewerProps): JSX.Element { + const model = useMemo( + () => (value ? groupErrorItems(value) : undefined), + [value], + ); + + const [isLocked, setIsLocked] = useState(false); + + useEffect(() => { + setIsLocked(false); + }, [value]); + + return ( +
+ {model?.map(([group, data]) => { + return ( +
+

{group}

+ {data.map((item, index) => ( + + ))} +
+ ); + })} +
+ ); +} diff --git a/packages/website/src/components/Playground.module.css b/packages/website/src/components/Playground.module.css index ded7538d260f..cd1d8fafe78a 100644 --- a/packages/website/src/components/Playground.module.css +++ b/packages/website/src/components/Playground.module.css @@ -10,10 +10,6 @@ border: 1px solid var(--ifm-color-emphasis-100); } -.sourceCodeStandalone { - width: 100%; -} - .codeBlocks { display: flex; flex-direction: row; diff --git a/packages/website/src/components/Playground.tsx b/packages/website/src/components/Playground.tsx index d602e4574825..f6f93378fb85 100644 --- a/packages/website/src/components/Playground.tsx +++ b/packages/website/src/components/Playground.tsx @@ -20,6 +20,7 @@ import type { RuleDetails, SelectedRange } from './types'; import type { TSESTree } from '@typescript-eslint/utils'; import type { SourceFile } from 'typescript'; import ASTViewerScope from '@site/src/components/ASTViewerScope'; +import ErrorsViewer from '@site/src/components/ErrorsViewer'; function rangeReducer( prevState: T, @@ -52,6 +53,7 @@ function Playground(): JSX.Element { const [esAst, setEsAst] = useState(); const [tsAst, setTsAST] = useState(); const [scope, setScope] = useState | string | null>(); + const [markers, setMarkers] = useState(); const [ruleNames, setRuleNames] = useState([]); const [isLoading, setIsLoading] = useState(true); const [tsVersions, setTSVersion] = useState([]); @@ -70,12 +72,7 @@ function Playground(): JSX.Element { />
-
+
{isLoading && } setState({ code: code })} onLoaded={(ruleNames, tsVersions): void => { @@ -100,31 +98,29 @@ function Playground(): JSX.Element { onSelect={setPosition} />
- {state.showAST && ( -
- {(tsAst && state.showAST === 'ts' && ( - + {(tsAst && state.showAST === 'ts' && ( + + )) || + (state.showAST === 'scope' && scope && ( + )) || - (state.showAST === 'scope' && scope && ( - - )) || - (esAst && ( - - ))} -
- )} + (state.showAST === 'es' && esAst && ( + + )) || } +
); diff --git a/packages/website/src/components/editor/LoadedEditor.tsx b/packages/website/src/components/editor/LoadedEditor.tsx index d6433bfaee50..b972b1a5e35f 100644 --- a/packages/website/src/components/editor/LoadedEditor.tsx +++ b/packages/website/src/components/editor/LoadedEditor.tsx @@ -8,6 +8,7 @@ import type { WebLinter } from '../linter/WebLinter'; import { debounce } from '../lib/debounce'; import { lintCode, LintCodeAction } from '../linter/lintCode'; import { createProvideCodeActions } from './createProvideCodeActions'; +import { parseMarkers } from '../linter/utils'; export interface LoadedEditorProps extends CommonEditorProps { readonly main: typeof Monaco; @@ -24,6 +25,7 @@ export const LoadedEditor: React.FC = ({ onEsASTChange, onScopeChange, onTsASTChange, + onMarkersChange, onChange, onSelect, rules, @@ -34,7 +36,7 @@ export const LoadedEditor: React.FC = ({ webLinter, }) => { const [decorations, setDecorations] = useState([]); - const fixes = useRef(new Map()).current; + const fixes = useRef(new Map()).current; useEffect(() => { const config = { @@ -112,6 +114,10 @@ export const LoadedEditor: React.FC = ({ onChange(sandboxInstance.getModel().getValue()); }, 500), ), + sandboxInstance.monaco.editor.onDidChangeMarkers(() => { + const markers = sandboxInstance.monaco.editor.getModelMarkers({}); + onMarkersChange(parseMarkers(markers, fixes, sandboxInstance.editor)); + }), ]; return (): void => { diff --git a/packages/website/src/components/editor/createProvideCodeActions.ts b/packages/website/src/components/editor/createProvideCodeActions.ts index 1e9dfaca3899..55a3e67ae08b 100644 --- a/packages/website/src/components/editor/createProvideCodeActions.ts +++ b/packages/website/src/components/editor/createProvideCodeActions.ts @@ -3,7 +3,7 @@ import type { LintCodeAction } from '../linter/lintCode'; import { createURI } from '../linter/utils'; export function createProvideCodeActions( - fixes: Map, + fixes: Map, ): Monaco.languages.CodeActionProvider { return { provideCodeActions( @@ -22,8 +22,8 @@ export function createProvideCodeActions( } const actions: Monaco.languages.CodeAction[] = []; for (const marker of context.markers) { - const message = fixes.get(createURI(marker)); - if (message) { + const messages = fixes.get(createURI(marker)) ?? []; + for (const message of messages) { const start = model.getPositionAt(message.fix.range[0]); const end = model.getPositionAt(message.fix.range[1]); actions.push({ diff --git a/packages/website/src/components/editor/types.ts b/packages/website/src/components/editor/types.ts index 894a4fde6053..86d4230ac4cc 100644 --- a/packages/website/src/components/editor/types.ts +++ b/packages/website/src/components/editor/types.ts @@ -1,5 +1,5 @@ import type Monaco from 'monaco-editor'; -import type { ConfigModel, SelectedRange } from '../types'; +import type { ConfigModel, SelectedRange, ErrorItem } from '../types'; import type { TSESTree } from '@typescript-eslint/utils'; import type { SourceFile } from 'typescript'; @@ -10,5 +10,6 @@ export interface CommonEditorProps extends ConfigModel { readonly onTsASTChange: (value: string | SourceFile) => void; readonly onEsASTChange: (value: string | TSESTree.Program) => void; readonly onScopeChange: (value: string | Record) => void; + readonly onMarkersChange: (value: ErrorItem[]) => void; readonly onSelect: (position: Monaco.Position | null) => void; } diff --git a/packages/website/src/components/linter/WebLinter.ts b/packages/website/src/components/linter/WebLinter.ts index d3c045eaf427..9fbb58a456b3 100644 --- a/packages/website/src/components/linter/WebLinter.ts +++ b/packages/website/src/components/linter/WebLinter.ts @@ -40,7 +40,7 @@ export class WebLinter { this.linter.defineParser(PARSER_NAME, { parseForESLint: (text, options?: ParserOptions) => { - return this.eslintParse(text, compilerOptions, options); + return this.eslintParse(text, options); }, }); @@ -70,7 +70,6 @@ export class WebLinter { eslintParse( code: string, - compilerOptions: CompilerOptions, eslintOptions: ParserOptions = {}, ): TSESLint.Linter.ESLintParseResult { const isJsx = eslintOptions?.ecmaFeatures?.jsx ?? false; @@ -80,7 +79,7 @@ export class WebLinter { const program = window.ts.createProgram( [fileName], - compilerOptions, + this.compilerOptions, this.host, ); const tsAst = program.getSourceFile(fileName)!; diff --git a/packages/website/src/components/linter/lintCode.ts b/packages/website/src/components/linter/lintCode.ts index 33f6c216bf35..e72fb4edc7da 100644 --- a/packages/website/src/components/linter/lintCode.ts +++ b/packages/website/src/components/linter/lintCode.ts @@ -11,7 +11,7 @@ export interface LintCodeAction { }; } -export type LintCodeActionGroup = [string, LintCodeAction]; +export type LintCodeActionGroup = [string, LintCodeAction[]]; export function lintCode( linter: WebLinter, @@ -59,27 +59,24 @@ export function lintCode( }; const markerUri = createURI(marker); + const fixes: LintCodeAction[] = []; if (message.fix) { - codeActions.push([ - markerUri, - { - message: `Fix this ${message.ruleId ?? 'unknown'} problem`, - fix: message.fix, - }, - ]); + fixes.push({ + message: `Fix this ${message.ruleId ?? 'unknown'} problem`, + fix: message.fix, + }); } if (message.suggestions) { for (const suggestion of message.suggestions) { - codeActions.push([ - markerUri, - { - message: `${suggestion.desc} (${message.ruleId ?? 'unknown'})`, - fix: suggestion.fix, - }, - ]); + fixes.push({ + message: `${suggestion.desc} (${message.ruleId ?? 'unknown'})`, + fix: suggestion.fix, + }); } } - + if (fixes.length > 0) { + codeActions.push([markerUri, fixes]); + } markers.push(marker); } diff --git a/packages/website/src/components/linter/utils.ts b/packages/website/src/components/linter/utils.ts index ff8b70d05c8c..924210886b93 100644 --- a/packages/website/src/components/linter/utils.ts +++ b/packages/website/src/components/linter/utils.ts @@ -1,4 +1,6 @@ import type Monaco from 'monaco-editor'; +import type { ErrorItem } from '../types'; +import { LintCodeAction } from './lintCode'; export function ensurePositiveInt( value: number | undefined, @@ -17,3 +19,48 @@ export function createURI(marker: Monaco.editor.IMarkerData): string { (typeof marker.code === 'string' ? marker.code : marker.code?.value) ?? '', ].join('|')}]`; } + +export function parseMarkers( + markers: Monaco.editor.IMarker[], + fixes: Map, + editor: Monaco.editor.IStandaloneCodeEditor, +): ErrorItem[] { + return markers.map(marker => { + const isTypescript = marker.owner === 'typescript'; + const code = + typeof marker.code === 'string' ? marker.code : marker.code?.value ?? ''; + const uri = createURI(marker); + + const fixers = + fixes.get(uri)?.map(item => { + return { + message: item.message, + fix(): void { + const model = editor.getModel()!; + const start = model.getPositionAt(item.fix.range[0]); + const end = model.getPositionAt(item.fix.range[1]); + editor.executeEdits(model.getValue(), [ + { + range: { + startLineNumber: start.lineNumber, + startColumn: start.column, + endLineNumber: end.lineNumber, + endColumn: end.column, + }, + text: item.fix.text, + }, + ]); + }, + }; + }) ?? []; + + return { + group: isTypescript ? 'TypeScript' : code, + message: (isTypescript ? `TS${code}: ` : '') + marker.message, + location: `${marker.startLineNumber}:${marker.startColumn} - ${marker.endLineNumber}:${marker.endColumn}`, + severity: marker.severity, + hasFixers: fixers.length > 0, + fixers: fixers, + }; + }); +} diff --git a/packages/website/src/components/types.ts b/packages/website/src/components/types.ts index 51cd4e98b40c..54ea437e8b6f 100644 --- a/packages/website/src/components/types.ts +++ b/packages/website/src/components/types.ts @@ -31,3 +31,12 @@ export interface SelectedRange { start: SelectedPosition; end: SelectedPosition; } + +export interface ErrorItem { + group: string; + message: string; + location: string; + severity: number; + hasFixers: boolean; + fixers: { message: string; fix(): void }[]; +} diff --git a/yarn.lock b/yarn.lock index de777d2be136..95d90f0b329a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2059,12 +2059,7 @@ minimatch "^3.1.2" strip-json-comments "^3.1.1" -"@gar/promisify@^1.0.1": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@gar/promisify/-/promisify-1.1.2.tgz#30aa825f11d438671d585bd44e7fd564535fc210" - integrity sha512-82cpyJyKRoQoRi+14ibCeGPu0CwypgtBAdBhq1WfvagpCZNKqwXbKwXllYSMG91DhmG4jt9gN8eP6lGOtozuaw== - -"@gar/promisify@^1.1.3": +"@gar/promisify@^1.0.1", "@gar/promisify@^1.1.3": version "1.1.3" resolved "https://registry.yarnpkg.com/@gar/promisify/-/promisify-1.1.3.tgz#555193ab2e3bb3b6adc3d551c9c030d9e860daf6" integrity sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw== @@ -4552,16 +4547,7 @@ agent-base@6, agent-base@^6.0.2: dependencies: debug "4" -agentkeepalive@^4.1.3: - version "4.1.4" - resolved "https://registry.yarnpkg.com/agentkeepalive/-/agentkeepalive-4.1.4.tgz#d928028a4862cb11718e55227872e842a44c945b" - integrity sha512-+V/rGa3EuU74H6wR04plBb7Ks10FbtUQgRj/FQOG7uUIEuaINI+AiqJR1k6t3SVNs7o7ZjIdus6706qqzVq8jQ== - dependencies: - debug "^4.1.0" - depd "^1.1.2" - humanize-ms "^1.2.1" - -agentkeepalive@^4.2.1: +agentkeepalive@^4.1.3, agentkeepalive@^4.2.1: version "4.2.1" resolved "https://registry.yarnpkg.com/agentkeepalive/-/agentkeepalive-4.2.1.tgz#a7975cbb9f83b367f06c90cc51ff28fe7d499717" integrity sha512-Zn4cw2NEqd+9fiSVWMscnjyQ1a8Yfoc5oBajLeo5w+YBHgDUcEBY2hS4YpTz6iN5f/2zQiktcuM6tS8x1p9dpA== @@ -6549,7 +6535,7 @@ debug@2.6.9, debug@^2.6.0, debug@^2.6.9: dependencies: ms "2.0.0" -debug@4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.3, debug@^4.3.4: +debug@4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.2, debug@^4.3.3, debug@^4.3.4: version "4.3.4" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== @@ -10792,14 +10778,7 @@ minipass-sized@^1.0.3: dependencies: minipass "^3.0.0" -minipass@^3.0.0, minipass@^3.1.0, minipass@^3.1.1, minipass@^3.1.3: - version "3.1.5" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.1.5.tgz#71f6251b0a33a49c01b3cf97ff77eda030dff732" - integrity sha512-+8NzxD82XQoNKNrl1d/FSi+X8wAEWR+sbYAfIvub4Nz0d22plFG72CEVVaufV8PNf4qSslFTD8VMOxNVhHCjTw== - dependencies: - yallist "^4.0.0" - -minipass@^3.1.6: +minipass@^3.0.0, minipass@^3.1.0, minipass@^3.1.1, minipass@^3.1.3, minipass@^3.1.6: version "3.1.6" resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.1.6.tgz#3b8150aa688a711a1521af5e8779c1d3bb4f45ee" integrity sha512-rty5kpw9/z8SX9dmxblFA6edItUmwJgMeYDZRrwlIVN27i8gysGbznJwUggw2V/FVqFSDdWy040ZPS811DYAqQ== @@ -13225,7 +13204,7 @@ serve-static@1.15.0: parseurl "~1.3.3" send "0.18.0" -set-blocking@~2.0.0: +set-blocking@^2.0.0, set-blocking@~2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= @@ -13357,7 +13336,7 @@ slice-ansi@^5.0.0: ansi-styles "^6.0.0" is-fullwidth-code-point "^4.0.0" -smart-buffer@^4.1.0, smart-buffer@^4.2.0: +smart-buffer@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-4.2.0.tgz#6e1d71fa4f18c05f7d0ff216dd16a481d0e8d9ae" integrity sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg== @@ -13380,16 +13359,7 @@ socks-proxy-agent@^5.0.0: debug "4" socks "^2.3.3" -socks-proxy-agent@^6.0.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-6.1.0.tgz#869cf2d7bd10fea96c7ad3111e81726855e285c3" - integrity sha512-57e7lwCN4Tzt3mXz25VxOErJKXlPfXmkMLnk310v/jwW20jWRVcgsOit+xNkN3eIEdB47GwnfAEBLacZ/wVIKg== - dependencies: - agent-base "^6.0.2" - debug "^4.3.1" - socks "^2.6.1" - -socks-proxy-agent@^6.1.1: +socks-proxy-agent@^6.0.0, socks-proxy-agent@^6.1.1: version "6.2.0" resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-6.2.0.tgz#f6b5229cc0cbd6f2f202d9695f09d871e951c85e" integrity sha512-wWqJhjb32Q6GsrUqzuFkukxb/zzide5quXYcMVpIjxalDBBYy2nqKCFQ/9+Ie4dvOYSQdOk3hUlZSdzZOd3zMQ== @@ -13398,15 +13368,7 @@ socks-proxy-agent@^6.1.1: debug "^4.3.3" socks "^2.6.2" -socks@^2.3.3, socks@^2.6.1: - version "2.6.1" - resolved "https://registry.yarnpkg.com/socks/-/socks-2.6.1.tgz#989e6534a07cf337deb1b1c94aaa44296520d30e" - integrity sha512-kLQ9N5ucj8uIcxrDwjm0Jsqk06xdpBjGNQtpXy4Q8/QY2k+fY7nZH8CARy+hkbG+SGAovmzzuauCpBlb8FrnBA== - dependencies: - ip "^1.1.5" - smart-buffer "^4.1.0" - -socks@^2.6.2: +socks@^2.3.3, socks@^2.6.2: version "2.6.2" resolved "https://registry.yarnpkg.com/socks/-/socks-2.6.2.tgz#ec042d7960073d40d94268ff3bb727dc685f111a" integrity sha512-zDZhHhZRY9PxRruRMR7kMhnf3I8hDs4S3f9RecfnGxvcBHQcKcIH/oUcEWffsfl1XxdYlA7nnlGbbTvPz9D8gA== @@ -13645,14 +13607,6 @@ string-width@^1.0.1: is-fullwidth-code-point "^1.0.0" strip-ansi "^3.0.0" -"string-width@^1.0.2 || 2", string-width@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" - integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== - dependencies: - is-fullwidth-code-point "^2.0.0" - strip-ansi "^4.0.0" - "string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.2, string-width@^4.2.3: version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" @@ -13662,6 +13616,14 @@ string-width@^1.0.1: is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.1" +string-width@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" + integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== + dependencies: + is-fullwidth-code-point "^2.0.0" + strip-ansi "^4.0.0" + string-width@^5.0.0, string-width@^5.0.1: version "5.1.2" resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" @@ -14294,26 +14256,6 @@ uglify-js@^3.1.4: resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.14.2.tgz#d7dd6a46ca57214f54a2d0a43cad0f35db82ac99" integrity sha512-rtPMlmcO4agTUfz10CbgJ1k6UAoXM2gWb3GoMPPZB/+/Ackf8lNWk11K4rYi2D0apgoFRLtQOZhb+/iGNJq26A== -uid-number@0.0.6: - version "0.0.6" - resolved "https://registry.yarnpkg.com/uid-number/-/uid-number-0.0.6.tgz#0ea10e8035e8eb5b8e4449f06da1c730663baa81" - integrity sha1-DqEOgDXo61uOREnwbaHHMGY7qoE= - -umask@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/umask/-/umask-1.1.0.tgz#f29cebf01df517912bb58ff9c4e50fde8e33320d" - integrity sha1-8pzr8B31F5ErtY/5xOUP3o4zMg0= - -unbox-primitive@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.1.tgz#085e215625ec3162574dc8859abee78a59b14471" - integrity sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw== - dependencies: - function-bind "^1.1.1" - has-bigints "^1.0.1" - has-symbols "^1.0.2" - which-boxed-primitive "^1.0.2" - unbox-primitive@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e" @@ -14922,14 +14864,7 @@ which@^2.0.1, which@^2.0.2: dependencies: isexe "^2.0.0" -wide-align@^1.1.0: - version "1.1.3" - resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" - integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA== - dependencies: - string-width "^1.0.2 || 2" - -wide-align@^1.1.5: +wide-align@^1.1.0, wide-align@^1.1.5: version "1.1.5" resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.5.tgz#df1d4c206854369ecf3c9a4898f1b23fbd9d15d3" integrity sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==