diff --git a/.eslintrc.cjs b/.eslintrc.cjs deleted file mode 100644 index b28ecabf9..000000000 --- a/.eslintrc.cjs +++ /dev/null @@ -1,41 +0,0 @@ -module.exports = { - root: true, - parser: '@typescript-eslint/parser', - parserOptions: { - project: './tsconfig.json', - extraFileExtensions: ['*.svelte'] - }, - extends: ['eslint:recommended', 'plugin:@typescript-eslint/recommended', 'prettier'], - plugins: ['svelte', '@typescript-eslint', 'prettier'], - ignorePatterns: ['*.cjs', '*.js'], - overrides: [ - { - files: ['*.svelte'], - parser: 'svelte-eslint-parser', - parserOptions: { - parser: '@typescript-eslint/parser' - } - } - ], - settings: { - typescript: () => require('typescript') - }, - parserOptions: { - sourceType: 'module', - ecmaVersion: 2020 - }, - env: { - browser: true, - es2017: true, - node: true - }, - rules: { - '@typescript-eslint/no-explicit-any': 'off', - '@typescript-eslint/no-non-null-assertion': 'off', - 'no-tabs': 'error', - 'no-undef': 'off', // Covered by TS, and eslint false flags some globals - 'no-inner-declarations': 'off', - '@typescript-eslint/no-unused-vars': 'off', - 'no-self-assign': 'off' - } -}; diff --git a/convert/convertAbout.ts b/convert/convertAbout.ts index cf6b23c59..a66c76fa2 100644 --- a/convert/convertAbout.ts +++ b/convert/convertAbout.ts @@ -12,8 +12,12 @@ export function convertAbout(dataDir: string, verbose: number) { const srcFile = path.join(dataDir, 'about.partial.html'); const dstFile = path.join('static', 'about.partial.html'); copyFile(srcFile, dstFile, function (err: any) { - if (err) throw err; - if (verbose) console.log(`copied ${srcFile} to ${dstFile}`); + if (err) { + throw err; + } + if (verbose) { + console.log(`copied ${srcFile} to ${dstFile}`); + } }); } export class ConvertAbout extends Task { diff --git a/convert/convertBadges.ts b/convert/convertBadges.ts index 5b87dfdc9..3c365a6b0 100644 --- a/convert/convertBadges.ts +++ b/convert/convertBadges.ts @@ -33,8 +33,12 @@ export async function convertBadges( if (existsSync(srcFile)) { foundLanguages.push(language); copyFile(srcFile, dstFile, function (err: any) { - if (err) throw err; - if (verbose) console.log(`copied ${srcFile} to ${dstFile}`); + if (err) { + throw err; + } + if (verbose) { + console.log(`copied ${srcFile} to ${dstFile}`); + } }); } } diff --git a/convert/convertBooks.ts b/convert/convertBooks.ts index cc658347a..a0a76cfa3 100644 --- a/convert/convertBooks.ts +++ b/convert/convertBooks.ts @@ -149,7 +149,7 @@ function handleNoCaptionFigures(text: string, _bcId: string, _bookId: string): s const parts = figContent.split('|'); // Extract the image caption - let imageCaption = parts[0]; + const imageCaption = parts[0]; // Check if the image caption is missing if (!imageCaption) { @@ -236,7 +236,7 @@ function moveFigureToNextNonVerseMarker(text: string): string { let carryOverFigures: string[] = []; const lines = text.split('\n'); - for (let line of lines) { + for (const line of lines) { // Add any figures that were carried over from the previous lines if (carryOverFigures.length > 0) { if (!line.startsWith('\\v ') && !line.startsWith('\\fig')) { @@ -373,10 +373,11 @@ export async function convertBooks( ); } usedLangs.add(context.lang); - if (verbose) + if (verbose) { console.log( 'converting collection: ' + collection.id + ' to docSet: ' + context.docSet ); + } /**array of promises of Proskomma mutations*/ const inputFiles = await fs.promises.readdir( path.join(context.dataDir, 'books', context.bcId) @@ -432,14 +433,18 @@ export async function convertBooks( continue; } } - if (verbose) console.time('convert ' + collection.id); + if (verbose) { + console.time('convert ' + collection.id); + } //wait for documents to finish being added to Proskomma await Promise.all(docs); if (ignoredBooks.length > 0) { process.stdout.write(` -- Not Supported: ${ignoredBooks.join(' ')}`); } process.stdout.write('\n'); - if (verbose) console.timeEnd('convert ' + collection.id); + if (verbose) { + console.timeEnd('convert ' + collection.id); + } //start freezing process and map promise to docSet name const frozen = freeze(pk); freezer.set(context.docSet, frozen[context.docSet]); @@ -449,14 +454,18 @@ export async function convertBooks( //check if folder exists for collection const collPath = path.join('static', 'collections', context.bcId); if (!fs.existsSync(collPath)) { - if (verbose) console.log('creating: ' + collPath); + if (verbose) { + console.log('creating: ' + collPath); + } fs.mkdirSync(collPath, { recursive: true }); } //add quizzes path if necessary if (quizzes[context.docSet].length > 0) { const qPath = path.join('static', 'collections', context.bcId, 'quizzes'); if (!fs.existsSync(qPath)) { - if (verbose) console.log('creating: ' + qPath); + if (verbose) { + console.log('creating: ' + qPath); + } fs.mkdirSync(qPath, { recursive: true }); } } @@ -465,7 +474,9 @@ export async function convertBooks( const entries = await Promise.all(catalogEntries); const catalogPath = path.join('static', 'collections', 'catalog'); if (!fs.existsSync(catalogPath)) { - if (verbose) console.log('creating: ' + catalogPath); + if (verbose) { + console.log('creating: ' + catalogPath); + } fs.mkdirSync(catalogPath, { recursive: true }); } entries.forEach((entry) => { @@ -474,7 +485,9 @@ export async function convertBooks( JSON.stringify(transformCatalogEntry(entry, quizzes, htmlBooks)) ); }); - if (verbose) console.time('freeze'); + if (verbose) { + console.time('freeze'); + } //write frozen archives for import //const vals = await Promise.all(freezer.values()); //write frozen archives @@ -501,7 +514,9 @@ export async function convertBooks( return s; })()}]` ); - if (verbose) console.timeEnd('freeze'); + if (verbose) { + console.timeEnd('freeze'); + } return { files, taskName: 'ConvertBooks' @@ -701,7 +716,9 @@ function convertScriptureBook( ) { function processBookContent(resolve: () => void, err: any, content: string) { //process.stdout.write(`processBookContent: bookId:${book.id}, error:${err}\n`); - if (err) throw err; + if (err) { + throw err; + } content = applyFilters(content, usfmFilterFunctions, context.bcId, book.id); if (context.scriptureConfig.traits['has-glossary']) { content = verifyGlossaryEntries(content, bcGlossary); @@ -763,7 +780,9 @@ function convertScriptureBook( const filenameWithoutExt = basename(file, ext).normalize('NFC'); // Check if the filename starts with baseFilename - if (!filenameWithoutExt.startsWith(baseFilename)) return false; + if (!filenameWithoutExt.startsWith(baseFilename)) { + return false; + } // Get the part after baseFilename const suffix = filenameWithoutExt.slice(baseFilename.length); @@ -836,17 +855,25 @@ export class ConvertBooks extends Task { * recursively deep-compares two objects based on properties passed in include. */ function deepCompareObjects(obj1: any, obj2: any, include: Set = new Set()): boolean { - if (typeof obj1 !== typeof obj2) return false; + if (typeof obj1 !== typeof obj2) { + return false; + } if (typeof obj1 === 'object') { if (Array.isArray(obj1)) { - if (obj1.length !== obj2.length) return false; + if (obj1.length !== obj2.length) { + return false; + } for (let i = 0; i < obj1.length; i++) { - if (!deepCompareObjects(obj1[i], obj2[i])) return false; + if (!deepCompareObjects(obj1[i], obj2[i])) { + return false; + } } } else { for (const k in obj1) { if (include.has(k)) { - if (!deepCompareObjects(obj1[k], obj2[k])) return false; + if (!deepCompareObjects(obj1[k], obj2[k])) { + return false; + } } } } diff --git a/convert/convertConfig.ts b/convert/convertConfig.ts index e83c5fb05..cd072fdb0 100644 --- a/convert/convertConfig.ts +++ b/convert/convertConfig.ts @@ -29,8 +29,11 @@ function decodeFromXml(input: string): string { } export function parseConfigValue(value: any) { - if (!value.includes(':') && !isNaN(parseInt(value))) value = parseInt(value); - else if (['true', 'false'].includes(value)) value = value === 'true' ? true : false; + if (!value.includes(':') && !isNaN(parseInt(value))) { + value = parseInt(value); + } else if (['true', 'false'].includes(value)) { + value = value === 'true' ? true : false; + } // else {} // " " split array, string, enum or time return value; } @@ -51,7 +54,9 @@ export function parseAdditionalNames(namesTag: Element, verbose: number) { export function parseStyles(stylesTag: Element, verbose: number) { const styles = []; const styleTags = stylesTag?.getElementsByTagName('style'); - if (!styleTags) throw new Error('Styles tag not found in xml'); + if (!styleTags) { + throw new Error('Styles tag not found in xml'); + } for (const tag of styleTags) { //console.log(tag.outerHTML); const name = tag.attributes.getNamedItem('name')!.value; @@ -64,10 +69,11 @@ export function parseStyles(stylesTag: Element, verbose: number) { if (propName && propValue) { // Check for sp values (Android-specific) and convert to rem values: properties[propName] = changeAndroidToRem(propValue); - if (verbose) + if (verbose) { console.log( 'Parsing ' + propName + ' = ' + propValue + ' -> ' + properties[propName] ); + } } } styles.push({ @@ -219,11 +225,15 @@ function convertConfig(dataDir: string, verbose: number) { // Name data.name = document.getElementsByTagName('app-name')[0].innerHTML; - if (verbose) console.log(`Converting ${data.name}...`); + if (verbose) { + console.log(`Converting ${data.name}...`); + } // Package data.package = document.getElementsByTagName('package')[0].innerHTML; - if (verbose) console.log(`Converting ${data.package}...`); + if (verbose) { + console.log(`Converting ${data.package}...`); + } // Version data.version = document @@ -373,7 +383,9 @@ export function parseFeatures(document: Document, verbose: number) { const mainFeatureTags = document .querySelector('features[type=main]') ?.getElementsByTagName('e'); - if (!mainFeatureTags) throw new Error('Features tag not found in xml'); + if (!mainFeatureTags) { + throw new Error('Features tag not found in xml'); + } const mainFeatures: { [key: string]: any } = {}; for (const tag of mainFeatureTags) { @@ -385,10 +397,14 @@ export function parseFeatures(document: Document, verbose: number) { console.error( 'The main features section did not have the expected attributes `name` and `value`' ); - } else throw e; + } else { + throw e; + } } } - if (verbose) console.log(`Converted ${Object.keys(mainFeatures).length} features`); + if (verbose) { + console.log(`Converted ${Object.keys(mainFeatures).length} features`); + } return mainFeatures; } @@ -411,7 +427,9 @@ export function parseFonts(document: Document, verbose: number) { fonts.push({ family, name, file, fontStyle, fontWeight }); } - if (verbose) console.log(`Converted ${fonts.length} fonts`); + if (verbose) { + console.log(`Converted ${fonts.length} fonts`); + } return fonts; } @@ -426,7 +444,9 @@ export function parseColorThemes(document: Document, verbose: number) { for (const tag of colorThemeTags) { const theme = tag.attributes.getNamedItem('name')!.value; - if (verbose >= 2) console.log(`. theme ${theme}`); + if (verbose >= 2) { + console.log(`. theme ${theme}`); + } themes.push({ name: theme, @@ -438,13 +458,21 @@ export function parseColorThemes(document: Document, verbose: number) { const cm = color.querySelector(`cm[theme="${theme}"]`); const name = color.getAttribute('name'); const value = cm?.getAttribute('value'); - if (name && value) colors[name] = value; - if (verbose >= 3) console.log(`.. colors[${name}]=${value} `); + if (name && value) { + colors[name] = value; + } + if (verbose >= 3) { + console.log(`.. colors[${name}]=${value} `); + } + } + if (verbose >= 3) { + console.log(`.. done with colorTags`); } - if (verbose >= 3) console.log(`.. done with colorTags`); Object.keys(colors).forEach((x) => { - if (verbose >= 3) console.log(`.. ${x}: colors[${x}]=${colors[x]}`); + if (verbose >= 3) { + console.log(`.. ${x}: colors[${x}]=${colors[x]}`); + } while (!colors[x].startsWith('#')) { const key = colors[x]; const value = colors[key]; @@ -457,10 +485,14 @@ export function parseColorThemes(document: Document, verbose: number) { colors[x] = value; } }); - if (verbose >= 3) console.log(`.. done with resolving colors`); + if (verbose >= 3) { + console.log(`.. done with resolving colors`); + } const type = cst.getAttribute('type')!; - if (verbose >= 2) console.log(`.. ${type}: ${JSON.stringify(colors)}`); + if (verbose >= 2) { + console.log(`.. ${type}: ${JSON.stringify(colors)}`); + } return { type, colors @@ -468,11 +500,14 @@ export function parseColorThemes(document: Document, verbose: number) { }) }); - if (tag.attributes.getNamedItem('default')?.value === 'true') + if (tag.attributes.getNamedItem('default')?.value === 'true') { defaultTheme = themes[themes.length - 1].name; + } } - if (verbose) console.log(`Converted ${themes.length} themes`); + if (verbose) { + console.log(`Converted ${themes.length} themes`); + } return { themes, defaultTheme }; } @@ -492,7 +527,9 @@ export function parseTraits(document: Document, dataDir: string, verbose: number traits['has-borders'] = !dirEmpty(path.join(dataDir, 'borders')); traits['has-illustrations'] = !dirEmpty(path.join(dataDir, 'illustrations')); - if (verbose) console.log(`Converted ${Object.keys(traits).length} traits`); + if (verbose) { + console.log(`Converted ${Object.keys(traits).length} traits`); + } return traits; } @@ -502,11 +539,17 @@ export function parseBookCollections(document: Document, verbose: number) { const bookCollections = []; for (const tag of booksTags) { - if (verbose >= 2) console.log(`Converting Collection: ${tag.id}`); + if (verbose >= 2) { + console.log(`Converting Collection: ${tag.id}`); + } const featuresTags = tag.querySelector('features[type=bc]')?.getElementsByTagName('e'); - if (!featuresTags) throw 'Book collection feature tags missing'; + if (!featuresTags) { + throw 'Book collection feature tags missing'; + } const features: any = {}; - if (verbose >= 2) console.log(`. features`); + if (verbose >= 2) { + console.log(`. features`); + } for (const feature of featuresTags) { features[feature.attributes.getNamedItem('name')!.value] = parseConfigValue( feature.attributes.getNamedItem('value')!.value @@ -515,11 +558,15 @@ export function parseBookCollections(document: Document, verbose: number) { const books: BookCollectionConfig['books'] = []; const bookTags = tag.getElementsByTagName('book'); for (const book of bookTags) { - if (verbose >= 2) console.log(`. book: ${book.id}`); + if (verbose >= 2) { + console.log(`. book: ${book.id}`); + } const audio: BookCollectionAudioConfig[] = []; let chaptersLabels: { [key: string]: string } | undefined; for (const page of book.getElementsByTagName('page')) { - if (verbose >= 2) console.log(`.. page: ${page.attributes[0].value}`); + if (verbose >= 2) { + console.log(`.. page: ${page.attributes[0].value}`); + } const char = page.attributes.getNamedItem('char')?.value; if (char) { if (!chaptersLabels) { @@ -530,12 +577,16 @@ export function parseBookCollections(document: Document, verbose: number) { chaptersLabels[chapterNum] = char; } const audioTag = page.getElementsByTagName('audio')[0]; - if (!audioTag) continue; + if (!audioTag) { + continue; + } const fTag = audioTag.getElementsByTagName('f')[0]; if (verbose >= 2) { console.log(`... audioTag: ${audioTag.outerHTML}, fTag:${fTag?.outerHTML}`); } - if (!fTag) continue; + if (!fTag) { + continue; + } audio.push({ num: parseInt(page.attributes.getNamedItem('num')!.value), filename: fTag.innerHTML, @@ -548,7 +599,9 @@ export function parseBookCollections(document: Document, verbose: number) { src: fTag.attributes.getNamedItem('src')!.value, timingFile: audioTag.getElementsByTagName('y')[0]?.innerHTML }); - if (verbose >= 3) console.log(`.... audio: `, JSON.stringify(audio[0])); + if (verbose >= 3) { + console.log(`.... audio: `, JSON.stringify(audio[0])); + } } const bookFeaturesTag = book .querySelector('features[type=book]') @@ -588,7 +641,9 @@ export function parseBookCollections(document: Document, verbose: number) { const footerTags = book.getElementsByTagName('footer'); const footer = convertFooter(footerTags[0]?.innerHTML, document); - if (verbose >= 2) console.log(`.... footer: `, footer); + if (verbose >= 2) { + console.log(`.... footer: `, footer); + } const format = book.attributes.getNamedItem('format')?.value; const file = book.getElementsByTagName('f')[0]?.innerHTML; @@ -711,17 +766,25 @@ export function parseBookCollections(document: Document, verbose: number) { footer, bookTabs }); - if (verbose >= 3) console.log(`.... book: `, JSON.stringify(books[0])); + if (verbose >= 3) { + console.log(`.... book: `, JSON.stringify(books[0])); + } } const collectionNameTags = tag.getElementsByTagName('book-collection-name'); const collectionName = collectionNameTags[0].innerHTML.length ? collectionNameTags[0].innerHTML : undefined; - if (verbose >= 2) console.log(`.. collectionName: `, collectionName); + if (verbose >= 2) { + console.log(`.. collectionName: `, collectionName); + } const stylesTag = tag.getElementsByTagName('styles-info')[0]; - if (verbose >= 3) console.log(`.... styles: `, JSON.stringify(stylesTag)); + if (verbose >= 3) { + console.log(`.... styles: `, JSON.stringify(stylesTag)); + } const fontChoiceTag = tag.getElementsByTagName('font-choice')[0]; - if (verbose >= 3) console.log(`.... fontChoice: `, JSON.stringify(fontChoiceTag)); + if (verbose >= 3) { + console.log(`.... fontChoice: `, JSON.stringify(fontChoiceTag)); + } const fonts = fontChoiceTag ? Array.from(fontChoiceTag.getElementsByTagName('font-choice-family')) .filter((x) => fontFamilies.includes(x.innerHTML)) @@ -729,7 +792,9 @@ export function parseBookCollections(document: Document, verbose: number) { : []; const writingSystem = tag.getElementsByTagName('writing-system')[0]; - if (verbose >= 3) console.log(`.... writingSystem: `, JSON.stringify(writingSystem)); + if (verbose >= 3) { + console.log(`.... writingSystem: `, JSON.stringify(writingSystem)); + } if (!writingSystem) { throw `BookCollection "${collectionName}" missing writing-system`; } @@ -744,14 +809,20 @@ export function parseBookCollections(document: Document, verbose: number) { const collectionDescription = collectionDescriptionTags[0]?.innerHTML.length ? collectionDescriptionTags[0].innerHTML : undefined; - if (verbose >= 2) console.log(`.. collectionDescription: `, collectionDescription); + if (verbose >= 2) { + console.log(`.. collectionDescription: `, collectionDescription); + } const collectionAbbreviationTags = tag.getElementsByTagName('book-collection-abbrev'); const collectionAbbreviation = collectionAbbreviationTags[0]?.innerHTML.length ? collectionAbbreviationTags[0].innerHTML : undefined; - if (verbose >= 2) console.log(`.. collectionAbbreviation: `, collectionAbbreviation); + if (verbose >= 2) { + console.log(`.. collectionAbbreviation: `, collectionAbbreviation); + } const footer = convertCollectionFooter(tag, document); - if (verbose >= 2) console.log(`.. footer: `, footer); + if (verbose >= 2) { + console.log(`.. footer: `, footer); + } const collectionImageTags = tag.getElementsByTagName('image'); const collectionImage = collectionImageTags[0]?.innerHTML.length @@ -776,19 +847,21 @@ export function parseBookCollections(document: Document, verbose: number) { style: parseStylesInfo(stylesTag, verbose), styles }); - if (verbose >= 3) + if (verbose >= 3) { console.log( `.... collection: `, JSON.stringify(bookCollections[bookCollections.length - 1]) ); + } } - if (verbose) + if (verbose) { console.log( `Converted ${bookCollections.length} book collections with [${bookCollections .map((x) => x.books.length) .join(', ')}] books` ); + } return bookCollections; } @@ -814,10 +887,11 @@ export function parseInterfaceLanguages(document: Document, data: AppConfig, ver console.log(`.. writing system ${code}`); } } - if (verbose) + if (verbose) { console.log( `Converted ${Object.keys(interfaceLanguages.writingSystems).length} writing systems` ); + } return interfaceLanguages; } @@ -893,7 +967,7 @@ export function parseDictionaryWritingSystem( export function parseMenuLocalizations(document: Document, verbose: number) { const translationMappingsTags = document.getElementsByTagName('translation-mappings'); - let translationMappings: { + const translationMappings: { defaultLang: string; mappings: Record>; } = { @@ -906,20 +980,25 @@ export function parseMenuLocalizations(document: Document, verbose: number) { const translationMappingsTags = translationMappingsTag.getElementsByTagName('tm'); for (const tag of translationMappingsTags) { - if (verbose >= 2) console.log(`.. translationMapping: ${tag.id}`); + if (verbose >= 2) { + console.log(`.. translationMapping: ${tag.id}`); + } const localizations: Record = {}; for (const localization of tag.getElementsByTagName('t')) { localizations[localization.attributes.getNamedItem('lang')!.value] = decodeFromXml( localization.innerHTML ); } - if (verbose >= 3) console.log(`....`, JSON.stringify(localizations)); + if (verbose >= 3) { + console.log(`....`, JSON.stringify(localizations)); + } translationMappings.mappings[tag.id] = localizations; } - if (verbose) + if (verbose) { console.log( `Converted ${Object.keys(translationMappings.mappings).length} translation mappings` ); + } } return translationMappings; } @@ -929,7 +1008,9 @@ export function parseKeys(document: Document, verbose: number) { const keys = Array.from( document.getElementsByTagName('keys')[0].getElementsByTagName('key') ).map((key) => key.innerHTML); - if (verbose) console.log(`Converted ${keys.length} keys`); + if (verbose) { + console.log(`Converted ${keys.length} keys`); + } return keys; } @@ -981,13 +1062,15 @@ export function parseAnalytics(document: Document, verbose: number) { } } - if (verbose) console.log(`Converted ${analyticsElements.length} analytics elements`); + if (verbose) { + console.log(`Converted ${analyticsElements.length} analytics elements`); + } return analytics; } export function parseFirebase(document: Document, verbose: number) { const firebaseElements = document.getElementsByTagName('firebase'); - let firebase: { features: { [key: string]: any } } = { features: {} }; + const firebase: { features: { [key: string]: any } } = { features: {} }; // Iterate over firebaseElements and update data.firebase.features for (const firebaseElement of firebaseElements) { @@ -1008,7 +1091,9 @@ export function parseFirebase(document: Document, verbose: number) { } } - if (verbose) console.log(`Converted ${firebaseElements.length} firebase elements`); + if (verbose) { + console.log(`Converted ${firebaseElements.length} firebase elements`); + } return firebase; } @@ -1032,7 +1117,9 @@ export function parseAudioSources(document: Document, verbose: number) { if (audioSources?.length > 0) { for (const source of audioSources) { const id = source.getAttribute('id')!; - if (verbose >= 2) console.log(`Converting audioSource: ${id}`); + if (verbose >= 2) { + console.log(`Converting audioSource: ${id}`); + } const type = source.getAttribute('type')!; const name = source.getElementsByTagName('name')[0].innerHTML; @@ -1056,7 +1143,9 @@ export function parseAudioSources(document: Document, verbose: number) { sources[id].damId = source.getElementsByTagName('dam-id')[0].innerHTML; } } - if (verbose >= 3) console.log(`....`, JSON.stringify(sources[id])); + if (verbose >= 3) { + console.log(`....`, JSON.stringify(sources[id])); + } } // Audio files @@ -1066,7 +1155,9 @@ export function parseAudioSources(document: Document, verbose: number) { if (audioTags?.length > 0) { for (const tag of audioTags) { const fileEntry = tag.getElementsByTagName('filename')[0]; - if (!fileEntry) continue; + if (!fileEntry) { + continue; + } const filename = fileEntry.innerHTML; const src = fileEntry.getAttribute('src') ?? ''; @@ -1074,7 +1165,9 @@ export function parseAudioSources(document: Document, verbose: number) { } } } - if (verbose) console.log(`Converted ${audioSources?.length} audio sources`); + if (verbose) { + console.log(`Converted ${audioSources?.length} audio sources`); + } return { sources, files }; } @@ -1117,7 +1210,9 @@ export function parseVideos(document: Document, verbose: number) { }); } } - if (verbose) console.log(`Converted ${videoTags?.length} videos`); + if (verbose) { + console.log(`Converted ${videoTags?.length} videos`); + } return videos; } @@ -1155,20 +1250,24 @@ export function parseIllustrations(document: Document, verbose: number) { } } } - if (verbose) console.log(`Converted ${imagesTags?.length} illustrations`); + if (verbose) { + console.log(`Converted ${imagesTags?.length} illustrations`); + } return illustrations; } export function parseLayouts(document: Document, bookCollections: any, verbose: number) { const layoutRoot = document.getElementsByTagName('layouts')[0]; - let defaultLayout = layoutRoot?.getAttribute('default'); + const defaultLayout = layoutRoot?.getAttribute('default'); const layouts = []; const layoutTags = layoutRoot?.getElementsByTagName('layout'); if (layoutTags?.length > 0) { for (const layout of layoutTags) { const mode = layout.getAttribute('mode')!; - if (verbose >= 2) console.log(`Converting layout`, mode); + if (verbose >= 2) { + console.log(`Converting layout`, mode); + } const enabled = layout.getAttribute('enabled') === 'true'; @@ -1196,7 +1295,9 @@ export function parseLayouts(document: Document, bookCollections: any, verbose: }); } } - if (verbose) console.log(`Converted ${layoutTags?.length} layouts`); + if (verbose) { + console.log(`Converted ${layoutTags?.length} layouts`); + } return { layouts, defaultLayout }; } @@ -1214,7 +1315,9 @@ export function parseBackgroundImages(document: Document, verbose: number) { backgroundImages.push({ width, height, filename }); } } - if (verbose) console.log(`Converted ${backgroundImageTags?.length} background images`); + if (verbose) { + console.log(`Converted ${backgroundImageTags?.length} background images`); + } return backgroundImages; } @@ -1232,7 +1335,9 @@ export function parseWatermarkImages(document: Document, verbose: number) { watermarkImages.push({ width, height, filename }); } } - if (verbose) console.log(`Converted ${watermarkImageTags?.length} watermark images`); + if (verbose) { + console.log(`Converted ${watermarkImageTags?.length} watermark images`); + } return watermarkImages; } @@ -1244,8 +1349,12 @@ export function parseMenuItems(document: Document, type: string, verbose: number if (menuItemTags && menuItemTags?.length > 0) { for (const menuItem of menuItemTags) { const type = menuItem.attributes.getNamedItem('type')!.value; - if (verbose >= 2) console.log(`.. Converting menuItem: ${type}`); - if (verbose >= 3) console.log('.... menuItem:', menuItem.outerHTML); + if (verbose >= 2) { + console.log(`.. Converting menuItem: ${type}`); + } + if (verbose >= 3) { + console.log('.... menuItem:', menuItem.outerHTML); + } const titleTags = menuItem.getElementsByTagName('title')[0].getElementsByTagName('t'); const title: { [lang: string]: string } = {}; @@ -1293,7 +1402,9 @@ export function parseMenuItems(document: Document, type: string, verbose: number images }); - if (verbose >= 3) console.log(`....`, JSON.stringify(menuItems)); + if (verbose >= 3) { + console.log(`....`, JSON.stringify(menuItems)); + } } } @@ -1319,8 +1430,9 @@ export function parsePlans(document: Document, verbose: number) { for (const feature of featuresTag.getElementsByTagName('e')) { const name = feature.attributes.getNamedItem('name')!.value; const value = feature.attributes.getNamedItem('value')!.value; - if (verbose >= 2) + if (verbose >= 2) { console.log(`.. Converting feature: name=${name}, value=${value}`); + } features[name] = value; } } @@ -1363,7 +1475,9 @@ export function parsePlans(document: Document, verbose: number) { } } - if (verbose) console.log(`Converted ${plansTags.length} plans`); + if (verbose) { + console.log(`Converted ${plansTags.length} plans`); + } return { features, plans }; } diff --git a/convert/convertContents.ts b/convert/convertContents.ts index b64790d8c..7b907bc3e 100644 --- a/convert/convertContents.ts +++ b/convert/convertContents.ts @@ -189,12 +189,15 @@ export function convertContents( // standard SFM tags. scriptureConfig.bookCollections?.some((collection) => { - if (verbose) console.log(`Searching for ${linkTarget} in ${collection.id}`); + if (verbose) { + console.log(`Searching for ${linkTarget} in ${collection.id}`); + } const book = collection.books.find((x) => x.id === linkTarget); if (book && book.type) { // We found a book and the book.type is not default (i.e. undefined) - if (verbose) + if (verbose) { console.log(`Found ${linkTarget} in ${collection.id} as ${book.type}`); + } linkType = book.type; linkLocation = `${linkType}/${collection.id}/${linkTarget}`; return true; diff --git a/convert/convertFirebase.ts b/convert/convertFirebase.ts index 0caa05bdc..74dd480b8 100644 --- a/convert/convertFirebase.ts +++ b/convert/convertFirebase.ts @@ -12,7 +12,9 @@ export function convertFirebase(dataDir: string, verbose: number) { const srcFile = path.join(dataDir, 'firebase-config.js'); const srcExists = existsSync(srcFile); const dstFile = path.join('src', 'lib', 'data', 'firebase-config.js'); - if (verbose) console.log(`FirebaseConfig: path=${srcFile}, exists=${srcExists}`); + if (verbose) { + console.log(`FirebaseConfig: path=${srcFile}, exists=${srcExists}`); + } if (srcExists) { let content = readFileSync(srcFile, 'utf-8'); content = content.replace('const firebaseConfig', 'export const firebaseConfig'); diff --git a/convert/convertManifest.ts b/convert/convertManifest.ts index c025e8315..e568237a8 100644 --- a/convert/convertManifest.ts +++ b/convert/convertManifest.ts @@ -28,7 +28,9 @@ export function convertManifest(dataDir: string, verbose: number) { }) .join('\n'); writeFileSync(dstFile, updatedFileContents); - if (verbose) console.log(`converted ${srcFile} to ${dstFile}`); + if (verbose) { + console.log(`converted ${srcFile} to ${dstFile}`); + } } else { // If no manifest exists, we need to at least have a minimum manifest to build. const manifest = { diff --git a/convert/convertMedia.ts b/convert/convertMedia.ts index 69f0c3512..1f2756769 100644 --- a/convert/convertMedia.ts +++ b/convert/convertMedia.ts @@ -20,11 +20,17 @@ function cpSyncOptional(source: string, destination: string, opts?: CopySyncOpti function cloneDirectory(from: string, to: string, verbose: number, optional = false) { if (optional) { if (cpSyncOptional(from, to, { recursive: true })) { - if (verbose) console.log(`copied ${from} to ${to}`); - } else if (verbose) console.log(`no files found in ${from}`); + if (verbose) { + console.log(`copied ${from} to ${to}`); + } + } else if (verbose) { + console.log(`no files found in ${from}`); + } } else { cpSync(from, to, { recursive: true }); - if (verbose) console.log(`copied ${from} to ${to}`); + if (verbose) { + console.log(`copied ${from} to ${to}`); + } } } @@ -38,11 +44,14 @@ function cloneToAssets(from: string[], verbose: number) { recursive: true }) ) { - if (verbose) + if (verbose) { console.log( `copied ${path.join('data', f)} to ${path.join('static', 'assets', f)}` ); - } else if (verbose) console.log(`${path.join('data', f)} does not exist`); + } + } else if (verbose) { + console.log(`${path.join('data', f)} does not exist`); + } }); } @@ -108,7 +117,9 @@ export class ConvertMedia extends Task { await Promise.all( modifiedDirectories.map((p) => rimraf(path.join('static', p)).then(() => { - if (verbose) console.log(`removed ${path.join('static', p)}`); + if (verbose) { + console.log(`removed ${path.join('static', p)}`); + } return p; }) ) diff --git a/convert/convertReverseIndex.ts b/convert/convertReverseIndex.ts index 121ba4472..ee05632ee 100644 --- a/convert/convertReverseIndex.ts +++ b/convert/convertReverseIndex.ts @@ -53,7 +53,9 @@ export function convertReverseIndex( let latestLetter = makeEntryLetter(alphabet[0]); indexEntries.forEach((entry) => { - if (!entry || !entry[0]) return; + if (!entry || !entry[0]) { + return; + } const gloss = entry[0]; const firstLetter = getBaseLetter(gloss, alphabet); @@ -77,7 +79,9 @@ export function convertReverseIndex( for (let i = 0; i < entries.length; i++) { const [gloss, ids] = entries[i]; - if (!gloss || !ids) continue; + if (!gloss || !ids) { + continue; + } const idList = ids .split(',') @@ -146,7 +150,7 @@ export class ConvertReverseIndex extends Task { throw new Error('No writing systems found in config data'); } - let files: FileContent[] = []; + const files: FileContent[] = []; for (const lang in configOutput.data.writingSystems) { const writingSystem = configOutput.data.writingSystems[lang]; diff --git a/convert/convertSQLite.ts b/convert/convertSQLite.ts index a4647ee16..3adf14371 100644 --- a/convert/convertSQLite.ts +++ b/convert/convertSQLite.ts @@ -15,15 +15,23 @@ export function convertSQLite(dataDir: string, verbose: number) { const dstFileWasm = path.join(dstDirWasm, 'sql-wasm.wasm'); mkdirSync(dstDirWasm, { recursive: true }); copyFile(srcFileWasm, dstFileWasm, function (err: any) { - if (err) throw err; - if (verbose) console.log(`Copied ${srcFileWasm} to ${dstFileWasm}`); + if (err) { + throw err; + } + if (verbose) { + console.log(`Copied ${srcFileWasm} to ${dstFileWasm}`); + } }); const srcFileData = path.join(dataDir, 'data.sqlite'); const dstFileData = path.join('static', 'data.sqlite'); copyFile(srcFileData, dstFileData, function (err: any) { - if (err) throw err; - if (verbose) console.log(`Copied ${srcFileData} to ${dstFileData}`); + if (err) { + throw err; + } + if (verbose) { + console.log(`Copied ${srcFileData} to ${dstFileData}`); + } }); } diff --git a/convert/convertStyles.ts b/convert/convertStyles.ts index d75e9d9c2..2b5133964 100644 --- a/convert/convertStyles.ts +++ b/convert/convertStyles.ts @@ -23,7 +23,9 @@ export function convertStyles(dataDir: string, configData: ConfigTaskOutput, ver readdirSync(srcDir).forEach((file) => { const srcFile = path.join(srcDir, file); const dstFile = path.join(dstDir, file); - if (verbose) console.log('Converting: ', srcFile); + if (verbose) { + console.log('Converting: ', srcFile); + } let swapped = false; @@ -87,7 +89,9 @@ export function convertStyles(dataDir: string, configData: ConfigTaskOutput, ver function getTempStyles(configData: ConfigTaskOutput, verbose: number): string { const tempStyles: string[] = []; if (compareVersions(configData.data.programVersion!, '12.0') < 0) { - if (verbose) console.log('Add contents styles'); + if (verbose) { + console.log('Add contents styles'); + } tempStyles.push('div.contents-item-locked { position:relative; }'); tempStyles.push( "div.contents-item-locked::after { content: ''; position: absolute; top: 0; right: 0; width: 0; height: 0; border-left: 50px solid transparent; border-top: 50px solid yellow; background-size: cover; border-width: 70px; }" @@ -101,7 +105,9 @@ function getTempStyles(configData: ConfigTaskOutput, verbose: number): string { ); } if (compareVersions(configData.data.programVersion!, '12.6') < 0) { - if (verbose) console.log('Add plan styles'); + if (verbose) { + console.log('Add plan styles'); + } tempStyles.push( '.plan-days-scroller { overflow-x: scroll; white-space: nowrap; margin-top: 6px; margin-bottom: 6px; }' ); diff --git a/convert/index.ts b/convert/index.ts index 5fc1e9ab6..fdaa57b7b 100644 --- a/convert/index.ts +++ b/convert/index.ts @@ -125,10 +125,13 @@ if (process.argv.includes('--watch')) { Array.from(allPaths.values()).some( (p) => watchPath.startsWith(p + path.sep) || watchPath === p ) - ) + ) { console.log(`${watchPath} changed`); + } paths.push(watchPath); - if (timer) clearTimeout(timer); + if (timer) { + clearTimeout(timer); + } timer = setTimeout(async () => { if (firstRun) { firstRun = false; diff --git a/convert/tests/sab/convertConfigSAB.test.ts b/convert/tests/sab/convertConfigSAB.test.ts index f33cfef8f..6ab5c5e97 100644 --- a/convert/tests/sab/convertConfigSAB.test.ts +++ b/convert/tests/sab/convertConfigSAB.test.ts @@ -105,7 +105,8 @@ if (programType === 'DAB') { expect(bc.books).not.toHaveLength(0); for (const bk in bc.books) { const bkk = bc.books[bk]; - expect(bkk.chapters).not.toBe(0 || undefined); + expect(bkk.chapters).not.toBe(0); + expect(bkk.chapters).toBeDefined(); expect(bkk.chaptersN).not.toSatisfy((r) => r === '' || r === undefined); expect(bkk.id).not.toSatisfy((r) => r === '' || r === undefined); expect(bkk.name).not.toSatisfy((r) => r === '' || r === undefined); diff --git a/eslint.config.js b/eslint.config.js index 184612b3d..d0a3e34be 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -1,4 +1,67 @@ -export default [ +// eslint.config.js + +import js from '@eslint/js'; +import eslintConfigPrettier from 'eslint-config-prettier/flat'; // If you want to use eslint --inspect-config, rewrite as `flat.js`. +import svelte from 'eslint-plugin-svelte'; +import globals from 'globals'; +import ts from 'typescript-eslint'; +import svelteConfig from './svelte.config.js'; + +export default ts.config( + js.configs.recommended, + ...ts.configs.recommended, + ...svelte.configs.recommended, + ...svelte.configs.prettier, + eslintConfigPrettier, + { + languageOptions: { + globals: { + ...globals.browser, + ...globals.node + } + } + }, + { + files: ['**/*.svelte', '**/*.svelte.ts', '**/*.svelte.js'], + // See more details at: https://typescript-eslint.io/packages/parser/ + languageOptions: { + parserOptions: { + projectService: true, + extraFileExtensions: ['.svelte'], // Add support for additional file extensions, such as .svelte + parser: ts.parser, + // Specify a parser for each language, if needed: + // parser: { + // ts: ts.parser, + // js: espree, // Use espree for .js files (add: import espree from 'espree') + // typescript: ts.parser + // }, + + // We recommend importing and specifying svelte.config.js. + // By doing so, some rules in eslint-plugin-svelte will automatically read the configuration and adjust their behavior accordingly. + // While certain Svelte settings may be statically loaded from svelte.config.js even if you don’t specify it, + // explicitly specifying it ensures better compatibility and functionality. + svelteConfig + } + } + }, + { + rules: { + // Override or add rule settings here, such as: + // 'svelte/rule-name': 'error' + 'svelte/no-navigation-without-base': 'error', // Necessary since hash-based navigation. + 'svelte/no-dupe-style-properties': 'off', // Height is duplicated with dvh and vh for compatibility. + 'svelte/require-each-key': 'off', // Most each-blocks in this app do not have keys, and do not seem to need them. + 'svelte/no-unused-svelte-ignore': 'off', // Svelte ignores that are unused by eslint may be used by LSP. + '@typescript-eslint/no-explicit-any': 'off', + '@typescript-eslint/no-non-null-assertion': 'off', + 'no-tabs': 'error', + 'no-undef': 'off', // Covered by TS, and eslint false flags some globals + 'no-inner-declarations': 'off', + '@typescript-eslint/no-unused-vars': 'off', + 'no-self-assign': 'off', + curly: 'error' + } + }, { ignores: [ '.DS_Store', @@ -18,5 +81,13 @@ export default [ 'package-lock.json', 'yarn.lock' ] + }, + + // Ignore certain rules for typescript config + { + files: ['tailwind.config.cjs'], + rules: { + '@typescript-eslint/no-require-imports': 'off' + } } -]; +); diff --git a/example/index.ts b/example/index.ts index b16b545ea..8035d77ac 100644 --- a/example/index.ts +++ b/example/index.ts @@ -22,10 +22,11 @@ const getExecutionCommand = (program: string): string => { javaPath = path.join(process.env['JAVA_HOME'], 'bin', 'java'); } switch (os.platform()) { - case 'darwin': + case 'darwin': { const appPath = `/Applications/${appName}.app/Contents`; javaPath = `"${appPath}/Plugins/zulu-17.jdk/Contents/Home/jre/bin/java"`; return `${javaPath} -jar "${appPath}/Resources/Java/bin/${jarName}"`; + } case 'win32': { const programFilesX86 = process.env['ProgramFiles(x86)']; if (!programFilesX86) { diff --git a/package-lock.json b/package-lock.json index 2aa77fc98..3fc3c0b7b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,7 +8,9 @@ "name": "appbuilder-pwa", "version": "0.0.1", "dependencies": { - "sql.js": "^1.13.0" + "globals": "^16.3.0", + "sql.js": "^1.13.0", + "typescript-eslint": "^8.36.0" }, "devDependencies": { "@esbuild-plugins/node-globals-polyfill": "^0.2.3", @@ -20,16 +22,15 @@ "@types/jsdom": "^21", "@types/node": "^22", "@types/unzipper": "^0.10.10", - "@typescript-eslint/eslint-plugin": "^8", - "@typescript-eslint/parser": "^8", + "@typescript-eslint/eslint-plugin": "^8.36.0", + "@typescript-eslint/parser": "^8.36.0", "@vitest/ui": "^2", "autoprefixer": "^10.4.7", "concurrently": "^9.1.2", "daisyui": "^4", - "eslint": "^9", - "eslint-config-prettier": "^9", - "eslint-plugin-prettier": "^5", - "eslint-plugin-svelte": "^2.45.1", + "eslint": "^9.30.1", + "eslint-config-prettier": "^10.1.5", + "eslint-plugin-svelte": "^3.10.1", "fflate": "^0.8", "firebase": "^10.12.2", "idb": "^8", @@ -41,7 +42,7 @@ "proskomma-json-tools": "^0.9", "proskomma-tools": "^0.0.5", "rimraf": "^6", - "svelte": "^5", + "svelte": "^5.35.5", "svelte-check": "^4.1.1", "svelte-eslint-parser": "^0.43", "svelte-gestures": "5.0.7", @@ -752,6 +753,16 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-transform-classes/node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, "node_modules/@babel/plugin-transform-computed-properties": { "version": "7.25.9", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.25.9.tgz", @@ -1571,6 +1582,16 @@ "node": ">=6.9.0" } }, + "node_modules/@babel/traverse/node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, "node_modules/@babel/types": { "version": "7.26.5", "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.5.tgz", @@ -2139,10 +2160,10 @@ } }, "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.1.tgz", - "integrity": "sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==", - "dev": true, + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.7.0.tgz", + "integrity": "sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==", + "license": "MIT", "dependencies": { "eslint-visitor-keys": "^3.4.3" }, @@ -2160,18 +2181,17 @@ "version": "4.12.1", "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", - "dev": true, "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, "node_modules/@eslint/config-array": { - "version": "0.19.1", - "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.19.1.tgz", - "integrity": "sha512-fo6Mtm5mWyKjA/Chy1BYTdn5mGJoDNjC7C64ug20ADsRDGrA85bN3uK3MaKbeRkRuuIEAR5N33Jr1pbm411/PA==", - "dev": true, + "version": "0.21.0", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.0.tgz", + "integrity": "sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ==", + "license": "Apache-2.0", "dependencies": { - "@eslint/object-schema": "^2.1.5", + "@eslint/object-schema": "^2.1.6", "debug": "^4.3.1", "minimatch": "^3.1.2" }, @@ -2180,10 +2200,10 @@ } }, "node_modules/@eslint/config-array/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -2193,7 +2213,7 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -2201,11 +2221,20 @@ "node": "*" } }, + "node_modules/@eslint/config-helpers": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.3.0.tgz", + "integrity": "sha512-ViuymvFmcJi04qdZeDc2whTHryouGcDlaxPqarTD0ZE10ISpxGUVZGZDx4w01upyIynL3iu6IXH2bS1NhclQMw==", + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, "node_modules/@eslint/core": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.10.0.tgz", - "integrity": "sha512-gFHJ+xBOo4G3WRlR1e/3G8A6/KZAH6zcE/hkLRCZTi/B9avAG365QhFA8uOGzTMqgTghpn7/fSnscW++dpMSAw==", - "dev": true, + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.14.0.tgz", + "integrity": "sha512-qIbV0/JZr7iSDjqAc60IqbLdsj9GDt16xQtWD+B78d/HAlvysGdZZ6rpJHGAc2T0FQx1X6thsSPdnoiGKdNtdg==", + "license": "Apache-2.0", "dependencies": { "@types/json-schema": "^7.0.15" }, @@ -2214,10 +2243,10 @@ } }, "node_modules/@eslint/eslintrc": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.2.0.tgz", - "integrity": "sha512-grOjVNN8P3hjJn/eIETF1wwd12DdnwFDoyceUJLYYdkpbwq3nLi+4fqrTAONx7XDALqlL220wC/RHSC/QTI/0w==", - "dev": true, + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.1.tgz", + "integrity": "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==", + "license": "MIT", "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", @@ -2237,10 +2266,10 @@ } }, "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -2250,7 +2279,7 @@ "version": "14.0.0", "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", - "dev": true, + "license": "MIT", "engines": { "node": ">=18" }, @@ -2262,7 +2291,7 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -2271,36 +2300,51 @@ } }, "node_modules/@eslint/js": { - "version": "9.18.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.18.0.tgz", - "integrity": "sha512-fK6L7rxcq6/z+AaQMtiFTkvbHkBLNlwyRxHpKawP0x3u9+NC6MQTnFW+AdpwC6gfHTW0051cokQgtTN2FqlxQA==", - "dev": true, + "version": "9.30.1", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.30.1.tgz", + "integrity": "sha512-zXhuECFlyep42KZUhWjfvsmXGX39W8K8LFb8AWXM9gSV9dQB+MrJGLKvW6Zw0Ggnbpw0VHTtrhFXYe3Gym18jg==", + "license": "MIT", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" } }, "node_modules/@eslint/object-schema": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.5.tgz", - "integrity": "sha512-o0bhxnL89h5Bae5T318nFoFzGy+YE5i/gGkoPAgkmTVdRKTiv3p8JHevPiPaMwoloKfEiiaHlawCqaZMqRm+XQ==", - "dev": true, + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.6.tgz", + "integrity": "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==", + "license": "Apache-2.0", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, "node_modules/@eslint/plugin-kit": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.5.tgz", - "integrity": "sha512-lB05FkqEdUg2AA0xEbUz0SnkXT1LcCTa438W4IWTUh4hdOnVbQyOJ81OrDXsJk/LSiJHubgGEFoR5EHq1NsH1A==", - "dev": true, + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.3.3.tgz", + "integrity": "sha512-1+WqvgNMhmlAambTvT3KPtCl/Ibr68VldY2XY40SL1CE0ZXiakFR/cbTspaF5HsnpDMvcYYoJHfl4980NBjGag==", + "license": "Apache-2.0", "dependencies": { - "@eslint/core": "^0.10.0", + "@eslint/core": "^0.15.1", "levn": "^0.4.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, + "node_modules/@eslint/plugin-kit/node_modules/@eslint/core": { + "version": "0.15.1", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.15.1.tgz", + "integrity": "sha512-bkOp+iumZCCbt1K1CmWf0R9pM5yKpDv+ZXtvSyQpudrI9kuFLp+bM2WOPXImuD/ceQuaa8f5pj93Y7zyECIGNA==", + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, "node_modules/@firebase/analytics": { "version": "0.10.8", "resolved": "https://registry.npmjs.org/@firebase/analytics/-/analytics-0.10.8.tgz", @@ -2967,7 +3011,6 @@ "version": "0.19.1", "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", - "dev": true, "engines": { "node": ">=18.18.0" } @@ -2976,7 +3019,6 @@ "version": "0.16.6", "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz", "integrity": "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==", - "dev": true, "dependencies": { "@humanfs/core": "^0.19.1", "@humanwhocodes/retry": "^0.3.0" @@ -2989,7 +3031,6 @@ "version": "0.3.1", "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz", "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==", - "dev": true, "engines": { "node": ">=18.18" }, @@ -3002,7 +3043,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true, "engines": { "node": ">=12.22" }, @@ -3012,10 +3052,10 @@ } }, "node_modules/@humanwhocodes/retry": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.1.tgz", - "integrity": "sha512-c7hNEllBlenFTHBky65mhq8WD2kbN9Q6gk0bTk8lSBvc554jpXSkST1iePudpt7+A/AQvuHs9EMqjHDXMY1lrA==", - "dev": true, + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", + "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", + "license": "Apache-2.0", "engines": { "node": ">=18.18" }, @@ -3115,7 +3155,6 @@ "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" @@ -3128,7 +3167,6 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, "engines": { "node": ">= 8" } @@ -3137,7 +3175,6 @@ "version": "1.2.8", "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" @@ -3156,18 +3193,6 @@ "node": ">=14" } }, - "node_modules/@pkgr/core": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.1.1.tgz", - "integrity": "sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==", - "dev": true, - "engines": { - "node": "^12.20.0 || ^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/unts" - } - }, "node_modules/@polka/url": { "version": "1.0.0-next.28", "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.28.tgz", @@ -3485,6 +3510,16 @@ "win32" ] }, + "node_modules/@sveltejs/acorn-typescript": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@sveltejs/acorn-typescript/-/acorn-typescript-1.0.5.tgz", + "integrity": "sha512-IwQk4yfwLdibDlrXVE04jTZYlLnwsTT2PIOQQGNLWfjavGifnk1JD1LcZjZaBTRcxZu2FfPfNLOE04DSu9lqtQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^8.9.0" + } + }, "node_modules/@sveltejs/adapter-static": { "version": "3.0.8", "resolved": "https://registry.npmjs.org/@sveltejs/adapter-static/-/adapter-static-3.0.8.tgz", @@ -3612,8 +3647,7 @@ "node_modules/@types/estree": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", - "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", - "dev": true + "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==" }, "node_modules/@types/jsdom": { "version": "21.1.7", @@ -3630,7 +3664,7 @@ "version": "7.0.15", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", - "dev": true + "license": "MIT" }, "node_modules/@types/node": { "version": "22.10.7", @@ -3657,20 +3691,20 @@ } }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.20.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.20.0.tgz", - "integrity": "sha512-naduuphVw5StFfqp4Gq4WhIBE2gN1GEmMUExpJYknZJdRnc+2gDzB8Z3+5+/Kv33hPQRDGzQO/0opHE72lZZ6A==", - "dev": true, + "version": "8.36.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.36.0.tgz", + "integrity": "sha512-lZNihHUVB6ZZiPBNgOQGSxUASI7UJWhT8nHyUGCnaQ28XFCw98IfrMCG3rUl1uwUWoAvodJQby2KTs79UTcrAg==", + "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.20.0", - "@typescript-eslint/type-utils": "8.20.0", - "@typescript-eslint/utils": "8.20.0", - "@typescript-eslint/visitor-keys": "8.20.0", + "@typescript-eslint/scope-manager": "8.36.0", + "@typescript-eslint/type-utils": "8.36.0", + "@typescript-eslint/utils": "8.36.0", + "@typescript-eslint/visitor-keys": "8.36.0", "graphemer": "^1.4.0", - "ignore": "^5.3.1", + "ignore": "^7.0.0", "natural-compare": "^1.4.0", - "ts-api-utils": "^2.0.0" + "ts-api-utils": "^2.1.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -3680,21 +3714,30 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0", + "@typescript-eslint/parser": "^8.36.0", "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <5.8.0" + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", + "license": "MIT", + "engines": { + "node": ">= 4" } }, "node_modules/@typescript-eslint/parser": { - "version": "8.20.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.20.0.tgz", - "integrity": "sha512-gKXG7A5HMyjDIedBi6bUrDcun8GIjnI8qOwVLiY3rx6T/sHP/19XLJOnIq/FgQvWLHja5JN/LSE7eklNBr612g==", - "dev": true, - "dependencies": { - "@typescript-eslint/scope-manager": "8.20.0", - "@typescript-eslint/types": "8.20.0", - "@typescript-eslint/typescript-estree": "8.20.0", - "@typescript-eslint/visitor-keys": "8.20.0", + "version": "8.36.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.36.0.tgz", + "integrity": "sha512-FuYgkHwZLuPbZjQHzJXrtXreJdFMKl16BFYyRrLxDhWr6Qr7Kbcu2s1Yhu8tsiMXw1S0W1pjfFfYEt+R604s+Q==", + "license": "MIT", + "dependencies": { + "@typescript-eslint/scope-manager": "8.36.0", + "@typescript-eslint/types": "8.36.0", + "@typescript-eslint/typescript-estree": "8.36.0", + "@typescript-eslint/visitor-keys": "8.36.0", "debug": "^4.3.4" }, "engines": { @@ -3706,17 +3749,38 @@ }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <5.8.0" + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/@typescript-eslint/project-service": { + "version": "8.36.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.36.0.tgz", + "integrity": "sha512-JAhQFIABkWccQYeLMrHadu/fhpzmSQ1F1KXkpzqiVxA/iYI6UnRt2trqXHt1sYEcw1mxLnB9rKMsOxXPxowN/g==", + "license": "MIT", + "dependencies": { + "@typescript-eslint/tsconfig-utils": "^8.36.0", + "@typescript-eslint/types": "^8.36.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <5.9.0" } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.20.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.20.0.tgz", - "integrity": "sha512-J7+VkpeGzhOt3FeG1+SzhiMj9NzGD/M6KoGn9f4dbz3YzK9hvbhVTmLj/HiTp9DazIzJ8B4XcM80LrR9Dm1rJw==", - "dev": true, + "version": "8.36.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.36.0.tgz", + "integrity": "sha512-wCnapIKnDkN62fYtTGv2+RY8FlnBYA3tNm0fm91kc2BjPhV2vIjwwozJ7LToaLAyb1ca8BxrS7vT+Pvvf7RvqA==", + "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.20.0", - "@typescript-eslint/visitor-keys": "8.20.0" + "@typescript-eslint/types": "8.36.0", + "@typescript-eslint/visitor-keys": "8.36.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -3726,16 +3790,32 @@ "url": "https://opencollective.com/typescript-eslint" } }, + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.36.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.36.0.tgz", + "integrity": "sha512-Nhh3TIEgN18mNbdXpd5Q8mSCBnrZQeY9V7Ca3dqYvNDStNIGRmJA6dmrIPMJ0kow3C7gcQbpsG2rPzy1Ks/AnA==", + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <5.9.0" + } + }, "node_modules/@typescript-eslint/type-utils": { - "version": "8.20.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.20.0.tgz", - "integrity": "sha512-bPC+j71GGvA7rVNAHAtOjbVXbLN5PkwqMvy1cwGeaxUoRQXVuKCebRoLzm+IPW/NtFFpstn1ummSIasD5t60GA==", - "dev": true, + "version": "8.36.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.36.0.tgz", + "integrity": "sha512-5aaGYG8cVDd6cxfk/ynpYzxBRZJk7w/ymto6uiyUFtdCozQIsQWh7M28/6r57Fwkbweng8qAzoMCPwSJfWlmsg==", + "license": "MIT", "dependencies": { - "@typescript-eslint/typescript-estree": "8.20.0", - "@typescript-eslint/utils": "8.20.0", + "@typescript-eslint/typescript-estree": "8.36.0", + "@typescript-eslint/utils": "8.36.0", "debug": "^4.3.4", - "ts-api-utils": "^2.0.0" + "ts-api-utils": "^2.1.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -3746,14 +3826,14 @@ }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <5.8.0" + "typescript": ">=4.8.4 <5.9.0" } }, "node_modules/@typescript-eslint/types": { - "version": "8.20.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.20.0.tgz", - "integrity": "sha512-cqaMiY72CkP+2xZRrFt3ExRBu0WmVitN/rYPZErA80mHjHx/Svgp8yfbzkJmDoQ/whcytOPO9/IZXnOc+wigRA==", - "dev": true, + "version": "8.36.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.36.0.tgz", + "integrity": "sha512-xGms6l5cTJKQPZOKM75Dl9yBfNdGeLRsIyufewnxT4vZTrjC0ImQT4fj8QmtJK84F58uSh5HVBSANwcfiXxABQ==", + "license": "MIT", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, @@ -3763,19 +3843,21 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.20.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.20.0.tgz", - "integrity": "sha512-Y7ncuy78bJqHI35NwzWol8E0X7XkRVS4K4P4TCyzWkOJih5NDvtoRDW4Ba9YJJoB2igm9yXDdYI/+fkiiAxPzA==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "8.20.0", - "@typescript-eslint/visitor-keys": "8.20.0", + "version": "8.36.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.36.0.tgz", + "integrity": "sha512-JaS8bDVrfVJX4av0jLpe4ye0BpAaUW7+tnS4Y4ETa3q7NoZgzYbN9zDQTJ8kPb5fQ4n0hliAt9tA4Pfs2zA2Hg==", + "license": "MIT", + "dependencies": { + "@typescript-eslint/project-service": "8.36.0", + "@typescript-eslint/tsconfig-utils": "8.36.0", + "@typescript-eslint/types": "8.36.0", + "@typescript-eslint/visitor-keys": "8.36.0", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", "minimatch": "^9.0.4", "semver": "^7.6.0", - "ts-api-utils": "^2.0.0" + "ts-api-utils": "^2.1.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -3785,19 +3867,19 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "typescript": ">=4.8.4 <5.8.0" + "typescript": ">=4.8.4 <5.9.0" } }, "node_modules/@typescript-eslint/utils": { - "version": "8.20.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.20.0.tgz", - "integrity": "sha512-dq70RUw6UK9ei7vxc4KQtBRk7qkHZv447OUZ6RPQMQl71I3NZxQJX/f32Smr+iqWrB02pHKn2yAdHBb0KNrRMA==", - "dev": true, + "version": "8.36.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.36.0.tgz", + "integrity": "sha512-VOqmHu42aEMT+P2qYjylw6zP/3E/HvptRwdn/PZxyV27KhZg2IOszXod4NcXisWzPAGSS4trE/g4moNj6XmH2g==", + "license": "MIT", "dependencies": { - "@eslint-community/eslint-utils": "^4.4.0", - "@typescript-eslint/scope-manager": "8.20.0", - "@typescript-eslint/types": "8.20.0", - "@typescript-eslint/typescript-estree": "8.20.0" + "@eslint-community/eslint-utils": "^4.7.0", + "@typescript-eslint/scope-manager": "8.36.0", + "@typescript-eslint/types": "8.36.0", + "@typescript-eslint/typescript-estree": "8.36.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -3808,17 +3890,17 @@ }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <5.8.0" + "typescript": ">=4.8.4 <5.9.0" } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.20.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.20.0.tgz", - "integrity": "sha512-v/BpkeeYAsPkKCkR8BDwcno0llhzWVqPOamQrAEMdpZav2Y9OVjd9dwJyBLJWwf335B5DmlifECIkZRJCaGaHA==", - "dev": true, + "version": "8.36.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.36.0.tgz", + "integrity": "sha512-vZrhV2lRPWDuGoxcmrzRZyxAggPL+qp3WzUrlZD+slFueDiYHxeBa34dUXPuC0RmGKzl4lS5kFJYvKCq9cnNDA==", + "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.20.0", - "eslint-visitor-keys": "^4.2.0" + "@typescript-eslint/types": "8.36.0", + "eslint-visitor-keys": "^4.2.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -3829,10 +3911,10 @@ } }, "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", - "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", - "dev": true, + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "license": "Apache-2.0", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, @@ -3942,10 +4024,10 @@ } }, "node_modules/acorn": { - "version": "8.14.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", - "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", - "dev": true, + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "license": "MIT", "bin": { "acorn": "bin/acorn" }, @@ -3957,20 +4039,10 @@ "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, - "node_modules/acorn-typescript": { - "version": "1.4.13", - "resolved": "https://registry.npmjs.org/acorn-typescript/-/acorn-typescript-1.4.13.tgz", - "integrity": "sha512-xsc9Xv0xlVfwp2o7sQ+GCQ1PgbkdcpWdTzrwXxO3xDMTAywVS3oXVOcOHuRjAPkS4P9b+yc/qNF15460v+jp4Q==", - "dev": true, - "peerDependencies": { - "acorn": ">=8.9.0" - } - }, "node_modules/acorn-walk": { "version": "8.3.4", "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", @@ -3996,7 +4068,7 @@ "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, + "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -4024,7 +4096,6 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -4064,7 +4135,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true + "license": "Python-2.0" }, "node_modules/aria-query": { "version": "5.3.2", @@ -4227,8 +4298,7 @@ "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, "node_modules/base-64": { "version": "1.0.0", @@ -4297,7 +4367,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, "dependencies": { "balanced-match": "^1.0.0" } @@ -4306,7 +4375,6 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "dev": true, "dependencies": { "fill-range": "^7.1.1" }, @@ -4430,7 +4498,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, + "license": "MIT", "engines": { "node": ">=6" } @@ -4484,7 +4552,6 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -4500,7 +4567,6 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -4659,7 +4725,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, "dependencies": { "color-name": "~1.1.4" }, @@ -4670,8 +4735,7 @@ "node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, "node_modules/combined-stream": { "version": "1.0.8", @@ -4697,8 +4761,7 @@ "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" }, "node_modules/concurrently": { "version": "9.1.2", @@ -4780,7 +4843,6 @@ "version": "7.0.6", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", - "dev": true, "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -4904,7 +4966,6 @@ "version": "4.4.0", "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", - "dev": true, "dependencies": { "ms": "^2.1.3" }, @@ -4973,8 +5034,7 @@ "node_modules/deep-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==" }, "node_modules/deepmerge": { "version": "4.3.1", @@ -5304,7 +5364,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, "engines": { "node": ">=10" }, @@ -5313,21 +5372,22 @@ } }, "node_modules/eslint": { - "version": "9.18.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.18.0.tgz", - "integrity": "sha512-+waTfRWQlSbpt3KWE+CjrPPYnbq9kfZIYUqapc0uBXyjTp8aYXZDsUH16m39Ryq3NjAVP4tjuF7KaukeqoCoaA==", - "dev": true, + "version": "9.30.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.30.1.tgz", + "integrity": "sha512-zmxXPNMOXmwm9E0yQLi5uqXHs7uq2UIiqEKo3Gq+3fwo1XrJ+hijAZImyF7hclW3E6oHz43Yk3RP8at6OTKflQ==", + "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.12.1", - "@eslint/config-array": "^0.19.0", - "@eslint/core": "^0.10.0", - "@eslint/eslintrc": "^3.2.0", - "@eslint/js": "9.18.0", - "@eslint/plugin-kit": "^0.2.5", + "@eslint/config-array": "^0.21.0", + "@eslint/config-helpers": "^0.3.0", + "@eslint/core": "^0.14.0", + "@eslint/eslintrc": "^3.3.1", + "@eslint/js": "9.30.1", + "@eslint/plugin-kit": "^0.3.1", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", - "@humanwhocodes/retry": "^0.4.1", + "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", "@types/json-schema": "^7.0.15", "ajv": "^6.12.4", @@ -5335,9 +5395,9 @@ "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^8.2.0", - "eslint-visitor-keys": "^4.2.0", - "espree": "^10.3.0", + "eslint-scope": "^8.4.0", + "eslint-visitor-keys": "^4.2.1", + "espree": "^10.4.0", "esquery": "^1.5.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", @@ -5371,89 +5431,48 @@ } } }, - "node_modules/eslint-compat-utils": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/eslint-compat-utils/-/eslint-compat-utils-0.5.1.tgz", - "integrity": "sha512-3z3vFexKIEnjHE3zCMRo6fn/e44U7T1khUjg+Hp0ZQMCigh28rALD0nPFBcGZuiLC5rLZa2ubQHDRln09JfU2Q==", - "dev": true, - "dependencies": { - "semver": "^7.5.4" - }, - "engines": { - "node": ">=12" - }, - "peerDependencies": { - "eslint": ">=6.0.0" - } - }, "node_modules/eslint-config-prettier": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz", - "integrity": "sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==", + "version": "10.1.5", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-10.1.5.tgz", + "integrity": "sha512-zc1UmCpNltmVY34vuLRV61r1K27sWuX39E+uyUnY8xS2Bex88VV9cugG+UZbRSRGtGyFboj+D8JODyme1plMpw==", "dev": true, + "license": "MIT", "bin": { "eslint-config-prettier": "bin/cli.js" }, - "peerDependencies": { - "eslint": ">=7.0.0" - } - }, - "node_modules/eslint-plugin-prettier": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.2.2.tgz", - "integrity": "sha512-1yI3/hf35wmlq66C8yOyrujQnel+v5l1Vop5Cl2I6ylyNTT1JbuUUnV3/41PzwTzcyDp/oF0jWE3HXvcH5AQOQ==", - "dev": true, - "dependencies": { - "prettier-linter-helpers": "^1.0.0", - "synckit": "^0.9.1" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, "funding": { - "url": "https://opencollective.com/eslint-plugin-prettier" + "url": "https://opencollective.com/eslint-config-prettier" }, "peerDependencies": { - "@types/eslint": ">=8.0.0", - "eslint": ">=8.0.0", - "eslint-config-prettier": "*", - "prettier": ">=3.0.0" - }, - "peerDependenciesMeta": { - "@types/eslint": { - "optional": true - }, - "eslint-config-prettier": { - "optional": true - } + "eslint": ">=7.0.0" } }, "node_modules/eslint-plugin-svelte": { - "version": "2.46.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-svelte/-/eslint-plugin-svelte-2.46.1.tgz", - "integrity": "sha512-7xYr2o4NID/f9OEYMqxsEQsCsj4KaMy4q5sANaKkAb6/QeCjYFxRmDm2S3YC3A3pl1kyPZ/syOx/i7LcWYSbIw==", + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-svelte/-/eslint-plugin-svelte-3.10.1.tgz", + "integrity": "sha512-csCh2x0ge/DugXC7dCANh46Igi7bjMZEy6rHZCdS13AoGVJSu7a90Kru3I8oMYLGEemPRE1hQXadxvRPVMAAXQ==", "dev": true, + "license": "MIT", "dependencies": { - "@eslint-community/eslint-utils": "^4.4.0", - "@jridgewell/sourcemap-codec": "^1.4.15", - "eslint-compat-utils": "^0.5.1", + "@eslint-community/eslint-utils": "^4.6.1", + "@jridgewell/sourcemap-codec": "^1.5.0", "esutils": "^2.0.3", - "known-css-properties": "^0.35.0", - "postcss": "^8.4.38", + "globals": "^16.0.0", + "known-css-properties": "^0.37.0", + "postcss": "^8.4.49", "postcss-load-config": "^3.1.4", - "postcss-safe-parser": "^6.0.0", - "postcss-selector-parser": "^6.1.0", - "semver": "^7.6.2", - "svelte-eslint-parser": "^0.43.0" + "postcss-safe-parser": "^7.0.0", + "semver": "^7.6.3", + "svelte-eslint-parser": "^1.2.0" }, "engines": { - "node": "^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "url": "https://github.com/sponsors/ota-meshi" }, "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0-0 || ^9.0.0-0", + "eslint": "^8.57.1 || ^9.0.0", "svelte": "^3.37.0 || ^4.0.0 || ^5.0.0" }, "peerDependenciesMeta": { @@ -5462,11 +5481,25 @@ } } }, + "node_modules/eslint-plugin-svelte/node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, "node_modules/eslint-plugin-svelte/node_modules/postcss-selector-parser": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", - "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", "dev": true, + "license": "MIT", "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -5475,11 +5508,40 @@ "node": ">=4" } }, - "node_modules/eslint-scope": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.2.0.tgz", - "integrity": "sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A==", + "node_modules/eslint-plugin-svelte/node_modules/svelte-eslint-parser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/svelte-eslint-parser/-/svelte-eslint-parser-1.2.0.tgz", + "integrity": "sha512-mbPtajIeuiyU80BEyGvwAktBeTX7KCr5/0l+uRGLq1dafwRNrjfM5kHGJScEBlPG3ipu6dJqfW/k0/fujvIEVw==", "dev": true, + "license": "MIT", + "dependencies": { + "eslint-scope": "^8.2.0", + "eslint-visitor-keys": "^4.0.0", + "espree": "^10.0.0", + "postcss": "^8.4.49", + "postcss-scss": "^4.0.9", + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://github.com/sponsors/ota-meshi" + }, + "peerDependencies": { + "svelte": "^3.37.0 || ^4.0.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "svelte": { + "optional": true + } + } + }, + "node_modules/eslint-scope": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", + "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", + "license": "BSD-2-Clause", "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" @@ -5495,7 +5557,6 @@ "version": "3.4.3", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, @@ -5507,17 +5568,16 @@ "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "node_modules/eslint/node_modules/eslint-visitor-keys": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", - "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", - "dev": true, + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "license": "Apache-2.0", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, @@ -5529,7 +5589,6 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, "dependencies": { "brace-expansion": "^1.1.7" }, @@ -5544,14 +5603,14 @@ "dev": true }, "node_modules/espree": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-10.3.0.tgz", - "integrity": "sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==", - "dev": true, + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", + "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", + "license": "BSD-2-Clause", "dependencies": { - "acorn": "^8.14.0", + "acorn": "^8.15.0", "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^4.2.0" + "eslint-visitor-keys": "^4.2.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -5561,10 +5620,10 @@ } }, "node_modules/espree/node_modules/eslint-visitor-keys": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", - "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", - "dev": true, + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "license": "Apache-2.0", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, @@ -5576,7 +5635,6 @@ "version": "1.6.0", "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", - "dev": true, "dependencies": { "estraverse": "^5.1.0" }, @@ -5585,10 +5643,11 @@ } }, "node_modules/esrap": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/esrap/-/esrap-1.4.3.tgz", - "integrity": "sha512-Xddc1RsoFJ4z9nR7W7BFaEPIp4UXoeQ0+077UdWLxbafMQFyU79sQJMk7kxNgRwQ9/aVgaKacCHC2pUACGwmYw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/esrap/-/esrap-2.1.0.tgz", + "integrity": "sha512-yzmPNpl7TBbMRC5Lj2JlJZNPml0tzqoqP5B1JXycNUwtqma9AKCO0M2wHrdgsHcy1WRW7S9rJknAMtByg3usgA==", "dev": true, + "license": "MIT", "dependencies": { "@jridgewell/sourcemap-codec": "^1.4.15" } @@ -5597,7 +5656,6 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, "dependencies": { "estraverse": "^5.2.0" }, @@ -5609,7 +5667,6 @@ "version": "5.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, "engines": { "node": ">=4.0" } @@ -5624,7 +5681,6 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -5641,20 +5697,12 @@ "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "node_modules/fast-diff": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", - "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", - "dev": true + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" }, "node_modules/fast-glob": { "version": "3.3.3", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", - "dev": true, "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", @@ -5670,7 +5718,6 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, "dependencies": { "is-glob": "^4.0.1" }, @@ -5682,13 +5729,12 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true + "license": "MIT" }, "node_modules/fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==" }, "node_modules/fast-uri": { "version": "3.0.5", @@ -5716,7 +5762,6 @@ "version": "1.18.0", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.18.0.tgz", "integrity": "sha512-QKHXPW0hD8g4UET03SdOdunzSouc9N4AuHdsX8XNcTsuz+yYFILVNIX4l9yHABMhiEI9Db0JTTIpu0wB+Y1QQw==", - "dev": true, "dependencies": { "reusify": "^1.0.4" } @@ -5743,7 +5788,6 @@ "version": "8.0.0", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", - "dev": true, "dependencies": { "flat-cache": "^4.0.0" }, @@ -5755,7 +5799,6 @@ "version": "7.1.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "dev": true, "dependencies": { "to-regex-range": "^5.0.1" }, @@ -5767,7 +5810,6 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" @@ -5819,7 +5861,6 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", - "dev": true, "dependencies": { "flatted": "^3.2.9", "keyv": "^4.5.4" @@ -5831,8 +5872,7 @@ "node_modules/flatted": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.2.tgz", - "integrity": "sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==", - "dev": true + "integrity": "sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==" }, "node_modules/for-each": { "version": "0.3.3", @@ -6026,7 +6066,6 @@ "version": "6.0.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, "dependencies": { "is-glob": "^4.0.3" }, @@ -6050,12 +6089,15 @@ } }, "node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true, + "version": "16.3.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-16.3.0.tgz", + "integrity": "sha512-bqWEnJ1Nt3neqx2q5SFfGS8r/ahumIakg3HcwtNlrVlwXIeNumWn/c7Pn/wKzGhf6SaW6H6uWXLqC30STCMchQ==", + "license": "MIT", "engines": { - "node": ">=4" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/gopd": { @@ -6079,8 +6121,7 @@ "node_modules/graphemer": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", - "dev": true + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==" }, "node_modules/graphql": { "version": "16.10.0", @@ -6107,7 +6148,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, "engines": { "node": ">=8" } @@ -6268,16 +6308,15 @@ "version": "5.3.2", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", - "dev": true, "engines": { "node": ">= 4" } }, "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "license": "MIT", "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" @@ -6303,7 +6342,6 @@ "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true, "engines": { "node": ">=0.8.19" } @@ -6451,7 +6489,6 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -6487,7 +6524,6 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, "dependencies": { "is-extglob": "^2.1.1" }, @@ -6511,7 +6547,6 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, "engines": { "node": ">=0.12.0" } @@ -6677,8 +6712,7 @@ "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" }, "node_modules/jackspeak": { "version": "4.0.2", @@ -6699,7 +6733,7 @@ "version": "1.21.7", "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz", "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==", - "dev": true, + "devOptional": true, "bin": { "jiti": "bin/jiti.js" } @@ -6714,7 +6748,7 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, + "license": "MIT", "dependencies": { "argparse": "^2.0.1" }, @@ -6777,20 +6811,18 @@ "node_modules/json-buffer": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==" }, "node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true + "license": "MIT" }, "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==" }, "node_modules/json5": { "version": "2.2.3", @@ -6820,7 +6852,6 @@ "version": "4.5.4", "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", - "dev": true, "dependencies": { "json-buffer": "3.0.1" } @@ -6835,16 +6866,16 @@ } }, "node_modules/known-css-properties": { - "version": "0.35.0", - "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.35.0.tgz", - "integrity": "sha512-a/RAk2BfKk+WFGhhOCAYqSiFLc34k8Mt/6NWRI4joER0EYUzXIcFivjjnoD3+XU1DggLn/tZc3DOAgke7l8a4A==", - "dev": true + "version": "0.37.0", + "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.37.0.tgz", + "integrity": "sha512-JCDrsP4Z1Sb9JwG0aJ8Eo2r7k4Ou5MwmThS/6lcIe1ICyb7UBJKGRIUUdqc2ASdE/42lgz6zFUnzAIhtXnBVrQ==", + "dev": true, + "license": "MIT" }, "node_modules/levn": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" @@ -6878,7 +6909,6 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, "dependencies": { "p-locate": "^5.0.0" }, @@ -6928,8 +6958,7 @@ "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" }, "node_modules/long": { "version": "5.2.4", @@ -6977,7 +7006,6 @@ "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, "engines": { "node": ">= 8" } @@ -6986,7 +7014,6 @@ "version": "4.0.8", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", - "dev": true, "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" @@ -7020,7 +7047,6 @@ "version": "9.0.5", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, "dependencies": { "brace-expansion": "^2.0.1" }, @@ -7061,8 +7087,7 @@ "node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" }, "node_modules/mz": { "version": "2.7.0", @@ -7096,8 +7121,7 @@ "node_modules/natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==" }, "node_modules/node-int64": { "version": "0.4.0", @@ -7226,7 +7250,6 @@ "version": "0.9.4", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", - "dev": true, "dependencies": { "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", @@ -7243,7 +7266,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, "dependencies": { "yocto-queue": "^0.1.0" }, @@ -7258,7 +7280,6 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, "dependencies": { "p-limit": "^3.0.2" }, @@ -7279,7 +7300,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, + "license": "MIT", "dependencies": { "callsites": "^3.0.0" }, @@ -7328,7 +7349,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, "engines": { "node": ">=8" } @@ -7337,7 +7357,6 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, "engines": { "node": ">=8" } @@ -7398,7 +7417,6 @@ "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, "engines": { "node": ">=8.6" }, @@ -7574,19 +7592,30 @@ } }, "node_modules/postcss-safe-parser": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-6.0.0.tgz", - "integrity": "sha512-FARHN8pwH+WiS2OPCxJI8FuRJpTVnn6ZNFiqAM2aeW2LwTHWWmWgIyKC6cUo0L8aeKiF/14MNvnpls6R2PBeMQ==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-7.0.1.tgz", + "integrity": "sha512-0AioNCJZ2DPYz5ABT6bddIqlhgwhpHZ/l65YAYo0BCIn0xiDpsnTHz0gnoTGk0OXZW0JRs+cDwL8u/teRdz+8A==", "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss-safe-parser" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", "engines": { - "node": ">=12.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" + "node": ">=18.0" }, "peerDependencies": { - "postcss": "^8.3.3" + "postcss": "^8.4.31" } }, "node_modules/postcss-scss": { @@ -7638,7 +7667,6 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true, "engines": { "node": ">= 0.8.0" } @@ -7658,18 +7686,6 @@ "url": "https://github.com/prettier/prettier?sponsor=1" } }, - "node_modules/prettier-linter-helpers": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", - "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", - "dev": true, - "dependencies": { - "fast-diff": "^1.1.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, "node_modules/prettier-plugin-svelte": { "version": "3.3.3", "resolved": "https://registry.npmjs.org/prettier-plugin-svelte/-/prettier-plugin-svelte-3.3.3.tgz", @@ -7822,7 +7838,6 @@ "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "dev": true, "engines": { "node": ">=6" } @@ -7840,7 +7855,6 @@ "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, "funding": [ { "type": "github", @@ -8056,7 +8070,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, + "license": "MIT", "engines": { "node": ">=4" } @@ -8074,7 +8088,6 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true, "engines": { "iojs": ">=1.0.0", "node": ">=0.10.0" @@ -8186,7 +8199,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, "funding": [ { "type": "github", @@ -8291,7 +8303,6 @@ "version": "7.6.3", "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "dev": true, "bin": { "semver": "bin/semver.js" }, @@ -8341,7 +8352,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, "dependencies": { "shebang-regex": "^3.0.0" }, @@ -8353,7 +8363,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, "engines": { "node": ">=8" } @@ -8638,7 +8647,7 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, + "license": "MIT", "engines": { "node": ">=8" }, @@ -8747,21 +8756,22 @@ } }, "node_modules/svelte": { - "version": "5.19.0", - "resolved": "https://registry.npmjs.org/svelte/-/svelte-5.19.0.tgz", - "integrity": "sha512-qvd2GvvYnJxS/MteQKFSMyq8cQrAAut28QZ39ySv9k3ggmhw4Au4Rfcsqva74i0xMys//OhbhVCNfXPrDzL/Bg==", + "version": "5.35.5", + "resolved": "https://registry.npmjs.org/svelte/-/svelte-5.35.5.tgz", + "integrity": "sha512-KuRvI82rhh0RMz1EKsUJD96gZyHJ+h2+8zrwO8iqE/p/CmcNKvIItDUAeUePhuCDgtegDJmF8IKThbHIfmTgTA==", "dev": true, + "license": "MIT", "dependencies": { "@ampproject/remapping": "^2.3.0", "@jridgewell/sourcemap-codec": "^1.5.0", + "@sveltejs/acorn-typescript": "^1.0.5", "@types/estree": "^1.0.5", "acorn": "^8.12.1", - "acorn-typescript": "^1.4.13", "aria-query": "^5.3.1", "axobject-query": "^4.1.0", "clsx": "^2.1.1", "esm-env": "^1.2.1", - "esrap": "^1.4.3", + "esrap": "^2.1.0", "is-reference": "^3.0.3", "locate-character": "^3.0.0", "magic-string": "^0.30.11", @@ -8949,22 +8959,6 @@ "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", "dev": true }, - "node_modules/synckit": { - "version": "0.9.2", - "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.9.2.tgz", - "integrity": "sha512-vrozgXDQwYO72vHjUb/HnFbQx1exDjoKzqx23aXEg2a9VIg2TSFZ8FmeZpTjUCFMYw7mpX4BE2SFu8wI7asYsw==", - "dev": true, - "dependencies": { - "@pkgr/core": "^0.1.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/unts" - } - }, "node_modules/tailwindcss": { "version": "3.4.17", "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.17.tgz", @@ -9231,7 +9225,6 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, "dependencies": { "is-number": "^7.0.0" }, @@ -9282,10 +9275,10 @@ } }, "node_modules/ts-api-utils": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.0.0.tgz", - "integrity": "sha512-xCt/TOAc+EOHS1XPnijD3/yzpH6qg2xppZO1YDqGoVsNXfQfzHpOdNuXwrwOU8u4ITXJyDCTyt8w5g1sZv9ynQ==", - "dev": true, + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz", + "integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==", + "license": "MIT", "engines": { "node": ">=18.12" }, @@ -9800,7 +9793,6 @@ "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, "dependencies": { "prelude-ls": "^1.2.1" }, @@ -9812,7 +9804,6 @@ "version": "5.7.3", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.3.tgz", "integrity": "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==", - "dev": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -9821,6 +9812,28 @@ "node": ">=14.17" } }, + "node_modules/typescript-eslint": { + "version": "8.36.0", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.36.0.tgz", + "integrity": "sha512-fTCqxthY+h9QbEgSIBfL9iV6CvKDFuoxg6bHPNpJ9HIUzS+jy2lCEyCmGyZRWEBSaykqcDPf1SJ+BfCI8DRopA==", + "license": "MIT", + "dependencies": { + "@typescript-eslint/eslint-plugin": "8.36.0", + "@typescript-eslint/parser": "8.36.0", + "@typescript-eslint/utils": "8.36.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.9.0" + } + }, "node_modules/undici": { "version": "6.19.7", "resolved": "https://registry.npmjs.org/undici/-/undici-6.19.7.tgz", @@ -9932,7 +9945,7 @@ "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, + "license": "BSD-2-Clause", "dependencies": { "punycode": "^2.1.0" } @@ -11206,7 +11219,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, "dependencies": { "isexe": "^2.0.0" }, @@ -11294,7 +11306,6 @@ "version": "1.2.5", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -11540,7 +11551,6 @@ "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, "engines": { "node": ">=10" }, diff --git a/package.json b/package.json index c5944b204..a9bd67e7d 100644 --- a/package.json +++ b/package.json @@ -33,16 +33,15 @@ "@types/jsdom": "^21", "@types/node": "^22", "@types/unzipper": "^0.10.10", - "@typescript-eslint/eslint-plugin": "^8", - "@typescript-eslint/parser": "^8", + "@typescript-eslint/eslint-plugin": "^8.36.0", + "@typescript-eslint/parser": "^8.36.0", "@vitest/ui": "^2", "autoprefixer": "^10.4.7", "concurrently": "^9.1.2", "daisyui": "^4", - "eslint": "^9", - "eslint-config-prettier": "^9", - "eslint-plugin-prettier": "^5", - "eslint-plugin-svelte": "^2.45.1", + "eslint": "^9.30.1", + "eslint-config-prettier": "^10.1.5", + "eslint-plugin-svelte": "^3.10.1", "fflate": "^0.8", "firebase": "^10.12.2", "idb": "^8", @@ -54,7 +53,7 @@ "proskomma-json-tools": "^0.9", "proskomma-tools": "^0.0.5", "rimraf": "^6", - "svelte": "^5", + "svelte": "^5.35.5", "svelte-check": "^4.1.1", "svelte-eslint-parser": "^0.43", "svelte-gestures": "5.0.7", @@ -65,7 +64,9 @@ "typescript": "^5.5.0", "unzipper": "^0.12.3", "vite": "^6", - "vitest": "^2" + "vitest": "^2", + "globals": "^16.3.0", + "typescript-eslint": "^8.36.0" }, "volta": { "node": "20.9.0" diff --git a/src/app.d.ts b/src/app.d.ts index 43e784ba6..9c33c8f75 100644 --- a/src/app.d.ts +++ b/src/app.d.ts @@ -92,7 +92,6 @@ declare namespace App { } declare namespace svelte.JSX { - // eslint-disable-next-line @typescript-eslint/no-unused-vars interface HTMLProps { onoutclick?: () => void; } diff --git a/src/lib/components/AudioBar.svelte b/src/lib/components/AudioBar.svelte index 246d094b2..406a9a704 100644 --- a/src/lib/components/AudioBar.svelte +++ b/src/lib/components/AudioBar.svelte @@ -40,7 +40,9 @@ TODO: } function seekAudio(event) { - if (!$audioPlayer.loaded) return; + if (!$audioPlayer.loaded) { + return; + } const progressBar = document.getElementById('progress-bar'); const percent = (event.clientX - progressBar.offsetLeft) / progressBar.offsetWidth; // Set the current time of the audio element to the corresponding time based on the percent diff --git a/src/lib/components/BottomNavigationBar.svelte b/src/lib/components/BottomNavigationBar.svelte index 7e8d088fc..50a16af8f 100644 --- a/src/lib/components/BottomNavigationBar.svelte +++ b/src/lib/components/BottomNavigationBar.svelte @@ -68,10 +68,11 @@ } function handleClick(buttonType, link) { switch (buttonType) { - case 'contents': + case 'contents': { let gotoLink = link && link !== '' ? link : '1'; gotoRoute(`/contents/${gotoLink}`); break; + } case 'about': gotoRoute(`/about`); break; diff --git a/src/lib/components/FontList.svelte b/src/lib/components/FontList.svelte index c4ff3baf0..63d20cfd9 100644 --- a/src/lib/components/FontList.svelte +++ b/src/lib/components/FontList.svelte @@ -32,7 +32,7 @@ Font list component. ? $themeColors['ButtonSelectedColor'] : ''} style:color={$monoIconColor} - style:font-famly={font} + style:font-family={font} role="button" > {config.fonts.find((x) => x.family === font).name} diff --git a/src/lib/components/HistoryCard.svelte b/src/lib/components/HistoryCard.svelte index 731922286..f94073b49 100644 --- a/src/lib/components/HistoryCard.svelte +++ b/src/lib/components/HistoryCard.svelte @@ -27,6 +27,7 @@ TODO: function onHistoryClick() { if (history.url) { + // eslint-disable-next-line svelte/no-navigation-without-base goto(history.url); } else { refs.set({ diff --git a/src/lib/components/HorizontalPanes.svelte b/src/lib/components/HorizontalPanes.svelte index d8649ec18..ba2e64a42 100644 --- a/src/lib/components/HorizontalPanes.svelte +++ b/src/lib/components/HorizontalPanes.svelte @@ -22,7 +22,9 @@ heavily modified because it did not support more than 2 panes and touch was not * @type {any | null} */ let curr = null; const onPointerdown = (/** @type PointerEvent */ e, /** @type number*/ i) => { - if (e.cancelable) e.preventDefault(); + if (e.cancelable) { + e.preventDefault(); + } curr = { e, i: i, @@ -32,8 +34,12 @@ heavily modified because it did not support more than 2 panes and touch was not }; }; const onPointermove = (/** @type PointerEvent */ e) => { - if (e.cancelable) e.preventDefault(); - if (curr === null) return; + if (e.cancelable) { + e.preventDefault(); + } + if (curr === null) { + return; + } /**i is tedious to replace with curr.i*/ const i = curr.i; //calculate distance in px to move edge and slider var deltaX = Math.min( @@ -52,12 +58,17 @@ heavily modified because it did not support more than 2 panes and touch was not widths[i + 1] = (sum * (100 - sliders[i])) / 100; //adjust neighboring sliders if they exist - if (i > 0) sliders[i - 1] = (100 * widths[i - 1]) / (widths[i - 1] + widths[i]); - if (i < sliders.length) + if (i > 0) { + sliders[i - 1] = (100 * widths[i - 1]) / (widths[i - 1] + widths[i]); + } + if (i < sliders.length) { sliders[i + 1] = (100 * widths[i + 1]) / (widths[i + 1] + widths[i + 2]); + } }; const onPointerup = (/** @type PointerEvent */ e) => { - if (e && e.cancelable) e.preventDefault(); + if (e && e.cancelable) { + e.preventDefault(); + } curr = null; }; diff --git a/src/lib/components/HtmlBookView.svelte b/src/lib/components/HtmlBookView.svelte index 462b53e91..c49ae3caf 100644 --- a/src/lib/components/HtmlBookView.svelte +++ b/src/lib/components/HtmlBookView.svelte @@ -42,5 +42,6 @@ Display an HTML Book.
+ {@html htmlBody}
diff --git a/src/lib/components/LexiconEntryView.svelte b/src/lib/components/LexiconEntryView.svelte index 1d84d8822..f19063890 100644 --- a/src/lib/components/LexiconEntryView.svelte +++ b/src/lib/components/LexiconEntryView.svelte @@ -34,7 +34,9 @@ } function formatXmlByClass(xmlString) { - if (!xmlString) return ''; + if (!xmlString) { + return ''; + } const parser = new DOMParser(); const xmlDoc = parser.parseFromString(xmlString, 'text/xml'); @@ -195,7 +197,9 @@ .replace(/margin-left:\s*4em;?/g, '') .trim(); - if (cleaned && !cleaned.endsWith(';')) cleaned += ';'; + if (cleaned && !cleaned.endsWith(';')) { + cleaned += ';'; + } cleaned += ' margin-left: -1.1em;'; style = cleaned; @@ -222,4 +226,8 @@
{@html xmlData}
+ style="background-color: var(--BackgroundColor); color: var(--TextColor);"> + + + {@html xmlData} + diff --git a/src/lib/components/ScriptureViewSofria.svelte b/src/lib/components/ScriptureViewSofria.svelte index 8383d8b35..71b7f3ca3 100644 --- a/src/lib/components/ScriptureViewSofria.svelte +++ b/src/lib/components/ScriptureViewSofria.svelte @@ -10,6 +10,8 @@ LOGGING: { "scripture" : {"root": 1, "docResult": 1, "document":1, "paragraph": 1, "phrase" :1 , "chapter": 1, "verses": 1, "text": 1, "sequence": 1, "wrapper":1, "milestone":1, "blockGraft": 1, "inlineGraft": 1, "mark": 1, "meta": 1, "row": 1} } --> diff --git a/src/lib/data/analytics.ts b/src/lib/data/analytics.ts index b636cd799..120cec44f 100644 --- a/src/lib/data/analytics.ts +++ b/src/lib/data/analytics.ts @@ -87,9 +87,9 @@ export function logShareApp(appName, appVersion, appType) { } export function logShareContent( - contentType: String, - bookCol: String, - bookAbbrev: String, + contentType: string, + bookCol: string, + bookAbbrev: string, reference: string ) { // include reference info (bookCol, bookAbbrev, verses selected) diff --git a/src/lib/data/annotation-share.ts b/src/lib/data/annotation-share.ts index ac743ee38..d746f3a38 100644 --- a/src/lib/data/annotation-share.ts +++ b/src/lib/data/annotation-share.ts @@ -17,12 +17,12 @@ function title() { } export async function shareAnnotation(annotation: any) { - let text = annotation.reference + '\n' + annotation.text; + const text = annotation.reference + '\n' + annotation.text; await shareText(title(), text, SHARE_FILE_NAME); } export async function shareAnnotations(annotations: any) { - let text = + const text = config.name + '\n\n' + annotations.map((item) => `${item.reference}\n${item.text}`).join('\n\n'); diff --git a/src/lib/data/audio.ts b/src/lib/data/audio.ts index c03d73bd2..3cdeb2ea4 100644 --- a/src/lib/data/audio.ts +++ b/src/lib/data/audio.ts @@ -72,18 +72,18 @@ function createAudio(audioSource: string): HTMLAudioElement { const audio: HTMLAudioElement = new Audio(); // If you do 'new Audio(audioSource)', it won't look at additional sources - var source = document.createElement('source'); + const source = document.createElement('source'); source.src = audioSource; audio.appendChild(source); // webm isn't supported by MobileSafari, so add fallback for caf and mp3 (like static PWA) if (/\.webm$/i.test(audioSource)) { // Create additional source elements - var sourceCaf = document.createElement('source'); + const sourceCaf = document.createElement('source'); sourceCaf.src = audioSource.replace(/\.webm$/i, '.caf'); sourceCaf.type = 'audio/x-caf'; - var sourceMp3 = document.createElement('source'); + const sourceMp3 = document.createElement('source'); sourceMp3.src = audioSource.replace(/\.webm$/i, '.mp3'); sourceMp3.type = 'audio/mpeg'; @@ -92,7 +92,7 @@ function createAudio(audioSource: string): HTMLAudioElement { audio.appendChild(sourceMp3); } else if (/\.3gp$/i.test(audioSource)) { // Create additional source elements - var sourceMp3 = document.createElement('source'); + const sourceMp3 = document.createElement('source'); sourceMp3.src = audioSource.replace(/\.3gp$/i, '.mp3'); sourceMp3.type = 'audio/mpeg'; @@ -128,7 +128,9 @@ async function getAudio() { } // plays or pauses the audio export function playPause() { - if (!currentAudioPlayer.loaded) return; + if (!currentAudioPlayer.loaded) { + return; + } if (currentAudioPlayer.playing === true) { pause(); } else { @@ -137,7 +139,9 @@ export function playPause() { audioPlayerStore.set(currentAudioPlayer); } export function playStop() { - if (!currentAudioPlayer.loaded) return; + if (!currentAudioPlayer.loaded) { + return; + } if (currentAudioPlayer.playing === true) { pause(); } @@ -149,16 +153,22 @@ export async function skip(direction) { } // formats timing information export function format(seconds) { - if (isNaN(seconds)) return '0:00'; + if (isNaN(seconds)) { + return '0:00'; + } const minutes = Math.floor(seconds / 60); seconds = Math.floor(seconds % 60); - if (seconds < 10) seconds = '0' + seconds; + if (seconds < 10) { + seconds = '0' + seconds; + } return `${minutes}:${seconds}`; } // changes the phrase of the audio export async function changeVerse(direction) { - if (!currentAudioPlayer.loaded) return; + if (!currentAudioPlayer.loaded) { + return; + } const playing = currentAudioPlayer.playing; pause(); if (direction >= 0) { @@ -338,7 +348,9 @@ export function hasAudioPlayed() { return currentAudioPlayer.progress > 0; } function pause() { - if (!currentAudioPlayer.loaded) return; + if (!currentAudioPlayer.loaded) { + return; + } if (currentAudioPlayer.playing) { currentAudioPlayer.audio?.pause(); logAudioDuration(currentAudioPlayer); @@ -348,7 +360,9 @@ function pause() { } export function play() { - if (!currentAudioPlayer.loaded) return; + if (!currentAudioPlayer.loaded) { + return; + } if (!currentAudioPlayer.playing) { currentAudioPlayer.audio?.play(); currentAudioPlayer.playStart = Date.now(); @@ -360,7 +374,6 @@ export function play() { // selects the tag to highlight function updateHighlights() { const highlights = []; - let tag = ''; for (let i = 0; i < currentAudioPlayer.timing.length; i++) { const timing = currentAudioPlayer.timing[i]; if ( @@ -477,7 +490,7 @@ export function seekToVerse(verseClicked) { for (let i = 0; i < elements.length; i++) { const tag = currentAudioPlayer.timing[i].tag; // Handle timing tags that are just the verse number - let containsAlpha = /[a-z]/.test(tag); + const containsAlpha = /[a-z]/.test(tag); const adjustedTag = containsAlpha ? tag : tag + 'a'; if (verseClicked === adjustedTag) { const newtime = currentAudioPlayer.timing[i].starttime; diff --git a/src/lib/data/catalogData.ts b/src/lib/data/catalogData.ts index c66189d21..887b040ff 100644 --- a/src/lib/data/catalogData.ts +++ b/src/lib/data/catalogData.ts @@ -13,7 +13,7 @@ export interface CatalogData { toc: string; toc2: string; toc3: string; - sequences: {}[]; + sequences: object[]; hasIntroduction: boolean; versesByChapters: { [chapter: string]: { @@ -21,8 +21,8 @@ export interface CatalogData { }; }; }[]; - tags: {}; - quizzes: {}; + tags: object; + quizzes: object; htmlBooks?: { id: string; name: string; diff --git a/src/lib/data/highlights.ts b/src/lib/data/highlights.ts index 32e3aea2d..e39bea4c0 100644 --- a/src/lib/data/highlights.ts +++ b/src/lib/data/highlights.ts @@ -67,7 +67,7 @@ export async function addHighlights( //isHighlight = false; - for (var i = 0; i < verseCount; i++) { + for (let i = 0; i < verseCount; i++) { const selectedVerse = selectedVerses[i]; const index = await findHighlight({ ...selectedVerse }); @@ -122,7 +122,7 @@ export async function removeHighlight(date: number) { export async function removeHighlights(selectedVerses) { const verseCount = selectedVerses.length; - for (var i = 0; i < verseCount; i++) { + for (let i = 0; i < verseCount; i++) { const selectedVerse = selectedVerses[i]; let index = await findHighlight({ ...selectedVerse }); // Could be highlighted with multiple colors, remove all diff --git a/src/lib/data/history.ts b/src/lib/data/history.ts index 9035910b5..86502a83f 100644 --- a/src/lib/data/history.ts +++ b/src/lib/data/history.ts @@ -45,7 +45,7 @@ export async function addHistory( }, callback?: (addedItem: HistoryItem) => void ) { - let history = await openHistory(); + const history = await openHistory(); if (nextTimer) { clearTimeout(nextTimer); nextTimer = null; @@ -64,7 +64,7 @@ export async function addHistory( } export async function clearHistory() { - let history = await openHistory(); + const history = await openHistory(); await history.clear('history'); } diff --git a/src/lib/data/language.ts b/src/lib/data/language.ts index e151560cc..ca6fd5c07 100644 --- a/src/lib/data/language.ts +++ b/src/lib/data/language.ts @@ -18,7 +18,7 @@ export function findLanguage(desired: string, available: string[]): string { let bestSimilarity = 0; let bestMatch: string = null; available.forEach((lang) => { - let similarity = compareLanguages(lang, desired); + const similarity = compareLanguages(lang, desired); if (similarity > bestSimilarity) { bestSimilarity = similarity; bestMatch = lang; @@ -37,7 +37,7 @@ export function findBestLanguage( ): string { let best = fallback; for (let i = 0; i < preferred.length; i++) { - let match = findLanguage(preferred[i], available); + const match = findLanguage(preferred[i], available); if (match !== null) { best = match; break; @@ -66,8 +66,8 @@ export function getDefaultLanguage(): string { * fr (Completely different) */ function compareLanguages(lang1: string, lang2: string): number { - let parts1 = lang1.split('-'); - let parts2 = lang2.split('-'); + const parts1 = lang1.split('-'); + const parts2 = lang2.split('-'); const n = Math.min(parts1.length, parts2.length); for (let i = 0; i < n; i++) { if (parts1[i] !== parts2[i]) { diff --git a/src/lib/data/mrucache.ts b/src/lib/data/mrucache.ts index 88ecc5279..d66856ab3 100644 --- a/src/lib/data/mrucache.ts +++ b/src/lib/data/mrucache.ts @@ -37,7 +37,7 @@ export class MRUCache { print(): void { console.log('Cache Contents:'); - for (let [key, value] of this.cache) { + for (const [key, value] of this.cache) { console.log(`${key}:`, value); } } diff --git a/src/lib/data/navigation.test.ts b/src/lib/data/navigation.test.ts index fc92a187f..0c338cc3b 100644 --- a/src/lib/data/navigation.test.ts +++ b/src/lib/data/navigation.test.ts @@ -246,7 +246,7 @@ describe('goToInitial', async () => { describe('custom start reference', async () => { // Make a deep copy of the config, then change mainFeatures property. - let config2 = JSON.parse(JSON.stringify(config)); + const config2 = JSON.parse(JSON.stringify(config)); config2['mainFeatures'] = { 'start-at-reference': 'grc_C02.MAT.1' }; const navContext2 = new TestNavigationContext(getTestCatalog, config2); @@ -271,7 +271,7 @@ describe('goToInitial', async () => { describe('custom start reference - book and chapter only', async () => { // Make a deep copy of the config, then change mainFeatures property. - let config2 = JSON.parse(JSON.stringify(config)); + const config2 = JSON.parse(JSON.stringify(config)); config2['mainFeatures'] = { 'start-at-reference': 'MRK.2' }; const navContext2 = new TestNavigationContext(getTestCatalog, config2); @@ -456,7 +456,7 @@ describe('goTo', () => { }); test('If book collection has no audio, no chapter has audio', async () => { - let config2 = JSON.parse(JSON.stringify(config)); + const config2 = JSON.parse(JSON.stringify(config)); config2.traits['has-audio'] = false; const navContext = new TestNavigationContext(getTestCatalog, config2); await navContext.gotoInitial(); diff --git a/src/lib/data/scripture.js b/src/lib/data/scripture.js index 8718a16f3..e34791dbf 100644 --- a/src/lib/data/scripture.js +++ b/src/lib/data/scripture.js @@ -70,6 +70,8 @@ export async function loadDocSetIfNotLoaded(proskomma, docSet, fetch) { if (!found) { try { await loadDocSet(proskomma, docSet, fetch); - } catch (e) {} + } catch (e) { + // Ignore errors + } } } diff --git a/src/lib/data/stores/collection.ts b/src/lib/data/stores/collection.ts index 49119471f..3372a89ee 100644 --- a/src/lib/data/stores/collection.ts +++ b/src/lib/data/stores/collection.ts @@ -19,7 +19,9 @@ function createInitCollections(): App.CollectionGroup { const initCollections: App.CollectionGroup = {}; for (const layout of layouts) { - if (!layout.enabled) continue; + if (!layout.enabled) { + continue; + } const collections: App.CollectionEntry[] = layout.layoutCollections.map((collectionId) => findCollection(collectionId) ); diff --git a/src/lib/data/stores/scripture.js b/src/lib/data/stores/scripture.js index 08b7b8bc7..bc5275f1a 100644 --- a/src/lib/data/stores/scripture.js +++ b/src/lib/data/stores/scripture.js @@ -108,9 +108,11 @@ export async function getVerseText(item, item2 = undefined) { } export const docSet = derived(refs, ($refs) => $refs.docSet); + /* * glossary is returning a Promise */ +/* eslint-disable-next-line svelte/no-store-async */ export const glossary = derived(docSet, async ($docSet) => { const proskomma = get(pk); await loadDocSetIfNotLoaded(proskomma, $docSet, fetch); @@ -168,12 +170,16 @@ export const currentFonts = writable(JSON.parse(localStorage.currentFonts)); currentFonts.subscribe((fonts) => (localStorage.currentFonts = JSON.stringify(fonts))); export const currentFont = derived([refs, currentFonts], ([$refs, $currentFonts]) => { - if (!$refs.initialized) return config.fonts[0].family; + if (!$refs.initialized) { + return config.fonts[0].family; + } return $currentFonts[$refs.collection]; }); export const fontChoices = derived(refs, ($refs) => { - if (!$refs.initialized) return []; + if (!$refs.initialized) { + return []; + } const bookFonts = config.bookCollections .find((x) => x.id === $refs.collection) .books.find((x) => x.id === $refs.book)?.fonts; diff --git a/src/lib/data/stores/store-types.js b/src/lib/data/stores/store-types.js index 67d6f7942..6544c2b12 100644 --- a/src/lib/data/stores/store-types.js +++ b/src/lib/data/stores/store-types.js @@ -12,7 +12,7 @@ export const groupStore = (/**@type{any}*/ groupType, /**@type{any}*/ props) => /**@type{any}*/ const subs = { default: [] }; const subscribe = (cb, key = 'default') => { - if (!stores.hasOwnProperty(key)) { + if (!Object.prototype.hasOwnProperty.call(stores, key)) { stores[key] = groupType(props); unsubs[key] = stores[key].subscribe((v) => (vals[key] = v)); subs[key] = []; diff --git a/src/lib/data/stores/theme.js b/src/lib/data/stores/theme.js index 36088a306..a5ccda320 100644 --- a/src/lib/data/stores/theme.js +++ b/src/lib/data/stores/theme.js @@ -54,13 +54,13 @@ export const s = derived(themeColors, ($themeColors) => { return config.styles.reduce((styleProperties, style) => { const properties = style.properties; let newProperties = { ...properties }; - if (newProperties.hasOwnProperty('background-color')) { + if (Object.prototype.hasOwnProperty.call(newProperties, 'background-color')) { newProperties['background-color'] = resolveColor( newProperties['background-color'], $themeColors ); } - if (newProperties.hasOwnProperty('color')) { + if (Object.prototype.hasOwnProperty.call(newProperties, 'color')) { newProperties['color'] = resolveColor(newProperties['color'], $themeColors); } styleProperties[style.name] = newProperties; diff --git a/src/lib/navigate/index.ts b/src/lib/navigate/index.ts index 5e257aa35..95ea64059 100644 --- a/src/lib/navigate/index.ts +++ b/src/lib/navigate/index.ts @@ -7,6 +7,7 @@ import { refs } from '$lib/data/stores'; import { get } from 'svelte/store'; export function gotoRoute(route: string) { + // eslint-disable-next-line svelte/no-navigation-without-base return goto(getRoute(route)); } @@ -20,6 +21,7 @@ function logHistoryItemAdded(itemAdded: HistoryItem) { export function navigateToUrl(item: { collection: string; book: string; url: string }) { addHistory({ ...item, chapter: '' }, logHistoryItemAdded); + // eslint-disable-next-line svelte/no-navigation-without-base goto(item.url); } diff --git a/src/lib/scripts/query.js b/src/lib/scripts/query.js index 8411c0a4e..869246037 100644 --- a/src/lib/scripts/query.js +++ b/src/lib/scripts/query.js @@ -11,7 +11,9 @@ export const query = async (query, cb) => { } }); const j = await res.json(); - if (cb) cb(j); + if (cb) { + cb(j); + } return j; }; diff --git a/src/lib/scripts/render.js b/src/lib/scripts/render.js index ff17eddee..3a26e443e 100644 --- a/src/lib/scripts/render.js +++ b/src/lib/scripts/render.js @@ -9,7 +9,9 @@ export const renderDoc = ( /**@type{function(data, element)}*/ graftHandler, /**@type{function(root)}*/ finalprocess ) => { - if (!root || !mainSeq?.blocks?.length) return; + if (!root || !mainSeq?.blocks?.length) { + return; + } root.replaceChildren(); //clear current blocks from root const grafts = []; diff --git a/src/lib/search-worker/dab-search-worker.ts b/src/lib/search-worker/dab-search-worker.ts index 45e7d6ad1..c4ec6c7b0 100644 --- a/src/lib/search-worker/dab-search-worker.ts +++ b/src/lib/search-worker/dab-search-worker.ts @@ -7,11 +7,13 @@ export async function searchDictionary(phrase: string, options: SearchOptions) { const column = options.accentsAndTones ? 'word' : 'word_no_accents'; - let db = await initializeDatabase({ fetch }); - let results; + const db = await initializeDatabase({ fetch }); const dynamicQuery = searchWords.map(() => `${column} LIKE ?`).join(' OR '); const dynamicParams = searchWords.map((word) => (options.wholeWords ? word : `%${word}%`)); - results = db.exec(`SELECT locations FROM search_words WHERE ${dynamicQuery}`, dynamicParams); + const results = db.exec( + `SELECT locations FROM search_words WHERE ${dynamicQuery}`, + dynamicParams + ); console.log('results:', results); if (!results?.length || !results[0]?.values?.length) { diff --git a/src/lib/search-worker/data/pk-verse-provider.ts b/src/lib/search-worker/data/pk-verse-provider.ts index 602f9614d..7d347af81 100644 --- a/src/lib/search-worker/data/pk-verse-provider.ts +++ b/src/lib/search-worker/data/pk-verse-provider.ts @@ -58,7 +58,9 @@ export class ProskommaVerseProvider implements QueryVerseProvider { }); async getVerses(limit: number = 0): Promise { - if (this.searchIsBlank) return []; + if (this.searchIsBlank) { + return []; + } await this.ensureBooksSet(); return await this.verseReader.read(limit); } @@ -117,7 +119,9 @@ export class ProskommaVerseProvider implements QueryVerseProvider { private collectVerseTexts(tokens: GQLBlockToken[]): { [verse: string]: string } { return tokens.reduce((verses, token) => { const ref = chapterVerseFromScopes(token.scopes); - if (!verses[ref]) verses[ref] = ''; + if (!verses[ref]) { + verses[ref] = ''; + } verses[ref] += token.payload; return verses; }, {}); diff --git a/src/lib/search-worker/data/repositories/pk-search-repository-impl.ts b/src/lib/search-worker/data/repositories/pk-search-repository-impl.ts index 6097d2e8c..0d8dd7b71 100644 --- a/src/lib/search-worker/data/repositories/pk-search-repository-impl.ts +++ b/src/lib/search-worker/data/repositories/pk-search-repository-impl.ts @@ -59,7 +59,9 @@ export class ProskommaSearchRepositoryImpl implements ProskommaSearchRepository } async queryBooks(phrase: string, options: SearchOptions): Promise { - if (this.phraseIsEmtpy(phrase)) return []; + if (this.phraseIsEmtpy(phrase)) { + return []; + } const query = `{ docSet(id: "${options.docSet}") { documents(sortedBy: "paratext") { @@ -78,7 +80,9 @@ export class ProskommaSearchRepositoryImpl implements ProskommaSearchRepository bookId: string, options: SearchOptions ): Promise { - if (this.phraseIsEmtpy(phrase)) return []; + if (this.phraseIsEmtpy(phrase)) { + return []; + } const params = searchParams(phrase, options); const query = `{ document(id: "${bookId}") { diff --git a/src/lib/search-worker/domain/test/search-session-internal.test.ts b/src/lib/search-worker/domain/test/search-session-internal.test.ts index ad86be355..131ee3f7c 100644 --- a/src/lib/search-worker/domain/test/search-session-internal.test.ts +++ b/src/lib/search-worker/domain/test/search-session-internal.test.ts @@ -123,10 +123,11 @@ describe('on new query request', () => { if (isNewQueryResponse(response1) && isNewQueryResponse(response2)) { expect(response1.queryId === response2.queryId).toBe(false); - } else + } else { throw new Error( `expected new query responses, but got types '${response1.type}' and ${response2.type}` ); + } }); }); diff --git a/src/lib/search/data/test/search-config-repository-impl.test.ts b/src/lib/search/data/test/search-config-repository-impl.test.ts index 1b2ebcdf6..8674555cd 100644 --- a/src/lib/search/data/test/search-config-repository-impl.test.ts +++ b/src/lib/search/data/test/search-config-repository-impl.test.ts @@ -30,7 +30,7 @@ test('substitute characters', () => { e: 'èé' }; for (const k of Object.keys(expected)) { - expect(substitute[k]).toBeDefined; + expect(substitute[k]).toBeDefined(); for (const c of expected[k]) { expect(substitute[k]).toContain(c); } diff --git a/src/lib/search/domain/search-query-manager-impl.ts b/src/lib/search/domain/search-query-manager-impl.ts index d057fa4f8..e2bc22de1 100644 --- a/src/lib/search/domain/search-query-manager-impl.ts +++ b/src/lib/search/domain/search-query-manager-impl.ts @@ -36,7 +36,9 @@ export class SearchQueryManagerImpl implements SearchQueryManager { this.queryID++; const queryID = this.queryID; - if (this.onNewQuery) this.onNewQuery(); + if (this.onNewQuery) { + this.onNewQuery(); + } const query = await this.createQuery(phrase, options); await this.runQuery(query, queryID, { batchSize, limit }); @@ -56,8 +58,12 @@ export class SearchQueryManagerImpl implements SearchQueryManager { } // Cancel if another query comes in before this one completes. - if (id != this.queryID) break; - if (this.onResults) this.onResults(results); + if (id != this.queryID) { + break; + } + if (this.onResults) { + this.onResults(results); + } nResults += results.length; } diff --git a/src/lib/utils/worker-messenger/messenger.test.ts b/src/lib/utils/worker-messenger/messenger.test.ts index f51668408..864669c9d 100644 --- a/src/lib/utils/worker-messenger/messenger.test.ts +++ b/src/lib/utils/worker-messenger/messenger.test.ts @@ -250,5 +250,5 @@ test('setIncomingRequestHandler', async () => { messenger.setInboundHandler(incomingRequestHandler); io.onMessage(testRequestEvent()); await new Promise((resolve) => setTimeout(resolve, 50)); - expect(io.lastPosted).toBeDefined; + expect(io.lastPosted).toBeDefined(); }); diff --git a/src/lib/video/index.ts b/src/lib/video/index.ts index 178655ce0..412b112f8 100644 --- a/src/lib/video/index.ts +++ b/src/lib/video/index.ts @@ -69,7 +69,7 @@ export function getEmbeddedVideoUrl( const type = getVideoType(videoUrl); switch (type) { - case VideoType.YouTube: + case VideoType.YouTube: { // YouTube video // Transform https://www.youtube.com/watch?v=abcdefghijk to https://www.youtube.com/embed/abcdefghijk const videoId = getYouTubeVideoId(videoUrl); @@ -92,12 +92,13 @@ export function getEmbeddedVideoUrl( } } break; + } - case VideoType.Vimeo: + case VideoType.Vimeo: { // Vimeo video // Transform https://vimeo.com/12345678 to https://player.vimeo.com/video/12345678 - let pattern = /https:\/\/(?:www\.)?vimeo\.(\w+)\/([0-9]+)/; - let match = returnUrl.match(pattern); + const pattern = /https:\/\/(?:www\.)?vimeo\.(\w+)\/([0-9]+)/; + const match = returnUrl.match(pattern); if (match) { // Construct the Vimeo embed URL @@ -109,17 +110,18 @@ export function getEmbeddedVideoUrl( } } break; - - case VideoType.Daily: - pattern = /https?:\/\/dai\\.ly\/(.*)/; - match = returnUrl.match(pattern); + } + case VideoType.Daily: { + const pattern = /https?:\/\/dai\\.ly\/(.*)/; + const match = returnUrl.match(pattern); if (match) { returnUrl = `https://www.dailymotion.com/embed/video/${match[1]}`; } break; + } - case VideoType.Jesus: + case VideoType.Jesus: { // Jesus Film Media // Get the embed code from https://www.jesusfilm.org/watch, select video and click Share > Embed Code // Example: @@ -128,10 +130,12 @@ export function getEmbeddedVideoUrl( returnUrl = returnUrl + '&playerStyle=default&player=bc.vanilla5'; } break; + } - case VideoType.Hls: + case VideoType.Hls: { // Do nothing break; + } } return returnUrl; diff --git a/src/routes/about/+page.svelte b/src/routes/about/+page.svelte index 4c161de50..e17c6acd5 100644 --- a/src/routes/about/+page.svelte +++ b/src/routes/about/+page.svelte @@ -22,6 +22,9 @@
+ + {@html data.partial}
diff --git a/src/routes/contents/[id]/+page.svelte b/src/routes/contents/[id]/+page.svelte index 7523a2f5a..fed216875 100644 --- a/src/routes/contents/[id]/+page.svelte +++ b/src/routes/contents/[id]/+page.svelte @@ -56,12 +56,13 @@ //check type of link switch (item.linkType) { //reference linkType - case 'reference': + case 'reference': { contentsStack.pushItem($page.data.menu.id); const contentsRef = await getReference(item); console.log('contentsRef', contentsRef); await navigateToText(contentsRef); break; + } case 'screen': //goes to another contents page contentsStack.pushItem($page.data.menu.id); diff --git a/src/routes/lexicon/+page.svelte b/src/routes/lexicon/+page.svelte index 5e854eb1e..95df38d37 100644 --- a/src/routes/lexicon/+page.svelte +++ b/src/routes/lexicon/+page.svelte @@ -188,7 +188,9 @@ let isFetching = false; async function checkIfScrolledToBottom(event) { - if (isFetching) return; + if (isFetching) { + return; + } if ( ($selectedLanguageStore === reversalLanguage && reversalWordsList.length > 0) || diff --git a/src/routes/lexicon/+page.ts b/src/routes/lexicon/+page.ts index ecc31378e..99a0394a1 100644 --- a/src/routes/lexicon/+page.ts +++ b/src/routes/lexicon/+page.ts @@ -51,8 +51,10 @@ export async function load({ fetch }) { } } - let db = await initializeDatabase({ fetch }); - let results = db.exec(`SELECT id, name, homonym_index, type, num_senses, summary FROM entries`); + const db = await initializeDatabase({ fetch }); + const results = db.exec( + `SELECT id, name, homonym_index, type, num_senses, summary FROM entries` + ); if (!results || results.length === 0) { throw new Error('Vernacular query error'); @@ -68,13 +70,12 @@ export async function load({ fetch }) { let firstLetter = entry.name.charAt(0).toLowerCase(); - let firstTwoChars; let startingPosition = 0; if (firstLetter === '*' || firstLetter === '-') { startingPosition = 1; } - firstTwoChars = entry.name + const firstTwoChars = entry.name .substring(startingPosition, 2 + startingPosition) .toLowerCase(); diff --git a/src/routes/plans/[id]/+page.svelte b/src/routes/plans/[id]/+page.svelte index afd6e5036..7ad1ffd9d 100644 --- a/src/routes/plans/[id]/+page.svelte +++ b/src/routes/plans/[id]/+page.svelte @@ -169,7 +169,9 @@ } function handleMouseMove(event) { - if (!isDragging) return; + if (!isDragging) { + return; + } event.preventDefault(); const x = event.pageX - scroller.offsetLeft; const walk = (x - startX) * 2; // Adjust scroll speed diff --git a/src/routes/quiz/[collection]/[id]/+page.svelte b/src/routes/quiz/[collection]/[id]/+page.svelte index b8e8aee32..b29f37998 100644 --- a/src/routes/quiz/[collection]/[id]/+page.svelte +++ b/src/routes/quiz/[collection]/[id]/+page.svelte @@ -75,9 +75,15 @@ function playSound(path, callback, type = 'answer') { let audio = new Audio(); - if (type === 'question') currentQuestionAudio = audio; - if (type === 'answer') currentAnswerAudio = audio; - if (type === 'explanation') currentExplanationAudio = audio; + if (type === 'question') { + currentQuestionAudio = audio; + } + if (type === 'answer') { + currentAnswerAudio = audio; + } + if (type === 'explanation') { + currentExplanationAudio = audio; + } audio.src = path; audio.onended = function () { diff --git a/src/routes/search/[collection]/[[savedResults]]/+page.ts b/src/routes/search/[collection]/[[savedResults]]/+page.ts index 7b0e7e166..28589d8f5 100644 --- a/src/routes/search/[collection]/[[savedResults]]/+page.ts +++ b/src/routes/search/[collection]/[[savedResults]]/+page.ts @@ -4,7 +4,9 @@ import config from '$lib/data/config'; export async function load({ params }) { const collection = config.bookCollections.find((bc) => bc.id === params.collection); - if (!collection) throw error(404); + if (!collection) { + throw error(404); + } return { collection: collection.id, savedResults: params.savedResults }; } diff --git a/src/routes/text/+page.svelte b/src/routes/text/+page.svelte index ae1a926e9..1be3b5189 100644 --- a/src/routes/text/+page.svelte +++ b/src/routes/text/+page.svelte @@ -226,8 +226,12 @@ /**scrolls element with id into view*/ const scrollTo = (id) => { - if (scrollMod === key) return; - if (!id) return; + if (scrollMod === key) { + return; + } + if (!id) { + return; + } let el = document.querySelector( `div[data-verse="${id.split('-')[0]}"][data-phrase="${id.split('-')[1]}"]` ); @@ -480,7 +484,7 @@ ? 'visible' : 'invisible'}" > - +
@@ -514,7 +518,7 @@ ? 'visible' : 'invisible'}" > - +
diff --git a/src/service-worker.js b/src/service-worker.js index b42dd5f11..956353867 100644 --- a/src/service-worker.js +++ b/src/service-worker.js @@ -23,7 +23,9 @@ self.addEventListener('activate', (event) => { // Remove previous cached data from disk async function deleteOldCaches() { for (const key of await caches.keys()) { - if (key !== CACHE) await caches.delete(key); + if (key !== CACHE) { + await caches.delete(key); + } } } @@ -32,7 +34,9 @@ self.addEventListener('activate', (event) => { self.addEventListener('fetch', (event) => { // ignore POST requests etc - if (event.request.method !== 'GET') return; + if (event.request.method !== 'GET') { + return; + } async function respond() { const url = new URL(event.request.url);