{"id":20947558,"url":"https://github.com/concordnow/ember-casl","last_synced_at":"2026-05-20T10:11:58.577Z","repository":{"id":36985964,"uuid":"383410972","full_name":"concordnow/ember-casl","owner":"concordnow","description":"Ember addon for CASL which makes it easy to add permissions in any Ember application","archived":false,"fork":false,"pushed_at":"2023-09-11T01:20:15.000Z","size":5972,"stargazers_count":0,"open_issues_count":3,"forks_count":0,"subscribers_count":4,"default_branch":"master","last_synced_at":"2025-07-07T08:11:38.102Z","etag":null,"topics":["authorization","casl","ember","ember-addon","hacktoberfest"],"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/concordnow.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE.md","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":"CODEOWNERS","security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2021-07-06T09:20:46.000Z","updated_at":"2022-01-10T01:46:18.000Z","dependencies_parsed_at":"2025-01-19T22:14:16.618Z","dependency_job_id":"addc81db-6e13-45c1-862b-62e0eccc53a6","html_url":"https://github.com/concordnow/ember-casl","commit_stats":{"total_commits":245,"total_committers":5,"mean_commits":49.0,"dds":"0.13877551020408163","last_synced_commit":"56a1f54bc85bf0267bd98f36353b33aa09421b17"},"previous_names":[],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/concordnow/ember-casl","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/concordnow%2Fember-casl","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/concordnow%2Fember-casl/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/concordnow%2Fember-casl/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/concordnow%2Fember-casl/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/concordnow","download_url":"https://codeload.github.com/concordnow/ember-casl/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/concordnow%2Fember-casl/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":264040944,"owners_count":23548072,"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":["authorization","casl","ember","ember-addon","hacktoberfest"],"created_at":"2024-11-19T00:12:01.978Z","updated_at":"2026-05-20T10:11:53.534Z","avatar_url":"https://github.com/concordnow.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"ember-casl\n==============================================================================\n\n[![Build Status](https://github.com/concordnow/ember-casl/actions/workflows/main.yml/badge.svg?branch=master)](https://github.com/concordnow/ember-casl/actions/workflows/main.yml)\n[![Ember Observer Score](https://emberobserver.com/badges/ember-casl.svg)](https://emberobserver.com/addons/ember-casl)\n\nEmber addon for [CASL](https://github.com/stalniy/casl) which makes it easy to add permissions in any Ember application.\n\nThis package allows to integrate `@casl/ability` with [Ember](https://emberjs.com/) application.\n\nIt provides:\n- Ability service that allows you to define CASL ability compatible with Ember tracked properties.\n- Can/Cannot component that allow to hide or show UI elements based on user ability to see them.\n\n\nCompatibility\n------------------------------------------------------------------------------\n\n* Ember.js v3.20 or above\n* Ember CLI v3.20 or above\n* Node.js v12 or above\n* ember-auto-import v2.0 or above\n\n\nInstallation\n------------------------------------------------------------------------------\n\n```\nember install ember-casl\n```\n\n\nUsage\n------------------------------------------------------------------------------\n\n### Ability Service\n\nDefine ability like regular Ember services by extending AbilityService.\n\n```js\n// services/post-ability.js\nimport { tracked } from '@glimmer/tracking';\nimport AbilityService from 'ember-casl/services/ability';\n\nexport default class PostAbility extends AbilityService {\n  @tracked isWriter = false;\n\n  get definition() {\n    return ({ can, cannot }) =\u003e {\n      can('read', 'post');\n      if (this.isWriter) {\n        can('write', 'post');\n      } else {\n        cannot('write', 'post').because(\"You're not a writer\");\n      }\n    };\n  }\n}\n```\n\nThe `definition` getter should return a function taking destructured [AbilityBuilder](https://casl.js.org/v5/en/api/casl-ability#ability-builder) as argument ([build](https://casl.js.org/v5/en/api/casl-ability#build) excluded).\n\nIt allows you to define very complex reactive ability (eg. Ability based on tracked property or another service).\n\nYour newly created Ability service expose some fields\n\n| Name              | Type         | Description                                                                                                    |\n| ----------------- | ------------ | -------------------------------------------------------------------------------------------------------------- |\n| `ability`         | CASL Ability | Original [CASL Ability](https://casl.js.org/v5/en/api/casl-ability#ability)                                    |\n| `can`             | Method       | Wrapper on [CASL Ability method can](https://casl.js.org/v5/en/api/casl-ability#can-of-pure-ability)           |\n| `cannot`          | Method       | Wrapper on [CASL Ability method cannot](https://casl.js.org/v5/en/api/casl-ability#cannot-of-pure-ability)     |\n| `relevantRuleFor` | Method       | Wrapper on [CASL Ability method relevantRuleFor](https://casl.js.org/v5/en/api/casl-ability#relevant-rule-for) |\n\nThen you can use those abilities as regular services in your Ember application.\n\n```js\n// components/dummy.js\nimport Component from '@glimmer/component';\nimport { inject as service } from '@ember/service';\n\nexport default class DummyComponent extends Component {\n  @service postAbility;\n\n  get canRead() {\n    return this.postAbility.can('read', 'post');\n  }\n\n  get cannotWriteReason() {\n    return this.postAbility.relevantRuleFor('write', 'post').reason;\n  }\n}\n```\n\n### Can / Cannot Helpers\n\nYou can use `can` \u0026 `cannot` helpers in your templates.\n\n```hbs\n{{#if (can 'read' 'post' service='post-ability')}}\n  \u003cspan\u003eYou're a reader\u003c/span\u003e\n{{/if}}\n{{#if (cannot 'write' 'post' service='post-ability')}}\n  \u003cspan\u003eYou're not a writer\u003c/span\u003e\n{{/if}}\n```\n\nPositional params are CASL Ability [can](https://casl.js.org/v5/en/api/casl-ability#can-of-pure-ability) / [cannot](https://casl.js.org/v5/en/api/casl-ability#cannot-of-pure-ability) arguments.\n`service` is the name of the Ember service.\n\n\nContributing\n------------------------------------------------------------------------------\n\nSee the [Contributing](CONTRIBUTING.md) guide for details.\n\n\nLicense\n------------------------------------------------------------------------------\n\nThis project is licensed under the [MIT License](LICENSE.md).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fconcordnow%2Fember-casl","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fconcordnow%2Fember-casl","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fconcordnow%2Fember-casl/lists"}