Si vous utilisez dactylographié, vous pouvez lancer un tsconfig.json par défaut, et ce json contiendra des commentaires javascript // et / * * /. J'ai rencontré une situation avec ts-jest où je dois demander mon tsconfig et l'analyser, mais jest ne l'analyse pas car json n'autorise pas les commentaires. voir cela, je ne suis pas sûr de la façon dont le typographie le gère, mais il semble s'écarter de la règle.
// this fails if tsconfig has comments const tsconfig = require('./tsconfig')
Je veux garder les commentaires car ils sont vraiment utiles pour comprendre et maintenir mon tsconfig.json, et je veux exiger ma configuration pour pouvoir éviter de dupliquer le code et rendre les choses plus dynamiques.
Existe-t-il un moyen d'exiger un fichier json avec des commentaires en utilisant nodejs?
3 Réponses :
J'ai réussi à le faire en prétraitant le json pour supprimer les commentaires. Le code suivant fait le travail pour moi:
const fs = require('fs') const stripForwardSlashForwardSlashComment = new RegExp('//(.*)', 'g') const stripForwardSlashStarComment = new RegExp('[/][*](.*)[*][/]', 'gm') let jsontxt = fs.readFileSync('./tsconfig.json', 'utf8') jsontxt = jsontxt.replace(stripForwardSlashForwardSlashComment,'').replace(stripForwardSlashStarComment, '') const tsconfig = JSON.parse(jsontxt)
Note d'auto-réponse: publier pour garder ce public et obtenir des commentaires
Ce n'est pas sûr. Par exemple, ["//text"]
où la chaîne doit rester intacte, bien qu'elle contienne quelque chose qui ressemble à un commentaire.
json5 peut faire l'affaire. Installez JSON5 puis:
const JSON5 = require('json5'); const tsconfig = JSON5.parse(jsontxt);
Notez que la suppression des commentaires par vous-même est possible mais comporte plusieurs pièges, et c'est pourquoi ce n'est pas recommandé. Vous devriez rechercher:
"
qui ne marque pas la fin de la chaîne comme "foo\"bar"
. C'est plus déroutant avec "foo\\"
, où le second "termine la chaîne.//
commentaire peut contenir /*
, mais cela ne démarre pas un commentaire sur plusieurs lignes.//
dans un commentaire sur plusieurs lignes ne démarre pas un commentaire sur une seule ligne, de sorte que la suppression des commentaires dans /* // */ "hi"
aboutit à "hi"
.\
continue une seule ligne jusqu'à la ligne suivante? Est-ce qu'un \*/
termine un commentaire sur plusieurs lignes ou est-ce que \
fait que le *
agit différemment? (Ni l'un ni l'autre ne sont pris en charge en JavaScript).require-json5
est spécialement conçu pour cela:
require('require-json5').replace(); var tsconfig = require("./tsconfig");
Ou encore plus simplement:
const requireJSON5 = require('require-json5'); const tsconfig = requireJSON5('./tsconfig.json');