{"id":13828912,"url":"https://github.com/almin/almin","last_synced_at":"2025-04-25T10:39:41.272Z","repository":{"id":42020260,"uuid":"56744606","full_name":"almin/almin","owner":"almin","description":"Client-side DDD/CQRS for JavaScript.","archived":false,"fork":false,"pushed_at":"2021-08-04T03:50:23.000Z","size":13965,"stargazers_count":505,"open_issues_count":25,"forks_count":42,"subscribers_count":10,"default_branch":"master","last_synced_at":"2025-04-14T07:44:25.595Z","etag":null,"topics":["cqrs","ddd","flux","framework","javascript","library","state"],"latest_commit_sha":null,"homepage":"https://almin.js.org/","language":"TypeScript","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/almin.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":".github/CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":".github/CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2016-04-21T05:18:12.000Z","updated_at":"2025-01-13T00:43:04.000Z","dependencies_parsed_at":"2022-08-19T18:10:20.919Z","dependency_job_id":null,"html_url":"https://github.com/almin/almin","commit_stats":null,"previous_names":[],"tags_count":140,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/almin%2Falmin","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/almin%2Falmin/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/almin%2Falmin/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/almin%2Falmin/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/almin","download_url":"https://codeload.github.com/almin/almin/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":250758069,"owners_count":21482348,"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","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":["cqrs","ddd","flux","framework","javascript","library","state"],"created_at":"2024-08-04T09:03:19.631Z","updated_at":"2025-04-25T10:39:41.254Z","avatar_url":"https://github.com/almin.png","language":"TypeScript","readme":"# [Almin.js](https://github.com/almin/almin) [![Build Status](https://travis-ci.org/almin/almin.svg?branch=master)](https://travis-ci.org/almin/almin)\n\n\u003c!-- textlint-disable no-dead-link --\u003e\n\n[![Almin.js logo](https://almin.js.org/media/logo/logo.png)](https://github.com/almin/almin)\n\n[![Sauce Test Status](https://saucelabs.com/browser-matrix/almin.svg)](https://saucelabs.com/u/almin)\n\n\u003c!-- textlint-enable no-dead-link --\u003e\n\nFlux/CQRS patterns for JavaScript application.\n\nWrite code thinking :)\n\n## Why?\n\nNow, We can implement web applications with Flux or Redux etc...\n\nBut, I often hear a story that \"Control flow of Flux/Redux is cool, but where to implement domain logic.\"\n\nI think that people skip to Flux/Redux from MV* pattern.\n\n\u003e MV* --\u003e ( Missing things ) --\u003e Flux/Redux(CQRS+EventSourcing)\n\nAlmin aim to fill the **Missing things** between MV* and Flux/Redux.\n\n## Features\n\nAlmin provides some patterns, is not a framework.\n\n- Testable\n- Scalable\n- Responsibility Layers patten - well-known as DDD(Domain-Driven Design)/CQRS\n- Support [TypeScript](https://www.typescriptlang.org/ \"TypeScript\") and [Flow](https://flow.org/ \"FlowType\")\n\nAlmin is an implementation of Read/Write Stack Architecture that is well-known as Flux/CQRS.\n\n## Installation\n\n    npm install almin\n\nYou'll also need a Promise polyfill for [older browsers](https://caniuse.com/).\n\n    npm install es6-promise\n\n## Documentation\n\n:memo: Please See [https://almin.js.org/](https://almin.js.org/) for details.\n\n- :book: Documentation of Almin\n- [https://almin.js.org/](https://almin.js.org/)\n\n## What is Almin?\n\nAlmin provides Flux/CQRS patterns for JavaScript applications.\n\nIt aims to create a scalable app.\n\n![Overview of almin-architecture](docs/assets/almin-architecture.png)\n\nThe above figure is overview of Almin architecture that is similar to CQRS([Command Query Responsibility Segregation](https://martinfowler.com/bliki/CQRS.html \"Command Query Responsibility Segregation\")).\n\nBut, Almin is not a framework, provides only these components\n\n- Dispatcher\n- Context\n- UseCase\n- Store\n- StoreGroup\n\nOther components like Domain, Repository and State are written by you!\n\nOf course, Almin help you to write other components.\n\nAlso, You may notice that these components are similar to [Flux](https://github.com/facebook/flux \"Flux\") architecture.\n\nAlmin is also a flux implementation library. :thumbsup:\n\n| Almin      | Flux          | Redux                  |\n|------------|---------------|------------------------|\n| Dispatcher | Dispatcher    | store.dispatch         |\n| Context    | Container     | Middleware/React Redux |\n| UseCase    | ActionCreator | Actions                |\n| Store      | Store         | Store                  |\n| StoreGroup | Container     | combineReducers        |\n| (State)    | Store         | Reducer                |\n| (Domain)   |               |                        |\n|(Repository)|               |                        |\n\n:memo: `State`, `Domain` and `Repository` is optional on Almin,\nbecause the best for these components is vary based on application.\n\nAlmin has not a perfect solution for an application, but we can write code thinking.\n\nWe are going to learn two architectures(Flux/CQRS) using Almin :)\n\n## Real Examples\n\nWelcome to pull request!\n\n- [azu/presentation-annotator: viewing presentation and annotate.](https://github.com/azu/presentation-annotator)\n- [morpheme-match/website at master · azu/morpheme-match](https://github.com/azu/morpheme-match/tree/master/website)\n- [azu/faao: Faao is a GitHub issue/pull-request client on Electron.](https://github.com/azu/faao \"azu/faao: Faao is a GitHub issue/pull-request client on Electron.\") - Full TypeScript example\n\n## Presentations\n\n- The concept of Almin (English)\n    - [The Concept of Almin](http://azu.github.io/slide/2017/almin/concept-of-almin.html \"The Concept of Almin\")\n- The architecture of Almin (Japanese)\n    - [Almin.js | JavaScriptアーキテクチャ](http://azu.github.io/slide/2016/child_process_sushi/almin-javascript-architecture.html \"Almin.js | JavaScriptアーキテクチャ\")\n- Patterns For Large-Scale JavaScript Application Architecture (Japanese)\n    - [複雑なJavaScriptアプリケーションを考えながら作る話](http://azu.github.io/slide/2016/react-meetup/large-scale-javascript.html)\n    - [azu/large-scale-javascript: 複雑なJavaScriptアプリケーションを作るために考えること](https://github.com/azu/large-scale-javascript)\n- DDD and Almin (Japanese)\n    - [Faao - ドメイン駆動設計で作るGitHub Issue Client -](http://azu.github.io/slide/2017/teppeis-sushi/client-side-ddd-on-github.html \"Faao - ドメイン駆動設計で作るGitHub Issue Client -\")\n\n## Packages\n\nThe Almin repo is managed as a [monorepo](https://github.com/babel/babel/blob/master/doc/design/monorepo.md \"monorepo\"); it's composed of npm packages.\n\n### Core\n\n| Package | Version | Description|\n|--------|-------|-------|\n| [`almin`](./packages/almin) | [![npm](https://img.shields.io/npm/v/almin.svg?maxAge=2592000)](https://www.npmjs.com/package/almin) | `almin` itself |\n\n### Integrations\n\n| Package | Version | Description|\n|--------|-------|-------|\n| [`almin-react-container`](./packages/almin-react-container) | [![npm](https://img.shields.io/npm/v/almin-react-container.svg?maxAge=2592000)](https://www.npmjs.com/package/almin-react-container) | Integration with React |\n\n### Utilities\n\n| Package | Version | Description|\n|--------|-------|-------|\n| [`almin-logger`](./packages/almin-logger) | [![npm](https://img.shields.io/npm/v/almin-logger.svg?maxAge=2592000)](https://www.npmjs.com/package/almin-logger) | console logger | \n| [`almin-devtools`](https://github.com/almin/almin-devtools) | [![npm](https://img.shields.io/npm/v/almin-devtools.svg?maxAge=2592000)](https://www.npmjs.com/package/almin-devtools) | browser debugging extension | \n\n## Contributing\n\nPlease see [CONTRIBUTING.md](./.github/CONTRIBUTING.md) for more details.\n\n1. Fork it!\n2. Create your feature branch: `git checkout -b my-new-feature`\n3. Commit your changes: `git commit -am 'Add some feature'`\n4. Push to the branch: `git push origin my-new-feature`\n5. Submit a pull request :D\n\n## License\n\nMIT\n\n## Sponsors\n\n\n\u003ca href=\"https://www.netlify.com\"\u003e\n\u003cimg src=\"https://www.netlify.com/img/global/badges/netlify-color-bg.svg\" alt=\"Deploys by Netlify\" /\u003e\n\u003c/a\u003e\n            \n","funding_links":[],"categories":["TypeScript"],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Falmin%2Falmin","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Falmin%2Falmin","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Falmin%2Falmin/lists"}