chore: remove config from shared-types (@fehmer) (#5681)

* chore: remove config from shared-types (@fehmer)

* fix

* remove shared-types/user

* build before test

* fix

* add madge to contracts
This commit is contained in:
Christian Fehmer 2024-07-30 17:37:38 +02:00 committed by GitHub
parent 1164f4a114
commit 6b9f4a0f18
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
52 changed files with 164 additions and 202 deletions

View file

@ -10,8 +10,11 @@ import { ObjectId } from "mongodb";
import * as LeaderboardDal from "../../dal/leaderboards";
import MonkeyError from "../../utils/error";
import isNumber from "lodash/isNumber";
import { Mode } from "@monkeytype/shared-types/config";
import { PersonalBest, PersonalBests } from "@monkeytype/shared-types/user";
import {
Mode,
PersonalBest,
PersonalBests,
} from "@monkeytype/contracts/schemas/shared";
type GenerateDataOptions = {
firstTestTimestamp: Date;

View file

@ -28,7 +28,7 @@ import * as AuthUtil from "../../utils/auth";
import * as Dates from "date-fns";
import { UTCDateMini } from "@date-fns/utc";
import * as BlocklistDal from "../../dal/blocklist";
import { Mode, Mode2 } from "@monkeytype/shared-types/config";
import { Mode, Mode2 } from "@monkeytype/contracts/schemas/shared";
import {
AllTimeLbs,
CountByYearAndDay,

View file

@ -9,7 +9,7 @@ import MonkeyError from "../utils/error";
import * as db from "../init/db";
import { DBResult as SharedDBResult } from "@monkeytype/shared-types";
import { getUser, getTags } from "./user";
import { Mode } from "@monkeytype/shared-types/config";
import { Mode } from "@monkeytype/contracts/schemas/shared";
type DBResult = MonkeyTypes.WithObjectId<SharedDBResult<Mode>>;

View file

@ -28,8 +28,11 @@ import {
UserQuoteRatings,
UserStreak,
} from "@monkeytype/shared-types";
import { Mode, Mode2 } from "@monkeytype/shared-types/config";
import { PersonalBest } from "@monkeytype/shared-types/user";
import {
Mode,
Mode2,
PersonalBest,
} from "@monkeytype/contracts/schemas/shared";
const SECONDS_PER_HOUR = 3600;

View file

@ -65,7 +65,10 @@ declare namespace MonkeyTypes {
type LbPersonalBests = {
time: Record<
number,
Record<string, import("@monkeytype/shared-types/user").PersonalBest>
Record<
string,
import("@monkeytype/contracts/schemas/shared").PersonalBest
>
>;
};
@ -123,7 +126,7 @@ declare namespace MonkeyTypes {
type DBResult = MonkeyTypes.WithObjectId<
import("@monkeytype/shared-types").DBResult<
import("@monkeytype/shared-types/config").Mode
import("@monkeytype/contracts/schemas/shared").Mode
>
>;

View file

@ -1,8 +1,12 @@
import _ from "lodash";
import FunboxList from "../constants/funbox-list";
import { PersonalBest, PersonalBests } from "@monkeytype/shared-types/user";
import { DBResult } from "@monkeytype/shared-types";
import { Mode, Mode2 } from "@monkeytype/shared-types/config";
import {
Mode,
Mode2,
PersonalBest,
PersonalBests,
} from "@monkeytype/contracts/schemas/shared";
type CheckAndUpdatePbResult = {
isPb: boolean;

View file

@ -1,5 +1,5 @@
import { Result } from "@monkeytype/shared-types";
import { Mode } from "@monkeytype/shared-types/config";
import { Mode } from "@monkeytype/contracts/schemas/shared";
import "dotenv/config";
import { Counter, Histogram, Gauge } from "prom-client";
import { TsRestRequestWithCtx } from "../middlewares/auth";

View file

@ -1,5 +1,5 @@
import { CompletedEvent, DBResult } from "@monkeytype/shared-types";
import { Mode } from "@monkeytype/shared-types/config";
import { Mode } from "@monkeytype/contracts/schemas/shared";
import { ObjectId } from "mongodb";
type Result = MonkeyTypes.WithObjectId<DBResult<Mode>>;

View file

@ -1,5 +1,5 @@
import { DBResult, Result } from "@monkeytype/shared-types";
import { Mode } from "@monkeytype/shared-types/config";
import { Mode } from "@monkeytype/contracts/schemas/shared";
const BASE_PATH = "/results";

View file

@ -6,7 +6,7 @@ import {
UserProfileDetails,
UserTag,
} from "@monkeytype/shared-types";
import { Mode, Mode2 } from "@monkeytype/shared-types/config";
import { Mode, Mode2 } from "@monkeytype/contracts/schemas/shared";
const BASE_PATH = "/users";

View file

@ -20,6 +20,7 @@ import { isDevEnvironment, reloadAfter } from "./utils/misc";
import * as ConfigSchemas from "@monkeytype/contracts/schemas/configs";
import { Config } from "@monkeytype/contracts/schemas/configs";
import { roundTo1 } from "./utils/numbers";
import { Mode, ModeSchema } from "@monkeytype/contracts/schemas/shared";
export let localStorageConfig: Config;
@ -107,8 +108,8 @@ export function setPunctuation(punc: boolean, nosave?: boolean): boolean {
return true;
}
export function setMode(mode: ConfigSchemas.Mode, nosave?: boolean): boolean {
if (!isConfigValueValid("mode", mode, ConfigSchemas.ModeSchema)) {
export function setMode(mode: Mode, nosave?: boolean): boolean {
if (!isConfigValueValid("mode", mode, ModeSchema)) {
return false;
}

View file

@ -17,8 +17,8 @@ import {
import {
Config as ConfigType,
Difficulty,
Mode,
} from "@monkeytype/shared-types/config";
} from "@monkeytype/contracts/schemas/configs";
import { Mode } from "@monkeytype/contracts/schemas/shared";
let challengeLoading = false;

View file

@ -8,7 +8,7 @@ import { capsState } from "../test/caps-warning";
import * as Notifications from "../elements/notifications";
import type { Howl } from "howler";
import { PlaySoundOnClick } from "@monkeytype/shared-types/config";
import { PlaySoundOnClick } from "@monkeytype/contracts/schemas/configs";
async function gethowler(): Promise<typeof import("howler")> {
return await import("howler");

View file

@ -14,14 +14,15 @@ import {
ModifiableTestActivityCalendar,
} from "./elements/test-activity-calendar";
import * as Loader from "./elements/loader";
import { PersonalBest, PersonalBests } from "@monkeytype/shared-types/user";
import { Badge, DBResult, Result } from "@monkeytype/shared-types";
import { Config, Difficulty } from "@monkeytype/contracts/schemas/configs";
import {
Config,
Difficulty,
Mode,
Mode2,
} from "@monkeytype/shared-types/config";
PersonalBest,
PersonalBests,
} from "@monkeytype/contracts/schemas/shared";
let dbSnapshot: MonkeyTypes.Snapshot | undefined;

View file

@ -1,8 +1,7 @@
import Config from "../../config";
import { format as dateFormat } from "date-fns/format";
import Format from "../../utils/format";
import { PersonalBests } from "@monkeytype/shared-types/user";
import { Mode2 } from "@monkeytype/shared-types/config";
import { Mode2, PersonalBests } from "@monkeytype/contracts/schemas/shared";
import { StringNumber } from "@monkeytype/contracts/schemas/util";
function clearTables(isProfile: boolean): void {

View file

@ -9,7 +9,7 @@ import * as Loader from "../loader";
// @ts-expect-error TODO: update slim-select
import SlimSelect from "slim-select";
import { ResultFilters } from "@monkeytype/shared-types";
import { QuoteLength } from "@monkeytype/shared-types/config";
import { QuoteLength } from "@monkeytype/contracts/schemas/configs";
type Option = {
id: string;

View file

@ -1,4 +1,4 @@
import { CustomBackgroundFilter } from "@monkeytype/shared-types/config";
import { CustomBackgroundFilter } from "@monkeytype/contracts/schemas/configs";
import * as UpdateConfig from "../config";
import * as ConfigEvent from "../observables/config-event";
import { debounce } from "throttle-debounce";

View file

@ -1,4 +1,4 @@
import { ConfigValue } from "@monkeytype/shared-types/config";
import { ConfigValue } from "@monkeytype/contracts/schemas/configs";
import Config from "../../config";
import * as Notifications from "../notifications";
// @ts-expect-error TODO: update slim-select

View file

@ -7,7 +7,7 @@ import * as ConnectionState from "../states/connection";
import { areUnsortedArraysEqual } from "../utils/arrays";
import * as TestResult from "../test/result";
import AnimatedModal from "../utils/animated-modal";
import { Mode } from "@monkeytype/shared-types/config";
import { Mode } from "@monkeytype/contracts/schemas/shared";
import { Result } from "@monkeytype/shared-types";
type State = {

View file

@ -6,7 +6,8 @@ import * as CustomTestDurationPopup from "./custom-test-duration";
import * as QuoteSearchModal from "./quote-search";
import * as CustomTextPopup from "./custom-text";
import AnimatedModal from "../utils/animated-modal";
import { Mode, QuoteLength } from "@monkeytype/shared-types/config";
import { QuoteLength } from "@monkeytype/contracts/schemas/configs";
import { Mode } from "@monkeytype/contracts/schemas/shared";
function update(): void {
const el = $("#mobileTestConfigModal");

View file

@ -4,8 +4,11 @@ import { getLanguageDisplayString } from "../utils/strings";
import Config from "../config";
import Format from "../utils/format";
import AnimatedModal from "../utils/animated-modal";
import { PersonalBest } from "@monkeytype/shared-types/user";
import { Mode, Mode2 } from "@monkeytype/shared-types/config";
import {
Mode,
Mode2,
PersonalBest,
} from "@monkeytype/contracts/schemas/shared";
type PBWithMode2 = {
mode2: Mode2<Mode>;

View file

@ -22,7 +22,7 @@ import * as TestState from "../test/test-state";
import AnimatedModal, { ShowOptions } from "../utils/animated-modal";
import * as TestLogic from "../test/test-logic";
import { createErrorMessage } from "../utils/misc";
import { QuoteLength } from "@monkeytype/shared-types/config";
import { QuoteLength } from "@monkeytype/contracts/schemas/configs";
const searchServiceCache: Record<string, SearchService<MonkeyTypes.Quote>> = {};

View file

@ -4,7 +4,8 @@ import { getMode2 } from "../utils/misc";
import * as CustomText from "../test/custom-text";
import { compressToURI } from "lz-ts";
import AnimatedModal, { ShowOptions } from "../utils/animated-modal";
import { Difficulty, Mode, Mode2 } from "@monkeytype/shared-types/config";
import { Difficulty } from "@monkeytype/contracts/schemas/configs";
import { Mode, Mode2 } from "@monkeytype/contracts/schemas/shared";
import { CustomTextData } from "@monkeytype/shared-types";
function getCheckboxValue(checkbox: string): boolean {

View file

@ -1,4 +1,4 @@
import { Config, ConfigValue } from "@monkeytype/shared-types/config";
import { Config, ConfigValue } from "@monkeytype/contracts/schemas/configs";
type SubscribeFunction = (
key: string,

View file

@ -28,8 +28,12 @@ import * as ResultBatches from "../elements/result-batches";
import Format from "../utils/format";
import * as TestActivity from "../elements/test-activity";
import { ChartData, Result } from "@monkeytype/shared-types";
import { Mode, Mode2, Mode2Custom } from "@monkeytype/shared-types/config";
import { PersonalBests } from "@monkeytype/shared-types/user";
import {
Mode,
Mode2,
Mode2Custom,
PersonalBests,
} from "@monkeytype/contracts/schemas/shared";
let filterDebug = false;
//toggle filterdebug

View file

@ -7,7 +7,7 @@ import { checkIfGetParameterExists } from "../utils/misc";
import * as UserReportModal from "../modals/user-report";
import * as Skeleton from "../utils/skeleton";
import { UserProfile } from "@monkeytype/shared-types";
import { PersonalBests } from "@monkeytype/shared-types/user";
import { PersonalBests } from "@monkeytype/contracts/schemas/shared";
function reset(): void {
$(".page.pageProfile .preloader").removeClass("hidden");

View file

@ -23,7 +23,7 @@ import SlimSelect from "slim-select";
import * as Skeleton from "../utils/skeleton";
import * as CustomBackgroundFilter from "../elements/custom-background-filter";
import { ConfigValue } from "@monkeytype/shared-types/config";
import { ConfigValue } from "@monkeytype/contracts/schemas/configs";
type SettingsGroups<T extends ConfigValue> = Record<string, SettingsGroup<T>>;

View file

@ -1,4 +1,4 @@
import { ConfigValue } from "@monkeytype/shared-types/config";
import { ConfigValue } from "@monkeytype/contracts/schemas/configs";
type SetFunction<T> = (param: T, nosave?: boolean) => boolean;

View file

@ -2,7 +2,7 @@ import * as FunboxList from "./funbox-list";
import * as Notifications from "../../elements/notifications";
import * as Arrays from "../../utils/arrays";
import * as Strings from "../../utils/strings";
import { Config, ConfigValue } from "@monkeytype/shared-types/config";
import { Config, ConfigValue } from "@monkeytype/contracts/schemas/configs";
export function checkFunboxForcedConfigs(
key: string,

View file

@ -26,7 +26,8 @@ import {
import { Wordset } from "../wordset";
import * as LayoutfluidFunboxTimer from "./layoutfluid-funbox-timer";
import * as DDR from "../../utils/ddr";
import { HighlightMode, Mode } from "@monkeytype/shared-types/config";
import { HighlightMode } from "@monkeytype/contracts/schemas/configs";
import { Mode } from "@monkeytype/contracts/schemas/shared";
const prefixSize = 2;

View file

@ -8,7 +8,7 @@ import * as Numbers from "../utils/numbers";
import * as JSONData from "../utils/json-data";
import * as TestState from "./test-state";
import * as ConfigEvent from "../observables/config-event";
import { Mode2 } from "@monkeytype/shared-types/config";
import { Mode2 } from "@monkeytype/contracts/schemas/shared";
type Settings = {
wpm: number;

View file

@ -5,7 +5,7 @@ import * as CustomText from "./custom-text";
import * as TestInput from "./test-input";
import * as ConfigEvent from "../observables/config-event";
import { setCustomTextName } from "../states/custom-text-name";
import { Mode } from "@monkeytype/shared-types/config";
import { Mode } from "@monkeytype/contracts/schemas/shared";
import { CustomTextData } from "@monkeytype/shared-types";
type Before = {

View file

@ -37,7 +37,7 @@ import confetti from "canvas-confetti";
import type { AnnotationOptions } from "chartjs-plugin-annotation";
import Ape from "../ape";
import { Result } from "@monkeytype/shared-types";
import { Mode } from "@monkeytype/shared-types/config";
import { Mode } from "@monkeytype/contracts/schemas/shared";
let result: Result<Mode>;
let maxChartVal: number;

View file

@ -1,8 +1,8 @@
import {
ConfigValue,
Mode,
QuoteLength,
} from "@monkeytype/shared-types/config";
} from "@monkeytype/contracts/schemas/configs";
import { Mode } from "@monkeytype/contracts/schemas/shared";
import Config from "../config";
import * as ConfigEvent from "../observables/config-event";
import * as ActivePage from "../states/active-page";

View file

@ -62,8 +62,8 @@ import {
CompletedEvent,
CustomTextDataWithTextLen,
} from "@monkeytype/shared-types";
import { Mode, QuoteLength } from "@monkeytype/shared-types/config";
import { QuoteLength } from "@monkeytype/contracts/schemas/configs";
import { Mode } from "@monkeytype/contracts/schemas/shared";
let failReason = "";
const koInputVisual = document.getElementById("koInputVisual") as HTMLElement;

View file

@ -7,7 +7,7 @@ import * as FunboxList from "./funbox/funbox-list";
import * as TestState from "./test-state";
import * as Numbers from "../utils/numbers";
import { IncompleteTest, Result } from "@monkeytype/shared-types";
import { Mode } from "@monkeytype/shared-types/config";
import { Mode } from "@monkeytype/contracts/schemas/shared";
type CharCount = {
spaces: number;

View file

@ -28,7 +28,10 @@ import * as ActivePage from "../states/active-page";
import Format from "../utils/format";
import * as Loader from "../elements/loader";
import { getHtmlByUserFlags } from "../controllers/user-flag-controller";
import { TimerColor, TimerOpacity } from "@monkeytype/shared-types/config";
import {
TimerColor,
TimerOpacity,
} from "@monkeytype/contracts/schemas/configs";
async function gethtml2canvas(): Promise<typeof import("html2canvas").default> {
return (await import("html2canvas")).default;

View file

@ -1,3 +1,5 @@
type ConfigValue = import("@monkeytype/contracts/schemas/configs").ConfigValue;
declare namespace MonkeyTypes {
type PageName =
| "loading"
@ -45,7 +47,7 @@ declare namespace MonkeyTypes {
type QuoteModes = "short" | "medium" | "long" | "thicc";
type CustomLayoutFluidSpaces =
| import("@monkeytype/shared-types/config").CustomLayoutFluid
| import("@monkeytype/contracts/schemas/configs").CustomLayoutFluid
| `${string} ${string} ${string}`;
type HistoryChartData = {
@ -158,7 +160,7 @@ declare namespace MonkeyTypes {
type FunboxForcedConfig = Record<
string,
import("@monkeytype/shared-types/config").ConfigValue[]
import("@monkeytype/contracts/schemas/configs").ConfigValue[]
>;
type FunboxMetadata = {
@ -174,7 +176,7 @@ declare namespace MonkeyTypes {
type PresetConfig = {
tags: string[];
} & import("@monkeytype/shared-types/config").Config;
} & import("@monkeytype/contracts/schemas/configs").Config;
type SnapshotPreset =
import("@monkeytype/contracts/schemas/presets").Preset & {
@ -192,7 +194,7 @@ declare namespace MonkeyTypes {
type ConfigChanges = {
tags?: string[];
} & Partial<import("@monkeytype/shared-types/config").Config>;
} & Partial<import("@monkeytype/contracts/schemas/configs").Config>;
type LeaderboardMemory = {
time: {
@ -237,11 +239,11 @@ declare namespace MonkeyTypes {
filterPresets: import("@monkeytype/shared-types").ResultFilters[];
isPremium: boolean;
streakHourOffset?: number;
config: import("@monkeytype/shared-types/config").Config;
config: import("@monkeytype/contracts/schemas/configs").Config;
tags: UserTag[];
presets: SnapshotPreset[];
results?: import("@monkeytype/shared-types").Result<
import("@monkeytype/shared-types/config").Mode
import("@monkeytype/contracts/schemas/shared").Mode
>[];
xp: number;
testActivity?: ModifiableTestActivityCalendar;
@ -329,7 +331,7 @@ declare namespace MonkeyTypes {
customStyle?: string;
opensModal?: boolean;
defaultValue?: () => string;
configKey?: keyof import("@monkeytype/shared-types/config").Config;
configKey?: keyof import("@monkeytype/contracts/schemas/configs").Config;
configValue?: string | number | boolean | number[];
configValueMode?: "include";
exec?: (options: CommandExecOptions) => void;
@ -342,7 +344,7 @@ declare namespace MonkeyTypes {
type CommandsSubgroup = {
title: string;
configKey?: keyof import("@monkeytype/shared-types/config").Config;
configKey?: keyof import("@monkeytype/contracts/schemas/configs").Config;
list: Command[];
beforeList?: () => void;
};

View file

@ -1,7 +1,10 @@
import { Config, ConfigValue } from "@monkeytype/shared-types/config";
import {
Config,
ConfigValue,
PartialConfig,
} from "@monkeytype/contracts/schemas/configs";
import DefaultConfig from "../constants/default-config";
import { typedKeys } from "./misc";
import { PartialConfig } from "@monkeytype/contracts/schemas/configs";
export function mergeWithDefaultConfig(config: PartialConfig): Config {
const mergedConfig = {} as Config;

View file

@ -1,6 +1,6 @@
import { get as getTypingSpeedUnit } from "../utils/typing-speed-units";
import * as Numbers from "../utils/numbers";
import { Config as ConfigType } from "@monkeytype/shared-types/config";
import { Config as ConfigType } from "@monkeytype/contracts/schemas/configs";
import Config from "../config";
export type FormatOptions = {

View file

@ -3,8 +3,12 @@ import { envConfig } from "../constants/env-config";
import { lastElementFromArray } from "./arrays";
import * as JSONData from "./json-data";
import { CustomTextData, Result } from "@monkeytype/shared-types";
import { PersonalBests } from "@monkeytype/shared-types/user";
import { Config, Mode, Mode2 } from "@monkeytype/shared-types/config";
import { Config } from "@monkeytype/contracts/schemas/configs";
import {
Mode,
Mode2,
PersonalBests,
} from "@monkeytype/contracts/schemas/shared";
export function kogasa(cov: number): number {
return (

View file

@ -1,4 +1,4 @@
import { TypingSpeedUnit } from "@monkeytype/shared-types/config";
import { TypingSpeedUnit } from "@monkeytype/contracts/schemas/configs";
class Unit implements MonkeyTypes.TypingSpeedUnitSettings {
unit: TypingSpeedUnit;

View file

@ -12,7 +12,8 @@ import * as Loader from "../elements/loader";
import * as AccountButton from "../elements/account-button";
import { restart as restartTest } from "../test/test-logic";
import * as ChallengeController from "../controllers/challenge-controller";
import { Difficulty, Mode, Mode2 } from "@monkeytype/shared-types/config";
import { Mode, Mode2 } from "@monkeytype/contracts/schemas/shared";
import { Difficulty } from "@monkeytype/contracts/schemas/configs";
import { CustomTextData } from "@monkeytype/shared-types";
export async function linkDiscord(hashOverride: string): Promise<void> {

1
package-lock.json generated
View file

@ -30054,6 +30054,7 @@
"chokidar": "3.6.0",
"esbuild": "0.23.0",
"eslint": "8.57.0",
"madge": "6.1.0",
"rimraf": "5.0.9",
"typescript": "5.5.3"
}

View file

@ -3,7 +3,8 @@
"private": true,
"scripts": {
"dev": "rimraf ./dist && node esbuild.config.js --watch",
"build": "rimraf ./dist && node esbuild.config.js",
"build": "rimraf ./dist && npm run madge && node esbuild.config.js",
"madge": " madge --circular --extensions ts ./src",
"ts-check": "tsc --noEmit",
"lint": "eslint \"./**/*.ts\""
},
@ -17,6 +18,7 @@
"chokidar": "3.6.0",
"esbuild": "0.23.0",
"eslint": "8.57.0",
"madge": "6.1.0",
"rimraf": "5.0.9",
"typescript": "5.5.3"
},

View file

@ -1,5 +1,6 @@
import { z } from "zod";
import { token } from "./util";
import * as Shared from "./shared";
export const SmoothCaretSchema = z.enum(["off", "slow", "medium", "fast"]);
export type SmoothCaret = z.infer<typeof SmoothCaretSchema>;
@ -205,19 +206,8 @@ export type ShowAverage = z.infer<typeof ShowAverageSchema>;
export const ColorHexValueSchema = z.string().regex(/^#([\da-f]{3}){1,2}$/i);
export type ColorHexValue = z.infer<typeof ColorHexValueSchema>;
export const DifficultySchema = z.enum(["normal", "expert", "master"]);
export type Difficulty = z.infer<typeof DifficultySchema>;
export const NumberModeSchema = z.enum(["time", "words", "quote"]);
export const CustomModeSchema = z.enum(["custom"]);
export const ZenModeSchema = z.enum(["zen"]);
export const ModeSchema = z.union([
NumberModeSchema,
CustomModeSchema,
ZenModeSchema,
]);
export type Mode = z.infer<typeof ModeSchema>;
export const DifficultySchema = Shared.DifficultySchema;
export type Difficulty = Shared.Difficulty;
export const CustomThemeColorsSchema = z.tuple([
ColorHexValueSchema,
@ -315,7 +305,7 @@ export const ConfigSchema = z
numbers: z.boolean(),
words: WordCountSchema,
time: TimeConfigSchema,
mode: ModeSchema,
mode: Shared.ModeSchema,
quoteLength: QuoteLengthConfigSchema,
language: LanguageSchema,
fontSize: FontSizeSchema,
@ -392,3 +382,5 @@ export type Config = z.infer<typeof ConfigSchema>;
export const PartialConfigSchema = ConfigSchema.partial();
export type PartialConfig = z.infer<typeof PartialConfigSchema>;
export type ConfigValue = Config[keyof Config];

View file

@ -0,0 +1,42 @@
import { z } from "zod";
import { StringNumberSchema } from "./util";
//used by config and shared
export const DifficultySchema = z.enum(["normal", "expert", "master"]);
export type Difficulty = z.infer<typeof DifficultySchema>;
//used by user and config
export const PersonalBestSchema = z.object({
acc: z.number().nonnegative().max(100),
consistency: z.number().nonnegative().max(100),
difficulty: DifficultySchema,
lazyMode: z.boolean().optional(),
language: z
.string()
.max(100)
.regex(/[\w+]+/),
punctuation: z.boolean().optional(),
numbers: z.boolean().optional(),
raw: z.number().nonnegative(),
wpm: z.number().nonnegative(),
timestamp: z.number().nonnegative(),
});
export type PersonalBest = z.infer<typeof PersonalBestSchema>;
//used by user and config
export const PersonalBestsSchema = z.object({
time: z.record(StringNumberSchema, z.array(PersonalBestSchema)),
words: z.record(StringNumberSchema, z.array(PersonalBestSchema)),
quote: z.record(StringNumberSchema, z.array(PersonalBestSchema)),
custom: z.record(z.literal("custom"), z.array(PersonalBestSchema)),
zen: z.record(z.literal("zen"), z.array(PersonalBestSchema)),
});
export type PersonalBests = z.infer<typeof PersonalBestsSchema>;
//used by user and config
export const ModeSchema = PersonalBestsSchema.keyof();
export type Mode = z.infer<typeof ModeSchema>;
export type Mode2<M extends Mode> = M extends M
? keyof PersonalBests[M]
: never;
export type Mode2Custom<M extends Mode> = Mode2<M> | "custom";

View file

@ -1,29 +1 @@
import { z } from "zod";
import { DifficultySchema } from "./configs";
import { StringNumberSchema } from "./util";
export const PersonalBestSchema = z.object({
acc: z.number().nonnegative().max(100),
consistency: z.number().nonnegative().max(100),
difficulty: DifficultySchema,
lazyMode: z.boolean().optional(),
language: z
.string()
.max(100)
.regex(/[\w+]+/),
punctuation: z.boolean().optional(),
numbers: z.boolean().optional(),
raw: z.number().nonnegative(),
wpm: z.number().nonnegative(),
timestamp: z.number().nonnegative(),
});
export type PersonalBest = z.infer<typeof PersonalBestSchema>;
export const PersonalBestsSchema = z.object({
time: z.record(StringNumberSchema, z.array(PersonalBestSchema)),
words: z.record(StringNumberSchema, z.array(PersonalBestSchema)),
quote: z.record(StringNumberSchema, z.array(PersonalBestSchema)),
custom: z.record(z.literal("custom"), z.array(PersonalBestSchema)),
zen: z.record(z.literal("zen"), z.array(PersonalBestSchema)),
});
export type PersonalBests = z.infer<typeof PersonalBestsSchema>;
//tbd

View file

@ -1,84 +0,0 @@
import { PersonalBests } from "@monkeytype/contracts/schemas/users";
export type SmoothCaret =
import("@monkeytype/contracts/schemas/configs").SmoothCaret;
export type QuickRestart =
import("@monkeytype/contracts/schemas/configs").QuickRestart;
export type QuoteLength =
import("@monkeytype/contracts/schemas/configs").QuoteLength;
export type CaretStyle =
import("@monkeytype/contracts/schemas/configs").CaretStyle;
export type Difficulty =
import("@monkeytype/contracts/schemas/configs").Difficulty;
export type Mode = import("@monkeytype/contracts/schemas/configs").Mode;
export type Mode2<M extends Mode> = M extends M
? keyof PersonalBests[M]
: never;
export type Mode2Custom<M extends Mode> = Mode2<M> | "custom";
export type ConfidenceMode =
import("@monkeytype/contracts/schemas/configs").ConfidenceMode;
export type IndicateTypos =
import("@monkeytype/contracts/schemas/configs").IndicateTypos;
export type TimerStyle =
import("@monkeytype/contracts/schemas/configs").TimerStyle;
export type LiveSpeedAccBurstStyle =
import("@monkeytype/contracts/schemas/configs").LiveSpeedAccBurstStyle;
export type RandomTheme =
import("@monkeytype/contracts/schemas/configs").RandomTheme;
export type TimerColor =
import("@monkeytype/contracts/schemas/configs").TimerColor;
export type TimerOpacity =
import("@monkeytype/contracts/schemas/configs").TimerOpacity;
export type StopOnError =
import("@monkeytype/contracts/schemas/configs").StopOnError;
export type KeymapMode =
import("@monkeytype/contracts/schemas/configs").KeymapMode;
export type KeymapStyle =
import("@monkeytype/contracts/schemas/configs").KeymapStyle;
export type KeymapLegendStyle =
import("@monkeytype/contracts/schemas/configs").KeymapLegendStyle;
export type KeymapShowTopRow =
import("@monkeytype/contracts/schemas/configs").KeymapShowTopRow;
export type SingleListCommandLine =
import("@monkeytype/contracts/schemas/configs").SingleListCommandLine;
export type PlaySoundOnClick =
import("@monkeytype/contracts/schemas/configs").PlaySoundOnClick;
export type PlaySoundOnError =
import("@monkeytype/contracts/schemas/configs").PlaySoundOnError;
export type SoundVolume =
import("@monkeytype/contracts/schemas/configs").SoundVolume;
export type PaceCaret =
import("@monkeytype/contracts/schemas/configs").PaceCaret;
export type AccountChart =
import("@monkeytype/contracts/schemas/configs").AccountChart;
export type MinimumWordsPerMinute =
import("@monkeytype/contracts/schemas/configs").MinimumWordsPerMinute;
export type HighlightMode =
import("@monkeytype/contracts/schemas/configs").HighlightMode;
export type TypingSpeedUnit =
import("@monkeytype/contracts/schemas/configs").TypingSpeedUnit;
export type Ads = import("@monkeytype/contracts/schemas/configs").Ads;
export type MinimumAccuracy =
import("@monkeytype/contracts/schemas/configs").MinimumAccuracy;
export type RepeatQuotes =
import("@monkeytype/contracts/schemas/configs").RepeatQuotes;
export type OppositeShiftMode =
import("@monkeytype/contracts/schemas/configs").OppositeShiftMode;
export type CustomBackgroundSize =
import("@monkeytype/contracts/schemas/configs").CustomBackgroundSize;
export type CustomBackgroundFilter =
import("@monkeytype/contracts/schemas/configs").CustomBackgroundFilter;
export type CustomLayoutFluid =
import("@monkeytype/contracts/schemas/configs").CustomLayoutFluid;
export type MonkeyPowerLevel =
import("@monkeytype/contracts/schemas/configs").MonkeyPowerLevel;
export type MinimumBurst =
import("@monkeytype/contracts/schemas/configs").MinimumBurst;
export type ShowAverage =
import("@monkeytype/contracts/schemas/configs").ShowAverage;
export type TapeMode = import("@monkeytype/contracts/schemas/configs").TapeMode;
export type CustomThemeColors =
import("@monkeytype/contracts/schemas/configs").CustomThemeColors;
export type Config = import("@monkeytype/contracts/schemas/configs").Config;
export type ConfigValue = Config[keyof Config];

View file

@ -1,6 +1,10 @@
import { Difficulty, Mode } from "@monkeytype/contracts/schemas/configs";
import { Mode2 } from "./config";
import { PersonalBest, PersonalBests } from "./user";
type Difficulty = import("@monkeytype/contracts/schemas/configs").Difficulty;
type Mode = import("@monkeytype/contracts/schemas/shared").Mode;
type Mode2<M extends Mode> =
import("@monkeytype/contracts/schemas/shared").Mode2<M>;
type PersonalBest = import("@monkeytype/contracts/schemas/shared").PersonalBest;
type PersonalBests =
import("@monkeytype/contracts/schemas/shared").PersonalBests;
export type ValidModeRule = {
language: string;

View file

@ -1,5 +0,0 @@
export type PersonalBest =
import("@monkeytype/contracts/schemas/users").PersonalBest;
export type PersonalBests =
import("@monkeytype/contracts/schemas/users").PersonalBests;

View file

@ -16,6 +16,7 @@
"outputs": ["dist/**", "build/**"]
},
"test": {
"dependsOn": ["^build"],
"cache": false
},
"dev": {