{"id":19555090,"url":"https://github.com/jtsang4/caslin","last_synced_at":"2025-04-26T22:32:16.593Z","repository":{"id":38370866,"uuid":"195861572","full_name":"jtsang4/caslin","owner":"jtsang4","description":"🌗An application feature management JS framework to support multi-environments, multi-roles, multi-scenarios.","archived":false,"fork":false,"pushed_at":"2022-12-09T17:35:51.000Z","size":2239,"stargazers_count":10,"open_issues_count":19,"forks_count":2,"subscribers_count":1,"default_branch":"master","last_synced_at":"2024-10-31T14:53:18.283Z","etag":null,"topics":["authorization","environment","feature","role"],"latest_commit_sha":null,"homepage":"","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/jtsang4.png","metadata":{"files":{"readme":"README-zh-cn.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}},"created_at":"2019-07-08T17:57:46.000Z","updated_at":"2023-07-27T12:05:37.000Z","dependencies_parsed_at":"2023-01-25T22:47:03.818Z","dependency_job_id":null,"html_url":"https://github.com/jtsang4/caslin","commit_stats":null,"previous_names":["wtzeng1/caslin"],"tags_count":8,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jtsang4%2Fcaslin","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jtsang4%2Fcaslin/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jtsang4%2Fcaslin/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jtsang4%2Fcaslin/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/jtsang4","download_url":"https://codeload.github.com/jtsang4/caslin/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":224048798,"owners_count":17247088,"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","environment","feature","role"],"created_at":"2024-11-11T04:31:42.209Z","updated_at":"2024-11-11T04:31:43.004Z","avatar_url":"https://github.com/jtsang4.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Caslin\n\n一个用于支持\"多环境、多角色、多场景\"的应用特性管理 JS 框架\n\n\u003e 本框架基于 [Casl](https://github.com/stalniy/casl) 改造，并结合实际需求（多环境管理）而产生灵感。用于在多环境下管理系统的特性和能力，可根据环境、角色的不同对系统特性进行裁剪和接合。\n\u003e\n\u003e **在此特别感谢 [Casl](https://github.com/stalniy/casl)，没有 Casl 就没有现在的 Caslin。**\n\n[English](https://github.com/wtzeng1/caslin) | 中文\n\n## 框架特点\n\n* 满足一个应用，多个环境的特性定制\n* 集中式特性管理，便于查看、定义、更改特性\n* 特性定义满足功能、角色、环境自由组合\n* 特性定义与特性实现解耦，可灵活变更特性定义或者特性实现\n* 基于 Casl 改造，底层 API 逻辑简单清晰，同时提供友好、易用的 React 上层封装 API\n\n## 与 Casl 的不同点\n\n* 源码使用 TypeScript\n* 引入环境的概念，以解决 Casl 未强调解决的\"相同功能，不同环境\"的问题\n* 增加环境相关 API 以及 [React 高阶组件](https://github.com/wtzeng1/caslin/blob/master/packages/caslin-react/README-zh-cn.md)\n\n## 安装\n\n```shell\nnpm install @caslin/feature --save\n```\n\n## 基本使用\n\n原则：每一条特性规则对应一句基本语义：**At \u0026lt;environment\u003e can \u0026lt;do\u003e \u0026lt;something\u003e**.\n\n### 1. 定义特性\n\n通过定义多条规则，生成 feature 对象。\n\n```javascript\nimport { FeatureBuilder } from '@caslin/feature';\n\nconst feature = FeatureBuilder.define((can, cannot, at) =\u003e {\n  at('all').can('read', 'Article');\n  at('featEnv1').can('create', 'Article');\n  at('featEnv2').cannot('delete', 'Article');\n  can('read', 'Comment'); // Alias of `at('all').can('read', 'Comment');`\n});\n```\n\n### 2. 检查能力\n\n利用 feature 对象检查是否拥有相应特性。\n\n```javascript\nfeature.at('featEnv1').can('create', 'Article'); // true\nfeature.at('featEnv2').cannot('delete', 'Article'); // true\nfeature.at('featEnv1').cannot('delete', 'Article'); // true\nfeature.at('featEnv2').cannot(['delete', 'create'], 'Article'); // true\nfeature.at('featEnv2').can('read', 'Article'); // true, because \"all\" env could \"read\"\nfeature.can('read', 'Comment'); // true. Alias of `feature.at('all').can('read', 'Comment');`\n```\n\n### 3. 设置默认环境，检查环境（可选）\n\n配置当前的默认环境，并可检查传入的环境是否匹配默认环境。\n\n```javascript\nfeature.setEnv('featEnv1'); // set current environment as \"featEnv1\"，could be reset by `feature.resetEnv()`\n\n// Check feature\nfeature.can('read', 'Article'); // true, same as `feature.at('featEnv1').can('read', 'Article')`\nfeature.can('manage', 'Article'); // true\nfeature.cannot('delete', 'Article'); // true\n\n// Check environment\nfeature.env.is('featEnv1'); // true，current environment is \"featEnv1\"\nfeature.env.not('featEnv2'); // true，current environment is not \"featEnv2\"\nfeature.env.in(['featEnv2', 'featEnv3']); // false，current environment isn't been included\nfeature.env.notIn(['featEnv2', 'featEnv3']); // true，current environment isn't been included\n```\n\n## API\n\n更加详细的 API 请见 [API 文档](https://github.com/wtzeng1/caslin/blob/master/packages/caslin-feature/README-zh-cn.md)\n\n### FeatureBuilder\n\n* FeatureBuilder.define(definer: Definer)\n\n接收一个 `Definer` 类型的参数，生成 feature 对象。类型为 `{ (definer: Definer): Feature }`。\n\n### Definer\n\n定义规则的函数，类型为 `{ (can, cannot, at): Promise\u003cany\u003e | void }`，定义一条规则的基本用法为 `at('environment').can('read', 'Article')`。\n\n可以省略 `at()`，表示本条规则适用所有环境，如 `can('read', 'Article')`，等效于 `at('all').can('read', 'Article')`。\n\n### Feature\n\n假定有一个 `feature` 为 `Feature` 的实例。\n\n* feature.at('env').can('action', 'subject')\n\n表示在某环境(env)下对某主体(subject)是否有操作(action/actions)的能力，**有**则返回 `true`，否则返回 `false`。\n\n* feature.at('env').cannot('action', 'subject')\n\n表示在某环境(env)下对某主体(subject)是否有操作(action/actions)的能力，**没有**则返回 `true`，否则返回 `false`。\n\n* feature.setEnv('env')\n\n设置当前的默认环境。\n\n* feature.resetEnv()\n\n取消设置当前的默认环境。\n\n* feature.env.value\n\n当前默认环境的值。\n\n* feature.env.is('env')\n\n检验当前的默认环境是否是 \"env\"，如果**是**则返回 `true`，否则返回 `false`。\n\n* feature.env.not('env')\n\n检验当前的默认环境是否是 \"env\"，如果**不是**则返回 `true`，否则返回 `false`。\n\n* feature.env.in(['env1', 'env2'])\n\n检验当前的默认环境是否包含于 env1, env2 中，如果**包含**则返回 `true`，否则返回 `false`。\n\n* feature.env.notIn(['env1', 'env2'])\n\n检验当前的默认环境是否是包含于 env1, env2 中，如果**不包含**则返回 `true`，否则返回 `false`。\n\n* feature.env.matchPick({ env1: 'value1', env2: 'value2' })\n\n选择匹配当前环境的\"键值对\"，返回匹配键值对的 value。\n\n## UI 集成\n\n像 Casl 一样，Caslin 也是一个没有外部依赖的纯 JS 库，在 Node 或者浏览器环境都可以使用。为了更好地在不同环境下使用，有一些环境相关的集成工具库可以使用。\n\n* [@caslin/react](https://github.com/wtzeng1/caslin/blob/master/packages/caslin-react/README-zh-cn.md) 用于 [React](https://reactjs.org/)\n\n## 许可协议\n\n[MIT License](https://github.com/wtzeng1/caslin/blob/master/LICENSE)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjtsang4%2Fcaslin","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjtsang4%2Fcaslin","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjtsang4%2Fcaslin/lists"}