From f430b717e7f680d56feaf99a8b15c978233b082c Mon Sep 17 00:00:00 2001 From: Ronan Amicel Date: Wed, 19 Jan 2022 13:44:45 +0100 Subject: [PATCH] Utilise swc au lieu de Babel pour la transpilation MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Par contre, l’utilisation des tagged template litterals conduit à la génération de code qui déclenche une erreur dans terser (le minifieur) : https://github.com/parcel-bundler/parcel/issues/7101 On peut contourner le problème en écrivant différemment notre code pour échapper le nom du profil dans le HTML généré dynamiquement. --- .parcelrc | 5 +++++ serve.py | 2 +- src/scripts/affichage.js | 12 ------------ src/scripts/profil.js | 26 ++++++++++++++------------ src/scripts/suivi.js | 15 ++++++++------- src/scripts/tests/test.affichage.js | 10 ---------- 6 files changed, 28 insertions(+), 42 deletions(-) diff --git a/.parcelrc b/.parcelrc index bf95e4b35b..40d613c2c3 100644 --- a/.parcelrc +++ b/.parcelrc @@ -5,6 +5,11 @@ "parcel-resolver-ignore", "..." ], + "transformers": { + "*.{js,ts}": [ + "@parcel/transformer-js", + ] + }, "optimizers": { "*.html": ["parcel-optimizer-ogimage", "..."] }, diff --git a/serve.py b/serve.py index 30b2bbce55..8931fa0c23 100644 --- a/serve.py +++ b/serve.py @@ -20,7 +20,7 @@ import build PARCEL_CLI = "./node_modules/.bin/parcel" -BUNDLER_COMMAND = f"{PARCEL_CLI} watch --no-hmr src/*.html" +BUNDLER_COMMAND = f"{PARCEL_CLI} watch --target default --no-hmr src/*.html" LIVERELOAD_DELAY = 0.1 diff --git a/src/scripts/affichage.js b/src/scripts/affichage.js index 15fd4bee44..f7a097aa71 100644 --- a/src/scripts/affichage.js +++ b/src/scripts/affichage.js @@ -76,15 +76,3 @@ export function escapeHtml(str) { .replace(/'/g, ''') .replace(/`/g, '`') } - -export function safeHtml(literals, ...substitutions) { - let result = '' - - for (let i = 0; i < substitutions.length; i++) { - result += literals[i] - result += escapeHtml(substitutions[i]) - } - // add the last literal. - result += literals[literals.length - 1] - return result -} diff --git a/src/scripts/profil.js b/src/scripts/profil.js index e073341d6c..5da308ceb7 100644 --- a/src/scripts/profil.js +++ b/src/scripts/profil.js @@ -1,5 +1,5 @@ import { differenceEnJours, joursAvant } from './utils' -import { createElementFromHTML, safeHtml } from './affichage' +import { createElementFromHTML, escapeHtml } from './affichage' const JOURS_DE_VALIDITE_DEPISTAGE_NEGATIF = 7 const JOURS_DE_VALIDITE_DEPISTAGE_POSITIF = 30 @@ -751,10 +751,12 @@ export default class Profil { } renderNom() { - return safeHtml`

${this.affichageNom()}

` + const nomEchappe = escapeHtml(this.affichageNom()) + return `

${nomEchappe}

` } renderButtons(questionnaire) { + const nomEchappe = escapeHtml(this.nom) const possessifMasculinSingulier = this.estMonProfil() ? 'mon' : 'son' const possessifPluriel = this.estMonProfil() ? 'mes' : 'ses' var mainButton = '' @@ -764,33 +766,33 @@ export default class Profil { this.hasSuiviStartDate() && this.hasHistorique() ? 'Continuer' : 'Démarrer' - mainButton += safeHtml` + mainButton += ` ${verbe} ${possessifMasculinSingulier} suivi ` } - mainButton += safeHtml` + mainButton += ` Retrouver ${possessifPluriel} conseils ` } else { const label = this.isEmpty() ? 'Démarrer' : 'Continuer' - mainButton = safeHtml` + mainButton = ` ${label} ${possessifMasculinSingulier} questionnaire ` } const continueButton = this.isEmpty() ? '' - : safeHtml` - Modifier ${possessifPluriel} réponses ` - const deleteButton = safeHtml` - Supprimer ${possessifPluriel} réponses ` return mainButton + continueButton + deleteButton diff --git a/src/scripts/suivi.js b/src/scripts/suivi.js index ca83c9c74d..a230071495 100644 --- a/src/scripts/suivi.js +++ b/src/scripts/suivi.js @@ -1,5 +1,5 @@ import { format } from 'timeago.js' -import { createElementFromHTML, safeHtml } from './affichage' +import { createElementFromHTML, escapeHtml } from './affichage' import AlgorithmeSuivi from './algorithme/suivi' import { titleCase } from './utils' @@ -11,6 +11,7 @@ export default class SuiviView { } renderButtonSuivi() { + const nomEchappe = escapeHtml(this.profil.nom) const possessifMasculinSingulier = this.profil.estMonProfil() ? 'mon' : 'son' const possessifPluriel = this.profil.estMonProfil() ? 'mes' : 'ses' const label = @@ -20,20 +21,20 @@ export default class SuiviView { const nextPage = this.profil.hasSymptomesStartDate() ? 'suivisymptomes' : 'symptomes' - const suiviButton = safeHtml` + const suiviButton = ` ${label} ${possessifMasculinSingulier} suivi ` - const conseilsButton = safeHtml` + const conseilsButton = ` Retrouver ${possessifPluriel} conseils ` let deleteLink = '' if (this.profil.hasSuiviStartDate()) { - deleteLink = safeHtml` - Supprimer ${possessifMasculinSingulier} suivi ` } diff --git a/src/scripts/tests/test.affichage.js b/src/scripts/tests/test.affichage.js index 26b86cf4a3..0261be97b0 100644 --- a/src/scripts/tests/test.affichage.js +++ b/src/scripts/tests/test.affichage.js @@ -25,14 +25,4 @@ describe('Affichage', function () { assert.strictEqual(element.firstElementChild.className, 'visible') assert.isFalse(element.firstElementChild.hasAttribute('hidden')) }) - - it('On peut échapper du HTML depuis un tag pour template literal', function () { - var bar = 'baz' - assert.strictEqual(affichage.safeHtml`foo ${bar}`, 'foo baz') - var evil = '' - assert.strictEqual( - affichage.safeHtml`foo ${evil}`, - 'foo <script>alert("something evil")</script>' - ) - }) })