{"id":37692930,"url":"https://github.com/brokensandals/object-graph-as-json","last_synced_at":"2026-01-16T12:44:10.226Z","repository":{"id":44011818,"uuid":"233898963","full_name":"brokensandals/object-graph-as-json","owner":"brokensandals","description":"Library for serializing/deserializing arbitrary javascript objects as json.","archived":false,"fork":false,"pushed_at":"2023-01-05T05:17:28.000Z","size":1763,"stargazers_count":4,"open_issues_count":17,"forks_count":1,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-10-08T09:40:10.070Z","etag":null,"topics":["javascript","json","serialization"],"latest_commit_sha":null,"homepage":null,"language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/brokensandals.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2020-01-14T17:38:32.000Z","updated_at":"2022-07-21T04:07:33.000Z","dependencies_parsed_at":"2023-02-03T12:35:12.070Z","dependency_job_id":null,"html_url":"https://github.com/brokensandals/object-graph-as-json","commit_stats":null,"previous_names":[],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/brokensandals/object-graph-as-json","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/brokensandals%2Fobject-graph-as-json","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/brokensandals%2Fobject-graph-as-json/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/brokensandals%2Fobject-graph-as-json/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/brokensandals%2Fobject-graph-as-json/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/brokensandals","download_url":"https://codeload.github.com/brokensandals/object-graph-as-json/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/brokensandals%2Fobject-graph-as-json/sbom","scorecard":{"id":254426,"data":{"date":"2025-08-11","repo":{"name":"github.com/brokensandals/object-graph-as-json","commit":"26514085efd9d7eddd17732b4291f20b181ec65a"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":1.7,"checks":[{"name":"Maintained","score":0,"reason":"0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Code-Review","score":0,"reason":"Found 0/28 approved changesets -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Dangerous-Workflow","score":-1,"reason":"no workflows found","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"Token-Permissions","score":-1,"reason":"No tokens found","details":null,"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Pinned-Dependencies","score":-1,"reason":"no dependencies found","details":null,"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: MIT License: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'master'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 2 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"name":"Vulnerabilities","score":0,"reason":"60 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: GHSA-968p-4wvh-cqc8","Warn: Project is vulnerable to: GHSA-67hx-6x53-jw92","Warn: Project is vulnerable to: GHSA-v88g-cgmw-v5xw","Warn: Project is vulnerable to: GHSA-93q8-gq69-wqmw","Warn: Project is vulnerable to: GHSA-v6h2-p8h4-qcjw","Warn: Project is vulnerable to: GHSA-grv7-fg5c-xmjg","Warn: Project is vulnerable to: GHSA-x9w5-v3q2-3rhw","Warn: Project is vulnerable to: GHSA-w8qv-6jwh-64r5","Warn: Project is vulnerable to: GHSA-3xgq-45jj-v275","Warn: Project is vulnerable to: GHSA-gxpj-cx7g-858c","Warn: Project is vulnerable to: GHSA-w573-4hg7-7wgq","Warn: Project is vulnerable to: GHSA-vh7m-p724-62c2","Warn: Project is vulnerable to: GHSA-r9p9-mrjm-926w","Warn: Project is vulnerable to: GHSA-434g-2637-qmqr","Warn: Project is vulnerable to: GHSA-49q7-c7j4-3p7m","Warn: Project is vulnerable to: GHSA-977x-g7h5-7qgw","Warn: Project is vulnerable to: GHSA-f7q4-pwc6-w24p","Warn: Project is vulnerable to: GHSA-fc9h-whq2-v747","Warn: Project is vulnerable to: GHSA-vjh7-7g9h-fjfh","Warn: Project is vulnerable to: GHSA-fjxv-7rqg-78g4","Warn: Project is vulnerable to: GHSA-ww39-953v-wcq6","Warn: Project is vulnerable to: GHSA-43f8-2h32-f4cj","Warn: Project is vulnerable to: GHSA-qqgx-2p2h-9c37","Warn: Project is vulnerable to: GHSA-896r-f27r-55mw","Warn: Project is vulnerable to: GHSA-9c47-m6qq-7p4h","Warn: Project is vulnerable to: GHSA-6c8f-qphg-qjgp","Warn: Project is vulnerable to: GHSA-76p3-8jx3-jpfq","Warn: Project is vulnerable to: GHSA-3rfm-jhwj-7488","Warn: Project is vulnerable to: GHSA-hhq3-ff78-jv3g","Warn: Project is vulnerable to: GHSA-p6mc-m468-83gw","Warn: Project is vulnerable to: GHSA-29mw-wpgm-hmr9","Warn: Project is vulnerable to: GHSA-35jh-r3h4-6jhm","Warn: Project is vulnerable to: GHSA-952p-6rrq-rcjv","Warn: Project is vulnerable to: GHSA-f8q6-p94x-37v3","Warn: Project is vulnerable to: GHSA-vh95-rmgr-6w4m","Warn: Project is vulnerable to: GHSA-xvch-5gv4-984h","Warn: Project is vulnerable to: GHSA-5fw9-fq32-wv5p","Warn: Project is vulnerable to: GHSA-hj48-42vr-x3v9","Warn: Project is vulnerable to: GHSA-h7cp-r72f-jxh6","Warn: Project is vulnerable to: GHSA-v62p-rq8g-8h59","Warn: Project is vulnerable to: GHSA-hrpp-h998-j3pp","Warn: Project is vulnerable to: GHSA-p8p7-x288-28g6","Warn: Project is vulnerable to: GHSA-c2qf-rxjj-qqgw","Warn: Project is vulnerable to: GHSA-hxcc-f52p-wc94","Warn: Project is vulnerable to: GHSA-vx3p-948g-6vhq","Warn: Project is vulnerable to: GHSA-3jfq-g458-7qm9","Warn: Project is vulnerable to: GHSA-r628-mhmh-qjhw","Warn: Project is vulnerable to: GHSA-9r2w-394v-53qc","Warn: Project is vulnerable to: GHSA-5955-9wpr-37jh","Warn: Project is vulnerable to: GHSA-qq89-hq3f-393p","Warn: Project is vulnerable to: GHSA-f5x3-32g6-xq36","Warn: Project is vulnerable to: GHSA-4wf5-vphf-c2xc","Warn: Project is vulnerable to: GHSA-52f5-9888-hmc6","Warn: Project is vulnerable to: GHSA-jgrx-mgxx-jf9v","Warn: Project is vulnerable to: GHSA-72xf-g2v4-qvf3","Warn: Project is vulnerable to: GHSA-j8xg-fqg3-53r7","Warn: Project is vulnerable to: GHSA-6fc8-4gx4-v693","Warn: Project is vulnerable to: GHSA-3h5v-q93c-6h6q","Warn: Project is vulnerable to: GHSA-c4w7-xm78-47vh","Warn: Project is vulnerable to: GHSA-p9pc-299p-vxgp"],"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}}]},"last_synced_at":"2025-08-17T09:17:32.537Z","repository_id":44011818,"created_at":"2025-08-17T09:17:32.538Z","updated_at":"2025-08-17T09:17:32.538Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28478732,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-16T11:59:17.896Z","status":"ssl_error","status_checked_at":"2026-01-16T11:55:55.838Z","response_time":107,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["javascript","json","serialization"],"created_at":"2026-01-16T12:44:09.253Z","updated_at":"2026-01-16T12:44:10.217Z","avatar_url":"https://github.com/brokensandals.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# object-graph-as-json\n\n[![Build Status](https://travis-ci.org/brokensandals/object-graph-as-json.svg?branch=master)](https://travis-ci.org/brokensandals/object-graph-as-json)\n\nGiven an arbitrary javascript object, this library encodes it using only JSON-safe data types.\nTools for decoding the data are provided too.\n\nThis enables serializing/deserializing objects that `JSON.stringify` cannot handle.\n\nContents:\n\n1. [Goals](#goals)\n2. [Usage](#usage)\n3. [Spec](#spec)\n4. [Status \u0026 Known Limitations](#status--known-limitations)\n5. [Development](#development)\n6. [Contributing](#contributing)\n7. [License](#license)\n\n## Goals\n\n1. Support encoding circular / cyclic references among objects.\n2. Preserve as much detail as feasible about every type of javascript object.\n    - Even if decoding to an equivalent object will be impossible, consumers should still be able to access as much information as possible about what the original object was like.\n3. Be safe for automated tooling to inject at arbitrary points in a program without changing the program's behavior.\n    - Therefore, property getters will not be called unless they are built-in parts of javascript that do not have side effects.\n      (But the existence of the getter, and its function object, will be encoded.)\n    - As noted in the [limitations](#status--known-limitations) section, this goal is **not** necessarily achieved for `Proxy` objects.\n4. If desired, encode information about an object's identity.\n    - Enables determining whether two encoded objects (whether they are otherwise identical or not) originated from the same in-memory object or not.\n5. Represent common object types in a way that minimizes the amount of visual noise for a human inspecting the encoded graph.\n6. Keep the encoder small.\n\n## Usage\n\nInstall:\n\n```bash\nnpm i --save object-graph-as-json\n```\n\nImport the encoder:\n\n```javascript\nimport { Encoder } from 'object-graph-as-json';\n```\n\nMake whatever objects you want to encode; we'll demonstrate by creating a counter:\n\n```javascript\nfunction increment() {\n  this.current++;\n}\nconst counter = {\n  current: 1,\n  increment,\n};\ncounter.increment();\nconsole.log(counter.current); // 2\n```\n\nEncode the objects:\n\n```javascript\nconst encoder = new Encoder();\nconst encoded = encoder.encode(counter);\nconst json = JSON.stringify(encoded, null, 2);\nconsole.log(json);\n```\n\nOutput:\n\n```json\n{\n  \"id\": \"1\",\n  \"type\": \"object\",\n  \".current\": 2,\n  \".increment\": {\n    \"id\": \"2\",\n    \"type\": \"function\",\n    \"source\": \"function increment() {\\n  this.current++;\\n}\",\n    \".length\": {\n      \"type\": \"property\",\n      \"value\": 0,\n      \"configurable\": true\n    },\n    \".name\": {\n      \"type\": \"property\",\n      \"value\": \"increment\",\n      \"configurable\": true\n    },\n    \".arguments\": {\n      \"type\": \"property\",\n      \"value\": null\n    },\n    \".caller\": {\n      \"type\": \"property\",\n      \"value\": null\n    },\n    \".prototype\": {\n      \"type\": \"property\",\n      \"value\": {\n        \"id\": \"3\",\n        \"type\": \"object\",\n        \".constructor\": {\n          \"type\": \"property\",\n          \"value\": {\n            \"id\": \"2\",\n            \"type\": \"ref\"\n          },\n          \"writable\": true,\n          \"configurable\": true\n        }\n      },\n      \"writable\": true\n    }\n  }\n}\n```\n\nSee the docs in [src/Encoder.js](src/Encoder.js) for more info.\n\nIf you like to live on the edge, you can also decode the output back to real javascript objects:\n\n```javascript\nimport { UnsafeDecoder } from 'object-graph-as-json';\n\nconst parsed = JSON.parse(json);\nconst decoder = new UnsafeDecoder();\n// DO NOT DO THIS WITH UNTRUSTED INPUT!\nconst decoded = decoder.decode(parsed);\nconsole.log(decoded.current); // 2\ndecoded.increment();\nconsole.log(decoded.current); // 3\n```\n\nUnsafeDecoder allows the input to run arbitrary code at decode time, as [demonstrated in src/index.test.js](src/index.test.js), so it is not suitable for use in most situations without modification.\nSee [the jsdoc in src/UnsafeDecoder.js](src/UnsafeDecoder.js) for more info.\n\n## Spec\n\nNumbers (excluding `NaN` and `Infinity`), strings, booleans, and `null` are unchanged by encoding.\n\nEverything else is encoded to an object which contains, at minimum, a string field named `type`.\nAllowed values for `type` are:\n\n- `builtin`\n- `bigint`\n- `symbol`\n- `array`\n- `function`\n- `object`\n- `property` (only allowed for array/function/object property values)\n- `ref`\n- `unknown`\n\n`symbol`, `array`, `function`, `object`, and `ref` all contain fields named `id` which are used for indicating when the same original in-memory object appears at multiple points in the object graph.\nWithin a single encoded graph:\n- All symbols with the same id are the same symbol, and all symbols with different ids are different symbols.\n- The same id cannot appear on more than one array, function, or object; instead, after the first occurrence, a `ref` will be used instead.\n    - Objects/arrays/functions with different ids originate from different in-memory objects.\n    - All refs to the same id originated from the same in-memory object as the object/array/symbol on which that id appeared.\n    - No objects, arrays, functions, or refs should have the same id as a symbol.\n\n\n### builtin\n\nCertain values are recognized and simply referred to by name using an object with two fields:\n\n- `type` = `\"builtin\"`\n- `name`: See [src/builtins.js](src/builtins.js) for a current list of supported names.\n\n### bigint\n\nBigInts are encoded to an object with two fields:\n\n- `type` = `\"bigint\"`\n- `string`: The result of calling `.toString()` on the BigInt.\n\n### symbol\n\nSymbols are encoded to an object with three fields:\n\n- `type` = `\"symbol\"`\n- `id`\n- `description`: The result of retrieving `.description` from the Symbol.\n\nWhen the same id occurs on multiple symbols within a graph, the description must be the same on all of them.\n\n### array\n\nIf an array meets all the following conditions:\n\n- Its `typeof` is `object`.\n- Its prototype is `Array.prototype`.\n- Its `length` field is writable but not enumerable or configurable, and not an accessor.\n- Its highest index is its `length` field minus 1.\n- Its `length` field is \u003e= 0.\n\nThen it may be encoded to an object with `type` = `\"array\"`.\nThese should be interpreted in the same way as `type` = `\"object\"` except:\n\n- The original object's `typeof` is implied to be `object`.\n- The `prototype` field will not be included, since it is implied to be `Array.prototype`.\n- The `length` field will not be included, since it is assumed to equal the highest index plus 1 and to be writable but not enumerable or configurable and not an accessor.\n\n### function\n\nAnything whose `typeof` is `'function'` will be encoded to an object with `type` = `\"function\"`.\nThis is equivalent to `type` = `\"object\"` except:\n\n- The original object's `typeof` is implied to be `function`.\n- A `source` field is added containing the source code of the function as a string, to the best of the encoder's ability to determine it.\n  - This is not guaranteed to be valid javascript code.\n    Native functions, for example, may include the string `[native code]` in place of valid javascript code.\n- `prototype` is assumed to be `Function.prototype` if it is absent.\n\n### object\n\nObjects are encoded to objects with the following fields:\n\n- `type` = `\"object\"`\n- `id`\n- `prototype`: The encoded result of calling `Object.getPrototypeOf` on the object.\n  May be omitted if it is `Object.prototype`.\n- All of the original object's properties are encoded as properties.\n  - If the key is a string, it is encoded as that string, but prefixed with `\".\"`.\n  - If the key is a symbol and is a builtin, it is encoded as `\"@name\"`\n  - If the key is a symbol that is not a builtin and does not have a description, it is encoded as `\"~id\"`, where `id` is the unique identifier assigned to the symbol for the purposes of encoding.\n  - If the key is a symbol that is not a builtin and has a description, it is encoded as `\"~id|description\"`.\n    Note that the description may be an empty string, which is different from having no description (`symbol.description === ''` vs `symbol.description === undefined`).\n  - The value is encoded as described in the section on [properties](#property) below.\n\n### property\n\nIf a property meets all the following conditions:\n\n- It is not an accessor.\n- It is writable, enumerable, and configurable.\n\nThen the encoded value will be stored directly on the object.\nOtherwise, a property object will be created, which has the following structure:\n\n- `type` = `\"property\"`\n- `value`: The encoded value of the property; omitted for accessor properties.\n- `get`: The encoded value of the getter, if any, for accessor properties.\n- `set`: The encoded value of the setter, if any, for accessor properties.\n- `writable`: Boolean, may be omitted if false.\n- `enumerable`: Boolean, may be omitted if false.\n- `configurable`: Boolean, may be omitted if false.\n\n### ref\n\nWhile encoding an object graph, if any object/array/function appears more than once, the content of the object will only be encoded the first time.\nOn subsequent encounters, it's encoded as a wrapper object with two fields:\n\n- `type` = `\"ref\"`\n- `id`: The `id` that was used the first time the object was encoded.\n\nNote that refs are not used for symbols, because symbols can also occur in property keys (see section on [objects](#object) above), and it is simpler to just duplicate the information about the symbol than to account for the possibility of a ref to a property key.\nBut all symbols with the same id within the graph should be decoded to the same Symbol object.\n\n### unknown\n\nIf the encoder encounters a value whose `typeof` it does not recognize, it simply returns a wrapper object with two fields:\n\n- `type` = `\"unknown\"`\n- `typeof`: The result of `typeof`.\n\n## Status \u0026 Known Limitations\n\n- More types will likely be added in order to compactly represent things such as regexes.\n- The encoder makes no attempt to detect whether an object is a `Proxy`; proxied objects will be encoded as the proxy handler presents them, and the proxy handler's traps may be invoked.\n- There are more objects that should be added to the list of recognized builtins.\n- Recreating functions in general is janky.\n  - Bound functions (i.e. the result of calling `.bind(...)` on a function) cannot be recreated from their encoded form.\n  As far as I'm aware, javascript does not provide a way to programmatically determine that a function object is a bound function or to retrieve the bindings or the original function from a bound function.\n  The source code string for a bound function generally refers to native code.\n  - Variable bindings from enclosing lexical scopes are not preserved.\n  - The current UnsafeDecoder implementation assumes that the source code of the function is a valid function declaration, expression, or arrow function expression.\n    But depending on your execution environment, calling toString() on a method (which is what the encoder does to determine the source code) may result in a string that starts with the method name instead.\n- An instance of `Encoder` or `UnsafeDecoder` will never forget a symbol that it has seen.\n  If you use long-lived instances of these, and for some reason your program produces large numbers of new symbols which are included in objects that it encodes, this is a memory leak.\n\n## Development\n\nRequires [node](https://nodejs.org) and [npm](https://www.npmjs.com).\n\nClone this repo and run `npm install` to install development dependencies.\n\nRun `npm test` or `npm test:watch` to run the unit tests.\n\nRun `npm build` to produce builds in the `target` folder targeting CommonJS, ECMAScript Modules, and UMD.\n\n## Contributing\n\nBug reports and pull requests are welcome on GitHub at https://github.com/brokensandals/object-graph-as-json.\n\n## License\n\nThis is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbrokensandals%2Fobject-graph-as-json","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbrokensandals%2Fobject-graph-as-json","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbrokensandals%2Fobject-graph-as-json/lists"}