diff --git a/.gitignore b/.gitignore index 0592ec30af8ecaafd34798974544fd4087cab856..0dea1b881f19c986ccec58126f52cbca5ec6b6d6 100755 --- a/.gitignore +++ b/.gitignore @@ -14,4 +14,5 @@ scripts/Pfam-A.hmm.dat meili_data #refseq_res.csv *.pyc -# pfam-a-hmm.csv \ No newline at end of file +# pfam-a-hmm.csv +.vscode diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 1cea78644d5b0a47bb29ade11c93d05006b41ad8..ae93cc7e2b945298b8648f50631ea29e256a8bd2 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -192,18 +192,20 @@ lint: MEILI_HOST: "http://localhost:7700" script: # - rm data/list-systems.json + ###### REFSEQ + # delete all document refseq - > df-wiki-cli meilisearch --host ${MEILI_HOST} --key ${MEILI_MASTER_KEY} delete-all-documents refseq + # update refseq index - > - df-wiki-cli - content systems - --dir content/3.defense-systems/ - --pfam public/pfam-a-hmm.csv - --output data/list-systems.json + df-wiki-cli meilisearch + --host ${MEILI_HOST} + --key ${MEILI_MASTER_KEY} + index-update refseq sys_id - > df-wiki-cli meilisearch @@ -211,23 +213,92 @@ lint: --key ${MEILI_MASTER_KEY} update --file data/refseq_res.csv - --document refseq + --document refseq + # REF SEQ TAXO # + - > + df-wiki-cli + content + refseq-group-per-assembly + --input data/refseq_res.csv + --output data/refseqtaxo.csv + - > + df-wiki-cli + meilisearch + --host ${MEILI_HOST} + --key ${MEILI_MASTER_KEY} + delete-all-documents refseqtaxo + - > + df-wiki-cli meilisearch + --host ${MEILI_HOST} + --key ${MEILI_MASTER_KEY} + index-update refseqtaxo Assembly - > df-wiki-cli meilisearch --host ${MEILI_HOST} --key ${MEILI_MASTER_KEY} update - --file data/refseq_res.csv + --file data/refseqtaxo.csv --document refseqtaxo + # REFSEQ TAXO TYPE # + - > + df-wiki-cli + content + refseq-group-per-assembly-and-type + --input data/refseq_res.csv + --output data/refseqtaxotype.csv + - > + df-wiki-cli + meilisearch + --host ${MEILI_HOST} + --key ${MEILI_MASTER_KEY} + delete-all-documents refseqtaxotype + - > + df-wiki-cli meilisearch + --host ${MEILI_HOST} + --key ${MEILI_MASTER_KEY} + index-update refseqtaxotype index - > df-wiki-cli meilisearch --host ${MEILI_HOST} --key ${MEILI_MASTER_KEY} update - --file data/all_predictions_statistics_clean.csv - --document structure + --file data/refseqtaxotype.csv + --document refseqtaxotype + # SANITIZED REFSEQ + - > + df-wiki-cli + content + refseq-sanitized-hits + --input data/refseq_res.csv + --output data/refseq-sanitized.csv + - > + df-wiki-cli + meilisearch + --host ${MEILI_HOST} + --key ${MEILI_MASTER_KEY} + delete-all-documents refseqsanitized + - > + df-wiki-cli meilisearch + --host ${MEILI_HOST} + --key ${MEILI_MASTER_KEY} + index-update refseqsanitized index + - > + df-wiki-cli + meilisearch + --host ${MEILI_HOST} + --key ${MEILI_MASTER_KEY} + update + --file data/refseq-sanitized.csv + --document refseqsanitized + # SYSTEMS + - > + df-wiki-cli + content systems + --dir content/3.defense-systems/ + --pfam public/pfam-a-hmm.csv + --output data/list-systems.json - > df-wiki-cli meilisearch @@ -236,6 +307,16 @@ lint: update --file data/list-systems.json --document systems + # STRUCTURE + - > + df-wiki-cli + meilisearch + --host ${MEILI_HOST} + --key ${MEILI_MASTER_KEY} + update + --file data/all_predictions_statistics_clean.csv + --document structure + # ARTICLES - > df-wiki-cli meilisearch diff --git a/components/AutocompleteMeiliFacets.vue b/components/AutocompleteMeiliFacets.vue index fed95eeb55847f7041b242f50a044170ded88526..ff77c3d56e566a08afd9b9fb34424f30f6091368 100644 --- a/components/AutocompleteMeiliFacets.vue +++ b/components/AutocompleteMeiliFacets.vue @@ -193,6 +193,7 @@ function updateAutocompleteFocused(isFocused: boolean) { function emitUpdateModelValue(filters: MaybeRef<FilterItem[] | undefined>) { + console.log(filters) emit('update:modelValue', toValue(filters)) } diff --git a/components/Nav/Navbar.vue b/components/Nav/Navbar.vue index e5a879a612b4b49c8d90009a22ec15c49ed4fc34..23ae1ca901c1815ff7f9a863b9a3a29c776d5dca 100644 --- a/components/Nav/Navbar.vue +++ b/components/Nav/Navbar.vue @@ -36,12 +36,11 @@ const sections = ref([ href: runtimeConfig.public.defenseFinderWebservice, }, { id: "wiki", label: "Wiki", to: '/', }, - { id: "refseq", label: "RefSeq DB", to: '/refseq/' }, - { id: "structure", label: "Structures DB", to: '/structure/' }, + { id: "refseq", label: "RefSeq DB", to: '/refseq' }, + { id: "structure", label: "Structures DB", to: '/structure' }, { id: "help", label: "Help", to: '/help/defensefinder' }, ]); - function toggleDrawer() { emit('update:drawer', !props.drawer) } @@ -63,7 +62,7 @@ function toggleDrawer() { {{ section.label }} </v-btn> <v-btn @click="toggleTheme" color="primary" :icon="theme.global.current.value.dark ? 'md:light_mode' : 'md:dark_mode' - "></v-btn> + "></v-btn> </template> <template v-else> <v-menu> diff --git a/components/ServerDbTable.vue b/components/ServerDbTable.vue index 306f2ee9f80a614334bc13704536e1e0b7628dae..214e3d44b757680a6f49776ef3961d3209b0914e 100644 --- a/components/ServerDbTable.vue +++ b/components/ServerDbTable.vue @@ -4,7 +4,7 @@ import { useCsvDownload } from "@/composables/useCsvDownload" import { useMeiliFilters } from "@/composables/useMeiliFilters" import { useSlots } from 'vue' import { useDisplay } from "vuetify"; -import { useThrottleFn } from '@vueuse/core' +import { toValue, useThrottleFn } from '@vueuse/core' import type { FacetInputItem, FilterItem } from '@/components/AutocompleteMeiliFacets.vue' import { useMeiliSearch } from "#imports" // import { saveAs } from "file-saver"; @@ -39,7 +39,7 @@ export interface Props { autocompleteMeiliFacetsProps: AutocompleteMeiliFacetProps } - +const msFilters = defineModel('msFilters') const props = withDefaults(defineProps<Props>(), { title: '', columnsToDownload: undefined, @@ -52,7 +52,9 @@ const props = withDefaults(defineProps<Props>(), { facets: undefined } - } + }, + msFilters: undefined + }); const slots = useSlots() const sortByRef = toRef(props.sortBy) @@ -123,20 +125,10 @@ onBeforeMount(async () => { emitRefreshRes() }) -const msFilterCompo = ref<FilterItem[] | undefined>(undefined) - - - const computedF = computed(() => toValue(props.numericalFilters)) -const { arrayFilters: computedFilter } = useMeiliFilters(msFilterCompo, computedF) -// const computedFilter = computed(() => { -// const toValFilters = toValue(msFilterCompo) -// if (toValFilters !== undefined && toValFilters.length > 0) { -// meiliFilterAsArray -// } -// }) +const { arrayFilters: computedFilter } = useMeiliFilters(msFilters, computedF) watch(computedFilter, () => { @@ -160,14 +152,14 @@ const throttleSearch = useThrottleFn(async () => { const lastFilterItem = computed(() => { - const toValFilterItems = toValue(msFilterCompo) + const toValFilterItems = toValue(msFilters) if (toValFilterItems !== undefined && Array.isArray(toValFilterItems)) { return toValFilterItems.slice(-1)[0] } }) const isValidFilters = computed(() => { - const toValFilterItems = toValue(msFilterCompo) + const toValFilterItems = toValue(msFilters) if (toValFilterItems === undefined || Array.isArray(toValFilterItems) && toValFilterItems?.length === 0) { return true } @@ -224,10 +216,7 @@ watch(search, () => { // emitRefreshRes() }) -// watch(msFilterCompo, () => { -// searchOrFilter() -// }) async function downloadData() { pendingDownloadData.value = true @@ -280,7 +269,7 @@ function focusedOrBlur(isFocused: boolean) { @update:focused="focusedOrBlur"></v-text-field> </v-card-text> <v-card-text> - <AutocompleteMeiliFacets v-model="msFilterCompo" v-bind="props.autocompleteMeiliFacetsProps" + <AutocompleteMeiliFacets v-model="msFilters" v-bind="props.autocompleteMeiliFacetsProps" :is-valid-filters="isValidFilters"> </AutocompleteMeiliFacets> </v-card-text> diff --git a/components/content/ArticleStructure.vue b/components/content/ArticleStructure.vue new file mode 100644 index 0000000000000000000000000000000000000000..be8525eee834d802c488da460c568c26a38f36ad --- /dev/null +++ b/components/content/ArticleStructure.vue @@ -0,0 +1,153 @@ +<script setup lang="ts"> +import { toValue } from '@vueuse/core'; +import MolstarPdbePlugin from './MolstarPdbePlugin.vue'; + + +const { page } = useContent(); +// get the structures +const structures = ref() +const structureTitle = ref("Structure") +const msIndexName = ref<string>("structure") +const stuctureUrls = ref<string[] | undefined>(undefined) +const headers = ref<Record<string, any>[]>([ + { title: 'Structure', key: 'structure', sortable: false, removable: false, fixed: true, minWidth: "110px" }, + + { title: " System", key: "System" }, + { title: "Gene name", key: "gene_name", removable: false }, + { title: "Subtype", key: "subtype", removable: false }, + { title: "Proteins in structure", key: 'proteins_in_the_prediction', sortable: false, removable: true }, + { title: "System genes", key: "system_genes", sortable: false, removable: true }, + { title: "Prediction type", key: "prediction_type", removable: true }, + { title: "N genes in sys", key: "system_number_of_genes", removable: true }, + { title: "pLDDT", key: "plddts", removable: true }, + { title: "iptm+ptm", key: "iptm+ptm", removable: true }, + { title: "pDockQ", key: "pDockQ", removable: true }, +]) +const groupBy = ref([ + { + key: 'subtype', + order: 'asc', + }, +]) + + + +onBeforeMount(() => { + fetchStructures() +}) +onMounted(() => { + fetchStructures() +}) + +function namesToCollapsibleChips(names: string[], systemDir: string, file: string | null = null) { + if (file === null) { + return names.filter((it) => it !== "").map(it => ({ title: it.split("__")[1] })) + } else { + return names.filter((it) => it !== "").map(it => ({ title: it.split("__")[1], href: `/wiki/${systemDir}/${file}` })) + } +} +function pdbNameToCif(pdbPath: string) { + const cifPath = pdbPath.split(".").slice(0, -1).join(".") + return `${cifPath}.cif` +} +function displayStructure(item) { + stuctureUrls.value = item.structuresUrls + console.log(item) + structureTitle.value = `${item.subtype} - ${item.gene_name}` + +} + + +const sanitizedStructures = computed(() => { + const toValStructures = toValue(structures) + if (toValStructures?.hits?.length > 0) { + + return toValStructures.hits.map(item => { + return { + ...item, structuresUrls: [`/${item.System_name_ok}/${pdbNameToCif(item.pdb)}`, `/${item.System_name_ok}/${item.pdb}`] + .map(url => { + return toValue(useRefinedUrl(url).refinedUrl) + }) + } + }) + } + return [] + +}) + + +// ================================================================================== +// ASYNC PART + +async function fetchStructures() { + const { data, error, refresh } = await useAsyncMeiliSearch({ + index: toValue(msIndexName), + query: "", + params: { + facets: ["*"], + filter: [`System='${toValue(page).title}'`, "completed='true'"], + } + }) + structures.value = data.value + if (error.value) { + throw createError(`Cannot get structure for system: ${page.title}`) + } +} + +// watch(page() => { + + +// refresh() +// }) +console.log(structures) + + +</script> +<template> + <v-card flat> + <v-data-table :headers="headers" :items="sanitizedStructures" :group-by="groupBy"> + <template #[`item.proteins_in_the_prediction`]="{ item }"> + <CollapsibleChips + :items="namesToCollapsibleChips(item.proteins_in_the_prediction, item.System_name_ok, item.fasta_file)"> + </CollapsibleChips> + </template> + <template #[`item.system_genes`]="{ item }"> + <CollapsibleChips :items="namesToCollapsibleChips(item.system_genes, item.System_name_ok)"> + </CollapsibleChips> + + </template> + <template v-slot:group-header="{ item, columns, toggleGroup, isGroupOpen }"> + <tr> + <td :colspan="columns.length"> + <VBtn :icon="isGroupOpen(item) ? '$expand' : '$next'" size="small" variant="text" + @click="toggleGroup(item)"></VBtn> + {{ item.value === 'na' ? 'No subtype' : item.value }} + </td> + </tr> + </template> + <template #[`item.structure`]="{ item }"> + <v-row justify="space-between" dense no-gutters align="center"> + <v-col> + <v-btn size="x-small" variant="text" icon="md:visibility" + @click="displayStructure(item)"></v-btn> + </v-col> + <v-col> + <v-menu> + <template v-slot:activator="{ props }"> + <v-btn :disabled="item.structuresUrls?.length < 1" size="x-small" variant="text" + icon="md:download" class="ml-1" v-bind="props"></v-btn> + </template> + <v-list> + <v-list-item v-for="(url, index) in item.structuresUrls" :key="index" :value="index" + :href="url"> + <v-list-item-title>{{ url.split('.').slice(-1)[0] }}</v-list-item-title> + </v-list-item> + </v-list> + </v-menu> + </v-col> + </v-row> + </template> + </v-data-table> + <PdbeMolstarPlugin v-model="stuctureUrls" v-model:title="structureTitle" /> + </v-card> +</template> \ No newline at end of file diff --git a/components/content/MolstarPdbePlugin.vue b/components/content/MolstarPdbePlugin.vue index 82f8db51cd1b8741ccde6b7ff2e503ac872cbf74..dc6457047fd354959fdd4125ca96a5bf3ffa82d5 100644 --- a/components/content/MolstarPdbePlugin.vue +++ b/components/content/MolstarPdbePlugin.vue @@ -2,22 +2,19 @@ import { withTrailingSlash, withLeadingSlash, joinURL } from 'ufo' import { useRuntimeConfig, computed } from '#imports' -import * as d3 from "d3"; -import * as Plot from "@observablehq/plot"; -import PlotFigure from "~/components/PlotFigure"; - import { useDisplay } from "vuetify"; export interface Props { height?: number dataUrls?: string[] - dataUrl?: string + dataUrl?: string | undefined uniq?: boolean format?: "pdb" | "cif" } -const { mobile } = useDisplay() -// const selectedPdb = ref('') + + +const { mobile, width, height } = useDisplay() const refinedDataUrls = computed(() => { function refinedUrl(url: string) { @@ -54,10 +51,10 @@ const refinedDataUrls = computed(() => { const props = withDefaults(defineProps<Props>(), { height: 600, uniq: false, - format: 'pdb' + format: 'pdb', + dataUrl: undefined }) -const { width, height } = useDisplay() const maxWidth = ref(1500) @@ -73,7 +70,6 @@ const computedHeight = computed(() => { return height.value - 250 }) -const paeError: Ref<string | null> = ref(null) function closeStructure() { selectedPdb.value = null @@ -105,7 +101,6 @@ useHead({ }) const pdbeMolstarComponent = ref(null) -// const selectedPdb = ref("/wiki/avs/AVAST_I,AVAST_I__Avs1A,0,V-plddts_85.07081.pdb") const selectedPdb: Ref<string | null> = ref(null) const structureToDownload: Ref<string | null> = ref(null) const selectedPaePath = computed(() => { @@ -151,9 +146,6 @@ function setSelectedPdbToFirst() { } } -// const moleculeFormat = computed(() => { -// return toValue(selectedPdb)?.split(".")?.[-1]?.toLowerCase() ?? "pdb" -// }) const moleculeFormat: Ref<string> = ref("pdb") </script> @@ -191,7 +183,8 @@ const moleculeFormat: Ref<string> = ref("pdb") <v-card flat :rounded="false"> <v-toolbar> <v-toolbar-title>Structures</v-toolbar-title> - <v-select v-model="selectedPdb" label="Select PDB" :items="refinedDataUrls" hide-details="auto"></v-select> + <v-select v-model="selectedPdb" label="Select PDB" :items="refinedDataUrls" + hide-details="auto"></v-select> <v-spacer></v-spacer> <v-btn :disabled="!selectedPdb" icon="md:download" :href="structureToDownload"></v-btn> @@ -207,15 +200,12 @@ const moleculeFormat: Ref<string> = ref("pdb") class="d-flex align-center justify-center flex-wrap text-center mx-auto px-4 my-3" :height="computedHeight" :width="computedWidth" style="position:relative;"> <pdbe-molstar ref="pdbeMolstarComponent" :custom-data-url="selectedPdb" alphafold-view - sequence-panel="true" landscape="false" :custom-data-format="moleculeFormat"></pdbe-molstar> + sequence-panel="true" landscape="false" + :custom-data-format="moleculeFormat"></pdbe-molstar> </v-sheet> </v-col> <v-col v-if="moleculeFormat === 'cif'" :cols="mobile ? 12 : undefined"> <v-img :src="selectedPaePath"></v-img> - - <!-- <PlotFigure v-if="sanitizedPaeData?.length > 0 && paeError === null" defer - :options="plotPaeOptions"></PlotFigure> - <v-alert v-else type="warning" variant="tonal">{{ paeError }}</v-alert> --> <v-card flat color="transparent"> <v-card-title>Model Confidence</v-card-title> <v-card-text> diff --git a/components/content/PdbeMolstarPlugin.vue b/components/content/PdbeMolstarPlugin.vue new file mode 100644 index 0000000000000000000000000000000000000000..6a082cdddb0f94d613f21a899ee9195133b88ae8 --- /dev/null +++ b/components/content/PdbeMolstarPlugin.vue @@ -0,0 +1,186 @@ +<script setup lang="ts"> +import { withTrailingSlash, withLeadingSlash, joinURL } from 'ufo' +import { useRuntimeConfig, computed, toValue } from '#imports' +import { useDisplay } from "vuetify"; + +import type { MaybeRef } from "vue" +import FoldseekDialog from '../FoldseekDialog.vue' + +const { mobile, width, height } = useDisplay() + + +useHead({ + link: [ + { + rel: 'stylesheet', + href: 'https://www.ebi.ac.uk/pdbe/pdb-component-library/css/pdbe-molstar-3.1.3.css' + }, + ], + script: [ + // Required for IE11 + { + src: "https://cdn.jsdelivr.net/npm/babel-polyfill/dist/polyfill.min.js" + }, + { + src: "https://cdn.jsdelivr.net/npm/@webcomponents/webcomponentsjs/webcomponents-lite.js" + }, + { + type: "text/javascript", + src: "https://www.ebi.ac.uk/pdbe/pdb-component-library/js/pdbe-molstar-component-3.1.3.js", + // tagPosition: 'bodyClose' + } + ] +}) + +export interface Props { + height?: number + // dataUrls?: MaybeRef<string[] | undefined> + format?: "pdb" | "cif" +} + +const props = withDefaults(defineProps<Props>(), { + height: 600, + format: 'pdb', + // dataUrls: undefined +}) + +const dataUrls = defineModel() +const title = defineModel('title') +const pdbeMolstarComponent = ref(null) + +const dialog = ref(false) +const moleculeFormat: Ref<string> = ref("pdb") +const selectedPdb: Ref<string | null> = ref(null) +const structureToDownload: Ref<string | null> = ref(null) + + +const computedWidth = computed(() => { + // if (toValue(width) > toValue(maxWidth)) return toValue(maxWidth) / 1.5 + return toValue(width) / 1.5 +}) + +const computedHeight = computed(() => { + return height.value - 250 +}) + + +function viewPdb(pdbPath: string | null) { + if (pdbPath !== null) { + dialog.value = true + const format = toValue(pdbPath)?.split(".").slice(-1)[0]?.toLowerCase() ?? "pdb" + moleculeFormat.value = format + if (pdbeMolstarComponent.value?.viewerInstance) { + const viewerInstance = pdbeMolstarComponent.value.viewerInstance + const customData = { url: pdbPath, format: format, binary: false } + viewerInstance.visual.update({ customData }) + + } + } +} + + +function closeStructure() { + selectedPdb.value = null + dataUrls.value = undefined + dialog.value = false +} +watch(selectedPdb, (newSelectedPdb, prevSelectPdb) => { + viewPdb(newSelectedPdb) + structureToDownload.value = newSelectedPdb +}) + +watchEffect(() => { + const toValUrl = toValue(dataUrls) + if (toValUrl?.length > 0) { + dialog.value = true + selectedPdb.value = dataUrls.value[0] + } + else { + dialog.value = false + } +}) + +</script> +<template> + <v-dialog v-model="dialog" transition="dialog-bottom-transition" fullscreen :scrim="false"> + <v-card flat :rounded="false"> + <v-toolbar> + <v-toolbar-title>{{ title }}</v-toolbar-title> + <v-select v-model="selectedPdb" label="Select PDB" :items="dataUrls" hide-details="auto"></v-select> + <v-spacer></v-spacer> + + <v-btn :disabled="!selectedPdb" icon="md:download" :href="structureToDownload"></v-btn> + <v-btn icon @click="closeStructure"> + <v-icon>mdi-close</v-icon> + </v-btn> + + </v-toolbar> + <v-card-text> + <v-row> + <v-col :cols="mobile ? 12 : 'auto'"> + <v-sheet v-if="selectedPdb" + class="d-flex align-center justify-center flex-wrap text-center mx-auto px-4 my-3" + :height="computedHeight" :width="computedWidth" style="position:relative;"> + <pdbe-molstar ref="pdbeMolstarComponent" :custom-data-url="selectedPdb" alphafold-view + sequence-panel="true" landscape="false" + :custom-data-format="moleculeFormat"></pdbe-molstar> + </v-sheet> + </v-col> + <v-col v-if="moleculeFormat === 'cif'" :cols="mobile ? 12 : undefined"> + <v-img :src="selectedPaePath"></v-img> + <v-card flat color="transparent"> + <v-card-title>Model Confidence</v-card-title> + <v-card-text> + AlphaFold produces a per-residue model + confidence score (pLDDT) between 0 and 100. Some regions below 50 pLDDT may be + unstructured + in isolation. + </v-card-text> + <v-list> + <v-list-item> + <template #prepend> + <div class="legendColor mr-2" style="background-color: rgb(0, 83, 214);"> + </div> + </template> + <v-list-item-title> + Very high (pLDDT > 90) + </v-list-item-title> + + </v-list-item> + <v-list-item> + <template #prepend> + <div class="legendColor mr-2" style="background-color: rgb(101, 203, 243);"> + </div> + </template> + <v-list-item-title> + High (90 > pLDDT > 70) + </v-list-item-title> + + </v-list-item> + <v-list-item> + <template #prepend> + <div class="legendColor mr-2" style="background-color: rgb(255, 219, 19);"> + </div> + </template> + <v-list-item-title> + Low (70 > pLDDT > 50) </v-list-item-title> + + </v-list-item> + <v-list-item> + <template #prepend> + <div class="legendColor mr-2" style="background-color: rgb(255, 125, 69);"> + </div> + </template> + <v-list-item-title> + Very low (pLDDT < 50) </v-list-item-title> + + </v-list-item> + </v-list> + </v-card> + </v-col> + </v-row> + </v-card-text> + </v-card> + </v-dialog> + +</template> \ No newline at end of file diff --git a/components/content/RefseqDb.vue b/components/content/RefseqDb.vue index 131a9200d371a7b07ceedb11a8d3513c9a0ee21a..80b49c502f5cbed9f1f5adca52ba1ee60e5801bf 100644 --- a/components/content/RefseqDb.vue +++ b/components/content/RefseqDb.vue @@ -201,24 +201,26 @@ async function getAllHits(params: { index: string, params: Record<string, any>, selectedTaxoRank.value = "Superkingdom" } - if (params.index === toValue(dbName)) { - - pendingAllHits.value = true - try { - const { data, error } = await useAsyncMeiliSearch({ - ...params, - params: { - ...params.params, - 'attributesToRetrieve': ['type', 'Assembly', ...toValue(availableTaxo)] - } - }) - allHits.value = data.value - } finally { - pendingAllHits.value = false + // if (params.index === toValue(dbName)) { - } + pendingAllHits.value = true + try { + const { data, error } = await useAsyncMeiliSearch({ + ...params, + index: "refseqsanitized", + params: { + ...params.params, + + 'attributesToRetrieve': ['type', 'Assembly', ...toValue(availableTaxo)] + } + }) + allHits.value = data.value + } finally { + pendingAllHits.value = false } + + // } } @@ -287,12 +289,16 @@ const computedTaxonomyDistribution = computed(() => { const toValSelectedTaxoRank = toValue(selectedTaxoRank) const toValFacetsPerRank = toValue(msResult)?.facetDistribution?.[toValSelectedTaxoRank] if (toValFacetsPerRank) { - return Object.entries(toValFacetsPerRank).map(([key, value]) => { - return { + const listFacetsPerRank = Object.entries(toValFacetsPerRank) + const result = new Array(listFacetsPerRank.length); + for (let i = 0; listFacetsPerRank.length; i++) { + const [key, value] = listFacetsPerRank[i] + result[i] = { [toValSelectedTaxoRank]: key, count: value } - }).sort() + } + return result.sort() } else { return [] } }) @@ -363,8 +369,8 @@ const binPlotOptions = computed(() => { marginBottom: 200, padding: 0, grid: true, + aspectRatio: true, x: { tickRotate: 90, label: "Systems", domain: toValue(sortedCellDomain) }, - // y: { tickFormat: 's' }, color: { scheme: "plasma", legend: true, label: `Proportion per ${selectedTaxoRank.value}`, domain: [0, 100] }, } }) @@ -375,12 +381,18 @@ const binPlotGroup = computed(() => { { label: (d) => d.fill, fill: { + /** + * + * @param I is the list of element index that are par of the same group (cell) + * @param X is the list of all elements + */ reduceIndex: function (I, X) { const toValTaxonomyFacet = toValue(taxonomyFacet) if (toValTaxonomyFacet !== undefined) { const clade = X[I[0]][selectedTaxoRank.value] const system = X[I[0]].type - // Get the list of item for this group + // Get the list of all the items for this group (same cell) + // and group them per type and assembly const itemsPerGroup = d3.rollup(I.map(index => { return X[index] }), D => D.length, d => d.type, d => d.Assembly) @@ -408,22 +420,20 @@ const binPlotGroup = computed(() => { const binPlotDataOptions = computed(() => { const toValueAllHits = toValue(allHits) + const toValBinPlotGroup = toValue(binPlotGroup) const data = toValueAllHits?.hits ?? [] + const plotCellMark = Plot.cell(data, toValBinPlotGroup) return toValueAllHits?.hits?.length > 0 ? { ...binPlotOptions.value, width: width.value, - title: "Proportion of genomes with defense system X for a given clade", + title: `Proportion of genomes with defense system X per ${selectedTaxoRank.value} taxonomic rank`, color: { ...binPlotOptions.value.color, type: scaleType.value, tickFormat: '~s', ticks: scaleType.value === 'symlog' ? 3 : 5, }, - marks: [ - Plot.cell(data, - toValue(binPlotGroup) - ), - ], + marks: [plotCellMark], } : null }) diff --git a/components/content/StructureDb.vue b/components/content/StructureDb.vue index 59db42f08ca3a2d213e3a977007d718603d36f81..380ce2bc38afb1e874ffa773d63cc951a3dd0c12 100644 --- a/components/content/StructureDb.vue +++ b/components/content/StructureDb.vue @@ -6,13 +6,12 @@ import { ServerDbTable } from "#components" import { withQuery, joinURL, withTrailingSlash } from 'ufo' - interface Item { - Foldseek_name: string System_name_ok: string - } + + const sortBy: Ref<SortItem[]> = ref([{ key: 'System', order: "asc" }]) const itemValue = ref("id"); const dbName = ref("structure") @@ -163,49 +162,60 @@ const { refinedUrl: downloadAllCifUrl } = useRefinedUrl("/df-all-cifs.tar.gz") :autocomplete-meili-facets-props="computedAutocompleteMeiliFacetsProps" :numerical-filters="toRef(numericalFilters)"> <template #numerical-filters="{ search }"> - <v-list> - <v-list-item> - <v-list-item-title class="text-subtitle-1 text-medium-emphasis"> - pLDDT - </v-list-item-title> - <v-row> - <v-col class="pt-8 pl-8" :lg="8"> - <v-range-slider v-model="plddtsRange" strict density="compact" hide-details="auto" + <v-row> + <v-col cols="12" md="4"> + <v-card flat variant="tonal"> + <v-card-item class="mb-4"> + <v-card-title> pLDDT + </v-card-title> + </v-card-item> + <v-card-text class="pr-0"> + <v-range-slider v-model="plddtsRange" strict density="compact" hide-details="auto" class="" step="0.5" :min="0" :max="100" thumb-label="always" @update:modelValue="search()"> <template #append> - <v-btn variant="text" icon="md:restart_alt" @click="plddtsReset()"></v-btn> + <v-btn variant="text" density="compact" icon="md:restart_alt" + @click="plddtsReset()"></v-btn> </template> </v-range-slider> - </v-col></v-row> - </v-list-item> - <v-list-item> - <v-list-item-title class="text-subtitle-1 text-medium-emphasis"> - iptm+ptm - </v-list-item-title> - <v-row> - <v-col class="pt-8 pl-8" :lg="8"> + </v-card-text> + </v-card> + </v-col> + <v-col cols="12" md="4"> + <v-card flat variant="tonal"> + <v-card-item class="mb-4"> + <v-card-title> iptm+ptm + </v-card-title> + </v-card-item> + <v-card-text class="pr-0"> <v-range-slider v-model="iptmRange" strict density="compact" hide-details="auto" step="0.1" :min="0" :max="1" thumb-label="always" @update:modelValue="search()"> <template #append> - <v-btn variant="text" icon="md:restart_alt" @click="iptmReset()"></v-btn> + <v-btn variant="text" density="compact" icon="md:restart_alt" + @click="iptmReset()"></v-btn> </template> </v-range-slider> - </v-col></v-row> - </v-list-item> - <v-list-item> - <v-list-item-title class="text-subtitle-1 text-medium-emphasis">pDockQ</v-list-item-title> - <v-row> - <v-col class="pt-8 pl-8" :lg="8"> + </v-card-text></v-card> + </v-col> + + <v-col cols="12" md="4"> + <v-card flat variant="tonal"> + <v-card-item class="mb-4"> + <v-card-title> pDockQ + </v-card-title> + </v-card-item> + <v-card-text class="pr-0"> <v-range-slider v-model="pdockqRange" density="compact" strict hide-details="auto" step="0.1" :min="0" :max="1" thumb-label="always" @update:modelValue="search()"> <template #append> - <v-btn variant="text" icon="md:restart_alt" @click="pdockqReset()"></v-btn> + <v-btn variant="text" density="compact" icon="md:restart_alt" + @click="pdockqReset()"></v-btn> </template> </v-range-slider> - </v-col></v-row> - </v-list-item> - </v-list> + </v-card-text> + </v-card> + </v-col> + </v-row> </template> <template #[`item.Foldseek_name`]="{ item }"> <FoldseekDialog v-if="item.Foldseek_name !== 'na'" :foldseek-path="toFolseekUrl(item)"></FoldseekDialog> @@ -227,16 +237,6 @@ const { refinedUrl: downloadAllCifUrl } = useRefinedUrl("/df-all-cifs.tar.gz") uniq format="cif"> </MolstarPdbePlugin> </v-row> - <!-- <v-row no-gutters align="center"> - <MolstarPdbePlugin v-if="item?.pdb && item.pdb !== 'na'" - :data-urls="[`/${item.System_name_ok}/${item.pdb}`]" uniq format="pdb"> - </MolstarPdbePlugin> - </v-row> --> - - - - <!-- <v-icon v-else color="warning" icon="md:dangerous"></v-icon> --> - </template> <template #[`item.completed`]="{ item }"> <v-icon v-if="item.completed" color="success" icon="md:check"></v-icon> diff --git a/composables/useRefinedUrl.ts b/composables/useRefinedUrl.ts index 9ac7397ff4f79894334609e1ab4674ffbef902bd..7120de550f55cb6b1de082afb6d3e3e058e8a9ed 100644 --- a/composables/useRefinedUrl.ts +++ b/composables/useRefinedUrl.ts @@ -1,19 +1,18 @@ -import { withTrailingSlash, withLeadingSlash, joinURL } from "ufo"; +import { withoutTrailingSlash, withLeadingSlash, joinURL } from "ufo"; - -export function useRefinedUrl(url: string | Ref<string>) { +export function useRefinedUrl(url: MaybeRef<string>) { const refinedUrl = computed(() => { const sanitzedUrl = toValue(url) if (sanitzedUrl.startsWith("/") && !sanitzedUrl.startsWith("//")) { const _base = withLeadingSlash( - withTrailingSlash(useRuntimeConfig().app.baseURL) + withoutTrailingSlash(useRuntimeConfig().app.baseURL) ); if (_base !== "/" && !sanitzedUrl.startsWith(_base)) { return joinURL(_base, sanitzedUrl); } } - return toValue(url); + return sanitzedUrl; }); return { refinedUrl } } \ No newline at end of file diff --git a/content/2.general-concepts/3.defense-systems-effectors.md b/content/2.general-concepts/3.defense-systems-effectors.md index 461d46fecee0aef8ecd5ff66ac4f81fc6932d795..fa4a8904c4ea687a877502e92a4caaf6317d4863 100644 --- a/content/2.general-concepts/3.defense-systems-effectors.md +++ b/content/2.general-concepts/3.defense-systems-effectors.md @@ -11,7 +11,7 @@ contributors: Most of the anti-phage defense systems of bacteria can be described as a combination of two main components. First, a sensing component that detects phage infection to trigger the immune response -(see [defense-systems_trigger](/general-concepts/defense-systems_trigger/)). +(see [defense-systems_trigger](/general-concepts/defense-systems_trigger)). Second, an effector component that mediates the immune response following the detection of phage infection. The effector components of anti-phage systems are very diverse, and can be arbitrarily distributed in broad categories :ref{doi=10.1038/s41579-023-00934-x} : diff --git a/content/3.defense-systems/avs.md b/content/3.defense-systems/avs.md index c56bd7711cdfa1adc3000c135aefa544a773361a..8e224bc2ef668725f0cf8ff18e944fe94e1fb4d3 100644 --- a/content/3.defense-systems/avs.md +++ b/content/3.defense-systems/avs.md @@ -74,64 +74,11 @@ The system was detected in 366 different species. Proportion of genome encoding the Avs system for the 14 phyla with more than 50 genomes in the RefSeq database. ## Structure -### AVAST_I -##### Example 1 -::molstar-pdbe-plugin ---- -height: 700 -dataUrls: - - /avs/AVAST_I.AVAST_I__Avs1A.0.V.cif - - /avs/AVAST_I.AVAST_I__Avs1C.0.V.cif - - /avs/AVAST_I.AVAST_I__Avs1B.0.V.cif ---- +::article-structure :: -### AVAST_II -##### Example 1 - -::molstar-pdbe-plugin ---- -height: 700 -dataUrls: - - /avs/AVAST_II__Avs2A.cif ---- -:: -### AVAST_III -##### Example 1 - -::molstar-pdbe-plugin ---- -height: 700 -dataUrls: - - /avs/AVAST_III.AVAST_III__Avs3B.0.V.cif - - /avs/AVAST_III.AVAST_III__Avs3A.0.V.cif - ---- -:: -### AVAST_IV -##### Example 1 - -::molstar-pdbe-plugin ---- -height: 700 -dataUrls: - - /avs/AVAST_IV__Avs4A.cif - ---- -:: -### AVAST_V -##### Example 1 - -::molstar-pdbe-plugin ---- -height: 700 -dataUrls: - - /avs/AVAST_V__Avs5A.cif - ---- -:: ## Experimental validation diff --git a/data/refseq_res.csv b/data/refseq_res.csv index becb696192d60bc89a646284da9d6d86ba120069..0a1eb9240b45c61ab360341a90d140ed28017fc9 100644 --- a/data/refseq_res.csv +++ b/data/refseq_res.csv @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:1a7d382a7f767718dc48aa49ae3dd9b0159fdffd96e48946c7a167bcbc516deb -size 68772089 +oid sha256:cdd04a43d107190f9a80e39be9684f6a130908a45de88b65e31b821393e3b9be +size 68458331 diff --git a/data/refseq_res_sm.csv b/data/refseq_res_sm.csv deleted file mode 100644 index 0fc07a648f019b58b75e3834c9417aee56f6e363..0000000000000000000000000000000000000000 --- a/data/refseq_res_sm.csv +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a9d3cf3c0649a0a3158a686e1f4c79b8978faf4ba5e14d365bf8349553c25a55 -size 2254987 diff --git a/docker-compose.yml b/docker-compose.yml index 1d7e174e51d23ed142a117a8847c8a9ece08d9bc..0cedb3670df391be58a329e1d72b5524cde783c0 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -5,7 +5,7 @@ services: context: . target: dev args: - BASE_URL: /wiki/ + BASE_URL: /wiki MEILI_HOST: http://localhost:7700 MEILI_API_KEY: f9cc073016cbb392365aae86517878cb3f3408bb85c1fafd06e27f73ccb35e3d HOST_URL: http://localhost:8082 diff --git a/nuxt.config.ts b/nuxt.config.ts index 7e0d8d3e8364702641fd3ca8dd94433daa0d3b79..a38f2c06e286a9b000bd4f9414dc87f9a34a1bde 100644 --- a/nuxt.config.ts +++ b/nuxt.config.ts @@ -1,7 +1,7 @@ import { md3 } from 'vuetify/blueprints' // https://v3.nuxtjs.org/api/configuration/nuxt.config export default defineNuxtConfig({ - ssr: true, + // ssr: false, modules: [ '@unocss/nuxt', '@nuxt/content', @@ -20,11 +20,12 @@ export default defineNuxtConfig({ "data-domaim": "defense-finder.dev.pasteur.cloud", src: "https://plausible.pasteur.cloud/js/script.js" } - - ] } }, + router: { + strict: true + }, site: { url: 'https://defensefinder.mdmlab.fr', name: 'DefenseFinder webservice and knowledge base', diff --git a/package-lock.json b/package-lock.json index 5e235c3d99a4202bc7c085e325f48bf0cbdf0a9f..92be4468f20ad15133c3d8512e710a16ec84c32d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -31,7 +31,7 @@ "@unocss/preset-icons": "^0.58.3", "@vueuse/core": "^10.7.1", "@vueuse/nuxt": "^10.7.1", - "nuxt": "^3.9.1", + "nuxt": "^3.11.1", "nuxt-meilisearch": "^1.1.0", "vuetify-nuxt-module": "^0.9.0" } @@ -1136,86 +1136,6 @@ "@css-inline/css-inline-win32-x64-msvc": "0.13.0" } }, - "node_modules/@css-inline/css-inline-darwin-arm64": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/@css-inline/css-inline-darwin-arm64/-/css-inline-darwin-arm64-0.13.0.tgz", - "integrity": "sha512-A4QvlZdhp8v+3IHKF/UftRf5GrAVUMEHCGRuk2Dx594xn/UR4ieh+B70aMm5rfONh2hv5mlR9UcoYAkVpEQ99g==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@css-inline/css-inline-darwin-x64": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/@css-inline/css-inline-darwin-x64/-/css-inline-darwin-x64-0.13.0.tgz", - "integrity": "sha512-px9z4ypzeECMyBEtlrNzTMpA1tnw5MmMIiMkBRhb8UGRr2pOBZY3yd/eEIxWzVVSPt0aIjVDwUOJ3+d0Z+BskA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@css-inline/css-inline-linux-arm-gnueabihf": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/@css-inline/css-inline-linux-arm-gnueabihf/-/css-inline-linux-arm-gnueabihf-0.13.0.tgz", - "integrity": "sha512-+uo0coLQNgk/AKeOB8mXSRd8VIlUg38zRSB9B9q0ior9oBCDPtEdn1HuCSvWxHoOSJ8QNNk+uwbz0zW4CETzFw==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@css-inline/css-inline-linux-arm64-gnu": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/@css-inline/css-inline-linux-arm64-gnu/-/css-inline-linux-arm64-gnu-0.13.0.tgz", - "integrity": "sha512-GVrsFbY5l0Hxyzxsm5S5JPGObvHm/Ybf2wZgnWBsQigxqGtr1FL535HaTwEnq6aHOpH3f08gR5Vx33gB7jG4pw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@css-inline/css-inline-linux-arm64-musl": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/@css-inline/css-inline-linux-arm64-musl/-/css-inline-linux-arm64-musl-0.13.0.tgz", - "integrity": "sha512-V5h5+CRnE01EgoafI/kyjEcM8zvN+sKLnp17Aq9LqQfsut7mO3i72d8g/xeVC37DCLoGQFLvDCzbze2NbF2dIQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, "node_modules/@css-inline/css-inline-linux-x64-gnu": { "version": "0.13.0", "resolved": "https://registry.npmjs.org/@css-inline/css-inline-linux-x64-gnu/-/css-inline-linux-x64-gnu-0.13.0.tgz", @@ -1257,26 +1177,10 @@ "node": ">= 10" } }, - "node_modules/@css-inline/css-inline-win32-x64-msvc": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/@css-inline/css-inline-win32-x64-msvc/-/css-inline-win32-x64-msvc-0.13.0.tgz", - "integrity": "sha512-6VFhFSXp4FH+NzJhLd6fFi7jKCPvIRW+vq0tV+CPuiQ3zPzMfC9nIk8sB/1VJR8EcvBAjMV53YnacuDjRFRT9g==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.20.1", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.20.1.tgz", - "integrity": "sha512-m55cpeupQ2DbuRGQMMZDzbv9J9PgVelPjlcmM5kxHnrBdBx6REaEd7LamYV7Dm8N7rCyR/XwU6rVP8ploKtIkA==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.20.2.tgz", + "integrity": "sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==", "cpu": [ "ppc64" ], @@ -1290,9 +1194,9 @@ } }, "node_modules/@esbuild/android-arm": { - "version": "0.20.1", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.20.1.tgz", - "integrity": "sha512-4j0+G27/2ZXGWR5okcJi7pQYhmkVgb4D7UKwxcqrjhvp5TKWx3cUjgB1CGj1mfdmJBQ9VnUGgUhign+FPF2Zgw==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.20.2.tgz", + "integrity": "sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==", "cpu": [ "arm" ], @@ -1306,9 +1210,9 @@ } }, "node_modules/@esbuild/android-arm64": { - "version": "0.20.1", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.20.1.tgz", - "integrity": "sha512-hCnXNF0HM6AjowP+Zou0ZJMWWa1VkD77BXe959zERgGJBBxB+sV+J9f/rcjeg2c5bsukD/n17RKWXGFCO5dD5A==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.20.2.tgz", + "integrity": "sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==", "cpu": [ "arm64" ], @@ -1322,9 +1226,9 @@ } }, "node_modules/@esbuild/android-x64": { - "version": "0.20.1", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.20.1.tgz", - "integrity": "sha512-MSfZMBoAsnhpS+2yMFYIQUPs8Z19ajwfuaSZx+tSl09xrHZCjbeXXMsUF/0oq7ojxYEpsSo4c0SfjxOYXRbpaA==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.20.2.tgz", + "integrity": "sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==", "cpu": [ "x64" ], @@ -1338,9 +1242,9 @@ } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.20.1", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.20.1.tgz", - "integrity": "sha512-Ylk6rzgMD8klUklGPzS414UQLa5NPXZD5tf8JmQU8GQrj6BrFA/Ic9tb2zRe1kOZyCbGl+e8VMbDRazCEBqPvA==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.20.2.tgz", + "integrity": "sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==", "cpu": [ "arm64" ], @@ -1354,9 +1258,9 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.20.1", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.20.1.tgz", - "integrity": "sha512-pFIfj7U2w5sMp52wTY1XVOdoxw+GDwy9FsK3OFz4BpMAjvZVs0dT1VXs8aQm22nhwoIWUmIRaE+4xow8xfIDZA==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.20.2.tgz", + "integrity": "sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==", "cpu": [ "x64" ], @@ -1370,9 +1274,9 @@ } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.20.1", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.1.tgz", - "integrity": "sha512-UyW1WZvHDuM4xDz0jWun4qtQFauNdXjXOtIy7SYdf7pbxSWWVlqhnR/T2TpX6LX5NI62spt0a3ldIIEkPM6RHw==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.2.tgz", + "integrity": "sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==", "cpu": [ "arm64" ], @@ -1386,9 +1290,9 @@ } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.20.1", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.20.1.tgz", - "integrity": "sha512-itPwCw5C+Jh/c624vcDd9kRCCZVpzpQn8dtwoYIt2TJF3S9xJLiRohnnNrKwREvcZYx0n8sCSbvGH349XkcQeg==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.20.2.tgz", + "integrity": "sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==", "cpu": [ "x64" ], @@ -1402,9 +1306,9 @@ } }, "node_modules/@esbuild/linux-arm": { - "version": "0.20.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.20.1.tgz", - "integrity": "sha512-LojC28v3+IhIbfQ+Vu4Ut5n3wKcgTu6POKIHN9Wpt0HnfgUGlBuyDDQR4jWZUZFyYLiz4RBBBmfU6sNfn6RhLw==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.20.2.tgz", + "integrity": "sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==", "cpu": [ "arm" ], @@ -1418,9 +1322,9 @@ } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.20.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.20.1.tgz", - "integrity": "sha512-cX8WdlF6Cnvw/DO9/X7XLH2J6CkBnz7Twjpk56cshk9sjYVcuh4sXQBy5bmTwzBjNVZze2yaV1vtcJS04LbN8w==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.20.2.tgz", + "integrity": "sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==", "cpu": [ "arm64" ], @@ -1434,9 +1338,9 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.20.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.20.1.tgz", - "integrity": "sha512-4H/sQCy1mnnGkUt/xszaLlYJVTz3W9ep52xEefGtd6yXDQbz/5fZE5dFLUgsPdbUOQANcVUa5iO6g3nyy5BJiw==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.20.2.tgz", + "integrity": "sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==", "cpu": [ "ia32" ], @@ -1450,9 +1354,9 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.20.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.20.1.tgz", - "integrity": "sha512-c0jgtB+sRHCciVXlyjDcWb2FUuzlGVRwGXgI+3WqKOIuoo8AmZAddzeOHeYLtD+dmtHw3B4Xo9wAUdjlfW5yYA==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.20.2.tgz", + "integrity": "sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==", "cpu": [ "loong64" ], @@ -1466,9 +1370,9 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.20.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.20.1.tgz", - "integrity": "sha512-TgFyCfIxSujyuqdZKDZ3yTwWiGv+KnlOeXXitCQ+trDODJ+ZtGOzLkSWngynP0HZnTsDyBbPy7GWVXWaEl6lhA==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.20.2.tgz", + "integrity": "sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==", "cpu": [ "mips64el" ], @@ -1482,9 +1386,9 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.20.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.20.1.tgz", - "integrity": "sha512-b+yuD1IUeL+Y93PmFZDZFIElwbmFfIKLKlYI8M6tRyzE6u7oEP7onGk0vZRh8wfVGC2dZoy0EqX1V8qok4qHaw==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.20.2.tgz", + "integrity": "sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==", "cpu": [ "ppc64" ], @@ -1498,9 +1402,9 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.20.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.20.1.tgz", - "integrity": "sha512-wpDlpE0oRKZwX+GfomcALcouqjjV8MIX8DyTrxfyCfXxoKQSDm45CZr9fanJ4F6ckD4yDEPT98SrjvLwIqUCgg==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.20.2.tgz", + "integrity": "sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==", "cpu": [ "riscv64" ], @@ -1514,9 +1418,9 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.20.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.20.1.tgz", - "integrity": "sha512-5BepC2Au80EohQ2dBpyTquqGCES7++p7G+7lXe1bAIvMdXm4YYcEfZtQrP4gaoZ96Wv1Ute61CEHFU7h4FMueQ==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.20.2.tgz", + "integrity": "sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==", "cpu": [ "s390x" ], @@ -1530,9 +1434,9 @@ } }, "node_modules/@esbuild/linux-x64": { - "version": "0.20.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.20.1.tgz", - "integrity": "sha512-5gRPk7pKuaIB+tmH+yKd2aQTRpqlf1E4f/mC+tawIm/CGJemZcHZpp2ic8oD83nKgUPMEd0fNanrnFljiruuyA==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.20.2.tgz", + "integrity": "sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==", "cpu": [ "x64" ], @@ -1546,9 +1450,9 @@ } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.20.1", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.20.1.tgz", - "integrity": "sha512-4fL68JdrLV2nVW2AaWZBv3XEm3Ae3NZn/7qy2KGAt3dexAgSVT+Hc97JKSZnqezgMlv9x6KV0ZkZY7UO5cNLCg==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.20.2.tgz", + "integrity": "sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==", "cpu": [ "x64" ], @@ -1562,9 +1466,9 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.20.1", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.20.1.tgz", - "integrity": "sha512-GhRuXlvRE+twf2ES+8REbeCb/zeikNqwD3+6S5y5/x+DYbAQUNl0HNBs4RQJqrechS4v4MruEr8ZtAin/hK5iw==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.20.2.tgz", + "integrity": "sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==", "cpu": [ "x64" ], @@ -1578,9 +1482,9 @@ } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.20.1", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.20.1.tgz", - "integrity": "sha512-ZnWEyCM0G1Ex6JtsygvC3KUUrlDXqOihw8RicRuQAzw+c4f1D66YlPNNV3rkjVW90zXVsHwZYWbJh3v+oQFM9Q==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.20.2.tgz", + "integrity": "sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==", "cpu": [ "x64" ], @@ -1594,9 +1498,9 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.20.1", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.20.1.tgz", - "integrity": "sha512-QZ6gXue0vVQY2Oon9WyLFCdSuYbXSoxaZrPuJ4c20j6ICedfsDilNPYfHLlMH7vGfU5DQR0czHLmJvH4Nzis/A==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.20.2.tgz", + "integrity": "sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==", "cpu": [ "arm64" ], @@ -1610,9 +1514,9 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.20.1", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.20.1.tgz", - "integrity": "sha512-HzcJa1NcSWTAU0MJIxOho8JftNp9YALui3o+Ny7hCh0v5f90nprly1U3Sj1Ldj/CvKKdvvFsCRvDkpsEMp4DNw==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.20.2.tgz", + "integrity": "sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==", "cpu": [ "ia32" ], @@ -1626,9 +1530,9 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.20.1", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.20.1.tgz", - "integrity": "sha512-0MBh53o6XtI6ctDnRMeQ+xoCN8kD2qI1rY1KgF/xdWQwoFeKou7puvDfV8/Wv4Ctx2rRpET/gGdz3YlNtNACSA==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.20.2.tgz", + "integrity": "sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==", "cpu": [ "x64" ], @@ -2251,9 +2155,9 @@ } }, "node_modules/@mapbox/node-pre-gyp/node_modules/detect-libc": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.2.tgz", - "integrity": "sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", + "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==", "dev": true, "engines": { "node": ">=8" @@ -2788,12 +2692,12 @@ } }, "node_modules/@nuxt/kit": { - "version": "3.10.3", - "resolved": "https://registry.npmjs.org/@nuxt/kit/-/kit-3.10.3.tgz", - "integrity": "sha512-PUjYB9Mvx0qD9H1QZBwwtY4fLlCLET+Mm9BVqUOtXCaGoXd6u6BE4e/dGFPk2UEKkIcDGrUMSbqkHYvsEuK9NQ==", + "version": "3.11.1", + "resolved": "https://registry.npmjs.org/@nuxt/kit/-/kit-3.11.1.tgz", + "integrity": "sha512-8VVlhaY4N+wipgHmSXP+gLM+esms9TEBz13I/J++PbOUJuf2cJlUUTyqMoRVL0xudVKK/8fJgSndRkyidy1m2w==", "dependencies": { - "@nuxt/schema": "3.10.3", - "c12": "^1.9.0", + "@nuxt/schema": "3.11.1", + "c12": "^1.10.0", "consola": "^3.2.3", "defu": "^6.1.4", "globby": "^14.0.1", @@ -2801,12 +2705,12 @@ "ignore": "^5.3.1", "jiti": "^1.21.0", "knitwork": "^1.0.0", - "mlly": "^1.6.0", + "mlly": "^1.6.1", "pathe": "^1.1.2", "pkg-types": "^1.0.3", "scule": "^1.3.0", "semver": "^7.6.0", - "ufo": "^1.4.0", + "ufo": "^1.5.2", "unctx": "^2.3.1", "unimport": "^3.7.1", "untyped": "^1.4.2" @@ -2816,9 +2720,9 @@ } }, "node_modules/@nuxt/schema": { - "version": "3.10.3", - "resolved": "https://registry.npmjs.org/@nuxt/schema/-/schema-3.10.3.tgz", - "integrity": "sha512-a4cYbeskEVBPazgAhvUGkL/j7ho/iPWMK3vCEm6dRMjSqHVEITRosrj0aMfLbRrDpTrMjlRs0ZitxiaUfE/p5Q==", + "version": "3.11.1", + "resolved": "https://registry.npmjs.org/@nuxt/schema/-/schema-3.11.1.tgz", + "integrity": "sha512-XyGlJsf3DtkouBCvBHlvjz+xvN4vza3W7pY3YBNMnktxlMQtfFiF3aB3A2NGLmBnJPqD3oY0j7lljraELb5hkg==", "dependencies": { "@nuxt/ui-templates": "^1.3.1", "consola": "^3.2.3", @@ -2828,7 +2732,7 @@ "pkg-types": "^1.0.3", "scule": "^1.3.0", "std-env": "^3.7.0", - "ufo": "^1.4.0", + "ufo": "^1.5.2", "unimport": "^3.7.1", "untyped": "^1.4.2" }, @@ -2870,43 +2774,43 @@ "integrity": "sha512-5gc02Pu1HycOVUWJ8aYsWeeXcSTPe8iX8+KIrhyEtEoOSkY0eMBuo0ssljB8wALuEmepv31DlYe5gpiRwkjESA==" }, "node_modules/@nuxt/vite-builder": { - "version": "3.10.3", - "resolved": "https://registry.npmjs.org/@nuxt/vite-builder/-/vite-builder-3.10.3.tgz", - "integrity": "sha512-BqkbrYkEk1AVUJleofbqTRV+ltf2p1CDjGDK78zENPCgrSABlj4F4oK8rze8vmRY5qoH7kMZxgMa2dXVXCp6OA==", + "version": "3.11.1", + "resolved": "https://registry.npmjs.org/@nuxt/vite-builder/-/vite-builder-3.11.1.tgz", + "integrity": "sha512-8DVK2Jb9xgfnvTfKr5mL3UDdAIrd3q3F4EmoVsXVKJe8NTt9LW38QdGwGViIQm9wzLDDEo0mgWF+n7WoGEH0xQ==", "dev": true, "dependencies": { - "@nuxt/kit": "3.10.3", + "@nuxt/kit": "3.11.1", "@rollup/plugin-replace": "^5.0.5", "@vitejs/plugin-vue": "^5.0.4", "@vitejs/plugin-vue-jsx": "^3.1.0", - "autoprefixer": "^10.4.17", + "autoprefixer": "^10.4.18", "clear": "^0.1.0", "consola": "^3.2.3", - "cssnano": "^6.0.3", + "cssnano": "^6.1.0", "defu": "^6.1.4", - "esbuild": "^0.20.1", + "esbuild": "^0.20.2", "escape-string-regexp": "^5.0.0", "estree-walker": "^3.0.3", "externality": "^1.0.2", "fs-extra": "^11.2.0", "get-port-please": "^3.1.2", - "h3": "^1.10.2", + "h3": "^1.11.1", "knitwork": "^1.0.0", - "magic-string": "^0.30.7", - "mlly": "^1.6.0", + "magic-string": "^0.30.8", + "mlly": "^1.6.1", "ohash": "^1.1.3", "pathe": "^1.1.2", "perfect-debounce": "^1.0.0", "pkg-types": "^1.0.3", - "postcss": "^8.4.35", + "postcss": "^8.4.36", "rollup-plugin-visualizer": "^5.12.0", "std-env": "^3.7.0", "strip-literal": "^2.0.0", - "ufo": "^1.4.0", + "ufo": "^1.5.2", "unenv": "^1.9.0", - "unplugin": "^1.7.1", - "vite": "^5.1.4", - "vite-node": "^1.3.1", + "unplugin": "^1.10.0", + "vite": "^5.1.6", + "vite-node": "^1.4.0", "vite-plugin-checker": "^0.6.4", "vue-bundle-renderer": "^2.0.0" }, @@ -3091,17 +2995,17 @@ "@parcel/watcher-win32-x64": "2.4.1" } }, - "node_modules/@parcel/watcher-android-arm64": { + "node_modules/@parcel/watcher-linux-x64-glibc": { "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.4.1.tgz", - "integrity": "sha512-LOi/WTbbh3aTn2RYddrO8pnapixAziFl6SMxHM69r3tvdSm94JtCenaKgk1GRg5FJ5wpMCpHeW+7yqPlvZv7kg==", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.4.1.tgz", + "integrity": "sha512-s9O3fByZ/2pyYDPoLM6zt92yu6P4E39a03zvO0qCHOTjxmt3GHRMLuRZEWhWLASTMSrrnVNWdVI/+pUElJBBBg==", "cpu": [ - "arm64" + "x64" ], "dev": true, "optional": true, "os": [ - "android" + "linux" ], "engines": { "node": ">= 10.0.0" @@ -3111,17 +3015,17 @@ "url": "https://opencollective.com/parcel" } }, - "node_modules/@parcel/watcher-darwin-arm64": { + "node_modules/@parcel/watcher-linux-x64-musl": { "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.4.1.tgz", - "integrity": "sha512-ln41eihm5YXIY043vBrrHfn94SIBlqOWmoROhsMVTSXGh0QahKGy77tfEywQ7v3NywyxBBkGIfrWRHm0hsKtzA==", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.4.1.tgz", + "integrity": "sha512-L2nZTYR1myLNST0O632g0Dx9LyMNHrn6TOt76sYxWLdff3cB22/GZX2UPtJnaqQPdCRoszoY5rcOj4oMTtp5fQ==", "cpu": [ - "arm64" + "x64" ], "dev": true, "optional": true, "os": [ - "darwin" + "linux" ], "engines": { "node": ">= 10.0.0" @@ -3131,18 +3035,19 @@ "url": "https://opencollective.com/parcel" } }, - "node_modules/@parcel/watcher-darwin-x64": { + "node_modules/@parcel/watcher-wasm": { "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.4.1.tgz", - "integrity": "sha512-yrw81BRLjjtHyDu7J61oPuSoeYWR3lDElcPGJyOvIXmor6DEo7/G2u1o7I38cwlcoBHQFULqF6nesIX3tsEXMg==", - "cpu": [ - "x64" + "resolved": "https://registry.npmjs.org/@parcel/watcher-wasm/-/watcher-wasm-2.4.1.tgz", + "integrity": "sha512-/ZR0RxqxU/xxDGzbzosMjh4W6NdYFMqq2nvo2b8SLi7rsl/4jkL8S5stIikorNkdR50oVDvqb/3JT05WM+CRRA==", + "bundleDependencies": [ + "napi-wasm" ], "dev": true, - "optional": true, - "os": [ - "darwin" - ], + "dependencies": { + "is-glob": "^4.0.3", + "micromatch": "^4.0.5", + "napi-wasm": "^1.1.0" + }, "engines": { "node": ">= 10.0.0" }, @@ -3151,72 +3056,80 @@ "url": "https://opencollective.com/parcel" } }, - "node_modules/@parcel/watcher-freebsd-x64": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.4.1.tgz", - "integrity": "sha512-TJa3Pex/gX3CWIx/Co8k+ykNdDCLx+TuZj3f3h7eOjgpdKM+Mnix37RYsYU4LHhiYJz3DK5nFCCra81p6g050w==", - "cpu": [ - "x64" - ], + "node_modules/@parcel/watcher-wasm/node_modules/napi-wasm": { + "version": "1.1.0", "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">= 10.0.0" + "inBundle": true, + "license": "MIT" + }, + "node_modules/@pinia/nuxt": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/@pinia/nuxt/-/nuxt-0.5.1.tgz", + "integrity": "sha512-6wT6TqY81n+7/x3Yhf0yfaJVKkZU42AGqOR0T3+UvChcaOJhSma7OWPN64v+ptYlznat+fS1VTwNAcbi2lzHnw==", + "dependencies": { + "@nuxt/kit": "^3.5.0", + "pinia": ">=2.1.7" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "url": "https://github.com/sponsors/posva" } }, - "node_modules/@parcel/watcher-linux-arm-glibc": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.4.1.tgz", - "integrity": "sha512-4rVYDlsMEYfa537BRXxJ5UF4ddNwnr2/1O4MHM5PjI9cvV2qymvhwZSFgXqbS8YoTk5i/JR0L0JDs69BUn45YA==", - "cpu": [ - "arm" - ], + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", "dev": true, "optional": true, - "os": [ - "linux" - ], "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "node": ">=14" } }, - "node_modules/@parcel/watcher-linux-arm64-glibc": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.4.1.tgz", - "integrity": "sha512-BJ7mH985OADVLpbrzCLgrJ3TOpiZggE9FMblfO65PlOCdG++xJpKUJ0Aol74ZUIYfb8WsRlUdgrZxKkz3zXWYA==", - "cpu": [ - "arm64" - ], + "node_modules/@polka/url": { + "version": "1.0.0-next.25", + "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.25.tgz", + "integrity": "sha512-j7P6Rgr3mmtdkeDGTe0E/aYyWEWVtc5yFXtHCRHs28/jptDEWfaVOc5T7cblqy1XKPPfCxJc/8DwQ5YgLOZOVQ==", + "dev": true + }, + "node_modules/@replit/codemirror-indentation-markers": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@replit/codemirror-indentation-markers/-/codemirror-indentation-markers-6.5.0.tgz", + "integrity": "sha512-5RgeuQ6erfROi1EVI2X7G4UR+KByjb07jhYMynvpvlrV22JlnARifmKMGEUKy0pKcxBNfwbFqoUlTYHPgyZNlg==", + "dev": true, + "peerDependencies": { + "@codemirror/language": "^6.0.0", + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.0.0" + } + }, + "node_modules/@resvg/resvg-js": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@resvg/resvg-js/-/resvg-js-2.6.0.tgz", + "integrity": "sha512-Tf3YpbBKcQn991KKcw/vg7vZf98v01seSv6CVxZBbRkL/xyjnoYB6KgrFL6zskT1A4dWC/vg77KyNOW+ePaNlA==", "dev": true, - "optional": true, - "os": [ - "linux" - ], "engines": { - "node": ">= 10.0.0" + "node": ">= 10" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "optionalDependencies": { + "@resvg/resvg-js-android-arm-eabi": "2.6.0", + "@resvg/resvg-js-android-arm64": "2.6.0", + "@resvg/resvg-js-darwin-arm64": "2.6.0", + "@resvg/resvg-js-darwin-x64": "2.6.0", + "@resvg/resvg-js-linux-arm-gnueabihf": "2.6.0", + "@resvg/resvg-js-linux-arm64-gnu": "2.6.0", + "@resvg/resvg-js-linux-arm64-musl": "2.6.0", + "@resvg/resvg-js-linux-x64-gnu": "2.6.0", + "@resvg/resvg-js-linux-x64-musl": "2.6.0", + "@resvg/resvg-js-win32-arm64-msvc": "2.6.0", + "@resvg/resvg-js-win32-ia32-msvc": "2.6.0", + "@resvg/resvg-js-win32-x64-msvc": "2.6.0" } }, - "node_modules/@parcel/watcher-linux-arm64-musl": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.4.1.tgz", - "integrity": "sha512-p4Xb7JGq3MLgAfYhslU2SjoV9G0kI0Xry0kuxeG/41UfpjHGOhv7UoUDAz/jb1u2elbhazy4rRBL8PegPJFBhA==", + "node_modules/@resvg/resvg-js-linux-x64-gnu": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@resvg/resvg-js-linux-x64-gnu/-/resvg-js-linux-x64-gnu-2.6.0.tgz", + "integrity": "sha512-n3zC8DWsvxC1AwxpKFclIPapDFibs5XdIRoV/mcIlxlh0vseW1F49b97F33BtJQRmlntsqqN6GMMqx8byB7B+Q==", "cpu": [ - "arm64" + "x64" ], "dev": true, "optional": true, @@ -3224,17 +3137,13 @@ "linux" ], "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "node": ">= 10" } }, - "node_modules/@parcel/watcher-linux-x64-glibc": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.4.1.tgz", - "integrity": "sha512-s9O3fByZ/2pyYDPoLM6zt92yu6P4E39a03zvO0qCHOTjxmt3GHRMLuRZEWhWLASTMSrrnVNWdVI/+pUElJBBBg==", + "node_modules/@resvg/resvg-js-linux-x64-musl": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@resvg/resvg-js-linux-x64-musl/-/resvg-js-linux-x64-musl-2.6.0.tgz", + "integrity": "sha512-n4tasK1HOlAxdTEROgYA1aCfsEKk0UOFDNd/AQTTZlTmCbHKXPq+O8npaaKlwXquxlVK8vrkcWbksbiGqbCAcw==", "cpu": [ "x64" ], @@ -3243,371 +3152,6 @@ "os": [ "linux" ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-x64-musl": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.4.1.tgz", - "integrity": "sha512-L2nZTYR1myLNST0O632g0Dx9LyMNHrn6TOt76sYxWLdff3cB22/GZX2UPtJnaqQPdCRoszoY5rcOj4oMTtp5fQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-wasm": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-wasm/-/watcher-wasm-2.4.1.tgz", - "integrity": "sha512-/ZR0RxqxU/xxDGzbzosMjh4W6NdYFMqq2nvo2b8SLi7rsl/4jkL8S5stIikorNkdR50oVDvqb/3JT05WM+CRRA==", - "bundleDependencies": [ - "napi-wasm" - ], - "dev": true, - "dependencies": { - "is-glob": "^4.0.3", - "micromatch": "^4.0.5", - "napi-wasm": "^1.1.0" - }, - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-wasm/node_modules/napi-wasm": { - "version": "1.1.0", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/@parcel/watcher-win32-arm64": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.4.1.tgz", - "integrity": "sha512-Uq2BPp5GWhrq/lcuItCHoqxjULU1QYEcyjSO5jqqOK8RNFDBQnenMMx4gAl3v8GiWa59E9+uDM7yZ6LxwUIfRg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-win32-ia32": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.4.1.tgz", - "integrity": "sha512-maNRit5QQV2kgHFSYwftmPBxiuK5u4DXjbXx7q6eKjq5dsLXZ4FJiVvlcw35QXzk0KrUecJmuVFbj4uV9oYrcw==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-win32-x64": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.4.1.tgz", - "integrity": "sha512-+DvS92F9ezicfswqrvIRM2njcYJbd5mb9CUgtrHCHmvn7pPPa+nMDRu1o1bYYz/l5IB2NVGNJWiH7h1E58IF2A==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@pinia/nuxt": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/@pinia/nuxt/-/nuxt-0.5.1.tgz", - "integrity": "sha512-6wT6TqY81n+7/x3Yhf0yfaJVKkZU42AGqOR0T3+UvChcaOJhSma7OWPN64v+ptYlznat+fS1VTwNAcbi2lzHnw==", - "dependencies": { - "@nuxt/kit": "^3.5.0", - "pinia": ">=2.1.7" - }, - "funding": { - "url": "https://github.com/sponsors/posva" - } - }, - "node_modules/@pkgjs/parseargs": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", - "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", - "dev": true, - "optional": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/@polka/url": { - "version": "1.0.0-next.25", - "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.25.tgz", - "integrity": "sha512-j7P6Rgr3mmtdkeDGTe0E/aYyWEWVtc5yFXtHCRHs28/jptDEWfaVOc5T7cblqy1XKPPfCxJc/8DwQ5YgLOZOVQ==", - "dev": true - }, - "node_modules/@replit/codemirror-indentation-markers": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@replit/codemirror-indentation-markers/-/codemirror-indentation-markers-6.5.0.tgz", - "integrity": "sha512-5RgeuQ6erfROi1EVI2X7G4UR+KByjb07jhYMynvpvlrV22JlnARifmKMGEUKy0pKcxBNfwbFqoUlTYHPgyZNlg==", - "dev": true, - "peerDependencies": { - "@codemirror/language": "^6.0.0", - "@codemirror/state": "^6.0.0", - "@codemirror/view": "^6.0.0" - } - }, - "node_modules/@resvg/resvg-js": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@resvg/resvg-js/-/resvg-js-2.6.0.tgz", - "integrity": "sha512-Tf3YpbBKcQn991KKcw/vg7vZf98v01seSv6CVxZBbRkL/xyjnoYB6KgrFL6zskT1A4dWC/vg77KyNOW+ePaNlA==", - "dev": true, - "engines": { - "node": ">= 10" - }, - "optionalDependencies": { - "@resvg/resvg-js-android-arm-eabi": "2.6.0", - "@resvg/resvg-js-android-arm64": "2.6.0", - "@resvg/resvg-js-darwin-arm64": "2.6.0", - "@resvg/resvg-js-darwin-x64": "2.6.0", - "@resvg/resvg-js-linux-arm-gnueabihf": "2.6.0", - "@resvg/resvg-js-linux-arm64-gnu": "2.6.0", - "@resvg/resvg-js-linux-arm64-musl": "2.6.0", - "@resvg/resvg-js-linux-x64-gnu": "2.6.0", - "@resvg/resvg-js-linux-x64-musl": "2.6.0", - "@resvg/resvg-js-win32-arm64-msvc": "2.6.0", - "@resvg/resvg-js-win32-ia32-msvc": "2.6.0", - "@resvg/resvg-js-win32-x64-msvc": "2.6.0" - } - }, - "node_modules/@resvg/resvg-js-android-arm-eabi": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@resvg/resvg-js-android-arm-eabi/-/resvg-js-android-arm-eabi-2.6.0.tgz", - "integrity": "sha512-lJnZ/2P5aMocrFMW7HWhVne5gH82I8xH6zsfH75MYr4+/JOaVcGCTEQ06XFohGMdYRP3v05SSPLPvTM/RHjxfA==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@resvg/resvg-js-android-arm64": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@resvg/resvg-js-android-arm64/-/resvg-js-android-arm64-2.6.0.tgz", - "integrity": "sha512-N527f529bjMwYWShZYfBD60dXA4Fux+D695QsHQ93BDYZSHUoOh1CUGUyICevnTxs7VgEl98XpArmUWBZQVMfQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@resvg/resvg-js-darwin-arm64": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@resvg/resvg-js-darwin-arm64/-/resvg-js-darwin-arm64-2.6.0.tgz", - "integrity": "sha512-MabUKLVayEwlPo0mIqAmMt+qESN8LltCvv5+GLgVga1avpUrkxj/fkU1TKm8kQegutUjbP/B0QuMuUr0uhF8ew==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@resvg/resvg-js-darwin-x64": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@resvg/resvg-js-darwin-x64/-/resvg-js-darwin-x64-2.6.0.tgz", - "integrity": "sha512-zrFetdnSw/suXjmyxSjfDV7i61hahv6DDG6kM7BYN2yJ3Es5+BZtqYZTcIWogPJedYKmzN1YTMWGd/3f0ubFiA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@resvg/resvg-js-linux-arm-gnueabihf": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@resvg/resvg-js-linux-arm-gnueabihf/-/resvg-js-linux-arm-gnueabihf-2.6.0.tgz", - "integrity": "sha512-sH4gxXt7v7dGwjGyzLwn7SFGvwZG6DQqLaZ11MmzbCwd9Zosy1TnmrMJfn6TJ7RHezmQMgBPi18bl55FZ1AT4A==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@resvg/resvg-js-linux-arm64-gnu": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@resvg/resvg-js-linux-arm64-gnu/-/resvg-js-linux-arm64-gnu-2.6.0.tgz", - "integrity": "sha512-fCyMncqCJtrlANADIduYF4IfnWQ295UKib7DAxFXQhBsM9PLDTpizr0qemZcCNadcwSVHnAIzL4tliZhCM8P6A==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@resvg/resvg-js-linux-arm64-musl": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@resvg/resvg-js-linux-arm64-musl/-/resvg-js-linux-arm64-musl-2.6.0.tgz", - "integrity": "sha512-ouLjTgBQHQyxLht4FdMPTvuY8xzJigM9EM2Tlu0llWkN1mKyTQrvYWi6TA6XnKdzDJHy7ZLpWpjZi7F5+Pg+Vg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@resvg/resvg-js-linux-x64-gnu": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@resvg/resvg-js-linux-x64-gnu/-/resvg-js-linux-x64-gnu-2.6.0.tgz", - "integrity": "sha512-n3zC8DWsvxC1AwxpKFclIPapDFibs5XdIRoV/mcIlxlh0vseW1F49b97F33BtJQRmlntsqqN6GMMqx8byB7B+Q==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@resvg/resvg-js-linux-x64-musl": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@resvg/resvg-js-linux-x64-musl/-/resvg-js-linux-x64-musl-2.6.0.tgz", - "integrity": "sha512-n4tasK1HOlAxdTEROgYA1aCfsEKk0UOFDNd/AQTTZlTmCbHKXPq+O8npaaKlwXquxlVK8vrkcWbksbiGqbCAcw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@resvg/resvg-js-win32-arm64-msvc": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@resvg/resvg-js-win32-arm64-msvc/-/resvg-js-win32-arm64-msvc-2.6.0.tgz", - "integrity": "sha512-X2+EoBJFwDI5LDVb51Sk7ldnVLitMGr9WwU/i21i3fAeAXZb3hM16k67DeTy16OYkT2dk/RfU1tP1wG+rWbz2Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@resvg/resvg-js-win32-ia32-msvc": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@resvg/resvg-js-win32-ia32-msvc/-/resvg-js-win32-ia32-msvc-2.6.0.tgz", - "integrity": "sha512-L7oevWjQoUgK5W1fCKn0euSVemhDXVhrjtwqpc7MwBKKimYeiOshO1Li1pa8bBt5PESahenhWgdB6lav9O0fEg==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@resvg/resvg-js-win32-x64-msvc": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@resvg/resvg-js-win32-x64-msvc/-/resvg-js-win32-x64-msvc-2.6.0.tgz", - "integrity": "sha512-8lJlghb+Unki5AyKgsnFbRJwkEj9r1NpwyuBG8yEJiG1W9eEGl03R3I7bsVa3haof/3J1NlWf0rzSa1G++A2iw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], "engines": { "node": ">= 10" } @@ -3744,174 +3288,70 @@ "optional": true } } - }, - "node_modules/@rollup/plugin-replace": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/@rollup/plugin-replace/-/plugin-replace-5.0.5.tgz", - "integrity": "sha512-rYO4fOi8lMaTg/z5Jb+hKnrHHVn8j2lwkqwyS4kTRhKyWOLf2wST2sWXr4WzWiTcoHTp2sTjqUbqIj2E39slKQ==", - "dev": true, - "dependencies": { - "@rollup/pluginutils": "^5.0.1", - "magic-string": "^0.30.3" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" - }, - "peerDependenciesMeta": { - "rollup": { - "optional": true - } - } - }, - "node_modules/@rollup/plugin-terser": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/@rollup/plugin-terser/-/plugin-terser-0.4.4.tgz", - "integrity": "sha512-XHeJC5Bgvs8LfukDwWZp7yeqin6ns8RTl2B9avbejt6tZqsqvVoWI7ZTQrcNsfKEDWBTnTxM8nMDkO2IFFbd0A==", - "dev": true, - "dependencies": { - "serialize-javascript": "^6.0.1", - "smob": "^1.0.0", - "terser": "^5.17.4" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "rollup": "^2.0.0||^3.0.0||^4.0.0" - }, - "peerDependenciesMeta": { - "rollup": { - "optional": true - } - } - }, - "node_modules/@rollup/pluginutils": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.0.tgz", - "integrity": "sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==", - "dependencies": { - "@types/estree": "^1.0.0", - "estree-walker": "^2.0.2", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" - }, - "peerDependenciesMeta": { - "rollup": { - "optional": true - } - } - }, - "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.13.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.13.0.tgz", - "integrity": "sha512-5ZYPOuaAqEH/W3gYsRkxQATBW3Ii1MfaT4EQstTnLKViLi2gLSQmlmtTpGucNP3sXEpOiI5tdGhjdE111ekyEg==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-android-arm64": { - "version": "4.13.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.13.0.tgz", - "integrity": "sha512-BSbaCmn8ZadK3UAQdlauSvtaJjhlDEjS5hEVVIN3A4bbl3X+otyf/kOJV08bYiRxfejP3DXFzO2jz3G20107+Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.13.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.13.0.tgz", - "integrity": "sha512-Ovf2evVaP6sW5Ut0GHyUSOqA6tVKfrTHddtmxGQc1CTQa1Cw3/KMCDEEICZBbyppcwnhMwcDce9ZRxdWRpVd6g==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.13.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.13.0.tgz", - "integrity": "sha512-U+Jcxm89UTK592vZ2J9st9ajRv/hrwHdnvyuJpa5A2ngGSVHypigidkQJP+YiGL6JODiUeMzkqQzbCG3At81Gg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.13.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.13.0.tgz", - "integrity": "sha512-8wZidaUJUTIR5T4vRS22VkSMOVooG0F4N+JSwQXWSRiC6yfEsFMLTYRFHvby5mFFuExHa/yAp9juSphQQJAijQ==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.13.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.13.0.tgz", - "integrity": "sha512-Iu0Kno1vrD7zHQDxOmvweqLkAzjxEVqNhUIXBsZ8hu8Oak7/5VTPrxOEZXYC1nmrBVJp0ZcL2E7lSuuOVaE3+w==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.13.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.13.0.tgz", - "integrity": "sha512-C31QrW47llgVyrRjIwiOwsHFcaIwmkKi3PCroQY5aVq4H0A5v/vVVAtFsI1nfBngtoRpeREvZOkIhmRwUKkAdw==", - "cpu": [ - "arm64" - ], + }, + "node_modules/@rollup/plugin-replace": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/@rollup/plugin-replace/-/plugin-replace-5.0.5.tgz", + "integrity": "sha512-rYO4fOi8lMaTg/z5Jb+hKnrHHVn8j2lwkqwyS4kTRhKyWOLf2wST2sWXr4WzWiTcoHTp2sTjqUbqIj2E39slKQ==", "dev": true, - "optional": true, - "os": [ - "linux" - ] + "dependencies": { + "@rollup/pluginutils": "^5.0.1", + "magic-string": "^0.30.3" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } }, - "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.13.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.13.0.tgz", - "integrity": "sha512-Oq90dtMHvthFOPMl7pt7KmxzX7E71AfyIhh+cPhLY9oko97Zf2C9tt/XJD4RgxhaGeAraAXDtqxvKE1y/j35lA==", - "cpu": [ - "riscv64" - ], + "node_modules/@rollup/plugin-terser": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/@rollup/plugin-terser/-/plugin-terser-0.4.4.tgz", + "integrity": "sha512-XHeJC5Bgvs8LfukDwWZp7yeqin6ns8RTl2B9avbejt6tZqsqvVoWI7ZTQrcNsfKEDWBTnTxM8nMDkO2IFFbd0A==", "dev": true, - "optional": true, - "os": [ - "linux" - ] + "dependencies": { + "serialize-javascript": "^6.0.1", + "smob": "^1.0.0", + "terser": "^5.17.4" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/pluginutils": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.0.tgz", + "integrity": "sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==", + "dependencies": { + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } }, "node_modules/@rollup/rollup-linux-x64-gnu": { "version": "4.13.0", @@ -3939,45 +3379,6 @@ "linux" ] }, - "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.13.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.13.0.tgz", - "integrity": "sha512-46ue8ymtm/5PUU6pCvjlic0z82qWkxv54GTJZgHrQUuZnVH+tvvSP0LsozIDsCBFO4VjJ13N68wqrKSeScUKdA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.13.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.13.0.tgz", - "integrity": "sha512-P5/MqLdLSlqxbeuJ3YDeX37srC8mCflSyTrUsgbU1c/U9j6l2g2GiIdYaGD9QjdMQPMSgYm7hgg0551wHyIluw==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.13.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.13.0.tgz", - "integrity": "sha512-UKXUQNbO3DOhzLRwHSpa0HnhhCgNODvfoPWv2FCXme8N/ANFfhIPMGuOT+QuKd16+B5yxZ0HdpNlqPvTMS1qfw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ] - }, "node_modules/@rushstack/eslint-patch": { "version": "1.7.2", "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.7.2.tgz", @@ -4576,13 +3977,38 @@ } }, "node_modules/@unhead/dom": { - "version": "1.8.13", - "resolved": "https://registry.npmjs.org/@unhead/dom/-/dom-1.8.13.tgz", - "integrity": "sha512-BWqtatmrcrT+rN/FBZ/Il7mW0TuPlS4bXrsZewAVanOPU3ahr+sHAIUDJmDjziBjSUsO5wLOEYXA+4t08AZnrQ==", + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/@unhead/dom/-/dom-1.9.2.tgz", + "integrity": "sha512-yREmUAfYJsPV9qR3G85MkdH+FdvsHf8AIJRm7FgQidrPxFr8tCICdID3+jXULz3oq8pFye1tAyHlBHXeq3SIpA==", "dev": true, "dependencies": { - "@unhead/schema": "1.8.13", - "@unhead/shared": "1.8.13" + "@unhead/schema": "1.9.2", + "@unhead/shared": "1.9.2" + }, + "funding": { + "url": "https://github.com/sponsors/harlan-zw" + } + }, + "node_modules/@unhead/dom/node_modules/@unhead/schema": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/@unhead/schema/-/schema-1.9.2.tgz", + "integrity": "sha512-NRCAcuWtD2WCL8u3qR1yn41JpDB+ExjBnSLAuJseOD9+XJjQBqPRgx/bhxZ3Dx6vrrCnCF+SvKr+W1pa+3mWdA==", + "dev": true, + "dependencies": { + "hookable": "^5.5.3", + "zhead": "^2.2.4" + }, + "funding": { + "url": "https://github.com/sponsors/harlan-zw" + } + }, + "node_modules/@unhead/dom/node_modules/@unhead/shared": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/@unhead/shared/-/shared-1.9.2.tgz", + "integrity": "sha512-jXQ4vK9wXf66hflOSBUXQKVsOLJrYVSOknDH+9PTwz5CIgJv/Y/o/NkRCJjyf5W7qFf605Te28lbTeLumT+BeQ==", + "dev": true, + "dependencies": { + "@unhead/schema": "1.9.2" }, "funding": { "url": "https://github.com/sponsors/harlan-zw" @@ -4630,28 +4056,53 @@ } }, "node_modules/@unhead/ssr": { - "version": "1.8.13", - "resolved": "https://registry.npmjs.org/@unhead/ssr/-/ssr-1.8.13.tgz", - "integrity": "sha512-4GzpVlwJn8HRa6YE+9UuABf3XSe1WvcqLOWszCJiD3oUaFCZ2jqrVXS4v/jhJ6bAm7LTHrfT7Znyw4nQG57/XQ==", + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/@unhead/ssr/-/ssr-1.9.2.tgz", + "integrity": "sha512-XKNAK3A67ZZpNq8arTyUj7brmTOYH3PJrVSx546MCQQvCuP6U3brWyIPy12+a/XiAxr4z62vd2IHCZya8OrZrQ==", "dev": true, "dependencies": { - "@unhead/schema": "1.8.13", - "@unhead/shared": "1.8.13" + "@unhead/schema": "1.9.2", + "@unhead/shared": "1.9.2" + }, + "funding": { + "url": "https://github.com/sponsors/harlan-zw" + } + }, + "node_modules/@unhead/ssr/node_modules/@unhead/schema": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/@unhead/schema/-/schema-1.9.2.tgz", + "integrity": "sha512-NRCAcuWtD2WCL8u3qR1yn41JpDB+ExjBnSLAuJseOD9+XJjQBqPRgx/bhxZ3Dx6vrrCnCF+SvKr+W1pa+3mWdA==", + "dev": true, + "dependencies": { + "hookable": "^5.5.3", + "zhead": "^2.2.4" + }, + "funding": { + "url": "https://github.com/sponsors/harlan-zw" + } + }, + "node_modules/@unhead/ssr/node_modules/@unhead/shared": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/@unhead/shared/-/shared-1.9.2.tgz", + "integrity": "sha512-jXQ4vK9wXf66hflOSBUXQKVsOLJrYVSOknDH+9PTwz5CIgJv/Y/o/NkRCJjyf5W7qFf605Te28lbTeLumT+BeQ==", + "dev": true, + "dependencies": { + "@unhead/schema": "1.9.2" }, "funding": { "url": "https://github.com/sponsors/harlan-zw" } }, "node_modules/@unhead/vue": { - "version": "1.8.13", - "resolved": "https://registry.npmjs.org/@unhead/vue/-/vue-1.8.13.tgz", - "integrity": "sha512-2CIwSeadfJxFfY44nz7U+w/F7lg646aw2t8G58P4A08t6KtPRoAVA0cR0iX+yqQEZIAKYEoaNINv3p/GMxyvBw==", + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/@unhead/vue/-/vue-1.9.2.tgz", + "integrity": "sha512-wp0eOyb7tu2isSt1IiDGm194W/8DVL3cXZd8uvhVlhS9yPL3TzwrSNbvwx95fhfrGuXFraoLjp4SpZ2BCszFsg==", "dev": true, "dependencies": { - "@unhead/schema": "1.8.13", - "@unhead/shared": "1.8.13", + "@unhead/schema": "1.9.2", + "@unhead/shared": "1.9.2", "hookable": "^5.5.3", - "unhead": "1.8.13" + "unhead": "1.9.2" }, "funding": { "url": "https://github.com/sponsors/harlan-zw" @@ -4660,6 +4111,31 @@ "vue": ">=2.7 || >=3" } }, + "node_modules/@unhead/vue/node_modules/@unhead/schema": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/@unhead/schema/-/schema-1.9.2.tgz", + "integrity": "sha512-NRCAcuWtD2WCL8u3qR1yn41JpDB+ExjBnSLAuJseOD9+XJjQBqPRgx/bhxZ3Dx6vrrCnCF+SvKr+W1pa+3mWdA==", + "dev": true, + "dependencies": { + "hookable": "^5.5.3", + "zhead": "^2.2.4" + }, + "funding": { + "url": "https://github.com/sponsors/harlan-zw" + } + }, + "node_modules/@unhead/vue/node_modules/@unhead/shared": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/@unhead/shared/-/shared-1.9.2.tgz", + "integrity": "sha512-jXQ4vK9wXf66hflOSBUXQKVsOLJrYVSOknDH+9PTwz5CIgJv/Y/o/NkRCJjyf5W7qFf605Te28lbTeLumT+BeQ==", + "dev": true, + "dependencies": { + "@unhead/schema": "1.9.2" + }, + "funding": { + "url": "https://github.com/sponsors/harlan-zw" + } + }, "node_modules/@unocss/astro": { "version": "0.58.5", "resolved": "https://registry.npmjs.org/@unocss/astro/-/astro-0.58.5.tgz", @@ -5728,9 +5204,9 @@ } }, "node_modules/acorn-import-attributes": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/acorn-import-attributes/-/acorn-import-attributes-1.9.2.tgz", - "integrity": "sha512-O+nfJwNolEA771IYJaiLWK1UAwjNsQmZbTRqqwBYxCgVQTmpFEMvBw6LOIQV0Me339L5UMVYFyRohGnGlQDdIQ==", + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/acorn-import-attributes/-/acorn-import-attributes-1.9.4.tgz", + "integrity": "sha512-dNIX/5UEnZvVL94dV2scl4VIooK36D8AteP4xiz7cPKhDbhLhSuWkzG580g+Q7TXJklp+Z21SiaK7/HpLO84Qg==", "dev": true, "peerDependencies": { "acorn": "^8" @@ -6100,9 +5576,9 @@ "dev": true }, "node_modules/autoprefixer": { - "version": "10.4.18", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.18.tgz", - "integrity": "sha512-1DKbDfsr6KUElM6wg+0zRNkB/Q7WcKYAaK+pzXn+Xqmszm/5Xa9coeNdtP88Vi+dPzZnMjhge8GIV49ZQkDa+g==", + "version": "10.4.19", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.19.tgz", + "integrity": "sha512-BaENR2+zBZ8xXhM4pUaKUxlVdxZ0EZhjvbopwnXmxRUfqDmwSpC2lAi/QXvx7NRdPCo1WKEcEF6mV64si1z4Ew==", "dev": true, "funding": [ { @@ -6120,7 +5596,7 @@ ], "dependencies": { "browserslist": "^4.23.0", - "caniuse-lite": "^1.0.30001591", + "caniuse-lite": "^1.0.30001599", "fraction.js": "^4.3.7", "normalize-range": "^0.1.2", "picocolors": "^1.0.0", @@ -6168,9 +5644,9 @@ "dev": true }, "node_modules/bare-events": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.2.1.tgz", - "integrity": "sha512-9GYPpsPFvrWBkelIhOhTWtkeZxVxZOdb3VnFTCzlOo3OjvmTvzLoZFUT8kNFACx0vJej6QPney1Cf9BvzCNE/A==", + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.2.2.tgz", + "integrity": "sha512-h7z00dWdG0PYOQEvChhOSWvOfkIKsdZGkWr083FgN/HyoQuebSew/cgirYqh9SCuy/hRvxc5Vy6Fw8xAmYHLkQ==", "dev": true, "optional": true }, @@ -6498,9 +5974,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001597", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001597.tgz", - "integrity": "sha512-7LjJvmQU6Sj7bL0j5b5WY/3n7utXUJvAe1lxhsHDbLmwX9mdL86Yjtr+5SRCyf8qME4M7pU2hswj0FpyBVCv9w==", + "version": "1.0.30001600", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001600.tgz", + "integrity": "sha512-+2S9/2JFhYmYaDpZvo0lKkfvuKIglrx68MwOBqMGHhQsNkLjB5xtc/TGoEPs+MxjSyN/72qer2g97nzR641mOQ==", "funding": [ { "type": "opencollective", @@ -7150,9 +6626,9 @@ } }, "node_modules/css-declaration-sorter": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-7.1.1.tgz", - "integrity": "sha512-dZ3bVTEEc1vxr3Bek9vGwfB5Z6ESPULhcRvO472mfjVnj8jRcTnKO8/JTczlvxM10Myb+wBM++1MtdO76eWcaQ==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-7.2.0.tgz", + "integrity": "sha512-h70rUM+3PNFuaBDTLe8wF/cdWu+dOZmb7pJt8Z2sedYbAcQVQV/tEchueg3GWxwqS0cxtbxmaHEdkNACqcvsow==", "dev": true, "engines": { "node": "^14 || ^16 || >=18" @@ -7226,12 +6702,12 @@ } }, "node_modules/cssnano": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-6.1.0.tgz", - "integrity": "sha512-e2v4w/t3OFM6HTuSweI4RSdABaqgVgHlJp5FZrQsopHnKKHLFIvK2D3C4kHWeFIycN/1L1J5VIrg5KlDzn3r/g==", + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-6.1.2.tgz", + "integrity": "sha512-rYk5UeX7VAM/u0lNqewCdasdtPK81CgX8wJFLEIXHbV2oldWRgJAsZrdhRXkV1NJzA2g850KiFm9mMU2HxNxMA==", "dev": true, "dependencies": { - "cssnano-preset-default": "^6.1.0", + "cssnano-preset-default": "^6.1.2", "lilconfig": "^3.1.1" }, "engines": { @@ -7246,13 +6722,13 @@ } }, "node_modules/cssnano-preset-default": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-6.1.0.tgz", - "integrity": "sha512-4DUXZoDj+PI3fRl3MqMjl9DwLGjcsFP4qt+92nLUcN1RGfw2TY+GwNoG2B38Usu1BrcTs8j9pxNfSusmvtSjfg==", + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-6.1.2.tgz", + "integrity": "sha512-1C0C+eNaeN8OcHQa193aRgYexyJtU8XwbdieEjClw+J9d94E41LwT6ivKH0WT+fYwYWB0Zp3I3IZ7tI/BbUbrg==", "dev": true, "dependencies": { "browserslist": "^4.23.0", - "css-declaration-sorter": "^7.1.1", + "css-declaration-sorter": "^7.2.0", "cssnano-utils": "^4.0.2", "postcss-calc": "^9.0.1", "postcss-colormin": "^6.1.0", @@ -7261,12 +6737,12 @@ "postcss-discard-duplicates": "^6.0.3", "postcss-discard-empty": "^6.0.3", "postcss-discard-overridden": "^6.0.2", - "postcss-merge-longhand": "^6.0.4", - "postcss-merge-rules": "^6.1.0", - "postcss-minify-font-values": "^6.0.3", + "postcss-merge-longhand": "^6.0.5", + "postcss-merge-rules": "^6.1.1", + "postcss-minify-font-values": "^6.1.0", "postcss-minify-gradients": "^6.0.3", "postcss-minify-params": "^6.1.0", - "postcss-minify-selectors": "^6.0.3", + "postcss-minify-selectors": "^6.0.4", "postcss-normalize-charset": "^6.0.2", "postcss-normalize-display-values": "^6.0.2", "postcss-normalize-positions": "^6.0.2", @@ -7280,7 +6756,7 @@ "postcss-reduce-initial": "^6.1.0", "postcss-reduce-transforms": "^6.0.2", "postcss-svgo": "^6.0.3", - "postcss-unique-selectors": "^6.0.3" + "postcss-unique-selectors": "^6.0.4" }, "engines": { "node": "^14 || ^16 || >=18.0" @@ -8289,9 +7765,9 @@ "peer": true }, "node_modules/esbuild": { - "version": "0.20.1", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.20.1.tgz", - "integrity": "sha512-OJwEgrpWm/PCMsLVWXKqvcjme3bHNpOgN7Tb6cQnR5n0TPbQx1/Xrn7rqM+wn17bYeT6MGB5sn1Bh5YiGi70nA==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.20.2.tgz", + "integrity": "sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==", "dev": true, "hasInstallScript": true, "bin": { @@ -8301,29 +7777,29 @@ "node": ">=12" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.20.1", - "@esbuild/android-arm": "0.20.1", - "@esbuild/android-arm64": "0.20.1", - "@esbuild/android-x64": "0.20.1", - "@esbuild/darwin-arm64": "0.20.1", - "@esbuild/darwin-x64": "0.20.1", - "@esbuild/freebsd-arm64": "0.20.1", - "@esbuild/freebsd-x64": "0.20.1", - "@esbuild/linux-arm": "0.20.1", - "@esbuild/linux-arm64": "0.20.1", - "@esbuild/linux-ia32": "0.20.1", - "@esbuild/linux-loong64": "0.20.1", - "@esbuild/linux-mips64el": "0.20.1", - "@esbuild/linux-ppc64": "0.20.1", - "@esbuild/linux-riscv64": "0.20.1", - "@esbuild/linux-s390x": "0.20.1", - "@esbuild/linux-x64": "0.20.1", - "@esbuild/netbsd-x64": "0.20.1", - "@esbuild/openbsd-x64": "0.20.1", - "@esbuild/sunos-x64": "0.20.1", - "@esbuild/win32-arm64": "0.20.1", - "@esbuild/win32-ia32": "0.20.1", - "@esbuild/win32-x64": "0.20.1" + "@esbuild/aix-ppc64": "0.20.2", + "@esbuild/android-arm": "0.20.2", + "@esbuild/android-arm64": "0.20.2", + "@esbuild/android-x64": "0.20.2", + "@esbuild/darwin-arm64": "0.20.2", + "@esbuild/darwin-x64": "0.20.2", + "@esbuild/freebsd-arm64": "0.20.2", + "@esbuild/freebsd-x64": "0.20.2", + "@esbuild/linux-arm": "0.20.2", + "@esbuild/linux-arm64": "0.20.2", + "@esbuild/linux-ia32": "0.20.2", + "@esbuild/linux-loong64": "0.20.2", + "@esbuild/linux-mips64el": "0.20.2", + "@esbuild/linux-ppc64": "0.20.2", + "@esbuild/linux-riscv64": "0.20.2", + "@esbuild/linux-s390x": "0.20.2", + "@esbuild/linux-x64": "0.20.2", + "@esbuild/netbsd-x64": "0.20.2", + "@esbuild/openbsd-x64": "0.20.2", + "@esbuild/sunos-x64": "0.20.2", + "@esbuild/win32-arm64": "0.20.2", + "@esbuild/win32-ia32": "0.20.2", + "@esbuild/win32-x64": "0.20.2" } }, "node_modules/escalade": { @@ -13421,9 +12897,9 @@ "peer": true }, "node_modules/nitropack": { - "version": "2.9.3", - "resolved": "https://registry.npmjs.org/nitropack/-/nitropack-2.9.3.tgz", - "integrity": "sha512-k3wXlhxmTNkkFXnVyRYJ6CCdZmvlqjYJ4oaL8o9uTKIjg7A1udAle+3cVDxUWi2r9owwEysAP2+quNsAujZyTg==", + "version": "2.9.5", + "resolved": "https://registry.npmjs.org/nitropack/-/nitropack-2.9.5.tgz", + "integrity": "sha512-ClanSILi9O6HX95QNIC+TwxojpRpOSn9n3e3wmHExAHhLN5HdnHGmHN4LwtJdE2p91nse3kDULOTR7k1xRVJ/g==", "dev": true, "dependencies": { "@cloudflare/kv-asset-handler": "^0.3.1", @@ -13438,7 +12914,7 @@ "@rollup/pluginutils": "^5.1.0", "@types/http-proxy": "^1.17.14", "@vercel/nft": "^0.26.4", - "archiver": "^7.0.0", + "archiver": "^7.0.1", "c12": "^1.10.0", "chalk": "^5.3.0", "chokidar": "^3.6.0", @@ -13451,7 +12927,7 @@ "defu": "^6.1.4", "destr": "^2.0.3", "dot-prop": "^8.0.2", - "esbuild": "^0.20.1", + "esbuild": "^0.20.2", "escape-string-regexp": "^5.0.0", "etag": "^1.8.1", "fs-extra": "^11.2.0", @@ -13460,6 +12936,7 @@ "h3": "^1.11.1", "hookable": "^5.5.3", "httpxy": "^0.1.5", + "ioredis": "^5.3.2", "is-primitive": "^3.0.1", "jiti": "^1.21.0", "klona": "^2.0.6", @@ -13469,29 +12946,29 @@ "mime": "^4.0.1", "mlly": "^1.6.1", "mri": "^1.2.0", - "node-fetch-native": "^1.6.2", - "ofetch": "^1.3.3", + "node-fetch-native": "^1.6.4", + "ofetch": "^1.3.4", "ohash": "^1.1.3", - "openapi-typescript": "^6.7.4", + "openapi-typescript": "^6.7.5", "pathe": "^1.1.2", "perfect-debounce": "^1.0.0", "pkg-types": "^1.0.3", "pretty-bytes": "^6.1.1", - "radix3": "^1.1.1", - "rollup": "^4.12.1", + "radix3": "^1.1.2", + "rollup": "^4.13.0", "rollup-plugin-visualizer": "^5.12.0", "scule": "^1.3.0", "semver": "^7.6.0", "serve-placeholder": "^2.0.1", "serve-static": "^1.15.0", "std-env": "^3.7.0", - "ufo": "^1.4.0", + "ufo": "^1.5.3", "uncrypto": "^0.1.3", "unctx": "^2.3.1", "unenv": "^1.9.0", "unimport": "^3.7.1", - "unstorage": "^1.10.1", - "unwasm": "^0.3.7" + "unstorage": "^1.10.2", + "unwasm": "^0.3.8" }, "bin": { "nitro": "dist/cli/index.mjs", @@ -13568,9 +13045,9 @@ } }, "node_modules/node-fetch-native": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/node-fetch-native/-/node-fetch-native-1.6.2.tgz", - "integrity": "sha512-69mtXOFZ6hSkYiXAVB5SqaRvrbITC/NPyqv7yuu/qw0nmgPyYbIMYYNIDhNtwPrzk0ptrimrLz/hhjvm4w5Z+w==" + "version": "1.6.4", + "resolved": "https://registry.npmjs.org/node-fetch-native/-/node-fetch-native-1.6.4.tgz", + "integrity": "sha512-IhOigYzAKHd244OC0JIMIUrjzctirCmPkaIfhDeGcEETWof5zKYUW7e7MYvChGWh/4CJeXEgsRyGzuF334rOOQ==" }, "node_modules/node-forge": { "version": "1.3.1", @@ -13901,9 +13378,9 @@ } }, "node_modules/nuxi": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/nuxi/-/nuxi-3.10.1.tgz", - "integrity": "sha512-ZNt858+FOZDIiKKFJkXO7uJAnALytDdn1XbLgtZAqbtWNMayHbOnWcnxh+WSOE4H9uOi2+loWXEqKElmNWLgcQ==", + "version": "3.11.1", + "resolved": "https://registry.npmjs.org/nuxi/-/nuxi-3.11.1.tgz", + "integrity": "sha512-AW71TpxRHNg8MplQVju9tEFvXPvX42e0wPYknutSStDuAjV99vWTWYed4jxr/grk2FtKAuv2KvdJxcn2W59qyg==", "dev": true, "bin": { "nuxi": "bin/nuxi.mjs", @@ -13912,70 +13389,71 @@ "nuxt-cli": "bin/nuxi.mjs" }, "engines": { - "node": "^14.18.0 || >=16.10.0" + "node": "^16.10.0 || >=18.0.0" }, "optionalDependencies": { "fsevents": "~2.3.3" } }, "node_modules/nuxt": { - "version": "3.10.3", - "resolved": "https://registry.npmjs.org/nuxt/-/nuxt-3.10.3.tgz", - "integrity": "sha512-NchGNiiz9g/ErJAb462W/lpX2NqcXYb9hugySKWvLXNdrjeAPiJ2/7mhgwUSiZA9MpjuQg3saiEajr1zlRIOCg==", + "version": "3.11.1", + "resolved": "https://registry.npmjs.org/nuxt/-/nuxt-3.11.1.tgz", + "integrity": "sha512-CsncE1dxP0cmOYT+PBdjMD0bOK8eZizG5tgNWUOJAAAtU45sO38maoBumYYL2kUpT/SC/dMP+831DAcVPvi9pQ==", "dev": true, "dependencies": { "@nuxt/devalue": "^2.0.2", "@nuxt/devtools": "^1.0.8", - "@nuxt/kit": "3.10.3", - "@nuxt/schema": "3.10.3", + "@nuxt/kit": "3.11.1", + "@nuxt/schema": "3.11.1", "@nuxt/telemetry": "^2.5.3", "@nuxt/ui-templates": "^1.3.1", - "@nuxt/vite-builder": "3.10.3", - "@unhead/dom": "^1.8.10", - "@unhead/ssr": "^1.8.10", - "@unhead/vue": "^1.8.10", - "@vue/shared": "^3.4.19", + "@nuxt/vite-builder": "3.11.1", + "@unhead/dom": "^1.8.20", + "@unhead/ssr": "^1.8.20", + "@unhead/vue": "^1.8.20", + "@vue/shared": "^3.4.21", "acorn": "8.11.3", - "c12": "^1.9.0", + "c12": "^1.10.0", "chokidar": "^3.6.0", "cookie-es": "^1.0.0", "defu": "^6.1.4", "destr": "^2.0.3", "devalue": "^4.3.2", - "esbuild": "^0.20.1", + "esbuild": "^0.20.2", "escape-string-regexp": "^5.0.0", "estree-walker": "^3.0.3", "fs-extra": "^11.2.0", "globby": "^14.0.1", - "h3": "^1.10.2", + "h3": "^1.11.1", "hookable": "^5.5.3", "jiti": "^1.21.0", "klona": "^2.0.6", "knitwork": "^1.0.0", - "magic-string": "^0.30.7", - "mlly": "^1.6.0", - "nitropack": "^2.8.1", - "nuxi": "^3.10.1", - "nypm": "^0.3.6", + "magic-string": "^0.30.8", + "mlly": "^1.6.1", + "nitropack": "^2.9.4", + "nuxi": "^3.11.0", + "nypm": "^0.3.8", "ofetch": "^1.3.3", "ohash": "^1.1.3", "pathe": "^1.1.2", "perfect-debounce": "^1.0.0", "pkg-types": "^1.0.3", - "radix3": "^1.1.0", + "radix3": "^1.1.1", "scule": "^1.3.0", "std-env": "^3.7.0", "strip-literal": "^2.0.0", - "ufo": "^1.4.0", + "ufo": "^1.5.2", "ultrahtml": "^1.5.3", "uncrypto": "^0.1.3", "unctx": "^2.3.1", "unenv": "^1.9.0", "unimport": "^3.7.1", - "unplugin": "^1.7.1", + "unplugin": "^1.10.0", "unplugin-vue-router": "^0.7.0", + "unstorage": "^1.10.2", "untyped": "^1.4.2", - "vue": "^3.4.19", + "vue": "^3.4.21", "vue-bundle-renderer": "^2.0.0", "vue-devtools-stub": "^0.1.0", "vue-router": "^4.3.0" @@ -14516,14 +13994,14 @@ } }, "node_modules/ofetch": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/ofetch/-/ofetch-1.3.3.tgz", - "integrity": "sha512-s1ZCMmQWXy4b5K/TW9i/DtiN8Ku+xCiHcjQ6/J/nDdssirrQNOoB165Zu8EqLMA2lln1JUth9a0aW9Ap2ctrUg==", + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/ofetch/-/ofetch-1.3.4.tgz", + "integrity": "sha512-KLIET85ik3vhEfS+3fDlc/BAZiAp+43QEC/yCo5zkNoY2YaKvNkOaFr/6wCFgFH1kuYQM5pMNi0Tg8koiIemtw==", "dev": true, "dependencies": { - "destr": "^2.0.1", - "node-fetch-native": "^1.4.0", - "ufo": "^1.3.0" + "destr": "^2.0.3", + "node-fetch-native": "^1.6.3", + "ufo": "^1.5.3" } }, "node_modules/ohash": { @@ -14611,9 +14089,9 @@ } }, "node_modules/openapi-typescript": { - "version": "6.7.4", - "resolved": "https://registry.npmjs.org/openapi-typescript/-/openapi-typescript-6.7.4.tgz", - "integrity": "sha512-EZyeW9Wy7UDCKv0iYmKrq2pVZtquXiD/YHiUClAKqiMi42nodx/EQH11K6fLqjt1IZlJmVokrAsExsBMM2RROQ==", + "version": "6.7.5", + "resolved": "https://registry.npmjs.org/openapi-typescript/-/openapi-typescript-6.7.5.tgz", + "integrity": "sha512-ZD6dgSZi0u1QCP55g8/2yS5hNJfIpgqsSGHLxxdOjvY7eIrXzj271FJEQw33VwsZ6RCtO/NOuhxa7GBWmEudyA==", "dev": true, "dependencies": { "ansi-colors": "^4.1.3", @@ -15042,9 +14520,9 @@ } }, "node_modules/postcss": { - "version": "8.4.35", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.35.tgz", - "integrity": "sha512-u5U8qYpBCpN13BsiEB0CbR1Hhh4Gc0zLFuedrHJKMctHCHAGrMdG0PRM/KErzAL3CU6/eckEtmHNB3x6e3c0vA==", + "version": "8.4.38", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz", + "integrity": "sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==", "funding": [ { "type": "opencollective", @@ -15062,7 +14540,7 @@ "dependencies": { "nanoid": "^3.3.7", "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" + "source-map-js": "^1.2.0" }, "engines": { "node": "^10 || ^12 || >=14" @@ -15167,13 +14645,13 @@ } }, "node_modules/postcss-merge-longhand": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-6.0.4.tgz", - "integrity": "sha512-vAfWGcxUUGlFiPM3nDMZA+/Yo9sbpc3JNkcYZez8FfJDv41Dh7tAgA3QGVTocaHCZZL6aXPXPOaBMJsjujodsA==", + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-6.0.5.tgz", + "integrity": "sha512-5LOiordeTfi64QhICp07nzzuTDjNSO8g5Ksdibt44d+uvIIAE1oZdRn8y/W5ZtYgRH/lnLDlvi9F8btZcVzu3w==", "dev": true, "dependencies": { "postcss-value-parser": "^4.2.0", - "stylehacks": "^6.1.0" + "stylehacks": "^6.1.1" }, "engines": { "node": "^14 || ^16 || >=18.0" @@ -15183,15 +14661,15 @@ } }, "node_modules/postcss-merge-rules": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-6.1.0.tgz", - "integrity": "sha512-lER+W3Gr6XOvxOYk1Vi/6UsAgKMg6MDBthmvbNqi2XxAk/r9XfhdYZSigfWjuWWn3zYw2wLelvtM8XuAEFqRkA==", + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-6.1.1.tgz", + "integrity": "sha512-KOdWF0gju31AQPZiD+2Ar9Qjowz1LTChSjFFbS+e2sFgc4uHOp3ZvVX4sNeTlk0w2O31ecFGgrFzhO0RSWbWwQ==", "dev": true, "dependencies": { "browserslist": "^4.23.0", "caniuse-api": "^3.0.0", "cssnano-utils": "^4.0.2", - "postcss-selector-parser": "^6.0.15" + "postcss-selector-parser": "^6.0.16" }, "engines": { "node": "^14 || ^16 || >=18.0" @@ -15201,9 +14679,9 @@ } }, "node_modules/postcss-minify-font-values": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-6.0.3.tgz", - "integrity": "sha512-SmAeTA1We5rMnN3F8X9YBNo9bj9xB4KyDHnaNJnBfQIPi+60fNiR9OTRnIaMqkYzAQX0vObIw4Pn0vuKEOettg==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-6.1.0.tgz", + "integrity": "sha512-gklfI/n+9rTh8nYaSJXlCo3nOKqMNkxuGpTn/Qm0gstL3ywTr9/WRKznE+oy6fvfolH6dF+QM4nCo8yPLdvGJg==", "dev": true, "dependencies": { "postcss-value-parser": "^4.2.0" @@ -15250,12 +14728,12 @@ } }, "node_modules/postcss-minify-selectors": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-6.0.3.tgz", - "integrity": "sha512-IcV7ZQJcaXyhx4UBpWZMsinGs2NmiUC60rJSkyvjPCPqhNjVGsrJUM+QhAtCaikZ0w0/AbZuH4wVvF/YMuMhvA==", + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-6.0.4.tgz", + "integrity": "sha512-L8dZSwNLgK7pjTto9PzWRoMbnLq5vsZSTu8+j1P/2GB8qdtGQfn+K1uSvFgYvgh83cbyxT5m43ZZhUMTJDSClQ==", "dev": true, "dependencies": { - "postcss-selector-parser": "^6.0.15" + "postcss-selector-parser": "^6.0.16" }, "engines": { "node": "^14 || ^16 || >=18.0" @@ -15445,9 +14923,9 @@ } }, "node_modules/postcss-selector-parser": { - "version": "6.0.15", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.15.tgz", - "integrity": "sha512-rEYkQOMUCEMhsKbK66tbEU9QVIxbhN18YiniAwA7XQYTVBqrBy+P2p5JcdqsHgKM2zWylp8d7J6eszocfds5Sw==", + "version": "6.0.16", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.16.tgz", + "integrity": "sha512-A0RVJrX+IUkVZbW3ClroRWurercFhieevHB38sr2+l9eUClMqome3LmEmnhlNy+5Mr2EYN6B2Kaw9wYdd+VHiw==", "dev": true, "dependencies": { "cssesc": "^3.0.0", @@ -15474,12 +14952,12 @@ } }, "node_modules/postcss-unique-selectors": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-6.0.3.tgz", - "integrity": "sha512-NFXbYr8qdmCr/AFceaEfdcsKGCvWTeGO6QVC9h2GvtWgj0/0dklKQcaMMVzs6tr8bY+ase8hOtHW8OBTTRvS8A==", + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-6.0.4.tgz", + "integrity": "sha512-K38OCaIrO8+PzpArzkLKB42dSARtC2tmG6PvD4b1o1Q2E9Os8jzfWFfSy/rixsHwohtsDdFtAWGjFVFUdwYaMg==", "dev": true, "dependencies": { - "postcss-selector-parser": "^6.0.15" + "postcss-selector-parser": "^6.0.16" }, "engines": { "node": "^14 || ^16 || >=18.0" @@ -15686,9 +15164,9 @@ "dev": true }, "node_modules/radix3": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/radix3/-/radix3-1.1.1.tgz", - "integrity": "sha512-yUUd5VTiFtcMEx0qFUxGAv5gbMc1un4RvEO1JZdP7ZUl/RHygZK6PknIKntmQRZxnMY3ZXD2ISaw1ij8GYW1yg==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/radix3/-/radix3-1.1.2.tgz", + "integrity": "sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA==", "dev": true }, "node_modules/randombytes": { @@ -16963,9 +16441,9 @@ } }, "node_modules/source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", + "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", "engines": { "node": ">=0.10.0" } @@ -17256,13 +16734,13 @@ "dev": true }, "node_modules/stylehacks": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-6.1.0.tgz", - "integrity": "sha512-ETErsPFgwlfYZ/CSjMO2Ddf+TsnkCVPBPaoB99Ro8WMAxf7cglzmFsRBhRmKObFjibtcvlNxFFPHuyr3sNlNUQ==", + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-6.1.1.tgz", + "integrity": "sha512-gSTTEQ670cJNoaeIp9KX6lZmm8LJ3jPB5yJmX8Zq/wQxOsAFXV3qjWzHas3YYk1qesuVIyYWWUpZ0vSE/dTSGg==", "dev": true, "dependencies": { "browserslist": "^4.23.0", - "postcss-selector-parser": "^6.0.15" + "postcss-selector-parser": "^6.0.16" }, "engines": { "node": "^14 || ^16 || >=18.0" @@ -17694,9 +17172,9 @@ } }, "node_modules/ufo": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.4.0.tgz", - "integrity": "sha512-Hhy+BhRBleFjpJ2vchUNN40qgkh0366FWJGqVLYBHev0vpHTrXSA0ryT+74UiW6KWsldNurQMKGqCm1M2zBciQ==" + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.5.3.tgz", + "integrity": "sha512-Y7HYmWaFwPUmkoQCUIAYpKqkOf+SbVj/2fJJZ4RJMCfZp0rTGwRbzQD+HghfnhKOjL9E01okqz+ncJskGYfBNw==" }, "node_modules/ultrahtml": { "version": "1.5.3", @@ -17788,20 +17266,45 @@ } }, "node_modules/unhead": { - "version": "1.8.13", - "resolved": "https://registry.npmjs.org/unhead/-/unhead-1.8.13.tgz", - "integrity": "sha512-VL1eOXc1U0zI6XO2JJQ98tywcEW9cM6tfrmuNcltOKSB7Xg3isVXFSf2bEbO4XPUjg8D5Uy3Q3Zi9cN9XSiTyA==", + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/unhead/-/unhead-1.9.2.tgz", + "integrity": "sha512-CveP8bjL8gUJnZ1NqcMU1roe+VuM14wr0cJfNek/LCSI2i968mHDD5tbDXNcMSAVOhffKj6WkTngTUKNOZxA7g==", "dev": true, "dependencies": { - "@unhead/dom": "1.8.13", - "@unhead/schema": "1.8.13", - "@unhead/shared": "1.8.13", + "@unhead/dom": "1.9.2", + "@unhead/schema": "1.9.2", + "@unhead/shared": "1.9.2", "hookable": "^5.5.3" }, "funding": { "url": "https://github.com/sponsors/harlan-zw" } }, + "node_modules/unhead/node_modules/@unhead/schema": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/@unhead/schema/-/schema-1.9.2.tgz", + "integrity": "sha512-NRCAcuWtD2WCL8u3qR1yn41JpDB+ExjBnSLAuJseOD9+XJjQBqPRgx/bhxZ3Dx6vrrCnCF+SvKr+W1pa+3mWdA==", + "dev": true, + "dependencies": { + "hookable": "^5.5.3", + "zhead": "^2.2.4" + }, + "funding": { + "url": "https://github.com/sponsors/harlan-zw" + } + }, + "node_modules/unhead/node_modules/@unhead/shared": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/@unhead/shared/-/shared-1.9.2.tgz", + "integrity": "sha512-jXQ4vK9wXf66hflOSBUXQKVsOLJrYVSOknDH+9PTwz5CIgJv/Y/o/NkRCJjyf5W7qFf605Te28lbTeLumT+BeQ==", + "dev": true, + "dependencies": { + "@unhead/schema": "1.9.2" + }, + "funding": { + "url": "https://github.com/sponsors/harlan-zw" + } + }, "node_modules/unicode-emoji-modifier-base": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unicode-emoji-modifier-base/-/unicode-emoji-modifier-base-1.0.0.tgz", @@ -18051,9 +17554,9 @@ } }, "node_modules/unplugin": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-1.9.0.tgz", - "integrity": "sha512-14PslvMY3gNbXnQtNIRB566Q057L5Fe7f5LDEamxVi0QQVxoz5hrveBwwZLcKyHtZ09ysmipxRRj5Lv+BGz2Iw==", + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-1.10.0.tgz", + "integrity": "sha512-CuZtvvO8ua2Wl+9q2jEaqH6m3DoQ38N7pvBYQbbaeNlWGvK2l6GHiKi29aIHDPoSxdUzQ7Unevf1/ugil5X6Pg==", "dependencies": { "acorn": "^8.11.3", "chokidar": "^3.6.0", @@ -18124,36 +17627,36 @@ } }, "node_modules/unstorage": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/unstorage/-/unstorage-1.10.1.tgz", - "integrity": "sha512-rWQvLRfZNBpF+x8D3/gda5nUCQL2PgXy2jNG4U7/Rc9BGEv9+CAJd0YyGCROUBKs9v49Hg8huw3aih5Bf5TAVw==", + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/unstorage/-/unstorage-1.10.2.tgz", + "integrity": "sha512-cULBcwDqrS8UhlIysUJs2Dk0Mmt8h7B0E6mtR+relW9nZvsf/u4SkAYyNliPiPW7XtFNb5u3IUMkxGxFTTRTgQ==", "dev": true, "dependencies": { "anymatch": "^3.1.3", - "chokidar": "^3.5.3", - "destr": "^2.0.2", - "h3": "^1.8.2", - "ioredis": "^5.3.2", - "listhen": "^1.5.5", - "lru-cache": "^10.0.2", + "chokidar": "^3.6.0", + "destr": "^2.0.3", + "h3": "^1.11.1", + "listhen": "^1.7.2", + "lru-cache": "^10.2.0", "mri": "^1.2.0", - "node-fetch-native": "^1.4.1", + "node-fetch-native": "^1.6.2", "ofetch": "^1.3.3", - "ufo": "^1.3.1" + "ufo": "^1.4.0" }, "peerDependencies": { - "@azure/app-configuration": "^1.4.1", + "@azure/app-configuration": "^1.5.0", "@azure/cosmos": "^4.0.0", "@azure/data-tables": "^13.2.2", - "@azure/identity": "^3.3.2", - "@azure/keyvault-secrets": "^4.7.0", - "@azure/storage-blob": "^12.16.0", - "@capacitor/preferences": "^5.0.6", - "@netlify/blobs": "^6.2.0", - "@planetscale/database": "^1.11.0", - "@upstash/redis": "^1.23.4", - "@vercel/kv": "^0.2.3", - "idb-keyval": "^6.2.1" + "@azure/identity": "^4.0.1", + "@azure/keyvault-secrets": "^4.8.0", + "@azure/storage-blob": "^12.17.0", + "@capacitor/preferences": "^5.0.7", + "@netlify/blobs": "^6.5.0 || ^7.0.0", + "@planetscale/database": "^1.16.0", + "@upstash/redis": "^1.28.4", + "@vercel/kv": "^1.0.1", + "idb-keyval": "^6.2.1", + "ioredis": "^5.3.2" }, "peerDependenciesMeta": { "@azure/app-configuration": { @@ -18191,6 +17694,9 @@ }, "idb-keyval": { "optional": true + }, + "ioredis": { + "optional": true } } }, @@ -18235,16 +17741,17 @@ } }, "node_modules/unwasm": { - "version": "0.3.7", - "resolved": "https://registry.npmjs.org/unwasm/-/unwasm-0.3.7.tgz", - "integrity": "sha512-+s4iWvHHYnLuwNo+9mqVFLBmBzGc3gIuzkVZ8fdMN9K/kWopCnfaUVnDagd2OX3It5nRR5EenI5nSQb8FOd0fA==", + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/unwasm/-/unwasm-0.3.8.tgz", + "integrity": "sha512-nIJQXxGl/gTUp5dZkSc8jbxAqSOa9Vv4jjSZXNI6OK0JXdvW3SQUHR+KY66rjI0W//km59jivGgd5TCvBUWsnA==", "dev": true, "dependencies": { - "magic-string": "^0.30.5", - "mlly": "^1.5.0", + "knitwork": "^1.0.0", + "magic-string": "^0.30.8", + "mlly": "^1.6.1", "pathe": "^1.1.2", "pkg-types": "^1.0.3", - "unplugin": "^1.6.0" + "unplugin": "^1.9.0" } }, "node_modules/upath": { @@ -18547,9 +18054,9 @@ } }, "node_modules/vite-node": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-1.3.1.tgz", - "integrity": "sha512-azbRrqRxlWTJEVbzInZCTchx0X69M/XPTCz4H+TLvlTcR/xH/3hkRqhOakT41fMJCMzXTu4UvegkZiEoJAWvng==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-1.4.0.tgz", + "integrity": "sha512-VZDAseqjrHgNd4Kh8icYHWzTKSCZMhia7GyHfhtzLW33fZlG9SwsB6CEhgyVOWkJfJ2pFLrp/Gj1FSfAiqH9Lw==", "dev": true, "dependencies": { "cac": "^6.7.14", diff --git a/package.json b/package.json index 05c5aa35c0d03aa75bd08fde7b3cd7df2c9fdbde..e9bcee5d0ac62736490a415c5c1b6ac9a888b20f 100644 --- a/package.json +++ b/package.json @@ -24,7 +24,7 @@ "@unocss/preset-icons": "^0.58.3", "@vueuse/core": "^10.7.1", "@vueuse/nuxt": "^10.7.1", - "nuxt": "^3.9.1", + "nuxt": "^3.11.1", "nuxt-meilisearch": "^1.1.0", "vuetify-nuxt-module": "^0.9.0" }, diff --git a/packages/df-wiki-cli/data/test/refseq.csv b/packages/df-wiki-cli/data/test/refseq.csv new file mode 100644 index 0000000000000000000000000000000000000000..63cae96a82b258d253725663ae0d4de7cf6a0d5f --- /dev/null +++ b/packages/df-wiki-cli/data/test/refseq.csv @@ -0,0 +1,19 @@ +sys_id,Assembly,replicon,type,subtype,sys_beg,sys_end,protein_in_syst,genes_count,name_of_profiles_in_sys,accession_in_sys,Superkingdom,phylum,class,order,family,genus,species +GCF_001602115_NZ_CP014352_AbiE_1,GCF_001602115.1,NZ_CP014352,AbiE,AbiE,GCF_001602115.1_NZ_CP014352_01750,GCF_001602115.1_NZ_CP014352_01751,"GCF_001602115.1_NZ_CP014352_01750, GCF_001602115.1_NZ_CP014352_01751",2.0,"AbiEii__AbiEii, AbiEii__AbiEi_1","WP_062819585.1, WP_062819586.1",Bacteria,Actinomycetota,Actinomycetes,Propionibacteriales,Propionibacteriaceae,Acidipropionibacterium,Acidipropionibacterium acidipropionici +GCF_001602115_NZ_CP014352_Thoeris_II_1,GCF_001602115.1,NZ_CP014352,Thoeris,Thoeris_II,GCF_001602115.1_NZ_CP014352_00483,GCF_001602115.1_NZ_CP014352_00484,"GCF_001602115.1_NZ_CP014352_00483, GCF_001602115.1_NZ_CP014352_00484",2.0,"Thoeris__ThsB_Global, Thoeris_II__ThsA_new_petit","WP_062818945.1, WP_082815879.1",Bacteria,Actinomycetota,Actinomycetes,Propionibacteriales,Propionibacteriaceae,Acidipropionibacterium,Acidipropionibacterium acidipropionici +GCF_001602115_NZ_CP014352_RM_Type_IIG_5,GCF_001602115.1,NZ_CP014352,RM,RM_Type_IIG,GCF_001602115.1_NZ_CP014352_00058,GCF_001602115.1_NZ_CP014352_00058,GCF_001602115.1_NZ_CP014352_00058,1.0,RM_Type_IIG__Type_IIG,WP_062818741.1,Bacteria,Actinomycetota,Actinomycetes,Propionibacteriales,Propionibacteriaceae,Acidipropionibacterium,Acidipropionibacterium acidipropionici +GCF_001602115_NZ_CP014352_RM_Type_I_1,GCF_001602115.1,NZ_CP014352,RM,RM_Type_I,GCF_001602115.1_NZ_CP014352_00060,GCF_001602115.1_NZ_CP014352_00062,"GCF_001602115.1_NZ_CP014352_00060, GCF_001602115.1_NZ_CP014352_00061, GCF_001602115.1_NZ_CP014352_00062",3.0,"RM__Type_I_REases, RM__Type_I_S, RM__Type_I_MTases","WP_062818743.1, WP_062818744.1, WP_062818745.1",Bacteria,Actinomycetota,Actinomycetes,Propionibacteriales,Propionibacteriaceae,Acidipropionibacterium,Acidipropionibacterium acidipropionici +GCF_001602115_NZ_CP014352_RM_Type_IIG_6,GCF_001602115.1,NZ_CP014352,RM,RM_Type_IIG,GCF_001602115.1_NZ_CP014352_00069,GCF_001602115.1_NZ_CP014352_00069,GCF_001602115.1_NZ_CP014352_00069,1.0,RM_Type_IIG__Type_IIG,WP_062818749.1,Bacteria,Actinomycetota,Actinomycetes,Propionibacteriales,Propionibacteriaceae,Acidipropionibacterium,Acidipropionibacterium acidipropionici +GCF_001602115_NZ_CP014352_RM_Type_I_2,GCF_001602115.1,NZ_CP014352,RM,RM_Type_I,GCF_001602115.1_NZ_CP014352_00475,GCF_001602115.1_NZ_CP014352_00477,"GCF_001602115.1_NZ_CP014352_00475, GCF_001602115.1_NZ_CP014352_00476, GCF_001602115.1_NZ_CP014352_00477",3.0,"RM__Type_I_MTases, RM__Type_I_S, RM__Type_I_REases","WP_062818938.1, WP_082815877.1, WP_062818940.1",Bacteria,Actinomycetota,Actinomycetes,Propionibacteriales,Propionibacteriaceae,Acidipropionibacterium,Acidipropionibacterium acidipropionici +GCF_001602115_NZ_CP014352_RM_Type_I_3,GCF_001602115.1,NZ_CP014352,RM,RM_Type_I,GCF_001602115.1_NZ_CP014352_02756,GCF_001602115.1_NZ_CP014352_02758,"GCF_001602115.1_NZ_CP014352_02756, GCF_001602115.1_NZ_CP014352_02757, GCF_001602115.1_NZ_CP014352_02758",3.0,"RM__Type_I_REases, RM__Type_I_S, RM__Type_I_MTases","WP_062820191.1, WP_062820192.1, WP_062820839.1",Bacteria,Actinomycetota,Actinomycetes,Propionibacteriales,Propionibacteriaceae,Acidipropionibacterium,Acidipropionibacterium acidipropionici +GCF_001602115_NZ_CP014352_RM_Type_IIG_7,GCF_001602115.1,NZ_CP014352,RM,RM_Type_IIG,GCF_001602115.1_NZ_CP014352_03005,GCF_001602115.1_NZ_CP014352_03005,GCF_001602115.1_NZ_CP014352_03005,1.0,RM_Type_IIG__Type_IIG,WP_198401420.1,Bacteria,Actinomycetota,Actinomycetes,Propionibacteriales,Propionibacteriaceae,Acidipropionibacterium,Acidipropionibacterium acidipropionici +GCF_001602115_NZ_CP014352_RM_Type_I_4,GCF_001602115.1,NZ_CP014352,RM,RM_Type_I,GCF_001602115.1_NZ_CP014352_03420,GCF_001602115.1_NZ_CP014352_03422,"GCF_001602115.1_NZ_CP014352_03420, GCF_001602115.1_NZ_CP014352_03421, GCF_001602115.1_NZ_CP014352_03422",3.0,"RM__Type_I_REases, RM__Type_I_S, RM__Type_I_MTases","WP_062818743.1, WP_062818744.1, WP_062818745.1",Bacteria,Actinomycetota,Actinomycetes,Propionibacteriales,Propionibacteriaceae,Acidipropionibacterium,Acidipropionibacterium acidipropionici +GCF_001602115_NZ_CP014352_RM_Type_IIG_8,GCF_001602115.1,NZ_CP014352,RM,RM_Type_IIG,GCF_001602115.1_NZ_CP014352_03427,GCF_001602115.1_NZ_CP014352_03427,GCF_001602115.1_NZ_CP014352_03427,1.0,RM_Type_IIG__Type_IIG,WP_157773967.1,Bacteria,Actinomycetota,Actinomycetes,Propionibacteriales,Propionibacteriaceae,Acidipropionibacterium,Acidipropionibacterium acidipropionici +GCF_001602115_NZ_CP014353,GCF_001602115.1,NZ_CP014353,No system found,,,,,,,,Bacteria,Actinomycetota,Actinomycetes,Propionibacteriales,Propionibacteriaceae,Acidipropionibacterium,Acidipropionibacterium acidipropionici +GCF_001602115_NZ_CP014352_CAS_Class1-Subtype-I-G_1,GCF_001602115.1,NZ_CP014352,Cas,CAS_Class1-Subtype-I-G,GCF_001602115.1_NZ_CP014352_01614,GCF_001602115.1_NZ_CP014352_01620,"GCF_001602115_NZ_CP014352_01614, GCF_001602115_NZ_CP014352_01615, GCF_001602115_NZ_CP014352_01616, GCF_001602115_NZ_CP014352_01617, GCF_001602115_NZ_CP014352_01618, GCF_001602115_NZ_CP014352_01619, GCF_001602115_NZ_CP014352_01620",7.0,"DEDDh_I_II_III_IV_V_VI_1, csb1gr7_I-G_1, csb2gr5_I-G_1, cas3_I-G_3, csb3_I-G_1, cas1_I_II_III_IV_V_VI_1, cas2_I_II_III_IV_V_VI_3","WP_198401461.1, WP_062819507.1, WP_062819508.1, WP_062819509.1, WP_062819510.1, WP_062819511.1, WP_062819512.1",Bacteria,Actinomycetota,Actinomycetes,Propionibacteriales,Propionibacteriaceae,Acidipropionibacterium,Acidipropionibacterium acidipropionici +GCF_000830055_NZ_CP010781_Gabija_1,GCF_000830055.1,NZ_CP010781,Gabija,Gabija,GCF_000830055.1_NZ_CP010781_01480,GCF_000830055.1_NZ_CP010781_01481,"GCF_000830055.1_NZ_CP010781_01480, GCF_000830055.1_NZ_CP010781_01481",2.0,"Gabija__GajA, Gabija__GajB_2","WP_005115822.1, WP_000073989.1",Bacteria,Pseudomonadota,Gammaproteobacteria,Moraxellales,Moraxellaceae,Acinetobacter,Acinetobacter baumannii +GCF_000830055_NZ_CP010781_Gao_Qat_1,GCF_000830055.1,NZ_CP010781,Gao_Qat,Gao_Qat,GCF_000830055.1_NZ_CP010781_00952,GCF_000830055.1_NZ_CP010781_00955,"GCF_000830055.1_NZ_CP010781_00952, GCF_000830055.1_NZ_CP010781_00953, GCF_000830055.1_NZ_CP010781_00954, GCF_000830055.1_NZ_CP010781_00955",4.0,"Gao_Qat__QatA, Gao_Qat__QatB, Gao_Qat__QatC, Gao_Qat__QatD","WP_000269396.1, WP_000537345.1, WP_041152179.1, WP_000937120.1",Bacteria,Pseudomonadota,Gammaproteobacteria,Moraxellales,Moraxellaceae,Acinetobacter,Acinetobacter baumannii +GCF_000830055_NZ_CP010781_RosmerTA_1,GCF_000830055.1,NZ_CP010781,RosmerTA,RosmerTA,GCF_000830055.1_NZ_CP010781_00651,GCF_000830055.1_NZ_CP010781_00652,"GCF_000830055.1_NZ_CP010781_00651, GCF_000830055.1_NZ_CP010781_00652",2.0,"RosmerTA__RmrA_2634932349, RosmerTA__RmrT_2634932349","WP_000482796.1, WP_001182927.1",Bacteria,Pseudomonadota,Gammaproteobacteria,Moraxellales,Moraxellaceae,Acinetobacter,Acinetobacter baumannii +GCF_000830055_NZ_CP010781_RM_Type_II_1,GCF_000830055.1,NZ_CP010781,RM,RM_Type_II,GCF_000830055.1_NZ_CP010781_03697,GCF_000830055.1_NZ_CP010781_03698,"GCF_000830055.1_NZ_CP010781_03697, GCF_000830055.1_NZ_CP010781_03698",2.0,"RM_Type_II__Type_II_REases, RM_Type_II__Type_II_MTases","WP_001062713.1, WP_000862934.1",Bacteria,Pseudomonadota,Gammaproteobacteria,Moraxellales,Moraxellaceae,Acinetobacter,Acinetobacter baumannii +GCF_000830055_NZ_CP010782,GCF_000830055.1,NZ_CP010782,No system found,,,,,,,,Bacteria,Pseudomonadota,Gammaproteobacteria,Moraxellales,Moraxellaceae,Acinetobacter,Acinetobacter baumannii +GCF_000830055_NZ_CP010781_CAS_Class1-Subtype-I-F_1,GCF_000830055.1,NZ_CP010781,Cas,CAS_Class1-Subtype-I-F,GCF_000830055.1_NZ_CP010781_02755,GCF_000830055.1_NZ_CP010781_02760,"GCF_000830055_NZ_CP010781_02755, GCF_000830055_NZ_CP010781_02756, GCF_000830055_NZ_CP010781_02757, GCF_000830055_NZ_CP010781_02758, GCF_000830055_NZ_CP010781_02759, GCF_000830055_NZ_CP010781_02760",6.0,"cas6f_I_II_III_IV_V_VI_3, cas7f_I-F_2, cas5f_I-F_4, cas8f_I-F_8, cas3f_I-F_1, cas1_I-F_1","WP_001104789.1, WP_001097003.1, WP_001215684.1, WP_000841022.1, WP_000637362.1, WP_000436801.1",Bacteria,Pseudomonadota,Gammaproteobacteria,Moraxellales,Moraxellaceae,Acinetobacter,Acinetobacter baumannii diff --git a/packages/df-wiki-cli/df_wiki_cli/content/main.py b/packages/df-wiki-cli/df_wiki_cli/content/main.py index 17b7865777a7117790fa90495b7ddd602bc903f7..319089d3217665ec3a28f0663c10228479553be4 100644 --- a/packages/df-wiki-cli/df_wiki_cli/content/main.py +++ b/packages/df-wiki-cli/df_wiki_cli/content/main.py @@ -4,6 +4,7 @@ import json import pandas as pd import shutil import csv +import tempfile import matplotlib.pyplot as plt from pandas.errors import ParserError from typing_extensions import Annotated @@ -244,7 +245,7 @@ def pae2png(tsv_file, png_file): plt.close() -@app.command() +@app.command(help="Remove version from sys_id") def refseq( input: Annotated[ Path, @@ -276,3 +277,224 @@ def refseq( console.print(f"[green]{row['sys_id']} -> {result}") row["sys_id"] = result writer.writerow(row) + + +@app.command( + help='Remove "No system found" hits if the are not the only hit for an assembly' +) +def refseq_sanitized_hits( + input: Annotated[ + Path, + typer.Option( + exists=False, + file_okay=True, + writable=True, + ), + ], + output: Annotated[ + Path, + typer.Option( + file_okay=True, + dir_okay=False, + writable=True, + resolve_path=True, + ), + ], +): + df = pd.read_csv(input) + df_final = _sanitized_refseq_hits(df) + df_final.reset_index().to_csv(output, index=False) + return df_final + + +@app.command(help="Group hits per assembly and types (from 'sanitized-hits')") +def refseq_group_per_assembly_and_type( + input: Annotated[ + Path, + typer.Option( + exists=False, + file_okay=True, + writable=True, + ), + ], + output: Annotated[ + Path, + typer.Option( + file_okay=True, + dir_okay=False, + writable=True, + resolve_path=True, + ), + ], +): + df = pd.read_csv(input) + df_final = _sanitized_refseq_hits(df) + df_final_grouped = df_final.groupby( + [ + "Assembly", + "type", + "Superkingdom", + "phylum", + "class", + "order", + "family", + "genus", + "species", + ], + as_index=False, + ).size() + df_final_grouped.reset_index().to_csv(output, index=False) + + +@app.command() +def refseq_group_per_assembly( + input: Annotated[ + Path, + typer.Option( + exists=False, + file_okay=True, + writable=True, + ), + ], + output: Annotated[ + Path, + typer.Option( + file_okay=True, + dir_okay=False, + writable=True, + resolve_path=True, + ), + ], +): + df = pd.read_csv(input) + + df["Assembly"] = df["Assembly"].apply(remove_version) + df_grouped = df.groupby( + [ + "Assembly", + "Superkingdom", + "phylum", + "class", + "order", + "family", + "genus", + "species", + ], + as_index=False, + ).size() + df_grouped.reset_index().to_csv(output, index=False) + + +@app.command() +def refseq_type_count( + input: Annotated[ + Path, + typer.Option( + exists=False, + file_okay=True, + writable=True, + help="csv file with type and taxo (No system found removed when other system are founded in the same assembly)", + ), + ], + output: Annotated[ + Path, + typer.Option( + file_okay=True, + dir_okay=False, + writable=True, + resolve_path=True, + ), + ], +): + df = pd.read_csv(input) + grouped_per_type = df.groupby( + ["type"], + as_index=False, + ).size() + grouped_per_type.reset_index().to_csv(output, index=False) + + +@app.command() +def markdown( + dir: Annotated[ + Path, + typer.Option( + exists=True, + file_okay=False, + writable=True, + readable=True, + resolve_path=True, + help="Dir where all systems article are", + ), + ], +): + for file in dir.iterdir(): + if file.suffix == ".md": + + console.rule(f"[bold blue]{file.name}", style="blue") + # make a copy of file + _, tmp_path = tempfile.mkstemp() + # with open(dst, "w") as tmp_f: + dst = Path(tmp_path) + dst.write_bytes(file.read_bytes()) + + with open(dst, "r+") as f: + new_f = re.sub( + r"##\s+Structure\n.*##\s+Experimental\s+validation", + "## Structure\n\n::article-structure\n::\n\n## Experimental validation", + f.read(), + flags=re.DOTALL, + ) + with open(file, "w") as f_out: + f_out.write(new_f) + + +def remove_version(assembly): + return assembly.split(".")[0] + + +def _sanitized_refseq_hits(df): + df["Assembly"] = df["Assembly"].apply(remove_version) + # Lower type namesmc + # df["type"] = df["type"].apply(lambda x: x.lower()) + + # Get all row with no system type + df_no_system = df.loc[df["type"] == "No system found"] + # unique assembly with no sys + serie_assembly_with_no_sys = df_no_system["Assembly"].unique() + # filter assembly to have those with no sys + df_with_no_sys = df[df["Assembly"].isin(serie_assembly_with_no_sys)] + # Group them by assembly, type, taxo + no_sys_assembly_by_size = df_with_no_sys.groupby( + [ + "Assembly", + "type", + "Superkingdom", + "phylum", + "class", + "order", + "family", + "genus", + "species", + ], + as_index=False, + ).size() + + # count each occurrence + df_again_per_assembly = no_sys_assembly_by_size.groupby( + "Assembly", + as_index=False, + ).size() + # filter to keep only size > 1 (when == 1 it means that there is only "no system found for an assembly") + # so we should keep it + df_size_sup_1 = df_again_per_assembly[df_again_per_assembly["size"] > 1] + assembly_where_should_remove_no_sys_found = df_size_sup_1["Assembly"].unique() + + # Construct new dataset to remove entries with no system found + # while found system on other replicon that belongs to the + # same assembly + df_filtered_assembly_only_with_sys = df[ + (df["type"] != "No system found") + | ~df.Assembly.isin(assembly_where_should_remove_no_sys_found) + ] + return df_filtered_assembly_only_with_sys diff --git a/packages/df-wiki-cli/df_wiki_cli/meilisearch/__init__.py b/packages/df-wiki-cli/df_wiki_cli/meilisearch/__init__.py index 5707df46949c4fd609e35340458fb61e1a5c30aa..52668833951380349e912f84de1e06f3b9fe508e 100644 --- a/packages/df-wiki-cli/df_wiki_cli/meilisearch/__init__.py +++ b/packages/df-wiki-cli/df_wiki_cli/meilisearch/__init__.py @@ -38,6 +38,28 @@ class RefSeqCsv(BaseModel): species: str +class RefSeqTaxo(BaseModel): + index: int + Assembly: str + Superkingdom: str + phylum: str + class_: str = Field(..., alias="class") + order: str + family: str + genus: str + species: str + size: int + + +class RefSeqTaxoType(RefSeqTaxo): + type: str + + +class RefSeqTypeCount(BaseModel): + type: str + size: int + + class StructureTypes(str, Enum): Validated = "Validated" DF = "DF" @@ -84,28 +106,57 @@ def update_refseqtaxo(host: str, key: str, file: Path, document: str): documents = [] with open(file, "r") as csvfile: csvreader = csv.DictReader(csvfile) - assembly = {} for row in csvreader: - assembly_id = row["Assembly"] - assembly[row["Assembly"]] = { - k: row[k] - for k in ( - "Superkingdom", - "phylum", - "class", - "order", - "family", - "genus", - "species", - "Assembly", - ) - if k in row - } - assembly[assembly_id]["Assembly"] = assembly[assembly_id]["Assembly"].split('.')[0] - for item in assembly.values(): - documents.append(item) + doc = RefSeqTaxo(**row) + documents.append(doc.model_dump(by_alias=True)) tasks = index.add_documents_in_batches(documents, primary_key="Assembly") - print(tasks) + for task in tasks: + console.print(task) + index.update_pagination_settings({"maxTotalHits": 1000000}) + index.update_filterable_attributes( + body=[ + "Superkingdom", + "phylum", + "class", + "order", + "family", + "genus", + "species", + "Assembly", + ] + ) + index.update_sortable_attributes( + [ + "Superkingdom", + "phylum", + "class", + "order", + "family", + "genus", + "species", + "Assembly", + "size", + ] + ) + params = { + "maxValuesPerFacet": 1000000, + "sortFacetValuesBy": {"*": "count"}, + } + index.update_faceting_settings(params) + + +def update_refseqtaxotype(host: str, key: str, file: Path, document: str): + client = meilisearch.Client(host, key) + index = client.index(document.lower()) + documents = [] + with open(file, "r") as csvfile: + csvreader = csv.DictReader(csvfile) + for row in csvreader: + doc = RefSeqTaxoType(**row) + documents.append(doc.model_dump(by_alias=True)) + tasks = index.add_documents_in_batches(documents, primary_key="index") + for task in tasks: + console.print(task) index.update_pagination_settings({"maxTotalHits": 1000000}) index.update_filterable_attributes( body=[ @@ -129,6 +180,35 @@ def update_refseqtaxo(host: str, key: str, file: Path, document: str): "genus", "species", "Assembly", + "type", + "size", + ] + ) + params = { + "maxValuesPerFacet": 1000000, + "sortFacetValuesBy": {"*": "count"}, + } + index.update_faceting_settings(params) + + +def update_refseqtypecount(host: str, key: str, file: Path, document: str): + client = meilisearch.Client(host, key) + index = client.index(document.lower()) + documents = [] + with open(file, "r") as csvfile: + csvreader = csv.DictReader(csvfile) + for row in csvreader: + doc = RefSeqTypeCount(**row) + documents.append(doc.model_dump(by_alias=True)) + tasks = index.add_documents_in_batches(documents, primary_key="type") + for task in tasks: + console.print(task) + index.update_pagination_settings({"maxTotalHits": 1000000}) + index.update_filterable_attributes(body=["type"]) + index.update_sortable_attributes( + [ + "type", + "size", ] ) params = { @@ -342,7 +422,6 @@ def update_articles( print(attr_task) - def split_on_comma(str_val: str) -> List[str]: for val in str_val.split(","): yield val.strip() diff --git a/packages/df-wiki-cli/df_wiki_cli/meilisearch/main.py b/packages/df-wiki-cli/df_wiki_cli/meilisearch/main.py index e6cb0e7b9c38fe0874f3efa988810e8494633c9f..b722a7a7cf965837c610584c1c2a086f660cd039 100644 --- a/packages/df-wiki-cli/df_wiki_cli/meilisearch/main.py +++ b/packages/df-wiki-cli/df_wiki_cli/meilisearch/main.py @@ -6,6 +6,8 @@ from df_wiki_cli.meilisearch import ( update_refseqtaxo, update_articles, update_refseq, + update_refseqtaxotype, + update_refseqtypecount, update_structure, update_systems, ) @@ -21,6 +23,9 @@ app = typer.Typer() class Documents(str, Enum): refseqtaxo = "refseqtaxo" + refseqtaxotype = "refseqtaxotype" + refseqtypecount = "refseqtypecount" + refseqsanitized = "refseqsanitized" refseq = "refseq" structure = "structure" systems = "systems" @@ -63,6 +68,7 @@ def update( ] = Documents.refseq, content_type: Annotated[str, typer.Option(help="Content-Type header")] = "text/csv", ): + if document == "refseqtaxo": update_refseqtaxo(ctx.obj.host, ctx.obj.key, file, document) if document == "refseq": @@ -73,6 +79,12 @@ def update( update_systems(ctx.obj.host, ctx.obj.key, file, document) if document == "article": update_articles(ctx.obj.host, ctx.obj.key, file, document) + if document == "refseqtaxotype": + update_refseqtaxotype(ctx.obj.host, ctx.obj.key, file, document) + if document == "refseqsanitized": + update_refseq(ctx.obj.host, ctx.obj.key, file, document) + if document == "refseqtypecount": + update_refseqtypecount(ctx.obj.host, ctx.obj.key, file, document) @app.command() @@ -97,6 +109,12 @@ def index_update(ctx: typer.Context, index: str, primary_key: str): console.print(task) +@app.command() +def index_delete(ctx: typer.Context, index: str): + client = meilisearch.Client(ctx.obj.host, ctx.obj.key) + client.index(index).delete() + + @app.command() def task(ctx: typer.Context, id: str): client = meilisearch.Client(ctx.obj.host, ctx.obj.key) diff --git a/packages/df-wiki-cli/pyproject.toml b/packages/df-wiki-cli/pyproject.toml index d0a3341443d8102a33b93a44f44f7b16797bb3ed..b6763ddc21e03ebb437cb3085a4e46142d434989 100644 --- a/packages/df-wiki-cli/pyproject.toml +++ b/packages/df-wiki-cli/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "df-wiki-cli" -version = "0.1.6" +version = "0.1.7" description = "" authors = ["Remi PLANEL <rplanel@pasteur.fr>"] readme = "README.md"