diff --git a/cjdic2.code-workspace b/cjdic2.code-workspace index 5a7ed06..f397e10 100644 --- a/cjdic2.code-workspace +++ b/cjdic2.code-workspace @@ -3,6 +3,9 @@ { "path": ".", }, + { + "path": "js-server", + }, { "path": "src-core", }, diff --git a/js-server/.gitignore b/js-server/.gitignore new file mode 100644 index 0000000..4c49bd7 --- /dev/null +++ b/js-server/.gitignore @@ -0,0 +1 @@ +.env diff --git a/js-server/.vscode/settings.json b/js-server/.vscode/settings.json new file mode 100644 index 0000000..fad3755 --- /dev/null +++ b/js-server/.vscode/settings.json @@ -0,0 +1,24 @@ +{ + "editor.tabSize": 2, + "[vue]": { + "editor.defaultFormatter": "esbenp.prettier-vscode", + "editor.formatOnSave": true + }, + "[typescript]": { + "editor.formatOnSave": true + }, + "[javascript]": { + "editor.formatOnSave": true + }, + "[jsonc]": { + "editor.formatOnSave": true + }, + "[rust]": { + "editor.tabSize": 4, + "editor.formatOnSave": true + }, + "cmake.ignoreCMakeListsMissing": true, + "code-runner.executorMap": { + "typescript": "tsx" + } +} diff --git a/js-server/package.json b/js-server/package.json new file mode 100644 index 0000000..9b06379 --- /dev/null +++ b/js-server/package.json @@ -0,0 +1,25 @@ +{ + "name": "js-server", + "version": "1.0.0", + "description": "", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "keywords": [], + "author": "", + "license": "ISC", + "packageManager": "pnpm@10.30.3", + "dependencies": { + "@types/adm-zip": "^0.5.7", + "adm-zip": "^0.5.16", + "dotenv": "^17.3.1", + "fastify": "^5.7.4", + "mongodb": "^7.1.0" + }, + "devDependencies": { + "@types/node": "^24.10.13", + "tsx": "^4.21.0", + "typescript": "~5.8.3" + } +} diff --git a/js-server/src/server.ts b/js-server/src/server.ts new file mode 100644 index 0000000..e69de29 diff --git a/js-server/src/yomitan/index.ts b/js-server/src/yomitan/index.ts new file mode 100644 index 0000000..85aa78d --- /dev/null +++ b/js-server/src/yomitan/index.ts @@ -0,0 +1,202 @@ +import "dotenv/config"; + +import AdmZip from "adm-zip"; +import { readdirSync } from "fs"; +import { MongoClient, ObjectId } from "mongodb"; +import { join as joinPath } from "path"; + +import { Kanji, KanjiEntry } from "./kanji"; +import { KanjiMeta, KanjiMetaEntry } from "./kanji-meta"; +import { Tag, TagEntry } from "./tag"; +import { Term, TermEntry } from "./term"; +import { TermMeta, TermMetaEntry } from "./term-meta"; + +if (require.main === module) { + const client = new MongoClient(process.env.MONGO_URI!); + + (async () => { + await client.connect(); + + const db = client.db("yomitan"); + + const colMeta = db.collection("meta"); + await colMeta.createIndex({ title: 1 }, { unique: true }); + + const colKanjiMeta = db.collection( + "kanji-meta", + ); + await colKanjiMeta.createIndex({ meta_id: 1 }); + + const colKanji = db.collection("kanji"); + await colKanji.createIndex({ meta_id: 1 }); + + const colTag = db.collection("tag"); + await colTag.createIndex({ meta_id: 1 }); + + const colTermMeta = db.collection( + "term-meta", + ); + await colTermMeta.createIndex({ meta_id: 1 }); + + const colTerm = db.collection("term"); + await colTerm.createIndex({ meta_id: 1 }); + + const zipPath = "../src-tauri/resources/yomitan/ja"; + + for (const f of readdirSync(zipPath)) { + if (!f.endsWith(".zip")) continue; + + const zipFile = new AdmZip(joinPath(zipPath, f)); + const idx = zipFile.getEntry("index.json"); + if (!idx) continue; + + const meta: DictionaryIndex = JSON.parse(idx.getData().toString("utf-8")); + const title = meta.title.replace(/\[.+?\]$/, "").trimEnd(); + if (title !== meta.title) { + console.log(meta.title); + meta.title = title; + } + console.log(meta.title); + + const it = await colMeta.insertOne(meta).catch((e) => { + console.error(e); + return null; + }); + if (!it) continue; + const meta_id = it.insertedId; + + for (const et of zipFile.getEntries()) { + const f = et.entryName; + + if (f.startsWith("kanji_meta_bank")) { + // yet empty + await colKanjiMeta.insertMany( + JSON.parse(et.getData().toString("utf-8")).map((t: any) => ({ + meta_id, + ...KanjiMetaEntry.fromBank(t).json, + })), + ); + } else if (f.startsWith("kanji_bank")) { + // yet empty + await colKanji.insertMany( + JSON.parse(et.getData().toString("utf-8")).map((t: any) => ({ + meta_id, + ...KanjiEntry.fromBank(t).json, + })), + ); + } else if (f.startsWith("tag_bank")) { + // 5 so far + await colTag.insertMany( + JSON.parse(et.getData().toString("utf-8")).map((t: any) => ({ + meta_id, + ...TagEntry.fromBank(t).json, + })), + ); + } else if (f.startsWith("term_bank")) { + // lots + await colTerm.insertMany( + JSON.parse(et.getData().toString("utf-8")).map((t: any) => ({ + meta_id, + ...TermEntry.fromBank(t).json, + })), + ); + } else if (f.startsWith("term_meta_bank")) { + // yet empty + await colTermMeta.insertMany( + JSON.parse(et.getData().toString("utf-8")).map((t: any) => ({ + meta_id, + ...TermMetaEntry.fromBank(t).json, + })), + ); + } + } + } + })().finally(async () => { + await client.close(); + }); +} + +/** + * The schema for the index.json file that contains metadata about the dictionary. + * PLEASE ALWAYS PUT AS MUCH DETAIL IN THIS AS POSSIBLE. + * + * Note that this information can be displayed in Yomichan by going to the dictionaries overview page + * and clicking the three dots, then Details.... + * + * "isoLanguageCode": { + * "type": "string", + * "description": "ISO language code (ISO 639-1 where possible, ISO 639-3 otherwise).", + * "pattern": "^[a-z]{2,3}$" + * } + * "required": [ + * "title", + * "revision" + * ], + * "anyOf": [ + * { + * "required": ["format"] + * }, + * { + * "required": ["version"] + * } + * ], + * "dependencies": { + * "isUpdatable": ["indexUrl", "downloadUrl"] + * } + * + * @see https://github.com/yomidevs/yomitan/blob/master/ext/data/schemas/dictionary-index-schema.json + */ +interface DictionaryIndex { + title: string; + // "description": "Title of the dictionary." + revision: string; + // "description": "Revision of the dictionary. This value is displayed, and used to check for dictionary updates." + minimumYomitanVersion?: string; + // "description": "Minimum version of Yomitan that is compatible with this dictionary." + sequenced?: boolean; + // "default": false, + // "description": "Whether or not this dictionary contains sequencing information for related terms." + format?: 1 | 2 | 3; + // "type": "integer", + // "description": "Format of data found in the JSON data files.", + // "enum": [1, 2, 3] + version?: 1 | 2 | 3; + // "type": "integer", + // "description": "Alias for format.", + // "enum": [1, 2, 3] + author?: string; + // "description": "Creator of the dictionary." + isUpdatable?: boolean; + // "const": true, + // "description": "Whether this dictionary contains links to its latest version." + indexUrl?: string; + // "description": "URL for the index file of the latest revision of the dictionary, used to check for updates." + downloadUrl?: string; + // "description": "URL for the download of the latest revision of the dictionary." + url?: string; + // "description": "URL for the source of the dictionary, displayed in the dictionary details." + description?: string; + // "description": "Description of the dictionary data." + attribution?: string; + // "description": "Attribution information for the dictionary data." + sourceLanguage?: string; + // "$ref": "#/definitions/isoLanguageCode", + // "description": "Language of the terms in the dictionary." + targetLanguage?: string; + // "$ref": "#/definitions/isoLanguageCode", + // "description": "Main language of the definitions in the dictionary." + frequencyMode?: "occurrence-based" | "rank-based"; + tagMeta?: { + // "description": "Tag information for terms and kanji. This object is obsolete and individual tag files should be used instead.", + + // "description": "Information about a single tag. The object key is the name of the tag.", + category?: string; + // "description": "Category for the tag." + order?: number; + // "description": "Sorting order for the tag." + notes?: string; + // "description": "Notes for the tag." + score?: number; + // "description": "Score used to determine popularity. Negative values are more rare and positive values are more frequent. This score is also used to sort search results." + }; +} diff --git a/js-server/src/yomitan/kanji-meta.ts b/js-server/src/yomitan/kanji-meta.ts new file mode 100644 index 0000000..e0462ee --- /dev/null +++ b/js-server/src/yomitan/kanji-meta.ts @@ -0,0 +1,62 @@ +export interface KanjiMeta { + character: string; + type: string; + freqNumber?: number; + freqString?: string; +} + +export class KanjiMetaEntry { + static fromBank([character, type, freq]: DictionaryKanjiMeta) { + let freqNumber = 0; + let freqString = ""; + + if (freq) { + if (typeof freq === "string") { + freqString = freq; + } else if (typeof freq === "number") { + freqNumber = freq; + } else { + freqString = freq.displayValue || ""; + freqNumber = freq.value; + } + } + + return new KanjiMetaEntry({ + character, + type, + freqNumber: freqNumber || undefined, + freqString: freqString || undefined, + }); + } + + constructor(public json: KanjiMeta) {} +} + +/** + * kanji_meta_bank_${number}.json + * + * The meta bank for kanji information. Right now, this is only used to store kanji frequency data. + * + * @see https://github.com/themoeway/yomitan/tree/master/ext/data/schemas/dictionary-kanji-meta-bank-v3-schema.json + */ +type DictionaryKanjiMetaBankV3 = DictionaryKanjiMeta[]; + +type DictionaryKanjiMeta = [ + // "description": "Metadata about a single kanji character.", + // "minItems": 3, + // "maxItems": 3, + + string, + // "minLength": 1 + string, + // "const": "freq", + // "description": "Type of data. \"freq\" corresponds to frequency information." + Frequency, +]; + +export type Frequency = string | number | FrequencyObject; + +interface FrequencyObject { + value: number; + displayValue?: string; +} diff --git a/js-server/src/yomitan/kanji.ts b/js-server/src/yomitan/kanji.ts new file mode 100644 index 0000000..69fbe35 --- /dev/null +++ b/js-server/src/yomitan/kanji.ts @@ -0,0 +1,63 @@ +export interface Kanji { + character: string; + onyomi?: string[]; + kunyomi?: string[]; + tags?: string[]; + meanings?: string[]; + stats?: Record; +} + +export class KanjiEntry { + static fromBank([ + character, + onyomi, + kunyomi, + tags, + meanings, + stats, + ]: DictionaryKanji) { + return new KanjiEntry({ + character, + onyomi: onyomi ? onyomi.split(" ") : undefined, + kunyomi: kunyomi ? kunyomi.split(" ") : undefined, + tags: tags ? tags.split(" ") : undefined, + meanings: meanings.length ? meanings : undefined, + stats, + }); + } + + constructor(public json: Kanji) {} +} + +/** + * kanji_bank_${number}.json + * + * Contains information used in the kanji viewer - meaning, readings, statistics, and codepoints. + * Unfortunately a lot of the structuring is hardcoded and can't be customized nearly as much as with term definitions. + * + * @see https://github.com/yomidevs/yomitan/blob/master/ext/data/schemas/dictionary-kanji-bank-v3-schema.json + */ +type DictionaryKanjiBankV3 = DictionaryKanji[]; + +type DictionaryKanji = [ + // "description": "Information about a single kanji character.", + // "minItems": 6, + // "maxItems": 6, + + string, + // "description": "Kanji character.", + // "minLength": 1 + string, + // "description": "String of space-separated onyomi readings for the kanji character. An empty string is treated as no readings." + string, + // "description": "String of space-separated kunyomi readings for the kanji character. An empty string is treated as no readings." + string, + // "description": "String of space-separated tags for the kanji character. An empty string is treated as no tags." + string[], + // "description": "Array of meanings for the kanji character.", + + { + // "description": "Various stats for the kanji character.", + [k: string]: string; + }, +]; diff --git a/js-server/src/yomitan/tag.ts b/js-server/src/yomitan/tag.ts new file mode 100644 index 0000000..0402c16 --- /dev/null +++ b/js-server/src/yomitan/tag.ts @@ -0,0 +1,52 @@ +export interface Tag { + tag: string; + category: string; + sorting: number; + notes: string; + popularity: number; +} + +export class TagEntry { + static fromBank([tag, category, sorting, notes, popularity]: DictionaryTag) { + return new TagEntry({ + tag, + category, + sorting, + notes, + popularity, + }); + } + + constructor(public json: Tag) {} +} + +/** + * tag_bank_${number}.json + * + * The tag bank for term information. + * + * This is where you'll define tags for kanji and term dictionaries, like for example specifying parts of speech or kanken level. + * These are generally displayed in Yomichan as grey tags next to the dictionary name. + * + * @see https://github.com/yomidevs/yomitan/blob/master/ext/data/schemas/dictionary-tag-bank-v3-schema.json + */ +type DictionaryTagBankV3 = DictionaryTag[]; + +type DictionaryTag = [ + // "description": "Information about a single tag.", + // "minItems": 5, + // "maxItems": 5, + + string, + // "description": "Tag name." + string, + // "description": "Category for the tag." + number, + // "description": "Sorting order for the tag." + string, + // "description": "Notes for the tag." + number, + // "description": "Score used to determine popularity. + // Negative values are more rare and positive values are more frequent. + // This score is also used to sort search results." +]; diff --git a/js-server/src/yomitan/term-meta.ts b/js-server/src/yomitan/term-meta.ts new file mode 100644 index 0000000..8ea06ce --- /dev/null +++ b/js-server/src/yomitan/term-meta.ts @@ -0,0 +1,154 @@ +import { Frequency } from "./kanji-meta"; + +export interface TermFreq { + text: string; + type: "freq"; + data: { + reading?: string; + freqNumber?: number; + freqString?: string; + }; +} + +export interface TermPitch { + text: string; + type: "pitch"; + data: { + pitches: PitchEntry[]; + }; +} + +export interface TermIPA { + text: string; + type: "ipa"; + data: { + reading: string; + transcriptions: IPATranscription[]; + }; +} + +export type TermMeta = TermFreq | TermPitch | TermIPA; + +export class TermMetaEntry { + static fromBank([text, type, data]: DictionaryTermMeta) { + switch (type) { + case "freq": + const freq = data; + + let reading = ""; + let freqNumber = 0; + let freqString = ""; + + if (freq) { + if (typeof freq === "string") { + freqString = freq; + } else if (typeof freq === "number") { + freqNumber = freq; + } else if ("reading" in freq) { + reading = freq.reading; + + const f = freq.frequency; + if (typeof f === "string") { + freqString = f; + } else if (typeof f === "number") { + freqNumber = f; + } else { + freqString = f.displayValue || ""; + freqNumber = f.value; + } + } else { + freqString = freq.displayValue || ""; + freqNumber = freq.value; + } + } + + return new TermMetaEntry({ + text, + type, + data: { + reading: reading || undefined, + freqNumber: freqNumber || undefined, + freqString: freqString || undefined, + }, + }); + + case "pitch": + return new TermMetaEntry({ text, type, data }); + + case "ipa": + return new TermMetaEntry({ text, type, data }); + } + + return new TermMetaEntry({ + text, + type, + data: data as any, + }); + } + + constructor(public json: TermMeta) {} +} + +type DictionaryTermMetaBankV3 = DictionaryTermMeta[]; + +type DictionaryTermMeta = + | DictionaryTermMeta_freq + | DictionaryTermMeta_pitch + | DictionaryTermMeta_ipa; + +type DictionaryTermMeta_freq = [string, "freq", Frequency | ReadingFrequency]; +type DictionaryTermMeta_pitch = [string, "pitch", Pitch]; +type DictionaryTermMeta_ipa = [string, "ipa", IPA]; + +interface ReadingFrequency { + reading: string; + // "description": "Reading for the term." + frequency: Frequency; +} + +interface Pitch { + reading: string; + pitches: PitchEntry[]; +} + +interface PitchEntry { + position: PitchPosition_integer | PitchPosition_string; + nasal?: PitchNasal | PitchNasal[]; + devoice?: PitchDevoice | PitchDevoice[]; + tags?: string[]; + // "description": "Tag for this pitch accent. This typically corresponds to a certain type of part of speech." +} + +type PitchPosition_integer = number; +// "type": "integer", +// "description": "Mora position of the pitch accent downstep. A value of 0 indicates that the word does not have a downstep (heiban).", +// "minimum": 0 + +type PitchPosition_string = string; +// "type": "string", +// "description": "Pitch level of each mora with H representing high and L representing low. For example: HHLL for a 4 mora word. Add an additional pitch level at the end to explicitly define the suffix.", +// "pattern": "^[HL]+$" + +type PitchNasal = number; +// "type": "integer", +// "description": "Position of a mora with nasal sound.", +// "minimum": 0 + +type PitchDevoice = number; +// "type": "integer", +// "description": "Position of a mora with devoiced sound.", +// "minimum": 0 + +interface IPA { + // "description": "IPA transcription information for the term.", + reading: string; + // "description": "Reading for the term." + transcriptions: IPATranscription[]; +} + +interface IPATranscription { + ipa?: string; + // "description": "IPA transcription for the term." + tags: string[]; + // "description": "Tag for this IPA transcription." +} diff --git a/js-server/src/yomitan/term.ts b/js-server/src/yomitan/term.ts new file mode 100644 index 0000000..9c73127 --- /dev/null +++ b/js-server/src/yomitan/term.ts @@ -0,0 +1,334 @@ +export interface Term { + text: string; + reading?: string; + defTags?: string[]; + rules?: string[]; + popularity?: number; + definition: DictionaryDefinition; + sequence?: number; + tags?: string[]; +} + +export class TermEntry { + static fromBank([ + text, + reading, + defTags, + rules, + popularity, + definition, + sequence, + tags, + ]: DictionaryTerm) { + return new TermEntry({ + text, + reading, + defTags: defTags ? defTags.split(" ") : undefined, + rules: rules ? rules.split(" ") : undefined, + popularity, + definition, + sequence, + tags: tags ? tags.split(" ") : undefined, + }); + } + + constructor(public json: Term) {} +} + +/** + * term_bank_${number}.json + * + * The term bank for term information. This is where dictionary readings, definitions, and such are stored. + * + * @see https://github.com/themoeway/yomitan/tree/master/ext/data/schemas/dictionary-term-bank-v3-schema.json + */ +type DictionaryTermBankV3 = DictionaryTerm[]; + +type DictionaryTerm = [ + // "description": "Information about a single term.", + // "minItems": 8, + // "maxItems": 8, + + string, + // "description": "The text for the term." + // "description": "Reading of the term, or an empty string if the reading is the same as the term." + string, + string | null, + // "description": "String of space-separated tags for the definition. An empty string is treated as no tags." + string, + // "description": "String of space-separated rule identifiers for the definition which is used to validate deinflection. + // An empty string should be used for words which aren't inflected." + number, + // "description": "Score used to determine popularity. + // Negative values are more rare and positive values are more frequent. + // This score is also used to sort search results." + DictionaryDefinition, + number, + // "type": "integer", + // "description": "Sequence number for the term. + // Terms with the same sequence number can be shown together when the \"resultOutputMode\" option is set to \"merge\"." + string, + // "description": "String of space-separated tags for the term. An empty string is treated as no tags." +]; + +type DictionaryDefinition = + | string + | DictionaryDefinitionObject + | DictionaryDefinitionInflected; + +type DictionaryDefinitionObject = + | DictionaryDefinition_text + | DictionaryDefinition_structured + | DictionaryDefinition_img; + +type DictionaryDefinitionInflected = [ + // "description": "Deinflection of the term to an uninflected term.", + // "minItems": 2, + // "maxItems": 2, + + string, + // "description": "The uninflected term." + string[], + // "description": "A chain of inflection rules that produced the inflected term", + // "description": "A single inflection rule." +]; + +interface DictionaryDefinition_text { + type: "text"; + text: string; + // "description": "Single definition for the term." +} + +interface DictionaryDefinition_structured { + type: "structured-content"; + content: StructuredContent; +} + +interface DictionaryDefinition_img { + type: "image"; + path: string; + width?: number; + // "type": "integer", + // "description": "Preferred width of the image.", + // "minimum": 1 + height?: number; + // "type": "integer", + // "description": "Preferred height of the image.", + // "minimum": 1 + title?: string; + // "description": "Hover text for the image." + alt?: string; + // "description": "Alt text for the image." + description?: string; + // "description": "Description of the image." + pixelated?: boolean; + // "description": "Whether or not the image should appear pixelated at sizes larger than the image's native resolution.", + // "default": false + imageRendering?: "auto" | "pixelated" | "crisp-edges"; + // "description": "Controls how the image is rendered. The value of this field supersedes the pixelated field.", + // "default": "auto" + appearance?: "auto" | "monochrome"; + // "description": "Controls the appearance of the image. + // The \"monochrome\" value will mask the opaque parts of the image using the current text color.", + // "default": "auto" + background?: boolean; + // "description": "Whether or not a background color is displayed behind the image.", + // "default": true + collapsed?: boolean; + // "description": "Whether or not the image is collapsed by default.", + // "default": false + collapsible?: boolean; + // "description": "Whether or not the image can be collapsed.", + // "default": true +} + +type StructuredContent = + | string + | StructuredContent[] + | StructuredContent_br + | StructuredContent_container + | StructuredContent_table + | StructuredContent_styled_container + | StructuredContent_img + | StructuredContent_link; + +interface StructuredContent_br { + tag: "br"; + data?: StructuredContentData; +} + +interface StructuredContent_container { + tag: "ruby" | "rt" | "rp" | "table" | "thead" | "tbody" | "tfoot" | "tr"; + content?: StructuredContent; + data?: StructuredContentData; + lang?: string; +} + +interface StructuredContent_table { + tag: "td" | "th"; + content?: StructuredContent; + data?: StructuredContentData; + colSpan?: number; + // "type": "integer", + // "minimum": 1 + rowSpan?: number; + // "type": "integer", + // "minimum": 1 + lang?: string; +} + +interface StructuredContent_styled_container { + tag: "span" | "div" | "ol" | "ul" | "li" | "details" | "summary"; + content?: StructuredContent; + data?: StructuredContentData; + style: StructuredContentStyle; + title?: string; + // "description": "Hover text for the element." + open?: boolean; + // "description": "Whether or not the details element is open by default." + lang?: string; +} + +interface StructuredContent_img { + tag: "img"; + data?: StructuredContentData; + path: string; + // "description": "Path to the image file in the archive." + width?: number; + // "description": "Preferred width of the image.", + // "minimum": 0 + height?: number; + // "description": "Preferred height of the image.", + // "minimum": 0 + title?: string; + // "description": "Hover text for the image." + alt?: string; + // "description": "Alt text for the image." + description?: string; + // "description": "Description of the image." + pixelated?: boolean; + // "description": "Whether or not the image should appear pixelated at sizes larger than the image's native resolution.", + // "default": false + imageRendering?: "auto" | "pixelated" | "crisp-edges"; + // "description": "Controls how the image is rendered. The value of this field supersedes the pixelated field.", + // "default": "auto" + appearance?: "auto" | "monochrome"; + // "description": "Controls the appearance of the image. The \"monochrome\" value will mask the opaque parts of the image using the current text color.", + // "default": "auto" + background?: boolean; + // "description": "Whether or not a background color is displayed behind the image.", + // "default": true + collapsed?: boolean; + // "description": "Whether or not the image is collapsed by default.", + // "default": false + collapsible?: boolean; + // "description": "Whether or not the image can be collapsed.", + // "default": false + verticalAlign: + | "baseline" + | "sub" + | "super" + | "text-top" + | "text-bottom" + | "middle" + | "top" + | "bottom"; + // "description": "The vertical alignment of the image.", + border?: string; + // "description": "Shorthand for border width, style, and color." + borderRadius?: string; + // "description": "Roundness of the corners of the image's outer border edge." + sizeUnits: "px" | "em"; + // "description": "The units for the width and height.", +} + +interface StructuredContent_link { + tag: "a"; + content?: StructuredContent; + href: string; + // "description": "The URL for the link. URLs starting with a ? are treated as internal links to other dictionary content.", + // "pattern": "^(?:https?:|\\?)[\\w\\W]*" + lang?: string; +} + +interface StructuredContentData { + // "description": "Generic data attributes that should be added to the element.", + [key: string]: string; +} + +interface StructuredContentStyle { + fontStyle?: "normal" | "italic"; + // "default": "normal" + fontWeight?: "normal" | "bold"; + // "default": "normal" + fontSize?: string; + // "default": "medium" + color?: string; + background?: string; + backgroundColor?: string; + textDecorationLine?: + | "none" + | "underline" + | "overline" + | "line-through" + | StructuredContentStyle_textDecorationLine[]; + // "default": "none" + textDecorationStyle?: "solid" | "double" | "dotted" | "dashed" | "wavy"; + // "default": "solid" + textDecorationColor?: string; + borderColor?: string; + borderStyle?: string; + borderRadius?: string; + borderWidth?: string; + clipPath?: string; + verticalAlign?: + | "baseline" + | "sub" + | "super" + | "text-top" + | "text-bottom" + | "middle" + | "top" + | "bottom"; + // "default": "baseline" + textAlign?: + | "start" + | "end" + | "left" + | "right" + | "center" + | "justify" + | "justify-all" + | "match-parent"; + // "default": "start" + textEmphasis?: string; + textShadow?: string; + margin?: string; + marginTop?: number | string; + // "default": 0 + marginLeft?: number | string; + // "default": 0 + marginRight?: number | string; + // "default": 0 + marginBottom?: number | string; + // "default": 0 + padding?: string; + paddingTop?: string; + paddingLeft?: string; + paddingRight?: string; + paddingBottom?: string; + wordBreak?: "normal" | "break-all" | "keep-all"; + // "default": "normal" + whiteSpace?: string; + // "default": "normal" + cursor?: string; + // "default": "auto" + listStyleType?: string; + // "default": "disc" +} + +type StructuredContentStyle_textDecorationLine = + | "underline" + | "overline" + | "line-through"; +// "default": "none" diff --git a/js-server/tsconfig.json b/js-server/tsconfig.json new file mode 100644 index 0000000..904d43f --- /dev/null +++ b/js-server/tsconfig.json @@ -0,0 +1,113 @@ +{ + "compilerOptions": { + /* Visit https://aka.ms/tsconfig to read more about this file */ + + /* Projects */ + // "incremental": true, /* Save .tsbuildinfo files to allow for incremental compilation of projects. */ + // "composite": true, /* Enable constraints that allow a TypeScript project to be used with project references. */ + // "tsBuildInfoFile": "./.tsbuildinfo", /* Specify the path to .tsbuildinfo incremental compilation file. */ + // "disableSourceOfProjectReferenceRedirect": true, /* Disable preferring source files instead of declaration files when referencing composite projects. */ + // "disableSolutionSearching": true, /* Opt a project out of multi-project reference checking when editing. */ + // "disableReferencedProjectLoad": true, /* Reduce the number of projects loaded automatically by TypeScript. */ + + /* Language and Environment */ + "target": "es2016", /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */ + // "lib": [], /* Specify a set of bundled library declaration files that describe the target runtime environment. */ + // "jsx": "preserve", /* Specify what JSX code is generated. */ + // "libReplacement": true, /* Enable lib replacement. */ + // "experimentalDecorators": true, /* Enable experimental support for legacy experimental decorators. */ + // "emitDecoratorMetadata": true, /* Emit design-type metadata for decorated declarations in source files. */ + // "jsxFactory": "", /* Specify the JSX factory function used when targeting React JSX emit, e.g. 'React.createElement' or 'h'. */ + // "jsxFragmentFactory": "", /* Specify the JSX Fragment reference used for fragments when targeting React JSX emit e.g. 'React.Fragment' or 'Fragment'. */ + // "jsxImportSource": "", /* Specify module specifier used to import the JSX factory functions when using 'jsx: react-jsx*'. */ + // "reactNamespace": "", /* Specify the object invoked for 'createElement'. This only applies when targeting 'react' JSX emit. */ + // "noLib": true, /* Disable including any library files, including the default lib.d.ts. */ + // "useDefineForClassFields": true, /* Emit ECMAScript-standard-compliant class fields. */ + // "moduleDetection": "auto", /* Control what method is used to detect module-format JS files. */ + + /* Modules */ + "module": "commonjs", /* Specify what module code is generated. */ + // "rootDir": "./", /* Specify the root folder within your source files. */ + // "moduleResolution": "node10", /* Specify how TypeScript looks up a file from a given module specifier. */ + // "baseUrl": "./", /* Specify the base directory to resolve non-relative module names. */ + // "paths": {}, /* Specify a set of entries that re-map imports to additional lookup locations. */ + // "rootDirs": [], /* Allow multiple folders to be treated as one when resolving modules. */ + // "typeRoots": [], /* Specify multiple folders that act like './node_modules/@types'. */ + // "types": [], /* Specify type package names to be included without being referenced in a source file. */ + // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */ + // "moduleSuffixes": [], /* List of file name suffixes to search when resolving a module. */ + // "allowImportingTsExtensions": true, /* Allow imports to include TypeScript file extensions. Requires '--moduleResolution bundler' and either '--noEmit' or '--emitDeclarationOnly' to be set. */ + // "rewriteRelativeImportExtensions": true, /* Rewrite '.ts', '.tsx', '.mts', and '.cts' file extensions in relative import paths to their JavaScript equivalent in output files. */ + // "resolvePackageJsonExports": true, /* Use the package.json 'exports' field when resolving package imports. */ + // "resolvePackageJsonImports": true, /* Use the package.json 'imports' field when resolving imports. */ + // "customConditions": [], /* Conditions to set in addition to the resolver-specific defaults when resolving imports. */ + // "noUncheckedSideEffectImports": true, /* Check side effect imports. */ + // "resolveJsonModule": true, /* Enable importing .json files. */ + // "allowArbitraryExtensions": true, /* Enable importing files with any extension, provided a declaration file is present. */ + // "noResolve": true, /* Disallow 'import's, 'require's or ''s from expanding the number of files TypeScript should add to a project. */ + + /* JavaScript Support */ + // "allowJs": true, /* Allow JavaScript files to be a part of your program. Use the 'checkJS' option to get errors from these files. */ + // "checkJs": true, /* Enable error reporting in type-checked JavaScript files. */ + // "maxNodeModuleJsDepth": 1, /* Specify the maximum folder depth used for checking JavaScript files from 'node_modules'. Only applicable with 'allowJs'. */ + + /* Emit */ + // "declaration": true, /* Generate .d.ts files from TypeScript and JavaScript files in your project. */ + // "declarationMap": true, /* Create sourcemaps for d.ts files. */ + // "emitDeclarationOnly": true, /* Only output d.ts files and not JavaScript files. */ + // "sourceMap": true, /* Create source map files for emitted JavaScript files. */ + // "inlineSourceMap": true, /* Include sourcemap files inside the emitted JavaScript. */ + // "noEmit": true, /* Disable emitting files from a compilation. */ + // "outFile": "./", /* Specify a file that bundles all outputs into one JavaScript file. If 'declaration' is true, also designates a file that bundles all .d.ts output. */ + // "outDir": "./", /* Specify an output folder for all emitted files. */ + // "removeComments": true, /* Disable emitting comments. */ + // "importHelpers": true, /* Allow importing helper functions from tslib once per project, instead of including them per-file. */ + // "downlevelIteration": true, /* Emit more compliant, but verbose and less performant JavaScript for iteration. */ + // "sourceRoot": "", /* Specify the root path for debuggers to find the reference source code. */ + // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ + // "inlineSources": true, /* Include source code in the sourcemaps inside the emitted JavaScript. */ + // "emitBOM": true, /* Emit a UTF-8 Byte Order Mark (BOM) in the beginning of output files. */ + // "newLine": "crlf", /* Set the newline character for emitting files. */ + // "stripInternal": true, /* Disable emitting declarations that have '@internal' in their JSDoc comments. */ + // "noEmitHelpers": true, /* Disable generating custom helper functions like '__extends' in compiled output. */ + // "noEmitOnError": true, /* Disable emitting files if any type checking errors are reported. */ + // "preserveConstEnums": true, /* Disable erasing 'const enum' declarations in generated code. */ + // "declarationDir": "./", /* Specify the output directory for generated declaration files. */ + + /* Interop Constraints */ + // "isolatedModules": true, /* Ensure that each file can be safely transpiled without relying on other imports. */ + // "verbatimModuleSyntax": true, /* Do not transform or elide any imports or exports not marked as type-only, ensuring they are written in the output file's format based on the 'module' setting. */ + // "isolatedDeclarations": true, /* Require sufficient annotation on exports so other tools can trivially generate declaration files. */ + // "erasableSyntaxOnly": true, /* Do not allow runtime constructs that are not part of ECMAScript. */ + // "allowSyntheticDefaultImports": true, /* Allow 'import x from y' when a module doesn't have a default export. */ + "esModuleInterop": true, /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables 'allowSyntheticDefaultImports' for type compatibility. */ + // "preserveSymlinks": true, /* Disable resolving symlinks to their realpath. This correlates to the same flag in node. */ + "forceConsistentCasingInFileNames": true, /* Ensure that casing is correct in imports. */ + + /* Type Checking */ + "strict": true, /* Enable all strict type-checking options. */ + // "noImplicitAny": true, /* Enable error reporting for expressions and declarations with an implied 'any' type. */ + // "strictNullChecks": true, /* When type checking, take into account 'null' and 'undefined'. */ + // "strictFunctionTypes": true, /* When assigning functions, check to ensure parameters and the return values are subtype-compatible. */ + // "strictBindCallApply": true, /* Check that the arguments for 'bind', 'call', and 'apply' methods match the original function. */ + // "strictPropertyInitialization": true, /* Check for class properties that are declared but not set in the constructor. */ + // "strictBuiltinIteratorReturn": true, /* Built-in iterators are instantiated with a 'TReturn' type of 'undefined' instead of 'any'. */ + // "noImplicitThis": true, /* Enable error reporting when 'this' is given the type 'any'. */ + // "useUnknownInCatchVariables": true, /* Default catch clause variables as 'unknown' instead of 'any'. */ + // "alwaysStrict": true, /* Ensure 'use strict' is always emitted. */ + // "noUnusedLocals": true, /* Enable error reporting when local variables aren't read. */ + // "noUnusedParameters": true, /* Raise an error when a function parameter isn't read. */ + // "exactOptionalPropertyTypes": true, /* Interpret optional property types as written, rather than adding 'undefined'. */ + // "noImplicitReturns": true, /* Enable error reporting for codepaths that do not explicitly return in a function. */ + // "noFallthroughCasesInSwitch": true, /* Enable error reporting for fallthrough cases in switch statements. */ + // "noUncheckedIndexedAccess": true, /* Add 'undefined' to a type when accessed using an index. */ + // "noImplicitOverride": true, /* Ensure overriding members in derived classes are marked with an override modifier. */ + // "noPropertyAccessFromIndexSignature": true, /* Enforces using indexed accessors for keys declared using an indexed type. */ + // "allowUnusedLabels": true, /* Disable error reporting for unused labels. */ + // "allowUnreachableCode": true, /* Disable error reporting for unreachable code. */ + + /* Completeness */ + // "skipDefaultLibCheck": true, /* Skip type checking .d.ts files that are included with TypeScript. */ + "skipLibCheck": true /* Skip type checking all .d.ts files. */ + } +} diff --git a/js-server/types/declaration.d.ts b/js-server/types/declaration.d.ts new file mode 100644 index 0000000..e69de29 diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ce8bf90..9d70bd0 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -12,6 +12,34 @@ importers: specifier: ^2 version: 2.10.0 + js-server: + dependencies: + '@types/adm-zip': + specifier: ^0.5.7 + version: 0.5.7 + adm-zip: + specifier: ^0.5.16 + version: 0.5.16 + dotenv: + specifier: ^17.3.1 + version: 17.3.1 + fastify: + specifier: ^5.7.4 + version: 5.7.4 + mongodb: + specifier: ^7.1.0 + version: 7.1.0 + devDependencies: + '@types/node': + specifier: ^24.10.13 + version: 24.10.13 + tsx: + specifier: ^4.21.0 + version: 4.21.0 + typescript: + specifier: ~5.8.3 + version: 5.8.3 + src-react: dependencies: '@chakra-ui/react': @@ -59,13 +87,13 @@ importers: version: 19.2.3(@types/react@19.2.14) '@vitejs/plugin-react': specifier: ^4.6.0 - version: 4.7.0(vite@7.3.1(@types/node@24.10.13)) + version: 4.7.0(vite@7.3.1(@types/node@24.10.13)(tsx@4.21.0)) typescript: specifier: ~5.8.3 version: 5.8.3 vite: specifier: ^7.0.4 - version: 7.3.1(@types/node@24.10.13) + version: 7.3.1(@types/node@24.10.13)(tsx@4.21.0) packages: @@ -369,6 +397,24 @@ packages: cpu: [x64] os: [win32] + '@fastify/ajv-compiler@4.0.5': + resolution: {integrity: sha512-KoWKW+MhvfTRWL4qrhUwAAZoaChluo0m0vbiJlGMt2GXvL4LVPQEjt8kSpHI3IBq5Rez8fg+XeH3cneztq+C7A==} + + '@fastify/error@4.2.0': + resolution: {integrity: sha512-RSo3sVDXfHskiBZKBPRgnQTtIqpi/7zhJOEmAxCiBcM7d0uwdGdxLlsCaLzGs8v8NnxIRlfG0N51p5yFaOentQ==} + + '@fastify/fast-json-stringify-compiler@5.0.3': + resolution: {integrity: sha512-uik7yYHkLr6fxd8hJSZ8c+xF4WafPK+XzneQDPU+D10r5X19GW8lJcom2YijX2+qtFF1ENJlHXKFM9ouXNJYgQ==} + + '@fastify/forwarded@3.0.1': + resolution: {integrity: sha512-JqDochHFqXs3C3Ml3gOY58zM7OqO9ENqPo0UqAjAjH8L01fRZqwX9iLeX34//kiJubF7r2ZQHtBRU36vONbLlw==} + + '@fastify/merge-json-schemas@0.2.1': + resolution: {integrity: sha512-OA3KGBCy6KtIvLf8DINC5880o5iBlDX4SxzLQS8HorJAbqluzLRn80UXU0bxZn7UOFhFgpRJDasfwn9nG4FG4A==} + + '@fastify/proxy-addr@5.1.0': + resolution: {integrity: sha512-INS+6gh91cLUjB+PVHfu1UqcB76Sqtpyp7bnL+FYojhjygvOPA9ctiD/JDKsyD9Xgu4hUhCSJBPig/w7duNajw==} + '@floating-ui/core@1.7.4': resolution: {integrity: sha512-C3HlIdsBxszvm5McXlB8PeOEWfBhcGBTZGkGlWc2U0KFY5IwG5OQEuQ8rq52DZmcHDlPLd+YFBK+cZcytwIFWg==} @@ -400,9 +446,15 @@ packages: '@jridgewell/trace-mapping@0.3.31': resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} + '@mongodb-js/saslprep@1.4.6': + resolution: {integrity: sha512-y+x3H1xBZd38n10NZF/rEBlvDOOMQ6LKUTHqr8R9VkJ+mmQOYtJFxIlkkK8fZrtOiL6VixbOBWMbZGBdal3Z1g==} + '@pandacss/is-valid-prop@1.8.2': resolution: {integrity: sha512-wfZ4kzvHXQ9pG3wuIGTUCcbC7Op8pqIQZNIRY/bqWQu67WTHxZUHUPSZgQMhguI8Tz4ot+DNf4Qhha0bhLvNEQ==} + '@pinojs/redact@0.4.0': + resolution: {integrity: sha512-k2ENnmBugE/rzQfEcdWHcCY+/FM3VLzH9cYEsbdsoqrvzAKRhUZeRNhAZvB8OitQJ1TBed3yqWtdjzS6wJKBwg==} + '@rolldown/pluginutils@1.0.0-beta.27': resolution: {integrity: sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA==} @@ -635,6 +687,9 @@ packages: '@tauri-apps/plugin-opener@2.5.3': resolution: {integrity: sha512-CCcUltXMOfUEArbf3db3kCE7Ggy1ExBEBl51Ko2ODJ6GDYHRp1nSNlQm5uNCFY5k7/ufaK5Ib3Du/Zir19IYQQ==} + '@types/adm-zip@0.5.7': + resolution: {integrity: sha512-DNEs/QvmyRLurdQPChqq0Md4zGvPwHerAJYWk9l2jCbD1VPpnzRJorOdiq4zsw09NFbYnhfsoEhWtxIzXpn2yw==} + '@types/babel__core@7.20.5': resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} @@ -664,6 +719,12 @@ packages: '@types/react@19.2.14': resolution: {integrity: sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w==} + '@types/webidl-conversions@7.0.3': + resolution: {integrity: sha512-CiJJvcRtIgzadHCYXw7dqEnMNRjhGZlYK05Mj9OyktqV8uVT8fD2BFOB7S1uwBE3Kj2Z+4UyPmFw/Ixgw/LAlA==} + + '@types/whatwg-url@13.0.0': + resolution: {integrity: sha512-N8WXpbE6Wgri7KUSvrmQcqrMllKZ9uxkYWMt+mCSGwNc0Hsw9VQTW7ApqI4XNrx6/SaM2QQJCzMPDEXE058s+Q==} + '@vitejs/plugin-react@4.7.0': resolution: {integrity: sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA==} engines: {node: ^14.18.0 || >=16.0.0} @@ -899,6 +960,31 @@ packages: '@zag-js/utils@1.34.1': resolution: {integrity: sha512-XgNTbcxPgNkPEuH/s/WUSU3M1mnO7453P53Wvym3dte+zPmqjwf5VT1FmEw8t6YQDBiBkIEKpUnNwR2x/pmZgg==} + abstract-logging@2.0.1: + resolution: {integrity: sha512-2BjRTZxTPvheOvGbBslFSYOUkr+SjPtOnrLP33f+VIWLzezQpZcqVg7ja3L4dBXmzzgwT+a029jRx5PCi3JuiA==} + + adm-zip@0.5.16: + resolution: {integrity: sha512-TGw5yVi4saajsSEgz25grObGHEUaDrniwvA2qwSC060KfqGPdglhvPMA2lPIoxs3PQIItj2iag35fONcQqgUaQ==} + engines: {node: '>=12.0'} + + ajv-formats@3.0.1: + resolution: {integrity: sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==} + peerDependencies: + ajv: ^8.0.0 + peerDependenciesMeta: + ajv: + optional: true + + ajv@8.18.0: + resolution: {integrity: sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==} + + atomic-sleep@1.0.0: + resolution: {integrity: sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==} + engines: {node: '>=8.0.0'} + + avvio@9.2.0: + resolution: {integrity: sha512-2t/sy01ArdHHE0vRH5Hsay+RtCZt3dLPji7W7/MMOCEgze5b7SNDC4j5H6FnVgPkI1MTNFGzHdHrVXDDl7QSSQ==} + babel-plugin-macros@3.1.0: resolution: {integrity: sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==} engines: {node: '>=10', npm: '>=6'} @@ -913,6 +999,10 @@ packages: engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true + bson@7.2.0: + resolution: {integrity: sha512-YCEo7KjMlbNlyHhz7zAZNDpIpQbd+wOEHJYezv0nMYTn4x31eIUM2yomNNubclAt63dObUzKHWsBLJ9QcZNSnQ==} + engines: {node: '>=20.19.0'} + callsites@3.1.0: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} @@ -926,6 +1016,10 @@ packages: convert-source-map@2.0.0: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + cookie@1.1.1: + resolution: {integrity: sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==} + engines: {node: '>=18'} + cosmiconfig@7.1.0: resolution: {integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==} engines: {node: '>=10'} @@ -942,6 +1036,14 @@ packages: supports-color: optional: true + dequal@2.0.3: + resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} + engines: {node: '>=6'} + + dotenv@17.3.1: + resolution: {integrity: sha512-IO8C/dzEb6O3F9/twg6ZLXz164a2fhTnEWb95H23Dm4OuN+92NmEAlTrupP9VW6Jm3sO26tQlqyvyi4CsnY9GA==} + engines: {node: '>=12'} + electron-to-chromium@1.5.302: resolution: {integrity: sha512-sM6HAN2LyK82IyPBpznDRqlTQAtuSaO+ShzFiWTvoMJLHyZ+Y39r8VMfHzwbU8MVBzQ4Wdn85+wlZl2TLGIlwg==} @@ -961,6 +1063,27 @@ packages: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} + fast-decode-uri-component@1.0.1: + resolution: {integrity: sha512-WKgKWg5eUxvRZGwW8FvfbaH7AXSh2cL+3j5fMGzUMCxWBJ3dV3a7Wz8y2f/uQ0e3B6WmodD3oS54jTQ9HVTIIg==} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-json-stringify@6.3.0: + resolution: {integrity: sha512-oRCntNDY/329HJPlmdNLIdogNtt6Vyjb1WuT01Soss3slIdyUp8kAcDU3saQTOquEK8KFVfwIIF7FebxUAu+yA==} + + fast-querystring@1.1.2: + resolution: {integrity: sha512-g6KuKWmFXc0fID8WWH0jit4g0AGBoJhCkJMb1RmbsSEUNvQ+ZC8D6CUZ+GtF8nMzSPXnhiePyyqqipzNNEnHjg==} + + fast-uri@3.1.0: + resolution: {integrity: sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==} + + fastify@5.7.4: + resolution: {integrity: sha512-e6l5NsRdaEP8rdD8VR0ErJASeyaRbzXYpmkrpr2SuvuMq6Si3lvsaVy5C+7gLanEkvjpMDzBXWE5HPeb/hgTxA==} + + fastq@1.20.1: + resolution: {integrity: sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==} + fdir@6.5.0: resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} engines: {node: '>=12.0.0'} @@ -970,6 +1093,10 @@ packages: picomatch: optional: true + find-my-way@9.5.0: + resolution: {integrity: sha512-VW2RfnmscZO5KgBY5XVyKREMW5nMZcxDy+buTOsL+zIPnBlbKm+00sgzoQzq1EVh4aALZLfKdwv6atBGcjvjrQ==} + engines: {node: '>=20'} + find-root@1.1.0: resolution: {integrity: sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==} @@ -985,6 +1112,9 @@ packages: resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} engines: {node: '>=6.9.0'} + get-tsconfig@4.13.6: + resolution: {integrity: sha512-shZT/QMiSHc/YBLxxOkMtgSid5HFoauqCE3/exfsEcwg1WkeqjG+V40yBbBrsD+jW2HDXcs28xOfcbm2jI8Ddw==} + hasown@2.0.2: resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} engines: {node: '>= 0.4'} @@ -996,6 +1126,10 @@ packages: resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} engines: {node: '>=6'} + ipaddr.js@2.3.0: + resolution: {integrity: sha512-Zv/pA+ciVFbCSBBjGfaKUya/CcGmUHzTydLMaTwrUUEM2DIEO3iZvueGxmacvmN50fGpGVKeTXpb2LcYQxeVdg==} + engines: {node: '>= 10'} + is-arrayish@0.2.1: resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} @@ -1014,17 +1148,60 @@ packages: json-parse-even-better-errors@2.3.1: resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + json-schema-ref-resolver@3.0.0: + resolution: {integrity: sha512-hOrZIVL5jyYFjzk7+y7n5JDzGlU8rfWDuYyHwGa2WA8/pcmMHezp2xsVwxrebD/Q9t8Nc5DboieySDpCp4WG4A==} + + json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + json5@2.2.3: resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} engines: {node: '>=6'} hasBin: true + light-my-request@6.6.0: + resolution: {integrity: sha512-CHYbu8RtboSIoVsHZ6Ye4cj4Aw/yg2oAFimlF7mNvfDV192LR7nDiKtSIfCuLT7KokPSTn/9kfVLm5OGN0A28A==} + lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} lru-cache@5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + memory-pager@1.5.0: + resolution: {integrity: sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==} + + mongodb-connection-string-url@7.0.1: + resolution: {integrity: sha512-h0AZ9A7IDVwwHyMxmdMXKy+9oNlF0zFoahHiX3vQ8e3KFcSP3VmsmfvtRSuLPxmyv2vjIDxqty8smTgie/SNRQ==} + engines: {node: '>=20.19.0'} + + mongodb@7.1.0: + resolution: {integrity: sha512-kMfnKunbolQYwCIyrkxNJFB4Ypy91pYqua5NargS/f8ODNSJxT03ZU3n1JqL4mCzbSih8tvmMEMLpKTT7x5gCg==} + engines: {node: '>=20.19.0'} + peerDependencies: + '@aws-sdk/credential-providers': ^3.806.0 + '@mongodb-js/zstd': ^7.0.0 + gcp-metadata: ^7.0.1 + kerberos: ^7.0.0 + mongodb-client-encryption: '>=7.0.0 <7.1.0' + snappy: ^7.3.2 + socks: ^2.8.6 + peerDependenciesMeta: + '@aws-sdk/credential-providers': + optional: true + '@mongodb-js/zstd': + optional: true + gcp-metadata: + optional: true + kerberos: + optional: true + mongodb-client-encryption: + optional: true + snappy: + optional: true + socks: + optional: true + ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} @@ -1042,6 +1219,10 @@ packages: node-releases@2.0.27: resolution: {integrity: sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==} + on-exit-leak-free@2.1.2: + resolution: {integrity: sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==} + engines: {node: '>=14.0.0'} + parent-module@1.0.1: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} engines: {node: '>=6'} @@ -1067,16 +1248,39 @@ packages: resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} engines: {node: '>=12'} + pino-abstract-transport@3.0.0: + resolution: {integrity: sha512-wlfUczU+n7Hy/Ha5j9a/gZNy7We5+cXp8YL+X+PG8S0KXxw7n/JXA3c46Y0zQznIJ83URJiwy7Lh56WLokNuxg==} + + pino-std-serializers@7.1.0: + resolution: {integrity: sha512-BndPH67/JxGExRgiX1dX0w1FvZck5Wa4aal9198SrRhZjH3GxKQUKIBnYJTdj2HDN3UQAS06HlfcSbQj2OHmaw==} + + pino@10.3.1: + resolution: {integrity: sha512-r34yH/GlQpKZbU1BvFFqOjhISRo1MNx1tWYsYvmj6KIRHSPMT2+yHOEb1SG6NMvRoHRF0a07kCOox/9yakl1vg==} + hasBin: true + postcss@8.5.6: resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} engines: {node: ^10 || ^12 || >=14} + process-warning@4.0.1: + resolution: {integrity: sha512-3c2LzQ3rY9d0hc1emcsHhfT9Jwz0cChib/QN89oME2R451w5fy3f0afAhERFZAwrbDU43wk12d0ORBpDVME50Q==} + + process-warning@5.0.0: + resolution: {integrity: sha512-a39t9ApHNx2L4+HBnQKqxxHNs1r7KF+Intd8Q/g1bUh6q0WIp9voPXJ/x0j+ZL45KF1pJd9+q2jLIRMfvEshkA==} + proxy-compare@3.0.1: resolution: {integrity: sha512-V9plBAt3qjMlS1+nC8771KNf6oJ12gExvaxnNzN/9yVRLdTv/lc+oJlnSzrdYDAvBfTStPCoiaCOTmTs0adv7Q==} proxy-memoize@3.0.1: resolution: {integrity: sha512-VDdG/VYtOgdGkWJx7y0o7p+zArSf2383Isci8C+BP3YXgMYDoPd3cCBjw0JdWb6YBb9sFiOPbAADDVTPJnh+9g==} + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + + quick-format-unescaped@4.0.4: + resolution: {integrity: sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==} + react-dom@19.2.4: resolution: {integrity: sha512-AXJdLo8kgMbimY95O2aKQqsz2iWi9jMgKJhRBAxECE4IFxfcazB2LmzloIoibJI3C12IlY20+KFaLv+71bUJeQ==} peerDependencies: @@ -1098,27 +1302,70 @@ packages: resolution: {integrity: sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ==} engines: {node: '>=0.10.0'} + real-require@0.2.0: + resolution: {integrity: sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==} + engines: {node: '>= 12.13.0'} + + require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + resolve-from@4.0.0: resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} engines: {node: '>=4'} + resolve-pkg-maps@1.0.0: + resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} + resolve@1.22.11: resolution: {integrity: sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==} engines: {node: '>= 0.4'} hasBin: true + ret@0.5.0: + resolution: {integrity: sha512-I1XxrZSQ+oErkRR4jYbAyEEu2I0avBvvMM5JN+6EBprOGRCs63ENqZ3vjavq8fBw2+62G5LF5XelKwuJpcvcxw==} + engines: {node: '>=10'} + + reusify@1.1.0: + resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + rfdc@1.4.1: + resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} + rollup@4.58.0: resolution: {integrity: sha512-wbT0mBmWbIvvq8NeEYWWvevvxnOyhKChir47S66WCxw1SXqhw7ssIYejnQEVt7XYQpsj2y8F9PM+Cr3SNEa0gw==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true + safe-regex2@5.0.0: + resolution: {integrity: sha512-YwJwe5a51WlK7KbOJREPdjNrpViQBI3p4T50lfwPuDhZnE3XGVTlGvi+aolc5+RvxDD6bnUmjVsU9n1eboLUYw==} + + safe-stable-stringify@2.5.0: + resolution: {integrity: sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==} + engines: {node: '>=10'} + scheduler@0.27.0: resolution: {integrity: sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==} + secure-json-parse@4.1.0: + resolution: {integrity: sha512-l4KnYfEyqYJxDwlNVyRfO2E4NTHfMKAWdUuA8J0yve2Dz/E/PdBepY03RvyJpssIpRFwJoCD55wA+mEDs6ByWA==} + semver@6.3.1: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true + semver@7.7.4: + resolution: {integrity: sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==} + engines: {node: '>=10'} + hasBin: true + + set-cookie-parser@2.7.2: + resolution: {integrity: sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw==} + + sonic-boom@4.2.1: + resolution: {integrity: sha512-w6AxtubXa2wTXAUsZMMWERrsIRAdrK0Sc+FUytWvYAhBJLyuI4llrMIC1DtlNSdI99EI86KZum2MMq3EAZlF9Q==} + source-map-js@1.2.1: resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} engines: {node: '>=0.10.0'} @@ -1127,6 +1374,13 @@ packages: resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==} engines: {node: '>=0.10.0'} + sparse-bitfield@3.0.3: + resolution: {integrity: sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==} + + split2@4.2.0: + resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} + engines: {node: '>= 10.x'} + stylis@4.2.0: resolution: {integrity: sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==} @@ -1134,13 +1388,30 @@ packages: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} + thread-stream@4.0.0: + resolution: {integrity: sha512-4iMVL6HAINXWf1ZKZjIPcz5wYaOdPhtO8ATvZ+Xqp3BTdaqtAwQkNmKORqcIo5YkQqGXq5cwfswDwMqqQNrpJA==} + engines: {node: '>=20'} + tinyglobby@0.2.15: resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} engines: {node: '>=12.0.0'} + toad-cache@3.7.0: + resolution: {integrity: sha512-/m8M+2BJUpoJdgAHoG+baCwBT+tf2VraSfkBgl0Y00qIWt41DJ8R5B8nsEw0I58YwF5IZH6z24/2TobDKnqSWw==} + engines: {node: '>=12'} + + tr46@5.1.1: + resolution: {integrity: sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw==} + engines: {node: '>=18'} + tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + tsx@4.21.0: + resolution: {integrity: sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw==} + engines: {node: '>=18.0.0'} + hasBin: true + typescript@5.8.3: resolution: {integrity: sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==} engines: {node: '>=14.17'} @@ -1202,6 +1473,14 @@ packages: resolution: {integrity: sha512-OSDqupzTlzl2LGyqTdhcXcl6ezMiFhcUwLBP8YKaBIbMYW1wAwDvupw2T9G9oVaKT9RmaSpyTXjxddFPUcFFIw==} engines: {node: '>=12'} + webidl-conversions@7.0.0: + resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} + engines: {node: '>=12'} + + whatwg-url@14.2.0: + resolution: {integrity: sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw==} + engines: {node: '>=18'} + yallist@3.1.1: resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} @@ -1572,6 +1851,29 @@ snapshots: '@esbuild/win32-x64@0.27.3': optional: true + '@fastify/ajv-compiler@4.0.5': + dependencies: + ajv: 8.18.0 + ajv-formats: 3.0.1(ajv@8.18.0) + fast-uri: 3.1.0 + + '@fastify/error@4.2.0': {} + + '@fastify/fast-json-stringify-compiler@5.0.3': + dependencies: + fast-json-stringify: 6.3.0 + + '@fastify/forwarded@3.0.1': {} + + '@fastify/merge-json-schemas@0.2.1': + dependencies: + dequal: 2.0.3 + + '@fastify/proxy-addr@5.1.0': + dependencies: + '@fastify/forwarded': 3.0.1 + ipaddr.js: 2.3.0 + '@floating-ui/core@1.7.4': dependencies: '@floating-ui/utils': 0.2.10 @@ -1610,8 +1912,14 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.5 + '@mongodb-js/saslprep@1.4.6': + dependencies: + sparse-bitfield: 3.0.3 + '@pandacss/is-valid-prop@1.8.2': {} + '@pinojs/redact@0.4.0': {} + '@rolldown/pluginutils@1.0.0-beta.27': {} '@rollup/rollup-android-arm-eabi@4.58.0': @@ -1754,6 +2062,10 @@ snapshots: dependencies: '@tauri-apps/api': 2.10.1 + '@types/adm-zip@0.5.7': + dependencies: + '@types/node': 24.10.13 + '@types/babel__core@7.20.5': dependencies: '@babel/parser': 7.29.0 @@ -1780,7 +2092,6 @@ snapshots: '@types/node@24.10.13': dependencies: undici-types: 7.16.0 - optional: true '@types/parse-json@4.0.2': {} @@ -1792,7 +2103,13 @@ snapshots: dependencies: csstype: 3.2.3 - '@vitejs/plugin-react@4.7.0(vite@7.3.1(@types/node@24.10.13))': + '@types/webidl-conversions@7.0.3': {} + + '@types/whatwg-url@13.0.0': + dependencies: + '@types/webidl-conversions': 7.0.3 + + '@vitejs/plugin-react@4.7.0(vite@7.3.1(@types/node@24.10.13)(tsx@4.21.0))': dependencies: '@babel/core': 7.29.0 '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.29.0) @@ -1800,7 +2117,7 @@ snapshots: '@rolldown/pluginutils': 1.0.0-beta.27 '@types/babel__core': 7.20.5 react-refresh: 0.17.0 - vite: 7.3.1(@types/node@24.10.13) + vite: 7.3.1(@types/node@24.10.13)(tsx@4.21.0) transitivePeerDependencies: - supports-color @@ -2360,6 +2677,28 @@ snapshots: '@zag-js/utils@1.34.1': {} + abstract-logging@2.0.1: {} + + adm-zip@0.5.16: {} + + ajv-formats@3.0.1(ajv@8.18.0): + optionalDependencies: + ajv: 8.18.0 + + ajv@8.18.0: + dependencies: + fast-deep-equal: 3.1.3 + fast-uri: 3.1.0 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + + atomic-sleep@1.0.0: {} + + avvio@9.2.0: + dependencies: + '@fastify/error': 4.2.0 + fastq: 1.20.1 + babel-plugin-macros@3.1.0: dependencies: '@babel/runtime': 7.28.6 @@ -2376,6 +2715,8 @@ snapshots: node-releases: 2.0.27 update-browserslist-db: 1.2.3(browserslist@4.28.1) + bson@7.2.0: {} + callsites@3.1.0: {} caniuse-lite@1.0.30001770: {} @@ -2384,6 +2725,8 @@ snapshots: convert-source-map@2.0.0: {} + cookie@1.1.1: {} + cosmiconfig@7.1.0: dependencies: '@types/parse-json': 4.0.2 @@ -2398,6 +2741,10 @@ snapshots: dependencies: ms: 2.1.3 + dequal@2.0.3: {} + + dotenv@17.3.1: {} + electron-to-chromium@1.5.302: {} error-ex@1.3.4: @@ -2437,10 +2784,57 @@ snapshots: escape-string-regexp@4.0.0: {} + fast-decode-uri-component@1.0.1: {} + + fast-deep-equal@3.1.3: {} + + fast-json-stringify@6.3.0: + dependencies: + '@fastify/merge-json-schemas': 0.2.1 + ajv: 8.18.0 + ajv-formats: 3.0.1(ajv@8.18.0) + fast-uri: 3.1.0 + json-schema-ref-resolver: 3.0.0 + rfdc: 1.4.1 + + fast-querystring@1.1.2: + dependencies: + fast-decode-uri-component: 1.0.1 + + fast-uri@3.1.0: {} + + fastify@5.7.4: + dependencies: + '@fastify/ajv-compiler': 4.0.5 + '@fastify/error': 4.2.0 + '@fastify/fast-json-stringify-compiler': 5.0.3 + '@fastify/proxy-addr': 5.1.0 + abstract-logging: 2.0.1 + avvio: 9.2.0 + fast-json-stringify: 6.3.0 + find-my-way: 9.5.0 + light-my-request: 6.6.0 + pino: 10.3.1 + process-warning: 5.0.0 + rfdc: 1.4.1 + secure-json-parse: 4.1.0 + semver: 7.7.4 + toad-cache: 3.7.0 + + fastq@1.20.1: + dependencies: + reusify: 1.1.0 + fdir@6.5.0(picomatch@4.0.3): optionalDependencies: picomatch: 4.0.3 + find-my-way@9.5.0: + dependencies: + fast-deep-equal: 3.1.3 + fast-querystring: 1.1.2 + safe-regex2: 5.0.0 + find-root@1.1.0: {} fsevents@2.3.3: @@ -2450,6 +2844,10 @@ snapshots: gensync@1.0.0-beta.2: {} + get-tsconfig@4.13.6: + dependencies: + resolve-pkg-maps: 1.0.0 + hasown@2.0.2: dependencies: function-bind: 1.1.2 @@ -2463,6 +2861,8 @@ snapshots: parent-module: 1.0.1 resolve-from: 4.0.0 + ipaddr.js@2.3.0: {} + is-arrayish@0.2.1: {} is-core-module@2.16.1: @@ -2475,14 +2875,39 @@ snapshots: json-parse-even-better-errors@2.3.1: {} + json-schema-ref-resolver@3.0.0: + dependencies: + dequal: 2.0.3 + + json-schema-traverse@1.0.0: {} + json5@2.2.3: {} + light-my-request@6.6.0: + dependencies: + cookie: 1.1.1 + process-warning: 4.0.1 + set-cookie-parser: 2.7.2 + lines-and-columns@1.2.4: {} lru-cache@5.1.1: dependencies: yallist: 3.1.1 + memory-pager@1.5.0: {} + + mongodb-connection-string-url@7.0.1: + dependencies: + '@types/whatwg-url': 13.0.0 + whatwg-url: 14.2.0 + + mongodb@7.1.0: + dependencies: + '@mongodb-js/saslprep': 1.4.6 + bson: 7.2.0 + mongodb-connection-string-url: 7.0.1 + ms@2.1.3: {} nanoid@3.3.11: {} @@ -2494,6 +2919,8 @@ snapshots: node-releases@2.0.27: {} + on-exit-leak-free@2.1.2: {} + parent-module@1.0.1: dependencies: callsites: 3.1.0 @@ -2515,18 +2942,46 @@ snapshots: picomatch@4.0.3: {} + pino-abstract-transport@3.0.0: + dependencies: + split2: 4.2.0 + + pino-std-serializers@7.1.0: {} + + pino@10.3.1: + dependencies: + '@pinojs/redact': 0.4.0 + atomic-sleep: 1.0.0 + on-exit-leak-free: 2.1.2 + pino-abstract-transport: 3.0.0 + pino-std-serializers: 7.1.0 + process-warning: 5.0.0 + quick-format-unescaped: 4.0.4 + real-require: 0.2.0 + safe-stable-stringify: 2.5.0 + sonic-boom: 4.2.1 + thread-stream: 4.0.0 + postcss@8.5.6: dependencies: nanoid: 3.3.11 picocolors: 1.1.1 source-map-js: 1.2.1 + process-warning@4.0.1: {} + + process-warning@5.0.0: {} + proxy-compare@3.0.1: {} proxy-memoize@3.0.1: dependencies: proxy-compare: 3.0.1 + punycode@2.3.1: {} + + quick-format-unescaped@4.0.4: {} + react-dom@19.2.4(react@19.2.4): dependencies: react: 19.2.4 @@ -2542,14 +2997,26 @@ snapshots: react@19.2.4: {} + real-require@0.2.0: {} + + require-from-string@2.0.2: {} + resolve-from@4.0.0: {} + resolve-pkg-maps@1.0.0: {} + resolve@1.22.11: dependencies: is-core-module: 2.16.1 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 + ret@0.5.0: {} + + reusify@1.1.0: {} + + rfdc@1.4.1: {} + rollup@4.58.0: dependencies: '@types/estree': 1.0.8 @@ -2581,29 +3048,67 @@ snapshots: '@rollup/rollup-win32-x64-msvc': 4.58.0 fsevents: 2.3.3 + safe-regex2@5.0.0: + dependencies: + ret: 0.5.0 + + safe-stable-stringify@2.5.0: {} + scheduler@0.27.0: {} + secure-json-parse@4.1.0: {} + semver@6.3.1: {} + semver@7.7.4: {} + + set-cookie-parser@2.7.2: {} + + sonic-boom@4.2.1: + dependencies: + atomic-sleep: 1.0.0 + source-map-js@1.2.1: {} source-map@0.5.7: {} + sparse-bitfield@3.0.3: + dependencies: + memory-pager: 1.5.0 + + split2@4.2.0: {} + stylis@4.2.0: {} supports-preserve-symlinks-flag@1.0.0: {} + thread-stream@4.0.0: + dependencies: + real-require: 0.2.0 + tinyglobby@0.2.15: dependencies: fdir: 6.5.0(picomatch@4.0.3) picomatch: 4.0.3 + toad-cache@3.7.0: {} + + tr46@5.1.1: + dependencies: + punycode: 2.3.1 + tslib@2.8.1: {} + tsx@4.21.0: + dependencies: + esbuild: 0.27.3 + get-tsconfig: 4.13.6 + optionalDependencies: + fsevents: 2.3.3 + typescript@5.8.3: {} - undici-types@7.16.0: - optional: true + undici-types@7.16.0: {} update-browserslist-db@1.2.3(browserslist@4.28.1): dependencies: @@ -2613,7 +3118,7 @@ snapshots: uqr@0.1.2: {} - vite@7.3.1(@types/node@24.10.13): + vite@7.3.1(@types/node@24.10.13)(tsx@4.21.0): dependencies: esbuild: 0.27.3 fdir: 6.5.0(picomatch@4.0.3) @@ -2624,9 +3129,17 @@ snapshots: optionalDependencies: '@types/node': 24.10.13 fsevents: 2.3.3 + tsx: 4.21.0 wanakana@5.3.1: {} + webidl-conversions@7.0.0: {} + + whatwg-url@14.2.0: + dependencies: + tr46: 5.1.1 + webidl-conversions: 7.0.0 + yallist@3.1.1: {} yaml@1.10.2: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 449ae40..d961260 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -1,4 +1,5 @@ packages: + - js-server - src-react onlyBuiltDependencies: diff --git a/src-tauri/resources/yomitan/ja/.gitignore b/src-tauri/resources/yomitan/ja/.gitignore index 57e4803..b2dee01 100644 --- a/src-tauri/resources/yomitan/ja/.gitignore +++ b/src-tauri/resources/yomitan/ja/.gitignore @@ -1 +1,4 @@ +* +!.gitignore + # Pixiv_*.zip => Pixiv.zip from https://github.com/MarvNC/pixiv-yomitan/releases