boring-router
Advanced tools
Comparing version 0.5.4 to 0.5.6
@@ -45,2 +45,12 @@ import { IAutorunOptions, IReactionDisposer, IReactionOptions, IReactionPublic } from 'mobx'; | ||
export declare type RouteWillLeaveCallback = () => Promise<void> | void; | ||
export declare type RouteEnterCallback = () => void; | ||
export declare type RouteUpdateCallback = (data: RouteUpdateCallbackData) => void; | ||
export interface RouteUpdateOptions { | ||
traceDescendants: boolean; | ||
} | ||
export interface RouteUpdateEntry { | ||
callback: RouteUpdateCallback; | ||
options?: RouteUpdateOptions; | ||
} | ||
export declare type RouteLeaveCallback = () => void; | ||
export declare type RouteAfterEnterCallback = () => void; | ||
@@ -73,8 +83,11 @@ /** | ||
willEnter?: RouteWillEnterCallback; | ||
enter?: RouteEnterCallback; | ||
afterEnter?: RouteAfterEnterCallback; | ||
beforeUpdate?: RouteBeforeUpdateCallback<TRouteMatch>; | ||
willUpdate?: RouteWillUpdateCallback<TRouteMatch>; | ||
update?: RouteUpdateCallback; | ||
afterUpdate?: RouteAfterUpdateCallback; | ||
beforeLeave?: RouteBeforeLeaveCallback; | ||
willLeave?: RouteWillLeaveCallback; | ||
leave?: RouteLeaveCallback; | ||
afterLeave?: RouteAfterLeaveCallback; | ||
@@ -117,2 +130,5 @@ } & RouteServiceExtension<TRouteMatch>; | ||
$willLeave(callback: RouteWillLeaveCallback): RouteHookRemovalCallback; | ||
$enter(callback: RouteEnterCallback): RouteHookRemovalCallback; | ||
$update(callback: RouteUpdateCallback, options?: RouteUpdateOptions): RouteHookRemovalCallback; | ||
$leave(callback: RouteLeaveCallback): RouteHookRemovalCallback; | ||
$afterEnter(callback: RouteAfterEnterCallback): RouteHookRemovalCallback; | ||
@@ -119,0 +135,0 @@ $afterUpdate(callback: RouteAfterUpdateCallback, options?: RouteAfterUpdateOptions): RouteHookRemovalCallback; |
@@ -66,2 +66,23 @@ "use strict"; | ||
/** @internal */ | ||
Object.defineProperty(this, "_enterCallbackSet", { | ||
enumerable: true, | ||
configurable: true, | ||
writable: true, | ||
value: new Set() | ||
}); | ||
/** @internal */ | ||
Object.defineProperty(this, "_updateEntrySet", { | ||
enumerable: true, | ||
configurable: true, | ||
writable: true, | ||
value: new Set() | ||
}); | ||
/** @internal */ | ||
Object.defineProperty(this, "_leaveCallbackSet", { | ||
enumerable: true, | ||
configurable: true, | ||
writable: true, | ||
value: new Set() | ||
}); | ||
/** @internal */ | ||
Object.defineProperty(this, "_afterEnterCallbackSet", { | ||
@@ -134,5 +155,12 @@ enumerable: true, | ||
let service = this.$matched ? this._service : undefined; | ||
return service && key in service | ||
? service[key] | ||
: extension[key]; | ||
if (service && key in service) { | ||
let value = service[key]; | ||
if (typeof value === 'function') { | ||
value = value.bind(service); | ||
} | ||
return value; | ||
} | ||
else { | ||
return extension[key]; | ||
} | ||
}, | ||
@@ -192,2 +220,24 @@ }); | ||
} | ||
$enter(callback) { | ||
this._enterCallbackSet.add(callback); | ||
return () => { | ||
this._enterCallbackSet.delete(callback); | ||
}; | ||
} | ||
$update(callback, options) { | ||
let updateEntry = { | ||
callback, | ||
options, | ||
}; | ||
this._updateEntrySet.add(updateEntry); | ||
return () => { | ||
this._updateEntrySet.delete(updateEntry); | ||
}; | ||
} | ||
$leave(callback) { | ||
this._leaveCallbackSet.add(callback); | ||
return () => { | ||
this._leaveCallbackSet.delete(callback); | ||
}; | ||
} | ||
$afterEnter(callback) { | ||
@@ -494,2 +544,36 @@ this._afterEnterCallbackSet.add(callback); | ||
/** @internal */ | ||
_enter() { | ||
for (let callback of this._enterCallbackSet) { | ||
(0, _utils_1.tolerate)(callback); | ||
} | ||
let service = this._getServiceSync(); | ||
if (service && service.enter) { | ||
return (0, _utils_1.tolerate)(() => service.enter()); | ||
} | ||
} | ||
/** @internal */ | ||
_update(triggeredByDescendants) { | ||
var _a; | ||
for (let { options, callback } of this._updateEntrySet) { | ||
if (triggeredByDescendants && !((_a = options === null || options === void 0 ? void 0 : options.traceDescendants) !== null && _a !== void 0 ? _a : false)) { | ||
continue; | ||
} | ||
(0, _utils_1.tolerate)(callback, { descendants: triggeredByDescendants }); | ||
} | ||
let service = this._getServiceSync(); | ||
if (service && service.update) { | ||
return (0, _utils_1.tolerate)(() => service.update({ descendants: triggeredByDescendants })); | ||
} | ||
} | ||
/** @internal */ | ||
_leave() { | ||
for (let callback of this._leaveCallbackSet) { | ||
(0, _utils_1.tolerate)(callback); | ||
} | ||
let service = this._getServiceSync(); | ||
if (service && service.leave) { | ||
(0, _utils_1.tolerate)(() => service.leave()); | ||
} | ||
} | ||
/** @internal */ | ||
async _afterLeave() { | ||
@@ -573,2 +657,28 @@ for (let callback of this._afterLeaveCallbackSet) { | ||
} | ||
/** @internal */ | ||
_getServiceSync() { | ||
let service = this._service; | ||
if (service) { | ||
return service; | ||
} | ||
if (this._servicePromise) { | ||
throw new Error(`Service of route ${this.$name} is not ready: either use synchronous service factory or make sure the service is ready earlier`); | ||
} | ||
let factory = this._serviceFactory; | ||
if (!factory) { | ||
return undefined; | ||
} | ||
let output = (0, _utils_1.tolerate)(factory, this); | ||
if (output instanceof Promise) { | ||
this._servicePromise = output.then(service => { | ||
this._service = service; | ||
return service; | ||
}); | ||
throw new Error(`Service of route ${this.$name} is not ready: either use synchronous service factory or make sure the service is ready earlier`); | ||
} | ||
else { | ||
this._service = output; | ||
return output; | ||
} | ||
} | ||
} | ||
@@ -575,0 +685,0 @@ Object.defineProperty(RouteMatch, "SEGMENT", { |
@@ -198,3 +198,3 @@ "use strict"; | ||
await Promise.all(interUpdateDataArray.map(data => this._willUpdate(data))); | ||
this._update(generalGroups); | ||
this._update(generalGroups, interUpdateDataArray); | ||
this._snapshot = nextSnapshot; | ||
@@ -367,3 +367,3 @@ await Promise.all(interUpdateDataArray.map(data => this._afterUpdate(data))); | ||
/** @internal */ | ||
_update(generalGroups) { | ||
_update(generalGroups, dataArray) { | ||
let source = this._source; | ||
@@ -383,2 +383,16 @@ let matchingSource = this._matchingSource; | ||
} | ||
for (let { reversedLeavingMatches, enteringAndUpdatingMatchSet, previousMatchSet, descendantUpdatingMatchSet, } of dataArray) { | ||
for (let match of reversedLeavingMatches) { | ||
match._leave(); | ||
} | ||
for (let match of enteringAndUpdatingMatchSet) { | ||
let update = previousMatchSet.has(match); | ||
if (update) { | ||
match._update(descendantUpdatingMatchSet.has(match)); | ||
} | ||
else { | ||
match._enter(); | ||
} | ||
} | ||
} | ||
} | ||
@@ -385,0 +399,0 @@ /** @internal */ |
{ | ||
"name": "boring-router", | ||
"version": "0.5.4", | ||
"version": "0.5.6", | ||
"description": "A type-safe MobX router with parallel routing support.", | ||
@@ -36,4 +36,3 @@ "license": "MIT", | ||
"tslib": "^2.3.1" | ||
}, | ||
"gitHead": "7dd3171add1618777dfbb69ad45c90997ccfa105" | ||
} | ||
} |
@@ -111,2 +111,23 @@ import { | ||
// enter // | ||
export type RouteEnterCallback = () => void; | ||
// update // | ||
export type RouteUpdateCallback = (data: RouteUpdateCallbackData) => void; | ||
export interface RouteUpdateOptions { | ||
traceDescendants: boolean; | ||
} | ||
export interface RouteUpdateEntry { | ||
callback: RouteUpdateCallback; | ||
options?: RouteUpdateOptions; | ||
} | ||
// leave // | ||
export type RouteLeaveCallback = () => void; | ||
// after enter // | ||
@@ -200,8 +221,11 @@ | ||
willEnter?: RouteWillEnterCallback; | ||
enter?: RouteEnterCallback; | ||
afterEnter?: RouteAfterEnterCallback; | ||
beforeUpdate?: RouteBeforeUpdateCallback<TRouteMatch>; | ||
willUpdate?: RouteWillUpdateCallback<TRouteMatch>; | ||
update?: RouteUpdateCallback; | ||
afterUpdate?: RouteAfterUpdateCallback; | ||
beforeLeave?: RouteBeforeLeaveCallback; | ||
willLeave?: RouteWillLeaveCallback; | ||
leave?: RouteLeaveCallback; | ||
afterLeave?: RouteAfterLeaveCallback; | ||
@@ -295,2 +319,11 @@ } & RouteServiceExtension<TRouteMatch>; | ||
/** @internal */ | ||
private _enterCallbackSet = new Set<RouteEnterCallback>(); | ||
/** @internal */ | ||
private _updateEntrySet = new Set<RouteUpdateEntry>(); | ||
/** @internal */ | ||
private _leaveCallbackSet = new Set<RouteLeaveCallback>(); | ||
/** @internal */ | ||
private _afterEnterCallbackSet = new Set<RouteAfterEnterCallback>(); | ||
@@ -340,5 +373,13 @@ | ||
return service && key in (service as any) | ||
? (service as any)[key] | ||
: (extension as any)[key]; | ||
if (service && key in service) { | ||
let value = (service as any)[key]; | ||
if (typeof value === 'function') { | ||
value = value.bind(service); | ||
} | ||
return value; | ||
} else { | ||
return (extension as any)[key]; | ||
} | ||
}, | ||
@@ -423,2 +464,34 @@ }); | ||
$enter(callback: RouteEnterCallback): RouteHookRemovalCallback { | ||
this._enterCallbackSet.add(callback); | ||
return () => { | ||
this._enterCallbackSet.delete(callback); | ||
}; | ||
} | ||
$update( | ||
callback: RouteUpdateCallback, | ||
options?: RouteUpdateOptions, | ||
): RouteHookRemovalCallback { | ||
let updateEntry: RouteUpdateEntry = { | ||
callback, | ||
options, | ||
}; | ||
this._updateEntrySet.add(updateEntry); | ||
return () => { | ||
this._updateEntrySet.delete(updateEntry); | ||
}; | ||
} | ||
$leave(callback: RouteLeaveCallback): RouteHookRemovalCallback { | ||
this._leaveCallbackSet.add(callback); | ||
return () => { | ||
this._leaveCallbackSet.delete(callback); | ||
}; | ||
} | ||
$afterEnter(callback: RouteAfterEnterCallback): RouteHookRemovalCallback { | ||
@@ -851,2 +924,47 @@ this._afterEnterCallbackSet.add(callback); | ||
/** @internal */ | ||
_enter(): void { | ||
for (let callback of this._enterCallbackSet) { | ||
tolerate(callback); | ||
} | ||
let service = this._getServiceSync(); | ||
if (service && service.enter) { | ||
return tolerate(() => service!.enter!()); | ||
} | ||
} | ||
/** @internal */ | ||
_update(triggeredByDescendants: boolean): void { | ||
for (let {options, callback} of this._updateEntrySet) { | ||
if (triggeredByDescendants && !(options?.traceDescendants ?? false)) { | ||
continue; | ||
} | ||
tolerate(callback, {descendants: triggeredByDescendants}); | ||
} | ||
let service = this._getServiceSync(); | ||
if (service && service.update) { | ||
return tolerate(() => | ||
service!.update!({descendants: triggeredByDescendants}), | ||
); | ||
} | ||
} | ||
/** @internal */ | ||
_leave(): void { | ||
for (let callback of this._leaveCallbackSet) { | ||
tolerate(callback); | ||
} | ||
let service = this._getServiceSync(); | ||
if (service && service.leave) { | ||
tolerate(() => service!.leave!()); | ||
} | ||
} | ||
/** @internal */ | ||
async _afterLeave(): Promise<void> { | ||
@@ -960,4 +1078,41 @@ for (let callback of this._afterLeaveCallbackSet) { | ||
/** @internal */ | ||
private _getServiceSync(): IRouteService | undefined { | ||
let service = this._service; | ||
if (service) { | ||
return service; | ||
} | ||
if (this._servicePromise) { | ||
throw new Error( | ||
`Service of route ${this.$name} is not ready: either use synchronous service factory or make sure the service is ready earlier`, | ||
); | ||
} | ||
let factory = this._serviceFactory; | ||
if (!factory) { | ||
return undefined; | ||
} | ||
let output = tolerate(factory, this); | ||
if (output instanceof Promise) { | ||
this._servicePromise = output.then(service => { | ||
this._service = service; | ||
return service; | ||
}); | ||
throw new Error( | ||
`Service of route ${this.$name} is not ready: either use synchronous service factory or make sure the service is ready earlier`, | ||
); | ||
} else { | ||
this._service = output; | ||
return output; | ||
} | ||
} | ||
static SEGMENT = /[^/]+/; | ||
static REST = /.*/; | ||
} |
@@ -564,3 +564,3 @@ import hyphenate from 'hyphenate'; | ||
this._update(generalGroups); | ||
this._update(generalGroups, interUpdateDataArray as InterUpdateData[]); | ||
@@ -708,3 +708,6 @@ this._snapshot = nextSnapshot; | ||
@action | ||
private _update(generalGroups: (string | undefined)[]): void { | ||
private _update( | ||
generalGroups: (string | undefined)[], | ||
dataArray: InterUpdateData[], | ||
): void { | ||
let source = this._source; | ||
@@ -729,2 +732,23 @@ let matchingSource = this._matchingSource; | ||
} | ||
for (let { | ||
reversedLeavingMatches, | ||
enteringAndUpdatingMatchSet, | ||
previousMatchSet, | ||
descendantUpdatingMatchSet, | ||
} of dataArray) { | ||
for (let match of reversedLeavingMatches) { | ||
match._leave(); | ||
} | ||
for (let match of enteringAndUpdatingMatchSet) { | ||
let update = previousMatchSet.has(match); | ||
if (update) { | ||
match._update(descendantUpdatingMatchSet.has(match)); | ||
} else { | ||
match._enter(); | ||
} | ||
} | ||
} | ||
} | ||
@@ -731,0 +755,0 @@ |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
New author
Supply chain riskA new npm collaborator published a version of the package for the first time. New collaborators are usually benign additions to a project, but do indicate a change to the security surface area of a package.
Found 1 instance in 1 package
250641
5037
0
56