diff --git a/package.json b/package.json index c5c2d3cf..e7323331 100644 --- a/package.json +++ b/package.json @@ -6,9 +6,9 @@ "dependencies": { "@emotion/react": "^11.11.1", "@emotion/styled": "^11.11.0", - "@graasp/apps-query-client": "3.4.1", - "@graasp/sdk": "3.3.0", - "@graasp/translations": "1.21.1", + "@graasp/apps-query-client": "3.4.4", + "@graasp/sdk": "3.8.3", + "@graasp/translations": "1.23.0", "@mui/icons-material": "5.15.0", "@mui/material": "^5.15.0", "@mui/utils": "5.15.0", @@ -18,6 +18,7 @@ "@tanstack/react-query-devtools": "4.29.15", "@types/lodash.mapvalues": "4.6.9", "axios": "1.6.2", + "date-fns": "3.3.1", "i18next": "22.5.1", "lodash.clonedeep": "4.5.0", "lodash.groupby": "4.6.0", @@ -48,7 +49,7 @@ "eject": "react-scripts eject", "lint": "eslint .", "type-check": "tsc --noEmit", - "prettier:write": "prettier --write '{src,cypress}/**/*.{js,jsx,ts,tsx}'", + "prettier:write": "prettier --write '{src,cypress}/**/*.{json,js,jsx,ts,tsx}'", "build:local": "env-cmd -f ./.env.local yarn build", "build:dev": "env-cmd -f ./.env.dev yarn build", "build:prod": "env-cmd -f ./.env.prod yarn build", @@ -100,5 +101,8 @@ "standard-version": "9.5.0", "typescript": "5.1.6" }, + "resolutions": { + "@graasp/sdk": "3.8.3" + }, "packageManager": "yarn@3.6.0" } diff --git a/public/mockServiceWorker.js b/public/mockServiceWorker.js new file mode 100644 index 00000000..51d85eee --- /dev/null +++ b/public/mockServiceWorker.js @@ -0,0 +1,303 @@ +/* eslint-disable */ +/* tslint:disable */ + +/** + * Mock Service Worker (1.3.2). + * @see https://github.com/mswjs/msw + * - Please do NOT modify this file. + * - Please do NOT serve this file on production. + */ + +const INTEGRITY_CHECKSUM = '3d6b9f06410d179a7f7404d4bf4c3c70' +const activeClientIds = new Set() + +self.addEventListener('install', function () { + self.skipWaiting() +}) + +self.addEventListener('activate', function (event) { + event.waitUntil(self.clients.claim()) +}) + +self.addEventListener('message', async function (event) { + const clientId = event.source.id + + if (!clientId || !self.clients) { + return + } + + const client = await self.clients.get(clientId) + + if (!client) { + return + } + + const allClients = await self.clients.matchAll({ + type: 'window', + }) + + switch (event.data) { + case 'KEEPALIVE_REQUEST': { + sendToClient(client, { + type: 'KEEPALIVE_RESPONSE', + }) + break + } + + case 'INTEGRITY_CHECK_REQUEST': { + sendToClient(client, { + type: 'INTEGRITY_CHECK_RESPONSE', + payload: INTEGRITY_CHECKSUM, + }) + break + } + + case 'MOCK_ACTIVATE': { + activeClientIds.add(clientId) + + sendToClient(client, { + type: 'MOCKING_ENABLED', + payload: true, + }) + break + } + + case 'MOCK_DEACTIVATE': { + activeClientIds.delete(clientId) + break + } + + case 'CLIENT_CLOSED': { + activeClientIds.delete(clientId) + + const remainingClients = allClients.filter((client) => { + return client.id !== clientId + }) + + // Unregister itself when there are no more clients + if (remainingClients.length === 0) { + self.registration.unregister() + } + + break + } + } +}) + +self.addEventListener('fetch', function (event) { + const { request } = event + const accept = request.headers.get('accept') || '' + + // Bypass server-sent events. + if (accept.includes('text/event-stream')) { + return + } + + // Bypass navigation requests. + if (request.mode === 'navigate') { + return + } + + // Opening the DevTools triggers the "only-if-cached" request + // that cannot be handled by the worker. Bypass such requests. + if (request.cache === 'only-if-cached' && request.mode !== 'same-origin') { + return + } + + // Bypass all requests when there are no active clients. + // Prevents the self-unregistered worked from handling requests + // after it's been deleted (still remains active until the next reload). + if (activeClientIds.size === 0) { + return + } + + // Generate unique request ID. + const requestId = Math.random().toString(16).slice(2) + + event.respondWith( + handleRequest(event, requestId).catch((error) => { + if (error.name === 'NetworkError') { + console.warn( + '[MSW] Successfully emulated a network error for the "%s %s" request.', + request.method, + request.url, + ) + return + } + + // At this point, any exception indicates an issue with the original request/response. + console.error( + `\ +[MSW] Caught an exception from the "%s %s" request (%s). This is probably not a problem with Mock Service Worker. There is likely an additional logging output above.`, + request.method, + request.url, + `${error.name}: ${error.message}`, + ) + }), + ) +}) + +async function handleRequest(event, requestId) { + const client = await resolveMainClient(event) + const response = await getResponse(event, client, requestId) + + // Send back the response clone for the "response:*" life-cycle events. + // Ensure MSW is active and ready to handle the message, otherwise + // this message will pend indefinitely. + if (client && activeClientIds.has(client.id)) { + ;(async function () { + const clonedResponse = response.clone() + sendToClient(client, { + type: 'RESPONSE', + payload: { + requestId, + type: clonedResponse.type, + ok: clonedResponse.ok, + status: clonedResponse.status, + statusText: clonedResponse.statusText, + body: + clonedResponse.body === null ? null : await clonedResponse.text(), + headers: Object.fromEntries(clonedResponse.headers.entries()), + redirected: clonedResponse.redirected, + }, + }) + })() + } + + return response +} + +// Resolve the main client for the given event. +// Client that issues a request doesn't necessarily equal the client +// that registered the worker. It's with the latter the worker should +// communicate with during the response resolving phase. +async function resolveMainClient(event) { + const client = await self.clients.get(event.clientId) + + if (client?.frameType === 'top-level') { + return client + } + + const allClients = await self.clients.matchAll({ + type: 'window', + }) + + return allClients + .filter((client) => { + // Get only those clients that are currently visible. + return client.visibilityState === 'visible' + }) + .find((client) => { + // Find the client ID that's recorded in the + // set of clients that have registered the worker. + return activeClientIds.has(client.id) + }) +} + +async function getResponse(event, client, requestId) { + const { request } = event + const clonedRequest = request.clone() + + function passthrough() { + // Clone the request because it might've been already used + // (i.e. its body has been read and sent to the client). + const headers = Object.fromEntries(clonedRequest.headers.entries()) + + // Remove MSW-specific request headers so the bypassed requests + // comply with the server's CORS preflight check. + // Operate with the headers as an object because request "Headers" + // are immutable. + delete headers['x-msw-bypass'] + + return fetch(clonedRequest, { headers }) + } + + // Bypass mocking when the client is not active. + if (!client) { + return passthrough() + } + + // Bypass initial page load requests (i.e. static assets). + // The absence of the immediate/parent client in the map of the active clients + // means that MSW hasn't dispatched the "MOCK_ACTIVATE" event yet + // and is not ready to handle requests. + if (!activeClientIds.has(client.id)) { + return passthrough() + } + + // Bypass requests with the explicit bypass header. + // Such requests can be issued by "ctx.fetch()". + if (request.headers.get('x-msw-bypass') === 'true') { + return passthrough() + } + + // Notify the client that a request has been intercepted. + const clientMessage = await sendToClient(client, { + type: 'REQUEST', + payload: { + id: requestId, + url: request.url, + method: request.method, + headers: Object.fromEntries(request.headers.entries()), + cache: request.cache, + mode: request.mode, + credentials: request.credentials, + destination: request.destination, + integrity: request.integrity, + redirect: request.redirect, + referrer: request.referrer, + referrerPolicy: request.referrerPolicy, + body: await request.text(), + bodyUsed: request.bodyUsed, + keepalive: request.keepalive, + }, + }) + + switch (clientMessage.type) { + case 'MOCK_RESPONSE': { + return respondWithMock(clientMessage.data) + } + + case 'MOCK_NOT_FOUND': { + return passthrough() + } + + case 'NETWORK_ERROR': { + const { name, message } = clientMessage.data + const networkError = new Error(message) + networkError.name = name + + // Rejecting a "respondWith" promise emulates a network error. + throw networkError + } + } + + return passthrough() +} + +function sendToClient(client, message) { + return new Promise((resolve, reject) => { + const channel = new MessageChannel() + + channel.port1.onmessage = (event) => { + if (event.data && event.data.error) { + return reject(event.data.error) + } + + resolve(event.data) + } + + client.postMessage(message, [channel.port2]) + }) +} + +function sleep(timeMs) { + return new Promise((resolve) => { + setTimeout(resolve, timeMs) + }) +} + +async function respondWithMock(response) { + await sleep(response.delay) + return new Response(response.body, response) +} diff --git a/src/components/play/PlayExplanation.tsx b/src/components/play/PlayExplanation.tsx index d508d2d6..4dd75f95 100644 --- a/src/components/play/PlayExplanation.tsx +++ b/src/components/play/PlayExplanation.tsx @@ -20,7 +20,6 @@ const PlayExplanation = ({ currentQuestionData, showCorrection }: Props) => { return ( - {' '} {t('Explanations')} diff --git a/src/config/i18n.ts b/src/config/i18n.ts index cb0c559d..6d0a695d 100644 --- a/src/config/i18n.ts +++ b/src/config/i18n.ts @@ -2,8 +2,14 @@ import i18n from 'i18next'; import { initReactI18next } from 'react-i18next'; -import en from '../langs/en'; -import fr from '../langs/fr'; +import ar from '../langs/ar.json'; +import de from '../langs/de.json'; +import en from '../langs/en.json'; +import es from '../langs/es.json'; +import fr from '../langs/fr.json'; +import it from '../langs/it.json'; + +const QUIZ_NAMESPACE = 'quiz'; i18n.use(initReactI18next).init({ resources: { @@ -13,8 +19,7 @@ i18n.use(initReactI18next).init({ fallbackLng: 'en', // debug only when not in production debug: process.env.NODE_ENV !== 'production', - ns: ['translations'], - defaultNS: 'translations', + defaultNS: QUIZ_NAMESPACE, keySeparator: false, interpolation: { escapeValue: false, @@ -23,4 +28,11 @@ i18n.use(initReactI18next).init({ returnNull: false, }); +i18n.addResourceBundle('ar', QUIZ_NAMESPACE, ar); +i18n.addResourceBundle('de', QUIZ_NAMESPACE, de); +i18n.addResourceBundle('en', QUIZ_NAMESPACE, en); +i18n.addResourceBundle('es', QUIZ_NAMESPACE, es); +i18n.addResourceBundle('fr', QUIZ_NAMESPACE, fr); +i18n.addResourceBundle('it', QUIZ_NAMESPACE, it); + export default i18n; diff --git a/src/data/items.ts b/src/data/items.ts index 1176a90d..572fc7a8 100644 --- a/src/data/items.ts +++ b/src/data/items.ts @@ -1,5 +1,5 @@ -import { DiscriminatedItem } from '@graasp/sdk'; +import { AppItemFactory } from '@graasp/sdk'; -export const mockItem = { id: 'mock-item-id' } as DiscriminatedItem; +export const mockItem = AppItemFactory({ id: 'mock-item-id' }); export const mockItems = [mockItem]; diff --git a/src/langs/ar.json b/src/langs/ar.json new file mode 100644 index 00000000..0967ef42 --- /dev/null +++ b/src/langs/ar.json @@ -0,0 +1 @@ +{} diff --git a/src/langs/de.json b/src/langs/de.json new file mode 100644 index 00000000..0967ef42 --- /dev/null +++ b/src/langs/de.json @@ -0,0 +1 @@ +{} diff --git a/src/langs/en.json b/src/langs/en.json new file mode 100644 index 00000000..7a892193 --- /dev/null +++ b/src/langs/en.json @@ -0,0 +1,101 @@ +{ + "Answer Type": "Answer Type", + "Multiple Choices": "Multiple Choices", + "Text Input": "Text Input", + "Slider": "Slider", + "Question": "Question", + "Enter Question": "Enter Question", + "Previous": "Previous", + "Delete": "Delete", + "Save": "Save", + "Prev": "Prev", + "Next": "Next", + "Submit": "Submit", + "Type your answer": "Type your answer", + "Correct Answer": "Correct Answer: {{answer}}", + "Answer": "Answer", + "Answer nb": "Answer: {{nb}}", + "Add new question": "Add new question", + "Answers": "Answers", + "Add Answer": "Add Answer", + "Maximum": "Maximum", + "Minimum": "Minimum", + "Slide the cursor to the correct value": "Slide the cursor to the correct value", + "Add a new question": "Add a new question", + "FAILURE_MESSAGES.EMPTY_QUESTION": "Question title cannot be empty", + "FAILURE_MESSAGES.SLIDER_MIN_SMALLER_THAN_MAX": "The minimum value should be less than the maximum value", + "FAILURE_MESSAGES.SLIDER_UNDEFINED_MIN_MAX": "Minimum and maximum values should be defined", + "FAILURE_MESSAGES.MULTIPLE_CHOICES_ANSWER_COUNT": "You must provide at least 2 possible answers", + "FAILURE_MESSAGES.MULTIPLE_CHOICES_CORRECT_ANSWER": "You must set at least one correct answer", + "FAILURE_MESSAGES.MULTIPLE_CHOICES_EMPTY_CHOICE": "An answer cannot be empty", + "FAILURE_MESSAGES.TEXT_INPUT_NOT_EMPTY": "Answer cannot be empty", + "FAILURE_MESSAGES.FILL_BLANKS_EMPTY_TEXT": "The text cannot be empty", + "FAILURE_MESSAGES.FILL_BLANKS_UNMATCHING_TAGS": "The text has unmatching '<' and '>'", + "Create Quiz": "Create Quiz", + "Results": "Results", + "User": "User", + "Date": "Date", + "Correct": "Correct", + "Not yet answered": "Not yet answered", + "sorted descending": "sorted descending", + "sorted ascending": "sorted ascending", + "There isn't any question to display": "There isn't any question to display", + "Results by question": "Results by question", + "Results by user": "Results by user", + "No users answered the quiz yet": "No users answered the quiz yet", + "Analytics": "Analytics", + "Quiz performance": "Quiz performance", + "Users performance": "Users performance", + "Quiz correct response percentage": "Quiz correct response percentage", + "Correct responses": "Correct responses", + "Incorrect responses": "Incorrect responses", + "Number of correct/incorrect responses per question": "Number of correct/incorrect responses per question", + "Number of correct responses": "Number of correct responses", + "Percentage correct responses": "Percentage correct responses", + "Number of incorrect responses": "Number of incorrect responses", + "Percentage incorrect responses": "Percentage incorrect responses", + "Number of correct responses per user": "Number of correct responses per user", + "General": "General", + "Question answer frequency": "Question answer frequency", + "Answers distribution": "Answers distribution", + "Number of answers": "Number of answers", + "Number of time selected": "Number of time selected", + "Percentage number of time selected": "Percentage number of time selected", + "Error, question type unknown": "Error, question type unknown", + "Error, chart type unknown": "Error, chart type unknown", + "blank": "blank", + "NO_RESPONSE_FOR_NOW": "There is no response for now.", + "NO_DATA_FOR_GENERAL_CHARTS": "No data found for the charts.", + "ATTEMPTS_PROGRESS_NUMBER_OF_ATTEMPTS": "Number of attempts", + "CREATE_VIEW_NUMBER_OF_ATTEMPTS": "Number of attempts", + "MULTIPLE_CHOICE_NOT_CORRECT": "The answer is incomplete and/or contains incorrect choices.", + "HINTS_TITLE": "Hints", + "RESPONSE_NOT_CORRECT": "The answer you provided is not correct.", + "HINTS_SUB_TITLE": "Enter here the hints to help the student. They will be displayed if the answer is incorrect.", + "HINTS_LABEL": "Hints", + "HINTS_ALERT_TITLE": "Do you need some hints?", + "PREV_QUESTION_BTN": "Previous", + "NEXT_QUESTION_BTN": "Next", + "QUESTION_STEPPER_NAV_TITLE": "Quiz Navigation", + "QUESTION_STEPPER_TITLE_NO_MORE_ATTEMPTS": "No more attempts remaining", + "QUESTION_STEPPER_TITLE_ATTEMPTS": "{{current_attempts}} of {{max_attempts}} attempts", + "ADD_NEW_QUESTION": "Add a new question", + "QUESTION_POSITION_TITLE": "Position of the question", + "QUESTION_POSITION_EXPLANATION": "You can define a new position for this question. Changes are applied directly.", + "QUESTION_POSITION_LABEL": "Position of the question in the quiz", + "BUILDER_QUIZ_NAVIGATION_TITLE": "Quiz Navigation", + "MULTIPLE_ATTEMPTS_SECTION_TITLE": "Multiple attempts", + "MULTIPLE_ATTEMPTS_EXPLANATION": "If the value is greater than 1, you allow users to retry at most {{count}} times when the given answer is incorrect.", + "MULTIPLE_ATTEMPTS_SHOW_CORRECTNESS_CHECKBOX": "Display response errors after each attempt", + "MULTIPLE_ATTEMPTS_SHOW_CORRECTNESS_TOOLTIP": "If the option is enabled, the user will see the corrections for each reply sent. If not, the user will only be informed that his answer is not entirely correct.", + "MULTIPLE_CHOICE_SECTION_TITLE_CORRECT": "Your correct answers", + "MULTIPLE_CHOICE_SECTION_TITLE_INCORRECT": "Incorrect answers you selected", + "MULTIPLE_CHOICE_SECTION_TITLE_MISSING": "Correct answers you forgot", + "MULTIPLE_CHOICE_SECTION_TITLE_UNSELECTED": "Answers you haven't selected", + "PLAY_VIEW_RETRY_BTN": "Retry", + "ANALYTICS_CONSIDER_LAST_ATTEMPTS_TOGGLE": "Consider the last attempts by users only", + "MULTIPLE_CHOICE_ADD_HINT_BTN": "add hint", + "MULTIPLE_CHOICE_HINT_INPUT_LABEL": "Hint", + "MULTIPLE_CHOICE_HINT_INPUT_DESCRIPTION": "Type here a hint to help the user to find the answer or to understand it", + "CREATE_QUIZ_NOT_EXAM_SOLUTION_WARNING": "Caution: Users with some informatics skills can retrieve quiz answers; consider to not use it as an exam method." +} diff --git a/src/langs/en.ts b/src/langs/en.ts deleted file mode 100644 index cb05159c..00000000 --- a/src/langs/en.ts +++ /dev/null @@ -1,126 +0,0 @@ -import { FAILURE_MESSAGES } from '../config/constants'; - -// eslint-disable-next-line import/no-anonymous-default-export -export default { - translations: { - 'Answer Type': 'Answer Type', - 'Multiple Choices': 'Multiple Choices', - 'Text Input': 'Text Input', - Slider: 'Slider', - Question: 'Question', - 'Enter Question': 'Enter Question', - Previous: 'Previous', - Delete: 'Delete', - Save: 'Save', - Prev: 'Prev', - Next: 'Next', - Submit: 'Submit', - 'Type your answer': 'Type your answer', - 'Correct Answer': 'Correct Answer: {{answer}}', - Answer: 'Answer', - 'Answer nb': 'Answer: {{nb}}', - 'Add new question': 'Add new question', - Answers: 'Answers', - 'Add Answer': 'Add Answer', - Maximum: 'Maximum', - Minimum: 'Minimum', - 'Slide the cursor to the correct value': - 'Slide the cursor to the correct value', - 'Add a new question': 'Add a new question', - [FAILURE_MESSAGES.EMPTY_QUESTION]: 'Question title cannot be empty', - [FAILURE_MESSAGES.SLIDER_MIN_SMALLER_THAN_MAX]: - 'The minimum value should be less than the maximum value', - [FAILURE_MESSAGES.SLIDER_UNDEFINED_MIN_MAX]: - 'Minimum and maximum values should be defined', - [FAILURE_MESSAGES.MULTIPLE_CHOICES_ANSWER_COUNT]: - 'You must provide at least 2 possible answers', - [FAILURE_MESSAGES.MULTIPLE_CHOICES_CORRECT_ANSWER]: - 'You must set at least one correct answer', - [FAILURE_MESSAGES.MULTIPLE_CHOICES_EMPTY_CHOICE]: - 'An answer cannot be empty', - [FAILURE_MESSAGES.TEXT_INPUT_NOT_EMPTY]: 'Answer cannot be empty', - [FAILURE_MESSAGES.FILL_BLANKS_EMPTY_TEXT]: 'The text cannot be empty', - [FAILURE_MESSAGES.FILL_BLANKS_UNMATCHING_TAGS]: - 'The text has unmatching "<" and ">"', - 'Create Quiz': 'Create Quiz', - Results: 'Results', - User: 'User', - Date: 'Date', - Correct: 'Correct', - 'Not yet answered': 'Not yet answered', - 'sorted descending': 'sorted descending', - 'sorted ascending': 'sorted ascending', - "There isn't any question to display": - "There isn't any question to display", - 'Results by question': 'Results by question', - 'Results by user': 'Results by user', - 'No users answered the quiz yet': 'No users answered the quiz yet', - Analytics: 'Analytics', - 'Quiz performance': 'Quiz performance', - 'Users performance': 'Users performance', - 'Quiz correct response percentage': 'Quiz correct response percentage', - 'Correct responses': 'Correct responses', - 'Incorrect responses': 'Incorrect responses', - 'Number of correct/incorrect responses per question': - 'Number of correct/incorrect responses per question', - 'Number of correct responses': 'Number of correct responses', - 'Percentage correct responses': 'Percentage correct responses', - 'Number of incorrect responses': 'Number of incorrect responses', - 'Percentage incorrect responses': 'Percentage incorrect responses', - 'Number of correct responses per user': - 'Number of correct responses per user', - General: 'General', - 'Question answer frequency': 'Question answer frequency', - 'Answers distribution': 'Answers distribution', - 'Number of answers': 'Number of answers', - 'Number of time selected': 'Number of time selected', - 'Percentage number of time selected': 'Percentage number of time selected', - 'Error, question type unknown': 'Error, question type unknown', - 'Error, chart type unknown': 'Error, chart type unknown', - blank: 'blank', - NO_RESPONSE_FOR_NOW: 'There is no response for now.', - NO_DATA_FOR_GENERAL_CHARTS: 'No data found for the charts.', - ATTEMPTS_PROGRESS_NUMBER_OF_ATTEMPTS: 'Number of attempts', - CREATE_VIEW_NUMBER_OF_ATTEMPTS: 'Number of attempts', - MULTIPLE_CHOICE_NOT_CORRECT: - 'The answer is incomplete and/or contains incorrect choices.', - HINTS_TITLE: 'Hints', - RESPONSE_NOT_CORRECT: 'The answer you provided is not correct.', - HINTS_SUB_TITLE: - 'Enter here the hints to help the student. They will be displayed if the answer is incorrect.', - HINTS_LABEL: 'Hints', - HINTS_ALERT_TITLE: 'Do you need some hints?', - PREV_QUESTION_BTN: 'Previous', - NEXT_QUESTION_BTN: 'Next', - QUESTION_STEPPER_NAV_TITLE: 'Quiz Navigation', - QUESTION_STEPPER_TITLE_NO_MORE_ATTEMPTS: 'No more attempts remaining', - QUESTION_STEPPER_TITLE_ATTEMPTS: - '{{current_attempts}} of {{max_attempts}} attempts', - ADD_NEW_QUESTION: 'Add a new question', - QUESTION_POSITION_TITLE: 'Position of the question', - QUESTION_POSITION_EXPLANATION: - 'You can define a new position for this question. Changes are applied directly.', - QUESTION_POSITION_LABEL: 'Position of the question in the quiz', - BUILDER_QUIZ_NAVIGATION_TITLE: 'Quiz Navigation', - MULTIPLE_ATTEMPTS_SECTION_TITLE: 'Multiple attempts', - MULTIPLE_ATTEMPTS_EXPLANATION: - 'If the value is greater than 1, you allow users to retry at most {{count}} times when the given answer is incorrect.', - MULTIPLE_ATTEMPTS_SHOW_CORRECTNESS_CHECKBOX: - 'Display response errors after each attempt', - MULTIPLE_ATTEMPTS_SHOW_CORRECTNESS_TOOLTIP: - 'If the option is enabled, the user will see the corrections for each reply sent. If not, the user will only be informed that his answer is not entirely correct.', - MULTIPLE_CHOICE_SECTION_TITLE_CORRECT: 'Your correct answers', - MULTIPLE_CHOICE_SECTION_TITLE_INCORRECT: 'Incorrect answers you selected', - MULTIPLE_CHOICE_SECTION_TITLE_MISSING: 'Correct answers you forgot', - MULTIPLE_CHOICE_SECTION_TITLE_UNSELECTED: "Answers you haven't selected", - PLAY_VIEW_RETRY_BTN: 'Retry', - ANALYTICS_CONSIDER_LAST_ATTEMPTS_TOGGLE: - 'Consider the last attempts by users only', - MULTIPLE_CHOICE_ADD_HINT_BTN: 'add hint', - MULTIPLE_CHOICE_HINT_INPUT_LABEL: 'Hint', - MULTIPLE_CHOICE_HINT_INPUT_DESCRIPTION: - 'Type here a hint to help the user to find the answer or to understand it', - CREATE_QUIZ_NOT_EXAM_SOLUTION_WARNING: - 'Caution: Users with some informatics skills can retrieve quiz answers; consider to not use it as an exam method.', - }, -}; diff --git a/src/langs/es.json b/src/langs/es.json new file mode 100644 index 00000000..0967ef42 --- /dev/null +++ b/src/langs/es.json @@ -0,0 +1 @@ +{} diff --git a/src/langs/fr.json b/src/langs/fr.json new file mode 100644 index 00000000..7ce27213 --- /dev/null +++ b/src/langs/fr.json @@ -0,0 +1,100 @@ +{ + "Answer Type": "Type de la réponse", + "Multiple Choices": "Réponse à choix multiples", + "Text Input": "Texte", + "Slider": "Slider", + "Question": "Question", + "Enter Question": "Entrer une question", + "Previous": "Précédent", + "Delete": "Supprimer", + "Save": "Sauvegarder", + "Prev": "Précédent", + "Next": "Suivant", + "Submit": "Envoyer", + "Type your answer": "Entrer la réponse", + "Correct Answer": "Réponse correcte: {{answer}}", + "Answer": "Réponse", + "Answer nb": "Réponse: {{nb}}", + "Answers": "Réponses", + "Add Answer": "Ajouter une réponse", + "Maximum": "Maximum", + "Minimum": "Minimum", + "Slide the cursor to the correct value": "Déplacer le curseur sur la réponse correcte", + "Add a new question": "Ajouter une nouvelle question", + "EMPTY_QUESTION": "La question ne peut pas être vide", + "SLIDER_MIN_SMALLER_THAN_MAX": "La valeur minimum doit être plus petite que la valeur maximale", + "SLIDER_UNDEFINED_MIN_MAX": "Les valeurs maximales et minimales doivent être définies", + "MULTIPLE_CHOICES_ANSWER_COUNT": "Au moins 2 réponses doivent être proposées", + "MULTIPLE_CHOICES_CORRECT_ANSWER": "Au moins une réponse doit être correcte", + "MULTIPLE_CHOICES_EMPTY_CHOICE": "Une réponse ne peut pas être vide", + "TEXT_INPUT_NOT_EMPTY": "La réponse ne peut pas être vide", + "FILL_BLANKS_EMPTY_TEXT": "", + "FILL_BLANKS_UNMATCHING_TAGS": "", + "Create Quiz": "Créer un quiz", + "Results": "Résultats", + "User": "Utilisateur", + "Date": "Date", + "Correct": "Correcte", + "Not yet answered": "Pas encore répondu", + "sorted descending": "trié par ordre décroissant", + "sorted ascending": "trié par ordre croissant", + "There isn't any question to display": "Il n'y a aucune questions à afficher", + "Results by question": "Résultats par question", + "Results by user": "Résultats par utilisateur", + "No users answered the quiz yet": "Aucun utilisateur n'a répondu au quiz pour l'instant", + "Analytics": "Analytique", + "Quiz performance": "Performance du quiz", + "Users performance": "Performance des utilisateurs", + "Quiz correct response percentage": "Pourcentage de réponses correctes du quiz", + "Correct responses": "Réponses correctes", + "Incorrect responses": "Réponses incorrectes", + "Number of correct/incorrect responses per question": "Nombre de réponses correctes/incorrectes par question", + "Number of correct responses": "Nombre de réponses correctes", + "Percentage correct responses": "Pourcentage de réponses correctes", + "Number of incorrect responses": "Nombre de réponses incorrectes", + "Percentage incorrect responses": "Pourcentage de réponses incorrectes", + "Number of correct responses per user": "Nombre de réponses correctes par utilisateur", + "General": "Général", + "Question answer frequency": "Fréquence des réponses à la question", + "Answers distribution": "Distribution des réponses", + "Number of answers": "Nombre de réponses", + "Number of time selected": "Nombre de fois sélectionné", + "Percentage number of time selected": "Pourcentage du nombre de fois sélectionné", + "Error, question type unknown": "Erreur, type de question inconnu", + "Error, chart type unknown": "Erreur, type de graphique inconnu", + "blank": "vide", + "NO_RESPONSE_FOR_NOW": "Il n'y a pas encore de réponse.", + "NO_DATA_FOR_GENERAL_CHARTS": "Aucune donnée n'a été trouvé pour les graphiques.", + "ATTEMPTS_PROGRESS_NUMBER_OF_ATTEMPTS": "Nombre de tentatives", + "CREATE_VIEW_NUMBER_OF_ATTEMPTS": "Nombre de tentatives", + "MULTIPLE_CHOICE_NOT_CORRECT": "La réponse est incorrecte ou n'est pas entièrement correcte.", + "RESPONSE_NOT_CORRECT": "La réponse que vous avez fournie n'est pas correcte", + "HINTS_TITLE": "Indices", + "HINTS_SUB_TITLE": "Saisissez ici les indices qui s'afficheront si la réponse est incorrecte, afin d'aider l'étudiant", + "HINTS_LABEL": "Indices", + "HINTS_ALERT_TITLE": "Avez-vous besoins d'indices ?", + "PREV_QUESTION_BTN": "Précédent", + "NEXT_QUESTION_BTN": "Suivant", + "QUESTION_STEPPER_NAV_TITLE": "Navigation du Quiz", + "QUESTION_STEPPER_TITLE_NO_MORE_ATTEMPTS": "Aucune tentative restante", + "QUESTION_STEPPER_TITLE_ATTEMPTS": "{{current_attempts}} sur {{max_attempts}} tentatives", + "ADD_NEW_QUESTION": "Ajouter une nouvelle question", + "QUESTION_POSITION_TITLE": "Position de la question", + "QUESTION_POSITION_EXPLANATION": "Vous pouvez définir une nouvelle position pour cette question. Les changements sont appliqués directement", + "QUESTION_POSITION_LABEL": "Position de la question dans le quiz", + "BUILDER_QUIZ_NAVIGATION_TITLE": "Navigation du Quiz", + "MULTIPLE_ATTEMPTS_SECTION_TITLE": "Tentatives multiples", + "MULTIPLE_ATTEMPTS_EXPLANATION": "Si la valeur est supérieure à 1, vous autorisez les utilisateurs à réessayer au maximum {{count}} fois, lorsque la réponse donnée est incorrecte.", + "MULTIPLE_ATTEMPTS_SHOW_CORRECTNESS_CHECKBOX": "Afficher les erreurs dans la réponse après chaque tentative", + "MULTIPLE_ATTEMPTS_SHOW_CORRECTNESS_TOOLTIP": "Si l'option est activée, l'utilisateur verra les corrections pour chaque réponse envoyée. Dans le cas contraire, l'utilisateur sera seulement informé que sa réponse n'est pas tout à fait correcte.", + "MULTIPLE_CHOICE_SECTION_TITLE_CORRECT": "Vos réponses correctes", + "MULTIPLE_CHOICE_SECTION_TITLE_INCORRECT": "Les réponses incorrectes que vous avez sélectionnées", + "MULTIPLE_CHOICE_SECTION_TITLE_MISSING": "Les réponses correctes que vous avez oubliées", + "MULTIPLE_CHOICE_SECTION_TITLE_UNSELECTED": "Les réponses que vous n'avez pas sélectionnées", + "PLAY_VIEW_RETRY_BTN": "Réessayer", + "ANALYTICS_CONSIDER_LAST_ATTEMPTS_TOGGLE": "Tenir compte uniquement des dernières tentatives des utilisateurs", + "MULTIPLE_CHOICE_ADD_HINT_BTN": "ajouter un indice", + "MULTIPLE_CHOICE_HINT_INPUT_LABEL": "Indice", + "CHOIX_MULTIPLES_HINT_INPUT_DESCRIPTION": "Tapez ici un indice pour aider l'utilisateur à trouver la réponse ou à la comprendre", + "CREATE_QUIZ_NOT_EXAM_SOLUTION_WARNING": "Attention : Les utilisateurs ayant des compétences en informatique peuvent récupérer les réponses du quiz ; pensez à ne pas l'utiliser comme méthode d'examen" +} diff --git a/src/langs/fr.ts b/src/langs/fr.ts deleted file mode 100644 index 9491dcef..00000000 --- a/src/langs/fr.ts +++ /dev/null @@ -1,129 +0,0 @@ -import { FAILURE_MESSAGES } from '../config/constants'; - -// eslint-disable-next-line import/no-anonymous-default-export -export default { - translations: { - 'Answer Type': 'Type de la réponse', - 'Multiple Choices': 'Réponse à choix multiples', - 'Text Input': 'Texte', - Slider: 'Slider', - Question: 'Question', - 'Enter Question': 'Entrer une question', - Previous: 'Précédent', - Delete: 'Supprimer', - Save: 'Sauvegarder', - Prev: 'Précédent', - Next: 'Suivant', - Submit: 'Envoyer', - 'Type your answer': 'Entrer la réponse', - 'Correct Answer': 'Réponse correcte: {{answer}}', - Answer: 'Réponse', - 'Answer nb': 'Réponse: {{nb}}', - Answers: 'Réponses', - 'Add Answer': 'Ajouter une réponse', - Maximum: 'Maximum', - Minimum: 'Minimum', - 'Slide the cursor to the correct value': - 'Déplacer le curseur sur la réponse correcte', - 'Add a new question': 'Ajouter une nouvelle question', - [FAILURE_MESSAGES.EMPTY_QUESTION]: 'La question ne peut pas être vide', - [FAILURE_MESSAGES.SLIDER_MIN_SMALLER_THAN_MAX]: - 'La valeur minimum doit être plus petite que la valeur maximale', - [FAILURE_MESSAGES.SLIDER_UNDEFINED_MIN_MAX]: - 'Les valeurs maximales et minimales doivent être définies', - [FAILURE_MESSAGES.MULTIPLE_CHOICES_ANSWER_COUNT]: - 'Au moins 2 réponses doivent être proposées', - [FAILURE_MESSAGES.MULTIPLE_CHOICES_CORRECT_ANSWER]: - 'Au moins une réponse doit être correcte', - [FAILURE_MESSAGES.MULTIPLE_CHOICES_EMPTY_CHOICE]: - 'Une réponse ne peut pas être vide', - [FAILURE_MESSAGES.TEXT_INPUT_NOT_EMPTY]: 'La réponse ne peut pas être vide', - 'Create Quiz': 'Créer un quiz', - Results: 'Résultats', - User: 'Utilisateur', - Date: 'Date', - Correct: 'Correcte', - 'Not yet answered': 'Pas encore répondu', - 'sorted descending': 'trié par ordre décroissant', - 'sorted ascending': 'trié par ordre croissant', - "There isn't any question to display": - "Il n'y a aucune questions à afficher", - 'Results by question': 'Résultats par question', - 'Results by user': 'Résultats par utilisateur', - 'No users answered the quiz yet': - "Aucun utilisateur n'a répondu au quiz pour l'instant", - Analytics: 'Analytique', - 'Quiz performance': 'Performance du quiz', - 'Users performance': 'Performance des utilisateurs', - 'Quiz correct response percentage': - 'Pourcentage de réponses correctes du quiz', - 'Correct responses': 'Réponses correctes', - 'Incorrect responses': 'Réponses incorrectes', - 'Number of correct/incorrect responses per question': - 'Nombre de réponses correctes/incorrectes par question', - 'Number of correct responses': 'Nombre de réponses correctes', - 'Percentage correct responses': 'Pourcentage de réponses correctes', - 'Number of incorrect responses': 'Nombre de réponses incorrectes', - 'Percentage incorrect responses': 'Pourcentage de réponses incorrectes', - 'Number of correct responses per user': - 'Nombre de réponses correctes par utilisateur', - General: 'Général', - 'Question answer frequency': 'Fréquence des réponses à la question', - 'Answers distribution': 'Distribution des réponses', - 'Number of answers': 'Nombre de réponses', - 'Number of time selected': 'Nombre de fois sélectionné', - 'Percentage number of time selected': - 'Pourcentage du nombre de fois sélectionné', - 'Error, question type unknown': 'Erreur, type de question inconnu', - 'Error, chart type unknown': 'Erreur, type de graphique inconnu', - blank: 'vide', - NO_RESPONSE_FOR_NOW: "Il n'y a pas encore de réponse.", - NO_DATA_FOR_GENERAL_CHARTS: - "Aucune donnée n'a été trouvé pour les graphiques.", - ATTEMPTS_PROGRESS_NUMBER_OF_ATTEMPTS: 'Nombre de tentatives', - CREATE_VIEW_NUMBER_OF_ATTEMPTS: 'Nombre de tentatives', - MULTIPLE_CHOICE_NOT_CORRECT: - "La réponse est incorrecte ou n'est pas entièrement correcte.", - RESPONSE_NOT_CORRECT: "La réponse que vous avez fournie n'est pas correcte", - HINTS_TITLE: 'Indices', - HINTS_SUB_TITLE: - "Saisissez ici les indices qui s'afficheront si la réponse est incorrecte, afin d'aider l'étudiant", - HINTS_LABEL: 'Indices', - HINTS_ALERT_TITLE: "Avez-vous besoins d'indices ?", - PREV_QUESTION_BTN: 'Précédent', - NEXT_QUESTION_BTN: 'Suivant', - QUESTION_STEPPER_NAV_TITLE: 'Navigation du Quiz', - QUESTION_STEPPER_TITLE_NO_MORE_ATTEMPTS: 'Aucune tentative restante', - QUESTION_STEPPER_TITLE_ATTEMPTS: - '{{current_attempts}} sur {{max_attempts}} tentatives', - ADD_NEW_QUESTION: 'Ajouter une nouvelle question', - QUESTION_POSITION_TITLE: 'Position de la question', - QUESTION_POSITION_EXPLANATION: - 'Vous pouvez définir une nouvelle position pour cette question. Les changements sont appliqués directement', - QUESTION_POSITION_LABEL: 'Position de la question dans le quiz', - BUILDER_QUIZ_NAVIGATION_TITLE: 'Navigation du Quiz', - MULTIPLE_ATTEMPTS_SECTION_TITLE: 'Tentatives multiples', - MULTIPLE_ATTEMPTS_EXPLANATION: - 'Si la valeur est supérieure à 1, vous autorisez les utilisateurs à réessayer au maximum {{count}} fois, lorsque la réponse donnée est incorrecte.', - MULTIPLE_ATTEMPTS_SHOW_CORRECTNESS_CHECKBOX: - 'Afficher les erreurs dans la réponse après chaque tentative', - MULTIPLE_ATTEMPTS_SHOW_CORRECTNESS_TOOLTIP: - "Si l'option est activée, l'utilisateur verra les corrections pour chaque réponse envoyée. Dans le cas contraire, l'utilisateur sera seulement informé que sa réponse n'est pas tout à fait correcte.", - MULTIPLE_CHOICE_SECTION_TITLE_CORRECT: 'Vos réponses correctes', - MULTIPLE_CHOICE_SECTION_TITLE_INCORRECT: - 'Les réponses incorrectes que vous avez sélectionnées', - MULTIPLE_CHOICE_SECTION_TITLE_MISSING: - 'Les réponses correctes que vous avez oubliées', - MULTIPLE_CHOICE_SECTION_TITLE_UNSELECTED: - "Les réponses que vous n'avez pas sélectionnées", - PLAY_VIEW_RETRY_BTN: 'Réessayer', - ANALYTICS_CONSIDER_LAST_ATTEMPTS_TOGGLE: - 'Tenir compte uniquement des dernières tentatives des utilisateurs', - MULTIPLE_CHOICE_ADD_HINT_BTN: 'ajouter un indice', - MULTIPLE_CHOICE_HINT_INPUT_LABEL: 'Indice', - CHOIX_MULTIPLES_HINT_INPUT_DESCRIPTION: - "Tapez ici un indice pour aider l'utilisateur à trouver la réponse ou à la comprendre", - CREATE_QUIZ_NOT_EXAM_SOLUTION_WARNING: - "Attention : Les utilisateurs ayant des compétences en informatique peuvent récupérer les réponses du quiz ; pensez à ne pas l'utiliser comme méthode d'examen", - }, -}; diff --git a/src/langs/it.json b/src/langs/it.json new file mode 100644 index 00000000..0967ef42 --- /dev/null +++ b/src/langs/it.json @@ -0,0 +1 @@ +{} diff --git a/yarn.lock b/yarn.lock index 04b93f06..8be80ebe 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1595,7 +1595,7 @@ __metadata: languageName: node linkType: hard -"@babel/runtime@npm:^7.11.2, @babel/runtime@npm:^7.12.5, @babel/runtime@npm:^7.15.4, @babel/runtime@npm:^7.16.3, @babel/runtime@npm:^7.18.3, @babel/runtime@npm:^7.20.6, @babel/runtime@npm:^7.20.7, @babel/runtime@npm:^7.21.0, @babel/runtime@npm:^7.5.5, @babel/runtime@npm:^7.8.4, @babel/runtime@npm:^7.8.7, @babel/runtime@npm:^7.9.2": +"@babel/runtime@npm:^7.11.2, @babel/runtime@npm:^7.12.5, @babel/runtime@npm:^7.15.4, @babel/runtime@npm:^7.16.3, @babel/runtime@npm:^7.18.3, @babel/runtime@npm:^7.20.6, @babel/runtime@npm:^7.20.7, @babel/runtime@npm:^7.5.5, @babel/runtime@npm:^7.8.4, @babel/runtime@npm:^7.8.7, @babel/runtime@npm:^7.9.2": version: 7.22.11 resolution: "@babel/runtime@npm:7.22.11" dependencies: @@ -1622,6 +1622,15 @@ __metadata: languageName: node linkType: hard +"@babel/runtime@npm:^7.23.9": + version: 7.23.9 + resolution: "@babel/runtime@npm:7.23.9" + dependencies: + regenerator-runtime: ^0.14.0 + checksum: 6bbebe8d27c0c2dd275d1ac197fc1a6c00e18dab68cc7aaff0adc3195b45862bae9c4cc58975629004b0213955b2ed91e99eccb3d9b39cabea246c657323d667 + languageName: node + linkType: hard + "@babel/template@npm:^7.22.5, @babel/template@npm:^7.3.3": version: 7.22.5 resolution: "@babel/template@npm:7.22.5" @@ -2018,7 +2027,28 @@ __metadata: languageName: node linkType: hard -"@emotion/react@npm:11.11.1, @emotion/react@npm:^11.11.1": +"@emotion/react@npm:11.11.3": + version: 11.11.3 + resolution: "@emotion/react@npm:11.11.3" + dependencies: + "@babel/runtime": ^7.18.3 + "@emotion/babel-plugin": ^11.11.0 + "@emotion/cache": ^11.11.0 + "@emotion/serialize": ^1.1.3 + "@emotion/use-insertion-effect-with-fallbacks": ^1.0.1 + "@emotion/utils": ^1.2.1 + "@emotion/weak-memoize": ^0.3.1 + hoist-non-react-statics: ^3.3.1 + peerDependencies: + react: ">=16.8.0" + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 2e4b223591569f0a41686d5bd72dc8778629b7be33267e4a09582979e6faee4d7218de84e76294ed827058d4384d75557b5d71724756539c1f235e9a69e62b2e + languageName: node + linkType: hard + +"@emotion/react@npm:^11.11.1": version: 11.11.1 resolution: "@emotion/react@npm:11.11.1" dependencies: @@ -2052,6 +2082,19 @@ __metadata: languageName: node linkType: hard +"@emotion/serialize@npm:^1.1.3": + version: 1.1.3 + resolution: "@emotion/serialize@npm:1.1.3" + dependencies: + "@emotion/hash": ^0.9.1 + "@emotion/memoize": ^0.8.1 + "@emotion/unitless": ^0.8.1 + "@emotion/utils": ^1.2.1 + csstype: ^3.0.2 + checksum: 5a756ce7e2692322683978d8ed2e84eadd60bd6f629618a82c5018c84d98684b117e57fad0174f68ec2ec0ac089bb2e0bcc8ea8c2798eb904b6d3236aa046063 + languageName: node + linkType: hard + "@emotion/sheet@npm:^1.2.2": version: 1.2.2 resolution: "@emotion/sheet@npm:1.2.2" @@ -2151,6 +2194,22 @@ __metadata: languageName: node linkType: hard +"@faker-js/faker@npm:8.4.0": + version: 8.4.0 + resolution: "@faker-js/faker@npm:8.4.0" + checksum: 682581f0b009b7e8b81bc0736a3f1df2fb5179706786b87ef5bed5e2e28e22dfeba10e5122942371f12d68e833be3b3726850f96940baf080500cef35a77403b + languageName: node + linkType: hard + +"@floating-ui/core@npm:^1.0.0": + version: 1.6.0 + resolution: "@floating-ui/core@npm:1.6.0" + dependencies: + "@floating-ui/utils": ^0.2.1 + checksum: 2e25c53b0c124c5c9577972f8ae21d081f2f7895e6695836a53074463e8c65b47722744d6d2b5a993164936da006a268bcfe87fe68fd24dc235b1cb86bed3127 + languageName: node + linkType: hard + "@floating-ui/core@npm:^1.4.2": version: 1.5.2 resolution: "@floating-ui/core@npm:1.5.2" @@ -2170,6 +2229,16 @@ __metadata: languageName: node linkType: hard +"@floating-ui/dom@npm:^1.6.1": + version: 1.6.3 + resolution: "@floating-ui/dom@npm:1.6.3" + dependencies: + "@floating-ui/core": ^1.0.0 + "@floating-ui/utils": ^0.2.0 + checksum: 81cbb18ece3afc37992f436e469e7fabab2e433248e46fff4302d12493a175b0c64310f8a971e6e1eda7218df28ace6b70237b0f3c22fe12a21bba05b5579555 + languageName: node + linkType: hard + "@floating-ui/react-dom@npm:^2.0.4": version: 2.0.4 resolution: "@floating-ui/react-dom@npm:2.0.4" @@ -2182,6 +2251,18 @@ __metadata: languageName: node linkType: hard +"@floating-ui/react-dom@npm:^2.0.5": + version: 2.0.8 + resolution: "@floating-ui/react-dom@npm:2.0.8" + dependencies: + "@floating-ui/dom": ^1.6.1 + peerDependencies: + react: ">=16.8.0" + react-dom: ">=16.8.0" + checksum: 5da7f13a69281e38859a3203a608fe9de1d850b332b355c10c0c2427c7b7209a0374c10f6295b6577c1a70237af8b678340bd4cc0a4b1c66436a94755d81e526 + languageName: node + linkType: hard + "@floating-ui/utils@npm:^0.1.3": version: 0.1.6 resolution: "@floating-ui/utils@npm:0.1.6" @@ -2189,15 +2270,22 @@ __metadata: languageName: node linkType: hard -"@graasp/apps-query-client@npm:3.4.1": - version: 3.4.1 - resolution: "@graasp/apps-query-client@npm:3.4.1" +"@floating-ui/utils@npm:^0.2.0, @floating-ui/utils@npm:^0.2.1": + version: 0.2.1 + resolution: "@floating-ui/utils@npm:0.2.1" + checksum: 9ed4380653c7c217cd6f66ae51f20fdce433730dbc77f95b5abfb5a808f5fdb029c6ae249b4e0490a816f2453aa6e586d9a873cd157fdba4690f65628efc6e06 + languageName: node + linkType: hard + +"@graasp/apps-query-client@npm:3.4.4": + version: 3.4.4 + resolution: "@graasp/apps-query-client@npm:3.4.4" dependencies: - "@emotion/react": 11.11.1 + "@emotion/react": 11.11.3 "@emotion/styled": 11.11.0 - "@graasp/sdk": 3.3.0 - "@mui/icons-material": 5.15.1 - "@mui/material": 5.15.1 + "@graasp/sdk": 3.6.0 + "@mui/icons-material": 5.15.5 + "@mui/material": 5.15.5 axios: 0.27.2 dexie: 3.2.4 http-status-codes: 2.3.0 @@ -2205,46 +2293,37 @@ __metadata: msw: 1.3.2 uuid: 9.0.1 peerDependencies: + "@mui/icons-material": ^5.15.5 + "@mui/material": ^5.15.5 "@tanstack/react-query": ^4.28.0 "@tanstack/react-query-devtools": ^4.28.0 + date-fns: ^3.3.0 react: ^18.0.0 react-dom: ^18.0.0 - checksum: a267c498e579dd067643faca9495e47aee55b18398f5dc70759e05a33bfe4f90262f7184b426715a44a2d6ee4b487b3d2502b97823494c7181afaf067c15eb64 + checksum: 0dc55bf95e4e1b55dcefc9d1d8badb961965be3a6a928b43d4ff543e848f257dc84d28180967b220e83dfb4708af2707a430896ec96b85715f71e2bb2c4a8261 languageName: node linkType: hard -"@graasp/etherpad-api@npm:2.1.1": - version: 2.1.1 - resolution: "@graasp/etherpad-api@npm:2.1.1" +"@graasp/sdk@npm:3.8.3": + version: 3.8.3 + resolution: "@graasp/sdk@npm:3.8.3" dependencies: - "@types/sanitize-html": ^2.9.0 - axios: ^1.3.5 - compare-versions: ^3.4.0 - http-errors: ^1.7.1 - sanitize-html: ^2.10.0 - checksum: 30042c1716fb55a18e8230db6934add149639cabf00d1ac27d4e163a5381f906bdc36a0a38f5454b6d12ca2020adccd7d5784888e59887adc2b3db7929059f68 - languageName: node - linkType: hard - -"@graasp/sdk@npm:3.3.0": - version: 3.3.0 - resolution: "@graasp/sdk@npm:3.3.0" - dependencies: - "@graasp/etherpad-api": 2.1.1 - date-fns: 2.30.0 + "@faker-js/faker": 8.4.0 js-cookie: 3.0.5 - uuid: 9.0.1 validator: 13.11.0 - checksum: 7ed2ce8f30476b951d1d580dff7172916273ae4c29cc594723f51a4995d6981f6ef3bb6f953a8a026259a0c6a8d19c6d7d288bb9add1131ff1aa5c31652ebdda + peerDependencies: + date-fns: ^3 + uuid: ^9 + checksum: 19551923b2f75e703449f320390bcd42493e73b4800fb39d6b10cf8ecd56510969148a949b8dc0e131764369cb340c62634486ac4c614d543b3d39c31ca403e4 languageName: node linkType: hard -"@graasp/translations@npm:1.21.1": - version: 1.21.1 - resolution: "@graasp/translations@npm:1.21.1" +"@graasp/translations@npm:1.23.0": + version: 1.23.0 + resolution: "@graasp/translations@npm:1.23.0" dependencies: - i18next: 23.7.7 - checksum: 2a223855abca2a50bf7dedf045090de55930fd1d12b4a5b6cf8e4e6aa8d6b859d728e66e1f06115329ef8d726d388358517d16fec95935c5b1311e66992d43e2 + i18next: 23.7.16 + checksum: bbd183f854ce52fa7e7be6c05fda618295a3aebd82e454e37823ba127f3d08cd329ecb72cc0c57ae173baa713f4b2ab4fcecf9790aaf2ae6b1d9801d7d722691 languageName: node linkType: hard @@ -2710,16 +2789,16 @@ __metadata: languageName: node linkType: hard -"@mui/base@npm:5.0.0-beta.28": - version: 5.0.0-beta.28 - resolution: "@mui/base@npm:5.0.0-beta.28" +"@mui/base@npm:5.0.0-beta.32": + version: 5.0.0-beta.32 + resolution: "@mui/base@npm:5.0.0-beta.32" dependencies: - "@babel/runtime": ^7.23.5 - "@floating-ui/react-dom": ^2.0.4 - "@mui/types": ^7.2.11 - "@mui/utils": ^5.15.1 + "@babel/runtime": ^7.23.8 + "@floating-ui/react-dom": ^2.0.5 + "@mui/types": ^7.2.13 + "@mui/utils": ^5.15.5 "@popperjs/core": ^2.11.8 - clsx: ^2.0.0 + clsx: ^2.1.0 prop-types: ^15.8.1 peerDependencies: "@types/react": ^17.0.0 || ^18.0.0 @@ -2728,7 +2807,7 @@ __metadata: peerDependenciesMeta: "@types/react": optional: true - checksum: fe4f24fec5d59c35b21a73859991c4ecb86742f86c1e4c75ba7f4ddd73faa97239e2f4c86adf64d543e1514fb531758faf49d4cb5082f153e3c084d7c11d0da7 + checksum: 5f27be8914c072ffcbe6720de9aa6129180e68927657e8bcbc03a6f322d1ee6c6740a199d72ed0b490a7b29b79cc0c59d1e05a427089b17f4cbc9cc756e67506 languageName: node linkType: hard @@ -2739,10 +2818,10 @@ __metadata: languageName: node linkType: hard -"@mui/core-downloads-tracker@npm:^5.15.1": - version: 5.15.5 - resolution: "@mui/core-downloads-tracker@npm:5.15.5" - checksum: 4c9b1281ebe8d17d402e22f7f50c347c0b3918b1ed17af721f4de5ce282d90bc6d90fe9730595998b2bbb2f7ebe57fc55d4c858f31754fccdb606af472a59dc8 +"@mui/core-downloads-tracker@npm:^5.15.5": + version: 5.15.10 + resolution: "@mui/core-downloads-tracker@npm:5.15.10" + checksum: aeb16b31f60c08cc03585fedadceadd54aa48dda394fb945ab885f884c1b1692efb72309465641b6ca2367bd53d5fdce15f189d4691f42b59206622ffb2d6f0f languageName: node linkType: hard @@ -2762,11 +2841,11 @@ __metadata: languageName: node linkType: hard -"@mui/icons-material@npm:5.15.1": - version: 5.15.1 - resolution: "@mui/icons-material@npm:5.15.1" +"@mui/icons-material@npm:5.15.5": + version: 5.15.5 + resolution: "@mui/icons-material@npm:5.15.5" dependencies: - "@babel/runtime": ^7.23.5 + "@babel/runtime": ^7.23.8 peerDependencies: "@mui/material": ^5.0.0 "@types/react": ^17.0.0 || ^18.0.0 @@ -2774,22 +2853,22 @@ __metadata: peerDependenciesMeta: "@types/react": optional: true - checksum: e769b2f6fecfd92721b182e0d6569a9950fd44d88cc7b3bd6ac5cc77d6085c26316093c9cdb750b456ff6860e47a1b6e6e749e284ecdc6b50fad659c9cb75818 + checksum: a3382da9afa48e8603d21da515e0c82ccadcda7033c8dcfcd944ea72643da7f64fa9fa4e9b22c51d9ff4c9a07fc8553de5b537515a11d015fa1aacbe9f19461e languageName: node linkType: hard -"@mui/material@npm:5.15.1": - version: 5.15.1 - resolution: "@mui/material@npm:5.15.1" +"@mui/material@npm:5.15.5": + version: 5.15.5 + resolution: "@mui/material@npm:5.15.5" dependencies: - "@babel/runtime": ^7.23.5 - "@mui/base": 5.0.0-beta.28 - "@mui/core-downloads-tracker": ^5.15.1 - "@mui/system": ^5.15.1 - "@mui/types": ^7.2.11 - "@mui/utils": ^5.15.1 + "@babel/runtime": ^7.23.8 + "@mui/base": 5.0.0-beta.32 + "@mui/core-downloads-tracker": ^5.15.5 + "@mui/system": ^5.15.5 + "@mui/types": ^7.2.13 + "@mui/utils": ^5.15.5 "@types/react-transition-group": ^4.4.10 - clsx: ^2.0.0 + clsx: ^2.1.0 csstype: ^3.1.2 prop-types: ^15.8.1 react-is: ^18.2.0 @@ -2807,7 +2886,7 @@ __metadata: optional: true "@types/react": optional: true - checksum: 1f1e9f30a971f88f2b5811a663883ec8c62c4c072f05966c45419b66baa9bfa6329a4a32e5dfcad2739b17d83831da7bfe941e99d3c96eed8a3b665870b99376 + checksum: dbfcb31810c674d9ab3b9145752433de3917d9c0d1b491bdff84c44b8f1124e8fe8ab04fa09b974b497983b7bd3011b86fb441ad365f979f971d3ddb46712060 languageName: node linkType: hard @@ -2861,12 +2940,12 @@ __metadata: languageName: node linkType: hard -"@mui/private-theming@npm:^5.15.5": - version: 5.15.5 - resolution: "@mui/private-theming@npm:5.15.5" +"@mui/private-theming@npm:^5.15.9": + version: 5.15.9 + resolution: "@mui/private-theming@npm:5.15.9" dependencies: - "@babel/runtime": ^7.23.8 - "@mui/utils": ^5.15.5 + "@babel/runtime": ^7.23.9 + "@mui/utils": ^5.15.9 prop-types: ^15.8.1 peerDependencies: "@types/react": ^17.0.0 || ^18.0.0 @@ -2874,7 +2953,7 @@ __metadata: peerDependenciesMeta: "@types/react": optional: true - checksum: 3a5f7f190aa69a0ad69a34f77e54ee2fdcb088d21a61d4720b76d098d178e1c3f6a470fc5e7a30d351db10efbc062cb11af75b8789e2f38eaa2ca612bcb0f851 + checksum: 15cd0a7d8ba05452ef5f7a6a8856d333f6e6bfc3fe4ca0e242a4e37053856872603e374593f42a297d26353cdc0a8567d8424f8e7912b8bbd7f4507f9f9f2a74 languageName: node linkType: hard @@ -2899,13 +2978,13 @@ __metadata: languageName: node linkType: hard -"@mui/styled-engine@npm:^5.15.5": - version: 5.15.5 - resolution: "@mui/styled-engine@npm:5.15.5" +"@mui/styled-engine@npm:^5.15.9": + version: 5.15.9 + resolution: "@mui/styled-engine@npm:5.15.9" dependencies: - "@babel/runtime": ^7.23.8 + "@babel/runtime": ^7.23.9 "@emotion/cache": ^11.11.0 - csstype: ^3.1.2 + csstype: ^3.1.3 prop-types: ^15.8.1 peerDependencies: "@emotion/react": ^11.4.1 @@ -2916,7 +2995,7 @@ __metadata: optional: true "@emotion/styled": optional: true - checksum: 42bb7f50ed33ec88f799bd90a00337689837ee0b2d603681fe69c9a14850e5ae1d037505365ce78cd564307cc2c0654c46cece8d9250adb21c77b1de316e3c45 + checksum: 0a02a3b83d47277fa38421a6cfe0e8c6451e7d5a4d5b5d389ba970ebc55172040f0f2bd628f0211b659b922965ead416da0453e4bc15e7e83942f03ffa57621d languageName: node linkType: hard @@ -2948,17 +3027,17 @@ __metadata: languageName: node linkType: hard -"@mui/system@npm:^5.15.1": - version: 5.15.5 - resolution: "@mui/system@npm:5.15.5" +"@mui/system@npm:^5.15.5": + version: 5.15.9 + resolution: "@mui/system@npm:5.15.9" dependencies: - "@babel/runtime": ^7.23.8 - "@mui/private-theming": ^5.15.5 - "@mui/styled-engine": ^5.15.5 + "@babel/runtime": ^7.23.9 + "@mui/private-theming": ^5.15.9 + "@mui/styled-engine": ^5.15.9 "@mui/types": ^7.2.13 - "@mui/utils": ^5.15.5 + "@mui/utils": ^5.15.9 clsx: ^2.1.0 - csstype: ^3.1.2 + csstype: ^3.1.3 prop-types: ^15.8.1 peerDependencies: "@emotion/react": ^11.5.0 @@ -2972,7 +3051,7 @@ __metadata: optional: true "@types/react": optional: true - checksum: 3f736f120d65fa14588cd7554a9ef63c9d4480716807d7ee5543b9f25d936b5ac0396a51a565c53b2905114fed5f94880c896f091e8d269260bfc53e8a8e2fb5 + checksum: a5bda6f9c2b8e1241ed0f6865539fea65cdac31b61383c0f35bd1eedc838f67c68cce9609af5563aae6f45bec0c8242283fa408a2b989e23bdc9caeba9939950 languageName: node linkType: hard @@ -3018,7 +3097,7 @@ __metadata: languageName: node linkType: hard -"@mui/utils@npm:^5.15.1, @mui/utils@npm:^5.15.5": +"@mui/utils@npm:^5.15.5": version: 5.15.5 resolution: "@mui/utils@npm:5.15.5" dependencies: @@ -3036,6 +3115,24 @@ __metadata: languageName: node linkType: hard +"@mui/utils@npm:^5.15.9": + version: 5.15.9 + resolution: "@mui/utils@npm:5.15.9" + dependencies: + "@babel/runtime": ^7.23.9 + "@types/prop-types": ^15.7.11 + prop-types: ^15.8.1 + react-is: ^18.2.0 + peerDependencies: + "@types/react": ^17.0.0 || ^18.0.0 + react: ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 61e520c0a50cbf463d893b011eaea844dcf028e12387eec12378aa870d4342c688bfe5f48de1f4896dc1a0cc9d4224f90470d238105ee45c178cd8b4bbef7cf5 + languageName: node + linkType: hard + "@nicolo-ribaudo/eslint-scope-5-internals@npm:5.1.1-v1": version: 5.1.1-v1 resolution: "@nicolo-ribaudo/eslint-scope-5-internals@npm:5.1.1-v1" @@ -4261,15 +4358,6 @@ __metadata: languageName: node linkType: hard -"@types/sanitize-html@npm:^2.9.0": - version: 2.9.0 - resolution: "@types/sanitize-html@npm:2.9.0" - dependencies: - htmlparser2: ^8.0.0 - checksum: b60f42b740bbfb1b1434ce8b43925a38ecc608b60aa654fd009d2e22e33f324b61d370768c55bd2fd98e03de08518ffa8911d61606c483526fb931bb8b59d1b0 - languageName: node - linkType: hard - "@types/scheduler@npm:*": version: 0.16.3 resolution: "@types/scheduler@npm:0.16.3" @@ -5439,17 +5527,6 @@ __metadata: languageName: node linkType: hard -"axios@npm:^1.3.5": - version: 1.4.0 - resolution: "axios@npm:1.4.0" - dependencies: - follow-redirects: ^1.15.0 - form-data: ^4.0.0 - proxy-from-env: ^1.1.0 - checksum: 7fb6a4313bae7f45e89d62c70a800913c303df653f19eafec88e56cea2e3821066b8409bc68be1930ecca80e861c52aa787659df0ffec6ad4d451c7816b9386b - languageName: node - linkType: hard - "axobject-query@npm:^3.1.1": version: 3.2.1 resolution: "axobject-query@npm:3.2.1" @@ -6414,13 +6491,6 @@ __metadata: languageName: node linkType: hard -"compare-versions@npm:^3.4.0": - version: 3.6.0 - resolution: "compare-versions@npm:3.6.0" - checksum: 7492a50cdaa2c27f5254eee7c4b38856e1c164991bab3d98d7fd067fe4b570d47123ecb92523b78338be86aa221668fd3868bfe8caa5587dc3ebbe1a03d52b5d - languageName: node - linkType: hard - "compressible@npm:~2.0.16": version: 2.0.18 resolution: "compressible@npm:2.0.18" @@ -7109,6 +7179,13 @@ __metadata: languageName: node linkType: hard +"csstype@npm:^3.1.3": + version: 3.1.3 + resolution: "csstype@npm:3.1.3" + checksum: 8db785cc92d259102725b3c694ec0c823f5619a84741b5c7991b8ad135dfaa66093038a1cc63e03361a6cd28d122be48f2106ae72334e067dd619a51f49eddf7 + languageName: node + linkType: hard + "cypress@npm:13.2.0": version: 13.2.0 resolution: "cypress@npm:13.2.0" @@ -7196,12 +7273,10 @@ __metadata: languageName: node linkType: hard -"date-fns@npm:2.30.0": - version: 2.30.0 - resolution: "date-fns@npm:2.30.0" - dependencies: - "@babel/runtime": ^7.21.0 - checksum: f7be01523282e9bb06c0cd2693d34f245247a29098527d4420628966a2d9aad154bd0e90a6b1cf66d37adcb769cd108cf8a7bd49d76db0fb119af5cdd13644f4 +"date-fns@npm:3.3.1": + version: 3.3.1 + resolution: "date-fns@npm:3.3.1" + checksum: 6245e93a47de28ac96dffd4d62877f86e6b64854860ae1e00a4f83174d80bc8e59bd1259cf265223fb2ddce5c8e586dc9cc210f0d052faba2f7660e265877283 languageName: node linkType: hard @@ -7588,17 +7663,6 @@ __metadata: languageName: node linkType: hard -"dom-serializer@npm:^2.0.0": - version: 2.0.0 - resolution: "dom-serializer@npm:2.0.0" - dependencies: - domelementtype: ^2.3.0 - domhandler: ^5.0.2 - entities: ^4.2.0 - checksum: cd1810544fd8cdfbd51fa2c0c1128ec3a13ba92f14e61b7650b5de421b88205fd2e3f0cc6ace82f13334114addb90ed1c2f23074a51770a8e9c1273acbc7f3e6 - languageName: node - linkType: hard - "domelementtype@npm:1": version: 1.3.1 resolution: "domelementtype@npm:1.3.1" @@ -7606,7 +7670,7 @@ __metadata: languageName: node linkType: hard -"domelementtype@npm:^2.0.1, domelementtype@npm:^2.2.0, domelementtype@npm:^2.3.0": +"domelementtype@npm:^2.0.1, domelementtype@npm:^2.2.0": version: 2.3.0 resolution: "domelementtype@npm:2.3.0" checksum: ee837a318ff702622f383409d1f5b25dd1024b692ef64d3096ff702e26339f8e345820f29a68bcdcea8cfee3531776b3382651232fbeae95612d6f0a75efb4f6 @@ -7631,15 +7695,6 @@ __metadata: languageName: node linkType: hard -"domhandler@npm:^5.0.2, domhandler@npm:^5.0.3": - version: 5.0.3 - resolution: "domhandler@npm:5.0.3" - dependencies: - domelementtype: ^2.3.0 - checksum: 0f58f4a6af63e6f3a4320aa446d28b5790a009018707bce2859dcb1d21144c7876482b5188395a188dfa974238c019e0a1e610d2fc269a12b2c192ea2b0b131c - languageName: node - linkType: hard - "domutils@npm:^1.7.0": version: 1.7.0 resolution: "domutils@npm:1.7.0" @@ -7661,17 +7716,6 @@ __metadata: languageName: node linkType: hard -"domutils@npm:^3.0.1": - version: 3.1.0 - resolution: "domutils@npm:3.1.0" - dependencies: - dom-serializer: ^2.0.0 - domelementtype: ^2.3.0 - domhandler: ^5.0.3 - checksum: e5757456ddd173caa411cfc02c2bb64133c65546d2c4081381a3bafc8a57411a41eed70494551aa58030be9e58574fcc489828bebd673863d39924fb4878f416 - languageName: node - linkType: hard - "dot-case@npm:^3.0.4": version: 3.0.4 resolution: "dot-case@npm:3.0.4" @@ -7851,13 +7895,6 @@ __metadata: languageName: node linkType: hard -"entities@npm:^4.2.0, entities@npm:^4.4.0": - version: 4.5.0 - resolution: "entities@npm:4.5.0" - checksum: 853f8ebd5b425d350bffa97dd6958143179a5938352ccae092c62d1267c4e392a039be1bae7d51b6e4ffad25f51f9617531fedf5237f15df302ccfb452cbf2d7 - languageName: node - linkType: hard - "env-cmd@npm:10.1.0": version: 10.1.0 resolution: "env-cmd@npm:10.1.0" @@ -9573,9 +9610,9 @@ __metadata: "@cypress/instrument-cra": 1.4.0 "@emotion/react": ^11.11.1 "@emotion/styled": ^11.11.0 - "@graasp/apps-query-client": 3.4.1 - "@graasp/sdk": 3.3.0 - "@graasp/translations": 1.21.1 + "@graasp/apps-query-client": 3.4.4 + "@graasp/sdk": 3.8.3 + "@graasp/translations": 1.23.0 "@mui/icons-material": 5.15.0 "@mui/material": ^5.15.0 "@mui/utils": 5.15.0 @@ -9601,6 +9638,7 @@ __metadata: "@typescript-eslint/parser": 5.62.0 axios: 1.6.2 cypress: 13.2.0 + date-fns: 3.3.1 env-cmd: 10.1.0 eslint: ^8.3.0 eslint-config-prettier: 8.10.0 @@ -9923,18 +9961,6 @@ __metadata: languageName: node linkType: hard -"htmlparser2@npm:^8.0.0": - version: 8.0.2 - resolution: "htmlparser2@npm:8.0.2" - dependencies: - domelementtype: ^2.3.0 - domhandler: ^5.0.3 - domutils: ^3.0.1 - entities: ^4.4.0 - checksum: 29167a0f9282f181da8a6d0311b76820c8a59bc9e3c87009e21968264c2987d2723d6fde5a964d4b7b6cba663fca96ffb373c06d8223a85f52a6089ced942700 - languageName: node - linkType: hard - "http-cache-semantics@npm:^4.1.1": version: 4.1.1 resolution: "http-cache-semantics@npm:4.1.1" @@ -9962,19 +9988,6 @@ __metadata: languageName: node linkType: hard -"http-errors@npm:^1.7.1": - version: 1.8.1 - resolution: "http-errors@npm:1.8.1" - dependencies: - depd: ~1.1.2 - inherits: 2.0.4 - setprototypeof: 1.2.0 - statuses: ">= 1.5.0 < 2" - toidentifier: 1.0.1 - checksum: d3c7e7e776fd51c0a812baff570bdf06fe49a5dc448b700ab6171b1250e4cf7db8b8f4c0b133e4bfe2451022a5790c1ca6c2cae4094dedd6ac8304a1267f91d2 - languageName: node - linkType: hard - "http-errors@npm:~1.6.2": version: 1.6.3 resolution: "http-errors@npm:1.6.3" @@ -10105,12 +10118,12 @@ __metadata: languageName: node linkType: hard -"i18next@npm:23.7.7": - version: 23.7.7 - resolution: "i18next@npm:23.7.7" +"i18next@npm:23.7.16": + version: 23.7.16 + resolution: "i18next@npm:23.7.16" dependencies: "@babel/runtime": ^7.23.2 - checksum: f063140c8b38fd51b673200693ddc5f697ba9c4a87c5c7ca4b9233dd2cf8ada53e76e14af9659db5b3a5b0f4c3acb517ebaf28863116068e7d6bdacfaf7f0b09 + checksum: 907eb4429598a53780152a54e8f8edadb224b506dc419b8cc3130e74ace7445dfbaa03af8a173d5145834fa8b45c39310673420f825ace2002dc56bb5879add0 languageName: node linkType: hard @@ -10584,13 +10597,6 @@ __metadata: languageName: node linkType: hard -"is-plain-object@npm:^5.0.0": - version: 5.0.0 - resolution: "is-plain-object@npm:5.0.0" - checksum: e32d27061eef62c0847d303125440a38660517e586f2f3db7c9d179ae5b6674ab0f469d519b2e25c147a1a3bc87156d0d5f4d8821e0ce4a9ee7fe1fcf11ce45c - 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" @@ -13292,13 +13298,6 @@ __metadata: languageName: node linkType: hard -"parse-srcset@npm:^1.0.2": - version: 1.0.2 - resolution: "parse-srcset@npm:1.0.2" - checksum: 3a0380380c6082021fcce982f0b89fb8a493ce9dfd7d308e5e6d855201e80db8b90438649b31fdd82a3d6089a8ca17dccddaa2b730a718389af4c037b8539ebf - languageName: node - linkType: hard - "parse5@npm:6.0.1": version: 6.0.1 resolution: "parse5@npm:6.0.1" @@ -14309,7 +14308,7 @@ __metadata: languageName: node linkType: hard -"postcss@npm:^8.3.11, postcss@npm:^8.3.5, postcss@npm:^8.4.21, postcss@npm:^8.4.23, postcss@npm:^8.4.4": +"postcss@npm:^8.3.5, postcss@npm:^8.4.21, postcss@npm:^8.4.23, postcss@npm:^8.4.4": version: 8.4.28 resolution: "postcss@npm:8.4.28" dependencies: @@ -15444,20 +15443,6 @@ __metadata: languageName: node linkType: hard -"sanitize-html@npm:^2.10.0": - version: 2.11.0 - resolution: "sanitize-html@npm:2.11.0" - dependencies: - deepmerge: ^4.2.2 - escape-string-regexp: ^4.0.0 - htmlparser2: ^8.0.0 - is-plain-object: ^5.0.0 - parse-srcset: ^1.0.2 - postcss: ^8.3.11 - checksum: 44807f22b0feb5a6a883b4bc04bcd8690ec3bbd6dacb24d6e52226ffe0c0e4fad43d6a882ce60e3884a327fae2de01e67e566e3a211491add50ff0160be2e98a - languageName: node - linkType: hard - "sanitize.css@npm:*": version: 13.0.0 resolution: "sanitize.css@npm:13.0.0" @@ -16110,7 +16095,7 @@ __metadata: languageName: node linkType: hard -"statuses@npm:>= 1.4.0 < 2, statuses@npm:>= 1.5.0 < 2": +"statuses@npm:>= 1.4.0 < 2": version: 1.5.0 resolution: "statuses@npm:1.5.0" checksum: c469b9519de16a4bb19600205cffb39ee471a5f17b82589757ca7bd40a8d92ebb6ed9f98b5a540c5d302ccbc78f15dc03cc0280dd6e00df1335568a5d5758a5c