{"id":26552088,"url":"https://github.com/sash-ua/angust","last_synced_at":"2026-04-14T05:31:25.387Z","repository":{"id":57180038,"uuid":"92845766","full_name":"sash-ua/angust","owner":"sash-ua","description":"Angust is Angular service implements a unidirectional dataflow for manipulation with app state in Angular4+ apps","archived":false,"fork":false,"pushed_at":"2017-09-25T09:55:18.000Z","size":44,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-08-18T19:35:50.450Z","etag":null,"topics":["angular","angust","aot","flux","monad","monad-ts","redux","typescript"],"latest_commit_sha":null,"homepage":"","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/sash-ua.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE.md","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2017-05-30T15:10:39.000Z","updated_at":"2018-06-21T10:20:57.000Z","dependencies_parsed_at":"2022-09-14T03:31:14.386Z","dependency_job_id":null,"html_url":"https://github.com/sash-ua/angust","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/sash-ua/angust","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sash-ua%2Fangust","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sash-ua%2Fangust/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sash-ua%2Fangust/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sash-ua%2Fangust/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/sash-ua","download_url":"https://codeload.github.com/sash-ua/angust/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sash-ua%2Fangust/sbom","scorecard":{"id":801121,"data":{"date":"2025-08-11","repo":{"name":"github.com/sash-ua/angust","commit":"3c17b0c79a9aa7200f48e0d7307a2cea533cb48f"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":3,"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":"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":"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":"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":"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":"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":"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":"Vulnerabilities","score":10,"reason":"0 existing vulnerabilities detected","details":null,"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}},{"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":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE.md:0","Info: FSF or OSI recognized license: Apache License 2.0: LICENSE.md: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"}}]},"last_synced_at":"2025-08-23T10:30:19.932Z","repository_id":57180038,"created_at":"2025-08-23T10:30:19.932Z","updated_at":"2025-08-23T10:30:19.932Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31784251,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-14T02:24:21.117Z","status":"ssl_error","status_checked_at":"2026-04-14T02:24:20.627Z","response_time":153,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"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":["angular","angust","aot","flux","monad","monad-ts","redux","typescript"],"created_at":"2025-03-22T08:23:41.392Z","updated_at":"2026-04-14T05:31:25.364Z","avatar_url":"https://github.com/sash-ua.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"[![npm](https://img.shields.io/npm/dm/localeval.svg)](https://github.com/sash-ua/angust)\n[![Hex.pm](https://img.shields.io/hexpm/l/plug.svg)](https://github.com/sash-ua/angust)\n\n\n# Angust\n\nAngust is Angular4+ module(service) implements monad State to manipulate app's state.\n\n[Example app 1](https://github.com/sash-ua/gen_drift_monad-ts_a4).\n\n[Example app 2](https://sash-ua.github.io/todos-next/).\n\n**Introduction**\n* [Intro](#intro)\n\n## Setup\n* [Installation](#installation)\n* [Setup](#setup)\n\n**Methods**\n* [back()](#back)\n* [forward()](#forward)\n* [manager()](#manager)\n* [navigateTo()](#navigateto)\n\n## Intro\n\nAngust is Angular service implements a unidirectional dataflow for manipulation with app state in Angular4+ apps. The package will be useful\nin development of middle or small applications.\n\n## Installation\n```\nnpm install angust monad-ts --save-dev\n```\nor\n```\n yarn add angust monad-ts\n```\n\n## Setup\n\n**1.** **SystemJS** Configure `systemjs.config.js` to register the module.\n```\nSystemJS.config({\n\tmap:{\n\t\t...\n\t\t'angust': 'node_modules/angust/lib/angust.umd.js'\n\t\t...\n\t}\n})\n```\n**2.** **WebPack** No special configuration.\n\n**3.** Create an initialization state object to initialize Store. This object should contain complete range of defined\n to store elements. It should be statically analyzable for AOT, therefore it shouldn't have calculated values for AOT\n compatibility.\n \n**NB** After initialization we can't add / remove objects' key, only to change values.\n```\nexport const INIT_STATE = {\n\tsvg_attrs: []\n\t}\n```\n\n**4.** In your app's main module, import an initialization state object(`INIT_STATE`) and use StoreModule.forRoot\n(INIT_STATE) to provide it to Angular.\n```\nimport {StoreModule} from \"angust\";\nimport {INIT_STATE} from \"./store/store.init\";\n\n@NgModule({\n  imports: [\n    BrowserModule,\n    StoreModule.forRoot(INIT_STATE)\n  ]\n})\nexport class AppModule {}\n```\n**5.** You can then inject the Store service into your components and services.\n ```\n import {Store} from \"angust\";\n \n export interface StateStore{\n     svg_attrs: Array\u003c[string, string | number]\u003e;\n }\n \n @Component({\n\tselector: 'my-app',\n\ttemplate: `\n\t  \u003cdiv\u003eTest\u003c/div\u003e\n\t`})\n \n class MyAppComponent {\n constructor(\n         protected store: Store\u003cStateStore\u003e\n     ){\n         this.varSetter(this.store.manager({svg_attrs: [['preserveAspectRatio', 'xMidYMid meet'], ['viewBox', '0 0 305 305'], ['height', '100%'], ['width', SpecificService.dimension(0.35, 0.4)]]}));\n     }\n }\n ```\n\n[UP](#angust)\n\n## Methods\n\n#### Back\nNavigates back in the platform's history.\n```\n\tthis.store.back();\n```\n\n#### Forward\nNavigates forward in the platform's history.\n```\n\tthis.store.forward();\n```\n\n#### Manager\nIt update/change an app state and/or return the app state.\n```\n\t// State - {test:[g, b], next: 'g'}\n\t// Return the app state only.\n\tconsole.log(this.store.manager());  // {test:[g, b], next: 'g'}\n\t\n\t// Change and return the app state.\n\tconsole.log(this.store.manager({test: 'f'}));   // {test: 'f', next: 'g'}\n```\n**NB:**\nIf we update complex object:\n```\n\tconst obj = {f: 1, s: 2, th: 3};\n\t// INIT_STATE - {test:obj, next: 'g'}\n\t// State -\u003e {test:{f: 1, s: 2, th: 3}, next: 'g'}\n\tconsole.log(this.store.manager({test: {f: '2'}}));  // State -\u003e {test:{f: '2', s: 2, th: 3}, next: 'g'}\n\tconsole.log(obj);   // {f: 1, s: 2, th: 3};\n```\nIf we want change complex object we can do it **but** be careful:\n```\n\tconst obj = {f: 1, s: 2, th: 3};\n\t// State - {test: {f: 4}, next: 'g'}\n\tconsole.log(this.store.manager().test = obj);  // State -\u003e {test:{f: 1, s: 2, th: 3}, next: 'g'}. We set reference to `obj`.\n\tconsole.log(this.store.manager({test: {f: 'foo', s: 2, th: 3}));  // State -\u003e {test:{f: 'foo', s: 2, th: 3}, next: 'g'}.\n\tconsole.log(obj);  // {f: 'foo', s: 2, th: 3} `obj` was updated by reference.\n```\n\n#### NavigateTo\nIt changes current URL state in app state and then navigate with specified URL.\nTakes array of string or string and extras specified Angular Router.navigate() or Router.navigateByUrl().\n\nIf first argument is array of string function use Router.navigate() to navigate. Navigate based on the provided array of commands and a starting point. If no starting route is provided, the navigation is absolute.\n```\n\tthis.store.navigateTo(['team', 33, 'user', 11]);\n\tthis.store.navigateTo(['team', 33, 'user', 11], {relativeTo: route});\n\t// Navigate without updating the URL\n\tthis.store.navigateTo(['team', 33, 'user', 11], {relativeTo: route, skipLocationChange: true});\n\n```\nIf first argument is string function use Router.navigateByUrl() to navigate. Navigate based on the provided url. This navigation is always absolute.\n```\n\tthis.store.navigateTo(\"/team/33/user/11\");\n\t// Navigate without updating the URL\n\tthis.store.navigateTo(\"/team/33/user/11\", {skipLocationChange: true});\n```\n\n[UP](#angust)\n\n## License\n\nAngust is copyright (c) 2017 - present Alex Tranchenko tranchenkoa@gmail.com .\n\nAngust is a free software, licensed under the Apache License, Version 2.0. See the file LICENSE.md in this\ndistribution for more details.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsash-ua%2Fangust","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsash-ua%2Fangust","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsash-ua%2Fangust/lists"}