> = (props) => {
| > = (props) => {
return (
| = Omit<
Result,
- | "_id"
| "bailedOut"
| "blindMode"
| "lazyMode"
@@ -38,7 +32,6 @@ export type SnapshotResult = Omit<
| "afkDuration"
| "tags"
> & {
- _id: string;
bailedOut: boolean;
blindMode: boolean;
lazyMode: boolean;
@@ -52,6 +45,10 @@ export type SnapshotResult = Omit<
incompleteTestSeconds: number;
afkDuration: number;
tags: string[];
+ //calculated values
+ words: number;
+ timeTyping: number;
+ dayTimestamp: number;
};
export type Snapshot = Omit<
@@ -75,12 +72,10 @@ export type Snapshot = Omit<
inboxUnreadSize: number;
streak: number;
maxStreak: number;
- filterPresets: ResultFilters[];
isPremium: boolean;
streakHourOffset?: number;
tags: SnapshotUserTag[];
presets: SnapshotPreset[];
- results?: SnapshotResult[];
xp: number;
testActivity?: ModifiableTestActivityCalendar;
testActivityByYear?: { [key: string]: TestActivityCalendar };
@@ -92,7 +87,6 @@ export type SnapshotPreset = Preset & {
};
const defaultSnap = {
- results: undefined,
personalBests: {
time: {},
words: {},
@@ -120,7 +114,6 @@ const defaultSnap = {
quoteMod: false,
favoriteQuotes: {},
addedAt: 0,
- filterPresets: [],
xp: 0,
inboxUnreadSize: 0,
streak: 0,
diff --git a/frontend/src/ts/controllers/chart-controller.ts b/frontend/src/ts/controllers/chart-controller.ts
index 6fc1a33d6807..ffc8835bf056 100644
--- a/frontend/src/ts/controllers/chart-controller.ts
+++ b/frontend/src/ts/controllers/chart-controller.ts
@@ -31,8 +31,6 @@ import chartAnnotation, {
type LabelOptions,
} from "chartjs-plugin-annotation";
import chartTrendline from "chartjs-plugin-trendline";
-import { get as getTypingSpeedUnit } from "../utils/typing-speed-units";
-import { getActivePage } from "../states/core";
Chart.register(
BarController,
@@ -58,16 +56,12 @@ Chart.defaults.elements.line.tension = 0.5;
Chart.defaults.elements.line.fill = "origin";
import "chartjs-adapter-date-fns";
-import { format } from "date-fns/format";
import { Config } from "../config/store";
import { configEvent } from "../events/config";
import * as TestInput from "../test/test-input";
-import * as DateTime from "../utils/date-and-time";
import * as Arrays from "../utils/arrays";
-import * as Numbers from "@monkeytype/util/numbers";
import { blendTwoHexColors } from "../utils/colors";
import { typedKeys } from "../utils/misc";
-import { qs } from "../utils/dom";
import { getTheme } from "../states/theme";
import { Theme } from "../constants/themes";
import { createDebouncedEffectOn } from "../hooks/effects";
@@ -345,765 +339,6 @@ export type ActivityChartDataPoint = {
avgCon?: number;
};
-export const accountHistory = new ChartWithUpdateColors<
- "line",
- HistoryChartData[] | AccChartData[] | OtherChartData[],
- string,
- | "wpm"
- | "pb"
- | "acc"
- | "wpmAvgTen"
- | "accAvgTen"
- | "wpmAvgHundred"
- | "accAvgHundred"
->(
- document.querySelector(
- ".pageAccount #accountHistoryChart",
- ) as HTMLCanvasElement,
- {
- type: "line",
- data: {
- datasets: [
- {
- yAxisID: "wpm",
- data: [],
- fill: false,
- borderWidth: 0,
- order: 3,
- },
- {
- yAxisID: "pb",
- data: [],
- fill: false,
- stepped: true,
- pointRadius: 0,
- pointHoverRadius: 0,
- order: 4,
- },
- {
- yAxisID: "acc",
- fill: false,
- data: [],
- pointStyle: "triangle",
- borderWidth: 0,
- pointRadius: 3.5,
- order: 3,
- },
- {
- yAxisID: "wpmAvgTen",
- data: [],
- fill: false,
- pointRadius: 0,
- pointHoverRadius: 0,
- order: 2,
- },
- {
- yAxisID: "accAvgTen",
- data: [],
- fill: false,
- pointRadius: 0,
- pointHoverRadius: 0,
- order: 2,
- },
- {
- yAxisID: "wpmAvgHundred",
- data: [],
- fill: false,
- pointRadius: 0,
- pointHoverRadius: 0,
- order: 1,
- },
- {
- yAxisID: "accAvgHundred",
- label: "accAvgHundred",
- data: [],
- fill: false,
- pointRadius: 0,
- pointHoverRadius: 0,
- order: 1,
- },
- ],
- },
- options: {
- // responsive: true,
- maintainAspectRatio: false,
- hover: {
- mode: "nearest",
- intersect: false,
- },
- scales: {
- x: {
- axis: "x",
- type: "linear",
- reverse: true,
- min: 0,
- ticks: {
- stepSize: 10,
- },
- display: false,
- grid: {
- display: false,
- },
- },
- wpm: {
- axis: "y",
- type: "linear",
- beginAtZero: true,
- min: 0,
- ticks: {
- stepSize: 10,
- },
- display: true,
- title: {
- display: true,
- text: "Words per Minute",
- },
- position: "right",
- },
- pb: {
- axis: "y",
- beginAtZero: true,
- min: 0,
- ticks: {
- stepSize: 10,
- },
- display: false,
- },
- acc: {
- axis: "y",
- beginAtZero: true,
- min: 0,
- max: 100,
- reverse: true,
- ticks: {
- stepSize: 10,
- },
- display: true,
- title: {
- display: true,
- text: "Accuracy",
- },
- grid: {
- display: false,
- },
- position: "left",
- },
- wpmAvgTen: {
- axis: "y",
- beginAtZero: true,
- min: 0,
- ticks: {
- stepSize: 10,
- },
- display: false,
- grid: {
- display: false,
- },
- },
- accAvgTen: {
- axis: "y",
- beginAtZero: true,
- min: 0,
- max: 100,
- reverse: true,
- ticks: {
- stepSize: 10,
- },
- display: false,
- grid: {
- display: false,
- },
- },
- wpmAvgHundred: {
- axis: "y",
- beginAtZero: true,
- min: 0,
- ticks: {
- stepSize: 10,
- },
- display: false,
- grid: {
- display: false,
- },
- },
- accAvgHundred: {
- axis: "y",
- beginAtZero: true,
- min: 0,
- max: 100,
- reverse: true,
- ticks: {
- stepSize: 10,
- },
- display: false,
- grid: {
- display: false,
- },
- },
- },
-
- plugins: {
- annotation: {
- annotations: [],
- },
- tooltip: {
- animation: { duration: 250 },
- // Disable the on-canvas tooltip
- enabled: true,
-
- intersect: false,
- external: function (ctx): void {
- if (ctx === undefined) return;
- ctx.tooltip.options.displayColors = false;
- },
- filter: function (tooltipItem): boolean {
- return (
- tooltipItem.datasetIndex !== 1 &&
- tooltipItem.datasetIndex !== 3 &&
- tooltipItem.datasetIndex !== 4 &&
- tooltipItem.datasetIndex !== 5 &&
- tooltipItem.datasetIndex !== 6
- );
- },
- callbacks: {
- title: function (): string {
- return "";
- },
-
- beforeLabel: function (tooltipItem): string {
- if (tooltipItem.datasetIndex !== 0) {
- const resultData = tooltipItem.dataset.data[
- tooltipItem.dataIndex
- ] as AccChartData;
- return `error rate: ${Numbers.roundTo2(
- resultData.errorRate,
- )}%\nacc: ${Numbers.roundTo2(100 - resultData.errorRate)}%`;
- }
- const resultData = tooltipItem.dataset.data[
- tooltipItem.dataIndex
- ] as HistoryChartData;
- let label =
- `${Config.typingSpeedUnit}: ${resultData.wpm}` +
- "\n" +
- `raw: ${resultData.raw}` +
- "\n" +
- `acc: ${resultData.acc}` +
- "\n\n" +
- `mode: ${resultData.mode} `;
-
- if (resultData.mode === "time") {
- label += resultData.mode2;
- } else if (resultData.mode === "words") {
- label += resultData.mode2;
- }
-
- let diff = resultData.difficulty ?? "normal";
- label += `\ndifficulty: ${diff}`;
-
- label +=
- "\n" +
- `punctuation: ${resultData.punctuation}` +
- "\n" +
- `language: ${resultData.language}` +
- `${resultData.isPb ? "\n\nnew personal best" : ""}` +
- "\n\n" +
- `date: ${format(
- new Date(resultData.timestamp),
- "dd MMM yyyy HH:mm",
- )}`;
-
- return label;
- },
- label: function (): string {
- return "";
- },
- afterLabel: function (tooltip): string {
- accountHistoryActiveIndex = tooltip.dataIndex;
- return "";
- },
- },
- },
- },
- },
- },
-);
-
-export const accountActivity = new ChartWithUpdateColors<
- "bar" | "line",
- ActivityChartDataPoint[],
- string,
- "count" | "avgWpm"
->(
- document.querySelector(
- ".pageAccount #accountActivityChart",
- ) as HTMLCanvasElement,
- {
- type: "bar",
- data: {
- labels: [],
- datasets: [
- {
- yAxisID: "count",
- label: "Seconds",
- data: [],
- trendlineLinear: {
- style: "rgba(255,105,180, .8)",
- lineStyle: "dotted",
- width: 2,
- },
- order: 3,
- },
- {
- yAxisID: "avgWpm",
- label: "Average Wpm",
- data: [],
- type: "line",
- order: 2,
- tension: 0,
- fill: false,
- },
- ],
- },
- options: {
- responsive: true,
- maintainAspectRatio: false,
- hover: {
- mode: "nearest",
- intersect: false,
- },
- scales: {
- x: {
- axis: "x",
- ticks: {
- autoSkip: true,
- autoSkipPadding: 20,
- },
- type: "time",
- time: {
- unit: "day",
- displayFormats: {
- day: "d MMM",
- },
- },
- bounds: "ticks",
- display: true,
- title: {
- display: false,
- text: "Date",
- },
- offset: true,
- },
- count: {
- axis: "y",
- beginAtZero: true,
- min: 0,
- ticks: {
- autoSkip: true,
- autoSkipPadding: 20,
- stepSize: 1,
- },
- display: true,
- title: {
- display: true,
- text: "Time typing (minutes)",
- },
- },
- avgWpm: {
- axis: "y",
- beginAtZero: true,
- min: 0,
- ticks: {
- autoSkip: true,
- autoSkipPadding: 20,
- stepSize: 10,
- },
- display: true,
- position: "right",
- title: {
- display: true,
- text: "Average Wpm",
- },
- grid: {
- display: false,
- },
- },
- },
- plugins: {
- annotation: {
- annotations: [],
- },
- tooltip: {
- animation: { duration: 250 },
- intersect: false,
- mode: "index",
- filter: (tooltipItem): boolean => {
- return tooltipItem.datasetIndex === 0;
- },
- callbacks: {
- title: function (tooltipItem): string {
- const firstItem = tooltipItem[0] as TooltipItem<"bar" | "line">;
- const resultData = firstItem.dataset.data[
- firstItem.dataIndex
- ] as ActivityChartDataPoint;
- return format(new Date(resultData.x), "dd MMM yyyy");
- },
- beforeLabel: function (tooltipItem): string {
- const resultData = tooltipItem.dataset.data[
- tooltipItem.dataIndex
- ] as ActivityChartDataPoint;
- const typingSpeedUnit = getTypingSpeedUnit(
- Config.typingSpeedUnit,
- );
- return `Time Typing: ${DateTime.secondsToString(
- Math.round(resultData.y * 60),
- true,
- true,
- )}\nTests Completed: ${
- resultData.amount
- }\nRestarts per test: ${Numbers.roundTo2(
- (resultData.restarts ?? 0) / (resultData.amount ?? 0),
- )}\nHighest ${Config.typingSpeedUnit.toUpperCase()}: ${Numbers.roundTo2(
- typingSpeedUnit.fromWpm(resultData.maxWpm ?? 0),
- )}\nAverage ${Config.typingSpeedUnit.toUpperCase()}: ${Numbers.roundTo2(
- typingSpeedUnit.fromWpm(resultData.avgWpm ?? 0),
- )}\nAverage Accuracy: ${Numbers.roundTo2(
- resultData.avgAcc ?? 0,
- )}%\nAverage Consistency: ${Numbers.roundTo2(
- resultData.avgCon ?? 0,
- )}%`;
- },
- label: function (): string {
- return "";
- },
- },
- },
- },
- },
- },
-);
-
-export const accountHistogram = new ChartWithUpdateColors<
- "bar",
- ActivityChartDataPoint[],
- string,
- "count"
->(
- document.querySelector(
- ".pageAccount #accountHistogramChart",
- ) as HTMLCanvasElement,
- {
- type: "bar",
- data: {
- labels: [],
- datasets: [
- {
- yAxisID: "count",
- label: "Tests",
- data: [],
- },
- ],
- },
- options: {
- responsive: true,
- maintainAspectRatio: false,
- hover: {
- mode: "nearest",
- intersect: false,
- },
- scales: {
- x: {
- axis: "x",
- // ticks: {
- // autoSkip: true,
- // autoSkipPadding: 20,
- // },
- bounds: "ticks",
- display: true,
- title: {
- display: false,
- text: "Bucket",
- },
- offset: true,
- },
- count: {
- axis: "y",
- beginAtZero: true,
- min: 0,
- ticks: {
- autoSkip: true,
- autoSkipPadding: 20,
- stepSize: 10,
- },
- display: true,
- title: {
- display: true,
- text: "Tests",
- },
- },
- },
- plugins: {
- annotation: {
- annotations: [],
- },
- tooltip: {
- animation: { duration: 250 },
- intersect: false,
- mode: "index",
- // callbacks: {
- // title: function (tooltipItem): string {
- // const resultData = tooltipItem[0].dataset.data[
- // tooltipItem[0].dataIndex
- // ] as MonkeyTypes.ActivityChartDataPoint;
- // return format(new Date(resultData.x), "dd MMM yyyy");
- // },
- // beforeLabel: function (tooltipItem): string {
- // const resultData = tooltipItem.dataset.data[
- // tooltipItem.dataIndex
- // ] as MonkeyTypes.ActivityChartDataPoint;
- // switch (tooltipItem.datasetIndex) {
- // case 0:
- // return `Time Typing: ${DateTime.secondsToString(
- // Math.round(resultData.y),
- // true,
- // true
- // )}\nTests Completed: ${resultData.amount}`;
- // case 1:
- // return `Average ${
- // Config.typingSpeedUnit
- // }: ${Numbers.roundTo2(resultData.y)}`;
- // default:
- // return "";
- // }
- // },
- // label: function (): string {
- // return "";
- // },
- // },
- },
- },
- },
- },
-);
-
-export const miniResult = new ChartWithUpdateColors<
- "line" | "scatter",
- number[],
- string,
- "wpm" | "burst" | "error"
->(document.querySelector("#miniResultChartModal canvas") as HTMLCanvasElement, {
- type: "line",
- data: {
- labels: [],
- datasets: [
- {
- label: "wpm",
- data: [],
- borderColor: "rgba(125, 125, 125, 1)",
- borderWidth: 3,
- yAxisID: "wpm",
- order: 2,
- pointRadius: 1,
- },
- {
- label: "burst",
- data: [],
- borderColor: "rgba(125, 125, 125, 1)",
- borderWidth: 3,
- yAxisID: "burst",
- order: 3,
- pointRadius: 1,
- },
- {
- label: "errors",
- data: [],
- borderColor: "rgba(255, 125, 125, 1)",
- pointBackgroundColor: "rgba(255, 125, 125, 1)",
- borderWidth: 2,
- order: 1,
- yAxisID: "error",
- type: "scatter",
- pointStyle: "crossRot",
- pointRadius: function (context): number {
- const index = context.dataIndex;
- const value = context.dataset.data[index] as number;
- return (value ?? 0) <= 0 ? 0 : 3;
- },
- pointHoverRadius: function (context): number {
- const index = context.dataIndex;
- const value = context.dataset.data[index] as number;
- return (value ?? 0) <= 0 ? 0 : 5;
- },
- },
- ],
- },
- options: {
- responsive: true,
- maintainAspectRatio: false,
- scales: {
- x: {
- axis: "x",
- ticks: {
- autoSkip: true,
- autoSkipPadding: 20,
- },
- display: true,
- title: {
- display: false,
- text: "Seconds",
- },
- },
- wpm: {
- axis: "y",
- display: true,
- title: {
- display: true,
- text: "Words per Minute",
- },
- beginAtZero: true,
- min: 0,
- ticks: {
- autoSkip: true,
- autoSkipPadding: 20,
- },
- grid: {
- display: true,
- },
- },
- burst: {
- axis: "y",
- display: false,
- title: {
- display: true,
- text: "Burst Words per Minute",
- },
- beginAtZero: true,
- min: 0,
- ticks: {
- autoSkip: true,
- autoSkipPadding: 20,
- },
- grid: {
- display: false,
- },
- },
- error: {
- display: true,
- position: "right",
- title: {
- display: true,
- text: "Errors",
- },
- beginAtZero: true,
- ticks: {
- precision: 0,
- autoSkip: true,
- autoSkipPadding: 20,
- },
- grid: {
- display: false,
- },
- },
- },
- plugins: {
- annotation: {
- annotations: [],
- },
- tooltip: {
- animation: { duration: 250 },
- mode: "index",
- intersect: false,
- },
- },
- },
-});
-
-type ButtonBelowChart =
- | ".toggleResultsOnChart"
- | ".toggleAccuracyOnChart"
- | ".toggleAverage10OnChart"
- | ".toggleAverage100OnChart";
-
-export function updateAccountChartButtons(): void {
- updateResults();
- updateAccuracy();
- updateAverage10();
- updateAverage100();
-}
-
-function updateAccountChartButton(
- isActive: boolean,
- className: ButtonBelowChart,
-): void {
- isActive
- ? qs(`.pageAccount ${className}`)?.addClass("active")
- : qs(`.pageAccount ${className}`)?.removeClass("active");
-}
-
-function updateResults(): void {
- const resultsOn = Config.accountChart[0] === "on";
- updateAccountChartButton(resultsOn, ".toggleResultsOnChart");
-
- accountHistory.getDataset("wpm").hidden = !resultsOn;
- accountHistory.getDataset("pb").hidden = !resultsOn;
- accountHistory.getDataset("wpmAvgTen").hidden = !resultsOn;
- accountHistory.getDataset("wpmAvgHundred").hidden = !resultsOn;
- accountHistory.getScale("wpm").display = resultsOn;
-}
-
-function updateAccuracy(): void {
- const resultsOn = Config.accountChart[0] === "on";
- const accOn = Config.accountChart[1] === "on";
- updateAccountChartButton(accOn, ".toggleAccuracyOnChart");
-
- accountHistory.getDataset("acc").hidden = !accOn;
- accountHistory.getDataset("accAvgTen").hidden = !accOn;
- accountHistory.getDataset("accAvgHundred").hidden = !accOn;
- accountHistory.getScale("acc").display = accOn;
-
- if (resultsOn) {
- accountHistory.getScale("acc").min = 0;
- accountHistory.getScale("accAvgTen").min = 0;
- accountHistory.getScale("accAvgHundred").min = 0;
- } else {
- const minAccRoundedTo10 =
- Math.floor(
- Math.min(...accountHistory.getDataset("acc").data.map((x) => x.y)) / 5,
- ) * 5;
-
- accountHistory.getScale("acc").min = minAccRoundedTo10;
- accountHistory.getScale("accAvgTen").min = minAccRoundedTo10;
- accountHistory.getScale("accAvgHundred").min = minAccRoundedTo10;
- }
-}
-
-function updateAverage10(): void {
- const resultsOn = Config.accountChart[0] === "on";
- const accOn = Config.accountChart[1] === "on";
- const avg10On = Config.accountChart[2] === "on";
- updateAccountChartButton(avg10On, ".toggleAverage10OnChart");
-
- if (accOn) {
- accountHistory.getDataset("accAvgTen").hidden = !avg10On;
- }
- if (resultsOn) {
- accountHistory.getDataset("wpmAvgTen").hidden = !avg10On;
- }
-}
-
-function updateAverage100(): void {
- const resultsOn = Config.accountChart[0] === "on";
- const accOn = Config.accountChart[1] === "on";
- const avg100On = Config.accountChart[3] === "on";
- updateAccountChartButton(avg100On, ".toggleAverage100OnChart");
-
- if (accOn) {
- accountHistory.getDataset("accAvgHundred").hidden = !avg100On;
- }
- if (resultsOn) {
- accountHistory.getDataset("wpmAvgHundred").hidden = !avg100On;
- }
-}
-
async function updateColors<
TType extends ChartType = "bar" | "line" | "scatter",
TData =
@@ -1163,35 +398,6 @@ async function updateColors<
return;
}
- if (chart.id === miniResult.id) {
- const c = chart as unknown as typeof miniResult;
-
- const wpm = c.getDataset("wpm");
- wpm.backgroundColor = "transparent";
- wpm.borderColor = colors.main;
- wpm.pointBackgroundColor = colors.main;
- wpm.pointBorderColor = colors.main;
-
- const error = c.getDataset("error");
- error.backgroundColor = colors.error;
- error.borderColor = colors.error;
- error.pointBackgroundColor = colors.error;
- error.pointBorderColor = colors.error;
-
- const burst = c.getDataset("burst");
- burst.backgroundColor = blendTwoHexColors(
- colors.subAlt,
- colors.subAlt + "00",
- 0.75,
- );
- burst.borderColor = colors.sub;
- burst.pointBackgroundColor = colors.sub;
- burst.pointBorderColor = colors.sub;
-
- chart.update("resize");
- return;
- }
-
//@ts-expect-error it's too difficult to figure out these types, but this works
chart.data.datasets[0].borderColor = (ctx): string => {
// oxlint-disable-next-line no-unsafe-member-access
@@ -1348,16 +554,8 @@ function setDefaultFontFamily(font: string): void {
createDebouncedEffectOn(125, getTheme, (theme) => {
void result.updateColors(theme);
- void accountHistory.updateColors(theme);
- void accountHistogram.updateColors(theme);
- void accountActivity.updateColors(theme);
- void miniResult.updateColors(theme);
});
configEvent.subscribe(({ key, newValue }) => {
- if (key === "accountChart" && getActivePage() === "account") {
- updateAccountChartButtons();
- accountHistory.update();
- }
if (key === "fontFamily") setDefaultFontFamily(newValue);
});
diff --git a/frontend/src/ts/controllers/page-controller.ts b/frontend/src/ts/controllers/page-controller.ts
index b777f0eec1f3..28838342074e 100644
--- a/frontend/src/ts/controllers/page-controller.ts
+++ b/frontend/src/ts/controllers/page-controller.ts
@@ -6,7 +6,6 @@ import {
setSelectedProfileName,
} from "../states/core";
import * as Settings from "../pages/settings";
-import * as Account from "../pages/account";
import * as PageTest from "../pages/test";
import * as PageLoading from "../pages/loading";
import * as Friends from "../pages/friends";
@@ -30,6 +29,9 @@ import {
readGetParameters,
} from "../states/leaderboard-selection";
import { configurationPromise as serverConfigurationPromise } from "../ape/server-configuration";
+import { getSnapshot } from "../db";
+import { resultsCollection } from "../collections/results";
+import * as TodayTracker from "../test/today-tracker";
type ChangeOptions = {
force?: boolean;
@@ -43,7 +45,34 @@ const pages = {
test: PageTest.page,
settings: Settings.page,
about: solidPage("about"),
- account: Account.page,
+ account: solidPage("account", {
+ loadingOptions: {
+ loadingMode: () => {
+ if (resultsCollection.isReady()) {
+ return "none";
+ } else {
+ return "sync";
+ }
+ },
+ loadingPromise: async () => {
+ if (getSnapshot() === null) {
+ throw new Error(
+ "Looks like your account data didn't download correctly. Please refresh the page. If this error persists, please contact support.",
+ );
+ }
+ await resultsCollection.stateWhenReady();
+ TodayTracker.addAllFromToday();
+ },
+ style: "bar",
+ keyframes: [
+ {
+ percentage: 90,
+ durationMs: 2000,
+ text: "Downloading results...",
+ },
+ ],
+ },
+ }),
login: solidPage("login"),
profile: solidPage("profile", {
beforeShow: async (options) => {
diff --git a/frontend/src/ts/db.ts b/frontend/src/ts/db.ts
index 43623d33b19f..44e71363e5c0 100644
--- a/frontend/src/ts/db.ts
+++ b/frontend/src/ts/db.ts
@@ -4,7 +4,6 @@ import {
showErrorNotification,
} from "./states/notifications";
import { isAuthenticated, getAuthenticatedUser } from "./firebase";
-import { lastElementFromArray } from "./utils/arrays";
import * as Dates from "date-fns";
import {
TestActivityCalendar,
@@ -34,6 +33,11 @@ import {
get as getServerConfiguration,
} from "./ape/server-configuration";
import { Connection } from "@monkeytype/schemas/connections";
+import {
+ findFastestResultByTagId,
+ insertLocalResult,
+} from "./collections/results";
+import { resultFilterPresetsCollection } from "./collections/result-filter-presets";
import {
setLastResult,
setSnapshot as setSolidSnapshot,
@@ -174,7 +178,6 @@ export async function initSnapshot(): Promise {
snap.inboxUnreadSize = userData.inboxUnreadSize ?? 0;
snap.streak = userData?.streak?.length ?? 0;
snap.maxStreak = userData?.streak?.maxLength ?? 0;
- snap.filterPresets = userData.resultFilterPresets ?? [];
snap.isPremium = userData?.isPremium ?? false;
snap.allTimeLbs = userData.allTimeLbs;
@@ -254,6 +257,16 @@ export async function initSnapshot(): Promise {
snap.connections = convertConnections(connectionsData);
+ if (userData.resultFilterPresets !== undefined) {
+ void resultFilterPresetsCollection.stateWhenReady().then(() => {
+ resultFilterPresetsCollection.utils.writeBatch(() => {
+ (userData.resultFilterPresets ?? []).forEach((it) =>
+ resultFilterPresetsCollection.utils.writeInsert(it),
+ );
+ });
+ });
+ }
+
dbSnapshot = snap;
return dbSnapshot;
@@ -265,66 +278,6 @@ export async function initSnapshot(): Promise {
}
}
-export async function getUserResults(offset?: number): Promise {
- if (!isAuthenticated()) return false;
-
- if (!dbSnapshot) return false;
- if (
- dbSnapshot.results !== undefined &&
- (offset === undefined || dbSnapshot.results.length > offset)
- ) {
- return false;
- }
-
- const response = await Ape.results.get({ query: { offset } });
-
- if (response.status !== 200) {
- showErrorNotification("Error getting results", { response });
- return false;
- }
-
- //another check in case user logs out while waiting for response
- if (!isAuthenticated()) return false;
-
- const results: SnapshotResult[] = response.body.data.map((result) => {
- result.bailedOut ??= false;
- result.blindMode ??= false;
- result.lazyMode ??= false;
- result.difficulty ??= "normal";
- result.funbox ??= [];
- result.language ??= "english";
- result.numbers ??= false;
- result.punctuation ??= false;
- result.numbers ??= false;
- result.quoteLength ??= -1;
- result.restartCount ??= 0;
- result.incompleteTestSeconds ??= 0;
- result.afkDuration ??= 0;
- result.tags ??= [];
- return result as SnapshotResult;
- });
- results?.sort((a, b) => b.timestamp - a.timestamp);
-
- if (dbSnapshot.results !== undefined && dbSnapshot.results.length > 0) {
- //merge
- const oldestTimestamp = lastElementFromArray(dbSnapshot.results)
- ?.timestamp as number;
- const resultsWithoutDuplicates = results.filter(
- (it) => it.timestamp < oldestTimestamp,
- );
- dbSnapshot.results.push(...resultsWithoutDuplicates);
- } else {
- dbSnapshot.results = results;
- }
-
- setLastResult(results[0]);
- return true;
-}
-
-function _getCustomThemeById(themeID: string): CustomTheme | undefined {
- return dbSnapshot?.customThemes?.find((t) => t._id === themeID);
-}
-
export async function addCustomTheme(
theme: Omit,
): Promise {
@@ -413,156 +366,6 @@ export async function deleteCustomTheme(themeId: string): Promise {
return true;
}
-export async function getUserAverage10(
- mode: M,
- mode2: Mode2,
- punctuation: boolean,
- numbers: boolean,
- language: string,
- difficulty: Difficulty,
- lazyMode: boolean,
-): Promise<[number, number]> {
- const snapshot = getSnapshot();
-
- if (!snapshot) return [0, 0];
-
- function cont(): [number, number] {
- const activeTagIds: string[] = [];
- snapshot?.tags?.forEach((tag) => {
- if (tag.active === true) {
- activeTagIds.push(tag._id);
- }
- });
-
- let wpmSum = 0;
- let accSum = 0;
- let last10Wpm = 0;
- let last10Acc = 0;
- let count = 0;
- let last10Count = 0;
-
- if (snapshot?.results !== undefined) {
- for (const result of snapshot.results) {
- if (
- result.mode === mode &&
- (result.punctuation ?? false) === punctuation &&
- (result.numbers ?? false) === numbers &&
- result.language === language &&
- result.difficulty === difficulty &&
- (result.lazyMode === lazyMode ||
- (result.lazyMode === undefined && !lazyMode)) &&
- (activeTagIds.length === 0 ||
- activeTagIds.some((tagId) => result.tags?.includes(tagId)))
- ) {
- // Continue if the mode2 doesn't match and it's not a quote
- if (
- `${result.mode2}` !== `${mode2 as string | number}` &&
- mode !== "quote"
- ) {
- //using template strings because legacy results might use numbers in mode2
- continue;
- }
-
- // Grab the most recent results from the current mode
- if (last10Count < 10) {
- last10Wpm += result.wpm;
- last10Acc += result.acc;
- last10Count++;
- }
-
- // Check if the mode2 matches and if it does, add it to the sum, for quotes, this is the quote id
- if (`${result.mode2}` === `${mode2 as string | number}`) {
- //using template strings because legacy results might use numbers in mode2
- wpmSum += result.wpm;
- accSum += result.acc;
- count++;
-
- if (count >= 10) break;
- }
- }
- }
- }
-
- // Return the last 10 average wpm & acc for quote
- // if the current quote id has never been completed before by the user
- if (count === 0 && mode === "quote") {
- return [last10Wpm / last10Count, last10Acc / last10Count];
- }
-
- return [wpmSum / count, accSum / count];
- }
-
- const retval: [number, number] =
- snapshot === null || (await getUserResults()) === null ? [0, 0] : cont();
-
- return retval;
-}
-
-export async function getUserDailyBest(
- mode: M,
- mode2: Mode2,
- punctuation: boolean,
- numbers: boolean,
- language: string,
- difficulty: Difficulty,
- lazyMode: boolean,
-): Promise {
- const snapshot = getSnapshot();
-
- if (!snapshot) return 0;
-
- function cont(): number {
- const activeTagIds: string[] = [];
- snapshot?.tags?.forEach((tag) => {
- if (tag.active === true) {
- activeTagIds.push(tag._id);
- }
- });
-
- let bestWpm = 0;
-
- if (snapshot?.results !== undefined) {
- for (const result of snapshot.results) {
- if (
- result.mode === mode &&
- (result.punctuation ?? false) === punctuation &&
- (result.numbers ?? false) === numbers &&
- result.language === language &&
- result.difficulty === difficulty &&
- (result.lazyMode === lazyMode ||
- (result.lazyMode === undefined && !lazyMode)) &&
- (activeTagIds.length === 0 ||
- activeTagIds.some((tagId) => result.tags?.includes(tagId)))
- ) {
- if (result.timestamp < Date.now() - 86400000) {
- continue;
- }
-
- // Continue if the mode2 doesn't match and it's not a quote
- if (
- `${result.mode2}` !== `${mode2 as string | number}` &&
- mode !== "quote"
- ) {
- //using template strings because legacy results might use numbers in mode2
- continue;
- }
-
- if (result.wpm > bestWpm) {
- bestWpm = result.wpm;
- }
- }
- }
- }
-
- return bestWpm;
- }
-
- const retval: number =
- snapshot === null || (await getUserResults()) === null ? 0 : cont();
-
- return retval;
-}
-
export async function getActiveTagsPB(
mode: M,
mode2: Mode2,
@@ -855,20 +658,10 @@ export async function saveLocalTagPB(
return;
}
-
-export function deleteLocalTag(tagId: string): void {
- getSnapshot()?.results?.forEach((result) => {
- const tagIndex = result.tags.indexOf(tagId);
- if (tagIndex > -1) {
- result.tags.splice(tagIndex, 1);
- }
- });
-}
-
-export async function updateLocalTagPB(
+export async function updateLocalTagPB(
tagId: string,
- mode: M,
- mode2: Mode2,
+ mode: Mode,
+ mode2: Mode2,
punctuation: boolean,
numbers: boolean,
language: Language,
@@ -881,32 +674,24 @@ export async function updateLocalTagPB(
if (filteredtag === undefined) return;
+ const fastest = await findFastestResultByTagId({
+ tagId,
+ mode,
+ mode2,
+ punctuation,
+ numbers,
+ language,
+ difficulty,
+ lazyMode,
+ });
+
const pb = {
- wpm: 0,
- acc: 0,
- rawWpm: 0,
- consistency: 0,
+ wpm: fastest?.wpm ?? 0,
+ acc: fastest?.acc ?? 0,
+ rawWpm: fastest?.rawWpm ?? 0,
+ consistency: fastest?.consistency ?? 0,
};
- getSnapshot()?.results?.forEach((result) => {
- if (result.tags.includes(tagId) && result.wpm > pb.wpm) {
- if (
- result.mode === mode &&
- result.mode2 === mode2 &&
- result.punctuation === punctuation &&
- result.numbers === numbers &&
- result.language === language &&
- result.difficulty === difficulty &&
- result.lazyMode === lazyMode
- ) {
- pb.wpm = result.wpm;
- pb.acc = result.acc;
- pb.rawWpm = result.rawWpm;
- pb.consistency = result.consistency;
- }
- }
- });
-
await saveLocalTagPB(
tagId,
mode,
@@ -972,9 +757,7 @@ export function saveLocalResult(data: SaveLocalResultData): void {
if (!snapshot) return;
if (data.result !== undefined) {
- if (snapshot?.results !== undefined) {
- snapshot.results.unshift(data.result);
- }
+ void insertLocalResult(data.result);
setLastResult(data.result);
if (snapshot.testActivity !== undefined) {
snapshot.testActivity.increment(new Date(data.result.timestamp));
@@ -1216,3 +999,16 @@ export function isFriend(uid: string | undefined): boolean {
// cont();
// }
// }
+
+export function updateTagById(
+ tagId: string,
+ update: (old: SnapshotUserTag) => SnapshotUserTag,
+): void {
+ if (dbSnapshot === undefined) return;
+
+ dbSnapshot.tags = dbSnapshot?.tags.map((it) => {
+ if (it._id !== tagId) return it;
+ return update(it);
+ });
+ setSnapshot(dbSnapshot);
+}
diff --git a/frontend/src/ts/elements/account/result-filters.ts b/frontend/src/ts/elements/account/result-filters.ts
deleted file mode 100644
index cc1a78ea7065..000000000000
--- a/frontend/src/ts/elements/account/result-filters.ts
+++ /dev/null
@@ -1,970 +0,0 @@
-import * as Misc from "../../utils/misc";
-import * as Strings from "../../utils/strings";
-import * as DB from "../../db";
-import { Config } from "../../config/store";
-import {
- showNoticeNotification,
- showErrorNotification,
- showSuccessNotification,
-} from "../../states/notifications";
-import Ape from "../../ape/index";
-import { showLoaderBar, hideLoaderBar } from "../../states/loader-bar";
-import SlimSelect from "slim-select";
-import { QuoteLength } from "@monkeytype/schemas/configs";
-import {
- ResultFilters,
- ResultFiltersSchema,
- ResultFiltersGroup,
- ResultFiltersGroupItem,
-} from "@monkeytype/schemas/users";
-import { LocalStorageWithSchema } from "../../utils/local-storage-with-schema";
-import defaultResultFilters from "../../constants/default-result-filters";
-import { getAllFunboxes } from "@monkeytype/funbox";
-import { Snapshot } from "../../constants/default-snapshot";
-import { LanguageList } from "../../constants/languages";
-import { authEvent } from "../../events/auth";
-import { sanitize } from "../../utils/sanitize";
-import { qs, qsa } from "../../utils/dom";
-
-export function mergeWithDefaultFilters(
- filters: Partial,
-): ResultFilters {
- try {
- const merged = {} as ResultFilters;
- for (const groupKey of Misc.typedKeys(defaultResultFilters)) {
- if (groupKey === "_id") {
- let id = filters[groupKey] ?? defaultResultFilters[groupKey];
- if (id === "default-result-filters-id" || id === "") {
- id = "default";
- }
- merged[groupKey] = id;
- } else if (groupKey === "name") {
- merged[groupKey] = filters[groupKey] ?? defaultResultFilters[groupKey];
- } else {
- // @ts-expect-error i cant figure this out
- merged[groupKey] = {
- ...defaultResultFilters[groupKey],
- ...filters[groupKey],
- };
- }
- }
- return merged;
- } catch (e) {
- return defaultResultFilters;
- }
-}
-
-const resultFiltersLS = new LocalStorageWithSchema({
- key: "resultFilters",
- schema: ResultFiltersSchema,
- fallback: defaultResultFilters,
- migrate: (unknown, _issues) => {
- if (!Misc.isObject(unknown)) {
- return defaultResultFilters;
- }
- return mergeWithDefaultFilters(
- sanitize(ResultFiltersSchema.partial().strip(), unknown as ResultFilters),
- );
- },
-});
-
-type Option = {
- id: string;
- value: string;
- text: string;
- html: string;
- selected: boolean;
- display: boolean;
- disabled: boolean;
- placeholder: boolean;
- class: string;
- style: string;
- data: {
- [key: string]: string;
- };
- mandatory: boolean;
-};
-
-const groupsUsingSelect = new Set(["language", "funbox", "tags"]);
-const groupSelects: Partial> = {};
-
-// current activated filter
-let filters = defaultResultFilters;
-
-function save(): void {
- resultFiltersLS.set(filters);
-}
-
-export async function load(): Promise {
- try {
- filters = mergeWithDefaultFilters(resultFiltersLS.get());
-
- const newTags: Record = { none: false };
- Object.keys(defaultResultFilters.tags).forEach((tag) => {
- if (filters.tags[tag] !== undefined) {
- newTags[tag] = filters.tags[tag];
- } else {
- newTags[tag] = true;
- }
- });
-
- filters.tags = newTags;
- save();
- } catch {
- console.log("error in loading result filters");
- filters = defaultResultFilters;
- save();
- }
-}
-
-async function updateFilterPresets(): Promise {
- const parent = document.querySelector(".pageAccount .presetFilterButtons");
- const buttons = document.querySelector(
- ".pageAccount .presetFilterButtons .filterBtns",
- );
-
- if (!parent || !buttons) return;
-
- buttons.innerHTML = "";
-
- const filterPresets = DB.getSnapshot()?.filterPresets ?? [];
-
- if (filterPresets.length > 0) {
- let html = "";
-
- for (const filter of filterPresets) {
- html += `
- ${filter.name.replace(/_/g, " ")}
-
-
-
- `;
- }
-
- buttons.innerHTML = html;
- parent.classList.remove("hidden");
- } else {
- parent.classList.add("hidden");
- }
-}
-
-// sets the current filter to be a user custom filter
-export async function setFilterPreset(id: string): Promise {
- const filter = DB.getSnapshot()?.filterPresets.find(
- (filter) => filter._id === id,
- );
- if (filter) {
- // deep copy filter
- filters = verifyResultFiltersStructure(filter);
-
- save();
- updateActive();
- }
-
- // make all filter preset butons inactive
- qsa(
- `.pageAccount .group.presetFilterButtons .filterBtns .filterPresets .select-filter-preset`,
- ).removeClass("active");
-
- // make current filter presest button active
- qsa(
- `.pageAccount .group.presetFilterButtons .filterBtns .filterPresets .select-filter-preset[data-id="${id}"]`,
- ).addClass("active");
-}
-
-function addFilterPresetToSnapshot(filter: ResultFilters): void {
- const snapshot = DB.getSnapshot();
- if (!snapshot) return;
- DB.setSnapshot({
- ...snapshot,
- filterPresets: [...snapshot.filterPresets, structuredClone(filter)],
- });
-}
-
-// callback function called by popup once user inputs name
-export async function createFilterPreset(
- name: string,
-): Promise {
- name = name.replace(/ /g, "_");
- showLoaderBar();
- const result = await Ape.users.addResultFilterPreset({
- body: { ...filters, name },
- });
- hideLoaderBar();
- if (result.status === 200) {
- addFilterPresetToSnapshot({ ...filters, name, _id: result.body.data });
- void updateFilterPresets();
- return 1;
- } else {
- console.log("error creating filter preset: " + result.body.message);
- return 0;
- }
-}
-
-function removeFilterPresetFromSnapshot(id: string): void {
- const snapshot = DB.getSnapshot();
- if (!snapshot) return;
- const filterPresets = [...snapshot.filterPresets];
- const toDeleteIx = filterPresets.findIndex((filter) => filter._id === id);
-
- if (toDeleteIx > -1) {
- filterPresets.splice(toDeleteIx, 1);
- }
- DB.setSnapshot({ ...snapshot, filterPresets });
-}
-
-// deletes the currently selected filter preset
-async function deleteFilterPreset(id: string): Promise {
- showLoaderBar();
- const result = await Ape.users.removeResultFilterPreset({
- params: { presetId: id },
- });
- hideLoaderBar();
- if (result.status === 200) {
- removeFilterPresetFromSnapshot(id);
- void updateFilterPresets();
- reset();
- showSuccessNotification("Filter preset deleted");
- } else {
- showErrorNotification(
- "Error deleting filter preset: " + result.body.message,
- );
- console.log("error deleting filter preset", result.body.message);
- }
-}
-
-function deSelectFilterPreset(): void {
- // make all filter preset buttons inactive
- qsa(
- ".pageAccount .group.presetFilterButtons .filterBtns .filterPresets .select-filter-preset",
- ).removeClass("active");
-}
-
-function getFilters(): ResultFilters {
- return filters;
-}
-
-function getGroup(group: G): ResultFilters[G] {
- return filters[group];
-}
-
-// export function setFilter(group, filter, value) {
-// filters[group][filter] = value;
-// }
-
-export function getFilter(
- group: G,
- filter: ResultFiltersGroupItem,
-): ResultFilters[G][ResultFiltersGroupItem] {
- return filters[group][filter];
-}
-
-function setFilter(
- group: G,
- filter: ResultFiltersGroupItem,
- value: boolean,
-): void {
- filters[group][filter] = value as (typeof filters)[G][typeof filter];
-}
-
-function setAllFilters(group: ResultFiltersGroup, value: boolean): void {
- Object.keys(getGroup(group)).forEach((filter) => {
- filters[group][filter as keyof (typeof filters)[typeof group]] =
- value as never;
- });
-}
-
-export function loadTags(): void {
- const snapshot = DB.getSnapshot();
-
- if (snapshot === undefined) return;
-
- snapshot.tags.forEach((tag) => {
- defaultResultFilters.tags[tag._id] = true;
- });
-}
-
-export function reset(): void {
- filters = defaultResultFilters;
- save();
-}
-
-type AboveChartDisplay = Partial<
- Record
->;
-
-export function updateActive(): void {
- const aboveChartDisplay: AboveChartDisplay = {};
-
- for (const group of Misc.typedKeys(getFilters())) {
- // id and name field do not correspond to any ui elements, no need to update
- if (group === "_id" || group === "name") {
- continue;
- }
-
- aboveChartDisplay[group] = {
- all: true,
- array: [],
- };
-
- for (const filter of Misc.typedKeys(getGroup(group))) {
- const groupAboveChartDisplay = aboveChartDisplay[group];
-
- if (groupAboveChartDisplay === undefined) continue;
-
- const filterValue = getFilter(
- group,
- filter as ResultFiltersGroupItem,
- );
- if (filterValue === true) {
- groupAboveChartDisplay.array?.push(filter);
- } else {
- if (groupAboveChartDisplay.all !== undefined) {
- groupAboveChartDisplay.all = false;
- }
- }
-
- if (groupsUsingSelect.has(group)) {
- const option = qs(
- `.pageAccount .group.filterButtons .filterGroup[group="${group}"] option[value="${filter}"]`,
- );
- if (filterValue === true) {
- option?.setSelected(true);
- } else {
- option?.setSelected(false);
- }
- } else {
- let buttonEl;
- if (group === "date") {
- buttonEl = qs(
- `.pageAccount .group.topFilters .filterGroup[group="${group}"] button[filter="${filter}"]`,
- );
- } else {
- buttonEl = qs(
- `.pageAccount .group.filterButtons .filterGroup[group="${group}"] button[filter="${filter}"]`,
- );
- }
- if (filterValue === true) {
- buttonEl?.addClass("active");
- } else {
- buttonEl?.removeClass("active");
- }
- }
- }
- }
-
- for (const [id, select] of Object.entries(groupSelects)) {
- const ss = select;
- const group = getGroup(id as ResultFiltersGroup);
- const everythingSelected = Object.values(group).every((v) => v === true);
-
- const newData = ss.store.getData();
-
- const allOption = qs(
- `.pageAccount .group.filterButtons .filterGroup[group="${id}"] option[value="all"]`,
- );
-
- if (everythingSelected) {
- allOption?.setSelected(true);
- for (const data of newData) {
- if ("value" in data) {
- if (data.value === "all") data.selected = true;
- else data.selected = false;
- }
- }
- ss.store.setData(newData);
- ss.render.renderValues();
- } else {
- allOption?.setSelected(false);
- }
-
- for (const data of newData) {
- if ("value" in data) {
- if (group[data.value as keyof typeof group] === true) {
- data.selected = true;
- } else {
- if (!everythingSelected || data.value !== "all") {
- data.selected = false;
- }
- }
- }
- }
-
- setTimeout(() => {
- ss.store.setData(newData);
- if (!everythingSelected) {
- ss.render.renderValues();
- }
- ss.render.renderOptions(newData);
- }, 0);
- }
-
- function addText(group: ResultFiltersGroup): string {
- let ret = "";
- ret += "";
- if (group === "difficulty") {
- ret += ``;
- } else if (group === "mode") {
- ret += ``;
- } else if (group === "punctuation") {
- ret += ``;
- } else if (group === "numbers") {
- ret += ``;
- } else if (group === "words") {
- ret += ``;
- } else if (group === "time") {
- ret += ``;
- } else if (group === "date") {
- ret += ``;
- } else if (group === "tags") {
- ret += ``;
- } else if (group === "language") {
- ret += ``;
- } else if (group === "funbox") {
- ret += ``;
- }
- if (aboveChartDisplay[group]?.all) {
- ret += "all";
- } else {
- if (group === "tags") {
- ret += aboveChartDisplay.tags?.array
- ?.map((id) => {
- if (id === "none") return id;
- const snapshot = DB.getSnapshot();
- if (snapshot === undefined) return id;
- const name = snapshot.tags?.find((t) => t._id === id);
- if (name !== undefined) {
- return snapshot.tags?.find((t) => t._id === id)?.display;
- }
- return name;
- })
- .join(", ");
- } else {
- ret += aboveChartDisplay[group]?.array?.join(", ").replace(/_/g, " ");
- }
- }
- ret += " ";
- return ret;
- }
-
- let chartString = "";
-
- //date
- chartString += addText("date");
- chartString += ``;
-
- //mode
- chartString += addText("mode");
- chartString += ``;
-
- //time
- if (aboveChartDisplay.mode?.array?.includes("time")) {
- chartString += addText("time");
- chartString += ``;
- }
-
- //words
- if (aboveChartDisplay.mode?.array?.includes("words")) {
- chartString += addText("words");
- chartString += ``;
- }
-
- //diff
- chartString += addText("difficulty");
- chartString += ``;
-
- //punc
- chartString += addText("punctuation");
- chartString += ``;
-
- //numbers
- chartString += addText("numbers");
- chartString += ``;
-
- //language
- chartString += addText("language");
- chartString += ``;
-
- //funbox
- chartString += addText("funbox");
- chartString += ``;
-
- //tags
- chartString += addText("tags");
-
- qs(".pageAccount .group.chart .above")?.setHtml(chartString);
-}
-
-function toggle(
- group: G,
- filter: ResultFiltersGroupItem,
-): void {
- // user is changing the filters -> current filter is no longer a filter preset
- deSelectFilterPreset();
-
- try {
- if (group === "date") {
- setAllFilters("date", false);
- }
- const currentValue = filters[group][filter] as unknown as boolean;
- const newValue = !currentValue;
- filters[group][filter] =
- newValue as ResultFilters[G][ResultFiltersGroupItem];
- save();
- } catch (e) {
- showNoticeNotification(
- "Something went wrong toggling filter. Reverting to defaults.",
- );
- console.log("toggling filter error");
- console.error(e);
- reset();
- updateActive();
- }
-}
-
-for (const el of qsa(`
- .pageAccount .filterButtons .buttonsAndTitle .buttons,
- .pageAccount .group.topFilters .buttonsAndTitle.testDate .buttons
- `)) {
- el.onChild("click", "button", (e) => {
- const childTarget = e.childTarget as HTMLElement;
-
- if (childTarget.classList.contains("allFilters")) {
- Misc.typedKeys(getFilters()).forEach((group) => {
- // id and name field do not correspond to any ui elements, no need to update
- if (group === "_id" || group === "name") {
- return;
- }
-
- setAllFilters(group, true);
- });
- setAllFilters("date", false);
- filters.date.all = true;
- } else if (childTarget.classList.contains("noFilters")) {
- Misc.typedKeys(getFilters()).forEach((group) => {
- // id and name field do not correspond to any ui elements, no need to update
- if (group === "_id" || group === "name") {
- return;
- }
-
- if (group !== "date") {
- setAllFilters(group, false);
- }
- });
- } else {
- const group = (e.target as HTMLElement).parentElement?.getAttribute(
- "group",
- ) as ResultFiltersGroup | null;
- if (group === null) {
- throw new Error("Cannot find group of target.");
- }
-
- const filter = childTarget.getAttribute(
- "filter",
- ) as ResultFiltersGroupItem | null;
- if (filter === null) {
- throw new Error("Cannot find filter of target.");
- }
-
- if ((e.target as HTMLElement).tagName === "BUTTON") {
- if (e.shiftKey) {
- setAllFilters(group, false);
- filters[group][filter] =
- true as ResultFilters[typeof group][typeof filter];
- } else {
- toggle(group, filter);
- // filters[group][filter] = !filters[group][filter];
- }
- }
- }
- updateActive();
- save();
- });
-}
-
-qs(".pageAccount .topFilters button.allFilters")?.on("click", () => {
- // user is changing the filters -> current filter is no longer a filter preset
- deSelectFilterPreset();
-
- console.log(getFilters());
-
- Misc.typedKeys(getFilters()).forEach((group) => {
- // id and name field do not correspond to any ui elements, no need to update
- if (group === "_id" || group === "name") {
- return;
- }
-
- setAllFilters(group, true);
- });
- setAllFilters("date", false);
- filters.date.all = true;
- updateActive();
- save();
-});
-
-qs(".pageAccount .topFilters button.currentConfigFilter")?.on("click", () => {
- // user is changing the filters -> current filter is no longer a filter preset
- deSelectFilterPreset();
-
- Misc.typedKeys(getFilters()).forEach((group) => {
- // id and name field do not correspond to any ui elements, no need to update
- if (group === "_id" || group === "name") {
- return;
- }
-
- setAllFilters(group, false);
- });
-
- filters.pb.no = true;
- filters.pb.yes = true;
-
- filters.difficulty[Config.difficulty] = true;
- filters.mode[Config.mode] = true;
- if (Config.mode === "time") {
- if ([15, 30, 60, 120].includes(Config.time)) {
- const configTime = `${Config.time}` as keyof typeof filters.time;
- filters.time[configTime] = true;
- } else {
- filters.time.custom = true;
- }
- } else if (Config.mode === "words") {
- if ([10, 25, 50, 100, 200].includes(Config.words)) {
- const configWords = `${Config.words}` as keyof typeof filters.words;
- filters.words[configWords] = true;
- } else {
- filters.words.custom = true;
- }
- } else if (Config.mode === "quote") {
- const filterName: ResultFiltersGroupItem<"quoteLength">[] = [
- "short",
- "medium",
- "long",
- "thicc",
- ];
- filterName.forEach((ql, index) => {
- if (Config.quoteLength.includes(index as QuoteLength)) {
- filters.quoteLength[ql] = true;
- } else {
- filters.quoteLength[ql] = false;
- }
- });
- }
- if (Config.punctuation) {
- filters.punctuation.on = true;
- } else {
- filters.punctuation.off = true;
- }
- if (Config.numbers) {
- filters.numbers.on = true;
- } else {
- filters.numbers.off = true;
- }
- if (Config.mode === "quote" && /english.*/.test(Config.language)) {
- filters.language["english"] = true;
- } else {
- filters.language[Config.language] = true;
- }
-
- if (Config.funbox.length === 0) {
- filters.funbox["none"] = true;
- } else {
- for (const f of Config.funbox) {
- filters.funbox[f] = true;
- }
- }
-
- filters.tags["none"] = true;
-
- DB.getSnapshot()?.tags?.forEach((tag) => {
- if (tag.active === true) {
- filters.tags["none"] = false;
- filters.tags[tag._id] = true;
- }
- });
-
- filters.date.all = true;
- updateActive();
- save();
-});
-
-qs(".pageAccount .topFilters button.toggleAdvancedFilters")?.on("click", () => {
- const buttons = qs(".pageAccount .filterButtons");
- const advancedFiltersButton = qs(
- ".pageAccount .topFilters button.toggleAdvancedFilters",
- );
-
- if (buttons?.isVisible()) {
- void buttons.slideUp(250);
- advancedFiltersButton?.removeClass("active");
- } else {
- void buttons?.slideDown(250);
- advancedFiltersButton?.addClass("active");
- }
-});
-
-function adjustScrollposition(
- group: ResultFiltersGroup,
- topItem: number = 0,
-): void {
- const slimSelect = groupSelects[group];
- if (slimSelect === undefined) return;
- const listElement = slimSelect.render.content.list;
- const topListItem = listElement.children.item(topItem) as HTMLElement;
-
- listElement.scrollTop = topListItem.offsetTop - listElement.offsetTop;
-}
-
-function selectBeforeChangeFn(
- group: ResultFiltersGroup,
- selectedOptions: Option[],
- oldSelectedOptions: Option[],
-): boolean {
- const includesAllNow = selectedOptions.some(
- (option) => option.value === "all",
- );
- const includedAllBefore = oldSelectedOptions.some(
- (option) => option.value === "all",
- );
-
- if (includesAllNow) {
- if (!includedAllBefore) {
- // all option was selected
- selectedOptions = selectedOptions.filter(
- (option) => option.value === "all",
- );
- } else if (selectedOptions.length < oldSelectedOptions.length) {
- // options other than all were deselcted
- selectedOptions = selectedOptions.filter(
- (option) => option.value !== "all",
- );
- }
- } else {
- if (includedAllBefore) {
- // all option was deselected
- selectedOptions = [];
- }
- }
-
- setAllFilters(group, false);
- for (const selectedOption of selectedOptions) {
- if (selectedOption.value === "all") {
- setAllFilters(group, true);
- break;
- }
-
- setFilter(
- group,
- selectedOption.value as ResultFiltersGroupItem,
- true,
- );
- }
-
- updateActive();
- save();
- selectChangeCallbackFn();
- return false;
-}
-
-let selectChangeCallbackFn: () => void = () => {
- //
-};
-
-export function updateTagsDropdownOptions(): void {
- const snapshot = DB.getSnapshot();
-
- if (snapshot === undefined) {
- return;
- }
-
- const newTags = snapshot.tags.filter(
- (it) => defaultResultFilters.tags[it._id] === undefined,
- );
- if (newTags.length > 0) {
- const everythingSelected = Object.values(filters.tags).every((v) => v);
-
- defaultResultFilters.tags = {
- ...defaultResultFilters.tags,
- ...Object.fromEntries(newTags.map((tag) => [tag._id, true])),
- };
-
- filters.tags = {
- ...filters.tags,
- ...Object.fromEntries(
- newTags.map((tag) => [tag._id, everythingSelected]),
- ),
- };
- }
-
- const el = document.querySelector(
- ".pageAccount .content .filterButtons .buttonsAndTitle.tags .select select",
- );
-
- if (!(el instanceof HTMLElement)) return;
-
- let html = "";
-
- html += "";
- html += "";
-
- for (const tag of snapshot.tags) {
- html += ``;
- }
-
- el.innerHTML = html;
-}
-
-let buttonsAppended = false;
-
-export async function appendDropdowns(
- selectChangeCallback: () => void,
-): Promise {
- //snapshot at this point is guaranteed to exist
- const snapshot = DB.getSnapshot() as Snapshot;
-
- tagDropdownUpdate(snapshot);
-
- if (buttonsAppended) return;
-
- selectChangeCallbackFn = selectChangeCallback;
-
- groupSelects["language"] = new SlimSelect({
- select:
- ".pageAccount .content .filterButtons .buttonsAndTitle.languages .select .languageSelect",
- data: [
- { value: "all", text: "all" },
- ...LanguageList.map((language) => ({
- value: language,
- text: Strings.getLanguageDisplayString(language),
- filter: language,
- })),
- ],
- settings: {
- showSearch: true,
- placeholderText: "select a language",
- allowDeselect: true,
- closeOnSelect: false,
- },
- events: {
- beforeChange: (selectedOptions, oldSelectedOptions): boolean => {
- return selectBeforeChangeFn(
- "language",
- selectedOptions,
- oldSelectedOptions,
- );
- },
- beforeOpen: (): void => {
- adjustScrollposition("language");
- },
- },
- });
-
- groupSelects["funbox"] = new SlimSelect({
- select:
- ".pageAccount .content .filterButtons .buttonsAndTitle.funbox .select .funboxSelect",
- data: [
- { value: "all", text: "all" },
- { value: "none", text: "no funbox" },
- ...getAllFunboxes().map((funbox) => ({
- value: funbox.name,
- text: funbox.name.replace(/_/g, " "),
- filter: funbox.name,
- })),
- ],
- settings: {
- showSearch: true,
- placeholderText: "select a funbox",
- allowDeselect: true,
- closeOnSelect: false,
- },
- events: {
- beforeChange: (selectedOptions, oldSelectedOptions): boolean => {
- return selectBeforeChangeFn(
- "funbox",
- selectedOptions,
- oldSelectedOptions,
- );
- },
- beforeOpen: (): void => {
- adjustScrollposition("funbox");
- },
- },
- });
-
- void updateFilterPresets();
- buttonsAppended = true;
-}
-
-function tagDropdownUpdate(snapshot: Snapshot): void {
- const tagsSection = qs(
- ".pageAccount .content .filterButtons .buttonsAndTitle.tags",
- );
-
- if (snapshot.tags.length === 0) {
- tagsSection?.hide();
- if (groupSelects["tags"]) {
- groupSelects["tags"].destroy();
- delete groupSelects["tags"];
- }
- setFilter("tags", "none", true);
- } else {
- tagsSection?.show();
-
- updateTagsDropdownOptions();
-
- // Only create SlimSelect if it doesn't exist yet
- if (!groupSelects["tags"]) {
- const selectEl = document.querySelector(
- ".pageAccount .content .filterButtons .buttonsAndTitle.tags .select .tagsSelect",
- );
-
- if (selectEl) {
- groupSelects["tags"] = new SlimSelect({
- select: selectEl,
- settings: {
- showSearch: true,
- placeholderText: "select a tag",
- allowDeselect: true,
- closeOnSelect: false,
- },
- events: {
- beforeChange: (selectedOptions, oldSelectedOptions): boolean => {
- return selectBeforeChangeFn(
- "tags",
- selectedOptions,
- oldSelectedOptions,
- );
- },
- beforeOpen: (): void => {
- adjustScrollposition("tags");
- },
- },
- });
- }
- }
- }
-}
-
-for (const el of qsa(".group.presetFilterButtons .filterBtns")) {
- el.onChild("click", ".filterPresets .delete-filter-preset", (e) => {
- void deleteFilterPreset(
- (e.childTarget as HTMLElement).dataset["id"] as string,
- );
- });
-}
-
-function verifyResultFiltersStructure(filterIn: ResultFilters): ResultFilters {
- const filter = mergeWithDefaultFilters(
- sanitize(ResultFiltersSchema.partial().strip(), structuredClone(filterIn)),
- );
-
- return filter;
-}
-
-authEvent.subscribe((event) => {
- if (event.type === "snapshotUpdated" && event.data.isInitial) {
- loadTags();
- void load();
- }
-});
diff --git a/frontend/src/ts/elements/last-10-average.ts b/frontend/src/ts/elements/last-10-average.ts
index df296a69afdd..d5460dadf8da 100644
--- a/frontend/src/ts/elements/last-10-average.ts
+++ b/frontend/src/ts/elements/last-10-average.ts
@@ -1,8 +1,8 @@
-import * as DB from "../db";
import * as Misc from "../utils/misc";
import * as Numbers from "@monkeytype/util/numbers";
import { Config } from "../config/store";
import * as TestWords from "../test/test-words";
+import { getUserAverage } from "../collections/results";
let averageWPM = 0;
let averageAcc = 0;
@@ -10,17 +10,13 @@ let averageAcc = 0;
export async function update(): Promise {
const mode2 = Misc.getMode2(Config, TestWords.currentQuote);
- const [wpm, acc] = (
- await DB.getUserAverage10(
- Config.mode,
- mode2 as never,
- Config.punctuation,
- Config.numbers,
- Config.language,
- Config.difficulty,
- Config.lazyMode,
- )
- ).map(Numbers.roundTo2) as [number, number];
+ const average = await getUserAverage({
+ ...Config,
+ mode2,
+ last10Only: true,
+ });
+ const wpm = Numbers.roundTo2(average.wpm);
+ const acc = Numbers.roundTo2(average.acc);
averageWPM = Config.alwaysShowDecimalPlaces ? wpm : Math.round(wpm);
averageAcc = Config.alwaysShowDecimalPlaces ? acc : Math.floor(acc);
diff --git a/frontend/src/ts/elements/result-batches.ts b/frontend/src/ts/elements/result-batches.ts
index 9f7395d70695..2af9d3691874 100644
--- a/frontend/src/ts/elements/result-batches.ts
+++ b/frontend/src/ts/elements/result-batches.ts
@@ -5,6 +5,7 @@ import { mapRange } from "@monkeytype/util/numbers";
import { getTheme } from "../states/theme";
import { qs } from "../utils/dom";
+//TODO
export function hide(): void {
qs(".pageAccount .resultBatches")?.hide();
}
@@ -14,7 +15,8 @@ export function show(): void {
}
export async function update(): Promise {
- const results = DB.getSnapshot()?.results;
+ //TODO fix or delete?
+ const results: string[] | undefined = [];
if (results === undefined) {
console.error(
diff --git a/frontend/src/ts/elements/simple-modal.ts b/frontend/src/ts/elements/simple-modal.ts
index 620afd3ec5d2..552b174d9dca 100644
--- a/frontend/src/ts/elements/simple-modal.ts
+++ b/frontend/src/ts/elements/simple-modal.ts
@@ -143,6 +143,7 @@ export class SimpleModal {
hideCallsExec: boolean;
showLabels: boolean;
afterClickAway: (() => void) | undefined;
+ context?: unknown;
constructor(options: SimpleModalOptions) {
this.parameters = [];
this.id = options.id;
@@ -416,9 +417,13 @@ export class SimpleModal {
simpleModalEl.qsa(".checkbox").removeClass("disabled");
}
- show(parameters: string[] = [], showOptions: ShowOptions): void {
+ show(
+ parameters: string[] = [],
+ showOptions: ShowOptions & { context?: unknown },
+ ): void {
activePopup = this;
this.parameters = parameters;
+ this.context = showOptions.context;
void modal.show({
focusFirstInput: true,
...showOptions,
diff --git a/frontend/src/ts/event-handlers/account.ts b/frontend/src/ts/event-handlers/account.ts
deleted file mode 100644
index dacb31b25aae..000000000000
--- a/frontend/src/ts/event-handlers/account.ts
+++ /dev/null
@@ -1,60 +0,0 @@
-import * as PbTablesModal from "../modals/pb-tables";
-import * as EditProfileModal from "../modals/edit-profile";
-import { getSnapshot } from "../db";
-import { isAuthenticated } from "../firebase";
-import {
- showNoticeNotification,
- showErrorNotification,
-} from "../states/notifications";
-import * as EditResultTagsModal from "../modals/edit-result-tags";
-import * as AddFilterPresetModal from "../modals/new-filter-preset";
-import { parseWithSchema as parseJsonWithSchema } from "@monkeytype/util/json";
-import { z } from "zod";
-import { qs } from "../utils/dom";
-
-const accountPage = qs("#pageAccount");
-
-accountPage?.onChild("click", ".pbsTime .showAllButton", () => {
- PbTablesModal.show("time");
-});
-
-accountPage?.onChild("click", ".pbsWords .showAllButton", () => {
- PbTablesModal.show("words");
-});
-
-accountPage?.onChild("click", ".editProfileButton", () => {
- if (!isAuthenticated()) {
- showNoticeNotification("You must be logged in to edit your profile");
- return;
- }
- const snapshot = getSnapshot();
- if (!snapshot) {
- showErrorNotification(
- "Failed to open edit profile modal: No user snapshot found",
- );
- return;
- }
- if (snapshot.banned === true) {
- showNoticeNotification("Banned users cannot edit their profile");
- return;
- }
- EditProfileModal.show();
-});
-
-const TagsArraySchema = z.array(z.string());
-
-accountPage?.onChild("click", ".group.history .resultEditTagsButton", (e) => {
- const targetButton = e.childTarget as HTMLElement;
- const resultid = targetButton?.getAttribute("data-result-id");
- const tags = targetButton?.getAttribute("data-tags");
-
- EditResultTagsModal.show(
- resultid ?? "",
- parseJsonWithSchema(tags ?? "[]", TagsArraySchema),
- "accountPage",
- );
-});
-
-accountPage?.qs("button.createFilterPresetBtn")?.on("click", () => {
- AddFilterPresetModal.show();
-});
diff --git a/frontend/src/ts/firebase.ts b/frontend/src/ts/firebase.ts
index 3a45a7244ec2..ea424ab1c05b 100644
--- a/frontend/src/ts/firebase.ts
+++ b/frontend/src/ts/firebase.ts
@@ -33,7 +33,7 @@ import {
import { tryCatch } from "@monkeytype/util/trycatch";
import { googleSignUpEvent } from "./events/google-sign-up";
import { addBanner } from "./states/banners";
-import { setUserId } from "./states/core";
+import { setUserId, setUserVerified } from "./states/core";
let app: FirebaseApp | undefined;
let Auth: AuthType | undefined;
@@ -71,6 +71,7 @@ export async function init(callback: ReadyCallback): Promise {
if (!ignoreAuthCallback) {
await callback(true, user);
setUserId(user?.uid ?? null);
+ setUserVerified(user?.emailVerified ?? false);
}
});
} catch (e) {
@@ -79,6 +80,7 @@ export async function init(callback: ReadyCallback): Promise {
console.error("Firebase failed to initialize", e);
await callback(false, null);
setUserId(null);
+ setUserVerified(false);
if (isDevEnvironment()) {
addBanner({
level: "notice",
diff --git a/frontend/src/ts/hooks/useLocalStorageStore.ts b/frontend/src/ts/hooks/useLocalStorageStore.ts
index 36b1d3704236..109ebf08cd7b 100644
--- a/frontend/src/ts/hooks/useLocalStorageStore.ts
+++ b/frontend/src/ts/hooks/useLocalStorageStore.ts
@@ -7,6 +7,7 @@ export type UseLocalStorageStoreOptions = {
schema: LocalStorageWithSchema["schema"];
fallback: LocalStorageWithSchema["fallback"];
migrate?: LocalStorageWithSchema["migrate"];
+ afterParse?: LocalStorageWithSchema["afterParse"];
/**
* Whether to sync changes across tabs/windows using storage events.
* @default true
@@ -32,7 +33,14 @@ export type UseLocalStorageStoreOptions = {
export function useLocalStorageStore(
options: UseLocalStorageStoreOptions,
): [T, SetStoreFunction] {
- const { key, schema, fallback, migrate, syncAcrossTabs = true } = options;
+ const {
+ key,
+ schema,
+ fallback,
+ migrate,
+ afterParse,
+ syncAcrossTabs = true,
+ } = options;
// Create the underlying localStorage manager
const storage = new LocalStorageWithSchema({
@@ -40,6 +48,7 @@ export function useLocalStorageStore(
schema,
fallback,
migrate,
+ afterParse,
});
// Create store with initial value from storage
diff --git a/frontend/src/ts/index.ts b/frontend/src/ts/index.ts
index 7cc56fdd05f4..745671d4b460 100644
--- a/frontend/src/ts/index.ts
+++ b/frontend/src/ts/index.ts
@@ -2,13 +2,12 @@
import "./dev/signal-tracker";
//enable solidjs-devtools
-import "solid-devtools";
+//import "solid-devtools";
import "./event-handlers/global";
import "./event-handlers/keymap";
import "./event-handlers/test";
import "./event-handlers/settings";
-import "./event-handlers/account";
import "./modals/google-sign-up";
import { init } from "./firebase";
@@ -29,7 +28,6 @@ import "./modals/simple-modals";
import * as CookiesModal from "./modals/cookies";
import "./input/listeners";
import "./controllers/route-controller";
-import * as Account from "./pages/account";
import "./elements/no-css";
import { egVideoListener } from "./popups/video-ad-popup";
import "./legacy-states/connection";
@@ -91,7 +89,6 @@ void init(onAuthStateChanged).then(() => {
addToGlobal({
snapshot: DB.getSnapshot,
config: Config,
- toggleFilterDebug: Account.toggleFilterDebug,
glarsesMode: enable,
stats: TestStats.getStats,
replay: Replay.getReplayExport,
diff --git a/frontend/src/ts/modals/edit-result-tags.ts b/frontend/src/ts/modals/edit-result-tags.ts
index 2a844bb4b43d..a00b5d6af62c 100644
--- a/frontend/src/ts/modals/edit-result-tags.ts
+++ b/frontend/src/ts/modals/edit-result-tags.ts
@@ -6,10 +6,10 @@ import {
showErrorNotification,
showSuccessNotification,
} from "../states/notifications";
-import * as AccountPage from "../pages/account";
import { areUnsortedArraysEqual } from "../utils/arrays";
import * as TestResult from "../test/result";
import AnimatedModal from "../utils/animated-modal";
+import { resultsCollection } from "../collections/results";
type State = {
resultId: string;
@@ -126,30 +126,28 @@ async function save(): Promise {
showSuccessNotification("Tags updated", { durationMs: 2000 });
- DB.getSnapshot()?.results?.forEach((result) => {
- if (result._id === state.resultId) {
- const tagsToUpdate = [
- ...result.tags.filter((tag) => !state.tags.includes(tag)),
- ...state.tags.filter((tag) => !result.tags.includes(tag)),
- ];
- result.tags = state.tags;
- tagsToUpdate.forEach((tag) => {
- void DB.updateLocalTagPB(
- tag,
- result.mode,
- result.mode2,
- result.punctuation,
- result.numbers,
- result.language,
- result.difficulty,
- result.lazyMode,
- );
- });
- }
+ resultsCollection.update(state.resultId, (result) => {
+ const tagsToUpdate = [
+ ...result.tags.filter((tag) => !state.tags.includes(tag)),
+ ...state.tags.filter((tag) => !result.tags.includes(tag)),
+ ];
+ result.tags = state.tags;
+ tagsToUpdate.forEach((tag) => {
+ void DB.updateLocalTagPB(
+ tag,
+ result.mode,
+ result.mode2,
+ result.punctuation,
+ result.numbers,
+ result.language,
+ result.difficulty,
+ result.lazyMode,
+ );
+ });
});
if (state.source === "accountPage") {
- AccountPage.updateTagsForResult(state.resultId, state.tags);
+ //TODO AccountPage.updateTagsForResult(state.resultId, state.tags);
} else if (state.source === "resultPage") {
TestResult.updateTagsAfterEdit(state.tags, responseTagPbs);
}
diff --git a/frontend/src/ts/modals/edit-tag.ts b/frontend/src/ts/modals/edit-tag.ts
index 41bda4879a13..e595a463b292 100644
--- a/frontend/src/ts/modals/edit-tag.ts
+++ b/frontend/src/ts/modals/edit-tag.ts
@@ -4,12 +4,8 @@ import * as Settings from "../pages/settings";
import AnimatedModal, { ShowOptions } from "../utils/animated-modal";
import { SimpleModal, TextInput } from "../elements/simple-modal";
import { TagNameSchema } from "@monkeytype/schemas/users";
-import { SnapshotUserTag } from "../constants/default-snapshot";
import { IsValidResponse } from "../types/validation";
-
-function getTagFromSnapshot(tagId: string): SnapshotUserTag | undefined {
- return DB.getSnapshot()?.tags.find((tag) => tag._id === tagId);
-}
+import { deleteLocalTag } from "../collections/results";
const cleanTagName = (tagName: string): string => tagName.replaceAll(" ", "_");
const tagNameValidation = async (tagName: string): Promise => {
@@ -45,7 +41,8 @@ const actionModals: Record = {
};
}
- DB.getSnapshot()?.tags?.push({
+ const snap = DB.getSnapshot();
+ snap?.tags?.push({
display: propTagName,
name: response.body.data.name,
_id: response.body.data._id,
@@ -57,6 +54,8 @@ const actionModals: Record = {
custom: {},
},
});
+ DB.setSnapshot(snap);
+
void Settings.update();
return { status: "success", message: `Tag added` };
@@ -92,12 +91,11 @@ const actionModals: Record = {
};
}
- const matchingTag = getTagFromSnapshot(tagId);
-
- if (matchingTag !== undefined) {
- matchingTag.name = tagName;
- matchingTag.display = propTagName;
- }
+ DB.updateTagById(tagId, (it) => ({
+ ...it,
+ name: tagName,
+ display: propTagName,
+ }));
void Settings.update();
@@ -128,7 +126,7 @@ const actionModals: Record = {
snapshot.tags = snapshot.tags.filter((it) => it._id !== tagId);
}
- DB.deleteLocalTag(tagId);
+ deleteLocalTag(tagId);
void Settings.update();
@@ -156,17 +154,16 @@ const actionModals: Record = {
};
}
- const matchingTag = getTagFromSnapshot(tagId);
-
- if (matchingTag !== undefined) {
- matchingTag.personalBests = {
+ DB.updateTagById(tagId, (it) => ({
+ ...it,
+ personalBests: {
time: {},
words: {},
quote: {},
zen: {},
custom: {},
- };
- }
+ },
+ }));
void Settings.update();
return { status: "success", message: `Tag PB cleared` };
diff --git a/frontend/src/ts/modals/mini-result-chart.ts b/frontend/src/ts/modals/mini-result-chart.ts
deleted file mode 100644
index e30925d79b62..000000000000
--- a/frontend/src/ts/modals/mini-result-chart.ts
+++ /dev/null
@@ -1,49 +0,0 @@
-import { ChartData } from "@monkeytype/schemas/results";
-import AnimatedModal from "../utils/animated-modal";
-import * as ChartController from "../controllers/chart-controller";
-import { Config } from "../config/store";
-function updateData(data: ChartData): void {
- // let data = filteredResults[filteredId].chartData;
- let labels = [];
- for (let i = 1; i <= data.wpm.length; i++) {
- labels.push(i.toString());
- }
-
- //make sure data.wpm and data.err are the same length as data.burst using slice
- data.wpm = data.wpm.slice(0, data.burst.length);
- data.err = data.err.slice(0, data.burst.length);
- labels = labels.slice(0, data.burst.length);
-
- ChartController.miniResult.data.labels = labels;
-
- ChartController.miniResult.getDataset("wpm").data = data.wpm;
- ChartController.miniResult.getDataset("burst").data = data.burst;
- ChartController.miniResult.getDataset("error").data = data.err;
-
- const maxChartVal = Math.max(
- ...[Math.max(...data.wpm), Math.max(...data.burst)],
- );
- const minChartVal = Math.min(
- ...[Math.min(...data.wpm), Math.min(...data.burst)],
- );
-
- ChartController.miniResult.getScale("wpm").max = Math.round(maxChartVal);
- ChartController.miniResult.getScale("burst").max = Math.round(maxChartVal);
-
- if (!Config.startGraphsAtZero) {
- ChartController.miniResult.getScale("wpm").min = Math.round(minChartVal);
- ChartController.miniResult.getScale("burst").min = Math.round(minChartVal);
- } else {
- ChartController.miniResult.getScale("wpm").min = 0;
- ChartController.miniResult.getScale("burst").min = 0;
- }
-}
-
-export function show(data: ChartData): void {
- updateData(data);
- void modal.show();
-}
-
-const modal = new AnimatedModal({
- dialogId: "miniResultChartModal",
-});
diff --git a/frontend/src/ts/modals/new-filter-preset.ts b/frontend/src/ts/modals/new-filter-preset.ts
deleted file mode 100644
index 3cd94d5b6e23..000000000000
--- a/frontend/src/ts/modals/new-filter-preset.ts
+++ /dev/null
@@ -1,34 +0,0 @@
-import { ResultFiltersSchema } from "@monkeytype/schemas/users";
-import { createFilterPreset } from "../elements/account/result-filters";
-import { SimpleModal } from "../elements/simple-modal";
-
-export function show(): void {
- newFilterPresetModal.show(undefined, {});
-}
-
-const newFilterPresetModal = new SimpleModal({
- id: "newFilterPresetModal",
- title: "New Filter Preset",
- inputs: [
- {
- placeholder: "Preset Name",
- type: "text",
- initVal: "",
- validation: {
- schema: ResultFiltersSchema.shape.name,
- },
- },
- ],
- buttonText: "add",
- execFn: async (_thisPopup, name) => {
- const status = await createFilterPreset(name);
-
- if (status === 1) {
- return { status: "success", message: "Filter preset created" };
- } else {
- let status: "error" | "notice" | "success" = "error";
- let message: string = "Error creating filter preset";
- return { status, message, alwaysHide: true };
- }
- },
-});
diff --git a/frontend/src/ts/pages/account.ts b/frontend/src/ts/pages/account.ts
deleted file mode 100644
index 9232daddee18..000000000000
--- a/frontend/src/ts/pages/account.ts
+++ /dev/null
@@ -1,1246 +0,0 @@
-import * as DB from "../db";
-import * as ResultFilters from "../elements/account/result-filters";
-import * as ChartController from "../controllers/chart-controller";
-
-import { Config } from "../config/store";
-import { setConfig } from "../config/setters";
-import * as MiniResultChartModal from "../modals/mini-result-chart";
-import * as Focus from "../test/focus";
-import * as TodayTracker from "../test/today-tracker";
-import {
- showNoticeNotification,
- showErrorNotification,
-} from "../states/notifications";
-import Page from "./page";
-import * as DateTime from "../utils/date-and-time";
-import * as Misc from "../utils/misc";
-import * as Arrays from "../utils/arrays";
-import * as Numbers from "@monkeytype/util/numbers";
-import { get as getTypingSpeedUnit } from "../utils/typing-speed-units";
-import { format } from "date-fns/format";
-import * as Skeleton from "../utils/skeleton";
-import type { ScaleChartOptions, LinearScaleOptions } from "chart.js";
-import { configEvent } from "../events/config";
-import { getActivePage } from "../states/core";
-import { getAuthenticatedUser } from "../firebase";
-
-import { showLoaderBar, hideLoaderBar } from "../states/loader-bar";
-import * as ResultBatches from "../elements/result-batches";
-import Format from "../singletons/format";
-import { ChartData } from "@monkeytype/schemas/results";
-import { Mode, Mode2, Mode2Custom } from "@monkeytype/schemas/shared";
-import { ResultFiltersGroupItem } from "@monkeytype/schemas/users";
-import { findLineByLeastSquares } from "../utils/numbers";
-import defaultResultFilters from "../constants/default-result-filters";
-import { SnapshotResult } from "../constants/default-snapshot";
-import Ape from "../ape";
-import { AccountChart } from "@monkeytype/schemas/configs";
-import { SortedTableWithLimit } from "../utils/sorted-table";
-import { qs, qsa, qsr, ElementWithUtils, onDOMReady } from "../utils/dom";
-import { sendVerificationEmail } from "../auth";
-
-let filterDebug = false;
-//toggle filterdebug
-export function toggleFilterDebug(): void {
- filterDebug = !filterDebug;
- if (filterDebug) {
- console.log("filterDebug is on");
- }
-}
-
-let filteredResults: SnapshotResult[] = [];
-let visibleTableLines = 0;
-let historyTable: SortedTableWithLimit>;
-
-function loadMoreLines(lineIndex?: number): void {
- if (filteredResults === undefined || filteredResults.length === 0) return;
- let newVisibleLines;
- if (Numbers.isSafeNumber(lineIndex) && lineIndex > visibleTableLines) {
- newVisibleLines = Math.ceil(lineIndex / 10) * 10;
- } else {
- newVisibleLines = visibleTableLines + 10;
- }
-
- visibleTableLines = newVisibleLines;
- if (visibleTableLines >= filteredResults.length) {
- qs(".pageAccount .loadMoreButton")?.hide();
- } else {
- qs(".pageAccount .loadMoreButton")?.show();
- }
-
- historyTable.setLimit(newVisibleLines);
- historyTable.updateBody();
-}
-
-function buildResultRow(result: SnapshotResult): HTMLTableRowElement {
- let diff = result.difficulty ?? "normal";
-
- let icons = ``;
-
- if (diff === "normal") {
- icons += ``;
- } else if (diff === "expert") {
- icons += ``;
- } else if (diff === "master") {
- icons += ``;
- }
-
- if (result.punctuation) {
- icons += ``;
- }
-
- if (result.numbers) {
- icons += ``;
- }
-
- if (result.blindMode) {
- icons += ``;
- }
-
- if (result.lazyMode) {
- icons += ``;
- }
-
- if (result.funbox !== undefined && result.funbox.length > 0) {
- icons += ``;
- }
-
- if (result.chartData === "toolong" || result.testDuration > 122) {
- icons += ``;
- } else {
- icons += ``;
- }
-
- let tagNames = "no tags";
-
- if (result.tags !== undefined && result.tags.length > 0) {
- tagNames = "";
- result.tags.forEach((tag) => {
- DB.getSnapshot()?.tags?.forEach((snaptag) => {
- if (tag === snaptag._id) {
- tagNames += snaptag.display + ", ";
- }
- });
- });
- tagNames = tagNames.substring(0, tagNames.length - 2);
- }
-
- let restags;
- if (result.tags === undefined) {
- restags = "[]";
- } else {
- restags = JSON.stringify(result.tags);
- }
-
- const isActive = result.tags !== undefined && result.tags.length > 0;
- const icon =
- result.tags !== undefined && result.tags.length > 1 ? "fa-tags" : "fa-tag";
-
- const resultTagsButton = ``;
-
- let pb = "";
- if (result.isPb) {
- pb = '';
- } else {
- pb = "";
- }
-
- const charStats = result.charStats.join("/");
-
- const mode2 = result.mode === "custom" ? "" : result.mode2;
-
- const date = new Date(result.timestamp);
-
- const element = document.createElement("tr");
- element.classList.add("resultRow");
- element.dataset["id"] = result._id;
- element.innerHTML = `
- ${pb} |
- ${Format.typingSpeed(result.wpm, { showDecimalPlaces: true })} |
- ${Format.typingSpeed(result.rawWpm, { showDecimalPlaces: true })} |
- ${Format.percentage(result.acc, { showDecimalPlaces: true })} |
- ${Format.percentage(result.consistency, {
- showDecimalPlaces: true,
- })} |
- ${charStats} |
- ${result.mode} ${mode2} |
- ${icons} |
- ${resultTagsButton} |
- ${format(date, "dd MMM yyyy")}
- ${format(date, "HH:mm")}
- |
- `;
-
- return element;
-}
-
-function reset(): void {
- historyTable.setData([]);
- historyTable.updateBody();
-
- ChartController.accountHistogram.getDataset("count").data = [];
- ChartController.accountActivity.getDataset("count").data = [];
- ChartController.accountActivity.getDataset("avgWpm").data = [];
- ChartController.accountHistory.getDataset("wpm").data = [];
- ChartController.accountHistory.getDataset("pb").data = [];
- ChartController.accountHistory.getDataset("acc").data = [];
- ChartController.accountHistory.getDataset("wpmAvgTen").data = [];
- ChartController.accountHistory.getDataset("accAvgTen").data = [];
- ChartController.accountHistory.getDataset("wpmAvgHundred").data = [];
- ChartController.accountHistory.getDataset("accAvgHundred").data = [];
-}
-
-let totalSecondsFiltered = 0;
-let chartData: ChartController.HistoryChartData[] = [];
-let accChartData: ChartController.AccChartData[] = [];
-
-async function fillContent(): Promise {
- console.log("updating account page");
-
- const snapshot = DB.getSnapshot();
- if (!snapshot) return;
-
- void ResultBatches.update();
-
- chartData = [];
- accChartData = [];
- const wpmChartData: number[] = [];
- visibleTableLines = 0;
-
- let topWpm = 0;
- let topMode = "";
- let testRestarts = 0;
- let totalWpm = 0;
- let testCount = 0;
-
- let last10 = 0;
- let wpmLast10total = 0;
-
- let topAcc = 0;
- let totalAcc = 0;
- let totalAcc10 = 0;
-
- const rawWpm = {
- total: 0,
- count: 0,
- last10Total: 0,
- last10Count: 0,
- max: 0,
- };
-
- let totalEstimatedWords = 0;
-
- // let totalSeconds = 0;
- totalSecondsFiltered = 0;
-
- let topCons = 0;
- let totalCons = 0;
- let totalCons10 = 0;
- let consCount = 0;
-
- type ActivityChartData = Record<
- number,
- {
- restarts: number;
- amount: number;
- time: number;
- maxWpm: number;
- totalWpm: number;
- totalAcc: number;
- totalCon: number;
- }
- >;
-
- const activityChartData: ActivityChartData = {};
- const histogramChartData: number[] = [];
- const typingSpeedUnit = getTypingSpeedUnit(Config.typingSpeedUnit);
-
- filteredResults = [];
- qs(".pageAccount .history table tbody")?.empty();
-
- DB.getSnapshot()?.results?.forEach((result) => {
- // totalSeconds += tt;
-
- //apply filters
- try {
- if (!ResultFilters.getFilter("pb", result.isPb ? "yes" : "no")) {
- if (filterDebug) {
- console.log(`skipping result due to pb filter`, result);
- }
- return;
- }
-
- let resdiff = result.difficulty ?? "normal";
- if (!ResultFilters.getFilter("difficulty", resdiff)) {
- if (filterDebug) {
- console.log(`skipping result due to difficulty filter`, result);
- }
- return;
- }
- if (!ResultFilters.getFilter("mode", result.mode)) {
- if (filterDebug) {
- console.log(`skipping result due to mode filter`, result);
- }
- return;
- }
-
- if (result.mode === "time") {
- let timefilter: Mode2<"time"> | "custom" = "custom";
- if (
- ["15", "30", "60", "120"].includes(
- `${result.mode2}`, //legacy results could have a number in mode2
- )
- ) {
- timefilter = `${result.mode2}` as `${number}`;
- }
- if (
- !ResultFilters.getFilter(
- "time",
- timefilter as "custom" | "15" | "30" | "60" | "120",
- )
- ) {
- if (filterDebug) {
- console.log(`skipping result due to time filter`, result);
- }
- return;
- }
- } else if (result.mode === "words") {
- let wordfilter: Mode2Custom<"words"> = "custom";
- if (
- ["10", "25", "50", "100", "200"].includes(
- `${result.mode2}`, //legacy results could have a number in mode2
- )
- ) {
- wordfilter = `${result.mode2}` as `${number}`;
- }
- if (
- !ResultFilters.getFilter(
- "words",
- wordfilter as "custom" | "10" | "25" | "50" | "100",
- )
- ) {
- if (filterDebug) {
- console.log(`skipping result due to word filter`, result);
- }
- return;
- }
- }
-
- if (result.quoteLength !== null) {
- let filter: keyof typeof defaultResultFilters.quoteLength | undefined =
- undefined;
- if (result.quoteLength === 0) {
- filter = "short";
- } else if (result.quoteLength === 1) {
- filter = "medium";
- } else if (result.quoteLength === 2) {
- filter = "long";
- } else if (result.quoteLength === 3) {
- filter = "thicc";
- }
- if (
- filter !== undefined &&
- !ResultFilters.getFilter("quoteLength", filter)
- ) {
- if (filterDebug) {
- console.log(`skipping result due to quoteLength filter`, result);
- }
- return;
- }
- }
-
- let langFilter = ResultFilters.getFilter("language", result.language);
-
- if (
- //legacy value for english_1k
- (result.language as string) === "english_expanded" &&
- ResultFilters.getFilter("language", "english_1k")
- ) {
- langFilter = true;
- }
- if (!langFilter) {
- if (filterDebug) {
- console.log(`skipping result due to language filter`, result);
- }
- return;
- }
-
- let puncfilter: ResultFiltersGroupItem<"punctuation"> = "off";
- if (result.punctuation) {
- puncfilter = "on";
- }
- if (!ResultFilters.getFilter("punctuation", puncfilter)) {
- if (filterDebug) {
- console.log(`skipping result due to punctuation filter`, result);
- }
- return;
- }
-
- let numfilter: ResultFiltersGroupItem<"numbers"> = "off";
- if (result.numbers) {
- numfilter = "on";
- }
- if (!ResultFilters.getFilter("numbers", numfilter)) {
- if (filterDebug) {
- console.log(`skipping result due to numbers filter`, result);
- }
- return;
- }
-
- if (result.funbox === undefined || result.funbox.length === 0) {
- if (!ResultFilters.getFilter("funbox", "none")) {
- if (filterDebug) {
- console.log(`skipping result due to funbox filter`, result);
- }
- return;
- }
- } else {
- let counter = 0;
- for (const f of result.funbox) {
- if (ResultFilters.getFilter("funbox", f)) {
- counter++;
- break;
- }
- }
- if (counter === 0) {
- if (filterDebug) {
- console.log(`skipping result due to funbox filter`, result);
- }
- return;
- }
- }
-
- let tagHide = true;
- if (result.tags === undefined || result.tags.length === 0) {
- //no tags, show when no tag is enabled
- if ((DB.getSnapshot()?.tags?.length ?? 0) > 0) {
- if (ResultFilters.getFilter("tags", "none")) tagHide = false;
- } else {
- tagHide = false;
- }
- } else {
- //tags exist
- const validTags = DB.getSnapshot()?.tags?.map((t) => t._id);
-
- if (validTags === undefined) return;
-
- result.tags.forEach((tag) => {
- //check if i even need to check tags anymore
- if (!tagHide) return;
- //check if tag is valid
- if (validTags?.includes(tag)) {
- //tag valid, check if filter is on
- if (ResultFilters.getFilter("tags", tag)) tagHide = false;
- } else {
- //tag not found in valid tags, meaning probably deleted
- if (ResultFilters.getFilter("tags", "none")) tagHide = false;
- }
- });
- }
-
- if (tagHide) {
- if (filterDebug) {
- console.log(`skipping result due to tag filter`, result);
- }
- return;
- }
-
- const timeSinceTest = Math.abs(result.timestamp - Date.now()) / 1000;
-
- let datehide = true;
-
- if (
- ResultFilters.getFilter("date", "all") ||
- (ResultFilters.getFilter("date", "last_day") &&
- timeSinceTest <= 86400) ||
- (ResultFilters.getFilter("date", "last_week") &&
- timeSinceTest <= 604800) ||
- (ResultFilters.getFilter("date", "last_month") &&
- timeSinceTest <= 2592000) ||
- (ResultFilters.getFilter("date", "last_3months") &&
- timeSinceTest <= 7776000)
- ) {
- datehide = false;
- }
-
- if (datehide) {
- if (filterDebug) {
- console.log(`skipping result due to date filter`, result);
- }
- return;
- }
-
- filteredResults.push(result);
- } catch (e) {
- showNoticeNotification(
- "Something went wrong when filtering. Resetting filters.",
- );
- console.log(result);
- console.error(e);
- ResultFilters.reset();
- ResultFilters.updateActive();
- void update();
- return;
- }
- //filters done
- //=======================================
-
- totalEstimatedWords += Math.round((result.wpm / 60) * result.testDuration);
-
- const resultDate = new Date(result.timestamp);
- resultDate.setSeconds(0);
- resultDate.setMinutes(0);
- resultDate.setHours(0);
- resultDate.setMilliseconds(0);
- const resultTimestamp = resultDate.getTime();
-
- const dataForTimestamp = activityChartData[resultTimestamp];
-
- if (dataForTimestamp !== undefined) {
- dataForTimestamp.amount++;
- dataForTimestamp.restarts += result.restartCount ?? 0;
- dataForTimestamp.time +=
- result.testDuration +
- (result.incompleteTestSeconds ?? 0) -
- (result.afkDuration ?? 0);
- if (result.wpm > dataForTimestamp.maxWpm) {
- dataForTimestamp.maxWpm = result.wpm;
- }
- dataForTimestamp.totalWpm += result.wpm;
- dataForTimestamp.totalAcc += result.acc;
- dataForTimestamp.totalCon += result.consistency ?? 0;
- } else {
- activityChartData[resultTimestamp] = {
- amount: 1,
- restarts: result.restartCount ?? 0,
- time:
- result.testDuration +
- (result.incompleteTestSeconds ?? 0) -
- (result.afkDuration ?? 0),
- maxWpm: result.wpm,
- totalWpm: result.wpm,
- totalAcc: result.acc,
- totalCon: result.consistency ?? 0,
- };
- }
-
- const bucketSize = typingSpeedUnit.histogramDataBucketSize;
- const bucket = Math.floor(
- Math.round(typingSpeedUnit.fromWpm(result.wpm)) / bucketSize,
- );
-
- //grow array if needed
- if (histogramChartData.length <= bucket) {
- for (let i = histogramChartData.length; i <= bucket; i++) {
- histogramChartData.push(0);
- }
- }
- (histogramChartData[bucket] as number) += 1;
-
- let tt = 0;
- if (
- result.testDuration === undefined &&
- result.mode2 !== "custom" &&
- result.mode2 !== "zen"
- ) {
- //test finished before testDuration field was introduced - estimate
- if (result.mode === "time") {
- tt = parseInt(result.mode2);
- } else if (result.mode === "words") {
- tt = (parseInt(result.mode2) / result.wpm) * 60;
- }
- } else {
- tt = parseFloat(result.testDuration as unknown as string); //legacy results could have a string here
- }
- if (result.incompleteTestSeconds !== undefined) {
- tt += result.incompleteTestSeconds;
- } else if (result.restartCount !== undefined && result.restartCount > 0) {
- tt += (tt / 4) * result.restartCount;
- }
-
- // if (result.incompleteTestSeconds !== undefined) {
- // tt += result.incompleteTestSeconds;
- // } else if (result.restartCount !== undefined && result.restartCount > 0) {
- // tt += (tt / 4) * result.restartCount;
- // }
- totalSecondsFiltered += tt;
-
- if (last10 < 10) {
- last10++;
- wpmLast10total += result.wpm;
- totalAcc10 += result.acc;
- if (result.consistency !== undefined) {
- totalCons10 += result.consistency;
- }
- }
- testCount++;
-
- if (result.consistency !== undefined) {
- consCount++;
- totalCons += result.consistency;
- if (result.consistency > topCons) {
- topCons = result.consistency;
- }
- }
-
- if (result.rawWpm !== null) {
- if (rawWpm.last10Count < 10) {
- rawWpm.last10Count++;
- rawWpm.last10Total += result.rawWpm;
- }
- rawWpm.total += result.rawWpm;
- rawWpm.count++;
- if (result.rawWpm > rawWpm.max) {
- rawWpm.max = result.rawWpm;
- }
- }
-
- if (result.acc > topAcc) {
- topAcc = result.acc;
- }
-
- totalAcc += result.acc;
-
- if (result.restartCount !== undefined) {
- testRestarts += result.restartCount;
- }
-
- chartData.push({
- x: filteredResults.length,
- y: Numbers.roundTo2(typingSpeedUnit.fromWpm(result.wpm)),
- wpm: Numbers.roundTo2(typingSpeedUnit.fromWpm(result.wpm)),
- acc: result.acc,
- mode: result.mode,
- mode2: result.mode2,
- punctuation: result.punctuation,
- language: result.language,
- timestamp: result.timestamp,
- difficulty: result.difficulty,
- raw: Numbers.roundTo2(typingSpeedUnit.fromWpm(result.rawWpm)),
- isPb: result.isPb ?? false,
- });
-
- wpmChartData.push(result.wpm);
-
- accChartData.push({
- x: filteredResults.length,
- y: result.acc,
- errorRate: 100 - result.acc,
- });
-
- if (result.wpm > topWpm) {
- topWpm = result.wpm;
- if (result.mode === "custom") {
- topMode = result.mode;
- } else {
- const puncsctring = result.punctuation ? ", with punctuation" : "";
- const numbsctring = result.numbers ? ", with numbers" : "";
- topMode = result.mode + " " + result.mode2 + puncsctring + numbsctring;
- }
- }
-
- totalWpm += result.wpm;
- });
-
- historyTable.setData(filteredResults);
-
- qs(".pageAccount .group.history table thead tr td:nth-child(2)")?.setText(
- Config.typingSpeedUnit,
- );
-
- await Misc.sleep(0);
- loadMoreLines();
- ////////
-
- const activityChartData_timeAndAmount: ChartController.ActivityChartDataPoint[] =
- [];
- const activityChartData_avgWpm: ChartController.ActivityChartDataPoint[] = [];
- const wpmStepSize = typingSpeedUnit.historyStepSize;
-
- // let lastTimestamp = 0;
- for (const date of Object.keys(activityChartData)) {
- const dateInt = parseInt(date);
- const dataPoint = activityChartData[dateInt];
-
- if (dataPoint === undefined) continue;
-
- activityChartData_timeAndAmount.push({
- x: dateInt,
- y: dataPoint.time / 60,
- amount: dataPoint.amount,
- restarts: dataPoint.restarts,
- maxWpm: Numbers.roundTo2(typingSpeedUnit.fromWpm(dataPoint.maxWpm)),
- avgWpm: Numbers.roundTo2(dataPoint.totalWpm / dataPoint.amount),
- avgAcc: Numbers.roundTo2(dataPoint.totalAcc / dataPoint.amount),
- avgCon: Numbers.roundTo2(dataPoint.totalCon / dataPoint.amount),
- });
- activityChartData_avgWpm.push({
- x: dateInt,
- y: Numbers.roundTo2(
- typingSpeedUnit.fromWpm(dataPoint.totalWpm) / dataPoint.amount,
- ),
- });
- }
-
- const accountActivityScaleOptions = (
- ChartController.accountActivity.options as ScaleChartOptions<"bar" | "line">
- ).scales;
-
- const accountActivityAvgWpmOptions = accountActivityScaleOptions[
- "avgWpm"
- ] as LinearScaleOptions;
-
- accountActivityAvgWpmOptions.title.text = "Average " + Config.typingSpeedUnit;
- accountActivityAvgWpmOptions.ticks.stepSize = wpmStepSize;
-
- ChartController.accountActivity.getDataset("count").data =
- activityChartData_timeAndAmount;
- ChartController.accountActivity.getDataset("avgWpm").data =
- activityChartData_avgWpm;
-
- const histogramChartDataBucketed: { x: number; y: number }[] = [];
- const labels: string[] = [];
-
- const bucketSize = typingSpeedUnit.histogramDataBucketSize;
- const bucketSizeUpperBound = bucketSize - (bucketSize <= 1 ? 0.01 : 1);
-
- histogramChartData.forEach((amount: number, i: number) => {
- const bucket = i * bucketSize;
- labels.push(`${bucket} - ${bucket + bucketSizeUpperBound}`);
- histogramChartDataBucketed.push({
- x: bucket,
- y: amount,
- });
- });
-
- ChartController.accountHistogram.data.labels = labels;
- ChartController.accountHistogram.getDataset("count").data =
- histogramChartDataBucketed;
-
- const accountHistoryScaleOptions = (
- ChartController.accountHistory.options as ScaleChartOptions<"line">
- ).scales;
-
- const accountHistoryWpmOptions = accountHistoryScaleOptions[
- "wpm"
- ] as LinearScaleOptions;
- accountHistoryWpmOptions.title.text = typingSpeedUnit.fullUnitString;
-
- if (chartData.length > 0) {
- // get pb points
- let currentPb = 0;
- const pb: { x: number; y: number }[] = [];
-
- for (let i = chartData.length - 1; i >= 0; i--) {
- const a = chartData[i] as ChartController.HistoryChartData;
- if (a.y > currentPb) {
- currentPb = a.y;
- pb.push(a);
- }
- }
-
- // add last point to pb
- pb.push({
- x: 1,
- y: Arrays.lastElementFromArray(pb)?.y as number,
- });
-
- const avgTen = [];
- const avgTenAcc = [];
- const avgHundred = [];
- const avgHundredAcc = [];
-
- for (let i = 0; i < chartData.length; i++) {
- // calculate averages of 10
- const subsetTen = chartData.slice(i, i + 10);
- const accSubsetTen = accChartData.slice(i, i + 10);
- const avgTenValue =
- subsetTen.reduce((acc, { y }) => acc + y, 0) / subsetTen.length;
- const accAvgTenValue =
- accSubsetTen.reduce((acc, { y }) => acc + y, 0) / accSubsetTen.length;
-
- avgTen.push({ x: i + 1, y: avgTenValue });
- avgTenAcc.push({ x: i + 1, y: accAvgTenValue });
-
- // calculate averages of 100
- const subsetHundred = chartData.slice(i, i + 100);
- const accSubsetHundred = accChartData.slice(i, i + 100);
- const avgHundredValue =
- subsetHundred.reduce((acc, { y }) => acc + y, 0) / subsetHundred.length;
- const accAvgHundredValue =
- accSubsetHundred.reduce((acc, { y }) => acc + y, 0) /
- accSubsetHundred.length;
- avgHundred.push({ x: i + 1, y: avgHundredValue });
- avgHundredAcc.push({ x: i + 1, y: accAvgHundredValue });
- }
-
- ChartController.accountHistory.getDataset("wpm").data = chartData;
- ChartController.accountHistory.getDataset("pb").data = pb;
- ChartController.accountHistory.getDataset("acc").data = accChartData;
- ChartController.accountHistory.getDataset("wpmAvgTen").data = avgTen;
- ChartController.accountHistory.getDataset("accAvgTen").data = avgTenAcc;
- ChartController.accountHistory.getDataset("wpmAvgHundred").data =
- avgHundred;
- ChartController.accountHistory.getDataset("accAvgHundred").data =
- avgHundredAcc;
-
- ChartController.accountHistory.getScale("x").max = chartData.length + 1;
- }
-
- const wpms = chartData.map((r) => r.y);
- const minWpm = Math.min(...wpms);
- const maxWpm = Math.max(...wpms);
- const minWpmChartVal = isFinite(minWpm) ? minWpm : 0;
- const maxWpmChartVal = isFinite(maxWpm) ? maxWpm : 0;
- const maxWpmChartValWithBuffer =
- Math.floor(maxWpmChartVal) +
- (wpmStepSize - (Math.floor(maxWpmChartVal) % wpmStepSize));
-
- // let accuracies = accChartData.map((r) => r.y);
- accountHistoryWpmOptions.max = maxWpmChartValWithBuffer;
-
- accountHistoryWpmOptions.ticks.stepSize = wpmStepSize;
-
- ChartController.accountHistory.getScale("pb").max = maxWpmChartValWithBuffer;
- ChartController.accountHistory.getScale("wpmAvgTen").max =
- maxWpmChartValWithBuffer;
- ChartController.accountHistory.getScale("wpmAvgHundred").max =
- maxWpmChartValWithBuffer;
-
- if (!Config.startGraphsAtZero) {
- const minWpmChartValFloor =
- Math.floor(minWpmChartVal / wpmStepSize) * wpmStepSize;
-
- ChartController.accountHistory.getScale("wpm").min = minWpmChartValFloor;
- ChartController.accountHistory.getScale("pb").min = minWpmChartValFloor;
- ChartController.accountHistory.getScale("wpmAvgTen").min =
- minWpmChartValFloor;
- ChartController.accountHistory.getScale("wpmAvgHundred").min =
- minWpmChartValFloor;
- } else {
- ChartController.accountHistory.getScale("wpm").min = 0;
- ChartController.accountHistory.getScale("pb").min = 0;
- ChartController.accountHistory.getScale("wpmAvgTen").min = 0;
- ChartController.accountHistory.getScale("wpmAvgHundred").min = 0;
- }
-
- if (chartData === undefined || chartData.length === 0) {
- qs(".pageAccount .group.noDataError")?.show();
- qs(".pageAccount .group.chart")?.hide();
- qs(".pageAccount .group.dailyActivityChart")?.hide();
- qs(".pageAccount .group.histogramChart")?.hide();
- qs(".pageAccount .group.aboveHistory")?.hide();
- qs(".pageAccount .group.history")?.hide();
- qs(".pageAccount .triplegroup.stats")?.hide();
- qs(".pageAccount .group.estimatedWordsTyped")?.hide();
- } else {
- qs(".pageAccount .group.noDataError")?.hide();
- qs(".pageAccount .group.chart")?.show();
- qs(".pageAccount .group.dailyActivityChart")?.show();
- qs(".pageAccount .group.histogramChart")?.show();
- qs(".pageAccount .group.aboveHistory")?.show();
- qs(".pageAccount .group.history")?.show();
- qs(".pageAccount .triplegroup.stats")?.show();
- qs(".pageAccount .group.estimatedWordsTyped")?.show();
- }
-
- qs(".pageAccount .timeTotalFiltered .val")?.setText(
- DateTime.secondsToString(Math.round(totalSecondsFiltered), true, true),
- );
-
- const speedUnit = Config.typingSpeedUnit;
-
- qs(".pageAccount .highestWpm .title")?.setText(`highest ${speedUnit}`);
- qs(".pageAccount .highestWpm .val")?.setText(Format.typingSpeed(topWpm));
-
- qs(".pageAccount .averageWpm .title")?.setText(`average ${speedUnit}`);
- qs(".pageAccount .averageWpm .val")?.setText(
- Format.typingSpeed(totalWpm / testCount),
- );
-
- qs(".pageAccount .averageWpm10 .title")?.setText(
- `average ${speedUnit} (last 10 tests)`,
- );
- qs(".pageAccount .averageWpm10 .val")?.setText(
- Format.typingSpeed(wpmLast10total / last10),
- );
-
- qs(".pageAccount .highestRaw .title")?.setText(`highest raw ${speedUnit}`);
- qs(".pageAccount .highestRaw .val")?.setText(Format.typingSpeed(rawWpm.max));
-
- qs(".pageAccount .averageRaw .title")?.setText(`average raw ${speedUnit}`);
- qs(".pageAccount .averageRaw .val")?.setText(
- Format.typingSpeed(rawWpm.total / rawWpm.count),
- );
-
- qs(".pageAccount .averageRaw10 .title")?.setText(
- `average raw ${speedUnit} (last 10 tests)`,
- );
- qs(".pageAccount .averageRaw10 .val")?.setText(
- Format.typingSpeed(rawWpm.last10Total / rawWpm.last10Count),
- );
-
- qs(".pageAccount .highestWpm .mode")?.setHtml(topMode);
- qs(".pageAccount .testsTaken .val")?.setText(testCount.toString());
-
- qs(".pageAccount .highestAcc .val")?.setText(Format.accuracy(topAcc));
- qs(".pageAccount .avgAcc .val")?.setText(
- Format.accuracy(totalAcc / testCount),
- );
- qs(".pageAccount .avgAcc10 .val")?.setText(
- Format.accuracy(totalAcc10 / last10),
- );
-
- if (totalCons === 0 || totalCons === undefined) {
- qs(".pageAccount .avgCons .val")?.setText("-");
- qs(".pageAccount .avgCons10 .val")?.setText("-");
- } else {
- qs(".pageAccount .highestCons .val")?.setText(Format.percentage(topCons));
-
- qs(".pageAccount .avgCons .val")?.setText(
- Format.percentage(totalCons / consCount),
- );
-
- qs(".pageAccount .avgCons10 .val")?.setText(
- Format.percentage(totalCons10 / Math.min(last10, consCount)),
- );
- }
-
- qs(".pageAccount .testsStarted .val")?.setText(`${testCount + testRestarts}`);
- qs(".pageAccount .testsCompleted .val")?.setText(
- `${testCount}(${Math.floor(
- (testCount / (testCount + testRestarts)) * 100,
- )}%)`,
- );
-
- qs(".pageAccount .testsCompleted .avgres")?.setText(`
- ${(testRestarts / testCount).toFixed(1)} restarts per completed test
- `);
-
- const wpmPoints = filteredResults.map((r) => r.wpm).reverse();
-
- const trend = findLineByLeastSquares(wpmPoints);
- if (trend) {
- const wpmChange = trend[1][1] - trend[0][1];
- const wpmChangePerHour = wpmChange * (3600 / totalSecondsFiltered);
- const plus = wpmChangePerHour > 0 ? "+" : "";
- qs(".pageAccount .group.chart .below .text")?.setText(
- `Speed change per hour spent typing: ${
- plus + Format.typingSpeed(wpmChangePerHour, { showDecimalPlaces: true })
- } ${Config.typingSpeedUnit}`,
- );
- }
- qs(".pageAccount .estimatedWordsTyped .val")?.setText(
- totalEstimatedWords.toString(),
- );
-
- if (chartData.length || accChartData.length) {
- ChartController.updateAccountChartButtons();
- ChartController.accountHistory.options.animation = false;
- ChartController.accountHistory.update();
- delete ChartController.accountHistory.options.animation;
- }
- await Misc.sleep(0);
- ChartController.accountActivity.update();
- ChartController.accountHistogram.update();
- Focus.set(false);
- qs(".page.pageAccount")?.setStyle({ height: "unset" }); //weird safari fix
-}
-
-export async function downloadResults(offset?: number): Promise {
- const results = await DB.getUserResults(offset);
-
- TodayTracker.addAllFromToday();
- if (results) {
- ResultFilters.updateActive();
- }
-}
-
-async function update(): Promise {
- await downloadResults();
- try {
- await Misc.sleep(0);
- await fillContent();
- } catch (e) {
- console.error(e);
- showErrorNotification(`Something went wrong: ${e}`);
- }
-}
-
-export function updateTagsForResult(resultId: string, tagIds: string[]): void {
- const tagNames: string[] = [];
-
- if (tagIds.length > 0) {
- for (const tag of tagIds) {
- DB.getSnapshot()?.tags?.forEach((snaptag) => {
- if (tag === snaptag._id) {
- tagNames.push(snaptag.display);
- }
- });
- }
- }
-
- const el = qs(
- `.pageAccount .resultEditTagsButton[data-result-id='${resultId}']`,
- );
-
- el?.setAttribute("data-tags", JSON.stringify(tagIds));
-
- if (tagIds.length > 0) {
- el?.setAttribute("aria-label", tagNames.join(", "));
- el?.addClass("active");
- if (tagIds.length > 1) {
- el?.setHtml(``);
- } else {
- el?.setHtml(``);
- }
- } else {
- el?.setAttribute("aria-label", "no tags");
- el?.removeClass("active");
- el?.setHtml(``);
- }
-}
-
-qs(".pageAccount button.toggleResultsOnChart")?.on("click", () => {
- const newValue = [...Config.accountChart] as AccountChart;
- newValue[0] = newValue[0] === "on" ? "off" : "on";
- setConfig("accountChart", newValue);
-});
-
-qs(".pageAccount button.toggleAccuracyOnChart")?.on("click", () => {
- const newValue = [...Config.accountChart] as AccountChart;
- newValue[1] = newValue[1] === "on" ? "off" : "on";
- setConfig("accountChart", newValue);
-});
-
-qs(".pageAccount button.toggleAverage10OnChart")?.on("click", () => {
- const newValue = [...Config.accountChart] as AccountChart;
- newValue[2] = newValue[2] === "on" ? "off" : "on";
- setConfig("accountChart", newValue);
-});
-
-qs(".pageAccount button.toggleAverage100OnChart")?.on("click", () => {
- const newValue = [...Config.accountChart] as AccountChart;
- newValue[3] = newValue[3] === "on" ? "off" : "on";
- setConfig("accountChart", newValue);
-});
-
-qs(".pageAccount .loadMoreButton")?.on("click", () => {
- loadMoreLines();
-});
-
-qs(".pageAccount #accountHistoryChart")?.on("click", () => {
- const chart = ChartController.accountHistory;
- const active = chart.tooltip?.getActiveElements?.() ?? [];
- if (!active.length) return;
-
- const index = active[0]?.index;
- if (index === undefined) return;
-
- loadMoreLines(index);
-
- const resultId = filteredResults[index]?._id;
- if (resultId === undefined) {
- throw new Error("Cannot find result for index " + index);
- }
-
- const element = qs(`.resultRow[data-id="${resultId}"]`);
- qsa(".resultRow").removeClass("active");
-
- element?.scrollIntoView({ block: "center" });
- element?.addClass("active");
-});
-
-qs(".pageAccount")?.onChild(
- "click",
- ".miniResultChartButton",
- async (event) => {
- const target = new ElementWithUtils(event.childTarget as HTMLElement);
- const resultId: string = target
- .closestParent("tr")
- ?.getAttribute("data-id") as string;
- if (target.hasClass("loading")) return;
- if (target.hasClass("disabled")) return;
-
- const result = filteredResults.find((it) => it._id === resultId);
- if (result === undefined) return;
-
- let chartData = result.chartData as ChartData;
-
- if (chartData === undefined) {
- //need to load full result
- target?.addClass("loading");
- target?.removeAttribute("aria-label");
- target?.setHtml('');
- showLoaderBar();
-
- const response = await Ape.results.getById({
- params: { resultId: result._id },
- });
- hideLoaderBar();
-
- target?.setHtml('');
- target?.removeClass("loading");
-
- if (response.status !== 200) {
- showErrorNotification("Error fetching result", { response });
- return;
- }
-
- chartData = response.body.data.chartData as ChartData;
-
- //update local cache
- result.chartData = chartData;
- const dbResult = DB.getSnapshot()?.results?.find(
- (it) => it._id === result._id,
- );
- if (dbResult !== undefined) {
- dbResult.chartData = result.chartData;
- }
-
- if (response.body.data.chartData === "toolong") {
- target?.setAttribute(
- "aria-label",
- "Graph history is not available for long tests",
- );
- target?.setAttribute("data-balloon-pos", "up");
- target.addClass("disabled");
-
- showNoticeNotification("Graph history is not available for long tests");
- return;
- }
- }
- target?.setAttribute("aria-label", "View graph");
- MiniResultChartModal.show(chartData);
- },
-);
-
-const filterButtons = qsa(
- ".pageAccount .group.topFilters, .pageAccount .filterButtons",
-);
-
-filterButtons.forEach((filterButton) => {
- filterButton.onChild("click", "button", () => {
- setTimeout(() => {
- void update();
- }, 0);
- });
-});
-
-qs(".pageAccount .group.presetFilterButtons")?.onChild(
- "click",
- ".filterBtns .filterPresets .select-filter-preset",
- async (e) => {
- const target = e.childTarget as HTMLElement;
- await ResultFilters.setFilterPreset(
- target.getAttribute("data-id") as string,
- );
- void update();
- },
-);
-
-qs(".pageAccount .content .group.aboveHistory .exportCSV")?.on("click", () => {
- showLoaderBar();
- void Misc.downloadResultsCSV(filteredResults).finally(() => {
- hideLoaderBar();
- });
-});
-
-qs(".pageAccount button.loadMoreResults")?.on("click", async () => {
- const offset = DB.getSnapshot()?.results?.length ?? 0;
-
- showLoaderBar();
- ResultBatches.disableButton();
-
- await downloadResults(offset);
- await fillContent();
- hideLoaderBar();
-});
-
-qs(".pageAccount")?.onChild("click", ".sendVerificationEmail", async () => {
- qs(".sendVerificationEmail")?.disable();
- await sendVerificationEmail();
- qs(".sendVerificationEmail")?.enable();
-});
-
-configEvent.subscribe(({ key }) => {
- if (getActivePage() === "account" && key === "typingSpeedUnit") {
- void update();
- }
-});
-
-export const page = new Page({
- id: "account",
- element: qsr(".page.pageAccount"),
- path: "/account",
- loadingOptions: {
- loadingMode: () => {
- if (DB.getSnapshot()?.results === undefined) {
- return "sync";
- } else {
- return "none";
- }
- },
- loadingPromise: async () => {
- if (DB.getSnapshot() === null) {
- throw new Error(
- "Looks like your account data didn't download correctly. Please refresh the page. If this error persists, please contact support.",
- );
- }
- return downloadResults();
- },
- style: "bar",
- keyframes: [
- {
- percentage: 90,
- durationMs: 2000,
- text: "Downloading results...",
- },
- ],
- },
- afterHide: async (): Promise => {
- reset();
- Skeleton.remove("pageAccount");
- },
- beforeShow: async (): Promise => {
- Skeleton.append("pageAccount", "main");
- await ResultFilters.appendDropdowns(update);
- ResultFilters.updateActive();
- await Misc.sleep(0);
-
- historyTable ??= new SortedTableWithLimit>({
- limit: 10,
- table: qsr(".pageAccount .content .history table"),
- data: filteredResults,
- buildRow: (val) => {
- return buildResultRow(val);
- },
- initialSort: { property: "timestamp", descending: true },
- });
-
- await update().then(() => {
- qs(".pageAccount .content .accountVerificatinNotice")?.remove();
- if (getAuthenticatedUser()?.emailVerified === false) {
- qs(".pageAccount .content")?.prependHtml(
- `Your email address is still not verified `,
- );
- }
- ResultBatches.showOrHideIfNeeded();
- });
- },
-});
-
-onDOMReady(() => {
- Skeleton.save("pageAccount");
-});
diff --git a/frontend/src/ts/states/core.ts b/frontend/src/ts/states/core.ts
index c2b3f80f0b2f..22491ca34f6e 100644
--- a/frontend/src/ts/states/core.ts
+++ b/frontend/src/ts/states/core.ts
@@ -31,6 +31,7 @@ export const [getIsScreenshotting, setIsScreenshotting] = createSignal(false);
export const [getUserId, setUserId] = createSignal(null);
export const isLoggedIn = (): boolean => getUserId() !== null;
+export const [isUserVerified, setUserVerified] = createSignal(false);
export const [getSelectedProfileName, setSelectedProfileName] = createSignal<
string | undefined
diff --git a/frontend/src/ts/states/modals.ts b/frontend/src/ts/states/modals.ts
index fa2fac25505e..1310f38b4087 100644
--- a/frontend/src/ts/states/modals.ts
+++ b/frontend/src/ts/states/modals.ts
@@ -23,8 +23,8 @@ export type ModalId =
| "TestDuration"
| "ShareTestSettings"
| "CustomWordAmount"
- | "MobileTestConfig";
-
+ | "MobileTestConfig"
+ | "MiniResultChartModal";
export type ModalVisibility = {
visible: boolean;
chained: boolean;
diff --git a/frontend/src/ts/states/result-filters.ts b/frontend/src/ts/states/result-filters.ts
new file mode 100644
index 000000000000..2b9a879d12be
--- /dev/null
+++ b/frontend/src/ts/states/result-filters.ts
@@ -0,0 +1,47 @@
+import { ResultFilters, ResultFiltersSchema } from "@monkeytype/schemas/users";
+import { createEffect } from "solid-js";
+import { mergeWithDefaultFilters } from "../components/pages/account/utils";
+import defaultResultFilters from "../constants/default-result-filters";
+import { useLocalStorageStore } from "../hooks/useLocalStorageStore";
+import { isObject } from "../utils/misc";
+import { sanitize } from "../utils/sanitize";
+import { getSnapshot } from "./snapshot";
+
+export const [filters, setFilters] = useLocalStorageStore({
+ key: "resultFilters",
+ schema: ResultFiltersSchema,
+ fallback: defaultResultFilters,
+ migrate: migrateFilterStorage,
+ afterParse: updateFilterStorage,
+});
+
+function migrateFilterStorage(input: unknown): ResultFilters {
+ if (!isObject(input)) {
+ return defaultResultFilters;
+ }
+ const filters = sanitize(
+ ResultFiltersSchema.partial().strip(),
+ input as ResultFilters,
+ );
+ return mergeWithDefaultFilters(filters);
+}
+
+function updateFilterStorage(filters: ResultFilters): ResultFilters {
+ const result = mergeWithDefaultFilters(filters);
+ const newTags: Record = { none: false };
+ const snapshotTags = getSnapshot()?.tags?.map((t) => t._id) ?? [];
+ const allKnownTagIds = new Set(["none", ...snapshotTags]);
+
+ for (const tag of allKnownTagIds) {
+ newTags[tag] = result.tags[tag] ?? true;
+ }
+
+ result.tags = newTags;
+
+ return result;
+}
+
+createEffect(() => {
+ getSnapshot();
+ setFilters(updateFilterStorage);
+});
diff --git a/frontend/src/ts/states/snapshot.ts b/frontend/src/ts/states/snapshot.ts
index 9b7eb087219c..21ccc6845ef6 100644
--- a/frontend/src/ts/states/snapshot.ts
+++ b/frontend/src/ts/states/snapshot.ts
@@ -5,7 +5,7 @@ import { Mode } from "@monkeytype/schemas/shared";
export type MiniSnapshot = Omit<
Snapshot,
- "results" | "tags" | "presets" | "filterPresets"
+ "results" | "presets" | "filterPresets"
>;
const [snapshot, updateSnapshot] = createStore<{
value: MiniSnapshot | undefined;
diff --git a/frontend/src/ts/test/pace-caret.ts b/frontend/src/ts/test/pace-caret.ts
index d934c71c0264..7dba047a9482 100644
--- a/frontend/src/ts/test/pace-caret.ts
+++ b/frontend/src/ts/test/pace-caret.ts
@@ -7,6 +7,7 @@ import { configEvent } from "../events/config";
import { getActiveFunboxes } from "./funbox/list";
import { Caret } from "../elements/caret";
import { qsr } from "../utils/dom";
+import { getUserAverage } from "../collections/results";
type Settings = {
wpm: number;
@@ -82,27 +83,13 @@ export async function init(): Promise {
Config.lazyMode,
);
} else if (Config.paceCaret === "average") {
- [wpm] = await DB.getUserAverage10(
- Config.mode,
- mode2,
- Config.punctuation,
- Config.numbers,
- Config.language,
- Config.difficulty,
- Config.lazyMode,
+ wpm = Math.round(
+ (await getUserAverage({ ...Config, mode2, last10Only: true })).wpm,
);
- wpm = Math.round(wpm);
} else if (Config.paceCaret === "daily") {
- wpm = await DB.getUserDailyBest(
- Config.mode,
- mode2,
- Config.punctuation,
- Config.numbers,
- Config.language,
- Config.difficulty,
- Config.lazyMode,
+ wpm = Math.round(
+ (await getUserAverage({ ...Config, mode2, lastDayOnly: true })).wpm,
);
- wpm = Math.round(wpm);
} else if (Config.paceCaret === "custom") {
wpm = Config.paceCaretCustomSpeed;
} else if (Config.paceCaret === "last" || TestState.isPaceRepeat) {
diff --git a/frontend/src/ts/test/test-screenshot.ts b/frontend/src/ts/test/test-screenshot.ts
index 5487a16c0494..ac5cf29c7ea4 100644
--- a/frontend/src/ts/test/test-screenshot.ts
+++ b/frontend/src/ts/test/test-screenshot.ts
@@ -249,6 +249,7 @@ export async function copyToClipboard(): Promise {
}
try {
// Attempt to copy using ClipboardItem API
+ // oxlint-disable-next-line compat/compat
const clipItem = new ClipboardItem(
Object.defineProperty({}, blob.type, {
value: blob,
diff --git a/frontend/src/ts/test/today-tracker.ts b/frontend/src/ts/test/today-tracker.ts
index 592d2077db23..31c9c4efe49c 100644
--- a/frontend/src/ts/test/today-tracker.ts
+++ b/frontend/src/ts/test/today-tracker.ts
@@ -1,5 +1,5 @@
import * as DateTime from "../utils/date-and-time";
-import * as DB from "../db";
+import { resultsCollection } from "../collections/results";
let seconds = 0;
let addedAllToday = false;
@@ -31,11 +31,9 @@ export function addAllFromToday(): void {
const todayDateMS = todayDate.getTime();
seconds = 0;
- const snapshot = DB.getSnapshot();
- if (!snapshot) return;
- const results = snapshot.results;
+ const results = resultsCollection.values();
- results?.forEach((result) => {
+ for (const result of results) {
const resultDate = new Date(result.timestamp);
resultDate.setSeconds(0);
resultDate.setMinutes(0);
@@ -47,7 +45,7 @@ export function addAllFromToday(): void {
seconds +=
result.testDuration + result.incompleteTestSeconds - result.afkDuration;
}
- });
+ }
addedAllToday = true;
}
diff --git a/frontend/src/ts/utils/local-storage-with-schema.ts b/frontend/src/ts/utils/local-storage-with-schema.ts
index 267586b2bce1..7677bd2cf90a 100644
--- a/frontend/src/ts/utils/local-storage-with-schema.ts
+++ b/frontend/src/ts/utils/local-storage-with-schema.ts
@@ -12,6 +12,7 @@ export class LocalStorageWithSchema {
value: Record | unknown[],
zodIssues?: ZodIssue[],
) => T;
+ private afterParse?: (value: T) => T;
private cache?: T;
constructor(options: {
@@ -22,11 +23,13 @@ export class LocalStorageWithSchema {
value: Record | unknown[],
zodIssues?: ZodIssue[],
) => T;
+ afterParse?: (value: T) => T;
}) {
this.key = options.key;
this.schema = options.schema;
this.fallback = options.fallback;
this.migrate = options.migrate;
+ this.afterParse = options.afterParse;
}
public get(): T {
@@ -45,7 +48,7 @@ export class LocalStorageWithSchema {
}
let migrated = false;
- const { data: parsed, error } = tryCatchSync(() =>
+ let { data: parsed, error } = tryCatchSync(() =>
parseJsonWithSchema(value, this.schema, {
fallback: this.fallback,
migrate: (oldData, zodIssues) => {
@@ -77,13 +80,21 @@ export class LocalStorageWithSchema {
return structuredClone(this.cache);
}
+ if (
+ parsed !== null &&
+ parsed !== undefined &&
+ this.afterParse !== undefined
+ ) {
+ parsed = this.afterParse(parsed);
+ }
+
if (migrated || parsed === this.fallback) {
console.debug(`LS ${this.key} Setting in localStorage`);
window.localStorage.setItem(this.key, JSON.stringify(parsed));
}
console.debug(`LS ${this.key} Got value:`, parsed);
- this.cache = parsed;
+ this.cache = parsed as T;
return structuredClone(this.cache);
}
diff --git a/frontend/src/ts/utils/strings.ts b/frontend/src/ts/utils/strings.ts
index 6d134f881407..7b230502bc2d 100644
--- a/frontend/src/ts/utils/strings.ts
+++ b/frontend/src/ts/utils/strings.ts
@@ -134,7 +134,7 @@ export function getLanguageDisplayString(
} else {
out = language;
}
- return out.replace(/_/g, " ");
+ return replaceUnderscoresWithSpaces(out);
}
/**
@@ -362,6 +362,14 @@ export function isSpace(char: string): boolean {
return spaces.has(codePoint);
}
+export function replaceUnderscoresWithSpaces(text: string): string {
+ return text.replace(/_/g, " ");
+}
+
+export function replaceSpacesWithUnderscores(text: string): string {
+ return text.replace(/ /g, "_");
+}
+
// Export testing utilities for unit tests
export const __testing = {
hasRTLCharacters,
diff --git a/frontend/src/ts/utils/types.ts b/frontend/src/ts/utils/types.ts
new file mode 100644
index 000000000000..61d2e37b543a
--- /dev/null
+++ b/frontend/src/ts/utils/types.ts
@@ -0,0 +1,15 @@
+export type OneOf = {
+ [K in keyof T]: {
+ [P in K]: T[P];
+ } & {
+ [P in Exclude]?: never;
+ };
+}[keyof T];
+
+export type ExactlyOneTrue> = {
+ [K in keyof T]: {
+ [P in K]: true;
+ } & {
+ [P in Exclude]?: false | never;
+ };
+}[keyof T];
diff --git a/frontend/src/ts/utils/typing-speed-units.ts b/frontend/src/ts/utils/typing-speed-units.ts
index 7539f1e54102..ef96dd96db44 100644
--- a/frontend/src/ts/utils/typing-speed-units.ts
+++ b/frontend/src/ts/utils/typing-speed-units.ts
@@ -1,6 +1,6 @@
import { TypingSpeedUnit } from "@monkeytype/schemas/configs";
-type TypingSpeedUnitSettings = {
+export type TypingSpeedUnitSettings = {
fromWpm: (number: number) => number;
toWpm: (number: number) => number;
fullUnitString: string;
diff --git a/packages/schemas/src/users.ts b/packages/schemas/src/users.ts
index e592c1bea026..69493dfc7246 100644
--- a/packages/schemas/src/users.ts
+++ b/packages/schemas/src/users.ts
@@ -59,6 +59,7 @@ export const ResultFiltersSchema = z.object({
funbox: z.record(FunboxNameSchema.or(NoneFilterSchema), z.boolean()),
});
export type ResultFilters = z.infer;
+export type ResultFiltersKeys = keyof Omit;
export const StreakHourOffsetSchema = z.number().min(-11).max(12).step(0.5);
export type StreakHourOffset = z.infer;
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 50270802713f..acefbc0e3ecb 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -662,7 +662,7 @@ importers:
version: 6.0.2
vitest:
specifier: 4.1.0
- version: 4.1.0(@opentelemetry/api@1.8.0)(@types/node@24.9.1)(happy-dom@20.0.10)(jsdom@27.4.0)(vite@8.0.1(@types/node@24.9.1)(esbuild@0.27.3)(jiti@2.6.1)(sass@1.98.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2))
+ version: 4.1.0(@types/node@24.9.1)(happy-dom@20.0.10)(jsdom@27.4.0)(vite@8.0.1(@types/node@24.9.1)(esbuild@0.25.0)(jiti@2.6.1)(sass@1.98.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2))
packages/funbox:
dependencies:
@@ -816,6 +816,10 @@ packages:
'@adobe/css-tools@4.4.4':
resolution: {integrity: sha512-Elp+iwUx5rN5+Y8xLt5/GRoG20WGoDCQ/1Fb+1LiGtvwbDavuSk0jhD/eZdckHAuzcDzccnkv+rEjyWfRx18gg==}
+ '@ampproject/remapping@2.3.0':
+ resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==}
+ engines: {node: '>=6.0.0'}
+
'@anatine/zod-openapi@1.14.2':
resolution: {integrity: sha512-q0qHfnuNYVKu0Swrnnvfj9971AEyW7c8v9jCOZGCl5ZbyGMNG4RPyJkRcMi/JC8CRfdOe0IDfNm1nNsi2avprg==}
peerDependencies:
@@ -840,6 +844,10 @@ packages:
'@asamuzakjp/nwsapi@2.3.9':
resolution: {integrity: sha512-n8GuYSrI9bF7FFZ/SjhwevlHc8xaVlb/7HmHelnc/PZXBD2ZR49NnN9sMMuDdEGPeeRQ5d0hqlSlEpgCX3Wl0Q==}
+ '@babel/code-frame@7.27.1':
+ resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==}
+ engines: {node: '>=6.9.0'}
+
'@babel/code-frame@7.28.6':
resolution: {integrity: sha512-JYgintcMjRiCvS8mMECzaEn+m3PfoQiyqukOMCCVQtoJGYJw8j/8LBJEiqkHLkfwCcs74E3pbAUFNg7d9VNJ+Q==}
engines: {node: '>=6.9.0'}
@@ -848,6 +856,14 @@ packages:
resolution: {integrity: sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==}
engines: {node: '>=6.9.0'}
+ '@babel/compat-data@7.25.2':
+ resolution: {integrity: sha512-bYcppcpKBvX4znYaPEeFau03bp89ShqNMLs+rmdptMw+heSZh9+z84d2YG+K7cYLbWwzdjtDoW/uqZmPjulClQ==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/compat-data@7.28.5':
+ resolution: {integrity: sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA==}
+ engines: {node: '>=6.9.0'}
+
'@babel/compat-data@7.28.6':
resolution: {integrity: sha512-2lfu57JtzctfIrcGMz992hyLlByuzgIk58+hhGCxjKZ3rWI82NnVLjXcaTqkI2NvlcvOskZaiZ5kjUALo3Lpxg==}
engines: {node: '>=6.9.0'}
@@ -856,10 +872,26 @@ packages:
resolution: {integrity: sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg==}
engines: {node: '>=6.9.0'}
+ '@babel/core@7.25.2':
+ resolution: {integrity: sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/core@7.28.5':
+ resolution: {integrity: sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==}
+ engines: {node: '>=6.9.0'}
+
'@babel/core@7.28.6':
resolution: {integrity: sha512-H3mcG6ZDLTlYfaSNi0iOKkigqMFvkTKlGUYlD8GW7nNOYRrevuA46iTypPyv+06V3fEmvvazfntkBU34L0azAw==}
engines: {node: '>=6.9.0'}
+ '@babel/generator@7.25.0':
+ resolution: {integrity: sha512-3LEEcj3PVW8pW2R1SR1M89g/qrYk/m/mB/tLqn7dn4sbBUQyTqnlod+II2U4dqiGtUmkcnAmkMDralTFZttRiw==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/generator@7.28.5':
+ resolution: {integrity: sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==}
+ engines: {node: '>=6.9.0'}
+
'@babel/generator@7.28.6':
resolution: {integrity: sha512-lOoVRwADj8hjf7al89tvQ2a1lf53Z+7tiXMgpZJL3maQPDxh0DgLMN62B2MKUOFcoodBHLMbDM6WAbKgNy5Suw==}
engines: {node: '>=6.9.0'}
@@ -872,6 +904,14 @@ packages:
resolution: {integrity: sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==}
engines: {node: '>=6.9.0'}
+ '@babel/helper-compilation-targets@7.25.2':
+ resolution: {integrity: sha512-U2U5LsSaZ7TAt3cfaymQ8WHh0pxvdHoEk6HVpaexxixjyEquMh0L0YNJNM6CTGKMXV1iksi0iZkGw4AcFkPaaw==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-compilation-targets@7.27.2':
+ resolution: {integrity: sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==}
+ engines: {node: '>=6.9.0'}
+
'@babel/helper-compilation-targets@7.28.6':
resolution: {integrity: sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==}
engines: {node: '>=6.9.0'}
@@ -905,10 +945,30 @@ packages:
resolution: {integrity: sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==}
engines: {node: '>=6.9.0'}
+ '@babel/helper-module-imports@7.24.7':
+ resolution: {integrity: sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-module-imports@7.27.1':
+ resolution: {integrity: sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==}
+ engines: {node: '>=6.9.0'}
+
'@babel/helper-module-imports@7.28.6':
resolution: {integrity: sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==}
engines: {node: '>=6.9.0'}
+ '@babel/helper-module-transforms@7.25.2':
+ resolution: {integrity: sha512-BjyRAbix6j/wv83ftcVJmBt72QtHI56C7JXZoG2xATiLpmoC7dpd8WnkikExHDVPpi/3qCmO6WY1EaXOluiecQ==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0
+
+ '@babel/helper-module-transforms@7.28.3':
+ resolution: {integrity: sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0
+
'@babel/helper-module-transforms@7.28.6':
resolution: {integrity: sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==}
engines: {node: '>=6.9.0'}
@@ -935,6 +995,10 @@ packages:
peerDependencies:
'@babel/core': ^7.0.0
+ '@babel/helper-simple-access@7.24.7':
+ resolution: {integrity: sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==}
+ engines: {node: '>=6.9.0'}
+
'@babel/helper-skip-transparent-expression-wrappers@7.27.1':
resolution: {integrity: sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==}
engines: {node: '>=6.9.0'}
@@ -947,6 +1011,10 @@ packages:
resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==}
engines: {node: '>=6.9.0'}
+ '@babel/helper-validator-option@7.24.8':
+ resolution: {integrity: sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q==}
+ engines: {node: '>=6.9.0'}
+
'@babel/helper-validator-option@7.27.1':
resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==}
engines: {node: '>=6.9.0'}
@@ -955,10 +1023,23 @@ packages:
resolution: {integrity: sha512-z+PwLziMNBeSQJonizz2AGnndLsP2DeGHIxDAn+wdHOGuo4Fo1x1HBPPXeE9TAOPHNNWQKCSlA2VZyYyyibDnQ==}
engines: {node: '>=6.9.0'}
+ '@babel/helpers@7.25.0':
+ resolution: {integrity: sha512-MjgLZ42aCm0oGjJj8CtSM3DB8NOOf8h2l7DCTePJs29u+v7yO/RBX9nShlKMgFnRks/Q4tBAe7Hxnov9VkGwLw==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helpers@7.28.4':
+ resolution: {integrity: sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==}
+ engines: {node: '>=6.9.0'}
+
'@babel/helpers@7.28.6':
resolution: {integrity: sha512-xOBvwq86HHdB7WUDTfKfT/Vuxh7gElQ+Sfti2Cy6yIWNW05P8iUslOVcZ4/sKbE+/jQaukQAdz/gf3724kYdqw==}
engines: {node: '>=6.9.0'}
+ '@babel/parser@7.28.5':
+ resolution: {integrity: sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==}
+ engines: {node: '>=6.0.0'}
+ hasBin: true
+
'@babel/parser@7.28.6':
resolution: {integrity: sha512-TeR9zWR18BvbfPmGbLampPMW+uW1NZnJlRuuHso8i87QZNq2JRF9i6RgxRqtEq+wQGsS19NNTWr2duhnE49mfQ==}
engines: {node: '>=6.0.0'}
@@ -1352,6 +1433,14 @@ packages:
peerDependencies:
'@babel/core': ^7.0.0-0 || ^8.0.0-0 <8.0.0
+ '@babel/runtime@7.25.0':
+ resolution: {integrity: sha512-7dRy4DwXwtzBrPbZflqxnvfxLF8kdZXPkhymtDeFoFqE6ldzjQFgYTtYIFARcLEYDrqfBfYcZt1WqFxRoyC9Rw==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/runtime@7.28.4':
+ resolution: {integrity: sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==}
+ engines: {node: '>=6.9.0'}
+
'@babel/runtime@7.28.6':
resolution: {integrity: sha512-05WQkdpL9COIMz4LjTxGpPNCdlpyimKppYNoJ5Di5EUObifl8t4tuLuUBBZEpoLYOmfvIWrsp9fCl0HoPRVTdA==}
engines: {node: '>=6.9.0'}
@@ -1360,10 +1449,26 @@ packages:
resolution: {integrity: sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g==}
engines: {node: '>=6.9.0'}
+ '@babel/template@7.25.0':
+ resolution: {integrity: sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/template@7.27.2':
+ resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==}
+ engines: {node: '>=6.9.0'}
+
'@babel/template@7.28.6':
resolution: {integrity: sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==}
engines: {node: '>=6.9.0'}
+ '@babel/traverse@7.25.2':
+ resolution: {integrity: sha512-s4/r+a7xTnny2O6FcZzqgT6nE4/GHEdcqj4qAeglbUOh0TeglEfmNJFAd/OLoVtGd6ZhAO8GCVvCNUO5t/VJVQ==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/traverse@7.28.5':
+ resolution: {integrity: sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==}
+ engines: {node: '>=6.9.0'}
+
'@babel/traverse@7.28.6':
resolution: {integrity: sha512-fgWX62k02qtjqdSNTAGxmKYY/7FSL9WAS1o2Hu5+I5m9T0yxZzr4cnrfXQ/MX0rIifthCSs6FKTlzYbJcPtMNg==}
engines: {node: '>=6.9.0'}
@@ -1372,6 +1477,10 @@ packages:
resolution: {integrity: sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==}
engines: {node: '>=6.9.0'}
+ '@babel/types@7.28.5':
+ resolution: {integrity: sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==}
+ engines: {node: '>=6.9.0'}
+
'@babel/types@7.28.6':
resolution: {integrity: sha512-0ZrskXVEHSWIqZM/sQZ4EV3jZJXRkio/WCxaqKZP1g//CEWEPSfeZFcms4XeKBCHU0ZKnIkdJeU/kF+eRp5lBg==}
engines: {node: '>=6.9.0'}
@@ -1555,6 +1664,12 @@ packages:
engines: {node: '>=4'}
deprecated: Support for this package will stop 2025-12-31
+ '@esbuild/aix-ppc64@0.25.0':
+ resolution: {integrity: sha512-O7vun9Sf8DFjH2UtqK8Ku3LkquL9SZL8OLY1T5NZkA34+wG3OQF7cl4Ql8vdNzM6fzBbYfLaiRLIOZ+2FOCgBQ==}
+ engines: {node: '>=18'}
+ cpu: [ppc64]
+ os: [aix]
+
'@esbuild/aix-ppc64@0.25.11':
resolution: {integrity: sha512-Xt1dOL13m8u0WE8iplx9Ibbm+hFAO0GsU2P34UNoDGvZYkY8ifSiy6Zuc1lYxfG7svWE2fzqCUmFp5HCn51gJg==}
engines: {node: '>=18'}
@@ -1567,6 +1682,12 @@ packages:
cpu: [ppc64]
os: [aix]
+ '@esbuild/android-arm64@0.25.0':
+ resolution: {integrity: sha512-grvv8WncGjDSyUBjN9yHXNt+cq0snxXbDxy5pJtzMKGmmpPxeAmAhWxXI+01lU5rwZomDgD3kJwulEnhTRUd6g==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [android]
+
'@esbuild/android-arm64@0.25.11':
resolution: {integrity: sha512-9slpyFBc4FPPz48+f6jyiXOx/Y4v34TUeDDXJpZqAWQn/08lKGeD8aDp9TMn9jDz2CiEuHwfhRmGBvpnd/PWIQ==}
engines: {node: '>=18'}
@@ -1579,6 +1700,12 @@ packages:
cpu: [arm64]
os: [android]
+ '@esbuild/android-arm@0.25.0':
+ resolution: {integrity: sha512-PTyWCYYiU0+1eJKmw21lWtC+d08JDZPQ5g+kFyxP0V+es6VPPSUhM6zk8iImp2jbV6GwjX4pap0JFbUQN65X1g==}
+ engines: {node: '>=18'}
+ cpu: [arm]
+ os: [android]
+
'@esbuild/android-arm@0.25.11':
resolution: {integrity: sha512-uoa7dU+Dt3HYsethkJ1k6Z9YdcHjTrSb5NUy66ZfZaSV8hEYGD5ZHbEMXnqLFlbBflLsl89Zke7CAdDJ4JI+Gg==}
engines: {node: '>=18'}
@@ -1591,6 +1718,12 @@ packages:
cpu: [arm]
os: [android]
+ '@esbuild/android-x64@0.25.0':
+ resolution: {integrity: sha512-m/ix7SfKG5buCnxasr52+LI78SQ+wgdENi9CqyCXwjVR2X4Jkz+BpC3le3AoBPYTC9NHklwngVXvbJ9/Akhrfg==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [android]
+
'@esbuild/android-x64@0.25.11':
resolution: {integrity: sha512-Sgiab4xBjPU1QoPEIqS3Xx+R2lezu0LKIEcYe6pftr56PqPygbB7+szVnzoShbx64MUupqoE0KyRlN7gezbl8g==}
engines: {node: '>=18'}
@@ -1603,6 +1736,12 @@ packages:
cpu: [x64]
os: [android]
+ '@esbuild/darwin-arm64@0.25.0':
+ resolution: {integrity: sha512-mVwdUb5SRkPayVadIOI78K7aAnPamoeFR2bT5nszFUZ9P8UpK4ratOdYbZZXYSqPKMHfS1wdHCJk1P1EZpRdvw==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [darwin]
+
'@esbuild/darwin-arm64@0.25.11':
resolution: {integrity: sha512-VekY0PBCukppoQrycFxUqkCojnTQhdec0vevUL/EDOCnXd9LKWqD/bHwMPzigIJXPhC59Vd1WFIL57SKs2mg4w==}
engines: {node: '>=18'}
@@ -1615,6 +1754,12 @@ packages:
cpu: [arm64]
os: [darwin]
+ '@esbuild/darwin-x64@0.25.0':
+ resolution: {integrity: sha512-DgDaYsPWFTS4S3nWpFcMn/33ZZwAAeAFKNHNa1QN0rI4pUjgqf0f7ONmXf6d22tqTY+H9FNdgeaAa+YIFUn2Rg==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [darwin]
+
'@esbuild/darwin-x64@0.25.11':
resolution: {integrity: sha512-+hfp3yfBalNEpTGp9loYgbknjR695HkqtY3d3/JjSRUyPg/xd6q+mQqIb5qdywnDxRZykIHs3axEqU6l1+oWEQ==}
engines: {node: '>=18'}
@@ -1627,6 +1772,12 @@ packages:
cpu: [x64]
os: [darwin]
+ '@esbuild/freebsd-arm64@0.25.0':
+ resolution: {integrity: sha512-VN4ocxy6dxefN1MepBx/iD1dH5K8qNtNe227I0mnTRjry8tj5MRk4zprLEdG8WPyAPb93/e4pSgi1SoHdgOa4w==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [freebsd]
+
'@esbuild/freebsd-arm64@0.25.11':
resolution: {integrity: sha512-CmKjrnayyTJF2eVuO//uSjl/K3KsMIeYeyN7FyDBjsR3lnSJHaXlVoAK8DZa7lXWChbuOk7NjAc7ygAwrnPBhA==}
engines: {node: '>=18'}
@@ -1639,6 +1790,12 @@ packages:
cpu: [arm64]
os: [freebsd]
+ '@esbuild/freebsd-x64@0.25.0':
+ resolution: {integrity: sha512-mrSgt7lCh07FY+hDD1TxiTyIHyttn6vnjesnPoVDNmDfOmggTLXRv8Id5fNZey1gl/V2dyVK1VXXqVsQIiAk+A==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [freebsd]
+
'@esbuild/freebsd-x64@0.25.11':
resolution: {integrity: sha512-Dyq+5oscTJvMaYPvW3x3FLpi2+gSZTCE/1ffdwuM6G1ARang/mb3jvjxs0mw6n3Lsw84ocfo9CrNMqc5lTfGOw==}
engines: {node: '>=18'}
@@ -1651,6 +1808,12 @@ packages:
cpu: [x64]
os: [freebsd]
+ '@esbuild/linux-arm64@0.25.0':
+ resolution: {integrity: sha512-9QAQjTWNDM/Vk2bgBl17yWuZxZNQIF0OUUuPZRKoDtqF2k4EtYbpyiG5/Dk7nqeK6kIJWPYldkOcBqjXjrUlmg==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [linux]
+
'@esbuild/linux-arm64@0.25.11':
resolution: {integrity: sha512-Qr8AzcplUhGvdyUF08A1kHU3Vr2O88xxP0Tm8GcdVOUm25XYcMPp2YqSVHbLuXzYQMf9Bh/iKx7YPqECs6ffLA==}
engines: {node: '>=18'}
@@ -1663,6 +1826,12 @@ packages:
cpu: [arm64]
os: [linux]
+ '@esbuild/linux-arm@0.25.0':
+ resolution: {integrity: sha512-vkB3IYj2IDo3g9xX7HqhPYxVkNQe8qTK55fraQyTzTX/fxaDtXiEnavv9geOsonh2Fd2RMB+i5cbhu2zMNWJwg==}
+ engines: {node: '>=18'}
+ cpu: [arm]
+ os: [linux]
+
'@esbuild/linux-arm@0.25.11':
resolution: {integrity: sha512-TBMv6B4kCfrGJ8cUPo7vd6NECZH/8hPpBHHlYI3qzoYFvWu2AdTvZNuU/7hsbKWqu/COU7NIK12dHAAqBLLXgw==}
engines: {node: '>=18'}
@@ -1675,6 +1844,12 @@ packages:
cpu: [arm]
os: [linux]
+ '@esbuild/linux-ia32@0.25.0':
+ resolution: {integrity: sha512-43ET5bHbphBegyeqLb7I1eYn2P/JYGNmzzdidq/w0T8E2SsYL1U6un2NFROFRg1JZLTzdCoRomg8Rvf9M6W6Gg==}
+ engines: {node: '>=18'}
+ cpu: [ia32]
+ os: [linux]
+
'@esbuild/linux-ia32@0.25.11':
resolution: {integrity: sha512-TmnJg8BMGPehs5JKrCLqyWTVAvielc615jbkOirATQvWWB1NMXY77oLMzsUjRLa0+ngecEmDGqt5jiDC6bfvOw==}
engines: {node: '>=18'}
@@ -1687,6 +1862,12 @@ packages:
cpu: [ia32]
os: [linux]
+ '@esbuild/linux-loong64@0.25.0':
+ resolution: {integrity: sha512-fC95c/xyNFueMhClxJmeRIj2yrSMdDfmqJnyOY4ZqsALkDrrKJfIg5NTMSzVBr5YW1jf+l7/cndBfP3MSDpoHw==}
+ engines: {node: '>=18'}
+ cpu: [loong64]
+ os: [linux]
+
'@esbuild/linux-loong64@0.25.11':
resolution: {integrity: sha512-DIGXL2+gvDaXlaq8xruNXUJdT5tF+SBbJQKbWy/0J7OhU8gOHOzKmGIlfTTl6nHaCOoipxQbuJi7O++ldrxgMw==}
engines: {node: '>=18'}
@@ -1699,6 +1880,12 @@ packages:
cpu: [loong64]
os: [linux]
+ '@esbuild/linux-mips64el@0.25.0':
+ resolution: {integrity: sha512-nkAMFju7KDW73T1DdH7glcyIptm95a7Le8irTQNO/qtkoyypZAnjchQgooFUDQhNAy4iu08N79W4T4pMBwhPwQ==}
+ engines: {node: '>=18'}
+ cpu: [mips64el]
+ os: [linux]
+
'@esbuild/linux-mips64el@0.25.11':
resolution: {integrity: sha512-Osx1nALUJu4pU43o9OyjSCXokFkFbyzjXb6VhGIJZQ5JZi8ylCQ9/LFagolPsHtgw6himDSyb5ETSfmp4rpiKQ==}
engines: {node: '>=18'}
@@ -1711,6 +1898,12 @@ packages:
cpu: [mips64el]
os: [linux]
+ '@esbuild/linux-ppc64@0.25.0':
+ resolution: {integrity: sha512-NhyOejdhRGS8Iwv+KKR2zTq2PpysF9XqY+Zk77vQHqNbo/PwZCzB5/h7VGuREZm1fixhs4Q/qWRSi5zmAiO4Fw==}
+ engines: {node: '>=18'}
+ cpu: [ppc64]
+ os: [linux]
+
'@esbuild/linux-ppc64@0.25.11':
resolution: {integrity: sha512-nbLFgsQQEsBa8XSgSTSlrnBSrpoWh7ioFDUmwo158gIm5NNP+17IYmNWzaIzWmgCxq56vfr34xGkOcZ7jX6CPw==}
engines: {node: '>=18'}
@@ -1723,6 +1916,12 @@ packages:
cpu: [ppc64]
os: [linux]
+ '@esbuild/linux-riscv64@0.25.0':
+ resolution: {integrity: sha512-5S/rbP5OY+GHLC5qXp1y/Mx//e92L1YDqkiBbO9TQOvuFXM+iDqUNG5XopAnXoRH3FjIUDkeGcY1cgNvnXp/kA==}
+ engines: {node: '>=18'}
+ cpu: [riscv64]
+ os: [linux]
+
'@esbuild/linux-riscv64@0.25.11':
resolution: {integrity: sha512-HfyAmqZi9uBAbgKYP1yGuI7tSREXwIb438q0nqvlpxAOs3XnZ8RsisRfmVsgV486NdjD7Mw2UrFSw51lzUk1ww==}
engines: {node: '>=18'}
@@ -1735,6 +1934,12 @@ packages:
cpu: [riscv64]
os: [linux]
+ '@esbuild/linux-s390x@0.25.0':
+ resolution: {integrity: sha512-XM2BFsEBz0Fw37V0zU4CXfcfuACMrppsMFKdYY2WuTS3yi8O1nFOhil/xhKTmE1nPmVyvQJjJivgDT+xh8pXJA==}
+ engines: {node: '>=18'}
+ cpu: [s390x]
+ os: [linux]
+
'@esbuild/linux-s390x@0.25.11':
resolution: {integrity: sha512-HjLqVgSSYnVXRisyfmzsH6mXqyvj0SA7pG5g+9W7ESgwA70AXYNpfKBqh1KbTxmQVaYxpzA/SvlB9oclGPbApw==}
engines: {node: '>=18'}
@@ -1747,6 +1952,12 @@ packages:
cpu: [s390x]
os: [linux]
+ '@esbuild/linux-x64@0.25.0':
+ resolution: {integrity: sha512-9yl91rHw/cpwMCNytUDxwj2XjFpxML0y9HAOH9pNVQDpQrBxHy01Dx+vaMu0N1CKa/RzBD2hB4u//nfc+Sd3Cw==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [linux]
+
'@esbuild/linux-x64@0.25.11':
resolution: {integrity: sha512-HSFAT4+WYjIhrHxKBwGmOOSpphjYkcswF449j6EjsjbinTZbp8PJtjsVK1XFJStdzXdy/jaddAep2FGY+wyFAQ==}
engines: {node: '>=18'}
@@ -1759,6 +1970,12 @@ packages:
cpu: [x64]
os: [linux]
+ '@esbuild/netbsd-arm64@0.25.0':
+ resolution: {integrity: sha512-RuG4PSMPFfrkH6UwCAqBzauBWTygTvb1nxWasEJooGSJ/NwRw7b2HOwyRTQIU97Hq37l3npXoZGYMy3b3xYvPw==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [netbsd]
+
'@esbuild/netbsd-arm64@0.25.11':
resolution: {integrity: sha512-hr9Oxj1Fa4r04dNpWr3P8QKVVsjQhqrMSUzZzf+LZcYjZNqhA3IAfPQdEh1FLVUJSiu6sgAwp3OmwBfbFgG2Xg==}
engines: {node: '>=18'}
@@ -1771,6 +1988,12 @@ packages:
cpu: [arm64]
os: [netbsd]
+ '@esbuild/netbsd-x64@0.25.0':
+ resolution: {integrity: sha512-jl+qisSB5jk01N5f7sPCsBENCOlPiS/xptD5yxOx2oqQfyourJwIKLRA2yqWdifj3owQZCL2sn6o08dBzZGQzA==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [netbsd]
+
'@esbuild/netbsd-x64@0.25.11':
resolution: {integrity: sha512-u7tKA+qbzBydyj0vgpu+5h5AeudxOAGncb8N6C9Kh1N4n7wU1Xw1JDApsRjpShRpXRQlJLb9wY28ELpwdPcZ7A==}
engines: {node: '>=18'}
@@ -1783,6 +2006,12 @@ packages:
cpu: [x64]
os: [netbsd]
+ '@esbuild/openbsd-arm64@0.25.0':
+ resolution: {integrity: sha512-21sUNbq2r84YE+SJDfaQRvdgznTD8Xc0oc3p3iW/a1EVWeNj/SdUCbm5U0itZPQYRuRTW20fPMWMpcrciH2EJw==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [openbsd]
+
'@esbuild/openbsd-arm64@0.25.11':
resolution: {integrity: sha512-Qq6YHhayieor3DxFOoYM1q0q1uMFYb7cSpLD2qzDSvK1NAvqFi8Xgivv0cFC6J+hWVw2teCYltyy9/m/14ryHg==}
engines: {node: '>=18'}
@@ -1795,6 +2024,12 @@ packages:
cpu: [arm64]
os: [openbsd]
+ '@esbuild/openbsd-x64@0.25.0':
+ resolution: {integrity: sha512-2gwwriSMPcCFRlPlKx3zLQhfN/2WjJ2NSlg5TKLQOJdV0mSxIcYNTMhk3H3ulL/cak+Xj0lY1Ym9ysDV1igceg==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [openbsd]
+
'@esbuild/openbsd-x64@0.25.11':
resolution: {integrity: sha512-CN+7c++kkbrckTOz5hrehxWN7uIhFFlmS/hqziSFVWpAzpWrQoAG4chH+nN3Be+Kzv/uuo7zhX716x3Sn2Jduw==}
engines: {node: '>=18'}
@@ -1819,6 +2054,12 @@ packages:
cpu: [arm64]
os: [openharmony]
+ '@esbuild/sunos-x64@0.25.0':
+ resolution: {integrity: sha512-bxI7ThgLzPrPz484/S9jLlvUAHYMzy6I0XiU1ZMeAEOBcS0VePBFxh1JjTQt3Xiat5b6Oh4x7UC7IwKQKIJRIg==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [sunos]
+
'@esbuild/sunos-x64@0.25.11':
resolution: {integrity: sha512-nq2xdYaWxyg9DcIyXkZhcYulC6pQ2FuCgem3LI92IwMgIZ69KHeY8T4Y88pcwoLIjbed8n36CyKoYRDygNSGhA==}
engines: {node: '>=18'}
@@ -1831,6 +2072,12 @@ packages:
cpu: [x64]
os: [sunos]
+ '@esbuild/win32-arm64@0.25.0':
+ resolution: {integrity: sha512-ZUAc2YK6JW89xTbXvftxdnYy3m4iHIkDtK3CLce8wg8M2L+YZhIvO1DKpxrd0Yr59AeNNkTiic9YLf6FTtXWMw==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [win32]
+
'@esbuild/win32-arm64@0.25.11':
resolution: {integrity: sha512-3XxECOWJq1qMZ3MN8srCJ/QfoLpL+VaxD/WfNRm1O3B4+AZ/BnLVgFbUV3eiRYDMXetciH16dwPbbHqwe1uU0Q==}
engines: {node: '>=18'}
@@ -1843,6 +2090,12 @@ packages:
cpu: [arm64]
os: [win32]
+ '@esbuild/win32-ia32@0.25.0':
+ resolution: {integrity: sha512-eSNxISBu8XweVEWG31/JzjkIGbGIJN/TrRoiSVZwZ6pkC6VX4Im/WV2cz559/TXLcYbcrDN8JtKgd9DJVIo8GA==}
+ engines: {node: '>=18'}
+ cpu: [ia32]
+ os: [win32]
+
'@esbuild/win32-ia32@0.25.11':
resolution: {integrity: sha512-3ukss6gb9XZ8TlRyJlgLn17ecsK4NSQTmdIXRASVsiS2sQ6zPPZklNJT5GR5tE/MUarymmy8kCEf5xPCNCqVOA==}
engines: {node: '>=18'}
@@ -1855,6 +2108,12 @@ packages:
cpu: [ia32]
os: [win32]
+ '@esbuild/win32-x64@0.25.0':
+ resolution: {integrity: sha512-ZENoHJBxA20C2zFzh6AI4fT6RraMzjYw4xKWemRTRmRVtN9c5DcH9r/f2ihEkMjOW5eGgrwCslG/+Y/3bL+DHQ==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [win32]
+
'@esbuild/win32-x64@0.25.11':
resolution: {integrity: sha512-D7Hpz6A2L4hzsRpPaCYkQnGOotdUpDzSGRIv9I+1ITdHROSFUWW95ZPZWQmGka1Fg7W3zFJowyn9WGwMJ0+KPA==}
engines: {node: '>=18'}
@@ -1867,6 +2126,12 @@ packages:
cpu: [x64]
os: [win32]
+ '@eslint-community/eslint-utils@4.9.0':
+ resolution: {integrity: sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ peerDependencies:
+ eslint: ^6.0.0 || ^7.0.0 || >=8.0.0
+
'@eslint-community/eslint-utils@4.9.1':
resolution: {integrity: sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
@@ -1889,8 +2154,8 @@ packages:
resolution: {integrity: sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
- '@eslint/core@1.1.0':
- resolution: {integrity: sha512-/nr9K9wkr3P1EzFTdFdMoLuo1PmIxjmwvPozwoSodjNBdefGujXQUF93u1DDZpEaTuDvMsIQddsd35BwtrW9Xw==}
+ '@eslint/core@1.1.1':
+ resolution: {integrity: sha512-QUPblTtE51/7/Zhfv8BDwO0qkkzQL7P/aWWbqcf4xWLEYn1oKjdO0gglQBB4GAsu7u6wjijbCmzsUTy6mnk6oQ==}
engines: {node: ^20.19.0 || ^22.13.0 || >=24}
'@eslint/eslintrc@3.3.3':
@@ -1913,8 +2178,8 @@ packages:
resolution: {integrity: sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
- '@eslint/plugin-kit@0.6.0':
- resolution: {integrity: sha512-bIZEUzOI1jkhviX2cp5vNyXQc6olzb2ohewQubuYlMXZ2Q/XjBO0x0XhGPvc9fjSIiUN0vw+0hq53BJ4eQSJKQ==}
+ '@eslint/plugin-kit@0.6.1':
+ resolution: {integrity: sha512-iH1B076HoAshH1mLpHMgwdGeTs0CYwL0SPMkGuSebZrwBp16v415e9NZXg2jtrqPVQjf6IANe2Vtlr5KswtcZQ==}
engines: {node: ^20.19.0 || ^22.13.0 || >=24}
'@exodus/bytes@1.8.0':
@@ -2390,6 +2655,12 @@ packages:
'@jridgewell/source-map@0.3.11':
resolution: {integrity: sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==}
+ '@jridgewell/source-map@0.3.6':
+ resolution: {integrity: sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==}
+
+ '@jridgewell/sourcemap-codec@1.5.0':
+ resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==}
+
'@jridgewell/sourcemap-codec@1.5.5':
resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==}
@@ -3207,51 +3478,101 @@ packages:
rollup:
optional: true
+ '@rollup/rollup-android-arm-eabi@4.40.0':
+ resolution: {integrity: sha512-+Fbls/diZ0RDerhE8kyC6hjADCXA1K4yVNlH0EYfd2XjyH0UGgzaQ8MlT0pCXAThfxv3QUAczHaL+qSv1E4/Cg==}
+ cpu: [arm]
+ os: [android]
+
'@rollup/rollup-android-arm-eabi@4.52.5':
resolution: {integrity: sha512-8c1vW4ocv3UOMp9K+gToY5zL2XiiVw3k7f1ksf4yO1FlDFQ1C2u72iACFnSOceJFsWskc2WZNqeRhFRPzv+wtQ==}
cpu: [arm]
os: [android]
+ '@rollup/rollup-android-arm64@4.40.0':
+ resolution: {integrity: sha512-PPA6aEEsTPRz+/4xxAmaoWDqh67N7wFbgFUJGMnanCFs0TV99M0M8QhhaSCks+n6EbQoFvLQgYOGXxlMGQe/6w==}
+ cpu: [arm64]
+ os: [android]
+
'@rollup/rollup-android-arm64@4.52.5':
resolution: {integrity: sha512-mQGfsIEFcu21mvqkEKKu2dYmtuSZOBMmAl5CFlPGLY94Vlcm+zWApK7F/eocsNzp8tKmbeBP8yXyAbx0XHsFNA==}
cpu: [arm64]
os: [android]
+ '@rollup/rollup-darwin-arm64@4.40.0':
+ resolution: {integrity: sha512-GwYOcOakYHdfnjjKwqpTGgn5a6cUX7+Ra2HeNj/GdXvO2VJOOXCiYYlRFU4CubFM67EhbmzLOmACKEfvp3J1kQ==}
+ cpu: [arm64]
+ os: [darwin]
+
'@rollup/rollup-darwin-arm64@4.52.5':
resolution: {integrity: sha512-takF3CR71mCAGA+v794QUZ0b6ZSrgJkArC+gUiG6LB6TQty9T0Mqh3m2ImRBOxS2IeYBo4lKWIieSvnEk2OQWA==}
cpu: [arm64]
os: [darwin]
+ '@rollup/rollup-darwin-x64@4.40.0':
+ resolution: {integrity: sha512-CoLEGJ+2eheqD9KBSxmma6ld01czS52Iw0e2qMZNpPDlf7Z9mj8xmMemxEucinev4LgHalDPczMyxzbq+Q+EtA==}
+ cpu: [x64]
+ os: [darwin]
+
'@rollup/rollup-darwin-x64@4.52.5':
resolution: {integrity: sha512-W901Pla8Ya95WpxDn//VF9K9u2JbocwV/v75TE0YIHNTbhqUTv9w4VuQ9MaWlNOkkEfFwkdNhXgcLqPSmHy0fA==}
cpu: [x64]
os: [darwin]
+ '@rollup/rollup-freebsd-arm64@4.40.0':
+ resolution: {integrity: sha512-r7yGiS4HN/kibvESzmrOB/PxKMhPTlz+FcGvoUIKYoTyGd5toHp48g1uZy1o1xQvybwwpqpe010JrcGG2s5nkg==}
+ cpu: [arm64]
+ os: [freebsd]
+
'@rollup/rollup-freebsd-arm64@4.52.5':
resolution: {integrity: sha512-QofO7i7JycsYOWxe0GFqhLmF6l1TqBswJMvICnRUjqCx8b47MTo46W8AoeQwiokAx3zVryVnxtBMcGcnX12LvA==}
cpu: [arm64]
os: [freebsd]
+ '@rollup/rollup-freebsd-x64@4.40.0':
+ resolution: {integrity: sha512-mVDxzlf0oLzV3oZOr0SMJ0lSDd3xC4CmnWJ8Val8isp9jRGl5Dq//LLDSPFrasS7pSm6m5xAcKaw3sHXhBjoRw==}
+ cpu: [x64]
+ os: [freebsd]
+
'@rollup/rollup-freebsd-x64@4.52.5':
resolution: {integrity: sha512-jr21b/99ew8ujZubPo9skbrItHEIE50WdV86cdSoRkKtmWa+DDr6fu2c/xyRT0F/WazZpam6kk7IHBerSL7LDQ==}
cpu: [x64]
os: [freebsd]
+ '@rollup/rollup-linux-arm-gnueabihf@4.40.0':
+ resolution: {integrity: sha512-y/qUMOpJxBMy8xCXD++jeu8t7kzjlOCkoxxajL58G62PJGBZVl/Gwpm7JK9+YvlB701rcQTzjUZ1JgUoPTnoQA==}
+ cpu: [arm]
+ os: [linux]
+
'@rollup/rollup-linux-arm-gnueabihf@4.52.5':
resolution: {integrity: sha512-PsNAbcyv9CcecAUagQefwX8fQn9LQ4nZkpDboBOttmyffnInRy8R8dSg6hxxl2Re5QhHBf6FYIDhIj5v982ATQ==}
cpu: [arm]
os: [linux]
+ '@rollup/rollup-linux-arm-musleabihf@4.40.0':
+ resolution: {integrity: sha512-GoCsPibtVdJFPv/BOIvBKO/XmwZLwaNWdyD8TKlXuqp0veo2sHE+A/vpMQ5iSArRUz/uaoj4h5S6Pn0+PdhRjg==}
+ cpu: [arm]
+ os: [linux]
+
'@rollup/rollup-linux-arm-musleabihf@4.52.5':
resolution: {integrity: sha512-Fw4tysRutyQc/wwkmcyoqFtJhh0u31K+Q6jYjeicsGJJ7bbEq8LwPWV/w0cnzOqR2m694/Af6hpFayLJZkG2VQ==}
cpu: [arm]
os: [linux]
+ '@rollup/rollup-linux-arm64-gnu@4.40.0':
+ resolution: {integrity: sha512-L5ZLphTjjAD9leJzSLI7rr8fNqJMlGDKlazW2tX4IUF9P7R5TMQPElpH82Q7eNIDQnQlAyiNVfRPfP2vM5Avvg==}
+ cpu: [arm64]
+ os: [linux]
+
'@rollup/rollup-linux-arm64-gnu@4.52.5':
resolution: {integrity: sha512-a+3wVnAYdQClOTlyapKmyI6BLPAFYs0JM8HRpgYZQO02rMR09ZcV9LbQB+NL6sljzG38869YqThrRnfPMCDtZg==}
cpu: [arm64]
os: [linux]
+ '@rollup/rollup-linux-arm64-musl@4.40.0':
+ resolution: {integrity: sha512-ATZvCRGCDtv1Y4gpDIXsS+wfFeFuLwVxyUBSLawjgXK2tRE6fnsQEkE4csQQYWlBlsFztRzCnBvWVfcae/1qxQ==}
+ cpu: [arm64]
+ os: [linux]
+
'@rollup/rollup-linux-arm64-musl@4.52.5':
resolution: {integrity: sha512-AvttBOMwO9Pcuuf7m9PkC1PUIKsfaAJ4AYhy944qeTJgQOqJYJ9oVl2nYgY7Rk0mkbsuOpCAYSs6wLYB2Xiw0Q==}
cpu: [arm64]
@@ -3262,31 +3583,66 @@ packages:
cpu: [loong64]
os: [linux]
+ '@rollup/rollup-linux-loongarch64-gnu@4.40.0':
+ resolution: {integrity: sha512-wG9e2XtIhd++QugU5MD9i7OnpaVb08ji3P1y/hNbxrQ3sYEelKJOq1UJ5dXczeo6Hj2rfDEL5GdtkMSVLa/AOg==}
+ cpu: [loong64]
+ os: [linux]
+
+ '@rollup/rollup-linux-powerpc64le-gnu@4.40.0':
+ resolution: {integrity: sha512-vgXfWmj0f3jAUvC7TZSU/m/cOE558ILWDzS7jBhiCAFpY2WEBn5jqgbqvmzlMjtp8KlLcBlXVD2mkTSEQE6Ixw==}
+ cpu: [ppc64]
+ os: [linux]
+
'@rollup/rollup-linux-ppc64-gnu@4.52.5':
resolution: {integrity: sha512-W/b9ZN/U9+hPQVvlGwjzi+Wy4xdoH2I8EjaCkMvzpI7wJUs8sWJ03Rq96jRnHkSrcHTpQe8h5Tg3ZzUPGauvAw==}
cpu: [ppc64]
os: [linux]
+ '@rollup/rollup-linux-riscv64-gnu@4.40.0':
+ resolution: {integrity: sha512-uJkYTugqtPZBS3Z136arevt/FsKTF/J9dEMTX/cwR7lsAW4bShzI2R0pJVw+hcBTWF4dxVckYh72Hk3/hWNKvA==}
+ cpu: [riscv64]
+ os: [linux]
+
'@rollup/rollup-linux-riscv64-gnu@4.52.5':
resolution: {integrity: sha512-sjQLr9BW7R/ZiXnQiWPkErNfLMkkWIoCz7YMn27HldKsADEKa5WYdobaa1hmN6slu9oWQbB6/jFpJ+P2IkVrmw==}
cpu: [riscv64]
os: [linux]
+ '@rollup/rollup-linux-riscv64-musl@4.40.0':
+ resolution: {integrity: sha512-rKmSj6EXQRnhSkE22+WvrqOqRtk733x3p5sWpZilhmjnkHkpeCgWsFFo0dGnUGeA+OZjRl3+VYq+HyCOEuwcxQ==}
+ cpu: [riscv64]
+ os: [linux]
+
'@rollup/rollup-linux-riscv64-musl@4.52.5':
resolution: {integrity: sha512-hq3jU/kGyjXWTvAh2awn8oHroCbrPm8JqM7RUpKjalIRWWXE01CQOf/tUNWNHjmbMHg/hmNCwc/Pz3k1T/j/Lg==}
cpu: [riscv64]
os: [linux]
+ '@rollup/rollup-linux-s390x-gnu@4.40.0':
+ resolution: {integrity: sha512-SpnYlAfKPOoVsQqmTFJ0usx0z84bzGOS9anAC0AZ3rdSo3snecihbhFTlJZ8XMwzqAcodjFU4+/SM311dqE5Sw==}
+ cpu: [s390x]
+ os: [linux]
+
'@rollup/rollup-linux-s390x-gnu@4.52.5':
resolution: {integrity: sha512-gn8kHOrku8D4NGHMK1Y7NA7INQTRdVOntt1OCYypZPRt6skGbddska44K8iocdpxHTMMNui5oH4elPH4QOLrFQ==}
cpu: [s390x]
os: [linux]
+ '@rollup/rollup-linux-x64-gnu@4.40.0':
+ resolution: {integrity: sha512-RcDGMtqF9EFN8i2RYN2W+64CdHruJ5rPqrlYw+cgM3uOVPSsnAQps7cpjXe9be/yDp8UC7VLoCoKC8J3Kn2FkQ==}
+ cpu: [x64]
+ os: [linux]
+
'@rollup/rollup-linux-x64-gnu@4.52.5':
resolution: {integrity: sha512-hXGLYpdhiNElzN770+H2nlx+jRog8TyynpTVzdlc6bndktjKWyZyiCsuDAlpd+j+W+WNqfcyAWz9HxxIGfZm1Q==}
cpu: [x64]
os: [linux]
+ '@rollup/rollup-linux-x64-musl@4.40.0':
+ resolution: {integrity: sha512-HZvjpiUmSNx5zFgwtQAV1GaGazT2RWvqeDi0hV+AtC8unqqDSsaFjPxfsO6qPtKRRg25SisACWnJ37Yio8ttaw==}
+ cpu: [x64]
+ os: [linux]
+
'@rollup/rollup-linux-x64-musl@4.52.5':
resolution: {integrity: sha512-arCGIcuNKjBoKAXD+y7XomR9gY6Mw7HnFBv5Rw7wQRvwYLR7gBAgV7Mb2QTyjXfTveBNFAtPt46/36vV9STLNg==}
cpu: [x64]
@@ -3297,11 +3653,21 @@ packages:
cpu: [arm64]
os: [openharmony]
+ '@rollup/rollup-win32-arm64-msvc@4.40.0':
+ resolution: {integrity: sha512-UtZQQI5k/b8d7d3i9AZmA/t+Q4tk3hOC0tMOMSq2GlMYOfxbesxG4mJSeDp0EHs30N9bsfwUvs3zF4v/RzOeTQ==}
+ cpu: [arm64]
+ os: [win32]
+
'@rollup/rollup-win32-arm64-msvc@4.52.5':
resolution: {integrity: sha512-w0cDWVR6MlTstla1cIfOGyl8+qb93FlAVutcor14Gf5Md5ap5ySfQ7R9S/NjNaMLSFdUnKGEasmVnu3lCMqB7w==}
cpu: [arm64]
os: [win32]
+ '@rollup/rollup-win32-ia32-msvc@4.40.0':
+ resolution: {integrity: sha512-+m03kvI2f5syIqHXCZLPVYplP8pQch9JHyXKZ3AGMKlg8dCyr2PKHjwRLiW53LTrN/Nc3EqHOKxUxzoSPdKddA==}
+ cpu: [ia32]
+ os: [win32]
+
'@rollup/rollup-win32-ia32-msvc@4.52.5':
resolution: {integrity: sha512-Aufdpzp7DpOTULJCuvzqcItSGDH73pF3ko/f+ckJhxQyHtp67rHw3HMNxoIdDMUITJESNE6a8uh4Lo4SLouOUg==}
cpu: [ia32]
@@ -3312,6 +3678,11 @@ packages:
cpu: [x64]
os: [win32]
+ '@rollup/rollup-win32-x64-msvc@4.40.0':
+ resolution: {integrity: sha512-lpPE1cLfP5oPzVjKMx10pgBmKELQnFJXHgvtHCtuJWOv8MxqdEIMNtgHgBFf7Ea2/7EuVwa9fodWUfXAlXZLZQ==}
+ cpu: [x64]
+ os: [win32]
+
'@rollup/rollup-win32-x64-msvc@4.52.5':
resolution: {integrity: sha512-TAcgQh2sSkykPRWLrdyy2AiceMckNf5loITqXxFI5VuQjS5tSuw3WlwdN8qv8vzjLAUTvYaH/mVjSFpbkFbpTg==}
cpu: [x64]
@@ -3482,8 +3853,8 @@ packages:
peerDependencies:
solid-js: ^1.6.12
- '@solid-primitives/map@0.7.3':
- resolution: {integrity: sha512-2Ach52ANEWYUKFtlrKWljrCtAHJwXnfNEvNfQwA+80nS/Bdw9fSumWQiRJNoDQLN0k5iEggWRBHd6vC/uqYKcA==}
+ '@solid-primitives/map@0.7.2':
+ resolution: {integrity: sha512-sXK/rS68B4oq3XXNyLrzVhLtT1pnimmMUahd2FqhtYUuyQsCfnW058ptO1s+lWc2k8F/3zQSNVkZ2ifJjlcNbQ==}
peerDependencies:
solid-js: ^1.6.12
@@ -3552,8 +3923,13 @@ packages:
peerDependencies:
solid-js: ^1.6.12
- '@solid-primitives/trigger@1.2.3':
- resolution: {integrity: sha512-Za2JebEiDyfamjmDwRaESYqBBYOlgYGzB8kHYH0QrkXyLf2qNADlKdGN+z3vWSLCTDcKxChS43Kssjuc0OZhng==}
+ '@solid-primitives/trigger@1.2.2':
+ resolution: {integrity: sha512-IWoptVc0SWYgmpBPpCMehS5b07+tpFcvw15tOQ3QbXedSYn6KP8zCjPkHNzMxcOvOicTneleeZDP7lqmz+PQ6g==}
+ peerDependencies:
+ solid-js: ^1.6.12
+
+ '@solid-primitives/utils@6.3.2':
+ resolution: {integrity: sha512-hZ/M/qr25QOCcwDPOHtGjxTD8w2mNyVAYvcfgwzBHq2RwNqHNdDNsMZYap20+ruRwW4A3Cdkczyoz0TSxLCAPQ==}
peerDependencies:
solid-js: ^1.6.12
@@ -4053,6 +4429,9 @@ packages:
'@types/estree@0.0.39':
resolution: {integrity: sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==}
+ '@types/estree@1.0.7':
+ resolution: {integrity: sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==}
+
'@types/estree@1.0.8':
resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==}
@@ -4412,6 +4791,11 @@ packages:
resolution: {integrity: sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==}
engines: {node: '>=0.4.0'}
+ acorn@8.14.0:
+ resolution: {integrity: sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==}
+ engines: {node: '>=0.4.0'}
+ hasBin: true
+
acorn@8.15.0:
resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==}
engines: {node: '>=0.4.0'}
@@ -4429,6 +4813,10 @@ packages:
resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==}
engines: {node: '>= 6.0.0'}
+ agent-base@7.1.1:
+ resolution: {integrity: sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==}
+ engines: {node: '>= 14'}
+
agent-base@7.1.4:
resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==}
engines: {node: '>= 14'}
@@ -4609,6 +4997,9 @@ packages:
ast-v8-to-istanbul@0.3.12:
resolution: {integrity: sha512-BRRC8VRZY2R4Z4lFIL35MwNXmwVqBityvOIwETtsCSwvjl0IdgFsy9NhdaA6j74nUdtJJlIypeRhpDam19Wq3g==}
+ ast-v8-to-istanbul@0.3.8:
+ resolution: {integrity: sha512-szgSZqUxI5T8mLKvS7WTjF9is+MVbOeLADU73IseOcrqhxr/VAvy6wfoVE39KnKzA7JRhjF5eUagNlHwvZPlKQ==}
+
astral-regex@2.0.0:
resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==}
engines: {node: '>=8'}
@@ -4626,6 +5017,9 @@ packages:
async@2.6.4:
resolution: {integrity: sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==}
+ async@3.2.5:
+ resolution: {integrity: sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==}
+
async@3.2.6:
resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==}
@@ -4754,7 +5148,6 @@ packages:
basic-ftp@5.0.5:
resolution: {integrity: sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg==}
engines: {node: '>=10.0.0'}
- deprecated: Security vulnerability fixed in 5.2.0, please upgrade
bcrypt-pbkdf@1.0.2:
resolution: {integrity: sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==}
@@ -4791,6 +5184,10 @@ packages:
bl@4.1.0:
resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==}
+ body-parser@1.20.2:
+ resolution: {integrity: sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==}
+ engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16}
+
body-parser@1.20.3:
resolution: {integrity: sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==}
engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16}
@@ -4820,6 +5217,11 @@ packages:
resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==}
engines: {node: '>=8'}
+ browserslist@4.28.0:
+ resolution: {integrity: sha512-tbydkR/CxfMwelN0vwdP/pLkDwyAASZ+VfWm4EOwlB6SWhx1sYnWLqo8N5j0rAzPfzfRaxt0mM/4wPU/Su84RQ==}
+ engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7}
+ hasBin: true
+
browserslist@4.28.1:
resolution: {integrity: sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==}
engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7}
@@ -4887,6 +5289,10 @@ packages:
resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==}
engines: {node: '>= 0.4'}
+ call-bind@1.0.7:
+ resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==}
+ engines: {node: '>= 0.4'}
+
call-bind@1.0.8:
resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==}
engines: {node: '>= 0.4'}
@@ -4923,6 +5329,9 @@ packages:
camelize@1.0.1:
resolution: {integrity: sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==}
+ caniuse-lite@1.0.30001762:
+ resolution: {integrity: sha512-PxZwGNvH7Ak8WX5iXzoK1KPZttBXNPuaOvI2ZYU7NrlM+d9Ov+TUvlLOBNGzVXAntMSMMlJPd+jY6ovrVjSmUw==}
+
caniuse-lite@1.0.30001778:
resolution: {integrity: sha512-PN7uxFL+ExFJO61aVmP1aIEG4i9whQd4eoSCebav62UwDyp5OHh06zN4jqKSMePVgxHifCw1QJxdRkA1Pisekg==}
@@ -5389,6 +5798,10 @@ packages:
resolution: {integrity: sha512-VqCUuhcd1iB+dsv8gxPttb5iZh/D0iubSP21g36KXdEuf6I5JiioesUVjpCdHV9MZRUfVFlvwtIUyPfxo5trtw==}
engines: {node: '>=4.8'}
+ cross-spawn@7.0.3:
+ resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==}
+ engines: {node: '>= 8'}
+
cross-spawn@7.0.6:
resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==}
engines: {node: '>= 8'}
@@ -5490,8 +5903,8 @@ packages:
supports-color:
optional: true
- debug@4.4.3:
- resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==}
+ debug@4.3.6:
+ resolution: {integrity: sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==}
engines: {node: '>=6.0'}
peerDependencies:
supports-color: '*'
@@ -5499,9 +5912,27 @@ packages:
supports-color:
optional: true
- decamelize-keys@1.1.1:
- resolution: {integrity: sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==}
- engines: {node: '>=0.10.0'}
+ debug@4.4.1:
+ resolution: {integrity: sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==}
+ engines: {node: '>=6.0'}
+ peerDependencies:
+ supports-color: '*'
+ peerDependenciesMeta:
+ supports-color:
+ optional: true
+
+ debug@4.4.3:
+ resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==}
+ engines: {node: '>=6.0'}
+ peerDependencies:
+ supports-color: '*'
+ peerDependenciesMeta:
+ supports-color:
+ optional: true
+
+ decamelize-keys@1.1.1:
+ resolution: {integrity: sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==}
+ engines: {node: '>=0.10.0'}
decamelize@1.2.0:
resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==}
@@ -5760,8 +6191,8 @@ packages:
engines: {node: '>=0.10.0'}
hasBin: true
- electron-to-chromium@1.5.302:
- resolution: {integrity: sha512-sM6HAN2LyK82IyPBpznDRqlTQAtuSaO+ShzFiWTvoMJLHyZ+Y39r8VMfHzwbU8MVBzQ4Wdn85+wlZl2TLGIlwg==}
+ electron-to-chromium@1.5.267:
+ resolution: {integrity: sha512-0Drusm6MVRXSOJpGbaSVgcQsuB4hEkMpHXaVstcPmhu5LIedxs1xNK/nIxmQIU/RPC0+1/o0AVZfBTkTNJOdUw==}
emoji-regex@8.0.0:
resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==}
@@ -5789,6 +6220,10 @@ packages:
end-of-stream@1.4.4:
resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==}
+ enhanced-resolve@5.17.1:
+ resolution: {integrity: sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==}
+ engines: {node: '>=10.13.0'}
+
enhanced-resolve@5.20.0:
resolution: {integrity: sha512-/ce7+jQ1PQ6rVXwe+jKEg5hW5ciicHwIQUagZkp6IufBoY3YDgdTTY1azVs0qoRgVmvsNB+rbjLJxDAeHHtwsQ==}
engines: {node: '>=10.13.0'}
@@ -5855,6 +6290,11 @@ packages:
es6-promise@3.3.1:
resolution: {integrity: sha512-SOp9Phqvqn7jtEUxPWdWfWoLmyt2VaJ6MpvP9Comy1MceMXqE6bxvaTu4iaxpYYPzhny28Lc+M87/c2cPK6lDg==}
+ esbuild@0.25.0:
+ resolution: {integrity: sha512-BXq5mqc8ltbaN34cDqWuYKyNhX8D/Z0J1xdtdQ8UcIIIyJyz+ZMKUt58tF3SrZ85jcfN/PZYhjR5uDQAYNVbuw==}
+ engines: {node: '>=18'}
+ hasBin: true
+
esbuild@0.25.11:
resolution: {integrity: sha512-KohQwyzrKTQmhXDW1PjCv3Tyspn9n5GcY2RTDqeORIdIJY8yKIF7sTSopFmn/wpMPW4rdPXI0UE5LJLuq3bx0Q==}
engines: {node: '>=18'}
@@ -6069,6 +6509,10 @@ packages:
fast-xml-builder@1.1.4:
resolution: {integrity: sha512-f2jhpN4Eccy0/Uz9csxh3Nu6q4ErKxf0XIsasomfOihuSUa3/xw6w8dnOtCDgEItQFJG8KyXPzQXzcODDrrbOg==}
+ fast-xml-parser@4.4.1:
+ resolution: {integrity: sha512-xkjOecfnKGkSsOwtZ5Pz7Us/T6mrbPQrq0nh+aCO5V9nk5NLWmasAHumTKjiPJPWANe+kAZ84Jc8ooJkzZ88Sw==}
+ hasBin: true
+
fast-xml-parser@4.5.3:
resolution: {integrity: sha512-RKihhV+SHsIUGXObeVy9AXiBbFwkVk7Syp8XgwN5U3JV416+Gwp/GO9i0JYKmikykgz/UHRrrV4ROuZEo/T0ig==}
hasBin: true
@@ -6087,6 +6531,14 @@ packages:
resolution: {integrity: sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==}
engines: {node: '>=0.8.0'}
+ fdir@6.4.4:
+ resolution: {integrity: sha512-1NZP+GK4GfuAv3PqKvxQRDMjdSRZjnkq7KfhlNrCNNlZ0ygQFpebfrnfnq/W7fpUnAv9aGWmY1zKx7FYL3gwhg==}
+ peerDependencies:
+ picomatch: ^3 || ^4
+ peerDependenciesMeta:
+ picomatch:
+ optional: true
+
fdir@6.5.0:
resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==}
engines: {node: '>=12.0.0'}
@@ -6107,8 +6559,8 @@ packages:
resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==}
engines: {node: '>=16.0.0'}
- filelist@1.0.6:
- resolution: {integrity: sha512-5giy2PkLYY1cP39p17Ech+2xlpTRL9HLspOfEgm0L6CwBXBTgsK5ou0JtzYuepxkaQ/tvhCFIJ5uXo0OrM2DxA==}
+ filelist@1.0.4:
+ resolution: {integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==}
filesize@10.1.6:
resolution: {integrity: sha512-sJslQKU2uM33qH5nqewAwVB2QgR6w1aMNsYUp3aN5rMRyXEwJGmZvaWzeJFNTOXWlHQyBFCWrdj3fV/fsTOX8w==}
@@ -6222,6 +6674,10 @@ packages:
resolution: {integrity: sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==}
engines: {node: '>= 0.12'}
+ form-data@4.0.0:
+ resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==}
+ engines: {node: '>= 6'}
+
form-data@4.0.4:
resolution: {integrity: sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==}
engines: {node: '>= 6'}
@@ -6372,19 +6828,16 @@ packages:
git-raw-commits@2.0.11:
resolution: {integrity: sha512-VnctFhw+xfj8Va1xtfEqCUD2XDrbAPSJx+hSrE5K7fGdjZruW7XV+QOrN7LF/RJyvspRiD2I0asWsxFp0ya26A==}
engines: {node: '>=10'}
- deprecated: This package is no longer maintained. For the JavaScript API, please use @conventional-changelog/git-client instead.
hasBin: true
git-raw-commits@5.0.0:
resolution: {integrity: sha512-I2ZXrXeOc0KrCvC7swqtIFXFN+rbjnC7b2T943tvemIOVNl+XP8YnA9UVwqFhzzLClnSA60KR/qEjLpXzs73Qg==}
engines: {node: '>=18'}
- deprecated: This package is no longer maintained. For the JavaScript API, please use @conventional-changelog/git-client instead.
hasBin: true
git-semver-tags@8.0.0:
resolution: {integrity: sha512-N7YRIklvPH3wYWAR2vysaqGLPRcpwQ0GKdlqTiVN5w1UmCdaeY3K8s6DMKRCh54DDdzyt/OAB6C8jgVtb7Y2Fg==}
engines: {node: '>=18'}
- deprecated: This package is no longer maintained. For the JavaScript API, please use @conventional-changelog/git-client instead.
hasBin: true
glob-parent@5.1.2:
@@ -6403,7 +6856,6 @@ packages:
glob@10.4.5:
resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==}
- deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me
hasBin: true
glob@13.0.6:
@@ -6412,17 +6864,16 @@ packages:
glob@7.2.3:
resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==}
- deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me
+ deprecated: Glob versions prior to v9 are no longer supported
glob@8.1.0:
resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==}
engines: {node: '>=12'}
- deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me
+ deprecated: Glob versions prior to v9 are no longer supported
glob@9.3.5:
resolution: {integrity: sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q==}
engines: {node: '>=16 || 14 >=14.17'}
- deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me
global-dirs@0.1.1:
resolution: {integrity: sha512-NknMLn7F2J7aflwFOlGdNIuCDpN3VGoSoB+aap3KABFWbHVn1TCgFC+np23J8W2BiZbjfEw3BFBycSMv1AFblg==}
@@ -6432,6 +6883,10 @@ packages:
resolution: {integrity: sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==}
engines: {node: '>=10'}
+ globals@11.12.0:
+ resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==}
+ engines: {node: '>=4'}
+
globals@14.0.0:
resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==}
engines: {node: '>=18'}
@@ -6638,6 +7093,10 @@ packages:
resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==}
engines: {node: '>= 6'}
+ https-proxy-agent@7.0.5:
+ resolution: {integrity: sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==}
+ engines: {node: '>= 14'}
+
https-proxy-agent@7.0.6:
resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==}
engines: {node: '>= 14'}
@@ -7109,6 +7568,13 @@ packages:
js-tokens@4.0.0:
resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==}
+ js-tokens@9.0.1:
+ resolution: {integrity: sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==}
+
+ js-yaml@4.1.0:
+ resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==}
+ hasBin: true
+
js-yaml@4.1.1:
resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==}
hasBin: true
@@ -7125,6 +7591,11 @@ packages:
canvas:
optional: true
+ jsesc@2.5.2:
+ resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==}
+ engines: {node: '>=4'}
+ hasBin: true
+
jsesc@3.1.0:
resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==}
engines: {node: '>=6'}
@@ -7151,7 +7622,6 @@ packages:
json-ptr@3.1.1:
resolution: {integrity: sha512-SiSJQ805W1sDUCD1+/t1/1BIrveq2Fe9HJqENxZmMCILmrPI7WhS/pePpIOx85v6/H2z1Vy7AI08GV2TzfXocg==}
- deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.
json-schema-to-ts@2.7.2:
resolution: {integrity: sha512-R1JfqKqbBR4qE8UyBR56Ms30LL62/nlhoz+1UkfI/VE7p54Awu919FZ6ZUPG8zIa3XB65usPJgr1ONVncUGSaQ==}
@@ -7174,6 +7644,9 @@ packages:
engines: {node: '>=6'}
hasBin: true
+ jsonfile@6.1.0:
+ resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==}
+
jsonfile@6.2.0:
resolution: {integrity: sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==}
@@ -7220,6 +7693,7 @@ packages:
keygrip@1.1.0:
resolution: {integrity: sha512-iYSchDJ+liQ8iwbSI2QqsQOvqv58eJCEanyJPJi+Khyu8smkcKSFUCbPwzFcL7YVtZ6eONjqRX/38caJ7QjRAQ==}
engines: {node: '>= 0.6'}
+ deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.
keyv@4.5.4:
resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==}
@@ -7777,6 +8251,10 @@ packages:
minimatch@3.1.5:
resolution: {integrity: sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==}
+ minimatch@5.1.6:
+ resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==}
+ engines: {node: '>=10'}
+
minimatch@5.1.9:
resolution: {integrity: sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw==}
engines: {node: '>=10'}
@@ -7836,6 +8314,10 @@ packages:
resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==}
engines: {node: '>=8'}
+ minipass@7.1.2:
+ resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==}
+ engines: {node: '>=16 || 14 >=14.17'}
+
minipass@7.1.3:
resolution: {integrity: sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==}
engines: {node: '>=16 || 14 >=14.17'}
@@ -8129,6 +8611,15 @@ packages:
resolution: {integrity: sha512-ofRW94Ab0T4AOh5Fk8t0h8OBWrmjb0SSB20xh1H8YnPV9EJ+f5AMoYSUQ2zgJ4Iq2HAK0I2l5/Nequ8YzFS3Hg==}
engines: {node: 4.x || >=6.0.0}
+ node-fetch@2.6.7:
+ resolution: {integrity: sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==}
+ engines: {node: 4.x || >=6.0.0}
+ peerDependencies:
+ encoding: ^0.1.0
+ peerDependenciesMeta:
+ encoding:
+ optional: true
+
node-fetch@2.7.0:
resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==}
engines: {node: 4.x || >=6.0.0}
@@ -8795,6 +9286,14 @@ packages:
resolution: {integrity: sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A==}
engines: {node: '>=8'}
+ qs@6.11.0:
+ resolution: {integrity: sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==}
+ engines: {node: '>=0.6'}
+
+ qs@6.12.3:
+ resolution: {integrity: sha512-AWJm14H1vVaO/iNZ4/hO+HyaTehuy9nRqVdkTqlJt0HWvBiBIEXFmb4C0DGeYo3Xes9rrEW+TxHsaigCbN5ICQ==}
+ engines: {node: '>=0.6'}
+
qs@6.13.0:
resolution: {integrity: sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==}
engines: {node: '>=0.6'}
@@ -8962,6 +9461,9 @@ packages:
regenerate@1.4.2:
resolution: {integrity: sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==}
+ regenerator-runtime@0.14.1:
+ resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==}
+
regexp.prototype.flags@1.5.4:
resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==}
engines: {node: '>= 0.4'}
@@ -9025,6 +9527,11 @@ packages:
resolve-pkg-maps@1.0.0:
resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==}
+ resolve@1.22.10:
+ resolution: {integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==}
+ engines: {node: '>= 0.4'}
+ hasBin: true
+
resolve@1.22.11:
resolution: {integrity: sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==}
engines: {node: '>= 0.4'}
@@ -9097,6 +9604,11 @@ packages:
engines: {node: '>=10.0.0'}
hasBin: true
+ rollup@4.40.0:
+ resolution: {integrity: sha512-Noe455xmA96nnqH5piFtLobsGbCij7Tu+tb3c1vYjNbTkfzGqXqQXG3wJaYXkRZuQ0vEYN4bhwg7QnIrqB5B+w==}
+ engines: {node: '>=18.0.0', npm: '>=8.0.0'}
+ hasBin: true
+
rollup@4.52.5:
resolution: {integrity: sha512-3GuObel8h7Kqdjt0gxkEzaifHTqLVW56Y/bjN7PSQtkKr0w3V/QYSdt6QWYtd7A1xUtYQigtdUfgj1RvWVtorw==}
engines: {node: '>=18.0.0', npm: '>=8.0.0'}
@@ -9197,6 +9709,11 @@ packages:
engines: {node: '>=10'}
hasBin: true
+ semver@7.6.3:
+ resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==}
+ engines: {node: '>=10'}
+ hasBin: true
+
semver@7.7.3:
resolution: {integrity: sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==}
engines: {node: '>=10'}
@@ -9326,6 +9843,10 @@ packages:
resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==}
engines: {node: '>= 0.4'}
+ side-channel@1.0.6:
+ resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==}
+ engines: {node: '>= 0.4'}
+
side-channel@1.1.0:
resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==}
engines: {node: '>= 0.4'}
@@ -9631,6 +10152,10 @@ packages:
resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==}
engines: {node: '>=8'}
+ strip-ansi@7.1.0:
+ resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==}
+ engines: {node: '>=12'}
+
strip-ansi@7.1.2:
resolution: {integrity: sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==}
engines: {node: '>=12'}
@@ -9667,6 +10192,9 @@ packages:
resolution: {integrity: sha512-1tB5mhVo7U+ETBKNf92xT4hrQa3pm0MZ0PQvuDnWgAAGHDsfp4lPSpiS6psrSiet87wyGPh9ft6wmhOMQ0hDiw==}
engines: {node: '>=14.16'}
+ strnum@1.0.5:
+ resolution: {integrity: sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==}
+
strnum@1.1.2:
resolution: {integrity: sha512-vrN+B7DBIoTTZjnPNewwhx6cBA/H+IS7rfW68n7XxC1y7uoiGQBxaKzqucGUgavX15dJgiGztLJ8vxuEzwqBdA==}
@@ -9762,6 +10290,10 @@ packages:
tailwindcss@4.2.1:
resolution: {integrity: sha512-/tBrSQ36vCleJkAOsy9kbNTgaxvGbyOamC30PRePTQe/o1MFwEKHQk4Cn7BNGaPtjp+PuUrByJehM1hgxfq4sw==}
+ tapable@2.2.1:
+ resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==}
+ engines: {node: '>=6'}
+
tapable@2.3.0:
resolution: {integrity: sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==}
engines: {node: '>=6'}
@@ -9782,7 +10314,6 @@ packages:
tar@6.2.1:
resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==}
engines: {node: '>=10'}
- deprecated: Old versions of tar are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me
tcp-port-used@1.0.2:
resolution: {integrity: sha512-l7ar8lLUD3XS1V2lfoJlCBaeoaWo/2xfYt81hM7VlvR4RrMVFqfmzfhLVk40hAb368uitje5gPtBRL1m/DGvLA==}
@@ -9802,8 +10333,8 @@ packages:
resolution: {integrity: sha512-G13vtMYPT/J8A4X2SjdtBTphZlrp1gKv6hZiOjw14RCWg6GbHuQBGtjlx75xLbYV/wEc0D7G5K4rxKP/cXk8Bw==}
engines: {node: '>=10'}
- terser@5.46.0:
- resolution: {integrity: sha512-jTwoImyr/QbOWFFso3YoU3ik0jBBDJ6JTOQiy/J2YxVJdZCc+5u7skhNwiOR3FQIygFqVUPHl7qbbxtjW2K3Qg==}
+ terser@5.31.3:
+ resolution: {integrity: sha512-pAfYn3NIZLyZpa83ZKigvj6Rn9c/vd5KfYGX7cN1mnzqgDcxWvrU5ZtAfIKhEXz9nRecw4z3LXkjaq96/qZqAA==}
engines: {node: '>=10'}
hasBin: true
@@ -9862,6 +10393,10 @@ packages:
resolution: {integrity: sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==}
engines: {node: '>=18'}
+ tinyglobby@0.2.13:
+ resolution: {integrity: sha512-mEwzpUgrLySlveBwEVDMKk5B57bhLPYovRfPAXD5gA/98Opn0rCDj3GtLwFvCvH5RK9uPCExUROW5NjDwvqkxw==}
+ engines: {node: '>=12.0.0'}
+
tinyglobby@0.2.15:
resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==}
engines: {node: '>=12.0.0'}
@@ -9893,6 +10428,10 @@ packages:
resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==}
engines: {node: '>=0.6.0'}
+ tmp@0.2.3:
+ resolution: {integrity: sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==}
+ engines: {node: '>=14.14'}
+
tmp@0.2.5:
resolution: {integrity: sha512-voyz6MApa1rQGUxT3E+BK7/ROe8itEx7vD8/HEvt4xwXucvQ5G5oeEiHkmHZJuBO21RpOf+YYm9MOivj709jow==}
engines: {node: '>=14.14'}
@@ -10003,6 +10542,9 @@ packages:
resolution: {integrity: sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==}
engines: {node: '>=6'}
+ tslib@2.6.3:
+ resolution: {integrity: sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==}
+
tslib@2.8.1:
resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==}
@@ -10833,12 +11375,20 @@ packages:
zod@3.23.8:
resolution: {integrity: sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==}
+ zod@3.25.76:
+ resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==}
+
snapshots:
'@acemir/cssom@0.9.30': {}
'@adobe/css-tools@4.4.4': {}
+ '@ampproject/remapping@2.3.0':
+ dependencies:
+ '@jridgewell/gen-mapping': 0.3.13
+ '@jridgewell/trace-mapping': 0.3.31
+
'@anatine/zod-openapi@1.14.2(openapi3-ts@2.0.2)(zod@3.23.8)':
dependencies:
openapi3-ts: 2.0.2
@@ -10857,7 +11407,7 @@ snapshots:
'@jsdevtools/ono': 7.1.3
'@types/json-schema': 7.0.15
call-me-maybe: 1.0.2
- js-yaml: 4.1.1
+ js-yaml: 4.1.0
'@asamuzakjp/css-color@4.1.1':
dependencies:
@@ -10877,6 +11427,12 @@ snapshots:
'@asamuzakjp/nwsapi@2.3.9': {}
+ '@babel/code-frame@7.27.1':
+ dependencies:
+ '@babel/helper-validator-identifier': 7.28.5
+ js-tokens: 4.0.0
+ picocolors: 1.1.1
+
'@babel/code-frame@7.28.6':
dependencies:
'@babel/helper-validator-identifier': 7.28.5
@@ -10889,10 +11445,54 @@ snapshots:
js-tokens: 4.0.0
picocolors: 1.1.1
+ '@babel/compat-data@7.25.2': {}
+
+ '@babel/compat-data@7.28.5': {}
+
'@babel/compat-data@7.28.6': {}
'@babel/compat-data@7.29.0': {}
+ '@babel/core@7.25.2':
+ dependencies:
+ '@ampproject/remapping': 2.3.0
+ '@babel/code-frame': 7.27.1
+ '@babel/generator': 7.25.0
+ '@babel/helper-compilation-targets': 7.25.2
+ '@babel/helper-module-transforms': 7.25.2(@babel/core@7.25.2)
+ '@babel/helpers': 7.25.0
+ '@babel/parser': 7.28.5
+ '@babel/template': 7.25.0
+ '@babel/traverse': 7.25.2
+ '@babel/types': 7.28.5
+ convert-source-map: 2.0.0
+ debug: 4.4.3
+ gensync: 1.0.0-beta.2
+ json5: 2.2.3
+ semver: 6.3.1
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/core@7.28.5':
+ dependencies:
+ '@babel/code-frame': 7.27.1
+ '@babel/generator': 7.28.5
+ '@babel/helper-compilation-targets': 7.27.2
+ '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.5)
+ '@babel/helpers': 7.28.4
+ '@babel/parser': 7.28.5
+ '@babel/template': 7.27.2
+ '@babel/traverse': 7.28.5
+ '@babel/types': 7.28.5
+ '@jridgewell/remapping': 2.3.5
+ convert-source-map: 2.0.0
+ debug: 4.4.3
+ gensync: 1.0.0-beta.2
+ json5: 2.2.3
+ semver: 6.3.1
+ transitivePeerDependencies:
+ - supports-color
+
'@babel/core@7.28.6':
dependencies:
'@babel/code-frame': 7.28.6
@@ -10906,13 +11506,28 @@ snapshots:
'@babel/types': 7.28.6
'@jridgewell/remapping': 2.3.5
convert-source-map: 2.0.0
- debug: 4.4.3(supports-color@5.5.0)
+ debug: 4.4.3
gensync: 1.0.0-beta.2
json5: 2.2.3
semver: 6.3.1
transitivePeerDependencies:
- supports-color
+ '@babel/generator@7.25.0':
+ dependencies:
+ '@babel/types': 7.28.5
+ '@jridgewell/gen-mapping': 0.3.13
+ '@jridgewell/trace-mapping': 0.3.31
+ jsesc: 2.5.2
+
+ '@babel/generator@7.28.5':
+ dependencies:
+ '@babel/parser': 7.28.5
+ '@babel/types': 7.28.5
+ '@jridgewell/gen-mapping': 0.3.13
+ '@jridgewell/trace-mapping': 0.3.31
+ jsesc: 3.1.0
+
'@babel/generator@7.28.6':
dependencies:
'@babel/parser': 7.28.6
@@ -10933,11 +11548,27 @@ snapshots:
dependencies:
'@babel/types': 7.29.0
+ '@babel/helper-compilation-targets@7.25.2':
+ dependencies:
+ '@babel/compat-data': 7.25.2
+ '@babel/helper-validator-option': 7.24.8
+ browserslist: 4.28.0
+ lru-cache: 5.1.1
+ semver: 6.3.1
+
+ '@babel/helper-compilation-targets@7.27.2':
+ dependencies:
+ '@babel/compat-data': 7.28.5
+ '@babel/helper-validator-option': 7.27.1
+ browserslist: 4.28.0
+ lru-cache: 5.1.1
+ semver: 6.3.1
+
'@babel/helper-compilation-targets@7.28.6':
dependencies:
'@babel/compat-data': 7.28.6
'@babel/helper-validator-option': 7.27.1
- browserslist: 4.28.1
+ browserslist: 4.28.0
lru-cache: 5.1.1
semver: 6.3.1
@@ -10966,7 +11597,7 @@ snapshots:
'@babel/core': 7.28.6
'@babel/helper-compilation-targets': 7.28.6
'@babel/helper-plugin-utils': 7.28.6
- debug: 4.4.3(supports-color@5.5.0)
+ debug: 4.4.3
lodash.debounce: 4.0.8
resolve: 1.22.11
transitivePeerDependencies:
@@ -10985,6 +11616,20 @@ snapshots:
dependencies:
'@babel/types': 7.28.6
+ '@babel/helper-module-imports@7.24.7':
+ dependencies:
+ '@babel/traverse': 7.25.2
+ '@babel/types': 7.28.5
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/helper-module-imports@7.27.1':
+ dependencies:
+ '@babel/traverse': 7.28.5
+ '@babel/types': 7.28.5
+ transitivePeerDependencies:
+ - supports-color
+
'@babel/helper-module-imports@7.28.6':
dependencies:
'@babel/traverse': 7.28.6
@@ -10992,6 +11637,25 @@ snapshots:
transitivePeerDependencies:
- supports-color
+ '@babel/helper-module-transforms@7.25.2(@babel/core@7.25.2)':
+ dependencies:
+ '@babel/core': 7.25.2
+ '@babel/helper-module-imports': 7.24.7
+ '@babel/helper-simple-access': 7.24.7
+ '@babel/helper-validator-identifier': 7.28.5
+ '@babel/traverse': 7.25.2
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/helper-module-transforms@7.28.3(@babel/core@7.28.5)':
+ dependencies:
+ '@babel/core': 7.28.5
+ '@babel/helper-module-imports': 7.27.1
+ '@babel/helper-validator-identifier': 7.28.5
+ '@babel/traverse': 7.28.5
+ transitivePeerDependencies:
+ - supports-color
+
'@babel/helper-module-transforms@7.28.6(@babel/core@7.28.6)':
dependencies:
'@babel/core': 7.28.6
@@ -11025,6 +11689,13 @@ snapshots:
transitivePeerDependencies:
- supports-color
+ '@babel/helper-simple-access@7.24.7':
+ dependencies:
+ '@babel/traverse': 7.25.2
+ '@babel/types': 7.28.5
+ transitivePeerDependencies:
+ - supports-color
+
'@babel/helper-skip-transparent-expression-wrappers@7.27.1':
dependencies:
'@babel/traverse': 7.29.0
@@ -11036,6 +11707,8 @@ snapshots:
'@babel/helper-validator-identifier@7.28.5': {}
+ '@babel/helper-validator-option@7.24.8': {}
+
'@babel/helper-validator-option@7.27.1': {}
'@babel/helper-wrap-function@7.28.6':
@@ -11046,11 +11719,25 @@ snapshots:
transitivePeerDependencies:
- supports-color
+ '@babel/helpers@7.25.0':
+ dependencies:
+ '@babel/template': 7.25.0
+ '@babel/types': 7.28.5
+
+ '@babel/helpers@7.28.4':
+ dependencies:
+ '@babel/template': 7.27.2
+ '@babel/types': 7.28.5
+
'@babel/helpers@7.28.6':
dependencies:
'@babel/template': 7.28.6
'@babel/types': 7.28.6
+ '@babel/parser@7.28.5':
+ dependencies:
+ '@babel/types': 7.28.5
+
'@babel/parser@7.28.6':
dependencies:
'@babel/types': 7.28.6
@@ -11108,6 +11795,11 @@ snapshots:
'@babel/core': 7.28.6
'@babel/helper-plugin-utils': 7.28.6
+ '@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.28.5)':
+ dependencies:
+ '@babel/core': 7.28.5
+ '@babel/helper-plugin-utils': 7.28.6
+
'@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.28.6)':
dependencies:
'@babel/core': 7.28.6
@@ -11540,16 +12232,58 @@ snapshots:
'@babel/types': 7.29.0
esutils: 2.0.3
+ '@babel/runtime@7.25.0':
+ dependencies:
+ regenerator-runtime: 0.14.1
+
+ '@babel/runtime@7.28.4': {}
+
'@babel/runtime@7.28.6': {}
'@babel/runtime@7.29.2': {}
+ '@babel/template@7.25.0':
+ dependencies:
+ '@babel/code-frame': 7.27.1
+ '@babel/parser': 7.28.5
+ '@babel/types': 7.28.5
+
+ '@babel/template@7.27.2':
+ dependencies:
+ '@babel/code-frame': 7.27.1
+ '@babel/parser': 7.28.5
+ '@babel/types': 7.28.5
+
'@babel/template@7.28.6':
dependencies:
'@babel/code-frame': 7.28.6
'@babel/parser': 7.28.6
'@babel/types': 7.28.6
+ '@babel/traverse@7.25.2':
+ dependencies:
+ '@babel/code-frame': 7.27.1
+ '@babel/generator': 7.25.0
+ '@babel/parser': 7.28.5
+ '@babel/template': 7.25.0
+ '@babel/types': 7.28.5
+ debug: 4.4.3
+ globals: 11.12.0
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/traverse@7.28.5':
+ dependencies:
+ '@babel/code-frame': 7.27.1
+ '@babel/generator': 7.28.5
+ '@babel/helper-globals': 7.28.0
+ '@babel/parser': 7.28.5
+ '@babel/template': 7.27.2
+ '@babel/types': 7.28.5
+ debug: 4.4.3
+ transitivePeerDependencies:
+ - supports-color
+
'@babel/traverse@7.28.6':
dependencies:
'@babel/code-frame': 7.28.6
@@ -11558,7 +12292,7 @@ snapshots:
'@babel/parser': 7.28.6
'@babel/template': 7.28.6
'@babel/types': 7.28.6
- debug: 4.4.3(supports-color@5.5.0)
+ debug: 4.4.3
transitivePeerDependencies:
- supports-color
@@ -11570,10 +12304,15 @@ snapshots:
'@babel/parser': 7.29.2
'@babel/template': 7.28.6
'@babel/types': 7.29.0
- debug: 4.4.3(supports-color@5.5.0)
+ debug: 4.4.3
transitivePeerDependencies:
- supports-color
+ '@babel/types@7.28.5':
+ dependencies:
+ '@babel/helper-string-parser': 7.27.1
+ '@babel/helper-validator-identifier': 7.28.5
+
'@babel/types@7.28.6':
dependencies:
'@babel/helper-string-parser': 7.27.1
@@ -11818,126 +12557,189 @@ snapshots:
to-pascal-case: 1.0.0
unescape-js: 1.1.4
+ '@esbuild/aix-ppc64@0.25.0':
+ optional: true
+
'@esbuild/aix-ppc64@0.25.11':
optional: true
'@esbuild/aix-ppc64@0.27.3':
optional: true
+ '@esbuild/android-arm64@0.25.0':
+ optional: true
+
'@esbuild/android-arm64@0.25.11':
optional: true
'@esbuild/android-arm64@0.27.3':
optional: true
+ '@esbuild/android-arm@0.25.0':
+ optional: true
+
'@esbuild/android-arm@0.25.11':
optional: true
'@esbuild/android-arm@0.27.3':
optional: true
+ '@esbuild/android-x64@0.25.0':
+ optional: true
+
'@esbuild/android-x64@0.25.11':
optional: true
'@esbuild/android-x64@0.27.3':
optional: true
+ '@esbuild/darwin-arm64@0.25.0':
+ optional: true
+
'@esbuild/darwin-arm64@0.25.11':
optional: true
'@esbuild/darwin-arm64@0.27.3':
optional: true
+ '@esbuild/darwin-x64@0.25.0':
+ optional: true
+
'@esbuild/darwin-x64@0.25.11':
optional: true
'@esbuild/darwin-x64@0.27.3':
optional: true
+ '@esbuild/freebsd-arm64@0.25.0':
+ optional: true
+
'@esbuild/freebsd-arm64@0.25.11':
optional: true
'@esbuild/freebsd-arm64@0.27.3':
optional: true
+ '@esbuild/freebsd-x64@0.25.0':
+ optional: true
+
'@esbuild/freebsd-x64@0.25.11':
optional: true
'@esbuild/freebsd-x64@0.27.3':
optional: true
+ '@esbuild/linux-arm64@0.25.0':
+ optional: true
+
'@esbuild/linux-arm64@0.25.11':
optional: true
'@esbuild/linux-arm64@0.27.3':
optional: true
+ '@esbuild/linux-arm@0.25.0':
+ optional: true
+
'@esbuild/linux-arm@0.25.11':
optional: true
'@esbuild/linux-arm@0.27.3':
optional: true
+ '@esbuild/linux-ia32@0.25.0':
+ optional: true
+
'@esbuild/linux-ia32@0.25.11':
optional: true
'@esbuild/linux-ia32@0.27.3':
optional: true
+ '@esbuild/linux-loong64@0.25.0':
+ optional: true
+
'@esbuild/linux-loong64@0.25.11':
optional: true
'@esbuild/linux-loong64@0.27.3':
optional: true
+ '@esbuild/linux-mips64el@0.25.0':
+ optional: true
+
'@esbuild/linux-mips64el@0.25.11':
optional: true
'@esbuild/linux-mips64el@0.27.3':
optional: true
+ '@esbuild/linux-ppc64@0.25.0':
+ optional: true
+
'@esbuild/linux-ppc64@0.25.11':
optional: true
'@esbuild/linux-ppc64@0.27.3':
optional: true
+ '@esbuild/linux-riscv64@0.25.0':
+ optional: true
+
'@esbuild/linux-riscv64@0.25.11':
optional: true
'@esbuild/linux-riscv64@0.27.3':
optional: true
+ '@esbuild/linux-s390x@0.25.0':
+ optional: true
+
'@esbuild/linux-s390x@0.25.11':
optional: true
'@esbuild/linux-s390x@0.27.3':
optional: true
+ '@esbuild/linux-x64@0.25.0':
+ optional: true
+
'@esbuild/linux-x64@0.25.11':
optional: true
'@esbuild/linux-x64@0.27.3':
optional: true
+ '@esbuild/netbsd-arm64@0.25.0':
+ optional: true
+
'@esbuild/netbsd-arm64@0.25.11':
optional: true
'@esbuild/netbsd-arm64@0.27.3':
optional: true
+ '@esbuild/netbsd-x64@0.25.0':
+ optional: true
+
'@esbuild/netbsd-x64@0.25.11':
optional: true
'@esbuild/netbsd-x64@0.27.3':
optional: true
+ '@esbuild/openbsd-arm64@0.25.0':
+ optional: true
+
'@esbuild/openbsd-arm64@0.25.11':
optional: true
'@esbuild/openbsd-arm64@0.27.3':
optional: true
+ '@esbuild/openbsd-x64@0.25.0':
+ optional: true
+
'@esbuild/openbsd-x64@0.25.11':
optional: true
@@ -11950,30 +12752,47 @@ snapshots:
'@esbuild/openharmony-arm64@0.27.3':
optional: true
+ '@esbuild/sunos-x64@0.25.0':
+ optional: true
+
'@esbuild/sunos-x64@0.25.11':
optional: true
'@esbuild/sunos-x64@0.27.3':
optional: true
+ '@esbuild/win32-arm64@0.25.0':
+ optional: true
+
'@esbuild/win32-arm64@0.25.11':
optional: true
'@esbuild/win32-arm64@0.27.3':
optional: true
+ '@esbuild/win32-ia32@0.25.0':
+ optional: true
+
'@esbuild/win32-ia32@0.25.11':
optional: true
'@esbuild/win32-ia32@0.27.3':
optional: true
+ '@esbuild/win32-x64@0.25.0':
+ optional: true
+
'@esbuild/win32-x64@0.25.11':
optional: true
'@esbuild/win32-x64@0.27.3':
optional: true
+ '@eslint-community/eslint-utils@4.9.0(eslint@9.39.1(jiti@2.6.1))':
+ dependencies:
+ eslint: 9.39.1(jiti@2.6.1)
+ eslint-visitor-keys: 3.4.3
+
'@eslint-community/eslint-utils@4.9.1(eslint@9.39.1(jiti@2.6.1))':
dependencies:
eslint: 9.39.1(jiti@2.6.1)
@@ -11984,7 +12803,7 @@ snapshots:
'@eslint/config-array@0.21.1':
dependencies:
'@eslint/object-schema': 2.1.7
- debug: 4.4.3(supports-color@5.5.0)
+ debug: 4.4.3
minimatch: 3.1.5
transitivePeerDependencies:
- supports-color
@@ -11997,14 +12816,14 @@ snapshots:
dependencies:
'@types/json-schema': 7.0.15
- '@eslint/core@1.1.0':
+ '@eslint/core@1.1.1':
dependencies:
'@types/json-schema': 7.0.15
'@eslint/eslintrc@3.3.3':
dependencies:
ajv: 6.14.0
- debug: 4.4.3(supports-color@5.5.0)
+ debug: 4.4.3
espree: 10.4.0
globals: 14.0.0
ignore: 5.3.2
@@ -12019,8 +12838,8 @@ snapshots:
'@eslint/json@1.0.1':
dependencies:
- '@eslint/core': 1.1.0
- '@eslint/plugin-kit': 0.6.0
+ '@eslint/core': 1.1.1
+ '@eslint/plugin-kit': 0.6.1
'@humanwhocodes/momoa': 3.3.10
natural-compare: 1.4.0
@@ -12031,9 +12850,9 @@ snapshots:
'@eslint/core': 0.17.0
levn: 0.4.1
- '@eslint/plugin-kit@0.6.0':
+ '@eslint/plugin-kit@0.6.1':
dependencies:
- '@eslint/core': 1.1.0
+ '@eslint/core': 1.1.1
levn: 0.4.1
'@exodus/bytes@1.8.0': {}
@@ -12060,7 +12879,7 @@ snapshots:
'@firebase/component': 0.7.0
'@firebase/logger': 0.5.0
'@firebase/util': 1.13.0
- tslib: 2.8.1
+ tslib: 2.6.3
'@firebase/analytics-compat@0.2.24(@firebase/app-compat@0.5.0)(@firebase/app@0.14.0)':
dependencies:
@@ -12069,7 +12888,7 @@ snapshots:
'@firebase/app-compat': 0.5.0
'@firebase/component': 0.7.0
'@firebase/util': 1.13.0
- tslib: 2.8.1
+ tslib: 2.6.3
transitivePeerDependencies:
- '@firebase/app'
@@ -12082,7 +12901,7 @@ snapshots:
'@firebase/installations': 0.6.19(@firebase/app@0.14.0)
'@firebase/logger': 0.5.0
'@firebase/util': 1.13.0
- tslib: 2.8.1
+ tslib: 2.6.3
'@firebase/app-check-compat@0.4.0(@firebase/app-compat@0.5.0)(@firebase/app@0.14.0)':
dependencies:
@@ -12092,7 +12911,7 @@ snapshots:
'@firebase/component': 0.7.0
'@firebase/logger': 0.5.0
'@firebase/util': 1.13.0
- tslib: 2.8.1
+ tslib: 2.6.3
transitivePeerDependencies:
- '@firebase/app'
@@ -12108,7 +12927,7 @@ snapshots:
'@firebase/component': 0.7.0
'@firebase/logger': 0.5.0
'@firebase/util': 1.13.0
- tslib: 2.8.1
+ tslib: 2.6.3
'@firebase/app-compat@0.5.0':
dependencies:
@@ -12116,7 +12935,7 @@ snapshots:
'@firebase/component': 0.7.0
'@firebase/logger': 0.5.0
'@firebase/util': 1.13.0
- tslib: 2.8.1
+ tslib: 2.6.3
'@firebase/app-types@0.9.2': {}
@@ -12128,7 +12947,7 @@ snapshots:
'@firebase/logger': 0.5.0
'@firebase/util': 1.13.0
idb: 7.1.1
- tslib: 2.8.1
+ tslib: 2.6.3
'@firebase/auth-compat@0.6.0(@firebase/app-compat@0.5.0)(@firebase/app-types@0.9.3)(@firebase/app@0.14.0)':
dependencies:
@@ -12137,7 +12956,7 @@ snapshots:
'@firebase/auth-types': 0.13.0(@firebase/app-types@0.9.3)(@firebase/util@1.13.0)
'@firebase/component': 0.7.0
'@firebase/util': 1.13.0
- tslib: 2.8.1
+ tslib: 2.6.3
transitivePeerDependencies:
- '@firebase/app'
- '@firebase/app-types'
@@ -12158,7 +12977,7 @@ snapshots:
'@firebase/component': 0.7.0
'@firebase/logger': 0.5.0
'@firebase/util': 1.13.0
- tslib: 2.8.1
+ tslib: 2.6.3
'@firebase/component@0.6.8':
dependencies:
@@ -12177,7 +12996,7 @@ snapshots:
'@firebase/component': 0.7.0
'@firebase/logger': 0.5.0
'@firebase/util': 1.13.0
- tslib: 2.8.1
+ tslib: 2.6.3
'@firebase/database-compat@1.0.6':
dependencies:
@@ -12186,7 +13005,7 @@ snapshots:
'@firebase/database-types': 1.0.4
'@firebase/logger': 0.4.2
'@firebase/util': 1.9.7
- tslib: 2.8.1
+ tslib: 2.6.3
'@firebase/database-compat@2.1.0':
dependencies:
@@ -12195,7 +13014,7 @@ snapshots:
'@firebase/database-types': 1.0.16
'@firebase/logger': 0.5.0
'@firebase/util': 1.13.0
- tslib: 2.8.1
+ tslib: 2.6.3
'@firebase/database-types@1.0.16':
dependencies:
@@ -12225,7 +13044,7 @@ snapshots:
'@firebase/logger': 0.5.0
'@firebase/util': 1.13.0
faye-websocket: 0.11.4
- tslib: 2.8.1
+ tslib: 2.6.3
'@firebase/firestore-compat@0.4.0(@firebase/app-compat@0.5.0)(@firebase/app-types@0.9.3)(@firebase/app@0.14.0)':
dependencies:
@@ -12234,7 +13053,7 @@ snapshots:
'@firebase/firestore': 4.9.0(@firebase/app@0.14.0)
'@firebase/firestore-types': 3.0.3(@firebase/app-types@0.9.3)(@firebase/util@1.13.0)
'@firebase/util': 1.13.0
- tslib: 2.8.1
+ tslib: 2.6.3
transitivePeerDependencies:
- '@firebase/app'
- '@firebase/app-types'
@@ -12253,7 +13072,7 @@ snapshots:
'@firebase/webchannel-wrapper': 1.0.4
'@grpc/grpc-js': 1.9.15
'@grpc/proto-loader': 0.7.13
- tslib: 2.8.1
+ tslib: 2.6.3
'@firebase/functions-compat@0.4.0(@firebase/app-compat@0.5.0)(@firebase/app@0.14.0)':
dependencies:
@@ -12262,7 +13081,7 @@ snapshots:
'@firebase/functions': 0.13.0(@firebase/app@0.14.0)
'@firebase/functions-types': 0.6.3
'@firebase/util': 1.13.0
- tslib: 2.8.1
+ tslib: 2.6.3
transitivePeerDependencies:
- '@firebase/app'
@@ -12276,7 +13095,7 @@ snapshots:
'@firebase/component': 0.7.0
'@firebase/messaging-interop-types': 0.2.3
'@firebase/util': 1.13.0
- tslib: 2.8.1
+ tslib: 2.6.3
'@firebase/installations-compat@0.2.19(@firebase/app-compat@0.5.0)(@firebase/app-types@0.9.3)(@firebase/app@0.14.0)':
dependencies:
@@ -12285,7 +13104,7 @@ snapshots:
'@firebase/installations': 0.6.19(@firebase/app@0.14.0)
'@firebase/installations-types': 0.5.3(@firebase/app-types@0.9.3)
'@firebase/util': 1.13.0
- tslib: 2.8.1
+ tslib: 2.6.3
transitivePeerDependencies:
- '@firebase/app'
- '@firebase/app-types'
@@ -12300,7 +13119,7 @@ snapshots:
'@firebase/component': 0.7.0
'@firebase/util': 1.13.0
idb: 7.1.1
- tslib: 2.8.1
+ tslib: 2.6.3
'@firebase/logger@0.4.2':
dependencies:
@@ -12316,7 +13135,7 @@ snapshots:
'@firebase/component': 0.7.0
'@firebase/messaging': 0.12.23(@firebase/app@0.14.0)
'@firebase/util': 1.13.0
- tslib: 2.8.1
+ tslib: 2.6.3
transitivePeerDependencies:
- '@firebase/app'
@@ -12330,7 +13149,7 @@ snapshots:
'@firebase/messaging-interop-types': 0.2.3
'@firebase/util': 1.13.0
idb: 7.1.1
- tslib: 2.8.1
+ tslib: 2.6.3
'@firebase/performance-compat@0.2.21(@firebase/app-compat@0.5.0)(@firebase/app@0.14.0)':
dependencies:
@@ -12340,7 +13159,7 @@ snapshots:
'@firebase/performance': 0.7.8(@firebase/app@0.14.0)
'@firebase/performance-types': 0.2.3
'@firebase/util': 1.13.0
- tslib: 2.8.1
+ tslib: 2.6.3
transitivePeerDependencies:
- '@firebase/app'
@@ -12353,7 +13172,7 @@ snapshots:
'@firebase/installations': 0.6.19(@firebase/app@0.14.0)
'@firebase/logger': 0.5.0
'@firebase/util': 1.13.0
- tslib: 2.8.1
+ tslib: 2.6.3
web-vitals: 4.2.4
'@firebase/remote-config-compat@0.2.19(@firebase/app-compat@0.5.0)(@firebase/app@0.14.0)':
@@ -12364,7 +13183,7 @@ snapshots:
'@firebase/remote-config': 0.6.6(@firebase/app@0.14.0)
'@firebase/remote-config-types': 0.4.0
'@firebase/util': 1.13.0
- tslib: 2.8.1
+ tslib: 2.6.3
transitivePeerDependencies:
- '@firebase/app'
@@ -12377,7 +13196,7 @@ snapshots:
'@firebase/installations': 0.6.19(@firebase/app@0.14.0)
'@firebase/logger': 0.5.0
'@firebase/util': 1.13.0
- tslib: 2.8.1
+ tslib: 2.6.3
'@firebase/storage-compat@0.4.0(@firebase/app-compat@0.5.0)(@firebase/app-types@0.9.3)(@firebase/app@0.14.0)':
dependencies:
@@ -12386,7 +13205,7 @@ snapshots:
'@firebase/storage': 0.14.0(@firebase/app@0.14.0)
'@firebase/storage-types': 0.8.3(@firebase/app-types@0.9.3)(@firebase/util@1.13.0)
'@firebase/util': 1.13.0
- tslib: 2.8.1
+ tslib: 2.6.3
transitivePeerDependencies:
- '@firebase/app'
- '@firebase/app-types'
@@ -12401,11 +13220,11 @@ snapshots:
'@firebase/app': 0.14.0
'@firebase/component': 0.7.0
'@firebase/util': 1.13.0
- tslib: 2.8.1
+ tslib: 2.6.3
'@firebase/util@1.13.0':
dependencies:
- tslib: 2.8.1
+ tslib: 2.6.3
'@firebase/util@1.9.7':
dependencies:
@@ -12475,7 +13294,7 @@ snapshots:
abort-controller: 3.0.0
async-retry: 1.3.3
duplexify: 4.1.3
- fast-xml-parser: 4.5.3
+ fast-xml-parser: 4.4.1
gaxios: 6.7.0(encoding@0.1.13)
google-auth-library: 9.12.0(encoding@0.1.13)
html-entities: 2.5.2
@@ -12707,7 +13526,7 @@ snapshots:
dependencies:
string-width: 5.1.2
string-width-cjs: string-width@4.2.3
- strip-ansi: 7.1.2
+ strip-ansi: 7.1.0
strip-ansi-cjs: strip-ansi@6.0.1
wrap-ansi: 8.1.0
wrap-ansi-cjs: wrap-ansi@7.0.0
@@ -12737,6 +13556,13 @@ snapshots:
'@jridgewell/gen-mapping': 0.3.13
'@jridgewell/trace-mapping': 0.3.31
+ '@jridgewell/source-map@0.3.6':
+ dependencies:
+ '@jridgewell/gen-mapping': 0.3.13
+ '@jridgewell/trace-mapping': 0.3.31
+
+ '@jridgewell/sourcemap-codec@1.5.0': {}
+
'@jridgewell/sourcemap-codec@1.5.5': {}
'@jridgewell/trace-mapping@0.3.31':
@@ -12755,7 +13581,7 @@ snapshots:
'@kwsites/file-exists@1.1.1':
dependencies:
- debug: 4.4.3(supports-color@5.5.0)
+ debug: 4.4.3
transitivePeerDependencies:
- supports-color
@@ -12768,7 +13594,7 @@ snapshots:
detect-libc: 2.0.3
https-proxy-agent: 5.0.1
make-dir: 3.1.0
- node-fetch: 2.7.0(encoding@0.1.13)
+ node-fetch: 2.6.7(encoding@0.1.13)
nopt: 5.0.0
npmlog: 5.0.1
rimraf: 3.0.2
@@ -13309,7 +14135,7 @@ snapshots:
https-proxy-agent: 7.0.6
js-levenshtein: 1.1.6
js-yaml: 4.1.1
- minimatch: 5.1.9
+ minimatch: 5.1.6
pluralize: 8.0.0
yaml-ast-parser: 0.0.43
transitivePeerDependencies:
@@ -13442,69 +14268,129 @@ snapshots:
optionalDependencies:
rollup: 2.80.0
+ '@rollup/rollup-android-arm-eabi@4.40.0':
+ optional: true
+
'@rollup/rollup-android-arm-eabi@4.52.5':
optional: true
+ '@rollup/rollup-android-arm64@4.40.0':
+ optional: true
+
'@rollup/rollup-android-arm64@4.52.5':
optional: true
+ '@rollup/rollup-darwin-arm64@4.40.0':
+ optional: true
+
'@rollup/rollup-darwin-arm64@4.52.5':
optional: true
+ '@rollup/rollup-darwin-x64@4.40.0':
+ optional: true
+
'@rollup/rollup-darwin-x64@4.52.5':
optional: true
+ '@rollup/rollup-freebsd-arm64@4.40.0':
+ optional: true
+
'@rollup/rollup-freebsd-arm64@4.52.5':
optional: true
+ '@rollup/rollup-freebsd-x64@4.40.0':
+ optional: true
+
'@rollup/rollup-freebsd-x64@4.52.5':
optional: true
+ '@rollup/rollup-linux-arm-gnueabihf@4.40.0':
+ optional: true
+
'@rollup/rollup-linux-arm-gnueabihf@4.52.5':
optional: true
+ '@rollup/rollup-linux-arm-musleabihf@4.40.0':
+ optional: true
+
'@rollup/rollup-linux-arm-musleabihf@4.52.5':
optional: true
+ '@rollup/rollup-linux-arm64-gnu@4.40.0':
+ optional: true
+
'@rollup/rollup-linux-arm64-gnu@4.52.5':
optional: true
+ '@rollup/rollup-linux-arm64-musl@4.40.0':
+ optional: true
+
'@rollup/rollup-linux-arm64-musl@4.52.5':
optional: true
'@rollup/rollup-linux-loong64-gnu@4.52.5':
optional: true
+ '@rollup/rollup-linux-loongarch64-gnu@4.40.0':
+ optional: true
+
+ '@rollup/rollup-linux-powerpc64le-gnu@4.40.0':
+ optional: true
+
'@rollup/rollup-linux-ppc64-gnu@4.52.5':
optional: true
+ '@rollup/rollup-linux-riscv64-gnu@4.40.0':
+ optional: true
+
'@rollup/rollup-linux-riscv64-gnu@4.52.5':
optional: true
+ '@rollup/rollup-linux-riscv64-musl@4.40.0':
+ optional: true
+
'@rollup/rollup-linux-riscv64-musl@4.52.5':
optional: true
+ '@rollup/rollup-linux-s390x-gnu@4.40.0':
+ optional: true
+
'@rollup/rollup-linux-s390x-gnu@4.52.5':
optional: true
+ '@rollup/rollup-linux-x64-gnu@4.40.0':
+ optional: true
+
'@rollup/rollup-linux-x64-gnu@4.52.5':
optional: true
+ '@rollup/rollup-linux-x64-musl@4.40.0':
+ optional: true
+
'@rollup/rollup-linux-x64-musl@4.52.5':
optional: true
'@rollup/rollup-openharmony-arm64@4.52.5':
optional: true
+ '@rollup/rollup-win32-arm64-msvc@4.40.0':
+ optional: true
+
'@rollup/rollup-win32-arm64-msvc@4.52.5':
optional: true
+ '@rollup/rollup-win32-ia32-msvc@4.40.0':
+ optional: true
+
'@rollup/rollup-win32-ia32-msvc@4.52.5':
optional: true
'@rollup/rollup-win32-x64-gnu@4.52.5':
optional: true
+ '@rollup/rollup-win32-x64-msvc@4.40.0':
+ optional: true
+
'@rollup/rollup-win32-x64-msvc@4.52.5':
optional: true
@@ -13538,7 +14424,7 @@ snapshots:
'@sentry/bundler-plugin-core@3.3.1(encoding@0.1.13)':
dependencies:
- '@babel/core': 7.28.6
+ '@babel/core': 7.25.2
'@sentry/babel-plugin-component-annotate': 3.3.1
'@sentry/cli': 2.42.2(encoding@0.1.13)
dotenv: 16.4.5
@@ -13574,7 +14460,7 @@ snapshots:
'@sentry/cli@2.42.2(encoding@0.1.13)':
dependencies:
https-proxy-agent: 5.0.1
- node-fetch: 2.7.0(encoding@0.1.13)
+ node-fetch: 2.6.7(encoding@0.1.13)
progress: 2.0.3
proxy-from-env: 1.1.0
which: 2.0.2
@@ -13626,7 +14512,7 @@ snapshots:
'@solid-primitives/rootless': 1.5.3(solid-js@1.9.10)
'@solid-primitives/scheduled': 1.5.3(solid-js@1.9.10)
'@solid-primitives/static-store': 0.1.3(solid-js@1.9.10)
- '@solid-primitives/utils': 6.4.0(solid-js@1.9.10)
+ '@solid-primitives/utils': 6.3.2(solid-js@1.9.10)
solid-js: 1.9.10
'@solid-devtools/frontend@0.15.4(solid-js@1.9.10)':
@@ -13651,7 +14537,7 @@ snapshots:
'@solid-primitives/static-store': 0.1.3(solid-js@1.9.10)
'@solid-primitives/styles': 0.1.3(solid-js@1.9.10)
'@solid-primitives/timer': 1.4.4(solid-js@1.9.10)
- '@solid-primitives/utils': 6.4.0(solid-js@1.9.10)
+ '@solid-primitives/utils': 6.3.2(solid-js@1.9.10)
clsx: 2.1.1
solid-js: 1.9.10
@@ -13664,7 +14550,7 @@ snapshots:
'@solid-primitives/cursor': 0.1.3(solid-js@1.9.10)
'@solid-primitives/event-listener': 2.4.5(solid-js@1.9.10)
'@solid-primitives/media': 2.3.5(solid-js@1.9.10)
- '@solid-primitives/utils': 6.4.0(solid-js@1.9.10)
+ '@solid-primitives/utils': 6.3.2(solid-js@1.9.10)
solid-js: 1.9.10
'@solid-devtools/shared@0.20.0(solid-js@1.9.10)':
@@ -13677,7 +14563,7 @@ snapshots:
'@solid-primitives/scheduled': 1.5.3(solid-js@1.9.10)
'@solid-primitives/static-store': 0.1.3(solid-js@1.9.10)
'@solid-primitives/styles': 0.1.3(solid-js@1.9.10)
- '@solid-primitives/utils': 6.4.0(solid-js@1.9.10)
+ '@solid-primitives/utils': 6.3.2(solid-js@1.9.10)
solid-js: 1.9.10
'@solid-primitives/bounds@0.1.5(solid-js@1.9.10)':
@@ -13730,9 +14616,9 @@ snapshots:
dependencies:
solid-js: 1.9.10
- '@solid-primitives/map@0.7.3(solid-js@1.9.10)':
+ '@solid-primitives/map@0.7.2(solid-js@1.9.10)':
dependencies:
- '@solid-primitives/trigger': 1.2.3(solid-js@1.9.10)
+ '@solid-primitives/trigger': 1.2.2(solid-js@1.9.10)
solid-js: 1.9.10
'@solid-primitives/media@2.3.5(solid-js@1.9.10)':
@@ -13769,7 +14655,7 @@ snapshots:
'@solid-primitives/refs@1.1.2(solid-js@1.9.10)':
dependencies:
- '@solid-primitives/utils': 6.4.0(solid-js@1.9.10)
+ '@solid-primitives/utils': 6.3.2(solid-js@1.9.10)
solid-js: 1.9.10
'@solid-primitives/resize-observer@2.1.5(solid-js@1.9.10)':
@@ -13808,11 +14694,15 @@ snapshots:
dependencies:
solid-js: 1.9.10
- '@solid-primitives/trigger@1.2.3(solid-js@1.9.10)':
+ '@solid-primitives/trigger@1.2.2(solid-js@1.9.10)':
dependencies:
'@solid-primitives/utils': 6.4.0(solid-js@1.9.10)
solid-js: 1.9.10
+ '@solid-primitives/utils@6.3.2(solid-js@1.9.10)':
+ dependencies:
+ solid-js: 1.9.10
+
'@solid-primitives/utils@6.4.0(solid-js@1.9.10)':
dependencies:
solid-js: 1.9.10
@@ -14114,7 +15004,7 @@ snapshots:
'@tanstack/solid-db@0.2.10(solid-js@1.9.10)(typescript@6.0.2)':
dependencies:
- '@solid-primitives/map': 0.7.3(solid-js@1.9.10)
+ '@solid-primitives/map': 0.7.2(solid-js@1.9.10)
'@tanstack/db': 0.5.30(typescript@6.0.2)
solid-js: 1.9.10
transitivePeerDependencies:
@@ -14181,8 +15071,8 @@ snapshots:
'@testing-library/dom@10.4.1':
dependencies:
- '@babel/code-frame': 7.28.6
- '@babel/runtime': 7.28.6
+ '@babel/code-frame': 7.27.1
+ '@babel/runtime': 7.28.4
'@types/aria-query': 5.0.4
aria-query: 5.3.0
dom-accessibility-api: 0.5.16
@@ -14258,24 +15148,24 @@ snapshots:
'@types/babel__core@7.20.5':
dependencies:
- '@babel/parser': 7.28.6
- '@babel/types': 7.28.6
+ '@babel/parser': 7.28.5
+ '@babel/types': 7.28.5
'@types/babel__generator': 7.27.0
'@types/babel__template': 7.4.4
'@types/babel__traverse': 7.28.0
'@types/babel__generator@7.27.0':
dependencies:
- '@babel/types': 7.28.6
+ '@babel/types': 7.28.5
'@types/babel__template@7.4.4':
dependencies:
- '@babel/parser': 7.28.6
- '@babel/types': 7.28.6
+ '@babel/parser': 7.28.5
+ '@babel/types': 7.28.5
'@types/babel__traverse@7.28.0':
dependencies:
- '@babel/types': 7.28.6
+ '@babel/types': 7.28.5
'@types/bcrypt@5.0.2':
dependencies:
@@ -14333,6 +15223,8 @@ snapshots:
'@types/estree@0.0.39': {}
+ '@types/estree@1.0.7': {}
+
'@types/estree@1.0.8': {}
'@types/express-serve-static-core@4.19.5':
@@ -14518,7 +15410,7 @@ snapshots:
dependencies:
'@typescript-eslint/tsconfig-utils': 8.52.0(typescript@6.0.2)
'@typescript-eslint/types': 8.52.0
- debug: 4.4.3(supports-color@5.5.0)
+ debug: 4.4.3
typescript: 6.0.2
transitivePeerDependencies:
- supports-color
@@ -14540,7 +15432,7 @@ snapshots:
dependencies:
'@typescript-eslint/types': 7.18.0
'@typescript-eslint/visitor-keys': 7.18.0
- debug: 4.4.3(supports-color@5.5.0)
+ debug: 4.4.3
globby: 11.1.0
is-glob: 4.0.3
minimatch: 9.0.9
@@ -14557,7 +15449,7 @@ snapshots:
'@typescript-eslint/tsconfig-utils': 8.52.0(typescript@6.0.2)
'@typescript-eslint/types': 8.52.0
'@typescript-eslint/visitor-keys': 8.52.0
- debug: 4.4.3(supports-color@5.5.0)
+ debug: 4.4.3
minimatch: 9.0.9
semver: 7.7.4
tinyglobby: 0.2.15
@@ -14621,7 +15513,7 @@ snapshots:
dependencies:
'@bcoe/v8-coverage': 1.0.2
'@vitest/utils': 4.0.15
- ast-v8-to-istanbul: 0.3.12
+ ast-v8-to-istanbul: 0.3.8
istanbul-lib-coverage: 3.2.2
istanbul-lib-report: 3.0.1
istanbul-lib-source-maps: 5.0.6
@@ -14638,7 +15530,7 @@ snapshots:
dependencies:
'@bcoe/v8-coverage': 1.0.2
'@vitest/utils': 4.0.15
- ast-v8-to-istanbul: 0.3.12
+ ast-v8-to-istanbul: 0.3.8
istanbul-lib-coverage: 3.2.2
istanbul-lib-report: 3.0.1
istanbul-lib-source-maps: 5.0.6
@@ -14655,7 +15547,7 @@ snapshots:
dependencies:
'@bcoe/v8-coverage': 1.0.2
'@vitest/utils': 4.0.15
- ast-v8-to-istanbul: 0.3.12
+ ast-v8-to-istanbul: 0.3.8
istanbul-lib-coverage: 3.2.2
istanbul-lib-report: 3.0.1
istanbul-lib-source-maps: 5.0.6
@@ -14725,6 +15617,14 @@ snapshots:
optionalDependencies:
vite: 8.0.1(@types/node@20.5.1)(esbuild@0.27.3)(jiti@2.6.1)(sass@1.98.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2)
+ '@vitest/mocker@4.1.0(vite@8.0.1(@types/node@24.9.1)(esbuild@0.25.0)(jiti@2.6.1)(sass@1.98.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2))':
+ dependencies:
+ '@vitest/spy': 4.1.0
+ estree-walker: 3.0.3
+ magic-string: 0.30.21
+ optionalDependencies:
+ vite: 8.0.1(@types/node@24.9.1)(esbuild@0.25.0)(jiti@2.6.1)(sass@1.98.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2)
+
'@vitest/mocker@4.1.0(vite@8.0.1(@types/node@24.9.1)(esbuild@0.27.3)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2))':
dependencies:
'@vitest/spy': 4.1.0
@@ -14801,7 +15701,7 @@ snapshots:
'@vue/compiler-core@3.4.37':
dependencies:
- '@babel/parser': 7.28.6
+ '@babel/parser': 7.28.5
'@vue/shared': 3.4.37
entities: 5.0.0
estree-walker: 2.0.2
@@ -14814,7 +15714,7 @@ snapshots:
'@vue/compiler-sfc@3.4.37':
dependencies:
- '@babel/parser': 7.28.6
+ '@babel/parser': 7.28.5
'@vue/compiler-core': 3.4.37
'@vue/compiler-dom': 3.4.37
'@vue/compiler-ssr': 3.4.37
@@ -14864,6 +15764,8 @@ snapshots:
dependencies:
acorn: 8.15.0
+ acorn@8.14.0: {}
+
acorn@8.15.0: {}
acorn@8.16.0: {}
@@ -14872,7 +15774,13 @@ snapshots:
agent-base@6.0.2:
dependencies:
- debug: 4.4.3(supports-color@5.5.0)
+ debug: 4.4.3
+ transitivePeerDependencies:
+ - supports-color
+
+ agent-base@7.1.1:
+ dependencies:
+ debug: 4.4.3
transitivePeerDependencies:
- supports-color
@@ -15051,6 +15959,12 @@ snapshots:
estree-walker: 3.0.3
js-tokens: 10.0.0
+ ast-v8-to-istanbul@0.3.8:
+ dependencies:
+ '@jridgewell/trace-mapping': 0.3.31
+ estree-walker: 3.0.3
+ js-tokens: 9.0.1
+
astral-regex@2.0.0: {}
async-function@1.0.0: {}
@@ -15066,6 +15980,8 @@ snapshots:
dependencies:
lodash: 4.17.21
+ async@3.2.5: {}
+
async@3.2.6: {}
asynckit@0.4.0: {}
@@ -15090,7 +16006,7 @@ snapshots:
avvio@7.2.5:
dependencies:
archy: 1.0.0
- debug: 4.4.3(supports-color@5.5.0)
+ debug: 4.4.3
fastq: 1.19.1
queue-microtask: 1.2.3
transitivePeerDependencies:
@@ -15098,16 +16014,25 @@ snapshots:
axe-core@4.11.1: {}
- axios@1.7.4(debug@4.4.3):
+ axios@1.7.4(debug@4.3.6):
dependencies:
- follow-redirects: 1.15.6(debug@4.4.3)
- form-data: 4.0.4
+ follow-redirects: 1.15.6(debug@4.3.6)
+ form-data: 4.0.0
proxy-from-env: 1.1.0
transitivePeerDependencies:
- debug
b4a@1.6.6: {}
+ babel-plugin-jsx-dom-expressions@0.40.3(@babel/core@7.28.5):
+ dependencies:
+ '@babel/core': 7.28.5
+ '@babel/helper-module-imports': 7.18.6
+ '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.5)
+ '@babel/types': 7.28.6
+ html-entities: 2.3.3
+ parse5: 7.1.2
+
babel-plugin-jsx-dom-expressions@0.40.3(@babel/core@7.28.6):
dependencies:
'@babel/core': 7.28.6
@@ -15141,19 +16066,19 @@ snapshots:
transitivePeerDependencies:
- supports-color
- babel-preset-solid@1.9.10(@babel/core@7.28.6)(solid-js@1.9.10):
+ babel-preset-solid@1.9.10(@babel/core@7.28.5)(solid-js@1.9.11):
dependencies:
- '@babel/core': 7.28.6
- babel-plugin-jsx-dom-expressions: 0.40.3(@babel/core@7.28.6)
+ '@babel/core': 7.28.5
+ babel-plugin-jsx-dom-expressions: 0.40.3(@babel/core@7.28.5)
optionalDependencies:
- solid-js: 1.9.10
+ solid-js: 1.9.11
- babel-preset-solid@1.9.10(@babel/core@7.28.6)(solid-js@1.9.11):
+ babel-preset-solid@1.9.10(@babel/core@7.28.6)(solid-js@1.9.10):
dependencies:
'@babel/core': 7.28.6
babel-plugin-jsx-dom-expressions: 0.40.3(@babel/core@7.28.6)
optionalDependencies:
- solid-js: 1.9.11
+ solid-js: 1.9.10
babylon@6.18.0: {}
@@ -15241,6 +16166,23 @@ snapshots:
inherits: 2.0.4
readable-stream: 3.6.2
+ body-parser@1.20.2:
+ dependencies:
+ bytes: 3.1.2
+ content-type: 1.0.5
+ debug: 2.6.9
+ depd: 2.0.0
+ destroy: 1.2.0
+ http-errors: 2.0.0
+ iconv-lite: 0.4.24
+ on-finished: 2.4.1
+ qs: 6.11.0
+ raw-body: 2.5.2
+ type-is: 1.6.18
+ unpipe: 1.0.0
+ transitivePeerDependencies:
+ - supports-color
+
body-parser@1.20.3:
dependencies:
bytes: 3.1.2
@@ -15262,7 +16204,7 @@ snapshots:
dependencies:
bytes: 3.1.2
content-type: 1.0.5
- debug: 4.4.3(supports-color@5.5.0)
+ debug: 4.4.3
http-errors: 2.0.0
iconv-lite: 0.7.0
on-finished: 2.4.1
@@ -15302,11 +16244,19 @@ snapshots:
dependencies:
fill-range: 7.1.1
+ browserslist@4.28.0:
+ dependencies:
+ baseline-browser-mapping: 2.9.11
+ caniuse-lite: 1.0.30001762
+ electron-to-chromium: 1.5.267
+ node-releases: 2.0.27
+ update-browserslist-db: 1.2.3(browserslist@4.28.0)
+
browserslist@4.28.1:
dependencies:
baseline-browser-mapping: 2.9.11
caniuse-lite: 1.0.30001778
- electron-to-chromium: 1.5.302
+ electron-to-chromium: 1.5.267
node-releases: 2.0.27
update-browserslist-db: 1.2.3(browserslist@4.28.1)
@@ -15339,8 +16289,8 @@ snapshots:
ioredis: 5.4.1
lodash: 4.17.21
msgpackr: 1.11.0
- semver: 7.7.3
- tslib: 2.8.1
+ semver: 7.6.3
+ tslib: 2.6.3
uuid: 9.0.1
transitivePeerDependencies:
- supports-color
@@ -15349,9 +16299,9 @@ snapshots:
dependencies:
run-applescript: 7.1.0
- bundle-require@5.1.0(esbuild@0.25.11):
+ bundle-require@5.1.0(esbuild@0.25.0):
dependencies:
- esbuild: 0.25.11
+ esbuild: 0.25.0
load-tsconfig: 0.2.5
byline@5.0.0: {}
@@ -15368,7 +16318,7 @@ snapshots:
fs-minipass: 3.0.3
glob: 10.4.5
lru-cache: 10.4.3
- minipass: 7.1.3
+ minipass: 7.1.2
minipass-collect: 2.0.1
minipass-flush: 1.0.5
minipass-pipeline: 1.2.4
@@ -15383,6 +16333,14 @@ snapshots:
es-errors: 1.3.0
function-bind: 1.1.2
+ call-bind@1.0.7:
+ dependencies:
+ es-define-property: 1.0.1
+ es-errors: 1.3.0
+ function-bind: 1.1.2
+ get-intrinsic: 1.3.0
+ set-function-length: 1.2.2
+
call-bind@1.0.8:
dependencies:
call-bind-apply-helpers: 1.0.2
@@ -15421,6 +16379,8 @@ snapshots:
camelize@1.0.1: {}
+ caniuse-lite@1.0.30001762: {}
+
caniuse-lite@1.0.30001778: {}
canvas-confetti@1.5.1: {}
@@ -15849,7 +16809,7 @@ snapshots:
cosmiconfig@8.3.6(typescript@5.9.3):
dependencies:
import-fresh: 3.3.1
- js-yaml: 4.1.1
+ js-yaml: 4.1.0
parse-json: 5.2.0
path-type: 4.0.0
optionalDependencies:
@@ -15890,6 +16850,12 @@ snapshots:
shebang-command: 1.2.0
which: 1.3.1
+ cross-spawn@7.0.3:
+ dependencies:
+ path-key: 3.1.1
+ shebang-command: 2.0.0
+ which: 2.0.2
+
cross-spawn@7.0.6:
dependencies:
path-key: 3.1.1
@@ -15965,7 +16931,7 @@ snapshots:
date-fns@2.30.0:
dependencies:
- '@babel/runtime': 7.28.6
+ '@babel/runtime': 7.28.4
date-fns@3.6.0: {}
@@ -15983,12 +16949,20 @@ snapshots:
dependencies:
ms: 2.1.2
- debug@4.4.3(supports-color@5.5.0):
+ debug@4.3.6(supports-color@5.5.0):
dependencies:
- ms: 2.1.3
+ ms: 2.1.2
optionalDependencies:
supports-color: 5.5.0
+ debug@4.4.1:
+ dependencies:
+ ms: 2.1.3
+
+ debug@4.4.3:
+ dependencies:
+ ms: 2.1.3
+
decamelize-keys@1.1.1:
dependencies:
decamelize: 1.2.0
@@ -16153,7 +17127,7 @@ snapshots:
docker-modem@5.0.6:
dependencies:
- debug: 4.4.3(supports-color@5.5.0)
+ debug: 4.4.3
readable-stream: 3.6.2
split-ca: 1.0.1
ssh2: 1.16.0
@@ -16269,7 +17243,7 @@ snapshots:
dependencies:
jake: 10.9.4
- electron-to-chromium@1.5.302: {}
+ electron-to-chromium@1.5.267: {}
emoji-regex@8.0.0: {}
@@ -16292,6 +17266,11 @@ snapshots:
dependencies:
once: 1.4.0
+ enhanced-resolve@5.17.1:
+ dependencies:
+ graceful-fs: 4.2.11
+ tapable: 2.2.1
+
enhanced-resolve@5.20.0:
dependencies:
graceful-fs: 4.2.11
@@ -16401,6 +17380,34 @@ snapshots:
es6-promise@3.3.1: {}
+ esbuild@0.25.0:
+ optionalDependencies:
+ '@esbuild/aix-ppc64': 0.25.0
+ '@esbuild/android-arm': 0.25.0
+ '@esbuild/android-arm64': 0.25.0
+ '@esbuild/android-x64': 0.25.0
+ '@esbuild/darwin-arm64': 0.25.0
+ '@esbuild/darwin-x64': 0.25.0
+ '@esbuild/freebsd-arm64': 0.25.0
+ '@esbuild/freebsd-x64': 0.25.0
+ '@esbuild/linux-arm': 0.25.0
+ '@esbuild/linux-arm64': 0.25.0
+ '@esbuild/linux-ia32': 0.25.0
+ '@esbuild/linux-loong64': 0.25.0
+ '@esbuild/linux-mips64el': 0.25.0
+ '@esbuild/linux-ppc64': 0.25.0
+ '@esbuild/linux-riscv64': 0.25.0
+ '@esbuild/linux-s390x': 0.25.0
+ '@esbuild/linux-x64': 0.25.0
+ '@esbuild/netbsd-arm64': 0.25.0
+ '@esbuild/netbsd-x64': 0.25.0
+ '@esbuild/openbsd-arm64': 0.25.0
+ '@esbuild/openbsd-x64': 0.25.0
+ '@esbuild/sunos-x64': 0.25.0
+ '@esbuild/win32-arm64': 0.25.0
+ '@esbuild/win32-ia32': 0.25.0
+ '@esbuild/win32-x64': 0.25.0
+
esbuild@0.25.11:
optionalDependencies:
'@esbuild/aix-ppc64': 0.25.11
@@ -16483,7 +17490,7 @@ snapshots:
dependencies:
'@mdn/browser-compat-data': 6.1.5
ast-metadata-inferer: 0.8.1
- browserslist: 4.28.1
+ browserslist: 4.28.0
eslint: 9.39.1(jiti@2.6.1)
find-up: 5.0.0
globals: 15.15.0
@@ -16514,7 +17521,7 @@ snapshots:
eslint@9.39.1(jiti@2.6.1):
dependencies:
- '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.1(jiti@2.6.1))
+ '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.1(jiti@2.6.1))
'@eslint-community/regexpp': 4.12.2
'@eslint/config-array': 0.21.1
'@eslint/config-helpers': 0.4.2
@@ -16529,7 +17536,7 @@ snapshots:
ajv: 6.12.6
chalk: 4.1.2
cross-spawn: 7.0.6
- debug: 4.4.3(supports-color@5.5.0)
+ debug: 4.4.3
escape-string-regexp: 4.0.0
eslint-scope: 8.4.0
eslint-visitor-keys: 4.2.1
@@ -16637,7 +17644,7 @@ snapshots:
openapi3-ts: 3.2.0
promise-breaker: 6.0.0
pump: 3.0.0
- qs: 6.14.0
+ qs: 6.13.0
raw-body: 2.5.2
semver: 7.7.4
transitivePeerDependencies:
@@ -16696,7 +17703,7 @@ snapshots:
content-type: 1.0.5
cookie: 0.7.2
cookie-signature: 1.2.2
- debug: 4.4.3(supports-color@5.5.0)
+ debug: 4.4.3
depd: 2.0.0
encodeurl: 2.0.0
escape-html: 1.0.3
@@ -16772,6 +17779,11 @@ snapshots:
dependencies:
path-expression-matcher: 1.2.0
+ fast-xml-parser@4.4.1:
+ dependencies:
+ strnum: 1.0.5
+ optional: true
+
fast-xml-parser@4.5.3:
dependencies:
strnum: 1.1.2
@@ -16811,6 +17823,10 @@ snapshots:
dependencies:
websocket-driver: 0.7.4
+ fdir@6.4.4(picomatch@4.0.3):
+ optionalDependencies:
+ picomatch: 4.0.3
+
fdir@6.5.0(picomatch@4.0.3):
optionalDependencies:
picomatch: 4.0.3
@@ -16825,7 +17841,7 @@ snapshots:
dependencies:
flat-cache: 4.0.1
- filelist@1.0.6:
+ filelist@1.0.4:
dependencies:
minimatch: 5.1.9
@@ -16837,10 +17853,10 @@ snapshots:
dependencies:
app-module-path: 2.2.0
commander: 12.1.0
- enhanced-resolve: 5.20.0
+ enhanced-resolve: 5.17.1
module-definition: 6.0.0
module-lookup-amd: 9.0.2
- resolve: 1.22.11
+ resolve: 1.22.10
resolve-dependency-path: 4.0.0
sass-lookup: 6.0.1
stylus-lookup: 6.0.0
@@ -16879,7 +17895,7 @@ snapshots:
finalhandler@2.1.0:
dependencies:
- debug: 4.4.3(supports-color@5.5.0)
+ debug: 4.4.3
encodeurl: 2.0.0
escape-html: 1.0.3
on-finished: 2.4.1
@@ -16911,7 +17927,7 @@ snapshots:
dependencies:
'@fastify/busboy': 1.2.1
'@firebase/database-compat': 1.0.6
- '@firebase/database-types': 1.0.16
+ '@firebase/database-types': 1.0.4
'@types/node': 20.14.11
jsonwebtoken: 9.0.2
jwks-rsa: 3.1.0
@@ -16932,7 +17948,7 @@ snapshots:
ajv: 6.12.6
archiver: 7.0.1
async-lock: 1.4.1
- body-parser: 1.20.3
+ body-parser: 1.20.2
chokidar: 3.6.0
cjson: 0.3.3
cli-table: 0.3.11
@@ -16941,14 +17957,14 @@ snapshots:
configstore: 5.0.1
cors: 2.8.5
cross-env: 5.2.1
- cross-spawn: 7.0.6
+ cross-spawn: 7.0.3
csv-parse: 5.5.6
deep-equal-in-any-order: 2.0.6
exegesis: 4.2.0
exegesis-express: 4.0.0
express: 4.21.2
filesize: 6.4.0
- form-data: 4.0.4
+ form-data: 4.0.0
fs-extra: 10.1.0
fuzzy: 0.1.3
gaxios: 6.7.0(encoding@0.1.13)
@@ -16965,7 +17981,7 @@ snapshots:
mime: 2.6.0
minimatch: 3.1.2
morgan: 1.10.0
- node-fetch: 2.7.0(encoding@0.1.13)
+ node-fetch: 2.6.7(encoding@0.1.13)
open: 6.4.0
ora: 5.4.1
p-limit: 3.1.0
@@ -16975,7 +17991,7 @@ snapshots:
proxy-agent: 6.4.0
retry: 0.13.1
rimraf: 5.0.9
- semver: 7.7.3
+ semver: 7.6.3
sql-formatter: 15.3.2
stream-chain: 2.2.5
stream-json: 1.8.0
@@ -16983,7 +17999,7 @@ snapshots:
superstatic: 9.0.3(encoding@0.1.13)
tar: 6.2.1
tcp-port-used: 1.0.2
- tmp: 0.2.5
+ tmp: 0.2.3
triple-beam: 1.4.1
universal-analytics: 0.5.3
update-notifier-cjs: 5.1.6(encoding@0.1.13)
@@ -17043,9 +18059,9 @@ snapshots:
fn.name@1.1.0: {}
- follow-redirects@1.15.6(debug@4.4.3):
+ follow-redirects@1.15.6(debug@4.3.6):
optionalDependencies:
- debug: 4.4.3(supports-color@5.5.0)
+ debug: 4.3.6(supports-color@5.5.0)
fontawesome-subset@4.4.0(@fortawesome/fontawesome-free@5.15.4):
dependencies:
@@ -17078,6 +18094,12 @@ snapshots:
combined-stream: 1.0.8
mime-types: 2.1.35
+ form-data@4.0.0:
+ dependencies:
+ asynckit: 0.4.0
+ combined-stream: 1.0.8
+ mime-types: 2.1.35
+
form-data@4.0.4:
dependencies:
asynckit: 0.4.0
@@ -17107,7 +18129,7 @@ snapshots:
fs-extra@10.1.0:
dependencies:
graceful-fs: 4.2.11
- jsonfile: 6.2.0
+ jsonfile: 6.1.0
universalify: 2.0.1
fs-extra@11.3.2:
@@ -17129,7 +18151,7 @@ snapshots:
fs-minipass@3.0.3:
dependencies:
- minipass: 7.1.3
+ minipass: 7.1.2
optional: true
fs.realpath@1.0.0: {}
@@ -17173,7 +18195,7 @@ snapshots:
gaxios@6.7.0(encoding@0.1.13):
dependencies:
extend: 3.0.2
- https-proxy-agent: 7.0.6
+ https-proxy-agent: 7.0.5
is-stream: 2.0.1
node-fetch: 2.7.0(encoding@0.1.13)
uuid: 10.0.0
@@ -17242,7 +18264,7 @@ snapshots:
dependencies:
basic-ftp: 5.0.5
data-uri-to-buffer: 6.0.2
- debug: 4.4.3(supports-color@5.5.0)
+ debug: 4.4.3
fs-extra: 11.3.2
transitivePeerDependencies:
- supports-color
@@ -17316,7 +18338,7 @@ snapshots:
fs.realpath: 1.0.0
inflight: 1.0.6
inherits: 2.0.4
- minimatch: 5.1.9
+ minimatch: 5.1.6
once: 1.4.0
glob@9.3.5:
@@ -17334,6 +18356,8 @@ snapshots:
dependencies:
ini: 2.0.0
+ globals@11.12.0: {}
+
globals@14.0.0: {}
globals@15.15.0: {}
@@ -17388,7 +18412,7 @@ snapshots:
abort-controller: 3.0.0
duplexify: 4.1.3
google-auth-library: 9.12.0(encoding@0.1.13)
- node-fetch: 2.7.0(encoding@0.1.13)
+ node-fetch: 2.6.7(encoding@0.1.13)
object-hash: 3.0.0
proto3-json-serializer: 2.0.2
protobufjs: 7.3.2
@@ -17516,7 +18540,7 @@ snapshots:
entities: 4.5.0
param-case: 3.0.4
relateurl: 0.2.7
- terser: 5.46.0
+ terser: 5.31.3
html-minifier@4.0.0:
dependencies:
@@ -17568,14 +18592,14 @@ snapshots:
dependencies:
'@tootallnate/once': 2.0.0
agent-base: 6.0.2
- debug: 4.4.3(supports-color@5.5.0)
+ debug: 4.4.3
transitivePeerDependencies:
- supports-color
http-proxy-agent@7.0.2:
dependencies:
- agent-base: 7.1.4
- debug: 4.4.3(supports-color@5.5.0)
+ agent-base: 7.1.1
+ debug: 4.4.3
transitivePeerDependencies:
- supports-color
@@ -17584,14 +18608,21 @@ snapshots:
https-proxy-agent@5.0.1:
dependencies:
agent-base: 6.0.2
- debug: 4.4.3(supports-color@5.5.0)
+ debug: 4.4.3
+ transitivePeerDependencies:
+ - supports-color
+
+ https-proxy-agent@7.0.5:
+ dependencies:
+ agent-base: 7.1.1
+ debug: 4.4.3
transitivePeerDependencies:
- supports-color
https-proxy-agent@7.0.6:
dependencies:
agent-base: 7.1.4
- debug: 4.4.3(supports-color@5.5.0)
+ debug: 4.4.3
transitivePeerDependencies:
- supports-color
@@ -17638,7 +18669,7 @@ snapshots:
import-from-esm@1.3.4:
dependencies:
- debug: 4.4.3(supports-color@5.5.0)
+ debug: 4.4.3
import-meta-resolve: 4.2.0
transitivePeerDependencies:
- supports-color
@@ -17705,7 +18736,7 @@ snapshots:
ioredis@4.28.5:
dependencies:
cluster-key-slot: 1.1.2
- debug: 4.4.3(supports-color@5.5.0)
+ debug: 4.3.6(supports-color@5.5.0)
denque: 1.5.1
lodash.defaults: 4.2.0
lodash.flatten: 4.4.0
@@ -17722,7 +18753,7 @@ snapshots:
dependencies:
'@ioredis/commands': 1.2.0
cluster-key-slot: 1.1.2
- debug: 4.4.3(supports-color@5.5.0)
+ debug: 4.4.3
denque: 2.1.0
lodash.defaults: 4.2.0
lodash.isarguments: 3.1.0
@@ -17960,7 +18991,7 @@ snapshots:
isomorphic-fetch@3.0.0(encoding@0.1.13):
dependencies:
- node-fetch: 2.7.0(encoding@0.1.13)
+ node-fetch: 2.6.7(encoding@0.1.13)
whatwg-fetch: 3.6.20
transitivePeerDependencies:
- encoding
@@ -17976,7 +19007,7 @@ snapshots:
istanbul-lib-source-maps@5.0.6:
dependencies:
'@jridgewell/trace-mapping': 0.3.31
- debug: 4.4.3(supports-color@5.5.0)
+ debug: 4.4.3
istanbul-lib-coverage: 3.2.2
transitivePeerDependencies:
- supports-color
@@ -17997,7 +19028,7 @@ snapshots:
jake@10.9.4:
dependencies:
async: 3.2.6
- filelist: 1.0.6
+ filelist: 1.0.4
picocolors: 1.1.1
jiti@1.19.1: {}
@@ -18040,6 +19071,12 @@ snapshots:
js-tokens@4.0.0: {}
+ js-tokens@9.0.1: {}
+
+ js-yaml@4.1.0:
+ dependencies:
+ argparse: 2.0.1
+
js-yaml@4.1.1:
dependencies:
argparse: 2.0.1
@@ -18074,6 +19111,8 @@ snapshots:
- supports-color
- utf-8-validate
+ jsesc@2.5.2: {}
+
jsesc@3.1.0: {}
json-bigint@1.0.0:
@@ -18112,6 +19151,12 @@ snapshots:
json5@2.2.3: {}
+ jsonfile@6.1.0:
+ dependencies:
+ universalify: 2.0.1
+ optionalDependencies:
+ graceful-fs: 4.2.11
+
jsonfile@6.2.0:
dependencies:
universalify: 2.0.1
@@ -18163,7 +19208,7 @@ snapshots:
dependencies:
'@types/express': 4.17.21
'@types/jsonwebtoken': 9.0.6
- debug: 4.4.3(supports-color@5.5.0)
+ debug: 4.4.3
jose: 4.15.9
limiter: 1.1.5
lru-memoizer: 2.3.0
@@ -18202,15 +19247,15 @@ snapshots:
fast-glob: 3.3.3
globby: 13.2.2
jiti: 1.19.1
- js-yaml: 4.1.1
+ js-yaml: 4.1.0
micromatch: 4.0.8
minimist: 1.2.8
pretty-ms: 8.0.0
strip-json-comments: 5.0.3
summary: 2.1.0
typescript: 5.9.3
- zod: 3.23.8
- zod-validation-error: 1.3.1(zod@3.23.8)
+ zod: 3.25.76
+ zod-validation-error: 1.3.1(zod@3.25.76)
known-css-properties@0.30.0: {}
@@ -18351,7 +19396,7 @@ snapshots:
chalk: 5.2.0
cli-truncate: 3.1.0
commander: 10.0.1
- debug: 4.4.3(supports-color@5.5.0)
+ debug: 4.4.3
execa: 7.2.0
lilconfig: 2.1.0
listr2: 5.0.8
@@ -18515,7 +19560,7 @@ snapshots:
chalk: 4.1.2
commander: 7.2.0
commondir: 1.0.1
- debug: 4.4.3(supports-color@5.5.0)
+ debug: 4.4.1
dependency-tree: 11.0.1
ora: 5.4.1
pluralize: 8.0.0
@@ -18539,7 +19584,7 @@ snapshots:
magic-string@0.30.17:
dependencies:
- '@jridgewell/sourcemap-codec': 1.5.5
+ '@jridgewell/sourcemap-codec': 1.5.0
magic-string@0.30.21:
dependencies:
@@ -18551,8 +19596,8 @@ snapshots:
magicast@0.5.1:
dependencies:
- '@babel/parser': 7.28.6
- '@babel/types': 7.28.6
+ '@babel/parser': 7.28.5
+ '@babel/types': 7.28.5
source-map-js: 1.2.1
make-dir@3.1.0:
@@ -18571,7 +19616,7 @@ snapshots:
cacache: 18.0.4
http-cache-semantics: 4.1.1
is-lambda: 1.0.1
- minipass: 7.1.3
+ minipass: 7.1.2
minipass-fetch: 3.0.5
minipass-flush: 1.0.5
minipass-pipeline: 1.2.4
@@ -18689,6 +19734,10 @@ snapshots:
dependencies:
brace-expansion: 1.1.12
+ minimatch@5.1.6:
+ dependencies:
+ brace-expansion: 2.0.2
+
minimatch@5.1.9:
dependencies:
brace-expansion: 2.0.2
@@ -18719,12 +19768,12 @@ snapshots:
minipass-collect@2.0.1:
dependencies:
- minipass: 7.1.3
+ minipass: 7.1.2
optional: true
minipass-fetch@3.0.5:
dependencies:
- minipass: 7.1.3
+ minipass: 7.1.2
minipass-sized: 1.0.3
minizlib: 2.1.2
optionalDependencies:
@@ -18754,6 +19803,8 @@ snapshots:
minipass@5.0.0: {}
+ minipass@7.1.2: {}
+
minipass@7.1.3: {}
minizlib@2.1.2:
@@ -18763,7 +19814,7 @@ snapshots:
mjml-accordion@4.15.0(encoding@0.1.13):
dependencies:
- '@babel/runtime': 7.28.6
+ '@babel/runtime': 7.28.4
lodash: 4.17.21
mjml-core: 4.15.0(encoding@0.1.13)
transitivePeerDependencies:
@@ -18771,7 +19822,7 @@ snapshots:
mjml-body@4.15.0(encoding@0.1.13):
dependencies:
- '@babel/runtime': 7.28.6
+ '@babel/runtime': 7.28.4
lodash: 4.17.21
mjml-core: 4.15.0(encoding@0.1.13)
transitivePeerDependencies:
@@ -18779,7 +19830,7 @@ snapshots:
mjml-button@4.15.0(encoding@0.1.13):
dependencies:
- '@babel/runtime': 7.28.6
+ '@babel/runtime': 7.28.4
lodash: 4.17.21
mjml-core: 4.15.0(encoding@0.1.13)
transitivePeerDependencies:
@@ -18787,7 +19838,7 @@ snapshots:
mjml-carousel@4.15.0(encoding@0.1.13):
dependencies:
- '@babel/runtime': 7.28.6
+ '@babel/runtime': 7.28.4
lodash: 4.17.21
mjml-core: 4.15.0(encoding@0.1.13)
transitivePeerDependencies:
@@ -18795,7 +19846,7 @@ snapshots:
mjml-cli@4.15.0(encoding@0.1.13):
dependencies:
- '@babel/runtime': 7.28.6
+ '@babel/runtime': 7.28.4
chokidar: 3.6.0
glob: 10.4.5
html-minifier: 4.0.0
@@ -18811,7 +19862,7 @@ snapshots:
mjml-column@4.15.0(encoding@0.1.13):
dependencies:
- '@babel/runtime': 7.28.6
+ '@babel/runtime': 7.28.4
lodash: 4.17.21
mjml-core: 4.15.0(encoding@0.1.13)
transitivePeerDependencies:
@@ -18819,7 +19870,7 @@ snapshots:
mjml-core@4.15.0(encoding@0.1.13):
dependencies:
- '@babel/runtime': 7.28.6
+ '@babel/runtime': 7.28.4
cheerio: 1.0.0-rc.12
detect-node: 2.1.0
html-minifier: 4.0.0
@@ -18834,7 +19885,7 @@ snapshots:
mjml-divider@4.15.0(encoding@0.1.13):
dependencies:
- '@babel/runtime': 7.28.6
+ '@babel/runtime': 7.28.4
lodash: 4.17.21
mjml-core: 4.15.0(encoding@0.1.13)
transitivePeerDependencies:
@@ -18842,7 +19893,7 @@ snapshots:
mjml-group@4.15.0(encoding@0.1.13):
dependencies:
- '@babel/runtime': 7.28.6
+ '@babel/runtime': 7.28.4
lodash: 4.17.21
mjml-core: 4.15.0(encoding@0.1.13)
transitivePeerDependencies:
@@ -18850,7 +19901,7 @@ snapshots:
mjml-head-attributes@4.15.0(encoding@0.1.13):
dependencies:
- '@babel/runtime': 7.28.6
+ '@babel/runtime': 7.28.4
lodash: 4.17.21
mjml-core: 4.15.0(encoding@0.1.13)
transitivePeerDependencies:
@@ -18858,7 +19909,7 @@ snapshots:
mjml-head-breakpoint@4.15.0(encoding@0.1.13):
dependencies:
- '@babel/runtime': 7.28.6
+ '@babel/runtime': 7.28.4
lodash: 4.17.21
mjml-core: 4.15.0(encoding@0.1.13)
transitivePeerDependencies:
@@ -18866,7 +19917,7 @@ snapshots:
mjml-head-font@4.15.0(encoding@0.1.13):
dependencies:
- '@babel/runtime': 7.28.6
+ '@babel/runtime': 7.28.4
lodash: 4.17.21
mjml-core: 4.15.0(encoding@0.1.13)
transitivePeerDependencies:
@@ -18874,7 +19925,7 @@ snapshots:
mjml-head-html-attributes@4.15.0(encoding@0.1.13):
dependencies:
- '@babel/runtime': 7.28.6
+ '@babel/runtime': 7.28.4
lodash: 4.17.21
mjml-core: 4.15.0(encoding@0.1.13)
transitivePeerDependencies:
@@ -18882,7 +19933,7 @@ snapshots:
mjml-head-preview@4.15.0(encoding@0.1.13):
dependencies:
- '@babel/runtime': 7.28.6
+ '@babel/runtime': 7.28.4
lodash: 4.17.21
mjml-core: 4.15.0(encoding@0.1.13)
transitivePeerDependencies:
@@ -18890,7 +19941,7 @@ snapshots:
mjml-head-style@4.15.0(encoding@0.1.13):
dependencies:
- '@babel/runtime': 7.28.6
+ '@babel/runtime': 7.28.4
lodash: 4.17.21
mjml-core: 4.15.0(encoding@0.1.13)
transitivePeerDependencies:
@@ -18898,7 +19949,7 @@ snapshots:
mjml-head-title@4.15.0(encoding@0.1.13):
dependencies:
- '@babel/runtime': 7.28.6
+ '@babel/runtime': 7.28.4
lodash: 4.17.21
mjml-core: 4.15.0(encoding@0.1.13)
transitivePeerDependencies:
@@ -18906,7 +19957,7 @@ snapshots:
mjml-head@4.15.0(encoding@0.1.13):
dependencies:
- '@babel/runtime': 7.28.6
+ '@babel/runtime': 7.28.4
lodash: 4.17.21
mjml-core: 4.15.0(encoding@0.1.13)
transitivePeerDependencies:
@@ -18914,7 +19965,7 @@ snapshots:
mjml-hero@4.15.0(encoding@0.1.13):
dependencies:
- '@babel/runtime': 7.28.6
+ '@babel/runtime': 7.28.4
lodash: 4.17.21
mjml-core: 4.15.0(encoding@0.1.13)
transitivePeerDependencies:
@@ -18922,7 +19973,7 @@ snapshots:
mjml-image@4.15.0(encoding@0.1.13):
dependencies:
- '@babel/runtime': 7.28.6
+ '@babel/runtime': 7.28.4
lodash: 4.17.21
mjml-core: 4.15.0(encoding@0.1.13)
transitivePeerDependencies:
@@ -18930,7 +19981,7 @@ snapshots:
mjml-migrate@4.15.0(encoding@0.1.13):
dependencies:
- '@babel/runtime': 7.28.6
+ '@babel/runtime': 7.28.4
js-beautify: 1.15.1
lodash: 4.17.21
mjml-core: 4.15.0(encoding@0.1.13)
@@ -18941,7 +19992,7 @@ snapshots:
mjml-navbar@4.15.0(encoding@0.1.13):
dependencies:
- '@babel/runtime': 7.28.6
+ '@babel/runtime': 7.28.4
lodash: 4.17.21
mjml-core: 4.15.0(encoding@0.1.13)
transitivePeerDependencies:
@@ -18949,14 +20000,14 @@ snapshots:
mjml-parser-xml@4.15.0:
dependencies:
- '@babel/runtime': 7.28.6
+ '@babel/runtime': 7.28.4
detect-node: 2.1.0
htmlparser2: 9.1.0
lodash: 4.17.21
mjml-preset-core@4.15.0(encoding@0.1.13):
dependencies:
- '@babel/runtime': 7.28.6
+ '@babel/runtime': 7.28.4
mjml-accordion: 4.15.0(encoding@0.1.13)
mjml-body: 4.15.0(encoding@0.1.13)
mjml-button: 4.15.0(encoding@0.1.13)
@@ -18987,7 +20038,7 @@ snapshots:
mjml-raw@4.15.0(encoding@0.1.13):
dependencies:
- '@babel/runtime': 7.28.6
+ '@babel/runtime': 7.28.4
lodash: 4.17.21
mjml-core: 4.15.0(encoding@0.1.13)
transitivePeerDependencies:
@@ -18995,7 +20046,7 @@ snapshots:
mjml-section@4.15.0(encoding@0.1.13):
dependencies:
- '@babel/runtime': 7.28.6
+ '@babel/runtime': 7.28.4
lodash: 4.17.21
mjml-core: 4.15.0(encoding@0.1.13)
transitivePeerDependencies:
@@ -19003,7 +20054,7 @@ snapshots:
mjml-social@4.15.0(encoding@0.1.13):
dependencies:
- '@babel/runtime': 7.28.6
+ '@babel/runtime': 7.28.4
lodash: 4.17.21
mjml-core: 4.15.0(encoding@0.1.13)
transitivePeerDependencies:
@@ -19011,7 +20062,7 @@ snapshots:
mjml-spacer@4.15.0(encoding@0.1.13):
dependencies:
- '@babel/runtime': 7.28.6
+ '@babel/runtime': 7.28.4
lodash: 4.17.21
mjml-core: 4.15.0(encoding@0.1.13)
transitivePeerDependencies:
@@ -19019,7 +20070,7 @@ snapshots:
mjml-table@4.15.0(encoding@0.1.13):
dependencies:
- '@babel/runtime': 7.28.6
+ '@babel/runtime': 7.28.4
lodash: 4.17.21
mjml-core: 4.15.0(encoding@0.1.13)
transitivePeerDependencies:
@@ -19027,7 +20078,7 @@ snapshots:
mjml-text@4.15.0(encoding@0.1.13):
dependencies:
- '@babel/runtime': 7.28.6
+ '@babel/runtime': 7.28.4
lodash: 4.17.21
mjml-core: 4.15.0(encoding@0.1.13)
transitivePeerDependencies:
@@ -19035,11 +20086,11 @@ snapshots:
mjml-validator@4.13.0:
dependencies:
- '@babel/runtime': 7.28.6
+ '@babel/runtime': 7.28.4
mjml-wrapper@4.15.0(encoding@0.1.13):
dependencies:
- '@babel/runtime': 7.28.6
+ '@babel/runtime': 7.28.4
lodash: 4.17.21
mjml-core: 4.15.0(encoding@0.1.13)
mjml-section: 4.15.0(encoding@0.1.13)
@@ -19048,7 +20099,7 @@ snapshots:
mjml@4.15.0(encoding@0.1.13):
dependencies:
- '@babel/runtime': 7.28.6
+ '@babel/runtime': 7.25.0
mjml-cli: 4.15.0(encoding@0.1.13)
mjml-core: 4.15.0(encoding@0.1.13)
mjml-migrate: 4.15.0(encoding@0.1.13)
@@ -19212,6 +20263,12 @@ snapshots:
dependencies:
http2-client: 1.3.5
+ node-fetch@2.6.7(encoding@0.1.13):
+ dependencies:
+ whatwg-url: 5.0.0
+ optionalDependencies:
+ encoding: 0.1.13
+
node-fetch@2.7.0(encoding@0.1.13):
dependencies:
whatwg-url: 5.0.0
@@ -19249,14 +20306,14 @@ snapshots:
node-source-walk@7.0.0:
dependencies:
- '@babel/parser': 7.28.6
+ '@babel/parser': 7.28.5
nodemailer@7.0.11: {}
nodemon@3.1.14:
dependencies:
chokidar: 3.6.0
- debug: 4.4.3(supports-color@5.5.0)
+ debug: 4.3.6(supports-color@5.5.0)
ignore-by-default: 1.0.1
minimatch: 10.2.4
pstree.remy: 1.1.8
@@ -19560,11 +20617,11 @@ snapshots:
pac-proxy-agent@7.0.2:
dependencies:
'@tootallnate/quickjs-emscripten': 0.23.0
- agent-base: 7.1.4
- debug: 4.4.3(supports-color@5.5.0)
+ agent-base: 7.1.1
+ debug: 4.4.3
get-uri: 6.0.3
http-proxy-agent: 7.0.2
- https-proxy-agent: 7.0.6
+ https-proxy-agent: 7.0.5
pac-resolver: 7.0.1
socks-proxy-agent: 8.0.4
transitivePeerDependencies:
@@ -19594,14 +20651,14 @@ snapshots:
parse-json@5.2.0:
dependencies:
- '@babel/code-frame': 7.28.6
+ '@babel/code-frame': 7.27.1
error-ex: 1.3.4
json-parse-even-better-errors: 2.3.1
lines-and-columns: 1.2.4
parse-json@8.3.0:
dependencies:
- '@babel/code-frame': 7.28.6
+ '@babel/code-frame': 7.27.1
index-to-position: 1.2.0
type-fest: 4.41.0
@@ -19656,7 +20713,7 @@ snapshots:
path-scurry@1.11.1:
dependencies:
lru-cache: 10.4.3
- minipass: 7.1.3
+ minipass: 7.1.2
path-scurry@2.0.2:
dependencies:
@@ -19922,10 +20979,10 @@ snapshots:
proxy-agent@6.4.0:
dependencies:
- agent-base: 7.1.4
- debug: 4.4.3(supports-color@5.5.0)
+ agent-base: 7.1.1
+ debug: 4.4.3
http-proxy-agent: 7.0.2
- https-proxy-agent: 7.0.6
+ https-proxy-agent: 7.0.5
lru-cache: 7.18.3
pac-proxy-agent: 7.0.2
proxy-from-env: 1.1.0
@@ -19950,6 +21007,14 @@ snapshots:
dependencies:
escape-goat: 2.1.1
+ qs@6.11.0:
+ dependencies:
+ side-channel: 1.1.0
+
+ qs@6.12.3:
+ dependencies:
+ side-channel: 1.0.6
+
qs@6.13.0:
dependencies:
side-channel: 1.1.0
@@ -20093,7 +21158,7 @@ snapshots:
readdir-glob@1.1.3:
dependencies:
- minimatch: 5.1.9
+ minimatch: 5.1.6
readdirp@3.6.0:
dependencies:
@@ -20176,6 +21241,8 @@ snapshots:
regenerate@1.4.2: {}
+ regenerator-runtime@0.14.1: {}
+
regexp.prototype.flags@1.5.4:
dependencies:
call-bind: 1.0.8
@@ -20233,6 +21300,12 @@ snapshots:
resolve-pkg-maps@1.0.0: {}
+ resolve@1.22.10:
+ dependencies:
+ is-core-module: 2.16.1
+ path-parse: 1.0.7
+ supports-preserve-symlinks-flag: 1.0.0
+
resolve@1.22.11:
dependencies:
is-core-module: 2.16.1
@@ -20309,6 +21382,32 @@ snapshots:
optionalDependencies:
fsevents: 2.3.3
+ rollup@4.40.0:
+ dependencies:
+ '@types/estree': 1.0.7
+ optionalDependencies:
+ '@rollup/rollup-android-arm-eabi': 4.40.0
+ '@rollup/rollup-android-arm64': 4.40.0
+ '@rollup/rollup-darwin-arm64': 4.40.0
+ '@rollup/rollup-darwin-x64': 4.40.0
+ '@rollup/rollup-freebsd-arm64': 4.40.0
+ '@rollup/rollup-freebsd-x64': 4.40.0
+ '@rollup/rollup-linux-arm-gnueabihf': 4.40.0
+ '@rollup/rollup-linux-arm-musleabihf': 4.40.0
+ '@rollup/rollup-linux-arm64-gnu': 4.40.0
+ '@rollup/rollup-linux-arm64-musl': 4.40.0
+ '@rollup/rollup-linux-loongarch64-gnu': 4.40.0
+ '@rollup/rollup-linux-powerpc64le-gnu': 4.40.0
+ '@rollup/rollup-linux-riscv64-gnu': 4.40.0
+ '@rollup/rollup-linux-riscv64-musl': 4.40.0
+ '@rollup/rollup-linux-s390x-gnu': 4.40.0
+ '@rollup/rollup-linux-x64-gnu': 4.40.0
+ '@rollup/rollup-linux-x64-musl': 4.40.0
+ '@rollup/rollup-win32-arm64-msvc': 4.40.0
+ '@rollup/rollup-win32-ia32-msvc': 4.40.0
+ '@rollup/rollup-win32-x64-msvc': 4.40.0
+ fsevents: 2.3.3
+
rollup@4.52.5:
dependencies:
'@types/estree': 1.0.8
@@ -20351,7 +21450,7 @@ snapshots:
router@2.2.0:
dependencies:
- debug: 4.4.3(supports-color@5.5.0)
+ debug: 4.4.3
depd: 2.0.0
is-promise: 4.0.0
parseurl: 1.3.3
@@ -20445,6 +21544,8 @@ snapshots:
dependencies:
lru-cache: 6.0.0
+ semver@7.6.3: {}
+
semver@7.7.3: {}
semver@7.7.4: {}
@@ -20487,7 +21588,7 @@ snapshots:
send@1.2.0:
dependencies:
- debug: 4.4.3(supports-color@5.5.0)
+ debug: 4.4.3
encodeurl: 2.0.0
escape-html: 1.0.3
etag: 1.8.1
@@ -20627,6 +21728,13 @@ snapshots:
object-inspect: 1.13.4
side-channel-map: 1.0.1
+ side-channel@1.0.6:
+ dependencies:
+ call-bind: 1.0.7
+ es-errors: 1.3.0
+ get-intrinsic: 1.3.0
+ object-inspect: 1.13.4
+
side-channel@1.1.0:
dependencies:
es-errors: 1.3.0
@@ -20645,7 +21753,7 @@ snapshots:
dependencies:
'@kwsites/file-exists': 1.1.1
'@kwsites/promise-deferred': 1.1.1
- debug: 4.4.3(supports-color@5.5.0)
+ debug: 4.4.3
transitivePeerDependencies:
- supports-color
@@ -20659,7 +21767,7 @@ snapshots:
simple-websocket@9.1.0:
dependencies:
- debug: 4.4.3(supports-color@5.5.0)
+ debug: 4.4.3
queue-microtask: 1.2.3
randombytes: 2.1.0
readable-stream: 3.6.2
@@ -20712,8 +21820,8 @@ snapshots:
socks-proxy-agent@8.0.4:
dependencies:
- agent-base: 7.1.4
- debug: 4.4.3(supports-color@5.5.0)
+ agent-base: 7.1.1
+ debug: 4.4.3
socks: 2.8.3
transitivePeerDependencies:
- supports-color
@@ -20750,18 +21858,18 @@ snapshots:
solid-refresh@0.6.3(solid-js@1.9.10):
dependencies:
- '@babel/generator': 7.28.6
- '@babel/helper-module-imports': 7.28.6
- '@babel/types': 7.28.6
+ '@babel/generator': 7.28.5
+ '@babel/helper-module-imports': 7.27.1
+ '@babel/types': 7.28.5
solid-js: 1.9.10
transitivePeerDependencies:
- supports-color
solid-refresh@0.6.3(solid-js@1.9.11):
dependencies:
- '@babel/generator': 7.28.6
- '@babel/helper-module-imports': 7.28.6
- '@babel/types': 7.28.6
+ '@babel/generator': 7.28.5
+ '@babel/helper-module-imports': 7.27.1
+ '@babel/types': 7.28.5
solid-js: 1.9.11
transitivePeerDependencies:
- supports-color
@@ -20845,7 +21953,7 @@ snapshots:
ssri@10.0.6:
dependencies:
- minipass: 7.1.3
+ minipass: 7.1.2
optional: true
stack-trace@0.0.10: {}
@@ -20899,7 +22007,7 @@ snapshots:
'@testing-library/user-event': 14.6.1(@testing-library/dom@10.4.1)
'@vitest/expect': 3.2.4
'@vitest/spy': 3.2.4
- esbuild: 0.27.3
+ esbuild: 0.25.11
open: 10.2.0
recast: 0.23.11
semver: 7.7.3
@@ -21012,6 +22120,10 @@ snapshots:
dependencies:
ansi-regex: 5.0.1
+ strip-ansi@7.1.0:
+ dependencies:
+ ansi-regex: 6.2.2
+
strip-ansi@7.1.2:
dependencies:
ansi-regex: 6.2.2
@@ -21034,6 +22146,9 @@ snapshots:
strip-json-comments@5.0.3: {}
+ strnum@1.0.5:
+ optional: true
+
strnum@1.1.2: {}
strnum@2.2.2: {}
@@ -21088,7 +22203,7 @@ snapshots:
dependencies:
component-emitter: 1.3.1
cookiejar: 2.1.4
- debug: 4.4.3(supports-color@5.5.0)
+ debug: 4.4.3
fast-safe-stringify: 2.1.1
form-data: 4.0.4
formidable: 3.5.4
@@ -21152,14 +22267,14 @@ snapshots:
swagger-stats@0.99.7(prom-client@15.1.3):
dependencies:
- axios: 1.7.4(debug@4.4.3)
+ axios: 1.7.4(debug@4.3.6)
basic-auth: 2.0.1
cookies: 0.8.0
- debug: 4.4.3(supports-color@5.5.0)
+ debug: 4.3.6(supports-color@5.5.0)
moment: 2.30.1
path-to-regexp: 6.2.2
prom-client: 15.1.3
- qs: 6.14.0
+ qs: 6.12.3
send: 0.18.0
uuid: 9.0.1
transitivePeerDependencies:
@@ -21189,6 +22304,8 @@ snapshots:
tailwindcss@4.2.1: {}
+ tapable@2.2.1: {}
+
tapable@2.3.0: {}
tar-fs@2.1.4:
@@ -21262,10 +22379,10 @@ snapshots:
type-fest: 0.16.0
unique-string: 2.0.0
- terser@5.46.0:
+ terser@5.31.3:
dependencies:
- '@jridgewell/source-map': 0.3.11
- acorn: 8.15.0
+ '@jridgewell/source-map': 0.3.6
+ acorn: 8.14.0
commander: 2.20.3
source-map-support: 0.5.21
@@ -21283,7 +22400,7 @@ snapshots:
archiver: 7.0.1
async-lock: 1.4.1
byline: 5.0.0
- debug: 4.4.3(supports-color@5.5.0)
+ debug: 4.4.3
docker-compose: 1.3.0
dockerode: 4.0.9
get-port: 7.1.0
@@ -21333,6 +22450,11 @@ snapshots:
tinyexec@1.0.2: {}
+ tinyglobby@0.2.13:
+ dependencies:
+ fdir: 6.4.4(picomatch@4.0.3)
+ picomatch: 4.0.3
+
tinyglobby@0.2.15:
dependencies:
fdir: 6.5.0(picomatch@4.0.3)
@@ -21356,6 +22478,8 @@ snapshots:
dependencies:
os-tmpdir: 1.0.2
+ tmp@0.2.3: {}
+
tmp@0.2.5: {}
to-no-case@1.0.2: {}
@@ -21453,27 +22577,29 @@ snapshots:
minimist: 1.2.8
strip-bom: 3.0.0
+ tslib@2.6.3: {}
+
tslib@2.8.1: {}
tsscmp@1.0.6: {}
tsup@8.4.0(jiti@2.6.1)(postcss@8.5.8)(tsx@4.21.0)(typescript@6.0.2)(yaml@2.8.2):
dependencies:
- bundle-require: 5.1.0(esbuild@0.25.11)
+ bundle-require: 5.1.0(esbuild@0.25.0)
cac: 6.7.14
chokidar: 4.0.3
consola: 3.4.0
- debug: 4.4.3(supports-color@5.5.0)
- esbuild: 0.25.11
+ debug: 4.4.1
+ esbuild: 0.25.0
joycon: 3.1.1
picocolors: 1.1.1
postcss-load-config: 6.0.1(jiti@2.6.1)(postcss@8.5.8)(tsx@4.21.0)(yaml@2.8.2)
resolve-from: 5.0.0
- rollup: 4.52.5
+ rollup: 4.40.0
source-map: 0.8.0-beta.0
sucrase: 3.35.0
tinyexec: 0.3.2
- tinyglobby: 0.2.15
+ tinyglobby: 0.2.13
tree-kill: 1.2.2
optionalDependencies:
postcss: 8.5.8
@@ -21648,7 +22774,7 @@ snapshots:
universal-analytics@0.5.3:
dependencies:
- debug: 4.4.3(supports-color@5.5.0)
+ debug: 4.4.3
uuid: 8.3.2
transitivePeerDependencies:
- supports-color
@@ -21672,14 +22798,14 @@ snapshots:
unplugin@1.0.1:
dependencies:
- acorn: 8.15.0
+ acorn: 8.14.0
chokidar: 3.6.0
webpack-sources: 3.2.3
webpack-virtual-modules: 0.5.0
unplugin@1.16.1:
dependencies:
- acorn: 8.15.0
+ acorn: 8.14.0
webpack-virtual-modules: 0.6.2
unplugin@2.3.11:
@@ -21691,6 +22817,12 @@ snapshots:
upath@1.2.0: {}
+ update-browserslist-db@1.2.3(browserslist@4.28.0):
+ dependencies:
+ browserslist: 4.28.0
+ escalade: 3.2.0
+ picocolors: 1.1.1
+
update-browserslist-db@1.2.3(browserslist@4.28.1):
dependencies:
browserslist: 4.28.1
@@ -21781,7 +22913,7 @@ snapshots:
vite-plugin-inspect@11.3.3(vite@8.0.1(@types/node@24.9.1)(esbuild@0.27.3)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2)):
dependencies:
ansis: 4.2.0
- debug: 4.4.3(supports-color@5.5.0)
+ debug: 4.4.3
error-stack-parser-es: 1.0.5
ohash: 2.0.11
open: 10.2.0
@@ -21801,7 +22933,7 @@ snapshots:
vite-plugin-pwa@1.1.0(vite@8.0.1(@types/node@24.9.1)(esbuild@0.27.3)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2))(workbox-build@7.1.1(@types/babel__core@7.20.5))(workbox-window@7.1.0):
dependencies:
- debug: 4.4.3(supports-color@5.5.0)
+ debug: 4.4.3
pretty-bytes: 6.1.1
tinyglobby: 0.2.15
vite: 8.0.1(@types/node@24.9.1)(esbuild@0.27.3)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2)
@@ -21812,9 +22944,9 @@ snapshots:
vite-plugin-solid@2.11.10(@testing-library/jest-dom@6.9.1)(solid-js@1.9.11)(vite@7.3.1(@types/node@24.9.1)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.98.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2)):
dependencies:
- '@babel/core': 7.28.6
+ '@babel/core': 7.28.5
'@types/babel__core': 7.20.5
- babel-preset-solid: 1.9.10(@babel/core@7.28.6)(solid-js@1.9.11)
+ babel-preset-solid: 1.9.10(@babel/core@7.28.5)(solid-js@1.9.11)
merge-anything: 5.1.7
solid-js: 1.9.11
solid-refresh: 0.6.3(solid-js@1.9.11)
@@ -21875,6 +23007,23 @@ snapshots:
tsx: 4.21.0
yaml: 2.8.2
+ vite@8.0.1(@types/node@24.9.1)(esbuild@0.25.0)(jiti@2.6.1)(sass@1.98.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2):
+ dependencies:
+ lightningcss: 1.32.0
+ picomatch: 4.0.3
+ postcss: 8.5.8
+ rolldown: 1.0.0-rc.10
+ tinyglobby: 0.2.15
+ optionalDependencies:
+ '@types/node': 24.9.1
+ esbuild: 0.25.0
+ fsevents: 2.3.3
+ jiti: 2.6.1
+ sass: 1.98.0
+ terser: 5.46.1
+ tsx: 4.21.0
+ yaml: 2.8.2
+
vite@8.0.1(@types/node@24.9.1)(esbuild@0.27.3)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2):
dependencies:
lightningcss: 1.32.0
@@ -22006,6 +23155,35 @@ snapshots:
transitivePeerDependencies:
- msw
+ vitest@4.1.0(@types/node@24.9.1)(happy-dom@20.0.10)(jsdom@27.4.0)(vite@8.0.1(@types/node@24.9.1)(esbuild@0.25.0)(jiti@2.6.1)(sass@1.98.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2)):
+ dependencies:
+ '@vitest/expect': 4.1.0
+ '@vitest/mocker': 4.1.0(vite@8.0.1(@types/node@24.9.1)(esbuild@0.25.0)(jiti@2.6.1)(sass@1.98.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2))
+ '@vitest/pretty-format': 4.1.0
+ '@vitest/runner': 4.1.0
+ '@vitest/snapshot': 4.1.0
+ '@vitest/spy': 4.1.0
+ '@vitest/utils': 4.1.0
+ es-module-lexer: 2.0.0
+ expect-type: 1.3.0
+ magic-string: 0.30.21
+ obug: 2.1.1
+ pathe: 2.0.3
+ picomatch: 4.0.3
+ std-env: 4.0.0
+ tinybench: 2.9.0
+ tinyexec: 1.0.2
+ tinyglobby: 0.2.15
+ tinyrainbow: 3.0.3
+ vite: 8.0.1(@types/node@24.9.1)(esbuild@0.25.0)(jiti@2.6.1)(sass@1.98.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2)
+ why-is-node-running: 2.3.0
+ optionalDependencies:
+ '@types/node': 24.9.1
+ happy-dom: 20.0.10
+ jsdom: 27.4.0
+ transitivePeerDependencies:
+ - msw
+
vitest@4.1.0(@types/node@24.9.1)(happy-dom@20.0.10)(jsdom@27.4.0)(vite@8.0.1(@types/node@24.9.1)(esbuild@0.27.3)(jiti@2.6.1)(sass@1.70.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2)):
dependencies:
'@vitest/expect': 4.1.0
@@ -22191,7 +23369,7 @@ snapshots:
winston@3.6.0:
dependencies:
'@dabh/diagnostics': 2.0.3
- async: 3.2.6
+ async: 3.2.5
is-stream: 2.0.1
logform: 2.6.1
one-time: 1.0.0
@@ -22425,8 +23603,10 @@ snapshots:
dependencies:
zod: 3.23.8
- zod-validation-error@1.3.1(zod@3.23.8):
+ zod-validation-error@1.3.1(zod@3.25.76):
dependencies:
- zod: 3.23.8
+ zod: 3.25.76
zod@3.23.8: {}
+
+ zod@3.25.76: {}
|