En un paquete de TS diseñado para ejecutarse tanto en nodeJS como en un navegador, quiero acceder a la generación aleatoria segura desde crypto.getRandomValues (navegador) o crypto.randomFillSync (nodo).
En package.json , tengo "type": "module" , toda mi biblioteca usa importaciones ES6 (por lo que no se define el requisito).
Utilizo tsc para compilar el paquete de nodos normal y acumularlo para empaquetarlo en un UMD para navegador.
Desafortunadamente, el módulo criptográfico del nodo se debe importar para que se pueda utilizar. La declaración de import no puede "ocultarse" dentro de if , por lo que se bloqueará cuando se ejecute en el navegador.
if(typeof crypto == "object"){ fillRandom = crypto.getRandomValues } else{ //node import crypto from "crypto" //Err: Cannot use import outside a module (browser) fillRandom = crypto.randomFillSync } Con commonJS, simplemente podría usar require("crypto") , pero ya me comprometí por completo a usar módulos ESM.
Me imagino que podría cambiar esta parte del código antes de compilar TS para el navegador/nodo, por lo que ambas versiones tendrían el código que tiene sentido en su entorno, pero no sé cómo, parece un poco exagerado.
¿Hay alguna manera?