diff --git a/.eslintrc.js b/.eslintrc.js index ca16b7e048e9b055185eca7bdca2b696a08ab962..af6684f5fa25103b99509cad538e95995403cf41 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -4,7 +4,7 @@ module.exports = { node: true, es2021: true, }, - ignorePatterns: ["node_modules", "build", "coverage", "components.d.ts"], + ignorePatterns: ["node_modules", "build", "coverage", "components.d.ts", "Multiselect.vue"], plugins: ["eslint-comments", "functional"], extends: [ "plugin:vue/recommended", diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 12da6a44e663a137c4cf2de366e6213836b3c2cb..dd2c89d16202586ecd5293a8474def41e549c81d 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -6,7 +6,7 @@ include: stages: - build -# - test + - test - publish build-branch: @@ -15,5 +15,8 @@ build-branch: build-npm-release: extends: .build-npm-release +test: + extends: .test + publish-gitlab: extends: .publish-gitlab-release diff --git a/.yarnrc.yml b/.yarnrc.yml index f8b8d0b5cd560e3d004848484ea0c775c7fe07b3..90c0be9ea05a27c7f2a169005b6984928e064f01 100644 --- a/.yarnrc.yml +++ b/.yarnrc.yml @@ -2,9 +2,19 @@ packageExtensions: "@graphy/content.xml.scribe@*": dependencies: "@graphy/core.class.scribable": "*" + "@vue/test-utils@*": + dependencies: + "@vue/compiler-dom": "*" "fork-ts-checker-webpack-plugin@*": dependencies: "vue-template-compiler": "*" + "local-pkg@*": + dependencies: + "@vitest/coverage-c8": "*" + "jsdom": "*" + "vue-demi@*": + dependencies: + "vue": "^2.7.10" "vue-i18n@*": dependencies: "vue": "^2.7.10" diff --git a/package.json b/package.json index 344477136060cefc52f1cbc56264dda7669a3023..b44fd1fc22fb703383e335485de2824838b5d668 100644 --- a/package.json +++ b/package.json @@ -7,11 +7,14 @@ "build": "vite build", "preview": "vite preview", "lint": "eslint './src/**/*.{js,ts,tsx,vue,md}'", - "lint:fix": "eslint './src/**/*.{js,ts,tsx,vue,md}' --fix" + "lint:fix": "eslint './src/**/*.{js,ts,tsx,vue,md}' --fix", + "test": "vitest", + "test:unit": "vitest", + "coverage": "vitest run --coverage" }, "dependencies": { - "@coscine/api-client": "^2.6.0", - "@coscine/form-generator": "^3.0.8", + "@coscine/api-client": "^2.8.0", + "@coscine/form-generator": "^3.0.9", "@rdfjs-elements/formats-pretty": "^0.4.3", "@rdfjs/data-model": "^2.0.0", "@rdfjs/dataset": "^2.0.0", @@ -54,6 +57,7 @@ "devDependencies": { "@esbuild-plugins/node-globals-polyfill": "^0.1.1", "@esbuild-plugins/node-modules-polyfill": "^0.1.4", + "@pinia/testing": "^0.0.14", "@rollup/plugin-replace": "^4.0.0", "@semantic-release/commit-analyzer": "^9.0.2", "@semantic-release/git": "^10.0.1", @@ -69,9 +73,11 @@ "@typescript-eslint/eslint-plugin": "^5.35.1", "@typescript-eslint/parser": "^5.35.1", "@vitejs/plugin-vue2": "^1.1.2", + "@vitest/coverage-c8": "^0.24.3", "@vue/eslint-config-prettier": "^7.0.0", "@vue/eslint-config-typescript": "^11.0.0", "@vue/runtime-dom": "^3.2.40", + "@vue/test-utils": "^1.3.0", "conventional-changelog-eslint": "^3.0.9", "eslint": "^8.23.0", "eslint-config-prettier": "^8.5.0", @@ -81,6 +87,8 @@ "eslint-plugin-import": "^2.26.0", "eslint-plugin-prettier": "^4.2.1", "eslint-plugin-vue": "^9.4.0", + "jsdom": "^20.0.1", + "jsdom-global": "^3.0.2", "prettier": "^2.5.1", "rollup-plugin-node-globals": "^1.4.0", "rollup-plugin-node-polyfills": "^0.2.1", @@ -89,10 +97,11 @@ "unplugin-vue-components": "^0.22.4", "vite": "^3.0.9", "vite-plugin-windicss": "^1.8.3", + "vitest": "^0.24.3", "vue-template-compiler": "^2.7.10" }, "packageManager": "yarn@3.2.4", "resolutions": { - "nodeify-fetch": "3.0.0" + "readable-stream": "3.6.0" } } diff --git a/src/App.vue b/src/App.vue index 728945845fce43c2ef6b857505b5841c58838ac5..b9e6c4eed30f78d91bb8c408b9b83c03be6151a4 100644 --- a/src/App.vue +++ b/src/App.vue @@ -122,6 +122,7 @@ export default defineComponent({ if (!this.userStore.user) { await this.userStore.retrieveUser(); this.userStore.setUserLanguagePreference(); + await this.userStore.retrieveMemberOrganizations(); } } }, @@ -193,4 +194,15 @@ a[target="_blank"]:after { ); transition: all 0.3s; } + +.v_gapped_container { + display: flex; + flex-direction: column; + gap: var(--default-gap); +} + +mark { + background-color: #fff5cc; + padding: 0; +} </style> diff --git a/src/assets/css/_custom.css b/src/assets/css/_custom.css index 70ef8ab13c1812d3a628b3fdc59c9dd8f368003c..9fdb43f433ecab9044bbace0bb62ed99026bfabf 100644 --- a/src/assets/css/_custom.css +++ b/src/assets/css/_custom.css @@ -20,5 +20,8 @@ /* Calculated heights */ --sidebar-offset-top: calc(var(--navbar-height) + var(--loading-indicator-height) + var(--loading-indicator-margin)); - --sidebar-height: calc(100vh - var(--navbar-height) - calc(var(--loading-indicator-height) + var(--loading-indicator-margin))) + --sidebar-height: calc(100vh - var(--navbar-height) - calc(var(--loading-indicator-height) + var(--loading-indicator-margin))); + + /* Additional variables */ + --default-gap: 0.5rem; } \ No newline at end of file diff --git a/src/components/elements/Navbar.vue b/src/components/elements/Navbar.vue index d9da2a897b59ee9a0b3d87619ed97c00a9974e1b..3cafcb2ca45339e5b554b8dde3c8737e31882dbb 100644 --- a/src/components/elements/Navbar.vue +++ b/src/components/elements/Navbar.vue @@ -76,6 +76,10 @@ > {{ $t("nav.extrasImprint") }} </b-dropdown-item> + <!-- Contact --> + <b-dropdown-item :href="'mailto:' + contactEmail" target="_blank"> + {{ $t("nav.extrasContact") }} + </b-dropdown-item> </b-nav-item-dropdown> <b-nav-item-dropdown v-if="isLoggedIn" right> @@ -148,6 +152,9 @@ export default defineComponent({ }; }, computed: { + contactEmail(): string { + return this.userStore.contactEmail; + }, locales(): Array<string> { return this.$root.$i18n.availableLocales; }, diff --git a/src/i18n/de.ts b/src/i18n/de.ts index 13a971f7fdaaca5aae0b1eee9e58d67f699936e9..7fbe9beb36aaa8c312850a734a6f26145b39434b 100644 --- a/src/i18n/de.ts +++ b/src/i18n/de.ts @@ -13,6 +13,7 @@ export default { extrasHelp: "Hilfe", extrasDisclaimer: "Disclaimer", extrasImprint: "Impressum", + extrasContact: "Kontakt", user: "{displayName}", userProfile: "Nutzerprofil", userLogIn: "Einloggen", @@ -64,6 +65,7 @@ export default { submit: "Abschicken", tokenCreate: "Zugriffstoken erstellen", unarchive: "Archivieren rückgängig", + verify: "Verifizieren", } as VueI18n.LocaleMessageObject, default: { @@ -109,7 +111,7 @@ export default { failure: { title: "Fehler beim Speichern", message: - "Es ist ein Fehler aufgetreten. Bitte versuchen Sie es erneut. Falls der Fehler weiterhin auftritt, wenden Sie sich bitte an @:(email.serviceDeskEmail).", + "Es ist ein Fehler aufgetreten. Bitte versuchen Sie es erneut. Falls der Fehler weiterhin auftritt, wenden Sie sich bitte an Ihre Organization.", }, }, onDelete: { @@ -120,17 +122,17 @@ export default { failure: { title: "Fehler beim Löschen", message: - "Es ist ein Fehler aufgetreten. Bitte versuchen Sie es erneut. Falls der Fehler weiterhin auftritt, wenden Sie sich bitte an @:(email.serviceDeskEmail).", + "Es ist ein Fehler aufgetreten. Bitte versuchen Sie es erneut. Falls der Fehler weiterhin auftritt, wenden Sie sich bitte an Ihre Organization.", }, }, apiError: { general: { title: "Ein Fehler ist aufgetreten", - body: "Es ist ein Fehler aufgetreten. Bitte versuchen Sie es erneut. Falls der Fehler weiterhin auftritt, wenden Sie sich bitte an @:(email.serviceDeskEmail).", + body: "Es ist ein Fehler aufgetreten. Bitte versuchen Sie es erneut. Falls der Fehler weiterhin auftritt, wenden Sie sich bitte an Ihre Organization.", }, specific: { title: "Ein Fehler ist aufgetreten", - body: "Es ist ein Fehler aufgetreten {error}. Bitte versuchen Sie es erneut. Falls der Fehler weiterhin auftritt, wenden Sie sich bitte an @:(email.serviceDeskEmail).", + body: "Es ist ein Fehler aufgetreten {error}. Bitte versuchen Sie es erneut. Falls der Fehler weiterhin auftritt, wenden Sie sich bitte an Ihre Organization.", }, }, }, @@ -219,10 +221,10 @@ export default { "RDS-S3 Nordrhein-Westfalen sind objektbasierte Speichereinheiten für Forschungsdaten. Sie basieren auf der gleichen Technik wie der Research Data Storage (RDS), die Verwaltung der Metadaten liegt jedoch beim Nutzer. Daher ist ein Antragsverfahren notwendig, um sicherzustellen, dass die Daten die in RDS-S3 gespeichert werden mit Metadaten beschrieben werden um langfristig auffindbar und nachnutzbar zu sein.", }, gitlab: { - displayName: "Gitlab", - fullName: "Gitlab (Git)", + displayName: "GitLab", + fullName: "GitLab (Git)", description: - "Gitlab (Git) ist eine Webanwendung zur Versionsverwaltung für Softwareprojekte auf Git-Basis. Sie können Git-Repositorien in Ihren CoScInE Projekten hinterlegen und mit Metadaten beschreiben. Im Arbeitsalltag können Sie Git wie gewohnt nutzen und haben in CoScInE die Übersicht über verschiedene Repositorien und die Möglichkeit zur Metadatenverwaltung.", + "GitLab (Git) ist eine Webanwendung zur Versionsverwaltung für Softwareprojekte auf Git-Basis. Sie können Git-Repositorien in Ihren Coscine Projekten hinterlegen und mit Metadaten beschreiben. Im Arbeitsalltag können Sie Git wie gewohnt nutzen und haben in Coscine die Übersicht über verschiedene Repositorien und die Möglichkeit zur Metadatenverwaltung.", }, linked: { displayName: "Linked Data", @@ -270,7 +272,7 @@ export default { email: { serviceDeskEmail: "servicedesk@itc.rwth-aachen.de", serviceDeskMailTo: - "mailto:servicedesk@itc.rwth-aachen.de?subject=CoScInE%20Pilot%20Program", + "mailto:servicedesk@itc.rwth-aachen.de?subject=Coscine%20Pilot%20Program", serviceDeskName: "Servicedesk", }, } as VueI18n.LocaleMessageObject; diff --git a/src/i18n/en.ts b/src/i18n/en.ts index f6c9257cc76fe51419685dcd93f83ca7b981e4d7..8a14f41108e1f0709ffd02aaaec009bc06b48cc6 100644 --- a/src/i18n/en.ts +++ b/src/i18n/en.ts @@ -13,6 +13,7 @@ export default { extrasHelp: "Help", extrasDisclaimer: "Disclaimer", extrasImprint: "Imprint", + extrasContact: "Contact", user: "{displayName}", userProfile: "User Profile", userLogIn: "Log in", @@ -62,6 +63,7 @@ export default { submit: "Submit", tokenCreate: "Create Access Token", unarchive: "Unarchive", + verify: "Verify", } as VueI18n.LocaleMessageObject, default: { @@ -107,7 +109,7 @@ export default { failure: { title: "Error on saving", message: - "An error occurred. Please try again. If the error persists, please contact @:(email.serviceDeskEmail).", + "An error occurred. Please try again. If the error persists, please contact your organization.", }, }, onDelete: { @@ -118,17 +120,17 @@ export default { failure: { title: "Error on deletion", message: - "An error occurred. Please try again. If the error persists, please contact @:(email.serviceDeskEmail).", + "An error occurred. Please try again. If the error persists, please contact your organization.", }, }, apiError: { general: { title: "An error occurred", - body: "An error occurred. Please try again. If the error persists, please contact @:(email.serviceDeskEmail).", + body: "An error occurred. Please try again. If the error persists, please contact your organization.", }, specific: { title: "An error occurred", - body: "An error occurred {error}. Please try again. If the error persists, please contact @:(email.serviceDeskEmail).", + body: "An error occurred {error}. Please try again. If the error persists, please contact your organization.", }, }, }, @@ -217,10 +219,10 @@ export default { "RDS-S3 North Rhine-Westphalia are object-based storage units for research data. They are based on the same technology as the research data storage (RDS), but the administration of the metadata lies with the user. Therefore, an application procedure is necessary to ensure that the data stored in S3 Buckets is described with metadata in order to be retrievable and reusable in the long term.", }, gitlab: { - displayName: "Gitlab", - fullName: "Gitlab (Git)", + displayName: "GitLab", + fullName: "GitLab (Git)", description: - "Gitlab (Git) is a web application for version management of software projects based on Git. You can store Git repositories in your CoScInE projects and describe them with metadata. In your daily work you can use Git as usual and have an overview of different repositories and the possibility to manage metadata in CoScInE.", + "GitLab (Git) is a web application for version management of software projects based on Git. You can store Git repositories in your Coscine projects and describe them with metadata. In your daily work you can use Git as usual and have an overview of different repositories and the possibility to manage metadata in Coscine.", }, linked: { displayName: "Linked Data", diff --git a/src/modules/login/components/LoginMain.vue b/src/modules/login/components/LoginMain.vue index 5c8be071285037afc6729c576e6cc542a59e6394..108f0324158f3add894172b9ba459886d43c64d6 100644 --- a/src/modules/login/components/LoginMain.vue +++ b/src/modules/login/components/LoginMain.vue @@ -14,7 +14,7 @@ /> <!-- Buttons --> - <div v-else class="buttons_container"> + <div v-else class="v_gapped_container"> <!-- ORCiD Login Button --> <b-button variant="primary" @@ -144,11 +144,6 @@ export default defineComponent({ </script> <style scoped> -.buttons_container { - display: flex; - flex-direction: column; - gap: 0.5rem; -} .component-fade-enter-active, .component-fade-leave-active { transition: opacity 0.2s ease; diff --git a/src/modules/login/components/LogoutMain.vue b/src/modules/login/components/LogoutMain.vue index d1b9d195b89df4fdf05c07d5ad4be9fbf186a9f3..5bcb33c4f5f9f2fa8144e215f21acd9be86821a6 100644 --- a/src/modules/login/components/LogoutMain.vue +++ b/src/modules/login/components/LogoutMain.vue @@ -6,7 +6,7 @@ </b-card-title> <!-- Buttons --> - <div class="buttons_container"> + <div class="v_gapped_container"> <!-- ORCiD Logout Button --> <b-button v-if="isLoggedInWithOrcid" @@ -104,11 +104,3 @@ export default defineComponent({ }, }); </script> - -<style scoped> -.buttons_container { - display: flex; - flex-direction: column; - gap: 0.5rem; -} -</style> diff --git a/src/modules/login/pages/Login.vue b/src/modules/login/pages/Login.vue index 1e543c6d9d3938673c291e245053d57e06c2e044..ad95c60a00fc538dc1ceca8199c860f52b442b0e 100644 --- a/src/modules/login/pages/Login.vue +++ b/src/modules/login/pages/Login.vue @@ -1,7 +1,7 @@ <template> <b-row id="login" cols="12"> <!-- Left Column --> - <b-col sm="12" md="7" class="card_container"> + <b-col sm="12" md="7" class="v_gapped_container gap-4"> <!-- Pilot Banner --> <Pilot :dismissible="false" :persistent="true" class="mb-0" /> @@ -18,7 +18,7 @@ </b-col> <!-- Right Column --> - <b-col sm="12" md="5" class="card_container"> + <b-col sm="12" md="5" class="v_gapped_container gap-4"> <!-- Login/Logout --> <b-card bg-variant="light"> <LoginMain v-if="!isLoggingOut" /> @@ -95,11 +95,3 @@ export default defineComponent({ }, }); </script> - -<style scoped> -.card_container { - display: flex; - flex-direction: column; - gap: 1rem; -} -</style> diff --git a/src/modules/login/pages/ToS.vue b/src/modules/login/pages/ToS.vue index 676c1ba42ba1d7b2a3fae95b9e40f4831291ca16..ecca58990006d911437e33dbe073a286545b6e06 100644 --- a/src/modules/login/pages/ToS.vue +++ b/src/modules/login/pages/ToS.vue @@ -29,7 +29,7 @@ </b-form-checkbox> </b-card-body> - <div class="buttons_container"> + <div class="v_gapped_container"> <b-button variant="primary" :disabled="!isTosChecked || !isPpChecked || areTosAccepted" @@ -108,12 +108,6 @@ export default defineComponent({ </script> <style scoped> -.buttons_container { - display: flex; - flex-direction: column; - gap: 0.5rem; -} - .custom-checkbox:after { content: " *"; color: #a70619; diff --git a/src/modules/project/data/defaultOrganizations.ts b/src/modules/project/data/defaultOrganizations.ts index e532089f3473a88e4530b74d1a07c249520a54fa..b297eda535b3ae101d68474482c2803df393f178 100644 --- a/src/modules/project/data/defaultOrganizations.ts +++ b/src/modules/project/data/defaultOrganizations.ts @@ -1,4 +1,4 @@ -import type { OrganizationObject } from "@coscine/api-client/dist/types/Coscine.Api.Project"; +import type { OrganizationObject } from "@coscine/api-client/dist/types/Coscine.Api.Organization"; export const defaultOrganizations = [ { diff --git a/src/modules/project/i18n/de.ts b/src/modules/project/i18n/de.ts index 7c82d7bc44afa9524b3a6e5ae882120058cbbd80..f1be7e11107deb0c491e7047c362f10121acffcd 100644 --- a/src/modules/project/i18n/de.ts +++ b/src/modules/project/i18n/de.ts @@ -153,21 +153,21 @@ export default { connectionErrorTitle: "Fehler bei der Abfrage der Quotas", connectionErrorBody: - "Bei der Abfrage der Quotas ist ein Fehler aufgetreten. Bitte versuchen Sie es erneut. Wenn der Fehler weiter auftritt, wenden Sie sich bitte an servicedesk@itc.rwth-aachen.de", + "Bei der Abfrage der Quotas ist ein Fehler aufgetreten. Bitte versuchen Sie es erneut. Wenn der Fehler weiter auftritt, wenden Sie sich bitte an Ihre Organization.", resourceTypeQuotaChangedSuccessTitle: "Quota erfolgreich verändert", resourceTypeQuotaChangedSuccessBody: "Die Quota im Projekt {ProjectName} wurde auf {AmountInGB} GB gesetzt.", resourceTypeQuotaChangedFailureTitle: "Fehler beim Ändern der Quota", resourceTypeQuotaChangedFailureBody: - "Beim Ändern der Quota ist ein Fehler aufgetreten. Bitte versuchen Sie es erneut. Wenn der Fehler weiter auftritt, wenden Sie sich bitte an servicedesk@itc.rwth-aachen.de", + "Beim Ändern der Quota ist ein Fehler aufgetreten. Bitte versuchen Sie es erneut. Wenn der Fehler weiter auftritt, wenden Sie sich bitte an Ihre Organization.", resourceQuotaChangedSuccessTitle: "Quota erfolgreich verändert", resourceQuotaChangedSuccessBody: "Die Quota in Ressource {ResourceName} wurde auf {AmountInGB} GB gesetzt.", resourceQuotaChangedFailureTitle: "Fehler beim Ändern der Quota", resourceQuotaChangedFailureBody: - "Beim Ändern der Quota ist ein Fehler aufgetreten. Bitte versuchen Sie es erneut. Wenn der Fehler weiter auftritt, wenden Sie sich bitte an servicedesk@itc.rwth-aachen.de", + "Beim Ändern der Quota ist ein Fehler aufgetreten. Bitte versuchen Sie es erneut. Wenn der Fehler weiter auftritt, wenden Sie sich bitte an Ihre Organization.", }, // Settings.vue diff --git a/src/modules/project/i18n/en.ts b/src/modules/project/i18n/en.ts index 03392fe63c7f3bcedff938037e5c5360d5ec582b..65d791e8f8872dd03b056e3a026c7bb6b0f55e21 100644 --- a/src/modules/project/i18n/en.ts +++ b/src/modules/project/i18n/en.ts @@ -148,7 +148,7 @@ export default { connectionErrorTitle: "Resource quota retrieval not successful", connectionErrorBody: - "An error occurred while retrieving the resource type quota. Please try again. If the error persists, contact us at servicedesk@itc.rwth-aachen.de", + "An error occurred while retrieving the resource type quota. Please try again. If the error persists, contact your organization.", resourceTypeQuotaChangedSuccessTitle: "Quota extended successfully", resourceTypeQuotaChangedSuccessBody: @@ -156,14 +156,14 @@ export default { resourceTypeQuotaChangedFailureTitle: "Resource quota extension not successful", resourceTypeQuotaChangedFailureBody: - "An error occurred while extending the resource type quota. Please try again. If the error persists, contact us at servicedesk@itc.rwth-aachen.de", + "An error occurred while extending the resource type quota. Please try again. If the error persists, contact your organization.", resourceQuotaChangedSuccessTitle: "Quota extended successfully", resourceQuotaChangedSuccessBody: "The quota for resource {ResourceName} was successfully changed to {AmountInGB} GB.", resourceQuotaChangedFailureTitle: "Quota extension not successful", resourceQuotaChangedFailureBody: - "An error occurred while extending the quota. Please try again. If the error persists, contact us at servicedesk@itc.rwth-aachen.de", + "An error occurred while extending the quota. Please try again. If the error persists, contact your organization.", }, // Settings.vue diff --git a/src/modules/project/pages/components/FormMetadata.vue b/src/modules/project/pages/components/FormMetadata.vue index 4130b8f6885bac9a52988f200ff3127abe61a5b8..4d7b55ce73a0883316528b510b78d54b0a879cce 100644 --- a/src/modules/project/pages/components/FormMetadata.vue +++ b/src/modules/project/pages/components/FormMetadata.vue @@ -292,10 +292,10 @@ import "@/plugins/deprecated/vue-multiselect"; import type { DisciplineObject, - OrganizationObject, ProjectObject, VisibilityObject, } from "@coscine/api-client/dist/types/Coscine.Api.Project"; +import type { OrganizationObject } from "@coscine/api-client/dist/types/Coscine.Api.Organization"; // import the store for current module import useProjectStore from "../../store"; diff --git a/src/modules/project/store.ts b/src/modules/project/store.ts index e40eb5914d2c1809d15b7208beb2ec572496c90a..ee71fe8a8a6f67afd3d09c48251e209cd52fc344 100644 --- a/src/modules/project/store.ts +++ b/src/modules/project/store.ts @@ -16,8 +16,8 @@ import { ResourceQuotaApi, ProjectQuotaApi, } from "@coscine/api-client"; +import type { OrganizationObject } from "@coscine/api-client/dist/types/Coscine.Api.Organization"; import type { - OrganizationObject, InvitationReturnObject, ProjectObject, ProjectQuotaReturnObject, @@ -415,7 +415,7 @@ export const useProjectStore = defineStore({ async getOrganizationByURL( url: string - ): Promise<OrganizationObject[] | null> { + ): Promise<OrganizationObject[] | undefined | null> { const notificationStore = useNotificationStore(); try { const apiResponse = await OrganizationApi.organizationGetOrganization( @@ -433,7 +433,8 @@ export const useProjectStore = defineStore({ const notificationStore = useNotificationStore(); try { const apiResponse = await OrganizationApi.organizationGetROR(filter); - this.organizations = apiResponse.data.data; + this.organizations = + apiResponse.data.data !== undefined ? apiResponse.data.data : null; } catch (error) { // Handle other Status Codes notificationStore.postApiErrorNotification(error as AxiosError); @@ -444,7 +445,7 @@ export const useProjectStore = defineStore({ const notificationStore = useNotificationStore(); try { const apiResponse = await OrganizationApi.organizationIsMember(rorUrl); - return apiResponse.data.isMember as boolean; + return apiResponse.data.isMember ? true : false; } catch (error) { // Handle other Status Codes notificationStore.postApiErrorNotification(error as AxiosError); diff --git a/src/modules/project/types.ts b/src/modules/project/types.ts index e122afd2ce2f73b46c410e07529a605f958a49dd..af581dd7f533568c74b8dd40a22a24159bbc36f8 100644 --- a/src/modules/project/types.ts +++ b/src/modules/project/types.ts @@ -2,7 +2,6 @@ import type { DisciplineObject, InvitationReturnObject, LicenseObject, - OrganizationObject, ProjectObject, ProjectQuotaReturnObject, ProjectRoleObject, @@ -11,6 +10,7 @@ import type { SendInvitationObject, VisibilityObject, } from "@coscine/api-client/dist/types/Coscine.Api.Project"; +import type { OrganizationObject } from "@coscine/api-client/dist/types/Coscine.Api.Organization"; import type { ResourceQuotaReturnObject } from "@coscine/api-client/dist/types/Coscine.Api.Resources"; export interface VisitedProjectObject extends ProjectObject { diff --git a/src/modules/resource/components/create-resource/Configuration.vue b/src/modules/resource/components/create-resource/Configuration.vue index dadddd3c92a2b0b1ce55d1f2491368fa35191d4e..5a3c50cebec18d48170167e4c10d4008a0b973af 100644 --- a/src/modules/resource/components/create-resource/Configuration.vue +++ b/src/modules/resource/components/create-resource/Configuration.vue @@ -71,13 +71,21 @@ <!-- Setup Slider --> <ConfigurationSizeSlider v-if="resourceTypeHasSize" v-model="resource" /> + <GitLab + v-if=" + selectedResourceType && selectedResourceType.displayName === 'gitlab' + " + v-model="resource" + /> + <!-- Button Next (wrapper needed for Popover) --> <div id="divButtonNext" class="float-right"> <b-button variant="outline-primary" :disabled="!valid" @click.prevent="next" - >{{ $t("buttons.next") }} + > + {{ $t("buttons.next") }} </b-button> </div> @@ -124,7 +132,9 @@ import type { LabeledResourceObject, ResourceTypeOption } from "../../types"; export default defineComponent({ components: { ConfigurationSizeSlider, + GitLab: () => import("./resource-type/GitLab.vue"), }, + props: { value: { type: Object as PropType<ResourceObject>, @@ -135,11 +145,13 @@ export default defineComponent({ type: Boolean, }, }, + emits: { valid: (_: boolean) => true, next: null, input: (_: ResourceObject) => true, }, + setup() { const mainStore = useMainStore(); const projectStore = useProjectStore(); @@ -203,10 +215,37 @@ export default defineComponent({ } }, valid(): boolean { - return !( - !this.selectedResourceType || - (this.resource.resourceTypeOption as ResourceTypeOption).Size <= 0 - ); + // Ensure a resource type is selected and its ID is consistent across the options and the target object + if ( + this.selectedResourceType && + this.resource.type && + this.selectedResourceType.id === this.resource.type.id + ) { + // Evaluate resource types that have quota, require Size has been set and is a positive number + if ( + this.selectedResourceType.isQuotaAvailable && + this.selectedResourceType.isQuotaAdjustable + ) { + return ( + (this.resource.resourceTypeOption as ResourceTypeOption).Size > 0 + ); + } + // Evaluate resource type specific - GitLab + else if (this.resource.type.displayName === "gitlab") { + return ( + this.resource.resourceTypeOption && + this.resource.resourceTypeOption["RepoUrl"] && + this.resource.resourceTypeOption["AccessToken"] && + this.resource.resourceTypeOption["ProjectId"] && + this.resource.resourceTypeOption["Branch"] + ); + } + // Evaluate resource type specific - Linked Data + else if (this.resource.type.displayName === "linked") { + return true; + } + } + return false; }, }, diff --git a/src/modules/resource/components/create-resource/Overview.vue b/src/modules/resource/components/create-resource/Overview.vue index 2e3b3de32ad4be61555763071fad6f763c5b6f3c..6975489ef59168fe186358da5e7886aea3680fab 100644 --- a/src/modules/resource/components/create-resource/Overview.vue +++ b/src/modules/resource/components/create-resource/Overview.vue @@ -1,7 +1,10 @@ <template> <div class="overview"> <!-- Resource Configuration --> - <b-card class="my-2" @click.prevent="toTab(tabs[0])"> + <b-card class="my-2"> + <b-link class="float-right text-primary" @click.prevent="toTab(tabs[0])"> + {{ $t("page.createResource.overview.edit") }} + </b-link> <CoscineHeadline :headline="$t('form.steps.first')" h="h5" /> <CoscineFormGroup @@ -31,7 +34,10 @@ </b-card> <!-- General Information --> - <b-card class="my-2" @click.prevent="toTab(tabs[1])"> + <b-card class="my-2"> + <b-link class="float-right text-primary" @click.prevent="toTab(tabs[1])"> + {{ $t("page.createResource.overview.edit") }} + </b-link> <CoscineHeadline :headline="$t('form.steps.second')" h="h5" /> <!-- General --> @@ -39,7 +45,10 @@ </b-card> <!-- Metadata --> - <b-card class="my-2 p-0" @click.prevent="toTab(tabs[2])"> + <b-card class="my-2 p-0"> + <b-link class="float-right text-primary" @click.prevent="toTab(tabs[2])"> + {{ $t("page.createResource.overview.edit") }} + </b-link> <CoscineHeadline :headline="$t('form.steps.third')" h="h5" /> <!-- Form Generator --> diff --git a/src/modules/resource/components/create-resource/resource-type/GitLab.vue b/src/modules/resource/components/create-resource/resource-type/GitLab.vue new file mode 100644 index 0000000000000000000000000000000000000000..9379e4f6c6cc88432911e82500751b80ac21a633 --- /dev/null +++ b/src/modules/resource/components/create-resource/resource-type/GitLab.vue @@ -0,0 +1,354 @@ +<template> + <div> + <!-- Domain --> + <CoscineFormGroup + :mandatory="true" + label-for="Domain" + :label="$t('resourceType.gitlab.domainLabel')" + :is-loading="isLoading" + type="input" + > + <b-form-input + id="Domain" + v-model="v$.gitlabInformation.domain.$model" + :state=" + v$.gitlabInformation.domain.$dirty + ? !v$.gitlabInformation.domain.$error + : null + " + :placeholder="$t('resourceType.gitlab.domain')" + required + /> + + <div class="invalid-tooltip"> + {{ $t("resourceType.gitlab.domainInvalidTooltip") }} + </div> + </CoscineFormGroup> + + <!-- Access Token --> + <CoscineFormGroup + :mandatory="true" + label-for="AccessToken" + :label="$t('resourceType.gitlab.accessTokenLabel')" + :is-loading="isLoading" + type="input" + :info="true" + > + <b-form-input + id="AccessToken" + v-model="v$.gitlabInformation.accessToken.$model" + :state=" + v$.gitlabInformation.accessToken.$dirty + ? !v$.gitlabInformation.accessToken.$error && + isGitlabConnectionSuccessful + : null + " + :placeholder="$t('resourceType.gitlab.accessToken')" + required + /> + <div class="invalid-tooltip"> + {{ $t("resourceType.gitlab.accessTokenInvalidTooltip") }} + </div> + <template #popover> + <b-link + :href="$t('resourceType.gitlab.accessTokenInfoPopoverUrl').toString()" + target="_blank" + > + {{ $t("resourceType.gitlab.accessTokenInfoPopover") }} + </b-link> + </template> + </CoscineFormGroup> + + <CoscineFormGroup> + <b-button + variant="primary" + class="d-inline-block" + :disabled=" + !( + v$.gitlabInformation.domain.$dirty && + !v$.gitlabInformation.domain.$invalid && + v$.gitlabInformation.accessToken.$dirty && + !v$.gitlabInformation.accessToken.$invalid + ) + " + @click="verifyDomainAndToken(false)" + > + {{ $t("resourceType.gitlab.verifyConnection") }} + </b-button> + </CoscineFormGroup> + + <!-- GitLab Project --> + <CoscineFormGroup + :mandatory="true" + label-for="GitLabProject" + :label="$t('resourceType.gitlab.projectLabel')" + :is-loading="isLoading" + type="input" + > + <multiselect + id="GitLabProject" + v-model="gitlabInformation.project" + :options="gitlabProjects ?? []" + :multiple="false" + :hide-selected="false" + label="name" + track-by="name" + :show-labels="false" + :placeholder="$t('resourceType.gitlab.project')" + select-label="" + selected-label="" + deselect-label="" + :disabled="!isGitlabConnectionSuccessful" + @input="setSelectedGitLabProject" + > + <span slot="noResult"> + {{ $t("page.createResource.multiselect.noResults") }} + </span> + <span slot="noOptions"> + {{ $t("page.createResource.multiselect.noOptions") }} + </span> + </multiselect> + </CoscineFormGroup> + + <!-- GitLab Reference --> + <CoscineFormGroup + :mandatory="true" + label-for="GitLabReference" + :label="$t('resourceType.gitlab.referenceLabel')" + :is-loading="isLoading" + type="input" + > + <multiselect + id="GitLabReference" + v-model="v$.gitlabInformation.reference.$model" + :options="gitlabReferences ?? []" + :multiple="false" + :hide-selected="false" + label="name" + track-by="name" + :show-labels="false" + :placeholder="$t('resourceType.gitlab.reference')" + select-label="" + selected-label="" + deselect-label="" + :disabled="!(isGitlabConnectionSuccessful && gitlabInformation.project)" + @input="setSelectedGitLabReference" + > + <span slot="noResult"> + {{ $t("page.createResource.multiselect.noResults") }} + </span> + <span slot="noOptions"> + {{ $t("page.createResource.multiselect.noOptions") }} + </span> + </multiselect> + </CoscineFormGroup> + </div> +</template> + +<script lang="ts"> +import { defineComponent, type PropType } from "vue"; + +// import the store for current module +import useProjectStore from "@/modules/project/store"; +import useResourceStore from "../../../store"; +import useNotificationStore from "@/store/notification"; +// import the main store +import useMainStore from "@/store/index"; +import "@/plugins/deprecated/vue-multiselect"; +import type { + Branch, + Project, + ResourceObject, +} from "@coscine/api-client/dist/types/Coscine.Api.Resources"; +import type { GitlabInformation } from "@/modules/resource/types"; + +import { useVuelidate, type ValidationArgs } from "@vuelidate/core"; +import { required, url } from "@vuelidate/validators"; +import { isNumber } from "lodash"; + +export default defineComponent({ + props: { + value: { + type: Object as PropType<ResourceObject>, + required: true, + }, + }, + emits: { + input: (_: ResourceObject) => true, + }, + setup() { + const mainStore = useMainStore(); + const projectStore = useProjectStore(); + const resourceStore = useResourceStore(); + const notificationStore = useNotificationStore(); + + const v$ = useVuelidate(); + + return { mainStore, projectStore, resourceStore, notificationStore, v$ }; + }, + + data() { + return { + resource: this.value, + gitlabInformation: { + domain: "", + accessToken: "", + project: null, + reference: null, + } as GitlabInformation, + gitlabProjects: [] as Project[] | null, + gitlabReferences: [] as Branch[] | null, + isGitlabConnectionSuccessful: null as boolean | null, + isLoading: false, + }; + }, + + validations() { + return { + gitlabInformation: { + domain: { required, url }, + accessToken: { required }, + project: { required }, + reference: { required }, + } as ValidationArgs<GitlabInformation>, + }; + }, + + computed: {}, + + watch: { + resource: { + handler() { + this.$emit("input", this.resource); + }, + deep: true, + }, + }, + + async mounted() { + await this.initTabContent(); + }, + + methods: { + async verifyDomainAndToken(suppressNotifications: boolean) { + this.gitlabProjects = await this.resourceStore.getGitlabAllProjects( + this.gitlabInformation.domain, + this.gitlabInformation.accessToken + ); + this.v$.gitlabInformation.$touch(); + if ( + this.gitlabProjects && + !this.v$.gitlabInformation.domain.$invalid && + !this.v$.gitlabInformation.accessToken.$invalid + ) { + this.isGitlabConnectionSuccessful = true; + + // Set the information inside the resource + this.$set( + this.resource.resourceTypeOption, + "RepoUrl", + this.gitlabInformation.domain + ); + this.$set( + this.resource.resourceTypeOption, + "AccessToken", + this.gitlabInformation.accessToken + ); + + if (!suppressNotifications) { + // Post success notification + this.notificationStore.postNotification({ + title: this.$t( + "resourceType.gitlab.verificationToast.success.title" + ).toString(), + body: this.$t( + "resourceType.gitlab.verificationToast.success.body" + ).toString(), + }); + } + } else { + this.isGitlabConnectionSuccessful = false; + if (!suppressNotifications) { + // Post failure notification + this.notificationStore.postNotification({ + title: this.$t( + "resourceType.gitlab.verificationToast.failure.title" + ).toString(), + body: this.$t( + "resourceType.gitlab.verificationToast.failure.body" + ).toString(), + variant: "warning", + }); + } + } + }, + + async setSelectedGitLabProject() { + if ( + this.gitlabInformation.project && + isNumber(this.gitlabInformation.project.id) + ) { + this.gitlabReferences = + await this.resourceStore.getGitlabBranchesForProject( + this.gitlabInformation.project.id, + this.gitlabInformation.domain, + this.gitlabInformation.accessToken + ); + // Set the information inside the resource + this.$set( + this.resource.resourceTypeOption, + "ProjectId", + this.gitlabInformation.project.id + ); + } + }, + + setSelectedGitLabReference() { + if ( + this.gitlabInformation.reference && + this.gitlabInformation.reference.name + ) + // Set the information inside the resource + this.$set( + this.resource.resourceTypeOption, + "Branch", + this.gitlabInformation.reference.name + ); + }, + + async initTabContent() { + this.isLoading = true; + if ( + this.resource.resourceTypeOption && + this.resource.resourceTypeOption["RepoUrl"] && + this.resource.resourceTypeOption["AccessToken"] && + this.resource.resourceTypeOption["ProjectId"] && + this.resource.resourceTypeOption["Branch"] + ) { + // A resource type has been selected, but the resource's properties are unset. Set the values. + this.gitlabInformation.domain = + this.resource.resourceTypeOption["RepoUrl"]; + this.gitlabInformation.accessToken = + this.resource.resourceTypeOption["AccessToken"]; + this.v$.gitlabInformation.$validate(); + await this.verifyDomainAndToken(true); + if (this.gitlabProjects) { + this.gitlabInformation.project = + this.gitlabProjects.find( + (p) => p.id === this.resource.resourceTypeOption["ProjectId"] + ) ?? null; + await this.setSelectedGitLabProject(); + if (this.gitlabReferences) { + this.gitlabInformation.reference = + this.gitlabReferences.find( + (r) => r.name === this.resource.resourceTypeOption["Branch"] + ) ?? null; + this.setSelectedGitLabReference(); + } + } + } + this.isLoading = false; + }, + }, +}); +</script> diff --git a/src/modules/resource/components/settings/Configuration.vue b/src/modules/resource/components/settings/Configuration.vue index ce4b08c0ef26bf611e729843c91b806f7d7bfa1e..da07376d15f8c4a44bba62b926e34a9977da1f22 100644 --- a/src/modules/resource/components/settings/Configuration.vue +++ b/src/modules/resource/components/settings/Configuration.vue @@ -1,89 +1,39 @@ <template> - <div> - <!-- Content --> - <div v-if="resource"> - <!-- Individual Fields --> - <div - v-for="(resourceOption, index) of Object.keys( - resource.resourceTypeOption - )" - :key="index" - > - <!-- Field Definition --> - <CoscineFormGroup - v-if="resourceOption !== 'Id'" - :label-for="resourceOption" - :label=" - $t( - 'page.settings.configuration.resource' + resourceOption + 'Label' - ) - " - > - <!-- Resource Size Field --> - <b-form-input - v-if="resourceOption === 'Size'" - :value="resourceSizeText" - :readonly="readonly" - /> - - <!-- Other Fields --> - <b-button-group v-else class="w-100"> - <!-- Text Field --> - <b-form-input - v-model="resource.resourceTypeOption[resourceOption]" - :readonly="readonly" - /> - - <!-- Copy Button --> - <b-button - :id="`copyButton${index}`" - @click=" - copyText(resource.resourceTypeOption[resourceOption], index) - " - > - <b-icon icon="clipboard" /> - </b-button> - - <!-- Copied Tooltip --> - <b-tooltip - :id="`copyTooltip${index}`" - :target="`copyButton${index}`" - placement="top" - triggers="blur" - > - {{ - $t("page.settings.configuration.toClipboard", { - resourceOption: $t( - "page.settings.configuration.resource" + resourceOption - ), - }) - }} - </b-tooltip> - </b-button-group> - </CoscineFormGroup> - </div> - </div> + <div v-if="resource && resource.type"> + <GitLab + v-if="resource.type.displayName === 'gitlab'" + v-model="resourceForm" + /> + <Generic v-else /> </div> </template> <script lang="ts"> -import { defineComponent } from "vue"; +import { defineComponent, type PropType } from "vue"; // import the store for current module import useResourceStore from "../../store"; import type { ResourceObject } from "@coscine/api-client/dist/types/Coscine.Api.Resources"; -import type { ResourceTypeOption } from "../../types"; export default defineComponent({ - components: {}, + components: { + Generic: () => import("./resource-type/Generic.vue"), + GitLab: () => import("./resource-type/GitLab.vue"), + }, + props: { + value: { + type: Object as PropType<ResourceObject>, + required: true, + }, + }, setup() { const resourceStore = useResourceStore(); - return { resourceStore }; }, data() { return { readonly: true, + resourceForm: this.value, }; }, @@ -91,29 +41,15 @@ export default defineComponent({ resource(): ResourceObject | null { return this.resourceStore.currentResource; }, - resourceSizeText(): string { - if ( - this.resource && - (this.resource.resourceTypeOption as ResourceTypeOption).Size - ) { - return ( - (this.resource.resourceTypeOption as ResourceTypeOption).Size + " GB" - ); - } else { - return this.$t("default.none").toString(); - } - }, }, - methods: { - copyText(value: string, index: number) { - if (this.resource) { - navigator.clipboard.writeText(value); - this.$root.$emit("bv::show::tooltip", `copyTooltip${index}`); - } + watch: { + resourceForm: { + handler() { + this.$emit("input", this.resourceForm); + }, + deep: true, }, }, }); </script> - -<style></style> diff --git a/src/modules/resource/components/settings/modals/DeleteResourceModal.vue b/src/modules/resource/components/settings/modals/DeleteResourceModal.vue index 2714e02150e74ac56ed9a3cb66e0943de8c07256..7d7b8a45809b3ad82b8d2637d953226c24a16505 100644 --- a/src/modules/resource/components/settings/modals/DeleteResourceModal.vue +++ b/src/modules/resource/components/settings/modals/DeleteResourceModal.vue @@ -43,7 +43,7 @@ </template> <script lang="ts"> -import { defineComponent } from "vue"; +import { defineComponent, type PropType } from "vue"; export default defineComponent({ props: { @@ -62,7 +62,7 @@ export default defineComponent({ }, displayName: { default: "", - type: String, + type: [String, null] as PropType<string | null>, }, }, diff --git a/src/modules/resource/components/settings/resource-type/Generic.vue b/src/modules/resource/components/settings/resource-type/Generic.vue new file mode 100644 index 0000000000000000000000000000000000000000..d55be7f8306cead1e09fec6290905d41de209307 --- /dev/null +++ b/src/modules/resource/components/settings/resource-type/Generic.vue @@ -0,0 +1,119 @@ +<template> + <div> + <!-- Content --> + <div v-if="resource"> + <!-- Individual Fields --> + <div + v-for="(resourceOption, index) of Object.keys( + resource.resourceTypeOption + )" + :key="index" + > + <!-- Field Definition --> + <CoscineFormGroup + v-if="resourceOption !== 'Id'" + :label-for="resourceOption" + :label=" + $t( + 'page.settings.configuration.resource' + resourceOption + 'Label' + ) + " + > + <!-- Resource Size Field --> + <b-form-input + v-if="resourceOption === 'Size'" + :value="resourceSizeText" + :readonly="readonly" + /> + + <!-- Other Fields --> + <b-button-group v-else class="w-100"> + <!-- Text Field --> + <b-form-input + v-model="resource.resourceTypeOption[resourceOption]" + :readonly="readonly" + /> + + <!-- Copy Button --> + <b-button + :id="`copyButton${index}`" + @click=" + copyText(resource.resourceTypeOption[resourceOption], index) + " + > + <b-icon icon="clipboard" /> + </b-button> + + <!-- Copied Tooltip --> + <b-tooltip + :id="`copyTooltip${index}`" + :target="`copyButton${index}`" + placement="top" + triggers="blur" + > + {{ + $t("page.settings.configuration.toClipboard", { + resourceOption: $t( + "page.settings.configuration.resource" + resourceOption + ), + }) + }} + </b-tooltip> + </b-button-group> + </CoscineFormGroup> + </div> + </div> + </div> +</template> + +<script lang="ts"> +import { defineComponent } from "vue"; +// import the store for current module +import useResourceStore from "../../../store"; +import type { ResourceObject } from "@coscine/api-client/dist/types/Coscine.Api.Resources"; +import type { ResourceTypeOption } from "../../../types"; + +export default defineComponent({ + components: {}, + setup() { + const resourceStore = useResourceStore(); + + return { resourceStore }; + }, + + data() { + return { + readonly: true, + }; + }, + + computed: { + resource(): ResourceObject | null { + return this.resourceStore.currentResource; + }, + resourceSizeText(): string { + if ( + this.resource && + (this.resource.resourceTypeOption as ResourceTypeOption).Size + ) { + return ( + (this.resource.resourceTypeOption as ResourceTypeOption).Size + " GB" + ); + } else { + return this.$t("default.none").toString(); + } + }, + }, + + methods: { + copyText(value: string, index: number) { + if (this.resource) { + navigator.clipboard.writeText(value); + this.$root.$emit("bv::show::tooltip", `copyTooltip${index}`); + } + }, + }, +}); +</script> + +<style></style> diff --git a/src/modules/resource/components/settings/resource-type/GitLab.vue b/src/modules/resource/components/settings/resource-type/GitLab.vue new file mode 100644 index 0000000000000000000000000000000000000000..87ed54700f911cb94174c2b089e0337c46d87988 --- /dev/null +++ b/src/modules/resource/components/settings/resource-type/GitLab.vue @@ -0,0 +1,361 @@ +<template> + <div> + <!-- Domain --> + <CoscineFormGroup + :mandatory="true" + label-for="Domain" + :label="$t('resourceType.gitlab.domainLabel')" + :is-loading="isLoading" + type="input" + > + <b-form-input + id="Domain" + v-model="resourceForm.resourceTypeOption['RepoUrl']" + :placeholder="$t('resourceType.gitlab.domain')" + readonly + /> + </CoscineFormGroup> + + <!-- GitLab Project ID --> + <CoscineFormGroup + :mandatory="true" + label-for="ProjectId" + :label="$t('resourceType.gitlab.projectIdLabel')" + :is-loading="isLoading" + type="input" + > + <b-form-input + id="ProjectId" + v-model="resourceForm.resourceTypeOption['ProjectId']" + :placeholder="$t('resourceType.gitlab.projectId')" + readonly + /> + </CoscineFormGroup> + + <!-- GitLab Project --> + <CoscineFormGroup + :mandatory="true" + label-for="Project" + :label="$t('resourceType.gitlab.projectLabel')" + :is-loading="isLoading" + type="input" + > + <b-form-input + id="Project" + :value=" + gitlabInformation.project + ? gitlabInformation.project.name + : $t('resourceType.gitlab.projectNotValidated') + " + :placeholder="$t('resourceType.gitlab.project')" + readonly + /> + </CoscineFormGroup> + + <!-- Access Token --> + <CoscineFormGroup + :mandatory="true" + label-for="AccessToken" + :label="$t('resourceType.gitlab.accessTokenLabel')" + :is-loading="isLoading" + type="input" + :info="true" + > + <b-form-input + id="AccessToken" + v-model="v$.gitlabInformation.accessToken.$model" + :state=" + v$.gitlabInformation.accessToken.$dirty + ? !v$.gitlabInformation.accessToken.$error && + isGitlabConnectionSuccessful + : null + " + :placeholder="$t('resourceType.gitlab.accessToken')" + required + /> + <div class="invalid-tooltip"> + {{ $t("resourceType.gitlab.accessTokenInvalidTooltip") }} + </div> + <template #popover> + <b-link + :href="$t('resourceType.gitlab.accessTokenInfoPopoverUrl').toString()" + target="_blank" + > + {{ $t("resourceType.gitlab.accessTokenInfoPopover") }} + </b-link> + </template> + </CoscineFormGroup> + + <CoscineFormGroup> + <b-button + variant="primary" + class="d-inline-block" + :disabled=" + !( + v$.gitlabInformation.domain.$dirty && + !v$.gitlabInformation.domain.$invalid && + v$.gitlabInformation.accessToken.$dirty && + !v$.gitlabInformation.accessToken.$invalid + ) + " + @click="verifyDomainAndToken(false)" + > + {{ $t("resourceType.gitlab.verifyConnection") }} + </b-button> + </CoscineFormGroup> + + <!-- GitLab Reference --> + <CoscineFormGroup + :mandatory="true" + label-for="GitLabReference" + :label="$t('resourceType.gitlab.referenceLabel')" + :is-loading="isLoading" + type="input" + > + <multiselect + id="GitLabReference" + v-model="v$.gitlabInformation.reference.$model" + :options="gitlabReferences ?? []" + :multiple="false" + :hide-selected="false" + label="name" + track-by="name" + :show-labels="false" + :placeholder="$t('resourceType.gitlab.reference')" + select-label="" + selected-label="" + deselect-label="" + :disabled="!(isGitlabConnectionSuccessful && gitlabInformation.project)" + @input="setSelectedGitLabReference" + > + <span slot="noResult"> + {{ $t("page.createResource.multiselect.noResults") }} + </span> + <span slot="noOptions"> + {{ $t("page.createResource.multiselect.noOptions") }} + </span> + </multiselect> + </CoscineFormGroup> + </div> +</template> + +<script lang="ts"> +import { defineComponent, type PropType } from "vue"; + +// import the store for current module +import useProjectStore from "@/modules/project/store"; +import useResourceStore from "../../../store"; +import useNotificationStore from "@/store/notification"; +// import the main store +import useMainStore from "@/store/index"; +import "@/plugins/deprecated/vue-multiselect"; +import type { + Branch, + Project, + ResourceObject, +} from "@coscine/api-client/dist/types/Coscine.Api.Resources"; +import type { GitlabInformation } from "@/modules/resource/types"; + +import { useVuelidate, type ValidationArgs } from "@vuelidate/core"; +import { required, url } from "@vuelidate/validators"; +import { isNumber } from "lodash"; + +export default defineComponent({ + props: { + value: { + type: Object as PropType<ResourceObject>, + required: true, + }, + }, + emits: { + input: (_: ResourceObject) => true, + }, + setup() { + const mainStore = useMainStore(); + const projectStore = useProjectStore(); + const resourceStore = useResourceStore(); + const notificationStore = useNotificationStore(); + + const v$ = useVuelidate(); + + return { mainStore, projectStore, resourceStore, notificationStore, v$ }; + }, + + data() { + return { + resourceForm: this.value, + gitlabInformation: { + domain: "", + accessToken: "", + project: null, + reference: null, + } as GitlabInformation, + gitlabProjects: [] as Project[] | null, + gitlabReferences: [] as Branch[] | null, + isGitlabConnectionSuccessful: null as boolean | null, + isLoading: false, + }; + }, + + validations() { + return { + gitlabInformation: { + domain: { required, url }, + accessToken: { required }, + project: { required }, + reference: { required }, + } as ValidationArgs<GitlabInformation>, + }; + }, + + computed: {}, + + watch: { + resourceForm: { + handler() { + this.$emit("input", this.resourceForm); + }, + deep: true, + }, + "gitlabInformation.accessToken"() { + if ( + this.v$.gitlabInformation.accessToken.$dirty && + !this.v$.gitlabInformation.accessToken.$invalid + ) { + this.$set( + this.resourceForm.resourceTypeOption, + "AccessToken", + this.gitlabInformation.accessToken + ); + } + }, + }, + + async mounted() { + await this.initTabContent(); + }, + + methods: { + async verifyDomainAndToken(suppressNotifications: boolean) { + this.gitlabProjects = await this.resourceStore.getGitlabAllProjects( + this.gitlabInformation.domain, + this.gitlabInformation.accessToken + ); + this.v$.gitlabInformation.$touch(); + if ( + this.gitlabProjects && + !this.v$.gitlabInformation.domain.$invalid && + !this.v$.gitlabInformation.accessToken.$invalid + ) { + this.isGitlabConnectionSuccessful = true; + + this.gitlabInformation.project = + this.gitlabProjects.find( + (p) => p.id === this.resourceForm.resourceTypeOption["ProjectId"] + ) ?? null; + await this.setSelectedGitLabProject(); + if (this.gitlabReferences) { + this.gitlabInformation.reference = + this.gitlabReferences.find( + (r) => r.name === this.resourceForm.resourceTypeOption["Branch"] + ) ?? null; + this.setSelectedGitLabReference(); + } + + // Set the information inside the resource + this.$set( + this.resourceForm.resourceTypeOption, + "RepoUrl", + this.gitlabInformation.domain + ); + this.$set( + this.resourceForm.resourceTypeOption, + "AccessToken", + this.gitlabInformation.accessToken + ); + + if (!suppressNotifications) { + // Post success notification + this.notificationStore.postNotification({ + title: this.$t( + "resourceType.gitlab.verificationToast.success.title" + ).toString(), + body: this.$t( + "resourceType.gitlab.verificationToast.success.body", + { domain: this.gitlabInformation.domain } + ).toString(), + }); + } + } else { + this.isGitlabConnectionSuccessful = false; + if (!suppressNotifications) { + // Post failure notification + this.notificationStore.postNotification({ + title: this.$t( + "resourceType.gitlab.verificationToast.failure.title" + ).toString(), + body: this.$t( + "resourceType.gitlab.verificationToast.failure.body", + { domain: this.gitlabInformation.domain } + ).toString(), + variant: "warning", + }); + } + } + }, + + async setSelectedGitLabProject() { + if ( + this.gitlabInformation.project && + isNumber(this.gitlabInformation.project.id) + ) { + this.gitlabReferences = + await this.resourceStore.getGitlabBranchesForProject( + this.gitlabInformation.project.id, + this.gitlabInformation.domain, + this.gitlabInformation.accessToken + ); + // Set the information inside the resource + this.$set( + this.resourceForm.resourceTypeOption, + "ProjectId", + this.gitlabInformation.project.id + ); + } + }, + + setSelectedGitLabReference() { + if ( + this.gitlabInformation.reference && + this.gitlabInformation.reference.name + ) + // Set the information inside the resource + this.$set( + this.resourceForm.resourceTypeOption, + "Branch", + this.gitlabInformation.reference.name + ); + }, + + async initTabContent() { + this.isLoading = true; + if ( + this.resourceForm.resourceTypeOption && + this.resourceForm.resourceTypeOption["RepoUrl"] && + this.resourceForm.resourceTypeOption["AccessToken"] && + this.resourceForm.resourceTypeOption["ProjectId"] && + this.resourceForm.resourceTypeOption["Branch"] + ) { + // A resource type has been selected, but the resource's properties are unset. Set the values. + this.gitlabInformation.domain = + this.resourceForm.resourceTypeOption["RepoUrl"]; + this.gitlabInformation.accessToken = + this.resourceForm.resourceTypeOption["AccessToken"]; + this.v$.gitlabInformation.$validate(); + await this.verifyDomainAndToken(true); + } + this.isLoading = false; + }, + }, +}); +</script> diff --git a/src/modules/resource/i18n/de.ts b/src/modules/resource/i18n/de.ts index 9e61160a7fba3501ae4a583afea292656a9a2e8a..c60fb271414bd129e2d8286574b503b385ca6911 100644 --- a/src/modules/resource/i18n/de.ts +++ b/src/modules/resource/i18n/de.ts @@ -49,7 +49,7 @@ export default { }, overview: { title: "Schritt 4: @:(form.steps.fourth)", - resourceConfiguration: "Ressourcen Konfiguration", + edit: "Bearbeiten", }, multiselect: { placeholderResourceText: "Bitte wählen Sie einen Ressourcentyp aus.", @@ -284,6 +284,42 @@ export default { }, resourceType: { + gitlab: { + domain: "GitLab Domain", + domainLabel: "Domain:", + domainInvalidTooltip: + "Die angegebene Domain ist keine gültige vollständige URL", + + accessToken: "Projekt- oder Gruppenzugangstoken", + accessTokenLabel: "@:(resourceType.gitlab.accessToken):", + accessTokenInvalidTooltip: "Dieses Feld ist erforderlich", + accessTokenInfoPopover: + "Wie erstellt man ein @:(resourceType.gitlab.accessToken)?", + accessTokenInfoPopoverUrl: "https://", + + projectId: "GitLab Projekt Id", + projectIdLabel: "GitLab Projekt Id:", + + project: "GitLab Projekt auswählen", + projectLabel: "GitLab Projekt:", + projectNotValidated: + "Validieren Sie Ihr Zugangstoken, um den Projektnamen anzuzeigen", + + reference: "GitLab Branch auswählen", + referenceLabel: "GitLab Branch:", + + verifyConnection: "Überprüfen der GitLab-Verbindung", + verificationToast: { + success: { + title: "Erfolgreiche GitLab-Verbindung", + body: "Verbindung mit GitLab unter Verwendung des angegebenen Zugangstokens erfolgreich hergestellt.", + }, + failure: { + title: "GitLab-Verbindung fehlgeschlagen", + body: "Es konnte keine Verbindung mit GitLab unter Verwendung des angegebenen Zugangstokens hergestellt werden. Stellen Sie sicher, dass die angegebenen Informationen korrekt sind und versuchen Sie es erneut.", + }, + }, + }, linked: { page: { resource: { diff --git a/src/modules/resource/i18n/en.ts b/src/modules/resource/i18n/en.ts index 97f35aae14a7a9a0088599c0864ed47ca8dd4bce..9d32c451f2431dc08f5bbd7581a9ac6188591f6b 100644 --- a/src/modules/resource/i18n/en.ts +++ b/src/modules/resource/i18n/en.ts @@ -49,7 +49,7 @@ export default { }, overview: { title: "Step 4: @:(form.steps.fourth)", - resourceConfiguration: "Resource Configuration", + edit: "Edit", }, multiselect: { placeholderResourceText: "Please select a resource type.", @@ -280,6 +280,40 @@ export default { }, resourceType: { + gitlab: { + domain: "GitLab Domain", + domainLabel: "Domain:", + domainInvalidTooltip: "The provided domain is not a valid full URL", + + accessToken: "Project or Group Access Token", + accessTokenLabel: "@:(resourceType.gitlab.accessToken):", + accessTokenInvalidTooltip: "This is a required field", + accessTokenInfoPopover: + "How to create a @:(resourceType.gitlab.accessToken)?", + accessTokenInfoPopoverUrl: "https://", + + projectId: "GitLab Project Id", + projectIdLabel: "GitLab Project Id:", + + project: "Select a GitLab Project", + projectLabel: "GitLab Project:", + projectNotValidated: "Validate your token to preview the project name", + + reference: "Select a GitLab Branch", + referenceLabel: "GitLab Branch:", + + verifyConnection: "Verify GitLab Connection", + verificationToast: { + success: { + title: "Successful GitLab Connection", + body: "Successfully established connection with GitLab using the provided access token.", + }, + failure: { + title: "Failed GitLab Connection", + body: "Could not establish connection with GitLab using the provided access token. Ensure the provided information is correct and try again.", + }, + }, + }, linked: { page: { resource: { diff --git a/src/modules/resource/pages/Settings.vue b/src/modules/resource/pages/Settings.vue index ffda82514c19f6d5cdc036bfd2e9bb775c80a57c..55be8a1d10e97d57cfb9d685860893746abaafd0 100644 --- a/src/modules/resource/pages/Settings.vue +++ b/src/modules/resource/pages/Settings.vue @@ -20,7 +20,10 @@ </b-row> <!-- Configuration --> - <Configuration v-show="tabs[currentTab].step === 'configuration'" /> + <Configuration + v-show="tabs[currentTab].step === 'configuration'" + v-model="resourceForm" + /> <!-- General Overview from Create Resource --> <General @@ -146,6 +149,16 @@ export default defineComponent({ if (this.resource && this.resource.archived) { // Limit button to only be visible in the "general" tab, when the resource is archived. return this.tabs[this.currentTab].step === "general"; + } else if ( + this.resource && + this.resource.type && + this.resource.type.displayName === "gitlab" + ) { + return ( + this.tabs[this.currentTab].step === "configuration" || + this.tabs[this.currentTab].step === "general" || + this.tabs[this.currentTab].step === "metadata" + ); } else { return ( this.tabs[this.currentTab].step === "general" || diff --git a/src/modules/resource/store.ts b/src/modules/resource/store.ts index 3c229ed19bac85e158783478b0aa3c533803877b..cfe52273a32437a040423cc68dfc08e90307832c 100644 --- a/src/modules/resource/store.ts +++ b/src/modules/resource/store.ts @@ -5,13 +5,18 @@ import { reactive } from "vue"; import { BlobApi, + GitLabApi, MetadataApi, ResourceApi, ResourceQuotaApi, ResourceTypeApi, TreeApi, } from "@coscine/api-client"; -import type { ResourceObject } from "@coscine/api-client/dist/types/Coscine.Api.Resources"; +import type { + Branch, + Project, + ResourceObject, +} from "@coscine/api-client/dist/types/Coscine.Api.Resources"; import type { Route } from "vue-router/types/router"; import type { BilingualLabels } from "@coscine/api-client/dist/types/Coscine.Api.Metadata"; import type { ProjectObject } from "@coscine/api-client/dist/types/Coscine.Api.Project"; @@ -465,6 +470,61 @@ export const useResourceStore = defineStore({ return false; } }, + + async getGitlabAllProjects( + domain: string, + accessToken: string + ): Promise<Project[] | null> { + try { + const response = await GitLabApi.gitLabGetAllProjects( + domain, + accessToken + ); + return response.data; + } catch (error) { + return null; + } + }, + + async getGitlabProject( + projectId: number, + domain: string, + accessToken: string + ): Promise<Project | null> { + const notificationStore = useNotificationStore(); + try { + const response = await GitLabApi.gitLabGetProject( + projectId, + domain, + accessToken + ); + return response.data; + } catch (error) { + // Handle other Status Codes + notificationStore.postApiErrorNotification(error as AxiosError); + return null; + } + }, + + async getGitlabBranchesForProject( + projectId: number, + domain: string, + accessToken: string + ): Promise<Branch[] | null> { + const notificationStore = useNotificationStore(); + try { + const response = await GitLabApi.gitLabGetBranchesForProject( + projectId, + domain, + accessToken + ); + return response.data; + } catch (error) { + // Handle other Status Codes + notificationStore.postApiErrorNotification(error as AxiosError); + return null; + } + }, }, }); diff --git a/src/modules/resource/types.ts b/src/modules/resource/types.ts index 70cb09393f48110b3ed2461a31e4e904d45d35bf..c95e360476cdf708aeafbac7bc250bfbd87c076c 100644 --- a/src/modules/resource/types.ts +++ b/src/modules/resource/types.ts @@ -1,5 +1,7 @@ import type { BilingualLabels } from "@coscine/api-client/dist/types/Coscine.Api.Metadata"; import type { + Branch, + Project, QuotaDimObject, ResourceObject, ResourceTypeInformation, @@ -44,6 +46,13 @@ export interface ResourceTypeOption { [x: string]: unknown; } +export interface GitlabInformation { + domain: string; + accessToken: string; + project: Project | null; + reference: Branch | null; +} + export interface ResourceState { /* -------------------------------------------------------------------------------------- diff --git a/src/modules/search/i18n/de.ts b/src/modules/search/i18n/de.ts index 65686b41ce0dfb53ac8094b5932507810c2bba80..91abaa3ff13739888744a1b94bf10d1b3206ab05 100644 --- a/src/modules/search/i18n/de.ts +++ b/src/modules/search/i18n/de.ts @@ -16,6 +16,11 @@ export default { Item2: "Eintrag 2", }, + all: "Alle Einträge", + metadata: "Dateien", + resource: "Ressourcen", + project: "Projekte", + emptySearch: "Es wurden keine Treffer gefunden", endSearchResults: "Alle Ergebnisse werden angezeigt", diff --git a/src/modules/search/i18n/en.ts b/src/modules/search/i18n/en.ts index 40f0da5e8ad5a7c904645eef7b1c150cd31972a3..9fd6ab2addf19f999c6439031fe30f0e982c7593 100644 --- a/src/modules/search/i18n/en.ts +++ b/src/modules/search/i18n/en.ts @@ -16,6 +16,11 @@ export default { Item2: "Item2", }, + all: "All Entries", + metadata: "Files", + resource: "Resources", + project: "Projects", + emptySearch: "No item is found for the given search criteria", endSearchResults: "Showing all results", diff --git a/src/modules/search/pages/Search.vue b/src/modules/search/pages/Search.vue index 59e5d63918662f603f3a7a939b1813ac37bab463..e1c64487c82746a3374cf3f42cd5dee623445ccf 100644 --- a/src/modules/search/pages/Search.vue +++ b/src/modules/search/pages/Search.vue @@ -1,59 +1,67 @@ <template> <div class="search"> <CoscineHeadline :headline="$t('page.search.title')" /> + <div class="v_gapped_container"> + <b-row id="mainRow" class="m-0"> + <!-- Sidebar --> + <Sidebar + :results="resultsForTable" + @filter="assignResultsFilter($event)" + /> - <b-row id="mainRow" class="m-0"> - <!-- Sidebar --> - <Sidebar /> - - <b-col ref="rightCol" sm="10" align-self="end" class="h-100"> - <!-- Search Bar Fields --> - <b-row id="searchBarContainer" align-content="center"> - <b-col id="searchField" align-self="start" class="pl-0"> - <b-form-input - v-model="searchText" - :debounce="1000" - :placeholder="$t('page.search.search')" - /> - </b-col> - <b-col id="selectProjCol" sm="2" align-self="center" class="pl-0"> - <b-form-select - v-model="selectedProject" - :options="allProjectsOptions" - @change="queryData(searchText)" - > - <template #first> - <b-form-select-option :value="null"> - {{ $t("page.search.allProjects") }} - </b-form-select-option> - </template> - </b-form-select> - </b-col> - <b-col id="selectResCol" sm="2" align-self="center" class="pl-0"> - <b-form-select - v-model="selectedResource" - :options="projectResourcesOptions" - @change="queryData(searchText)" - > - <template #first> - <b-form-select-option :value="null"> - {{ $t("page.search.allResources") }} - </b-form-select-option> - </template> - </b-form-select> - </b-col> - <b-col sm="0" align-self="center" class="text-right p-0"> - <b-button-group> - <b-button - id="searchButton" - variant="primary" - :disabled="resultsViewLoading" - @click="queryData(searchText)" + <b-col + ref="rightCol" + sm="10" + align-self="stretch" + class="v_gapped_container" + > + <!-- Search Bar Fields --> + <b-row id="searchBarContainer" align-content="center"> + <b-col id="searchField" align-self="start" class="pl-0"> + <b-form-input + v-model="searchText" + :debounce="1000" + :placeholder="$t('page.search.search')" + /> + </b-col> + <b-col id="selectProjCol" sm="2" align-self="center" class="pl-0"> + <b-form-select + v-model="selectedProject" + :options="allProjectsOptions" + @change="queryData(searchText)" + > + <template #first> + <b-form-select-option :value="null"> + {{ $t("page.search.allProjects") }} + </b-form-select-option> + </template> + </b-form-select> + </b-col> + <b-col id="selectResCol" sm="2" align-self="center" class="pl-0"> + <b-form-select + v-model="selectedResource" + :options="projectResourcesOptions" + @change="queryData(searchText)" > - {{ $t("page.search.search") }} - <b-spinner v-if="resultsViewLoading" variant="secondary" /> - </b-button> - <!-- Uncommented until implemented + <template #first> + <b-form-select-option :value="null"> + {{ $t("page.search.allResources") }} + </b-form-select-option> + </template> + </b-form-select> + </b-col> + <b-col sm="0" align-self="center" class="text-right p-0"> + <b-button-group> + <b-button + id="searchButton" + variant="primary" + :disabled="resultsViewLoading" + @click="queryData(searchText)" + > + {{ $t("page.search.search") }} + <b-spinner v-if="resultsViewLoading" variant="secondary" /> + </b-button> + <!-- Uncommented until implemented <b-dropdown id="searchDropdown" right size="sm" variant="primary"> <b-dropdown-item>{{ $t("page.search.buttonSearch.Item1") @@ -63,18 +71,18 @@ }}</b-dropdown-item> </b-dropdown> --> - </b-button-group> - </b-col> - </b-row> + </b-button-group> + </b-col> + </b-row> - <!-- Filter Tags (no function so commented out) --> - <!-- - <b-row - id="filterTagsContainer" - align-self="center" - class="mt-2 mb-2 rounded bg-light" - style="min-height: 37px" - > + <!-- Filter Tags (no function so commented out) --> + <b-row + id="filterTagsContainer" + align-self="center" + class="rounded bg-light" + style="min-height: 37px" + > + <!-- <b-col align-self="center" class="pl-0"> <b-form-tags v-model="filterTags" @@ -103,93 +111,94 @@ <b-icon icon="funnel-fill" /> </b-button> </b-col> - </b-row> - --> - <br /> + --> + </b-row> - <!-- Results View --> - <b-row id="resultsViewContainer" class="flex-grow-1"> - <b-card style="width: 100%"> - <b-skeleton-wrapper :loading="resultsViewLoading"> - <template #loading> - <div - v-for="(entry, index) in 3" - :key="index" - class="p-2 border-top" - style="height: 105px" - > - <b-skeleton width="30%" class="m-2 mb-3" /> - <b-skeleton width="95%" class="m-2" /> - <b-skeleton width="40%" class="m-2" /> - </div> - </template> - <b-table - id="resultsView" - :items="resultsForTable" - :fields="resultsViewFields" - :per-page="paginationPerPage" - :current-page="paginationCurrentPage" - thead-class="d-none" - style="min-height: 100%" - small - hover - sticky-header - show-empty - > - <template #cell(type)="data"> - <MetadataResult - :result="data.item" - :all-projects="allProjects" - /> - </template> - - <template #empty> - <h6 class="text-center"> - {{ $t("page.search.emptySearch") }} - </h6> - </template> - - <template #custom-foot="foot"> - <!-- Show footer if there are results and only on the last page --> + <!-- Results View --> + <b-row id="resultsViewContainer" align-self="end"> + <b-card class="w-100 h-100"> + <b-skeleton-wrapper :loading="resultsViewLoading"> + <template #loading> <div - v-if=" - foot.items.length > 0 && - paginationCurrentPage === - Math.ceil(paginationTotalRows / paginationPerPage) - " - class="p-2 text-center text-muted border-top" + v-for="(entry, index) in 3" + :key="index" + class="p-2 border-top" + style="height: 105px" > - {{ $t("page.search.endSearchResults") }} + <b-skeleton width="30%" class="m-2 mb-3" /> + <b-skeleton width="95%" class="m-2" /> + <b-skeleton width="40%" class="m-2" /> </div> </template> - </b-table> - </b-skeleton-wrapper> - </b-card> - </b-row> - </b-col> - </b-row> + <b-table + id="resultsView" + :items="filteredResults" + :fields="resultsViewFields" + :per-page="paginationPerPage" + :current-page="paginationCurrentPage" + thead-class="d-none" + style="min-height: 100%" + small + hover + sticky-header + show-empty + > + <template #cell(type)="data"> + <MetadataResult + :result="data.item" + :all-projects="allProjects" + :query="searchText" + /> + </template> - <!-- Pagination --> - <b-row class="my-1 text-right" align-v="center" no-gutters> - <b-col align-self="center" class="p-0" /> - <b-col align-self="center" class="p-0"> - <b-pagination - id="pagination" - v-model="paginationCurrentPage" - :total-rows="paginationTotalRows" - :per-page="paginationPerPage" - aria-controls="resultsView" - align="center" - /> - </b-col> - <b-col align-self="center" class="p-0"> - <b-form-select - v-model="paginationPerPage" - :options="paginationPerPageOptions" - style="max-width: 5rem" - /> - </b-col> - </b-row> + <template #empty> + <h6 class="text-center"> + {{ $t("page.search.emptySearch") }} + </h6> + </template> + + <template #custom-foot="foot"> + <!-- Show footer if there are results and only on the last page --> + <div + v-if=" + foot.items.length > 0 && + paginationCurrentPage === + Math.ceil(paginationTotalRows / paginationPerPage) + " + class="p-2 text-center text-muted border-top" + > + {{ $t("page.search.endSearchResults") }} + </div> + </template> + </b-table> + </b-skeleton-wrapper> + </b-card> + </b-row> + </b-col> + </b-row> + + <!-- Pagination --> + <b-row class="text-right" align-v="center" no-gutters> + <b-col align-self="center" class="p-0" /> + <b-col align-self="center" class="p-0"> + <b-pagination + id="pagination" + v-model="paginationCurrentPage" + :total-rows="paginationTotalRows" + :per-page="paginationPerPage" + aria-controls="resultsView" + align="center" + /> + </b-col> + <b-col align-self="center" class="p-0"> + <b-form-select + v-model="paginationPerPage" + :options="paginationPerPageOptions" + style="max-width: 5rem" + /> + </b-col> + </b-row> + </div> </div> </template> @@ -235,6 +244,7 @@ export default defineComponent({ projectSubProjects: [] as ProjectObject[], filterTags: [], + filteredResults: [] as ItemSearchResult[], resultsViewFields: ["type"], resultsViewLoading: true, @@ -284,7 +294,7 @@ export default defineComponent({ }); }, paginationTotalRows(): number { - return this.resultsForTable.length; + return this.filteredResults.length; }, resultsForTable(): ItemSearchResult[] { const result: ItemSearchResult[] = []; @@ -316,12 +326,16 @@ export default defineComponent({ this.retrieveResources(); this.retrieveSubProjects(); }, + resultsForTable() { + this.assignResultsFilter(); + }, }, mounted() { this.searchText = this.getSearchQuery(); this.retrieveResources(); this.retrieveSubProjects(); + this.assignResultsFilter(); }, methods: { @@ -374,6 +388,13 @@ export default defineComponent({ this.projectSubProjects = []; } }, + assignResultsFilter(content: ItemSearchResult[] | null = null) { + if (content) { + this.filteredResults = content; + } else { + this.filteredResults = this.resultsForTable; + } + }, }, }); </script> @@ -381,7 +402,7 @@ export default defineComponent({ <style scoped> #mainRow { /* this style stretches the page vertically to fit the screen: - - container-fluid <-> top = 59px + - pagination row height = 54px - mainRow <-> container-fluid = 102px - mainRow <-> bottom = 62px */ @@ -394,8 +415,11 @@ export default defineComponent({ #resultsViewContainer { /* this style stretches the results table vertically - resultsViewContainer <-> mainRow = 91px + - first row = 38px + - second row = 37px + - gap = 2*0.5rem */ - height: calc(100% - 91px); + height: calc(100% - 38px - 37px - 2 * 0.5rem); } .card-body { padding: 0rem; diff --git a/src/modules/search/pages/components/MetadataResult.vue b/src/modules/search/pages/components/MetadataResult.vue index 553ed75a83ff5cc05134cf38f789da234d9509c7..63a2df2f1e95802322020fce510f76a27cd8d9be 100644 --- a/src/modules/search/pages/components/MetadataResult.vue +++ b/src/modules/search/pages/components/MetadataResult.vue @@ -11,7 +11,14 @@ }: ` }} </b> - {{ displayName }} + <!-- eslint-disable vue/no-v-html --> + <span + v-html=" + $options.filters + ? $options.filters.highlight(displayName, query) + : null + " + /> <b-badge v-if="archived" pill variant="warning" class="ml-1"> {{ $t("default.archived") }} </b-badge> @@ -37,24 +44,57 @@ </span> <span v-else-if="index === 'belongsToProject'"> <b>{{ `${$t(`results.labels.${index}`)}: ` }}</b> - {{ belongsToProject(element) }} + <!-- eslint-disable vue/no-v-html --> + <span + v-html=" + $options.filters + ? $options.filters.highlight(belongsToProject(element), query) + : null + " + /> </span> <span v-else-if="index === 'homepage'"> <b>{{ `${$t(`results.labels.pid`)}: ` }}</b> - <a :href="element">{{ - element.substring(element.indexOf(".net/") + 5) - }}</a> + <a :href="element"> + <!-- eslint-disable vue/no-v-html --> + <span + v-html=" + $options.filters + ? $options.filters.highlight(substringPID(element), query) + : null + " + /> + </a> </span> <span v-else-if="index === 'service' && resourceType"> <b>{{ `${$t(`results.labels.resourceType`)}: ` }}</b> - {{ $t("resourceTypes." + resourceType.displayName + ".displayName") }} + <!-- eslint-disable vue/no-v-html --> + <span + v-html=" + $options.filters + ? $options.filters.highlight( + resourceType.displayName + ? resourceTypeName(resourceType.displayName) + : null, + query + ) + : null + " + /> </span> <span v-else-if="index !== 'structureType' && index !== 'deleted'"> - <b v-if="$te(`results.labels.${index}`)">{{ - `${$t(`results.labels.${index}`)}: ` - }}</b> + <b v-if="$te(`results.labels.${index}`)"> + {{ `${$t(`results.labels.${index}`)}: ` }} + </b> <b v-else>{{ `${formatKey(index)}: ` }}</b> - {{ element }} + <!-- eslint-disable vue/no-v-html --> + <span + v-html=" + $options.filters + ? $options.filters.highlight(element, query) + : null + " + /> </span> <!-- Keep the <br/> element at the end to have @@ -77,6 +117,14 @@ import type { ProjectObject } from "@coscine/api-client/dist/types/Coscine.Api.P import type { ResourceTypeObject } from "@coscine/api-client/dist/types/Coscine.Api.Resources"; export default defineComponent({ + filters: { + highlight(words: string, query: string) { + const iQuery = new RegExp(query, "ig"); + return words.toString().replace(iQuery, function (matchedTxt) { + return "<mark>" + matchedTxt + "</mark>"; + }); + }, + }, props: { result: { required: true, @@ -86,6 +134,10 @@ export default defineComponent({ required: true, type: Array as PropType<ProjectObject[] | null>, }, + query: { + required: true, + type: String, + }, }, setup() { const resourceStore = useResourceStore(); @@ -253,6 +305,12 @@ export default defineComponent({ return project.displayName; } else return value; }, + substringPID(value: string): string { + return value.substring(value.indexOf(".net/") + 5); + }, + resourceTypeName(value: string | null): string { + return this.$t("resourceTypes." + value + ".displayName").toString(); + }, formatKey(key: string) { const words = key.replace("_", " ").replace("_", " ").split(" "); for (let i = 0; i < words.length; i++) { diff --git a/src/modules/search/pages/components/Sidebar.vue b/src/modules/search/pages/components/Sidebar.vue index 9c2de08a564d1e99f8a8070a7f69ecc1bffd2bad..95c95fd70ae96b2a488d7e68dde5d3cc3b8ad179 100644 --- a/src/modules/search/pages/components/Sidebar.vue +++ b/src/modules/search/pages/components/Sidebar.vue @@ -1,30 +1,112 @@ <template> <b-col class="pl-0"> - <b-card - id="sidebarContainer" - class="progress-bar-striped text-center bg-light" - style="height: 100%" - > - <!-- Sidebar components come here --> + <b-card id="sidebarContainer"> + <b-list-group> + <b-list-group-item + v-for="(entry, key) in resultTypes" + :key="key" + button + :active="entry.item === selectedFilter" + @click="assignResultsFilter(entry.item)" + > + <b-row align-v="center" no-gutters> + <b-col> + <span> + {{ $t(`page.search.${entry.item.toLowerCase()}`) }} + </span> + </b-col> + <b-col md="auto"> + <b-badge + class="float-right" + :variant="entry.item === selectedFilter ? 'light' : 'primary'" + > + {{ entry.count }} + </b-badge> + </b-col> + </b-row> + </b-list-group-item> + </b-list-group> </b-card> </b-col> </template> <script lang="ts"> -import { defineComponent } from "vue"; +import { defineComponent, type PropType } from "vue"; // import the store for current module import useSearchStore from "../../store"; // import the main store import useMainStore from "@/store/index"; +import type { ItemSearchResult } from "@coscine/api-client/dist/types/Coscine.Api.Search"; export default defineComponent({ + props: { + results: { + type: Array as PropType<ItemSearchResult[]>, + required: true, + }, + }, + + emits: { + filter: (_: ItemSearchResult[]) => true, + }, setup() { const mainStore = useMainStore(); const searchStore = useSearchStore(); return { mainStore, searchStore }; }, + + data() { + return { + filterStringAll: "All", // Don't overwrite + filteredResults: [] as ItemSearchResult[], + selectedFilter: null as string | null, + }; + }, + + computed: { + resultTypes(): { item: string; count: number }[] { + const types = [] as { item: string; count: number }[]; + if (this.results) { + types.push({ item: this.filterStringAll, count: this.results.length }); + + const foundTypes = this.results + .flatMap((n) => n.type) + .filter((v, i, a) => a.indexOf(v) === i) as string[]; + if (foundTypes) { + foundTypes.forEach((t) => { + types.push({ + item: t, + count: this.results.filter((n) => n.type === t).length, + }); + }); + } + } + return types; + }, + }, + + watch: { + results() { + this.assignResultsFilter(); + }, + filteredResults() { + this.$emit("filter", this.filteredResults); + }, + }, + + methods: { + assignResultsFilter(type: string | null = null) { + if (type && type !== this.filterStringAll) { + this.selectedFilter = type; + this.filteredResults = this.results.filter((e) => e.type === type); + } else { + this.selectedFilter = this.filterStringAll; + this.filteredResults = this.results; + } + }, + }, }); </script> diff --git a/src/modules/user/pages/UserProfile.spec.ts b/src/modules/user/pages/UserProfile.spec.ts new file mode 100644 index 0000000000000000000000000000000000000000..c336058660d4c133d769a3c47bc57f842b5c6c02 --- /dev/null +++ b/src/modules/user/pages/UserProfile.spec.ts @@ -0,0 +1,174 @@ +/* Testing imports */ +import { createLocalVue, mount } from "@vue/test-utils"; +import { createTestingPinia } from "@pinia/testing"; + +/* Vue i18n */ +import i18n, { def } from "@/plugins/vue-i18n"; +import { UserI18nMessages } from "@/modules/user/i18n/index"; +i18n.availableLocales.forEach((locale) => { + i18n.setLocaleMessage(locale, def[locale]); // default locale messages + i18n.mergeLocaleMessage(locale, UserI18nMessages[locale]); // append the locale messages for the component +}); + +/* Pinia */ +import { PiniaVuePlugin } from "pinia"; + +/* Vue Multiselect */ +import Multiselect from "@/plugins/deprecated/Multiselect.vue"; + +/* Tested Component */ +import UserProfile from "./UserProfile.vue"; +import { type UserState } from "../types"; +import useUserStore from "../store"; + +/* Create a local Vue instance */ +const localVue = createLocalVue(); +localVue.use(PiniaVuePlugin); + +describe("UserProfile.vue", () => { + localVue.component("Multiselect", Multiselect); + const testOrganization = { displayName: "TestOrg", url: "example.com" }; + const testInstitute = { + displayName: "TestInstitute", + url: "example.com#institute", + }; + const testDiscipline = { + id: "1", + displayNameDe: "Test", + displayNameEn: "Test", + url: "example.com", + }; + const testLanguage = { id: "1", displayName: "en" }; + + /* Checks for correct button validation for external users */ + test("externalUser", async () => { + const wrapper = mount(UserProfile, { + global: { + plugins: [ + createTestingPinia({ + createSpy: vitest.fn, + initialState: { + user: { + userProfile: { + contactChange: null, + disciplines: [testDiscipline], + languages: [testLanguage], + userMemberships: null, + organizations: [testOrganization, testInstitute], + titles: [ + { + id: "1", + displayName: "Prof.", + }, + { + id: "2", + displayName: "Dr.", + }, + ], + tokens: null, + }, + user: { + surname: "Max", + givenname: "Mustermann", + emailAddress: "example@example.com", + disciplines: [testDiscipline], + language: testLanguage, + }, + tokenValidityBounds: null, + } as UserState, + }, + }), + ], + }, + i18n, + localVue, + }); + + expect(wrapper.get("#saveBtn").attributes()["disabled"]).toBe("disabled"); + + /* Organization */ + const element = wrapper.findComponent({ + ref: "organization", + }); + expect(element.exists()).toBe(true); + (element.vm as unknown as typeof Multiselect).select( + testOrganization.displayName + ); + expect(wrapper.vm.$data.form.organization).toBe( + testOrganization.displayName + ); + + expect(wrapper.get("#saveBtn").attributes()["disabled"]).toBe("disabled"); + + /* Institute */ + await wrapper.get("#institute").setValue("Test Institute"); + expect(wrapper.vm.$data.form.institute).toBe("Test Institute"); + + /* Active Save Button since every condition is fulfilled */ + expect(wrapper.get("#saveBtn").attributes()["disabled"]).not.toBe( + "disabled" + ); + }); + + /* Checks for correct button validation for internal users */ + test("internalUser", async () => { + const wrapper = mount(UserProfile, { + global: { + plugins: [ + createTestingPinia({ + createSpy: vitest.fn, + initialState: { + user: { + userProfile: { + contactChange: null, + disciplines: [testDiscipline], + languages: [testLanguage], + userMemberships: [testOrganization, testInstitute], + organizations: [testOrganization, testInstitute], + titles: [ + { + id: "1", + displayName: "Prof.", + }, + { + id: "2", + displayName: "Dr.", + }, + ], + tokens: null, + }, + user: { + surname: "Max", + givenname: "Mustermann", + emailAddress: "example@example.com", + disciplines: [testDiscipline], + language: testLanguage, + }, + tokenValidityBounds: null, + } as UserState, + }, + }), + ], + }, + i18n, + localVue, + }); + + /* Save button disabled, since nothing has changed */ + expect(wrapper.get("#saveBtn").attributes()["disabled"]).toBe("disabled"); + + /* Email */ + const userStore = useUserStore(); + expect(userStore.user?.emailAddress).toBe("example@example.com"); + expect(wrapper.vm.$data.form.emailAddress).toBe("example@example.com"); + await wrapper.get("#Email").setValue("servicedesk@itc.rwth-aachen.de"); + expect(wrapper.vm.$data.form.emailAddress).toBe( + "servicedesk@itc.rwth-aachen.de" + ); + + /* Active Save Button since every condition is fulfilled */ + expect(wrapper.get("#saveBtn").attributes()["disabled"]).not.toBe( + "disabled" + ); + }); +}); diff --git a/src/modules/user/pages/UserProfile.vue b/src/modules/user/pages/UserProfile.vue index c089461092d1dd7777a781a45d48e513d4881f99..04eff8dd9c1db49e91fc24b8cb102dc8aeaa1f7d 100644 --- a/src/modules/user/pages/UserProfile.vue +++ b/src/modules/user/pages/UserProfile.vue @@ -18,6 +18,7 @@ > <multiselect id="title" + ref="title" v-model="v$.form.title.$model" :options="titles" :multiple="false" @@ -131,6 +132,7 @@ <multiselect v-if="externalUser" id="organization" + ref="organization" v-model="v$.form.organization.$model" :options="ror" :multiple="false" @@ -156,6 +158,7 @@ <multiselect v-else id="organization" + ref="organization" v-model="organizations" :options="organizations" :multiple="true" @@ -195,6 +198,7 @@ <multiselect v-else id="institute" + ref="institute" v-model="institutes" :options="institutes" :multiple="true" @@ -219,6 +223,7 @@ > <multiselect id="Discipline" + ref="Discipline" v-model="v$.form.disciplines.$model" :options="disciplines" :multiple="true" @@ -329,6 +334,7 @@ <!-- Save Button --> <CoscineFormGroup> <b-button + id="saveBtn" ref="saveBtn" type="submit" variant="primary" @@ -364,7 +370,7 @@ import type { TitleObject, UserObject, } from "@coscine/api-client/dist/types/Coscine.Api.User"; -import type { OrganizationObject } from "@coscine/api-client/dist/types/Coscine.Api.Project"; +import type { OrganizationObject } from "@coscine/api-client/dist/types/Coscine.Api.Organization"; export default defineComponent({ components: { AccessToken }, @@ -400,8 +406,10 @@ export default defineComponent({ contactChange(): null | ContactChangeObject[] { return this.userStore.userProfile.contactChange; }, - disciplines(): null | DisciplineObject[] { - return this.userStore.userProfile.disciplines; + disciplines(): DisciplineObject[] { + return this.userStore.userProfile.disciplines + ? this.userStore.userProfile.disciplines + : []; }, emailHint(): string { if (!this.form.emailAddress) { @@ -457,13 +465,15 @@ export default defineComponent({ } return []; }, - ror(): null | string[] { + ror(): string[] { const organizations = this.userStore.userProfile.organizations; if (organizations) { return organizations .map((org) => (org.displayName ? org.displayName : "")) // Extract organization display name, could contain empty strings .filter((n) => n); // Filter out empty strings, if any - } else return null; + } else { + return []; + } }, shibbolethConnected(): boolean { if (this.user.externalAuthenticators) { @@ -475,8 +485,10 @@ export default defineComponent({ } return false; }, - titles(): null | TitleObject[] { - return this.userStore.userProfile.titles; + titles(): TitleObject[] { + return this.userStore.userProfile.titles + ? this.userStore.userProfile.titles + : []; }, user(): UserObject { return this.userStore.user ? this.userStore.user : {}; diff --git a/src/modules/user/store.ts b/src/modules/user/store.ts index 7435c89b5d114daba1aa52e7ae0c214c8d726e89..eef7e8371d17f2a35ea07a05264327b1d70279f2 100644 --- a/src/modules/user/store.ts +++ b/src/modules/user/store.ts @@ -56,7 +56,19 @@ export const useUserStore = defineStore({ In a component use as e.g.: :label = "this.userStore.<getter_name>; */ - getters: {}, + getters: { + contactEmail(): string { + if (this.userProfile.userMemberships) { + const emails = this.userProfile.userMemberships.filter( + (userMembership) => (userMembership.email ? true : false) + ); + if (emails.length > 0 && emails[0].email) { + return emails[0].email; + } + } + return "servicedesk@itc.rwth-aachen.de"; + }, + }, /* -------------------------------------------------------------------------------------- ACTIONS @@ -147,7 +159,8 @@ export const useUserStore = defineStore({ const notificationStore = useNotificationStore(); try { const apiResponse = await OrganizationApi.organizationIsMember2(); - this.userProfile.userMemberships = apiResponse.data.data; + this.userProfile.userMemberships = + apiResponse.data.data !== undefined ? apiResponse.data.data : null; } catch (error) { // Handle other Status Codes notificationStore.postApiErrorNotification(error as AxiosError); @@ -158,7 +171,8 @@ export const useUserStore = defineStore({ const notificationStore = useNotificationStore(); try { const apiResponse = await OrganizationApi.organizationGetROR(filter); - this.userProfile.organizations = apiResponse.data.data; + this.userProfile.organizations = + apiResponse.data.data !== undefined ? apiResponse.data.data : null; } catch (error) { // Handle other Status Codes notificationStore.postApiErrorNotification(error as AxiosError); diff --git a/src/modules/user/types.ts b/src/modules/user/types.ts index 9111238c9da5b659475a76728988d7d547800f76..8dfcc56de32aadc8c09dac8cb24782b1dc84f44a 100644 --- a/src/modules/user/types.ts +++ b/src/modules/user/types.ts @@ -5,7 +5,7 @@ import type { TitleObject, UserObject, } from "@coscine/api-client/dist/types/Coscine.Api.User"; -import type { OrganizationObject } from "@coscine/api-client/dist/types/Coscine.Api.Project"; +import type { OrganizationObject } from "@coscine/api-client/dist/types/Coscine.Api.Organization"; import type { ApiTokenObject, TokenValidityObject, diff --git a/src/plugins/deprecated/Multiselect.vue b/src/plugins/deprecated/Multiselect.vue new file mode 100644 index 0000000000000000000000000000000000000000..cfb1522e23b3f2c7cecdf3f6ed98c3f0c85c7159 --- /dev/null +++ b/src/plugins/deprecated/Multiselect.vue @@ -0,0 +1,836 @@ +<template> + <div + :tabindex="searchable ? -1 : tabindex" + :class="{ + 'multiselect--active': isOpen, + 'multiselect--disabled': disabled, + 'multiselect--above': isAbove, + }" + class="multiselect" + role="combobox" + :aria-owns="'listbox-' + id" + @focus="activate()" + @blur="searchable ? false : deactivate()" + @keydown.self.down.prevent="pointerForward()" + @keydown.self.up.prevent="pointerBackward()" + @keypress.enter.tab.stop.self="addPointerElement($event)" + @keyup.esc="deactivate()" + > + <slot name="caret" :toggle="toggle"> + <div class="multiselect__select" @mousedown.prevent.stop="toggle()"></div> + </slot> + <slot name="clear" :search="search"></slot> + <div ref="tags" class="multiselect__tags"> + <slot + name="selection" + :search="search" + :remove="removeElement" + :values="visibleValues" + :is-open="isOpen" + > + <div v-show="visibleValues.length > 0" class="multiselect__tags-wrap"> + <template v-for="(option, index) of visibleValues" @mousedown.prevent> + <slot + name="tag" + :option="option" + :search="search" + :remove="removeElement" + > + <span :key="index" class="multiselect__tag"> + <span v-text="getOptionLabel(option)"></span> + <i + tabindex="1" + class="multiselect__tag-icon" + @keypress.enter.prevent="removeElement(option)" + @mousedown.prevent="removeElement(option)" + ></i> + </span> + </slot> + </template> + </div> + <template v-if="internalValue && internalValue.length > limit"> + <slot name="limit"> + <strong + class="multiselect__strong" + v-text="limitText(internalValue.length - limit)" + /> + </slot> + </template> + </slot> + <transition name="multiselect__loading"> + <slot name="loading"> + <div v-show="loading" class="multiselect__spinner" /> + </slot> + </transition> + <input + v-if="searchable" + :id="id" + ref="search" + :name="name" + type="text" + autocomplete="off" + spellcheck="false" + :placeholder="placeholder" + :style="inputStyle" + :value="search" + :disabled="disabled" + :tabindex="tabindex" + class="multiselect__input" + :aria-controls="'listbox-' + id" + @input="updateSearch($event.target.value)" + @focus.prevent="activate()" + @blur.prevent="deactivate()" + @keyup.esc="deactivate()" + @keydown.down.prevent="pointerForward()" + @keydown.up.prevent="pointerBackward()" + @keypress.enter.prevent.stop.self="addPointerElement($event)" + @keydown.delete.stop="removeLastElement()" + /> + <span + v-if="isSingleLabelVisible" + class="multiselect__single" + @mousedown.prevent="toggle" + > + <slot name="singleLabel" :option="singleValue"> + <template>{{ currentOptionLabel }}</template> + </slot> + </span> + <span + v-if="isPlaceholderVisible" + class="multiselect__placeholder" + @mousedown.prevent="toggle" + > + <slot name="placeholder"> + {{ placeholder }} + </slot> + </span> + </div> + <transition name="multiselect"> + <div + v-show="isOpen" + ref="list" + class="multiselect__content-wrapper" + tabindex="-1" + :style="{ maxHeight: optimizedHeight + 'px' }" + @focus="activate" + @mousedown.prevent + > + <ul + :id="'listbox-' + id" + class="multiselect__content" + :style="contentStyle" + role="listbox" + > + <slot name="beforeList"></slot> + <li v-if="multiple && max === internalValue.length"> + <span class="multiselect__option"> + <slot name="maxElements" + >Maximum of {{ max }} options selected. First remove a selected + option to select another.</slot + > + </span> + </li> + <template v-if="!max || internalValue.length < max"> + <li + v-for="(option, index) of filteredOptions" + :id="id + '-' + index" + :key="index" + class="multiselect__element" + :role=" + !(option && (option.$isLabel || option.$isDisabled)) + ? 'option' + : null + " + > + <span + v-if="!(option && (option.$isLabel || option.$isDisabled))" + :class="optionHighlight(index, option)" + :data-select=" + option && option.isTag ? tagPlaceholder : selectLabelText + " + :data-selected="selectedLabelText" + :data-deselect="deselectLabelText" + class="multiselect__option" + @click.stop="select(option)" + @mouseenter.self="pointerSet(index)" + > + <slot + name="option" + :option="option" + :search="search" + :index="index" + > + <span>{{ getOptionLabel(option) }}</span> + </slot> + </span> + <span + v-if="option && (option.$isLabel || option.$isDisabled)" + :data-select="groupSelect && selectGroupLabelText" + :data-deselect="groupSelect && deselectGroupLabelText" + :class="groupHighlight(index, option)" + class="multiselect__option" + @mouseenter.self="groupSelect && pointerSet(index)" + @mousedown.prevent="selectGroup(option)" + > + <slot + name="option" + :option="option" + :search="search" + :index="index" + > + <span>{{ getOptionLabel(option) }}</span> + </slot> + </span> + </li> + </template> + <li + v-show=" + showNoResults && + filteredOptions.length === 0 && + search && + !loading + " + > + <span class="multiselect__option"> + <slot name="noResult" :search="search" + >No elements found. Consider changing the search query.</slot + > + </span> + </li> + <li + v-show=" + showNoOptions && options.length === 0 && !search && !loading + " + > + <span class="multiselect__option"> + <slot name="noOptions">List is empty.</slot> + </span> + </li> + <slot name="afterList"></slot> + </ul> + </div> + </transition> + </div> +</template> + +<script lang="ts"> +// @ts-nocheck +import { defineComponent } from "vue"; + +import multiselectMixin from "./multiselectMixin"; +import pointerMixin from "./pointerMixin"; +export default defineComponent({ + name: "VueMultiselect", + mixins: [multiselectMixin, pointerMixin], + props: { + /** + * name attribute to match optional label element + * @default '' + * @type {String} + */ + name: { + type: String, + default: "", + }, + /** + * String to show when pointing to an option + * @default 'Press enter to select' + * @type {String} + */ + selectLabel: { + type: String, + default: "Press enter to select", + }, + /** + * String to show when pointing to an option + * @default 'Press enter to select' + * @type {String} + */ + selectGroupLabel: { + type: String, + default: "Press enter to select group", + }, + /** + * String to show next to selected option + * @default 'Selected' + * @type {String} + */ + selectedLabel: { + type: String, + default: "Selected", + }, + /** + * String to show when pointing to an already selected option + * @default 'Press enter to remove' + * @type {String} + */ + deselectLabel: { + type: String, + default: "Press enter to remove", + }, + /** + * String to show when pointing to an already selected option + * @default 'Press enter to remove' + * @type {String} + */ + deselectGroupLabel: { + type: String, + default: "Press enter to deselect group", + }, + /** + * Decide whether to show pointer labels + * @default true + * @type {Boolean} + */ + showLabels: { + type: Boolean, + default: true, + }, + /** + * Limit the display of selected options. The rest will be hidden within the limitText string. + * @default 99999 + * @type {Integer} + */ + limit: { + type: Number, + default: 99999, + }, + /** + * Sets maxHeight style value of the dropdown + * @default 300 + * @type {Integer} + */ + maxHeight: { + type: Number, + default: 300, + }, + /** + * Function that process the message shown when selected + * elements pass the defined limit. + * @default 'and * more' + * @param {Int} count Number of elements more than limit + * @type {Function} + */ + limitText: { + type: Function, + default: (count) => `and ${count} more`, + }, + /** + * Set true to trigger the loading spinner. + * @default False + * @type {Boolean} + */ + loading: { + type: Boolean, + default: false, + }, + /** + * Disables the multiselect if true. + * @default false + * @type {Boolean} + */ + disabled: { + type: Boolean, + default: false, + }, + /** + * Fixed opening direction + * @default '' + * @type {String} + */ + openDirection: { + type: String, + default: "", + }, + /** + * Shows slot with message about empty options + * @default true + * @type {Boolean} + */ + showNoOptions: { + type: Boolean, + default: true, + }, + showNoResults: { + type: Boolean, + default: true, + }, + tabindex: { + type: Number, + default: 0, + }, + }, + computed: { + isSingleLabelVisible() { + return ( + (this.singleValue || this.singleValue === 0) && + (!this.isOpen || !this.searchable) && + !this.visibleValues.length + ); + }, + isPlaceholderVisible() { + return !this.internalValue.length && (!this.searchable || !this.isOpen); + }, + visibleValues() { + return this.multiple ? this.internalValue.slice(0, this.limit) : []; + }, + singleValue() { + return this.internalValue[0]; + }, + deselectLabelText() { + return this.showLabels ? this.deselectLabel : ""; + }, + deselectGroupLabelText() { + return this.showLabels ? this.deselectGroupLabel : ""; + }, + selectLabelText() { + return this.showLabels ? this.selectLabel : ""; + }, + selectGroupLabelText() { + return this.showLabels ? this.selectGroupLabel : ""; + }, + selectedLabelText() { + return this.showLabels ? this.selectedLabel : ""; + }, + inputStyle() { + if ( + this.searchable || + (this.multiple && this.value && this.value.length) + ) { + // Hide input by setting the width to 0 allowing it to receive focus + return this.isOpen + ? { width: "100%" } + : { width: "0", position: "absolute", padding: "0" }; + } + return ""; + }, + contentStyle() { + return this.options.length + ? { display: "inline-block" } + : { display: "block" }; + }, + isAbove() { + if (this.openDirection === "above" || this.openDirection === "top") { + return true; + } else if ( + this.openDirection === "below" || + this.openDirection === "bottom" + ) { + return false; + } else { + return this.preferredOpenDirection === "above"; + } + }, + showSearchInput() { + return ( + this.searchable && + (this.hasSingleSelectedSlot && + (this.visibleSingleValue || this.visibleSingleValue === 0) + ? this.isOpen + : true) + ); + }, + }, +}); +</script> + +<style> +fieldset[disabled] .multiselect { + pointer-events: none; +} +.multiselect__spinner { + position: absolute; + right: 1px; + top: 1px; + width: 48px; + height: 35px; + background: #fff; + display: block; +} +.multiselect__spinner:before, +.multiselect__spinner:after { + position: absolute; + content: ""; + top: 50%; + left: 50%; + margin: -8px 0 0 -8px; + width: 16px; + height: 16px; + border-radius: 100%; + border-color: #41b883 transparent transparent; + border-style: solid; + border-width: 2px; + box-shadow: 0 0 0 1px transparent; +} +.multiselect__spinner:before { + animation: spinning 2.4s cubic-bezier(0.41, 0.26, 0.2, 0.62); + animation-iteration-count: infinite; +} +.multiselect__spinner:after { + animation: spinning 2.4s cubic-bezier(0.51, 0.09, 0.21, 0.8); + animation-iteration-count: infinite; +} +.multiselect__loading-enter-active, +.multiselect__loading-leave-active { + transition: opacity 0.4s ease-in-out; + opacity: 1; +} +.multiselect__loading-enter, +.multiselect__loading-leave-active { + opacity: 0; +} +.multiselect, +.multiselect__input, +.multiselect__single { + font-family: inherit; + font-size: 16px; + touch-action: manipulation; +} +.multiselect { + box-sizing: content-box; + display: block; + position: relative; + width: 100%; + min-height: 40px; + text-align: left; + color: #35495e; +} +.multiselect * { + box-sizing: border-box; +} +.multiselect:focus { + outline: none; +} +.multiselect--disabled { + background: #ededed; + pointer-events: none; + opacity: 0.6; +} +.multiselect--active { + z-index: 50; +} +.multiselect--active:not(.multiselect--above) .multiselect__current, +.multiselect--active:not(.multiselect--above) .multiselect__input, +.multiselect--active:not(.multiselect--above) .multiselect__tags { + border-bottom-left-radius: 0; + border-bottom-right-radius: 0; +} +.multiselect--active .multiselect__select { + transform: rotateZ(180deg); +} +.multiselect--above.multiselect--active .multiselect__current, +.multiselect--above.multiselect--active .multiselect__input, +.multiselect--above.multiselect--active .multiselect__tags { + border-top-left-radius: 0; + border-top-right-radius: 0; +} +.multiselect__input, +.multiselect__single { + position: relative; + display: inline-block; + min-height: 20px; + line-height: 20px; + border: none; + border-radius: 5px; + background: #fff; + padding: 0 0 0 5px; + width: calc(100%); + transition: border 0.1s ease; + box-sizing: border-box; + margin-bottom: 8px; + vertical-align: top; +} +.multiselect__input::placeholder { + color: #35495e; +} +.multiselect__tag ~ .multiselect__input, +.multiselect__tag ~ .multiselect__single { + width: auto; +} +.multiselect__input:hover, +.multiselect__single:hover { + border-color: #cfcfcf; +} +.multiselect__input:focus, +.multiselect__single:focus { + border-color: #a8a8a8; + outline: none; +} +.multiselect__single { + padding-left: 5px; + margin-bottom: 8px; +} +.multiselect__tags-wrap { + display: inline; +} +.multiselect__tags { + min-height: 40px; + display: block; + padding: 8px 40px 0 8px; + border-radius: 5px; + border: 1px solid #e8e8e8; + background: #fff; + font-size: 14px; +} +.multiselect__tag { + position: relative; + display: inline-block; + padding: 4px 26px 4px 10px; + border-radius: 5px; + margin-right: 10px; + color: #fff; + line-height: 1; + background: #41b883; + margin-bottom: 5px; + white-space: nowrap; + overflow: hidden; + max-width: 100%; + text-overflow: ellipsis; +} +.multiselect__tag-icon { + cursor: pointer; + margin-left: 7px; + position: absolute; + right: 0; + top: 0; + bottom: 0; + font-weight: 700; + font-style: initial; + width: 22px; + text-align: center; + line-height: 22px; + transition: all 0.2s ease; + border-radius: 5px; +} +.multiselect__tag-icon:after { + content: "×"; + color: #266d4d; + font-size: 14px; +} +.multiselect__tag-icon:focus, +.multiselect__tag-icon:hover { + background: #369a6e; +} +.multiselect__tag-icon:focus:after, +.multiselect__tag-icon:hover:after { + color: white; +} +.multiselect__current { + line-height: 16px; + min-height: 40px; + box-sizing: border-box; + display: block; + overflow: hidden; + padding: 8px 12px 0; + padding-right: 30px; + white-space: nowrap; + margin: 0; + text-decoration: none; + border-radius: 5px; + border: 1px solid #e8e8e8; + cursor: pointer; +} +.multiselect__select { + line-height: 16px; + display: block; + position: absolute; + box-sizing: border-box; + width: 40px; + height: 38px; + right: 1px; + top: 1px; + padding: 4px 8px; + margin: 0; + text-decoration: none; + text-align: center; + cursor: pointer; + transition: transform 0.2s ease; +} +.multiselect__select:before { + position: relative; + right: 0; + top: 65%; + color: #999; + margin-top: 4px; + border-style: solid; + border-width: 5px 5px 0 5px; + border-color: #999999 transparent transparent transparent; + content: ""; +} +.multiselect__placeholder { + color: #adadad; + display: inline-block; + margin-bottom: 10px; + padding-top: 2px; +} +.multiselect--active .multiselect__placeholder { + display: none; +} +.multiselect__content-wrapper { + position: absolute; + display: block; + background: #fff; + width: 100%; + max-height: 240px; + overflow: auto; + border: 1px solid #e8e8e8; + border-top: none; + border-bottom-left-radius: 5px; + border-bottom-right-radius: 5px; + z-index: 50; + -webkit-overflow-scrolling: touch; +} +.multiselect__content { + list-style: none; + display: inline-block; + padding: 0; + margin: 0; + min-width: 100%; + vertical-align: top; +} +.multiselect--above .multiselect__content-wrapper { + bottom: 100%; + border-bottom-left-radius: 0; + border-bottom-right-radius: 0; + border-top-left-radius: 5px; + border-top-right-radius: 5px; + border-bottom: none; + border-top: 1px solid #e8e8e8; +} +.multiselect__content::webkit-scrollbar { + display: none; +} +.multiselect__element { + display: block; +} +.multiselect__option { + display: block; + padding: 12px; + min-height: 40px; + line-height: 16px; + text-decoration: none; + text-transform: none; + vertical-align: middle; + position: relative; + cursor: pointer; + white-space: nowrap; +} +.multiselect__option:after { + top: 0; + right: 0; + position: absolute; + line-height: 40px; + padding-right: 12px; + padding-left: 20px; + font-size: 13px; +} +.multiselect__option--highlight { + background: #41b883; + outline: none; + color: white; +} +.multiselect__option--highlight:after { + content: attr(data-select); + background: #41b883; + color: white; +} +.multiselect__option--selected { + background: #f3f3f3; + color: #35495e; + font-weight: bold; +} +.multiselect__option--selected:after { + content: attr(data-selected); + color: silver; +} +.multiselect__option--selected.multiselect__option--highlight { + background: #ff6a6a; + color: #fff; +} +.multiselect__option--selected.multiselect__option--highlight:after { + background: #ff6a6a; + content: attr(data-deselect); + color: #fff; +} +.multiselect--disabled .multiselect__current, +.multiselect--disabled .multiselect__select { + background: #ededed; + color: #a6a6a6; +} +.multiselect__option--disabled { + background: #ededed !important; + color: #a6a6a6 !important; + cursor: text; + pointer-events: none; +} +.multiselect__option--group { + background: #ededed; + color: #35495e; +} +.multiselect__option--group.multiselect__option--highlight { + background: #35495e; + color: #fff; +} +.multiselect__option--group.multiselect__option--highlight:after { + background: #35495e; +} +.multiselect__option--disabled.multiselect__option--highlight { + background: #dedede; +} +.multiselect__option--group-selected.multiselect__option--highlight { + background: #ff6a6a; + color: #fff; +} +.multiselect__option--group-selected.multiselect__option--highlight:after { + background: #ff6a6a; + content: attr(data-deselect); + color: #fff; +} +.multiselect-enter-active, +.multiselect-leave-active { + transition: all 0.15s ease; +} +.multiselect-enter, +.multiselect-leave-active { + opacity: 0; +} +.multiselect__strong { + margin-bottom: 8px; + line-height: 20px; + display: inline-block; + vertical-align: top; +} +*[dir="rtl"] .multiselect { + text-align: right; +} +*[dir="rtl"] .multiselect__select { + right: auto; + left: 1px; +} +*[dir="rtl"] .multiselect__tags { + padding: 8px 8px 0px 40px; +} +*[dir="rtl"] .multiselect__content { + text-align: right; +} +*[dir="rtl"] .multiselect__option:after { + right: auto; + left: 0; +} +*[dir="rtl"] .multiselect__clear { + right: auto; + left: 12px; +} +*[dir="rtl"] .multiselect__spinner { + right: auto; + left: 1px; +} +@keyframes spinning { + from { + transform: rotate(0); + } + to { + transform: rotate(2turn); + } +} +</style> diff --git a/src/plugins/deprecated/multiselectMixin.js b/src/plugins/deprecated/multiselectMixin.js new file mode 100644 index 0000000000000000000000000000000000000000..eda3dd56e1151a8ee74cebc541ca7c751401abae --- /dev/null +++ b/src/plugins/deprecated/multiselectMixin.js @@ -0,0 +1,716 @@ +function isEmpty (opt) { + if (opt === 0) return false + if (Array.isArray(opt) && opt.length === 0) return true + return !opt + } + + function not (fun) { + return (...params) => !fun(...params) + } + + function includes (str, query) { + /* istanbul ignore else */ + if (str === undefined) str = 'undefined' + if (str === null) str = 'null' + if (str === false) str = 'false' + const text = str.toString().toLowerCase() + return text.indexOf(query.trim()) !== -1 + } + + function filterOptions (options, search, label, customLabel) { + return options.filter(option => includes(customLabel(option, label), search)) + } + + function stripGroups (options) { + return options.filter(option => !option.$isLabel) + } + + function flattenOptions (values, label) { + return (options) => + options.reduce((prev, curr) => { + /* istanbul ignore else */ + if (curr[values] && curr[values].length) { + prev.push({ + $groupLabel: curr[label], + $isLabel: true + }) + return prev.concat(curr[values]) + } + return prev + }, []) + } + + function filterGroups (search, label, values, groupLabel, customLabel) { + return (groups) => + groups.map(group => { + /* istanbul ignore else */ + if (!group[values]) { + console.warn(`Options passed to vue-multiselect do not contain groups, despite the config.`) + return [] + } + const groupOptions = filterOptions(group[values], search, label, customLabel) + + return groupOptions.length + ? { + [groupLabel]: group[groupLabel], + [values]: groupOptions + } + : [] + }) + } + + const flow = (...fns) => x => fns.reduce((v, f) => f(v), x) + + export default { + data () { + return { + search: '', + isOpen: false, + preferredOpenDirection: 'below', + optimizedHeight: this.maxHeight + } + }, + props: { + /** + * Decide whether to filter the results based on search query. + * Useful for async filtering, where we search through more complex data. + * @type {Boolean} + */ + internalSearch: { + type: Boolean, + default: true + }, + /** + * Array of available options: Objects, Strings or Integers. + * If array of objects, visible label will default to option.label. + * If `labal` prop is passed, label will equal option['label'] + * @type {Array} + */ + options: { + type: Array, + required: true + }, + /** + * Equivalent to the `multiple` attribute on a `<select>` input. + * @default false + * @type {Boolean} + */ + multiple: { + type: Boolean, + default: false + }, + /** + * Presets the selected options value. + * @type {Object||Array||String||Integer} + */ + value: { + type: null, + default () { + return [] + } + }, + /** + * Key to compare objects + * @default 'id' + * @type {String} + */ + trackBy: { + type: String + }, + /** + * Label to look for in option Object + * @default 'label' + * @type {String} + */ + label: { + type: String + }, + /** + * Enable/disable search in options + * @default true + * @type {Boolean} + */ + searchable: { + type: Boolean, + default: true + }, + /** + * Clear the search input after `) + * @default true + * @type {Boolean} + */ + clearOnSelect: { + type: Boolean, + default: true + }, + /** + * Hide already selected options + * @default false + * @type {Boolean} + */ + hideSelected: { + type: Boolean, + default: false + }, + /** + * Equivalent to the `placeholder` attribute on a `<select>` input. + * @default 'Select option' + * @type {String} + */ + placeholder: { + type: String, + default: 'Select option' + }, + /** + * Allow to remove all selected values + * @default true + * @type {Boolean} + */ + allowEmpty: { + type: Boolean, + default: true + }, + /** + * Reset this.internalValue, this.search after this.internalValue changes. + * Useful if want to create a stateless dropdown. + * @default false + * @type {Boolean} + */ + resetAfter: { + type: Boolean, + default: false + }, + /** + * Enable/disable closing after selecting an option + * @default true + * @type {Boolean} + */ + closeOnSelect: { + type: Boolean, + default: true + }, + /** + * Function to interpolate the custom label + * @default false + * @type {Function} + */ + customLabel: { + type: Function, + default (option, label) { + if (isEmpty(option)) return '' + return label ? option[label] : option + } + }, + /** + * Disable / Enable tagging + * @default false + * @type {Boolean} + */ + taggable: { + type: Boolean, + default: false + }, + /** + * String to show when highlighting a potential tag + * @default 'Press enter to create a tag' + * @type {String} + */ + tagPlaceholder: { + type: String, + default: 'Press enter to create a tag' + }, + /** + * By default new tags will appear above the search results. + * Changing to 'bottom' will revert this behaviour + * and will proritize the search results + * @default 'top' + * @type {String} + */ + tagPosition: { + type: String, + default: 'top' + }, + /** + * Number of allowed selected options. No limit if 0. + * @default 0 + * @type {Number} + */ + max: { + type: [Number, Boolean], + default: false + }, + /** + * Will be passed with all events as second param. + * Useful for identifying events origin. + * @default null + * @type {String|Integer} + */ + id: { + default: null + }, + /** + * Limits the options displayed in the dropdown + * to the first X options. + * @default 1000 + * @type {Integer} + */ + optionsLimit: { + type: Number, + default: 1000 + }, + /** + * Name of the property containing + * the group values + * @default 1000 + * @type {String} + */ + groupValues: { + type: String + }, + /** + * Name of the property containing + * the group label + * @default 1000 + * @type {String} + */ + groupLabel: { + type: String + }, + /** + * Allow to select all group values + * by selecting the group label + * @default false + * @type {Boolean} + */ + groupSelect: { + type: Boolean, + default: false + }, + /** + * Array of keyboard keys to block + * when selecting + * @default 1000 + * @type {String} + */ + blockKeys: { + type: Array, + default () { + return [] + } + }, + /** + * Prevent from wiping up the search value + * @default false + * @type {Boolean} + */ + preserveSearch: { + type: Boolean, + default: false + }, + /** + * Select 1st options if value is empty + * @default false + * @type {Boolean} + */ + preselectFirst: { + type: Boolean, + default: false + } + }, + mounted () { + /* istanbul ignore else */ + if (!this.multiple && this.max) { + console.warn('[Vue-Multiselect warn]: Max prop should not be used when prop Multiple equals false.') + } + if ( + this.preselectFirst && + !this.internalValue.length && + this.options.length + ) { + this.select(this.filteredOptions[0]) + } + }, + computed: { + internalValue () { + return this.value || this.value === 0 + ? Array.isArray(this.value) ? this.value : [this.value] + : [] + }, + filteredOptions () { + const search = this.search || '' + const normalizedSearch = search.toLowerCase().trim() + + let options = this.options.concat() + + /* istanbul ignore else */ + if (this.internalSearch) { + options = this.groupValues + ? this.filterAndFlat(options, normalizedSearch, this.label) + : filterOptions(options, normalizedSearch, this.label, this.customLabel) + } else { + options = this.groupValues ? flattenOptions(this.groupValues, this.groupLabel)(options) : options + } + + options = this.hideSelected + ? options.filter(not(this.isSelected)) + : options + + /* istanbul ignore else */ + if (this.taggable && normalizedSearch.length && !this.isExistingOption(normalizedSearch)) { + if (this.tagPosition === 'bottom') { + options.push({ isTag: true, label: search }) + } else { + options.unshift({ isTag: true, label: search }) + } + } + + return options.slice(0, this.optionsLimit) + }, + valueKeys () { + if (this.trackBy) { + return this.internalValue.map(element => element[this.trackBy]) + } else { + return this.internalValue + } + }, + optionKeys () { + const options = this.groupValues ? this.flatAndStrip(this.options) : this.options + return options.map(element => this.customLabel(element, this.label).toString().toLowerCase()) + }, + currentOptionLabel () { + return this.multiple + ? this.searchable ? '' : this.placeholder + : this.internalValue.length + ? this.getOptionLabel(this.internalValue[0]) + : this.searchable ? '' : this.placeholder + } + }, + watch: { + internalValue () { + /* istanbul ignore else */ + if (this.resetAfter && this.internalValue.length) { + this.search = '' + this.$emit('input', this.multiple ? [] : null) + } + }, + search () { + this.$emit('search-change', this.search, this.id) + } + }, + methods: { + /** + * Returns the internalValue in a way it can be emited to the parent + * @returns {Object||Array||String||Integer} + */ + getValue () { + return this.multiple + ? this.internalValue + : this.internalValue.length === 0 + ? null + : this.internalValue[0] + }, + /** + * Filters and then flattens the options list + * @param {Array} + * @returns {Array} returns a filtered and flat options list + */ + filterAndFlat (options, search, label) { + return flow( + filterGroups(search, label, this.groupValues, this.groupLabel, this.customLabel), + flattenOptions(this.groupValues, this.groupLabel) + )(options) + }, + /** + * Flattens and then strips the group labels from the options list + * @param {Array} + * @returns {Array} returns a flat options list without group labels + */ + flatAndStrip (options) { + return flow( + flattenOptions(this.groupValues, this.groupLabel), + stripGroups + )(options) + }, + /** + * Updates the search value + * @param {String} + */ + updateSearch (query) { + this.search = query + }, + /** + * Finds out if the given query is already present + * in the available options + * @param {String} + * @returns {Boolean} returns true if element is available + */ + isExistingOption (query) { + return !this.options + ? false + : this.optionKeys.indexOf(query) > -1 + }, + /** + * Finds out if the given element is already present + * in the result value + * @param {Object||String||Integer} option passed element to check + * @returns {Boolean} returns true if element is selected + */ + isSelected (option) { + const opt = this.trackBy + ? option[this.trackBy] + : option + return this.valueKeys.indexOf(opt) > -1 + }, + /** + * Finds out if the given option is disabled + * @param {Object||String||Integer} option passed element to check + * @returns {Boolean} returns true if element is disabled + */ + isOptionDisabled (option) { + return !!option.$isDisabled + }, + /** + * Returns empty string when options is null/undefined + * Returns tag query if option is tag. + * Returns the customLabel() results and casts it to string. + * + * @param {Object||String||Integer} Passed option + * @returns {Object||String} + */ + getOptionLabel (option) { + if (isEmpty(option)) return '' + /* istanbul ignore else */ + if (option.isTag) return option.label + /* istanbul ignore else */ + if (option.$isLabel) return option.$groupLabel + + let label = this.customLabel(option, this.label) + /* istanbul ignore else */ + if (isEmpty(label)) return '' + return label + }, + /** + * Add the given option to the list of selected options + * or sets the option as the selected option. + * If option is already selected -> remove it from the results. + * + * @param {Object||String||Integer} option to select/deselect + * @param {Boolean} block removing + */ + select (option, key) { + /* istanbul ignore else */ + if (option.$isLabel && this.groupSelect) { + this.selectGroup(option) + return + } + if (this.blockKeys.indexOf(key) !== -1 || + this.disabled || + option.$isDisabled || + option.$isLabel + ) return + /* istanbul ignore else */ + if (this.max && this.multiple && this.internalValue.length === this.max) return + /* istanbul ignore else */ + if (key === 'Tab' && !this.pointerDirty) return + if (option.isTag) { + this.$emit('tag', option.label, this.id) + this.search = '' + if (this.closeOnSelect && !this.multiple) this.deactivate() + } else { + const isSelected = this.isSelected(option) + + if (isSelected) { + if (key !== 'Tab') this.removeElement(option) + return + } + + this.$emit('select', option, this.id) + + if (this.multiple) { + this.$emit('input', this.internalValue.concat([option]), this.id) + } else { + this.$emit('input', option, this.id) + } + + /* istanbul ignore else */ + if (this.clearOnSelect) this.search = '' + } + /* istanbul ignore else */ + if (this.closeOnSelect) this.deactivate() + }, + /** + * Add the given group options to the list of selected options + * If all group optiona are already selected -> remove it from the results. + * + * @param {Object||String||Integer} group to select/deselect + */ + selectGroup (selectedGroup) { + const group = this.options.find(option => { + return option[this.groupLabel] === selectedGroup.$groupLabel + }) + + if (!group) return + + if (this.wholeGroupSelected(group)) { + this.$emit('remove', group[this.groupValues], this.id) + + const newValue = this.internalValue.filter( + option => group[this.groupValues].indexOf(option) === -1 + ) + + this.$emit('input', newValue, this.id) + } else { + const optionsToAdd = group[this.groupValues].filter( + option => !(this.isOptionDisabled(option) || this.isSelected(option)) + ) + + this.$emit('select', optionsToAdd, this.id) + this.$emit( + 'input', + this.internalValue.concat(optionsToAdd), + this.id + ) + } + + if (this.closeOnSelect) this.deactivate() + }, + /** + * Helper to identify if all values in a group are selected + * + * @param {Object} group to validated selected values against + */ + wholeGroupSelected (group) { + return group[this.groupValues].every(option => this.isSelected(option) || this.isOptionDisabled(option) + ) + }, + /** + * Helper to identify if all values in a group are disabled + * + * @param {Object} group to check for disabled values + */ + wholeGroupDisabled (group) { + return group[this.groupValues].every(this.isOptionDisabled) + }, + /** + * Removes the given option from the selected options. + * Additionally checks this.allowEmpty prop if option can be removed when + * it is the last selected option. + * + * @param {type} option description + * @returns {type} description + */ + removeElement (option, shouldClose = true) { + /* istanbul ignore else */ + if (this.disabled) return + /* istanbul ignore else */ + if (option.$isDisabled) return + /* istanbul ignore else */ + if (!this.allowEmpty && this.internalValue.length <= 1) { + this.deactivate() + return + } + + const index = typeof option === 'object' + ? this.valueKeys.indexOf(option[this.trackBy]) + : this.valueKeys.indexOf(option) + + this.$emit('remove', option, this.id) + if (this.multiple) { + const newValue = this.internalValue.slice(0, index).concat(this.internalValue.slice(index + 1)) + this.$emit('input', newValue, this.id) + } else { + this.$emit('input', null, this.id) + } + + /* istanbul ignore else */ + if (this.closeOnSelect && shouldClose) this.deactivate() + }, + /** + * Calls this.removeElement() with the last element + * from this.internalValue (selected element Array) + * + * @fires this#removeElement + */ + removeLastElement () { + /* istanbul ignore else */ + if (this.blockKeys.indexOf('Delete') !== -1) return + /* istanbul ignore else */ + if (this.search.length === 0 && Array.isArray(this.internalValue) && this.internalValue.length) { + this.removeElement(this.internalValue[this.internalValue.length - 1], false) + } + }, + /** + * Opens the multiselect’s dropdown. + * Sets this.isOpen to TRUE + */ + activate () { + /* istanbul ignore else */ + if (this.isOpen || this.disabled) return + + this.adjustPosition() + /* istanbul ignore else */ + if (this.groupValues && this.pointer === 0 && this.filteredOptions.length) { + this.pointer = 1 + } + + this.isOpen = true + /* istanbul ignore else */ + if (this.searchable) { + if (!this.preserveSearch) this.search = '' + this.$nextTick(() => this.$refs.search && this.$refs.search.focus()) + } else { + this.$el.focus() + } + this.$emit('open', this.id) + }, + /** + * Closes the multiselect’s dropdown. + * Sets this.isOpen to FALSE + */ + deactivate () { + /* istanbul ignore else */ + if (!this.isOpen) return + + this.isOpen = false + /* istanbul ignore else */ + if (this.searchable) { + this.$refs.search && this.$refs.search.blur() + } else { + this.$el.blur() + } + if (!this.preserveSearch) this.search = '' + this.$emit('close', this.getValue(), this.id) + }, + /** + * Call this.activate() or this.deactivate() + * depending on this.isOpen value. + * + * @fires this#activate || this#deactivate + * @property {Boolean} isOpen indicates if dropdown is open + */ + toggle () { + this.isOpen + ? this.deactivate() + : this.activate() + }, + /** + * Updates the hasEnoughSpace variable used for + * detecting where to expand the dropdown + */ + adjustPosition () { + if (typeof window === 'undefined') return + + const spaceAbove = this.$el.getBoundingClientRect().top + const spaceBelow = window.innerHeight - this.$el.getBoundingClientRect().bottom + const hasEnoughSpaceBelow = spaceBelow > this.maxHeight + + if (hasEnoughSpaceBelow || spaceBelow > spaceAbove || this.openDirection === 'below' || this.openDirection === 'bottom') { + this.preferredOpenDirection = 'below' + this.optimizedHeight = Math.min(spaceBelow - 40, this.maxHeight) + } else { + this.preferredOpenDirection = 'above' + this.optimizedHeight = Math.min(spaceAbove - 40, this.maxHeight) + } + } + } + } \ No newline at end of file diff --git a/src/plugins/deprecated/pointerMixin.js b/src/plugins/deprecated/pointerMixin.js new file mode 100644 index 0000000000000000000000000000000000000000..50f49f69667854661a7595b893a1eb943c871e48 --- /dev/null +++ b/src/plugins/deprecated/pointerMixin.js @@ -0,0 +1,143 @@ +export default { + data () { + return { + pointer: 0, + pointerDirty: false + } + }, + props: { + /** + * Enable/disable highlighting of the pointed value. + * @type {Boolean} + * @default true + */ + showPointer: { + type: Boolean, + default: true + }, + optionHeight: { + type: Number, + default: 40 + } + }, + computed: { + pointerPosition () { + return this.pointer * this.optionHeight + }, + visibleElements () { + return this.optimizedHeight / this.optionHeight + } + }, + watch: { + filteredOptions () { + this.pointerAdjust() + }, + isOpen () { + this.pointerDirty = false + }, + pointer () { + this.$refs.search && this.$refs.search.setAttribute('aria-activedescendant', this.id + '-' + this.pointer.toString()) + } + }, + methods: { + optionHighlight (index, option) { + return { + 'multiselect__option--highlight': index === this.pointer && this.showPointer, + 'multiselect__option--selected': this.isSelected(option) + } + }, + groupHighlight (index, selectedGroup) { + if (!this.groupSelect) { + return [ + 'multiselect__option--disabled', + { 'multiselect__option--group': selectedGroup.$isLabel } + ] + } + + const group = this.options.find(option => { + return option[this.groupLabel] === selectedGroup.$groupLabel + }) + + return group && !this.wholeGroupDisabled(group) ? [ + 'multiselect__option--group', + { 'multiselect__option--highlight': index === this.pointer && this.showPointer }, + { 'multiselect__option--group-selected': this.wholeGroupSelected(group) } + ] : 'multiselect__option--disabled' + }, + addPointerElement ({ key } = 'Enter') { + /* istanbul ignore else */ + if (this.filteredOptions.length > 0) { + this.select(this.filteredOptions[this.pointer], key) + } + this.pointerReset() + }, + pointerForward () { + /* istanbul ignore else */ + if (this.pointer < this.filteredOptions.length - 1) { + this.pointer++ + /* istanbul ignore next */ + if (this.$refs.list.scrollTop <= this.pointerPosition - (this.visibleElements - 1) * this.optionHeight) { + this.$refs.list.scrollTop = this.pointerPosition - (this.visibleElements - 1) * this.optionHeight + } + /* istanbul ignore else */ + if ( + this.filteredOptions[this.pointer] && + this.filteredOptions[this.pointer].$isLabel && + !this.groupSelect + ) this.pointerForward() + } + this.pointerDirty = true + }, + pointerBackward () { + if (this.pointer > 0) { + this.pointer-- + /* istanbul ignore else */ + if (this.$refs.list.scrollTop >= this.pointerPosition) { + this.$refs.list.scrollTop = this.pointerPosition + } + /* istanbul ignore else */ + if ( + this.filteredOptions[this.pointer] && + this.filteredOptions[this.pointer].$isLabel && + !this.groupSelect + ) this.pointerBackward() + } else { + /* istanbul ignore else */ + if ( + this.filteredOptions[this.pointer] && + this.filteredOptions[0].$isLabel && + !this.groupSelect + ) this.pointerForward() + } + this.pointerDirty = true + }, + pointerReset () { + /* istanbul ignore else */ + if (!this.closeOnSelect) return + this.pointer = 0 + /* istanbul ignore else */ + if (this.$refs.list) { + this.$refs.list.scrollTop = 0 + } + }, + pointerAdjust () { + /* istanbul ignore else */ + if (this.pointer >= this.filteredOptions.length - 1) { + this.pointer = this.filteredOptions.length + ? this.filteredOptions.length - 1 + : 0 + } + + if (this.filteredOptions.length > 0 && + this.filteredOptions[this.pointer].$isLabel && + !this.groupSelect + ) { + this.pointerForward() + } + }, + pointerSet (index) { + this.pointer = index + this.pointerDirty = true + } + } + } \ No newline at end of file diff --git a/src/plugins/deprecated/vue-multiselect.ts b/src/plugins/deprecated/vue-multiselect.ts index 4dae10623fda1c6e7d03c5e57905fffb4deddcf0..3ddcdf85d79674b0eca2bc3f26826da75b8f5382 100644 --- a/src/plugins/deprecated/vue-multiselect.ts +++ b/src/plugins/deprecated/vue-multiselect.ts @@ -1,6 +1,6 @@ import Vue from "vue"; -import Multiselect from "vue-multiselect"; +import Multiselect from "./Multiselect.vue"; import "vue-multiselect/dist/vue-multiselect.min.css"; import "./_custom.css"; diff --git a/src/shims-vue.d.ts b/src/shims-vue.d.ts new file mode 100644 index 0000000000000000000000000000000000000000..800b452b7236d4567e9918115342be4f25cab3f5 --- /dev/null +++ b/src/shims-vue.d.ts @@ -0,0 +1,5 @@ +declare module "*.vue" { + import { defineComponent } from "vue"; + const Component: ReturnType<typeof defineComponent>; + export default Component; +} diff --git a/tailwind.config.js b/tailwind.config.js deleted file mode 100644 index af0f4d323c83692fd18d44167f18fffa713f535d..0000000000000000000000000000000000000000 --- a/tailwind.config.js +++ /dev/null @@ -1,6 +0,0 @@ -module.exports = { - darkMode: "class", // or 'media' - theme: {}, - variants: {}, - plugins: [], -}; diff --git a/test/setup.ts b/test/setup.ts new file mode 100644 index 0000000000000000000000000000000000000000..0fccbd340ec9b8ce8401a30e2577abf7fc56bafa --- /dev/null +++ b/test/setup.ts @@ -0,0 +1,21 @@ +// Things which need to be setup globally for tests can be put in here + +import { Vue2, install, isVue2 } from 'vue-demi'; +import { beforeAll } from 'vitest'; + +const setupVueSwitch = () => { + if (isVue2 && Vue2) { + Vue2.config.productionTip = false; + Vue2.config.devtools = false; + install(Vue2); + } +}; + +setupVueSwitch(); + +beforeAll(() => { + setupVueSwitch(); +}); + +/* Bootstrap Vue */ +import "@/plugins/bootstrap-vue"; diff --git a/tsconfig.json b/tsconfig.json index 4c95319b623927e35c36b47cdbf13ecf577da6b5..bac590703789949c5d949a7ac5147133eeccd94e 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -6,13 +6,14 @@ "jsx": "preserve", "importHelpers": true, "moduleResolution": "node", + "skipDefaultLibCheck": true, "skipLibCheck": true, "esModuleInterop": true, "allowSyntheticDefaultImports": true, "resolveJsonModule": true, "sourceMap": true, "baseUrl": ".", - "types": ["vite/client"], + "types": ["vite/client", "vitest/globals"], "paths": { "@/*": [ "src/*" diff --git a/vite.config.js b/vite.config.js index 7068055004b7f5759b3308ade69b07bb14c7b1d2..ef07d1392356bedced01e7e8a451fa2ca6bf7102 100644 --- a/vite.config.js +++ b/vite.config.js @@ -1,4 +1,4 @@ -import path from "path"; +import path from "node:path"; import { defineConfig } from "vite"; import vue from "@vitejs/plugin-vue2"; @@ -42,10 +42,8 @@ const config = defineConfig({ dedupe: ["vue"], }, - // Node.js global to browser globalThis define: { - 'process.env': process.env, - 'global': 'globalThis', + 'process.env': process.env }, optimizeDeps: { @@ -150,6 +148,20 @@ const config = defineConfig({ host: true, port: 9234, }, + + test: { + globals: true, + environment: 'jsdom', + setupFiles: [path.resolve(__dirname, 'test/setup.ts')], + reporters: 'dot', + deps: { + inline: [ + 'vue2', + '@vue/composition-api', + ], + }, + alias: [{ find: /^vue$/, replacement: 'vue/dist/vue.runtime.common.js' }], + }, }); export default config; diff --git a/yarn.lock-workspace b/yarn.lock-workspace index 08a1b3cf3c93198a6ed4efe8613e15264bd1ed24..89203962cfa83cf89b4c075b6bd3d6a1c37f35b4 100644 --- a/yarn.lock-workspace +++ b/yarn.lock-workspace @@ -21,17 +21,17 @@ __metadata: languageName: node linkType: hard -"@babel/helper-string-parser@npm:^7.19.4": - version: 7.19.4 - resolution: "@babel/helper-string-parser@npm:7.19.4" - checksum: b2f8a3920b30dfac81ec282ac4ad9598ea170648f8254b10f475abe6d944808fb006aab325d3eb5a8ad3bea8dfa888cfa6ef471050dae5748497c110ec060943 +"@babel/helper-validator-identifier@npm:^7.16.7": + version: 7.16.7 + resolution: "@babel/helper-validator-identifier@npm:7.16.7" + checksum: dbb3db9d184343152520a209b5684f5e0ed416109cde82b428ca9c759c29b10c7450657785a8b5c5256aa74acc6da491c1f0cf6b784939f7931ef82982051b69 languageName: node linkType: hard -"@babel/helper-validator-identifier@npm:^7.18.6, @babel/helper-validator-identifier@npm:^7.19.1": - version: 7.19.1 - resolution: "@babel/helper-validator-identifier@npm:7.19.1" - checksum: 0eca5e86a729162af569b46c6c41a63e18b43dbe09fda1d2a3c8924f7d617116af39cac5e4cd5d431bb760b4dca3c0970e0c444789b1db42bcf1fa41fbad0a3a +"@babel/helper-validator-identifier@npm:^7.18.6": + version: 7.18.6 + resolution: "@babel/helper-validator-identifier@npm:7.18.6" + checksum: e295254d616bbe26e48c196a198476ab4d42a73b90478c9842536cf910ead887f5af6b5c4df544d3052a25ccb3614866fa808dc1e3a5a4291acd444e243c0648 languageName: node linkType: hard @@ -47,22 +47,28 @@ __metadata: linkType: hard "@babel/parser@npm:^7.18.4": - version: 7.19.4 - resolution: "@babel/parser@npm:7.19.4" + version: 7.18.11 + resolution: "@babel/parser@npm:7.18.11" bin: parser: ./bin/babel-parser.js - checksum: 5ef97da97915085ff3b9c562b04fb6316074ece52d20de95f44c47b46abf87fd754cbcae769a69570a84652b736afe5bb2cb7dc117aa7ad6d81ab40eed0c613b + checksum: 5ecc75b83e62ec53a947b1635a6ca75d6210d4a4f962f9f16f4239a6783f98e57f9662b598fa2fb1b8e12c0ad5c2bd86846ed0b97b85eb73dd7498b3a6d71a4b languageName: node linkType: hard "@babel/types@npm:^7.8.3": - version: 7.19.4 - resolution: "@babel/types@npm:7.19.4" + version: 7.18.4 + resolution: "@babel/types@npm:7.18.4" dependencies: - "@babel/helper-string-parser": ^7.19.4 - "@babel/helper-validator-identifier": ^7.19.1 + "@babel/helper-validator-identifier": ^7.16.7 to-fast-properties: ^2.0.0 - checksum: 4032f6407093f80dd4f4764be676f7527d2a5c0381586967cd79683cf8af01cdc16745a381b9cef045f702f0c9b0dffd880d84ee55dad59ba01bd23d5d52a8e0 + checksum: 85df59beb99c1b95e9e41590442f2ffa1e5b1b558d025489db40c9f7c906bd03a17da26c3ec486e5800e80af27c42ca7eee9506d9212ab17766d2d68d30fbf52 + languageName: node + linkType: hard + +"@bcoe/v8-coverage@npm:^0.2.3": + version: 0.2.3 + resolution: "@bcoe/v8-coverage@npm:0.2.3" + checksum: 850f9305536d0f2bd13e9e0881cb5f02e4f93fad1189f7b2d4bebf694e3206924eadee1068130d43c11b750efcc9405f88a8e42ef098b6d75239c0f047de1a27 languageName: node linkType: hard @@ -308,18 +314,18 @@ __metadata: languageName: node linkType: hard -"@coscine/api-client@npm:^2.5.0, @coscine/api-client@npm:^2.6.0": - version: 2.6.0 - resolution: "@coscine/api-client@npm:2.6.0" +"@coscine/api-client@npm:^2.5.0, @coscine/api-client@npm:^2.8.0": + version: 2.8.0 + resolution: "@coscine/api-client@npm:2.8.0" dependencies: axios: ^0.21.1 - checksum: 420582b5f25e05f059d2f700c8350f7e83aa198a3065d55ebf51d3e9ec7776017731c2ce283d9b5b53d12fd3bcaec440fdde8e0551666556d9470439c52241b4 + checksum: 69087396db1b552981d541d8d567e5980e68fdf75080feb94d2e3bb696a2a02c174ecae98a1d2e95117ca62ae59cabf2466ab34fb341b7f43726f39ab440a60c languageName: node linkType: hard -"@coscine/form-generator@npm:^3.0.8": - version: 3.0.8 - resolution: "@coscine/form-generator@npm:3.0.8" +"@coscine/form-generator@npm:^3.0.9": + version: 3.0.9 + resolution: "@coscine/form-generator@npm:3.0.9" dependencies: "@coscine/api-client": ^2.5.0 "@zazuko/rdf-vocabularies": ^2022.6.29 @@ -328,7 +334,6 @@ __metadata: rdf-parse: ^1.8.0 rdf-validate-shacl: ^0.4.4 stream-browserify: ^3.0.0 - uuid: ^8.3.2 vue-demi: ^0.13.11 vue-i18n: ^8.22.2 vue-material-design-icons: ^5.1.2 @@ -339,7 +344,7 @@ __metadata: peerDependenciesMeta: "@vue/composition-api": optional: true - checksum: 8df99f7b85fe0b3ac4964a0ba32e127b8f3d2cefd017dc6d73ad32b023b16e9796387e46b58b76689d7d42d1bfa05b13b992ede24e25739c33a31e092df5920d + checksum: e15bc05df24fec1e99caba6a66b494a4bb90b228a016d430257e575a396359018e755faea71b52ac3be82925e6ff4a8024615e84ae469efac02528f7703ab873 languageName: node linkType: hard @@ -375,9 +380,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/android-arm@npm:0.15.10": - version: 0.15.10 - resolution: "@esbuild/android-arm@npm:0.15.10" +"@esbuild/android-arm@npm:0.15.12": + version: 0.15.12 + resolution: "@esbuild/android-arm@npm:0.15.12" conditions: os=android & cpu=arm languageName: node linkType: hard @@ -389,16 +394,23 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-loong64@npm:0.15.10": - version: 0.15.10 - resolution: "@esbuild/linux-loong64@npm:0.15.10" +"@esbuild/linux-loong64@npm:0.15.12": + version: 0.15.12 + resolution: "@esbuild/linux-loong64@npm:0.15.12" conditions: os=linux & cpu=loong64 languageName: node linkType: hard -"@eslint/eslintrc@npm:^1.3.3": - version: 1.3.3 - resolution: "@eslint/eslintrc@npm:1.3.3" +"@esbuild/linux-loong64@npm:0.15.7": + version: 0.15.7 + resolution: "@esbuild/linux-loong64@npm:0.15.7" + conditions: os=linux & cpu=loong64 + languageName: node + linkType: hard + +"@eslint/eslintrc@npm:^1.3.2": + version: 1.3.2 + resolution: "@eslint/eslintrc@npm:1.3.2" dependencies: ajv: ^6.12.4 debug: ^4.3.2 @@ -409,7 +421,7 @@ __metadata: js-yaml: ^4.1.0 minimatch: ^3.1.2 strip-json-comments: ^3.1.1 - checksum: f03e9d6727efd3e0719da2051ea80c0c73d20e28c171121527dbb868cd34232ca9c1d0525a66e517a404afea26624b1e47895b6a92474678418c2f50c9566694 + checksum: 2074dca47d7e1c5c6323ff353f690f4b25d3ab53fe7d27337e2592d37a894cf60ca0e85ca66b50ff2db0bc7e630cc1e9c7347d65bb185b61416565584c38999c languageName: node linkType: hard @@ -512,13 +524,20 @@ __metadata: linkType: hard "@humanwhocodes/config-array@npm:^0.10.5": - version: 0.10.7 - resolution: "@humanwhocodes/config-array@npm:0.10.7" + version: 0.10.5 + resolution: "@humanwhocodes/config-array@npm:0.10.5" dependencies: "@humanwhocodes/object-schema": ^1.2.1 debug: ^4.1.1 minimatch: ^3.0.4 - checksum: 009d64be8d5bd098ff04e10af79e34f5633245250581fca032fac12a8667b2df8e7d169e69c05bff4d83ea3dd3c7d2d0e05ea9b94d89a7d092e26530caf6f8a3 + checksum: af4fa2633c57414be22ddba0a072cc611ef9a07104542fa24bde918a0153b89b6e08ca6a20ccc9079de6079e219e2406e38414d1b662db8bb59a3ba9d6eee6e3 + languageName: node + linkType: hard + +"@humanwhocodes/gitignore-to-minimatch@npm:^1.0.2": + version: 1.0.2 + resolution: "@humanwhocodes/gitignore-to-minimatch@npm:1.0.2" + checksum: aba5c40c9e3770ed73a558b0bfb53323842abfc2ce58c91d7e8b1073995598e6374456d38767be24ab6176915f0a8d8b23eaae5c85e2b488c0dccca6d795e2ad languageName: node linkType: hard @@ -543,6 +562,37 @@ __metadata: languageName: node linkType: hard +"@istanbuljs/schema@npm:^0.1.2, @istanbuljs/schema@npm:^0.1.3": + version: 0.1.3 + resolution: "@istanbuljs/schema@npm:0.1.3" + checksum: 5282759d961d61350f33d9118d16bcaed914ebf8061a52f4fa474b2cb08720c9c81d165e13b82f2e5a8a212cc5af482f0c6fc1ac27b9e067e5394c9a6ed186c9 + languageName: node + linkType: hard + +"@jridgewell/resolve-uri@npm:3.1.0": + version: 3.1.0 + resolution: "@jridgewell/resolve-uri@npm:3.1.0" + checksum: b5ceaaf9a110fcb2780d1d8f8d4a0bfd216702f31c988d8042e5f8fbe353c55d9b0f55a1733afdc64806f8e79c485d2464680ac48a0d9fcadb9548ee6b81d267 + languageName: node + linkType: hard + +"@jridgewell/sourcemap-codec@npm:1.4.14": + version: 1.4.14 + resolution: "@jridgewell/sourcemap-codec@npm:1.4.14" + checksum: 61100637b6d173d3ba786a5dff019e1a74b1f394f323c1fee337ff390239f053b87266c7a948777f4b1ee68c01a8ad0ab61e5ff4abb5a012a0b091bec391ab97 + languageName: node + linkType: hard + +"@jridgewell/trace-mapping@npm:^0.3.12": + version: 0.3.17 + resolution: "@jridgewell/trace-mapping@npm:0.3.17" + dependencies: + "@jridgewell/resolve-uri": 3.1.0 + "@jridgewell/sourcemap-codec": 1.4.14 + checksum: 9d703b859cff5cd83b7308fd457a431387db5db96bd781a63bf48e183418dd9d3d44e76b9e4ae13237f6abeeb25d739ec9215c1d5bfdd08f66f750a50074a339 + languageName: node + linkType: hard + "@nodelib/fs.scandir@npm:2.1.5": version: 2.1.5 resolution: "@nodelib/fs.scandir@npm:2.1.5" @@ -616,36 +666,14 @@ __metadata: languageName: node linkType: hard -"@npmcli/ci-detect@npm:*": - version: 3.0.0 - resolution: "@npmcli/ci-detect@npm:3.0.0" - checksum: 3f02fb38a3070d7a8cf934ca1122b734b5817812afbc11291f8d2d53a4293ce50475cf803c969f5cf16a875b5823c53d0bdb990ae0c3af08d838c82e9bd7970d - languageName: node - linkType: hard - -"@npmcli/ci-detect@npm:^2.0.0": +"@npmcli/ci-detect@npm:*, @npmcli/ci-detect@npm:^2.0.0": version: 2.0.0 resolution: "@npmcli/ci-detect@npm:2.0.0" checksum: 26e964eca908706c1a612915cbc5614860ac7dbfacbb07870396c82b1377794f123a7aaa821c4a68575b67ff7e3ad170e296d3aa6a5e03dbab9b3f1e61491812 languageName: node linkType: hard -"@npmcli/config@npm:*": - version: 6.0.0 - resolution: "@npmcli/config@npm:6.0.0" - dependencies: - "@npmcli/map-workspaces": ^2.0.2 - ini: ^3.0.0 - nopt: ^6.0.0 - proc-log: ^2.0.0 - read-package-json-fast: ^3.0.0 - semver: ^7.3.5 - walk-up-path: ^1.0.0 - checksum: a463b9dffb892bfe46cade98482c4a8e1f9fffcdd98ecda1750e5b91f2102bf30678b6e8014b81da2f5d229d007214ba8acacf1c38e331e7531269d7b4c6833c - languageName: node - linkType: hard - -"@npmcli/config@npm:^4.2.1": +"@npmcli/config@npm:*, @npmcli/config@npm:^4.2.1": version: 4.2.2 resolution: "@npmcli/config@npm:4.2.2" dependencies: @@ -670,22 +698,23 @@ __metadata: languageName: node linkType: hard -"@npmcli/fs@npm:^2.1.0, @npmcli/fs@npm:^2.1.1": - version: 2.1.2 - resolution: "@npmcli/fs@npm:2.1.2" +"@npmcli/fs@npm:^2.1.0": + version: 2.1.0 + resolution: "@npmcli/fs@npm:2.1.0" dependencies: "@gar/promisify": ^1.1.3 semver: ^7.3.5 - checksum: 405074965e72d4c9d728931b64d2d38e6ea12066d4fad651ac253d175e413c06fe4350970c783db0d749181da8fe49c42d3880bd1cbc12cd68e3a7964d820225 + checksum: 6ec6d678af6da49f9dac50cd882d7f661934dd278972ffbaacde40d9eaa2871292d634000a0cca9510f6fc29855fbd4af433e1adbff90a524ec3eaf140f1219b languageName: node linkType: hard -"@npmcli/fs@npm:^3.0.0": - version: 3.0.0 - resolution: "@npmcli/fs@npm:3.0.0" +"@npmcli/fs@npm:^2.1.1": + version: 2.1.2 + resolution: "@npmcli/fs@npm:2.1.2" dependencies: + "@gar/promisify": ^1.1.3 semver: ^7.3.5 - checksum: a95714f2369ede1fffbcaf2e7ef2db36819316d240ff0cca883ddf243544aee3519c36e4eaaa760cd2721d077a415f71f6808c71382c20a03d0cbb6e753ccd4f + checksum: 405074965e72d4c9d728931b64d2d38e6ea12066d4fad651ac253d175e413c06fe4350970c783db0d749181da8fe49c42d3880bd1cbc12cd68e3a7964d820225 languageName: node linkType: hard @@ -718,19 +747,7 @@ __metadata: languageName: node linkType: hard -"@npmcli/map-workspaces@npm:*": - version: 3.0.0 - resolution: "@npmcli/map-workspaces@npm:3.0.0" - dependencies: - "@npmcli/name-from-folder": ^1.0.1 - glob: ^8.0.1 - minimatch: ^5.0.1 - read-package-json-fast: ^3.0.0 - checksum: 949a57da93180950555f74c3adebca391fa50d6bbe76e72ce99360c86f4b8f91f3630e24cfe014d759f92b5f093f53f8ce9d3645cb93f5c342ea67cde848da4f - languageName: node - linkType: hard - -"@npmcli/map-workspaces@npm:^2.0.2, @npmcli/map-workspaces@npm:^2.0.3": +"@npmcli/map-workspaces@npm:*, @npmcli/map-workspaces@npm:^2.0.2, @npmcli/map-workspaces@npm:^2.0.3": version: 2.0.4 resolution: "@npmcli/map-workspaces@npm:2.0.4" dependencies: @@ -755,12 +772,12 @@ __metadata: linkType: hard "@npmcli/move-file@npm:^2.0.0": - version: 2.0.1 - resolution: "@npmcli/move-file@npm:2.0.1" + version: 2.0.0 + resolution: "@npmcli/move-file@npm:2.0.0" dependencies: mkdirp: ^1.0.4 rimraf: ^3.0.2 - checksum: 52dc02259d98da517fae4cb3a0a3850227bdae4939dda1980b788a7670636ca2b4a01b58df03dd5f65c1e3cb70c50fa8ce5762b582b3f499ec30ee5ce1fd9380 + checksum: 1388777b507b0c592d53f41b9d182e1a8de7763bc625fc07999b8edbc22325f074e5b3ec90af79c89d6987fdb2325bc66d59f483258543c14a43661621f841b0 languageName: node linkType: hard @@ -778,16 +795,7 @@ __metadata: languageName: node linkType: hard -"@npmcli/package-json@npm:*": - version: 3.0.0 - resolution: "@npmcli/package-json@npm:3.0.0" - dependencies: - json-parse-even-better-errors: ^3.0.0 - checksum: d7603ec771c365346e39e24a9dda8fdb3918a55f01011d27bf377468c44991092a1fbdaaa580cfd1ff37456a933630b9a99bf3bb08438e1333c2ce559e86398d - languageName: node - linkType: hard - -"@npmcli/package-json@npm:^2.0.0": +"@npmcli/package-json@npm:*, @npmcli/package-json@npm:^2.0.0": version: 2.0.0 resolution: "@npmcli/package-json@npm:2.0.0" dependencies: @@ -796,16 +804,7 @@ __metadata: languageName: node linkType: hard -"@npmcli/promise-spawn@npm:*": - version: 4.0.0 - resolution: "@npmcli/promise-spawn@npm:4.0.0" - dependencies: - infer-owner: ^1.0.4 - checksum: ee1257d9983f66ce1cd4f83be5c8f36eea5d0bf9836ecb4418c5bdf825c324cb0cb7e9e22c4554c501606634934b7d750006f5ce346963a9ee7cfbbd3c93a09c - languageName: node - linkType: hard - -"@npmcli/promise-spawn@npm:^3.0.0": +"@npmcli/promise-spawn@npm:*, @npmcli/promise-spawn@npm:^3.0.0": version: 3.0.0 resolution: "@npmcli/promise-spawn@npm:3.0.0" dependencies: @@ -852,66 +851,66 @@ __metadata: linkType: hard "@octokit/auth-token@npm:^3.0.0": - version: 3.0.2 - resolution: "@octokit/auth-token@npm:3.0.2" + version: 3.0.1 + resolution: "@octokit/auth-token@npm:3.0.1" dependencies: - "@octokit/types": ^8.0.0 - checksum: c7204770a6cb1661379c31b5a26779b509324446e61a4902893a69fd471738c817afc470f8ac8d86ad827738cc953046d27fbb87fc81782ff10e366b70241f4e + "@octokit/types": ^7.0.0 + checksum: e94ba5abc2f86cf49e8dc0b86225f2fdda6af451328b13a43d68972117d4e3dccba5cb375fa0c5970a43c9392665bf4e4f0ef1332522f76d4fa4b16c5ad6cc1d languageName: node linkType: hard -"@octokit/core@npm:^4.1.0": - version: 4.1.0 - resolution: "@octokit/core@npm:4.1.0" +"@octokit/core@npm:^4.0.0": + version: 4.0.5 + resolution: "@octokit/core@npm:4.0.5" dependencies: "@octokit/auth-token": ^3.0.0 "@octokit/graphql": ^5.0.0 "@octokit/request": ^6.0.0 "@octokit/request-error": ^3.0.0 - "@octokit/types": ^8.0.0 + "@octokit/types": ^7.0.0 before-after-hook: ^2.2.0 universal-user-agent: ^6.0.0 - checksum: 4e53e02ff3ebe808b74385be0055cc1cce4b548060b20e3f2d5dd1bf7877ff7b6556f11278edc070842bf24aa869f9f59a02638f1b14083eb290b9e297447a2d + checksum: 6e4a2161d22b9cb24cd1cf702e6d18200fc48a29dc66db08c37809d65243d29429123652072126d9f161e45aef6a57e72a5d56d7e975829c190e8c3c46b3f1b9 languageName: node linkType: hard "@octokit/endpoint@npm:^7.0.0": - version: 7.0.3 - resolution: "@octokit/endpoint@npm:7.0.3" + version: 7.0.2 + resolution: "@octokit/endpoint@npm:7.0.2" dependencies: - "@octokit/types": ^8.0.0 + "@octokit/types": ^7.0.0 is-plain-object: ^5.0.0 universal-user-agent: ^6.0.0 - checksum: c36b1577062e51d1683779a59c75d046d59f9a5c3a0f046d465e6c4c39f64bfc3a3052b42fa91a4552c7903ec382c604b4a2e1aadebdf7458191849ede5d4978 + checksum: 81743b228e903d27e426280a63f1d2c2771b3bda4a2e577f6f25f075a1eb577b6c853b62abed1a6bfa0fa01322dac9b71e2f07c75cd7946d952b1c8f6032d96d languageName: node linkType: hard "@octokit/graphql@npm:^5.0.0": - version: 5.0.3 - resolution: "@octokit/graphql@npm:5.0.3" + version: 5.0.1 + resolution: "@octokit/graphql@npm:5.0.1" dependencies: "@octokit/request": ^6.0.0 - "@octokit/types": ^8.0.0 + "@octokit/types": ^7.0.0 universal-user-agent: ^6.0.0 - checksum: cc02df32ccd0dc2f500a165381ed1db27f9499767e450b5275f0a366637985d5f42ca40915eda31f5675e652e18dbb423514cba263a11877f52cce2a65aa4faf + checksum: 310549c2d7966adb46428e943cd99cb766519819bd4945d8349d3ec0642e4ee39d9194e1b0a87a5404951c04c247fafb4a8456ed4c839c64bfb4042aa4a6812c languageName: node linkType: hard -"@octokit/openapi-types@npm:^14.0.0": - version: 14.0.0 - resolution: "@octokit/openapi-types@npm:14.0.0" - checksum: 0a1f8f3be998cd82c5a640e9166d43fd183b33d5d36f5e1a9b81608e94d0da87c01ec46c9988f69cd26585d4e2ffc4d3ec99ee4f75e5fe997fc86dad0aa8293c +"@octokit/openapi-types@npm:^13.11.0": + version: 13.12.0 + resolution: "@octokit/openapi-types@npm:13.12.0" + checksum: d8f2598d95b7031799af54c6af0bfcd03f59372f417248a7bf04f60d1ac79019d41aff3ed5285760bd80e3b674a611043385ace4067346277e8c95ff6437a2e7 languageName: node linkType: hard -"@octokit/plugin-paginate-rest@npm:^5.0.0": - version: 5.0.1 - resolution: "@octokit/plugin-paginate-rest@npm:5.0.1" +"@octokit/plugin-paginate-rest@npm:^4.0.0": + version: 4.3.1 + resolution: "@octokit/plugin-paginate-rest@npm:4.3.1" dependencies: - "@octokit/types": ^8.0.0 + "@octokit/types": ^7.5.0 peerDependencies: "@octokit/core": ">=4" - checksum: cfded297d9f66c7607bd34075eb0c5f7278a1617d6be86115997c0757151c9be2fcf7a8849c2a5cebab56931a263b5cc35742b6227935afe77f5ed61b0627a3d + checksum: 96d420fc9944cd3cb67c41d47781ee00d406e34622ed6a6cc1995ee9602e1ab23b51e30f5a5d3b80d4b62879234e0c21fe6c654b267ccb9550379f2e0051e681 languageName: node linkType: hard @@ -924,61 +923,72 @@ __metadata: languageName: node linkType: hard -"@octokit/plugin-rest-endpoint-methods@npm:^6.7.0": - version: 6.7.0 - resolution: "@octokit/plugin-rest-endpoint-methods@npm:6.7.0" +"@octokit/plugin-rest-endpoint-methods@npm:^6.0.0": + version: 6.6.2 + resolution: "@octokit/plugin-rest-endpoint-methods@npm:6.6.2" dependencies: - "@octokit/types": ^8.0.0 + "@octokit/types": ^7.5.0 deprecation: ^2.3.1 peerDependencies: "@octokit/core": ">=3" - checksum: 513c6c0717d08f3e85848029bd700412b7d9787750f78cc79a3dede356e94b238bf8a518b108f556a7efe626871720dd0466de9f31091578ea4e0f5a016f0ae7 + checksum: 3c3fe12e6f0463aeb77b6a7ea6da0b1928ed179b27745c778c32ead3796fe4352322dc103095d141d548aa6b0d91bb0196e4a2d5d60cd71fc820c3774e23c1f4 languageName: node linkType: hard "@octokit/request-error@npm:^3.0.0": - version: 3.0.2 - resolution: "@octokit/request-error@npm:3.0.2" + version: 3.0.1 + resolution: "@octokit/request-error@npm:3.0.1" dependencies: - "@octokit/types": ^8.0.0 + "@octokit/types": ^7.0.0 deprecation: ^2.0.0 once: ^1.4.0 - checksum: 41549554ce780de13d3421f8036635014c8dcbdf867c288526ef7b17e9d92470f33341ddadacf2868dc0181440842803484104efbe11ebfaecdaeec58871a13e + checksum: ae386b5181b3cb66b844047a21d062b683cd7ec4daf70cb9868406c1a51608a72d683955e692c7cc6237d66a09b12c6bcf102a712985da68bcedcc3820117e75 languageName: node linkType: hard "@octokit/request@npm:^6.0.0": - version: 6.2.2 - resolution: "@octokit/request@npm:6.2.2" + version: 6.2.1 + resolution: "@octokit/request@npm:6.2.1" dependencies: "@octokit/endpoint": ^7.0.0 "@octokit/request-error": ^3.0.0 - "@octokit/types": ^8.0.0 + "@octokit/types": ^7.0.0 is-plain-object: ^5.0.0 node-fetch: ^2.6.7 universal-user-agent: ^6.0.0 - checksum: adbeb38807c60b53d32d9b69be0c1f861c26698bc6f5f3f7e05d26972290dc4867827dd333bdd801818c347e5723efd049a2b9848c6c8bf74a2032968dede0ff + checksum: f0a3e878de8c2e6930da5af835d9a3750800eff9ba66af02400dc75238475a9b9c2c5473047792c0f37c2c371095a36485c0729c419873bdccb6058bb8637685 languageName: node linkType: hard "@octokit/rest@npm:^19.0.0": - version: 19.0.5 - resolution: "@octokit/rest@npm:19.0.5" + version: 19.0.4 + resolution: "@octokit/rest@npm:19.0.4" dependencies: - "@octokit/core": ^4.1.0 - "@octokit/plugin-paginate-rest": ^5.0.0 + "@octokit/core": ^4.0.0 + "@octokit/plugin-paginate-rest": ^4.0.0 "@octokit/plugin-request-log": ^1.0.4 - "@octokit/plugin-rest-endpoint-methods": ^6.7.0 - checksum: ed4c36859aafb64e23f7f708086fe7e2ecda17ffd8c1594817d539f766f5855af79f17f5d225d96d34cd9b97cbfea988dac3df39a7cc928b2d2b7b75ed981056 + "@octokit/plugin-rest-endpoint-methods": ^6.0.0 + checksum: 7eba9148b707c713705ba8d75c25fbb22488f30abef7967ce92884a51e411e709b90ff56b0e6fa5521b261f343a7fd33b8ad5d0b87cab4bc2e178002b2566cf2 languageName: node linkType: hard -"@octokit/types@npm:^8.0.0": - version: 8.0.0 - resolution: "@octokit/types@npm:8.0.0" +"@octokit/types@npm:^7.0.0, @octokit/types@npm:^7.5.0": + version: 7.5.0 + resolution: "@octokit/types@npm:7.5.0" + dependencies: + "@octokit/openapi-types": ^13.11.0 + checksum: ded2fa77d939e54e97c9561120c19990781686250a0fbb36c3c8fe63f2c6ab081eca065e67a830a5731e1f0d9a4b8a8c26f858e28e1beb0f0c31aed31284e087 + languageName: node + linkType: hard + +"@pinia/testing@npm:^0.0.14": + version: 0.0.14 + resolution: "@pinia/testing@npm:0.0.14" dependencies: - "@octokit/openapi-types": ^14.0.0 - checksum: 1a0197b2c4c522ac90f145e02b3f8cb048a47f71c2c6bdbf021a03db7dd30ca92a899c0186acb401337f218efe44e60d33cc1cc68715b622bb75bc1a4e79515d + vue-demi: "*" + peerDependencies: + pinia: ">=2.0.19" + checksum: 314dfa5f0eb8efe8055152ea1409f709c3a06614cdc15aaae8f92d424371bdaae844531358235d2ad922456c54059df96ac9da84298fd8b72be0d6a1b65459af languageName: node linkType: hard @@ -1077,7 +1087,7 @@ __metadata: languageName: node linkType: hard -"@rdfjs/data-model@npm:^2.0.0, @rdfjs/data-model@npm:^2.0.1": +"@rdfjs/data-model@npm:^2.0.0": version: 2.0.1 resolution: "@rdfjs/data-model@npm:2.0.1" bin: @@ -1204,18 +1214,6 @@ __metadata: languageName: node linkType: hard -"@rdfjs/score@npm:^0.1.1": - version: 0.1.1 - resolution: "@rdfjs/score@npm:0.1.1" - dependencies: - "@rdfjs/data-model": ^2.0.1 - "@rdfjs/term-map": ^2.0.0 - "@rdfjs/term-set": ^2.0.1 - "@rdfjs/to-ntriples": ^2.0.0 - checksum: 4602cb0fe4f661d97ba11a8ba9cf3760f1a790e2b36c26ac572781cee8ab1bb27a85b6e9ad029bc73f88073899afaef0626f58ebdc9dceb61eda2a042e1f5875 - languageName: node - linkType: hard - "@rdfjs/serializer-jsonld-ext@npm:^3.0.0": version: 3.0.0 resolution: "@rdfjs/serializer-jsonld-ext@npm:3.0.0" @@ -1291,7 +1289,7 @@ __metadata: languageName: node linkType: hard -"@rdfjs/term-set@npm:^2.0.0, @rdfjs/term-set@npm:^2.0.1": +"@rdfjs/term-set@npm:^2.0.0": version: 2.0.1 resolution: "@rdfjs/term-set@npm:2.0.1" dependencies: @@ -1589,6 +1587,22 @@ __metadata: languageName: node linkType: hard +"@types/chai-subset@npm:^1.3.3": + version: 1.3.3 + resolution: "@types/chai-subset@npm:1.3.3" + dependencies: + "@types/chai": "*" + checksum: 4481da7345022995f5a105e6683744f7203d2c3d19cfe88d8e17274d045722948abf55e0adfd97709e0f043dade37a4d4e98cd4c660e2e8a14f23e6ecf79418f + languageName: node + linkType: hard + +"@types/chai@npm:*, @types/chai@npm:^4.3.3": + version: 4.3.3 + resolution: "@types/chai@npm:4.3.3" + checksum: 20cd094753e137cfc35939cae7f0ed78ecda7861e5c94704efab6979b9121a63807e9b631bdcf3a2792d6c6dba44050b13387262f9e63ebb040741c01c345f0a + languageName: node + linkType: hard + "@types/clownface@npm:*": version: 1.5.1 resolution: "@types/clownface@npm:1.5.1" @@ -1628,6 +1642,13 @@ __metadata: languageName: node linkType: hard +"@types/istanbul-lib-coverage@npm:^2.0.1": + version: 2.0.4 + resolution: "@types/istanbul-lib-coverage@npm:2.0.4" + checksum: a25d7589ee65c94d31464c16b72a9dc81dfa0bea9d3e105ae03882d616e2a0712a9c101a599ec482d297c3591e16336962878cb3eb1a0a62d5b76d277a890ce7 + languageName: node + linkType: hard + "@types/json-schema@npm:^7.0.9": version: 7.0.11 resolution: "@types/json-schema@npm:7.0.11" @@ -1652,9 +1673,9 @@ __metadata: linkType: hard "@types/lodash@npm:^4.14.178": - version: 4.14.186 - resolution: "@types/lodash@npm:4.14.186" - checksum: ee0c1368a8100bb6efb88335107473a41928fc307ff1ef4ff1278868ccddba9c04c68c36d1ffe3a0392ef4a956e1955f7de3203ec09df4f1655dd1b88485c549 + version: 4.14.185 + resolution: "@types/lodash@npm:4.14.185" + checksum: f81d13da5ecab110ca9c5c7cc2bedc3c9802a6acf668576aecd1b8f4b134ed81d06c15f1e600fb08f05975098280a0d97d30cddfc2cb39ec1c6b56e971ca53b3 languageName: node linkType: hard @@ -1676,9 +1697,9 @@ __metadata: linkType: hard "@types/node@npm:*, @types/node@npm:^18.0.0": - version: 18.8.5 - resolution: "@types/node@npm:18.8.5" - checksum: f7d896f54743178e64c534c6da16f582505acf18904ecd0ee8541cb4bc1d429ba514e7ecfd5145221b71adbd6ae1ff72df082f667e56d056fcd1a719df948e08 + version: 18.7.23 + resolution: "@types/node@npm:18.7.23" + checksum: 2c8df0830d8345e5cd1ca17feb9cf43fa667aae749888e0a068c5c1b35eaedd2f9b24ed987a0758078395edf7a03681e5e0b7790a518ff7afe1ff6d8459f7b4a languageName: node linkType: hard @@ -1799,13 +1820,36 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/eslint-plugin@npm:^5.0.0, @typescript-eslint/eslint-plugin@npm:^5.35.1": - version: 5.40.0 - resolution: "@typescript-eslint/eslint-plugin@npm:5.40.0" +"@typescript-eslint/eslint-plugin@npm:^5.0.0": + version: 5.36.2 + resolution: "@typescript-eslint/eslint-plugin@npm:5.36.2" + dependencies: + "@typescript-eslint/scope-manager": 5.36.2 + "@typescript-eslint/type-utils": 5.36.2 + "@typescript-eslint/utils": 5.36.2 + debug: ^4.3.4 + functional-red-black-tree: ^1.0.1 + ignore: ^5.2.0 + regexpp: ^3.2.0 + semver: ^7.3.7 + tsutils: ^3.21.0 + peerDependencies: + "@typescript-eslint/parser": ^5.0.0 + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + peerDependenciesMeta: + typescript: + optional: true + checksum: edcd9fcecdeb22a689b421cafe3b7adc859bf2fd6227aecdd7412c319c808e7bab063c8f94af32116cfc971962f9780d181cb0a4aa999951c2d2be1f84c6c376 + languageName: node + linkType: hard + +"@typescript-eslint/eslint-plugin@npm:^5.35.1": + version: 5.38.1 + resolution: "@typescript-eslint/eslint-plugin@npm:5.38.1" dependencies: - "@typescript-eslint/scope-manager": 5.40.0 - "@typescript-eslint/type-utils": 5.40.0 - "@typescript-eslint/utils": 5.40.0 + "@typescript-eslint/scope-manager": 5.38.1 + "@typescript-eslint/type-utils": 5.38.1 + "@typescript-eslint/utils": 5.38.1 debug: ^4.3.4 ignore: ^5.2.0 regexpp: ^3.2.0 @@ -1817,43 +1861,97 @@ __metadata: peerDependenciesMeta: typescript: optional: true - checksum: ac9e8fcea3545eb33353373c5094fd0a7b79647b37066adbcbd8edcb6fc17c6a601fd0e1b8db0a39200e8238acb33d4b1b036bfe09ebb9899cfb43f6c271a8fd + checksum: a8895588022f75b2bf994ce52f7109d8814e0f5b3bef0d4fac19dc86a926202ca204bfca8c0e5a033d7566bae90815a772b64bcdc61c349f47ddd52d91989de5 + languageName: node + linkType: hard + +"@typescript-eslint/parser@npm:^5.0.0": + version: 5.36.2 + resolution: "@typescript-eslint/parser@npm:5.36.2" + dependencies: + "@typescript-eslint/scope-manager": 5.36.2 + "@typescript-eslint/types": 5.36.2 + "@typescript-eslint/typescript-estree": 5.36.2 + debug: ^4.3.4 + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + peerDependenciesMeta: + typescript: + optional: true + checksum: d6cc22cbc7aacb5ecebf55eb1d681cb6b964b108e147b418295c3e48701a77768cff128c16da421ae50eabb9f1296ecec7fa3cc5f2ccb63a3febf79f98b4195f languageName: node linkType: hard -"@typescript-eslint/parser@npm:^5.0.0, @typescript-eslint/parser@npm:^5.35.1": - version: 5.40.0 - resolution: "@typescript-eslint/parser@npm:5.40.0" +"@typescript-eslint/parser@npm:^5.35.1": + version: 5.38.1 + resolution: "@typescript-eslint/parser@npm:5.38.1" dependencies: - "@typescript-eslint/scope-manager": 5.40.0 - "@typescript-eslint/types": 5.40.0 - "@typescript-eslint/typescript-estree": 5.40.0 + "@typescript-eslint/scope-manager": 5.38.1 + "@typescript-eslint/types": 5.38.1 + "@typescript-eslint/typescript-estree": 5.38.1 debug: ^4.3.4 peerDependencies: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 peerDependenciesMeta: typescript: optional: true - checksum: a8d02950dd12fcb1d19ad5f24cbfd186ca88d8a099160f93f99767896a45198a9f9bfbdd1a57c1ae50d452e6c895ae5b4d7e4623dfc87bca55a45c5ba16491f8 + checksum: 3f84b33d598d9acef99f087bdfe319e74f838d3442d6a15f2498f077a1473f124e3ec6698dbb256f56c51ce38abd91c0ffb90f0856989309e28c43e005d99215 + languageName: node + linkType: hard + +"@typescript-eslint/scope-manager@npm:5.36.1": + version: 5.36.1 + resolution: "@typescript-eslint/scope-manager@npm:5.36.1" + dependencies: + "@typescript-eslint/types": 5.36.1 + "@typescript-eslint/visitor-keys": 5.36.1 + checksum: c46497226af75baed7458838ec0bfbddf19f8084115d78b915b46a8ceb4c05619ac61da127dfd3c8ee11bc916896d57bf8b9f936b0306ce69658160f910e3ad0 + languageName: node + linkType: hard + +"@typescript-eslint/scope-manager@npm:5.36.2": + version: 5.36.2 + resolution: "@typescript-eslint/scope-manager@npm:5.36.2" + dependencies: + "@typescript-eslint/types": 5.36.2 + "@typescript-eslint/visitor-keys": 5.36.2 + checksum: 93ff655f7c237c88ec6dc5911202dd8f81bd8909b27f1a758a9d77e9791040f1ee6fe2891314bde75c808ce586246e98003a1b1396937b0312f2440016dea751 + languageName: node + linkType: hard + +"@typescript-eslint/scope-manager@npm:5.38.1": + version: 5.38.1 + resolution: "@typescript-eslint/scope-manager@npm:5.38.1" + dependencies: + "@typescript-eslint/types": 5.38.1 + "@typescript-eslint/visitor-keys": 5.38.1 + checksum: c3b38ca0074d09e26c30b4385c18933f8a6418c923a24c7f4c2297af60a85d604320f119863676f49ea4254b3c01c112504547436eda4951ade609e8d7f438a7 languageName: node linkType: hard -"@typescript-eslint/scope-manager@npm:5.40.0": - version: 5.40.0 - resolution: "@typescript-eslint/scope-manager@npm:5.40.0" +"@typescript-eslint/type-utils@npm:5.36.2": + version: 5.36.2 + resolution: "@typescript-eslint/type-utils@npm:5.36.2" dependencies: - "@typescript-eslint/types": 5.40.0 - "@typescript-eslint/visitor-keys": 5.40.0 - checksum: 48dfb2f1a71bda5b782263e97608f1e1a2e8a89a603344af5072208be7936140af9d41483be439405c5ee379d0263555d6cc94405b187707f9ecfd7dd9821b5f + "@typescript-eslint/typescript-estree": 5.36.2 + "@typescript-eslint/utils": 5.36.2 + debug: ^4.3.4 + tsutils: ^3.21.0 + peerDependencies: + eslint: "*" + peerDependenciesMeta: + typescript: + optional: true + checksum: c202b7d2cd08ed7f7d1ad7e430e9e1596478e147f0d485d02babfda0211c55fa950de1dc4d1c950008a8a047a31c1e982e97fe5558f93d496830eb9d9532bc71 languageName: node linkType: hard -"@typescript-eslint/type-utils@npm:5.40.0": - version: 5.40.0 - resolution: "@typescript-eslint/type-utils@npm:5.40.0" +"@typescript-eslint/type-utils@npm:5.38.1": + version: 5.38.1 + resolution: "@typescript-eslint/type-utils@npm:5.38.1" dependencies: - "@typescript-eslint/typescript-estree": 5.40.0 - "@typescript-eslint/utils": 5.40.0 + "@typescript-eslint/typescript-estree": 5.38.1 + "@typescript-eslint/utils": 5.38.1 debug: ^4.3.4 tsutils: ^3.21.0 peerDependencies: @@ -1861,23 +1959,73 @@ __metadata: peerDependenciesMeta: typescript: optional: true - checksum: eabe86de93b0bd4bcbfb13cace097ff7addbd992c91b80c73bbaa677ce26f1c2abd1c63fe585f2fd9c80df07d3d54bd6e4a46aebc908cef0f870f1d6955d6b8a + checksum: 1e5fbb5cd2cd97d8d6aaf6b0d1262517e74aba006ffc61526528352a8ab99205456d6247da8252388e868ed7ee8f6c2fa8e108dad68b696cbdbcef6473579173 + languageName: node + linkType: hard + +"@typescript-eslint/types@npm:5.36.1": + version: 5.36.1 + resolution: "@typescript-eslint/types@npm:5.36.1" + checksum: 10c8965c64e16bc6920dc0c62aae2b139062aca945d03df2ad6fe7c299d2faa684621d571f8d9807a67643d4e9fa5217c69d5f538f9936fc757f9df5ded57623 + languageName: node + linkType: hard + +"@typescript-eslint/types@npm:5.36.2": + version: 5.36.2 + resolution: "@typescript-eslint/types@npm:5.36.2" + checksum: 736cb8a76b58f2f9a7d066933094c5510ffe31479ea8b804a829ec85942420f1b55e0eb2688fbdaaaa9c0e5b3b590fb8f14bbd745353696b4fd33fda620d417b + languageName: node + linkType: hard + +"@typescript-eslint/types@npm:5.38.1": + version: 5.38.1 + resolution: "@typescript-eslint/types@npm:5.38.1" + checksum: 384f7fe9a1995d87507049a868aa1a1f9eb28af913e704540e1494c8c630985f9ef4f4e6bdd4df0d83cbe4611c4e6f4f07d5d91bfa57c88242fb227a6d828b7e + languageName: node + linkType: hard + +"@typescript-eslint/typescript-estree@npm:5.36.1": + version: 5.36.1 + resolution: "@typescript-eslint/typescript-estree@npm:5.36.1" + dependencies: + "@typescript-eslint/types": 5.36.1 + "@typescript-eslint/visitor-keys": 5.36.1 + debug: ^4.3.4 + globby: ^11.1.0 + is-glob: ^4.0.3 + semver: ^7.3.7 + tsutils: ^3.21.0 + peerDependenciesMeta: + typescript: + optional: true + checksum: acaf2938001673918dbbe690a353cf92e2cfabc79f74cd5946e303a8c24eb9c08ae2053dd261810ed0c9c471ebe879f386564c1b01dd2504dc84f4ce5f4dc696 languageName: node linkType: hard -"@typescript-eslint/types@npm:5.40.0": - version: 5.40.0 - resolution: "@typescript-eslint/types@npm:5.40.0" - checksum: 892ff162176a3e292b5b55090421c6d318187255f3f91be46bd5c0b38e3c25a49d9320ffb646d5709f3a2cdf350217a79e557886fdfdbdb322caec27f2b3d116 +"@typescript-eslint/typescript-estree@npm:5.36.2": + version: 5.36.2 + resolution: "@typescript-eslint/typescript-estree@npm:5.36.2" + dependencies: + "@typescript-eslint/types": 5.36.2 + "@typescript-eslint/visitor-keys": 5.36.2 + debug: ^4.3.4 + globby: ^11.1.0 + is-glob: ^4.0.3 + semver: ^7.3.7 + tsutils: ^3.21.0 + peerDependenciesMeta: + typescript: + optional: true + checksum: 2827ff57a114b6107ea6d555f3855007133b08a7c2bafba0cfa0c935d8b99fd7b49e982d48cccc1c5ba550d95748d0239f5e2109893f12a165d76ed64a0d261b languageName: node linkType: hard -"@typescript-eslint/typescript-estree@npm:5.40.0": - version: 5.40.0 - resolution: "@typescript-eslint/typescript-estree@npm:5.40.0" +"@typescript-eslint/typescript-estree@npm:5.38.1": + version: 5.38.1 + resolution: "@typescript-eslint/typescript-estree@npm:5.38.1" dependencies: - "@typescript-eslint/types": 5.40.0 - "@typescript-eslint/visitor-keys": 5.40.0 + "@typescript-eslint/types": 5.38.1 + "@typescript-eslint/visitor-keys": 5.38.1 debug: ^4.3.4 globby: ^11.1.0 is-glob: ^4.0.3 @@ -1886,34 +2034,85 @@ __metadata: peerDependenciesMeta: typescript: optional: true - checksum: 8b67b8c4278f6bbd16ec521c847920c6f0ba57ec4bf148505c057aa160363852f50f9db73f42ee71ac3906940e8554e9c27686194a57f6554efcd82a8b0fa3e8 + checksum: ec73496f73bd7f97d1585d25484874f092141a5f92ade7bd324fb76ef52888f0d77cc4375bdecc92cc3bacf5d61d65197acbb9af4fd9322b51db286c68a320c6 languageName: node linkType: hard -"@typescript-eslint/utils@npm:5.40.0, @typescript-eslint/utils@npm:^5.10.2": - version: 5.40.0 - resolution: "@typescript-eslint/utils@npm:5.40.0" +"@typescript-eslint/utils@npm:5.36.2": + version: 5.36.2 + resolution: "@typescript-eslint/utils@npm:5.36.2" dependencies: "@types/json-schema": ^7.0.9 - "@typescript-eslint/scope-manager": 5.40.0 - "@typescript-eslint/types": 5.40.0 - "@typescript-eslint/typescript-estree": 5.40.0 + "@typescript-eslint/scope-manager": 5.36.2 + "@typescript-eslint/types": 5.36.2 + "@typescript-eslint/typescript-estree": 5.36.2 eslint-scope: ^5.1.1 eslint-utils: ^3.0.0 - semver: ^7.3.7 peerDependencies: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - checksum: 608e16ad510c1543de37e168ab42e9d11fdd7d38faf19fe5d60255ea8e43b9a8cebeea11bd9776eed55fe0e453c5d222bb708b930b431c5b113269c6b44788c1 + checksum: 45356cf55a8733e3ab1f2c3c19cdaefdb79857e35eb1433c29b81f3df071e9cef8a286bc407abe243889a21d9e793e999f92f03b9c727a0fac1c17a48e64c42a languageName: node linkType: hard -"@typescript-eslint/visitor-keys@npm:5.40.0": - version: 5.40.0 - resolution: "@typescript-eslint/visitor-keys@npm:5.40.0" +"@typescript-eslint/utils@npm:5.38.1": + version: 5.38.1 + resolution: "@typescript-eslint/utils@npm:5.38.1" dependencies: - "@typescript-eslint/types": 5.40.0 + "@types/json-schema": ^7.0.9 + "@typescript-eslint/scope-manager": 5.38.1 + "@typescript-eslint/types": 5.38.1 + "@typescript-eslint/typescript-estree": 5.38.1 + eslint-scope: ^5.1.1 + eslint-utils: ^3.0.0 + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + checksum: 06646ddeb6c1a5dac01e8336dff458cf37dff0d3d5a2f304048a4d6d8f62d504c5330a8b046ec66f6777f324bc1afe6a3f7ea1c5b015b123ab7062e8e22aff67 + languageName: node + linkType: hard + +"@typescript-eslint/utils@npm:^5.10.2": + version: 5.36.1 + resolution: "@typescript-eslint/utils@npm:5.36.1" + dependencies: + "@types/json-schema": ^7.0.9 + "@typescript-eslint/scope-manager": 5.36.1 + "@typescript-eslint/types": 5.36.1 + "@typescript-eslint/typescript-estree": 5.36.1 + eslint-scope: ^5.1.1 + eslint-utils: ^3.0.0 + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + checksum: 77853d526af86ac508d7938916046ed4ad6374c7414981064c5122a2baa96fa234751137f481ac264a07387fd4dcec1cd26b33e29732cc58e855aae77a001d7c + languageName: node + linkType: hard + +"@typescript-eslint/visitor-keys@npm:5.36.1": + version: 5.36.1 + resolution: "@typescript-eslint/visitor-keys@npm:5.36.1" + dependencies: + "@typescript-eslint/types": 5.36.1 + eslint-visitor-keys: ^3.3.0 + checksum: 45ab7c2fd455a8e4beff418bed6c9e7e1f9f66bcaad3bfaed868f97a3f8cfec1fa4faa45948af1a1c32ce573a7b1c6d10427119c257622445b06b488fefd8b49 + languageName: node + linkType: hard + +"@typescript-eslint/visitor-keys@npm:5.36.2": + version: 5.36.2 + resolution: "@typescript-eslint/visitor-keys@npm:5.36.2" + dependencies: + "@typescript-eslint/types": 5.36.2 + eslint-visitor-keys: ^3.3.0 + checksum: 87ccdcfa5cdedaa3a1aac30d656969f4f5910b62bcaacdf80a514dbf0cbbd8e79b55f8e987eab34cc79ece8ce4b8c19d5caf8b0afb74e0b0d7ab39fb29aa8eba + languageName: node + linkType: hard + +"@typescript-eslint/visitor-keys@npm:5.38.1": + version: 5.38.1 + resolution: "@typescript-eslint/visitor-keys@npm:5.38.1" + dependencies: + "@typescript-eslint/types": 5.38.1 eslint-visitor-keys: ^3.3.0 - checksum: a11787f7e6ac7018b22848028c9116d028f89782b0ee120517f0384e9db260e3001ad897512d9c3cf15ce16073ae4c1dc7f81f29d6d40dec78b5e8c8e79f344f + checksum: 01c83a42900f8ab721bd0857abcc000a15183eb26d2d61cceeaef018a83a91325f48c0112d4356383c41dce23174a305bb3352af4705a61d1da46f8ac0e88340 languageName: node linkType: hard @@ -1927,21 +2126,31 @@ __metadata: languageName: node linkType: hard -"@vue/compiler-sfc@npm:2.7.13": - version: 2.7.13 - resolution: "@vue/compiler-sfc@npm:2.7.13" +"@vitest/coverage-c8@npm:^0.24.3": + version: 0.24.5 + resolution: "@vitest/coverage-c8@npm:0.24.5" + dependencies: + c8: ^7.12.0 + vitest: 0.24.5 + checksum: 54ca01a281df13f6c312a9fd14cff31a214b5886549ebe8179b94423aad831e6c3d5438a45464596703f02c7a4117f1b1a7c31fb84c3779d20c47cbb0dc9a3fb + languageName: node + linkType: hard + +"@vue/compiler-sfc@npm:2.7.10": + version: 2.7.10 + resolution: "@vue/compiler-sfc@npm:2.7.10" dependencies: "@babel/parser": ^7.18.4 postcss: ^8.4.14 source-map: ^0.6.1 - checksum: c5e21f55f8951e184294b3dbfd13cb1b2bdc70be88c47c7ca1209f85b19bdb9df0a34dfa3720d75b538e34b63a5c9b8fa28b87eeedf3b84dbd03122f601dcf82 + checksum: f20d79183ed2b9242d2c1ff196ddc9c3c384f541b85ca59543842af098653c3c0732a9b2f28dd031383bb9e02a40a5a001b4c6bbcb12fbd389372225b12b9020 languageName: node linkType: hard -"@vue/devtools-api@npm:^6.4.4": - version: 6.4.4 - resolution: "@vue/devtools-api@npm:6.4.4" - checksum: d4d1079202579eceb8efb503b695dead39d2da4d693419a4a3f4e1823358726325bc2912e15c580ef94128ed61f42be0ce6a23ac013967e04d971b0a7158a263 +"@vue/devtools-api@npm:^6.2.1": + version: 6.2.1 + resolution: "@vue/devtools-api@npm:6.2.1" + checksum: 34765af0be9b0cc7e3def73b2792b1514e3c348852c5a7503fe07d013f0e907af6c27c0a32c0637dd748caf37c075af8e53ca3220433e0bd34b6f3405f358272 languageName: node linkType: hard @@ -2013,6 +2222,20 @@ __metadata: languageName: node linkType: hard +"@vue/test-utils@npm:^1.3.0": + version: 1.3.2 + resolution: "@vue/test-utils@npm:1.3.2" + dependencies: + dom-event-types: ^1.0.0 + lodash: ^4.17.15 + pretty: ^2.0.0 + peerDependencies: + vue: 2.x + vue-template-compiler: ^2.x + checksum: 665320b1f69e63956ca06d998ed8eecb704c727b79f4b66fdeb3a91a65223a2691de07d8652660535b7b32dbf1955187209325c335c329b8fadecd69a9308439 + languageName: node + linkType: hard + "@vuelidate/core@npm:^2.0.0-alpha.41": version: 2.0.0 resolution: "@vuelidate/core@npm:2.0.0" @@ -2125,7 +2348,14 @@ __metadata: languageName: node linkType: hard -"abbrev@npm:*, abbrev@npm:^1.0.0, abbrev@npm:~1.1.1": +"abab@npm:^2.0.6": + version: 2.0.6 + resolution: "abab@npm:2.0.6" + checksum: 6ffc1af4ff315066c62600123990d87551ceb0aafa01e6539da77b0f5987ac7019466780bf480f1787576d4385e3690c81ccc37cfda12819bf510b8ab47e5a3e + languageName: node + linkType: hard + +"abbrev@npm:*, abbrev@npm:1, abbrev@npm:^1.0.0, abbrev@npm:~1.1.1": version: 1.1.1 resolution: "abbrev@npm:1.1.1" checksum: a4a97ec07d7ea112c517036882b2ac22f3109b7b19077dc656316d07d308438aac28e4d9746dc4d84bf6b1e75b4a7b0a5f3cb30592419f128ca9a8cee3bcfa17 @@ -2141,6 +2371,16 @@ __metadata: languageName: node linkType: hard +"acorn-globals@npm:^7.0.0": + version: 7.0.1 + resolution: "acorn-globals@npm:7.0.1" + dependencies: + acorn: ^8.1.0 + acorn-walk: ^8.0.2 + checksum: 2a2998a547af6d0db5f0cdb90acaa7c3cbca6709010e02121fb8b8617c0fbd8bab0b869579903fde358ac78454356a14fadcc1a672ecb97b04b1c2ccba955ce8 + languageName: node + linkType: hard + "acorn-jsx@npm:^5.3.2": version: 5.3.2 resolution: "acorn-jsx@npm:5.3.2" @@ -2150,6 +2390,13 @@ __metadata: languageName: node linkType: hard +"acorn-walk@npm:^8.0.2": + version: 8.2.0 + resolution: "acorn-walk@npm:8.2.0" + checksum: 1715e76c01dd7b2d4ca472f9c58968516a4899378a63ad5b6c2d668bba8da21a71976c14ec5f5b75f887b6317c4ae0b897ab141c831d741dc76024d8745f1ad1 + languageName: node + linkType: hard + "acorn@npm:^5.7.3": version: 5.7.4 resolution: "acorn@npm:5.7.4" @@ -2159,6 +2406,15 @@ __metadata: languageName: node linkType: hard +"acorn@npm:^8.1.0": + version: 8.8.1 + resolution: "acorn@npm:8.8.1" + bin: + acorn: bin/acorn + checksum: 4079b67283b94935157698831967642f24a075c52ce3feaaaafe095776dfbe15d86a1b33b1e53860fc0d062ed6c83f4284a5c87c85b9ad51853a01173da6097f + languageName: node + linkType: hard + "acorn@npm:^8.8.0": version: 8.8.0 resolution: "acorn@npm:8.8.0" @@ -2261,9 +2517,9 @@ __metadata: linkType: hard "ansi-styles@npm:^6.0.0": - version: 6.2.1 - resolution: "ansi-styles@npm:6.2.1" - checksum: ef940f2f0ced1a6347398da88a91da7930c33ecac3c77b72c5905f8b8fe402c52e6fde304ff5347f616e27a742da3f1dc76de98f6866c69251ad0b07a66776d9 + version: 6.1.1 + resolution: "ansi-styles@npm:6.1.1" + checksum: f2b1ed658ead23caf77effe7b875960cacd70d1ebe47c830e191358b242d688cf52a28d55ef9b19d102f792e8c1dec34bd865db264f1c7f4f63dd3a5fa84677e languageName: node linkType: hard @@ -2306,12 +2562,12 @@ __metadata: linkType: hard "are-we-there-yet@npm:^3.0.0": - version: 3.0.1 - resolution: "are-we-there-yet@npm:3.0.1" + version: 3.0.0 + resolution: "are-we-there-yet@npm:3.0.0" dependencies: delegates: ^1.0.0 readable-stream: ^3.6.0 - checksum: 52590c24860fa7173bedeb69a4c05fb573473e860197f618b9a28432ee4379049336727ae3a1f9c4cb083114601c1140cee578376164d0e651217a9843f9fe83 + checksum: 348edfdd931b0b50868b55402c01c3f64df1d4c229ab6f063539a5025fd6c5f5bb8a0cab409bbed8d75d34762d22aa91b7c20b4204eb8177063158d9ba792981 languageName: node linkType: hard @@ -2389,8 +2645,15 @@ __metadata: languageName: node linkType: hard -"astral-regex@npm:^2.0.0": - version: 2.0.0 +"assertion-error@npm:^1.1.0": + version: 1.1.0 + resolution: "assertion-error@npm:1.1.0" + checksum: fd9429d3a3d4fd61782eb3962ae76b6d08aa7383123fca0596020013b3ebd6647891a85b05ce821c47d1471ed1271f00b0545cf6a4326cf2fc91efcc3b0fbecf + languageName: node + linkType: hard + +"astral-regex@npm:^2.0.0": + version: 2.0.0 resolution: "astral-regex@npm:2.0.0" checksum: 876231688c66400473ba505731df37ea436e574dd524520294cc3bbc54ea40334865e01fa0d074d74d036ee874ee7e62f486ea38bc421ee8e6a871c06f011766 languageName: node @@ -2443,9 +2706,9 @@ __metadata: linkType: hard "before-after-hook@npm:^2.2.0": - version: 2.2.3 - resolution: "before-after-hook@npm:2.2.3" - checksum: a1a2430976d9bdab4cd89cb50d27fa86b19e2b41812bf1315923b0cba03371ebca99449809226425dd3bcef20e010db61abdaff549278e111d6480034bebae87 + version: 2.2.2 + resolution: "before-after-hook@npm:2.2.2" + checksum: dc2e1ffe389e5afbef2a46790b1b5a50247ed57aba67649cfa9ec2552d248cc9278f222e72fb5a8ff59bbb39d78fbaa97e7234ead0c6b5e8418b67a8644ce207 languageName: node linkType: hard @@ -2504,7 +2767,7 @@ __metadata: languageName: node linkType: hard -"bootstrap@npm:4.6.1": +"bootstrap@npm:4.6.1, bootstrap@npm:^4.6.1": version: 4.6.1 resolution: "bootstrap@npm:4.6.1" peerDependencies: @@ -2514,16 +2777,6 @@ __metadata: languageName: node linkType: hard -"bootstrap@npm:^4.6.1": - version: 4.6.2 - resolution: "bootstrap@npm:4.6.2" - peerDependencies: - jquery: 1.9.1 - 3 - popper.js: ^1.16.1 - checksum: 3f4e7768ff7d618c49d4bf4f02aa54a9bfb679d4eecb0f3854fa4af1a17b9114b147009c435946432cdd1572efffc71d88ec385c55943a12fa66253cde0876b0 - languageName: node - linkType: hard - "bottleneck@npm:^2.18.1": version: 2.19.5 resolution: "bottleneck@npm:2.19.5" @@ -2592,31 +2845,57 @@ __metadata: languageName: node linkType: hard -"cacache@npm:*, cacache@npm:^17.0.0": - version: 17.0.0 - resolution: "cacache@npm:17.0.0" +"c8@npm:^7.12.0": + version: 7.12.0 + resolution: "c8@npm:7.12.0" dependencies: - "@npmcli/fs": ^3.0.0 + "@bcoe/v8-coverage": ^0.2.3 + "@istanbuljs/schema": ^0.1.3 + find-up: ^5.0.0 + foreground-child: ^2.0.0 + istanbul-lib-coverage: ^3.2.0 + istanbul-lib-report: ^3.0.0 + istanbul-reports: ^3.1.4 + rimraf: ^3.0.2 + test-exclude: ^6.0.0 + v8-to-istanbul: ^9.0.0 + yargs: ^16.2.0 + yargs-parser: ^20.2.9 + bin: + c8: bin/c8.js + checksum: 3b7fa9ad7cff2cb0bb579467e6b544498fbd46e9353a809ad3b8cf749df4beadd074cde277356b0552f3c8055b1b3ec3ebaf2209e9ad4bdefed92dbf64d283ab + languageName: node + linkType: hard + +"cacache@npm:*, cacache@npm:^16.0.0, cacache@npm:^16.1.3": + version: 16.1.3 + resolution: "cacache@npm:16.1.3" + dependencies: + "@npmcli/fs": ^2.1.0 "@npmcli/move-file": ^2.0.0 + chownr: ^2.0.0 fs-minipass: ^2.1.0 glob: ^8.0.1 + infer-owner: ^1.0.4 lru-cache: ^7.7.1 minipass: ^3.1.6 minipass-collect: ^1.0.2 minipass-flush: ^1.0.5 minipass-pipeline: ^1.2.4 + mkdirp: ^1.0.4 p-map: ^4.0.0 promise-inflight: ^1.0.1 + rimraf: ^3.0.2 ssri: ^9.0.0 tar: ^6.1.11 unique-filename: ^2.0.0 - checksum: 0821e15e0c8d50ae9507a42dbfed071e5b4058dfd0d9bccc4fc23606d711889c65d24f2ae14295639231329e505f166f641d8958bfb8ab86c9ad0a6e51dab41d + checksum: d91409e6e57d7d9a3a25e5dcc589c84e75b178ae8ea7de05cbf6b783f77a5fae938f6e8fda6f5257ed70000be27a681e1e44829251bfffe4c10216002f8f14e6 languageName: node linkType: hard -"cacache@npm:^16.0.0, cacache@npm:^16.1.0, cacache@npm:^16.1.3": - version: 16.1.3 - resolution: "cacache@npm:16.1.3" +"cacache@npm:^16.1.0": + version: 16.1.1 + resolution: "cacache@npm:16.1.1" dependencies: "@npmcli/fs": ^2.1.0 "@npmcli/move-file": ^2.0.0 @@ -2635,8 +2914,8 @@ __metadata: rimraf: ^3.0.2 ssri: ^9.0.0 tar: ^6.1.11 - unique-filename: ^2.0.0 - checksum: d91409e6e57d7d9a3a25e5dcc589c84e75b178ae8ea7de05cbf6b783f77a5fae938f6e8fda6f5257ed70000be27a681e1e44829251bfffe4c10216002f8f14e6 + unique-filename: ^1.1.1 + checksum: 488524617008b793f0249b0c4ea2c330c710ca997921376e15650cc2415a8054491ae2dee9f01382c2015602c0641f3f977faf2fa7361aa33d2637dcfb03907a languageName: node linkType: hard @@ -2716,10 +2995,25 @@ __metadata: languageName: node linkType: hard +"chai@npm:^4.3.6": + version: 4.3.6 + resolution: "chai@npm:4.3.6" + dependencies: + assertion-error: ^1.1.0 + check-error: ^1.0.2 + deep-eql: ^3.0.1 + get-func-name: ^2.0.0 + loupe: ^2.3.1 + pathval: ^1.1.1 + type-detect: ^4.0.5 + checksum: acff93fd537f96d4a4d62dd83810285dffcfccb5089e1bf2a1205b28ec82d93dff551368722893cf85004282df10ee68802737c33c90c5493957ed449ed7ce71 + languageName: node + linkType: hard + "chalk@npm:*, chalk@npm:^5.0.0": - version: 5.1.2 - resolution: "chalk@npm:5.1.2" - checksum: 804d7485e33531abe45b14e91026ceb5615974a8c04259ab0806f214a7666f6ea03e39ab124f7d5a0c78a83fda89005f236db3c5f10c2abe9ae875f7aa56bcb5 + version: 5.0.1 + resolution: "chalk@npm:5.0.1" + checksum: 7b45300372b908f0471fbf7389ce2f5de8d85bb949026fd51a1b95b10d0ed32c7ed5aab36dd5e9d2bf3191867909b4404cef75c5f4d2d1daeeacd301dd280b76 languageName: node linkType: hard @@ -2744,6 +3038,13 @@ __metadata: languageName: node linkType: hard +"check-error@npm:^1.0.2": + version: 1.0.2 + resolution: "check-error@npm:1.0.2" + checksum: d9d106504404b8addd1ee3f63f8c0eaa7cd962a1a28eb9c519b1c4a1dc7098be38007fc0060f045ee00f075fbb7a2a4f42abcf61d68323677e11ab98dc16042e + languageName: node + linkType: hard + "chokidar@npm:>=3.0.0 <4.0.0, chokidar@npm:^3.5.2, chokidar@npm:^3.5.3": version: 3.5.3 resolution: "chokidar@npm:3.5.3" @@ -2960,6 +3261,13 @@ __metadata: languageName: node linkType: hard +"commander@npm:^2.19.0": + version: 2.20.3 + resolution: "commander@npm:2.20.3" + checksum: ab8c07884e42c3a8dbc5dd9592c606176c7eb5c1ca5ff274bcf907039b2c41de3626f684ea75ccf4d361ba004bbaff1f577d5384c155f3871e456bdf27becf9e + languageName: node + linkType: hard + "commander@npm:^5.0.0": version: 5.1.0 resolution: "commander@npm:5.1.0" @@ -2975,9 +3283,9 @@ __metadata: linkType: hard "commander@npm:^9.3.0": - version: 9.4.1 - resolution: "commander@npm:9.4.1" - checksum: bfb18e325a5bdf772763c2213d5c7d9e77144d944124e988bcd8e5e65fb6d45d5d4e86b09155d0f2556c9a59c31e428720e57968bcd050b2306e910a0bf3cf13 + version: 9.4.0 + resolution: "commander@npm:9.4.0" + checksum: a322de584a6ccd1ea83c24f6a660e52d16ffbe2613fcfbb8d2cc68bc9dec637492456d754fe8bb5b039ad843ed8e04fb0b107e581a75f62cde9e1a0ab1546e09 languageName: node linkType: hard @@ -3030,6 +3338,27 @@ __metadata: languageName: node linkType: hard +"condense-newlines@npm:^0.2.1": + version: 0.2.1 + resolution: "condense-newlines@npm:0.2.1" + dependencies: + extend-shallow: ^2.0.1 + is-whitespace: ^0.3.0 + kind-of: ^3.0.2 + checksum: 3c20ff6ee88b5d2e81c122f33b5ba5d6976cdf86d83527fadea308b3020ed70af7ed98c2e2d94d36f27fcd723a7a477941c19575e0d2c8db6afc4aac6926a54e + languageName: node + linkType: hard + +"config-chain@npm:^1.1.13": + version: 1.1.13 + resolution: "config-chain@npm:1.1.13" + dependencies: + ini: ^1.3.4 + proto-list: ~1.2.1 + checksum: 828137a28e7c2fc4b7fb229bd0cd6c1397bcf83434de54347e608154008f411749041ee392cbe42fab6307e02de4c12480260bf769b7d44b778fdea3839eafab + languageName: node + linkType: hard + "consola@npm:^2.15.0, consola@npm:^2.15.3": version: 2.15.3 resolution: "consola@npm:2.15.3" @@ -3108,10 +3437,17 @@ __metadata: languageName: node linkType: hard +"convert-source-map@npm:^1.6.0": + version: 1.9.0 + resolution: "convert-source-map@npm:1.9.0" + checksum: dc55a1f28ddd0e9485ef13565f8f756b342f9a46c4ae18b843fe3c30c675d058d6a4823eff86d472f187b176f0adf51ea7b69ea38be34be4a63cbbf91b0593c8 + languageName: node + linkType: hard + "core-js@npm:^3.21.1": - version: 3.25.5 - resolution: "core-js@npm:3.25.5" - checksum: 208b308c49bc022f90d4349d4c99802a73c9d55053976b3c529f10014c1e37845926defad8c519f2c7f71ea0acf18d2b323ab6aaee34dc85b4c4b3ced0623f3f + version: 3.25.3 + resolution: "core-js@npm:3.25.3" + checksum: 26ca0a5e575e6da03dc30099f48bc00db50a1c0a3f81299165f111cb163869ae453de5e345f2cb7bc8be85a9adcee11fca94f0fbdbdf6d483c68e1c55a9efc5a languageName: node linkType: hard @@ -3144,7 +3480,7 @@ __metadata: languageName: node linkType: hard -"cross-spawn@npm:^7.0.2, cross-spawn@npm:^7.0.3": +"cross-spawn@npm:^7.0.0, cross-spawn@npm:^7.0.2, cross-spawn@npm:^7.0.3": version: 7.0.3 resolution: "cross-spawn@npm:7.0.3" dependencies: @@ -3171,6 +3507,29 @@ __metadata: languageName: node linkType: hard +"cssom@npm:^0.5.0": + version: 0.5.0 + resolution: "cssom@npm:0.5.0" + checksum: 823471aa30091c59e0a305927c30e7768939b6af70405808f8d2ce1ca778cddcb24722717392438329d1691f9a87cb0183b64b8d779b56a961546d54854fde01 + languageName: node + linkType: hard + +"cssom@npm:~0.3.6": + version: 0.3.8 + resolution: "cssom@npm:0.3.8" + checksum: 24beb3087c76c0d52dd458be9ee1fbc80ac771478a9baef35dd258cdeb527c68eb43204dd439692bb2b1ae5272fa5f2946d10946edab0d04f1078f85e06bc7f6 + languageName: node + linkType: hard + +"cssstyle@npm:^2.3.0": + version: 2.3.0 + resolution: "cssstyle@npm:2.3.0" + dependencies: + cssom: ~0.3.6 + checksum: 5f05e6fd2e3df0b44695c2f08b9ef38b011862b274e320665176467c0725e44a53e341bc4959a41176e83b66064ab786262e7380fd1cabeae6efee0d255bb4e3 + languageName: node + linkType: hard + "csstype@npm:^2.6.8": version: 2.6.21 resolution: "csstype@npm:2.6.21" @@ -3179,9 +3538,9 @@ __metadata: linkType: hard "csstype@npm:^3.1.0": - version: 3.1.1 - resolution: "csstype@npm:3.1.1" - checksum: 1f7b4f5fdd955b7444b18ebdddf3f5c699159f13e9cf8ac9027ae4a60ae226aef9bbb14a6e12ca7dba3358b007cee6354b116e720262867c398de6c955ea451d + version: 3.1.0 + resolution: "csstype@npm:3.1.0" + checksum: 644e986cefab86525f0b674a06889cfdbb1f117e5b7d1ce0fc55b0423ecc58807a1ea42ecc75c4f18999d14fc42d1d255f84662a45003a52bb5840e977eb2ffd languageName: node linkType: hard @@ -3199,6 +3558,17 @@ __metadata: languageName: node linkType: hard +"data-urls@npm:^3.0.2": + version: 3.0.2 + resolution: "data-urls@npm:3.0.2" + dependencies: + abab: ^2.0.6 + whatwg-mimetype: ^3.0.0 + whatwg-url: ^11.0.0 + checksum: 033fc3dd0fba6d24bc9a024ddcf9923691dd24f90a3d26f6545d6a2f71ec6956f93462f2cdf2183cc46f10dc01ed3bcb36731a8208456eb1a08147e571fe2a76 + languageName: node + linkType: hard + "dateformat@npm:^3.0.0": version: 3.0.3 resolution: "dateformat@npm:3.0.3" @@ -3267,6 +3637,13 @@ __metadata: languageName: node linkType: hard +"decimal.js@npm:^10.4.1": + version: 10.4.2 + resolution: "decimal.js@npm:10.4.2" + checksum: 536cd6816a3197f2e1aa3da4860856cb5a2db73f6fafe8cb3b924ccc63f9b7d78296acc13dccbd419bd958ccc6357921fb15467f883b37cab04bfba7044cada2 + languageName: node + linkType: hard + "decode-uri-component@npm:^0.2.0": version: 0.2.0 resolution: "decode-uri-component@npm:0.2.0" @@ -3283,6 +3660,15 @@ __metadata: languageName: node linkType: hard +"deep-eql@npm:^3.0.1": + version: 3.0.1 + resolution: "deep-eql@npm:3.0.1" + dependencies: + type-detect: ^4.0.0 + checksum: 4f4c9fb79eb994fb6e81d4aa8b063adc40c00f831588aa65e20857d5d52f15fb23034a6576ecf886f7ff6222d5ae42e71e9b7d57113e0715b1df7ea1e812b125 + languageName: node + linkType: hard + "deep-extend@npm:^0.6.0": version: 0.6.0 resolution: "deep-extend@npm:0.6.0" @@ -3290,7 +3676,7 @@ __metadata: languageName: node linkType: hard -"deep-is@npm:^0.1.3": +"deep-is@npm:^0.1.3, deep-is@npm:~0.1.3": version: 0.1.4 resolution: "deep-is@npm:0.1.4" checksum: edb65dd0d7d1b9c40b2f50219aef30e116cedd6fc79290e740972c132c09106d2e80aa0bc8826673dd5a00222d4179c84b36a790eef63a4c4bca75a37ef90804 @@ -3298,18 +3684,18 @@ __metadata: linkType: hard "deepmerge-ts@npm:^4.0.3": - version: 4.2.2 - resolution: "deepmerge-ts@npm:4.2.2" - checksum: 137c3650519d9b1a220db7e23a3f56304cd02e7f97b2b8392e2767251055a29318425bacdb2ab2ff175a4645f7179643acf0e038d5dafbfdbc11bdf322f79697 + version: 4.2.1 + resolution: "deepmerge-ts@npm:4.2.1" + checksum: 5fb2f4a6b0f2a637992ba226cb89c28b081575489f1adfcd6789d95bdfb5b8236c8c5aafc02e645fd04f16101bf7c3f3e7c58e523579c635649eb36cb113a3bb languageName: node linkType: hard "defaults@npm:^1.0.3": - version: 1.0.4 - resolution: "defaults@npm:1.0.4" + version: 1.0.3 + resolution: "defaults@npm:1.0.3" dependencies: clone: ^1.0.2 - checksum: 3a88b7a587fc076b84e60affad8b85245c01f60f38fc1d259e7ac1d89eb9ce6abb19e27215de46b98568dd5bc48471730b327637e6f20b0f1bc85cf00440c80a + checksum: 96e2112da6553d376afd5265ea7cbdb2a3b45535965d71ab8bb1da10c8126d168fdd5268799625324b368356d21ba2a7b3d4ec50961f11a47b7feb9de3d4413e languageName: node linkType: hard @@ -3418,6 +3804,13 @@ __metadata: languageName: node linkType: hard +"dom-event-types@npm:^1.0.0": + version: 1.1.0 + resolution: "dom-event-types@npm:1.1.0" + checksum: 58bb4d4b3a0caf719ce42ab8445576b6309d43a3db3ca45ca3dabaa4d69d99472e75b89127c25a177fe8fd7b390530fc43cb1252d57ab25d7e4845ed647cb159 + languageName: node + linkType: hard + "dom-serializer@npm:^1.0.1": version: 1.4.1 resolution: "dom-serializer@npm:1.4.1" @@ -3436,6 +3829,15 @@ __metadata: languageName: node linkType: hard +"domexception@npm:^4.0.0": + version: 4.0.0 + resolution: "domexception@npm:4.0.0" + dependencies: + webidl-conversions: ^7.0.0 + checksum: ddbc1268edf33a8ba02ccc596735ede80375ee0cf124b30d2f05df5b464ba78ef4f49889b6391df4a04954e63d42d5631c7fcf8b1c4f12bc531252977a5f13d5 + languageName: node + linkType: hard + "domhandler@npm:^4.0.0, domhandler@npm:^4.2.0, domhandler@npm:^4.2.2": version: 4.3.1 resolution: "domhandler@npm:4.3.1" @@ -3481,6 +3883,20 @@ __metadata: languageName: node linkType: hard +"editorconfig@npm:^0.15.3": + version: 0.15.3 + resolution: "editorconfig@npm:0.15.3" + dependencies: + commander: ^2.19.0 + lru-cache: ^4.1.5 + semver: ^5.6.0 + sigmund: ^1.0.1 + bin: + editorconfig: bin/editorconfig + checksum: a94afeda19f12a4bcc4a573f0858df13dd3a2d1a3268cc0f17a6326ebe7ddd6cb0c026f8e4e73c17d34f3892bf6f8b561512d9841e70063f61da71b4c57dc5f0 + languageName: node + linkType: hard + "emoji-regex@npm:^8.0.0": version: 8.0.0 resolution: "emoji-regex@npm:8.0.0" @@ -3527,6 +3943,13 @@ __metadata: languageName: node linkType: hard +"entities@npm:^4.4.0": + version: 4.4.0 + resolution: "entities@npm:4.4.0" + checksum: 84d250329f4b56b40fa93ed067b194db21e8815e4eb9b59f43a086f0ecd342814f6bc483de8a77da5d64e0f626033192b1b4f1792232a7ea6b970ebe0f3187c2 + languageName: node + linkType: hard + "env-ci@npm:^5.0.0": version: 5.5.0 resolution: "env-ci@npm:5.5.0" @@ -3562,34 +3985,33 @@ __metadata: linkType: hard "es-abstract@npm:^1.19.0, es-abstract@npm:^1.19.1, es-abstract@npm:^1.19.2, es-abstract@npm:^1.19.5": - version: 1.20.4 - resolution: "es-abstract@npm:1.20.4" + version: 1.20.1 + resolution: "es-abstract@npm:1.20.1" dependencies: call-bind: ^1.0.2 es-to-primitive: ^1.2.1 function-bind: ^1.1.1 function.prototype.name: ^1.1.5 - get-intrinsic: ^1.1.3 + get-intrinsic: ^1.1.1 get-symbol-description: ^1.0.0 has: ^1.0.3 has-property-descriptors: ^1.0.0 has-symbols: ^1.0.3 internal-slot: ^1.0.3 - is-callable: ^1.2.7 + is-callable: ^1.2.4 is-negative-zero: ^2.0.2 is-regex: ^1.1.4 is-shared-array-buffer: ^1.0.2 is-string: ^1.0.7 is-weakref: ^1.0.2 - object-inspect: ^1.12.2 + object-inspect: ^1.12.0 object-keys: ^1.1.1 - object.assign: ^4.1.4 + object.assign: ^4.1.2 regexp.prototype.flags: ^1.4.3 - safe-regex-test: ^1.0.0 string.prototype.trimend: ^1.0.5 string.prototype.trimstart: ^1.0.5 unbox-primitive: ^1.0.2 - checksum: 89297cc785c31aedf961a603d5a07ed16471e435d3a1b6d070b54f157cf48454b95cda2ac55e4b86ff4fe3276e835fcffd2771578e6fa634337da49b26826141 + checksum: 28da27ae0ed9c76df7ee8ef5c278df79dcfdb554415faf7068bb7c58f8ba8e2a16bfb59e586844be6429ab4c302ca7748979d48442224cb1140b051866d74b7f languageName: node linkType: hard @@ -3620,9 +4042,16 @@ __metadata: languageName: node linkType: hard -"esbuild-android-64@npm:0.15.10": - version: 0.15.10 - resolution: "esbuild-android-64@npm:0.15.10" +"esbuild-android-64@npm:0.15.12": + version: 0.15.12 + resolution: "esbuild-android-64@npm:0.15.12" + conditions: os=android & cpu=x64 + languageName: node + linkType: hard + +"esbuild-android-64@npm:0.15.7": + version: 0.15.7 + resolution: "esbuild-android-64@npm:0.15.7" conditions: os=android & cpu=x64 languageName: node linkType: hard @@ -3634,9 +4063,16 @@ __metadata: languageName: node linkType: hard -"esbuild-android-arm64@npm:0.15.10": - version: 0.15.10 - resolution: "esbuild-android-arm64@npm:0.15.10" +"esbuild-android-arm64@npm:0.15.12": + version: 0.15.12 + resolution: "esbuild-android-arm64@npm:0.15.12" + conditions: os=android & cpu=arm64 + languageName: node + linkType: hard + +"esbuild-android-arm64@npm:0.15.7": + version: 0.15.7 + resolution: "esbuild-android-arm64@npm:0.15.7" conditions: os=android & cpu=arm64 languageName: node linkType: hard @@ -3648,9 +4084,16 @@ __metadata: languageName: node linkType: hard -"esbuild-darwin-64@npm:0.15.10": - version: 0.15.10 - resolution: "esbuild-darwin-64@npm:0.15.10" +"esbuild-darwin-64@npm:0.15.12": + version: 0.15.12 + resolution: "esbuild-darwin-64@npm:0.15.12" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + +"esbuild-darwin-64@npm:0.15.7": + version: 0.15.7 + resolution: "esbuild-darwin-64@npm:0.15.7" conditions: os=darwin & cpu=x64 languageName: node linkType: hard @@ -3662,9 +4105,16 @@ __metadata: languageName: node linkType: hard -"esbuild-darwin-arm64@npm:0.15.10": - version: 0.15.10 - resolution: "esbuild-darwin-arm64@npm:0.15.10" +"esbuild-darwin-arm64@npm:0.15.12": + version: 0.15.12 + resolution: "esbuild-darwin-arm64@npm:0.15.12" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + +"esbuild-darwin-arm64@npm:0.15.7": + version: 0.15.7 + resolution: "esbuild-darwin-arm64@npm:0.15.7" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard @@ -3676,9 +4126,16 @@ __metadata: languageName: node linkType: hard -"esbuild-freebsd-64@npm:0.15.10": - version: 0.15.10 - resolution: "esbuild-freebsd-64@npm:0.15.10" +"esbuild-freebsd-64@npm:0.15.12": + version: 0.15.12 + resolution: "esbuild-freebsd-64@npm:0.15.12" + conditions: os=freebsd & cpu=x64 + languageName: node + linkType: hard + +"esbuild-freebsd-64@npm:0.15.7": + version: 0.15.7 + resolution: "esbuild-freebsd-64@npm:0.15.7" conditions: os=freebsd & cpu=x64 languageName: node linkType: hard @@ -3690,9 +4147,16 @@ __metadata: languageName: node linkType: hard -"esbuild-freebsd-arm64@npm:0.15.10": - version: 0.15.10 - resolution: "esbuild-freebsd-arm64@npm:0.15.10" +"esbuild-freebsd-arm64@npm:0.15.12": + version: 0.15.12 + resolution: "esbuild-freebsd-arm64@npm:0.15.12" + conditions: os=freebsd & cpu=arm64 + languageName: node + linkType: hard + +"esbuild-freebsd-arm64@npm:0.15.7": + version: 0.15.7 + resolution: "esbuild-freebsd-arm64@npm:0.15.7" conditions: os=freebsd & cpu=arm64 languageName: node linkType: hard @@ -3704,9 +4168,16 @@ __metadata: languageName: node linkType: hard -"esbuild-linux-32@npm:0.15.10": - version: 0.15.10 - resolution: "esbuild-linux-32@npm:0.15.10" +"esbuild-linux-32@npm:0.15.12": + version: 0.15.12 + resolution: "esbuild-linux-32@npm:0.15.12" + conditions: os=linux & cpu=ia32 + languageName: node + linkType: hard + +"esbuild-linux-32@npm:0.15.7": + version: 0.15.7 + resolution: "esbuild-linux-32@npm:0.15.7" conditions: os=linux & cpu=ia32 languageName: node linkType: hard @@ -3718,9 +4189,16 @@ __metadata: languageName: node linkType: hard -"esbuild-linux-64@npm:0.15.10": - version: 0.15.10 - resolution: "esbuild-linux-64@npm:0.15.10" +"esbuild-linux-64@npm:0.15.12": + version: 0.15.12 + resolution: "esbuild-linux-64@npm:0.15.12" + conditions: os=linux & cpu=x64 + languageName: node + linkType: hard + +"esbuild-linux-64@npm:0.15.7": + version: 0.15.7 + resolution: "esbuild-linux-64@npm:0.15.7" conditions: os=linux & cpu=x64 languageName: node linkType: hard @@ -3732,9 +4210,16 @@ __metadata: languageName: node linkType: hard -"esbuild-linux-arm64@npm:0.15.10": - version: 0.15.10 - resolution: "esbuild-linux-arm64@npm:0.15.10" +"esbuild-linux-arm64@npm:0.15.12": + version: 0.15.12 + resolution: "esbuild-linux-arm64@npm:0.15.12" + conditions: os=linux & cpu=arm64 + languageName: node + linkType: hard + +"esbuild-linux-arm64@npm:0.15.7": + version: 0.15.7 + resolution: "esbuild-linux-arm64@npm:0.15.7" conditions: os=linux & cpu=arm64 languageName: node linkType: hard @@ -3746,9 +4231,16 @@ __metadata: languageName: node linkType: hard -"esbuild-linux-arm@npm:0.15.10": - version: 0.15.10 - resolution: "esbuild-linux-arm@npm:0.15.10" +"esbuild-linux-arm@npm:0.15.12": + version: 0.15.12 + resolution: "esbuild-linux-arm@npm:0.15.12" + conditions: os=linux & cpu=arm + languageName: node + linkType: hard + +"esbuild-linux-arm@npm:0.15.7": + version: 0.15.7 + resolution: "esbuild-linux-arm@npm:0.15.7" conditions: os=linux & cpu=arm languageName: node linkType: hard @@ -3760,9 +4252,16 @@ __metadata: languageName: node linkType: hard -"esbuild-linux-mips64le@npm:0.15.10": - version: 0.15.10 - resolution: "esbuild-linux-mips64le@npm:0.15.10" +"esbuild-linux-mips64le@npm:0.15.12": + version: 0.15.12 + resolution: "esbuild-linux-mips64le@npm:0.15.12" + conditions: os=linux & cpu=mips64el + languageName: node + linkType: hard + +"esbuild-linux-mips64le@npm:0.15.7": + version: 0.15.7 + resolution: "esbuild-linux-mips64le@npm:0.15.7" conditions: os=linux & cpu=mips64el languageName: node linkType: hard @@ -3774,9 +4273,16 @@ __metadata: languageName: node linkType: hard -"esbuild-linux-ppc64le@npm:0.15.10": - version: 0.15.10 - resolution: "esbuild-linux-ppc64le@npm:0.15.10" +"esbuild-linux-ppc64le@npm:0.15.12": + version: 0.15.12 + resolution: "esbuild-linux-ppc64le@npm:0.15.12" + conditions: os=linux & cpu=ppc64 + languageName: node + linkType: hard + +"esbuild-linux-ppc64le@npm:0.15.7": + version: 0.15.7 + resolution: "esbuild-linux-ppc64le@npm:0.15.7" conditions: os=linux & cpu=ppc64 languageName: node linkType: hard @@ -3788,9 +4294,16 @@ __metadata: languageName: node linkType: hard -"esbuild-linux-riscv64@npm:0.15.10": - version: 0.15.10 - resolution: "esbuild-linux-riscv64@npm:0.15.10" +"esbuild-linux-riscv64@npm:0.15.12": + version: 0.15.12 + resolution: "esbuild-linux-riscv64@npm:0.15.12" + conditions: os=linux & cpu=riscv64 + languageName: node + linkType: hard + +"esbuild-linux-riscv64@npm:0.15.7": + version: 0.15.7 + resolution: "esbuild-linux-riscv64@npm:0.15.7" conditions: os=linux & cpu=riscv64 languageName: node linkType: hard @@ -3802,9 +4315,16 @@ __metadata: languageName: node linkType: hard -"esbuild-linux-s390x@npm:0.15.10": - version: 0.15.10 - resolution: "esbuild-linux-s390x@npm:0.15.10" +"esbuild-linux-s390x@npm:0.15.12": + version: 0.15.12 + resolution: "esbuild-linux-s390x@npm:0.15.12" + conditions: os=linux & cpu=s390x + languageName: node + linkType: hard + +"esbuild-linux-s390x@npm:0.15.7": + version: 0.15.7 + resolution: "esbuild-linux-s390x@npm:0.15.7" conditions: os=linux & cpu=s390x languageName: node linkType: hard @@ -3816,9 +4336,16 @@ __metadata: languageName: node linkType: hard -"esbuild-netbsd-64@npm:0.15.10": - version: 0.15.10 - resolution: "esbuild-netbsd-64@npm:0.15.10" +"esbuild-netbsd-64@npm:0.15.12": + version: 0.15.12 + resolution: "esbuild-netbsd-64@npm:0.15.12" + conditions: os=netbsd & cpu=x64 + languageName: node + linkType: hard + +"esbuild-netbsd-64@npm:0.15.7": + version: 0.15.7 + resolution: "esbuild-netbsd-64@npm:0.15.7" conditions: os=netbsd & cpu=x64 languageName: node linkType: hard @@ -3830,9 +4357,16 @@ __metadata: languageName: node linkType: hard -"esbuild-openbsd-64@npm:0.15.10": - version: 0.15.10 - resolution: "esbuild-openbsd-64@npm:0.15.10" +"esbuild-openbsd-64@npm:0.15.12": + version: 0.15.12 + resolution: "esbuild-openbsd-64@npm:0.15.12" + conditions: os=openbsd & cpu=x64 + languageName: node + linkType: hard + +"esbuild-openbsd-64@npm:0.15.7": + version: 0.15.7 + resolution: "esbuild-openbsd-64@npm:0.15.7" conditions: os=openbsd & cpu=x64 languageName: node linkType: hard @@ -3844,9 +4378,16 @@ __metadata: languageName: node linkType: hard -"esbuild-sunos-64@npm:0.15.10": - version: 0.15.10 - resolution: "esbuild-sunos-64@npm:0.15.10" +"esbuild-sunos-64@npm:0.15.12": + version: 0.15.12 + resolution: "esbuild-sunos-64@npm:0.15.12" + conditions: os=sunos & cpu=x64 + languageName: node + linkType: hard + +"esbuild-sunos-64@npm:0.15.7": + version: 0.15.7 + resolution: "esbuild-sunos-64@npm:0.15.7" conditions: os=sunos & cpu=x64 languageName: node linkType: hard @@ -3858,9 +4399,16 @@ __metadata: languageName: node linkType: hard -"esbuild-windows-32@npm:0.15.10": - version: 0.15.10 - resolution: "esbuild-windows-32@npm:0.15.10" +"esbuild-windows-32@npm:0.15.12": + version: 0.15.12 + resolution: "esbuild-windows-32@npm:0.15.12" + conditions: os=win32 & cpu=ia32 + languageName: node + linkType: hard + +"esbuild-windows-32@npm:0.15.7": + version: 0.15.7 + resolution: "esbuild-windows-32@npm:0.15.7" conditions: os=win32 & cpu=ia32 languageName: node linkType: hard @@ -3872,9 +4420,16 @@ __metadata: languageName: node linkType: hard -"esbuild-windows-64@npm:0.15.10": - version: 0.15.10 - resolution: "esbuild-windows-64@npm:0.15.10" +"esbuild-windows-64@npm:0.15.12": + version: 0.15.12 + resolution: "esbuild-windows-64@npm:0.15.12" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + +"esbuild-windows-64@npm:0.15.7": + version: 0.15.7 + resolution: "esbuild-windows-64@npm:0.15.7" conditions: os=win32 & cpu=x64 languageName: node linkType: hard @@ -3886,9 +4441,16 @@ __metadata: languageName: node linkType: hard -"esbuild-windows-arm64@npm:0.15.10": - version: 0.15.10 - resolution: "esbuild-windows-arm64@npm:0.15.10" +"esbuild-windows-arm64@npm:0.15.12": + version: 0.15.12 + resolution: "esbuild-windows-arm64@npm:0.15.12" + conditions: os=win32 & cpu=arm64 + languageName: node + linkType: hard + +"esbuild-windows-arm64@npm:0.15.7": + version: 0.15.7 + resolution: "esbuild-windows-arm64@npm:0.15.7" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard @@ -3967,32 +4529,106 @@ __metadata: languageName: node linkType: hard +"esbuild@npm:^0.15.6": + version: 0.15.7 + resolution: "esbuild@npm:0.15.7" + dependencies: + "@esbuild/linux-loong64": 0.15.7 + esbuild-android-64: 0.15.7 + esbuild-android-arm64: 0.15.7 + esbuild-darwin-64: 0.15.7 + esbuild-darwin-arm64: 0.15.7 + esbuild-freebsd-64: 0.15.7 + esbuild-freebsd-arm64: 0.15.7 + esbuild-linux-32: 0.15.7 + esbuild-linux-64: 0.15.7 + esbuild-linux-arm: 0.15.7 + esbuild-linux-arm64: 0.15.7 + esbuild-linux-mips64le: 0.15.7 + esbuild-linux-ppc64le: 0.15.7 + esbuild-linux-riscv64: 0.15.7 + esbuild-linux-s390x: 0.15.7 + esbuild-netbsd-64: 0.15.7 + esbuild-openbsd-64: 0.15.7 + esbuild-sunos-64: 0.15.7 + esbuild-windows-32: 0.15.7 + esbuild-windows-64: 0.15.7 + esbuild-windows-arm64: 0.15.7 + dependenciesMeta: + "@esbuild/linux-loong64": + optional: true + esbuild-android-64: + optional: true + esbuild-android-arm64: + optional: true + esbuild-darwin-64: + optional: true + esbuild-darwin-arm64: + optional: true + esbuild-freebsd-64: + optional: true + esbuild-freebsd-arm64: + optional: true + esbuild-linux-32: + optional: true + esbuild-linux-64: + optional: true + esbuild-linux-arm: + optional: true + esbuild-linux-arm64: + optional: true + esbuild-linux-mips64le: + optional: true + esbuild-linux-ppc64le: + optional: true + esbuild-linux-riscv64: + optional: true + esbuild-linux-s390x: + optional: true + esbuild-netbsd-64: + optional: true + esbuild-openbsd-64: + optional: true + esbuild-sunos-64: + optional: true + esbuild-windows-32: + optional: true + esbuild-windows-64: + optional: true + esbuild-windows-arm64: + optional: true + bin: + esbuild: bin/esbuild + checksum: 54ddaa6cf96798d817861b4f68cb8d176075dc09b6e0ed511c57e5db6fd86d2c673ac2ec631ad9b11678d58ad4a77cd6b7a3853b9c6eac29b7f5c6d38e42f92e + languageName: node + linkType: hard + "esbuild@npm:^0.15.9": - version: 0.15.10 - resolution: "esbuild@npm:0.15.10" - dependencies: - "@esbuild/android-arm": 0.15.10 - "@esbuild/linux-loong64": 0.15.10 - esbuild-android-64: 0.15.10 - esbuild-android-arm64: 0.15.10 - esbuild-darwin-64: 0.15.10 - esbuild-darwin-arm64: 0.15.10 - esbuild-freebsd-64: 0.15.10 - esbuild-freebsd-arm64: 0.15.10 - esbuild-linux-32: 0.15.10 - esbuild-linux-64: 0.15.10 - esbuild-linux-arm: 0.15.10 - esbuild-linux-arm64: 0.15.10 - esbuild-linux-mips64le: 0.15.10 - esbuild-linux-ppc64le: 0.15.10 - esbuild-linux-riscv64: 0.15.10 - esbuild-linux-s390x: 0.15.10 - esbuild-netbsd-64: 0.15.10 - esbuild-openbsd-64: 0.15.10 - esbuild-sunos-64: 0.15.10 - esbuild-windows-32: 0.15.10 - esbuild-windows-64: 0.15.10 - esbuild-windows-arm64: 0.15.10 + version: 0.15.12 + resolution: "esbuild@npm:0.15.12" + dependencies: + "@esbuild/android-arm": 0.15.12 + "@esbuild/linux-loong64": 0.15.12 + esbuild-android-64: 0.15.12 + esbuild-android-arm64: 0.15.12 + esbuild-darwin-64: 0.15.12 + esbuild-darwin-arm64: 0.15.12 + esbuild-freebsd-64: 0.15.12 + esbuild-freebsd-arm64: 0.15.12 + esbuild-linux-32: 0.15.12 + esbuild-linux-64: 0.15.12 + esbuild-linux-arm: 0.15.12 + esbuild-linux-arm64: 0.15.12 + esbuild-linux-mips64le: 0.15.12 + esbuild-linux-ppc64le: 0.15.12 + esbuild-linux-riscv64: 0.15.12 + esbuild-linux-s390x: 0.15.12 + esbuild-netbsd-64: 0.15.12 + esbuild-openbsd-64: 0.15.12 + esbuild-sunos-64: 0.15.12 + esbuild-windows-32: 0.15.12 + esbuild-windows-64: 0.15.12 + esbuild-windows-arm64: 0.15.12 dependenciesMeta: "@esbuild/android-arm": optional: true @@ -4040,7 +4676,7 @@ __metadata: optional: true bin: esbuild: bin/esbuild - checksum: bc2daadb952c527e7ab0a972fd4f79071c9fd3d948cd97290d3de8811b6b7fc0abc43fb20116dffa24dc923550f4fe7b0d930ff6418ae7dfbff3034c1a01d59a + checksum: b344d52c57616917719ac2fa38a58eba7d3c9d2a295116272b3e16a4f6327dc42549274c06560d301f9235a6fe31ccb45499b31d04820dfb8527d89d9766a2ad languageName: node linkType: hard @@ -4072,6 +4708,25 @@ __metadata: languageName: node linkType: hard +"escodegen@npm:^2.0.0": + version: 2.0.0 + resolution: "escodegen@npm:2.0.0" + dependencies: + esprima: ^4.0.1 + estraverse: ^5.2.0 + esutils: ^2.0.2 + optionator: ^0.8.1 + source-map: ~0.6.1 + dependenciesMeta: + source-map: + optional: true + bin: + escodegen: bin/escodegen.js + esgenerate: bin/esgenerate.js + checksum: 5aa6b2966fafe0545e4e77936300cc94ad57cfe4dc4ebff9950492eaba83eef634503f12d7e3cbd644ecc1bab388ad0e92b06fd32222c9281a75d1cf02ec6cef + languageName: node + linkType: hard + "eslint-config-prettier@npm:^8.3.0, eslint-config-prettier@npm:^8.5.0": version: 8.5.0 resolution: "eslint-config-prettier@npm:8.5.0" @@ -4118,8 +4773,8 @@ __metadata: linkType: hard "eslint-plugin-functional@npm:^4.2.2": - version: 4.4.1 - resolution: "eslint-plugin-functional@npm:4.4.1" + version: 4.4.0 + resolution: "eslint-plugin-functional@npm:4.4.0" dependencies: "@typescript-eslint/utils": ^5.10.2 deepmerge-ts: ^4.0.3 @@ -4134,7 +4789,7 @@ __metadata: optional: true typescript: optional: true - checksum: 00a6001e86db6294f93ba409a5fb9a88d218049460fdf2cfbd4d67ce08884382cf84b66cf536154d764d5db5c51e1747bbaa257cec17a602575d1a9fa9b91db8 + checksum: a535e3dc775112d914728af7dda04798d9870d2ef5aed39f861700712a0d45ba0417543ec6fd41f1c6fa1861d21af3d3306ba0f604a3435c92a32a41abdf1d4c languageName: node linkType: hard @@ -4177,8 +4832,8 @@ __metadata: linkType: hard "eslint-plugin-vue@npm:^9.4.0": - version: 9.6.0 - resolution: "eslint-plugin-vue@npm:9.6.0" + version: 9.5.1 + resolution: "eslint-plugin-vue@npm:9.5.1" dependencies: eslint-utils: ^3.0.0 natural-compare: ^1.4.0 @@ -4189,7 +4844,7 @@ __metadata: xml-name-validator: ^4.0.0 peerDependencies: eslint: ^6.2.0 || ^7.0.0 || ^8.0.0 - checksum: fcfb333b09af4d1db027f8a52b7ffdf0ebaa649f5738b7a6124bd02aaa1e075daaaa97e490a863667dda16c79e1d37688a8311d7685b9a63d3c4c0dd5f1d9622 + checksum: 36433328710c241bf363291859b6caf1c74dd18d75b1b1fe5bac9706e4d612e3dea79eef5acccf06b2df9d9b3faf9343c1b3e1d9edbf6465fd9752f3c0a87ee4 languageName: node linkType: hard @@ -4239,11 +4894,12 @@ __metadata: linkType: hard "eslint@npm:^8.23.0": - version: 8.25.0 - resolution: "eslint@npm:8.25.0" + version: 8.24.0 + resolution: "eslint@npm:8.24.0" dependencies: - "@eslint/eslintrc": ^1.3.3 + "@eslint/eslintrc": ^1.3.2 "@humanwhocodes/config-array": ^0.10.5 + "@humanwhocodes/gitignore-to-minimatch": ^1.0.2 "@humanwhocodes/module-importer": ^1.0.1 ajv: ^6.10.0 chalk: ^4.0.0 @@ -4282,7 +4938,7 @@ __metadata: text-table: ^0.2.0 bin: eslint: bin/eslint.js - checksum: 7acf2693b522b573657b53d2245b5522d3a131e4224b1cbf01e2c3579632fdbf62599284f68bc483e6e4eba23ae3643c9544744e0214a86e727cc361cedcd0fa + checksum: ca293ce7116599b742d7ab4d43db469beec22f40dd272092d809498be3cff3a7c567769f9763bdf6799aac13dd53447b93a99629b7b54092783046eb57eaced6 languageName: node linkType: hard @@ -4405,6 +5061,15 @@ __metadata: languageName: node linkType: hard +"extend-shallow@npm:^2.0.1": + version: 2.0.1 + resolution: "extend-shallow@npm:2.0.1" + dependencies: + is-extendable: ^0.1.0 + checksum: 8fb58d9d7a511f4baf78d383e637bd7d2e80843bd9cd0853649108ea835208fb614da502a553acc30208e1325240bb7cc4a68473021612496bb89725483656d8 + languageName: node + linkType: hard + "fast-deep-equal@npm:^3.1.1, fast-deep-equal@npm:^3.1.3": version: 3.1.3 resolution: "fast-deep-equal@npm:3.1.3" @@ -4419,7 +5084,7 @@ __metadata: languageName: node linkType: hard -"fast-glob@npm:^3.2.11, fast-glob@npm:^3.2.12, fast-glob@npm:^3.2.9": +"fast-glob@npm:^3.2.11, fast-glob@npm:^3.2.12": version: 3.2.12 resolution: "fast-glob@npm:3.2.12" dependencies: @@ -4432,6 +5097,19 @@ __metadata: languageName: node linkType: hard +"fast-glob@npm:^3.2.9": + version: 3.2.11 + resolution: "fast-glob@npm:3.2.11" + dependencies: + "@nodelib/fs.stat": ^2.0.2 + "@nodelib/fs.walk": ^1.2.3 + glob-parent: ^5.1.2 + merge2: ^1.3.0 + micromatch: ^4.0.4 + checksum: f473105324a7780a20c06de842e15ddbb41d3cb7e71d1e4fe6e8373204f22245d54f5ab9e2061e6a1c613047345954d29b022e0e76f5c28b1df9858179a0e6d7 + languageName: node + linkType: hard + "fast-json-stable-stringify@npm:^2.0.0": version: 2.1.0 resolution: "fast-json-stable-stringify@npm:2.1.0" @@ -4439,7 +5117,7 @@ __metadata: languageName: node linkType: hard -"fast-levenshtein@npm:^2.0.6": +"fast-levenshtein@npm:^2.0.6, fast-levenshtein@npm:~2.0.6": version: 2.0.6 resolution: "fast-levenshtein@npm:2.0.6" checksum: 92cfec0a8dfafd9c7a15fba8f2cc29cd0b62b85f056d99ce448bbcd9f708e18ab2764bda4dd5158364f4145a7c72788538994f0d1787b956ef0d1062b0f7c24c @@ -4597,6 +5275,16 @@ __metadata: languageName: node linkType: hard +"foreground-child@npm:^2.0.0": + version: 2.0.0 + resolution: "foreground-child@npm:2.0.0" + dependencies: + cross-spawn: ^7.0.0 + signal-exit: ^3.0.2 + checksum: f77ec9aff621abd6b754cb59e690743e7639328301fbea6ff09df27d2befaf7dd5b77cec51c32323d73a81a7d91caaf9413990d305cbe3d873eec4fe58960956 + languageName: node + linkType: hard + "form-data@npm:^4.0.0": version: 4.0.0 resolution: "form-data@npm:4.0.0" @@ -4699,6 +5387,13 @@ __metadata: languageName: node linkType: hard +"functional-red-black-tree@npm:^1.0.1": + version: 1.0.1 + resolution: "functional-red-black-tree@npm:1.0.1" + checksum: ca6c170f37640e2d94297da8bb4bf27a1d12bea3e00e6a3e007fd7aa32e37e000f5772acf941b4e4f3cf1c95c3752033d0c509af157ad8f526e7f00723b9eb9f + languageName: node + linkType: hard + "functions-have-names@npm:^1.2.2": version: 1.2.3 resolution: "functions-have-names@npm:1.2.3" @@ -4729,14 +5424,21 @@ __metadata: languageName: node linkType: hard -"get-intrinsic@npm:^1.0.2, get-intrinsic@npm:^1.1.0, get-intrinsic@npm:^1.1.1, get-intrinsic@npm:^1.1.3": - version: 1.1.3 - resolution: "get-intrinsic@npm:1.1.3" +"get-func-name@npm:^2.0.0": + version: 2.0.0 + resolution: "get-func-name@npm:2.0.0" + checksum: 8d82e69f3e7fab9e27c547945dfe5cc0c57fc0adf08ce135dddb01081d75684a03e7a0487466f478872b341d52ac763ae49e660d01ab83741f74932085f693c3 + languageName: node + linkType: hard + +"get-intrinsic@npm:^1.0.2, get-intrinsic@npm:^1.1.0, get-intrinsic@npm:^1.1.1": + version: 1.1.2 + resolution: "get-intrinsic@npm:1.1.2" dependencies: function-bind: ^1.1.1 has: ^1.0.3 has-symbols: ^1.0.3 - checksum: 152d79e87251d536cf880ba75cfc3d6c6c50e12b3a64e1ea960e73a3752b47c69f46034456eae1b0894359ce3bc64c55c186f2811f8a788b75b638b06fab228a + checksum: 252f45491f2ba88ebf5b38018020c7cc3279de54b1d67ffb70c0cdf1dfa8ab31cd56467b5d117a8b4275b7a4dde91f86766b163a17a850f036528a7b2faafb2b languageName: node linkType: hard @@ -4798,7 +5500,7 @@ __metadata: languageName: node linkType: hard -"glob@npm:*, glob@npm:^8.0.1": +"glob@npm:*, glob@npm:^8.0.1, glob@npm:^8.0.3": version: 8.0.3 resolution: "glob@npm:8.0.3" dependencies: @@ -4943,7 +5645,7 @@ __metadata: languageName: node linkType: hard -"has-symbols@npm:^1.0.2, has-symbols@npm:^1.0.3": +"has-symbols@npm:^1.0.1, has-symbols@npm:^1.0.2, has-symbols@npm:^1.0.3": version: 1.0.3 resolution: "has-symbols@npm:1.0.3" checksum: a054c40c631c0d5741a8285010a0777ea0c068f99ed43e5d6eb12972da223f8af553a455132fdb0801bdcfa0e0f443c0c03a68d8555aa529b3144b446c3f2410 @@ -5001,12 +5703,12 @@ __metadata: languageName: node linkType: hard -"hosted-git-info@npm:*": - version: 6.0.0 - resolution: "hosted-git-info@npm:6.0.0" +"hosted-git-info@npm:*, hosted-git-info@npm:^5.0.0, hosted-git-info@npm:^5.1.0": + version: 5.1.0 + resolution: "hosted-git-info@npm:5.1.0" dependencies: lru-cache: ^7.5.1 - checksum: 85aeb79a1902416eab622ccffd61ccf428260b0f8949e02f5abe70ee2702b7af2bdd7a9b77e6573190464602d42bb05c4d8300873f86ce62bc450365398da1fb + checksum: 22abbc6a7418344c883e2df6e791e94b38192b2a61256b19c955999d878b8d5365ea51683fd1f0cc8f217e9bd121db88d5aaa7cf0407c4b7ff287b79aabacbd3 languageName: node linkType: hard @@ -5026,12 +5728,19 @@ __metadata: languageName: node linkType: hard -"hosted-git-info@npm:^5.0.0, hosted-git-info@npm:^5.1.0": - version: 5.1.0 - resolution: "hosted-git-info@npm:5.1.0" +"html-encoding-sniffer@npm:^3.0.0": + version: 3.0.0 + resolution: "html-encoding-sniffer@npm:3.0.0" dependencies: - lru-cache: ^7.5.1 - checksum: 22abbc6a7418344c883e2df6e791e94b38192b2a61256b19c955999d878b8d5365ea51683fd1f0cc8f217e9bd121db88d5aaa7cf0407c4b7ff287b79aabacbd3 + whatwg-encoding: ^2.0.0 + checksum: 8d806aa00487e279e5ccb573366a951a9f68f65c90298eac9c3a2b440a7ffe46615aff2995a2f61c6746c639234e6179a97e18ca5ccbbf93d3725ef2099a4502 + languageName: node + linkType: hard + +"html-escaper@npm:^2.0.0": + version: 2.0.2 + resolution: "html-escaper@npm:2.0.2" + checksum: d2df2da3ad40ca9ee3a39c5cc6475ef67c8f83c234475f24d8e9ce0dc80a2c82df8e1d6fa78ddd1e9022a586ea1bd247a615e80a5cd9273d90111ddda7d9e974 languageName: node linkType: hard @@ -5101,7 +5810,7 @@ __metadata: languageName: node linkType: hard -"https-proxy-agent@npm:^5.0.0": +"https-proxy-agent@npm:^5.0.0, https-proxy-agent@npm:^5.0.1": version: 5.0.1 resolution: "https-proxy-agent@npm:5.0.1" dependencies: @@ -5127,7 +5836,7 @@ __metadata: languageName: node linkType: hard -"iconv-lite@npm:^0.6.2": +"iconv-lite@npm:0.6.3, iconv-lite@npm:^0.6.2": version: 0.6.3 resolution: "iconv-lite@npm:0.6.3" dependencies: @@ -5235,7 +5944,7 @@ __metadata: languageName: node linkType: hard -"ini@npm:~1.3.0": +"ini@npm:^1.3.4, ini@npm:~1.3.0": version: 1.3.8 resolution: "ini@npm:1.3.8" checksum: dfd98b0ca3a4fc1e323e38a6c8eb8936e31a97a918d3b377649ea15bdb15d481207a0dda1021efbd86b464cae29a0d33c1d7dcaf6c5672bee17fa849bc50a1b3 @@ -5292,10 +6001,10 @@ __metadata: languageName: node linkType: hard -"ip@npm:^2.0.0": - version: 2.0.0 - resolution: "ip@npm:2.0.0" - checksum: cfcfac6b873b701996d71ec82a7dd27ba92450afdb421e356f44044ed688df04567344c36cbacea7d01b1c39a4c732dc012570ebe9bebfb06f27314bca625349 +"ip@npm:^1.1.5": + version: 1.1.8 + resolution: "ip@npm:1.1.8" + checksum: a2ade53eb339fb0cbe9e69a44caab10d6e3784662285eb5d2677117ee4facc33a64679051c35e0dfdb1a3983a51ce2f5d2cb36446d52e10d01881789b76e28fb languageName: node linkType: hard @@ -5334,10 +6043,17 @@ __metadata: languageName: node linkType: hard -"is-callable@npm:^1.1.4, is-callable@npm:^1.2.7": - version: 1.2.7 - resolution: "is-callable@npm:1.2.7" - checksum: 61fd57d03b0d984e2ed3720fb1c7a897827ea174bd44402878e059542ea8c4aeedee0ea0985998aa5cc2736b2fa6e271c08587addb5b3959ac52cf665173d1ac +"is-buffer@npm:^1.1.5": + version: 1.1.6 + resolution: "is-buffer@npm:1.1.6" + checksum: 4a186d995d8bbf9153b4bd9ff9fd04ae75068fe695d29025d25e592d9488911eeece84eefbd8fa41b8ddcc0711058a71d4c466dcf6f1f6e1d83830052d8ca707 + languageName: node + linkType: hard + +"is-callable@npm:^1.1.4, is-callable@npm:^1.2.4": + version: 1.2.4 + resolution: "is-callable@npm:1.2.4" + checksum: 1a28d57dc435797dae04b173b65d6d1e77d4f16276e9eff973f994eadcfdc30a017e6a597f092752a083c1103cceb56c91e3dadc6692fedb9898dfaba701575f languageName: node linkType: hard @@ -5359,7 +6075,7 @@ __metadata: languageName: node linkType: hard -"is-core-module@npm:^2.5.0, is-core-module@npm:^2.8.1, is-core-module@npm:^2.9.0": +"is-core-module@npm:^2.5.0, is-core-module@npm:^2.8.1": version: 2.10.0 resolution: "is-core-module@npm:2.10.0" dependencies: @@ -5368,6 +6084,15 @@ __metadata: languageName: node linkType: hard +"is-core-module@npm:^2.9.0": + version: 2.9.0 + resolution: "is-core-module@npm:2.9.0" + dependencies: + has: ^1.0.3 + checksum: b27034318b4b462f1c8f1dfb1b32baecd651d891a4e2d1922135daeff4141dfced2b82b07aef83ef54275c4a3526aa38da859223664d0868ca24182badb784ce + languageName: node + linkType: hard + "is-date-object@npm:^1.0.1": version: 1.0.5 resolution: "is-date-object@npm:1.0.5" @@ -5377,6 +6102,13 @@ __metadata: languageName: node linkType: hard +"is-extendable@npm:^0.1.0": + version: 0.1.1 + resolution: "is-extendable@npm:0.1.1" + checksum: 3875571d20a7563772ecc7a5f36cb03167e9be31ad259041b4a8f73f33f885441f778cee1f1fe0085eb4bc71679b9d8c923690003a36a6a5fdf8023e6e3f0672 + languageName: node + linkType: hard + "is-extglob@npm:^2.1.1": version: 2.1.1 resolution: "is-extglob@npm:2.1.1" @@ -5472,6 +6204,13 @@ __metadata: languageName: node linkType: hard +"is-potential-custom-element-name@npm:^1.0.1": + version: 1.0.1 + resolution: "is-potential-custom-element-name@npm:1.0.1" + checksum: ced7bbbb6433a5b684af581872afe0e1767e2d1146b2207ca0068a648fb5cab9d898495d1ac0583524faaf24ca98176a7d9876363097c2d14fee6dd324f3a1ab + languageName: node + linkType: hard + "is-regex@npm:^1.1.4": version: 1.1.4 resolution: "is-regex@npm:1.1.4" @@ -5550,6 +6289,13 @@ __metadata: languageName: node linkType: hard +"is-whitespace@npm:^0.3.0": + version: 0.3.0 + resolution: "is-whitespace@npm:0.3.0" + checksum: dac8fc9a9b797afeef703f625269601715552883790d1385d6bb27dd04ffdafd5fddca8f2d85ee96913850211595da2ba483dac1f166829c4078fb58ce815140 + languageName: node + linkType: hard + "isarray@npm:0.0.1": version: 0.0.1 resolution: "isarray@npm:0.0.1" @@ -5591,6 +6337,34 @@ __metadata: languageName: node linkType: hard +"istanbul-lib-coverage@npm:^3.0.0, istanbul-lib-coverage@npm:^3.2.0": + version: 3.2.0 + resolution: "istanbul-lib-coverage@npm:3.2.0" + checksum: a2a545033b9d56da04a8571ed05c8120bf10e9bce01cf8633a3a2b0d1d83dff4ac4fe78d6d5673c27fc29b7f21a41d75f83a36be09f82a61c367b56aa73c1ff9 + languageName: node + linkType: hard + +"istanbul-lib-report@npm:^3.0.0": + version: 3.0.0 + resolution: "istanbul-lib-report@npm:3.0.0" + dependencies: + istanbul-lib-coverage: ^3.0.0 + make-dir: ^3.0.0 + supports-color: ^7.1.0 + checksum: 3f29eb3f53c59b987386e07fe772d24c7f58c6897f34c9d7a296f4000de7ae3de9eb95c3de3df91dc65b134c84dee35c54eee572a56243e8907c48064e34ff1b + languageName: node + linkType: hard + +"istanbul-reports@npm:^3.1.4": + version: 3.1.5 + resolution: "istanbul-reports@npm:3.1.5" + dependencies: + html-escaper: ^2.0.0 + istanbul-lib-report: ^3.0.0 + checksum: 7867228f83ed39477b188ea07e7ccb9b4f5320b6f73d1db93a0981b7414fa4ef72d3f80c4692c442f90fc250d9406e71d8d7ab65bb615cb334e6292b73192b89 + languageName: node + linkType: hard + "java-properties@npm:^1.0.0": version: 1.0.2 resolution: "java-properties@npm:1.0.2" @@ -5608,9 +6382,9 @@ __metadata: linkType: hard "jose@npm:^4.6.0": - version: 4.10.0 - resolution: "jose@npm:4.10.0" - checksum: c575bf2519b758592b3037cac0da34ff2641e56a050b156fe6ab18c03cd6c22e5338d28d1fe3dd997c9b3c0cc7deda72faca4a93ff41274a587850c6519852d0 + version: 4.9.3 + resolution: "jose@npm:4.9.3" + checksum: 95865830768dcf82774d19e92dc854c5bc9dc5d9c9626a65a2974272e3aca5d2f56678611943f85802431d2d6d6f8bff9548b7cdb7578e6fe61529bd9c82e1d3 languageName: node linkType: hard @@ -5621,10 +6395,26 @@ __metadata: languageName: node linkType: hard +"js-beautify@npm:^1.6.12": + version: 1.14.7 + resolution: "js-beautify@npm:1.14.7" + dependencies: + config-chain: ^1.1.13 + editorconfig: ^0.15.3 + glob: ^8.0.3 + nopt: ^6.0.0 + bin: + css-beautify: js/bin/css-beautify.js + html-beautify: js/bin/html-beautify.js + js-beautify: js/bin/js-beautify.js + checksum: 1950d0d3f05f8ad06b73eb77b9aac602d00b24eab7d8a6d8ea0b1841ab9c730acecd5a6f3926e360dce7a2583481bc77caf6d024490a58fa9897cbbbdfc35984 + languageName: node + linkType: hard + "js-sdsl@npm:^4.1.4": - version: 4.1.5 - resolution: "js-sdsl@npm:4.1.5" - checksum: 695f657ddc5be462b97cac4e8e60f37de28d628ee0e23016baecff0bb584a18dddb5caeac537a775030f180b5afd62133ac4481e7024c8d03a62d73e4da0713e + version: 4.1.4 + resolution: "js-sdsl@npm:4.1.4" + checksum: 1977cea4ab18e0e03e28bdf0371d8b443fad65ca0988e0faa216406faf6bb943714fe8f7cc7a5bfe5f35ba3d94ddae399f4d10200f547f2c3320688b0670d726 languageName: node linkType: hard @@ -5646,6 +6436,54 @@ __metadata: languageName: node linkType: hard +"jsdom-global@npm:^3.0.2": + version: 3.0.2 + resolution: "jsdom-global@npm:3.0.2" + peerDependencies: + jsdom: ">=10.0.0" + checksum: 5c665a412c244d8cfe541da784ff6888c0ed041da3f4c03d7d4ab514215b3f50a934f89c33b543b7848765d841029978a2592dc04b2e0a8734b4bb54809e67d7 + languageName: node + linkType: hard + +"jsdom@npm:^20.0.1": + version: 20.0.2 + resolution: "jsdom@npm:20.0.2" + dependencies: + abab: ^2.0.6 + acorn: ^8.8.0 + acorn-globals: ^7.0.0 + cssom: ^0.5.0 + cssstyle: ^2.3.0 + data-urls: ^3.0.2 + decimal.js: ^10.4.1 + domexception: ^4.0.0 + escodegen: ^2.0.0 + form-data: ^4.0.0 + html-encoding-sniffer: ^3.0.0 + http-proxy-agent: ^5.0.0 + https-proxy-agent: ^5.0.1 + is-potential-custom-element-name: ^1.0.1 + nwsapi: ^2.2.2 + parse5: ^7.1.1 + saxes: ^6.0.0 + symbol-tree: ^3.2.4 + tough-cookie: ^4.1.2 + w3c-xmlserializer: ^3.0.0 + webidl-conversions: ^7.0.0 + whatwg-encoding: ^2.0.0 + whatwg-mimetype: ^3.0.0 + whatwg-url: ^11.0.0 + ws: ^8.9.0 + xml-name-validator: ^4.0.0 + peerDependencies: + canvas: ^2.5.0 + peerDependenciesMeta: + canvas: + optional: true + checksum: 1912e73ecbc7cb1e458b63c4976a1f1dd40c1cdb9f91559cfeccb08c68ad1b9918c6260bd021559ecb1a7c233fae0d0c3fdcbd2ce82df597ef9373d67c8934c0 + languageName: node + linkType: hard + "json-buffer@npm:3.0.1": version: 3.0.1 resolution: "json-buffer@npm:3.0.1" @@ -5660,14 +6498,7 @@ __metadata: languageName: node linkType: hard -"json-parse-even-better-errors@npm:*, json-parse-even-better-errors@npm:^3.0.0": - version: 3.0.0 - resolution: "json-parse-even-better-errors@npm:3.0.0" - checksum: f1970b5220c7fa23d888565510752c3d5e863f93668a202fcaa719739fa41485dfc6a1db212f702ebd3c873851cc067aebc2917e3f79763cae2fdb95046f38f3 - languageName: node - linkType: hard - -"json-parse-even-better-errors@npm:^2.3.0, json-parse-even-better-errors@npm:^2.3.1": +"json-parse-even-better-errors@npm:*, json-parse-even-better-errors@npm:^2.3.0, json-parse-even-better-errors@npm:^2.3.1": version: 2.3.1 resolution: "json-parse-even-better-errors@npm:2.3.1" checksum: 798ed4cf3354a2d9ccd78e86d2169515a0097a5c133337807cdf7f1fc32e1391d207ccfc276518cc1d7d8d4db93288b8a50ba4293d212ad1336e52a8ec0a941f @@ -5806,6 +6637,15 @@ __metadata: languageName: node linkType: hard +"kind-of@npm:^3.0.2": + version: 3.2.2 + resolution: "kind-of@npm:3.2.2" + dependencies: + is-buffer: ^1.1.5 + checksum: e898df8ca2f31038f27d24f0b8080da7be274f986bc6ed176f37c77c454d76627619e1681f6f9d2e8d2fd7557a18ecc419a6bb54e422abcbb8da8f1a75e4b386 + languageName: node + linkType: hard + "kind-of@npm:^6.0.3": version: 6.0.3 resolution: "kind-of@npm:6.0.3" @@ -5860,6 +6700,16 @@ __metadata: languageName: node linkType: hard +"levn@npm:~0.3.0": + version: 0.3.0 + resolution: "levn@npm:0.3.0" + dependencies: + prelude-ls: ~1.1.2 + type-check: ~0.3.2 + checksum: 0d084a524231a8246bb10fec48cdbb35282099f6954838604f3c7fc66f2e16fa66fd9cc2f3f20a541a113c4dafdf181e822c887c8a319c9195444e6c64ac395e + languageName: node + linkType: hard + "libnpmaccess@npm:*, libnpmaccess@npm:^6.0.4": version: 6.0.4 resolution: "libnpmaccess@npm:6.0.4" @@ -6169,6 +7019,15 @@ __metadata: languageName: node linkType: hard +"loupe@npm:^2.3.1": + version: 2.3.4 + resolution: "loupe@npm:2.3.4" + dependencies: + get-func-name: ^2.0.0 + checksum: 5af91db61aa18530f1749a64735ee194ac263e65e9f4d1562bf3036c591f1baa948289c193e0e34c7b5e2c1b75d3c1dc4fce87f5edb3cee10b0c0df46bc9ffb3 + languageName: node + linkType: hard + "lowdb@npm:^3.0.0": version: 3.0.0 resolution: "lowdb@npm:3.0.0" @@ -6185,6 +7044,16 @@ __metadata: languageName: node linkType: hard +"lru-cache@npm:^4.1.5": + version: 4.1.5 + resolution: "lru-cache@npm:4.1.5" + dependencies: + pseudomap: ^1.0.2 + yallist: ^2.1.2 + checksum: 4bb4b58a36cd7dc4dcec74cbe6a8f766a38b7426f1ff59d4cf7d82a2aa9b9565cd1cb98f6ff60ce5cd174524868d7bc9b7b1c294371851356066ca9ac4cf135a + languageName: node + linkType: hard + "lru-cache@npm:^6.0.0": version: 6.0.0 resolution: "lru-cache@npm:6.0.0" @@ -6194,13 +7063,20 @@ __metadata: languageName: node linkType: hard -"lru-cache@npm:^7.4.4, lru-cache@npm:^7.5.1, lru-cache@npm:^7.7.1": +"lru-cache@npm:^7.4.4, lru-cache@npm:^7.5.1": version: 7.14.0 resolution: "lru-cache@npm:7.14.0" checksum: efdd329f2c1bb790b71d497c6c59272e6bc2d7dd060ba55fc136becd3dd31fc8346edb446275504d94cb60d3c8385dbf5267b79b23789e409b2bdf302d13f0d7 languageName: node linkType: hard +"lru-cache@npm:^7.7.1": + version: 7.10.1 + resolution: "lru-cache@npm:7.10.1" + checksum: e8b190d71ed0fcd7b29c71a3e9b01f851c92d1ef8865ff06b5581ca991db1e5e006920ed4da8b56da1910664ed51abfd76c46fb55e82ac252ff6c970ff910d72 + languageName: node + linkType: hard + "magic-string@npm:^0.22.5": version: 0.22.5 resolution: "magic-string@npm:0.22.5" @@ -6219,21 +7095,39 @@ __metadata: languageName: node linkType: hard -"magic-string@npm:^0.26.2, magic-string@npm:^0.26.5": - version: 0.26.7 - resolution: "magic-string@npm:0.26.7" +"magic-string@npm:^0.26.2": + version: 0.26.4 + resolution: "magic-string@npm:0.26.4" dependencies: sourcemap-codec: ^1.4.8 - checksum: 89b0d60cbb32bbf3d1e23c46ea93db082d18a8230b972027aecb10a40bba51be519ecce0674f995571e3affe917b76b09f59d8dbc9a1b2c9c4102a2b6e8a2b01 + checksum: dbb5d356361e5ff257e49e554d6a3b5a96019d0c1bcc0cf4f896cad27b6b6efcef0f58369757b3305653e1292c902d5831d16ae834d8285168b8303d04f188e9 languageName: node linkType: hard -"make-fetch-happen@npm:*, make-fetch-happen@npm:^11.0.0": - version: 11.0.0 - resolution: "make-fetch-happen@npm:11.0.0" +"magic-string@npm:^0.26.3": + version: 0.26.3 + resolution: "magic-string@npm:0.26.3" + dependencies: + sourcemap-codec: ^1.4.8 + checksum: e72c9b3d90ccbde088acc5937109f73fa4be8b6a2c2ea9bf9c3c01974f1ebf09842259a74ff2ba4081008a7d49941d883cfef8c460e6c33a6eb564b58482b750 + languageName: node + linkType: hard + +"make-dir@npm:^3.0.0": + version: 3.1.0 + resolution: "make-dir@npm:3.1.0" + dependencies: + semver: ^6.0.0 + checksum: 484200020ab5a1fdf12f393fe5f385fc8e4378824c940fba1729dcd198ae4ff24867bc7a5646331e50cead8abff5d9270c456314386e629acec6dff4b8016b78 + languageName: node + linkType: hard + +"make-fetch-happen@npm:*, make-fetch-happen@npm:^10.0.6, make-fetch-happen@npm:^10.2.0": + version: 10.2.1 + resolution: "make-fetch-happen@npm:10.2.1" dependencies: agentkeepalive: ^4.2.1 - cacache: ^17.0.0 + cacache: ^16.1.0 http-cache-semantics: ^4.1.0 http-proxy-agent: ^5.0.0 https-proxy-agent: ^5.0.0 @@ -6248,13 +7142,13 @@ __metadata: promise-retry: ^2.0.1 socks-proxy-agent: ^7.0.0 ssri: ^9.0.0 - checksum: df87870222a136eb514e3ea7fd268cdbbac670860990b79ccaf4a102dbf1ca26a06ca26f2b29d9fbfac6dff9f1572272aa73c59813d78391cc82a160563610e7 + checksum: 2332eb9a8ec96f1ffeeea56ccefabcb4193693597b132cd110734d50f2928842e22b84cfa1508e921b8385cdfd06dda9ad68645fed62b50fff629a580f5fb72c languageName: node linkType: hard -"make-fetch-happen@npm:^10.0.3, make-fetch-happen@npm:^10.0.6, make-fetch-happen@npm:^10.2.0": - version: 10.2.1 - resolution: "make-fetch-happen@npm:10.2.1" +"make-fetch-happen@npm:^10.0.3": + version: 10.1.8 + resolution: "make-fetch-happen@npm:10.1.8" dependencies: agentkeepalive: ^4.2.1 cacache: ^16.1.0 @@ -6272,7 +7166,7 @@ __metadata: promise-retry: ^2.0.1 socks-proxy-agent: ^7.0.0 ssri: ^9.0.0 - checksum: 2332eb9a8ec96f1ffeeea56ccefabcb4193693597b132cd110734d50f2928842e22b84cfa1508e921b8385cdfd06dda9ad68645fed62b50fff629a580f5fb72c + checksum: 5fe9fd9da5368a8a4fe9a3ea5b9aa15f1e91c9ab703cd9027a6b33840ecc8a57c182fbe1c767c139330a88c46a448b1f00da5e32065cec373aff2450b3da54ee languageName: node linkType: hard @@ -6307,11 +7201,11 @@ __metadata: linkType: hard "marked@npm:^4.0.10": - version: 4.1.1 - resolution: "marked@npm:4.1.1" + version: 4.1.0 + resolution: "marked@npm:4.1.0" bin: marked: bin/marked.js - checksum: 717e3357952ee53de831bf0eb110ed075bebca2376c58bcdf7ee523ef540d45308ad6d51b2c933da0968832ea4386f31c142ca65443e77c098e84f6cce73e418 + checksum: f0b3732a9d6208c933541342e60eb78029bd046c143a6ade0e76ed80b6174f92b186205a9dfe805e435070806ec475b0e87e62d04348eafd2f761c24281b192a languageName: node linkType: hard @@ -6460,9 +7354,9 @@ __metadata: linkType: hard "minimist@npm:^1.2.0, minimist@npm:^1.2.5, minimist@npm:^1.2.6": - version: 1.2.7 - resolution: "minimist@npm:1.2.7" - checksum: 7346574a1038ca23c32e02252f603801f09384dd1d78b69a943a4e8c2c28730b80e96193882d3d3b22a063445f460e48316b29b8a25addca2d7e5e8f75478bec + version: 1.2.6 + resolution: "minimist@npm:1.2.6" + checksum: d15428cd1e11eb14e1233bcfb88ae07ed7a147de251441d61158619dfb32c4d7e9061d09cab4825fdee18ecd6fce323228c8c47b5ba7cd20af378ca4048fb3fb languageName: node linkType: hard @@ -6476,8 +7370,8 @@ __metadata: linkType: hard "minipass-fetch@npm:^2.0.3": - version: 2.1.2 - resolution: "minipass-fetch@npm:2.1.2" + version: 2.1.0 + resolution: "minipass-fetch@npm:2.1.0" dependencies: encoding: ^0.1.13 minipass: ^3.1.6 @@ -6486,7 +7380,7 @@ __metadata: dependenciesMeta: encoding: optional: true - checksum: 3f216be79164e915fc91210cea1850e488793c740534985da017a4cbc7a5ff50506956d0f73bb0cb60e4fe91be08b6b61ef35101706d3ef5da2c8709b5f08f91 + checksum: 1334732859a3f7959ed22589bafd9c40384b885aebb5932328071c33f86b3eb181d54c86919675d1825ab5f1c8e4f328878c863873258d113c29d79a4b0c9c9f languageName: node linkType: hard @@ -6527,7 +7421,7 @@ __metadata: languageName: node linkType: hard -"minipass@npm:*, minipass@npm:^3.0.0, minipass@npm:^3.1.1, minipass@npm:^3.1.6": +"minipass@npm:*": version: 3.3.5 resolution: "minipass@npm:3.3.5" dependencies: @@ -6536,6 +7430,15 @@ __metadata: languageName: node linkType: hard +"minipass@npm:^3.0.0, minipass@npm:^3.1.1, minipass@npm:^3.1.6": + version: 3.3.3 + resolution: "minipass@npm:3.3.3" + dependencies: + yallist: ^4.0.0 + checksum: 523a338f42140c2e62bff3429f236cc44a32ddd29a70d5221e0570ace237057190981cad406fd3a420f03a95cc001ad58a388d902b9519038e27f190bb88a6e7 + languageName: node + linkType: hard + "minizlib@npm:^2.1.1, minizlib@npm:^2.1.2": version: 2.1.2 resolution: "minizlib@npm:2.1.2" @@ -6706,15 +7609,35 @@ __metadata: languageName: node linkType: hard -"node-gyp@npm:*, node-gyp@npm:^9.0.0, node-gyp@npm:^9.1.0, node-gyp@npm:latest": - version: 9.3.0 - resolution: "node-gyp@npm:9.3.0" +"node-gyp@npm:*, node-gyp@npm:^9.0.0, node-gyp@npm:^9.1.0": + version: 9.1.0 + resolution: "node-gyp@npm:9.1.0" dependencies: env-paths: ^2.2.0 glob: ^7.1.4 graceful-fs: ^4.2.6 make-fetch-happen: ^10.0.3 - nopt: ^6.0.0 + nopt: ^5.0.0 + npmlog: ^6.0.0 + rimraf: ^3.0.2 + semver: ^7.3.5 + tar: ^6.1.2 + which: ^2.0.2 + bin: + node-gyp: bin/node-gyp.js + checksum: 1437fa4a879b5b9010604128e8da8609b57c66034262087539ee04a8b764b8436af2be01bab66f8fc729a3adba2dcc21b10a32b9f552696c3fa8cd657d134fc4 + languageName: node + linkType: hard + +"node-gyp@npm:latest": + version: 9.0.0 + resolution: "node-gyp@npm:9.0.0" + dependencies: + env-paths: ^2.2.0 + glob: ^7.1.4 + graceful-fs: ^4.2.6 + make-fetch-happen: ^10.0.3 + nopt: ^5.0.0 npmlog: ^6.0.0 rimraf: ^3.0.2 semver: ^7.3.5 @@ -6722,7 +7645,7 @@ __metadata: which: ^2.0.2 bin: node-gyp: bin/node-gyp.js - checksum: 589ddd3ed967724ef425f9624bfa47cf73022640ab3eba6d556e92cdc4ddef33b63fce3a467c93b995a3f61df92eafd3c3d1e8dbe4a2c00c383334487dea99c3 + checksum: 4d8ef8860f7e4f4d86c91db3f519d26ed5cc23b48fe54543e2afd86162b4acbd14f21de42a5db344525efb69a991e021b96a68c70c6e2d5f4a5cb770793da6d3 languageName: node linkType: hard @@ -6749,6 +7672,17 @@ __metadata: languageName: node linkType: hard +"nopt@npm:^5.0.0": + version: 5.0.0 + resolution: "nopt@npm:5.0.0" + dependencies: + abbrev: 1 + bin: + nopt: bin/nopt.js + checksum: d35fdec187269503843924e0114c0c6533fb54bbf1620d0f28b4b60ba01712d6687f62565c55cc20a504eff0fbe5c63e22340c3fad549ad40469ffb611b04f2f + languageName: node + linkType: hard + "normalize-package-data@npm:^2.5.0": version: 2.5.0 resolution: "normalize-package-data@npm:2.5.0" @@ -6799,16 +7733,7 @@ __metadata: languageName: node linkType: hard -"npm-audit-report@npm:*": - version: 4.0.0 - resolution: "npm-audit-report@npm:4.0.0" - dependencies: - chalk: ^4.0.0 - checksum: 8cbb5f84dc20eb7ad7d7631a641ff933ee803fadb5e22c0e818aef4ba646e2793704b1075310429a6f51f2a9ac64398100556ad0d12cedea0dac6d6a939e97d3 - languageName: node - linkType: hard - -"npm-audit-report@npm:^3.0.0": +"npm-audit-report@npm:*, npm-audit-report@npm:^3.0.0": version: 3.0.0 resolution: "npm-audit-report@npm:3.0.0" dependencies: @@ -6835,16 +7760,7 @@ __metadata: languageName: node linkType: hard -"npm-install-checks@npm:*": - version: 6.0.0 - resolution: "npm-install-checks@npm:6.0.0" - dependencies: - semver: ^7.1.1 - checksum: 5476a26dccb83c24d9ffaf3d0592e8001f9804a40c6b3f441c9a1b2c8d643e90d8352c4ce27ffce72296de7f9744750d0124a6db55b68071971d4b4e74787818 - languageName: node - linkType: hard - -"npm-install-checks@npm:^5.0.0": +"npm-install-checks@npm:*, npm-install-checks@npm:^5.0.0": version: 5.0.0 resolution: "npm-install-checks@npm:5.0.0" dependencies: @@ -6868,14 +7784,14 @@ __metadata: linkType: hard "npm-package-arg@npm:*, npm-package-arg@npm:^9.0.0, npm-package-arg@npm:^9.0.1, npm-package-arg@npm:^9.1.0": - version: 9.1.2 - resolution: "npm-package-arg@npm:9.1.2" + version: 9.1.0 + resolution: "npm-package-arg@npm:9.1.0" dependencies: hosted-git-info: ^5.0.0 proc-log: ^2.0.1 semver: ^7.3.5 validate-npm-package-name: ^4.0.0 - checksum: 3793488843985ed71deb14fcba7c068d8ed03a18fd8f6b235c6a64465c9a25f60261598106d5cc8677c0bee9548e405c34c2e3c7a822e3113d3389351c745dfa + checksum: 277c21477731a4f1e31bde36f0db5f5470deb2a008db2aaf1b015d588b23cb225c75f90291ea241235e86682a03de972bbe69fc805c921a786ea9616955990b9 languageName: node linkType: hard @@ -6893,15 +7809,6 @@ __metadata: languageName: node linkType: hard -"npm-packlist@npm:^7.0.0": - version: 7.0.0 - resolution: "npm-packlist@npm:7.0.0" - dependencies: - ignore-walk: ^5.0.1 - checksum: 43bd3a822c9d68c327b16d595f4a0073af38d49357bcfecfca5999568b61d1e804c6f3ed1720a7b3e41ba0d0053d0b18e3c86922c91a33e7e84d60c33ef7e558 - languageName: node - linkType: hard - "npm-pick-manifest@npm:*, npm-pick-manifest@npm:^7.0.0, npm-pick-manifest@npm:^7.0.2": version: 7.0.2 resolution: "npm-pick-manifest@npm:7.0.2" @@ -6914,17 +7821,7 @@ __metadata: languageName: node linkType: hard -"npm-profile@npm:*": - version: 7.0.0 - resolution: "npm-profile@npm:7.0.0" - dependencies: - npm-registry-fetch: ^13.0.1 - proc-log: ^2.0.0 - checksum: 39319e44b3942af08bdab1297ca4c5513411a381c7e5621000e4eea0346654db645aefb2adbe208ac965e13108315975372b8811f8fb90b79b7e8a7fe68a2464 - languageName: node - linkType: hard - -"npm-profile@npm:^6.2.0": +"npm-profile@npm:*, npm-profile@npm:^6.2.0": version: 6.2.1 resolution: "npm-profile@npm:6.2.1" dependencies: @@ -6934,22 +7831,7 @@ __metadata: languageName: node linkType: hard -"npm-registry-fetch@npm:*": - version: 14.0.0 - resolution: "npm-registry-fetch@npm:14.0.0" - dependencies: - make-fetch-happen: ^11.0.0 - minipass: ^3.1.6 - minipass-fetch: ^2.0.3 - minipass-json-stream: ^1.0.1 - minizlib: ^2.1.2 - npm-package-arg: ^9.0.1 - proc-log: ^2.0.0 - checksum: 98fc58fada792be02834013dbd58ebdf4e748df11af72f721ddd424497156442205f2f9809a96ec9326102117764e166dd43bf6ed4dac51bcdd8191b06b6cfd4 - languageName: node - linkType: hard - -"npm-registry-fetch@npm:^13.0.0, npm-registry-fetch@npm:^13.0.1, npm-registry-fetch@npm:^13.3.1": +"npm-registry-fetch@npm:*, npm-registry-fetch@npm:^13.0.0, npm-registry-fetch@npm:^13.0.1, npm-registry-fetch@npm:^13.3.1": version: 13.3.1 resolution: "npm-registry-fetch@npm:13.3.1" dependencies: @@ -7167,7 +8049,14 @@ __metadata: languageName: node linkType: hard -"object-inspect@npm:^1.12.2, object-inspect@npm:^1.9.0": +"nwsapi@npm:^2.2.2": + version: 2.2.2 + resolution: "nwsapi@npm:2.2.2" + checksum: 43769106292bc95f776756ca2f3513dab7b4d506a97c67baec32406447841a35f65f29c1f95ab5d42785210fd41668beed33ca16fa058780be43b101ad73e205 + languageName: node + linkType: hard + +"object-inspect@npm:^1.12.0, object-inspect@npm:^1.12.2, object-inspect@npm:^1.9.0": version: 1.12.2 resolution: "object-inspect@npm:1.12.2" checksum: a534fc1b8534284ed71f25ce3a496013b7ea030f3d1b77118f6b7b1713829262be9e6243acbcb3ef8c626e2b64186112cb7f6db74e37b2789b9c789ca23048b2 @@ -7181,15 +8070,15 @@ __metadata: languageName: node linkType: hard -"object.assign@npm:^4.1.4": - version: 4.1.4 - resolution: "object.assign@npm:4.1.4" +"object.assign@npm:^4.1.2": + version: 4.1.2 + resolution: "object.assign@npm:4.1.2" dependencies: - call-bind: ^1.0.2 - define-properties: ^1.1.4 - has-symbols: ^1.0.3 + call-bind: ^1.0.0 + define-properties: ^1.1.3 + has-symbols: ^1.0.1 object-keys: ^1.1.1 - checksum: 76cab513a5999acbfe0ff355f15a6a125e71805fcf53de4e9d4e082e1989bdb81d1e329291e1e4e0ae7719f0e4ef80e88fb2d367ae60500d79d25a6224ac8864 + checksum: d621d832ed7b16ac74027adb87196804a500d80d9aca536fccb7ba48d33a7e9306a75f94c1d29cbfa324bc091bfc530bc24789568efdaee6a47fcfa298993814 languageName: node linkType: hard @@ -7231,6 +8120,20 @@ __metadata: languageName: node linkType: hard +"optionator@npm:^0.8.1": + version: 0.8.3 + resolution: "optionator@npm:0.8.3" + dependencies: + deep-is: ~0.1.3 + fast-levenshtein: ~2.0.6 + levn: ~0.3.0 + prelude-ls: ~1.1.2 + type-check: ~0.3.2 + word-wrap: ~1.2.3 + checksum: b8695ddf3d593203e25ab0900e265d860038486c943ff8b774f596a310f8ceebdb30c6832407a8198ba3ec9debe1abe1f51d4aad94843612db3b76d690c61d34 + languageName: node + linkType: hard + "optionator@npm:^0.9.1": version: 0.9.1 resolution: "optionator@npm:0.9.1" @@ -7376,34 +8279,7 @@ __metadata: languageName: node linkType: hard -"pacote@npm:*": - version: 15.0.0 - resolution: "pacote@npm:15.0.0" - dependencies: - "@npmcli/git": ^3.0.0 - "@npmcli/installed-package-contents": ^1.0.7 - "@npmcli/promise-spawn": ^3.0.0 - "@npmcli/run-script": ^4.1.0 - cacache: ^17.0.0 - fs-minipass: ^2.1.0 - minipass: ^3.1.6 - npm-package-arg: ^9.0.0 - npm-packlist: ^7.0.0 - npm-pick-manifest: ^7.0.0 - npm-registry-fetch: ^13.0.1 - proc-log: ^2.0.0 - promise-retry: ^2.0.1 - read-package-json: ^5.0.0 - read-package-json-fast: ^3.0.0 - ssri: ^9.0.0 - tar: ^6.1.11 - bin: - pacote: lib/bin.js - checksum: 103928fcb2e42c7837e96ce532cb7f667e2a4be94e30910961c068e1f38b783ca9b0f6cd990c06c136c3712dd5f1e6fb120fa85eb9aed5b67c0c26c5c9edecaf - languageName: node - linkType: hard - -"pacote@npm:^13.0.3, pacote@npm:^13.6.1, pacote@npm:^13.6.2": +"pacote@npm:*, pacote@npm:^13.0.3, pacote@npm:^13.6.1, pacote@npm:^13.6.2": version: 13.6.2 resolution: "pacote@npm:13.6.2" dependencies: @@ -7443,18 +8319,7 @@ __metadata: languageName: node linkType: hard -"parse-conflict-json@npm:*": - version: 3.0.0 - resolution: "parse-conflict-json@npm:3.0.0" - dependencies: - json-parse-even-better-errors: ^3.0.0 - just-diff: ^5.0.1 - just-diff-apply: ^5.2.0 - checksum: 06112b03d6506538ef4b59525627fa7c3f941b32279f049868038e34c36fb9f653da22d5418cfba43db52986464dc5229f1ce5f340444def8409556c9360bbd8 - languageName: node - linkType: hard - -"parse-conflict-json@npm:^2.0.1, parse-conflict-json@npm:^2.0.2": +"parse-conflict-json@npm:*, parse-conflict-json@npm:^2.0.1, parse-conflict-json@npm:^2.0.2": version: 2.0.2 resolution: "parse-conflict-json@npm:2.0.2" dependencies: @@ -7508,6 +8373,15 @@ __metadata: languageName: node linkType: hard +"parse5@npm:^7.1.1": + version: 7.1.1 + resolution: "parse5@npm:7.1.1" + dependencies: + entities: ^4.4.0 + checksum: 8f72fbfa6df83a3f29f58e1818f7bd46b47ff3e26d79c74e10b8fc7ef7ee76163f205113f1b2f6a5b8dc4e31e726f490444f04890cead6e974dbcbe8172b1321 + languageName: node + linkType: hard + "path-exists@npm:^3.0.0": version: 3.0.0 resolution: "path-exists@npm:3.0.0" @@ -7559,6 +8433,13 @@ __metadata: languageName: node linkType: hard +"pathval@npm:^1.1.1": + version: 1.1.1 + resolution: "pathval@npm:1.1.1" + checksum: 090e3147716647fb7fb5b4b8c8e5b55e5d0a6086d085b6cd23f3d3c01fcf0ff56fd3cc22f2f4a033bd2e46ed55d61ed8379e123b42afe7d531a2a5fc8bb556d6 + languageName: node + linkType: hard + "picocolors@npm:^1.0.0": version: 1.0.0 resolution: "picocolors@npm:1.0.0" @@ -7590,10 +8471,10 @@ __metadata: linkType: hard "pinia@npm:^2.0.12": - version: 2.0.23 - resolution: "pinia@npm:2.0.23" + version: 2.0.22 + resolution: "pinia@npm:2.0.22" dependencies: - "@vue/devtools-api": ^6.4.4 + "@vue/devtools-api": ^6.2.1 vue-demi: "*" peerDependencies: "@vue/composition-api": ^1.4.0 @@ -7604,7 +8485,7 @@ __metadata: optional: true typescript: optional: true - checksum: 004c76d80bc1127a25b26f92616f1243c570c6be90b04be83aa95108274036b64ed0678e537f3213c8b8f3dd7bcffb52e768e7445a1fd9378cb1db15ada92f83 + checksum: 394906326758ac41acfdf4a29263c952c2cb7f35ebf87771a025ab492bdde7cf7fd87a49f82ec3a98bf8323ed2cb231f1ad272f7ea522694a9fab5a5cde3e727 languageName: node linkType: hard @@ -7653,7 +8534,29 @@ __metadata: languageName: node linkType: hard -"postcss@npm:^8.4.13, postcss@npm:^8.4.14, postcss@npm:^8.4.16": +"postcss@npm:^8.4.13, postcss@npm:^8.4.16": + version: 8.4.16 + resolution: "postcss@npm:8.4.16" + dependencies: + nanoid: ^3.3.4 + picocolors: ^1.0.0 + source-map-js: ^1.0.2 + checksum: 10eee25efd77868036403858577da0cefaf2e0905feeaba5770d5438ccdddba3d01cba8063e96b8aac4c6daa0ed413dd5ae0554a433a3c4db38df1d134cffc1f + languageName: node + linkType: hard + +"postcss@npm:^8.4.14": + version: 8.4.14 + resolution: "postcss@npm:8.4.14" + dependencies: + nanoid: ^3.3.4 + picocolors: ^1.0.0 + source-map-js: ^1.0.2 + checksum: fe58766ff32e4becf65a7d57678995cfd239df6deed2fe0557f038b47c94e4132e7e5f68b5aa820c13adfec32e523b693efaeb65798efb995ce49ccd83953816 + languageName: node + linkType: hard + +"postcss@npm:^8.4.18": version: 8.4.18 resolution: "postcss@npm:8.4.18" dependencies: @@ -7671,6 +8574,13 @@ __metadata: languageName: node linkType: hard +"prelude-ls@npm:~1.1.2": + version: 1.1.2 + resolution: "prelude-ls@npm:1.1.2" + checksum: c4867c87488e4a0c233e158e4d0d5565b609b105d75e4c05dc760840475f06b731332eb93cc8c9cecb840aa8ec323ca3c9a56ad7820ad2e63f0261dadcb154e4 + languageName: node + linkType: hard + "prettier-linter-helpers@npm:^1.0.0": version: 1.0.0 resolution: "prettier-linter-helpers@npm:1.0.0" @@ -7689,6 +8599,17 @@ __metadata: languageName: node linkType: hard +"pretty@npm:^2.0.0": + version: 2.0.0 + resolution: "pretty@npm:2.0.0" + dependencies: + condense-newlines: ^0.2.1 + extend-shallow: ^2.0.1 + js-beautify: ^1.6.12 + checksum: 9c41ae0559195af2fb2496d84c6f442843e045d269d4008a6dd336f8372d7481395ed5ab23e5711b6172682c27cb0542e1ab3ca11b38da48f1109c0b701d0ef9 + languageName: node + linkType: hard + "proc-log@npm:^2.0.0, proc-log@npm:^2.0.1": version: 2.0.1 resolution: "proc-log@npm:2.0.1" @@ -7757,6 +8678,13 @@ __metadata: languageName: node linkType: hard +"proto-list@npm:~1.2.1": + version: 1.2.4 + resolution: "proto-list@npm:1.2.4" + checksum: 4d4826e1713cbfa0f15124ab0ae494c91b597a3c458670c9714c36e8baddf5a6aad22842776f2f5b137f259c8533e741771445eb8df82e861eea37a6eaba03f7 + languageName: node + linkType: hard + "protocols@npm:^1.4.0": version: 1.4.8 resolution: "protocols@npm:1.4.8" @@ -7771,6 +8699,20 @@ __metadata: languageName: node linkType: hard +"pseudomap@npm:^1.0.2": + version: 1.0.2 + resolution: "pseudomap@npm:1.0.2" + checksum: 856c0aae0ff2ad60881168334448e898ad7a0e45fe7386d114b150084254c01e200c957cf378378025df4e052c7890c5bd933939b0e0d2ecfcc1dc2f0b2991f5 + languageName: node + linkType: hard + +"psl@npm:^1.1.33": + version: 1.9.0 + resolution: "psl@npm:1.9.0" + checksum: 20c4277f640c93d393130673f392618e9a8044c6c7bf61c53917a0fddb4952790f5f362c6c730a9c32b124813e173733f9895add8d26f566ed0ea0654b2e711d + languageName: node + linkType: hard + "pump@npm:^3.0.0": version: 3.0.0 resolution: "pump@npm:3.0.0" @@ -7781,7 +8723,7 @@ __metadata: languageName: node linkType: hard -"punycode@npm:^2.1.0": +"punycode@npm:^2.1.0, punycode@npm:^2.1.1": version: 2.1.1 resolution: "punycode@npm:2.1.1" checksum: 823bf443c6dd14f669984dea25757b37993f67e8d94698996064035edd43bed8a5a17a9f12e439c2b35df1078c6bec05a6c86e336209eb1061e8025c481168e8 @@ -7825,6 +8767,13 @@ __metadata: languageName: node linkType: hard +"querystringify@npm:^2.1.1": + version: 2.2.0 + resolution: "querystringify@npm:2.2.0" + checksum: 5641ea231bad7ef6d64d9998faca95611ed4b11c2591a8cae741e178a974f6a8e0ebde008475259abe1621cb15e692404e6b6626e927f7b849d5c09392604b15 + languageName: node + linkType: hard + "queue-microtask@npm:^1.1.2, queue-microtask@npm:^1.2.2": version: 1.2.3 resolution: "queue-microtask@npm:1.2.3" @@ -7892,8 +8841,8 @@ __metadata: linkType: hard "rdf-ext@npm:^2.0.1": - version: 2.1.0 - resolution: "rdf-ext@npm:2.1.0" + version: 2.0.1 + resolution: "rdf-ext@npm:2.0.1" dependencies: "@rdfjs/data-model": ^2.0.0 "@rdfjs/dataset": ^2.0.0 @@ -7902,14 +8851,13 @@ __metadata: "@rdfjs/namespace": ^2.0.0 "@rdfjs/normalize": ^2.0.0 "@rdfjs/prefix-map": ^0.1.0 - "@rdfjs/score": ^0.1.1 "@rdfjs/term-map": ^2.0.0 "@rdfjs/term-set": ^2.0.0 "@rdfjs/to-ntriples": ^2.0.0 "@rdfjs/traverser": ^0.1.0 clownface: ^1.4.0 readable-stream: ^3.6.0 - checksum: fd02c76578357cc974b05d66d0178cc4a287fa46eafd49b3210eed65945070eda372488ed3d8318f9a541e9540334b22b3585ed204f50c68c9ca7abbb9698a91 + checksum: 79cbbba4d97a82b67770ef2f881c369d9f444e604d871f28a55a665874c9b35adef5c7544b3707ed7feb21ee21a5f9dcffe8a090b70acdcfee5aed7dc6de5aaf languageName: node linkType: hard @@ -7999,19 +8947,19 @@ __metadata: languageName: node linkType: hard -"rdf-validate-datatype@npm:^0.1.5": - version: 0.1.5 - resolution: "rdf-validate-datatype@npm:0.1.5" +"rdf-validate-datatype@npm:^0.1.4": + version: 0.1.4 + resolution: "rdf-validate-datatype@npm:0.1.4" dependencies: "@rdfjs/namespace": ^1.1.0 - "@rdfjs/to-ntriples": ^2.0.0 - checksum: b524c93e74f7d4a404650c074151f6866255f90bf33097ce6a029c8f74efc4f584b7f6e092b5ae5b887ee6bfe7356f52d69ba6a39466cd6b948137726d197747 + "@rdfjs/to-ntriples": ^1.0.2 + checksum: d522adc69f36b5584993b95013234922c533d223fd74f45bc6243e75842c6c0ed2250f7a35ad1ce6cffdb7718d1035242ba73ba557947409be2fe88df303d414 languageName: node linkType: hard "rdf-validate-shacl@npm:^0.4.3, rdf-validate-shacl@npm:^0.4.4": - version: 0.4.5 - resolution: "rdf-validate-shacl@npm:0.4.5" + version: 0.4.4 + resolution: "rdf-validate-shacl@npm:0.4.4" dependencies: "@rdfjs/dataset": ^1.1.1 "@rdfjs/namespace": ^1.0.0 @@ -8019,8 +8967,8 @@ __metadata: clownface: ^1.4.0 debug: ^4.3.2 rdf-literal: ^1.3.0 - rdf-validate-datatype: ^0.1.5 - checksum: 548b6c3fe89e358d8e57da0048a336356f1379b6e0edd238089d16f5bd46be5bac87454e795cf8791c71454ec08b29ca8aecf5b169e19a9a31a82ccd86b4b2fe + rdf-validate-datatype: ^0.1.4 + checksum: 471c770d9de02c983f4dff14f1d51d3269816114d93e9ccbd0d3683e1ec9c372d91895656dbe89b3a5a62e863e4caa2b7035ab01bc560b98611d66b7e2b94ae2 languageName: node linkType: hard @@ -8055,17 +9003,7 @@ __metadata: languageName: node linkType: hard -"read-package-json-fast@npm:*, read-package-json-fast@npm:^3.0.0": - version: 3.0.0 - resolution: "read-package-json-fast@npm:3.0.0" - dependencies: - json-parse-even-better-errors: ^3.0.0 - npm-normalize-package-bin: ^2.0.0 - checksum: 025d3a917aacbaa4148b3561acdb208c053235b2dc32768b850ffa30243161d14f74418a8a47fae78f075c458ced88add998c7405b32812948d7efa3c4f1bc07 - languageName: node - linkType: hard - -"read-package-json-fast@npm:^2.0.2, read-package-json-fast@npm:^2.0.3": +"read-package-json-fast@npm:*, read-package-json-fast@npm:^2.0.2, read-package-json-fast@npm:^2.0.3": version: 2.0.3 resolution: "read-package-json-fast@npm:2.0.3" dependencies: @@ -8267,6 +9205,13 @@ __metadata: languageName: node linkType: hard +"requires-port@npm:^1.0.0": + version: 1.0.0 + resolution: "requires-port@npm:1.0.0" + checksum: eee0e303adffb69be55d1a214e415cf42b7441ae858c76dfc5353148644f6fd6e698926fc4643f510d5c126d12a705e7c8ed7e38061113bdf37547ab356797ff + languageName: node + linkType: hard + "resolve-alpn@npm:^1.0.0": version: 1.2.1 resolution: "resolve-alpn@npm:1.2.1" @@ -8440,6 +9385,20 @@ __metadata: languageName: node linkType: hard +"rollup@npm:^2.79.1": + version: 2.79.1 + resolution: "rollup@npm:2.79.1" + dependencies: + fsevents: ~2.3.2 + dependenciesMeta: + fsevents: + optional: true + bin: + rollup: dist/bin/rollup + checksum: 6a2bf167b3587d4df709b37d149ad0300692cc5deb510f89ac7bdc77c8738c9546ae3de9322b0968e1ed2b0e984571f5f55aae28fa7de4cfcb1bc5402a4e2be6 + languageName: node + linkType: hard + "rollup@npm:~2.78.0": version: 2.78.1 resolution: "rollup@npm:2.78.1" @@ -8486,17 +9445,6 @@ __metadata: languageName: node linkType: hard -"safe-regex-test@npm:^1.0.0": - version: 1.0.0 - resolution: "safe-regex-test@npm:1.0.0" - dependencies: - call-bind: ^1.0.2 - get-intrinsic: ^1.1.3 - is-regex: ^1.1.4 - checksum: bc566d8beb8b43c01b94e67de3f070fd2781685e835959bbbaaec91cc53381145ca91f69bd837ce6ec244817afa0a5e974fc4e40a2957f0aca68ac3add1ddd34 - languageName: node - linkType: hard - "safer-buffer@npm:>= 2.1.2 < 3.0.0": version: 2.1.2 resolution: "safer-buffer@npm:2.1.2" @@ -8549,6 +9497,15 @@ __metadata: languageName: node linkType: hard +"saxes@npm:^6.0.0": + version: 6.0.0 + resolution: "saxes@npm:6.0.0" + dependencies: + xmlchars: ^2.2.0 + checksum: d3fa3e2aaf6c65ed52ee993aff1891fc47d5e47d515164b5449cbf5da2cbdc396137e55590472e64c5c436c14ae64a8a03c29b9e7389fc6f14035cf4e982ef3b + languageName: node + linkType: hard + "semantic-release@npm:^19.0.2": version: 19.0.5 resolution: "semantic-release@npm:19.0.5" @@ -8604,17 +9561,17 @@ __metadata: linkType: hard "semver@npm:*, semver@npm:^7.0.0, semver@npm:^7.1.1, semver@npm:^7.1.2, semver@npm:^7.3.2, semver@npm:^7.3.4, semver@npm:^7.3.5, semver@npm:^7.3.6, semver@npm:^7.3.7": - version: 7.3.8 - resolution: "semver@npm:7.3.8" + version: 7.3.7 + resolution: "semver@npm:7.3.7" dependencies: lru-cache: ^6.0.0 bin: semver: bin/semver.js - checksum: ba9c7cbbf2b7884696523450a61fee1a09930d888b7a8d7579025ad93d459b2d1949ee5bbfeb188b2be5f4ac163544c5e98491ad6152df34154feebc2cc337c1 + checksum: 2fa3e877568cd6ce769c75c211beaed1f9fce80b28338cadd9d0b6c40f2e2862bafd62c19a6cff42f3d54292b7c623277bcab8816a2b5521cf15210d43e75232 languageName: node linkType: hard -"semver@npm:2 || 3 || 4 || 5": +"semver@npm:2 || 3 || 4 || 5, semver@npm:^5.6.0": version: 5.7.1 resolution: "semver@npm:5.7.1" bin: @@ -8673,6 +9630,13 @@ __metadata: languageName: node linkType: hard +"sigmund@npm:^1.0.1": + version: 1.0.1 + resolution: "sigmund@npm:1.0.1" + checksum: 793f81f8083ad75ff3903ffd93cf35be8d797e872822cf880aea27ce6db522b508d93ea52ae292bccf357ce34dd5c7faa544cc51c2216e70bbf5fcf09b62707c + languageName: node + linkType: hard + "signal-exit@npm:^3.0.2, signal-exit@npm:^3.0.3, signal-exit@npm:^3.0.7": version: 3.0.7 resolution: "signal-exit@npm:3.0.7" @@ -8749,12 +9713,12 @@ __metadata: linkType: hard "socks@npm:^2.6.2": - version: 2.7.1 - resolution: "socks@npm:2.7.1" + version: 2.6.2 + resolution: "socks@npm:2.6.2" dependencies: - ip: ^2.0.0 + ip: ^1.1.5 smart-buffer: ^4.2.0 - checksum: 259d9e3e8e1c9809a7f5c32238c3d4d2a36b39b83851d0f573bfde5f21c4b1288417ce1af06af1452569cd1eb0841169afd4998f0e04ba04656f6b7f0e46d748 + checksum: dd9194293059d737759d5c69273850ad4149f448426249325c4bea0e340d1cf3d266c3b022694b0dcf5d31f759de23657244c481fc1e8322add80b7985c36b5e languageName: node linkType: hard @@ -8765,7 +9729,7 @@ __metadata: languageName: node linkType: hard -"source-map@npm:^0.6.1": +"source-map@npm:^0.6.1, source-map@npm:~0.6.1": version: 0.6.1 resolution: "source-map@npm:0.6.1" checksum: 59ce8640cf3f3124f64ac289012c2b8bd377c238e316fb323ea22fbfe83da07d81e000071d7242cad7a23cd91c7de98e4df8830ec3f133cb6133a5f6e9f67bc2 @@ -8798,13 +9762,13 @@ __metadata: linkType: hard "sparqljs@npm:^3.4.2": - version: 3.6.1 - resolution: "sparqljs@npm:3.6.1" + version: 3.6.0 + resolution: "sparqljs@npm:3.6.0" dependencies: rdf-data-factory: ^1.1.1 bin: sparqljs: bin/sparql-to-json - checksum: 33baa5ecc7ae55e1f3baeb588989050193e0feaa37d1615fe3a5c2d32fe1ebe24e30d37fcc6c7cf4dbdf735d666592ef68fc59af944d9fe924e894c756707856 + checksum: 449e377475be7e6b817f215ed468f811c90bc90d55819328cb44d470bc33676b071d9afcd4b6505ef17bfc6544378e61c7ca0753518691a28d817b2d957c9565 languageName: node linkType: hard @@ -8883,16 +9847,7 @@ __metadata: languageName: node linkType: hard -"ssri@npm:*": - version: 10.0.0 - resolution: "ssri@npm:10.0.0" - dependencies: - minipass: ^3.1.1 - checksum: c8707ee2351bcfe5258e47b4e08ded4b2e8aec1d79853adec43bf4da6d6e071930ec72a01555f835d772892a230dc17eeb2331b7053a62fa4fd458b863a42741 - languageName: node - linkType: hard - -"ssri@npm:^9.0.0, ssri@npm:^9.0.1": +"ssri@npm:*, ssri@npm:^9.0.0, ssri@npm:^9.0.1": version: 9.0.1 resolution: "ssri@npm:9.0.1" dependencies: @@ -9077,6 +10032,15 @@ __metadata: languageName: node linkType: hard +"strip-literal@npm:^0.4.2": + version: 0.4.2 + resolution: "strip-literal@npm:0.4.2" + dependencies: + acorn: ^8.8.0 + checksum: 831cdcaba61bc82c14ef5ca423a64bb8044b3b128abd15dff454d3fd05b0dbc7b4403760a7a636923d3c2e71a8e65174cef28ee9aef61f9a66819f865da4fdda + languageName: node + linkType: hard + "supports-color@npm:^5.3.0": version: 5.5.0 resolution: "supports-color@npm:5.5.0" @@ -9119,6 +10083,13 @@ __metadata: languageName: node linkType: hard +"symbol-tree@npm:^3.2.4": + version: 3.2.4 + resolution: "symbol-tree@npm:3.2.4" + checksum: 6e8fc7e1486b8b54bea91199d9535bb72f10842e40c79e882fc94fb7b14b89866adf2fd79efa5ebb5b658bc07fb459ccce5ac0e99ef3d72f474e74aaf284029d + languageName: node + linkType: hard + "tar@npm:*, tar@npm:^6.1.0, tar@npm:^6.1.11, tar@npm:^6.1.2": version: 6.1.11 resolution: "tar@npm:6.1.11" @@ -9153,6 +10124,17 @@ __metadata: languageName: node linkType: hard +"test-exclude@npm:^6.0.0": + version: 6.0.0 + resolution: "test-exclude@npm:6.0.0" + dependencies: + "@istanbuljs/schema": ^0.1.2 + glob: ^7.1.4 + minimatch: ^3.0.4 + checksum: 3b34a3d77165a2cb82b34014b3aba93b1c4637a5011807557dc2f3da826c59975a5ccad765721c4648b39817e3472789f9b0fa98fc854c5c1c7a1e632aacdc28 + languageName: node + linkType: hard + "text-extensions@npm:^1.0.0": version: 1.9.0 resolution: "text-extensions@npm:1.9.0" @@ -9200,6 +10182,27 @@ __metadata: languageName: node linkType: hard +"tinybench@npm:^2.3.1": + version: 2.3.1 + resolution: "tinybench@npm:2.3.1" + checksum: 74d45fa546d964a8123f98847fc59550945ed7f0d3e5a4ce0f9596d836b51c1d340c2ae0277a8023c15dc9ea3d7cb948a79173bfc46338c9b367c6323ea1eaf3 + languageName: node + linkType: hard + +"tinypool@npm:^0.3.0": + version: 0.3.0 + resolution: "tinypool@npm:0.3.0" + checksum: 92291c309ed8d004c1ee1ef7f610cd90352383f12c52b0ec16abd9ebc665c03626e7afbc9993df97f63e67fea002b5cc18ba5e8f90260643867cbcac278a183c + languageName: node + linkType: hard + +"tinyspy@npm:^1.0.2": + version: 1.0.2 + resolution: "tinyspy@npm:1.0.2" + checksum: 32096121aa8d52bb625ad62c9314b3e4daba4ab9ac428217b12b1e1dfe9860e3c94d54a7affa279cc70dc6f10d88c6ba46b51de68896b318a06d02f05e87dcc3 + languageName: node + linkType: hard + "to-fast-properties@npm:^2.0.0": version: 2.0.0 resolution: "to-fast-properties@npm:2.0.0" @@ -9216,6 +10219,27 @@ __metadata: languageName: node linkType: hard +"tough-cookie@npm:^4.1.2": + version: 4.1.2 + resolution: "tough-cookie@npm:4.1.2" + dependencies: + psl: ^1.1.33 + punycode: ^2.1.1 + universalify: ^0.2.0 + url-parse: ^1.5.3 + checksum: a7359e9a3e875121a84d6ba40cc184dec5784af84f67f3a56d1d2ae39b87c0e004e6ba7c7331f9622a7d2c88609032473488b28fe9f59a1fec115674589de39a + languageName: node + linkType: hard + +"tr46@npm:^3.0.0": + version: 3.0.0 + resolution: "tr46@npm:3.0.0" + dependencies: + punycode: ^2.1.1 + checksum: 44c3cc6767fb800490e6e9fd64fd49041aa4e49e1f6a012b34a75de739cc9ed3a6405296072c1df8b6389ae139c5e7c6496f659cfe13a04a4bff3a1422981270 + languageName: node + linkType: hard + "tr46@npm:~0.0.3": version: 0.0.3 resolution: "tr46@npm:0.0.3" @@ -9224,20 +10248,13 @@ __metadata: linkType: hard "traverse@npm:~0.6.6": - version: 0.6.7 - resolution: "traverse@npm:0.6.7" - checksum: 21018085ab72f717991597e12e2b52446962ed59df591502e4d7e1a709bc0a989f7c3d451aa7d882666ad0634f1546d696c5edecda1f2fc228777df7bb529a1e - languageName: node - linkType: hard - -"treeverse@npm:*": - version: 3.0.0 - resolution: "treeverse@npm:3.0.0" - checksum: 73168d9887fa57b0719218f176c5a3cfbaaf310922879acb4adf76665bc17dcdb6ed3e4163f0c27eee17e346886186a1515ea6f87e96cdc10df1dce13bf622a0 + version: 0.6.6 + resolution: "traverse@npm:0.6.6" + checksum: e2afa72f11efa9ba31ed763d2d9d2aa244612f22015d16c0ea3ba5f6ca8bf071de87f8108b721885cce06ea4a36ef4605d9228c67e431d9015ea4685cb364420 languageName: node linkType: hard -"treeverse@npm:^2.0.0": +"treeverse@npm:*, treeverse@npm:^2.0.0": version: 2.0.0 resolution: "treeverse@npm:2.0.0" checksum: 3c6b2b890975a4d42c86b9a0f1eb932b4450db3fa874be5c301c4f5e306fd76330c6a490cf334b0937b3a44b049787ba5d98c88bc7b140f34fdb3ab1f83e5269 @@ -9297,6 +10314,22 @@ __metadata: languageName: node linkType: hard +"type-check@npm:~0.3.2": + version: 0.3.2 + resolution: "type-check@npm:0.3.2" + dependencies: + prelude-ls: ~1.1.2 + checksum: dd3b1495642731bc0e1fc40abe5e977e0263005551ac83342ecb6f4f89551d106b368ec32ad3fb2da19b3bd7b2d1f64330da2ea9176d8ddbfe389fb286eb5124 + languageName: node + linkType: hard + +"type-detect@npm:^4.0.0, type-detect@npm:^4.0.5": + version: 4.0.8 + resolution: "type-detect@npm:4.0.8" + checksum: 62b5628bff67c0eb0b66afa371bd73e230399a8d2ad30d852716efcc4656a7516904570cd8631a49a3ce57c10225adf5d0cbdcb47f6b0255fe6557c453925a15 + languageName: node + linkType: hard + "type-fest@npm:^0.16.0": version: 0.16.0 resolution: "type-fest@npm:0.16.0" @@ -9354,31 +10387,31 @@ __metadata: linkType: hard "typescript@npm:^4.8.3": - version: 4.8.4 - resolution: "typescript@npm:4.8.4" + version: 4.8.3 + resolution: "typescript@npm:4.8.3" bin: tsc: bin/tsc tsserver: bin/tsserver - checksum: 3e4f061658e0c8f36c820802fa809e0fd812b85687a9a2f5430bc3d0368e37d1c9605c3ce9b39df9a05af2ece67b1d844f9f6ea8ff42819f13bcb80f85629af0 + checksum: 8286a5edcaf3d68e65c451aa1e7150ad1cf53ee0813c07ec35b7abdfdb10f355ecaa13c6a226a694ae7a67785fd7eeebf89f845da0b4f7e4a35561ddc459aba0 languageName: node linkType: hard "typescript@patch:typescript@^4.8.3#~builtin<compat/typescript>": - version: 4.8.4 - resolution: "typescript@patch:typescript@npm%3A4.8.4#~builtin<compat/typescript>::version=4.8.4&hash=701156" + version: 4.8.3 + resolution: "typescript@patch:typescript@npm%3A4.8.3#~builtin<compat/typescript>::version=4.8.3&hash=701156" bin: tsc: bin/tsc tsserver: bin/tsserver - checksum: 301459fc3eb3b1a38fe91bf96d98eb55da88a9cb17b4ef80b4d105d620f4d547ba776cc27b44cc2ef58b66eda23fe0a74142feb5e79a6fb99f54fc018a696afa + checksum: 2222d2382fb3146089b1d27ce2b55e9d1f99cc64118f1aba75809b693b856c5d3c324f052f60c75b577947fc538bc1c27bad0eb76cbdba9a63a253489504ba7e languageName: node linkType: hard "uglify-js@npm:^3.1.4": - version: 3.17.3 - resolution: "uglify-js@npm:3.17.3" + version: 3.17.2 + resolution: "uglify-js@npm:3.17.2" bin: uglifyjs: bin/uglifyjs - checksum: 2650b2e0385fe6bf68bc0b7746028fd004bbe839447c28a59f8a9e458187e897a5057900cb715b3be4cf7cf3f1d10217198210c5c23c0bffcb20feca2de5bb17 + checksum: 128233638176abe6cc0ec0f1dbae7bcb3f02edd78eb5c7752b4f379ec9d29032cd2edf06b2522dbeba0a1f05afb25f6eaffe638581da6d8554bd4c060d6622b1 languageName: node linkType: hard @@ -9386,10 +10419,11 @@ __metadata: version: 0.0.0-use.local resolution: "ui@workspace:." dependencies: - "@coscine/api-client": ^2.6.0 - "@coscine/form-generator": ^3.0.8 + "@coscine/api-client": ^2.8.0 + "@coscine/form-generator": ^3.0.9 "@esbuild-plugins/node-globals-polyfill": ^0.1.1 "@esbuild-plugins/node-modules-polyfill": ^0.1.4 + "@pinia/testing": ^0.0.14 "@rdfjs-elements/formats-pretty": ^0.4.3 "@rdfjs/data-model": ^2.0.0 "@rdfjs/dataset": ^2.0.0 @@ -9409,9 +10443,11 @@ __metadata: "@typescript-eslint/eslint-plugin": ^5.35.1 "@typescript-eslint/parser": ^5.35.1 "@vitejs/plugin-vue2": ^1.1.2 + "@vitest/coverage-c8": ^0.24.3 "@vue/eslint-config-prettier": ^7.0.0 "@vue/eslint-config-typescript": ^11.0.0 "@vue/runtime-dom": ^3.2.40 + "@vue/test-utils": ^1.3.0 "@vuelidate/core": ^2.0.0-alpha.41 "@vuelidate/validators": ^2.0.0-alpha.29 "@vueuse/core": ^9.3.0 @@ -9434,6 +10470,8 @@ __metadata: http-status-codes: ^2.2.0 jose: ^4.6.0 jquery: ^3.6.0 + jsdom: ^20.0.1 + jsdom-global: ^3.0.2 lint-staged: ^12.3.5 lodash: ^4.17.21 moment: ^2.29.1 @@ -9456,6 +10494,7 @@ __metadata: vite: ^3.0.9 vite-aliases: ^0.9.1 vite-plugin-windicss: ^1.8.3 + vitest: ^0.24.3 vue: ^2.7.10 vue-demi: ^0.13.11 vue-i18n: ^8.27.0 @@ -9479,6 +10518,15 @@ __metadata: languageName: node linkType: hard +"unique-filename@npm:^1.1.1": + version: 1.1.1 + resolution: "unique-filename@npm:1.1.1" + dependencies: + unique-slug: ^2.0.0 + checksum: cf4998c9228cc7647ba7814e255dec51be43673903897b1786eff2ac2d670f54d4d733357eb08dea969aa5e6875d0e1bd391d668fbdb5a179744e7c7551a6f80 + languageName: node + linkType: hard + "unique-filename@npm:^2.0.0": version: 2.0.1 resolution: "unique-filename@npm:2.0.1" @@ -9488,6 +10536,15 @@ __metadata: languageName: node linkType: hard +"unique-slug@npm:^2.0.0": + version: 2.0.2 + resolution: "unique-slug@npm:2.0.2" + dependencies: + imurmurhash: ^0.1.4 + checksum: 5b6876a645da08d505dedb970d1571f6cebdf87044cb6b740c8dbb24f0d6e1dc8bdbf46825fd09f994d7cf50760e6f6e063cfa197d51c5902c00a861702eb75a + languageName: node + linkType: hard + "unique-slug@npm:^3.0.0": version: 3.0.0 resolution: "unique-slug@npm:3.0.0" @@ -9513,6 +10570,13 @@ __metadata: languageName: node linkType: hard +"universalify@npm:^0.2.0": + version: 0.2.0 + resolution: "universalify@npm:0.2.0" + checksum: e86134cb12919d177c2353196a4cc09981524ee87abf621f7bc8d249dbbbebaec5e7d1314b96061497981350df786e4c5128dbf442eba104d6e765bc260678b5 + languageName: node + linkType: hard + "universalify@npm:^2.0.0": version: 2.0.0 resolution: "universalify@npm:2.0.0" @@ -9521,8 +10585,8 @@ __metadata: linkType: hard "unplugin-vue-components@npm:^0.22.4": - version: 0.22.8 - resolution: "unplugin-vue-components@npm:0.22.8" + version: 0.22.7 + resolution: "unplugin-vue-components@npm:0.22.7" dependencies: "@antfu/utils": ^0.5.2 "@rollup/pluginutils": ^4.2.1 @@ -9530,21 +10594,21 @@ __metadata: debug: ^4.3.4 fast-glob: ^3.2.12 local-pkg: ^0.4.2 - magic-string: ^0.26.5 + magic-string: ^0.26.3 minimatch: ^5.1.0 resolve: ^1.22.1 - unplugin: ^0.9.6 + unplugin: ^0.9.5 peerDependencies: "@babel/parser": ^7.15.8 vue: 2 || 3 peerDependenciesMeta: "@babel/parser": optional: true - checksum: c32902d7244bea2fab5cf814f7cd99f62584e0f48d9c1fee804495b436a797723a2f780a724bcf36735900848a61631f3f49cb8cd5063f58b7d4b98355bbfc50 + checksum: d2054656b980ccce306aeef1cc34f786c457fe3cfd316bca97c3f09943ebb80e2269659686914fc09cbaa9a32511f46487ee4d18073d5b15ad3746ed6152bec7 languageName: node linkType: hard -"unplugin@npm:^0.9.6": +"unplugin@npm:^0.9.5": version: 0.9.6 resolution: "unplugin@npm:0.9.6" dependencies: @@ -9572,6 +10636,16 @@ __metadata: languageName: node linkType: hard +"url-parse@npm:^1.5.3": + version: 1.5.10 + resolution: "url-parse@npm:1.5.10" + dependencies: + querystringify: ^2.1.1 + requires-port: ^1.0.0 + checksum: fbdba6b1d83336aca2216bbdc38ba658d9cfb8fc7f665eb8b17852de638ff7d1a162c198a8e4ed66001ddbf6c9888d41e4798912c62b4fd777a31657989f7bdf + languageName: node + linkType: hard + "util-deprecate@npm:^1.0.1, util-deprecate@npm:^1.0.2, util-deprecate@npm:~1.0.1": version: 1.0.2 resolution: "util-deprecate@npm:1.0.2" @@ -9579,15 +10653,6 @@ __metadata: languageName: node linkType: hard -"uuid@npm:^8.3.2": - version: 8.3.2 - resolution: "uuid@npm:8.3.2" - bin: - uuid: dist/bin/uuid - checksum: 5575a8a75c13120e2f10e6ddc801b2c7ed7d8f3c8ac22c7ed0c7b2ba6383ec0abda88c905085d630e251719e0777045ae3236f04c812184b7c765f63a70e58df - languageName: node - linkType: hard - "uuid@npm:^9.0.0": version: 9.0.0 resolution: "uuid@npm:9.0.0" @@ -9597,6 +10662,17 @@ __metadata: languageName: node linkType: hard +"v8-to-istanbul@npm:^9.0.0": + version: 9.0.1 + resolution: "v8-to-istanbul@npm:9.0.1" + dependencies: + "@jridgewell/trace-mapping": ^0.3.12 + "@types/istanbul-lib-coverage": ^2.0.1 + convert-source-map: ^1.6.0 + checksum: a49c34bf0a3af0c11041a3952a2600913904a983bd1bc87148b5c033bc5c1d02d5a13620fcdbfa2c60bc582a2e2970185780f0c844b4c3a220abf405f8af6311 + languageName: node + linkType: hard + "validate-npm-package-license@npm:^3.0.1, validate-npm-package-license@npm:^3.0.4": version: 3.0.4 resolution: "validate-npm-package-license@npm:3.0.4" @@ -9607,16 +10683,7 @@ __metadata: languageName: node linkType: hard -"validate-npm-package-name@npm:*": - version: 5.0.0 - resolution: "validate-npm-package-name@npm:5.0.0" - dependencies: - builtins: ^5.0.0 - checksum: 5342a994986199b3c28e53a8452a14b2bb5085727691ea7aa0d284a6606b127c371e0925ae99b3f1ef7cc7d2c9de75f52eb61a3d1cc45e39bca1e3a9444cbb4e - languageName: node - linkType: hard - -"validate-npm-package-name@npm:^4.0.0": +"validate-npm-package-name@npm:*, validate-npm-package-name@npm:^4.0.0": version: 4.0.0 resolution: "validate-npm-package-name@npm:4.0.0" dependencies: @@ -9682,12 +10749,47 @@ __metadata: languageName: node linkType: hard -"vite@npm:^3.0.9": - version: 3.1.8 - resolution: "vite@npm:3.1.8" +"vite@npm:^3.0.0": + version: 3.2.2 + resolution: "vite@npm:3.2.2" dependencies: esbuild: ^0.15.9 fsevents: ~2.3.2 + postcss: ^8.4.18 + resolve: ^1.22.1 + rollup: ^2.79.1 + peerDependencies: + less: "*" + sass: "*" + stylus: "*" + sugarss: "*" + terser: ^5.4.0 + dependenciesMeta: + fsevents: + optional: true + peerDependenciesMeta: + less: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + bin: + vite: bin/vite.js + checksum: 7197ac91c612dda922367a95afa1b210353d6168d41845c186e2217bda1328d17b021b93d8089e336f9533b94645ae5dca18bb10937759f559c87006dd957fcd + languageName: node + linkType: hard + +"vite@npm:^3.0.9": + version: 3.1.3 + resolution: "vite@npm:3.1.3" + dependencies: + esbuild: ^0.15.6 + fsevents: ~2.3.2 postcss: ^8.4.16 resolve: ^1.22.1 rollup: ~2.78.0 @@ -9710,7 +10812,45 @@ __metadata: optional: true bin: vite: bin/vite.js - checksum: 982696ad134577dd9915c4c3548ad36ddcf5dc6d341058548a670a13d860e4cdaaf2b320a59221f178018df089d148b9980e9a344316bef12b698a1c1abc7390 + checksum: af13c9820c292792f02d0a25fd46d8557e627b93f95bc05b5f7f1261e9565e9e69fda2df0c0898f248edb811ebcac5400a85a81625ef29749f50b18273439d91 + languageName: node + linkType: hard + +"vitest@npm:0.24.5, vitest@npm:^0.24.3": + version: 0.24.5 + resolution: "vitest@npm:0.24.5" + dependencies: + "@types/chai": ^4.3.3 + "@types/chai-subset": ^1.3.3 + "@types/node": "*" + chai: ^4.3.6 + debug: ^4.3.4 + local-pkg: ^0.4.2 + strip-literal: ^0.4.2 + tinybench: ^2.3.1 + tinypool: ^0.3.0 + tinyspy: ^1.0.2 + vite: ^3.0.0 + peerDependencies: + "@edge-runtime/vm": "*" + "@vitest/browser": "*" + "@vitest/ui": "*" + happy-dom: "*" + jsdom: "*" + peerDependenciesMeta: + "@edge-runtime/vm": + optional: true + "@vitest/browser": + optional: true + "@vitest/ui": + optional: true + happy-dom: + optional: true + jsdom: + optional: true + bin: + vitest: vitest.mjs + checksum: 801d153082ec9d237d8720783dc939aa8c8a4cdd71625ddac997f99a98664b055a0e3efbcb3af648d44f0b8b80c014d48150b2c281870023628c1bdffa336d08 languageName: node linkType: hard @@ -9809,22 +10949,31 @@ __metadata: linkType: hard "vue-template-compiler@npm:^2.7.10": - version: 2.7.13 - resolution: "vue-template-compiler@npm:2.7.13" + version: 2.7.10 + resolution: "vue-template-compiler@npm:2.7.10" dependencies: de-indent: ^1.0.2 he: ^1.2.0 - checksum: d16d5416326dbe048559301e13e34437ecd52e9e80eef865c107e548ea48786f73539991aa361d213caeacc5420ee5a9c2d462da7aca9bc6fd439df83019ac19 + checksum: 52e4324d93ea5ecf6875c94eae99d3d4197cfb13538b6c2f5020df1776fb277e329325091c41da596b3cf1c7dabd56f50e2a538e2fc3d5ae23438d08471fdc8d languageName: node linkType: hard "vue@npm:^2.0.0, vue@npm:^2.5.21, vue@npm:^2.7.10": - version: 2.7.13 - resolution: "vue@npm:2.7.13" + version: 2.7.10 + resolution: "vue@npm:2.7.10" dependencies: - "@vue/compiler-sfc": 2.7.13 + "@vue/compiler-sfc": 2.7.10 csstype: ^3.1.0 - checksum: b54f6a307f19ebeca5ed24a08befb7141e57e56d0367dc8179dca69ca3f6fc8cf18cbf084387d79b4e8528bb53b645af5338d1322359009e2c27a19fb25a1a8f + checksum: 97887eea9ae0c7ec7309dcaed1ac9bb65803af235f63f629fe21df959be3c1b801f8aa7d1e85428624e149e5f47706950d0efe09f19b6a6e3b4d38a6352d5c71 + languageName: node + linkType: hard + +"w3c-xmlserializer@npm:^3.0.0": + version: 3.0.0 + resolution: "w3c-xmlserializer@npm:3.0.0" + dependencies: + xml-name-validator: ^4.0.0 + checksum: 0af8589942eeb11c9fe29eb31a1a09f3d5dd136aea53a9848dfbabff79ac0dd26fe13eb54d330d5555fe27bb50b28dca0715e09f9cc2bfa7670ccc8b7f919ca2 languageName: node linkType: hard @@ -9876,6 +11025,13 @@ __metadata: languageName: node linkType: hard +"webidl-conversions@npm:^7.0.0": + version: 7.0.0 + resolution: "webidl-conversions@npm:7.0.0" + checksum: f05588567a2a76428515333eff87200fae6c83c3948a7482ebb109562971e77ef6dc49749afa58abb993391227c5697b3ecca52018793e0cb4620a48f10bd21b + languageName: node + linkType: hard + "webpack-sources@npm:^3.2.3": version: 3.2.3 resolution: "webpack-sources@npm:3.2.3" @@ -9890,6 +11046,32 @@ __metadata: languageName: node linkType: hard +"whatwg-encoding@npm:^2.0.0": + version: 2.0.0 + resolution: "whatwg-encoding@npm:2.0.0" + dependencies: + iconv-lite: 0.6.3 + checksum: 7087810c410aa9b689cbd6af8773341a53cdc1f3aae2a882c163bd5522ec8ca4cdfc269aef417a5792f411807d5d77d50df4c24e3abb00bb60192858a40cc675 + languageName: node + linkType: hard + +"whatwg-mimetype@npm:^3.0.0": + version: 3.0.0 + resolution: "whatwg-mimetype@npm:3.0.0" + checksum: ce08bbb36b6aaf64f3a84da89707e3e6a31e5ab1c1a2379fd68df79ba712a4ab090904f0b50e6693b0dafc8e6343a6157e40bf18fdffd26e513cf95ee2a59824 + languageName: node + linkType: hard + +"whatwg-url@npm:^11.0.0": + version: 11.0.0 + resolution: "whatwg-url@npm:11.0.0" + dependencies: + tr46: ^3.0.0 + webidl-conversions: ^7.0.0 + checksum: ed4826aaa57e66bb3488a4b25c9cd476c46ba96052747388b5801f137dd740b73fde91ad207d96baf9f17fbcc80fc1a477ad65181b5eb5fa718d27c69501d7af + languageName: node + linkType: hard + "whatwg-url@npm:^5.0.0": version: 5.0.0 resolution: "whatwg-url@npm:5.0.0" @@ -9942,7 +11124,7 @@ __metadata: languageName: node linkType: hard -"word-wrap@npm:^1.2.3": +"word-wrap@npm:^1.2.3, word-wrap@npm:~1.2.3": version: 1.2.3 resolution: "word-wrap@npm:1.2.3" checksum: 30b48f91fcf12106ed3186ae4fa86a6a1842416df425be7b60485de14bec665a54a68e4b5156647dec3a70f25e84d270ca8bc8cd23182ed095f5c7206a938c1f @@ -9985,17 +11167,7 @@ __metadata: languageName: node linkType: hard -"write-file-atomic@npm:*": - version: 5.0.0 - resolution: "write-file-atomic@npm:5.0.0" - dependencies: - imurmurhash: ^0.1.4 - signal-exit: ^3.0.7 - checksum: 6ee16b195572386cb1c905f9d29808f77f4de2fd063d74a6f1ab6b566363832d8906a493b764ee715e57ab497271d5fc91642a913724960e8e845adf504a9837 - languageName: node - linkType: hard - -"write-file-atomic@npm:^4.0.0, write-file-atomic@npm:^4.0.1": +"write-file-atomic@npm:*, write-file-atomic@npm:^4.0.0, write-file-atomic@npm:^4.0.1": version: 4.0.2 resolution: "write-file-atomic@npm:4.0.2" dependencies: @@ -10005,6 +11177,21 @@ __metadata: languageName: node linkType: hard +"ws@npm:^8.9.0": + version: 8.10.0 + resolution: "ws@npm:8.10.0" + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + checksum: 3a32e15dffe633dd5ce99659793dbcf1440ea25d2da1060c88cbd22efdfb7986a6933e68aaa4b098fc3f1f7870cb386afd378a1ceaca4b31748471576d5a8b52 + languageName: node + linkType: hard + "xml-name-validator@npm:^4.0.0": version: 4.0.0 resolution: "xml-name-validator@npm:4.0.0" @@ -10012,6 +11199,13 @@ __metadata: languageName: node linkType: hard +"xmlchars@npm:^2.2.0": + version: 2.2.0 + resolution: "xmlchars@npm:2.2.0" + checksum: 8c70ac94070ccca03f47a81fcce3b271bd1f37a591bf5424e787ae313fcb9c212f5f6786e1fa82076a2c632c0141552babcd85698c437506dfa6ae2d58723062 + languageName: node + linkType: hard + "xtend@npm:~4.0.1": version: 4.0.2 resolution: "xtend@npm:4.0.2" @@ -10026,6 +11220,13 @@ __metadata: languageName: node linkType: hard +"yallist@npm:^2.1.2": + version: 2.1.2 + resolution: "yallist@npm:2.1.2" + checksum: 9ba99409209f485b6fcb970330908a6d41fa1c933f75e08250316cce19383179a6b70a7e0721b89672ebb6199cc377bf3e432f55100da6a7d6e11902b0a642cb + languageName: node + linkType: hard + "yallist@npm:^4.0.0": version: 4.0.0 resolution: "yallist@npm:4.0.0" @@ -10040,7 +11241,7 @@ __metadata: languageName: node linkType: hard -"yargs-parser@npm:^20.2.2, yargs-parser@npm:^20.2.3": +"yargs-parser@npm:^20.2.2, yargs-parser@npm:^20.2.3, yargs-parser@npm:^20.2.9": version: 20.2.9 resolution: "yargs-parser@npm:20.2.9" checksum: 8bb69015f2b0ff9e17b2c8e6bfe224ab463dd00ca211eece72a4cd8a906224d2703fb8a326d36fdd0e68701e201b2a60ed7cf81ce0fd9b3799f9fe7745977ae3