Skip to content

Commit f0dcdce

Browse files
refactor(HookRegistry): Remove HookRegistry class/mixin
1 parent a9410f3 commit f0dcdce

File tree

3 files changed

+70
-94
lines changed

3 files changed

+70
-94
lines changed

src/transition/hookRegistry.ts

+10-51
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ export function matchState(state: State, criterion: HookMatchCriterion) {
3030
function matchGlobs(_state: State) {
3131
let globStrings = <string[]> toMatch;
3232
for (let i = 0; i < globStrings.length; i++) {
33-
let glob = Glob.fromString(globStrings[i]);
33+
let glob = new Glob(globStrings[i]);
3434

3535
if ((glob && glob.matches(_state.name)) || (!glob && globStrings[i] === _state.name)) {
3636
return true;
@@ -75,9 +75,9 @@ export class EventHook implements IEventHook {
7575
let mc = this.matchCriteria, _matchingNodes = EventHook._matchingNodes;
7676

7777
let matches: IMatchingNodes = {
78-
to: _matchingNodes([tail(treeChanges.to)], mc.to),
79-
from: _matchingNodes([tail(treeChanges.from)], mc.from),
80-
exiting: _matchingNodes(treeChanges.exiting, mc.exiting),
78+
to: _matchingNodes([tail(treeChanges.to)], mc.to),
79+
from: _matchingNodes([tail(treeChanges.from)], mc.from),
80+
exiting: _matchingNodes(treeChanges.exiting, mc.exiting),
8181
retained: _matchingNodes(treeChanges.retained, mc.retained),
8282
entering: _matchingNodes(treeChanges.entering, mc.entering),
8383
};
@@ -92,10 +92,13 @@ export class EventHook implements IEventHook {
9292
}
9393

9494
/** @hidden */
95-
interface ITransitionEvents { [key: string]: IEventHook[]; }
95+
export interface IEventHooks {
96+
[key: string]: IEventHook[];
97+
}
9698

9799
/** @hidden Return a registration function of the requested type. */
98-
function makeHookRegistrationFn(hooks: ITransitionEvents, name: string): IHookRegistration {
100+
export function makeHookRegistrationFn(hooks: IEventHooks, name:string): IHookRegistration {
101+
hooks[name] = [];
99102
return function (matchObject, callback, options = {}) {
100103
let eventHook = new EventHook(matchObject, callback, options);
101104
hooks[name].push(eventHook);
@@ -105,48 +108,4 @@ function makeHookRegistrationFn(hooks: ITransitionEvents, name: string): IHookRe
105108
removeFrom(hooks[name])(eventHook);
106109
};
107110
};
108-
}
109-
110-
/**
111-
* Mixin class acts as a Transition Hook registry.
112-
*
113-
* Holds the registered [[HookFn]] objects.
114-
* Exposes functions to register new hooks.
115-
*
116-
* This is a Mixin class which can be applied to other objects.
117-
*
118-
* The hook registration functions are [[onBefore]], [[onStart]], [[onEnter]], [[onRetain]], [[onExit]], [[onFinish]], [[onSuccess]], [[onError]].
119-
*
120-
* This class is mixed into both the [[TransitionService]] and every [[Transition]] object.
121-
* Global hooks are added to the [[TransitionService]].
122-
* Since each [[Transition]] is itself a `HookRegistry`, hooks can also be added to individual Transitions
123-
* (note: the hook criteria still must match the Transition).
124-
*/
125-
export class HookRegistry implements IHookRegistry {
126-
static mixin(source: HookRegistry, target: IHookRegistry) {
127-
Object.keys(source._transitionEvents).concat(["getHooks"]).forEach(key => target[key] = source[key]);
128-
}
129-
130-
private _transitionEvents: ITransitionEvents = {
131-
onBefore: [], onStart: [], onEnter: [], onRetain: [], onExit: [], onFinish: [], onSuccess: [], onError: []
132-
};
133-
134-
getHooks = (name: string) => this._transitionEvents[name];
135-
136-
/** @inheritdoc */
137-
onBefore = makeHookRegistrationFn(this._transitionEvents, "onBefore");
138-
/** @inheritdoc */
139-
onStart = makeHookRegistrationFn(this._transitionEvents, "onStart");
140-
/** @inheritdoc */
141-
onEnter = makeHookRegistrationFn(this._transitionEvents, "onEnter");
142-
/** @inheritdoc */
143-
onRetain = makeHookRegistrationFn(this._transitionEvents, "onRetain");
144-
/** @inheritdoc */
145-
onExit = makeHookRegistrationFn(this._transitionEvents, "onExit");
146-
/** @inheritdoc */
147-
onFinish = makeHookRegistrationFn(this._transitionEvents, "onFinish");
148-
/** @inheritdoc */
149-
onSuccess = makeHookRegistrationFn(this._transitionEvents, "onSuccess");
150-
/** @inheritdoc */
151-
onError = makeHookRegistrationFn(this._transitionEvents, "onError");
152-
}
111+
}

src/transition/transition.ts

+27-17
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,14 @@ import { prop, propEq, val, not } from "../common/hof";
1111

1212
import {StateDeclaration, StateOrName} from "../state/interface";
1313
import {
14-
TransitionOptions, TransitionHookOptions, TreeChanges, IHookRegistry, IHookGetter,
15-
HookMatchCriteria, TransitionHookFn, TransitionStateHookFn, HookRegOptions
14+
TransitionOptions, TransitionHookOptions, TreeChanges, IHookRegistry,
15+
IHookGetter, HookMatchCriteria, HookRegOptions, IEventHook
1616
} from "./interface";
1717

18+
import { TransitionStateHookFn, TransitionHookFn } from "./interface"; // has or is using
19+
1820
import {TransitionHook} from "./transitionHook";
19-
import {HookRegistry, matchState} from "./hookRegistry";
21+
import {matchState, IEventHooks, makeHookRegistrationFn} from "./hookRegistry";
2022
import {HookBuilder} from "./hookBuilder";
2123
import {PathNode} from "../path/node";
2224
import {PathFactory} from "../path/pathFactory";
@@ -83,31 +85,42 @@ export class Transition implements IHookRegistry {
8385
/** @hidden */
8486
private _error: any;
8587

88+
/** @hidden Holds the hook registration functions such as those passed to Transition.onStart() */
89+
private _transitionEvents: IEventHooks = { };
90+
8691
/** @hidden */
8792
private _options: TransitionOptions;
8893
/** @hidden */
8994
private _treeChanges: TreeChanges;
9095
/** @hidden */
9196
private _targetState: TargetState;
9297

98+
/** @hidden Creates a hook registration function (which can then be used to register hooks) */
99+
private createHookRegFn (hookName: string) {
100+
return makeHookRegistrationFn(this._transitionEvents, hookName);
101+
}
102+
103+
/** @hidden */
104+
onBefore = this.createHookRegFn('onBefore');
93105
/** @inheritdoc */
94-
onBefore (matchCriteria: HookMatchCriteria, callback: TransitionHookFn, options?: HookRegOptions) : Function { throw ""; };
95-
/** @inheritdoc */
96-
onStart (matchCriteria: HookMatchCriteria, callback: TransitionHookFn, options?: HookRegOptions) : Function { throw ""; };
106+
onStart = this.createHookRegFn('onStart');
97107
/** @inheritdoc */
98-
onExit (matchCriteria: HookMatchCriteria, callback: TransitionStateHookFn, options?: HookRegOptions) : Function { throw ""; };
108+
onExit = this.createHookRegFn('onExit');
99109
/** @inheritdoc */
100-
onRetain (matchCriteria: HookMatchCriteria, callback: TransitionStateHookFn, options?: HookRegOptions) : Function { throw ""; };
110+
onRetain = this.createHookRegFn('onRetain');
101111
/** @inheritdoc */
102-
onEnter (matchCriteria: HookMatchCriteria, callback: TransitionStateHookFn, options?: HookRegOptions) : Function { throw ""; };
112+
onEnter = this.createHookRegFn('onEnter');
103113
/** @inheritdoc */
104-
onFinish (matchCriteria: HookMatchCriteria, callback: TransitionHookFn, options?: HookRegOptions) : Function { throw ""; };
114+
onFinish = this.createHookRegFn('onFinish');
105115
/** @inheritdoc */
106-
onSuccess (matchCriteria: HookMatchCriteria, callback: TransitionHookFn, options?: HookRegOptions) : Function { throw ""; };
116+
onSuccess = this.createHookRegFn('onSuccess');
107117
/** @inheritdoc */
108-
onError (matchCriteria: HookMatchCriteria, callback: TransitionHookFn, options?: HookRegOptions) : Function { throw ""; };
118+
onError = this.createHookRegFn('onError');
109119

110-
getHooks: IHookGetter;
120+
/** @hidden @internalapi */
121+
getHooks(hookName: string): IEventHook[] {
122+
return this._transitionEvents[hookName];
123+
}
111124

112125
/**
113126
* Creates a new Transition object.
@@ -129,9 +142,6 @@ export class Transition implements IHookRegistry {
129142
throw new Error(targetState.error());
130143
}
131144

132-
// Makes the Transition instance a hook registry (onStart, etc)
133-
HookRegistry.mixin(new HookRegistry(), this);
134-
135145
// current() is assumed to come from targetState.options, but provide a naive implementation otherwise.
136146
this._options = extend({ current: val(this) }, targetState.options());
137147
this.$id = transitionCount++;
@@ -188,7 +198,7 @@ export class Transition implements IHookRegistry {
188198
*
189199
* @returns The state declaration object for the Transition's target state ("to state").
190200
*/
191-
to() {
201+
to(): StateDeclaration {
192202
return this.$to().self;
193203
}
194204

src/transition/transitionService.ts

+33-26
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
/** @coreapi @module transition */ /** for typedoc */
2+
import { IHookRegistry, TransitionOptions } from "./interface";
3+
24
import {
3-
IHookRegistry, TransitionOptions, HookMatchCriteria, HookRegOptions,
4-
TransitionStateHookFn, TransitionHookFn
5-
} from "./interface";
5+
HookMatchCriteria, HookRegOptions, TransitionStateHookFn, TransitionHookFn
6+
} from "./interface"; // has or is using
67

78
import {Transition} from "./transition";
8-
import {HookRegistry} from "./hookRegistry";
9+
import {IEventHooks, makeHookRegistrationFn} from "./hookRegistry";
910
import {TargetState} from "../state/targetState";
1011
import {PathNode} from "../path/node";
1112
import {IEventHook} from "./interface";
@@ -49,6 +50,7 @@ export let defaultTransOpts: TransitionOptions = {
4950
export class TransitionService implements IHookRegistry {
5051
/** @hidden */
5152
public $view: ViewService;
53+
private _transitionEvents: IEventHooks = { };
5254

5355
/**
5456
* This object has hook de-registration functions for the built-in hooks.
@@ -71,11 +73,15 @@ export class TransitionService implements IHookRegistry {
7173

7274
constructor(private _router: UIRouter) {
7375
this.$view = _router.viewService;
74-
HookRegistry.mixin(new HookRegistry(), this);
7576
this._deregisterHookFns = <any> {};
7677
this.registerTransitionHooks();
7778
}
7879

80+
/** @hidden Creates a hook registration function (which can then be used to register hooks) */
81+
private createHookRegFn (hookName: string) {
82+
return makeHookRegistrationFn(this._transitionEvents, hookName);
83+
}
84+
7985
/** @hidden */
8086
private registerTransitionHooks() {
8187
let fns = this._deregisterHookFns;
@@ -103,27 +109,6 @@ export class TransitionService implements IHookRegistry {
103109
fns.lazyLoad = registerLazyLoadHook(this);
104110
}
105111

106-
/** @inheritdoc */
107-
onBefore (matchCriteria: HookMatchCriteria, callback: TransitionHookFn, options?: HookRegOptions) : Function { throw ""; };
108-
/** @inheritdoc */
109-
onStart (matchCriteria: HookMatchCriteria, callback: TransitionHookFn, options?: HookRegOptions) : Function { throw ""; };
110-
/** @inheritdoc */
111-
onExit (matchCriteria: HookMatchCriteria, callback: TransitionStateHookFn, options?: HookRegOptions) : Function { throw ""; };
112-
/** @inheritdoc */
113-
onRetain (matchCriteria: HookMatchCriteria, callback: TransitionStateHookFn, options?: HookRegOptions) : Function { throw ""; };
114-
/** @inheritdoc */
115-
onEnter (matchCriteria: HookMatchCriteria, callback: TransitionStateHookFn, options?: HookRegOptions) : Function { throw ""; };
116-
/** @inheritdoc */
117-
onFinish (matchCriteria: HookMatchCriteria, callback: TransitionHookFn, options?: HookRegOptions) : Function { throw ""; };
118-
/** @inheritdoc */
119-
onSuccess (matchCriteria: HookMatchCriteria, callback: TransitionHookFn, options?: HookRegOptions) : Function { throw ""; };
120-
/** @inheritdoc */
121-
onError (matchCriteria: HookMatchCriteria, callback: TransitionHookFn, options?: HookRegOptions) : Function { throw ""; };
122-
123-
124-
/** @hidden */
125-
getHooks : (hookName: string) => IEventHook[];
126-
127112
/**
128113
* Creates a new [[Transition]] object
129114
*
@@ -137,4 +122,26 @@ export class TransitionService implements IHookRegistry {
137122
create(fromPath: PathNode[], targetState: TargetState): Transition {
138123
return new Transition(fromPath, targetState, this._router);
139124
}
125+
126+
/** @inheritdoc */
127+
onBefore = this.createHookRegFn('onBefore');
128+
/** @inheritdoc */
129+
onStart = this.createHookRegFn('onStart');
130+
/** @inheritdoc */
131+
onExit = this.createHookRegFn('onExit');
132+
/** @inheritdoc */
133+
onRetain = this.createHookRegFn('onRetain');
134+
/** @inheritdoc */
135+
onEnter = this.createHookRegFn('onEnter');
136+
/** @inheritdoc */
137+
onFinish = this.createHookRegFn('onFinish');
138+
/** @inheritdoc */
139+
onSuccess = this.createHookRegFn('onSuccess');
140+
/** @inheritdoc */
141+
onError = this.createHookRegFn('onError');
142+
143+
/** @hidden */
144+
getHooks(hookName: string): IEventHook[] {
145+
return this._transitionEvents[hookName];
146+
}
140147
}

0 commit comments

Comments
 (0)