diff --git a/backend/package.json b/backend/package.json index 6b5e582ca935..19b57d51d331 100644 --- a/backend/package.json +++ b/backend/package.json @@ -49,7 +49,7 @@ "mjml": "4.15.0", "mongodb": "6.3.0", "mustache": "4.2.0", - "nodemailer": "6.9.14", + "nodemailer": "7.0.7", "object-hash": "3.0.0", "prom-client": "15.1.3", "rate-limiter-flexible": "5.0.3", @@ -80,7 +80,7 @@ "@types/object-hash": "3.0.6", "@types/readline-sync": "1.4.8", "@types/string-similarity": "4.0.2", - "@types/supertest": "2.0.12", + "@types/supertest": "6.0.3", "@types/swagger-stats": "0.95.11", "@types/ua-parser-js": "0.7.36", "@types/uuid": "10.0.0", @@ -91,7 +91,7 @@ "openapi3-ts": "2.0.2", "oxlint": "1.15.0", "readline-sync": "1.4.10", - "supertest": "6.2.3", + "supertest": "7.1.4", "testcontainers": "11.4.0", "tsx": "4.16.2", "typescript": "5.5.4", diff --git a/frontend/package.json b/frontend/package.json index 1eaea70c4c3e..b43aa9ed0579 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -54,7 +54,7 @@ "eslint-plugin-compat": "6.0.2", "firebase-tools": "13.15.1", "fontawesome-subset": "4.4.0", - "happy-dom": "15.10.2", + "happy-dom": "20.0.0", "madge": "8.0.0", "magic-string": "0.30.17", "normalize.css": "8.0.1", diff --git a/frontend/scripts/check-assets.ts b/frontend/scripts/check-assets.ts index 6e2e4bd5cfe2..ac39cbdc1d5f 100644 --- a/frontend/scripts/check-assets.ts +++ b/frontend/scripts/check-assets.ts @@ -137,8 +137,7 @@ async function validateLayouts(): Promise { //no files not defined in LayoutsList const additionalLayoutFiles = fs .readdirSync("./static/layouts") - .map((it) => it.substring(0, it.length - 5)) - .filter((it) => !LayoutsList.some((layout) => layout === it)); + .filter((it) => !LayoutsList.some((layout) => layout + ".json" === it)); if (additionalLayoutFiles.length !== 0) { additionalLayoutFiles.forEach((it) => problems.add("_additional", it)); } @@ -287,8 +286,7 @@ async function validateLanguages(): Promise { //no files not defined in LanguageList fs.readdirSync("./static/languages") - .map((it) => it.substring(0, it.length - 5)) - .filter((it) => !LanguageList.some((language) => language === it)) + .filter((it) => !LanguageList.some((language) => language + ".json" === it)) .forEach((it) => problems.add("_additional", it)); //check groups @@ -381,18 +379,20 @@ async function validateThemes(): Promise { }); //no missing files - const themeFiles = fs - .readdirSync("./static/themes") - .map((it) => it.substring(0, it.length - 4)); + const themeFiles = fs.readdirSync("./static/themes"); //missing theme files - ThemesList.filter((it) => !themeFiles.includes(it.name)).forEach((it) => - problems.add(it.name, `missing file frontend/static/themes/${it.name}.css`) + ThemesList.filter((it) => !themeFiles.includes(it.name + ".css")).forEach( + (it) => + problems.add( + it.name, + `missing file frontend/static/themes/${it.name}.css` + ) ); //additional theme files themeFiles - .filter((it) => !ThemesList.some((theme) => theme.name === it)) + .filter((it) => !ThemesList.some((theme) => theme.name + ".css" === it)) .forEach((it) => problems.add("_additional", it)); console.log(problems.toString()); diff --git a/frontend/src/ts/constants/languages.ts b/frontend/src/ts/constants/languages.ts index 7768217621e8..eda60c374c2f 100644 --- a/frontend/src/ts/constants/languages.ts +++ b/frontend/src/ts/constants/languages.ts @@ -351,7 +351,10 @@ export const LanguageGroups: Record = { "code_ook", "code_typescript", "code_cobol", + "code_clojure", "code_common_lisp", + "code_erlang", + "code_ocaml", "code_odin", "code_fortran", "code_abap", diff --git a/frontend/src/ts/constants/layouts.ts b/frontend/src/ts/constants/layouts.ts index ff8f5a9ec340..04f5f09b41ed 100644 --- a/frontend/src/ts/constants/layouts.ts +++ b/frontend/src/ts/constants/layouts.ts @@ -1,3 +1,3 @@ import { LayoutName, LayoutNameSchema } from "@monkeytype/schemas/layouts"; -export const LayoutsList:LayoutName[] = LayoutNameSchema._def.values; \ No newline at end of file +export const LayoutsList: LayoutName[] = LayoutNameSchema._def.values; diff --git a/frontend/src/ts/test/funbox/funbox-functions.ts b/frontend/src/ts/test/funbox/funbox-functions.ts index 154b1722f813..8175981098ee 100644 --- a/frontend/src/ts/test/funbox/funbox-functions.ts +++ b/frontend/src/ts/test/funbox/funbox-functions.ts @@ -1,4 +1,3 @@ -import { Section } from "../../utils/json-data"; import { FunboxWordsFrequency, Wordset } from "../wordset"; import * as GetText from "../../utils/generate"; import Config, * as UpdateConfig from "../../config"; @@ -24,17 +23,18 @@ import * as TestState from "../test-state"; import { WordGenError } from "../../utils/word-gen-error"; import { FunboxName, KeymapLayout, Layout } from "@monkeytype/schemas/configs"; import { Language, LanguageObject } from "@monkeytype/schemas/languages"; + export type FunboxFunctions = { getWord?: (wordset?: Wordset, wordIndex?: number) => string; punctuateWord?: (word: string) => string; - withWords?: (words?: string[]) => Promise; + withWords?: (words?: string[]) => Promise; alterText?: (word: string, wordIndex: number, wordsBound: number) => string; applyConfig?: () => void; applyGlobalCSS?: () => void; clearGlobal?: () => void; rememberSettings?: () => void; toggleScript?: (params: string[]) => void; - pullSection?: (language?: Language) => Promise
; + pullSection?: (language?: Language) => Promise; handleSpace?: () => void; handleChar?: (char: string) => string; isCharCorrect?: (char: string, originalChar: string) => boolean; @@ -151,6 +151,23 @@ class PseudolangWordGenerator extends Wordset { } } +export class PolyglotWordset extends Wordset { + public wordsWithLanguage: Map; + public languageProperties: Map; + + constructor( + wordsWithLanguage: Map, + languageProperties: Map + ) { + // build and shuffle the word array + const wordArray = Array.from(wordsWithLanguage.keys()); + Arrays.shuffle(wordArray); + super(wordArray); + this.wordsWithLanguage = wordsWithLanguage; + this.languageProperties = languageProperties; + } +} + const list: Partial> = { "58008": { getWord(): string { @@ -646,12 +663,12 @@ const list: Partial> = { `Failed to load language: ${language}. It will be ignored.`, 0 ); - return null; // Return null for failed languages + return null; }) ); const languages = (await Promise.all(promises)).filter( - (lang) => lang !== null + (lang): lang is LanguageObject => lang !== null ); if (languages.length === 0) { @@ -679,9 +696,44 @@ const list: Partial> = { throw new WordGenError(""); } - const wordSet = languages.flatMap((it) => it.words); - Arrays.shuffle(wordSet); - return new Wordset(wordSet); + // direction conflict check + const allRightToLeft = languages.every((lang) => lang.rightToLeft); + const allLeftToRight = languages.every((lang) => !lang.rightToLeft); + const mainLanguage = await JSONData.getLanguage(Config.language); + const mainLanguageIsRTL = mainLanguage?.rightToLeft ?? false; + if ( + (mainLanguageIsRTL && allLeftToRight) || + (!mainLanguageIsRTL && allRightToLeft) + ) { + const fallbackLanguage = + languages[0]?.name ?? (allRightToLeft ? "arabic" : "english"); + UpdateConfig.setLanguage(fallbackLanguage); + Notifications.add( + `Language direction conflict: switched to ${fallbackLanguage} for consistency.`, + 0, + { duration: 5 } + ); + throw new WordGenError(""); + } + + // build languageProperties + const languageProperties = new Map( + languages.map((lang) => [ + lang.name, + { + noLazyMode: lang.noLazyMode, + ligatures: lang.ligatures, + rightToLeft: lang.rightToLeft, + additionalAccents: lang.additionalAccents, + }, + ]) + ); + + const wordsWithLanguage = new Map( + languages.flatMap((lang) => lang.words.map((word) => [word, lang.name])) + ); + + return new PolyglotWordset(wordsWithLanguage, languageProperties); }, }, }; diff --git a/frontend/src/ts/test/test-logic.ts b/frontend/src/ts/test/test-logic.ts index 29e68874cac9..7c5c10e2f1dc 100644 --- a/frontend/src/ts/test/test-logic.ts +++ b/frontend/src/ts/test/test-logic.ts @@ -69,6 +69,7 @@ import { findSingleActiveFunboxWithFunction, getActiveFunboxes, getActiveFunboxesWithFunction, + getActiveFunboxNames, isFunboxActive, isFunboxActiveWithProperty, } from "./funbox/list"; @@ -469,14 +470,54 @@ async function init(): Promise { } const allowLazyMode = !language.noLazyMode || Config.mode === "custom"; - if (Config.lazyMode && !allowLazyMode) { - rememberLazyMode = true; - Notifications.add("This language does not support lazy mode.", 0, { - important: true, + + // polyglot mode, check to enable lazy mode if any support it + if (getActiveFunboxNames().includes("polyglot")) { + const polyglotLanguages = Config.customPolyglot; + const languagePromises = polyglotLanguages.map(async (langName) => { + const { data: lang, error } = await tryCatch( + JSONData.getLanguage(langName) + ); + if (error) { + Notifications.add( + Misc.createErrorMessage( + error, + `Failed to load language: ${langName}` + ), + -1 + ); + } + return lang; }); - UpdateConfig.setLazyMode(false, true); - } else if (rememberLazyMode && !language.noLazyMode) { - UpdateConfig.setLazyMode(true, true); + + const anySupportsLazyMode = (await Promise.all(languagePromises)) + .filter((lang) => lang !== null) + .some((lang) => !lang.noLazyMode); + + if (Config.lazyMode && !anySupportsLazyMode) { + rememberLazyMode = true; + Notifications.add( + "None of the selected polyglot languages support lazy mode.", + 0, + { + important: true, + } + ); + UpdateConfig.setLazyMode(false, true); + } else if (rememberLazyMode && anySupportsLazyMode) { + UpdateConfig.setLazyMode(true, true); + } + } else { + // normal mode + if (Config.lazyMode && !allowLazyMode) { + rememberLazyMode = true; + Notifications.add("This language does not support lazy mode.", 0, { + important: true, + }); + UpdateConfig.setLazyMode(false, true); + } else if (rememberLazyMode && !language.noLazyMode) { + UpdateConfig.setLazyMode(true, true); + } } if (!Config.lazyMode && !language.noLazyMode) { @@ -502,16 +543,19 @@ async function init(): Promise { currentQuote: TestWords.currentQuote, }); - let generatedWords: string[]; - let generatedSectionIndexes: number[]; let wordsHaveTab = false; let wordsHaveNewline = false; + let allRightToLeft: boolean | undefined = undefined; + let allLigatures: boolean | undefined = undefined; + let generatedWords: string[] = []; + let generatedSectionIndexes: number[] = []; try { const gen = await WordsGenerator.generateWords(language); generatedWords = gen.words; generatedSectionIndexes = gen.sectionIndexes; wordsHaveTab = gen.hasTab; wordsHaveNewline = gen.hasNewline; + ({ allRightToLeft, allLigatures } = gen); } catch (e) { Loader.hide(); if (e instanceof WordGenError || e instanceof Error) { @@ -570,10 +614,10 @@ async function init(): Promise { ); } Funbox.toggleScript(TestWords.words.getCurrent()); - TestUI.setRightToLeft(language.rightToLeft ?? false); - TestUI.setLigatures(language.ligatures ?? false); + TestUI.setLigatures(allLigatures ?? language.ligatures ?? false); - const isLanguageRTL = language.rightToLeft ?? false; + const isLanguageRTL = allRightToLeft ?? language.rightToLeft ?? false; + TestUI.setRightToLeft(isLanguageRTL); TestState.setIsLanguageRightToLeft(isLanguageRTL); TestState.setIsDirectionReversed( isFunboxActiveWithProperty("reverseDirection") diff --git a/frontend/src/ts/test/words-generator.ts b/frontend/src/ts/test/words-generator.ts index cabde3f63f49..820006e9b04c 100644 --- a/frontend/src/ts/test/words-generator.ts +++ b/frontend/src/ts/test/words-generator.ts @@ -1,6 +1,6 @@ import Config, * as UpdateConfig from "../config"; import * as CustomText from "./custom-text"; -import * as Wordset from "./wordset"; +import { Wordset, FunboxWordsFrequency, withWords } from "./wordset"; import QuotesController, { Quote, QuoteWithTextSplit, @@ -24,6 +24,7 @@ import { } from "./funbox/list"; import { WordGenError } from "../utils/word-gen-error"; import * as Loader from "../elements/loader"; +import { PolyglotWordset } from "./funbox/funbox-functions"; import { LanguageObject } from "@monkeytype/schemas/languages"; //pin implementation @@ -311,7 +312,7 @@ async function applyEnglishPunctuationToWord(word: string): Promise { return EnglishPunctuation.replace(word); } -function getFunboxWordsFrequency(): Wordset.FunboxWordsFrequency | undefined { +function getFunboxWordsFrequency(): FunboxWordsFrequency | undefined { const funbox = findSingleActiveFunboxWithFunction("getWordsFrequencyMode"); if (funbox) { return funbox.functions.getWordsFrequencyMode(); @@ -345,7 +346,7 @@ async function getFunboxSection(): Promise { function getFunboxWord( word: string, wordIndex: number, - wordset?: Wordset.Wordset + wordset?: Wordset ): string { const funbox = findSingleActiveFunboxWithFunction("getWord"); @@ -384,6 +385,21 @@ async function applyBritishEnglishToWord( } function applyLazyModeToWord(word: string, language: LanguageObject): string { + // polyglot mode, use the word's actual language + if (currentWordset && currentWordset instanceof PolyglotWordset) { + const langName = currentWordset.wordsWithLanguage.get(word); + const langProps = langName + ? currentWordset.languageProperties.get(langName) + : undefined; + const allowLazyMode = + (langProps && !langProps.noLazyMode) || Config.mode === "custom"; + if (Config.lazyMode && allowLazyMode && langProps) { + word = LazyMode.replaceAccents(word, langProps.additionalAccents); + } + return word; + } + + // normal mode const allowLazyMode = !language.noLazyMode || Config.mode === "custom"; if (Config.lazyMode && allowLazyMode) { word = LazyMode.replaceAccents(word, language.additionalAccents); @@ -574,7 +590,7 @@ async function getQuoteWordList( return TestWords.currentQuote.textSplit; } -let currentWordset: Wordset.Wordset | null = null; +let currentWordset: Wordset | null = null; let currentLanguage: LanguageObject | null = null; let isCurrentlyUsingFunboxSection = false; @@ -583,6 +599,8 @@ type GenerateWordsReturn = { sectionIndexes: number[]; hasTab: boolean; hasNewline: boolean; + allRightToLeft?: boolean; + allLigatures?: boolean; }; let previousRandomQuote: QuoteWithTextSplit | null = null; @@ -604,6 +622,8 @@ export async function generateWords( sectionIndexes: [], hasTab: false, hasNewline: false, + allRightToLeft: language.rightToLeft, + allLigatures: language.ligatures ?? false, }; isCurrentlyUsingFunboxSection = isFunboxActiveWithFunction("pullSection"); @@ -634,9 +654,20 @@ export async function generateWords( const funbox = findSingleActiveFunboxWithFunction("withWords"); if (funbox) { - currentWordset = await funbox.functions.withWords(wordList); + const result = await funbox.functions.withWords(wordList); + // PolyglotWordset if polyglot otherwise Wordset + if (result instanceof PolyglotWordset) { + const polyglotResult = result; + currentWordset = polyglotResult; + // set allLigatures if any language in languageProperties has ligatures true + ret.allLigatures = Array.from( + polyglotResult.languageProperties.values() + ).some((props) => !!props.ligatures); + } else { + currentWordset = result; + } } else { - currentWordset = await Wordset.withWords(wordList); + currentWordset = await withWords(wordList); } console.debug("Wordset", currentWordset); diff --git a/frontend/src/ts/utils/json-data.ts b/frontend/src/ts/utils/json-data.ts index ab072029a918..4dca4a780c59 100644 --- a/frontend/src/ts/utils/json-data.ts +++ b/frontend/src/ts/utils/json-data.ts @@ -80,6 +80,12 @@ export async function getLayout(layoutName: string): Promise { return await cachedFetchJson(`/layouts/${layoutName}.json`); } +// used for polyglot wordset language-specific properties +export type LanguageProperties = Pick< + LanguageObject, + "noLazyMode" | "ligatures" | "rightToLeft" | "additionalAccents" +>; + let currentLanguage: LanguageObject; /** diff --git a/frontend/static/languages/code_clojure.json b/frontend/static/languages/code_clojure.json new file mode 100644 index 000000000000..540032423c88 --- /dev/null +++ b/frontend/static/languages/code_clojure.json @@ -0,0 +1,218 @@ +{ + "name": "code_clojure", + "noLazyMode": true, + "words": [ + "def", + "defn", + "defmacro", + "defonce", + "defn-", + "defmulti", + "defmethod", + "defprotocol", + "defrecord", + "defstruct", + "deftype", + "fn", + "let", + "loop", + "recur", + "if", + "when", + "when-not", + "cond", + "case", + "condp", + "do", + "and", + "or", + "not", + "nil", + "true", + "false", + "ns", + "require", + "import", + "use", + "refer", + "map", + "filter", + "reduce", + "apply", + "comp", + "partial", + "constantly", + "identity", + "first", + "rest", + "last", + "butlast", + "next", + "take", + "drop", + "take-while", + "drop-while", + "conj", + "cons", + "concat", + "reverse", + "sort", + "sort-by", + "count", + "empty?", + "seq", + "vec", + "list", + "set", + "hash-map", + "hash-set", + "assoc", + "dissoc", + "get", + "get-in", + "assoc-in", + "update-in", + "merge", + "keys", + "vals", + "contains?", + "find", + "select-keys", + "zipmap", + "into", + "group-by", + "frequencies", + "distinct", + "remove", + "keep", + "keep-indexed", + "map-indexed", + "doall", + "dorun", + "doseq", + "dotimes", + "for", + "while", + "repeatedly", + "iterate", + "cycle", + "range", + "repeat", + "lazy-seq", + "try", + "catch", + "finally", + "throw", + "str", + "pr-str", + "print", + "println", + "prn", + "with-open", + "slurp", + "spit", + "read-string", + "atom", + "ref", + "agent", + "var", + "deref", + "swap!", + "reset!", + "alter", + "commute", + "send", + "send-off", + "future", + "promise", + "deliver", + "delay", + "force", + "pmap", + "pcalls", + "pvalues", + "binding", + "with-redefs", + "with-meta", + "meta", + "vary-meta", + "with-out-str", + "with-in-str", + "re-find", + "re-matches", + "re-seq", + "re-pattern", + "subs", + "format", + "join", + "split", + "split-lines", + "trim", + "triml", + "trimr", + "replace", + "upper-case", + "lower-case", + "capitalize", + "inc", + "dec", + "max", + "min", + "abs", + "mod", + "rem", + "quot", + "even?", + "odd?", + "zero?", + "pos?", + "neg?", + "number?", + "integer?", + "float?", + "rational?", + "decimal?", + "string?", + "keyword?", + "symbol?", + "map?", + "vector?", + "list?", + "set?", + "coll?", + "sequential?", + "associative?", + "sorted?", + "counted?", + "reversible?", + "indexed?", + "seqable?", + "fn?", + "ifn?", + "class", + "type", + "instance?", + "isa?", + "cast", + "satisfies?", + "extends?", + "supers", + "bases", + "class?", + "resolve", + "requiring-resolve", + "find-var", + "var-get", + "var-set", + "bound?", + "thread-bound?", + "make-array", + "object-array", + "aclone", + "aget", + "aset", + "alength", + "amap", + "areduce" + ] +} diff --git a/frontend/static/languages/code_erlang.json b/frontend/static/languages/code_erlang.json new file mode 100644 index 000000000000..c11904df3cf1 --- /dev/null +++ b/frontend/static/languages/code_erlang.json @@ -0,0 +1,251 @@ +{ + "name": "code_erlang", + "noLazyMode": true, + "words": [ + "after", + "and", + "andalso", + "band", + "begin", + "bnot", + "bor", + "bsl", + "bsr", + "bxor", + "case", + "catch", + "cond", + "div", + "end", + "fun", + "if", + "let", + "not", + "of", + "or", + "orelse", + "query", + "receive", + "rem", + "try", + "when", + "xor", + "module", + "export", + "import", + "compile", + "vsn", + "author", + "behaviour", + "behavior", + "record", + "define", + "ifdef", + "ifndef", + "else", + "endif", + "include", + "include_lib", + "undef", + "spec", + "type", + "opaque", + "callback", + "optional_callbacks", + "spawn", + "spawn_link", + "spawn_monitor", + "spawn_opt", + "link", + "unlink", + "monitor", + "demonitor", + "process_flag", + "register", + "unregister", + "whereis", + "registered", + "send", + "exit", + "throw", + "error", + "apply", + "make_ref", + "node", + "nodes", + "self", + "pid_to_list", + "list_to_pid", + "atom_to_list", + "list_to_atom", + "binary_to_list", + "list_to_binary", + "term_to_binary", + "binary_to_term", + "integer_to_list", + "list_to_integer", + "float_to_list", + "list_to_float", + "tuple_to_list", + "list_to_tuple", + "size", + "byte_size", + "bit_size", + "length", + "hd", + "tl", + "element", + "setelement", + "tuple_size", + "is_atom", + "is_binary", + "is_bitstring", + "is_boolean", + "is_float", + "is_function", + "is_integer", + "is_list", + "is_number", + "is_pid", + "is_port", + "is_record", + "is_reference", + "is_tuple", + "abs", + "round", + "trunc", + "max", + "min", + "gen_server", + "gen_statem", + "gen_fsm", + "gen_event", + "supervisor", + "application", + "start", + "stop", + "init", + "handle_call", + "handle_cast", + "handle_info", + "terminate", + "code_change", + "start_link", + "call", + "cast", + "reply", + "noreply", + "normal", + "shutdown", + "brutal_kill", + "permanent", + "temporary", + "transient", + "worker", + "one_for_one", + "one_for_all", + "rest_for_one", + "simple_one_for_one", + "infinity", + "timer", + "sleep", + "send_after", + "send_interval", + "cancel", + "now", + "date", + "time", + "localtime", + "universaltime", + "calendar", + "datetime_to_gregorian_seconds", + "gregorian_seconds_to_datetime", + "erlang", + "system_info", + "memory", + "garbage_collect", + "process_info", + "statistics", + "trace", + "trace_pattern", + "dbg", + "ets", + "new", + "insert", + "lookup", + "delete", + "match", + "select", + "foldl", + "foldr", + "tab2list", + "info", + "dets", + "open_file", + "close", + "sync", + "mnesia", + "create_schema", + "create_table", + "delete_table", + "write", + "read", + "transaction", + "activity", + "dirty_write", + "dirty_read", + "dirty_delete", + "file", + "open", + "position", + "consult", + "eval", + "script", + "io", + "format", + "fwrite", + "nl", + "get_line", + "get_chars", + "put_chars", + "lists", + "append", + "concat", + "reverse", + "sort", + "keysort", + "member", + "filter", + "map", + "foreach", + "all", + "any", + "partition", + "splitwith", + "takewhile", + "dropwhile", + "zip", + "unzip", + "flatten", + "string", + "len", + "equal", + "chr", + "str", + "rstr", + "span", + "cspan", + "substr", + "tokens", + "chars", + "copies", + "words", + "sub_word", + "strip", + "left", + "right", + "centre", + "to_upper", + "to_lower" + ] +} diff --git a/frontend/static/languages/code_ocaml.json b/frontend/static/languages/code_ocaml.json new file mode 100644 index 000000000000..4b049d26e437 --- /dev/null +++ b/frontend/static/languages/code_ocaml.json @@ -0,0 +1,501 @@ +{ + "name": "code_ocaml", + "noLazyMode": true, + "words": [ + "!", + "#", + "&", + "&&", + "'", + "(*", + "*)", + "(**", + "(", + ")", + "*", + "*.", + "**", + "+", + "+.", + ",", + "-", + "-.", + "->", + ".", + ".field", + "..", + "/", + "/.", + ":", + "::", + ":=", + ":>", + ";", + ";;", + "<", + "<-", + "<=", + "<>", + "=", + "==", + ">", + ">=", + ">>", + ">>=", + ">>|", + ">|", + ">>?", + ">|?", + "@@", + "@@@", + "@", + "[", + "[|", + "]", + "^", + "_", + "`", + "`Ok", + "`Error", + "`Left", + "`Right", + "`Some", + "`None", + "{", + "{ field =", + "; field =", + "{ record with", + "{<", + "{|", + "|}", + "|}]", + "|", + "|>", + "|> fun x ->", + "|> List.map ~f:", + "||", + "|]", + "}", + "~", + "~f:", + "~f:(fun", + "~key:", + "~data:", + "~init:", + "~compare:", + "~equal:", + "~hash:", + "~sexp_of:", + "~of_sexp:", + "?exn", + "?exn:", + "?(exn", + "?timeout", + "?timeout:", + "?(timeout", + "?buffer_size", + "?buffer_size:", + "?(buffer_size", + "?pos", + "?pos:", + "?(pos", + "?len", + "?len:", + "?(len", + "?default", + "?default:", + "?(default", + "\"%s\"", + "\"%d\"", + "\"%f\"", + "\"%b\"", + "\"%i\"", + "\"%ld\"", + "\"%Ld\"", + "and", + "as", + "assert", + "assert (", + "assert false", + "asr", + "begin", + "class", + "constraint", + "do", + "done", + "downto", + "else", + "end", + "exception", + "external", + "false", + "for", + "fun", + "function", + "functor", + "if", + "in", + "include", + "include module type of", + "inherit", + "initializer", + "land", + "lazy", + "let", + "let%bind", + "let%map", + "let%map2", + "let%map3", + "let%mapn", + "let%sub", + "let%arr", + "let%pattern_bind", + "let%tydi", + "let%expect_test", + "let%test", + "let%test_unit", + "let%test_module", + "let%bench", + "let%bench_fun", + "let%bench_module", + "match%bind", + "match%map", + "if%bind", + "if%map", + "while%bind", + "for%bind", + "lor", + "lsl", + "lsr", + "lxor", + "match", + "method", + "mod", + "module", + "module Make", + "module Make (", + ") =", + ") : S =", + "module type", + "module type S =", + "mutable", + "new", + "nonrec", + "not", + "object", + "of", + "open", + "open!", + "or", + "private", + "rec", + "sig", + "struct", + "then", + "to", + "true", + "try", + "type", + "type t =", + "type 'a t =", + "val", + "virtual", + "when", + "while", + "with", + "[@@deriving sexp]", + "[@@deriving compare]", + "[@@deriving equal]", + "[@@deriving hash]", + "[@@deriving yojson]", + "[@@deriving show]", + "[@@deriving ord]", + "[@@deriving enum]", + "[@default", + "[@key", + "[@tailcall]", + "[@inline]", + "[@cold]", + "[@warning", + "[@alert", + "[@sexp.option]", + "[@sexp.list]", + "[@sexp.opaque]", + "[%sexp", + "[%compare:", + "[%equal:", + "[%hash:", + "[%sexp_of:", + "[%of_sexp:", + "[%message", + "[%log.debug", + "[%log.info", + "[%log.error", + "[%log", + "[%log.global.debug", + "[%log.global.info", + "[%log.global.error", + "[%string", + "[%expr", + "[%type:", + "[%pat?", + "[%expect {|", + "[%test", + "[%test_result:", + "[%test_eq:", + "[%test_pred", + "int", + "float", + "bool", + "char", + "string", + "unit", + "list", + "array", + "option", + "ref", + "exn", + "int32", + "int64", + "nativeint", + "bytes", + "result", + "Or_error.t", + "Sexp.t", + "Error.t", + "String.t", + "Int.t", + "Float.t", + "'a", + "'b", + "'c", + "'key", + "'value", + "'data", + "'msg", + "'error", + "Some", + "None", + "Ok", + "Error", + "[]", + "()", + "(fun", + "(fun x ->", + "(fun () ->", + "(fun ~key ~data ->", + "(function", + "| [] ->", + "| h :: t ->", + "| Some x ->", + "| None ->", + "| Ok x ->", + "| Error e ->", + "| 0 ->", + "| n ->", + "| _ ->", + "| exception", + "x ->", + "y ->", + "acc ->", + "~f:( fun", + "~init:0", + "~init:[]", + "~init:\"\"", + "~compare:String.compare", + "~compare:Int.compare", + "~equal:String.equal", + "~equal:Int.equal", + ": int =", + ": string =", + ": bool =", + ": unit =", + ": 'a list =", + ": 'a option =", + ": ('a, 'b) result =", + "int ->", + "string ->", + "bool ->", + "unit ->", + "'a ->", + "'a list ->", + "'a option ->", + "?exn:exn ->", + "List.map", + "List.filter", + "List.fold", + "List.fold_left", + "List.fold_right", + "List.iter", + "List.length", + "List.rev", + "List.append", + "List.concat", + "List.hd", + "List.tl", + "List.nth", + "List.mem", + "List.find", + "List.find_opt", + "List.find_map", + "List.exists", + "List.for_all", + "List.sort", + "List.partition", + "List.flatten", + "Array.make", + "Array.init", + "Array.get", + "Array.set", + "Array.length", + "Array.map", + "Array.iter", + "Array.fold_left", + "Array.fold_right", + "Array.sort", + "String.length", + "String.get", + "String.sub", + "String.concat", + "String.split_on_char", + "String.uppercase_ascii", + "String.lowercase_ascii", + "String.trim", + "String.map", + "String.iter", + "String.index_opt", + "String.contains", + "String.starts_with", + "String.ends_with", + "Option.map", + "Option.bind", + "Option.value", + "Option.get", + "Option.is_some", + "Option.is_none", + "Option.value_exn", + "Option.join", + "Result.map", + "Result.bind", + "Result.map_error", + "Result.is_ok", + "Result.is_error", + "Result.get_ok", + "Result.get_error", + "Hashtbl.create", + "Hashtbl.add", + "Hashtbl.find", + "Hashtbl.find_opt", + "Hashtbl.mem", + "Hashtbl.remove", + "Hashtbl.iter", + "Map.empty", + "Map.add", + "Map.find", + "Map.find_opt", + "Map.mem", + "Map.remove", + "Map.iter", + "Map.fold", + "Set.empty", + "Set.add", + "Set.mem", + "Set.remove", + "Set.union", + "Set.inter", + "Set.diff", + "Set.iter", + "Queue.create", + "Queue.add", + "Queue.take", + "Queue.peek", + "Queue.is_empty", + "Stack.create", + "Stack.push", + "Stack.pop", + "Stack.top", + "Stack.is_empty", + "Sys.argv", + "Sys.file_exists", + "Sys.is_directory", + "Sys.remove", + "Sys.rename", + "Sys.getenv", + "Sys.getenv_opt", + "abs", + "abs_float", + "acos", + "asin", + "atan", + "ceil", + "cos", + "exp", + "floor", + "fst", + "snd", + "ignore", + "incr", + "decr", + "max", + "min", + "max_int", + "min_int", + "mod_float", + "nan", + "infinity", + "neg_infinity", + "pred", + "succ", + "sqrt", + "sin", + "tan", + "log", + "log10", + "print_string", + "print_int", + "print_float", + "print_endline", + "print_newline", + "prerr_string", + "prerr_int", + "prerr_endline", + "read_line", + "read_int", + "read_float", + "open_in", + "open_out", + "close_in", + "close_out", + "input_line", + "output_string", + "flush", + "raise", + "failwith", + "invalid_arg", + "compare", + "Printf.printf", + "Printf.sprintf", + "Printf.fprintf", + "Printf.eprintf", + "Format.printf", + "Format.sprintf", + "Format.fprintf", + "Format.eprintf", + "Lwt.return", + "Lwt.bind", + "Lwt.map", + "Lwt.catch", + "Lwt.async", + "Lwt.pick", + "Lwt.choose", + "Lwt.join", + "Lwt_main.run", + "Async.return", + "Async.bind", + "Async.map", + "Deferred.return", + "Deferred.bind", + "Deferred.map", + "Deferred.all" + ] +} diff --git a/frontend/static/quotes/arabic_egypt.json b/frontend/static/quotes/arabic_egypt.json index c5251d7dffe0..89999d3b59b0 100644 --- a/frontend/static/quotes/arabic_egypt.json +++ b/frontend/static/quotes/arabic_egypt.json @@ -492,6 +492,12 @@ "source": "طه حسين - الأيام", "length": 258, "id": 81 + }, + { + "text": "الدنيا يا ولدي ليها وشين، أبيض وأسود، لما تبقى بيضا قدامك افتكر الأسود عشان تسلك، ولما تبقى سودة افتكر الأبيض عشان تقدر تعيش لبكرة.", + "source": "علي الشريف - فيلم الإنسان يعيش مرة واحدة", + "length": 131, + "id": 82 } ] } diff --git a/frontend/static/quotes/code_rust.json b/frontend/static/quotes/code_rust.json index a30a550b0b71..bbdbbbb23c38 100644 --- a/frontend/static/quotes/code_rust.json +++ b/frontend/static/quotes/code_rust.json @@ -51,9 +51,9 @@ }, { "id": 8, - "length": 37, + "length": 36, "source": "Iterate over list values - programming-idioms.org", - "text": "for x in items {\n\t\tdo_something(x);\n}" + "text": "for x in items {\n\tdo_something(x);\n}" }, { "id": 9, @@ -255,9 +255,9 @@ }, { "id": 43, - "length": 145, + "length": 143, "source": "Parallelize execution of 1000 independent tasks - programming-idioms.org", - "text": "use std::thread;\nlet threads: Vec<_> = (0..1000).map(|i| {\n\t\tthread::spawn(move || f(i))\n}).collect();\nfor thread in threads {\n\t\tthread.join();\n}" + "text": "use std::thread;\nlet threads: Vec<_> = (0..1000).map(|i| {\n\tthread::spawn(move || f(i))\n}).collect();\nfor thread in threads {\n\tthread.join();\n}" }, { "id": 44, @@ -297,9 +297,9 @@ }, { "id": 50, - "length": 149, + "length": 147, "source": "First-class function : compose - programming-idioms.org", - "text": "fn compose<'a, A, B, C, G, F>(f: F, g: G) -> Box C + 'a>\n\t\twhere F: 'a + Fn(A) -> B, G: 'a + Fn(B) -> C\n{\n\t\tBox::new(move |x| g(f(x)))\n}" + "text": "fn compose<'a, A, B, C, G, F>(f: F, g: G) -> Box C + 'a>\n\twhere F: 'a + Fn(A) -> B, G: 'a + Fn(B) -> C\n{\n\tBox::new(move |x| g(f(x)))\n}" }, { "id": 51, @@ -309,9 +309,9 @@ }, { "id": 52, - "length": 149, + "length": 147, "source": "First-class function : generic composition - programming-idioms.org", - "text": "fn compose<'a, A, B, C, G, F>(f: F, g: G) -> Box C + 'a>\n\t\twhere F: 'a + Fn(A) -> B, G: 'a + Fn(B) -> C\n{\n\t\tBox::new(move |x| g(f(x)))\n}" + "text": "fn compose<'a, A, B, C, G, F>(f: F, g: G) -> Box C + 'a>\n\twhere F: 'a + Fn(A) -> B, G: 'a + Fn(B) -> C\n{\n\tBox::new(move |x| g(f(x)))\n}" }, { "id": 53, @@ -459,9 +459,9 @@ }, { "id": 77, - "length": 129, + "length": 128, "source": "Launch 1000 parallel tasks and wait for completion - programming-idioms.org", - "text": "use std::thread;\nlet threads: Vec<_> = (0..1000).map(|i| thread::spawn(move || f(i))).collect();\nfor t in threads {\n\t\tt.join();\n}" + "text": "use std::thread;\nlet threads: Vec<_> = (0..1000).map(|i| thread::spawn(move || f(i))).collect();\nfor t in threads {\n\tt.join();\n}" }, { "id": 78, @@ -813,9 +813,9 @@ }, { "id": 136, - "length": 108, + "length": 107, "source": "Iterate over map entries, ordered by values - programming-idioms.org", - "text": "use itertools::Itertools;\nfor (k, x) in mymap.iter().sorted_by_key(|x| x.1) {\n\t\tprintln!(\"[{},{}]\", k, x);\n}" + "text": "use itertools::Itertools;\nfor (k, x) in mymap.iter().sorted_by_key(|x| x.1) {\n\tprintln!(\"[{},{}]\", k, x);\n}" }, { "id": 137, @@ -939,15 +939,15 @@ }, { "id": 157, - "length": 497, + "length": 482, "source": "Breadth-first traversing in a graph - programming-idioms.org", - "text": "use std::rc::{Rc, Weak};\nuse std::cell::RefCell;\nstruct Vertex {\n\t\tvalue: V,\n\t\tneighbours: Vec>>>,\n}\n// ...\nfn bft(start: Rc>>, f: impl Fn(&V)) {\n\t\tlet mut q = vec![start];\n\t\tlet mut i = 0;\n\t\twhile i < q.len() {\n\t\t\tlet v = Rc::clone(&q[i]);\n\t\t\ti += 1;\n\t\t\t(f)(&v.borrow().value);\n\t\t\tfor n in &v.borrow().neighbours {\n\t\t\t\tlet n = n.upgrade().expect(\"Invalid neighbour\");\n\t\t\t\tif q.iter().all(|v| v.as_ptr() != n.as_ptr()) {\n\t\t\t\t\tq.push(n);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n}" + "text": "use std::rc::{Rc, Weak};\nuse std::cell::RefCell;\nstruct Vertex {\n\tvalue: V,\n\tneighbours: Vec>>>,\n}\n// ...\nfn bft(start: Rc>>, f: impl Fn(&V)) {\n\tlet mut q = vec![start];\n\tlet mut i = 0;\n\twhile i < q.len() {\n\t\tlet v = Rc::clone(&q[i]);\n\t\ti += 1;\n\t\t(f)(&v.borrow().value);\n\t\tfor n in &v.borrow().neighbours {\n\t\t\tlet n = n.upgrade().expect(\"Invalid neighbour\");\n\t\t\tif q.iter().all(|v| v.as_ptr() != n.as_ptr()) {\n\t\t\t\tq.push(n);\n\t\t\t}\n\t\t}\n\t}\n}" }, { "id": 158, - "length": 465, + "length": 450, "source": "Depth-first traversing in a graph - programming-idioms.org", - "text": "use std::rc::{Rc, Weak};\nuse std::cell::RefCell;\nstruct Vertex {\n\t\tvalue: V,\n\t\tneighbours: Vec>>>,\n}\n// ...\nfn dft_helper(start: Rc>>, f: &impl Fn(&V), s: &mut Vec<*const Vertex>) {\n\t\ts.push(start.as_ptr());\n\t\t(f)(&start.borrow().value);\n\t\tfor n in &start.borrow().neighbours {\n\t\t\t\tlet n = n.upgrade().expect(\"Invalid neighbor\");\n\t\t\t\tif s.iter().all(|&p| p != n.as_ptr()) {\n\t\t\t\t\t\tSelf::dft_helper(n, f, s);\n\t\t\t\t}\n\t\t}\n}" + "text": "use std::rc::{Rc, Weak};\nuse std::cell::RefCell;\nstruct Vertex {\n\tvalue: V,\n\tneighbours: Vec>>>,\n}\n// ...\nfn dft_helper(start: Rc>>, f: &impl Fn(&V), s: &mut Vec<*const Vertex>) {\n\ts.push(start.as_ptr());\n\t(f)(&start.borrow().value);\n\tfor n in &start.borrow().neighbours {\n\t\tlet n = n.upgrade().expect(\"Invalid neighbor\");\n\t\tif s.iter().all(|&p| p != n.as_ptr()) {\n\t\t\tSelf::dft_helper(n, f, s);\n\t\t}\n\t}\n}" }, { "id": 159, @@ -1005,9 +1005,9 @@ }, { "id": 168, - "length": 141, + "length": 127, "source": "Check if string contains only digits - programming-idioms.org", - "text": "let chars_are_numeric: Vec = s.chars()\n\t\t\t\t\t\t\t\t.map(|c|c.is_numeric())\n\t\t\t\t\t\t\t\t.collect();\nlet b = !chars_are_numeric.contains(&false);" + "text": "let chars_are_numeric: Vec = s.chars()\n\t.map(|c|c.is_numeric())\n\t.collect();\nlet b = !chars_are_numeric.contains(&false);" }, { "id": 169, @@ -1347,9 +1347,9 @@ }, { "id": 225, - "length": 63, + "length": 60, "source": "Filter and transform list - programming-idioms.org", - "text": "let y = x.iter()\n\t\t.filter(P)\n\t\t.map(T)\n\t\t.collect::>();" + "text": "let y = x.iter()\n\t.filter(P)\n\t.map(T)\n\t.collect::>();" }, { "id": 226, @@ -1377,9 +1377,9 @@ }, { "id": 230, - "length": 129, + "length": 127, "source": "Get a list of lines from a file - programming-idioms.org", - "text": "use std::io::prelude::*;\nuse std::io::BufReader;\nlet lines = BufReader::new(File::open(path)?)\n\t\t.lines()\n\t\t.collect::>();" + "text": "use std::io::prelude::*;\nuse std::io::BufReader;\nlet lines = BufReader::new(File::open(path)?)\n\t.lines()\n\t.collect::>();" }, { "id": 231, @@ -1431,15 +1431,15 @@ }, { "id": 239, - "length": 74, + "length": 73, "source": "Formula with arrays - programming-idioms.org", - "text": "for i in range 0..a.len() {\n\t\ta[i] = e*(a[i] + b[i] + c[i] + d[i].cos())\n}" + "text": "for i in range 0..a.len() {\n\ta[i] = e*(a[i] + b[i] + c[i] + d[i].cos())\n}" }, { "id": 240, - "length": 131, + "length": 121, "source": "Type with automatic deep deallocation - programming-idioms.org", - "text": "struct T {\n\t\ts: String,\n\t\tn: Vec,\n}\nfn main() {\n\t\tlet v = T {\n\t\t\t\ts: \"Hello, world!\".into(),\n\t\t\t\tn: vec![1,4,9,16,25]\n\t\t};\n}" + "text": "struct T {\n\ts: String,\n\tn: Vec,\n}\nfn main() {\n\tlet v = T {\n\ts: \"Hello, world!\".into(),\n\tn: vec![1,4,9,16,25]\n\t};\n}" }, { "id": 241, @@ -1473,9 +1473,9 @@ }, { "id": 246, - "length": 138, + "length": 136, "source": "Pad a string on both sides - programming-idioms.org", - "text": "use std::iter;\nlet s2 = iter::repeat(c).take((m + 1) / 2).collect::()\n\t\t+ &s\n\t\t+ &iter::repeat(c).take(m / 2).collect::();" + "text": "use std::iter;\nlet s2 = iter::repeat(c).take((m + 1) / 2).collect::()\n\t+ &s\n\t+ &iter::repeat(c).take(m / 2).collect::();" }, { "id": 247, @@ -1539,9 +1539,9 @@ }, { "id": 257, - "length": 101, + "length": 99, "source": "for else loop - programming-idioms.org", - "text": "if let None = items.iter().find(|&&item| item == \"rockstar programmer\") {\n\t\tprintln!(\"NotFound\");\n\t};" + "text": "if let None = items.iter().find(|&&item| item == \"rockstar programmer\") {\n\tprintln!(\"NotFound\");\n};" }, { "id": 258, diff --git a/frontend/static/quotes/english.json b/frontend/static/quotes/english.json index e5556da3ac0b..6a58ecc53798 100644 --- a/frontend/static/quotes/english.json +++ b/frontend/static/quotes/english.json @@ -38901,6 +38901,84 @@ "source": "Kung Fu Panda 2 (2011)", "id": 7696, "length": 138 + }, + { + "text": "It isn't what you have or who you are or where you are or what you are doing that makes you happy or unhappy. It is what you think about it.", + "source": "Dale Carnegie, How to Win Friends & Influence People", + "id": 7697, + "length": 140 + }, + { + "text": "Don't be afraid of enemies who attack you. Be afraid of the friends who flatter you.", + "source": "Dale Carnegie, How to Win Friends & Influence People", + "id": 7698, + "length": 84 + }, + { + "text": "You can make more friends in two months by becoming interested in other people than you can in two years by trying to get other people interested in you.", + "source": "Dale Carnegie, How to Win Friends & Influence People", + "id": 7699, + "length": 153 + }, + { + "text": "Any fool can criticize, complain, and condemn—and most fools do. But it takes character and self-control to be understanding and forgiving.", + "source": "Dale Carnegie, How to Win Friends & Influence People", + "id": 7700, + "length": 139 + }, + { + "text": "When dealing with people, remember you are not dealing with creatures of logic, but with creatures bristling with prejudice and motivated by pride and vanity.", + "source": "Dale Carnegie, How to Win Friends & Influence People", + "id": 7701, + "length": 158 + }, + { + "text": "Actions speak louder than words, and a smile says, 'I like you. You make me happy. I am glad to see you.' That is why dogs make such a hit. They are so glad to see us that they almost jump out of their skins. So, naturally, we are glad to see them.", + "source": "Dale Carnegie, How to Win Friends & Influence People", + "id": 7702, + "length": 248 + }, + { + "text": "I have come to the conclusion that there is only one way under high heaven to get the best of an argument — and that is to avoid it. Avoid it as you would avoid rattlesnakes and earthquakes.", + "source": "Dale Carnegie, How to Win Friends & Influence People", + "id": 7703, + "length": 190 + }, + { + "text": "The streets are empty. Wind skims the voids keeping neighbors apart, as if grazing the hollow of a cut reed, or say, a plundered mailbox. A familiar note is produced. It's the one Desolation plays to keep its instrument in tune.", + "source": "Homestuck", + "id": 7704, + "length": 228 + }, + { + "text": "When the sun comes up again... I want tomorrow to be the same as yesterday. And the next day to be just the same as that. That in the end, we can always go back to how things were.", + "source": "Deltarune", + "id": 7705, + "length": 180 + }, + { + "text": "It's hard to put into words, but for some reason, seeing Susie next to you... You felt like, whatever you were, for just right now, it might be okay.", + "source": "Deltarune", + "id": 7706, + "length": 149 + }, + { + "text": "You may forget me, I may forget myself, but I will remember your kindness. Now, this island will disappear soon. You must depart. If you will it, we shall meet again at that place... Whether 11 hours or 11 years, DELTARUNE will be waiting. So take your time, wash your face and get dressed!", + "source": "Deltarune", + "id": 7707, + "length": 290 + }, + { + "text": "And the game was over and the player woke up from the dream. And the player began a new dream. And the player dreamed again, dreamed better. And the player was the universe. And the player was love. You are the player. Wake up.", + "source": "Minecraft", + "id": 7708, + "length": 227 + }, + { + "text": "I understand you don't feel it's working out for you here at Lumon. While disappointed, I'd hate to keep you somewhere you're not happy. So, let's get you outta here.", + "source": "Severance", + "id": 7709, + "length": 166 } ] } diff --git a/frontend/static/quotes/german.json b/frontend/static/quotes/german.json index ba48227c9f5a..e0c8649e41ce 100644 --- a/frontend/static/quotes/german.json +++ b/frontend/static/quotes/german.json @@ -3360,6 +3360,12 @@ "source": "Patent Ochsner - für immer uf di", "length": 217, "id": 588 + }, + { + "text": "Wie soll ich ein Monster stoppen, ohne selbst eins zu werden?", + "source": "Stefan Salvatore - The Vampire Diaries", + "length": 61, + "id": 589 } ] } diff --git a/frontend/static/quotes/italian.json b/frontend/static/quotes/italian.json index a842e8b864b9..b5e45f5990a9 100644 --- a/frontend/static/quotes/italian.json +++ b/frontend/static/quotes/italian.json @@ -218,7 +218,7 @@ "id": 36 }, { - "text": "La vita è terribile. E lei che ci governa, non noi che la governiamo.", + "text": "La vita è terribile, è lei che ci governa: non noi che la governiamo.", "source": "Oscar Wilde", "length": 69, "id": 37 diff --git a/packages/schemas/src/languages.ts b/packages/schemas/src/languages.ts index afa1134e2552..c5279e6176cf 100644 --- a/packages/schemas/src/languages.ts +++ b/packages/schemas/src/languages.ts @@ -409,13 +409,16 @@ export const LanguageSchema = z.enum( "code_v", "code_ook", "code_typescript", + "code_ocaml", "code_odin", "xhosa", "xhosa_3k", "tibetan", "tibetan_1k", "code_cobol", + "code_clojure", "code_common_lisp", + "code_erlang", "docker_file", "code_fortran", "viossa", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c8a113665729..87cde1ab20e7 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -19,7 +19,7 @@ importers: version: link:packages/release '@vitest/coverage-v8': specifier: 3.2.4 - version: 3.2.4(vitest@3.2.4(@types/node@20.5.1)(happy-dom@15.10.2)(sass@1.70.0)(terser@5.43.1)(tsx@4.16.2)(yaml@2.5.0)) + version: 3.2.4(vitest@3.2.4(@types/node@20.5.1)(happy-dom@20.0.0)(sass@1.70.0)(terser@5.44.0)(tsx@4.16.2)(yaml@2.5.0)) conventional-changelog: specifier: 6.0.0 version: 6.0.0(conventional-commits-filter@5.0.0) @@ -49,7 +49,7 @@ importers: version: 2.5.6 vitest: specifier: 3.2.4 - version: 3.2.4(@types/node@20.5.1)(happy-dom@15.10.2)(sass@1.70.0)(terser@5.43.1)(tsx@4.16.2)(yaml@2.5.0) + version: 3.2.4(@types/node@20.5.1)(happy-dom@20.0.0)(sass@1.70.0)(terser@5.44.0)(tsx@4.16.2)(yaml@2.5.0) backend: dependencies: @@ -129,8 +129,8 @@ importers: specifier: 4.2.0 version: 4.2.0 nodemailer: - specifier: 6.9.14 - version: 6.9.14 + specifier: 7.0.7 + version: 7.0.7 object-hash: specifier: 3.0.0 version: 3.0.0 @@ -217,8 +217,8 @@ importers: specifier: 4.0.2 version: 4.0.2 '@types/supertest': - specifier: 2.0.12 - version: 2.0.12 + specifier: 6.0.3 + version: 6.0.3 '@types/swagger-stats': specifier: 0.95.11 version: 0.95.11 @@ -230,7 +230,7 @@ importers: version: 10.0.0 '@vitest/coverage-v8': specifier: 3.2.4 - version: 3.2.4(vitest@3.2.4(@types/node@20.14.11)(happy-dom@15.10.2)(sass@1.70.0)(terser@5.43.1)(tsx@4.16.2)(yaml@2.5.0)) + version: 3.2.4(vitest@3.2.4(@types/node@20.14.11)(happy-dom@20.0.0)(sass@1.70.0)(terser@5.44.0)(tsx@4.16.2)(yaml@2.5.0)) concurrently: specifier: 8.2.2 version: 8.2.2 @@ -250,8 +250,8 @@ importers: specifier: 1.4.10 version: 1.4.10 supertest: - specifier: 6.2.3 - version: 6.2.3 + specifier: 7.1.4 + version: 7.1.4 testcontainers: specifier: 11.4.0 version: 11.4.0 @@ -263,7 +263,7 @@ importers: version: 5.5.4 vitest: specifier: 3.2.4 - version: 3.2.4(@types/node@20.14.11)(happy-dom@15.10.2)(sass@1.70.0)(terser@5.43.1)(tsx@4.16.2)(yaml@2.5.0) + version: 3.2.4(@types/node@20.14.11)(happy-dom@20.0.0)(sass@1.70.0)(terser@5.44.0)(tsx@4.16.2)(yaml@2.5.0) frontend: dependencies: @@ -411,7 +411,7 @@ importers: version: 5.0.2 '@vitest/coverage-v8': specifier: 3.2.4 - version: 3.2.4(vitest@3.2.4(@types/node@20.14.11)(happy-dom@15.10.2)(sass@1.70.0)(terser@5.44.0)(tsx@4.16.2)(yaml@2.5.0)) + version: 3.2.4(vitest@3.2.4(@types/node@20.14.11)(happy-dom@20.0.0)(sass@1.70.0)(terser@5.44.0)(tsx@4.16.2)(yaml@2.5.0)) autoprefixer: specifier: 10.4.20 version: 10.4.20(postcss@8.4.31) @@ -434,8 +434,8 @@ importers: specifier: 4.4.0 version: 4.4.0(@fortawesome/fontawesome-free@5.15.4) happy-dom: - specifier: 15.10.2 - version: 15.10.2 + specifier: 20.0.0 + version: 20.0.0 madge: specifier: 8.0.0 version: 8.0.0(typescript@5.5.4) @@ -495,7 +495,7 @@ importers: version: 1.0.0(vite@6.3.6(@types/node@20.14.11)(sass@1.70.0)(terser@5.44.0)(tsx@4.16.2)(yaml@2.5.0))(workbox-build@7.1.1)(workbox-window@7.1.0) vitest: specifier: 3.2.4 - version: 3.2.4(@types/node@20.14.11)(happy-dom@15.10.2)(sass@1.70.0)(terser@5.44.0)(tsx@4.16.2)(yaml@2.5.0) + version: 3.2.4(@types/node@20.14.11)(happy-dom@20.0.0)(sass@1.70.0)(terser@5.44.0)(tsx@4.16.2)(yaml@2.5.0) packages/contracts: dependencies: @@ -535,7 +535,7 @@ importers: version: 5.5.4 vitest: specifier: 3.2.4 - version: 3.2.4(@types/node@20.14.11)(happy-dom@15.10.2)(sass@1.70.0)(terser@5.43.1)(tsx@4.16.2)(yaml@2.5.0) + version: 3.2.4(@types/node@20.14.11)(happy-dom@20.0.0)(sass@1.70.0)(terser@5.44.0)(tsx@4.16.2)(yaml@2.5.0) packages/eslint-config: devDependencies: @@ -599,7 +599,7 @@ importers: version: 5.5.4 vitest: specifier: 3.2.4 - version: 3.2.4(@types/node@20.14.11)(happy-dom@15.10.2)(sass@1.70.0)(terser@5.43.1)(tsx@4.16.2)(yaml@2.5.0) + version: 3.2.4(@types/node@20.14.11)(happy-dom@20.0.0)(sass@1.70.0)(terser@5.44.0)(tsx@4.16.2)(yaml@2.5.0) packages/oxlint-config: {} @@ -660,7 +660,7 @@ importers: version: 5.5.4 vitest: specifier: 3.2.4 - version: 3.2.4(@types/node@20.14.11)(happy-dom@15.10.2)(sass@1.70.0)(terser@5.43.1)(tsx@4.16.2)(yaml@2.5.0) + version: 3.2.4(@types/node@20.14.11)(happy-dom@20.0.0)(sass@1.70.0)(terser@5.44.0)(tsx@4.16.2)(yaml@2.5.0) packages/tsup-config: dependencies: @@ -711,7 +711,7 @@ importers: version: 5.5.4 vitest: specifier: 3.2.4 - version: 3.2.4(@types/node@20.14.11)(happy-dom@15.10.2)(sass@1.70.0)(terser@5.43.1)(tsx@4.16.2)(yaml@2.5.0) + version: 3.2.4(@types/node@20.14.11)(happy-dom@20.0.0)(sass@1.70.0)(terser@5.44.0)(tsx@4.16.2)(yaml@2.5.0) zod: specifier: 3.23.8 version: 3.23.8 @@ -2541,6 +2541,9 @@ packages: cpu: [x64] os: [win32] + '@paralleldrive/cuid2@2.2.2': + resolution: {integrity: sha512-ZOBkgDwEdoYVlSeRbYYXs0S9MejQofiVYoTbKzy/6GQa39/q5tQU2IX46+shYnUkpEl3wc+J6wRlar7r2EK2xA==} + '@pkgjs/parseargs@0.11.0': resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} @@ -3113,8 +3116,8 @@ packages: '@types/superagent@8.1.8': resolution: {integrity: sha512-nTqHJ2OTa7PFEpLahzSEEeFeqbMpmcN7OeayiOc7v+xk+/vyTKljRe+o4MPqSnPeRCMvtxuLG+5QqluUVQJOnA==} - '@types/supertest@2.0.12': - resolution: {integrity: sha512-X3HPWTwXRerBZS7Mo1k6vMVR1Z6zmJcDVn5O/31whe0tnjE4te6ZJSJGq1RiqHPjzPdMTfjCFogDJmwng9xHaQ==} + '@types/supertest@6.0.3': + resolution: {integrity: sha512-8WzXq62EXFhJ7QsH3Ocb/iKQ/Ty9ZVWnVzoTKc9tyyFRRF3a74Tk2+TLFgaFFw364Ere+npzHKEJ6ga2LzIL7w==} '@types/swagger-stats@0.95.11': resolution: {integrity: sha512-npTTS5lv0FmkgKeChxUrp9nTqiFdFP5XRlewfGP7JVeFwV7u1yE0SOUh8eXMrgVLE/mJNJuhGoAoVClHc+rsGA==} @@ -3140,6 +3143,9 @@ packages: '@types/webidl-conversions@7.0.3': resolution: {integrity: sha512-CiJJvcRtIgzadHCYXw7dqEnMNRjhGZlYK05Mj9OyktqV8uVT8fD2BFOB7S1uwBE3Kj2Z+4UyPmFw/Ixgw/LAlA==} + '@types/whatwg-mimetype@3.0.2': + resolution: {integrity: sha512-c2AKvDT8ToxLIOUlN51gTiHXflsfIFisS4pO7pDPoKouJCESkhZnEy623gwP9laCy5lnLDAw1vAzu2vM2YLOrA==} + '@types/whatwg-url@11.0.5': resolution: {integrity: sha512-coYR071JRaHa+xoEvvYqvnIHaVqaYrLPbsufM9BF63HkwI5Lgmy2QR8Q5K/lYDYo5AK82wOvSOS0UsLTpTG7uQ==} @@ -5241,9 +5247,9 @@ packages: resolution: {integrity: sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==} engines: {node: '>= 6'} - formidable@2.1.2: - resolution: {integrity: sha512-CM3GuJ57US06mlpQ47YcunuUZ9jpm8Vx+P2CGt2j7HpgkKZO/DJYQ0Bobim8G6PFQmK5lOqOOdUXboU+h73A4g==} - deprecated: 'ACTION REQUIRED: SWITCH TO v3 - v1 and v2 are VULNERABLE! v1 is DEPRECATED FOR OVER 2 YEARS! Use formidable@latest or try formidable-mini for fresh projects' + formidable@3.5.4: + resolution: {integrity: sha512-YikH+7CUTOtP44ZTnUhR7Ic2UASBPOqmaRkRKxRbywPTe5VxF7RRCck4af9wutiZ/QKM5nME9Bie2fFaPz5Gug==} + engines: {node: '>=14.0.0'} forwarded@0.2.0: resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} @@ -5511,9 +5517,9 @@ packages: hangul-js@0.2.6: resolution: {integrity: sha512-48axU8LgjCD30FEs66Xc04/8knxMwCMQw0f67l67rlttW7VXT3qRJgQeHmhiuGwWXGvSbk6YM0fhQlcjE1JFQA==} - happy-dom@15.10.2: - resolution: {integrity: sha512-NbA5XrSovenJIIcfixCREX3ZnV7yHP4phhbfuxxf4CPn+LZpz/jIM9EqJ2DrPwgVDSMoAKH3pZwQvkbsSiCrUw==} - engines: {node: '>=18.0.0'} + happy-dom@20.0.0: + resolution: {integrity: sha512-GkWnwIFxVGCf2raNrxImLo397RdGhLapj5cT3R2PT7FwL62Ze1DROhzmYW7+J3p9105DYMVenEejEbnq5wA37w==} + engines: {node: '>=20.0.0'} hard-rejection@2.1.0: resolution: {integrity: sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==} @@ -5582,10 +5588,6 @@ packages: resolution: {integrity: sha512-HVqALKZlR95ROkrnesdhbbZJFi/rIVSoNq6f3jA/9u6MIbTsPh3xZwihjeI5+DO/2sOV6HMHooXcEOuwskHpTg==} engines: {node: '>=10.0.0'} - hexoid@1.0.0: - resolution: {integrity: sha512-QFLV0taWQOZtvIRIAdBChesmogZrtuXvVWsFHZTk2SU+anspqZ2vMnoLg7IE1+Uk16N19APic1BuF8bC8c2m5g==} - engines: {node: '>=8'} - highlight.js@10.7.3: resolution: {integrity: sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==} @@ -7126,8 +7128,8 @@ packages: resolution: {integrity: sha512-1uiY543L+N7Og4yswvlm5NCKgPKDEXd9AUR9Jh3gen6oOeBsesr6LqhXom1er3eRzSUcVRWXzhv8tSNrIfGHKw==} engines: {node: '>=18'} - nodemailer@6.9.14: - resolution: {integrity: sha512-Dobp/ebDKBvz91sbtRKhcznLThrKxKt97GI2FAlAyy+fk19j73Uz3sBXolVtmcXjaorivqsbbbjDY+Jkt4/bQA==} + nodemailer@7.0.7: + resolution: {integrity: sha512-jGOaRznodf62TVzdyhKt/f1Q/c3kYynk8629sgJHpRzGZj01ezbgMMWJSAjHADcwTKxco3B68/R+KHJY2T5BaA==} engines: {node: '>=6.0.0'} nodemon@3.1.4: @@ -8633,20 +8635,18 @@ packages: summary@2.1.0: resolution: {integrity: sha512-nMIjMrd5Z2nuB2RZCKJfFMjgS3fygbeyGk9PxPPaJR1RIcyN9yn4A63Isovzm3ZtQuEkLBVgMdPup8UeLH7aQw==} - superagent@7.1.6: - resolution: {integrity: sha512-gZkVCQR1gy/oUXr+kxJMLDjla434KmSOKbx5iGD30Ql+AkJQ/YlPKECJy2nhqOsHLjGHzoDTXNSjhnvWhzKk7g==} - engines: {node: '>=6.4.0 <13 || >=14'} - deprecated: Please upgrade to v9.0.0+ as we have fixed a public vulnerability with formidable dependency. Note that v9.0.0+ requires Node.js v14.18.0+. See https://github.com/ladjs/superagent/pull/1800 for insight. This project is supported and maintained by the team at Forward Email @ https://forwardemail.net + superagent@10.2.3: + resolution: {integrity: sha512-y/hkYGeXAj7wUMjxRbB21g/l6aAEituGXM9Rwl4o20+SX3e8YOSV6BxFXl+dL3Uk0mjSL3kCbNkwURm8/gEDig==} + engines: {node: '>=14.18.0'} superstatic@9.0.3: resolution: {integrity: sha512-e/tmW0bsnQ/33ivK6y3CapJT0Ovy4pk/ohNPGhIAGU2oasoNLRQ1cv6enua09NU9w6Y0H/fBu07cjzuiWvLXxw==} engines: {node: ^14.18.0 || >=16.4.0} hasBin: true - supertest@6.2.3: - resolution: {integrity: sha512-3GSdMYTMItzsSYjnIcljxMVZKPW1J9kYHZY+7yLfD0wpPwww97GeImZC1oOk0S5+wYl2niJwuFusBJqwLqYM3g==} - engines: {node: '>=6.0.0'} - deprecated: Please upgrade to supertest v7.1.3+, see release notes at https://github.com/forwardemail/supertest/releases/tag/v7.1.3 - maintenance is supported by Forward Email @ https://forwardemail.net + supertest@7.1.4: + resolution: {integrity: sha512-tjLPs7dVyqgItVFirHYqe2T+MfWc2VOBQ8QFKKbWTA3PU7liZR8zoSpAi/C1k1ilm9RsXIKYf197oap9wXGVYg==} + engines: {node: '>=14.18.0'} supports-color@5.5.0: resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} @@ -8721,11 +8721,6 @@ packages: engines: {node: '>=10'} hasBin: true - terser@5.43.1: - resolution: {integrity: sha512-+6erLbBm0+LROX2sPXlUYx/ux5PyE9K/a92Wrt6oA+WDAoFTdpHE5tCYCI5PNzq2y8df4rA+QgHLJuR4jNymsg==} - engines: {node: '>=10'} - hasBin: true - terser@5.44.0: resolution: {integrity: sha512-nIVck8DK+GM/0Frwd+nIhZ84pR/BX7rmXMfYwyg+Sri5oGVE99/E3KvXqpC2xHFxyqXyGHTKBSioxxplrO4I4w==} engines: {node: '>=10'} @@ -11948,6 +11943,10 @@ snapshots: '@oxlint/win32-x64@1.15.0': optional: true + '@paralleldrive/cuid2@2.2.2': + dependencies: + '@noble/hashes': 1.8.0 + '@pkgjs/parseargs@0.11.0': optional: true @@ -12555,10 +12554,11 @@ snapshots: '@types/cookiejar': 2.1.5 '@types/methods': 1.1.4 '@types/node': 20.14.11 - form-data: 4.0.0 + form-data: 4.0.4 - '@types/supertest@2.0.12': + '@types/supertest@6.0.3': dependencies: + '@types/methods': 1.1.4 '@types/superagent': 8.1.8 '@types/swagger-stats@0.95.11': @@ -12586,6 +12586,8 @@ snapshots: '@types/webidl-conversions@7.0.3': {} + '@types/whatwg-mimetype@3.0.2': {} + '@types/whatwg-url@11.0.5': dependencies: '@types/webidl-conversions': 7.0.3 @@ -12735,7 +12737,7 @@ snapshots: '@ungap/structured-clone@1.2.0': {} - '@vitest/coverage-v8@3.2.4(vitest@3.2.4(@types/node@20.14.11)(happy-dom@15.10.2)(sass@1.70.0)(terser@5.43.1)(tsx@4.16.2)(yaml@2.5.0))': + '@vitest/coverage-v8@3.2.4(vitest@3.2.4(@types/node@20.14.11)(happy-dom@20.0.0)(sass@1.70.0)(terser@5.44.0)(tsx@4.16.2)(yaml@2.5.0))': dependencies: '@ampproject/remapping': 2.3.0 '@bcoe/v8-coverage': 1.0.2 @@ -12750,11 +12752,11 @@ snapshots: std-env: 3.9.0 test-exclude: 7.0.1 tinyrainbow: 2.0.0 - vitest: 3.2.4(@types/node@20.14.11)(happy-dom@15.10.2)(sass@1.70.0)(terser@5.43.1)(tsx@4.16.2)(yaml@2.5.0) + vitest: 3.2.4(@types/node@20.14.11)(happy-dom@20.0.0)(sass@1.70.0)(terser@5.44.0)(tsx@4.16.2)(yaml@2.5.0) transitivePeerDependencies: - supports-color - '@vitest/coverage-v8@3.2.4(vitest@3.2.4(@types/node@20.14.11)(happy-dom@15.10.2)(sass@1.70.0)(terser@5.44.0)(tsx@4.16.2)(yaml@2.5.0))': + '@vitest/coverage-v8@3.2.4(vitest@3.2.4(@types/node@20.5.1)(happy-dom@20.0.0)(sass@1.70.0)(terser@5.44.0)(tsx@4.16.2)(yaml@2.5.0))': dependencies: '@ampproject/remapping': 2.3.0 '@bcoe/v8-coverage': 1.0.2 @@ -12769,26 +12771,7 @@ snapshots: std-env: 3.9.0 test-exclude: 7.0.1 tinyrainbow: 2.0.0 - vitest: 3.2.4(@types/node@20.14.11)(happy-dom@15.10.2)(sass@1.70.0)(terser@5.44.0)(tsx@4.16.2)(yaml@2.5.0) - transitivePeerDependencies: - - supports-color - - '@vitest/coverage-v8@3.2.4(vitest@3.2.4(@types/node@20.5.1)(happy-dom@15.10.2)(sass@1.70.0)(terser@5.43.1)(tsx@4.16.2)(yaml@2.5.0))': - dependencies: - '@ampproject/remapping': 2.3.0 - '@bcoe/v8-coverage': 1.0.2 - ast-v8-to-istanbul: 0.3.3 - debug: 4.4.1 - istanbul-lib-coverage: 3.2.2 - istanbul-lib-report: 3.0.1 - istanbul-lib-source-maps: 5.0.6 - istanbul-reports: 3.1.7 - magic-string: 0.30.17 - magicast: 0.3.5 - std-env: 3.9.0 - test-exclude: 7.0.1 - tinyrainbow: 2.0.0 - vitest: 3.2.4(@types/node@20.5.1)(happy-dom@15.10.2)(sass@1.70.0)(terser@5.43.1)(tsx@4.16.2)(yaml@2.5.0) + vitest: 3.2.4(@types/node@20.5.1)(happy-dom@20.0.0)(sass@1.70.0)(terser@5.44.0)(tsx@4.16.2)(yaml@2.5.0) transitivePeerDependencies: - supports-color @@ -12800,14 +12783,6 @@ snapshots: chai: 5.2.1 tinyrainbow: 2.0.0 - '@vitest/mocker@3.2.4(vite@6.3.4(@types/node@20.14.11)(sass@1.70.0)(terser@5.43.1)(tsx@4.16.2)(yaml@2.5.0))': - dependencies: - '@vitest/spy': 3.2.4 - estree-walker: 3.0.3 - magic-string: 0.30.17 - optionalDependencies: - vite: 6.3.4(@types/node@20.14.11)(sass@1.70.0)(terser@5.43.1)(tsx@4.16.2)(yaml@2.5.0) - '@vitest/mocker@3.2.4(vite@6.3.4(@types/node@20.14.11)(sass@1.70.0)(terser@5.44.0)(tsx@4.16.2)(yaml@2.5.0))': dependencies: '@vitest/spy': 3.2.4 @@ -12816,13 +12791,13 @@ snapshots: optionalDependencies: vite: 6.3.4(@types/node@20.14.11)(sass@1.70.0)(terser@5.44.0)(tsx@4.16.2)(yaml@2.5.0) - '@vitest/mocker@3.2.4(vite@6.3.4(@types/node@20.5.1)(sass@1.70.0)(terser@5.43.1)(tsx@4.16.2)(yaml@2.5.0))': + '@vitest/mocker@3.2.4(vite@6.3.4(@types/node@20.5.1)(sass@1.70.0)(terser@5.44.0)(tsx@4.16.2)(yaml@2.5.0))': dependencies: '@vitest/spy': 3.2.4 estree-walker: 3.0.3 magic-string: 0.30.17 optionalDependencies: - vite: 6.3.4(@types/node@20.5.1)(sass@1.70.0)(terser@5.43.1)(tsx@4.16.2)(yaml@2.5.0) + vite: 6.3.4(@types/node@20.5.1)(sass@1.70.0)(terser@5.44.0)(tsx@4.16.2)(yaml@2.5.0) '@vitest/pretty-format@3.2.4': dependencies: @@ -15380,12 +15355,11 @@ snapshots: hasown: 2.0.2 mime-types: 2.1.35 - formidable@2.1.2: + formidable@3.5.4: dependencies: + '@paralleldrive/cuid2': 2.2.2 dezalgo: 1.0.4 - hexoid: 1.0.0 once: 1.4.0 - qs: 6.13.0 forwarded@0.2.0: {} @@ -15722,7 +15696,7 @@ snapshots: extend: 3.0.2 gaxios: 6.7.0(encoding@0.1.13) google-auth-library: 9.12.0(encoding@0.1.13) - qs: 6.13.0 + qs: 6.14.0 url-template: 2.0.8 uuid: 9.0.1 transitivePeerDependencies: @@ -15756,10 +15730,10 @@ snapshots: hangul-js@0.2.6: {} - happy-dom@15.10.2: + happy-dom@20.0.0: dependencies: - entities: 4.5.0 - webidl-conversions: 7.0.0 + '@types/node': 20.14.11 + '@types/whatwg-mimetype': 3.0.2 whatwg-mimetype: 3.0.0 hard-rejection@2.1.0: {} @@ -15806,8 +15780,6 @@ snapshots: helmet@4.6.0: {} - hexoid@1.0.0: {} - highlight.js@10.7.3: {} hosted-git-info@2.8.9: {} @@ -17537,7 +17509,7 @@ snapshots: dependencies: '@babel/parser': 7.28.3 - nodemailer@6.9.14: {} + nodemailer@7.0.7: {} nodemon@3.1.4: dependencies: @@ -19281,19 +19253,17 @@ snapshots: summary@2.1.0: {} - superagent@7.1.6: + superagent@10.2.3: dependencies: component-emitter: 1.3.1 cookiejar: 2.1.4 debug: 4.4.1 fast-safe-stringify: 2.1.1 - form-data: 4.0.0 - formidable: 2.1.2 + form-data: 4.0.4 + formidable: 3.5.4 methods: 1.1.2 mime: 2.6.0 - qs: 6.13.0 - readable-stream: 3.6.2 - semver: 7.6.3 + qs: 6.14.0 transitivePeerDependencies: - supports-color @@ -19323,10 +19293,10 @@ snapshots: - encoding - supports-color - supertest@6.2.3: + supertest@7.1.4: dependencies: methods: 1.1.2 - superagent: 7.1.6 + superagent: 10.2.3 transitivePeerDependencies: - supports-color @@ -19460,14 +19430,6 @@ snapshots: commander: 2.20.3 source-map-support: 0.5.21 - terser@5.43.1: - dependencies: - '@jridgewell/source-map': 0.3.11 - acorn: 8.15.0 - commander: 2.20.3 - source-map-support: 0.5.21 - optional: true - terser@5.44.0: dependencies: '@jridgewell/source-map': 0.3.11 @@ -20031,27 +19993,6 @@ snapshots: dependencies: vite: 6.3.6(@types/node@20.14.11)(sass@1.70.0)(terser@5.44.0)(tsx@4.16.2)(yaml@2.5.0) - vite-node@3.2.4(@types/node@20.14.11)(sass@1.70.0)(terser@5.43.1)(tsx@4.16.2)(yaml@2.5.0): - dependencies: - cac: 6.7.14 - debug: 4.4.1 - es-module-lexer: 1.7.0 - pathe: 2.0.3 - vite: 6.3.6(@types/node@20.14.11)(sass@1.70.0)(terser@5.43.1)(tsx@4.16.2)(yaml@2.5.0) - transitivePeerDependencies: - - '@types/node' - - jiti - - less - - lightningcss - - sass - - sass-embedded - - stylus - - sugarss - - supports-color - - terser - - tsx - - yaml - vite-node@3.2.4(@types/node@20.14.11)(sass@1.70.0)(terser@5.44.0)(tsx@4.16.2)(yaml@2.5.0): dependencies: cac: 6.7.14 @@ -20073,13 +20014,13 @@ snapshots: - tsx - yaml - vite-node@3.2.4(@types/node@20.5.1)(sass@1.70.0)(terser@5.43.1)(tsx@4.16.2)(yaml@2.5.0): + vite-node@3.2.4(@types/node@20.5.1)(sass@1.70.0)(terser@5.44.0)(tsx@4.16.2)(yaml@2.5.0): dependencies: cac: 6.7.14 debug: 4.4.1 es-module-lexer: 1.7.0 pathe: 2.0.3 - vite: 6.3.6(@types/node@20.5.1)(sass@1.70.0)(terser@5.43.1)(tsx@4.16.2)(yaml@2.5.0) + vite: 6.3.6(@types/node@20.5.1)(sass@1.70.0)(terser@5.44.0)(tsx@4.16.2)(yaml@2.5.0) transitivePeerDependencies: - '@types/node' - jiti @@ -20160,22 +20101,6 @@ snapshots: transitivePeerDependencies: - supports-color - vite@6.3.4(@types/node@20.14.11)(sass@1.70.0)(terser@5.43.1)(tsx@4.16.2)(yaml@2.5.0): - dependencies: - esbuild: 0.25.0 - fdir: 6.4.4(picomatch@4.0.2) - picomatch: 4.0.2 - postcss: 8.5.3 - rollup: 4.40.0 - tinyglobby: 0.2.13 - optionalDependencies: - '@types/node': 20.14.11 - fsevents: 2.3.3 - sass: 1.70.0 - terser: 5.43.1 - tsx: 4.16.2 - yaml: 2.5.0 - vite@6.3.4(@types/node@20.14.11)(sass@1.70.0)(terser@5.44.0)(tsx@4.16.2)(yaml@2.5.0): dependencies: esbuild: 0.25.0 @@ -20192,7 +20117,7 @@ snapshots: tsx: 4.16.2 yaml: 2.5.0 - vite@6.3.4(@types/node@20.5.1)(sass@1.70.0)(terser@5.43.1)(tsx@4.16.2)(yaml@2.5.0): + vite@6.3.4(@types/node@20.5.1)(sass@1.70.0)(terser@5.44.0)(tsx@4.16.2)(yaml@2.5.0): dependencies: esbuild: 0.25.0 fdir: 6.4.4(picomatch@4.0.2) @@ -20204,23 +20129,7 @@ snapshots: '@types/node': 20.5.1 fsevents: 2.3.3 sass: 1.70.0 - terser: 5.43.1 - tsx: 4.16.2 - yaml: 2.5.0 - - vite@6.3.6(@types/node@20.14.11)(sass@1.70.0)(terser@5.43.1)(tsx@4.16.2)(yaml@2.5.0): - dependencies: - esbuild: 0.25.0 - fdir: 6.4.4(picomatch@4.0.3) - picomatch: 4.0.3 - postcss: 8.5.3 - rollup: 4.40.0 - tinyglobby: 0.2.14 - optionalDependencies: - '@types/node': 20.14.11 - fsevents: 2.3.3 - sass: 1.70.0 - terser: 5.43.1 + terser: 5.44.0 tsx: 4.16.2 yaml: 2.5.0 @@ -20240,7 +20149,7 @@ snapshots: tsx: 4.16.2 yaml: 2.5.0 - vite@6.3.6(@types/node@20.5.1)(sass@1.70.0)(terser@5.43.1)(tsx@4.16.2)(yaml@2.5.0): + vite@6.3.6(@types/node@20.5.1)(sass@1.70.0)(terser@5.44.0)(tsx@4.16.2)(yaml@2.5.0): dependencies: esbuild: 0.25.0 fdir: 6.4.4(picomatch@4.0.3) @@ -20252,53 +20161,11 @@ snapshots: '@types/node': 20.5.1 fsevents: 2.3.3 sass: 1.70.0 - terser: 5.43.1 + terser: 5.44.0 tsx: 4.16.2 yaml: 2.5.0 - vitest@3.2.4(@types/node@20.14.11)(happy-dom@15.10.2)(sass@1.70.0)(terser@5.43.1)(tsx@4.16.2)(yaml@2.5.0): - dependencies: - '@types/chai': 5.2.2 - '@vitest/expect': 3.2.4 - '@vitest/mocker': 3.2.4(vite@6.3.4(@types/node@20.14.11)(sass@1.70.0)(terser@5.43.1)(tsx@4.16.2)(yaml@2.5.0)) - '@vitest/pretty-format': 3.2.4 - '@vitest/runner': 3.2.4 - '@vitest/snapshot': 3.2.4 - '@vitest/spy': 3.2.4 - '@vitest/utils': 3.2.4 - chai: 5.2.1 - debug: 4.4.1 - expect-type: 1.2.2 - magic-string: 0.30.17 - pathe: 2.0.3 - picomatch: 4.0.3 - std-env: 3.9.0 - tinybench: 2.9.0 - tinyexec: 0.3.2 - tinyglobby: 0.2.14 - tinypool: 1.1.1 - tinyrainbow: 2.0.0 - vite: 6.3.4(@types/node@20.14.11)(sass@1.70.0)(terser@5.43.1)(tsx@4.16.2)(yaml@2.5.0) - vite-node: 3.2.4(@types/node@20.14.11)(sass@1.70.0)(terser@5.43.1)(tsx@4.16.2)(yaml@2.5.0) - why-is-node-running: 2.3.0 - optionalDependencies: - '@types/node': 20.14.11 - happy-dom: 15.10.2 - transitivePeerDependencies: - - jiti - - less - - lightningcss - - msw - - sass - - sass-embedded - - stylus - - sugarss - - supports-color - - terser - - tsx - - yaml - - vitest@3.2.4(@types/node@20.14.11)(happy-dom@15.10.2)(sass@1.70.0)(terser@5.44.0)(tsx@4.16.2)(yaml@2.5.0): + vitest@3.2.4(@types/node@20.14.11)(happy-dom@20.0.0)(sass@1.70.0)(terser@5.44.0)(tsx@4.16.2)(yaml@2.5.0): dependencies: '@types/chai': 5.2.2 '@vitest/expect': 3.2.4 @@ -20325,7 +20192,7 @@ snapshots: why-is-node-running: 2.3.0 optionalDependencies: '@types/node': 20.14.11 - happy-dom: 15.10.2 + happy-dom: 20.0.0 transitivePeerDependencies: - jiti - less @@ -20340,11 +20207,11 @@ snapshots: - tsx - yaml - vitest@3.2.4(@types/node@20.5.1)(happy-dom@15.10.2)(sass@1.70.0)(terser@5.43.1)(tsx@4.16.2)(yaml@2.5.0): + vitest@3.2.4(@types/node@20.5.1)(happy-dom@20.0.0)(sass@1.70.0)(terser@5.44.0)(tsx@4.16.2)(yaml@2.5.0): dependencies: '@types/chai': 5.2.2 '@vitest/expect': 3.2.4 - '@vitest/mocker': 3.2.4(vite@6.3.4(@types/node@20.5.1)(sass@1.70.0)(terser@5.43.1)(tsx@4.16.2)(yaml@2.5.0)) + '@vitest/mocker': 3.2.4(vite@6.3.4(@types/node@20.5.1)(sass@1.70.0)(terser@5.44.0)(tsx@4.16.2)(yaml@2.5.0)) '@vitest/pretty-format': 3.2.4 '@vitest/runner': 3.2.4 '@vitest/snapshot': 3.2.4 @@ -20362,12 +20229,12 @@ snapshots: tinyglobby: 0.2.14 tinypool: 1.1.1 tinyrainbow: 2.0.0 - vite: 6.3.4(@types/node@20.5.1)(sass@1.70.0)(terser@5.43.1)(tsx@4.16.2)(yaml@2.5.0) - vite-node: 3.2.4(@types/node@20.5.1)(sass@1.70.0)(terser@5.43.1)(tsx@4.16.2)(yaml@2.5.0) + vite: 6.3.4(@types/node@20.5.1)(sass@1.70.0)(terser@5.44.0)(tsx@4.16.2)(yaml@2.5.0) + vite-node: 3.2.4(@types/node@20.5.1)(sass@1.70.0)(terser@5.44.0)(tsx@4.16.2)(yaml@2.5.0) why-is-node-running: 2.3.0 optionalDependencies: '@types/node': 20.5.1 - happy-dom: 15.10.2 + happy-dom: 20.0.0 transitivePeerDependencies: - jiti - less