ui5-lib-guard-router 1.4.0 → 1.5.1
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 +245 -34
- package/dist/.ui5/build-manifest.json +2 -2
- package/dist/index.d.ts +3 -3
- package/dist/resources/ui5/guard/router/.library +1 -1
- package/dist/resources/ui5/guard/router/Router-dbg.js +590 -91
- package/dist/resources/ui5/guard/router/Router-dbg.js.map +1 -1
- package/dist/resources/ui5/guard/router/Router.d.ts +138 -5
- package/dist/resources/ui5/guard/router/Router.d.ts.map +1 -1
- package/dist/resources/ui5/guard/router/Router.js +1 -1
- package/dist/resources/ui5/guard/router/Router.js.map +1 -1
- package/dist/resources/ui5/guard/router/library-dbg.js +1 -1
- package/dist/resources/ui5/guard/router/library-dbg.js.map +1 -1
- package/dist/resources/ui5/guard/router/library-preload.js +3 -3
- package/dist/resources/ui5/guard/router/library-preload.js.map +1 -1
- package/dist/resources/ui5/guard/router/library.js +1 -1
- package/dist/resources/ui5/guard/router/library.js.map +1 -1
- package/dist/resources/ui5/guard/router/manifest.json +1 -1
- package/dist/resources/ui5/guard/router/types-dbg.js.map +1 -1
- package/dist/resources/ui5/guard/router/types.d.ts +89 -2
- package/dist/resources/ui5/guard/router/types.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/Router.ts +697 -87
- package/src/manifest.json +1 -1
- package/src/types.ts +108 -2
package/README.md
CHANGED
|
@@ -27,6 +27,9 @@ This library solves all three by intercepting at the router level, before any ro
|
|
|
27
27
|
npm install ui5-lib-guard-router
|
|
28
28
|
```
|
|
29
29
|
|
|
30
|
+
> [!NOTE]
|
|
31
|
+
> The npm package is ~150 KB compressed (~670 KB unpacked) because it ships both pre-built distributables (`dist/`) and TypeScript sources (`src/`) to support multiple [serving options](#serving-the-library). At runtime, the browser loads only the `library-preload.js` bundle (~25 KB).
|
|
32
|
+
|
|
30
33
|
### TypeScript
|
|
31
34
|
|
|
32
35
|
Add the library to `compilerOptions.types` so TypeScript can resolve the type declarations. If your app does not already depend on UI5 typings, install them too (`@sapui5/types` works as well):
|
|
@@ -215,14 +218,15 @@ All guard registration and removal methods return `this` for chaining. `navigati
|
|
|
215
218
|
|
|
216
219
|
Every guard receives a `GuardContext` object:
|
|
217
220
|
|
|
218
|
-
| Property | Type | Description
|
|
219
|
-
| ------------- | -------------------------------------------------- |
|
|
220
|
-
| `toRoute` | `string` | Target route name (empty if no match)
|
|
221
|
-
| `toHash` | `string` | Raw hash being navigated to
|
|
222
|
-
| `toArguments` | `Record<string, string \| Record<string, string>>` | Parsed route parameters
|
|
223
|
-
| `fromRoute` | `string` | Current route name (empty on first navigation)
|
|
224
|
-
| `fromHash` | `string` | Current hash
|
|
225
|
-
| `signal` | `AbortSignal` | Aborted when navigation is superseded, or on `stop()`/`destroy()`
|
|
221
|
+
| Property | Type | Description |
|
|
222
|
+
| ------------- | -------------------------------------------------- | ------------------------------------------------------------------------- |
|
|
223
|
+
| `toRoute` | `string` | Target route name (empty if no match) |
|
|
224
|
+
| `toHash` | `string` | Raw hash being navigated to |
|
|
225
|
+
| `toArguments` | `Record<string, string \| Record<string, string>>` | Parsed route parameters |
|
|
226
|
+
| `fromRoute` | `string` | Current route name (empty on first navigation) |
|
|
227
|
+
| `fromHash` | `string` | Current hash |
|
|
228
|
+
| `signal` | `AbortSignal` | Aborted when navigation is superseded, or on `stop()`/`destroy()` |
|
|
229
|
+
| `bag` | `Map<string, unknown>` | Shared mutable store for inter-guard data passing within one pipeline run |
|
|
226
230
|
|
|
227
231
|
### Return values (`GuardResult`)
|
|
228
232
|
|
|
@@ -347,6 +351,10 @@ router.attachNavigationSettled((event) => {
|
|
|
347
351
|
|
|
348
352
|
Use `detachNavigationSettled(fnFunction, oListener)` to remove the listener. The same function and listener references must match those passed to `attachNavigationSettled`. The event uses UI5's native `EventProvider` mechanism, so the standard `attachEvent` / `detachEvent` pattern also works.
|
|
349
353
|
|
|
354
|
+
### Error handling
|
|
355
|
+
|
|
356
|
+
When a guard throws or its Promise rejects, the navigation settles as `Error` with `result.error` containing the thrown value. The previous route stays active. This is distinct from `Blocked` (intentional denial) — `Error` indicates an unexpected failure.
|
|
357
|
+
|
|
350
358
|
### Execution order
|
|
351
359
|
|
|
352
360
|
1. **Leave guards** for the current route (registration order)
|
|
@@ -354,6 +362,232 @@ Use `detachNavigationSettled(fnFunction, oListener)` to remove the listener. The
|
|
|
354
362
|
3. **Route-specific enter guards** for the target (registration order)
|
|
355
363
|
4. Pipeline **short-circuits** at the first non-`true` result
|
|
356
364
|
|
|
365
|
+
Each phase short-circuits on the first non-`true` result. If a leave guard blocks, no enter guards run. If a global guard redirects, route-specific guards are skipped.
|
|
366
|
+
|
|
367
|
+
## Manifest Configuration
|
|
368
|
+
|
|
369
|
+
Guards can be declared directly in `manifest.json` using the `guardRouter` block inside `sap.ui5.routing.config`. This eliminates boilerplate in `Component.ts` for common guard patterns.
|
|
370
|
+
|
|
371
|
+
```json
|
|
372
|
+
{
|
|
373
|
+
"sap.ui5": {
|
|
374
|
+
"routing": {
|
|
375
|
+
"config": {
|
|
376
|
+
"routerClass": "ui5.guard.router.Router",
|
|
377
|
+
"guardRouter": {
|
|
378
|
+
"unknownRouteGuardRegistration": "warn",
|
|
379
|
+
"navToPreflight": "guard",
|
|
380
|
+
"guardLoading": "lazy",
|
|
381
|
+
"guards": {
|
|
382
|
+
"*": ["guards.authGuard"],
|
|
383
|
+
"admin": {
|
|
384
|
+
"enter": ["guards.adminGuard"],
|
|
385
|
+
"leave": ["guards.unsavedChangesGuard"]
|
|
386
|
+
}
|
|
387
|
+
}
|
|
388
|
+
}
|
|
389
|
+
}
|
|
390
|
+
}
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
```
|
|
394
|
+
|
|
395
|
+
### Router options
|
|
396
|
+
|
|
397
|
+
| Option | Values | Default | Description |
|
|
398
|
+
| ------------------------------- | ----------------------------------- | --------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
399
|
+
| `unknownRouteGuardRegistration` | `"ignore"` \| `"warn"` \| `"throw"` | `"warn"` | What to do when a guard is declared for a route name that doesn't exist in the manifest |
|
|
400
|
+
| `navToPreflight` | `"guard"` \| `"bypass"` \| `"off"` | `"guard"` | Whether `navTo()` calls run through the guard pipeline (`"guard"`), skip guards (`"bypass"`), or the preflight is disabled entirely (`"off"`) |
|
|
401
|
+
| `guardLoading` | `"block"` \| `"lazy"` | `"lazy"` | `"lazy"`: registers lazy wrappers, loads modules on first navigation; a preload hint fires in the constructor to warm the cache; `initialize()` is always synchronous. `"block"`: loads all modules before `initialize()` completes; `initialize()` is async. |
|
|
402
|
+
|
|
403
|
+
### Declarative guards
|
|
404
|
+
|
|
405
|
+
The `guards` map wires guard modules to routes without writing code in `Component.ts`.
|
|
406
|
+
|
|
407
|
+
**Global guards** run on every navigation and are declared under the `"*"` key:
|
|
408
|
+
|
|
409
|
+
```json
|
|
410
|
+
"guards": {
|
|
411
|
+
"*": ["guards.authGuard"]
|
|
412
|
+
}
|
|
413
|
+
```
|
|
414
|
+
|
|
415
|
+
**Per-route guards** use the route name as the key. The shorthand array form registers enter guards only:
|
|
416
|
+
|
|
417
|
+
```json
|
|
418
|
+
"guards": {
|
|
419
|
+
"admin": ["guards.adminGuard"]
|
|
420
|
+
}
|
|
421
|
+
```
|
|
422
|
+
|
|
423
|
+
The full object form with `enter` and `leave` keys registers both enter and leave guards:
|
|
424
|
+
|
|
425
|
+
```json
|
|
426
|
+
"guards": {
|
|
427
|
+
"admin": {
|
|
428
|
+
"enter": ["guards.adminGuard"],
|
|
429
|
+
"leave": ["guards.unsavedChangesGuard"]
|
|
430
|
+
}
|
|
431
|
+
}
|
|
432
|
+
```
|
|
433
|
+
|
|
434
|
+
**Module paths** use dot notation and are resolved relative to `sap.app.id`. Given `sap.app.id = "com.example.app"`, the path `"guards.authGuard"` resolves to `"com/example/app/guards/authGuard"`.
|
|
435
|
+
|
|
436
|
+
To use an absolute module path, prefix it with `"module:"`:
|
|
437
|
+
|
|
438
|
+
```json
|
|
439
|
+
"*": ["module:com/shared/guards/authGuard"]
|
|
440
|
+
```
|
|
441
|
+
|
|
442
|
+
### Complete example
|
|
443
|
+
|
|
444
|
+
manifest.json:
|
|
445
|
+
|
|
446
|
+
```json
|
|
447
|
+
{
|
|
448
|
+
"sap.ui5": {
|
|
449
|
+
"routing": {
|
|
450
|
+
"config": {
|
|
451
|
+
"routerClass": "ui5.guard.router.Router",
|
|
452
|
+
"guardRouter": {
|
|
453
|
+
"guards": {
|
|
454
|
+
"*": ["guards.authGuard"],
|
|
455
|
+
"admin": { "enter": ["guards.roleGuard"], "leave": ["guards.unsavedGuard"] }
|
|
456
|
+
}
|
|
457
|
+
}
|
|
458
|
+
}
|
|
459
|
+
}
|
|
460
|
+
}
|
|
461
|
+
}
|
|
462
|
+
```
|
|
463
|
+
|
|
464
|
+
guards/authGuard.ts:
|
|
465
|
+
|
|
466
|
+
```typescript
|
|
467
|
+
import type { GuardContext, GuardResult } from "ui5/guard/router/types";
|
|
468
|
+
|
|
469
|
+
export default function authGuard(context: GuardContext): GuardResult {
|
|
470
|
+
if (!isAuthenticated()) return "login";
|
|
471
|
+
return true;
|
|
472
|
+
}
|
|
473
|
+
```
|
|
474
|
+
|
|
475
|
+
The router loads `guards.authGuard` relative to `sap.app.id`. For `sap.app.id = "com.example.app"`, this resolves to `com/example/app/guards/authGuard`.
|
|
476
|
+
|
|
477
|
+
### Guard module format
|
|
478
|
+
|
|
479
|
+
Each entry in the guard array is a module whose default export is one of three shapes:
|
|
480
|
+
|
|
481
|
+
**Shape 1: Function (single guard)**
|
|
482
|
+
|
|
483
|
+
```typescript
|
|
484
|
+
// guards/auth.ts
|
|
485
|
+
import type { GuardContext, GuardResult } from "ui5/guard/router/types";
|
|
486
|
+
|
|
487
|
+
export default function authGuard(context: GuardContext): GuardResult {
|
|
488
|
+
return isAuthenticated() ? true : "login";
|
|
489
|
+
}
|
|
490
|
+
```
|
|
491
|
+
|
|
492
|
+
**Shape 2: Array (ordered guards)**
|
|
493
|
+
|
|
494
|
+
```typescript
|
|
495
|
+
// guards/checks.ts — registered as "checks#0", "checks#1"
|
|
496
|
+
import type { GuardContext, GuardResult } from "ui5/guard/router/types";
|
|
497
|
+
|
|
498
|
+
export default [
|
|
499
|
+
function checkAuth(context: GuardContext): GuardResult {
|
|
500
|
+
return true;
|
|
501
|
+
},
|
|
502
|
+
function checkRole(context: GuardContext): GuardResult {
|
|
503
|
+
return false;
|
|
504
|
+
},
|
|
505
|
+
];
|
|
506
|
+
```
|
|
507
|
+
|
|
508
|
+
**Shape 3: Plain Object (named guards)**
|
|
509
|
+
|
|
510
|
+
```typescript
|
|
511
|
+
// guards/security.ts — registered as "checkAuth", "checkRole"
|
|
512
|
+
import type { GuardContext, GuardResult } from "ui5/guard/router/types";
|
|
513
|
+
|
|
514
|
+
export default {
|
|
515
|
+
checkAuth(context: GuardContext): GuardResult {
|
|
516
|
+
/* ... */ return true;
|
|
517
|
+
},
|
|
518
|
+
checkRole(context: GuardContext): GuardResult {
|
|
519
|
+
/* ... */ return false;
|
|
520
|
+
},
|
|
521
|
+
};
|
|
522
|
+
```
|
|
523
|
+
|
|
524
|
+
Detection: function produces a single guard, `Array` produces ordered guards, and a plain object produces named guards in key order. Non-function entries in arrays and objects are warned and skipped. Empty arrays and objects are warned and produce no guards.
|
|
525
|
+
|
|
526
|
+
### Cherry-pick syntax
|
|
527
|
+
|
|
528
|
+
When a module exports multiple guards, you can register a subset using `#` to select by name or index:
|
|
529
|
+
|
|
530
|
+
```json
|
|
531
|
+
{
|
|
532
|
+
"guards": {
|
|
533
|
+
"admin": ["guards.security#checkAuth", "guards.security#checkRole"],
|
|
534
|
+
"dashboard": ["guards.security"],
|
|
535
|
+
"settings": ["guards.checks#1"],
|
|
536
|
+
"*": ["guards.logging"]
|
|
537
|
+
}
|
|
538
|
+
}
|
|
539
|
+
```
|
|
540
|
+
|
|
541
|
+
| Syntax | Behavior |
|
|
542
|
+
| ------------------------------------ | --------------------------------------------- |
|
|
543
|
+
| `"guards.security"` | Register all exports (key/array order) |
|
|
544
|
+
| `"guards.security#checkAuth"` | Register only that named export |
|
|
545
|
+
| `"guards.security#1"` | Register by index (array or object key order) |
|
|
546
|
+
| `"module:some.lib.guards#checkAuth"` | `module:` prefix composes with `#` |
|
|
547
|
+
|
|
548
|
+
When `#` is used on a single-function module, the export key is ignored with a debug message and the function is still registered.
|
|
549
|
+
|
|
550
|
+
### Guard context `bag`
|
|
551
|
+
|
|
552
|
+
Guards in the same pipeline can share data through `context.bag`, a `Map<string, unknown>` that is created fresh for each navigation and shared across all guards in that pipeline:
|
|
553
|
+
|
|
554
|
+
```typescript
|
|
555
|
+
export default function firstGuard(context: GuardContext): GuardResult {
|
|
556
|
+
context.bag.set("userId", getCurrentUserId());
|
|
557
|
+
return true;
|
|
558
|
+
}
|
|
559
|
+
|
|
560
|
+
export default function secondGuard(context: GuardContext): GuardResult {
|
|
561
|
+
const userId = context.bag.get("userId") as string | undefined;
|
|
562
|
+
if (!userId) return "login";
|
|
563
|
+
return true;
|
|
564
|
+
}
|
|
565
|
+
```
|
|
566
|
+
|
|
567
|
+
The bag is typed as `Map<string, unknown>`, so consumers cast on `.get()`. This matches how UI5 handles untyped model data (`getProperty()` returns `any`) and avoids generic complexity that can't flow through UI5's class system.
|
|
568
|
+
|
|
569
|
+
This is useful for avoiding repeated work (such as fetching the current user) when multiple guards need the same data in a single navigation.
|
|
570
|
+
|
|
571
|
+
### `skipGuards` option
|
|
572
|
+
|
|
573
|
+
Pass `{ skipGuards: true }` as the fourth argument to `navTo()` to bypass all guards for a single call. Use this for internal redirects or navigations that should not be subject to guard logic:
|
|
574
|
+
|
|
575
|
+
```typescript
|
|
576
|
+
router.navTo("settings", {}, false, { skipGuards: true });
|
|
577
|
+
```
|
|
578
|
+
|
|
579
|
+
### Mixing declarative and programmatic guards
|
|
580
|
+
|
|
581
|
+
Manifest guards and programmatic guards coexist on the same pipeline. Manifest guards are registered during `initialize()` (before the first navigation), and programmatic guards are added whenever `addGuard()` / `addRouteGuard()` / `addLeaveGuard()` is called.
|
|
582
|
+
|
|
583
|
+
**Execution order:** manifest guards run first (in declaration order), then programmatic guards (in registration order). For the same route, both sets execute — they are additive, not exclusive.
|
|
584
|
+
|
|
585
|
+
A common pattern is to declare static guards in the manifest and add context-dependent guards programmatically:
|
|
586
|
+
|
|
587
|
+
- **Manifest:** guards that don't need component state (simple blocks, redirects, logging)
|
|
588
|
+
- **Programmatic:** guards that close over models, services, or runtime state
|
|
589
|
+
- **Controller-level:** guards tied to a specific view's lifecycle (registered in `onInit`, removed in `onExit`)
|
|
590
|
+
|
|
357
591
|
## Examples
|
|
358
592
|
|
|
359
593
|
### Async guard with AbortSignal
|
|
@@ -412,7 +646,7 @@ export function createDirtyFormGuard(formModel: JSONModel): LeaveGuardFn {
|
|
|
412
646
|
|
|
413
647
|
### Object form with RouteGuardConfig
|
|
414
648
|
|
|
415
|
-
The
|
|
649
|
+
The object form is useful when registering both enter and leave guards for the same route in a single call:
|
|
416
650
|
|
|
417
651
|
```typescript
|
|
418
652
|
import type { RouteGuardConfig } from "ui5/guard/router/types";
|
|
@@ -638,31 +872,6 @@ Or set the global log level via URL parameter (per-component filtering is only a
|
|
|
638
872
|
|
|
639
873
|
> **Note**: UI5 1.120+ uses kebab-case URL parameters (`sap-ui-log-level`). Older versions use camelCase (`sap-ui-logLevel`).
|
|
640
874
|
|
|
641
|
-
### Log reference
|
|
642
|
-
|
|
643
|
-
| Level | Message | Trigger |
|
|
644
|
-
| ------- | ----------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------- |
|
|
645
|
-
| warning | `addGuard called with invalid guard, ignoring` | Non-function passed to `addGuard()` |
|
|
646
|
-
| warning | `addRouteGuard called with invalid guard, ignoring` | Non-function `beforeEnter`, `beforeLeave`, or direct guard |
|
|
647
|
-
| info | `addRouteGuard called with config missing both beforeEnter and beforeLeave` | Empty `RouteGuardConfig` object (no handlers) |
|
|
648
|
-
| warning | `addLeaveGuard called with invalid guard, ignoring` | Non-function passed to `addLeaveGuard()` |
|
|
649
|
-
| warning | `removeGuard called with invalid guard, ignoring` | Non-function passed to `removeGuard()` |
|
|
650
|
-
| warning | `removeRouteGuard called with invalid guard, ignoring` | Non-function passed to `removeRouteGuard()` |
|
|
651
|
-
| warning | `removeLeaveGuard called with invalid guard, ignoring` | Non-function passed to `removeLeaveGuard()` |
|
|
652
|
-
| warning | `{method} called for unknown route; guard will still register...` | Route name not found at registration time |
|
|
653
|
-
| warning | `Guard returned invalid value, treating as block` | Enter guard returned something other than `true`, `false`, a non-empty string, or a `GuardRedirect` |
|
|
654
|
-
| warning | `Leave guard returned non-boolean value, treating as block` | Leave guard returned something other than `true` or `false` |
|
|
655
|
-
| warning | `Guard redirect target "{route}" did not produce a navigation, treating as blocked` | Redirect target did not trigger a follow-up navigation (most commonly an unknown route name) |
|
|
656
|
-
| error | `Guard redirect loop detected: {visited hashes}` | A redirect chain revisited a hash already evaluated in the current chain |
|
|
657
|
-
| error | `Guard redirect chain exceeded maximum depth ({N}): {visited hashes}` | A redirect chain exceeded the depth cap (10 hops) |
|
|
658
|
-
| error | `Guard pipeline failed during redirect chain for "{route}", blocking navigation` | Async guard pipeline rejected while evaluating a redirect target |
|
|
659
|
-
| error | `Guard pipeline failed for "{hash}", navigation failed` | Async guard pipeline rejected in `parse()` fallback path |
|
|
660
|
-
| error | `Async preflight guard failed for route "{route}", navigation failed` | Async guard pipeline rejected in `navTo()` preflight path |
|
|
661
|
-
| error | `Enter guard [{n}] on route "{route}" threw, navigation failed` | Sync or async enter guard threw an exception |
|
|
662
|
-
| error | `Leave guard [{n}] on route "{route}" threw, navigation failed` | Sync or async leave guard threw an exception |
|
|
663
|
-
| debug | `Async guard result discarded (superseded by newer navigation)` | A newer navigation invalidated the pending async result (`parse()` path) |
|
|
664
|
-
| debug | `Async preflight result discarded (superseded by newer navigation)` | A newer navigation invalidated the pending async result (`navTo()` path) |
|
|
665
|
-
|
|
666
875
|
### Common issues
|
|
667
876
|
|
|
668
877
|
**Guards not running**: Verify the route name passed to `addRouteGuard()` matches the route name in `manifest.json`, not the pattern or target name. Guards on redirect targets do run; if a redirect chain is blocked by loop detection, check the error log for details -- see [Redirect chains](#redirect-chains).
|
|
@@ -671,6 +880,8 @@ Or set the global log level via URL parameter (per-component filtering is only a
|
|
|
671
880
|
|
|
672
881
|
**Redirect treated as blocked**: The redirect did not trigger a follow-up navigation. Most often the target route name is wrong, but a same-hash no-op can look similar. The router logs the target name so you can verify the route and parameters.
|
|
673
882
|
|
|
883
|
+
**Async guard hangs indefinitely**: `context.signal` only aborts on supersede or router stop/destroy, not on "too slow." If a guard's `fetch` targets a dead endpoint, the navigation stays in the evaluating phase forever. Combine `context.signal` with `AbortSignal.timeout()` to enforce a hard deadline: `signal: AbortSignal.any([context.signal, AbortSignal.timeout(10_000)])`. See the [async guard timeout pattern](../../docs/guides/integration-patterns.md#async-guard-timeout) for the full example and a compatibility fallback for older browsers.
|
|
884
|
+
|
|
674
885
|
**Async guard result discarded**: A newer navigation started before the async guard resolved. The router uses a generation counter to discard stale results. This is expected behavior during rapid sequential navigations. The debug log confirms when this occurs.
|
|
675
886
|
|
|
676
887
|
**URL bar shows target hash, then reverts**: This is expected for async guards. The `HashChanger` updates the URL before `parse()` runs. See [URL bar shows target hash during async guards](#url-bar-shows-target-hash-during-async-guards) for the architectural explanation and the busy-indicator pattern.
|
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
},
|
|
17
17
|
"buildManifest": {
|
|
18
18
|
"manifestVersion": "0.2",
|
|
19
|
-
"timestamp": "2026-03-
|
|
19
|
+
"timestamp": "2026-03-23T15:59:01.881Z",
|
|
20
20
|
"versions": {
|
|
21
21
|
"builderVersion": "4.1.4",
|
|
22
22
|
"projectVersion": "4.0.13",
|
|
@@ -31,7 +31,7 @@
|
|
|
31
31
|
"includedTasks": [],
|
|
32
32
|
"excludedTasks": []
|
|
33
33
|
},
|
|
34
|
-
"version": "1.
|
|
34
|
+
"version": "1.5.1",
|
|
35
35
|
"namespace": "ui5/guard/router",
|
|
36
36
|
"tags": {
|
|
37
37
|
"/resources/ui5/guard/router/GuardPipeline-dbg.js": {
|
package/dist/index.d.ts
CHANGED
|
@@ -32,8 +32,8 @@
|
|
|
32
32
|
// - @types/istanbul-lib-report@3.0.3
|
|
33
33
|
// - @types/istanbul-lib-coverage@2.0.6
|
|
34
34
|
// - @types/qunit@2.19.13
|
|
35
|
-
/// <reference path="./resources/ui5/guard/router/
|
|
36
|
-
/// <reference path="./resources/ui5/guard/router/types.d.ts"/>
|
|
35
|
+
/// <reference path="./resources/ui5/guard/router/library.d.ts"/>
|
|
37
36
|
/// <reference path="./resources/ui5/guard/router/Router.d.ts"/>
|
|
37
|
+
/// <reference path="./resources/ui5/guard/router/types.d.ts"/>
|
|
38
38
|
/// <reference path="./resources/ui5/guard/router/NavigationOutcome.d.ts"/>
|
|
39
|
-
/// <reference path="./resources/ui5/guard/router/
|
|
39
|
+
/// <reference path="./resources/ui5/guard/router/GuardPipeline.d.ts"/>
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
<library xmlns="http://www.sap.com/sap.ui.library.xsd">
|
|
3
3
|
<name>ui5.guard.router</name>
|
|
4
4
|
<vendor>Marco</vendor>
|
|
5
|
-
<version>1.
|
|
5
|
+
<version>1.5.1</version>
|
|
6
6
|
<copyright></copyright>
|
|
7
7
|
<title>UI5 Router extension with async navigation guards</title>
|
|
8
8
|
<documentation>Extends sap.m.routing.Router with async navigation guards, running before route matching begins.</documentation>
|