Skip to content

jsenv/jsenv-uneval

Repository files navigation

uneval npm package

@jsenv/uneval turns a JavaScript value into a string that can be evaluated. It exists to overcome JSON.stringify limitations.

Using @jsenv/uneval + eval is more powerful and accurate than JSON.stringify + JSON.parse. It supports circular structure and preserves types like Date, Infinity, -0, BigInt and more.

However JSON.stringify is way faster and is safe (it cannot execute arbitrary code). So prefer JSON.stringify + JSON.parse over uneval + eval when you can.

JSON.stringify limits

  • Returns "{}" for a regexp

    JSON.stringify(/foo/) === "{}"
  • Returns "0" for -0

    JSON.stringify(-0) === "0"
  • Returns "null" for NaN

    JSON.stringify(NaN) === "null"
  • Returns "null" for Infinity

    JSON.stringify(Infinity) === "null"
  • Returns a string for a date

    JSON.stringify(new Date(0)) === `"1970-01-01T00:00:00.000Z"`
  • Throws on BigInt

    try {
      JSON.stringify(1n)
    } catch (e) {
      e.type // "TypeError"
      e.message // "Do not know how to serialize a BigInt"
    }
  • Throws on circular structure

    const value = {}
    value.self = value
    try {
      JSON.stringify(value)
    } catch (error) {
      error.name // "TypeError"
      error.message // "Converting circular structure to JSON"
    }
  • Ignores non enumerable properties

    JSON.stringify(Object.defineProperty({}, "foo", { enumerable: false })) ===
      "{}"
  • Is not optimized for repetitive structure

    const value = "a-very-long-string"
    JSON.stringify([value, value])

    "a-very-long-string" would be repeated twice the string.

Browser example

<script src="https://unpkg.com/@jsenv/[email protected]/dist/global/main.js"></script>
<script>
  const { uneval } = window.__jsenv_uneval__
  console.log(eval(uneval({ answer: 42 })))
</script>

— see also https://jsenv.github.io/jsenv-uneval/browser-example.

Node example

const { uneval } = require("@jsenv/uneval")

console.log(eval(uneval({ answer: 42 })))

— see also https://jsenv.github.io/jsenv-uneval/node-example.

Installation

npm install @jsenv/uneval

About

Convert value into evaluable string

Resources

License

Stars

Watchers

Forks

Sponsor this project

 

Packages

No packages published