Skip to content

Commit

Permalink
feat(aurelia): adds generics to can converter and plugin
Browse files Browse the repository at this point in the history
Relates to #256 BREAKING CHANGES
  • Loading branch information
stalniy committed Feb 13, 2020
1 parent ed6d506 commit f833651
Show file tree
Hide file tree
Showing 3 changed files with 18 additions and 13 deletions.
2 changes: 1 addition & 1 deletion packages/casl-aurelia/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
},
"scripts": {
"build": "rollup -c ../../tools/rollup.config.js -i src/index.ts -n casl.au -g aurelia-framework:au,@casl/ability:casl",
"build.types": "tsc",
"build.types": "rm -rf dist/types/* && tsc",
"postbuild": "npm run build.types",
"lint": "eslint --ext .js,.ts src/",
"test": "NODE_ENV=test jest --config ../../tools/jest.config.js",
Expand Down
13 changes: 10 additions & 3 deletions packages/casl-aurelia/src/index.ts
Original file line number Diff line number Diff line change
@@ -1,12 +1,19 @@
import { FrameworkConfiguration } from 'aurelia-framework';
import { Ability } from '@casl/ability';
import { Ability, Subject } from '@casl/ability';
import { CanValueConverter } from './value-converter/can';

export { CanValueConverter } from './value-converter/can';

export function configure(config: FrameworkConfiguration, providedAbility?: Ability) {
export function configure<
A extends string = string,
S extends Subject = Subject,
C = object
>(config: FrameworkConfiguration, providedAbility?: Ability<A, S, C>) {
if (providedAbility && providedAbility instanceof Ability) {
config.container.registerInstance(Ability, providedAbility);
config.container.registerInstance(
Ability as unknown as Ability<A, S, C>,
providedAbility
);
}

config.globalResources([CanValueConverter]);
Expand Down
16 changes: 7 additions & 9 deletions packages/casl-aurelia/src/value-converter/can.ts
Original file line number Diff line number Diff line change
@@ -1,26 +1,24 @@
import { signalBindings } from 'aurelia-framework';
import { Ability, CanArgsType } from '@casl/ability';
import { Ability, Subject } from '@casl/ability';

const ABILITY_CHANGED_SIGNAL = 'caslAbilityChanged';
const HAS_AU_SUBSCRIPTION = new WeakMap<Ability, boolean>();

export class CanValueConverter {
signals = [ABILITY_CHANGED_SIGNAL];
const HAS_AU_SUBSCRIPTION = new WeakMap<object, boolean>();

export class CanValueConverter<A extends string, S extends Subject, C> {
static inject = [Ability];

static $resource = {
name: 'can',
type: 'valueConverter'
};

private _ability: Ability;
public readonly signals = [ABILITY_CHANGED_SIGNAL];
private readonly _ability: Ability<A, S, C>;

constructor(ability: Ability) {
constructor(ability: Ability<A, S, C>) {
this._ability = ability;
}

toView(subject: CanArgsType[1], action: CanArgsType[0], field?: CanArgsType[2]) {
toView(subject: S, action: A, field?: string) {
if (!HAS_AU_SUBSCRIPTION.has(this._ability)) {
this._ability.on('updated', () => signalBindings(ABILITY_CHANGED_SIGNAL));
HAS_AU_SUBSCRIPTION.set(this._ability, true);
Expand Down

0 comments on commit f833651

Please sign in to comment.