{"id":13516994,"url":"https://github.com/peasy/peasy-js","last_synced_at":"2025-10-06T01:47:55.230Z","repository":{"id":57321721,"uuid":"52750420","full_name":"peasy/peasy-js","owner":"peasy","description":"A business logic micro-framework for javascript","archived":false,"fork":false,"pushed_at":"2024-08-04T15:51:24.000Z","size":607,"stargazers_count":142,"open_issues_count":2,"forks_count":10,"subscribers_count":14,"default_branch":"master","last_synced_at":"2025-09-27T15:07:26.422Z","etag":null,"topics":["architectural-patterns","architecture","back-end-framework","backend-framework","business-logic","business-logic-framework","front-end-framework","frontend-framework","javascript","middle-tier-framework","peasy","peasy-js","reusability","typescript"],"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/peasy.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"license.txt","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null}},"created_at":"2016-02-28T23:31:12.000Z","updated_at":"2025-08-30T12:04:23.000Z","dependencies_parsed_at":"2024-01-13T10:42:20.419Z","dependency_job_id":"6a964826-67c2-4a0e-bd6e-3d54c6a9f874","html_url":"https://github.com/peasy/peasy-js","commit_stats":{"total_commits":336,"total_committers":11,"mean_commits":"30.545454545454547","dds":"0.34226190476190477","last_synced_commit":"5dbcb2ac674f69c64e77249909f3374b1e397ea7"},"previous_names":[],"tags_count":16,"template":false,"template_full_name":null,"purl":"pkg:github/peasy/peasy-js","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/peasy%2Fpeasy-js","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/peasy%2Fpeasy-js/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/peasy%2Fpeasy-js/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/peasy%2Fpeasy-js/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/peasy","download_url":"https://codeload.github.com/peasy/peasy-js/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/peasy%2Fpeasy-js/sbom","scorecard":{"id":725862,"data":{"date":"2025-08-11","repo":{"name":"github.com/peasy/peasy-js","commit":"804e852f4db8632454a9b0fe31e38a5109add04a"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":2.5,"checks":[{"name":"Code-Review","score":0,"reason":"Found 0/30 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":"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":"SAST","score":0,"reason":"no SAST tool detected","details":["Warn: no pull requests merged into dev branch"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"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":"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":"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":"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.txt:0","Info: FSF or OSI recognized license: MIT License: license.txt: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":"Vulnerabilities","score":6,"reason":"4 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: GHSA-968p-4wvh-cqc8","Warn: Project is vulnerable to: GHSA-v6h2-p8h4-qcjw","Warn: Project is vulnerable to: GHSA-3xgq-45jj-v275","Warn: Project is vulnerable to: GHSA-4vvj-4cpr-p986"],"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-22T12:47:18.912Z","repository_id":57321721,"created_at":"2025-08-22T12:47:18.912Z","updated_at":"2025-08-22T12:47:18.912Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":278547855,"owners_count":26004773,"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-05T02:00:06.059Z","response_time":54,"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":["architectural-patterns","architecture","back-end-framework","backend-framework","business-logic","business-logic-framework","front-end-framework","frontend-framework","javascript","middle-tier-framework","peasy","peasy-js","reusability","typescript"],"created_at":"2024-08-01T05:01:28.273Z","updated_at":"2025-10-06T01:47:55.192Z","avatar_url":"https://github.com/peasy.png","language":"JavaScript","funding_links":[],"categories":["JavaScript","📦 Legacy \u0026 Inactive Projects"],"sub_categories":[],"readme":"![peasy-js](https://www.dropbox.com/s/2yajr2x9yevvzbm/peasy3.png?dl=0\u0026raw=1)\n\n\u003cdiv align=\"center\"\u003e\n\t\u003ch1\u003e A business logic micro-framework for javascript \u003c/h1\u003e\n\u003c/div\u003e\n\n\u003cdiv align=\"center\"\u003e\n  \u003ca href=\"https://gitter.im/peasy/peasy-js?utm_source=badge\u0026utm_medium=badge\u0026utm_campaign=pr-badge\u0026utm_content=badge\" target=\"_blank\"\u003e\n    \u003cimg src=\"https://badges.gitter.im/peasy/peasy-js.svg\" alt=\"Gitter\"\u003e\n  \u003c/a\u003e\n  \u003ca href=\"https://www.npmjs.com/package/peasy-js\" target=\"_blank\"\u003e\n    \u003cimg src=\"https://badge.fury.io/js/peasy-js.svg\" alt=\"npm version\"\u003e\n  \u003c/a\u003e\n  \u003ca href=\"https://travis-ci.org/peasy/peasy-js\"\u003e\n    \u003cimg src=\"https://travis-ci.org/peasy/peasy-js.svg?branch=master\" alt=\"travis\"\u003e\n  \u003c/a\u003e\n\u003c/div\u003e\n\n\u003ch3 align=\"center\"\u003eWrite your business logic once and consume from everywhere!\u003c/h3\u003e\n\u003cp align=\"center\" style=\"padding: 20px\"\u003e\n  \u003cimg src=\"peasy-js.svg\"\u003e\n\u003c/p\u003e\n\n# What's a business logic micro-framework?\n\nA business logic framework is code that facilitates creating business logic in a consistent, predictable, reusable, extensible, maintainable, scalable, and testable manner.   It promotes creating business logic that is completely decoupled from its consuming technologies and helps to ensure that separation of concerns ([SoC](https://en.wikipedia.org/wiki/Separation_of_concerns)) are adhered to.\n\n# Why peasy-js?\n\nBecause the javascript ecosystem changes at a pace much more rapid than your business logic.  UI frameworks change: Backbone one day, Angular the next day, React the following...  Backend frameworks change: Express one day, Koa the next day, Hapi the next... Data frameworks and ORMS change...\n\nWhy couple your code with technologies that are hot today and gone tomorrow?  Why not focus on your business logic and abstract out everything else into truly reusable code that can be consumed by javascript in the browser, backend, or both, and by any UI or backend framework?\n\npeasy-js makes it trivial to whimsically swap out UI, backend, and data frameworks in your applications by creating your business logic in a composable, reusable, scalable, and testable manner.\n\n#### peasy-js offers/addresses the following:\n\n- [Business and validation rules](https://github.com/peasy/peasy-js/wiki/Business-and-Validation-Rules) engine\n- [Asynchronous support](https://github.com/peasy/peasy-js/wiki/asynchronous-api) via promises or callbacks\n- ES5 and later support\n- [TypeScript](https://github.com/peasy/peasy-js/wiki/new-in-2.0#typescript-support) support\n- [Multiple client support](https://github.com/peasy/peasy-js/wiki/Multiple-Client-Support)\n- [Multiple deployment scenario support](https://github.com/peasy/peasy-js/wiki/Data-Proxy#multiple-deployment-scenarios)\n- Reusability (decouples business and validation logic from consuming code and frameworks)\n- [Scalability](https://github.com/peasy/peasy-js/wiki/Data-Proxy#scalability)\n- [Testability](https://github.com/peasy/peasy-js/wiki/Testing)\n\n# Where can I get it?\n\n- [Download the latest release](https://github.com/peasy/peasy-js/archive/master.zip)\n- Clone the repo: ```git clone https://github.com/peasy/peasy-js.git```\n- Install with **npm**: ```npm install peasy-js```\n- Install with **yarn**: ```yarn add peasy-js```\n\nYou can also download and add the [peasy.js](https://github.com/peasy/peasy-js/blob/master/dist/peasy.js) file to your project and reference it accordingly.\n\n# Getting started\n\nYou can get started by reviewing the walk throughs below.\n\n- Run it in a [client](https://github.com/peasy/peasy-js/wiki/Browser-sample) (browser)\n- Run it on a [server](https://github.com/peasy/peasy-js/wiki/node.js-sample) (Node.js)\n- Run it with [TypeScript](https://github.com/peasy/peasy-js/wiki/typescript-node.js-sample) (Node.js)\n- [Sample application](https://github.com/peasy/peasy-js-samples): This sample application is an order entry / inventory management system written with peasy-js, react, angular (with TypeScript), mongoDB, nodejs, and express.\n- An additional sample can be viewed [using promises](https://github.com/peasy/peasy-js/blob/master/src/sampleWithPromises.js) or [using callbacks](https://github.com/peasy/peasy-js/blob/master/src/sampleWithCallbacks.js) that showcases creating a [business service](https://github.com/peasy/peasy-js/wiki/businessservice), custom [command](https://github.com/peasy/peasy-js/wiki/command), [business rules](https://github.com/peasy/peasy-js/wiki/Business-and-Validation-Rules), and wiring them up.  The sample also showcases how to consume the service.  To see it in action, run one or both from a command line:\n\n  -  ```node src/sampleWithPromises.js```\n  -  ```node src/sampleWithCallbacks.js```\n\n# The main actors\n\n### Business Service\nA [business service](https://github.com/peasy/peasy-js/wiki/BusinessService) implementation represents an entity (e.g. users, or projects) and is responsible for exposing business functionality via commands. These commands encapsulate CRUD and other business related logic.\n\n### Command\nThe [command](https://github.com/peasy/peasy-js/wiki/Command) is responsible for orchestrating the execution of initialization logic, business and validation rule execution, and other logic (data proxy invocations, workflow logic, etc.), respectively, via the command execution pipeline.\n\n### Rule\nA [rule](https://github.com/peasy/peasy-js/wiki/Business-and-Validation-Rules) can be created to represent a business rule (authorization, price validity, etc.) or a validation rule (field length, required, etc.). Rules are consumed by commands and can be chained, configured to execute based on a previous rule’s execution, etc. Rules can also be configured to invoke code based on the result of their execution.\n\n### Data Proxy\nThe [data proxy](https://github.com/peasy/peasy-js/wiki/Data-Proxy) is responsible for data storage and retrieval, and serves as an abstraction layer for data stores (database, web services, cache, etc.).\n\n##### peasy-js actors at work\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"peasy-js-uml.svg\"\u003e\n\u003c/p\u003e\n\n# What's new in version 2.0?\n\nYou can see all changes introduced with peasy-js 2.0 [here](https://github.com/peasy/peasy-js/wiki/new-in-2.0).\n\n# Contributing\n\nAll contributions are welcome, from general framework improvements to sample client consumers, proxy implementations, and documentation updates.  Want to get involved?  Please hit us up with your ideas.  Alternatively, you can make a pull request and we'll get to it ASAP.\n\n# Like what you see?\n\nPlease consider showing your support by starring the project.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpeasy%2Fpeasy-js","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fpeasy%2Fpeasy-js","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpeasy%2Fpeasy-js/lists"}