0
votes

Exiger un JSON avec des commentaires dans node.js

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?


0 commentaires

3 Réponses :


0
votes

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


1 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.



2
votes

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:

  • Les chaînes peuvent contenir des séquences qui ressemblent à des commentaires, mais elles ne le sont pas.
  • Les commentaires peuvent contenir des séquences qui ressemblent au début d'une chaîne, mais ce n'est pas le cas.
  • Les chaînes peuvent contenir " 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.
  • Un // commentaire peut contenir /* , mais cela ne démarre pas un commentaire sur plusieurs lignes.
  • Un // 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" .
  • Est-ce que \ 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).
  • les chaînes multi-lignes sont-elles prises en charge (elles sont en JavaScript)? Comment sont-ils déclarés / traités.


0 commentaires

0
votes

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');


0 commentaires