@via-profit/ability 1.1.0 → 2.0.0-rc.3

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.
@@ -0,0 +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/AbilityParser.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\nexport default AbilityCode;","import AbilityCode from './AbilityCode';\n\nexport class AbilityCompare extends AbilityCode {\n public static OR = new AbilityCompare(0);\n public static AND = new AbilityCompare(1);\n}\n\nexport default AbilityCompare;\n","import AbilityCode from './AbilityCode';\n\nexport class AbilityCondition extends AbilityCode<string> {\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 class AbilityMatch extends AbilityCode{\n public static PENDING = new AbilityMatch(2);\n public static MATCH = new AbilityMatch(1);\n public static MISMATCH = new AbilityMatch(0);\n}\n\nexport default AbilityMatch;","import { AbilityParserError } from './AbilityError';\nimport AbilityPolicy from './AbilityPolicy';\nimport AbilityCondition from './AbilityCondition';\n\ntype FieldValidateConfig = [string, 'string' | 'number' | 'array', boolean][];\n\n\nexport class AbilityParser {\n\n /**\n * Validates the configuration object based on the provided field validation configurations.\n * @param config - The configuration object to validate.\n * @param fields - An array of field validation configurations.\n * @throws {AbilityParserError} If a required field is missing or if a field has an incorrect type.\n */\n public static validateConfig(config: Record<string, any>, fields: FieldValidateConfig): void | never {\n fields.forEach(([field, type, isRequired]) => {\n const value = config[field as keyof typeof config];\n if (isRequired) {\n if (typeof value === 'undefined') {\n throw new AbilityParserError(`Missing required field [${field}]`);\n }\n }\n\n switch (type) {\n case 'array':\n if (typeof value !== 'object' || !Array.isArray(value)) {\n throw new AbilityParserError(`Field [${field}] must be an type of [${type}], bit got [${typeof value}]`);\n }\n break;\n\n default:\n if (typeof value !== type && typeof value !== 'undefined') {\n throw new AbilityParserError(`Field [${field}] must be a type of [${type}], bit got [${typeof value}]`);\n }\n break;\n }\n\n\n });\n }\n\n /**\n * Prepares and validates the configuration object or JSON string.\n * @param configOrJson - The configuration object or JSON string to validate.\n * @param fields - An array of field validation configurations.\n * @returns The validated configuration object.\n */\n public static prepareAndValidateConfig<T>(configOrJson: string | unknown, fields: FieldValidateConfig): T {\n const config = typeof configOrJson === 'string'\n ? (JSON.parse(configOrJson))\n : configOrJson;\n\n AbilityParser.validateConfig(config, fields);\n\n return config;\n }\n\n /*\n *\n * readonly ['order.update']: {\n * readonly user: {\n * readonly roles: readonly string[];\n * readonly department: string;\n * };\n * readonly order: {\n * readonly estimatedArrivalAt: number;\n * readonly status: string;\n * }\n * }\n *\n * */\n\n /**\n * Sets a value in a nested object structure based on a dot/bracket notation path.\n * @param object - The target object to modify.\n * @param path - The path to the property in dot/bracket notation.\n * @param value - The value to set at the specified path.\n */\n public static setValueDotValue(\n object: Record<string, any>,\n path: string,\n value: string | number | boolean\n ): void {\n const way = path.replace(/\\[/g, '.').replace(/\\]/g, '').split('.');\n const last = way.pop();\n\n if (!last) {\n throw new AbilityParserError(`Invalid path provided on a [${path}]`);\n }\n\n way.reduce((o, k, i, kk) => {\n if (!o[k]) {\n o[k] = isFinite(Number(kk[i + 1])) ? [] : {};\n }\n return o[k];\n }, object)[last] = value;\n }\n\n /**\n * Generates TypeScript type definitions based on the provided policies.\n * @param policies - An array of AbilityPolicy instances.\n * @param outPath - The output path for the generated type definitions.\n * @returns A record containing the generated type definitions.\n */\n public static generateTypeDefs(policies: readonly AbilityPolicy[], outPath: string) {\n const record: Record<string, any> = {};\n\n policies.forEach(policy => {\n policy.ruleSet.forEach(ruleSet => {\n ruleSet.rules.forEach(rule => {\n const [leftFieldPath, condition, rightFiledPath] = rule.matches;\n let value: string = 'any';\n\n switch (true) {\n case condition.isEqual(AbilityCondition.NOT_EQUAL):\n case condition.isEqual(AbilityCondition.EQUAL):\n value = typeof rightFiledPath;\n break;\n\n case condition.isEqual(AbilityCondition.IN):\n case condition.isEqual(AbilityCondition.NOT_IN):\n value = `${typeof rightFiledPath}[]`;\n break;\n\n case condition.isEqual(AbilityCondition.MORE_OR_EQUAL):\n case condition.isEqual(AbilityCondition.MORE_THAN):\n case condition.isEqual(AbilityCondition.LESS_OR_EQUAL):\n case condition.isEqual(AbilityCondition.LESS_THAN):\n value = 'number';\n break;\n }\n AbilityParser.setValueDotValue(record, leftFieldPath, value);\n });\n });\n });\n\n console.log(JSON.stringify(record));\n\n return record;\n }\n\n}\n\nexport default AbilityParser;","import AbilityRule, { AbilityRuleConfig } from './AbilityRule';\nimport AbilityRuleSet, { AbilityRuleSetConfig } from './AbilityRuleSet';\nimport AbilityMatch from './AbilityMatch';\nimport AbilityCompare from './AbilityCompare';\nimport AbilityPolicyEffect from './AbilityPolicyEffect';\nimport AbilityParser from './AbilityParser';\n\nexport type AbilityPolicyConfig = {\n readonly action: string;\n readonly effect: number;\n readonly compareMethod: number;\n readonly ruleSet: (AbilityRuleConfig | 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 | symbol;\n\n /**\n * Policy ID\n */\n public id: string | symbol;\n\n /**\n * Soon\n */\n public action: string;\n\n public constructor(params: {\n action: string;\n effect: AbilityPolicyEffect;\n name?: string | symbol;\n id?: string | symbol;\n }) {\n const { name, id, action, effect } = params;\n this.name = name || Symbol('name');\n this.id = id || Symbol('id');\n this.action = action;\n this.effect = effect;\n }\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 * Add rule to the policy\n * @param rule - The rule to add\n */\n public addRule(rule: AbilityRule<Resources>): this {\n this.addRuleSet(\n new AbilityRuleSet({\n name: rule.name,\n }).addRule(rule, AbilityCompare.AND),\n );\n\n return this;\n }\n\n\n /**\n * Check if the policy is matched\n * @param resource - The resource to check\n */\n public check(resource: Resources): AbilityMatch {\n this.matchState = AbilityMatch.MISMATCH;\n\n /**\n * If policy contain a rules\n */\n if (this.ruleSet.length) {\n const ruleCheckStates: AbilityMatch[] = [];\n this.ruleSet.forEach(rule => {\n const ruleCheckState = rule.check(resource);\n ruleCheckStates.push(ruleCheckState);\n });\n\n if (AbilityCompare.AND.isEqual(this.compareMethod)) {\n if (ruleCheckStates.every(ruleState => AbilityMatch.MATCH.isEqual(ruleState))) {\n this.matchState = AbilityMatch.MATCH;\n }\n }\n\n if (AbilityCompare.OR.isEqual(this.compareMethod)) {\n if (ruleCheckStates.some(ruleState => AbilityMatch.MATCH.isEqual(ruleState))) {\n this.matchState = AbilityMatch.MATCH;\n }\n }\n }\n\n return this.matchState;\n }\n\n\n\n\n /**\n * Parse the config JSON format to Policy class instance\n */\n public static parse<Resources extends object = object>(\n configOrJson: AbilityPolicyConfig | string,\n ): AbilityPolicy<Resources> {\n\n\n const config = AbilityParser.prepareAndValidateConfig<AbilityPolicyConfig>(configOrJson, [\n ['id', 'string', false],\n ['name', 'string', true],\n ['action', 'string', true],\n ['effect', 'number', true],\n ['compareMethod', 'number', true],\n ['ruleSet', 'array', true],\n ]);\n\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 = new AbilityCompare(compareMethod);\n\n ruleSet.forEach(ruleOrRuleSet => {\n // is ruleset\n if ('rules' in ruleOrRuleSet) {\n policy.addRuleSet(AbilityRuleSet.parse(ruleOrRuleSet));\n }\n\n // is simple rule\n if (!('rules' in ruleOrRuleSet)) {\n policy.addRule(AbilityRule.parse(ruleOrRuleSet));\n }\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,\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 class AbilityPolicyEffect extends AbilityCode{\n public static DENY = new AbilityPolicyEffect(0);\n public static PERMIT = new AbilityPolicyEffect(1);\n}\n\nexport default AbilityPolicyEffect;","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(policies: readonly AbilityPolicy<Resources>[]) {\n this.policies = policies;\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 ['Permission denied', resolver.getPolicy()?.name?.toString()].join('. '),\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 from './AbilityCondition';\nimport AbilityParser from './AbilityParser';\n\nexport type AbilityRuleMatches = [string, AbilityCondition, string | number | boolean];\n\nexport type AbilityRuleConfig = {\n readonly name?: string | symbol;\n readonly matches: [string, string, string | number | boolean];\n};\n\nexport class AbilityRule<Resources extends object = object> {\n public matches: AbilityRuleMatches;\n public name: string | symbol;\n public state: AbilityMatch = AbilityMatch.PENDING;\n\n public constructor(params: { matches: AbilityRuleMatches; name?: string | symbol }) {\n const { name, matches } = params;\n this.name = name || Symbol('name');\n this.matches = matches;\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 const [_subjectPathName, condition, _staticValueOrPathName] = this.matches;\n\n let is: boolean = false;\n\n const [valueS, valueO] = this.extractValues(resource);\n\n if (AbilityCondition.LESS_THAN.isEqual(condition)) {\n is = Number(valueS) < Number(valueO);\n }\n\n if (AbilityCondition.LESS_OR_EQUAL.isEqual(condition)) {\n is = Number(valueS) <= Number(valueO);\n }\n\n if (AbilityCondition.MORE_THAN.isEqual(condition)) {\n is = Number(valueS) > Number(valueO);\n }\n\n if (AbilityCondition.MORE_OR_EQUAL.isEqual(condition)) {\n is = Number(valueS) >= Number(valueO);\n }\n\n if (AbilityCondition.EQUAL.isEqual(condition)) {\n is = valueS === valueO;\n }\n\n if (AbilityCondition.NOT_EQUAL.isEqual(condition)) {\n is = valueS !== valueO;\n }\n\n if (AbilityCondition.IN.isEqual(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(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 resource\n * @param resource - The resource to extract values from\n */\n public extractValues(\n resource: Resources | null,\n ): [\n string | number | boolean | (string | number)[] | null | undefined,\n string | number | boolean | (string | number)[] | null | undefined,\n ] {\n const [subjectPathName, _condition, staticValueOrPathName] = this.matches;\n let leftSideValue;\n let rightSideValue;\n\n if (resource === null || typeof resource === '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(subjectPathName)) {\n leftSideValue = this.getDotNotationValue<number | boolean | string | (string | number)[]>(\n resource,\n subjectPathName,\n );\n }\n if (isPath(staticValueOrPathName)) {\n rightSideValue = this.getDotNotationValue<number | boolean | string | (string | number)[]>(\n resource,\n staticValueOrPathName,\n );\n } else {\n rightSideValue = staticValueOrPathName 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 configOrJson: AbilityRuleConfig | string,\n ): AbilityRule<Resources> {\n const config = AbilityParser.prepareAndValidateConfig<AbilityRuleConfig>(configOrJson, [\n ['id', 'string', false],\n ['name', 'string', true],\n ['matches', 'array', true],\n ]);\n\n const { name, matches } = config;\n const [leftField, condition, rightField] = matches;\n\n return new AbilityRule<Resources>({\n name,\n matches: [leftField, new AbilityCondition(condition), rightField],\n });\n }\n\n /**\n * Export the rule to config object\n */\n public export(): AbilityRuleConfig {\n const [leftField, condition, rightField] = this.matches;\n\n return {\n name: this.name,\n matches: [leftField, condition.code, rightField],\n };\n }\n}\n\nexport default AbilityRule;\n","import AbilityRule, { AbilityRuleConfig } from './AbilityRule';\nimport AbilityCompare from './AbilityCompare';\nimport AbilityMatch from './AbilityMatch';\nimport AbilityParser from './AbilityParser';\n\nexport type AbilityRuleSetConfig = {\n readonly id?: string | symbol;\n readonly name: string;\n readonly compareMethod: number;\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 | symbol;\n\n /**\n * Group ID\n */\n public id: string | symbol;\n\n public constructor(params?: { name?: string | symbol; id?: string | symbol }) {\n const { name, id } = params || {};\n\n this.name = name || Symbol('name');\n this.id = id || Symbol('id');\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 /**\n * Parse the config JSON format to Group class instance\n */\n public static parse<Resource extends object = object>(\n configOrJson: AbilityRuleSetConfig | string,\n ): AbilityRuleSet<Resource> {\n\n const config = AbilityParser.prepareAndValidateConfig<AbilityRuleSetConfig>(configOrJson, [\n ['id', 'string', false],\n ['name', 'string', true],\n ['compareMethod', 'number', true],\n ['rules', 'array', true],\n ]);\n\n const { id, name, rules, compareMethod } = config;\n\n const ruleSet = new AbilityRuleSet<Resource>({\n name,\n id,\n });\n\n ruleSet.compareMethod = new AbilityCompare(compareMethod);\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,\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\nimport policies from './policies.json';\n\nconst server = http.createServer();\n\nserver.on('request', (_req, res) => {\n new AbilityResolver<Resources>(\n policies.map(p => {\n return AbilityPolicy.parse(p as AbilityPolicyConfig);\n }),\n ).enforce('account.read', {\n account: {\n id: '1',\n roles: ['managers'],\n },\n resource: {\n id: '1',\n },\n });\n\n res.statusCode = 200;\n res.setHeader('content-type', 'application/json');\n\n res.write(\n JSON.stringify({\n status: 'Done',\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 };\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 };\n };\n readonly ['order.update']: {\n readonly account: {\n readonly roles: readonly string[];\n readonly department: string;\n };\n readonly order: {\n readonly status: string;\n };\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":""}
@@ -0,0 +1,7 @@
1
+ export declare class AbilityCode<T extends string | number | undefined = number> {
2
+ code: T;
3
+ constructor(code: T);
4
+ isEqual(compareWith: AbilityCode<T> | null): boolean;
5
+ isNotEqual(compareWith: AbilityCode<T> | null): boolean;
6
+ }
7
+ export default AbilityCode;
@@ -0,0 +1,6 @@
1
+ import AbilityCode from './AbilityCode';
2
+ export declare class AbilityCompare extends AbilityCode {
3
+ static OR: AbilityCompare;
4
+ static AND: AbilityCompare;
5
+ }
6
+ export default AbilityCompare;
@@ -0,0 +1,12 @@
1
+ import AbilityCode from './AbilityCode';
2
+ export declare class AbilityCondition extends AbilityCode<string> {
3
+ static EQUAL: AbilityCondition;
4
+ static NOT_EQUAL: AbilityCondition;
5
+ static MORE_THAN: AbilityCondition;
6
+ static LESS_THAN: AbilityCondition;
7
+ static LESS_OR_EQUAL: AbilityCondition;
8
+ static MORE_OR_EQUAL: AbilityCondition;
9
+ static IN: AbilityCondition;
10
+ static NOT_IN: AbilityCondition;
11
+ }
12
+ export default AbilityCondition;
@@ -0,0 +1,9 @@
1
+ export declare class AbilityError extends Error {
2
+ constructor(message: string);
3
+ }
4
+ export declare class AbilityParserError extends Error {
5
+ constructor(message: string);
6
+ }
7
+ export declare class PermissionError extends Error {
8
+ constructor(message: string);
9
+ }
@@ -0,0 +1,7 @@
1
+ import AbilityCode from './AbilityCode';
2
+ export declare class AbilityMatch extends AbilityCode {
3
+ static PENDING: AbilityMatch;
4
+ static MATCH: AbilityMatch;
5
+ static MISMATCH: AbilityMatch;
6
+ }
7
+ export default AbilityMatch;
@@ -0,0 +1,33 @@
1
+ import AbilityPolicy from './AbilityPolicy';
2
+ type FieldValidateConfig = [string, 'string' | 'number' | 'array', boolean][];
3
+ export declare class AbilityParser {
4
+ /**
5
+ * Validates the configuration object based on the provided field validation configurations.
6
+ * @param config - The configuration object to validate.
7
+ * @param fields - An array of field validation configurations.
8
+ * @throws {AbilityParserError} If a required field is missing or if a field has an incorrect type.
9
+ */
10
+ static validateConfig(config: Record<string, any>, fields: FieldValidateConfig): void | never;
11
+ /**
12
+ * Prepares and validates the configuration object or JSON string.
13
+ * @param configOrJson - The configuration object or JSON string to validate.
14
+ * @param fields - An array of field validation configurations.
15
+ * @returns The validated configuration object.
16
+ */
17
+ static prepareAndValidateConfig<T>(configOrJson: string | unknown, fields: FieldValidateConfig): T;
18
+ /**
19
+ * Sets a value in a nested object structure based on a dot/bracket notation path.
20
+ * @param object - The target object to modify.
21
+ * @param path - The path to the property in dot/bracket notation.
22
+ * @param value - The value to set at the specified path.
23
+ */
24
+ static setValueDotValue(object: Record<string, any>, path: string, value: string | number | boolean): void;
25
+ /**
26
+ * Generates TypeScript type definitions based on the provided policies.
27
+ * @param policies - An array of AbilityPolicy instances.
28
+ * @param outPath - The output path for the generated type definitions.
29
+ * @returns A record containing the generated type definitions.
30
+ */
31
+ static generateTypeDefs(policies: readonly AbilityPolicy[], outPath: string): Record<string, any>;
32
+ }
33
+ export default AbilityParser;
@@ -1,79 +1,70 @@
1
- import AbilityRule, { AbilityRuleStatus, AbilityRuleConfig } from './AbilityRule';
2
- /**
3
- * Compare method.\
4
- * For the «and» method the entity (policy, rule or rule) will be permitted if all\
5
- * entities will be returns «permit» status and for the «or» - if\
6
- * one of the entities returns as «permit»
7
- */
8
- export type AbilityCompareMethod = 'or' | 'and';
9
- export type AbilityPolicyResult = {
10
- readonly permission: AbilityRuleStatus;
11
- readonly deniedRules: readonly AbilityRule[];
12
- readonly deniedPolicies: readonly AbilityPolicy[];
13
- };
1
+ import AbilityRule from './AbilityRule';
2
+ import AbilityRuleSet, { AbilityRuleSetConfig } from './AbilityRuleSet';
3
+ import AbilityMatch from './AbilityMatch';
4
+ import AbilityCompare from './AbilityCompare';
5
+ import AbilityPolicyEffect from './AbilityPolicyEffect';
14
6
  export type AbilityPolicyConfig = {
15
- readonly id?: string;
16
- readonly name?: string;
17
- readonly description?: string;
18
- readonly rulesCompareMethod?: AbilityCompareMethod;
19
- readonly policiesCompareMethod?: AbilityCompareMethod;
20
- readonly rules?: AbilityRuleConfig[] | null;
21
- readonly policies?: AbilityPolicyConfig[] | null;
7
+ readonly action: string;
8
+ readonly effect: number;
9
+ readonly compareMethod: number;
10
+ readonly ruleSet: AbilityRuleSetConfig[];
11
+ readonly id: string;
12
+ readonly name: string;
22
13
  };
23
- export declare class AbilityPolicy<Subject = unknown, Resource = unknown, Environment = unknown> {
14
+ export declare class AbilityPolicy<Resources extends object = object> {
15
+ matchState: AbilityMatch;
24
16
  /**
25
17
  * List of rules
26
18
  */
27
- rules: AbilityRule[];
19
+ ruleSet: AbilityRuleSet[];
28
20
  /**
29
- * Nested policies
21
+ * Policy effect
30
22
  */
31
- policies: AbilityPolicy[];
23
+ effect: AbilityPolicyEffect;
32
24
  /**
33
25
  * Rules compare method.\
34
26
  * For the «and» method the rule will be permitted if all\
35
27
  * rules will be returns «permit» status and for the «or» - if\
36
28
  * one of the rules returns as «permit»
37
29
  */
38
- rulesCompareMethod: AbilityCompareMethod;
30
+ compareMethod: AbilityCompare;
39
31
  /**
40
- * Policies compare method.\
41
- * For the «and» method the policy will be permitted if all\
42
- * policies will be returns «permit» status and for the «or» - if\
43
- * one of the policies returns as «permit»
32
+ * Policy name
44
33
  */
45
- policiesCompareMethod: AbilityCompareMethod;
34
+ name: string;
46
35
  /**
47
- * Policy name
36
+ * Policy ID
48
37
  */
49
- name: string | symbol;
38
+ id: string;
50
39
  /**
51
- * Policy description
40
+ * Soon
52
41
  */
53
- description: string | null;
42
+ action: string;
43
+ constructor(params: {
44
+ id: string;
45
+ name: string;
46
+ action: string;
47
+ effect: AbilityPolicyEffect;
48
+ });
54
49
  /**
55
- * Policy ID
50
+ * Add rule set to the policy
51
+ * @param ruleSet - The rule set to add
52
+ */
53
+ addRuleSet(ruleSet: AbilityRuleSet): this;
54
+ /**
55
+ * Add rule to the policy
56
+ * @param rule - The rule to add
57
+ */
58
+ addRule(rule: AbilityRule<Resources>): this;
59
+ /**
60
+ * Check if the policy is matched
61
+ * @param resource - The resource to check
56
62
  */
57
- id: string | symbol;
58
- constructor(policyName?: string | symbol, policyID?: string | symbol, description?: string);
59
- addRule(rule: AbilityRule, compareMethod?: AbilityCompareMethod): this;
60
- addRules(rules: AbilityRule[], compareMethod?: AbilityCompareMethod): this;
61
- addPolicy(policy: AbilityPolicy, compareMethod?: AbilityCompareMethod): this;
62
- addPolicies(policies: AbilityPolicy[], compareMethod?: AbilityCompareMethod): this;
63
- getName(): string | symbol;
64
- getID(): string | symbol;
65
- getPolicies(): AbilityPolicy<unknown, unknown, unknown>[];
66
- getRules(): AbilityRule<unknown, unknown, unknown>[];
67
- setDescription(description: string): this;
68
- enforce(subject: Subject | null, resource?: Resource | null, environment?: Environment | null): void | never;
69
- isPermit(subject: Subject, resource?: Resource, environment?: Environment): boolean;
70
- isDeny(subject: Subject, resource?: Resource, environment?: Environment): boolean;
71
- check(subject: Subject | null, resource?: Resource | null, environment?: Environment | null): AbilityPolicyResult;
63
+ check(resource: Resources): AbilityMatch;
72
64
  /**
73
65
  * Parse the config JSON format to Policy class instance
74
66
  */
75
- static parse<Subject = unknown, Resource = unknown, Environment = unknown>(configOrJson: AbilityPolicyConfig | string): AbilityPolicy<Subject, Resource, Environment>;
76
- static export(policy: AbilityPolicy): AbilityPolicyConfig;
77
- static validatePolicy(policy: AbilityPolicy): void | never;
67
+ static parse<Resources extends object = object>(configOrJson: AbilityPolicyConfig | string): AbilityPolicy<Resources>;
68
+ export(): AbilityPolicyConfig;
78
69
  }
79
70
  export default AbilityPolicy;
@@ -0,0 +1,6 @@
1
+ import AbilityCode from './AbilityCode';
2
+ export declare class AbilityPolicyEffect extends AbilityCode {
3
+ static DENY: AbilityPolicyEffect;
4
+ static PERMIT: AbilityPolicyEffect;
5
+ }
6
+ export default AbilityPolicyEffect;
@@ -0,0 +1,6 @@
1
+ import AbilityPolicy from './AbilityPolicy';
2
+ export declare class AbilityPolicyResult {
3
+ policies: readonly AbilityPolicy[];
4
+ constructor(policies: readonly AbilityPolicy[]);
5
+ }
6
+ export default AbilityPolicyResult;
@@ -0,0 +1,30 @@
1
+ import AbilityPolicy from './AbilityPolicy';
2
+ import AbilityPolicyEffect from './AbilityPolicyEffect';
3
+ export declare class AbilityResolver<Resources extends object = object> {
4
+ policies: readonly AbilityPolicy<Resources>[];
5
+ constructor(policies: readonly AbilityPolicy<Resources>[]);
6
+ /**
7
+ * Resolve policy for the resource and action
8
+ *
9
+ @param action - Action
10
+ * @param resource - Resource
11
+ */
12
+ resolve<Action extends keyof Resources>(action: Action, resource: Resources[Action]): this;
13
+ enforce<Action extends keyof Resources>(action: Action, resource: Resources[Action]): void | never;
14
+ /**
15
+ * Get the last effect of the policy
16
+ *
17
+ * @returns {AbilityPolicyEffect | null}
18
+ */
19
+ getEffect(): AbilityPolicyEffect | null;
20
+ isPermit(): boolean;
21
+ isDeny(): boolean;
22
+ getPolicy(): AbilityPolicy<Resources> | null;
23
+ /**
24
+ * Check if the action is contained in another action
25
+ * @param actionA - The first action to check
26
+ * @param actionB - The second action to check
27
+ */
28
+ static isInActionContain(actionA: string, actionB: string): boolean;
29
+ }
30
+ export default AbilityResolver;
@@ -1,112 +1,44 @@
1
- export type AbilityRuleStatus = 'permit' | 'deny';
2
- export type SubjectPrefix = 'subject.' | 'environment.';
3
- export type AbilityRuleMatches = [
4
- `${SubjectPrefix}${string}`,
5
- AbilityCondition,
6
- string | number | boolean
7
- ];
8
- export type AbilityCondition = '=' | '<>' | '>' | '<' | '<=' | '>=' | 'in';
1
+ import AbilityMatch from './AbilityMatch';
2
+ import AbilityCondition from './AbilityCondition';
3
+ export type AbilityRuleMatches = [string, AbilityCondition, string | number | boolean];
9
4
  export type AbilityRuleConfig = {
10
- readonly name?: string | symbol;
11
- readonly effect?: AbilityRuleStatus;
12
- readonly matches: AbilityRuleMatches;
5
+ readonly id: string;
6
+ readonly name: string;
7
+ readonly matches: [string, string, string | number | boolean];
13
8
  };
14
- export declare class AbilityRule<Subject = unknown, Resource = unknown, Environment = unknown> {
9
+ export declare class AbilityRule<Resources extends object = object> {
15
10
  matches: AbilityRuleMatches;
16
- name: string | symbol;
17
- effect: AbilityRuleStatus;
11
+ name: string;
12
+ id: string;
13
+ state: AbilityMatch;
14
+ constructor(params: {
15
+ readonly id: string;
16
+ readonly name: string;
17
+ readonly matches: AbilityRuleMatches;
18
+ });
18
19
  /**
19
- * Create the rule to compare
20
- *
21
- * @param ruleName {string} - The rule name
22
- * @param effect {AbilityRuleStatus} - Return value
23
- * @param matches {AbilityRuleMatches} - The matching rule he matching rule can be on of the format:
24
- * \
25
- * For example, be compared two's data\
26
- * \
27
- * _The subject_
28
- * ```json
29
- * {"userID": "1", "userDepartament": "NBC"}
30
- * ```
31
- * and _The resource_
32
- * ```json
33
- * {"departamentID": "154", "departamentName": "NBC"}
34
- * ```
35
- * \
36
- * Now we can make the matching rule:
37
- * ```json
38
- * ["subject.userDepartament", "=", "resource.departamentName"]
39
- * ```
40
- *
41
- * \
42
- * **Example 2.**\
43
- * In this case will be compared resource and string:
44
- * \
45
- * _The subject_
46
- * ```json
47
- * {"userID": "1", "userDepartament": "NBC"}
48
- * ```
49
- * and _The resource_ will be «undefined».\
50
- * Now we can make the matching rule:
51
- * ```json
52
- * ["subject.userDepartament", "=", "NBC"]
53
- * ```
54
- * \
55
- * **Example 3.**\
56
- * In this case will be compared resource and array of string:\
57
- * \
58
- * _The subject_
59
- * ```json
60
- * {"userID": "1", "userDepartament": "NBC"}
61
- * ```
62
- * and _The resource_
63
- * ```json
64
- * ["FOX", "NBC", "AONE"]
65
- * ```
66
- * \
67
- * Now we can make the matching rule:
68
- * ```json
69
- * ["subject.userDepartament", "=", "resource"]
70
- * ```
71
- * **Note: In this rule whe set the resource field as the «resource» string.\
72
- * This means that we will compare the entire resource as a whole,\
73
- * and not search for it by field name.**
74
- * \
75
- * **Example 4.**\
76
- * In this case will be compared resource and array of string:\
77
- * \
78
- * _The subject_
79
- * ```json
80
- * {"user": {"account": {"roles": ["admin", "viewer"]}}}
81
- * ```
82
- * and _The resource_
83
- * ```json
84
- * undefined
85
- * ```
86
- * \
87
- * Now we can make the matching rule:
88
- * ```json
89
- * ["subject.user.account.roles", "in", "admin"]
20
+ * Check if the rule is matched
21
+ * @param resource - The resource to check
90
22
  */
91
- constructor(matches: AbilityRuleMatches, effect?: AbilityRuleStatus, ruleName?: string | symbol);
92
- getName(): string | symbol;
93
- getEffect(): AbilityRuleStatus;
94
- isPermit(subject: Subject, resource?: Resource | undefined, environment?: Environment | undefined): boolean;
95
- isDeny(subject: Subject, resource?: Resource | undefined, environment?: Environment | undefined): boolean;
96
- check(subject: Subject, resource?: Resource | undefined, environment?: Environment | undefined): AbilityRuleStatus;
97
- extractValues(sub: unknown, res?: unknown | undefined, env?: unknown | undefined): [
23
+ check(resource: Resources | null): AbilityMatch;
24
+ /**
25
+ * Extract values from the resource
26
+ * @param resource - The resource to extract values from
27
+ */
28
+ extractValues(resource: Resources | null): [
98
29
  string | number | boolean | (string | number)[] | null | undefined,
99
30
  string | number | boolean | (string | number)[] | null | undefined
100
31
  ];
101
- getDotNotationValue(resource: unknown, desc: string): unknown;
102
32
  /**
103
- * Parsing the rule config object or JSON string\
104
- * of config and returns the AbilityRule class instance
33
+ * Get the value of the object by dot notation
34
+ * @param resource - The object to get the value from
35
+ * @param desc - The dot notation string
105
36
  */
106
- static parse<Subject = unknown, Resource = unknown, Environment = unknown>(configOrJson: AbilityRuleConfig | string): AbilityRule<Subject, Resource, Environment>;
37
+ getDotNotationValue<T = unknown>(resource: unknown, desc: string): T | undefined;
38
+ static parse<Resources extends object>(configOrJson: AbilityRuleConfig | string): AbilityRule<Resources>;
107
39
  /**
108
40
  * Export the rule to config object
109
41
  */
110
- static export(rule: AbilityRule): AbilityRuleConfig;
42
+ export(): AbilityRuleConfig;
111
43
  }
112
44
  export default AbilityRule;
@@ -0,0 +1,44 @@
1
+ import AbilityRule, { AbilityRuleConfig } from './AbilityRule';
2
+ import AbilityCompare from './AbilityCompare';
3
+ import AbilityMatch from './AbilityMatch';
4
+ export type AbilityRuleSetConfig = {
5
+ readonly id: string;
6
+ readonly name: string;
7
+ readonly compareMethod: number;
8
+ readonly rules: AbilityRuleConfig[];
9
+ };
10
+ export declare class AbilityRuleSet<Resources extends object = object> {
11
+ state: AbilityMatch;
12
+ /**
13
+ * List of rules
14
+ */
15
+ rules: AbilityRule[];
16
+ /**
17
+ * Rules compare method.\
18
+ * For the «and» method the rule will be permitted if all\
19
+ * rules will be returns «permit» status and for the «or» - if\
20
+ * one of the rules returns as «permit»
21
+ */
22
+ compareMethod: AbilityCompare;
23
+ /**
24
+ * Group name
25
+ */
26
+ name: string;
27
+ /**
28
+ * Group ID
29
+ */
30
+ id: string;
31
+ constructor(params: {
32
+ name: string;
33
+ id: string;
34
+ });
35
+ addRule(rule: AbilityRule, compareMethod: AbilityCompare): this;
36
+ addRules(rules: AbilityRule[], compareMethod: AbilityCompare): this;
37
+ check(resources: Resources | null): AbilityMatch;
38
+ /**
39
+ * Parse the config JSON format to Group class instance
40
+ */
41
+ static parse<Resource extends object = object>(configOrJson: AbilityRuleSetConfig | string): AbilityRuleSet<Resource>;
42
+ export(): AbilityRuleSetConfig;
43
+ }
44
+ export default AbilityRuleSet;
package/dist/index.d.ts CHANGED
@@ -1,5 +1,11 @@
1
- import AbilityService from './AbilityService';
1
+ export * from './AbilityCode';
2
+ export * from './AbilityCompare';
3
+ export * from './AbilityCondition';
4
+ export * from './AbilityError';
5
+ export * from './AbilityMatch';
6
+ export * from './AbilityParser';
2
7
  export * from './AbilityPolicy';
3
- export * from './AbilityService';
8
+ export * from './AbilityPolicyEffect';
9
+ export * from './AbilityResolver';
4
10
  export * from './AbilityRule';
5
- export default AbilityService;
11
+ export * from './AbilityRuleSet';