{"id":32956845,"url":"https://github.com/joelnet/MojiScript","last_synced_at":"2025-11-16T16:02:18.253Z","repository":{"id":38237653,"uuid":"146668600","full_name":"joelnet/MojiScript","owner":"joelnet","description":"MojiScript is an async-first, opinionated, and functional library","archived":false,"fork":false,"pushed_at":"2023-07-19T05:30:21.000Z","size":6998,"stargazers_count":147,"open_issues_count":47,"forks_count":12,"subscribers_count":7,"default_branch":"master","last_synced_at":"2025-08-09T11:20:35.392Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"https://mojiscript.js.org","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/joelnet.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null}},"created_at":"2018-08-29T23:08:24.000Z","updated_at":"2025-08-01T04:43:17.000Z","dependencies_parsed_at":"2024-01-02T23:42:41.414Z","dependency_job_id":"b9d72cea-8e50-41b3-bbbf-eb5cd624d396","html_url":"https://github.com/joelnet/MojiScript","commit_stats":{"total_commits":516,"total_committers":24,"mean_commits":21.5,"dds":0.6162790697674418,"last_synced_commit":"1bc7f43fdc105ed252aa3071e22a84676d84fbe1"},"previous_names":[],"tags_count":95,"template":false,"template_full_name":null,"purl":"pkg:github/joelnet/MojiScript","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/joelnet%2FMojiScript","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/joelnet%2FMojiScript/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/joelnet%2FMojiScript/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/joelnet%2FMojiScript/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/joelnet","download_url":"https://codeload.github.com/joelnet/MojiScript/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/joelnet%2FMojiScript/sbom","scorecard":{"id":527021,"data":{"date":"2025-08-11","repo":{"name":"github.com/joelnet/MojiScript","commit":"1bc7f43fdc105ed252aa3071e22a84676d84fbe1"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":2.4,"checks":[{"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":5,"reason":"Found 7/13 approved changesets -- score normalized to 5","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":"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":"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":"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":"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":"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":"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":"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":"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 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":"176 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-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-gxpj-cx7g-858c","Warn: Project is vulnerable to: GHSA-w573-4hg7-7wgq","Warn: Project is vulnerable to: GHSA-8r6j-v8pm-fqw3","Warn: Project is vulnerable to: MAL-2023-462","Warn: Project is vulnerable to: GHSA-43f8-2h32-f4cj","Warn: Project is vulnerable to: GHSA-qqgx-2p2h-9c37","Warn: Project is vulnerable to: GHSA-6c8f-qphg-qjgp","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-hj48-42vr-x3v9","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-qwcr-r2fm-qrc7","Warn: Project is vulnerable to: GHSA-pxg6-pf52-xh8x","Warn: Project is vulnerable to: GHSA-rv95-896h-c2vc","Warn: Project is vulnerable to: GHSA-qw6h-vgh9-j6wx","Warn: Project is vulnerable to: GHSA-9wv6-86v2-598j","Warn: Project is vulnerable to: GHSA-rhx6-c78j-4q9w","Warn: Project is vulnerable to: GHSA-hrpp-h998-j3pp","Warn: Project is vulnerable to: GHSA-m6fv-jmcg-4jfg","Warn: Project is vulnerable to: GHSA-cm22-4g7w-348p","Warn: Project is vulnerable to: GHSA-968p-4wvh-cqc8","Warn: Project is vulnerable to: GHSA-67hx-6x53-jw92","Warn: Project is vulnerable to: GHSA-fwr7-v2mv-hh25","Warn: Project is vulnerable to: GHSA-cwfw-4gq5-mrqx","Warn: Project is vulnerable to: GHSA-g95f-p29q-9xw4","Warn: Project is vulnerable to: GHSA-fjxv-7rqg-78g4","Warn: Project is vulnerable to: GHSA-765h-qjxv-5f44","Warn: Project is vulnerable to: GHSA-f2jv-r9rf-7988","Warn: Project is vulnerable to: GHSA-896r-f27r-55mw","Warn: Project is vulnerable to: GHSA-9c47-m6qq-7p4h","Warn: Project is vulnerable to: GHSA-4xcv-9jjx-gfj3","Warn: Project is vulnerable to: GHSA-7wpw-2hjm-89gp","Warn: Project is vulnerable to: GHSA-5fw9-fq32-wv5p","Warn: Project is vulnerable to: GHSA-p8p7-x288-28g6","Warn: Project is vulnerable to: GHSA-jgrx-mgxx-jf9v","Warn: Project is vulnerable to: GHSA-72xf-g2v4-qvf3","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","Warn: Project is vulnerable to: GHSA-x9w5-v3q2-3rhw","Warn: Project is vulnerable to: GHSA-w8qv-6jwh-64r5","Warn: Project is vulnerable to: GHSA-257v-vj4p-3w2h","Warn: Project is vulnerable to: GHSA-ff7x-qrg7-qggm","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-7r28-3m3f-r2pr","Warn: Project is vulnerable to: GHSA-r8j5-h5cx-65gg","Warn: Project is vulnerable to: GHSA-92xj-mqp7-vmcj","Warn: Project is vulnerable to: GHSA-wxgw-qj99-44c2","Warn: Project is vulnerable to: GHSA-5rrq-pxf6-6jx5","Warn: Project is vulnerable to: GHSA-8fr3-hfg3-gpgp","Warn: Project is vulnerable to: GHSA-gf8q-jrpm-jvxq","Warn: Project is vulnerable to: GHSA-2r2c-g63r-vccr","Warn: Project is vulnerable to: GHSA-cfm4-qjh2-4765","Warn: Project is vulnerable to: GHSA-x4jg-mjrx-434g","Warn: Project is vulnerable to: GHSA-rp65-9cf3-cjxr","Warn: Project is vulnerable to: GHSA-h7cp-r72f-jxh6","Warn: Project is vulnerable to: GHSA-v62p-rq8g-8h59","Warn: Project is vulnerable to: GHSA-566m-qj78-rww5","Warn: Project is vulnerable to: GHSA-7fh5-64p2-3v2j","Warn: Project is vulnerable to: GHSA-hwj9-h5mp-3pm3","Warn: Project is vulnerable to: GHSA-876r-hj45-fw7g","Warn: Project is vulnerable to: GHSA-v63x-xc9j-hhvq","Warn: Project is vulnerable to: GHSA-w5q7-3pr9-x44w","Warn: Project is vulnerable to: GHSA-3fjq-93xj-3f3f","Warn: Project is vulnerable to: GHSA-4wf5-vphf-c2xc","Warn: Project is vulnerable to: GHSA-cph5-m8f7-6c5x","Warn: Project is vulnerable to: GHSA-wf5p-g6vw-rhxx","Warn: Project is vulnerable to: GHSA-jr5f-v2jv-69x6","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-whgm-jr23-g3j9","Warn: Project is vulnerable to: GHSA-4w2v-q235-vp99","Warn: Project is vulnerable to: GHSA-pp7h-53gx-mx7r","Warn: Project is vulnerable to: GHSA-4gw3-8f77-f72c","Warn: Project is vulnerable to: GHSA-7gc6-qh9x-w6h8","Warn: Project is vulnerable to: GHSA-fp36-299x-pwmw","Warn: Project is vulnerable to: GHSA-3wcq-x3mq-6r9p","Warn: Project is vulnerable to: GHSA-jrvm-mcxc-mf6m","Warn: Project is vulnerable to: GHSA-phwq-j96m-2c2q","Warn: Project is vulnerable to: GHSA-ghr5-ch3p-vcr6","Warn: Project is vulnerable to: GHSA-j4f2-536g-r55m","Warn: Project is vulnerable to: GHSA-r7qp-cfhv-p84w","Warn: Project is vulnerable to: GHSA-4gmj-3p3h-gm8h","Warn: Project is vulnerable to: GHSA-6h5x-7c5m-7cr7","Warn: Project is vulnerable to: GHSA-c6f8-8r25-c4gc","Warn: Project is vulnerable to: GHSA-mj46-r4gr-5x83","Warn: Project is vulnerable to: GHSA-ww39-953v-wcq6","Warn: Project is vulnerable to: GHSA-pfrx-2q88-qq97","Warn: Project is vulnerable to: GHSA-vfrc-7r7c-w9mx","Warn: Project is vulnerable to: GHSA-pfq8-rq6v-vf5m","Warn: Project is vulnerable to: GHSA-rc47-6667-2j5j","Warn: Project is vulnerable to: GHSA-c7qv-q95q-8v27","Warn: Project is vulnerable to: GHSA-78xj-cgh5-2h22","Warn: Project is vulnerable to: GHSA-2p57-rm9w-gvfp","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-xf5p-87ch-gxw2","Warn: Project is vulnerable to: GHSA-5v2h-r2cx-5xgj","Warn: Project is vulnerable to: GHSA-rrrm-qjm4-v8hf","Warn: Project is vulnerable to: GHSA-r6rj-9ch6-g264","Warn: Project is vulnerable to: GHSA-8hfj-j24r-96c4","Warn: Project is vulnerable to: GHSA-wc69-rhjr-hc9g","Warn: Project is vulnerable to: GHSA-r683-j2x4-v87g","Warn: Project is vulnerable to: GHSA-w7rc-rwvf-8q5r","Warn: Project is vulnerable to: GHSA-px4h-xg32-q955","Warn: Project is vulnerable to: GHSA-cwx2-736x-mf6w","Warn: Project is vulnerable to: GHSA-v39p-96qg-c8rf","Warn: Project is vulnerable to: GHSA-8v63-cqqc-6r2c","Warn: Project is vulnerable to: GHSA-76c9-3jph-rj3q","Warn: Project is vulnerable to: GHSA-3j8f-xvm3-ffx4","Warn: Project is vulnerable to: GHSA-4p35-cfcx-8653","Warn: Project is vulnerable to: GHSA-7f3x-x4pr-wqhj","Warn: Project is vulnerable to: GHSA-jpp7-7chh-cf67","Warn: Project is vulnerable to: GHSA-q6wq-5p59-983w","Warn: Project is vulnerable to: GHSA-j9fq-vwqv-2fm2","Warn: Project is vulnerable to: GHSA-pqw5-jmp5-px4v","Warn: Project is vulnerable to: GHSA-6fx8-h7jm-663j","Warn: Project is vulnerable to: GHSA-5q6m-3h65-w53x","Warn: Project is vulnerable to: GHSA-44c6-4v22-4mhx","Warn: Project is vulnerable to: GHSA-4x5v-gmq8-25ch","Warn: Project is vulnerable to: GHSA-g4rg-993r-mgx7","Warn: Project is vulnerable to: GHSA-4rq4-32rv-6wp6","Warn: Project is vulnerable to: GHSA-64g7-mvw6-v9qj","Warn: Project is vulnerable to: GHSA-fxwf-4rqh-v8g3","Warn: Project is vulnerable to: GHSA-25hc-qcg6-38wj","Warn: Project is vulnerable to: GHSA-xfhh-g9f5-x4m4","Warn: Project is vulnerable to: GHSA-qm95-pgcg-qqfq","Warn: Project is vulnerable to: GHSA-cqmj-92xf-r6r9","Warn: Project is vulnerable to: GHSA-vx3p-948g-6vhq","Warn: Project is vulnerable to: GHSA-w5p7-h5w8-2hfq","Warn: Project is vulnerable to: GHSA-7p7h-4mm5-852v","Warn: Project is vulnerable to: GHSA-662x-fhqg-9p8v","Warn: Project is vulnerable to: GHSA-394c-5j6w-4xmx","Warn: Project is vulnerable to: GHSA-78cj-fxph-m83p","Warn: Project is vulnerable to: GHSA-fhg7-m89q-25r3","Warn: Project is vulnerable to: GHSA-9m6j-fcg5-2442","Warn: Project is vulnerable to: GHSA-hh27-ffr2-f2jc","Warn: Project is vulnerable to: GHSA-rqff-837h-mm52","Warn: Project is vulnerable to: GHSA-8v38-pw62-9cw2","Warn: Project is vulnerable to: GHSA-hgjh-723h-mx2j","Warn: Project is vulnerable to: GHSA-jf5r-8hm2-f872","Warn: Project is vulnerable to: GHSA-wr3j-pwj9-hqq6","Warn: Project is vulnerable to: GHSA-4v9v-hfq4-rm2v","Warn: Project is vulnerable to: GHSA-9jgg-88mc-972h","Warn: Project is vulnerable to: GHSA-j8xg-fqg3-53r7","Warn: Project is vulnerable to: GHSA-72mh-269x-7mh5","Warn: Project is vulnerable to: GHSA-h4j5-c7cj-74xg"],"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-20T04:40:16.726Z","repository_id":38237653,"created_at":"2025-08-20T04:40:16.727Z","updated_at":"2025-08-20T04:40:16.727Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":284734138,"owners_count":27054622,"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-11-16T02:00:05.974Z","response_time":65,"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":[],"created_at":"2025-11-12T23:00:20.489Z","updated_at":"2025-11-16T16:02:18.239Z","avatar_url":"https://github.com/joelnet.png","language":"JavaScript","readme":"# MojiScript ![project:experimental](https://img.shields.io/badge/project-experimental-orange.svg) [![build status](https://travis-ci.org/joelnet/MojiScript.svg?branch=master)](https://travis-ci.org/joelnet/MojiScript) [![Coverage Status](https://coveralls.io/repos/github/joelnet/MojiScript/badge.svg?branch=master\u0026v=1)](https://coveralls.io/github/joelnet/MojiScript?branch=master) ![project:experimental](https://img.shields.io/badge/tests-380-green.svg) [![All Contributors](https://img.shields.io/badge/all_contributors-19-orange.svg?style=flat-square)](#contributors)\n\n![MojiScript logo](https://raw.githubusercontent.com/joelnet/MojiScript/master/media/MS_logo_64.png)\n\nMojiScript is an Async First, opinionated, and functional library and language designed to have 100% compatibility with JavaScript engines. This will allow full access to JavaScript modules (NPM) and all tooling already available to JavaScript. This means that MojiScript language features can run in any JavaScript application and vice-versa.\n\nMojiScript's design is derived from Functional Programming concepts such as Currying, Partial Application, Function Composition, Category Theory, and Atomic Design.\n\n**NEW: Join the discussion in the [MojiScript Discord chat](https://discord.gg/Gg7ptD5)!**\n\n[View the Documentation](https://mojiscript.js.org/)\n\n## Environment Support\n\nThis library supports ES6. If you need to support ES5, you will need to transpile it with Babel.\n\n## Table of Contents\n\n- [Philosophy](#philosophy)\n- [Benefits](#benefits)\n- [Quickstart](#quickstart)\n- Examples\n  * [Star Wars Console](examples/star-wars-console) - Check this out!\n  * [Express Hello World](examples/express-hello-world) - Express \"Hello World\" web server.\n  * [Express Static File Server](examples/express-static-files) - Express static file server.\n  * [Async Simple](examples/async-simple)\n  * [Hello World](examples/hello-world)\n  * [Conditionals](examples/conditionals)\n  * [map/filter/reduce](examples/map-filter-reduce)\n  * [FizzBuzz](examples/fizz-buzz)\n  * [Recursion](examples/recursion)\n- [API Documentation](https://mojiscript.js.org/)\n- [Style Guide](#style-guide)\n- [Complementary Libraries](#complementary-libraries)\n- [Variables](#variables)\n- [Objects](#objects)\n- [String Templates](#string-templates)\n- [Expressions](#expressions)\n  * [Multiple Arguments](#multiple-arguments)\n  * [Compound Expressions](#compound-expressions)\n- [Pipes](#pipes)\n  * [Pipes are a stream of data](#pipes-are-a-stream-of-data)\n  * [Multiple arguments](#multiple-arguments)\n  * [Partial Application](#partial-application)\n  * [Composing Pipes](#composing-pipes)\n  * [Pipes are Asynchronous](#pipes-are-asynchronous)\n- [Conditionals](#conditionals)\n- [Error Handling](#error-handling)\n  * [Synchronous Error Handling](#synchronous-error-handling)\n  * [Asynchronous Error Handling](#asynchronous-error-handling)\n  * [Error Handling with Sanctuary](#error-handling-with-sanctuary)\n- [Morphisms](#morphisms)\n- [Application Layout](#application-layout)\n- [Unit Tests](#unit-tests)\n- [Previous Art](#previous-art)\n- [Contributors](#contributors)\n\n## Philosophy\n\nThe MojiScript philosophy is to provide a functional-style application framework, making asynchronous tasks intuitive and easy.\n\nMojiScript is heavily opinionated and prevents code considered to be async-unfriendly like `for` loops and statement blocks.\n\n## Benefits\n\n- The Asynchronous-first design greatly simplifies writing and reasoning about Asynchronous code. Worry less about callbacks, promises, async, await, etc.\n- Atomic Design, function composition, and Pipes encourages maximum code re-use, testability and the ability to compose smaller functions into larger ones.\n- Compatibility with ECMAScript gives our applications full access to the JavaScript ecosystem. It also allows us to import elements from MojiScript into existing JavaScript applications.\n- A modular design allows for features to be imported on an as needed basis, keeping packages small.\n- Plays well with functional libraries. Check out the [Complementary Libraries](#complementary-libraries) section for libraries that can benefit your MojiScript applications.\n\n## Quickstart\n\nClone the starter app.\n\n```bash\ngit clone https://github.com/joelnet/mojiscript-starter-app.git\ncd mojiscript-starter-app\n```\n\nInstall, build, and run\n\n```bash\nnpm ci\nnpm run build\nnpm start\n```\n\nIf everything works, you should see:\n\n```\nHello World\n```\n\nIf your editor does not format on save, you can run the following command:\n\n```bash\nnpm run watch\n```\n\n## Style Guide\n\nAll values must be declared with `const`.\n\n```javascript\n// BAD\nlet value = {}\n\n// GOOD\nconst value = {}\n```\n\nVariables should be named in lower camel case.\n\n```javascript\n// BAD\nconst AddNumbers = x =\u003e y =\u003e x + y\n\n// GOOD\nconst addNumbers = x =\u003e y =\u003e x + y\n```\n\nExpressions or Pipes and their arguments should be separated with a space. Arguments should be surrounded with parentheses. Further discussed at [#438](https://github.com/sanctuary-js/sanctuary/issues/438).\n\n```javascript\n// BAD\nadd(1)(2)\n\n// GOOD\nadd (1) (2)\n```\n\nPrefer String Templates\n\n```javascript\n// BAD\nconst func = x =\u003e `Value: ${x}`\n\n// GOOD\nconst func = $`Value: ${0}`\n\n// BAD\nconst func = ({ prop }) =\u003e `Prop: ${prop}`\n\n// GOOD\nconst func = $`Prop: ${'prop'}`\n```\n\nFollowing Atomic Design principles, code should be broken down into Atoms. This maximizes reusability, testability, composability, and readability.\n\n```javascript\n// BAD\nconst getOrdersText = ifElse (({ length }) =\u003e length \u003e 0) ($`${0} orders`) ($`No Orders`)\n\n// GOOD\nconst hasOrders = ({ length }) =\u003e length \u003e 0\nconst getOrdersText = ifElse (hasOrders) ($`${0} orders`) ($`No Orders`)\n\n// GOOD\nconst hasOrders = ({ length }) =\u003e length \u003e 0\nconst ifHasOrders = ifElse (hasOrders)\nconst getOrdersText = ifHasOrders ($`${0} orders`) ($`No Orders`)\n```\n\n`ifElse` and the condition should be on the same line. Longer statements can be broken out into multiple lines. If it is long, consider breaking it down further.\n\n```javascript\n// BAD\nifElse\n  (lessThan0)\n  (Math.abs)\n  (Math.sqrt)\n\n// GOOD\nifElse (lessThan0) (Math.abs) (Math.sqrt)\n\n// GOOD\nifElse (lessThan0)\n  (Math.abs)\n  (Math.sqrt)\n```\n\nPipes must be multi-line.\n\n```javascript\n// BAD\nconst main = pipe ([ add ])\n\n// GOOD\nconst main = pipe ([\n  add\n])\n```\n\nArrays must have a space after the opening bracket and before the closing bracket.\n\n```javascript\n// BAD\nconst array = [1, 2, 3]\n\n// GOOD\nconst array = [ 1, 2, 3 ]\n```\n\nNo semi-colons.\n\n```javascript\n// BAD\nconst value = 888;\n\n// GOOD\nconst value = 888\n```\n\n## Complementary Libraries\n\n- [Sanctuary](https://github.com/sanctuary-js/sanctuary) - Recommended collection of useful functions.\n- [Ramda](https://ramdajs.com/) - Another recommended collection of useful functions.\n- [List](https://github.com/funkia/list) - 🐆 An immutable list with unmatched performance and a comprehensive functional API. (use `list/curried`)\n\n## Variables\n\nVariables are constant.\n\n```javascript\n// constant\nconst path = './data'\n\npath = './hello'\n//=\u003e Error(\"Path is read-only\")\n```\n\nObjects declared with `const` are now also immutable!\n\n```javascript\nconst state = {\n  // mutable\n  count: 0\n}\n\nstate.count = 1\n//=\u003e error  Unallowed reassignment  fp/no-mutation\n```\n\nA variable can be a value (Number, String, Object), an Expression, or a Pipe.\n\n## Objects\n\nObjects are plain data objects.\n\n```javascript\nconst cat = {\n  name: 'mojo',\n  dob: Date.parse('July 14, 2009'),\n  weight: 14\n}\n```\n\nnote: Objects may contain functions, but those functions will not have a reference to the object itself. Behavior and data should be decoupled.\n\n## String Templates\n\nString Templates make strings a joy to work with.\n\n```javascript\nimport $ from 'mojiscript/string/template'\n\nconst searchTemplate = $`Searching for: \"${0}\"`\nconst nameTemplate = $`${'first'} ${'last'}`\n\nsearchTemplate ('Skywalker') //=\u003e 'Searching for: \"Skywalker\"'\nnameTemplate ({ first: 'Luke', last: 'Skywalker' }) //=\u003e 'Luke Skywalker'\n```\n\nHave a look at the [Axios Example](examples/net-axios) for more on how String Templates can improve your code.\n\n## Expressions\n\nExpressions can be compared to a synchronous function that takes 1 argument and returns 1 argument.\n\n```javascript\nconst increase = x =\u003e x + 1\n```\n\n### Multiple Arguments\n\nMultiple arguments can be simulated a couple different ways.\n\n**Currying and Closures**\n\n```javascript\nconst add = x =\u003e y =\u003e x + y\nadd (3) (4) //=\u003e 7\n```\n\n**Objects**\n\n```javascript\nconst add = ({ x, y }) =\u003e x + y\nadd ({ x: 3, y: 4 }) //=\u003e 7\n```\n\n**Arrays**\n\n```javascript\nconst add = ([x, y]) =\u003e x + y\nadd ([3, 4]) //=\u003e 7\n```\n\n### Compound Expressions\n\nCompound expressions combine multiple expressions. The last expression will return the value of the Compound Expression. This is typically done to handle side effects.\n\n```javascript\nconst tap = func =\u003e value =\u003e (\n  func(value),\n  value\n)\n```\n\n## Pipes\n\nPipes can be compared to an asynchronous function that takes 1 argument and returns 1 argument.\n\nEach pipe can contain multiple Pipes or Expressions. A Pipe will return the result of the final Pipe or Expression.\n\n```javascript\n// increase :: Number -\u003e Number\nconst increase = pipe ([\n  x =\u003e x + 1\n])\n\nincrease (1) //=\u003e 2\n```\n\n### Pipes are a stream of data\n\nA Pipe should be viewed as a stream of data, that performs Morphisms (or transformation between Categories) along each step.\n\n```javascript\nimport pipe from 'mojiscript/core/pipe'\nimport run from 'mojiscript/core/run'\nimport log from 'mojiscript/console/log'\n\nconst state = 4\n\nconst main = pipe ([\n  //         |\n  //         | 4\n  //         ▼\n  /*-------------------*/\n  /**/  x =\u003e x + 5,  /**/\n  /*-------------------*/\n  //         |\n  //         | 9\n  //         ▼\n  /*-------------------*/\n  /**/  x =\u003e x * 2,  /**/\n  /*-------------------*/\n  //         |\n  //         | 18\n  //         ▼\n  /*-------------------*/\n  /**/      log,     /**/\n  /*-------------------*/\n  //         |\n  //         | 18\n  //         ▼\n])\n\nrun ({ state, main }) //=\u003e 18\n```\n\n### Multiple arguments\n\nMultiple arguments can be simulated a couple different ways.\n\n**Currying and Closures**\n\n```javascript\n// add :: Number -\u003e Number -\u003e Number\nconst add = x =\u003e pipe ([\n  y =\u003e x + y\n])\n\nadd (3) (4) //=\u003e 7\n```\n\n**Objects**\n\n```javascript\nconst add = pipe ([\n  ({ x, y }) =\u003e x + y\n])\n\nadd ({ x: 3, y: 4 }) //=\u003e 7\n```\n\n**Arrays**\n\n```javascript\nconst add = pipe ([\n  ([x, y]) =\u003e x + y\n])\n\nadd ([3, 4]) //=\u003e 7\n```\n\n### Partial Application\n\nBecause Multiple Argument Pipes are curried, it is easy to create new functions with Partial Application.\n\n```javascript\n// add :: Number -\u003e Number -\u003e Number\nconst add = x =\u003e pipe ([\n  y =\u003e x + y\n])\n\n// increase :: Number -\u003e Number\nconst increase = add (1)\n\nincrease (4) //=\u003e 5\n```\n\n### Composing Pipes\n\nMultiple Pipes can be Composed (combined) to create a new Pipe.\n\n```javascript\n// increase :: Number -\u003e Number\nconst increase = pipe ([\n  x =\u003e x + 1\n])\n\n// double :: Number -\u003e Number\nconst double = pipe ([\n  x =\u003e x * 2\n])\n\n// increaseThenDouble :: Number -\u003e Number\nconst increaseThenDouble = pipe ([\n  increase,\n  double\n])\n```\n\n### Pipes are Asynchronous\n\nPipes are Asynchronous. The elimination of synchronous statements greatly simplifies the code. No need for `Promise`, `async`, or `await`!\n\n```javascript\nimport log from 'mojiscript/console/log'\nimport pipe from 'mojiscript/core/pipe'\nimport run from 'mojiscript/core/run'\nimport sleep from 'mojiscript/threading/sleep'\n\nconst state = 4\n\n// increase :: Number -\u003e Number\nconst increase = x =\u003e x + 1\n\n// double :: Number -\u003e Number\nconst double = x =\u003e x * 2\n\nconst main = pipe ([\n  log,\n  sleep (1000),\n  increase,\n  double,\n  log\n])\n\nrun ({ state, main })\n//=\u003e 4\n//=\u003e (pause for 1 second)\n//=\u003e 10\n```\n\nNote: There are not any problems with synchronous or asynchronous code. Though there are complexities when you mix asynchronous code with synchronous code.\n\n## Conditionals\n\nExample 1: if/else conditional\n\n```javascript\nimport log from 'mojiscript/console/log'\nimport ifElse from 'mojiscript/logic/ifElse'\nimport pipe from 'mojiscript/core/pipe'\nimport run from 'mojiscript/core/run'\nimport $ from 'mojiscript/string/template'\n\nconst dependencies = {\n  log\n}\nconst state = 7\n\n// isEven :: Number -\u003e Boolean\nconst isEven = x =\u003e x % 2 === 0\n\n// yesOrNo :: Boolean -\u003e String\nconst yesIfEven = ifElse (isEven) ($`Yes, ${0} is even.`) ($`NO, ${0} is not even.`)\n\n// main :: Number -\u003e String\nconst main = ({ log }) =\u003e pipe ([\n  yesIfEven,\n  log\n])\n\nrun({ dependencies, state, main }) //=\u003e 'NO, 7 is not even.'\n```\n\nExample 2: switch case\n\n```javascript\nimport logF from 'mojiscript/console/logF'\nimport cond from 'mojiscript/logic/cond'\nimport pipe from 'mojiscript/core/pipe'\nimport run from 'mojiscript/core/run'\n\nconst dependencies = {\n  logF\n}\nconst state = new Date().getDay()\n\nconst dayName = cond ([\n  [ 0, 'Sunday' ],\n  [ 1, 'Monday' ],\n  [ 2, 'Tuesday' ],\n  [ 3, 'Wednesday' ],\n  [ 4, 'Thursday' ],\n  [ 5, 'Friday' ],\n  [ 6, 'Saturday' ]\n])\n\nconst main = ({ logF }) =\u003e pipe ([\n  dayName,\n  logF(day =\u003e `Today is ${day}.`)\n])\n\nrun({ dependencies, state, main }) //=\u003e 'Friday'\n```\n\nExample 3: if/else/elseif\n\n```javascript\nimport log from 'mojiscript/console/log'\nimport cond from 'mojiscript/logic/cond'\nimport pipe from 'mojiscript/core/pipe'\nimport run from 'mojiscript/core/run'\nimport $ from 'mojiscript/string/template'\n\nconst dependencies = {\n  log\n}\nconst state = 100\n\n// getTempInfo :: Number -\u003e String\nconst getTempInfo = cond ([\n  [ 0, 'water freezes at 0°C' ],\n  [ 100, 'water boils at 100°C' ],\n  [ () =\u003e true, $`nothing special happens at ${0}°C` ]\n])\n\nconst main = ({ log }) =\u003e pipe ([\n  getTempInfo,\n  log\n])\n\nrun({ dependencies, state, main }) //=\u003e 'water boils at 100°C'\n```\n\n## Error Handling\n\n```javascript\nimport ifError from 'mojiscript/logic/ifError'\n```\n\n### Synchronous Error Handling\n\n```javascript\nconst fail = err =\u003e ({ err })\nconst pass = value =\u003e ({ value })\nconst func = ifError (maybeThrowError) (fail) (pass)\n\nfunc ('fail') //=\u003e { err: [Error: Oops!] }\nfunc (1) //=\u003e { value: 1 }\n```\n\n### Asynchronous Error Handling\n\nAsynchronous error handling is no different than Synchronous error handling.\n\n```javascript\nconst func = ifError (maybeThrowErrorAsync) (fail) (pass)\n\nfunc ('fail') //=\u003e then { err: [Error: Oops!] }\nfunc (1) //=\u003e then { value: 1 }\n```\n\n### Error Handling with Sanctuary\n\nSanctuary makes error handling easy with the [Either type](https://github.com/sanctuary-js/sanctuary#either-type).\n\n```javascript\nconst func = ifError (maybeThrowError) (S.Left) (S.Right)\n\nfunc ('fail') //=\u003e Left (new Error (\"Oops!\"))\nfunc (1) //=\u003e Right (1)\n```\n\n## Morphisms\n\nMorphisms allow us to transform an object from one Category to another. The power of Morphisms can be seen when they are combined to create more complex Morphisms.\n\nHere's a high level example of a Morphism that take an input as a `String` and returns data from an API endpoint.\n\n```javascript\n// urlToJson :: Url -\u003e Json\nconst urlToJson = pipe ([\n  urlToAjaxResponse,\n  ajaxResponseToJson,\n])\n\n// queryToCustomer :: Query -\u003e Customer\nconst queryToCustomer = pipe ([\n  queryToUrl,\n  urlToJson,\n  jsonToCustomer\n])\n```\n\n## Application Layout\n\n```\napp/\n├── dist/\n└── src/\n    ├── __tests__/\n    │   └── main.test.js\n    ├── index.js\n    └── main.js\n```\n\n- `dist/` - Bundled or Babeled output folder.\n- `src/` - It is recommended to create an `src/` folder when your source requires transpiling with something like Webpack or Babel.\n- `__tests__/` - Testing is not optional. Keep tests close to your code.\n- `index.js` - Entrypoint to your application. This will load all dependencies as well as execute `main`. Can be excluded from tests.\n- `main.js` - Decoupling from dependecies and start allows for easy testing.\n\n## Unit Tests\n\nCheck out the [map/filter/reduce example](examples/map-filter-reduce) for an example on how to write unit tests.\n\n## Previous Art\n\nMany of these concepts are not new. These are some of the projects that have previously existed and influenced MojiScript.\n\n- [Ramda](https://ramdajs.com) - A practical functional library for JavaScript programmers.\n\n- [Sanctuary](https://sanctuary.js.org) - Refuge from unsafe JavaScript.\n\n- [Fantasy Land](https://github.com/fantasyland/fantasy-land) - Specification for interoperability of common algebraic structures in JavaScript\n\n- [Folktale](https://folktale.origamitower.com) - A standard library for functional programming in JavaScript\n\n## Contributors\n\nThanks goes to these wonderful people ([emoji key](https://github.com/kentcdodds/all-contributors#emoji-key)):\n\n\u003c!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section --\u003e\n\u003c!-- prettier-ignore --\u003e\n| [\u003cimg src=\"https://avatars3.githubusercontent.com/u/742630?v=4\" width=\"100px;\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003ejoelnet\u003c/b\u003e\u003c/sub\u003e](https://github.com/joelnet)\u003cbr /\u003e[💻](https://github.com/joelnet/MojiScript/commits?author=joelnet \"Code\") [📖](https://github.com/joelnet/MojiScript/commits?author=joelnet \"Documentation\") | [\u003cimg src=\"https://avatars1.githubusercontent.com/u/1798830?v=4\" width=\"100px;\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eLuiz Paulo \"Bills\"\u003c/b\u003e\u003c/sub\u003e](https://www.luizpb.com/en/)\u003cbr /\u003e[💻](https://github.com/joelnet/MojiScript/commits?author=luizbills \"Code\") [📖](https://github.com/joelnet/MojiScript/commits?author=luizbills \"Documentation\") | [\u003cimg src=\"https://avatars0.githubusercontent.com/u/9016793?v=4\" width=\"100px;\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eRaphael Miedl\u003c/b\u003e\u003c/sub\u003e](https://raphaeladdile.com/)\u003cbr /\u003e[📖](https://github.com/joelnet/MojiScript/commits?author=RaphaelAddile \"Documentation\") | [\u003cimg src=\"https://avatars3.githubusercontent.com/u/4382100?v=4\" width=\"100px;\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eJeremy Moseley\u003c/b\u003e\u003c/sub\u003e](https://github.com/jmoseley)\u003cbr /\u003e[💻](https://github.com/joelnet/MojiScript/commits?author=jmoseley \"Code\") [📖](https://github.com/joelnet/MojiScript/commits?author=jmoseley \"Documentation\") | [\u003cimg src=\"https://avatars2.githubusercontent.com/u/35818464?v=4\" width=\"100px;\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003erosaxny\u003c/b\u003e\u003c/sub\u003e](https://github.com/rosaxny)\u003cbr /\u003e[📖](https://github.com/joelnet/MojiScript/commits?author=rosaxny \"Documentation\") | [\u003cimg src=\"https://avatars2.githubusercontent.com/u/18303282?v=4\" width=\"100px;\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eRohit\u003c/b\u003e\u003c/sub\u003e](https://github.com/slntRohit)\u003cbr /\u003e[💻](https://github.com/joelnet/MojiScript/commits?author=slntRohit \"Code\") [📖](https://github.com/joelnet/MojiScript/commits?author=slntRohit \"Documentation\") | [\u003cimg src=\"https://avatars1.githubusercontent.com/u/11276111?v=4\" width=\"100px;\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eCorned\u003c/b\u003e\u003c/sub\u003e](https://github.com/Corned)\u003cbr /\u003e[💻](https://github.com/joelnet/MojiScript/commits?author=Corned \"Code\") |\n| :---: | :---: | :---: | :---: | :---: | :---: | :---: |\n| [\u003cimg src=\"https://avatars1.githubusercontent.com/u/5859096?v=4\" width=\"100px;\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eChrist Angga Saputra\u003c/b\u003e\u003c/sub\u003e](https://github.com/christangga)\u003cbr /\u003e[📖](https://github.com/joelnet/MojiScript/commits?author=christangga \"Documentation\") | [\u003cimg src=\"https://avatars2.githubusercontent.com/u/3443648?v=4\" width=\"100px;\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eHenry Williams\u003c/b\u003e\u003c/sub\u003e](https://github.com/henryjw)\u003cbr /\u003e[💻](https://github.com/joelnet/MojiScript/commits?author=henryjw \"Code\") | [\u003cimg src=\"https://avatars0.githubusercontent.com/u/1203369?v=4\" width=\"100px;\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eDenny Scott\u003c/b\u003e\u003c/sub\u003e](https://github.com/DennyScott)\u003cbr /\u003e[💻](https://github.com/joelnet/MojiScript/commits?author=DennyScott \"Code\") [📖](https://github.com/joelnet/MojiScript/commits?author=DennyScott \"Documentation\") | [\u003cimg src=\"https://avatars2.githubusercontent.com/u/22120525?v=4\" width=\"100px;\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003emdowds\u003c/b\u003e\u003c/sub\u003e](https://github.com/mdowds)\u003cbr /\u003e[💻](https://github.com/joelnet/MojiScript/commits?author=mdowds \"Code\") | [\u003cimg src=\"https://avatars2.githubusercontent.com/u/2187904?v=4\" width=\"100px;\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eksami\u003c/b\u003e\u003c/sub\u003e](http://ksami.github.io/)\u003cbr /\u003e[💻](https://github.com/joelnet/MojiScript/commits?author=ksami \"Code\") | [\u003cimg src=\"https://avatars2.githubusercontent.com/u/22601829?v=4\" width=\"100px;\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eUldarico Estrada\u003c/b\u003e\u003c/sub\u003e](https://github.com/kk-o)\u003cbr /\u003e[🎨](#design-kk-o \"Design\") | [\u003cimg src=\"https://avatars3.githubusercontent.com/u/33939239?v=4\" width=\"100px;\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eEdgar Mejía\u003c/b\u003e\u003c/sub\u003e](https://github.com/edgarMejia)\u003cbr /\u003e[💻](https://github.com/joelnet/MojiScript/commits?author=edgarMejia \"Code\") |\n| [\u003cimg src=\"https://avatars0.githubusercontent.com/u/1334574?v=4\" width=\"100px;\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eJonathan Diehl\u003c/b\u003e\u003c/sub\u003e](https://github.com/jdiehl)\u003cbr /\u003e[💻](https://github.com/joelnet/MojiScript/commits?author=jdiehl \"Code\") | [\u003cimg src=\"https://avatars2.githubusercontent.com/u/43359149?v=4\" width=\"100px;\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eThanh Nguyen\u003c/b\u003e\u003c/sub\u003e](https://thanhnguyen105337150.wordpress.com/)\u003cbr /\u003e[💻](https://github.com/joelnet/MojiScript/commits?author=thanhcng \"Code\") [⚠️](https://github.com/joelnet/MojiScript/commits?author=thanhcng \"Tests\") | [\u003cimg src=\"https://avatars2.githubusercontent.com/u/2373958?v=4\" width=\"100px;\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eTryggvi Gylfason\u003c/b\u003e\u003c/sub\u003e](https://github.com/tryggvigy)\u003cbr /\u003e[💻](https://github.com/joelnet/MojiScript/commits?author=tryggvigy \"Code\") [⚠️](https://github.com/joelnet/MojiScript/commits?author=tryggvigy \"Tests\") | [\u003cimg src=\"https://avatars2.githubusercontent.com/u/18303282?v=4\" width=\"100px;\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eRohit\u003c/b\u003e\u003c/sub\u003e](http://r10a.github.io)\u003cbr /\u003e[📖](https://github.com/joelnet/MojiScript/commits?author=r10a \"Documentation\") | [\u003cimg src=\"https://avatars1.githubusercontent.com/u/20503830?v=4\" width=\"100px;\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003ejatinkumar\u003c/b\u003e\u003c/sub\u003e](https://jatinkumarg17.wixsite.com/website)\u003cbr /\u003e[📖](https://github.com/joelnet/MojiScript/commits?author=jatinkumarg \"Documentation\") |\n\u003c!-- ALL-CONTRIBUTORS-LIST:END --\u003e\n\nThis project follows the [all-contributors](https://github.com/kentcdodds/all-contributors) specification. Contributions of any kind welcome!\n","funding_links":[],"categories":["Libraries","JavaScript"],"sub_categories":["Algebraic Data Types"],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjoelnet%2FMojiScript","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjoelnet%2FMojiScript","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjoelnet%2FMojiScript/lists"}