diff --git a/loki/package.json b/loki/package.json index 65f06ef5d..03160e354 100644 --- a/loki/package.json +++ b/loki/package.json @@ -74,6 +74,33 @@ }, "name": "LokiLogQuery" } + }, + { + "kind": "Variable", + "spec": { + "display": { + "name": "Loki Label Values Variable" + }, + "name": "LokiLabelValuesVariable" + } + }, + { + "kind": "Variable", + "spec": { + "display": { + "name": "Loki Label Names Variable" + }, + "name": "LokiLabelNamesVariable" + } + }, + { + "kind": "Variable", + "spec": { + "display": { + "name": "Loki LogQL Variable" + }, + "name": "LokiLogQLVariable" + } } ] } diff --git a/loki/rsbuild.config.ts b/loki/rsbuild.config.ts index 2b7e08571..5e478fe88 100644 --- a/loki/rsbuild.config.ts +++ b/loki/rsbuild.config.ts @@ -25,6 +25,9 @@ export default createConfigForPlugin({ './LokiDatasource': './src/datasources/loki-datasource', './LokiTimeSeriesQuery': './src/queries/loki-time-series-query', './LokiLogQuery': './src/queries/loki-log-query', + './LokiLabelValuesVariable': './src/variables/LokiLabelValuesVariable.tsx', + './LokiLabelNamesVariable': './src/variables/LokiLabelNamesVariable.tsx', + './LokiLogQLVariable': './src/variables/LokiLogQLVariable.tsx', }, shared: { react: { requiredVersion: '18.2.0', singleton: true }, diff --git a/loki/schemas/variables/loki-label-names/loki-label-names.cue b/loki/schemas/variables/loki-label-names/loki-label-names.cue new file mode 100644 index 000000000..ca4220504 --- /dev/null +++ b/loki/schemas/variables/loki-label-names/loki-label-names.cue @@ -0,0 +1,24 @@ +// Copyright The Perses Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package model + +import ( + ds "github.com/perses/plugins/loki/schemas/datasources:model" +) + +kind: "LokiLabelNamesVariable" +spec: close({ + ds.#selector + matchers?: [...string] +}) diff --git a/loki/schemas/variables/loki-label-names/tests/valid/loki-label-names.json b/loki/schemas/variables/loki-label-names/tests/valid/loki-label-names.json new file mode 100644 index 000000000..2175d023a --- /dev/null +++ b/loki/schemas/variables/loki-label-names/tests/valid/loki-label-names.json @@ -0,0 +1,8 @@ +{ + "kind": "LokiLabelNamesVariable", + "spec": { + "matchers": [ + "{job=\"myapp\"}" + ] + } +} diff --git a/loki/schemas/variables/loki-label-values/loki-label-values.cue b/loki/schemas/variables/loki-label-values/loki-label-values.cue new file mode 100644 index 000000000..43d90ea99 --- /dev/null +++ b/loki/schemas/variables/loki-label-values/loki-label-values.cue @@ -0,0 +1,26 @@ +// Copyright The Perses Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package model + +import ( + "strings" + ds "github.com/perses/plugins/loki/schemas/datasources:model" +) + +kind: "LokiLabelValuesVariable" +spec: close({ + ds.#selector + labelName: strings.MinRunes(1) + matchers?: [...string] +}) diff --git a/loki/schemas/variables/loki-label-values/tests/valid/loki-label-values.json b/loki/schemas/variables/loki-label-values/tests/valid/loki-label-values.json new file mode 100644 index 000000000..a18b14f53 --- /dev/null +++ b/loki/schemas/variables/loki-label-values/tests/valid/loki-label-values.json @@ -0,0 +1,9 @@ +{ + "kind": "LokiLabelValuesVariable", + "spec": { + "labelName": "job", + "matchers": [ + "{job=\"myapp\"}" + ] + } +} diff --git a/loki/schemas/variables/loki-logql/loki-logql.cue b/loki/schemas/variables/loki-logql/loki-logql.cue new file mode 100644 index 000000000..b59b2bb67 --- /dev/null +++ b/loki/schemas/variables/loki-logql/loki-logql.cue @@ -0,0 +1,26 @@ +// Copyright The Perses Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package model + +import ( + "strings" + ds "github.com/perses/plugins/loki/schemas/datasources:model" +) + +kind: "LokiLogQLVariable" +spec: close({ + ds.#selector + expr: strings.MinRunes(1) + labelName: strings.MinRunes(1) +}) diff --git a/loki/schemas/variables/loki-logql/tests/invalid/no-label.json b/loki/schemas/variables/loki-logql/tests/invalid/no-label.json new file mode 100644 index 000000000..ce16943cb --- /dev/null +++ b/loki/schemas/variables/loki-logql/tests/invalid/no-label.json @@ -0,0 +1,7 @@ +{ + "kind": "LokiLogQLVariable", + "spec": { + "expr": "count_over_time({job=\"myapp\"}[1h])", + "labelName": "" + } +} diff --git a/loki/schemas/variables/loki-logql/tests/valid/loki-logql.json b/loki/schemas/variables/loki-logql/tests/valid/loki-logql.json new file mode 100644 index 000000000..d1ccb0ce6 --- /dev/null +++ b/loki/schemas/variables/loki-logql/tests/valid/loki-logql.json @@ -0,0 +1,7 @@ +{ + "kind": "LokiLogQLVariable", + "spec": { + "expr": "count_over_time({job=\"myapp\"}[1h])", + "labelName": "job" + } +} diff --git a/loki/src/components/complete.ts b/loki/src/components/complete.ts index 1726ff1c8..500fe0078 100644 --- a/loki/src/components/complete.ts +++ b/loki/src/components/complete.ts @@ -365,8 +365,8 @@ async function completeLabelName(completionCfg: CompletionConfig): Promise ({ label })); } return []; @@ -387,8 +387,8 @@ async function completeLabelValue(completionCfg: CompletionConfig, label: string const end = completionCfg.timeRange?.end ? toUnixSeconds(new Date(completionCfg.timeRange.end).getTime()) : undefined; try { - const response = await completionCfg.client.labelValues(label, start, end); - if (response.status === 'success') { + const response = await completionCfg.client.labelValues({ labelName: label, start, end }); + if (response.status === 'success' && response.data) { return response.data.map((value: string) => ({ label: value ?? '', displayLabel: value ?? '(empty string)', diff --git a/loki/src/datasources/loki-datasource/LokiDatasource.tsx b/loki/src/datasources/loki-datasource/LokiDatasource.tsx index 5350f20c6..bd9f27ba6 100644 --- a/loki/src/datasources/loki-datasource/LokiDatasource.tsx +++ b/loki/src/datasources/loki-datasource/LokiDatasource.tsx @@ -43,9 +43,8 @@ const createClient: DatasourcePlugin['createClie }, query: (params, headers) => query(params, { datasourceUrl, headers: headers ?? specHeaders }), queryRange: (params, headers) => queryRange(params, { datasourceUrl, headers: headers ?? specHeaders }), - labels: (start, end, headers) => labels(start, end, { datasourceUrl, headers: headers ?? specHeaders }), - labelValues: (label, start, end, headers) => - labelValues(label, start, end, { datasourceUrl, headers: headers ?? specHeaders }), + labels: (params, headers) => labels(params, { datasourceUrl, headers: headers ?? specHeaders }), + labelValues: (params, headers) => labelValues(params, { datasourceUrl, headers: headers ?? specHeaders }), series: (match, start, end, headers) => series(match, start, end, { datasourceUrl, headers: headers ?? specHeaders }), volume: (params, headers) => volume(params, { datasourceUrl, headers: headers ?? specHeaders }), diff --git a/loki/src/index.ts b/loki/src/index.ts index 505ad1e88..5a2d8405d 100644 --- a/loki/src/index.ts +++ b/loki/src/index.ts @@ -15,3 +15,4 @@ export { getPluginModule } from './getPluginModule'; export * from './model'; export * from './queries'; export * from './datasources'; +export * from './variables'; diff --git a/loki/src/model/loki-client-types.ts b/loki/src/model/loki-client-types.ts index a66b6ffe1..00ad6b17d 100644 --- a/loki/src/model/loki-client-types.ts +++ b/loki/src/model/loki-client-types.ts @@ -44,7 +44,7 @@ export interface LokiQueryResponse { }; } -export type LokiQueryRangeResponse = LokiQueryRangeMatrixResponse & LokiQueryRangeStreamsResponse; +export type LokiQueryRangeResponse = LokiQueryRangeMatrixResponse | LokiQueryRangeStreamsResponse; export interface LokiQueryRangeMatrixResponse { status: 'success' | 'error'; diff --git a/loki/src/model/loki-client.test.ts b/loki/src/model/loki-client.test.ts new file mode 100644 index 000000000..a97dca157 --- /dev/null +++ b/loki/src/model/loki-client.test.ts @@ -0,0 +1,197 @@ +// Copyright The Perses Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import { AbsoluteTimeRange } from '@perses-dev/core'; +import { toUnixSeconds, getLokiTimeRange, labels, labelValues } from './loki-client'; + +// Mock global fetch for labels/labelValues tests +const mockFetch = jest.fn(); +global.fetch = mockFetch; + +beforeEach(() => { + mockFetch.mockReset(); + mockFetch.mockResolvedValue({ + ok: true, + json: () => Promise.resolve({ status: 'success', data: [] }), + }); +}); + +describe('toUnixSeconds', () => { + it('converts a Date to unix seconds string', () => { + const date = new Date('2024-01-15T12:00:00Z'); + expect(toUnixSeconds(date)).toBe(Math.floor(date.getTime() / 1000).toString()); + }); + + it('converts a millisecond timestamp number to unix seconds string', () => { + // 1705320000000 ms = 1705320000 s + expect(toUnixSeconds(1705320000000)).toBe('1705320000'); + }); + + it('passes through a seconds-range number as string', () => { + expect(toUnixSeconds(1705320000)).toBe('1705320000'); + }); + + it('converts a numeric string in milliseconds to unix seconds', () => { + expect(toUnixSeconds('1705320000000')).toBe('1705320000'); + }); + + it('converts an ISO date string to unix seconds', () => { + const isoString = '2024-01-15T12:00:00Z'; + const expected = Math.floor(new Date(isoString).getTime() / 1000).toString(); + expect(toUnixSeconds(isoString)).toBe(expected); + }); +}); + +describe('getLokiTimeRange', () => { + it('converts an AbsoluteTimeRange to start/end unix seconds strings', () => { + const timeRange: AbsoluteTimeRange = { + start: new Date('2024-01-15T10:00:00Z'), + end: new Date('2024-01-15T11:00:00Z'), + }; + const result = getLokiTimeRange(timeRange); + expect(result).toEqual({ + start: Math.floor(new Date('2024-01-15T10:00:00Z').getTime() / 1000).toString(), + end: Math.floor(new Date('2024-01-15T11:00:00Z').getTime() / 1000).toString(), + }); + }); + + it('handles epoch boundaries', () => { + const timeRange: AbsoluteTimeRange = { + start: new Date('1970-01-01T00:00:00Z'), + end: new Date('1970-01-01T00:01:00Z'), + }; + const result = getLokiTimeRange(timeRange); + expect(result).toEqual({ start: '0', end: '60' }); + }); +}); + +describe('labels', () => { + const options = { datasourceUrl: 'http://localhost:3100' }; + + it('appends query parameter to URL when provided', async () => { + await labels({ start: '1000', end: '2000', query: '{job="varlogs"}' }, options); + + const calledUrl = new URL(mockFetch.mock.calls[0][0]); + expect(calledUrl.searchParams.get('start')).toBe('1000'); + expect(calledUrl.searchParams.get('end')).toBe('2000'); + expect(calledUrl.searchParams.get('query')).toBe('{job="varlogs"}'); + }); + + it('omits query parameter when undefined', async () => { + await labels({ start: '1000', end: '2000' }, options); + + const calledUrl = new URL(mockFetch.mock.calls[0][0]); + expect(calledUrl.searchParams.get('start')).toBe('1000'); + expect(calledUrl.searchParams.get('end')).toBe('2000'); + expect(calledUrl.searchParams.has('query')).toBe(false); + }); + + it('works with no optional parameters', async () => { + await labels({}, options); + + const calledUrl = new URL(mockFetch.mock.calls[0][0]); + expect(calledUrl.searchParams.has('start')).toBe(false); + expect(calledUrl.searchParams.has('end')).toBe(false); + expect(calledUrl.searchParams.has('query')).toBe(false); + }); +}); + +describe('labelValues', () => { + const options = { datasourceUrl: 'http://localhost:3100' }; + + it('appends query parameter to URL when provided', async () => { + await labelValues({ labelName: 'job', start: '1000', end: '2000', query: '{namespace="prod"}' }, options); + + const calledUrl = new URL(mockFetch.mock.calls[0][0]); + expect(calledUrl.pathname).toBe('/loki/api/v1/label/job/values'); + expect(calledUrl.searchParams.get('start')).toBe('1000'); + expect(calledUrl.searchParams.get('end')).toBe('2000'); + expect(calledUrl.searchParams.get('query')).toBe('{namespace="prod"}'); + }); + + it('omits query parameter when undefined', async () => { + await labelValues({ labelName: 'job', start: '1000', end: '2000' }, options); + + const calledUrl = new URL(mockFetch.mock.calls[0][0]); + expect(calledUrl.searchParams.get('start')).toBe('1000'); + expect(calledUrl.searchParams.get('end')).toBe('2000'); + expect(calledUrl.searchParams.has('query')).toBe(false); + }); + + it('works with no optional parameters', async () => { + await labelValues({ labelName: 'job' }, options); + + const calledUrl = new URL(mockFetch.mock.calls[0][0]); + expect(calledUrl.pathname).toBe('/loki/api/v1/label/job/values'); + expect(calledUrl.searchParams.has('start')).toBe(false); + expect(calledUrl.searchParams.has('end')).toBe(false); + expect(calledUrl.searchParams.has('query')).toBe(false); + }); +}); + +describe('handleErrorResponse', () => { + const options = { datasourceUrl: 'http://localhost:3100' }; + + it('throws with JSON body when content-type is application/json', async () => { + const errorBody = { message: 'parse error', status: 'error' }; + mockFetch.mockResolvedValueOnce({ + ok: false, + status: 400, + statusText: 'Bad Request', + headers: new Headers({ 'content-type': 'application/json' }), + json: () => Promise.resolve(errorBody), + }); + + await expect(labels({}, options)).rejects.toThrow( + 'Loki query_range error: 400 Bad Request - {"message":"parse error","status":"error"}' + ); + }); + + it('throws with text body when content-type is not JSON', async () => { + mockFetch.mockResolvedValueOnce({ + ok: false, + status: 500, + statusText: 'Internal Server Error', + headers: new Headers({ 'content-type': 'text/plain' }), + text: () => Promise.resolve('upstream timeout'), + }); + + await expect(labels({}, options)).rejects.toThrow( + 'Loki query_range error: 500 Internal Server Error - upstream timeout' + ); + }); + + it('throws with text body when headers are missing', async () => { + mockFetch.mockResolvedValueOnce({ + ok: false, + status: 502, + statusText: 'Bad Gateway', + headers: undefined, + text: () => Promise.resolve('no healthy upstream'), + }); + + await expect(labels({}, options)).rejects.toThrow('Loki query_range error: 502 Bad Gateway - no healthy upstream'); + }); + + it('throws with text body when content-type header is absent', async () => { + mockFetch.mockResolvedValueOnce({ + ok: false, + status: 503, + statusText: 'Service Unavailable', + headers: new Headers(), + text: () => Promise.resolve('service down'), + }); + + await expect(labels({}, options)).rejects.toThrow('Loki query_range error: 503 Service Unavailable - service down'); + }); +}); diff --git a/loki/src/model/loki-client.ts b/loki/src/model/loki-client.ts index 7efc20764..800bd25a4 100644 --- a/loki/src/model/loki-client.ts +++ b/loki/src/model/loki-client.ts @@ -11,6 +11,7 @@ // See the License for the specific language governing permissions and // limitations under the License. +import { AbsoluteTimeRange } from '@perses-dev/core'; import { LokiQueryResponse, LokiQueryRangeResponse, @@ -39,6 +40,19 @@ export interface LokiQueryRangeParams { limit?: number; } +export interface LokiLabelsParams { + start?: string; + end?: string; + query?: string; +} + +export interface LokiLabelValuesParams { + labelName: string; + start?: string; + end?: string; + query?: string; +} + export interface LokiVolumeParams { query: string; start: string; @@ -58,13 +72,8 @@ export interface LokiClient { }; query: (params: LokiQueryParams, headers?: LokiRequestHeaders) => Promise; queryRange: (params: LokiQueryRangeParams, headers?: LokiRequestHeaders) => Promise; - labels: (start?: string, end?: string, headers?: LokiRequestHeaders) => Promise; - labelValues: ( - label: string, - start?: string, - end?: string, - headers?: LokiRequestHeaders - ) => Promise; + labels: (params: LokiLabelsParams, headers?: LokiRequestHeaders) => Promise; + labelValues: (params: LokiLabelValuesParams, headers?: LokiRequestHeaders) => Promise; series: (match: string[], start?: string, end?: string, headers?: LokiRequestHeaders) => Promise; volume: (params: LokiVolumeParams, headers?: LokiRequestHeaders) => Promise; volumeRange: (params: LokiVolumeParams, headers?: LokiRequestHeaders) => Promise; @@ -77,7 +86,7 @@ export interface LokiClient { } async function handleErrorResponse(response: Response): Promise { - const contentType = response.headers.get('content-type'); + const contentType = response.headers?.get('content-type'); if (contentType && contentType.includes('application/json')) { const errorJson = await response.json(); throw new Error(`Loki query_range error: ${response.status} ${response.statusText} - ${JSON.stringify(errorJson)}`); @@ -168,14 +177,11 @@ export async function queryRange( return response.json(); } -export async function labels( - start: string | undefined, - end: string | undefined, - options: LokiApiOptions -): Promise { +export async function labels(params: LokiLabelsParams, options: LokiApiOptions): Promise { const url = buildUrl('/loki/api/v1/labels', options.datasourceUrl); - if (start) url.searchParams.append('start', start); - if (end) url.searchParams.append('end', end); + if (params.start) url.searchParams.append('start', params.start); + if (params.end) url.searchParams.append('end', params.end); + if (params.query) url.searchParams.append('query', params.query); const response = await fetch(url.toString(), { method: 'GET', @@ -193,14 +199,13 @@ export async function labels( } export async function labelValues( - label: string, - start: string | undefined, - end: string | undefined, + params: LokiLabelValuesParams, options: LokiApiOptions ): Promise { - const url = buildUrl(`/loki/api/v1/label/${label}/values`, options.datasourceUrl); - if (start) url.searchParams.append('start', start); - if (end) url.searchParams.append('end', end); + const url = buildUrl(`/loki/api/v1/label/${params.labelName}/values`, options.datasourceUrl); + if (params.start) url.searchParams.append('start', params.start); + if (params.end) url.searchParams.append('end', params.end); + if (params.query) url.searchParams.append('query', params.query); const response = await fetch(url.toString(), { method: 'GET', @@ -314,3 +319,10 @@ export async function indexStats( return response.json(); } + +export function getLokiTimeRange(timeRange: AbsoluteTimeRange): { start: string; end: string } { + return { + start: toUnixSeconds(timeRange.start), + end: toUnixSeconds(timeRange.end), + }; +} diff --git a/loki/src/queries/loki-log-query/get-loki-log-data.ts b/loki/src/queries/loki-log-query/get-loki-log-data.ts index adcb6117e..1f5fa2f5f 100644 --- a/loki/src/queries/loki-log-query/get-loki-log-data.ts +++ b/loki/src/queries/loki-log-query/get-loki-log-data.ts @@ -16,7 +16,7 @@ import { LogEntry, LogData } from '@perses-dev/core'; import { LokiStreamResult } from '../../model/loki-client-types'; import { LokiClient } from '../../model/loki-client'; import { DEFAULT_DATASOURCE } from '../constants'; -import { LokiLogQuerySpec, LokiLogQueryResponse } from './loki-log-query-types'; +import { LokiLogQuerySpec } from './loki-log-query-types'; import { LogQueryPlugin, LogQueryContext } from './log-query-plugin-interface'; function convertStreamsToLogs(streams: LokiStreamResult[]): LogData { @@ -56,7 +56,7 @@ export const getLokiLogData: LogQueryPlugin['getLogData'] = as const { start, end } = context.timeRange; - const response: LokiLogQueryResponse = await client.queryRange({ + const response = await client.queryRange({ query, start: start.getTime().toString(), end: end.getTime().toString(), diff --git a/loki/src/queries/loki-time-series-query/get-loki-time-series-data.ts b/loki/src/queries/loki-time-series-query/get-loki-time-series-data.ts index 80bfd7fd9..57523354a 100644 --- a/loki/src/queries/loki-time-series-query/get-loki-time-series-data.ts +++ b/loki/src/queries/loki-time-series-query/get-loki-time-series-data.ts @@ -11,13 +11,13 @@ // See the License for the specific language governing permissions and // limitations under the License. -import { TimeSeries, DurationString, parseDurationString } from '@perses-dev/core'; +import { DurationString, TimeSeries, parseDurationString } from '@perses-dev/core'; import { TimeSeriesQueryPlugin, replaceVariables } from '@perses-dev/plugin-system'; import { milliseconds } from 'date-fns'; import { LokiClient } from '../../model/loki-client'; import { LokiMatrixResult } from '../../model/loki-client-types'; import { DEFAULT_DATASOURCE } from '../constants'; -import { LokiTimeSeriesQuerySpec, LokiTimeSeriesQueryResponse } from './loki-time-series-query-types'; +import { LokiTimeSeriesQuerySpec } from './loki-time-series-query-types'; export type LokiMatrixResponse = { resultType: 'matrix'; @@ -115,7 +115,7 @@ export const getLokiTimeSeriesData: TimeSeriesQueryPlugin = { + getVariableOptions: async (spec, ctx) => { + const datasourceSelector = + datasourceSelectValueToSelector( + spec.datasource ?? DEFAULT_LOKI, + ctx.variables, + await ctx.datasourceStore.listDatasourceSelectItems(LOKI_DATASOURCE_KIND) + ) ?? DEFAULT_LOKI; + const client: LokiClient = await ctx.datasourceStore.getDatasourceClient(datasourceSelector); + const query = spec.matchers ? replaceVariables(spec.matchers[0] ?? '', ctx.variables) || undefined : undefined; + const timeRange = getLokiTimeRange(ctx.timeRange); + const { data: options } = await client.labels({ start: timeRange.start, end: timeRange.end, query }); + return { data: stringArrayToVariableOptions(options) }; + }, + dependsOn: (spec) => { + const matcherVariables = spec.matchers?.map((m) => parseVariables(m)).flat() || []; + const datasourceVariables = + spec.datasource && isVariableDatasource(spec.datasource) ? parseVariables(spec.datasource) : []; + return { variables: [...matcherVariables, ...datasourceVariables] }; + }, + OptionsEditorComponent: LokiLabelNamesVariableEditor, + createInitialOptions: () => ({}), +}; diff --git a/loki/src/variables/LokiLabelValuesVariable.tsx b/loki/src/variables/LokiLabelValuesVariable.tsx new file mode 100644 index 000000000..3b40f7370 --- /dev/null +++ b/loki/src/variables/LokiLabelValuesVariable.tsx @@ -0,0 +1,53 @@ +// Copyright The Perses Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import { + VariablePlugin, + replaceVariables, + parseVariables, + datasourceSelectValueToSelector, + isVariableDatasource, +} from '@perses-dev/plugin-system'; +import { LokiClient, DEFAULT_LOKI, getLokiTimeRange, LOKI_DATASOURCE_KIND } from '../model'; +import { stringArrayToVariableOptions, LokiLabelValuesVariableEditor } from './loki-variables'; +import { LokiLabelValuesVariableOptions } from './types'; + +export const LokiLabelValuesVariable: VariablePlugin = { + getVariableOptions: async (spec, ctx) => { + const datasourceSelector = + datasourceSelectValueToSelector( + spec.datasource ?? DEFAULT_LOKI, + ctx.variables, + await ctx.datasourceStore.listDatasourceSelectItems(LOKI_DATASOURCE_KIND) + ) ?? DEFAULT_LOKI; + const client: LokiClient = await ctx.datasourceStore.getDatasourceClient(datasourceSelector); + const query = spec.matchers ? replaceVariables(spec.matchers[0] ?? '', ctx.variables) || undefined : undefined; + const timeRange = getLokiTimeRange(ctx.timeRange); + const { data: options } = await client.labelValues({ + labelName: replaceVariables(spec.labelName, ctx.variables), + start: timeRange.start, + end: timeRange.end, + query, + }); + return { data: stringArrayToVariableOptions(options) }; + }, + dependsOn: (spec) => { + const matcherVariables = spec.matchers?.map((m) => parseVariables(m)).flat() || []; + const labelVariables = parseVariables(spec.labelName); + const datasourceVariables = + spec.datasource && isVariableDatasource(spec.datasource) ? parseVariables(spec.datasource) : []; + return { variables: [...matcherVariables, ...labelVariables, ...datasourceVariables] }; + }, + OptionsEditorComponent: LokiLabelValuesVariableEditor, + createInitialOptions: () => ({ labelName: '' }), +}; diff --git a/loki/src/variables/LokiLogQLVariable.tsx b/loki/src/variables/LokiLogQLVariable.tsx new file mode 100644 index 000000000..3953e6036 --- /dev/null +++ b/loki/src/variables/LokiLogQLVariable.tsx @@ -0,0 +1,63 @@ +// Copyright The Perses Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import { + VariablePlugin, + replaceVariables, + parseVariables, + datasourceSelectValueToSelector, + isVariableDatasource, +} from '@perses-dev/plugin-system'; +import { LokiClient, DEFAULT_LOKI, LOKI_DATASOURCE_KIND, getLokiTimeRange } from '../model'; +import { + capturingMetric, + capturingStreams, + stringArrayToVariableOptions, + LokiLogQLVariableEditor, +} from './loki-variables'; +import { LokiLogQLVariableOptions } from './types'; + +export const LokiLogQLVariable: VariablePlugin = { + getVariableOptions: async (spec, ctx) => { + const datasourceSelector = + datasourceSelectValueToSelector( + spec.datasource ?? DEFAULT_LOKI, + ctx.variables, + await ctx.datasourceStore.listDatasourceSelectItems(LOKI_DATASOURCE_KIND) + ) ?? DEFAULT_LOKI; + const client: LokiClient = await ctx.datasourceStore.getDatasourceClient(datasourceSelector); + const timeRange = getLokiTimeRange(ctx.timeRange); + const response = await client.queryRange({ + query: replaceVariables(spec.expr, ctx.variables), + start: timeRange.start, + end: timeRange.end, + }); + const labelName = replaceVariables(spec.labelName, ctx.variables); + let values: string[] = []; + if (response.data?.resultType === 'streams') { + values = capturingStreams(response.data.result, labelName); + } else if (response.data?.resultType === 'matrix') { + values = capturingMetric(response.data.result, labelName); + } + return { data: stringArrayToVariableOptions(values) }; + }, + dependsOn: (spec) => { + const exprVariables = parseVariables(spec.expr); + const labelVariables = parseVariables(spec.labelName); + const datasourceVariables = + spec.datasource && isVariableDatasource(spec.datasource) ? parseVariables(spec.datasource) : []; + return { variables: [...exprVariables, ...labelVariables, ...datasourceVariables] }; + }, + OptionsEditorComponent: LokiLogQLVariableEditor, + createInitialOptions: () => ({ expr: '', labelName: '' }), +}; diff --git a/loki/src/variables/MatcherEditor.tsx b/loki/src/variables/MatcherEditor.tsx new file mode 100644 index 000000000..d1c4c8d29 --- /dev/null +++ b/loki/src/variables/MatcherEditor.tsx @@ -0,0 +1,75 @@ +// Copyright The Perses Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import { Stack, TextField, Button, IconButton } from '@mui/material'; +import { produce } from 'immer'; +import TrashIcon from 'mdi-material-ui/TrashCan'; +import { ReactElement } from 'react'; + +type MatcherEditorProps = { + matchers: string[]; + onChange: (matchers: string[]) => void; + isReadonly?: boolean; +}; + +export function MatcherEditor({ matchers, onChange, isReadonly }: MatcherEditorProps): ReactElement { + return ( + + {matchers.map((matcher, index) => ( + + { + const newMatchers = produce(matchers, (draft) => { + draft[index] = e.target.value; + }); + onChange(newMatchers); + }} + /> + { + const newMatchers = produce(matchers, (draft) => { + draft.splice(index, 1); + }); + onChange(newMatchers); + }} + disabled={isReadonly} + > + + + + ))} + + + ); +} diff --git a/loki/src/variables/index.ts b/loki/src/variables/index.ts new file mode 100644 index 000000000..0264d16dd --- /dev/null +++ b/loki/src/variables/index.ts @@ -0,0 +1,19 @@ +// Copyright The Perses Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +export * from './loki-variables'; +export * from './LokiLabelNamesVariable'; +export * from './LokiLabelValuesVariable'; +export * from './LokiLogQLVariable'; +export * from './MatcherEditor'; +export * from './types'; diff --git a/loki/src/variables/loki-variables.test.ts b/loki/src/variables/loki-variables.test.ts new file mode 100644 index 000000000..decb5e1f5 --- /dev/null +++ b/loki/src/variables/loki-variables.test.ts @@ -0,0 +1,161 @@ +// Copyright The Perses Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import { GetVariableOptionsContext } from '@perses-dev/plugin-system'; +import { LokiStreamResult } from '../model/loki-client-types'; +import { stringArrayToVariableOptions, capturingMetric, capturingStreams } from './loki-variables'; +import { LokiLabelValuesVariable } from './LokiLabelValuesVariable'; +import { LokiLabelNamesVariable } from './LokiLabelNamesVariable'; +import { LokiLogQLVariable } from './LokiLogQLVariable'; + +// Dummy context for dependsOn calls (the implementations don't use ctx) +const dummyCtx = {} as GetVariableOptionsContext; + +describe('stringArrayToVariableOptions', () => { + it('converts a string array to VariableOption array', () => { + const result = stringArrayToVariableOptions(['foo', 'bar', 'baz']); + expect(result).toEqual([ + { value: 'foo', label: 'foo' }, + { value: 'bar', label: 'bar' }, + { value: 'baz', label: 'baz' }, + ]); + }); + + it('returns empty array for undefined input', () => { + const result = stringArrayToVariableOptions(undefined); + expect(result).toEqual([]); + }); + + it('returns empty array for empty array input', () => { + const result = stringArrayToVariableOptions([]); + expect(result).toEqual([]); + }); +}); + +describe('capturingMetric', () => { + it('extracts unique label values from results with metric field', () => { + const results = [ + { metric: { job: 'app1', instance: 'host1' } }, + { metric: { job: 'app2', instance: 'host2' } }, + { metric: { job: 'app1', instance: 'host3' } }, + ]; + const values = capturingMetric(results, 'job'); + expect(values).toEqual(['app1', 'app2']); + }); + + it('returns empty array when label is not present', () => { + const results = [{ metric: { job: 'app1' } }]; + const values = capturingMetric(results, 'missing'); + expect(values).toEqual([]); + }); + + it('handles empty results', () => { + const values = capturingMetric([], 'job'); + expect(values).toEqual([]); + }); +}); + +describe('capturingStreams', () => { + it('extracts unique label values from LokiStreamResult array', () => { + const results: LokiStreamResult[] = [ + { stream: { job: 'svc-a', namespace: 'prod' }, values: [['1000', 'log line 1']] }, + { stream: { job: 'svc-b', namespace: 'staging' }, values: [['1001', 'log line 2']] }, + { stream: { job: 'svc-a', namespace: 'dev' }, values: [['1002', 'log line 3']] }, + ]; + const values = capturingStreams(results, 'job'); + expect(values).toEqual(['svc-a', 'svc-b']); + }); + + it('returns empty array when label is not present in any stream', () => { + const results: LokiStreamResult[] = [{ stream: { job: 'svc-a' }, values: [['1000', 'log line 1']] }]; + const values = capturingStreams(results, 'nonexistent'); + expect(values).toEqual([]); + }); + + it('handles empty results', () => { + const values = capturingStreams([], 'job'); + expect(values).toEqual([]); + }); +}); + +describe('LokiLabelValuesVariable.dependsOn', () => { + it('returns variable dependencies from labelName and matchers', () => { + const spec = { + labelName: '$env', + matchers: ['{job="$app"}', '{namespace="$ns"}'], + }; + const result = LokiLabelValuesVariable.dependsOn!(spec, dummyCtx); + expect(result.variables).toContain('env'); + expect(result.variables).toContain('app'); + expect(result.variables).toContain('ns'); + }); + + it('returns label variable when no matchers', () => { + const spec = { labelName: '$myLabel' }; + const result = LokiLabelValuesVariable.dependsOn!(spec, dummyCtx); + expect(result.variables).toContain('myLabel'); + }); + + it('includes datasource variable dependencies', () => { + const spec = { labelName: 'job', datasource: '$lokiDS' }; + const result = LokiLabelValuesVariable.dependsOn!(spec, dummyCtx); + expect(result.variables).toContain('lokiDS'); + }); + + it('returns empty array for no variable references', () => { + const spec = { labelName: 'job' }; + const result = LokiLabelValuesVariable.dependsOn!(spec, dummyCtx); + expect(result.variables).toEqual([]); + }); +}); + +describe('LokiLabelNamesVariable.dependsOn', () => { + it('returns variable dependencies from matchers', () => { + const spec = { matchers: ['{job="$app"}'] }; + const result = LokiLabelNamesVariable.dependsOn!(spec, dummyCtx); + expect(result.variables).toContain('app'); + }); + + it('includes datasource variable dependencies', () => { + const spec = { datasource: '$lokiDS' }; + const result = LokiLabelNamesVariable.dependsOn!(spec, dummyCtx); + expect(result.variables).toContain('lokiDS'); + }); + + it('returns empty array when no variable references', () => { + const spec = {}; + const result = LokiLabelNamesVariable.dependsOn!(spec, dummyCtx); + expect(result.variables).toEqual([]); + }); +}); + +describe('LokiLogQLVariable.dependsOn', () => { + it('returns variable dependencies from expr and labelName', () => { + const spec = { expr: '{job="$app"} | logfmt', labelName: '$field' }; + const result = LokiLogQLVariable.dependsOn!(spec, dummyCtx); + expect(result.variables).toContain('app'); + expect(result.variables).toContain('field'); + }); + + it('includes datasource variable dependencies', () => { + const spec = { expr: '{job="test"}', labelName: 'level', datasource: '$lokiDS' }; + const result = LokiLogQLVariable.dependsOn!(spec, dummyCtx); + expect(result.variables).toContain('lokiDS'); + }); + + it('returns empty array when no variable references', () => { + const spec = { expr: '{job="test"}', labelName: 'level' }; + const result = LokiLogQLVariable.dependsOn!(spec, dummyCtx); + expect(result.variables).toEqual([]); + }); +}); diff --git a/loki/src/variables/loki-variables.tsx b/loki/src/variables/loki-variables.tsx new file mode 100644 index 000000000..9ca26c241 --- /dev/null +++ b/loki/src/variables/loki-variables.tsx @@ -0,0 +1,273 @@ +// Copyright The Perses Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import { FormControl, Stack, TextField } from '@mui/material'; +import { + DatasourceSelect, + DatasourceSelectProps, + isVariableDatasource, + OptionsEditorProps, + useDatasourceClient, + useDatasourceSelectValueToSelector, + VariableOption, +} from '@perses-dev/plugin-system'; +import { produce } from 'immer'; +import { ReactElement, useCallback, ChangeEvent, FocusEvent } from 'react'; +import { LogQLEditor } from '../components'; +import { + DEFAULT_LOKI, + isDefaultLokiSelector, + isLokiDatasourceSelector, + LOKI_DATASOURCE_KIND, + LokiDatasourceSelector, + LokiClient, + LokiStreamResult, +} from '../model'; +import { MatcherEditor } from './MatcherEditor'; +import { + LokiLabelNamesVariableOptions, + LokiLabelValuesVariableOptions, + LokiLogQLVariableOptions, + LokiVariableOptionsBase, +} from './types'; + +const EMPTY_MATCHERS: string[] = []; + +function useLokiDatasourceChangeHandler( + value: T, + onChange: (value: T) => void +): DatasourceSelectProps['onChange'] { + return useCallback( + (next) => { + if (isVariableDatasource(next) || isLokiDatasourceSelector(next)) { + // If they're using the default, just omit the datasource prop + onChange( + produce(value, (draft) => { + draft.datasource = !isVariableDatasource(next) && isDefaultLokiSelector(next) ? undefined : next; + }) + ); + return; + } + throw new Error('Got unexpected non-Loki datasource selector'); + }, + [onChange, value] + ); +} + +export function LokiLabelValuesVariableEditor(props: OptionsEditorProps): ReactElement { + const { + onChange, + value, + value: { datasource }, + } = props; + const selectedDatasource = datasource ?? DEFAULT_LOKI; + + const handleDatasourceChange = useLokiDatasourceChangeHandler(value, onChange); + + const handleLabelChange = useCallback( + (e: ChangeEvent) => { + onChange( + produce(value, (draft) => { + draft.labelName = e.target.value; + }) + ); + }, + [onChange, value] + ); + + const handleMatchEditorsChange = useCallback( + (matchers: string[]) => { + onChange( + produce(value, (draft) => { + draft.matchers = matchers; + }) + ); + }, + [onChange, value] + ); + + return ( + + + + + + + + ); +} + +export function LokiLabelNamesVariableEditor(props: OptionsEditorProps): ReactElement { + const { + onChange, + value, + value: { datasource }, + } = props; + + const selectedDatasource = datasource ?? DEFAULT_LOKI; + const handleDatasourceChange = useLokiDatasourceChangeHandler(value, onChange); + + const handleMatchEditorChange = useCallback( + (matchers: string[]) => { + onChange( + produce(value, (draft) => { + draft.matchers = matchers; + }) + ); + }, + [onChange, value] + ); + + return ( + + + + + + + ); +} + +export function LokiLogQLVariableEditor(props: OptionsEditorProps): ReactElement { + const { + onChange, + value, + value: { datasource }, + } = props; + const datasourceSelectValue = datasource ?? DEFAULT_LOKI; + const selectedDatasource = useDatasourceSelectValueToSelector( + datasourceSelectValue, + LOKI_DATASOURCE_KIND + ) as LokiDatasourceSelector; + + const { data: client } = useDatasourceClient(selectedDatasource); + + const handleDatasourceChange = useLokiDatasourceChangeHandler(value, onChange); + + const handleOnBlurLogQLChange = useCallback( + (e: FocusEvent) => { + onChange( + produce(value, (draft) => { + draft.expr = e.target.textContent ?? ''; + }) + ); + }, + [onChange, value] + ); + + const handleLabelNameChange = useCallback( + (e: ChangeEvent) => { + onChange( + produce(value, (draft) => { + draft.labelName = e.target.value; + }) + ); + }, + [onChange, value] + ); + + return ( + + + + + + + + ); +} + +export function capturingMetric(results: Array<{ metric: Record }>, labelName: string): string[] { + const captured = new Set(); + for (const sample of results) { + const value = sample.metric[labelName]; + if (value !== undefined) { + captured.add(value); + } + } + return Array.from(captured); +} + +export function capturingStreams(results: LokiStreamResult[], labelName: string): string[] { + const captured = new Set(); + for (const sample of results) { + const value = sample.stream[labelName]; + if (value !== undefined) { + captured.add(value); + } + } + return Array.from(captured); +} + +export const stringArrayToVariableOptions = (values?: string[]): VariableOption[] => { + if (!values) return []; + return values.map((value) => ({ + value, + label: value, + })); +}; diff --git a/loki/src/variables/types.ts b/loki/src/variables/types.ts new file mode 100644 index 000000000..b9f33a3ab --- /dev/null +++ b/loki/src/variables/types.ts @@ -0,0 +1,33 @@ +// Copyright The Perses Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import { DatasourceSelectValue } from '@perses-dev/plugin-system'; +import { LokiDatasourceSelector } from '../model/loki-selectors'; + +export interface LokiVariableOptionsBase { + datasource?: DatasourceSelectValue; +} + +export type LokiLabelNamesVariableOptions = LokiVariableOptionsBase & { + matchers?: string[]; +}; + +export type LokiLabelValuesVariableOptions = LokiVariableOptionsBase & { + labelName: string; + matchers?: string[]; +}; + +export type LokiLogQLVariableOptions = LokiVariableOptionsBase & { + expr: string; + labelName: string; +}; diff --git a/package-lock.json b/package-lock.json index a1d167498..6c8c7cd5f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -563,9 +563,9 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.0.tgz", - "integrity": "sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg==", + "version": "7.29.3", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.3.tgz", + "integrity": "sha512-LIVqM46zQWZhj17qA8wb4nW/ixr2y1Nw+r1etiAWgRM6U1IqP+LNhL1yg440jYZR72jCWcWbLWzIosH+uP1fqg==", "dev": true, "license": "MIT", "engines": { @@ -756,9 +756,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.29.2", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.2.tgz", - "integrity": "sha512-4GgRzy/+fsBa72/RZVJmGKPmZu9Byn8o4MoLpmNe1m8ZfYnz5emHLQz3U4gLud6Zwl0RZIcgiLD7Uq7ySFuDLA==", + "version": "7.29.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.3.tgz", + "integrity": "sha512-b3ctpQwp+PROvU/cttc4OYl4MzfJUWy6FZg+PMXfzmt/+39iHVF0sDfqay8TQM3JA2EUOyKcFZt75jWriQijsA==", "license": "MIT", "dependencies": { "@babel/types": "^7.29.0" @@ -1082,9 +1082,9 @@ } }, "node_modules/@codemirror/autocomplete": { - "version": "6.20.1", - "resolved": "https://registry.npmjs.org/@codemirror/autocomplete/-/autocomplete-6.20.1.tgz", - "integrity": "sha512-1cvg3Vz1dSSToCNlJfRA2WSI4ht3K+WplO0UMOgmUYPivCyy2oueZY6Lx7M9wThm7SDUBViRmuT+OG/i8+ON9A==", + "version": "6.20.2", + "resolved": "https://registry.npmjs.org/@codemirror/autocomplete/-/autocomplete-6.20.2.tgz", + "integrity": "sha512-G5FPkgIiLjOgZMjqVjvuKQ1rGPtHogLldJr33eFJdVLtmwY+giGrlv/ewljLz6b9BSQLkjxuwBc6g6omDM+YxQ==", "license": "MIT", "dependencies": { "@codemirror/language": "^6.0.0", @@ -1130,13 +1130,13 @@ } }, "node_modules/@codemirror/lint": { - "version": "6.9.5", - "resolved": "https://registry.npmjs.org/@codemirror/lint/-/lint-6.9.5.tgz", - "integrity": "sha512-GElsbU9G7QT9xXhpUg1zWGmftA/7jamh+7+ydKRuT0ORpWS3wOSP0yT1FOlIZa7mIJjpVPipErsyvVqB9cfTFA==", + "version": "6.9.6", + "resolved": "https://registry.npmjs.org/@codemirror/lint/-/lint-6.9.6.tgz", + "integrity": "sha512-6Kp7r6XfCi/D/5sdXieMfg9pJU1bUEx96WITuLU6ESaKizCz0QHFMjY/TaFSbigDdEAIgi93itLBIUETP4oK+A==", "license": "MIT", "dependencies": { "@codemirror/state": "^6.0.0", - "@codemirror/view": "^6.35.0", + "@codemirror/view": "^6.42.0", "crelt": "^1.0.5" } }, @@ -1173,9 +1173,9 @@ } }, "node_modules/@codemirror/view": { - "version": "6.41.1", - "resolved": "https://registry.npmjs.org/@codemirror/view/-/view-6.41.1.tgz", - "integrity": "sha512-ToDnWKbBnke+ZLrP6vgTTDScGi5H37YYuZGniQaBzxMVdtCxMrslsmtnOvbPZk4RX9bvkQqnWR/WS/35tJA0qg==", + "version": "6.42.0", + "resolved": "https://registry.npmjs.org/@codemirror/view/-/view-6.42.0.tgz", + "integrity": "sha512-+PJEyndSCrsS2oLH3DfWoLBcF3xfeyGXtLnpXqHY01kL3TogyCLD12hNvSu73ww2KFftrx3Rd0nGOigbSkU3Hw==", "license": "MIT", "dependencies": { "@codemirror/state": "^6.6.0", @@ -2845,24 +2845,24 @@ "license": "MIT" }, "node_modules/@module-federation/bridge-react-webpack-plugin": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/@module-federation/bridge-react-webpack-plugin/-/bridge-react-webpack-plugin-2.3.3.tgz", - "integrity": "sha512-W2jQ3Wuqree9Dq3UAx8jGbYtvHuuYgzrd2j9FP8Bt6NaynaNU1yYG86MBnAhZJPTltex0CguudR1dgFpYdvLUg==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@module-federation/bridge-react-webpack-plugin/-/bridge-react-webpack-plugin-2.4.0.tgz", + "integrity": "sha512-yxDv/FJoLiKo2eqIcEWvSnSpJgyYkCzJvNaFsQ2QE3rNv68IeAarlSzCo+d0QyQoPJnTETyHsOh1SSBazIzecw==", "license": "MIT", "dependencies": { - "@module-federation/sdk": "2.3.3", + "@module-federation/sdk": "2.4.0", "@types/semver": "7.5.8", "semver": "7.6.3" } }, "node_modules/@module-federation/cli": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/@module-federation/cli/-/cli-2.3.3.tgz", - "integrity": "sha512-g3f3aEruv07zK4VcUlAllswrp2ncA/jF0P0yoEWNRa9K7N+xNCfqcdzw2aVWOJ30qNMurhLWuyzYqfDIx0LpfQ==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@module-federation/cli/-/cli-2.4.0.tgz", + "integrity": "sha512-c46g9srroc2hDfrlHyd4Y404SLnw3v9t7Kqij+yK01Hx8C2FyZpyanTGUHVyrmzqp/0y3lPrWURUHkHfk/cJQA==", "license": "MIT", "dependencies": { - "@module-federation/dts-plugin": "2.3.3", - "@module-federation/sdk": "2.3.3", + "@module-federation/dts-plugin": "2.4.0", + "@module-federation/sdk": "2.4.0", "commander": "11.1.0", "jiti": "2.4.2" }, @@ -2873,38 +2873,16 @@ "node": ">=16.0.0" } }, - "node_modules/@module-federation/data-prefetch": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/@module-federation/data-prefetch/-/data-prefetch-2.3.3.tgz", - "integrity": "sha512-ZM1QtyjbWYnhUizHFhwYjHGXlkZek3vzTpL35d5FkAhVrOU0u0Qv6zpZjdcCm0FJznqVsUQx1w0vagUyGWQf0g==", - "license": "MIT", - "dependencies": { - "@module-federation/runtime": "2.3.3", - "@module-federation/sdk": "2.3.3" - }, - "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" - }, - "peerDependenciesMeta": { - "react": { - "optional": true - }, - "react-dom": { - "optional": true - } - } - }, "node_modules/@module-federation/dts-plugin": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/@module-federation/dts-plugin/-/dts-plugin-2.3.3.tgz", - "integrity": "sha512-VNtURt+hvieNKCBleAqHKffLAU4clKmuuqLQIbvDkFbGe4bo7hUaq5DruTnJBWWDOizZx0OQrdQYPijCnBK6UQ==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@module-federation/dts-plugin/-/dts-plugin-2.4.0.tgz", + "integrity": "sha512-sa6v5ByyqMRHzpwDu0zc7s5mZ39EFIkG0jkRfZU09pzkrJEIy4uZ1Kt9SLysFB8RBMIAvAakAfqDlVWvf1lndg==", "license": "MIT", "dependencies": { - "@module-federation/error-codes": "2.3.3", - "@module-federation/managers": "2.3.3", - "@module-federation/sdk": "2.3.3", - "@module-federation/third-party-dts-extractor": "2.3.3", + "@module-federation/error-codes": "2.4.0", + "@module-federation/managers": "2.4.0", + "@module-federation/sdk": "2.4.0", + "@module-federation/third-party-dts-extractor": "2.4.0", "adm-zip": "0.5.10", "ansi-colors": "4.1.3", "isomorphic-ws": "5.0.0", @@ -2923,23 +2901,22 @@ } }, "node_modules/@module-federation/enhanced": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/@module-federation/enhanced/-/enhanced-2.3.3.tgz", - "integrity": "sha512-BJSs56lqO9NI9aC+hVhg2CU/UwG1TphVl1b7WBx6Jv6DYUyVQbgXeQpgqYVsxYVRKYOl7eDZmjXl2eA/n1IP/Q==", - "license": "MIT", - "dependencies": { - "@module-federation/bridge-react-webpack-plugin": "2.3.3", - "@module-federation/cli": "2.3.3", - "@module-federation/data-prefetch": "2.3.3", - "@module-federation/dts-plugin": "2.3.3", - "@module-federation/error-codes": "2.3.3", - "@module-federation/inject-external-runtime-core-plugin": "2.3.3", - "@module-federation/managers": "2.3.3", - "@module-federation/manifest": "2.3.3", - "@module-federation/rspack": "2.3.3", - "@module-federation/runtime-tools": "2.3.3", - "@module-federation/sdk": "2.3.3", - "@module-federation/webpack-bundler-runtime": "2.3.3", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@module-federation/enhanced/-/enhanced-2.4.0.tgz", + "integrity": "sha512-NiccK03x7V6bK2LvJNuW520kT+Onx+LJe8lyPsENjXctECCIFJdJOmYr8ABif/kLayWKrrYCzCGVNNiQXANEGQ==", + "license": "MIT", + "dependencies": { + "@module-federation/bridge-react-webpack-plugin": "2.4.0", + "@module-federation/cli": "2.4.0", + "@module-federation/dts-plugin": "2.4.0", + "@module-federation/error-codes": "2.4.0", + "@module-federation/inject-external-runtime-core-plugin": "2.4.0", + "@module-federation/managers": "2.4.0", + "@module-federation/manifest": "2.4.0", + "@module-federation/rspack": "2.4.0", + "@module-federation/runtime-tools": "2.4.0", + "@module-federation/sdk": "2.4.0", + "@module-federation/webpack-bundler-runtime": "2.4.0", "schema-utils": "4.3.0", "tapable": "2.3.0", "upath": "2.0.1" @@ -2965,52 +2942,52 @@ } }, "node_modules/@module-federation/error-codes": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/@module-federation/error-codes/-/error-codes-2.3.3.tgz", - "integrity": "sha512-UVtKBoKnRDcHgByIDvPRZSxQqjqbNH7NvJm1KHLoce33+EDiIdZYs0HvvUQv43RgESpB9s7HjrqFlq3bEcAgfQ==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@module-federation/error-codes/-/error-codes-2.4.0.tgz", + "integrity": "sha512-ktCZtwOoiKR1URJyBt223OsOFAUvc13rICYif55mt7+DomtELlh5FicnEz6mPLBUwmNM9vyBMvkxOdp+fQ5oUg==", "license": "MIT" }, "node_modules/@module-federation/inject-external-runtime-core-plugin": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/@module-federation/inject-external-runtime-core-plugin/-/inject-external-runtime-core-plugin-2.3.3.tgz", - "integrity": "sha512-ImSft6hOkMdnpZX8O+RydwkYENxhAwT92n1OAT3Xf01DXMrEpSO0PqBlPGgontxuiaV9dM2/xWSLGuIWaOtupA==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@module-federation/inject-external-runtime-core-plugin/-/inject-external-runtime-core-plugin-2.4.0.tgz", + "integrity": "sha512-GucUMQmQXcnJC/OnJGvMz3Qy7ap8nAffhQPwDpOSi0Qwm+Iq/ppzG8N3tlLBDmv/O8hiF8HHlg789XK2kcCQtg==", "license": "MIT", "peerDependencies": { - "@module-federation/runtime-tools": "2.3.3" + "@module-federation/runtime-tools": "2.4.0" } }, "node_modules/@module-federation/managers": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/@module-federation/managers/-/managers-2.3.3.tgz", - "integrity": "sha512-sYL0t2guakJ+nDSQANH54uz5q1YxaNCn5C3lr+7BoRD49dX7Z6k7094yqOPEy8trzqdIoQVFpgewVA6IC/FeyQ==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@module-federation/managers/-/managers-2.4.0.tgz", + "integrity": "sha512-Z8j6aog44G1gt4yIAaeDowwZ7xg0aAxTA1Hq69euJK9cR9MDEaLbLUk57jDoiRj6xLwlCiw7ozY+U15BQATk6Q==", "license": "MIT", "dependencies": { - "@module-federation/sdk": "2.3.3", + "@module-federation/sdk": "2.4.0", "find-pkg": "2.0.0" } }, "node_modules/@module-federation/manifest": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/@module-federation/manifest/-/manifest-2.3.3.tgz", - "integrity": "sha512-mAEXuo5sGt8FUDzftU8f0ci0PbsZIDcLRYX9AkXwbXg0JRyVEvWyiBrEKF+zZuy7YM7eRdyp6JjLJPDzufhj5w==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@module-federation/manifest/-/manifest-2.4.0.tgz", + "integrity": "sha512-ZL+W5rbtgRf9TWRP7Dupt/Svia4bJEOS6gWSj9jzemiLPRPkMO5hjWZKVHIc8oG+Vb25yzozFMmQ+luGi695wg==", "license": "MIT", "dependencies": { - "@module-federation/dts-plugin": "2.3.3", - "@module-federation/managers": "2.3.3", - "@module-federation/sdk": "2.3.3", + "@module-federation/dts-plugin": "2.4.0", + "@module-federation/managers": "2.4.0", + "@module-federation/sdk": "2.4.0", "find-pkg": "2.0.0" } }, "node_modules/@module-federation/node": { - "version": "2.7.41", - "resolved": "https://registry.npmjs.org/@module-federation/node/-/node-2.7.41.tgz", - "integrity": "sha512-ZaNrfX+7ua8UvnRa6qgrDtViU9Oz3oBGpFprldU8ek0NB2QWNACu9RMU7fHdTD/FKlzGVLi/LgdKnNKkmJD2TA==", + "version": "2.7.42", + "resolved": "https://registry.npmjs.org/@module-federation/node/-/node-2.7.42.tgz", + "integrity": "sha512-aX/T4L9bPbOgNLIW+30k/dA2Iohoy9/jf4yG1ka6Hkuo5h7iEBeZiQkwIqC06cnCbtKL1HnAiYlXHmrDPW5xvg==", "dev": true, "license": "MIT", "dependencies": { - "@module-federation/enhanced": "2.3.3", - "@module-federation/runtime": "2.3.3", - "@module-federation/sdk": "2.3.3", + "@module-federation/enhanced": "2.4.0", + "@module-federation/runtime": "2.4.0", + "@module-federation/sdk": "2.4.0", "encoding": "0.1.13", "node-fetch": "2.7.0", "tapable": "2.3.0" @@ -3025,15 +3002,15 @@ } }, "node_modules/@module-federation/rsbuild-plugin": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/@module-federation/rsbuild-plugin/-/rsbuild-plugin-2.3.3.tgz", - "integrity": "sha512-usTfr9LzOkGRkXNad54EjmN7Rp20MNUTg54f+cODQF2tP+Fdqyp6tFpWzv5DwoDFDYg2zD9GOhWEUf3vGdWviA==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@module-federation/rsbuild-plugin/-/rsbuild-plugin-2.4.0.tgz", + "integrity": "sha512-1hl9xoYG/oWkO4olUWV912j3zwePvINm+2DUCaCPYUHH8qq1Gf1qDI3uD4S7vZmS9O1OVbvxjAni4tfTDxlwJQ==", "dev": true, "license": "MIT", "dependencies": { - "@module-federation/enhanced": "2.3.3", - "@module-federation/node": "2.7.41", - "@module-federation/sdk": "2.3.3" + "@module-federation/enhanced": "2.4.0", + "@module-federation/node": "2.7.42", + "@module-federation/sdk": "2.4.0" }, "engines": { "node": ">=16.0.0" @@ -3048,18 +3025,18 @@ } }, "node_modules/@module-federation/rspack": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/@module-federation/rspack/-/rspack-2.3.3.tgz", - "integrity": "sha512-4s3G+wXZ6J3rKe0EeZnGLQUM7y+qpiI5NM3U6ylZuxD8q7mAwQVHThbH6ruDYUNDVEOc6N0j/+/LdfGRw+e5xw==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@module-federation/rspack/-/rspack-2.4.0.tgz", + "integrity": "sha512-NWH5Vaj/fA9R7PfbwTuE1Ty/pfiAt12On0E3FzoeVPCyb5MxO1i0z+xxRHbPhF4ZOrAPGEMaMQ8Z9vH94EiElw==", "license": "MIT", "dependencies": { - "@module-federation/bridge-react-webpack-plugin": "2.3.3", - "@module-federation/dts-plugin": "2.3.3", - "@module-federation/inject-external-runtime-core-plugin": "2.3.3", - "@module-federation/managers": "2.3.3", - "@module-federation/manifest": "2.3.3", - "@module-federation/runtime-tools": "2.3.3", - "@module-federation/sdk": "2.3.3" + "@module-federation/bridge-react-webpack-plugin": "2.4.0", + "@module-federation/dts-plugin": "2.4.0", + "@module-federation/inject-external-runtime-core-plugin": "2.4.0", + "@module-federation/managers": "2.4.0", + "@module-federation/manifest": "2.4.0", + "@module-federation/runtime-tools": "2.4.0", + "@module-federation/sdk": "2.4.0" }, "peerDependencies": { "@rspack/core": "^0.7.0 || ^1.0.0 || ^2.0.0-0", @@ -3076,43 +3053,43 @@ } }, "node_modules/@module-federation/runtime": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/@module-federation/runtime/-/runtime-2.3.3.tgz", - "integrity": "sha512-JYJ3qv9V85DtBtT/ppDuJNwBTUrYqqZDYcyiTzwY5+44dC5QPvgJ//F+BOhAhZ02WkZV0b4jsKTyLOC3vXKGqQ==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@module-federation/runtime/-/runtime-2.4.0.tgz", + "integrity": "sha512-IrLAMwUuteRgFlEkg9jrn4bk8uC897FnXvfNmkKD8/qIoNtSd+32e5ouQn+PEYbX/RjRUB1TYveY6rYHpTPkyg==", "license": "MIT", "dependencies": { - "@module-federation/error-codes": "2.3.3", - "@module-federation/runtime-core": "2.3.3", - "@module-federation/sdk": "2.3.3" + "@module-federation/error-codes": "2.4.0", + "@module-federation/runtime-core": "2.4.0", + "@module-federation/sdk": "2.4.0" } }, "node_modules/@module-federation/runtime-core": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/@module-federation/runtime-core/-/runtime-core-2.3.3.tgz", - "integrity": "sha512-B07LDH9KxhBO3GbULGW64mQFVQBtrEd3PoaCBm7XR1IbU8rMQUJQjDNVZgXYcyhRPBVP+3KWZuiaKFRiNb6PQw==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@module-federation/runtime-core/-/runtime-core-2.4.0.tgz", + "integrity": "sha512-0S8fDw28DXDW17lTQwq5vfJWe2lG0Lw3+w4vk3DVVImLwXXay+OGxLDxzWUfypWcMznfpnoAnFUMO3PtuXziuA==", "license": "MIT", "dependencies": { - "@module-federation/error-codes": "2.3.3", - "@module-federation/sdk": "2.3.3" + "@module-federation/error-codes": "2.4.0", + "@module-federation/sdk": "2.4.0" } }, "node_modules/@module-federation/runtime-tools": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/@module-federation/runtime-tools/-/runtime-tools-2.3.3.tgz", - "integrity": "sha512-XODzyLbBYcy4wnYBXKIBqaHPVfBx1HshGdjZmSctDDnx9/VYgdx9DShb6UI+WuQBKJgPzTcx4xbvbCM4SdMilQ==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@module-federation/runtime-tools/-/runtime-tools-2.4.0.tgz", + "integrity": "sha512-BWQsGT4EWscV9bx3bVHEwp6lERBsiYm7rnPiDpwd2fx+hGEpz1IM9Pz35VryHNDXYxw7MzaAuwTMM+L7uN8OYQ==", "license": "MIT", "dependencies": { - "@module-federation/runtime": "2.3.3", - "@module-federation/webpack-bundler-runtime": "2.3.3" + "@module-federation/runtime": "2.4.0", + "@module-federation/webpack-bundler-runtime": "2.4.0" } }, "node_modules/@module-federation/sdk": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/@module-federation/sdk/-/sdk-2.3.3.tgz", - "integrity": "sha512-mwCS+LQdqiSc6fM5iz/S60ibaFNSH6kNqlZkCRIuS4yjdZ+jgnihz+6xp1QzppvfFgKLhEHBiXOmcYOdk3Ckew==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@module-federation/sdk/-/sdk-2.4.0.tgz", + "integrity": "sha512-eZDdF5B69W9npuka0VL24FY7XDM+YAwwfkscSeWOSqv4/8Hm0xmcmSurlP6NIOrwbeogerRCtEcnx/TFXYjoow==", "license": "MIT", "peerDependencies": { - "node-fetch": "^3.3.2" + "node-fetch": "^2.7.0 || ^3.3.2" }, "peerDependenciesMeta": { "node-fetch": { @@ -3121,9 +3098,9 @@ } }, "node_modules/@module-federation/third-party-dts-extractor": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/@module-federation/third-party-dts-extractor/-/third-party-dts-extractor-2.3.3.tgz", - "integrity": "sha512-rR94TjC1QVQLQPTazI0waLc76hI8dnv6aHTl+PUEIY9s5hXp8TA85XS0QJQqIf2KTjlPgZbWAwyFjOAJluTjaw==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@module-federation/third-party-dts-extractor/-/third-party-dts-extractor-2.4.0.tgz", + "integrity": "sha512-4v24t6L3dET/6abMOM2fiM3roT0c8mi21/i+uDc6WG7U0i+Xp2SojBppTs6gnT0lkwMTe+u6xIpNQakdUftHsg==", "license": "MIT", "dependencies": { "find-pkg": "2.0.0", @@ -3131,14 +3108,14 @@ } }, "node_modules/@module-federation/webpack-bundler-runtime": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/@module-federation/webpack-bundler-runtime/-/webpack-bundler-runtime-2.3.3.tgz", - "integrity": "sha512-W+P6ZF9J3gwnQuoF07YV0OiR1D6sI/uErUu4+c3QXxka3orANUHujkddNSsDxL1obAGoJa7Da99crZKf7u2j/w==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@module-federation/webpack-bundler-runtime/-/webpack-bundler-runtime-2.4.0.tgz", + "integrity": "sha512-Ntx0+QsgcwtXlpGjL/Vf2PMdPjUHl07b3yM4kBc1kbRogW3Ee84QneBRi/X3w4/jlz4JKbHjD+CMXaqi2W6hgw==", "license": "MIT", "dependencies": { - "@module-federation/error-codes": "2.3.3", - "@module-federation/runtime": "2.3.3", - "@module-federation/sdk": "2.3.3" + "@module-federation/error-codes": "2.4.0", + "@module-federation/runtime": "2.4.0", + "@module-federation/sdk": "2.4.0" } }, "node_modules/@mui/core-downloads-tracker": { @@ -4292,9 +4269,9 @@ } }, "node_modules/@prometheus-io/codemirror-promql/node_modules/lru-cache": { - "version": "11.3.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.3.5.tgz", - "integrity": "sha512-NxVFwLAnrd9i7KUBxC4DrUhmgjzOs+1Qm50D3oF1/oL+r1NpZ4gA7xvG0/zJ8evR7zIKn4vLf7qTNduWFtCrRw==", + "version": "11.3.6", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.3.6.tgz", + "integrity": "sha512-Gf/KoL3C/MlI7Bt0PGI9I+TeTC/I6r/csU58N4BSNc4lppLBeKsOdFYkK+dX0ABDUMJNfCHTyPpzwwO21Awd3A==", "license": "BlueOak-1.0.0", "engines": { "node": "20 || >=22" @@ -4594,9 +4571,9 @@ } }, "node_modules/@rsbuild/core/node_modules/jiti": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz", - "integrity": "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==", + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.7.0.tgz", + "integrity": "sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==", "dev": true, "license": "MIT", "bin": { @@ -4623,28 +4600,28 @@ } }, "node_modules/@rspack/binding": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@rspack/binding/-/binding-2.0.1.tgz", - "integrity": "sha512-ynV1gw4KqFtQ0P+ZZh76SUj49wBb2FuHW3zSmHverHWuxBhzvrZS6/dZ+fCFQG8bTTPtrPz0RQUTN3uEDbPVBQ==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@rspack/binding/-/binding-2.0.2.tgz", + "integrity": "sha512-0kZPplW9GWx8mfC6DfsaRY3QBIYPuUs42JfmSM6aSb8tMHZAXQeLeMB8M+h8i4SeI+aFtCgO6UuYGtyWf7+L+A==", "license": "MIT", "peer": true, "optionalDependencies": { - "@rspack/binding-darwin-arm64": "2.0.1", - "@rspack/binding-darwin-x64": "2.0.1", - "@rspack/binding-linux-arm64-gnu": "2.0.1", - "@rspack/binding-linux-arm64-musl": "2.0.1", - "@rspack/binding-linux-x64-gnu": "2.0.1", - "@rspack/binding-linux-x64-musl": "2.0.1", - "@rspack/binding-wasm32-wasi": "2.0.1", - "@rspack/binding-win32-arm64-msvc": "2.0.1", - "@rspack/binding-win32-ia32-msvc": "2.0.1", - "@rspack/binding-win32-x64-msvc": "2.0.1" + "@rspack/binding-darwin-arm64": "2.0.2", + "@rspack/binding-darwin-x64": "2.0.2", + "@rspack/binding-linux-arm64-gnu": "2.0.2", + "@rspack/binding-linux-arm64-musl": "2.0.2", + "@rspack/binding-linux-x64-gnu": "2.0.2", + "@rspack/binding-linux-x64-musl": "2.0.2", + "@rspack/binding-wasm32-wasi": "2.0.2", + "@rspack/binding-win32-arm64-msvc": "2.0.2", + "@rspack/binding-win32-ia32-msvc": "2.0.2", + "@rspack/binding-win32-x64-msvc": "2.0.2" } }, "node_modules/@rspack/binding-darwin-arm64": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@rspack/binding-darwin-arm64/-/binding-darwin-arm64-2.0.1.tgz", - "integrity": "sha512-CGFO5zmajD1Itch1lxAI7+gvKiagzyqXopHv/jHG9Su2WWQ2/Nhn2/rkSpdp6ptE9ri6+6tCOOahf099/v/Xog==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@rspack/binding-darwin-arm64/-/binding-darwin-arm64-2.0.2.tgz", + "integrity": "sha512-0o7lbgBBsDlICWdjIH0q3e0BsSco4GRiImHWVfZSVEG+q2+ykZJvSvYCVhPM1Co375Z0S3VMPa/8SjcY1FHwlw==", "cpu": [ "arm64" ], @@ -4656,9 +4633,9 @@ "peer": true }, "node_modules/@rspack/binding-darwin-x64": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@rspack/binding-darwin-x64/-/binding-darwin-x64-2.0.1.tgz", - "integrity": "sha512-2vvBNBoS09/PurupBwSrlTZd8283o00B8v20ncsNUdEff41uCR/hzIrYoTIVWnVST+Gt5O1+cfcfORp397lajg==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@rspack/binding-darwin-x64/-/binding-darwin-x64-2.0.2.tgz", + "integrity": "sha512-tOwxZpoPlTlRs/w6UyUinXJ4TYRVHMlR7+eQxO1R3muKpixvhXQjtvoaY16HuFyTVky5F0IfOoWr3x9FEsgdLg==", "cpu": [ "x64" ], @@ -4670,9 +4647,9 @@ "peer": true }, "node_modules/@rspack/binding-linux-arm64-gnu": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@rspack/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-2.0.1.tgz", - "integrity": "sha512-uvNXk6ahE3AH3h2avnd1Mgno68YQpS4cfX1OkOGWIC/roL+NrOP2XVXV4yfVAoydPALDO7AfbIfN0QdmBK3rsA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@rspack/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-2.0.2.tgz", + "integrity": "sha512-1ZD4YFhG1rmgqj+W8hfwHyKV8xDxGsc/3KgU0FwmiVEX7JfzhCkgBO/xlCG79kRKSrzuVzt4icO/G3cCKn0pag==", "cpu": [ "arm64" ], @@ -4684,9 +4661,9 @@ "peer": true }, "node_modules/@rspack/binding-linux-arm64-musl": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@rspack/binding-linux-arm64-musl/-/binding-linux-arm64-musl-2.0.1.tgz", - "integrity": "sha512-S/a6uN9PiZ5O/PjSqyIXhuRC1lVzeJkJV69NeLk5sIEUiDQ/aQGZG97uN+tluwpbo1tPbLJkdHYETfjspOX4Pg==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@rspack/binding-linux-arm64-musl/-/binding-linux-arm64-musl-2.0.2.tgz", + "integrity": "sha512-/PtTkM/DsDLjeuXTmeJeRfbjCDbcL9jvoVgZrgxYFZ28y2cdLvbChbW9uigOzs5dQEs1CIBQXMTTj7KhdBTuQg==", "cpu": [ "arm64" ], @@ -4698,9 +4675,9 @@ "peer": true }, "node_modules/@rspack/binding-linux-x64-gnu": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@rspack/binding-linux-x64-gnu/-/binding-linux-x64-gnu-2.0.1.tgz", - "integrity": "sha512-C13Kk0OkZiocZVj187Sf753UH6pDXnuEu6vzUvi3qv9ltibG1ki0H2Y8isXBYL2cHQOV+hk0g1S6/4z3TTB97A==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@rspack/binding-linux-x64-gnu/-/binding-linux-x64-gnu-2.0.2.tgz", + "integrity": "sha512-bBjsZxMHRaPo6X9SokApm6ucs+UhXtAJFyJJyuk2BH4XJsLeCU9Dz1vMwioeohFbJUUeTASVPm6/BL+RhSaunw==", "cpu": [ "x64" ], @@ -4712,9 +4689,9 @@ "peer": true }, "node_modules/@rspack/binding-linux-x64-musl": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@rspack/binding-linux-x64-musl/-/binding-linux-x64-musl-2.0.1.tgz", - "integrity": "sha512-TQsiBFpEDGkuvK9tNdGj/Uc+AIytzqhxXH/1jKU6M24cWB1DTw/Cx7DdrkCBDyq3129K3POLdujvbWCGqBzQUw==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@rspack/binding-linux-x64-musl/-/binding-linux-x64-musl-2.0.2.tgz", + "integrity": "sha512-HjlpInqzabDNkhVsUJpsHPqa9QYVWBViJoyWNjzXCAW0vKMDvwaphyUvokSinX8FGTlZi/sr5UEaHJo6XtQ35g==", "cpu": [ "x64" ], @@ -4726,9 +4703,9 @@ "peer": true }, "node_modules/@rspack/binding-wasm32-wasi": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@rspack/binding-wasm32-wasi/-/binding-wasm32-wasi-2.0.1.tgz", - "integrity": "sha512-wk3gyUgBW/ayP49bI54bkY8+EQnfBHxdoe9dz3oobSTZQc8AOWwmUUDEPltW8rUvPOM6dfHECTOUMnfaf2f5yA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@rspack/binding-wasm32-wasi/-/binding-wasm32-wasi-2.0.2.tgz", + "integrity": "sha512-YaRYNFLJRpkGfYjSWR7n9f+nQKtrlmrrffpAn/blc2geHcRvXoBc5SCs1idPtsLhj7H9qWWhs7ucjyHy4csWFg==", "cpu": [ "wasm32" ], @@ -4742,9 +4719,9 @@ } }, "node_modules/@rspack/binding-win32-arm64-msvc": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@rspack/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-2.0.1.tgz", - "integrity": "sha512-rHjLcy3VcAC3+x+PxH+gwhwv6tPe0JdXTNT5eAOs9wgZIM6T9p4wre49+K4Qy98+Fb7TTbLX0ObUitlOkGwTSA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@rspack/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-2.0.2.tgz", + "integrity": "sha512-d/3kTEKq+asLjRFPO96t+wfWiM7DLN76VQEPDD9bc1kdsZXlVJBuvyXfsgK8bbEvKplWXYcSsokhmEnuXrLOpg==", "cpu": [ "arm64" ], @@ -4756,9 +4733,9 @@ "peer": true }, "node_modules/@rspack/binding-win32-ia32-msvc": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@rspack/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-2.0.1.tgz", - "integrity": "sha512-Ad1vVqMBBnd4T8rsORngu9sl2kyRTlS4kMlvFudjzl1X2UFArEDBe0YVGNN7ZvahM12CErUx2WiN8Sd8pb+qXQ==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@rspack/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-2.0.2.tgz", + "integrity": "sha512-161cWineq3RW+Jdm1FAfSpXeUtYWvhB3kAbm46vNT9h/YYz+spwsFMvveAZ1nsVSVL0IC5lDBGUte7yUAY8K2g==", "cpu": [ "ia32" ], @@ -4770,9 +4747,9 @@ "peer": true }, "node_modules/@rspack/binding-win32-x64-msvc": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@rspack/binding-win32-x64-msvc/-/binding-win32-x64-msvc-2.0.1.tgz", - "integrity": "sha512-oPM2Jtm7HOlmxl/aBfleAVlL6t9VeHx6WvEets7BBJMInemFXAQd4CErRqybf7rXutACzLeUWBOue4Jpd1/ykw==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@rspack/binding-win32-x64-msvc/-/binding-win32-x64-msvc-2.0.2.tgz", + "integrity": "sha512-y7Q0S1FE+OlkL5GMqLG0PwxrPw6E1r892KhGrGKE1Vdufe5YTEx6xTPxzZ+b7N2KPD7s9G1/iJmWHQxb1+Bjkg==", "cpu": [ "x64" ], @@ -4784,13 +4761,13 @@ "peer": true }, "node_modules/@rspack/core": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@rspack/core/-/core-2.0.1.tgz", - "integrity": "sha512-lgfZiExh8kDR/3obgi3RQKwKG5av1Xf5qDN1aVde777W9pbmx0Pqvrww1qtNvJ+gobEjbrrn5HEZWYGe0VLmcA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@rspack/core/-/core-2.0.2.tgz", + "integrity": "sha512-VM3UHOo26uC+4QSqY5tU1ybI7KuXY5rTof8nhFOaBY9SYau0Smvr+hMSAPmrmHwknB6dXT8yaNVxrj7I+qxE1Q==", "license": "MIT", "peer": true, "dependencies": { - "@rspack/binding": "2.0.1" + "@rspack/binding": "2.0.2" }, "engines": { "node": "^20.19.0 || >=22.12.0" @@ -4892,9 +4869,9 @@ } }, "node_modules/@sinonjs/fake-timers": { - "version": "15.3.2", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-15.3.2.tgz", - "integrity": "sha512-mrn35Jl2pCpns+mE3HaZa1yPN5EYCRgiMI+135COjr2hr8Cls9DXqIZ57vZe2cz7y2XVSq92tcs6kGQcT1J8Rw==", + "version": "15.4.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-15.4.0.tgz", + "integrity": "sha512-DsG+8/LscQIQg68J6Ef3dv10u6nVyetYn923s3/sus5eaGfTo1of5WMZSLf0UJc9KDuKPilPH0UDJCjvNbDNCA==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -4957,9 +4934,9 @@ } }, "node_modules/@swc/core": { - "version": "1.15.32", - "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.15.32.tgz", - "integrity": "sha512-/eWL0n43D64QWEUHLtTE+jDqjkJhyidjkDhv6f0uJohOUAhywxQ9wXYp845DNNds0JpCdI4Uo0a9bl+vbXf+ew==", + "version": "1.15.33", + "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.15.33.tgz", + "integrity": "sha512-jOlwnFV2xhuuZeAUILGFULeR6vDPfijEJ57evfocwznQldLU3w2cZ9bSDryY9ip+AsM3r1NJKzf47V2NXebkeQ==", "dev": true, "hasInstallScript": true, "license": "Apache-2.0", @@ -4975,18 +4952,18 @@ "url": "https://opencollective.com/swc" }, "optionalDependencies": { - "@swc/core-darwin-arm64": "1.15.32", - "@swc/core-darwin-x64": "1.15.32", - "@swc/core-linux-arm-gnueabihf": "1.15.32", - "@swc/core-linux-arm64-gnu": "1.15.32", - "@swc/core-linux-arm64-musl": "1.15.32", - "@swc/core-linux-ppc64-gnu": "1.15.32", - "@swc/core-linux-s390x-gnu": "1.15.32", - "@swc/core-linux-x64-gnu": "1.15.32", - "@swc/core-linux-x64-musl": "1.15.32", - "@swc/core-win32-arm64-msvc": "1.15.32", - "@swc/core-win32-ia32-msvc": "1.15.32", - "@swc/core-win32-x64-msvc": "1.15.32" + "@swc/core-darwin-arm64": "1.15.33", + "@swc/core-darwin-x64": "1.15.33", + "@swc/core-linux-arm-gnueabihf": "1.15.33", + "@swc/core-linux-arm64-gnu": "1.15.33", + "@swc/core-linux-arm64-musl": "1.15.33", + "@swc/core-linux-ppc64-gnu": "1.15.33", + "@swc/core-linux-s390x-gnu": "1.15.33", + "@swc/core-linux-x64-gnu": "1.15.33", + "@swc/core-linux-x64-musl": "1.15.33", + "@swc/core-win32-arm64-msvc": "1.15.33", + "@swc/core-win32-ia32-msvc": "1.15.33", + "@swc/core-win32-x64-msvc": "1.15.33" }, "peerDependencies": { "@swc/helpers": ">=0.5.17" @@ -4998,9 +4975,9 @@ } }, "node_modules/@swc/core-darwin-arm64": { - "version": "1.15.32", - "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.15.32.tgz", - "integrity": "sha512-/YWMvJDPu+AAwuUsM2G+DNQ/7zhodURGzdQyewEqcvgklAdDHs3LwQmLLnyn6SJl8DT8UOxkbzK+D1PmPeelRg==", + "version": "1.15.33", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.15.33.tgz", + "integrity": "sha512-N+L0uXhuO7FIfzqwgxmzv0zIpV0qEp8wPX3QQs2p4atjMoywup2JTeDlXPw+z9pWJGCae3JjM+tZ6myclI+2gA==", "cpu": [ "arm64" ], @@ -5015,9 +4992,9 @@ } }, "node_modules/@swc/core-darwin-x64": { - "version": "1.15.32", - "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.15.32.tgz", - "integrity": "sha512-KOTXJXdAhWL+hZ77MYP3z+4pcMFaQhQ74yqyN1uz093q0YnbxpqMtYpPISbYvMHzVRNNx5kN+9RZAXEaadhWVA==", + "version": "1.15.33", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.15.33.tgz", + "integrity": "sha512-/Il4QHSOhV4FekbsDtkrNmKbsX26oSysvgrRswa/RYOHXAkwXDbB4jaeKq6PsJLSPkzJ2KzQ061gtBnk0vNHfA==", "cpu": [ "x64" ], @@ -5032,9 +5009,9 @@ } }, "node_modules/@swc/core-linux-arm-gnueabihf": { - "version": "1.15.32", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.15.32.tgz", - "integrity": "sha512-oOoxLweljlc0A4X8ybsgxV7cVaYTwBOg2iMDJcFR3Sr48C+lsv9VzSmqdK/IVIXF4W4GjLc3VqTAdSMXlfVLuQ==", + "version": "1.15.33", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.15.33.tgz", + "integrity": "sha512-C64hBnBxq4viOPQ8hlx+2lJ23bzZBGnjw7ryALmS+0Q3zHmwO8lw1/DArLENw4Q18/0w5wdEO1k3m1wWNtKGqQ==", "cpu": [ "arm" ], @@ -5049,9 +5026,9 @@ } }, "node_modules/@swc/core-linux-arm64-gnu": { - "version": "1.15.32", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.15.32.tgz", - "integrity": "sha512-oDzEkdl6D6BAWdMtU5KGO7y3HR5fJcvByNLyEk9+ugj8nP5Ovb7P4kBcStBXc4MPExFGQryehiINMlmY8HlclA==", + "version": "1.15.33", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.15.33.tgz", + "integrity": "sha512-TRJfnJbX3jqpxRDRoieMzRiCBS5jOmXNb3iQXmcgjFEHKLnAgK1RZRU8Cq1MsPqO4jAJp/ld1G4O3fXuxv85uw==", "cpu": [ "arm64" ], @@ -5066,9 +5043,9 @@ } }, "node_modules/@swc/core-linux-arm64-musl": { - "version": "1.15.32", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.15.32.tgz", - "integrity": "sha512-omcqjoZP/b8D8PuczVoRwJieC6ibj7qIxTftNYokz4/aSmKFHvsd7nIFfPk5ZvtzncbH4AY7+Dkr/Lp2gWxYeA==", + "version": "1.15.33", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.15.33.tgz", + "integrity": "sha512-il7tYM+CpUNzieQbwAjFT1P8zqAhmGWNAGhQZBnxurXZ0aNn+5nqYFTEUKNZl7QibtT0uQXzTZrNGHCIj6Y1Og==", "cpu": [ "arm64" ], @@ -5083,9 +5060,9 @@ } }, "node_modules/@swc/core-linux-ppc64-gnu": { - "version": "1.15.32", - "resolved": "https://registry.npmjs.org/@swc/core-linux-ppc64-gnu/-/core-linux-ppc64-gnu-1.15.32.tgz", - "integrity": "sha512-KGkTMyz/Tbn3PBNu0AVZ4GTDFKnICrYcTiNPZq8DrvK42pnFsf3GNDrIG9E5AtQlTmC0YigkWKmu0eMcfTrmgA==", + "version": "1.15.33", + "resolved": "https://registry.npmjs.org/@swc/core-linux-ppc64-gnu/-/core-linux-ppc64-gnu-1.15.33.tgz", + "integrity": "sha512-ZtNBwN0Z7CFj9Il0FcPaKdjgP7URyKu/3RfH46vq+0paOBqLj4NYldD6Qo//Duif/7IOtAraUfDOmp0PLAufog==", "cpu": [ "ppc64" ], @@ -5100,9 +5077,9 @@ } }, "node_modules/@swc/core-linux-s390x-gnu": { - "version": "1.15.32", - "resolved": "https://registry.npmjs.org/@swc/core-linux-s390x-gnu/-/core-linux-s390x-gnu-1.15.32.tgz", - "integrity": "sha512-G3Aa4tVS/3OGZBkoNIwUF9F6RAy+Osb4GOlo62SinLmDiErz/ykmM7KH0wkz6l9kM8jJq1HyAM6atJTUEbBk7g==", + "version": "1.15.33", + "resolved": "https://registry.npmjs.org/@swc/core-linux-s390x-gnu/-/core-linux-s390x-gnu-1.15.33.tgz", + "integrity": "sha512-De1IyajoOmhOYYjw/lx66bKlyDpHZTueqwpDrWgf5O7T6d1ODeJJO9/OqMBmrBQc5C+dNnlmIufHsp4QVCWufA==", "cpu": [ "s390x" ], @@ -5117,9 +5094,9 @@ } }, "node_modules/@swc/core-linux-x64-gnu": { - "version": "1.15.32", - "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.15.32.tgz", - "integrity": "sha512-ERsjfGcj6CBmj3vJnGDO8m8rTvw6RqMcWo1dogOtNx3/+/0+NNpJiXDobJrr1GwInI/BHAEkvSFIH6d2LqPcUQ==", + "version": "1.15.33", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.15.33.tgz", + "integrity": "sha512-mGTH0YxmUN+x6vRN/I6NOk5X0ogNktkwPnJ94IMvR7QjhRDwL0O8RXEDhyUM0YtwWrryBOqaJQBX4zruxEPRGw==", "cpu": [ "x64" ], @@ -5134,9 +5111,9 @@ } }, "node_modules/@swc/core-linux-x64-musl": { - "version": "1.15.32", - "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.15.32.tgz", - "integrity": "sha512-N4Ggahe/8SUbTX50P6EdhbW9YWcgbZVb52R4cq6MK+zsoMjRq7rGvV5ztA05QnbaCYqMYx8rTY7KAIA3Crdo4Q==", + "version": "1.15.33", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.15.33.tgz", + "integrity": "sha512-hj628ZkSEJf6zMf5VMbYrG2O6QqyTIp2qwY6VlCjvIa9lAEZ5c2lfPblCLVGYubTeLJDxadLB/CxqQYOQABeEQ==", "cpu": [ "x64" ], @@ -5151,9 +5128,9 @@ } }, "node_modules/@swc/core-win32-arm64-msvc": { - "version": "1.15.32", - "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.15.32.tgz", - "integrity": "sha512-01yN0o9jvo8xBTP12aPK2wW8b41jmOlGbDDlAnoynotc4pO6xA0zby9f1z6j++qXDpGBttLySq1omgVrlQKYcw==", + "version": "1.15.33", + "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.15.33.tgz", + "integrity": "sha512-GV2oohtN2/5+KSccl86VULu3aT+LrISC8uzgSq0FRnikpD+Zwc+sBlXmoKQ+Db6jI57ITUOIB8jRkdGMABC29g==", "cpu": [ "arm64" ], @@ -5168,9 +5145,9 @@ } }, "node_modules/@swc/core-win32-ia32-msvc": { - "version": "1.15.32", - "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.15.32.tgz", - "integrity": "sha512-fLagI9XZYNpTcmlqAcp3KBtmj7E19WCmYD80Jxj1Kn5tGNa7yxNLd3NNdWxuZGUPl5iC0/KqZru7g08gF6Fsrw==", + "version": "1.15.33", + "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.15.33.tgz", + "integrity": "sha512-gtyvzSNR8DHKfFEA2uqb8Ld1myqi6uEg2jyeUq3ikn5ytYs7H8RpZYC8mdy4NXr8hfcdJfCLXPlYaqqfBXpoEQ==", "cpu": [ "ia32" ], @@ -5185,9 +5162,9 @@ } }, "node_modules/@swc/core-win32-x64-msvc": { - "version": "1.15.32", - "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.15.32.tgz", - "integrity": "sha512-gbc2bQ/T2CiR+w0OvcVKwLOFAcPZBvmWmolbwpg1E8UrpeC03DGtyMUApOHNXNYWA3SHFrYXCQtosrcMza1YFg==", + "version": "1.15.33", + "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.15.33.tgz", + "integrity": "sha512-d6fRqQSkJI+kmMEBWaDQ7TMl8+YjLYbwRUPZQ9DY0ORBJeTzOrG0twvfvlZ2xgw6jA0ScQKgfBm4vHLSLl5Hqg==", "cpu": [ "x64" ], @@ -5545,9 +5522,9 @@ "license": "MIT" }, "node_modules/@turbo/darwin-64": { - "version": "2.9.6", - "resolved": "https://registry.npmjs.org/@turbo/darwin-64/-/darwin-64-2.9.6.tgz", - "integrity": "sha512-X/56SnVXIQZBLKwniGTwEQTGmtE5brSACnKMBWpY3YafuxVYefrC2acamfjgxP7BG5w3I+6jf0UrLoSzgPcSJg==", + "version": "2.9.9", + "resolved": "https://registry.npmjs.org/@turbo/darwin-64/-/darwin-64-2.9.9.tgz", + "integrity": "sha512-hTEiNu2ABZZOO1qbjnKASI8eF3BdOOzU6iKv5w5uGOK65DDMc10cS40N1kqM99YT0uSAGUwNu6GdFctRPeEeVA==", "cpu": [ "x64" ], @@ -5559,9 +5536,9 @@ ] }, "node_modules/@turbo/darwin-arm64": { - "version": "2.9.6", - "resolved": "https://registry.npmjs.org/@turbo/darwin-arm64/-/darwin-arm64-2.9.6.tgz", - "integrity": "sha512-aalBeSl4agT/QtYGDyf/XLajedWzUC9Vg/pm/YO6QQ93vkQ91Vz5uK1ta5RbVRDozQSz4njxUNqRNmOXDzW+qw==", + "version": "2.9.9", + "resolved": "https://registry.npmjs.org/@turbo/darwin-arm64/-/darwin-arm64-2.9.9.tgz", + "integrity": "sha512-MinO40EEcP5mJiTVpfjtEulsEBhVeryfq21QhYtJZ8hQJLHGgy459rcmDVAY8/JERe4dkVU4KW+zoLF22o01EA==", "cpu": [ "arm64" ], @@ -5573,9 +5550,9 @@ ] }, "node_modules/@turbo/linux-64": { - "version": "2.9.6", - "resolved": "https://registry.npmjs.org/@turbo/linux-64/-/linux-64-2.9.6.tgz", - "integrity": "sha512-YKi05jnNHaD7vevgYwahpzGwbsNNTwzU2c7VZdmdFm7+cGDP4oREUWSsainiMfRqjRuolQxBwRn8wf1jmu+YZA==", + "version": "2.9.9", + "resolved": "https://registry.npmjs.org/@turbo/linux-64/-/linux-64-2.9.9.tgz", + "integrity": "sha512-7JNLw88Isk+gMlbsC8pulLDkrqe2B827ZsKFEHilb17AC6Xn/62pzH7afjY7fEU6Ayp4XP/vGhlRWOzqBvBvIQ==", "cpu": [ "x64" ], @@ -5587,9 +5564,9 @@ ] }, "node_modules/@turbo/linux-arm64": { - "version": "2.9.6", - "resolved": "https://registry.npmjs.org/@turbo/linux-arm64/-/linux-arm64-2.9.6.tgz", - "integrity": "sha512-02o/ZS69cOYEDczXvOB2xmyrtzjQ2hVFtWZK1iqxXUfzMmTjZK4UumrfNnjckSg+gqeBfnPRHa0NstA173Ik3g==", + "version": "2.9.9", + "resolved": "https://registry.npmjs.org/@turbo/linux-arm64/-/linux-arm64-2.9.9.tgz", + "integrity": "sha512-0pnXDwPw1rHii98JZPRg7SvsjIzy7jrhkwGU9Jy5fVYoMdYd3P2vbtLfII+OJ0Mm4Ar5yykdHDTz3RWiRI1o9g==", "cpu": [ "arm64" ], @@ -5601,9 +5578,9 @@ ] }, "node_modules/@turbo/windows-64": { - "version": "2.9.6", - "resolved": "https://registry.npmjs.org/@turbo/windows-64/-/windows-64-2.9.6.tgz", - "integrity": "sha512-wVdQjvnBI15wB6JrA+43CtUtagjIMmX6XYO758oZHAsCNSxqRlJtdyujih0D8OCnwCRWiGWGI63zAxR0hO6s9g==", + "version": "2.9.9", + "resolved": "https://registry.npmjs.org/@turbo/windows-64/-/windows-64-2.9.9.tgz", + "integrity": "sha512-vjDQycz4gQVvIq4n2rPtiiIESwJlAc406qtkiZlqyL+fHZEd9SxYNlBIFYtc5cuMuwrk+sIKrhN7XvwjmvS9YQ==", "cpu": [ "x64" ], @@ -5615,9 +5592,9 @@ ] }, "node_modules/@turbo/windows-arm64": { - "version": "2.9.6", - "resolved": "https://registry.npmjs.org/@turbo/windows-arm64/-/windows-arm64-2.9.6.tgz", - "integrity": "sha512-1XUUyWW0W6FTSqGEhU8RHVqb2wP1SPkr7hIvBlMEwH9jr+sJQK5kqeosLJ/QaUv4ecSAd1ZhIrLoW7qslAzT4A==", + "version": "2.9.9", + "resolved": "https://registry.npmjs.org/@turbo/windows-arm64/-/windows-arm64-2.9.9.tgz", + "integrity": "sha512-V6NiH43oCctepbOdQFp7UjqLyK8p6Tt824QA+G4TE+B1BBHu80A0W8OCL+H7uBJ3XZjAj/hvPDw3k3l65DoDGw==", "cpu": [ "arm64" ], @@ -5629,9 +5606,9 @@ ] }, "node_modules/@tybys/wasm-util": { - "version": "0.10.1", - "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.1.tgz", - "integrity": "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==", + "version": "0.10.2", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.2.tgz", + "integrity": "sha512-RoBvJ2X0wuKlWFIjrwffGw1IqZHKQqzIchKaadZZfnNpsAYp2mM0h36JtPCjNDAHGgYez/15uMBpfGwchhiMgg==", "license": "MIT", "optional": true, "dependencies": { @@ -5893,9 +5870,9 @@ "license": "MIT" }, "node_modules/@types/qs": { - "version": "6.15.0", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.15.0.tgz", - "integrity": "sha512-JawvT8iBVWpzTrz3EGw9BTQFg3BQNmwERdKE22vlTxawwtbyUSlMppvZYKLZzB5zgACXdXxbD3m1bXaMqP/9ow==", + "version": "6.15.1", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.15.1.tgz", + "integrity": "sha512-GZHUBZR9hckSUhrxmp1nG6NwdpM9fCunJwyThLW1X3AyHgd9IlHb6VANpQQqDr2o/qQp6McZ3y/IA2rVzKzSbw==", "dev": true, "license": "MIT" }, @@ -6010,17 +5987,17 @@ "license": "MIT" }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.59.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.59.1.tgz", - "integrity": "sha512-BOziFIfE+6osHO9FoJG4zjoHUcvI7fTNBSpdAwrNH0/TLvzjsk2oo8XSSOT2HhqUyhZPfHv4UOffoJ9oEEQ7Ag==", + "version": "8.59.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.59.2.tgz", + "integrity": "sha512-j/bwmkBvHUtPNxzuWe5z6BEk3q54YRyGlBXkSsmfoih7zNrBvl5A9A98anlp/7JbyZcWIJ8KXo/3Tq/DjFLtuQ==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.12.2", - "@typescript-eslint/scope-manager": "8.59.1", - "@typescript-eslint/type-utils": "8.59.1", - "@typescript-eslint/utils": "8.59.1", - "@typescript-eslint/visitor-keys": "8.59.1", + "@typescript-eslint/scope-manager": "8.59.2", + "@typescript-eslint/type-utils": "8.59.2", + "@typescript-eslint/utils": "8.59.2", + "@typescript-eslint/visitor-keys": "8.59.2", "ignore": "^7.0.5", "natural-compare": "^1.4.0", "ts-api-utils": "^2.5.0" @@ -6033,23 +6010,23 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^8.59.1", + "@typescript-eslint/parser": "^8.59.2", "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } }, "node_modules/@typescript-eslint/parser": { - "version": "8.59.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.59.1.tgz", - "integrity": "sha512-HDQH9O/47Dxi1ceDhBXdaldtf/WV9yRYMjbjCuNk3qnaTD564qwv61Y7+gTxwxRKzSrgO5uhtw584igXVuuZkA==", + "version": "8.59.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.59.2.tgz", + "integrity": "sha512-plR3pp6D+SSUn1HM7xvSkx12/DhoHInI2YF35KAcVFNZvlC0gtrWqx7Qq1oH2Ssgi0vlFRCTbP+DZc7B9+TtsQ==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "@typescript-eslint/scope-manager": "8.59.1", - "@typescript-eslint/types": "8.59.1", - "@typescript-eslint/typescript-estree": "8.59.1", - "@typescript-eslint/visitor-keys": "8.59.1", + "@typescript-eslint/scope-manager": "8.59.2", + "@typescript-eslint/types": "8.59.2", + "@typescript-eslint/typescript-estree": "8.59.2", + "@typescript-eslint/visitor-keys": "8.59.2", "debug": "^4.4.3" }, "engines": { @@ -6065,14 +6042,14 @@ } }, "node_modules/@typescript-eslint/project-service": { - "version": "8.59.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.59.1.tgz", - "integrity": "sha512-+MuHQlHiEr00Of/IQbE/MmEoi44znZHbR/Pz7Opq4HryUOlRi+/44dro9Ycy8Fyo+/024IWtw8m4JUMCGTYxDg==", + "version": "8.59.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.59.2.tgz", + "integrity": "sha512-+2hqvEkeyf/0FBor67duF0Ll7Ot8jyKzDQOSrxazF/danillRq2DwR9dLptsXpoZQqxE1UisSmoZewrlPas9Vw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.59.1", - "@typescript-eslint/types": "^8.59.1", + "@typescript-eslint/tsconfig-utils": "^8.59.2", + "@typescript-eslint/types": "^8.59.2", "debug": "^4.4.3" }, "engines": { @@ -6087,14 +6064,14 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.59.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.59.1.tgz", - "integrity": "sha512-LwuHQI4pDOYVKvmH2dkaJo6YZCSgouVgnS/z7yBPKBMvgtBvyLqiLy9Z6b7+m/TRcX1NFYUqZetI5Y+aT4GEfg==", + "version": "8.59.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.59.2.tgz", + "integrity": "sha512-JzfyEpEtOU89CcFSwyNS3mu4MLvLSXqnmX05+aKBDM+TdR5jzcGOEBwxwGNxrEQ7p/z6kK2WyioCGBf2zZBnvg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.59.1", - "@typescript-eslint/visitor-keys": "8.59.1" + "@typescript-eslint/types": "8.59.2", + "@typescript-eslint/visitor-keys": "8.59.2" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -6105,9 +6082,9 @@ } }, "node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.59.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.59.1.tgz", - "integrity": "sha512-/0nEyPbX7gRsk0Uwfe4ALwwgxuA66d/l2mhRDNlAvaj4U3juhUtJNq0DsY8M2AYwwb9rEq2hrC3IcIcEt++iJA==", + "version": "8.59.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.59.2.tgz", + "integrity": "sha512-BKK4alN7oi4C/zv4VqHQ+uRU+lTa6JGIZ7s1juw7b3RHo9OfKB+bKX3u0iVZetdsUCBBkSbdWbarJbmN0fTeSw==", "dev": true, "license": "MIT", "engines": { @@ -6122,15 +6099,15 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "8.59.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.59.1.tgz", - "integrity": "sha512-klWPBR2ciQHS3f++ug/mVnWKPjBUo7icEL3FAO1lhAR1Z1i5NQYZ1EannMSRYcq5qCv5wNALlXr6fksRHyYl7w==", + "version": "8.59.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.59.2.tgz", + "integrity": "sha512-nhqaj1nmTdVVl/BP5omXNRGO38jn5iosis2vbdmupF2txCf8ylWT8lx+JlvMYYVqzGVKtjojUFoQ3JRWK+mfzQ==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.59.1", - "@typescript-eslint/typescript-estree": "8.59.1", - "@typescript-eslint/utils": "8.59.1", + "@typescript-eslint/types": "8.59.2", + "@typescript-eslint/typescript-estree": "8.59.2", + "@typescript-eslint/utils": "8.59.2", "debug": "^4.4.3", "ts-api-utils": "^2.5.0" }, @@ -6147,9 +6124,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "8.59.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.59.1.tgz", - "integrity": "sha512-ZDCjgccSdYPw5Bxh+my4Z0lJU96ZDN7jbBzvmEn0FZx3RtU1C7VWl6NbDx94bwY3V5YsgwRzJPOgeY2Q/nLG8A==", + "version": "8.59.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.59.2.tgz", + "integrity": "sha512-e82GVOE8Ps3E++Egvb6Y3Dw0S10u8NkQ9KXmtRhCWJJ8kDhOJTvtMAWnFL16kB1583goCWXsr0NieKCZMs2/0Q==", "dev": true, "license": "MIT", "engines": { @@ -6161,16 +6138,16 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.59.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.59.1.tgz", - "integrity": "sha512-OUd+vJS05sSkOip+BkZ/2NS8RMxrAAJemsC6vU3kmfLyeaJT0TftHkV9mcx2107MmsBVXXexhVu4F0TZXyMl4g==", + "version": "8.59.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.59.2.tgz", + "integrity": "sha512-o0XPGNwcWw+FIwStOWn+BwBuEmL6QXP0rsvAFg7ET1dey1Nr6Wb1ac8p5HEsK0ygO/6mUxlk+YWQD9xcb/nnXg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/project-service": "8.59.1", - "@typescript-eslint/tsconfig-utils": "8.59.1", - "@typescript-eslint/types": "8.59.1", - "@typescript-eslint/visitor-keys": "8.59.1", + "@typescript-eslint/project-service": "8.59.2", + "@typescript-eslint/tsconfig-utils": "8.59.2", + "@typescript-eslint/types": "8.59.2", + "@typescript-eslint/visitor-keys": "8.59.2", "debug": "^4.4.3", "minimatch": "^10.2.2", "semver": "^7.7.3", @@ -6241,16 +6218,16 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "8.59.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.59.1.tgz", - "integrity": "sha512-3pIeoXhCeYH9FSCBI8P3iNwJlGuzPlYKkTlen2O9T1DSeeg8UG8jstq6BLk+Mda0qup7mgk4z4XL4OzRaxZ8LA==", + "version": "8.59.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.59.2.tgz", + "integrity": "sha512-Juw3EinkXqjaffxz6roowvV7GZT/kET5vSKKZT6upl5TXdWkLkYmNPXwDDL2Vkt2DPn0nODIS4egC/0AGxKo/Q==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.9.1", - "@typescript-eslint/scope-manager": "8.59.1", - "@typescript-eslint/types": "8.59.1", - "@typescript-eslint/typescript-estree": "8.59.1" + "@typescript-eslint/scope-manager": "8.59.2", + "@typescript-eslint/types": "8.59.2", + "@typescript-eslint/typescript-estree": "8.59.2" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -6265,13 +6242,13 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.59.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.59.1.tgz", - "integrity": "sha512-LdDNl6C5iJExcM0Yh0PwAIBb9PrSiCsWamF/JyEZawm3kFDnRoaq3LGE4bpyRao/fWeGKKyw7icx0YxrLFC5Cg==", + "version": "8.59.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.59.2.tgz", + "integrity": "sha512-NwjLUnGy8/Zfx23fl50tRC8rYaYnM52xNRYFAXvmiil9yh1+K6aRVQMnzW6gQB/1DLgWt977lYQn7C+wtgXZiA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.59.1", + "@typescript-eslint/types": "8.59.2", "eslint-visitor-keys": "^5.0.0" }, "engines": { @@ -6349,9 +6326,9 @@ } }, "node_modules/@ungap/structured-clone": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", - "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.1.tgz", + "integrity": "sha512-mUFwbeTqrVgDQxFveS+df2yfap6iuP20NAKAsBt5jDEoOTDew+zwLAOilHCeQJOVSvmgCX4ogqIrA0mnyr08yQ==", "dev": true, "license": "ISC" }, @@ -6746,15 +6723,15 @@ } }, "node_modules/@xhmikosr/decompress-unzip": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@xhmikosr/decompress-unzip/-/decompress-unzip-8.1.0.tgz", - "integrity": "sha512-hVcpEZIS8avXU1ioR0Pb2LcBYHfah1lzzTQPDItkBi3W+kSE/DxSeEgOoHJB8rn+Izm0ArWZxxlpsvEK4ySjaw==", + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/@xhmikosr/decompress-unzip/-/decompress-unzip-8.1.1.tgz", + "integrity": "sha512-/B+Z0qJflGn5UEtmMZ2qeKeXwexOycxaibYhMOyLcRPJriXs4IkoSngVUVZXLYViu9TdHyFWynC6NB4EWBg8cg==", "dev": true, "license": "MIT", "dependencies": { - "file-type": "^21.3.0", + "file-type": "^21.3.4", "get-stream": "^9.0.1", - "yauzl": "^3.2.0" + "yauzl": "^3.3.0" }, "engines": { "node": ">=20" @@ -7264,9 +7241,9 @@ } }, "node_modules/axe-core": { - "version": "4.11.3", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.11.3.tgz", - "integrity": "sha512-zBQouZixDTbo3jMGqHKyePxYxr1e5W8UdTmBQ7sNtaA9M2bE32daxxPLS/jojhKOHxQ7LWwPjfiwf/fhaJWzlg==", + "version": "4.11.4", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.11.4.tgz", + "integrity": "sha512-KunSNx+TVpkAw/6ULfhnx+HWRecjqZGTOyquAoWHYLRSdK1tB5Ihce1ZW+UY3fj33bYAFWPu7W/GRSmmrCGuxA==", "dev": true, "license": "MPL-2.0", "engines": { @@ -7442,9 +7419,9 @@ "license": "MIT" }, "node_modules/baseline-browser-mapping": { - "version": "2.10.24", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.24.tgz", - "integrity": "sha512-I2NkZOOrj2XuguvWCK6OVh9GavsNjZjK908Rq3mIBK25+GD8vPX5w2WdxVqnQ7xx3SrZJiCiZFu+/Oz50oSYSA==", + "version": "2.10.27", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.27.tgz", + "integrity": "sha512-zEs/ufmZoUd7WftKpKyXaT6RFxpQ5Qm9xytKRHvJfxFV9DFJkZph9RvJ1LcOUi0Z1ZVijMte65JbILeV+8QQEA==", "dev": true, "license": "Apache-2.0", "bin": { @@ -7887,9 +7864,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001791", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001791.tgz", - "integrity": "sha512-yk0l/YSrOnFZk3UROpDLQD9+kC1l4meK/wed583AXrzoarMGJcbRi2Q4RaUYbKxYAsZ8sWmaSa/DsLmdBeI1vQ==", + "version": "1.0.30001792", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001792.tgz", + "integrity": "sha512-hVLMUZFgR4JJ6ACt1uEESvQN1/dBVqPAKY0hgrV70eN3391K6juAfTjKZLKvOMsx8PxA7gsY1/tLMMTcfFLLpw==", "dev": true, "funding": [ { @@ -8635,9 +8612,9 @@ } }, "node_modules/dompurify": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.4.1.tgz", - "integrity": "sha512-JahakDAIg1gyOm7dlgWSDjV4n7Ip2PKR55NIT6jrMfIgLFgWo81vdr1/QGqWtFNRqXP9UV71oVePtjqS2ebnPw==", + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.4.2.tgz", + "integrity": "sha512-lHeS9SA/IKeIFFyYciHBr2n0v1VMPlSj843HdLOwjb2OxNwdq9Xykxqhk+FE42MzAdHvInbAolSE4mhahPpjXA==", "license": "(MPL-2.0 OR Apache-2.0)", "optionalDependencies": { "@types/trusted-types": "^2.0.7" @@ -8688,9 +8665,9 @@ "license": "MIT" }, "node_modules/electron-to-chromium": { - "version": "1.5.344", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.344.tgz", - "integrity": "sha512-4MxfbmNDm+KPh066EZy+eUnkcDPcZ35wNmOWzFuh/ijvHsve6kbLTLURy88uCNK5FbpN+yk2nQY6BYh1GEt+wg==", + "version": "1.5.352", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.352.tgz", + "integrity": "sha512-9wHk8x6dyuimoe18EdiDPWKExNdxYqo4fn4FwOVVper6RxT3cmpBwBkWWfSOCYJjQdIco/nPhJhNLmn4Ufg1Yg==", "dev": true, "license": "ISC" }, @@ -9854,9 +9831,9 @@ "license": "MIT" }, "node_modules/fast-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz", - "integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.2.tgz", + "integrity": "sha512-rVjf7ArG3LTk+FS6Yw81V1DLuZl1bRbNrev6Tmd/9RaroeeRRJhAt7jg/6YFxbvAQXUCavSoZhPPj6oOx+5KjQ==", "funding": [ { "type": "github", @@ -11103,12 +11080,12 @@ } }, "node_modules/is-core-module": { - "version": "2.16.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", - "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "version": "2.16.2", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.2.tgz", + "integrity": "sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==", "license": "MIT", "dependencies": { - "hasown": "^2.0.2" + "hasown": "^2.0.3" }, "engines": { "node": ">= 0.4" @@ -14418,9 +14395,9 @@ } }, "node_modules/react-hook-form": { - "version": "7.74.0", - "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.74.0.tgz", - "integrity": "sha512-yR6wHr99p9wFv686jhRWVSFhUvDvNbdUf2dKlbno8/VKOCuoNobDGC6S+M2dua9A9Yo8vpcrp8assIYbsZCQ9g==", + "version": "7.75.0", + "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.75.0.tgz", + "integrity": "sha512-Ovv94H+0p3sJ7B9B5QxPuCP1u8V/cHuVGyH55cSwodYDtoJwK+fqk3vjfIgSX59I2U/bU4z0nRJ9HMLpNiWEmw==", "license": "MIT", "engines": { "node": ">=18.0.0" @@ -14449,9 +14426,9 @@ } }, "node_modules/react-is": { - "version": "19.2.5", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-19.2.5.tgz", - "integrity": "sha512-Dn0t8IQhCmeIT3wu+Apm1/YVsJXsGWi6k4sPdnBIdqMVtHtv0IGi6dcpNpNkNac0zB2uUAqNX3MHzN8c+z2rwQ==", + "version": "19.2.6", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-19.2.6.tgz", + "integrity": "sha512-XjBR15BhXuylgWGuslhDKqlSayuqvqBX91BP8pauG8kd1zY8kotkNWbXksTCNRarse4kuGbe2kIY05ARtwNIvw==", "license": "MIT" }, "node_modules/react-refresh": { @@ -15914,9 +15891,9 @@ } }, "node_modules/tar-stream/node_modules/b4a": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.8.0.tgz", - "integrity": "sha512-qRuSmNSkGQaHwNbM7J78Wwy+ghLEYF1zNrSeMxj4Kgw6y33O3mXcQ6Ie9fRvfU/YnxWkOchPXbaLb73TkIsfdg==", + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.8.1.tgz", + "integrity": "sha512-aiqre1Nr0B/6DgE2N5vwTc+2/oQZ4Wh1t4NznYY4E00y8LCt6NqdRv81so00oo27D8MVKTpUa/MwUUtBLXCoDw==", "dev": true, "license": "Apache-2.0", "peerDependencies": { @@ -16000,9 +15977,9 @@ } }, "node_modules/text-decoder/node_modules/b4a": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.8.0.tgz", - "integrity": "sha512-qRuSmNSkGQaHwNbM7J78Wwy+ghLEYF1zNrSeMxj4Kgw6y33O3mXcQ6Ie9fRvfU/YnxWkOchPXbaLb73TkIsfdg==", + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.8.1.tgz", + "integrity": "sha512-aiqre1Nr0B/6DgE2N5vwTc+2/oQZ4Wh1t4NznYY4E00y8LCt6NqdRv81so00oo27D8MVKTpUa/MwUUtBLXCoDw==", "dev": true, "license": "Apache-2.0", "peerDependencies": { @@ -16280,21 +16257,21 @@ } }, "node_modules/turbo": { - "version": "2.9.6", - "resolved": "https://registry.npmjs.org/turbo/-/turbo-2.9.6.tgz", - "integrity": "sha512-+v2QJey7ZUeUiuigkU+uFfklvNUyPI2VO2vBpMYJA+a1hKFLFiKtUYlRHdb3P9CrAvMzi0upbjI4WT+zKtqkBg==", + "version": "2.9.9", + "resolved": "https://registry.npmjs.org/turbo/-/turbo-2.9.9.tgz", + "integrity": "sha512-3xfzXE/yTjhh0S5dIWlE+3E+J9A09REpLI1ZqVh2+HrNZoVzZn0pkvjiRgVK/Ev3PF9XnaTwCntTx+CADWXcyA==", "dev": true, "license": "MIT", "bin": { "turbo": "bin/turbo" }, "optionalDependencies": { - "@turbo/darwin-64": "2.9.6", - "@turbo/darwin-arm64": "2.9.6", - "@turbo/linux-64": "2.9.6", - "@turbo/linux-arm64": "2.9.6", - "@turbo/windows-64": "2.9.6", - "@turbo/windows-arm64": "2.9.6" + "@turbo/darwin-64": "2.9.9", + "@turbo/darwin-arm64": "2.9.9", + "@turbo/linux-64": "2.9.9", + "@turbo/linux-arm64": "2.9.9", + "@turbo/windows-64": "2.9.9", + "@turbo/windows-arm64": "2.9.9" } }, "node_modules/type-check": { @@ -17112,9 +17089,9 @@ "license": "ISC" }, "node_modules/yaml": { - "version": "2.8.3", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.3.tgz", - "integrity": "sha512-AvbaCLOO2Otw/lW5bmh9d/WEdcDFdQp2Z2ZUH3pX9U2ihyUY0nvLv7J6TrWowklRGPYbB/IuIMfYgxaCPg5Bpg==", + "version": "2.8.4", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.4.tgz", + "integrity": "sha512-ml/JPOj9fOQK8RNnWojA67GbZ0ApXAUlN2UQclwv2eVgTgn7O9gg9o7paZWKMp4g0H3nTLtS9LVzhkpOFIKzog==", "license": "ISC", "bin": { "yaml": "bin.mjs"