diff --git a/package.json b/package.json index cb572a549c..be4c997b16 100644 --- a/package.json +++ b/package.json @@ -60,14 +60,14 @@ "@codemirror/lang-javascript": "^6.2.2", "@codemirror/lang-rust": "^6.0.1", "@codemirror/language": "^6.10.8", - "@codemirror/state": "^6.5.2", - "@codemirror/view": "^6.36.2", + "@codemirror/state": "^6.5.0", + "@codemirror/view": "^6.36.1", "@firefox-devtools/react-contextmenu": "^5.2.0", "@fluent/bundle": "^0.18.0", "@fluent/langneg": "^0.7.0", "@fluent/react": "^0.15.2", "@lezer/highlight": "^1.2.1", - "@tgwf/co2": "^0.16.6", + "@tgwf/co2": "^0.16.4", "array-move": "^3.0.1", "array-range": "^1.0.1", "clamp": "^1.0.1", @@ -77,9 +77,9 @@ "core-js": "^3.40.0", "escape-string-regexp": "^4.0.0", "gecko-profiler-demangle": "^0.3.3", - "idb": "^8.0.2", + "idb": "^8.0.0", "jszip": "^3.10.1", - "long": "^5.3.0", + "long": "^5.2.3", "memoize-immutable": "^3.0.0", "memoize-one": "^6.0.0", "minimist": "^1.2.8", @@ -90,7 +90,9 @@ "query-string": "^9.1.1", "react": "^18.3.1", "react-dom": "^18.3.1", - "react-intersection-observer": "^9.15.1", + "react-dom-factories": "^1.0.2", + "react-intersection-observer": "^9.14.1", + "prop-types": "^15.8.1", "react-redux": "^9.2.0", "react-splitter-layout": "^4.0.0", "react-transition-group": "^4.4.5", @@ -104,23 +106,22 @@ }, "devDependencies": { "@babel/cli": "^7.26.4", - "@babel/core": "^7.26.7", - "@babel/eslint-parser": "^7.26.8", + "@babel/core": "^7.26.0", + "@babel/eslint-parser": "^7.25.9", "@babel/eslint-plugin": "^7.25.9", "@babel/plugin-proposal-class-properties": "^7.18.6", - "@babel/preset-env": "^7.26.7", + "@babel/preset-env": "^7.26.0", "@babel/preset-flow": "^7.25.9", "@babel/preset-react": "^7.26.3", "@testing-library/dom": "^10.4.0", "@testing-library/jest-dom": "^6.6.3", - "@testing-library/react": "^16.2.0", + "@testing-library/react": "^16.1.0", "alex": "^11.0.1", "autoprefixer": "^10.4.20", "babel-jest": "^29.7.0", "babel-loader": "^9.2.1", "babel-plugin-module-resolver": "^5.0.2", - "browserslist": "^4.24.4", - "caniuse-lite": "^1.0.30001699", + "browserslist": "^4.24.3", "circular-dependency-plugin": "^5.2.1", "codecov": "^3.8.3", "copy-webpack-plugin": "^12.0.2", @@ -133,10 +134,10 @@ "eslint-import-resolver-alias": "^1.1.2", "eslint-plugin-flowtype": "^8.0.3", "eslint-plugin-import": "^2.31.0", - "eslint-plugin-jest": "^28.11.0", + "eslint-plugin-jest": "^28.10.0", "eslint-plugin-jest-dom": "^5.5.0", "eslint-plugin-jest-formatting": "^3.1.0", - "eslint-plugin-react": "^7.37.4", + "eslint-plugin-react": "^7.37.3", "eslint-plugin-testing-library": "^7.1.1", "espree": "^10.3.0", "fake-indexeddb": "^6.0.0", @@ -158,13 +159,13 @@ "node-fetch": "^2.6.11", "npm-run-all2": "^7.0.2", "open": "^10.1.0", - "postcss": "^8.5.2", + "postcss": "^8.4.49", "postcss-loader": "^8.1.1", - "prettier": "^3.5.1", + "prettier": "^3.4.2", "raw-loader": "^4.0.2", "rimraf": "^5.0.10", "style-loader": "^4.0.0", - "stylelint": "^16.14.1", + "stylelint": "^16.12.0", "stylelint-config-idiomatic-order": "^10.0.0", "stylelint-config-standard": "^37.0.0", "webpack": "^5.97.1", diff --git a/src/components/stack-chart/Canvas.js b/src/components/stack-chart/Canvas.js index cc382b1163..0fb8e76bfd 100644 --- a/src/components/stack-chart/Canvas.js +++ b/src/components/stack-chart/Canvas.js @@ -20,6 +20,7 @@ import { typeof changeMouseTimePosition as ChangeMouseTimePosition, } from '../../actions/profile-view'; import { mapCategoryColorNameToStackChartStyles } from '../../utils/colors'; +import { getArgvSummaries } from '../../utils/value-summaries'; import { TooltipCallNode } from '../tooltip/CallNode'; import { TooltipMarker } from '../tooltip/Marker'; @@ -97,6 +98,7 @@ const TEXT_CSS_PIXELS_OFFSET_TOP = 11; const FONT_SIZE = 10; const BORDER_OPACITY = 0.4; + class StackChartCanvasImpl extends React.PureComponent { _textMeasurement: null | TextMeasurement; _textMeasurementCssToDeviceScale: number = 1; @@ -466,12 +468,18 @@ class StackChartCanvasImpl extends React.PureComponent { ); } + const callNodeIndex = timing.callNode[stackTimingIndex]; if (callNodeIndex === undefined) { return null; } const duration = timing.end[stackTimingIndex] - timing.start[stackTimingIndex]; + const argv = timing.argv[stackTimingIndex]; + let argvSummaries = undefined; + if (argv != -1) { + argvSummaries = getArgvSummaries(thread, argv); + } return ( { callTreeSummaryStrategy="timing" durationText={formatMilliseconds(duration)} displayStackType={displayStackType} + argv={JSON.stringify(argvSummaries, null, 2) || null} /> ); }; diff --git a/src/components/tooltip/CallNode.js b/src/components/tooltip/CallNode.js index 6e334ae7d2..de2eb03dea 100644 --- a/src/components/tooltip/CallNode.js +++ b/src/components/tooltip/CallNode.js @@ -32,6 +32,13 @@ import type { } from 'firefox-profiler/profile-logic/profile-data'; import type { CallNodeInfo } from 'firefox-profiler/profile-logic/call-node-info'; +import { + REPS, + MODE, +} from 'firefox-profiler/components/shared/reps/index' +const { Rep } = REPS; + + import './CallNode.css'; import classNames from 'classnames'; @@ -129,6 +136,7 @@ type Props = {| +timings?: TimingsForPath, +callTreeSummaryStrategy: CallTreeSummaryStrategy, +displayStackType: boolean, + +argv?: string | null, |}; /** @@ -358,6 +366,7 @@ export class TooltipCallNode extends React.PureComponent { thread, durationText, categories, + argv, displayData, timings, callTreeSummaryStrategy, @@ -423,6 +432,27 @@ export class TooltipCallNode extends React.PureComponent { ]; } + let argumentsElement = null; + if (argv) { + const argPreviews = JSON.parse(argv); + if (argPreviews.length == 0) { + argumentsElement =
No argument.
; + } else { + let argvEl = []; + for(const previewObject of argPreviews) { + argvEl.push(Rep({ + object: previewObject, + mode: MODE.LONG, + })); + } + // Use .theme-light in order to apply css variables from DevTool's variables.css + argumentsElement =
+
Arguments
+ {argvEl} +
; + } + } + // Finding current frame and parent frame URL(if there is). let pageAndParentPageURL; if (innerWindowIDToPageMap) { @@ -539,6 +569,7 @@ export class TooltipCallNode extends React.PureComponent { {resource} {this._renderCategoryTimings(timings)} + {argumentsElement} ); diff --git a/src/components/tooltip/Tooltip.css b/src/components/tooltip/Tooltip.css index 7b6f3254b7..33d2791f2f 100644 --- a/src/components/tooltip/Tooltip.css +++ b/src/components/tooltip/Tooltip.css @@ -145,3 +145,12 @@ .sidebar .tooltipDetailSeparator { display: none; } + +.argumentsLabel { + /* match tooltips label, without being aligned to the right */ + color: var(--grey-50); +} +.arguments > span { + display: block; + border-bottom: 1px solid var(--grey-40); +} diff --git a/src/profile-logic/data-structures.js b/src/profile-logic/data-structures.js index 53bcaf2e81..af2390908c 100644 --- a/src/profile-logic/data-structures.js +++ b/src/profile-logic/data-structures.js @@ -89,6 +89,7 @@ export function getEmptySamplesTableWithEventDelay(): RawSamplesTable { eventDelay: [], stack: [], time: [], + argv: [], length: 0, }; } @@ -109,6 +110,7 @@ export function getEmptySamplesTableWithResponsiveness(): SamplesTable { responsiveness: [], stack: [], time: [], + argv: [], length: 0, }; } diff --git a/src/profile-logic/process-profile.js b/src/profile-logic/process-profile.js index 979d989845..5bfaedfdbf 100644 --- a/src/profile-logic/process-profile.js +++ b/src/profile-logic/process-profile.js @@ -967,6 +967,10 @@ function _processSamples(geckoSamples: GeckoSampleStruct): RawSamplesTable { } } + if (geckoSamples.argv) { + samples.argv = geckoSamples.argv; + } + if (geckoSamples.eventDelay) { samples.eventDelay = geckoSamples.eventDelay; } else if (geckoSamples.responsiveness) { @@ -1204,6 +1208,14 @@ function _processThread( newThread.nativeAllocations = nativeAllocations; } + if (thread.values) { + newThread.argvBuffer = thread.values; + } + + if (thread.shapes) { + newThread.shapes = thread.shapes; + } + function processJsTracer() { // Optionally extract the JS Tracer information, if they exist. const { jsTracerEvents } = thread; diff --git a/src/profile-logic/profile-data.js b/src/profile-logic/profile-data.js index 2dbe0e794e..a31053ee87 100644 --- a/src/profile-logic/profile-data.js +++ b/src/profile-logic/profile-data.js @@ -1757,6 +1757,13 @@ export function filterThreadSamplesToRange( ); } + if (samples.argv) { + newSamples.argv = samples.argv.slice( + beginSampleIndex, + endSampleIndex + ); + } + if (samples.threadId) { newSamples.threadId = samples.threadId.slice( beginSampleIndex, @@ -1883,6 +1890,13 @@ export function filterRawThreadSamplesToRange( ); } + if (samples.argv) { + newSamples.argv = samples.argv.slice( + beginSampleIndex, + endSampleIndex + ); + } + if (samples.threadId) { newSamples.threadId = samples.threadId.slice( beginSampleIndex, @@ -1989,6 +2003,9 @@ export function filterCounterSamplesToRange( number: samples.number ? samples.number.slice(beginSampleIndex, endSampleIndex) : undefined, + argv: samples.argv + ? samples.argv.slice(beginSampleIndex, endSampleIndex) + : undefined, }; return newCounter; @@ -2337,6 +2354,7 @@ export function computeSamplesTableFromRawSamplesTable( const { responsiveness, eventDelay, + argv, stack, weight, weightType, @@ -2363,6 +2381,7 @@ export function computeSamplesTableFromRawSamplesTable( // These fields are copied from the raw samples table: responsiveness, eventDelay, + argv, stack, weight, weightType, @@ -2382,7 +2401,8 @@ export function createThreadFromDerivedTables( rawThread: RawThread, samples: SamplesTable, stackTable: StackTable, - stringTable: StringTable + stringTable: StringTable, + argvBuffer: ArrayBuffer | null, ): Thread { const { processType, @@ -2409,6 +2429,7 @@ export function createThreadFromDerivedTables( jsTracer, isPrivateBrowsing, userContextId, + shapes, } = rawThread; const thread: Thread = { @@ -2437,11 +2458,13 @@ export function createThreadFromDerivedTables( jsTracer, isPrivateBrowsing, userContextId, + shapes, // These fields are derived: samples, stackTable, stringTable, + argvBuffer: argvBuffer || undefined }; return thread; } diff --git a/src/profile-logic/stack-timing.js b/src/profile-logic/stack-timing.js index 44bea2f3fa..8f8261ed67 100644 --- a/src/profile-logic/stack-timing.js +++ b/src/profile-logic/stack-timing.js @@ -52,6 +52,7 @@ export type StackTiming = {| start: Milliseconds[], end: Milliseconds[], callNode: IndexIntoCallNodeTable[], + argv: number[], length: number, |}; @@ -77,6 +78,7 @@ export function getStackTimingByDepth( start: [], end: [], callNode: [], + argv: [], length: 0, })); @@ -106,9 +108,14 @@ export function getStackTimingByDepth( let deepestOpenBoxCallNodeIndex = -1; let deepestOpenBoxDepth = -1; const openBoxStartTimeByDepth = new Float64Array(maxDepthPlusOne); + const openBoxArgvByDepth = new Int32Array(maxDepthPlusOne); for (let sampleIndex = 0; sampleIndex < samples.length; sampleIndex++) { const sampleTime = samples.time[sampleIndex]; + let sampleArgv : number = -1; + if (samples.argv) { + sampleArgv = samples.argv[sampleIndex] !== null ? samples.argv[sampleIndex] : -1; + } const thisCallNodeIndex = sampleCallNodes[sampleIndex] ?? -1; if (thisCallNodeIndex === deepestOpenBoxCallNodeIndex) { continue; @@ -135,10 +142,12 @@ export function getStackTimingByDepth( // deepestOpenBoxCallNodeIndex is *not* an ancestors of thisCallNodeIndex. // Commit this box. const start = openBoxStartTimeByDepth[deepestOpenBoxDepth]; + const argv = openBoxArgvByDepth[deepestOpenBoxDepth]; const stackTimingForThisDepth = stackTimingByDepth[deepestOpenBoxDepth]; const index = stackTimingForThisDepth.length++; stackTimingForThisDepth.start[index] = start; stackTimingForThisDepth.end[index] = sampleTime; + stackTimingForThisDepth.argv[index] = argv; stackTimingForThisDepth.callNode[index] = deepestOpenBoxCallNodeIndex; deepestOpenBoxCallNodeIndex = callNodeTablePrefixColumn[deepestOpenBoxCallNodeIndex]; @@ -154,6 +163,7 @@ export function getStackTimingByDepth( while (deepestOpenBoxDepth < thisCallNodeDepth) { deepestOpenBoxDepth++; openBoxStartTimeByDepth[deepestOpenBoxDepth] = sampleTime; + openBoxArgvByDepth[deepestOpenBoxDepth] = sampleArgv; } } @@ -167,8 +177,10 @@ export function getStackTimingByDepth( const stackTimingForThisDepth = stackTimingByDepth[deepestOpenBoxDepth]; const index = stackTimingForThisDepth.length++; const start = openBoxStartTimeByDepth[deepestOpenBoxDepth]; + const argv = openBoxArgvByDepth[deepestOpenBoxDepth]; stackTimingForThisDepth.start[index] = start; stackTimingForThisDepth.end[index] = endTime; + stackTimingForThisDepth.argv[index] = argv; stackTimingForThisDepth.callNode[index] = deepestOpenBoxCallNodeIndex; deepestOpenBoxCallNodeIndex = callNodeTablePrefixColumn[deepestOpenBoxCallNodeIndex]; diff --git a/src/selectors/per-thread/thread.js b/src/selectors/per-thread/thread.js index e3a0a300c2..6262d3d4ad 100644 --- a/src/selectors/per-thread/thread.js +++ b/src/selectors/per-thread/thread.js @@ -21,6 +21,7 @@ import { ensureExists, getFirstItemFromSet, } from '../../utils/flow'; +import { base64StringToArrayBuffer } from '../../utils/value-summaries'; import type { Thread, @@ -103,6 +104,10 @@ export function getBasicThreadSelectorsPerThread( (state) => getRawThread(state).stringArray, (stringArray) => StringTable.withBackingArray(stringArray) ); + const getArgvBuffer: Selector = createSelector( + (state) => getRawThread(state).argvBuffer, + (argvBuffer) => argvBuffer ? base64StringToArrayBuffer(argvBuffer) : null, + ); const getRawSamplesTable: Selector = (state) => getRawThread(state).samples; const getSamplesTable: Selector = createSelector( @@ -158,6 +163,7 @@ export function getBasicThreadSelectorsPerThread( getSamplesTable, getStackTable, getStringTable, + getArgvBuffer, ProfileData.createThreadFromDerivedTables ); @@ -419,6 +425,7 @@ export function getBasicThreadSelectorsPerThread( getThread, getStringTable, getSamplesTable, + getArgvBuffer, getSamplesWeightType, getNativeAllocations, getJsAllocations, diff --git a/src/test/fixtures/profiles/processed-profile.js b/src/test/fixtures/profiles/processed-profile.js index bc775c60a3..dbfcbf83c2 100644 --- a/src/test/fixtures/profiles/processed-profile.js +++ b/src/test/fixtures/profiles/processed-profile.js @@ -2117,6 +2117,9 @@ export function addInnerWindowIdToStacks( if (samples.responsiveness) { samples.responsiveness.push(samples.responsiveness[sampleIndex]); } + if (samples.argv) { + samples.argv.push(samples.argv[sampleIndex]); + } if (samples.threadCPUDelta) { samples.threadCPUDelta.push(samples.threadCPUDelta[sampleIndex]); } diff --git a/src/test/fixtures/utils.js b/src/test/fixtures/utils.js index e6e75d5b6d..7ecdf55864 100644 --- a/src/test/fixtures/utils.js +++ b/src/test/fixtures/utils.js @@ -19,6 +19,7 @@ import { } from 'firefox-profiler/profile-logic/profile-data'; import { getProfileWithDicts } from './profiles/processed-profile'; import { StringTable } from '../../utils/string-table'; +import { base64StringToArrayBuffer } from '../../utils/value-summaries'; import type { IndexIntoCallNodeTable, @@ -136,11 +137,13 @@ export function computeThreadFromRawThread( sampleUnits, referenceCPUDeltaPerMs ); + const argvBuffer = rawThread.argvBuffer ? base64StringToArrayBuffer(rawThread.argvBuffer) : null; return createThreadFromDerivedTables( rawThread, samples, stackTable, - stringTable + stringTable, + argvBuffer ); } diff --git a/src/types/gecko-profile.js b/src/types/gecko-profile.js index 8c17ff07af..32f137dec9 100644 --- a/src/types/gecko-profile.js +++ b/src/types/gecko-profile.js @@ -120,6 +120,7 @@ export type GeckoSamples = {| stack: 0, time: 1, eventDelay: 2, + argv?: 3, threadCPUDelta?: 3, |}, data: Array< @@ -154,6 +155,7 @@ export type GeckoSampleStructWithResponsiveness = {| // versions may not have it or that feature could be disabled. No upgrader was // written for this change because it's a completely new data source. threadCPUDelta?: Array, + argv?: Array, length: number, |}; @@ -168,6 +170,7 @@ export type GeckoSampleStructWithEventDelay = {| // versions may not have it or that feature could be disabled. No upgrader was // written for this change because it's a completely new data source. threadCPUDelta?: Array, + argv?: Array, length: number, |}; @@ -276,6 +279,8 @@ export type GeckoThread = {| stackTable: GeckoStackTable, stringTable: string[], jsTracerEvents?: JsTracerTable, + values?: string, + shapes?: Array>, |}; export type GeckoExtensionMeta = {| diff --git a/src/types/profile-derived.js b/src/types/profile-derived.js index 801bcde2da..f6e51959bc 100644 --- a/src/types/profile-derived.js +++ b/src/types/profile-derived.js @@ -85,6 +85,7 @@ export type Thread = {| resourceTable: ResourceTable, nativeSymbols: NativeSymbolTable, jsTracer?: JsTracerTable, + // If present and true, this thread was launched for a private browsing session only. // When false, it can still contain private browsing data if the profile was // captured in a non-fission browser. @@ -95,6 +96,7 @@ export type Thread = {| // It's absent in Firefox 97 and before, or in Firefox 98+ when this thread // had no extra attribute at all. userContextId?: number, + shapes?: Array>, // The fields below this comment are derived data, and not present on the RawThread // in the same form. @@ -105,6 +107,8 @@ export type Thread = {| // The stack samples collected for this thread. This field is different from // RawThread in that the `time` column is always present. samples: SamplesTable, + + argvBuffer?: ArrayBuffer, |}; /** @@ -131,6 +135,7 @@ export type SamplesTable = {| // This property isn't present in normal threads. However it's present for // merged threads, so that we know the origin thread for these samples. threadId?: Tid[], + argv?: Array, length: number, |}; @@ -141,6 +146,7 @@ type SamplesLikeTableShape = { // See the WeightType type for more information. weight: null | number[], weightType: WeightType, + argv?: Array, length: number, }; @@ -157,6 +163,7 @@ export type CounterSamplesTable = {| number?: number[], // The count of the data, for instance for memory this would be bytes. count: number[], + argv?: Array, length: number, |}; diff --git a/src/types/profile.js b/src/types/profile.js index 8022416e2f..46c6eff9df 100644 --- a/src/types/profile.js +++ b/src/types/profile.js @@ -118,6 +118,7 @@ export type RawSamplesTable = {| time?: Milliseconds[], // If the `time` column is not present, then the `timeDeltas` column must be present. timeDeltas?: Milliseconds[], + argv?: Array, // An optional weight array. If not present, then the weight is assumed to be 1. // See the WeightType type for more information. weight: null | number[], @@ -133,6 +134,7 @@ export type RawSamplesTable = {| // This property isn't present in normal threads. However it's present for // merged threads, so that we know the origin thread for these samples. threadId?: Tid[], + argv?: Array, length: number, |}; @@ -165,6 +167,7 @@ export type UnbalancedNativeAllocationsTable = {| weight: Bytes[], weightType: 'bytes', stack: Array, + argv?: Array, length: number, |}; @@ -175,7 +178,7 @@ export type BalancedNativeAllocationsTable = {| ...UnbalancedNativeAllocationsTable, memoryAddress: number[], threadId: number[], -|}; + |}; /** * Native allocations are recorded as a marker payload, but in profile processing they @@ -505,6 +508,7 @@ export type RawCounterSamplesTable = {| number?: number[], // The count of the data, for instance for memory this would be bytes. count: number[], + argv?: Array, length: number, |}; @@ -676,7 +680,9 @@ export type RawThread = {| // It's absent in Firefox 97 and before, or in Firefox 98+ when this thread // had no extra attribute at all. userContextId?: number, -|}; + argvBuffer?: string, + shapes?: Array>, + |}; export type ExtensionTable = {| baseURL: string[], diff --git a/src/utils/value-summaries.js b/src/utils/value-summaries.js new file mode 100644 index 0000000000..6e1104c2d8 --- /dev/null +++ b/src/utils/value-summaries.js @@ -0,0 +1,333 @@ + +const JSVAL_TYPE_DOUBLE = 0x00; +const JSVAL_TYPE_INT32 = 0x01; +const JSVAL_TYPE_BOOLEAN = 0x02; +const JSVAL_TYPE_UNDEFINED = 0x03; +const JSVAL_TYPE_NULL = 0x04; +const JSVAL_TYPE_MAGIC = 0x05; +const JSVAL_TYPE_STRING = 0x06; +const JSVAL_TYPE_SYMBOL = 0x07; +const JSVAL_TYPE_PRIVATE_GCTHING = 0x08; +const JSVAL_TYPE_BIGINT = 0x09; +const JSVAL_TYPE_EXTENDED_PRIMITIVE = 0x0b; +const JSVAL_TYPE_OBJECT = 0x0c; + +const GETTER_SETTER_MAGIC = 0xf; + +const OBJECT_IS_INDEXED_FLAG = 1; +const OBJECT_IS_EXTENSIBLE_FLAG = 2; +const OBJECT_IS_SEALED_FLAG = 4; +const OBJECT_IS_FROZEN_FLAG = 8; + +const NUMBER_IS_OUT_OF_LINE_MAGIC = 0xf; +const MIN_INLINE_INT = -1; +const MAX_INLINE_INT = 13; + +const STRING_TOO_LONG_FLAG = 1; + +const STRING_ENCODING_LATIN1 = 0; +const STRING_ENCODING_TWO_BYTE = 1; +const STRING_ENCODING_UTF8 = 2; + +const OBJECT_KIND_NATIVE_OBJECT = 42 + 0; +const OBJECT_KIND_ARRAY_LIKE = 42 + 1; +const OBJECT_KIND_MAP_LIKE = 42 + 2; +const OBJECT_KIND_ERROR = 42 + 3; +const OBJECT_KIND_FUNCTION = 42 + 4; +const OBJECT_KIND_EXTERNAL = 42 + 5; +const OBJECT_KIND_NOT_IMPLEMENTED = 42 + 6; + +const EXTERNAL_SUMMARY_KIND_UNKNOWN = 0; +const EXTERNAL_SUMMARY_KIND_ELEMENT = 1; +const EXTERNAL_SUMMARY_KIND_OTHER_NODE = 2; + +class BufferReader { + #view; + #index; + + constructor(buffer, index = 0) { + this.#view = new DataView(buffer); + this.#index = index; + } + + peekUint8() { + return this.#view.getUint8(this.#index); + } + + readUint8() { + let result = this.#view.getUint8(this.#index); + this.#index += 1; + return result; + } + + readUint16() { + let result = this.#view.getUint16(this.#index, true); + this.#index += 2; + return result; + } + + readUint32() { + let result = this.#view.getUint32(this.#index, true); + this.#index += 4; + return result; + } + + readInt8() { + let result = this.#view.getInt8(this.#index); + this.#index += 1; + return result; + } + + readInt16() { + let result = this.#view.getInt16(this.#index, true); + this.#index += 2; + return result; + } + + readInt32() { + let result = this.#view.getInt32(this.#index, true); + this.#index += 4; + return result; + } + + readFloat32() { + let result = this.#view.getFloat32(this.#index, true); + this.#index += 4; + return result; + } + + readFloat64() { + let result = this.#view.getFloat64(this.#index, true); + this.#index += 8; + return result; + } + + readString() { + let encoding = this.readUint8(); + let length = this.readUint32(); + if (length == 0) { + return ""; + } + let result = ""; + if (encoding == STRING_ENCODING_LATIN1) { + let decoder = new TextDecoder("latin1"); + result = decoder.decode(this.#view.buffer.slice(this.#index, this.#index + length)); + this.#index += length; + } else if (encoding == STRING_ENCODING_UTF8) { + let decoder = new TextDecoder("utf-8"); + result = decoder.decode(this.#view.buffer.slice(this.#index, this.#index + length)); + this.#index += length; + } else if (encoding == STRING_ENCODING_TWO_BYTE) { + let decoder = new TextDecoder("utf-16"); // this isn't quite right, is it? ugh. + let size = length * 2; + result = decoder.decode(this.#view.buffer.slice(this.#index, this.#index + size)); + this.#index += size; + } + return result; + } +} + +function readNativeObjectSummary(result, reader, flags, depth, shapes) { + if (depth > 1) { + return; + } + + let preview = {}; + + preview.kind = "Object"; + + let shapeId = reader.readUint32(); + let shape = shapes[shapeId]; + + if (!shape) { + return; + } + + let indexed = !!(flags & OBJECT_IS_INDEXED_FLAG); + let ownProperties = {}; + let ownPropertyLength = 0; + + if (indexed) { + let elementsLength = reader.readUint32(); + for (let i = 0; i < elementsLength; i++) { + ownPropertyLength++; + let nestedSummary = readValueSummary(reader, depth, shapes); + ownProperties[i] = { + configurable: true, + enumerable: true, + writable: true, + value: nestedSummary, + }; + } + } + + result.class = shape[0]; + for (let i = 1; i < shape.length; i++) { + ownPropertyLength++; + let header = reader.peekUint8(); + let id = shape[i]; + let desc = { + configurable: true, + enumerable: true, + get: undefined, + set: undefined, + }; + if ((header & 0xf) == GETTER_SETTER_MAGIC) { + reader.readUint8(); + desc.get = readValueSummary(reader, depth, shapes); + desc.set = readValueSummary(reader, depth, shapes); + } else { + let nestedSummary = readValueSummary(reader, depth, shapes); + desc.writable = true; + desc.value = nestedSummary; + } + ownProperties[id] = desc; + } + + preview.ownProperties = ownProperties; + + result.preview = preview; +} + +function readExternalObjectSummary(result, reader, flags, depth, shapes) { + let preview = {}; + + result.class = reader.readString(); + let kind = reader.readUint8(); + + if (kind == EXTERNAL_SUMMARY_KIND_UNKNOWN) { + return; + } + + let isConnected = !!reader.readUint8(); + let nodeType = reader.readUint16(); + preview.kind = "DOMNode"; + preview.isConnected = isConnected; + preview.nodeType = nodeType; + + if (kind == EXTERNAL_SUMMARY_KIND_ELEMENT) { + preview.nodeName = reader.readString(); + let numAttributes = reader.readUint32(); + preview.attributes = {}; + preview.attributesLength = numAttributes; + for (let i = 0; i < numAttributes; i++) { + let attrName = reader.readString(); + let attrVal = reader.readString(); + preview.attributes[attrName] = attrVal; + } + } + + result.preview = preview; +} + +function readObjectSummary(reader, flags, depth, shapes) { + let extensible = !!(flags & OBJECT_IS_EXTENSIBLE_FLAG); + let frozen = !!(flags & OBJECT_IS_FROZEN_FLAG); + let sealed = !!(flags & OBJECT_IS_SEALED_FLAG); + + let result = { + type: "object", + class: undefined, + ownPropertyLength: 0, + isError: false, + extensible, + sealed, + frozen, + }; + + let kind = reader.readUint8(); + switch (kind) { + case OBJECT_KIND_ARRAY_LIKE: + result.class = "Array"; + break; + case OBJECT_KIND_MAP_LIKE: + result.class = "Map"; + break; + case OBJECT_KIND_ERROR: + result.class = "Error"; + break; + case OBJECT_KIND_FUNCTION: + result.class = "Function"; + break; + case OBJECT_KIND_EXTERNAL: + readExternalObjectSummary(result, reader, flags, depth + 1, shapes); + break; + case OBJECT_KIND_NOT_IMPLEMENTED: + result.class = reader.readString(); + break; + case OBJECT_KIND_NATIVE_OBJECT: { + readNativeObjectSummary(result, reader, flags, depth + 1, shapes); + break; + } + default: + throw new Error("Bad object kind"); + } + + return result; +} + +function readValueSummary(reader, depth, shapes) { + let header = reader.readUint8(); + let type = header & 0x0f; + let flags = (header & 0xf0) >> 4; + switch (type) { + case JSVAL_TYPE_DOUBLE: + if (flags == NUMBER_IS_OUT_OF_LINE_MAGIC) { + return reader.readFloat64(); + } else { + return 0; + } + case JSVAL_TYPE_INT32: + if (flags == NUMBER_IS_OUT_OF_LINE_MAGIC) { + return reader.readInt32(); + } else { + return flags + MIN_INLINE_INT; + } + case JSVAL_TYPE_BOOLEAN: + return !!flags; + case JSVAL_TYPE_NULL: + return null; + case JSVAL_TYPE_UNDEFINED: + case JSVAL_TYPE_MAGIC: + case JSVAL_TYPE_PRIVATE_GCTHING: + case JSVAL_TYPE_SYMBOL: + case JSVAL_TYPE_BIGINT: + case JSVAL_TYPE_EXTENDED_PRIMITIVE: + return undefined; + case JSVAL_TYPE_STRING: { + if (flags & STRING_TOO_LONG_FLAG) { + return "" + } else { + return reader.readString(); + } + } + case JSVAL_TYPE_OBJECT: { + return readObjectSummary(reader, flags, depth, shapes); + } + default: + throw new Error("Bad value type"); + } +} + +export function getArgvSummaries(thread, argvIndex) { + if (argvIndex == -2) { + return []; + } + if (argvIndex == -1) { + return ""; + } + let reader = new BufferReader(thread.argvBuffer, argvIndex); + let argc = reader.readUint32(); + let args = new Array(argc); + for (let i = 0; i < argc; i++) { + args[i] = readValueSummary(reader, 0, thread.shapes); + } + return args; +} + +export function base64StringToArrayBuffer(str) { + if (Uint8Array.fromBase64) { + return Uint8Array.fromBase64(str).buffer; + } + return null; +} diff --git a/yarn.lock b/yarn.lock index 59782fd257..e3c240cde9 100644 --- a/yarn.lock +++ b/yarn.lock @@ -53,7 +53,7 @@ "@nicolo-ribaudo/chokidar-2" "2.1.8-no-fsevents.3" chokidar "^3.6.0" -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.16.0", "@babel/code-frame@^7.25.9", "@babel/code-frame@^7.26.2", "@babel/code-frame@^7.8.3": +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.16.0", "@babel/code-frame@^7.25.9", "@babel/code-frame@^7.26.0", "@babel/code-frame@^7.8.3": version "7.26.2" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.26.2.tgz#4b5fab97d33338eff916235055f0ebc21e573a85" integrity sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ== @@ -62,36 +62,36 @@ js-tokens "^4.0.0" picocolors "^1.0.0" -"@babel/compat-data@^7.22.6", "@babel/compat-data@^7.26.5": - version "7.26.5" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.26.5.tgz#df93ac37f4417854130e21d72c66ff3d4b897fc7" - integrity sha512-XvcZi1KWf88RVbF9wn8MN6tYFloU5qX8KjuF3E1PVBmJ9eypXfs4GRiJwLuTZL0iSnJUKn1BFPa5BPZZJyFzPg== +"@babel/compat-data@^7.22.6", "@babel/compat-data@^7.25.9", "@babel/compat-data@^7.26.0": + version "7.26.2" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.26.2.tgz#278b6b13664557de95b8f35b90d96785850bb56e" + integrity sha512-Z0WgzSEa+aUcdiJuCIqgujCshpMWgUpgOxXotrYPSA53hA3qopNaqcJpyr0hVb1FeWdnqFA35/fUtXgBK8srQg== -"@babel/core@^7.0.0", "@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.24.4", "@babel/core@^7.26.7": - version "7.26.7" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.26.7.tgz#0439347a183b97534d52811144d763a17f9d2b24" - integrity sha512-SRijHmF0PSPgLIBYlWnG0hyeJLwXE2CgpsXaMOrtt2yp9/86ALw6oUlj9KYuZ0JN07T4eBMVIW4li/9S1j2BGA== +"@babel/core@^7.0.0", "@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.24.4", "@babel/core@^7.26.0": + version "7.26.0" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.26.0.tgz#d78b6023cc8f3114ccf049eb219613f74a747b40" + integrity sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg== dependencies: "@ampproject/remapping" "^2.2.0" - "@babel/code-frame" "^7.26.2" - "@babel/generator" "^7.26.5" - "@babel/helper-compilation-targets" "^7.26.5" + "@babel/code-frame" "^7.26.0" + "@babel/generator" "^7.26.0" + "@babel/helper-compilation-targets" "^7.25.9" "@babel/helper-module-transforms" "^7.26.0" - "@babel/helpers" "^7.26.7" - "@babel/parser" "^7.26.7" + "@babel/helpers" "^7.26.0" + "@babel/parser" "^7.26.0" "@babel/template" "^7.25.9" - "@babel/traverse" "^7.26.7" - "@babel/types" "^7.26.7" + "@babel/traverse" "^7.25.9" + "@babel/types" "^7.26.0" convert-source-map "^2.0.0" debug "^4.1.0" gensync "^1.0.0-beta.2" json5 "^2.2.3" semver "^6.3.1" -"@babel/eslint-parser@^7.26.8": - version "7.26.8" - resolved "https://registry.yarnpkg.com/@babel/eslint-parser/-/eslint-parser-7.26.8.tgz#55c4f4aae4970ae127f7a12369182ed6250e6f09" - integrity sha512-3tBctaHRW6xSub26z7n8uyOTwwUsCdvIug/oxBH9n6yCO5hMj2vwDJAo7RbBMKrM7P+W2j61zLKviJQFGOYKMg== +"@babel/eslint-parser@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/eslint-parser/-/eslint-parser-7.25.9.tgz#603c68a63078796527bc9d0833f5e52dd5f9224c" + integrity sha512-5UXfgpK0j0Xr/xIdgdLEhOFxaDZ0bRPWJJchRpqOSur/3rZoPbqqki5mm0p4NE2cs28krBEiSM2MB7//afRSQQ== dependencies: "@nicolo-ribaudo/eslint-scope-5-internals" "5.1.1-v1" eslint-visitor-keys "^2.1.0" @@ -104,13 +104,13 @@ dependencies: eslint-rule-composer "^0.3.0" -"@babel/generator@^7.26.5", "@babel/generator@^7.7.2": - version "7.26.5" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.26.5.tgz#e44d4ab3176bbcaf78a5725da5f1dc28802a9458" - integrity sha512-2caSP6fN9I7HOe6nqhtft7V4g7/V/gfDsC3Ag4W7kEzzvRGKqiv0pu0HogPiZ3KaVSoNDhUws6IJjDjpfmYIXw== +"@babel/generator@^7.25.9", "@babel/generator@^7.26.0", "@babel/generator@^7.7.2": + version "7.26.2" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.26.2.tgz#87b75813bec87916210e5e01939a4c823d6bb74f" + integrity sha512-zevQbhbau95nkoxSq3f/DC/SC+EEOUZd3DYqfSkMhY2/wfSeaHV1Ew4vk8e+x8lja31IbyuUa2uQ3JONqKbysw== dependencies: - "@babel/parser" "^7.26.5" - "@babel/types" "^7.26.5" + "@babel/parser" "^7.26.2" + "@babel/types" "^7.26.0" "@jridgewell/gen-mapping" "^0.3.5" "@jridgewell/trace-mapping" "^0.3.25" jsesc "^3.0.2" @@ -122,12 +122,20 @@ dependencies: "@babel/types" "^7.25.9" -"@babel/helper-compilation-targets@^7.22.6", "@babel/helper-compilation-targets@^7.25.9", "@babel/helper-compilation-targets@^7.26.5": - version "7.26.5" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.26.5.tgz#75d92bb8d8d51301c0d49e52a65c9a7fe94514d8" - integrity sha512-IXuyn5EkouFJscIDuFF5EsiSolseme1s0CZB+QxVugqJLYmKdxI1VfIBOst0SUu4rnk2Z7kqTwmoO1lp3HIfnA== +"@babel/helper-builder-binary-assignment-operator-visitor@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.25.9.tgz#f41752fe772a578e67286e6779a68a5a92de1ee9" + integrity sha512-C47lC7LIDCnz0h4vai/tpNOI95tCd5ZT3iBt/DBH5lXKHZsyNQv18yf1wIIg2ntiQNgmAvA+DgZ82iW8Qdym8g== dependencies: - "@babel/compat-data" "^7.26.5" + "@babel/traverse" "^7.25.9" + "@babel/types" "^7.25.9" + +"@babel/helper-compilation-targets@^7.22.6", "@babel/helper-compilation-targets@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.9.tgz#55af025ce365be3cdc0c1c1e56c6af617ce88875" + integrity sha512-j9Db8Suy6yV/VHa4qzrj9yZfZxhLWQdVnRlXxmKLYlhWUVB1sB2G5sxuWYXk/whHD9iW76PmNzxZ4UCnTQTVEQ== + dependencies: + "@babel/compat-data" "^7.25.9" "@babel/helper-validator-option" "^7.25.9" browserslist "^4.24.0" lru-cache "^5.1.1" @@ -198,10 +206,10 @@ dependencies: "@babel/types" "^7.25.9" -"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.25.9", "@babel/helper-plugin-utils@^7.26.5", "@babel/helper-plugin-utils@^7.8.0": - version "7.26.5" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.26.5.tgz#18580d00c9934117ad719392c4f6585c9333cc35" - integrity sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg== +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.25.9", "@babel/helper-plugin-utils@^7.8.0": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.25.9.tgz#9cbdd63a9443a2c92a725cca7ebca12cc8dd9f46" + integrity sha512-kSMlyUVdWe25rEsRGviIgOWnoT/nfABVWlqt9N19/dIPWViAOW2s9wznP5tURbs/IDuNk4gPy3YdYRgH3uxhBw== "@babel/helper-remap-async-to-generator@^7.25.9": version "7.25.9" @@ -221,6 +229,14 @@ "@babel/helper-optimise-call-expression" "^7.25.9" "@babel/traverse" "^7.25.9" +"@babel/helper-simple-access@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.25.9.tgz#6d51783299884a2c74618d6ef0f86820ec2e7739" + integrity sha512-c6WHXuiaRsJTyHYLJV75t9IqsmTbItYfdj99PnzYGQZkYKvan5/2jKJ7gu31J3/BJ/A18grImSPModuyG/Eo0Q== + dependencies: + "@babel/traverse" "^7.25.9" + "@babel/types" "^7.25.9" + "@babel/helper-skip-transparent-expression-wrappers@^7.25.9": version "7.25.9" resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.25.9.tgz#0b2e1b62d560d6b1954893fd2b705dc17c91f0c9" @@ -253,13 +269,13 @@ "@babel/traverse" "^7.25.9" "@babel/types" "^7.25.9" -"@babel/helpers@^7.26.7": - version "7.26.7" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.26.7.tgz#fd1d2a7c431b6e39290277aacfd8367857c576a4" - integrity sha512-8NHiL98vsi0mbPQmYAGWwfcFaOy4j2HY49fXJCfuDcdE7fMIsH9a7GdaeXpIBsbT7307WU8KCMp5pUVDNL4f9A== +"@babel/helpers@^7.26.0": + version "7.26.0" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.26.0.tgz#30e621f1eba5aa45fe6f4868d2e9154d884119a4" + integrity sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw== dependencies: "@babel/template" "^7.25.9" - "@babel/types" "^7.26.7" + "@babel/types" "^7.26.0" "@babel/highlight@^7.9.0": version "7.25.7" @@ -271,12 +287,12 @@ js-tokens "^4.0.0" picocolors "^1.0.0" -"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.25.9", "@babel/parser@^7.26.5", "@babel/parser@^7.26.7", "@babel/parser@^7.7.0": - version "7.26.7" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.26.7.tgz#e114cd099e5f7d17b05368678da0fb9f69b3385c" - integrity sha512-kEvgGGgEjRUutvdVvZhbn/BxVt+5VSpwXz1j3WYXQbXDo8KzFOPNG2GQbdAiNq8g6wn1yKk7C/qrke03a84V+w== +"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.25.9", "@babel/parser@^7.26.0", "@babel/parser@^7.26.2", "@babel/parser@^7.7.0": + version "7.26.2" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.26.2.tgz#fd7b6f487cfea09889557ef5d4eeb9ff9a5abd11" + integrity sha512-DWMCZH9WA4Maitz2q21SRKHo9QXZxkDsbNZoVD62gusNtNBBqDg9i7uOhASfTfIGNzW+O+r7+jAlM8dwphcJKQ== dependencies: - "@babel/types" "^7.26.7" + "@babel/types" "^7.26.0" "@babel/plugin-bugfix-firefox-class-in-computed-class-key@^7.25.9": version "7.25.9" @@ -482,12 +498,12 @@ "@babel/helper-plugin-utils" "^7.25.9" "@babel/helper-remap-async-to-generator" "^7.25.9" -"@babel/plugin-transform-block-scoped-functions@^7.26.5": - version "7.26.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.26.5.tgz#3dc4405d31ad1cbe45293aa57205a6e3b009d53e" - integrity sha512-chuTSY+hq09+/f5lMj8ZSYgCFpppV2CbYrhNFJ1BFoXpiWPnnAb7R0MqrafCpN8E1+YRrtM1MXZHJdIx8B6rMQ== +"@babel/plugin-transform-block-scoped-functions@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.25.9.tgz#5700691dbd7abb93de300ca7be94203764fce458" + integrity sha512-toHc9fzab0ZfenFpsyYinOX0J/5dgJVA2fm64xPewu7CoYHWEivIWKxkK2rMi4r3yQqLnVmheMXRdG+k239CgA== dependencies: - "@babel/helper-plugin-utils" "^7.26.5" + "@babel/helper-plugin-utils" "^7.25.9" "@babel/plugin-transform-block-scoping@^7.25.9": version "7.25.9" @@ -569,11 +585,12 @@ dependencies: "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-exponentiation-operator@^7.26.3": - version "7.26.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.26.3.tgz#e29f01b6de302c7c2c794277a48f04a9ca7f03bc" - integrity sha512-7CAHcQ58z2chuXPWblnn1K6rLDnDWieghSOEmqQsrBenH0P9InCUtOJYD89pvngljmZlJcz3fcmgYsXFNGa1ZQ== +"@babel/plugin-transform-exponentiation-operator@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.25.9.tgz#ece47b70d236c1d99c263a1e22b62dc20a4c8b0f" + integrity sha512-KRhdhlVk2nObA5AYa7QMgTMTVJdfHprfpAk4DjZVtllqRg9qarilstTKEhpVjyt+Npi8ThRyiV8176Am3CodPA== dependencies: + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.25.9" "@babel/helper-plugin-utils" "^7.25.9" "@babel/plugin-transform-export-namespace-from@^7.25.9": @@ -644,13 +661,14 @@ "@babel/helper-module-transforms" "^7.25.9" "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-modules-commonjs@^7.26.3": - version "7.26.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.26.3.tgz#8f011d44b20d02c3de44d8850d971d8497f981fb" - integrity sha512-MgR55l4q9KddUDITEzEFYn5ZsGDXMSsU9E+kh7fjRXTIC3RHqfCo8RPRbyReYJh44HQ/yomFkqbOFohXvDCiIQ== +"@babel/plugin-transform-modules-commonjs@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.25.9.tgz#d165c8c569a080baf5467bda88df6425fc060686" + integrity sha512-dwh2Ol1jWwL2MgkCzUSOvfmKElqQcuswAZypBSUsScMXvgdT8Ekq5YA6TtqpTVWH+4903NmboMuH1o9i8Rxlyg== dependencies: - "@babel/helper-module-transforms" "^7.26.0" + "@babel/helper-module-transforms" "^7.25.9" "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-simple-access" "^7.25.9" "@babel/plugin-transform-modules-systemjs@^7.25.9": version "7.25.9" @@ -685,12 +703,12 @@ dependencies: "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-nullish-coalescing-operator@^7.26.6": - version "7.26.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.26.6.tgz#fbf6b3c92cb509e7b319ee46e3da89c5bedd31fe" - integrity sha512-CKW8Vu+uUZneQCPtXmSBUC6NCAUdya26hWCElAWh5mVSlSRsmiCPUUDKb3Z0szng1hiAJa098Hkhg9o4SE35Qw== +"@babel/plugin-transform-nullish-coalescing-operator@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.25.9.tgz#bcb1b0d9e948168102d5f7104375ca21c3266949" + integrity sha512-ENfftpLZw5EItALAD4WsY/KUWvhUlZndm5GC7G3evUsVeSJB6p0pBeLQUnRnBCBx7zV0RKQjR9kCuwrsIrjWog== dependencies: - "@babel/helper-plugin-utils" "^7.26.5" + "@babel/helper-plugin-utils" "^7.25.9" "@babel/plugin-transform-numeric-separator@^7.25.9": version "7.25.9" @@ -847,12 +865,12 @@ dependencies: "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-typeof-symbol@^7.26.7": - version "7.26.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.26.7.tgz#d0e33acd9223744c1e857dbd6fa17bd0a3786937" - integrity sha512-jfoTXXZTgGg36BmhqT3cAYK5qkmqvJpvNrPhaK/52Vgjhw4Rq29s9UqpWWV0D6yuRmgiFH/BUVlkl96zJWqnaw== +"@babel/plugin-transform-typeof-symbol@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.25.9.tgz#224ba48a92869ddbf81f9b4a5f1204bbf5a2bc4b" + integrity sha512-v61XqUMiueJROUv66BVIOi0Fv/CUuZuZMl5NkRoCVxLAnMexZ0A3kMe7vvZ0nulxMuMp0Mk6S5hNh48yki08ZA== dependencies: - "@babel/helper-plugin-utils" "^7.26.5" + "@babel/helper-plugin-utils" "^7.25.9" "@babel/plugin-transform-unicode-escapes@^7.25.9": version "7.25.9" @@ -885,14 +903,14 @@ "@babel/helper-create-regexp-features-plugin" "^7.25.9" "@babel/helper-plugin-utils" "^7.25.9" -"@babel/preset-env@^7.11.0", "@babel/preset-env@^7.26.7": - version "7.26.7" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.26.7.tgz#24d38e211f4570b8d806337035cc3ae798e0c36d" - integrity sha512-Ycg2tnXwixaXOVb29rana8HNPgLVBof8qqtNQ9LE22IoyZboQbGSxI6ZySMdW3K5nAe6gu35IaJefUJflhUFTQ== +"@babel/preset-env@^7.11.0", "@babel/preset-env@^7.26.0": + version "7.26.0" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.26.0.tgz#30e5c6bc1bcc54865bff0c5a30f6d4ccdc7fa8b1" + integrity sha512-H84Fxq0CQJNdPFT2DrfnylZ3cf5K43rGfWK4LJGPpjKHiZlk0/RzwEus3PDDZZg+/Er7lCA03MVacueUuXdzfw== dependencies: - "@babel/compat-data" "^7.26.5" - "@babel/helper-compilation-targets" "^7.26.5" - "@babel/helper-plugin-utils" "^7.26.5" + "@babel/compat-data" "^7.26.0" + "@babel/helper-compilation-targets" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" "@babel/helper-validator-option" "^7.25.9" "@babel/plugin-bugfix-firefox-class-in-computed-class-key" "^7.25.9" "@babel/plugin-bugfix-safari-class-field-initializer-scope" "^7.25.9" @@ -906,7 +924,7 @@ "@babel/plugin-transform-arrow-functions" "^7.25.9" "@babel/plugin-transform-async-generator-functions" "^7.25.9" "@babel/plugin-transform-async-to-generator" "^7.25.9" - "@babel/plugin-transform-block-scoped-functions" "^7.26.5" + "@babel/plugin-transform-block-scoped-functions" "^7.25.9" "@babel/plugin-transform-block-scoping" "^7.25.9" "@babel/plugin-transform-class-properties" "^7.25.9" "@babel/plugin-transform-class-static-block" "^7.26.0" @@ -917,7 +935,7 @@ "@babel/plugin-transform-duplicate-keys" "^7.25.9" "@babel/plugin-transform-duplicate-named-capturing-groups-regex" "^7.25.9" "@babel/plugin-transform-dynamic-import" "^7.25.9" - "@babel/plugin-transform-exponentiation-operator" "^7.26.3" + "@babel/plugin-transform-exponentiation-operator" "^7.25.9" "@babel/plugin-transform-export-namespace-from" "^7.25.9" "@babel/plugin-transform-for-of" "^7.25.9" "@babel/plugin-transform-function-name" "^7.25.9" @@ -926,12 +944,12 @@ "@babel/plugin-transform-logical-assignment-operators" "^7.25.9" "@babel/plugin-transform-member-expression-literals" "^7.25.9" "@babel/plugin-transform-modules-amd" "^7.25.9" - "@babel/plugin-transform-modules-commonjs" "^7.26.3" + "@babel/plugin-transform-modules-commonjs" "^7.25.9" "@babel/plugin-transform-modules-systemjs" "^7.25.9" "@babel/plugin-transform-modules-umd" "^7.25.9" "@babel/plugin-transform-named-capturing-groups-regex" "^7.25.9" "@babel/plugin-transform-new-target" "^7.25.9" - "@babel/plugin-transform-nullish-coalescing-operator" "^7.26.6" + "@babel/plugin-transform-nullish-coalescing-operator" "^7.25.9" "@babel/plugin-transform-numeric-separator" "^7.25.9" "@babel/plugin-transform-object-rest-spread" "^7.25.9" "@babel/plugin-transform-object-super" "^7.25.9" @@ -948,7 +966,7 @@ "@babel/plugin-transform-spread" "^7.25.9" "@babel/plugin-transform-sticky-regex" "^7.25.9" "@babel/plugin-transform-template-literals" "^7.25.9" - "@babel/plugin-transform-typeof-symbol" "^7.26.7" + "@babel/plugin-transform-typeof-symbol" "^7.25.9" "@babel/plugin-transform-unicode-escapes" "^7.25.9" "@babel/plugin-transform-unicode-property-regex" "^7.25.9" "@babel/plugin-transform-unicode-regex" "^7.25.9" @@ -1006,23 +1024,23 @@ "@babel/parser" "^7.25.9" "@babel/types" "^7.25.9" -"@babel/traverse@^7.25.9", "@babel/traverse@^7.26.7", "@babel/traverse@^7.7.0": - version "7.26.7" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.26.7.tgz#99a0a136f6a75e7fb8b0a1ace421e0b25994b8bb" - integrity sha512-1x1sgeyRLC3r5fQOM0/xtQKsYjyxmFjaOrLJNtZ81inNjyJHGIolTULPiSc/2qe1/qfpFLisLQYFnnZl7QoedA== +"@babel/traverse@^7.25.9", "@babel/traverse@^7.7.0": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.25.9.tgz#a50f8fe49e7f69f53de5bea7e413cd35c5e13c84" + integrity sha512-ZCuvfwOwlz/bawvAuvcj8rrithP2/N55Tzz342AkTvq4qaWbGfmCk/tKhNaV2cthijKrPAA8SRJV5WWe7IBMJw== dependencies: - "@babel/code-frame" "^7.26.2" - "@babel/generator" "^7.26.5" - "@babel/parser" "^7.26.7" + "@babel/code-frame" "^7.25.9" + "@babel/generator" "^7.25.9" + "@babel/parser" "^7.25.9" "@babel/template" "^7.25.9" - "@babel/types" "^7.26.7" + "@babel/types" "^7.25.9" debug "^4.3.1" globals "^11.1.0" -"@babel/types@^7.0.0", "@babel/types@^7.25.9", "@babel/types@^7.26.5", "@babel/types@^7.26.7", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4", "@babel/types@^7.7.0": - version "7.26.7" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.26.7.tgz#5e2b89c0768e874d4d061961f3a5a153d71dc17a" - integrity sha512-t8kDRGrKXyp6+tjUh7hw2RLyclsW4TRoRvRHtSyAX9Bb5ldlFh+90YAYY6awRXrlB4G5G2izNeGySpATlFzmOg== +"@babel/types@^7.0.0", "@babel/types@^7.25.9", "@babel/types@^7.26.0", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4", "@babel/types@^7.7.0": + version "7.26.0" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.26.0.tgz#deabd08d6b753bc8e0f198f8709fb575e31774ff" + integrity sha512-Z/yiTPj+lDVnF7lWeKCIJzaIkI0vYO87dMpZ4bg4TDrFe4XXLFWL1TbXU27gBP3QccxV9mZICCrnjnYlJjXHOA== dependencies: "@babel/helper-string-parser" "^7.25.9" "@babel/helper-validator-identifier" "^7.25.9" @@ -1092,17 +1110,17 @@ "@codemirror/view" "^6.0.0" crelt "^1.0.5" -"@codemirror/state@^6.0.0", "@codemirror/state@^6.5.0", "@codemirror/state@^6.5.2": - version "6.5.2" - resolved "https://registry.yarnpkg.com/@codemirror/state/-/state-6.5.2.tgz#8eca3a64212a83367dc85475b7d78d5c9b7076c6" - integrity sha512-FVqsPqtPWKVVL3dPSxy8wEF/ymIEuVzF1PK3VbUgrxXpJUSHQWWZz4JMToquRxnkw+36LTamCZG2iua2Ptq0fA== +"@codemirror/state@^6.0.0", "@codemirror/state@^6.5.0": + version "6.5.0" + resolved "https://registry.yarnpkg.com/@codemirror/state/-/state-6.5.0.tgz#e98dde85620618651543152fe1c2483300a0ccc9" + integrity sha512-MwBHVK60IiIHDcoMet78lxt6iw5gJOGSbNbOIVBHWVXIH4/Nq1+GQgLLGgI1KlnN86WDXsPudVaqYHKBIx7Eyw== dependencies: "@marijn/find-cluster-break" "^1.0.0" -"@codemirror/view@^6.0.0", "@codemirror/view@^6.17.0", "@codemirror/view@^6.23.0", "@codemirror/view@^6.36.2": - version "6.36.2" - resolved "https://registry.yarnpkg.com/@codemirror/view/-/view-6.36.2.tgz#aeb644e161440734ac5a153bf6e5b4a4355047be" - integrity sha512-DZ6ONbs8qdJK0fdN7AB82CgI6tYXf4HWk1wSVa0+9bhVznCuuvhQtX8bFBoy3dv8rZSQqUd8GvhVAcielcidrA== +"@codemirror/view@^6.0.0", "@codemirror/view@^6.17.0", "@codemirror/view@^6.23.0", "@codemirror/view@^6.36.1": + version "6.36.1" + resolved "https://registry.yarnpkg.com/@codemirror/view/-/view-6.36.1.tgz#3c543b8fd72c96b30c4b2b1464d1ebce7e0c5c4b" + integrity sha512-miD1nyT4m4uopZaDdO2uXU/LLHliKNYL9kB1C1wJHrunHLm/rpkb5QVSokqgw9hFqEZakrdlb/VGWX8aYZTslQ== dependencies: "@codemirror/state" "^6.5.0" style-mod "^4.1.0" @@ -1956,17 +1974,17 @@ lodash "^4.17.21" redent "^3.0.0" -"@testing-library/react@^16.2.0": - version "16.2.0" - resolved "https://registry.yarnpkg.com/@testing-library/react/-/react-16.2.0.tgz#c96126ee01a49cdb47175721911b4a9432afc601" - integrity sha512-2cSskAvA1QNtKc8Y9VJQRv0tm3hLVgxRGDB+KYhIaPQJ1I+RHbhIXcM+zClKXzMes/wshsMVzf4B9vS4IZpqDQ== +"@testing-library/react@^16.1.0": + version "16.1.0" + resolved "https://registry.yarnpkg.com/@testing-library/react/-/react-16.1.0.tgz#aa0c61398bac82eaf89776967e97de41ac742d71" + integrity sha512-Q2ToPvg0KsVL0ohND9A3zLJWcOXXcO8IDu3fj11KhNt0UlCWyFyvnCIBkd12tidB2lkiVRG8VFqdhcqhqnAQtg== dependencies: "@babel/runtime" "^7.12.5" -"@tgwf/co2@^0.16.6": - version "0.16.6" - resolved "https://registry.yarnpkg.com/@tgwf/co2/-/co2-0.16.6.tgz#2b27b04bbf3dbac73d516ac830be58405803de8f" - integrity sha512-WReiyh8S7KC963elYn57/p0bt/aZ2pfOt6oCnkOQzndgc/xCWVWAZdrk8mmgh/qGfM5MPG0/y+5qvDgK+DrEzg== +"@tgwf/co2@^0.16.4": + version "0.16.4" + resolved "https://registry.yarnpkg.com/@tgwf/co2/-/co2-0.16.4.tgz#6b40ed0be4c12d31d3e3070299db696958129d27" + integrity sha512-op5k5s84hzTcqbanoWC3Kh/uz0MW9akaSqyRSdAW0yiHnhZmcw+/Edn+mgjZuZ4q4ZtdOC2dC0jog1lDoDICKQ== "@tootallnate/once@1": version "1.1.2" @@ -3288,10 +3306,10 @@ browser-process-hrtime@^1.0.0: resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz#3c9b4b7d782c8121e56f10106d84c0d0ffc94626" integrity sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow== -browserslist@^4.0.0, browserslist@^4.23.3, browserslist@^4.24.0, browserslist@^4.24.4: - version "4.24.4" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.24.4.tgz#c6b2865a3f08bcb860a0e827389003b9fe686e4b" - integrity sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A== +browserslist@^4.0.0, browserslist@^4.23.3, browserslist@^4.24.0, browserslist@^4.24.3: + version "4.24.3" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.24.3.tgz#5fc2725ca8fb3c1432e13dac278c7cc103e026d2" + integrity sha512-1CPmv8iobE2fyRMV97dAcMVegvvWKxmq94hkLiAkUGwKVTyDLw33K+ZxiFrREKmmps4rIw6grcCFCnTMSZ/YiA== dependencies: caniuse-lite "^1.0.30001688" electron-to-chromium "^1.5.73" @@ -3494,10 +3512,10 @@ caniuse-api@^3.0.0: lodash.memoize "^4.1.2" lodash.uniq "^4.5.0" -caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001646, caniuse-lite@^1.0.30001688, caniuse-lite@^1.0.30001699: - version "1.0.30001699" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001699.tgz#a102cf330d153bf8c92bfb5be3cd44c0a89c8c12" - integrity sha512-b+uH5BakXZ9Do9iK+CkDmctUSEqZl+SP056vc5usa0PL+ev5OHw003rZXcnjNDv3L8P5j6rwT6C0BPKSikW08w== +caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001646, caniuse-lite@^1.0.30001688: + version "1.0.30001698" + resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001698.tgz" + integrity sha512-xJ3km2oiG/MbNU8G6zIq6XRZ6HtAOVXsbOrP/blGazi52kc5Yy7b6sDA5O+FbROzRrV7BSTllLHuNvmawYUJjw== ccount@^2.0.0: version "2.0.1" @@ -5096,17 +5114,17 @@ eslint-plugin-jest-formatting@^3.1.0: resolved "https://registry.yarnpkg.com/eslint-plugin-jest-formatting/-/eslint-plugin-jest-formatting-3.1.0.tgz#b26dd5a40f432b642dcc880021a771bb1c93dcd2" integrity sha512-XyysraZ1JSgGbLSDxjj5HzKKh0glgWf+7CkqxbTqb7zEhW7X2WHo5SBQ8cGhnszKN+2Lj3/oevBlHNbHezoc/A== -eslint-plugin-jest@^28.11.0: - version "28.11.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-jest/-/eslint-plugin-jest-28.11.0.tgz#2641ecb4411941bbddb3d7cf8a8ff1163fbb510e" - integrity sha512-QAfipLcNCWLVocVbZW8GimKn5p5iiMcgGbRzz8z/P5q7xw+cNEpYqyzFMtIF/ZgF2HLOyy+dYBut+DoYolvqig== +eslint-plugin-jest@^28.10.0: + version "28.10.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-jest/-/eslint-plugin-jest-28.10.0.tgz#4b35b8abb0f7cfe699bff8d9060270a2ddd770ea" + integrity sha512-hyMWUxkBH99HpXT3p8hc7REbEZK3D+nk8vHXGgpB+XXsi0gO4PxMSP+pjfUzb67GnV9yawV9a53eUmcde1CCZA== dependencies: "@typescript-eslint/utils" "^6.0.0 || ^7.0.0 || ^8.0.0" -eslint-plugin-react@^7.37.4: - version "7.37.4" - resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.37.4.tgz#1b6c80b6175b6ae4b26055ae4d55d04c414c7181" - integrity sha512-BGP0jRmfYyvOyvMoRX/uoUeW+GqNj9y16bPQzqAHf3AYII/tDs+jMN0dBVkl88/OZwNGwrVFxE7riHsXVfy/LQ== +eslint-plugin-react@^7.37.3: + version "7.37.3" + resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.37.3.tgz#567549e9251533975c4ea9706f986c3a64832031" + integrity sha512-DomWuTQPFYZwF/7c9W2fkKkStqZmBd3uugfqBYLdkZ3Hii23WzZuOLUskGxB8qkSKqftxEeGL1TB2kMhrce0jA== dependencies: array-includes "^3.1.8" array.prototype.findlast "^1.2.5" @@ -6715,10 +6733,10 @@ idb@^7.0.1: resolved "https://registry.yarnpkg.com/idb/-/idb-7.1.1.tgz#d910ded866d32c7ced9befc5bfdf36f572ced72b" integrity sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ== -idb@^8.0.2: - version "8.0.2" - resolved "https://registry.yarnpkg.com/idb/-/idb-8.0.2.tgz#349af3974281879889e0572bbb231f978b9f3cf0" - integrity sha512-CX70rYhx7GDDQzwwQMDwF6kDRQi5vVs6khHUumDrMecBylKkwvZ8HWvKV08AGb7VbpoGCWUQ4aHzNDgoUiOIUg== +idb@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/idb/-/idb-8.0.0.tgz#33d7ed894ed36e23bcb542fb701ad579bfaad41f" + integrity sha512-l//qvlAKGmQO31Qn7xdzagVPPaHTxXx199MhrAFuVBTPqydcPYBWjkrbv4Y0ktB+GmWOiwHl237UUOrLmQxLvw== ieee754@^1.2.1: version "1.2.1" @@ -6742,7 +6760,7 @@ ignore@^5.0.0, ignore@^5.2.0, ignore@^5.2.4: resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.2.tgz#3cd40e729f3643fd87cb04e50bf0eb722bc596f5" integrity sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g== -ignore@^7.0.3: +ignore@^7.0.1: version "7.0.3" resolved "https://registry.yarnpkg.com/ignore/-/ignore-7.0.3.tgz#397ef9315dfe0595671eefe8b633fec6943ab733" integrity sha512-bAH5jbK/F3T3Jls4I0SO1hmPR0dKU0a7+SY6n1yzRtG54FLO8d6w/nxLFX2Nb7dBu6cCWXPaAME6cYqFUMmuCA== @@ -8076,9 +8094,9 @@ koa-static@^5.0.0: koa-send "^5.0.0" koa@^2.15.3: - version "2.15.4" - resolved "https://registry.yarnpkg.com/koa/-/koa-2.15.4.tgz#7000b3d8354558671adb1ba1b1c09bedb5f8da75" - integrity sha512-7fNBIdrU2PEgLljXoPWoyY4r1e+ToWCmzS/wwMPbUNs7X+5MMET1ObhJBlUkF5uZG9B6QhM2zS1TsH6adegkiQ== + version "2.15.3" + resolved "https://registry.yarnpkg.com/koa/-/koa-2.15.3.tgz#062809266ee75ce0c75f6510a005b0e38f8c519a" + integrity sha512-j/8tY9j5t+GVMLeioLaxweJiKUayFhlGqNTzf2ZGwL0ZCQijd2RLHK0SLW5Tsko8YyyqCZC2cojIb0/s62qTAg== dependencies: accepts "^1.3.5" cache-content-type "^1.0.0" @@ -8338,10 +8356,10 @@ lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17 resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== -long@^5.0.0, long@^5.3.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/long/-/long-5.3.0.tgz#3bab70330c40c2c1b5cb73c4254723c81f00e15c" - integrity sha512-5vvY5yF1zF/kXk+L94FRiTDa1Znom46UjPCH6/XbSvS8zBKMFBHTJk8KDMqJ+2J6QezQFi7k1k8v21ClJYHPaw== +long@^5.0.0, long@^5.2.3: + version "5.2.3" + resolved "https://registry.yarnpkg.com/long/-/long-5.2.3.tgz#a3ba97f3877cf1d778eccbcb048525ebb77499e1" + integrity sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q== longest-streak@^3.0.0: version "3.0.1" @@ -9434,7 +9452,7 @@ namedtuplemap@^1.0.0: resolved "https://registry.yarnpkg.com/namedtuplemap/-/namedtuplemap-1.0.0.tgz#c231789c5b7b47b4b3a3e73317f03ddde1ebcb34" integrity sha1-wjF4nFt7R7Szo+czF/A93eHryzQ= -nanoid@^3.3.8: +nanoid@^3.3.7: version "3.3.8" resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.8.tgz#b1be3030bee36aaff18bacb375e5cce521684baf" integrity sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w== @@ -10464,12 +10482,12 @@ postcss-value-parser@^4.1.0, postcss-value-parser@^4.2.0: resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== -postcss@^8.4.32, postcss@^8.4.33, postcss@^8.5.1, postcss@^8.5.2: - version "8.5.2" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.5.2.tgz#e7b99cb9d2ec3e8dd424002e7c16517cb2b846bd" - integrity sha512-MjOadfU3Ys9KYoX0AdkBlFEF1Vx37uCCeN4ZHnmwm9FfpbsGWMZeBLMmmpY+6Ocqod7mkdZ0DT31OlbsFrLlkA== +postcss@^8.4.32, postcss@^8.4.33, postcss@^8.4.49: + version "8.4.49" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.49.tgz#4ea479048ab059ab3ae61d082190fabfd994fe19" + integrity sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA== dependencies: - nanoid "^3.3.8" + nanoid "^3.3.7" picocolors "^1.1.1" source-map-js "^1.2.1" @@ -10493,10 +10511,10 @@ prettier@^2.0.5: resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.8.tgz#e8c5d7e98a4305ffe3de2e1fc4aca1a71c28b1da" integrity sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q== -prettier@^3.5.1: - version "3.5.1" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.5.1.tgz#22fac9d0b18c0b92055ac8fb619ac1c7bef02fb7" - integrity sha512-hPpFQvHwL3Qv5AdRvBFMhnKo4tYxp0ReXiPn2bxkiohEX6mBeBwEpBSQTkD458RaaDKQMYSp4hX4UtfUTA5wDw== +prettier@^3.4.2: + version "3.4.2" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.4.2.tgz#a5ce1fb522a588bf2b78ca44c6e6fe5aa5a2b13f" + integrity sha512-e9MewbtFo+Fevyuxn/4rrcDAaq0IYxPGLvObpQjiZBMAzB9IGmzlnG9RZy3FFas+eBMu2vA0CszMeduow5dIuQ== pretty-bytes@^5.3.0, pretty-bytes@^5.4.1: version "5.6.0" @@ -10750,6 +10768,11 @@ rc@1.2.8: minimist "^1.2.0" strip-json-comments "~2.0.1" +react-dom-factories@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/react-dom-factories/-/react-dom-factories-1.0.2.tgz#eb7705c4db36fb501b3aa38ff759616aa0ff96e0" + integrity sha512-Bmic2N3oKji7vw9qjDr2dmwHvOATbFSnKy7EH0uT/qjvzIUsiXp6Yquk72LJ3WfMtRnq3ujXMMo7GsJeLPfFWw== + react-dom@^16.13.1: version "16.14.0" resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-16.14.0.tgz#7ad838ec29a777fb3c75c3a190f661cf92ab8b89" @@ -10768,10 +10791,10 @@ react-dom@^18.3.1: loose-envify "^1.1.0" scheduler "^0.23.2" -react-intersection-observer@^9.15.1: - version "9.15.1" - resolved "https://registry.yarnpkg.com/react-intersection-observer/-/react-intersection-observer-9.15.1.tgz#5866b6fdfef24be9f288b74b35b773f63d90c3eb" - integrity sha512-vGrqYEVWXfH+AGu241uzfUpNK4HAdhCkSAyFdkMb9VWWXs6mxzBLpWCxEy9YcnDNY2g9eO6z7qUtTBdA9hc8pA== +react-intersection-observer@^9.14.1: + version "9.14.1" + resolved "https://registry.yarnpkg.com/react-intersection-observer/-/react-intersection-observer-9.14.1.tgz#c9d42576d64dfde18336acdcdf097761fb79ad19" + integrity sha512-k1xIUn3sCQi3ugNeF64FJb3zwve5mcetvAUR9JazXeOmtap4IP2evN8rs+yf6SQ7F1QydsOGiqTmt+lySKZ9uA== react-is@^16.13.1: version "16.13.1" @@ -12283,10 +12306,10 @@ stylelint-order@^6.0.2: postcss "^8.4.32" postcss-sorting "^8.0.2" -stylelint@^16.14.1: - version "16.14.1" - resolved "https://registry.yarnpkg.com/stylelint/-/stylelint-16.14.1.tgz#32d3df8c5ce7ba0275ce6a4a966b6099d7a828e3" - integrity sha512-oqCL7AC3786oTax35T/nuLL8p2C3k/8rHKAooezrPGRvUX0wX+qqs5kMWh5YYT4PHQgVDobHT4tw55WgpYG6Sw== +stylelint@^16.12.0: + version "16.13.2" + resolved "https://registry.yarnpkg.com/stylelint/-/stylelint-16.13.2.tgz#a0e8aab7cedde55f185ac8af6f526e53df783294" + integrity sha512-wDlgh0mRO9RtSa3TdidqHd0nOG8MmUyVKl+dxA6C1j8aZRzpNeEgdhFmU5y4sZx4Fc6r46p0fI7p1vR5O2DZqA== dependencies: "@csstools/css-parser-algorithms" "^3.0.4" "@csstools/css-tokenizer" "^3.0.3" @@ -12306,7 +12329,7 @@ stylelint@^16.14.1: globby "^11.1.0" globjoin "^0.1.4" html-tags "^3.3.1" - ignore "^7.0.3" + ignore "^7.0.1" imurmurhash "^0.1.4" is-plain-object "^5.0.0" known-css-properties "^0.35.0" @@ -12315,7 +12338,7 @@ stylelint@^16.14.1: micromatch "^4.0.8" normalize-path "^3.0.0" picocolors "^1.1.1" - postcss "^8.5.1" + postcss "^8.4.49" postcss-resolve-nested-selector "^0.1.6" postcss-safe-parser "^7.0.1" postcss-selector-parser "^7.0.0"