{"id":18013619,"url":"https://github.com/ericsmekens/jsep","last_synced_at":"2025-12-12T03:21:47.788Z","repository":{"id":3458721,"uuid":"4512746","full_name":"EricSmekens/jsep","owner":"EricSmekens","description":"JavaScript Expression Parser","archived":false,"fork":false,"pushed_at":"2024-11-18T01:23:35.000Z","size":1926,"stargazers_count":928,"open_issues_count":38,"forks_count":140,"subscribers_count":20,"default_branch":"master","last_synced_at":"2025-10-03T20:32:27.198Z","etag":null,"topics":["expression-parser","hacktoberfest","javascript","jsep"],"latest_commit_sha":null,"homepage":"http://ericsmekens.github.io/jsep/","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/EricSmekens.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2012-05-31T20:48:09.000Z","updated_at":"2025-09-29T07:01:34.000Z","dependencies_parsed_at":"2024-03-27T05:22:38.087Z","dependency_job_id":"4cdf8b13-176b-436e-81d4-281dc74d1e2c","html_url":"https://github.com/EricSmekens/jsep","commit_stats":{"total_commits":349,"total_committers":27,"mean_commits":"12.925925925925926","dds":0.6361031518624642,"last_synced_commit":"72e045878a8237f30184cc7d6ae3f0dcd58a4ef5"},"previous_names":["soney/jsep"],"tags_count":104,"template":false,"template_full_name":null,"purl":"pkg:github/EricSmekens/jsep","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/EricSmekens%2Fjsep","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/EricSmekens%2Fjsep/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/EricSmekens%2Fjsep/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/EricSmekens%2Fjsep/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/EricSmekens","download_url":"https://codeload.github.com/EricSmekens/jsep/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/EricSmekens%2Fjsep/sbom","scorecard":{"id":46445,"data":{"date":"2025-08-11","repo":{"name":"github.com/EricSmekens/jsep","commit":"c68ca831ac9bcb88f536602572ac16977d267a89"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":2.4,"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":1,"reason":"Found 3/17 approved changesets -- score normalized to 1","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":10,"reason":"no dangerous workflow patterns detected","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":"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":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: no topLevel permission defined: .github/workflows/node.js.yml:1","Warn: no topLevel permission defined: .github/workflows/npm-publish.yml:1","Info: no jobLevel write permissions found"],"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":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/node.js.yml:20: update your workflow using https://app.stepsecurity.io/secureworkflow/EricSmekens/jsep/node.js.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/node.js.yml:22: update your workflow using https://app.stepsecurity.io/secureworkflow/EricSmekens/jsep/node.js.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/node.js.yml:26: update your workflow using https://app.stepsecurity.io/secureworkflow/EricSmekens/jsep/node.js.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/node.js.yml:32: update your workflow using https://app.stepsecurity.io/secureworkflow/EricSmekens/jsep/node.js.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/npm-publish.yml:20: update your workflow using https://app.stepsecurity.io/secureworkflow/EricSmekens/jsep/npm-publish.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/npm-publish.yml:22: update your workflow using https://app.stepsecurity.io/secureworkflow/EricSmekens/jsep/npm-publish.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/npm-publish.yml:26: update your workflow using https://app.stepsecurity.io/secureworkflow/EricSmekens/jsep/npm-publish.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/npm-publish.yml:32: update your workflow using https://app.stepsecurity.io/secureworkflow/EricSmekens/jsep/npm-publish.yml/master?enable=pin","Info:   0 out of   6 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   2 third-party GitHubAction dependencies pinned"],"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":"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":"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":"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":"Signed-Releases","score":0,"reason":"Project has not signed or included provenance with any releases.","details":["Warn: release artifact v1.4.0 not signed: https://api.github.com/repos/EricSmekens/jsep/releases/183635590","Warn: release artifact @jsep-plugin/ternary-v1.1.4 not signed: https://api.github.com/repos/EricSmekens/jsep/releases/183637304","Warn: release artifact @jsep-plugin/template-v1.0.5 not signed: https://api.github.com/repos/EricSmekens/jsep/releases/183637079","Warn: release artifact @jsep-plugin/spread-v1.0.3 not signed: https://api.github.com/repos/EricSmekens/jsep/releases/183636927","Warn: release artifact @jsep-plugin/regex-v1.0.4 not signed: https://api.github.com/repos/EricSmekens/jsep/releases/183636862","Warn: release artifact v1.4.0 does not have provenance: https://api.github.com/repos/EricSmekens/jsep/releases/183635590","Warn: release artifact @jsep-plugin/ternary-v1.1.4 does not have provenance: https://api.github.com/repos/EricSmekens/jsep/releases/183637304","Warn: release artifact @jsep-plugin/template-v1.0.5 does not have provenance: https://api.github.com/repos/EricSmekens/jsep/releases/183637079","Warn: release artifact @jsep-plugin/spread-v1.0.3 does not have provenance: https://api.github.com/repos/EricSmekens/jsep/releases/183636927","Warn: release artifact @jsep-plugin/regex-v1.0.4 does not have provenance: https://api.github.com/repos/EricSmekens/jsep/releases/183636862"],"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 17 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":"40 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: GHSA-h5c3-5r3r-rr8q","Warn: Project is vulnerable to: GHSA-rmvr-2pp2-xj38","Warn: Project is vulnerable to: GHSA-xx4v-prfh-6cgc","Warn: Project is vulnerable to: GHSA-93q8-gq69-wqmw","Warn: Project is vulnerable to: GHSA-fwr7-v2mv-hh25","Warn: Project is vulnerable to: GHSA-v6h2-p8h4-qcjw","Warn: Project is vulnerable to: GHSA-grv7-fg5c-xmjg","Warn: Project is vulnerable to: GHSA-3xgq-45jj-v275","Warn: Project is vulnerable to: GHSA-jc84-3g44-wf2q","Warn: Project is vulnerable to: GHSA-74fj-2j2h-c42q","Warn: Project is vulnerable to: GHSA-pw2r-vq6v-hr8c","Warn: Project is vulnerable to: GHSA-jchw-25xp-jwwc","Warn: Project is vulnerable to: GHSA-cxjh-pqwp-8mfp","Warn: Project is vulnerable to: GHSA-fjxv-7rqg-78g4","Warn: Project is vulnerable to: GHSA-rc47-6667-2j5j","Warn: Project is vulnerable to: GHSA-78xj-cgh5-2h22","Warn: Project is vulnerable to: GHSA-2p57-rm9w-gvfp","Warn: Project is vulnerable to: GHSA-896r-f27r-55mw","Warn: Project is vulnerable to: GHSA-5v2h-r2cx-5xgj","Warn: Project is vulnerable to: GHSA-rrrm-qjm4-v8hf","Warn: Project is vulnerable to: GHSA-952p-6rrq-rcjv","Warn: Project is vulnerable to: GHSA-f8q6-p94x-37v3","Warn: Project is vulnerable to: GHSA-xvch-5gv4-984h","Warn: Project is vulnerable to: GHSA-r683-j2x4-v87g","Warn: Project is vulnerable to: GHSA-hj9c-8jmm-8c52","Warn: Project is vulnerable to: GHSA-hrpp-h998-j3pp","Warn: Project is vulnerable to: GHSA-p8p7-x288-28g6","Warn: Project is vulnerable to: GHSA-gcx4-mw62-g8wm","Warn: Project is vulnerable to: GHSA-x2pg-mjhr-2m5x","Warn: Project is vulnerable to: GHSA-c2qf-rxjj-qqgw","Warn: Project is vulnerable to: GHSA-4x5v-gmq8-25ch","Warn: Project is vulnerable to: GHSA-f5x3-32g6-xq36","Warn: Project is vulnerable to: GHSA-pq67-2wwv-3xjx","Warn: Project is vulnerable to: GHSA-8cj5-5rvv-wf4v","Warn: Project is vulnerable to: GHSA-4wf5-vphf-c2xc","Warn: Project is vulnerable to: GHSA-72xf-g2v4-qvf3","Warn: Project is vulnerable to: GHSA-j8xg-fqg3-53r7","Warn: Project is vulnerable to: GHSA-3h5v-q93c-6h6q","Warn: Project is vulnerable to: GHSA-44c6-4v22-4mhx","Warn: Project is vulnerable to: GHSA-38fc-wpqx-33j7"],"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-14T22:53:06.069Z","repository_id":3458721,"created_at":"2025-08-14T22:53:06.069Z","updated_at":"2025-08-14T22:53:06.069Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":278373921,"owners_count":25976238,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-10-04T02:00:05.491Z","response_time":63,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"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":["expression-parser","hacktoberfest","javascript","jsep"],"created_at":"2024-10-30T03:22:27.436Z","updated_at":"2025-10-05T18:31:27.700Z","avatar_url":"https://github.com/EricSmekens.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"## jsep: A Tiny JavaScript Expression Parser\n\n[jsep](https://ericsmekens.github.io/jsep/) is a simple expression parser written in JavaScript. It can parse JavaScript expressions but not operations. The difference between expressions and operations is akin to the difference between a cell in an Excel spreadsheet vs. a proper JavaScript program.\n\n### Why jsep?\n\nI wanted a lightweight, tiny parser to be included in one of my other libraries. [esprima](http://esprima.org/) and other parsers are great, but had more power than I need and were *way* too large to be included in a library that I wanted to keep relatively small.\n\njsep's output is almost identical to [esprima's](http://esprima.org/doc/index.html#ast), which is in turn based on [SpiderMonkey's](https://developer.mozilla.org/en-US/docs/SpiderMonkey/Parser_API).\n\n### Custom Build\n\nWhile in the jsep project directory, run:\n\n```bash\nnpm install\nnpm run default\n```\n\nThe jsep built files will be in the build/ directory.\n\n### Usage\n\n#### Client-side\n\n```html\n\u003cscript type=\"module\"\u003e\n  import jsep from '/PATH/TO/jsep.min.js';\n  const parsed = jsep('1 + 1');\n\u003c/script\u003e\n\n\u003cscript src=\"/PATH/TO/jsep.iife.min.js\"\u003e\u003c/script\u003e\n  ...\nlet parse_tree = jsep(\"1 + 1\");\n```\n\n#### Node.JS\n\nFirst, run `npm install jsep`. Then, in your source file:\n\n```javascript\n// ESM:\nimport jsep from 'jsep';\nconst parse_tree = jsep('1 + 1');\n\n// or:\nimport { Jsep } from 'jsep';\nconst parse_tree = Jsep.parse('1 + 1');\n\n\n// CJS:\nconst jsep = require('jsep').default;\nconst parsed = jsep('1 + 1');\n\n// or:\nconst { Jsep } = require('jsep');\nconst parse_tree = Jsep.parse('1 + 1');\n```\n\n#### Custom Operators\n\n```javascript\n// Add a custom ^ binary operator with precedence 10\n// (Note that higher number = higher precedence)\njsep.addBinaryOp(\"^\", 10);\n\n// Add exponentiation operator (right-to-left)\njsep.addBinaryOp('**', 11, true); // now included by default\n\n// Add a custom @ unary operator\njsep.addUnaryOp('@');\n\n// Remove a binary operator\njsep.removeBinaryOp(\"\u003e\u003e\u003e\");\n\n// Remove a unary operator\njsep.removeUnaryOp(\"~\");\n```\n\n#### Custom Identifiers\n\nYou can add or remove additional valid identifier chars. ('_' and '$' are already treated like this.)\n\n```javascript\n// Add a custom @ identifier\njsep.addIdentifierChar(\"@\");\n\n// Removes a custom @ identifier\njsep.removeIdentifierChar('@');\n```\n\n#### Custom Literals\n\nYou can add or remove additional valid literals. By default, only `true`, `false`, and `null` are defined\n```javascript\n// Add standard JS literals:\njsep.addLiteral('undefined', undefined);\njsep.addLiteral('Infinity', Infinity);\njsep.addLiteral('NaN', NaN);\n\n// Remove \"null\" literal from default definition\njsep.removeLiteral('null');\n```\n\n### Plugins\nJSEP supports defining custom hooks for extending or modifying the expression parsing.\nPlugins are registered by calling `jsep.plugins.register()` with the plugin(s) as the argument(s).\n\n#### JSEP-provided plugins:\n|                                   |                                                                                           |\n|-----------------------------------|-------------------------------------------------------------------------------------------|\n| [ternary](packages/ternary)       | Built-in by default, adds support for ternary `a ? b : c` expressions                     |\n| [arrow](packages/arrow)           | Adds arrow-function support: `v =\u003e !!v`                                                   |\n| [assignment](packages/assignment) | Adds assignment and update expression support: `a = 2`, `a++`                             |\n| [comment](packages/comment)       | Adds support for ignoring comments: `a /* ignore this */ \u003e 1 // ignore this too`          |\n| [new](packages/new)               | Adds 'new' keyword support: `new Date()`                                                  |\n| [numbers](packages/numbers)       | Adds hex, octal, and binary number support, ignore _ char                                 |\n| [object](packages/object)         | Adds object expression support: `{ a: 1, b: { c }}`                                       |\n| [regex](packages/regex)           | Adds support for regular expression literals: `/[a-z]{2}/ig`                              |\n| [spread](packages/spread)         | Adds support for the spread operator, `fn(...[1, ...a])`. Works with `object` plugin, too |\n| [template](packages/template)     | Adds template literal support: `` `hi ${name}` ``                                         |\n|                                   |                                                                                           |\n\n#### How to add plugins:\nPlugins have a `name` property so that they can only be registered once.\nAny subsequent registrations will have no effect. Add a plugin by registering it with JSEP:\n\n```javascript\nimport jsep from 'jsep';\nimport ternary from '@jsep-plugin/ternary';\nimport object from '@jsep-plugin/object';\njsep.plugins.register(object);\njsep.plugins.register(ternary, object);\n```\n\n#### List plugins:\nPlugins are stored in an object, keyed by their name.\nThey can be retrieved through `jsep.plugins.registered`.\n\n#### Writing Your Own Plugin:\nPlugins are objects with two properties: `name` and `init`.\nHere's a simple plugin example:\n```javascript\nconst plugin = {\n  name: 'the plugin',\n  init(jsep) {\n    jsep.addIdentifierChar('@');\n    jsep.hooks.add('gobble-expression', function myPlugin(env) {\n      if (this.char === '@') {\n        this.index += 1;\n        env.node = {\n          type: 'MyCustom@Detector',\n        };\n      }\n    });\n  },\n};\n```\nThis example would treat the `@` character as a custom expression, returning\na node of type `MyCustom@Detector`.\n\n##### Hooks\nMost plugins will make use of hooks to modify the parsing behavior of jsep.\nAll hooks are bound to the jsep instance, are called with a single argument, and return void.\nThe `this` context provides access to the internal parsing methods of jsep\nto allow reuse as needed. Some hook types will pass an object that allows reading/writing\nthe `node` property as needed.\n\n##### Hook Types\n* `before-all`: called just before starting all expression parsing.\n* `after-all`: called after parsing all. Read/Write `arg.node` as required.\n* `gobble-expression`: called just before attempting to parse an expression. Set `arg.node` as required.\n* `after-expression`: called just after parsing an expression. Read/Write `arg.node` as required.\n* `gobble-token`: called just before attempting to parse a token. Set `arg.node` as required.\n* `after-token`: called just after parsing a token. Read/Write `arg.node` as required.\n* `gobble-spaces`: called when gobbling whitespace.\n\n##### The `this` context of Hooks\n```typescript\nexport interface HookScope {\n    index: number;\n    readonly expr: string;\n    readonly char: string; // current character of the expression\n    readonly code: number; // current character code of the expression\n    gobbleSpaces: () =\u003e void;\n    gobbleExpressions: (untilICode?: number) =\u003e Expression[];\n    gobbleExpression: () =\u003e Expression;\n    gobbleBinaryOp: () =\u003e PossibleExpression;\n    gobbleBinaryExpression: () =\u003e PossibleExpression;\n    gobbleToken: () =\u003e PossibleExpression;\n    gobbleTokenProperty: (node: Expression) =\u003e Expression;\n    gobbleNumericLiteral: () =\u003e PossibleExpression;\n    gobbleStringLiteral: () =\u003e PossibleExpression;\n    gobbleIdentifier: () =\u003e PossibleExpression;\n    gobbleArguments: (untilICode: number) =\u003e PossibleExpression;\n    gobbleGroup: () =\u003e Expression;\n    gobbleArray: () =\u003e PossibleExpression;\n    throwError: (msg: string) =\u003e never;\n}\n```\n\n### License\n\njsep is under the MIT license. See LICENSE file.\n\n### Thanks\n\nSome parts of the latest version of jsep were adapted from the esprima parser.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fericsmekens%2Fjsep","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fericsmekens%2Fjsep","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fericsmekens%2Fjsep/lists"}