@via-profit/ability 2.0.0-rc.7 → 2.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +328 -156
- package/build/playground.js +59 -416
- package/build/playground.js.map +1 -1
- package/dist/AbilityCode.d.ts +6 -6
- package/dist/AbilityCompare.d.ts +2 -2
- package/dist/AbilityCondition.d.ts +13 -10
- package/dist/AbilityError.d.ts +0 -3
- package/dist/AbilityMatch.d.ts +2 -2
- package/dist/AbilityPolicy.d.ts +12 -11
- package/dist/AbilityPolicyEffect.d.ts +2 -2
- package/dist/AbilityResolver.d.ts +1 -1
- package/dist/AbilityRule.d.ts +18 -3
- package/dist/AbilityRuleSet.d.ts +11 -6
- package/dist/index.js +79 -68
- package/package.json +1 -2
- package/dist/AbilityPolicyResult.d.ts +0 -6
- package/dist/playground.d.ts +0 -26
package/build/playground.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"playground.js","mappings":"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","sources":["webpack://@via-profit/ability/./src/AbilityCode.ts","webpack://@via-profit/ability/./src/AbilityCompare.ts","webpack://@via-profit/ability/./src/AbilityCondition.ts","webpack://@via-profit/ability/./src/AbilityError.ts","webpack://@via-profit/ability/./src/AbilityMatch.ts","webpack://@via-profit/ability/./src/AbilityPolicy.ts","webpack://@via-profit/ability/./src/AbilityPolicyEffect.ts","webpack://@via-profit/ability/./src/AbilityResolver.ts","webpack://@via-profit/ability/./src/AbilityRule.ts","webpack://@via-profit/ability/./src/AbilityRuleSet.ts","webpack://@via-profit/ability/./src/playground.ts","webpack://@via-profit/ability/external node-commonjs \"node:http\"","webpack://@via-profit/ability/webpack/bootstrap","webpack://@via-profit/ability/webpack/before-startup","webpack://@via-profit/ability/webpack/startup","webpack://@via-profit/ability/webpack/after-startup"],"sourcesContent":["export class AbilityCode<T extends string | number | undefined = number> {\n public code: T;\n\n constructor(code: T) {\n this.code = code;\n }\n\n public isEqual(compareWith: AbilityCode<T> | null): boolean {\n return compareWith !== null && this.code === compareWith.code;\n }\n\n public isNotEqual(compareWith: AbilityCode<T> | null): boolean {\n return !this.isEqual(compareWith);\n }\n\n public static fromLiteral(literal: string | number): AbilityCode {\n let Code: AbilityCode | null = null;\n\n Object.keys(this).forEach(member => {\n if (member === literal) {\n Code = this[member as keyof typeof this] as AbilityCode;\n }\n });\n\n if (!Code) {\n throw new Error(\n `Mismatch error. The literal ${literal} can not be find as a member of this class`,\n );\n }\n\n return new this((Code as AbilityCode).code) as AbilityCode;\n }\n}\n\nexport default AbilityCode;\n","import AbilityCode from './AbilityCode';\n\nexport type AbilityCompareVariantType = 'and' | 'or'\n\nexport class AbilityCompare extends AbilityCode {\n public static and = new AbilityCompare(0);\n public static or = new AbilityCompare(1);\n}\n\nexport default AbilityCompare;\n","import AbilityCode from './AbilityCode';\n\nexport type AbilityConditionVariantType = '=' | '<>' | '>' | '<' | '>=' | '<=' | 'in' | 'not in';\n\nexport class AbilityCondition extends AbilityCode<AbilityConditionVariantType> {\n public static EQUAL = new AbilityCondition('=');\n public static NOT_EQUAL = new AbilityCondition('<>');\n public static MORE_THAN = new AbilityCondition('>');\n public static LESS_THAN = new AbilityCondition('<');\n public static LESS_OR_EQUAL = new AbilityCondition('<=');\n public static MORE_OR_EQUAL = new AbilityCondition('>=');\n public static IN = new AbilityCondition('in');\n public static NOT_IN = new AbilityCondition('not in');\n}\n\nexport default AbilityCondition;\n","export class AbilityError extends Error {\n constructor(message: string) {\n super(message);\n }\n}\n\nexport class AbilityParserError extends Error {\n constructor(message: string) {\n super(message);\n }\n}\n\nexport class PermissionError extends Error {\n constructor(message: string) {\n super(message);\n }\n}\n","import AbilityCode from './AbilityCode';\n\nexport type AbilityMatchVariantType = 'pending' | 'match' | 'mismatch';\n\nexport class AbilityMatch extends AbilityCode<AbilityMatchVariantType>{\n public static pending = new AbilityMatch('pending');\n public static match = new AbilityMatch('match');\n public static mismatch = new AbilityMatch('mismatch');\n}\n\nexport default AbilityMatch;","import AbilityRuleSet, { AbilityRuleSetConfig } from './AbilityRuleSet';\nimport AbilityMatch from './AbilityMatch';\nimport AbilityCompare, { AbilityCompareVariantType } from './AbilityCompare';\nimport AbilityPolicyEffect, { AbilityPolicyEffectVariantType } from './AbilityPolicyEffect';\n\nexport type AbilityPolicyConfig = {\n readonly action: string;\n readonly effect: AbilityPolicyEffectVariantType;\n readonly compareMethod: AbilityCompareVariantType;\n readonly ruleSet: AbilityRuleSetConfig[];\n readonly id: string;\n readonly name: string;\n};\n\nexport class AbilityPolicy<Resources extends object = object> {\n public matchState: AbilityMatch = AbilityMatch.pending;\n /**\n * List of rules\n */\n public ruleSet: AbilityRuleSet[] = [];\n\n /**\n * Policy effect\n */\n public effect: AbilityPolicyEffect;\n\n /**\n * Rules compare method.\\\n * For the «and» method the rule will be permitted if all\\\n * rules will be returns «permit» status and for the «or» - if\\\n * one of the rules returns as «permit»\n */\n public compareMethod: AbilityCompare = AbilityCompare.and;\n\n /**\n * Policy name\n */\n public name: string;\n\n /**\n * Policy ID\n */\n public id: string;\n\n /**\n * Soon\n */\n public action: string;\n\n public constructor(params: {\n id: string;\n name: string;\n action: string;\n effect: AbilityPolicyEffect;\n }) {\n const { name, id, action, effect } = params;\n this.name = name;\n this.id = id;\n this.action = action;\n this.effect = effect;\n }\n\n /**\n * Add rule set to the policy\n * @param ruleSet - The rule set to add\n */\n public addRuleSet(ruleSet: AbilityRuleSet): this {\n this.ruleSet.push(ruleSet);\n\n return this;\n }\n\n /**\n * Check if the policy is matched\n * @param resources - The resource to check\n */\n public check(resources: Resources): AbilityMatch {\n this.matchState = AbilityMatch.mismatch;\n\n if (!this.ruleSet.length) {\n return this.matchState;\n }\n\n const rulesetCheckStates = this.ruleSet.reduce<AbilityMatch[]>((collect, ruleSet) => {\n return collect.concat(ruleSet.check(resources));\n }, []);\n\n if (AbilityCompare.and.isEqual(this.compareMethod)) {\n if (rulesetCheckStates.every(ruleState => AbilityMatch.match.isEqual(ruleState))) {\n this.matchState = AbilityMatch.match;\n }\n }\n\n if (AbilityCompare.or.isEqual(this.compareMethod)) {\n if (rulesetCheckStates.some(ruleState => AbilityMatch.match.isEqual(ruleState))) {\n this.matchState = AbilityMatch.match;\n }\n }\n\n return this.matchState;\n }\n\n /**\n * Parse the config JSON format to Policy class instance\n */\n public static parse<Resources extends object = object>(\n config: AbilityPolicyConfig,\n ): AbilityPolicy<Resources> {\n const { id, name, ruleSet, compareMethod, action, effect } = config;\n\n // Create the empty policy\n const policy = new AbilityPolicy<Resources>({\n name,\n id,\n action,\n effect: new AbilityPolicyEffect(effect),\n });\n\n policy.compareMethod = AbilityCompare.fromLiteral(compareMethod);\n\n ruleSet.forEach(ruleSetConfig => {\n policy.addRuleSet(AbilityRuleSet.parse(ruleSetConfig));\n });\n\n return policy;\n }\n\n public export(): AbilityPolicyConfig {\n return {\n id: this.id.toString(),\n name: this.name.toString(),\n compareMethod: this.compareMethod.code.toString() as AbilityPolicyConfig['compareMethod'],\n ruleSet: this.ruleSet.map(rule => rule.export()),\n action: this.action,\n effect: this.effect.code,\n };\n }\n}\n\nexport default AbilityPolicy;\n","import AbilityCode from './AbilityCode';\n\nexport type AbilityPolicyEffectVariantType = 'deny' | 'permit';\n\nexport class AbilityPolicyEffect extends AbilityCode<AbilityPolicyEffectVariantType> {\n public static deny = new AbilityPolicyEffect('deny');\n public static permit = new AbilityPolicyEffect('permit');\n}\n\nexport default AbilityPolicyEffect;\n","import AbilityPolicy from './AbilityPolicy';\nimport AbilityPolicyEffect from './AbilityPolicyEffect';\nimport AbilityMatch from './AbilityMatch';\nimport { PermissionError } from './AbilityError';\n\nexport class AbilityResolver<Resources extends object = object> {\n policies: readonly AbilityPolicy<Resources>[];\n\n public constructor(\n policyOrListOfPolicies: readonly AbilityPolicy<Resources>[] | AbilityPolicy<Resources>,\n ) {\n this.policies = Array.isArray(policyOrListOfPolicies)\n ? policyOrListOfPolicies\n : [policyOrListOfPolicies];\n }\n\n /**\n * Resolve policy for the resource and action\n *\n @param action - Action\n * @param resource - Resource\n */\n public resolve<Action extends keyof Resources>(\n action: Action,\n resource: Resources[Action],\n ): this {\n const filteredPolicies: AbilityPolicy[] = this.policies.filter(policy => {\n return AbilityResolver.isInActionContain(policy.action, String(action));\n });\n\n filteredPolicies.map(policy => policy.check(resource as object));\n\n this.policies = filteredPolicies;\n\n return this;\n }\n\n public enforce<Action extends keyof Resources>(\n action: Action,\n resource: Resources[Action],\n ): void | never {\n const resolver = this.resolve(action, resource);\n if (resolver) {\n if (resolver.isDeny()) {\n throw new PermissionError(\n resolver.getPolicy()?.name?.toString() || 'Unknown permission error',\n );\n }\n }\n }\n\n /**\n * Get the last effect of the policy\n *\n * @returns {AbilityPolicyEffect | null}\n */\n public getEffect(): AbilityPolicyEffect | null {\n const effects = this.policies.reduce<AbilityPolicyEffect[]>((collect, policy, _index) => {\n if (policy.matchState.isEqual(AbilityMatch.match)) {\n return collect.concat(policy.effect);\n }\n return collect;\n }, []);\n\n if (effects.length) {\n return effects[effects.length - 1];\n }\n\n return null;\n }\n\n public isPermit() {\n const effect = this.getEffect();\n\n return effect !== null && effect.isEqual(AbilityPolicyEffect.permit);\n }\n\n public isDeny() {\n const effect = this.getEffect();\n\n return effect !== null && effect.isEqual(AbilityPolicyEffect.deny);\n }\n\n public getPolicy(): AbilityPolicy<Resources> | null {\n const lastPolicy = this.policies.length ? this.policies[this.policies.length - 1] : null;\n\n return lastPolicy && lastPolicy.matchState.isEqual(AbilityMatch.match) ? lastPolicy : null;\n }\n\n /**\n * Check if the action is contained in another action\n * @param actionA - The first action to check\n * @param actionB - The second action to check\n */\n public static isInActionContain(actionA: string, actionB: string) {\n const actionAArray = String(actionA).split('.');\n const actionBArray = String(actionB).split('.');\n\n const a = actionAArray.length >= actionBArray.length ? actionAArray : actionBArray;\n const b = actionBArray.length >= actionAArray.length ? actionBArray : actionAArray;\n\n return a\n .reduce<boolean[]>((acc, chunk, index) => {\n const iterationRes = chunk === b[index] || b[index] === '*' || chunk === '*';\n\n return acc.concat(iterationRes);\n }, [])\n .every(Boolean);\n }\n}\n\nexport default AbilityResolver;\n","import AbilityMatch from './AbilityMatch';\nimport AbilityCondition, { AbilityConditionVariantType } from './AbilityCondition';\n\nexport type AbilityRuleConfig = {\n readonly id: string;\n readonly name: string;\n\n /**\n * Subject key path like a 'user.name'\n */\n readonly subject: string;\n /**\n * Resource key path like a 'user.name' or value\n */\n readonly resource: string | number | boolean | (string | number)[];\n\n readonly condition: AbilityConditionVariantType;\n};\n\nexport class AbilityRule<Resources extends object = object> {\n /**\n * Subject key path like a 'user.name'\n */\n public subject: string;\n /**\n * Resource key path like a 'user.name' or value\n */\n public resource: string | number | boolean | (string | number)[];\n\n public condition: AbilityCondition;\n public name: string;\n public id: string;\n public state: AbilityMatch = AbilityMatch.pending;\n\n public constructor(params: AbilityRuleConfig) {\n const { id, name, subject, resource, condition } = params;\n this.id = id;\n this.name = name;\n this.subject = subject;\n this.resource = resource;\n this.condition = new AbilityCondition(condition);\n }\n\n /**\n * Check if the rule is matched\n * @param resource - The resource to check\n */\n public check(resource: Resources | null): AbilityMatch {\n let is: boolean = false;\n\n const [valueS, valueO] = this.extractValues(resource);\n\n if (AbilityCondition.LESS_THAN.isEqual(this.condition)) {\n is = Number(valueS) < Number(valueO);\n }\n\n if (AbilityCondition.LESS_OR_EQUAL.isEqual(this.condition)) {\n is = Number(valueS) <= Number(valueO);\n }\n\n if (AbilityCondition.MORE_THAN.isEqual(this.condition)) {\n is = Number(valueS) > Number(valueO);\n }\n\n if (AbilityCondition.MORE_OR_EQUAL.isEqual(this.condition)) {\n is = Number(valueS) >= Number(valueO);\n }\n\n if (AbilityCondition.EQUAL.isEqual(this.condition)) {\n is = valueS === valueO;\n }\n\n if (AbilityCondition.NOT_EQUAL.isEqual(this.condition)) {\n is = valueS !== valueO;\n }\n\n if (AbilityCondition.IN.isEqual(this.condition)) {\n // [<some>] and [<some>]\n if (Array.isArray(valueS) && Array.isArray(valueO)) {\n is = valueS.some(v => valueO.find(v1 => v1 === v));\n }\n // <some> and [<some>]\n if ((typeof valueS === 'string' || typeof valueS === 'number') && Array.isArray(valueO)) {\n is = valueO.includes(valueS);\n }\n // [<some>] and <some>\n if ((typeof valueO === 'string' || typeof valueO === 'number') && Array.isArray(valueS)) {\n is = valueS.includes(valueO);\n }\n }\n\n if (AbilityCondition.NOT_IN.isEqual(this.condition)) {\n // [<some>] and [<some>]\n if (Array.isArray(valueS) && Array.isArray(valueO)) {\n is = !valueS.some(v => valueO.find(v1 => v1 === v));\n }\n // <some> and [<some>]\n if ((typeof valueS === 'string' || typeof valueS === 'number') && Array.isArray(valueO)) {\n is = !valueO.includes(valueS);\n }\n // [<some>] and <some>\n if ((typeof valueO === 'string' || typeof valueO === 'number') && Array.isArray(valueS)) {\n is = !valueS.includes(valueO);\n }\n }\n\n this.state = is ? AbilityMatch.match : AbilityMatch.mismatch;\n\n return this.state;\n }\n\n /**\n * Extract values from the resourceData\n * @param resourceData - The resourceData to extract values from\n */\n public extractValues(\n resourceData: Resources | null,\n ): [\n string | number | boolean | (string | number)[] | null | undefined,\n string | number | boolean | (string | number)[] | null | undefined,\n ] {\n let leftSideValue;\n let rightSideValue;\n\n if (resourceData === null || typeof resourceData === 'undefined') {\n return [NaN, NaN];\n }\n\n const isPath = (str: unknown): str is string => {\n return typeof str === 'string' && str.match(/\\./g) !== null;\n };\n\n if (isPath(this.subject)) {\n leftSideValue = this.getDotNotationValue<number | boolean | string | (string | number)[]>(\n resourceData,\n this.subject,\n );\n } else {\n leftSideValue = this.subject;\n }\n if (isPath(this.resource)) {\n rightSideValue = this.getDotNotationValue<number | boolean | string | (string | number)[]>(\n resourceData,\n this.resource,\n );\n } else {\n rightSideValue = this.resource as number | boolean | string | (string | number)[];\n }\n\n return [leftSideValue, rightSideValue];\n }\n\n /**\n * Get the value of the object by dot notation\n * @param resource - The object to get the value from\n * @param desc - The dot notation string\n */\n public getDotNotationValue<T = unknown>(resource: unknown, desc: string): T | undefined {\n const arr = desc.split('.');\n\n while (arr.length && resource) {\n const comp = arr.shift() || '';\n const match = new RegExp('(.+)\\\\[([0-9]*)\\\\]').exec(comp);\n\n if (match !== null && match.length == 3) {\n const arrayData = {\n arrName: match[1],\n arrIndex: match[2],\n };\n\n if (resource[arrayData.arrName as keyof typeof resource] !== undefined) {\n resource = resource[arrayData.arrName as keyof typeof resource][arrayData.arrIndex];\n } else {\n resource = undefined;\n }\n } else {\n resource = resource[comp as keyof typeof resource];\n }\n }\n\n return resource as T;\n }\n\n public static parse<Resources extends object>(\n config: AbilityRuleConfig,\n ): AbilityRule<Resources> {\n const { id, name, subject, resource, condition } = config;\n\n return new AbilityRule<Resources>({\n id,\n name,\n subject,\n resource,\n condition,\n });\n }\n\n /**\n * Export the rule to config object\n */\n public export(): AbilityRuleConfig {\n return {\n id: this.id,\n name: this.name,\n subject: this.subject,\n resource: this.resource,\n condition: this.condition.code,\n };\n }\n}\n\nexport default AbilityRule;\n","import AbilityRule, { AbilityRuleConfig } from './AbilityRule';\nimport AbilityCompare, { AbilityCompareVariantType } from './AbilityCompare';\nimport AbilityMatch from './AbilityMatch';\n\nexport type AbilityRuleSetConfig = {\n readonly id: string;\n readonly name: string;\n readonly compareMethod: AbilityCompareVariantType;\n readonly rules: AbilityRuleConfig[];\n};\n\nexport class AbilityRuleSet<Resources extends object = object> {\n public state: AbilityMatch = AbilityMatch.pending;\n /**\n * List of rules\n */\n public rules: AbilityRule[] = [];\n\n /**\n * Rules compare method.\\\n * For the «and» method the rule will be permitted if all\\\n * rules will be returns «permit» status and for the «or» - if\\\n * one of the rules returns as «permit»\n */\n public compareMethod: AbilityCompare = AbilityCompare.and;\n\n /**\n * Group name\n */\n public name: string;\n\n /**\n * Group ID\n */\n public id: string;\n\n public constructor(params: Pick<AbilityRuleSetConfig, 'id' | 'name' | 'compareMethod'>) {\n const { name, id, compareMethod } = params;\n\n this.name = name;\n this.id = id;\n this.compareMethod = AbilityCompare.fromLiteral(compareMethod);\n // this.compareMethod = new AbilityCompare(compareMethod);\n }\n\n public addRule(rule: AbilityRule, compareMethod: AbilityCompare): this {\n this.rules.push(rule);\n this.compareMethod = compareMethod;\n\n return this;\n }\n\n public addRules(rules: AbilityRule[], compareMethod: AbilityCompare): this {\n rules.forEach(rule => this.addRule(rule, compareMethod));\n\n return this;\n }\n\n public check(resources: Resources | null): AbilityMatch {\n this.state = AbilityMatch.mismatch;\n\n if (!this.rules.length) {\n return this.state;\n }\n\n const ruleCheckStates = this.rules.reduce<AbilityMatch[]>((collect, rule) => {\n return collect.concat(rule.check(resources));\n }, []);\n\n if (AbilityCompare.and.isEqual(this.compareMethod)) {\n if (ruleCheckStates.every(ruleState => AbilityMatch.match.isEqual(ruleState))) {\n this.state = AbilityMatch.match;\n }\n }\n\n if (AbilityCompare.or.isEqual(this.compareMethod)) {\n if (ruleCheckStates.some(ruleState => AbilityMatch.match.isEqual(ruleState))) {\n this.state = AbilityMatch.match;\n }\n }\n\n return this.state;\n }\n\n /**\n * Parse the config JSON format to Group class instance\n */\n public static parse<Resource extends object = object>(\n config: AbilityRuleSetConfig,\n ): AbilityRuleSet<Resource> {\n const { id, name, rules, compareMethod } = config;\n\n const ruleSet = new AbilityRuleSet<Resource>({\n compareMethod,\n name,\n id,\n });\n\n // Adding rules if exists\n if (rules && rules.length > 0) {\n const abilityRules = rules.map(ruleConfig => AbilityRule.parse(ruleConfig));\n\n ruleSet.addRules(abilityRules, ruleSet.compareMethod);\n }\n\n return ruleSet;\n }\n\n public export(): AbilityRuleSetConfig {\n return {\n id: this.id.toString(),\n name: this.name.toString(),\n compareMethod: this.compareMethod.code.toString() as AbilityRuleSetConfig['compareMethod'],\n rules: this.rules.map(rule => rule.export()),\n };\n }\n}\n\nexport default AbilityRuleSet;\n","import http from 'node:http';\nimport AbilityPolicy, { AbilityPolicyConfig } from './AbilityPolicy';\nimport AbilityResolver from '~/AbilityResolver';\n\nconst server = http.createServer();\n\nserver.on('request', (_req, res) => {\n type Resources = {\n ['order.status']: {\n readonly account: {\n readonly roles: readonly string[];\n };\n readonly order: {\n readonly status: string;\n };\n readonly feature: {\n readonly status: string;\n };\n };\n };\n\n const config: AbilityPolicyConfig[] = [\n {\n id: 'bb758c1b-1015-4894-ba25-d23156e063cf',\n name: 'Status hui',\n action: 'order.status',\n effect: 'deny',\n compareMethod: 'and',\n ruleSet: [\n {\n id: '9cc009e5-0aa9-453a-a668-cb3f418ced92',\n name: 'Не администратор',\n compareMethod: 'and',\n rules: [\n {\n id: '4093cd50-e54f-4062-8053-2d3b5966fad3',\n name: 'Нет роли администраторв',\n subject: 'account.roles',\n resource: 'administrator',\n condition: '<>',\n },\n ],\n },\n ]\n },\n {\n id: 'bb758c1b-1015-4894-ba25-d23156e063cf',\n name: 'Status hui 1',\n action: 'order.status',\n effect: 'permit',\n compareMethod: 'and',\n ruleSet: [\n {\n id: '2f8f9d71-860b-4fa6-b395-9331f1f0848e',\n name: 'Rule set',\n compareMethod: 'and',\n rules: [\n {\n id: 'a3c7d66f-5c2d-4a24-83bc-03b0a2d9c32b',\n name: 'Rule 1',\n subject: 'order.status',\n resource: 'не обработан',\n condition: '=',\n },\n {\n id: 'a3c7d66f-5c2d-4a24-83bc-03b0a2d9c32b',\n name: 'Rule 2',\n subject: 'feature.status',\n resource: 'отменен',\n condition: '=',\n },\n ],\n },\n ],\n },\n ];\n\n const policies = config.map(cfg => AbilityPolicy.parse<Resources>(cfg));\n const result = new AbilityResolver(policies).resolve('order.status', {\n account: {\n roles: ['user', 'couch'],\n },\n order: {\n status: 'не обработан',\n },\n feature: {\n status: 'отменен',\n // status: 'завершен'\n },\n });\n\n res.statusCode = 200;\n res.setHeader('content-type', 'application/json');\n\n res.write(\n JSON.stringify({\n status: result.isDeny() ? 'deny' : 'permit',\n }),\n );\n res.end();\n});\n\nserver.listen(8080, 'localhost', () => {\n console.debug('server started at http://localhost:8080');\n});\n\nexport type Resources = {\n readonly ['account.read']: {\n readonly account: {\n readonly id: string;\n readonly roles: readonly string[];\n } | null;\n readonly resource: {\n readonly id: string;\n };\n };\n readonly ['access.auth']: {\n readonly token: {\n readonly type: string;\n readonly id: string;\n } | null;\n };\n readonly ['order.update']: {\n readonly account: {\n readonly roles: readonly string[];\n readonly department: string;\n } | null;\n readonly order: {\n readonly status: string;\n } | null;\n };\n};\n","module.exports = require(\"node:http\");","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","","// startup\n// Load entry module and return exports\n// This entry module is referenced by other modules so it can't be inlined\nvar __webpack_exports__ = __webpack_require__(\"./src/playground.ts\");\n",""],"names":[],"sourceRoot":""}
|
|
1
|
+
{"version":3,"file":"playground.js","mappings":"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","sources":["webpack://@via-profit/ability/./src/AbilityCode.ts","webpack://@via-profit/ability/./src/AbilityCondition.ts","webpack://@via-profit/ability/./src/AbilityError.ts","webpack://@via-profit/ability/./src/AbilityMatch.ts","webpack://@via-profit/ability/./src/AbilityRule.ts","webpack://@via-profit/ability/./src/playground.ts","webpack://@via-profit/ability/external node-commonjs \"node:http\"","webpack://@via-profit/ability/webpack/bootstrap","webpack://@via-profit/ability/webpack/before-startup","webpack://@via-profit/ability/webpack/startup","webpack://@via-profit/ability/webpack/after-startup"],"sourcesContent":["export class AbilityCode<\n Code extends string | number,\n> {\n public _code: Code;\n\n constructor(code: Code) {\n this._code = code;\n }\n\n public get code(): Code {\n return this._code;\n }\n\n public isEqual(compareWith: AbilityCode<Code> | null): boolean {\n return compareWith !== null && this.code === compareWith.code;\n }\n\n public isNotEqual(compareWith: AbilityCode<Code> | null): boolean {\n return !this.isEqual(compareWith);\n }\n}\n\nexport default AbilityCode;\n","import AbilityCode from './AbilityCode';\nimport { AbilityParserError } from '~/AbilityError';\n\nexport type AbilityConditionCodeType = '=' | '<>' | '>' | '<' | '>=' | '<=' | 'in' | 'not in';\nexport type AbilityConditionLiteralType =\n | 'equal'\n | 'not_equal'\n | 'more_than'\n | 'less_than'\n | 'less_or_equal'\n | 'more_or_equal'\n | 'in'\n | 'not_in';\n\nexport class AbilityCondition extends AbilityCode<AbilityConditionCodeType> {\n public static equal = new AbilityCondition('=');\n public static not_equal = new AbilityCondition('<>');\n public static more_than = new AbilityCondition('>');\n public static less_than = new AbilityCondition('<');\n public static less_or_equal = new AbilityCondition('<=');\n public static more_or_equal = new AbilityCondition('>=');\n public static in = new AbilityCondition('in');\n public static not_in = new AbilityCondition('not in');\n\n public static fromLiteral(literal: AbilityConditionLiteralType): AbilityCondition {\n const code = AbilityCondition[literal]?.code || null;\n if (code === null) {\n throw new AbilityParserError(`Literal ${literal} does not found in AbilityCondition class`);\n }\n\n return new AbilityCondition(code);\n }\n\n public get literal() {\n const literal = Object.keys(AbilityCondition).find(member => {\n const val = AbilityCondition[member as keyof typeof AbilityCondition] as AbilityCondition;\n return val.code === this.code;\n }) as AbilityConditionLiteralType;\n\n if (typeof literal === 'undefined') {\n throw new Error(`Literal value does not found in class AbilityCondition`);\n }\n\n return literal;\n }\n}\n\nexport default AbilityCondition;\n","export class AbilityError extends Error {\n constructor(message: string) {\n super(message);\n }\n}\n\nexport class AbilityParserError extends Error {\n constructor(message: string) {\n super(message);\n }\n}\n\nexport class PermissionError extends Error {\n constructor(message: string) {\n super(message);\n }\n}\n","import AbilityCode from './AbilityCode';\n\nexport type AbilityMatchCodeType = 'pending' | 'match' | 'mismatch';\n\nexport class AbilityMatch extends AbilityCode<AbilityMatchCodeType>{\n public static pending = new AbilityMatch('pending');\n public static match = new AbilityMatch('match');\n public static mismatch = new AbilityMatch('mismatch');\n}\n\nexport default AbilityMatch;","import AbilityMatch from './AbilityMatch';\nimport AbilityCondition, { AbilityConditionCodeType } from './AbilityCondition';\n\nexport type AbilityRuleConfig = {\n readonly id: string;\n readonly name: string;\n\n /**\n * Subject key path like a 'user.name'\n */\n readonly subject: string;\n /**\n * Resource key path like a 'user.name' or value\n */\n readonly resource: string | number | boolean | (string | number)[];\n\n readonly condition: AbilityConditionCodeType;\n};\n\nexport type AbilityRuleConstructorProps = Omit<AbilityRuleConfig, 'condition'> & {\n readonly condition: AbilityCondition;\n};\n\nexport class AbilityRule<Resources extends object = object> {\n /**\n * Subject key path like a 'user.name'\n */\n public subject: string;\n /**\n * Resource key path like a 'user.name' or value\n */\n public resource: string | number | boolean | (string | number)[];\n\n public condition: AbilityCondition;\n public name: string;\n public id: string;\n public state: AbilityMatch = AbilityMatch.pending;\n\n public constructor(params: AbilityRuleConstructorProps) {\n const { id, name, subject, resource, condition } = params;\n this.id = id;\n this.name = name;\n this.subject = subject;\n this.resource = resource;\n this.condition = condition;\n }\n\n /**\n * Check if the rule is matched\n * @param resource - The resource to check\n */\n public check(resource: Resources | null): AbilityMatch {\n let is: boolean = false;\n\n const [valueS, valueO] = this.extractValues(resource);\n\n if (AbilityCondition.less_than.isEqual(this.condition)) {\n is = Number(valueS) < Number(valueO);\n }\n\n if (AbilityCondition.less_or_equal.isEqual(this.condition)) {\n is = Number(valueS) <= Number(valueO);\n }\n\n if (AbilityCondition.more_than.isEqual(this.condition)) {\n is = Number(valueS) > Number(valueO);\n }\n\n if (AbilityCondition.more_or_equal.isEqual(this.condition)) {\n is = Number(valueS) >= Number(valueO);\n }\n\n if (AbilityCondition.equal.isEqual(this.condition)) {\n is = valueS === valueO;\n }\n\n if (AbilityCondition.not_equal.isEqual(this.condition)) {\n is = valueS !== valueO;\n }\n\n if (AbilityCondition.in.isEqual(this.condition)) {\n // [<some>] and [<some>]\n if (Array.isArray(valueS) && Array.isArray(valueO)) {\n is = valueS.some(v => valueO.find(v1 => v1 === v));\n }\n // <some> and [<some>]\n if ((typeof valueS === 'string' || typeof valueS === 'number') && Array.isArray(valueO)) {\n is = valueO.includes(valueS);\n }\n // [<some>] and <some>\n if ((typeof valueO === 'string' || typeof valueO === 'number') && Array.isArray(valueS)) {\n is = valueS.includes(valueO);\n }\n }\n\n if (AbilityCondition.not_in.isEqual(this.condition)) {\n // [<some>] and [<some>]\n if (Array.isArray(valueS) && Array.isArray(valueO)) {\n is = !valueS.some(v => valueO.find(v1 => v1 === v));\n }\n // <some> and [<some>]\n if ((typeof valueS === 'string' || typeof valueS === 'number') && Array.isArray(valueO)) {\n is = !valueO.includes(valueS);\n }\n // [<some>] and <some>\n if ((typeof valueO === 'string' || typeof valueO === 'number') && Array.isArray(valueS)) {\n is = !valueS.includes(valueO);\n }\n }\n\n this.state = is ? AbilityMatch.match : AbilityMatch.mismatch;\n\n return this.state;\n }\n\n /**\n * Extract values from the resourceData\n * @param resourceData - The resourceData to extract values from\n */\n public extractValues(\n resourceData: Resources | null,\n ): [\n string | number | boolean | (string | number)[] | null | undefined,\n string | number | boolean | (string | number)[] | null | undefined,\n ] {\n let leftSideValue;\n let rightSideValue;\n\n if (resourceData === null || typeof resourceData === 'undefined') {\n return [NaN, NaN];\n }\n\n const isPath = (str: unknown): str is string => {\n return typeof str === 'string' && str.match(/\\./g) !== null;\n };\n\n if (isPath(this.subject)) {\n leftSideValue = this.getDotNotationValue<number | boolean | string | (string | number)[]>(\n resourceData,\n this.subject,\n );\n } else {\n leftSideValue = this.subject;\n }\n if (isPath(this.resource)) {\n rightSideValue = this.getDotNotationValue<number | boolean | string | (string | number)[]>(\n resourceData,\n this.resource,\n );\n } else {\n rightSideValue = this.resource as number | boolean | string | (string | number)[];\n }\n\n return [leftSideValue, rightSideValue];\n }\n\n /**\n * Get the value of the object by dot notation\n * @param resource - The object to get the value from\n * @param desc - The dot notation string\n */\n public getDotNotationValue<T = unknown>(resource: unknown, desc: string): T | undefined {\n const arr = desc.split('.');\n\n while (arr.length && resource) {\n const comp = arr.shift() || '';\n const match = new RegExp('(.+)\\\\[([0-9]*)\\\\]').exec(comp);\n\n if (match !== null && match.length == 3) {\n const arrayData = {\n arrName: match[1],\n arrIndex: match[2],\n };\n\n if (resource[arrayData.arrName as keyof typeof resource] !== undefined) {\n resource = resource[arrayData.arrName as keyof typeof resource][arrayData.arrIndex];\n } else {\n resource = undefined;\n }\n } else {\n resource = resource[comp as keyof typeof resource];\n }\n }\n\n return resource as T;\n }\n\n public static parse<Resources extends object>(config: AbilityRuleConfig): AbilityRule<Resources> {\n const { id, name, subject, resource, condition } = config;\n\n return new AbilityRule<Resources>({\n id,\n name,\n subject,\n resource,\n condition: new AbilityCondition(condition),\n });\n }\n\n /**\n * Export the rule to config object\n */\n public export(): AbilityRuleConfig {\n return {\n id: this.id,\n name: this.name,\n subject: this.subject,\n resource: this.resource,\n condition: this.condition.code,\n };\n }\n}\n\nexport default AbilityRule;\n","import http from 'node:http';\nimport { AbilityPolicyConfig } from './AbilityPolicy';\nimport AbilityCondition from '~/AbilityCondition';\nimport AbilityRule from './AbilityRule';\nimport AbilityMatch from './AbilityMatch';\n\nconst server = http.createServer();\n\nserver.on('request', (_req, res) => {\n type Resources = {\n ['order.status']: {\n readonly account: {\n readonly roles: readonly string[];\n };\n readonly order: {\n readonly status: string;\n };\n readonly feature: {\n readonly status: string;\n };\n };\n };\n\n const config: AbilityPolicyConfig[] = [\n {\n id: 'bb758c1b-1015-4894-ba25-d23156e063cf',\n name: 'Status hui',\n action: 'order.status',\n effect: 'deny',\n compareMethod: 'and',\n ruleSet: [\n {\n id: '9cc009e5-0aa9-453a-a668-cb3f418ced92',\n name: 'Не администратор',\n compareMethod: 'and',\n rules: [\n {\n id: '4093cd50-e54f-4062-8053-2d3b5966fad3',\n name: 'Нет роли администраторв',\n subject: 'account.roles',\n resource: 'administrator',\n condition: '<>',\n },\n ],\n },\n ],\n },\n {\n id: 'bb758c1b-1015-4894-ba25-d23156e063cf',\n name: 'Status hui 1',\n action: 'order.status',\n effect: 'permit',\n compareMethod: 'and',\n ruleSet: [\n {\n id: '2f8f9d71-860b-4fa6-b395-9331f1f0848e',\n name: 'Rule set',\n compareMethod: 'and',\n rules: [\n {\n id: 'a3c7d66f-5c2d-4a24-83bc-03b0a2d9c32b',\n name: 'Rule 1',\n subject: 'order.status',\n resource: 'не обработан',\n condition: '=',\n },\n {\n id: 'a3c7d66f-5c2d-4a24-83bc-03b0a2d9c32b',\n name: 'Rule 2',\n subject: 'feature.status',\n resource: 'отменен',\n condition: '=',\n },\n ],\n },\n ],\n },\n ];\n\n const rule = new AbilityRule({\n id: '<rule-id>',\n name: 'Пользователь является владельцем заказа',\n condition: AbilityCondition.equal,\n subject: 'user.id',\n resource: 'order.owner',\n });\n\n const matchState = rule.check({\n user: { id: '1' },\n order: { owner: '1' },\n });\n\n const is = matchState.isEqual(AbilityMatch.match); // true\n\n\n\n res.statusCode = 200;\n res.setHeader('content-type', 'application/json');\n\n res.write(\n JSON.stringify({\n status: 'ok',\n }),\n );\n res.end();\n});\n\nserver.listen(8081, 'localhost', () => {\n console.debug('server started at http://localhost:8081');\n});\n\nexport type Resources = {\n readonly ['account.read']: {\n readonly account: {\n readonly id: string;\n readonly roles: readonly string[];\n } | null;\n readonly resource: {\n readonly id: string;\n };\n };\n readonly ['access.auth']: {\n readonly token: {\n readonly type: string;\n readonly id: string;\n } | null;\n };\n readonly ['order.update']: {\n readonly account: {\n readonly roles: readonly string[];\n readonly department: string;\n } | null;\n readonly order: {\n readonly status: string;\n } | null;\n };\n};\n","module.exports = require(\"node:http\");","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","","// startup\n// Load entry module and return exports\n// This entry module is referenced by other modules so it can't be inlined\nvar __webpack_exports__ = __webpack_require__(\"./src/playground.ts\");\n",""],"names":[],"sourceRoot":""}
|
package/dist/AbilityCode.d.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
export declare class AbilityCode<
|
|
2
|
-
|
|
3
|
-
constructor(code:
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
1
|
+
export declare class AbilityCode<Code extends string | number> {
|
|
2
|
+
_code: Code;
|
|
3
|
+
constructor(code: Code);
|
|
4
|
+
get code(): Code;
|
|
5
|
+
isEqual(compareWith: AbilityCode<Code> | null): boolean;
|
|
6
|
+
isNotEqual(compareWith: AbilityCode<Code> | null): boolean;
|
|
7
7
|
}
|
|
8
8
|
export default AbilityCode;
|
package/dist/AbilityCompare.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import AbilityCode from './AbilityCode';
|
|
2
|
-
export type
|
|
3
|
-
export declare class AbilityCompare extends AbilityCode<
|
|
2
|
+
export type AbilityCompareCodeType = 'and' | 'or';
|
|
3
|
+
export declare class AbilityCompare extends AbilityCode<AbilityCompareCodeType> {
|
|
4
4
|
static and: AbilityCompare;
|
|
5
5
|
static or: AbilityCompare;
|
|
6
6
|
}
|
|
@@ -1,13 +1,16 @@
|
|
|
1
1
|
import AbilityCode from './AbilityCode';
|
|
2
|
-
export type
|
|
3
|
-
export
|
|
4
|
-
|
|
5
|
-
static
|
|
6
|
-
static
|
|
7
|
-
static
|
|
8
|
-
static
|
|
9
|
-
static
|
|
10
|
-
static
|
|
11
|
-
static
|
|
2
|
+
export type AbilityConditionCodeType = '=' | '<>' | '>' | '<' | '>=' | '<=' | 'in' | 'not in';
|
|
3
|
+
export type AbilityConditionLiteralType = 'equal' | 'not_equal' | 'more_than' | 'less_than' | 'less_or_equal' | 'more_or_equal' | 'in' | 'not_in';
|
|
4
|
+
export declare class AbilityCondition extends AbilityCode<AbilityConditionCodeType> {
|
|
5
|
+
static equal: AbilityCondition;
|
|
6
|
+
static not_equal: AbilityCondition;
|
|
7
|
+
static more_than: AbilityCondition;
|
|
8
|
+
static less_than: AbilityCondition;
|
|
9
|
+
static less_or_equal: AbilityCondition;
|
|
10
|
+
static more_or_equal: AbilityCondition;
|
|
11
|
+
static in: AbilityCondition;
|
|
12
|
+
static not_in: AbilityCondition;
|
|
13
|
+
static fromLiteral(literal: AbilityConditionLiteralType): AbilityCondition;
|
|
14
|
+
get literal(): AbilityConditionLiteralType;
|
|
12
15
|
}
|
|
13
16
|
export default AbilityCondition;
|
package/dist/AbilityError.d.ts
CHANGED
package/dist/AbilityMatch.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import AbilityCode from './AbilityCode';
|
|
2
|
-
export type
|
|
3
|
-
export declare class AbilityMatch extends AbilityCode<
|
|
2
|
+
export type AbilityMatchCodeType = 'pending' | 'match' | 'mismatch';
|
|
3
|
+
export declare class AbilityMatch extends AbilityCode<AbilityMatchCodeType> {
|
|
4
4
|
static pending: AbilityMatch;
|
|
5
5
|
static match: AbilityMatch;
|
|
6
6
|
static mismatch: AbilityMatch;
|
package/dist/AbilityPolicy.d.ts
CHANGED
|
@@ -1,15 +1,21 @@
|
|
|
1
1
|
import AbilityRuleSet, { AbilityRuleSetConfig } from './AbilityRuleSet';
|
|
2
2
|
import AbilityMatch from './AbilityMatch';
|
|
3
|
-
import AbilityCompare, {
|
|
4
|
-
import AbilityPolicyEffect, {
|
|
3
|
+
import AbilityCompare, { AbilityCompareCodeType } from './AbilityCompare';
|
|
4
|
+
import AbilityPolicyEffect, { AbilityPolicyEffectCodeType } from './AbilityPolicyEffect';
|
|
5
5
|
export type AbilityPolicyConfig = {
|
|
6
6
|
readonly action: string;
|
|
7
|
-
readonly effect:
|
|
8
|
-
readonly compareMethod:
|
|
9
|
-
readonly ruleSet: AbilityRuleSetConfig[];
|
|
7
|
+
readonly effect: AbilityPolicyEffectCodeType;
|
|
8
|
+
readonly compareMethod: AbilityCompareCodeType;
|
|
9
|
+
readonly ruleSet: readonly AbilityRuleSetConfig[];
|
|
10
10
|
readonly id: string;
|
|
11
11
|
readonly name: string;
|
|
12
12
|
};
|
|
13
|
+
export type AbilityPolicyConstructorProps = {
|
|
14
|
+
id: string;
|
|
15
|
+
name: string;
|
|
16
|
+
action: string;
|
|
17
|
+
effect: AbilityPolicyEffect;
|
|
18
|
+
};
|
|
13
19
|
export declare class AbilityPolicy<Resources extends object = object> {
|
|
14
20
|
matchState: AbilityMatch;
|
|
15
21
|
/**
|
|
@@ -39,12 +45,7 @@ export declare class AbilityPolicy<Resources extends object = object> {
|
|
|
39
45
|
* Soon
|
|
40
46
|
*/
|
|
41
47
|
action: string;
|
|
42
|
-
constructor(params:
|
|
43
|
-
id: string;
|
|
44
|
-
name: string;
|
|
45
|
-
action: string;
|
|
46
|
-
effect: AbilityPolicyEffect;
|
|
47
|
-
});
|
|
48
|
+
constructor(params: AbilityPolicyConstructorProps);
|
|
48
49
|
/**
|
|
49
50
|
* Add rule set to the policy
|
|
50
51
|
* @param ruleSet - The rule set to add
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import AbilityCode from './AbilityCode';
|
|
2
|
-
export type
|
|
3
|
-
export declare class AbilityPolicyEffect extends AbilityCode<
|
|
2
|
+
export type AbilityPolicyEffectCodeType = 'deny' | 'permit';
|
|
3
|
+
export declare class AbilityPolicyEffect extends AbilityCode<AbilityPolicyEffectCodeType> {
|
|
4
4
|
static deny: AbilityPolicyEffect;
|
|
5
5
|
static permit: AbilityPolicyEffect;
|
|
6
6
|
}
|
|
@@ -19,7 +19,7 @@ export declare class AbilityResolver<Resources extends object = object> {
|
|
|
19
19
|
getEffect(): AbilityPolicyEffect | null;
|
|
20
20
|
isPermit(): boolean;
|
|
21
21
|
isDeny(): boolean;
|
|
22
|
-
|
|
22
|
+
getMatchedPolicy(): AbilityPolicy<Resources> | null;
|
|
23
23
|
/**
|
|
24
24
|
* Check if the action is contained in another action
|
|
25
25
|
* @param actionA - The first action to check
|
package/dist/AbilityRule.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import AbilityMatch from './AbilityMatch';
|
|
2
|
-
import AbilityCondition, {
|
|
2
|
+
import AbilityCondition, { AbilityConditionCodeType } from './AbilityCondition';
|
|
3
3
|
export type AbilityRuleConfig = {
|
|
4
4
|
readonly id: string;
|
|
5
5
|
readonly name: string;
|
|
@@ -11,8 +11,14 @@ export type AbilityRuleConfig = {
|
|
|
11
11
|
* Resource key path like a 'user.name' or value
|
|
12
12
|
*/
|
|
13
13
|
readonly resource: string | number | boolean | (string | number)[];
|
|
14
|
-
readonly condition:
|
|
14
|
+
readonly condition: AbilityConditionCodeType;
|
|
15
15
|
};
|
|
16
|
+
export type AbilityRuleConstructorProps = Omit<AbilityRuleConfig, 'condition'> & {
|
|
17
|
+
readonly condition: AbilityCondition;
|
|
18
|
+
};
|
|
19
|
+
/**
|
|
20
|
+
* Represents a rule that defines a condition to be checked against a subject and resource.
|
|
21
|
+
*/
|
|
16
22
|
export declare class AbilityRule<Resources extends object = object> {
|
|
17
23
|
/**
|
|
18
24
|
* Subject key path like a 'user.name'
|
|
@@ -26,7 +32,16 @@ export declare class AbilityRule<Resources extends object = object> {
|
|
|
26
32
|
name: string;
|
|
27
33
|
id: string;
|
|
28
34
|
state: AbilityMatch;
|
|
29
|
-
|
|
35
|
+
/**
|
|
36
|
+
* Creates an instance of AbilityRule.
|
|
37
|
+
* @param {string} options.id - The unique identifier of the rule.
|
|
38
|
+
* @param {string} options.name - The name of the rule.
|
|
39
|
+
* @param {AbilityCondition} options.condition - The condition to evaluate.
|
|
40
|
+
* @param {string} options.subject - The subject of the rule.
|
|
41
|
+
* @param {string} options.resource - The resource to compare against.
|
|
42
|
+
* @param params
|
|
43
|
+
*/
|
|
44
|
+
constructor(params: AbilityRuleConstructorProps);
|
|
30
45
|
/**
|
|
31
46
|
* Check if the rule is matched
|
|
32
47
|
* @param resource - The resource to check
|
package/dist/AbilityRuleSet.d.ts
CHANGED
|
@@ -1,11 +1,16 @@
|
|
|
1
1
|
import AbilityRule, { AbilityRuleConfig } from './AbilityRule';
|
|
2
|
-
import AbilityCompare, {
|
|
2
|
+
import AbilityCompare, { AbilityCompareCodeType } from './AbilityCompare';
|
|
3
3
|
import AbilityMatch from './AbilityMatch';
|
|
4
4
|
export type AbilityRuleSetConfig = {
|
|
5
5
|
readonly id: string;
|
|
6
6
|
readonly name: string;
|
|
7
|
-
readonly compareMethod:
|
|
8
|
-
readonly rules: AbilityRuleConfig[];
|
|
7
|
+
readonly compareMethod: AbilityCompareCodeType;
|
|
8
|
+
readonly rules: readonly AbilityRuleConfig[];
|
|
9
|
+
};
|
|
10
|
+
export type AbilityRuleSetConstructorProps = {
|
|
11
|
+
readonly id: string;
|
|
12
|
+
readonly name: string;
|
|
13
|
+
readonly compareMethod: AbilityCompare;
|
|
9
14
|
};
|
|
10
15
|
export declare class AbilityRuleSet<Resources extends object = object> {
|
|
11
16
|
state: AbilityMatch;
|
|
@@ -28,9 +33,9 @@ export declare class AbilityRuleSet<Resources extends object = object> {
|
|
|
28
33
|
* Group ID
|
|
29
34
|
*/
|
|
30
35
|
id: string;
|
|
31
|
-
constructor(params:
|
|
32
|
-
addRule(rule: AbilityRule
|
|
33
|
-
addRules(rules: AbilityRule[]
|
|
36
|
+
constructor(params: AbilityRuleSetConstructorProps);
|
|
37
|
+
addRule(rule: AbilityRule): this;
|
|
38
|
+
addRules(rules: AbilityRule[]): this;
|
|
34
39
|
check(resources: Resources | null): AbilityMatch;
|
|
35
40
|
/**
|
|
36
41
|
* Parse the config JSON format to Group class instance
|