1.6.0 • Published 3 years ago

@jsenv/uneval v1.6.0

Weekly downloads
15
License
MIT
Repository
github
Last release
3 years ago

uneval

Convert value into evaluable string.

github package npm package github ci codecov coverage

Table of contents

Presentation

@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/uneval@1.1.0/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
1.6.0

3 years ago

1.5.1

3 years ago

1.5.0

3 years ago

1.4.0

4 years ago

1.3.1

4 years ago

1.3.0

4 years ago

1.2.0

4 years ago

1.1.0

5 years ago