{"id":22389683,"url":"https://github.com/entando/entando-cms","last_synced_at":"2026-03-04T10:02:16.247Z","repository":{"id":35128522,"uuid":"195347425","full_name":"entando/entando-cms","owner":"entando","description":"The Entando Web Content Management System (WCMS) is a lightweight content and digital asset management system with support for headless operation. It allows management of widgets and html fragments so they can be placed within an Entando application.","archived":false,"fork":false,"pushed_at":"2023-05-06T05:32:11.000Z","size":6800,"stargazers_count":20,"open_issues_count":8,"forks_count":0,"subscribers_count":16,"default_branch":"master","last_synced_at":"2025-09-18T02:20:51.336Z","etag":null,"topics":["cms","entando","entando-cms","hacktoberfest","react"],"latest_commit_sha":null,"homepage":"https://dev.entando.org","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"lgpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/entando.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,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2019-07-05T05:58:02.000Z","updated_at":"2023-05-09T17:50:25.000Z","dependencies_parsed_at":"2024-12-05T03:12:49.272Z","dependency_job_id":"442f9023-515d-44a7-b04f-17a96d4193a9","html_url":"https://github.com/entando/entando-cms","commit_stats":{"total_commits":1424,"total_committers":23,"mean_commits":61.91304347826087,"dds":0.6404494382022472,"last_synced_commit":"2d4c4aaa58614b48c824ae28facf1e74c7dbd3fa"},"previous_names":[],"tags_count":321,"template":false,"template_full_name":null,"purl":"pkg:github/entando/entando-cms","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/entando%2Fentando-cms","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/entando%2Fentando-cms/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/entando%2Fentando-cms/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/entando%2Fentando-cms/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/entando","download_url":"https://codeload.github.com/entando/entando-cms/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/entando%2Fentando-cms/sbom","scorecard":{"id":378078,"data":{"date":"2025-08-11","repo":{"name":"github.com/entando/entando-cms","commit":"2d4c4aaa58614b48c824ae28facf1e74c7dbd3fa"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":2.5,"checks":[{"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":"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":"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":"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":"Code-Review","score":3,"reason":"Found 7/20 approved changesets -- score normalized to 3","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":"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":"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":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: GNU Lesser General Public License v3.0: 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":"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":"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":"Branch-Protection","score":-1,"reason":"internal error: error during branchesHandler.setup: internal error: githubv4.Query: Resource not accessible by integration","details":null,"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 18 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":"156 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: GHSA-968p-4wvh-cqc8","Warn: Project is vulnerable to: GHSA-67hx-6x53-jw92","Warn: Project is vulnerable to: GHSA-22h7-7wwg-qmgg","Warn: Project is vulnerable to: GHSA-c429-5p7v-vgjp","Warn: Project is vulnerable to: GHSA-6chw-6frg-f759","Warn: Project is vulnerable to: GHSA-v88g-cgmw-v5xw","Warn: Project is vulnerable to: GHSA-whgm-jr23-g3j9","Warn: Project is vulnerable to: GHSA-93q8-gq69-wqmw","Warn: Project is vulnerable to: GHSA-fwr7-v2mv-hh25","Warn: Project is vulnerable to: GHSA-qwcr-r2fm-qrc7","Warn: Project is vulnerable to: GHSA-3mgp-fx93-9xv5","Warn: Project is vulnerable to: GHSA-3wqf-4x89-9g79","Warn: Project is vulnerable to: GHSA-4p24-vmcr-4gqj","Warn: Project is vulnerable to: GHSA-7mvr-5x2g-wfc8","Warn: Project is vulnerable to: GHSA-ph58-4vrj-w6hr","Warn: Project is vulnerable to: GHSA-9v3m-8fp8-mj99","Warn: Project is vulnerable to: GHSA-vxmc-5x29-h64v","Warn: Project is vulnerable to: GHSA-9mvj-f7w8-pvh2","Warn: Project is vulnerable to: GHSA-7c82-mp33-r854","Warn: Project is vulnerable to: GHSA-9r7h-6639-v5mw","Warn: Project is vulnerable to: GHSA-v6h2-p8h4-qcjw","Warn: Project is vulnerable to: GHSA-grv7-fg5c-xmjg","Warn: Project is vulnerable to: GHSA-x9w5-v3q2-3rhw","Warn: Project is vulnerable to: GHSA-w8qv-6jwh-64r5","Warn: Project is vulnerable to: GHSA-v2mw-5mch-w8c5","Warn: Project is vulnerable to: GHSA-257v-vj4p-3w2h","Warn: Project is vulnerable to: GHSA-pxg6-pf52-xh8x","Warn: Project is vulnerable to: GHSA-3xgq-45jj-v275","Warn: Project is vulnerable to: GHSA-m7j4-fhg6-xf5v","Warn: Project is vulnerable to: GHSA-h73q-5wmj-q8pj","Warn: Project is vulnerable to: GHSA-gxpj-cx7g-858c","Warn: Project is vulnerable to: GHSA-w573-4hg7-7wgq","Warn: Project is vulnerable to: GHSA-3wcq-x3mq-6r9p","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-4gmj-3p3h-gm8h","Warn: Project is vulnerable to: GHSA-6h5x-7c5m-7cr7","Warn: Project is vulnerable to: GHSA-rv95-896h-c2vc","Warn: Project is vulnerable to: GHSA-qw6h-vgh9-j6wx","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-fjxv-7rqg-78g4","Warn: Project is vulnerable to: GHSA-ww39-953v-wcq6","Warn: Project is vulnerable to: GHSA-43f8-2h32-f4cj","Warn: Project is vulnerable to: GHSA-pfq8-rq6v-vf5m","Warn: Project is vulnerable to: GHSA-6x33-pw7p-hmpq","Warn: Project is vulnerable to: GHSA-c7qv-q95q-8v27","Warn: Project is vulnerable to: GHSA-qqgx-2p2h-9c37","Warn: Project is vulnerable to: GHSA-78xj-cgh5-2h22","Warn: Project is vulnerable to: GHSA-2p57-rm9w-gvfp","Warn: Project is vulnerable to: GHSA-7r28-3m3f-r2pr","Warn: Project is vulnerable to: GHSA-r8j5-h5cx-65gg","Warn: Project is vulnerable to: GHSA-6c3j-c64m-qhgq","Warn: Project is vulnerable to: GHSA-gxr4-xjj5-5px2","Warn: Project is vulnerable to: GHSA-jpcq-cgw6-v4j6","Warn: Project is vulnerable to: GHSA-896r-f27r-55mw","Warn: Project is vulnerable to: GHSA-9c47-m6qq-7p4h","Warn: Project is vulnerable to: GHSA-282f-qqgm-c34q","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-7wpw-2hjm-89gp","Warn: Project is vulnerable to: GHSA-r6rj-9ch6-g264","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-8hfj-j24r-96c4","Warn: Project is vulnerable to: GHSA-wc69-rhjr-hc9g","Warn: Project is vulnerable to: GHSA-56x4-j7p9-fcf9","Warn: Project is vulnerable to: GHSA-v78c-4p63-2j6c","Warn: Project is vulnerable to: GHSA-r683-j2x4-v87g","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-5fw9-fq32-wv5p","Warn: Project is vulnerable to: GHSA-r8f7-9pfq-mjmv","Warn: Project is vulnerable to: GHSA-rp65-9cf3-cjxr","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-hj48-42vr-x3v9","Warn: Project is vulnerable to: GHSA-9wv6-86v2-598j","Warn: Project is vulnerable to: GHSA-rhx6-c78j-4q9w","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-hwj9-h5mp-3pm3","Warn: Project is vulnerable to: GHSA-7fh5-64p2-3v2j","Warn: Project is vulnerable to: GHSA-hrpp-h998-j3pp","Warn: Project is vulnerable to: GHSA-5q6m-3h65-w53x","Warn: Project is vulnerable to: GHSA-p8p7-x288-28g6","Warn: Project is vulnerable to: GHSA-7mwh-4pqv-wmr8","Warn: Project is vulnerable to: GHSA-c2qf-rxjj-qqgw","Warn: Project is vulnerable to: GHSA-m6fv-jmcg-4jfg","Warn: Project is vulnerable to: GHSA-hxcc-f52p-wc94","Warn: Project is vulnerable to: GHSA-cm22-4g7w-348p","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-c9g6-9335-x697","Warn: Project is vulnerable to: GHSA-vx3p-948g-6vhq","Warn: Project is vulnerable to: GHSA-3jfq-g458-7qm9","Warn: Project is vulnerable to: GHSA-5955-9wpr-37jh","Warn: Project is vulnerable to: GHSA-f5x3-32g6-xq36","Warn: Project is vulnerable to: GHSA-r628-mhmh-qjhw","Warn: Project is vulnerable to: GHSA-9r2w-394v-53qc","Warn: Project is vulnerable to: GHSA-qq89-hq3f-393p","Warn: Project is vulnerable to: GHSA-4wf5-vphf-c2xc","Warn: Project is vulnerable to: GHSA-52f5-9888-hmc6","Warn: Project is vulnerable to: GHSA-jgrx-mgxx-jf9v","Warn: Project is vulnerable to: GHSA-72xf-g2v4-qvf3","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-g78m-2chm-r7qv","Warn: Project is vulnerable to: GHSA-j8xg-fqg3-53r7","Warn: Project is vulnerable to: GHSA-6fc8-4gx4-v693","Warn: Project is vulnerable to: GHSA-3h5v-q93c-6h6q","Warn: Project is vulnerable to: GHSA-3x9f-74h4-2fqr","Warn: Project is vulnerable to: GHSA-8vcr-vxm8-293m","Warn: Project is vulnerable to: GHSA-g973-978j-2c3p","Warn: Project is vulnerable to: GHSA-4r6h-8v6p-xvw6","Warn: Project is vulnerable to: GHSA-5pgg-2g8v-p4x9","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-18T14:44:05.183Z","repository_id":35128522,"created_at":"2025-08-18T14:44:05.183Z","updated_at":"2025-08-18T14:44:05.183Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30078307,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-04T08:01:56.766Z","status":"ssl_error","status_checked_at":"2026-03-04T08:00:42.919Z","response_time":59,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: 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":["cms","entando","entando-cms","hacktoberfest","react"],"created_at":"2024-12-05T03:12:39.720Z","updated_at":"2026-03-04T10:02:16.229Z","avatar_url":"https://github.com/entando.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Entando CMS\n\nThis project contains the `App Builder` screens for the CMS app of Entando.\n\n**This package is currently deprecated since this project has already been merged to [App Builder](https://github.com/entando/app-builder/commit/b3fff5f9e5ce19e104e7c3aa2833c58c56dc893e)**\n\nFor more information and documentation visit:  https://dev.entando.org, or https://forum.entando.org. Or for the latest news or product information please visit the main website: https://www.entando.com.\n\nInformation below is for building and running locally directly from source.\n\n---\n\n# Developer Prerequesites (only Standalone mode)\n\nIt is recommended to install `npm-install-peers` (`npm i -g npm-install-peers`) to install peer dependencies. So when you install npm dependencies, you can only install at one command: `npm i \u0026\u0026 npm-install-peers` - this will download all your dependencies specified in `package.json` including the `peerDependencies`. This is to enable standalone mode during development phases. Take note that whenever you install a new npm module, this will erase all the peer dependencies, so you have to re-run `npm-install-peers` after installing.\n\n# Configuration example\n\nPut following config into `.env.local` file to configure your app for local development:\n```\nREACT_APP_DOMAIN=http://tests.serv.run/entando-sample\nREACT_APP_USE_MOCKS=false\n```\n\n# Integration with app-builder\n\n`@entando/apimanager` and other libraries that will be shared with app-builder have to be loaded inside the project as `peer dependencies`.\n\nThe menu itself must not be present in the screens, as it will appear within the app-builder, but the paths must be respected using `react-router-dom`.\n\n---\n\n# Code Styling Rules\n\nhere follow the rules when it comes to code styling.\n\n## Linting\nSeveral linting standards have been applied to the project. On the git `pre-commit` hook all the linters are being run through the project.\nIt is possible to disable a specific linting rule for one row of a file, but the linter should never been disabled for the entire file nor the entirety of the linter should be disabled for the given line.\n\nA good instance in which it is recommended to disable the linter on a file is when doing a named export in a file that currently only posses one export (i.e. `types` files in states).\n\n## Testing\n\nA code coverage of 90% should be applied to any file that is not part of the UI. This includes eventual helpers, states related files, etc...\n\nTo test the code coverage, use command `npm run coverage` and see the results after testing or if you want to see more details of the test, locate the `coverage/lcov-report` to browse detailed results.\n\n## General recommendations\n\nThe blue print project only carries the bare minimum essentials.\nAnything that is UI related should be located within the UI directory, and then subdivided in sub directories based on their domain.\nCommon files (i.e. form inputs wrappers) should be located within the `src/ui/common` directory.\n\nAny app init related functionality should be located in its own file within the `src/app-init` directory (i.e. fontawesome setup).\nThe `index.js` should be only be importing init related files, css files and so forth.\n\n`Sass` is a requirement. The project is already setup to accommodate sass and linting rules have already been predefined. All of them should be located within the `src/sass` directory.\n\nImages should be located within the images directory. It is highly recommended to use `svg` files whenever possible. Files located in this directory can also be imported directly by the sass files.\n\nAny helper should be located within the `src/helpers` directory. Helpers exclusively for unit tests should be located in `testutils/helpers.js` file. Browse the file for existing test helpers such as the router, i18n, mock store, etc.\n\nMock objects for your API wrappers (see `api` folder) and unit tests should be located within `testutils/mocks` folder. See folder for examples.\n\nImports should always be absolute, and not relative.\n\n`Magic Words` and `Magic Numbers` are not allowed.\n\n## Redux State\n\nreducers should be imported in the root reducer and be sorted alphabetically in the `combineReducers` arguments.\nEach state is made up of 4 files:\n\n### types.js\ncontains constants used to define the action types. Each constant value should be following the given pattern:\n\n```js\nexport const ADD_MESSAGE = 'messages/add-message';\n```\n\nthe first part of the constant value should always be the name of the reducer itself.\n\n### actions.js\ncontains both actions and thunks. Thunks are meant to be located at the bottom of the file, while normal actions are at the top.\n\nThunks tests should always be checking that all the given actions within the thunk are being called with the correct arguments and in the right order:\n\n```js\nimport { createMockStore } from 'testutils/helpers';\n\nconst INITIAL_STATE = {};\n\nconst store = createMockStore(INITIAL_STATE);\n\nit('fetchDigitalExchanges calls setDigitalExchanges and setPage actions', (done) =\u003e {\n  store.dispatch(fetchDigitalExchanges()).then(() =\u003e {\n    const actions = store.getActions();\n    expect(actions).toHaveLength(4);\n    expect(actions[0]).toHaveProperty('type', TOGGLE_LOADING);\n    expect(actions[1]).toHaveProperty('type', SET_DIGITAL_EXCHANGES);\n    expect(actions[2]).toHaveProperty('type', SET_PAGE);\n    expect(actions[3]).toHaveProperty('type', TOGGLE_LOADING);\n    done();\n  }).catch(done.fail);\n});\n```\n\n### reducer.js\nreducers can be devided in several reducers using the `combineReducers` method before exporting. This is recommended when the state itself is extremely complex.\nEach reducer should also always return a default.\n\n### selectors.js\nselectors should always be generated using reselect to ensure memoization.\n\n## Containers\nContainers should always be separate from the UI component that they wrap, and they should always be located within the same directory of the UI component. The naming convention that we use here is that the Container is always named after the UI componet with the `Container` suffix.\n\n```js\nimport { connect } from 'react-redux';\n\nimport { getApis, getPlugins } from 'state/dashboard/selectors';\nimport { fetchIntegration } from 'state/dashboard/actions';\nimport Integrations from 'ui/dashboard/Integrations';\n\nexport const mapDispatchToProps = dispatch =\u003e ({\n  onDidMount: () =\u003e dispatch(fetchIntegration()),\n});\n\nexport const mapStateToProps = state =\u003e (\n  {\n    apis: getApis(state),\n    plugins: getPlugins(state),\n  }\n);\n\nexport default connect(\n  mapStateToProps,\n  mapDispatchToProps,\n)(Integrations);\n\n```\n\nit is allowed to named export the `mapStateToProps` and `mapDispatchToProps` constants for testing purposes but it should be avoided.\n\n## Forms testing\nredux form is pre-installed in the project and can be used when necessary.\nForms created with it should be tested properly to check both whether a certain field is present and if any validation rules are applied to it.\n\n```js\nimport { shallow } from 'enzyme';\n\ndescribe('SettingsFormBody', () =\u003e {\n  const component = shallow(\u003cSettingsFormBody /\u003e);\n\n  it('renders without crashing', () =\u003e {\n    expect(component.exists()).toEqual(true);\n  });\n\n  it('contains the name field', () =\u003e {\n    const element = component.find('Field[name=\"name\"]');\n    expect(element.exists()).toBe(true);\n    const props = element.props();\n    expect(props).toHaveProperty('validate', [required, maxLength50]);\n    expect(props).toHaveProperty('component', RenderTextInput);\n  });\n\n  it('contains the url field', () =\u003e {\n    const element = component.find('Field[name=\"url\"]');\n    expect(element.exists()).toBe(true);\n    const props = element.props();\n    expect(props).toHaveProperty('validate', [required]);\n    expect(props).toHaveProperty('component', RenderTextInput);\n  });\n\n  it('contains the key field', () =\u003e {\n    const element = component.find('Field[name=\"key\"]');\n    expect(element.exists()).toBe(true);\n    const props = element.props();\n    expect(props).toHaveProperty('validate', [required]);\n    expect(props).toHaveProperty('component', RenderTextInput);\n  });\n\n  it('contains the timeout field', () =\u003e {\n    const element = component.find('Field[name=\"timeout\"]');\n    expect(element.exists()).toBe(true);\n    const props = element.props();\n    expect(props).toHaveProperty('validate', [required, isNumber]);\n    expect(props).toHaveProperty('component', RenderTextInput);\n  });\n\n  it('contains the active field', () =\u003e {\n    const element = component.find('Field[name=\"active\"]');\n    expect(element.exists()).toBe(true);\n    const props = element.props();\n    expect(props).toHaveProperty('component', SwitchRenderer);\n  });\n\n});\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fentando%2Fentando-cms","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fentando%2Fentando-cms","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fentando%2Fentando-cms/lists"}