{"id":23338211,"url":"https://github.com/paridelpooya/execute-js","last_synced_at":"2025-10-07T02:23:09.759Z","repository":{"id":55410989,"uuid":"102301904","full_name":"ParidelPooya/execute-js","owner":"ParidelPooya","description":"Application workflow executor for JavaScript","archived":false,"fork":false,"pushed_at":"2021-01-02T01:44:32.000Z","size":502,"stargazers_count":5,"open_issues_count":0,"forks_count":2,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-09-12T07:45:52.772Z","etag":null,"topics":["decision-tree","executor","javascript"],"latest_commit_sha":null,"homepage":"","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/ParidelPooya.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":"2017-09-04T00:02:02.000Z","updated_at":"2023-12-10T10:48:01.000Z","dependencies_parsed_at":"2022-08-14T23:50:12.509Z","dependency_job_id":null,"html_url":"https://github.com/ParidelPooya/execute-js","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/ParidelPooya/execute-js","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ParidelPooya%2Fexecute-js","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ParidelPooya%2Fexecute-js/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ParidelPooya%2Fexecute-js/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ParidelPooya%2Fexecute-js/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ParidelPooya","download_url":"https://codeload.github.com/ParidelPooya/execute-js/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ParidelPooya%2Fexecute-js/sbom","scorecard":{"id":107882,"data":{"date":"2025-08-11","repo":{"name":"github.com/ParidelPooya/execute-js","commit":"e2a897de3ab0314943f842a28992540bee88c06f"},"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":"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":"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":"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":"Code-Review","score":0,"reason":"Found 0/17 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":"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":"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":-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":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 25 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":"59 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: GHSA-6chw-6frg-f759","Warn: Project is vulnerable to: GHSA-v88g-cgmw-v5xw","Warn: Project is vulnerable to: GHSA-93q8-gq69-wqmw","Warn: Project is vulnerable to: GHSA-fwr7-v2mv-hh25","Warn: Project is vulnerable to: GHSA-67hx-6x53-jw92","Warn: Project is vulnerable to: GHSA-v6h2-p8h4-qcjw","Warn: Project is vulnerable to: GHSA-cwfw-4gq5-mrqx","Warn: Project is vulnerable to: GHSA-g95f-p29q-9xw4","Warn: Project is vulnerable to: GHSA-grv7-fg5c-xmjg","Warn: Project is vulnerable to: GHSA-x9w5-v3q2-3rhw","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-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-4gmj-3p3h-gm8h","Warn: Project is vulnerable to: GHSA-fjxv-7rqg-78g4","Warn: Project is vulnerable to: GHSA-8r6j-v8pm-fqw3","Warn: Project is vulnerable to: MAL-2023-462","Warn: Project is vulnerable to: GHSA-765h-qjxv-5f44","Warn: Project is vulnerable to: GHSA-f2jv-r9rf-7988","Warn: Project is vulnerable to: GHSA-c429-5p7v-vgjp","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-4xcv-9jjx-gfj3","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-9wv6-86v2-598j","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-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-52f5-9888-hmc6","Warn: Project is vulnerable to: GHSA-72xf-g2v4-qvf3","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-15T11:27:10.792Z","repository_id":55410989,"created_at":"2025-08-15T11:27:10.792Z","updated_at":"2025-08-15T11:27:10.792Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":278708160,"owners_count":26031962,"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-07T02:00:06.786Z","response_time":59,"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":["decision-tree","executor","javascript"],"created_at":"2024-12-21T03:12:46.932Z","updated_at":"2025-10-07T02:23:09.727Z","avatar_url":"https://github.com/ParidelPooya.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Execute-js\n[![Build Status](https://travis-ci.org/ParidelPooya/execute-js.svg?branch=master)](https://travis-ci.org/ParidelPooya/execute-js)\n[![Coverage Status](https://coveralls.io/repos/github/ParidelPooya/execute-js/badge.svg?branch=master)](https://coveralls.io/github/ParidelPooya/execute-js?branch=master)\n[![npm](https://img.shields.io/npm/v/execute-js.svg)](https://www.npmjs.com/package/execute-js)\n[![Gitter](https://img.shields.io/gitter/room/nwjs/nw.js.svg)](https://gitter.im/execute-js)\n[![Known Vulnerabilities](https://snyk.io/test/github/paridelpooya/execute-js/badge.svg)](https://snyk.io/test/github/paridelpooya/execute-js)\n[![license](https://img.shields.io/github/license/paridelpooya/execute-js.svg)](https://github.com/ParidelPooya/execute-js/blob/master/LICENSE)\n\nApplication workflow executor for JavaScrip\n\nExecute-js is designed to accept workflow and data and it execute and run the workflow and return the result.\nBy using Execute-js you can keep your logic readable and in the same time you can use all feature of Execute-js by\nconfiguring the setting.\n\n## Table of Contents\n\n- [Features](#features)\n- [Install](#install)\n- [Usage](#usage)\n- [API](#api)\n- [Maintainers](#maintainers)\n- [Contribute](#contribute)\n- [License](#license)\n\n## Features\n\n- Accept workflow as JSON object\n- Define action for each step by a sync or async JavaScript function\n- Accept a test and condition, each condition is a child workflow (another execution tree)\n- Unlimited nested level\n- Executing steps sequentially\n- Executing steps in concurrent mode\n- Threshold for maximum concurrency for each level\n- Retry steps\n- Retry condition\n- Caching for each step\n- Simple way to use different cache library\n- Each step's result is configurable to be accessible to next steps or not\n- Each step's result is configurable to be accessible in the final resultt or not\n- Handling throw error and terminating the execution\n- Ability to map and transfer each step result\n- Ability to ignore step's error and continue the execution\n- Ability to define new actions by middleware\n- Predefined map middleware (action) to iterate arrays and repeat action for each itam.\n- The parser log the whole process and debugging and fine tuning workflow and actions are simple.\n- Logger is injectable and easy to replace\n- Ability to terminate one level or entire execution by signals\n\n## Install\n\n```bash\nnpm install --save execute-js\n```\n\n## Usage\n\n### 1.Executing multiple steps\nSimplest way is to define one or more steps and use Execute-js to run it:\n```js\nlet Execute = require(\"execute-js\");\n\nlet executionTree = [\n    {\n        title: \"step 1\",\n        action: (data) =\u003e {return {a: 1};}\n    },\n    {\n        title: \"step 2\",\n        action: (data) =\u003e {return {b: 2};}\n    },\n    {\n        title: \"step 3\",\n        action: (data) =\u003e {return {c: 3};}\n    }\n];\n\nlet execute = new Execute();\n\nexecute.run(executionTree, {})\n.then( (result)=\u003e {\n    console.log(result);\n});\n\n// Console output will look something like this:\n//{\"a\": 1,\"b\": 2,\"c\": 3}\n```\n\n### 2.Control output of step\n\nAs you see the return value of step's action will be added to final result.\nAnd also each action has access to return value of previous steps. \nFor example:\n\n```js\nlet Execute = require(\"execute-js\");\n\nlet executionTree = [\n    {\n        title: \"step 1\",\n        action: (data) =\u003e {return {a: 1};}\n    },\n    {\n        title: \"step 2\",\n        action: (data) =\u003e {return {b: data.a + 1 };}\n    }\n];\n\nlet execute = new Execute();\n\nexecute.run(executionTree, {})\n.then( (result)=\u003e {\n    console.log(result);\n});\n\n// Console output will look something like this:\n//{\"a\": 1,\"b\": 2}\n```\n\nIf you want more control over the return value of actions then there is output configuration for each step:\n```js\n{\n    title: \"step title\",\n    action: functionToCall,\n    output: {\n        accessibleToNextSteps: boolean, // value of action be accessible to next steps (same level) \n        addToResult: boolean, // value of action be accessible in result (and be accessible for parrent level)\n        map: {\n            source: string, // instead of adding the whole value we can point to part of the result\n            destination: string // instead of adding the return value to root we can specify different path\n        }\n    }\n}\n```\n\nLets show each of them with an example.\n\n**2.1 accessibleToNextSteps**: This example shows accessibleToNextSteps will hide the result from the the next step so the next step can't access data.a\n```js\nlet Execute = require(\"execute-js\");\n\nlet executionTree = [\n    {\n        title: \"step 1\",\n        action: (data) =\u003e {return {a: 1};},\n        output: {\n            accessibleToNextSteps: false\n        }\n    },\n    {\n        title: \"step 2\",\n        action: (data) =\u003e {return {b: data.a};}\n        // because data.a is not accessible then b will be undefined\n    }\n];\n\nlet execute = new Execute();\n\nexecute.run(executionTree, {})\n.then( (result)=\u003e {\n    console.log(result);\n});\n\n// Console output will look something like this:\n//{\"a\": 1}\n```\n\n**2.2 addToResult**: If you want to use the result of one step internally but you don't want to add it to the final result then add addToResult to that step:\n```js\nlet Execute = require(\"execute-js\");\n\nlet executionTree = [\n    {\n        title: \"step 1\",\n        action: (data) =\u003e {return {a: 1};},\n        output: {\n            addToResult: false\n        }\n    },\n    {\n        title: \"step 2\",\n        action: (data) =\u003e {return {b: 2 };}\n    }\n];\n\nlet execute = new Execute();\n\nexecute.run(executionTree, {})\n.then( (result)=\u003e {\n    console.log(result);\n});\n\n// Console output will look something like this:\n//{\"b\": 2}\n```\n\n**2.3 map**: with map you have control to copy part of step's return to specefic location in final result:\n```js\nlet Execute = require(\"execute-js\");\n\nlet executionTree = [\n    {\n        title: \"step 1\",\n        action: (data) =\u003e \n            {\n                return {\n                    status: 202,\n                    result: [\n                        {\n                            title:\"Title 1\"\n                        }\n                    ]\n                };\n            },\n        output: {\n            map: {\n                source: \"result.0.title\",\n                destination: \"subject\"\n            }\n        }\n    }\n];\n\nlet execute = new Execute();\n\nexecute.run(executionTree, {})\n.then( (result)=\u003e {\n    console.log(result);\n});\n\n// Console output will look something like this:\n//{\"result\": \"Title 1\"}\n```\n\n### 3. Test, condition and child steps\nSo far we only execute steps without any condition. If you need to decide base on some parameters and then execute different steps then you need to add test, if and child steps:\n\n```js\n{\n    title: \"step title\",\n    test: testFunction,\n    if: {\n        branch1: childExecutionTree1,\n        branch2: childExecutionTree2,\n        ...,\n        branchn: childExecutionTreeN,\n        default: childExecutionTree\n    }\n}\n```\ntest should point to a function that will return next branch name to execute, if none of the branches mathes the test result, then default branch will be executed.\nLet show it with simple example:\n\n```js\nlet Execute = require(\"execute-js\");\n\nlet executionTree = [\n    {\n        id: \"step1\",\n        title:\"step 1\",\n        test: data =\u003e data.Code === \"code1\",\n        if: {\n            true:[\n                {\n                    id: \"step2\",\n                    title:\"step 2\",\n                    action: (data)=\u003e {return {b: 2};}\n                }\n            ],\n            false:[\n                {\n                    id: \"step3\",\n                    title:\"step 3\",\n                    action: (data)=\u003e {return {b: 3};}\n                }\n            ]\n        }\n    }\n];\n\nlet executionData = {\n    Code: \"code1\",\n    Type: \"type1\"\n};\n\nlet execute = new Execute();\n\nexecute.run(executionTree, executionData)\n.then( (result)=\u003e {\n    console.log(result);\n});\n\n// Console output will look something like this:\n//{\"b\": 2}\n```\n\nThe output will be {\"b\": 2} because based on the test branch \"true\" will be executed.\nThe test return value will be converted to string. So we can acheive the same result in this way:\n\n```js\nlet Execute = require(\"execute-js\");\n\nlet executionTree = [\n    {\n        id: \"step1\",\n        title:\"step 1\",\n        test: data =\u003e data.Code,\n        if: {\n            code1:[\n                {\n                    id: \"step2\",\n                    title:\"step 2\",\n                    action: (data)=\u003e {return {b: 2};}\n                }\n            ],\n            code2:[\n                {\n                    id: \"step3\",\n                    title:\"step 3\",\n                    action: (data)=\u003e {return {b: 3};}\n                }\n            ]\n        }\n    }\n];\n\nlet executionData = {\n    Code: \"code1\",\n    Type: \"type1\"\n};\n\nlet execute = new Execute();\n\nexecute.run(executionTree, executionData)\n.then( (result)=\u003e {\n    console.log(result);\n});\n\n// Console output will look something like this:\n//{\"b\": 2}\n```\n\nAlso if none of the branches match the test then default branch will be executed:\n\n```js\nlet Execute = require(\"execute-js\");\n\nlet executionTree = [\n    {\n        id: \"step1\",\n        title:\"step 1\",\n        test: data =\u003e data.Code,\n        if: {\n            code1:[\n                {\n                    id: \"step2\",\n                    title:\"step 2\",\n                    action: (data)=\u003e {return {b: 2};}\n                }\n            ],\n            code2:[\n                {\n                    id: \"step3\",\n                    title:\"step 3\",\n                    action: (data)=\u003e {return {b: 3};}\n                }\n            ],\n            default:[\n                {\n                    id: \"step3\",\n                    title:\"step 3\",\n                    action: (data)=\u003e {return {b: 4};}\n                }\n            ]\n        }\n    }\n];\n\nlet executionData = {\n    Code: \"code3\",\n    Type: \"type1\"\n};\n\nlet execute = new Execute();\n\nexecute.run(executionTree, executionData)\n.then( (result)=\u003e {\n    console.log(result);\n});\n\n// Console output will look something like this:\n//{\"b\": 4}\n```\n\nEach branch should point to another execution tree.\n\n### 4. Terminating the execution\n\n\n## API\nTODO: Fill out API specification.\n\n## Middleware\nYou can use middleware to add new feature to execute-js.\n\n```js\n\n```\n\n## Maintainers\n\n[@paridelpooya](https://github.com/paridelpooya)\n\n## Contribute\n\nPRs accepted.\n\n## License\n\nMIT © 2017 Pooya Paridel\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fparidelpooya%2Fexecute-js","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fparidelpooya%2Fexecute-js","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fparidelpooya%2Fexecute-js/lists"}