piral-breadcrumbs 1.0.0-pre.2077 → 1.0.1-beta.5640
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/LICENSE +1 -1
- package/README.md +16 -2
- package/esm/Breadcrumbs.d.ts +2 -0
- package/esm/Breadcrumbs.js +23 -0
- package/esm/Breadcrumbs.js.map +1 -0
- package/esm/actions.d.ts +4 -0
- package/esm/actions.js +11 -0
- package/esm/actions.js.map +1 -0
- package/esm/components.d.ts +3 -0
- package/esm/components.js +4 -0
- package/esm/components.js.map +1 -0
- package/esm/create.d.ts +16 -0
- package/esm/create.js +80 -0
- package/esm/create.js.map +1 -0
- package/esm/default.d.ts +4 -0
- package/esm/default.js +5 -0
- package/esm/default.js.map +1 -0
- package/esm/index.d.ts +5 -0
- package/esm/index.js +6 -0
- package/esm/index.js.map +1 -0
- package/esm/types.d.ts +112 -0
- package/esm/types.js +2 -0
- package/esm/types.js.map +1 -0
- package/esm/useBreadcrumbs.d.ts +2 -0
- package/esm/useBreadcrumbs.js +41 -0
- package/esm/useBreadcrumbs.js.map +1 -0
- package/lib/Breadcrumbs.js +18 -18
- package/lib/Breadcrumbs.js.map +1 -1
- package/lib/actions.d.ts +3 -3
- package/lib/actions.js +11 -9
- package/lib/actions.js.map +1 -1
- package/lib/components.d.ts +3 -4
- package/lib/components.js +3 -3
- package/lib/components.js.map +1 -1
- package/lib/create.js +45 -29
- package/lib/create.js.map +1 -1
- package/lib/default.js +6 -4
- package/lib/default.js.map +1 -1
- package/lib/index.js +1 -1
- package/lib/types.d.ts +21 -7
- package/lib/useBreadcrumbs.js +10 -10
- package/lib/useBreadcrumbs.js.map +1 -1
- package/package.json +34 -9
- package/piral-breadcrumbs.min.js +1 -0
- package/src/Breadcrumbs.test.tsx +14 -14
- package/src/actions.test.ts +12 -9
- package/src/actions.ts +11 -5
- package/src/components.tsx +2 -6
- package/src/create.test.ts +28 -27
- package/src/create.ts +46 -22
- package/src/default.test.tsx +9 -9
- package/src/types.ts +21 -8
package/lib/create.js
CHANGED
|
@@ -1,11 +1,14 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.createBreadcrumbsApi = void 0;
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
4
|
+
const tslib_1 = require("tslib");
|
|
5
|
+
const actions = require("./actions");
|
|
6
|
+
const piral_core_1 = require("piral-core");
|
|
7
|
+
const default_1 = require("./default");
|
|
8
|
+
const Breadcrumbs_1 = require("./Breadcrumbs");
|
|
9
|
+
// Unfortunately `require`d:
|
|
10
|
+
// * exports are otherwise potentially converted by, e.g., Parcel (see #385)
|
|
11
|
+
const ptr = require('path-to-regexp');
|
|
9
12
|
function getMatcher(settings) {
|
|
10
13
|
if (settings.matcher instanceof RegExp) {
|
|
11
14
|
return settings.matcher;
|
|
@@ -18,47 +21,60 @@ function getMatcher(settings) {
|
|
|
18
21
|
}
|
|
19
22
|
}
|
|
20
23
|
function getBreadcrumbs(items) {
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
for (
|
|
24
|
-
|
|
25
|
-
breadcrumbs["global-" + i++] = {
|
|
24
|
+
const breadcrumbs = {};
|
|
25
|
+
let i = 0;
|
|
26
|
+
for (const settings of items) {
|
|
27
|
+
breadcrumbs[`global-${i++}`] = {
|
|
26
28
|
pilet: undefined,
|
|
27
29
|
matcher: getMatcher(settings),
|
|
28
|
-
settings
|
|
30
|
+
settings,
|
|
29
31
|
};
|
|
30
32
|
}
|
|
31
33
|
return breadcrumbs;
|
|
32
34
|
}
|
|
35
|
+
function withBreadcrumbs(breadcrumbs) {
|
|
36
|
+
return (state) => (Object.assign(Object.assign({}, state), { components: Object.assign({ BreadcrumbItem: default_1.DefaultBreadbrumbItem, BreadcrumbsContainer: default_1.DefaultBreadcrumbsContainer }, state.components), registry: Object.assign(Object.assign({}, state.registry), { breadcrumbs }) }));
|
|
37
|
+
}
|
|
33
38
|
/**
|
|
34
39
|
* Creates the Pilet API extension for activating breadcrumbs support.
|
|
35
40
|
*/
|
|
36
|
-
function createBreadcrumbsApi(config) {
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
return function (context) {
|
|
41
|
+
function createBreadcrumbsApi(config = {}) {
|
|
42
|
+
const { breadcrumbs = [] } = config;
|
|
43
|
+
return (context) => {
|
|
40
44
|
context.defineActions(actions);
|
|
41
|
-
context.dispatch(
|
|
42
|
-
return
|
|
43
|
-
|
|
44
|
-
|
|
45
|
+
context.dispatch((0, piral_core_1.withAll)(withBreadcrumbs(getBreadcrumbs(breadcrumbs)), (0, piral_core_1.withRootExtension)('piral-breadcrumbs', Breadcrumbs_1.Breadcrumbs)));
|
|
46
|
+
return (_, target) => {
|
|
47
|
+
const pilet = target.name;
|
|
48
|
+
let next = 0;
|
|
45
49
|
return {
|
|
46
|
-
|
|
50
|
+
registerBreadcrumbs(values) {
|
|
51
|
+
const bc = {};
|
|
52
|
+
for (const value of values) {
|
|
53
|
+
const { name = next++ } = value, settings = tslib_1.__rest(value, ["name"]);
|
|
54
|
+
const id = (0, piral_core_1.buildName)(pilet, name);
|
|
55
|
+
bc[id] = settings;
|
|
56
|
+
}
|
|
57
|
+
context.registerBreadcrumbs(bc);
|
|
58
|
+
return () => context.unregisterBreadcrumbs(Object.keys(bc));
|
|
59
|
+
},
|
|
60
|
+
registerBreadcrumb(name, settings) {
|
|
47
61
|
if (typeof name !== 'string') {
|
|
48
62
|
settings = name;
|
|
49
63
|
name = next++;
|
|
50
64
|
}
|
|
51
|
-
|
|
52
|
-
context.
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
65
|
+
const id = (0, piral_core_1.buildName)(pilet, name);
|
|
66
|
+
context.registerBreadcrumbs({
|
|
67
|
+
[id]: {
|
|
68
|
+
pilet,
|
|
69
|
+
matcher: getMatcher(settings),
|
|
70
|
+
settings,
|
|
71
|
+
},
|
|
56
72
|
});
|
|
57
|
-
return
|
|
73
|
+
return () => context.unregisterBreadcrumbs([id]);
|
|
58
74
|
},
|
|
59
|
-
unregisterBreadcrumb
|
|
60
|
-
|
|
61
|
-
context.
|
|
75
|
+
unregisterBreadcrumb(name) {
|
|
76
|
+
const id = (0, piral_core_1.buildName)(pilet, name);
|
|
77
|
+
context.unregisterBreadcrumbs([id]);
|
|
62
78
|
},
|
|
63
79
|
};
|
|
64
80
|
};
|
package/lib/create.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create.js","sourceRoot":"","sources":["../src/create.ts"],"names":[],"mappings":";;;;AAAA,
|
|
1
|
+
{"version":3,"file":"create.js","sourceRoot":"","sources":["../src/create.ts"],"names":[],"mappings":";;;;AAAA,qCAAqC;AACrC,2CAAmG;AACnG,uCAA+E;AAC/E,+CAA4C;AAG5C,4BAA4B;AAC5B,4EAA4E;AAC5E,MAAM,GAAG,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;AAatC,SAAS,UAAU,CAAC,QAA4B;IAC9C,IAAI,QAAQ,CAAC,OAAO,YAAY,MAAM,EAAE;QACtC,OAAO,QAAQ,CAAC,OAAO,CAAC;KACzB;SAAM,IAAI,OAAO,QAAQ,CAAC,OAAO,KAAK,QAAQ,EAAE;QAC/C,OAAO,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;KAC9B;SAAM;QACL,OAAO,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;KAC3B;AACH,CAAC;AAED,SAAS,cAAc,CAAC,KAAgC;IACtD,MAAM,WAAW,GAAiC,EAAE,CAAC;IACrD,IAAI,CAAC,GAAG,CAAC,CAAC;IAEV,KAAK,MAAM,QAAQ,IAAI,KAAK,EAAE;QAC5B,WAAW,CAAC,UAAU,CAAC,EAAE,EAAE,CAAC,GAAG;YAC7B,KAAK,EAAE,SAAS;YAChB,OAAO,EAAE,UAAU,CAAC,QAAQ,CAAC;YAC7B,QAAQ;SACT,CAAC;KACH;IAED,OAAO,WAAW,CAAC;AACrB,CAAC;AAED,SAAS,eAAe,CAAC,WAAyC;IAChE,OAAO,CAAC,KAAkB,EAAe,EAAE,CAAC,iCACvC,KAAK,KACR,UAAU,kBACR,cAAc,EAAE,+BAAqB,EACrC,oBAAoB,EAAE,qCAA2B,IAC9C,KAAK,CAAC,UAAU,GAErB,QAAQ,kCACH,KAAK,CAAC,QAAQ,KACjB,WAAW,OAEb,CAAC;AACL,CAAC;AAED;;GAEG;AACH,SAAgB,oBAAoB,CAAC,SAA0B,EAAE;IAC/D,MAAM,EAAE,WAAW,GAAG,EAAE,EAAE,GAAG,MAAM,CAAC;IAEpC,OAAO,CAAC,OAAO,EAAE,EAAE;QACjB,OAAO,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;QAE/B,OAAO,CAAC,QAAQ,CACd,IAAA,oBAAO,EAAC,eAAe,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC,EAAE,IAAA,8BAAiB,EAAC,mBAAmB,EAAE,yBAAW,CAAC,CAAC,CAC3G,CAAC;QAEF,OAAO,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE;YACnB,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC;YAC1B,IAAI,IAAI,GAAG,CAAC,CAAC;YAEb,OAAO;gBACL,mBAAmB,CAAC,MAAM;oBACxB,MAAM,EAAE,GAAG,EAAE,CAAC;oBAEd,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE;wBAC1B,MAAM,EAAE,IAAI,GAAG,IAAI,EAAE,KAAkB,KAAK,EAAlB,QAAQ,kBAAK,KAAK,EAAtC,QAA8B,CAAQ,CAAC;wBAC7C,MAAM,EAAE,GAAG,IAAA,sBAAS,EAAC,KAAK,EAAE,IAAI,CAAC,CAAC;wBAClC,EAAE,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC;qBACnB;oBAED,OAAO,CAAC,mBAAmB,CAAC,EAAE,CAAC,CAAC;oBAChC,OAAO,GAAG,EAAE,CAAC,OAAO,CAAC,qBAAqB,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;gBAC9D,CAAC;gBACD,kBAAkB,CAAC,IAAI,EAAE,QAAS;oBAChC,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE;wBAC5B,QAAQ,GAAG,IAAI,CAAC;wBAChB,IAAI,GAAG,IAAI,EAAE,CAAC;qBACf;oBAED,MAAM,EAAE,GAAG,IAAA,sBAAS,EAAC,KAAK,EAAE,IAAI,CAAC,CAAC;oBAClC,OAAO,CAAC,mBAAmB,CAAC;wBAC1B,CAAC,EAAE,CAAC,EAAE;4BACJ,KAAK;4BACL,OAAO,EAAE,UAAU,CAAC,QAAQ,CAAC;4BAC7B,QAAQ;yBACT;qBACF,CAAC,CAAC;oBACH,OAAO,GAAG,EAAE,CAAC,OAAO,CAAC,qBAAqB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;gBACnD,CAAC;gBACD,oBAAoB,CAAC,IAAI;oBACvB,MAAM,EAAE,GAAG,IAAA,sBAAS,EAAC,KAAK,EAAE,IAAI,CAAC,CAAC;oBAClC,OAAO,CAAC,qBAAqB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;gBACtC,CAAC;aACF,CAAC;QACJ,CAAC,CAAC;IACJ,CAAC,CAAC;AACJ,CAAC;AAlDD,oDAkDC"}
|
package/lib/default.js
CHANGED
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.DefaultBreadbrumbItem = exports.DefaultBreadcrumbsContainer = void 0;
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
exports.
|
|
4
|
+
const React = require("react");
|
|
5
|
+
const piral_core_1 = require("piral-core");
|
|
6
|
+
const DefaultBreadcrumbsContainer = (props) => (React.createElement(piral_core_1.ExtensionSlot, { name: "breadcrumbs", params: props, empty: () => (0, piral_core_1.defaultRender)(props.children, 'default_breadcrumbs') }));
|
|
7
|
+
exports.DefaultBreadcrumbsContainer = DefaultBreadcrumbsContainer;
|
|
8
|
+
const DefaultBreadbrumbItem = (props) => (0, piral_core_1.defaultRender)(props.children);
|
|
9
|
+
exports.DefaultBreadbrumbItem = DefaultBreadbrumbItem;
|
|
8
10
|
//# sourceMappingURL=default.js.map
|
package/lib/default.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"default.js","sourceRoot":"","sources":["../src/default.tsx"],"names":[],"mappings":";;;AAAA
|
|
1
|
+
{"version":3,"file":"default.js","sourceRoot":"","sources":["../src/default.tsx"],"names":[],"mappings":";;;AAAA,+BAA+B;AAC/B,2CAA0D;AAGnD,MAAM,2BAA2B,GAAwC,CAAC,KAAK,EAAE,EAAE,CAAC,CACzF,oBAAC,0BAAa,IAAC,IAAI,EAAC,aAAa,EAAC,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,IAAA,0BAAa,EAAC,KAAK,CAAC,QAAQ,EAAE,qBAAqB,CAAC,GAAI,CACvH,CAAC;AAFW,QAAA,2BAA2B,+BAEtC;AAEK,MAAM,qBAAqB,GAAkC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAA,0BAAa,EAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;AAAhG,QAAA,qBAAqB,yBAA2E"}
|
package/lib/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
|
|
3
|
+
const tslib_1 = require("tslib");
|
|
4
4
|
tslib_1.__exportStar(require("./Breadcrumbs"), exports);
|
|
5
5
|
tslib_1.__exportStar(require("./create"), exports);
|
|
6
6
|
tslib_1.__exportStar(require("./components"), exports);
|
package/lib/types.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { ComponentType,
|
|
2
|
-
import { Dict, BaseRegistration, RegistrationDisposer } from 'piral-core';
|
|
1
|
+
import type { ComponentType, ReactNode } from 'react';
|
|
2
|
+
import type { Dict, BaseRegistration, RegistrationDisposer } from 'piral-core';
|
|
3
3
|
declare module 'piral-core/lib/types/custom' {
|
|
4
4
|
interface PiletCustomApi extends PiletBreadcrumbsApi {
|
|
5
5
|
}
|
|
@@ -8,15 +8,14 @@ declare module 'piral-core/lib/types/custom' {
|
|
|
8
8
|
interface PiralCustomActions {
|
|
9
9
|
/**
|
|
10
10
|
* Registers a new breadcrumb.
|
|
11
|
-
* @param
|
|
12
|
-
* @param value The breadcrumb registration.
|
|
11
|
+
* @param values The breadcrumbs to register.
|
|
13
12
|
*/
|
|
14
|
-
|
|
13
|
+
registerBreadcrumbs(values: Dict<BreadcrumbRegistration>): void;
|
|
15
14
|
/**
|
|
16
15
|
* Unregisters an existing breadcrumb.
|
|
17
16
|
* @param name The name of the breadcrumb to be removed.
|
|
18
17
|
*/
|
|
19
|
-
|
|
18
|
+
unregisterBreadcrumbs(names: Array<string>): void;
|
|
20
19
|
}
|
|
21
20
|
interface PiralCustomRegistryState {
|
|
22
21
|
/**
|
|
@@ -36,12 +35,20 @@ declare module 'piral-core/lib/types/custom' {
|
|
|
36
35
|
}
|
|
37
36
|
}
|
|
38
37
|
export interface BreadcrumbsContainerProps {
|
|
38
|
+
/**
|
|
39
|
+
* The breadcrumbs to display.
|
|
40
|
+
*/
|
|
41
|
+
children?: ReactNode;
|
|
39
42
|
}
|
|
40
43
|
export interface BreadcrumbItemProps extends Omit<BreadcrumbSettings, 'title'> {
|
|
41
44
|
/**
|
|
42
45
|
* Determins if the breadcrumb is the current page.
|
|
43
46
|
*/
|
|
44
47
|
current: boolean;
|
|
48
|
+
/**
|
|
49
|
+
* The title of the breadcrumb to display.
|
|
50
|
+
*/
|
|
51
|
+
children?: ReactNode;
|
|
45
52
|
}
|
|
46
53
|
export interface PiralCustomBreadcrumbSettings {
|
|
47
54
|
}
|
|
@@ -70,13 +77,20 @@ export interface BreadcrumbSettings extends PiralCustomBreadcrumbSettings {
|
|
|
70
77
|
/**
|
|
71
78
|
* The title of the breadcrumb.
|
|
72
79
|
*/
|
|
73
|
-
title:
|
|
80
|
+
title: ReactNode;
|
|
74
81
|
}
|
|
75
82
|
export interface BreadcrumbRegistration extends BaseRegistration {
|
|
76
83
|
matcher: RegExp;
|
|
77
84
|
settings: BreadcrumbSettings;
|
|
78
85
|
}
|
|
79
86
|
export interface PiletBreadcrumbsApi {
|
|
87
|
+
/**
|
|
88
|
+
* Registers a set of breadcrumbs.
|
|
89
|
+
* @param values The different breadcrumb settings.
|
|
90
|
+
*/
|
|
91
|
+
registerBreadcrumbs(values: Array<{
|
|
92
|
+
name?: string;
|
|
93
|
+
} & BreadcrumbSettings>): RegistrationDisposer;
|
|
80
94
|
/**
|
|
81
95
|
* Registers a breadcrumb with the provided settings.
|
|
82
96
|
* @param settings The settings for configuring the breadcrumb.
|
package/lib/useBreadcrumbs.js
CHANGED
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.useBreadcrumbs = void 0;
|
|
4
|
-
|
|
4
|
+
const piral_core_1 = require("piral-core");
|
|
5
5
|
function getExact(breadcrumbs, path) {
|
|
6
|
-
|
|
6
|
+
const [bc] = breadcrumbs.filter((m) => m.matcher.test(path));
|
|
7
7
|
return bc;
|
|
8
8
|
}
|
|
9
9
|
function getClosest(breadcrumbs, path) {
|
|
10
|
-
|
|
10
|
+
const segments = path.split('/');
|
|
11
11
|
while (segments.length > 1) {
|
|
12
12
|
segments.pop();
|
|
13
|
-
|
|
14
|
-
|
|
13
|
+
const newPath = segments.join('/');
|
|
14
|
+
const next = getNext(breadcrumbs, newPath);
|
|
15
15
|
if (next) {
|
|
16
16
|
return next;
|
|
17
17
|
}
|
|
@@ -25,13 +25,13 @@ function getNext(breadcrumbs, path) {
|
|
|
25
25
|
return undefined;
|
|
26
26
|
}
|
|
27
27
|
function useBreadcrumbs(path) {
|
|
28
|
-
|
|
29
|
-
|
|
28
|
+
const breadcrumbs = (0, piral_core_1.useGlobalState)((s) => s.registry.breadcrumbs);
|
|
29
|
+
const list = Object.keys(breadcrumbs).map((id) => breadcrumbs[id]);
|
|
30
30
|
if (list.length > 0) {
|
|
31
|
-
|
|
31
|
+
const current = getNext(list, path);
|
|
32
32
|
if (current) {
|
|
33
|
-
|
|
34
|
-
|
|
33
|
+
const links = [current];
|
|
34
|
+
let previous = getNext(list, current.settings.parent);
|
|
35
35
|
while (previous !== undefined) {
|
|
36
36
|
links.push(previous);
|
|
37
37
|
previous = getNext(list, previous.settings.parent);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useBreadcrumbs.js","sourceRoot":"","sources":["../src/useBreadcrumbs.ts"],"names":[],"mappings":";;;AAAA,
|
|
1
|
+
{"version":3,"file":"useBreadcrumbs.js","sourceRoot":"","sources":["../src/useBreadcrumbs.ts"],"names":[],"mappings":";;;AAAA,2CAA4C;AAG5C,SAAS,QAAQ,CAAC,WAA0C,EAAE,IAAY;IACxE,MAAM,CAAC,EAAE,CAAC,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IAC7D,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,SAAS,UAAU,CAAC,WAA0C,EAAE,IAAY;IAC1E,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAEjC,OAAO,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE;QAC1B,QAAQ,CAAC,GAAG,EAAE,CAAC;QACf,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACnC,MAAM,IAAI,GAAG,OAAO,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;QAE3C,IAAI,IAAI,EAAE;YACR,OAAO,IAAI,CAAC;SACb;KACF;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,OAAO,CAAC,WAA0C,EAAE,IAAY;IACvE,IAAI,IAAI,EAAE;QACR,OAAO,QAAQ,CAAC,WAAW,EAAE,IAAI,CAAC,IAAI,UAAU,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;KACrE;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAgB,cAAc,CAAC,IAAY;IACzC,MAAM,WAAW,GAAG,IAAA,2BAAc,EAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;IAClE,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC;IAEnE,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE;QACnB,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAEpC,IAAI,OAAO,EAAE;YACX,MAAM,KAAK,GAAG,CAAC,OAAO,CAAC,CAAC;YACxB,IAAI,QAAQ,GAAG,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;YAEtD,OAAO,QAAQ,KAAK,SAAS,EAAE;gBAC7B,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBACrB,QAAQ,GAAG,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;aACpD;YAED,OAAO,KAAK,CAAC,OAAO,EAAE,CAAC;SACxB;KACF;IAED,OAAO,EAAE,CAAC;AACZ,CAAC;AArBD,wCAqBC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "piral-breadcrumbs",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.1-beta.5640",
|
|
4
4
|
"description": "Plugin for creating a breadcrumb manager in Piral.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"piral",
|
|
@@ -17,12 +17,32 @@
|
|
|
17
17
|
"author": "smapiot",
|
|
18
18
|
"homepage": "https://piral.io",
|
|
19
19
|
"license": "MIT",
|
|
20
|
+
"module": "esm/index.js",
|
|
20
21
|
"main": "lib/index.js",
|
|
21
22
|
"typings": "lib/index.d.ts",
|
|
23
|
+
"exports": {
|
|
24
|
+
".": {
|
|
25
|
+
"import": "./esm/index.js",
|
|
26
|
+
"require": "./lib/index.js"
|
|
27
|
+
},
|
|
28
|
+
"./esm/*": {
|
|
29
|
+
"import": "./esm/*"
|
|
30
|
+
},
|
|
31
|
+
"./lib/*": {
|
|
32
|
+
"require": "./lib/*"
|
|
33
|
+
},
|
|
34
|
+
"./_/*": {
|
|
35
|
+
"import": "./esm/*.js",
|
|
36
|
+
"require": "./lib/*.js"
|
|
37
|
+
},
|
|
38
|
+
"./package.json": "./package.json"
|
|
39
|
+
},
|
|
22
40
|
"sideEffects": false,
|
|
23
41
|
"files": [
|
|
42
|
+
"esm",
|
|
24
43
|
"lib",
|
|
25
|
-
"src"
|
|
44
|
+
"src",
|
|
45
|
+
"piral-breadcrumbs.min.js"
|
|
26
46
|
],
|
|
27
47
|
"repository": {
|
|
28
48
|
"type": "git",
|
|
@@ -32,18 +52,23 @@
|
|
|
32
52
|
"url": "https://github.com/smapiot/piral/issues"
|
|
33
53
|
},
|
|
34
54
|
"scripts": {
|
|
35
|
-
"
|
|
55
|
+
"cleanup": "rimraf esm lib piral-breadcrumbs.min.js",
|
|
56
|
+
"build": "yarn build:bundle && yarn build:commonjs && yarn build:esnext",
|
|
57
|
+
"build:bundle": "esbuild src/index.ts --outfile=piral-breadcrumbs.min.js --bundle --external:piral-core --external:react --external:react-router --minify",
|
|
58
|
+
"build:commonjs": "tsc --project tsconfig.json --outDir lib --module commonjs",
|
|
59
|
+
"build:esnext": "tsc --project tsconfig.json --outDir esm --module esnext",
|
|
36
60
|
"typedoc": "typedoc --json ../../../docs/types/piral-breadcrumbs.json src --exclude \"src/**/*.test.*\"",
|
|
37
61
|
"test": "echo \"Error: run tests from root\" && exit 1"
|
|
38
62
|
},
|
|
39
|
-
"devDependencies": {
|
|
40
|
-
"piral-core": "^1.0.0-pre.2077"
|
|
41
|
-
},
|
|
42
63
|
"dependencies": {
|
|
43
64
|
"path-to-regexp": "^1.8.0"
|
|
44
65
|
},
|
|
45
|
-
"
|
|
46
|
-
"
|
|
66
|
+
"devDependencies": {
|
|
67
|
+
"@types/react": "^18.0.0",
|
|
68
|
+
"@types/react-router": "^5.1.8",
|
|
69
|
+
"piral-core": "1.0.1-beta.5640",
|
|
70
|
+
"react": "^18.0.0",
|
|
71
|
+
"react-router": "^5.2.0"
|
|
47
72
|
},
|
|
48
|
-
"gitHead": "
|
|
73
|
+
"gitHead": "fa0a72b28fd0a20afec7ef491ec19e93c090fc72"
|
|
49
74
|
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
(()=>{var pr=Object.create;var C=Object.defineProperty,lr=Object.defineProperties,dr=Object.getOwnPropertyDescriptor,fr=Object.getOwnPropertyDescriptors,br=Object.getOwnPropertyNames,S=Object.getOwnPropertySymbols,gr=Object.getPrototypeOf,G=Object.prototype.hasOwnProperty,z=Object.prototype.propertyIsEnumerable;var H=(r,e,t)=>e in r?C(r,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):r[e]=t,f=(r,e)=>{for(var t in e||(e={}))G.call(e,t)&&H(r,t,e[t]);if(S)for(var t of S(e))z.call(e,t)&&H(r,t,e[t]);return r},g=(r,e)=>lr(r,fr(e)),K=r=>C(r,"__esModule",{value:!0});var B=(r=>typeof require!="undefined"?require:typeof Proxy!="undefined"?new Proxy(r,{get:(e,t)=>(typeof require!="undefined"?require:e)[t]}):r)(function(r){if(typeof require!="undefined")return require.apply(this,arguments);throw new Error('Dynamic require of "'+r+'" is not supported')}),L=r=>typeof r=="symbol"?r:r+"",y=(r,e)=>{var t={};for(var a in r)G.call(r,a)&&e.indexOf(a)<0&&(t[a]=r[a]);if(r!=null&&S)for(var a of S(r))e.indexOf(a)<0&&z.call(r,a)&&(t[a]=r[a]);return t};var W=(r,e)=>()=>(e||r((e={exports:{}}).exports,e),e.exports),hr=(r,e)=>{K(r);for(var t in e)C(r,t,{get:e[t],enumerable:!0})},Br=(r,e,t)=>{if(e&&typeof e=="object"||typeof e=="function")for(let a of br(e))!G.call(r,a)&&a!=="default"&&C(r,a,{get:()=>e[a],enumerable:!(t=dr(e,a))||t.enumerable});return r},x=r=>Br(K(C(r!=null?pr(gr(r)):{},"default",r&&r.__esModule&&"default"in r?{get:()=>r.default,enumerable:!0}:{value:r,enumerable:!0})),r);var tr=W((qr,er)=>{er.exports=Array.isArray||function(r){return Object.prototype.toString.call(r)=="[object Array]"}});var cr=W((Jr,R)=>{var D=tr();R.exports=ir;R.exports.parse=N;R.exports.compile=Er;R.exports.tokensToFunction=ar;R.exports.tokensToRegExp=nr;var Cr=new RegExp(["(\\\\.)","([\\/.])?(?:(?:\\:(\\w+)(?:\\(((?:\\\\.|[^\\\\()])+)\\))?|\\(((?:\\\\.|[^\\\\()])+)\\))([+*?])?|(\\*))"].join("|"),"g");function N(r,e){for(var t=[],a=0,o=0,i="",m=e&&e.delimiter||"/",n;(n=Cr.exec(r))!=null;){var s=n[0],u=n[1],p=n.index;if(i+=r.slice(o,p),o=p+s.length,u){i+=u[1];continue}var c=r[o],l=n[2],d=n[3],b=n[4],w=n[5],v=n[6],P=n[7];i&&(t.push(i),i="");var A=l!=null&&c!=null&&c!==l,sr=v==="+"||v==="*",mr=v==="?"||v==="*",J=n[2]||m,M=b||w;t.push({name:d||a++,prefix:l||"",delimiter:J,optional:mr,repeat:sr,partial:A,asterisk:!!P,pattern:M?Ar(M):P?".*":"[^"+$(J)+"]+?"})}return o<r.length&&(i+=r.substr(o)),i&&t.push(i),t}function Er(r,e){return ar(N(r,e),e)}function wr(r){return encodeURI(r).replace(/[\/?#]/g,function(e){return"%"+e.charCodeAt(0).toString(16).toUpperCase()})}function Pr(r){return encodeURI(r).replace(/[?#]/g,function(e){return"%"+e.charCodeAt(0).toString(16).toUpperCase()})}function ar(r,e){for(var t=new Array(r.length),a=0;a<r.length;a++)typeof r[a]=="object"&&(t[a]=new RegExp("^(?:"+r[a].pattern+")$",q(e)));return function(o,i){for(var m="",n=o||{},s=i||{},u=s.pretty?wr:encodeURIComponent,p=0;p<r.length;p++){var c=r[p];if(typeof c=="string"){m+=c;continue}var l=n[c.name],d;if(l==null)if(c.optional){c.partial&&(m+=c.prefix);continue}else throw new TypeError('Expected "'+c.name+'" to be defined');if(D(l)){if(!c.repeat)throw new TypeError('Expected "'+c.name+'" to not repeat, but received `'+JSON.stringify(l)+"`");if(l.length===0){if(c.optional)continue;throw new TypeError('Expected "'+c.name+'" to not be empty')}for(var b=0;b<l.length;b++){if(d=u(l[b]),!t[p].test(d))throw new TypeError('Expected all "'+c.name+'" to match "'+c.pattern+'", but received `'+JSON.stringify(d)+"`");m+=(b===0?c.prefix:c.delimiter)+d}continue}if(d=c.asterisk?Pr(l):u(l),!t[p].test(d))throw new TypeError('Expected "'+c.name+'" to match "'+c.pattern+'", but received "'+d+'"');m+=c.prefix+d}return m}}function $(r){return r.replace(/([.+*?=^!:${}()[\]|\/\\])/g,"\\$1")}function Ar(r){return r.replace(/([=!:$\/()])/g,"\\$1")}function O(r,e){return r.keys=e,r}function q(r){return r&&r.sensitive?"":"i"}function Sr(r,e){var t=r.source.match(/\((?!\?)/g);if(t)for(var a=0;a<t.length;a++)e.push({name:a,prefix:null,delimiter:null,optional:!1,repeat:!1,partial:!1,asterisk:!1,pattern:null});return O(r,e)}function Ir(r,e,t){for(var a=[],o=0;o<r.length;o++)a.push(ir(r[o],e,t).source);var i=new RegExp("(?:"+a.join("|")+")",q(t));return O(i,e)}function Tr(r,e,t){return nr(N(r,t),e,t)}function nr(r,e,t){D(e)||(t=e||t,e=[]),t=t||{};for(var a=t.strict,o=t.end!==!1,i="",m=0;m<r.length;m++){var n=r[m];if(typeof n=="string")i+=$(n);else{var s=$(n.prefix),u="(?:"+n.pattern+")";e.push(n),n.repeat&&(u+="(?:"+s+u+")*"),n.optional?n.partial?u=s+"("+u+")?":u="(?:"+s+"("+u+"))?":u=s+"("+u+")",i+=u}}var p=$(t.delimiter||"/"),c=i.slice(-p.length)===p;return a||(i=(c?i.slice(0,-p.length):i)+"(?:"+p+"(?=$))?"),o?i+="$":i+=a&&c?"":"(?="+p+"|$)",O(new RegExp("^"+i,q(t)),e)}function ir(r,e,t){return D(e)||(t=e||t,e=[]),t=t||{},r instanceof RegExp?Sr(r,e):D(r)?Ir(r,e,t):Tr(r,e,t)}});var U=x(B("react")),T=x(B("react-router"));var _=x(B("piral-core")),X=(0,_.getPiralComponent)("BreadcrumbsContainer"),Z=(0,_.getPiralComponent)("BreadcrumbItem");var Q=x(B("piral-core"));function xr(r,e){let[t]=r.filter(a=>a.matcher.test(e));return t}function vr(r,e){let t=e.split("/");for(;t.length>1;){t.pop();let a=t.join("/"),o=I(r,a);if(o)return o}}function I(r,e){if(e)return xr(r,e)||vr(r,e)}function V(r){let e=(0,Q.useGlobalState)(a=>a.registry.breadcrumbs),t=Object.keys(e).map(a=>e[a]);if(t.length>0){let a=I(t,r);if(a){let o=[a],i=I(t,a.settings.parent);for(;i!==void 0;)o.push(i),i=I(t,i.settings.parent);return o.reverse()}}return[]}var j=()=>{var m;let r=(0,T.useLocation)(),e=V(r.pathname),t=e.length-1,a=e[t],{params:o}=(0,T.useRouteMatch)((m=a==null?void 0:a.settings.path)!=null?m:"/"),i=e.map(({settings:n},s)=>{let w=n,{title:u,path:p}=w,c=y(w,["title","path"]),l=`bc_${s}_${n.path}`,d=s===t,b=p.replace(/:([A-Za-z0-9_]+)/g,(v,P)=>{var A;return(A=o[P])!=null?A:v});return U.createElement(Z,f({key:l,current:d,path:b},c),u)});return U.createElement(X,{children:i})};j.displayName="Breadcrumbs";var F={};hr(F,{registerBreadcrumbs:()=>yr,unregisterBreadcrumbs:()=>Rr});function yr(r,e){r.dispatch(t=>g(f({},t),{registry:g(f({},t.registry),{breadcrumbs:f(f({},t.registry.breadcrumbs),e)})}))}function Rr(r,e){r.dispatch(t=>g(f({},t),{registry:g(f({},t.registry),{breadcrumbs:e.reduce((a,o)=>{let n=a,{[o]:i}=n;return y(n,[L(o)])},t.registry.breadcrumbs)})}))}var h=x(B("piral-core"));var Y=x(B("react")),E=x(B("piral-core")),k=r=>Y.createElement(E.ExtensionSlot,{name:"breadcrumbs",params:r,empty:()=>(0,E.defaultRender)(r.children,"default_breadcrumbs")}),rr=r=>(0,E.defaultRender)(r.children);var or=cr();function ur(r){return r.matcher instanceof RegExp?r.matcher:typeof r.matcher=="string"?or(r.matcher):or(r.path)}function Dr(r){let e={},t=0;for(let a of r)e[`global-${t++}`]={pilet:void 0,matcher:ur(a),settings:a};return e}function $r(r){return e=>g(f({},e),{components:f({BreadcrumbItem:rr,BreadcrumbsContainer:k},e.components),registry:g(f({},e.registry),{breadcrumbs:r})})}function Wr(r={}){let{breadcrumbs:e=[]}=r;return t=>(t.defineActions(F),t.dispatch((0,h.withAll)($r(Dr(e)),(0,h.withRootExtension)("piral-breadcrumbs",j))),(a,o)=>{let i=o.name,m=0;return{registerBreadcrumbs(n){let s={};for(let p of n){let u=p,{name:c=m++}=u,l=y(u,["name"]),d=(0,h.buildName)(i,c);s[d]=l}return t.registerBreadcrumbs(s),()=>t.unregisterBreadcrumbs(Object.keys(s))},registerBreadcrumb(n,s){typeof n!="string"&&(s=n,n=m++);let u=(0,h.buildName)(i,n);return t.registerBreadcrumbs({[u]:{pilet:i,matcher:ur(s),settings:s}}),()=>t.unregisterBreadcrumbs([u])},unregisterBreadcrumb(n){let s=(0,h.buildName)(i,n);t.unregisterBreadcrumbs([s])}}})}})();
|
package/src/Breadcrumbs.test.tsx
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import * as React from 'react';
|
|
2
|
-
import
|
|
2
|
+
import create from 'zustand';
|
|
3
|
+
import { render } from '@testing-library/react';
|
|
3
4
|
import { StateContext } from 'piral-core';
|
|
4
|
-
import { Atom, swap, deref } from '@dbeining/react-atom';
|
|
5
5
|
import { Breadcrumbs } from './Breadcrumbs';
|
|
6
6
|
|
|
7
|
-
const MockBcContainer: React.FC = ({ children }) => <div>{children}</div>;
|
|
7
|
+
const MockBcContainer: React.FC<any> = ({ children }) => <div role="container">{children}</div>;
|
|
8
8
|
MockBcContainer.displayName = 'MockBcContainer';
|
|
9
9
|
|
|
10
|
-
const MockBcItem: React.FC = ({ children }) => <div>{children}</div>;
|
|
10
|
+
const MockBcItem: React.FC<any> = ({ children }) => <div role="dialog">{children}</div>;
|
|
11
11
|
MockBcItem.displayName = 'MockBcTile';
|
|
12
12
|
|
|
13
13
|
jest.mock('react-router', () => ({
|
|
@@ -22,7 +22,7 @@ jest.mock('react-router', () => ({
|
|
|
22
22
|
}));
|
|
23
23
|
|
|
24
24
|
function createMockContainer(breadcrumbs = {}) {
|
|
25
|
-
const state =
|
|
25
|
+
const state = create(() => ({
|
|
26
26
|
components: {
|
|
27
27
|
BreadcrumbsContainer: MockBcContainer,
|
|
28
28
|
BreadcrumbItem: MockBcItem,
|
|
@@ -30,7 +30,7 @@ function createMockContainer(breadcrumbs = {}) {
|
|
|
30
30
|
registry: {
|
|
31
31
|
breadcrumbs,
|
|
32
32
|
},
|
|
33
|
-
});
|
|
33
|
+
}));
|
|
34
34
|
return {
|
|
35
35
|
context: {
|
|
36
36
|
on: jest.fn(),
|
|
@@ -39,10 +39,10 @@ function createMockContainer(breadcrumbs = {}) {
|
|
|
39
39
|
defineActions() {},
|
|
40
40
|
state,
|
|
41
41
|
readState(read) {
|
|
42
|
-
return read(
|
|
42
|
+
return read(state.getState());
|
|
43
43
|
},
|
|
44
44
|
dispatch(update) {
|
|
45
|
-
|
|
45
|
+
state.setState(update(state.getState()));
|
|
46
46
|
},
|
|
47
47
|
} as any,
|
|
48
48
|
api: {} as any,
|
|
@@ -52,13 +52,13 @@ function createMockContainer(breadcrumbs = {}) {
|
|
|
52
52
|
describe('Piral-Breadcrumb Container component', () => {
|
|
53
53
|
it('uses container for a breadcrumbs', () => {
|
|
54
54
|
const { context } = createMockContainer();
|
|
55
|
-
const node =
|
|
55
|
+
const node = render(
|
|
56
56
|
<StateContext.Provider value={context}>
|
|
57
57
|
<Breadcrumbs />
|
|
58
58
|
</StateContext.Provider>,
|
|
59
59
|
);
|
|
60
|
-
expect(node.
|
|
61
|
-
expect(node.
|
|
60
|
+
expect(node.getAllByRole("container").length).toBe(1);
|
|
61
|
+
expect(node.queryByRole("dialog")).toBe(null);
|
|
62
62
|
});
|
|
63
63
|
|
|
64
64
|
it('uses container and item for each breadcrumb', () => {
|
|
@@ -87,12 +87,12 @@ describe('Piral-Breadcrumb Container component', () => {
|
|
|
87
87
|
},
|
|
88
88
|
},
|
|
89
89
|
});
|
|
90
|
-
const node =
|
|
90
|
+
const node = render(
|
|
91
91
|
<StateContext.Provider value={context}>
|
|
92
92
|
<Breadcrumbs />
|
|
93
93
|
</StateContext.Provider>,
|
|
94
94
|
);
|
|
95
|
-
expect(node.
|
|
96
|
-
expect(node.
|
|
95
|
+
expect(node.getAllByRole("container").length).toBe(1);
|
|
96
|
+
expect(node.getAllByRole("dialog").length).toBe(2);
|
|
97
97
|
});
|
|
98
98
|
});
|
package/src/actions.test.ts
CHANGED
|
@@ -1,19 +1,22 @@
|
|
|
1
|
-
import
|
|
2
|
-
import {
|
|
3
|
-
import { createActions
|
|
1
|
+
import create from 'zustand';
|
|
2
|
+
import { createListener } from 'piral-base';
|
|
3
|
+
import { createActions } from 'piral-core';
|
|
4
|
+
import { registerBreadcrumbs, unregisterBreadcrumbs } from './actions';
|
|
4
5
|
|
|
5
6
|
describe('Breadcrumbs Actions Module', () => {
|
|
6
7
|
it('registerBreadcrumb and unregisterBreadcrumb', () => {
|
|
7
|
-
const state =
|
|
8
|
+
const state: any = create(() => ({
|
|
8
9
|
foo: 5,
|
|
9
10
|
registry: {
|
|
10
11
|
foo: 5,
|
|
11
12
|
breadcrumbs: {},
|
|
12
13
|
},
|
|
13
|
-
});
|
|
14
|
+
}));
|
|
14
15
|
const ctx = createActions(state, createListener({}));
|
|
15
|
-
|
|
16
|
-
|
|
16
|
+
registerBreadcrumbs(ctx, {
|
|
17
|
+
foo: 10 as any,
|
|
18
|
+
});
|
|
19
|
+
expect((state.getState())).toEqual({
|
|
17
20
|
foo: 5,
|
|
18
21
|
registry: {
|
|
19
22
|
foo: 5,
|
|
@@ -22,8 +25,8 @@ describe('Breadcrumbs Actions Module', () => {
|
|
|
22
25
|
},
|
|
23
26
|
},
|
|
24
27
|
});
|
|
25
|
-
|
|
26
|
-
expect(
|
|
28
|
+
unregisterBreadcrumbs(ctx, ['foo']);
|
|
29
|
+
expect((state.getState())).toEqual({
|
|
27
30
|
foo: 5,
|
|
28
31
|
registry: {
|
|
29
32
|
foo: 5,
|
package/src/actions.ts
CHANGED
|
@@ -1,22 +1,28 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import type { GlobalStateContext, Dict } from 'piral-core';
|
|
2
2
|
import { BreadcrumbRegistration } from './types';
|
|
3
3
|
|
|
4
|
-
export function
|
|
4
|
+
export function registerBreadcrumbs(ctx: GlobalStateContext, values: Dict<BreadcrumbRegistration>) {
|
|
5
5
|
ctx.dispatch((state) => ({
|
|
6
6
|
...state,
|
|
7
7
|
registry: {
|
|
8
8
|
...state.registry,
|
|
9
|
-
breadcrumbs:
|
|
9
|
+
breadcrumbs: {
|
|
10
|
+
...state.registry.breadcrumbs,
|
|
11
|
+
...values,
|
|
12
|
+
},
|
|
10
13
|
},
|
|
11
14
|
}));
|
|
12
15
|
}
|
|
13
16
|
|
|
14
|
-
export function
|
|
17
|
+
export function unregisterBreadcrumbs(ctx: GlobalStateContext, names: Array<string>) {
|
|
15
18
|
ctx.dispatch((state) => ({
|
|
16
19
|
...state,
|
|
17
20
|
registry: {
|
|
18
21
|
...state.registry,
|
|
19
|
-
breadcrumbs:
|
|
22
|
+
breadcrumbs: names.reduce((prev, name) => {
|
|
23
|
+
const { [name]: _, ...rest } = prev;
|
|
24
|
+
return rest;
|
|
25
|
+
}, state.registry.breadcrumbs),
|
|
20
26
|
},
|
|
21
27
|
}));
|
|
22
28
|
}
|
package/src/components.tsx
CHANGED
|
@@ -1,8 +1,4 @@
|
|
|
1
|
-
import * as React from 'react';
|
|
2
1
|
import { getPiralComponent } from 'piral-core';
|
|
3
|
-
import { BreadcrumbsContainerProps, BreadcrumbItemProps } from './types';
|
|
4
2
|
|
|
5
|
-
export const PiralBreadcrumbsContainer
|
|
6
|
-
|
|
7
|
-
);
|
|
8
|
-
export const PiralBreadcrumbItem: React.ComponentType<BreadcrumbItemProps> = getPiralComponent('BreadcrumbItem');
|
|
3
|
+
export const PiralBreadcrumbsContainer = getPiralComponent('BreadcrumbsContainer');
|
|
4
|
+
export const PiralBreadcrumbItem = getPiralComponent('BreadcrumbItem');
|
package/src/create.test.ts
CHANGED
|
@@ -1,8 +1,12 @@
|
|
|
1
|
-
import
|
|
1
|
+
import create from 'zustand';
|
|
2
2
|
import { createBreadcrumbsApi } from './create';
|
|
3
3
|
|
|
4
4
|
function createMockContainer() {
|
|
5
|
-
const state =
|
|
5
|
+
const state = create(() => ({
|
|
6
|
+
registry: {
|
|
7
|
+
extensions: {},
|
|
8
|
+
},
|
|
9
|
+
}));
|
|
6
10
|
return {
|
|
7
11
|
context: {
|
|
8
12
|
on: jest.fn(),
|
|
@@ -11,7 +15,7 @@ function createMockContainer() {
|
|
|
11
15
|
defineActions() {},
|
|
12
16
|
state,
|
|
13
17
|
dispatch(update) {
|
|
14
|
-
|
|
18
|
+
state.setState(update(state.getState()));
|
|
15
19
|
},
|
|
16
20
|
} as any,
|
|
17
21
|
api: {} as any,
|
|
@@ -34,55 +38,52 @@ const moduleMetadata = {
|
|
|
34
38
|
describe('Create Breadcrumb API Extensions', () => {
|
|
35
39
|
it('createBreadcrumbsApi can register and unregister a breadcrumb', () => {
|
|
36
40
|
const container = createMockContainer();
|
|
37
|
-
container.context.
|
|
38
|
-
container.context.
|
|
41
|
+
container.context.registerBreadcrumbs = jest.fn();
|
|
42
|
+
container.context.unregisterBreadcrumbs = jest.fn();
|
|
39
43
|
const api = createApi(container);
|
|
40
44
|
api.registerBreadcrumb('my-bc', {
|
|
41
45
|
title: 'My breadcrumb',
|
|
42
46
|
path: '/example',
|
|
43
47
|
});
|
|
44
|
-
expect(container.context.
|
|
45
|
-
expect(container.context.
|
|
48
|
+
expect(container.context.registerBreadcrumbs).toHaveBeenCalledTimes(1);
|
|
49
|
+
expect(container.context.unregisterBreadcrumbs).toHaveBeenCalledTimes(0);
|
|
46
50
|
api.unregisterBreadcrumb('my-bc');
|
|
47
|
-
expect(container.context.
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
);
|
|
51
|
+
expect(container.context.unregisterBreadcrumbs).toHaveBeenCalledTimes(1);
|
|
52
|
+
const ids = Object.keys(container.context.registerBreadcrumbs.mock.calls[0][0]);
|
|
53
|
+
expect(container.context.unregisterBreadcrumbs.mock.calls[0][0]).toEqual(ids);
|
|
51
54
|
});
|
|
52
55
|
|
|
53
56
|
it('createBreadcrumbsApi can dispose a registered breadcrumb', () => {
|
|
54
57
|
const container = createMockContainer();
|
|
55
|
-
container.context.
|
|
56
|
-
container.context.
|
|
58
|
+
container.context.registerBreadcrumbs = jest.fn();
|
|
59
|
+
container.context.unregisterBreadcrumbs = jest.fn();
|
|
57
60
|
const api = createApi(container);
|
|
58
61
|
const dispose = api.registerBreadcrumb('my-bc', {
|
|
59
62
|
title: 'My breadcrumb',
|
|
60
63
|
path: '/example',
|
|
61
64
|
});
|
|
62
|
-
expect(container.context.
|
|
63
|
-
expect(container.context.
|
|
65
|
+
expect(container.context.registerBreadcrumbs).toHaveBeenCalledTimes(1);
|
|
66
|
+
expect(container.context.unregisterBreadcrumbs).toHaveBeenCalledTimes(0);
|
|
64
67
|
dispose();
|
|
65
|
-
expect(container.context.
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
);
|
|
68
|
+
expect(container.context.unregisterBreadcrumbs).toHaveBeenCalledTimes(1);
|
|
69
|
+
const ids = Object.keys(container.context.registerBreadcrumbs.mock.calls[0][0]);
|
|
70
|
+
expect(container.context.unregisterBreadcrumbs.mock.calls[0][0]).toEqual(ids);
|
|
69
71
|
});
|
|
70
72
|
|
|
71
73
|
it('createBreadcrumbsApi can dispose a registered anonymous breadcrumb', () => {
|
|
72
74
|
const container = createMockContainer();
|
|
73
|
-
container.context.
|
|
74
|
-
container.context.
|
|
75
|
+
container.context.registerBreadcrumbs = jest.fn();
|
|
76
|
+
container.context.unregisterBreadcrumbs = jest.fn();
|
|
75
77
|
const api = createApi(container);
|
|
76
78
|
const dispose = api.registerBreadcrumb({
|
|
77
79
|
title: 'My breadcrumb',
|
|
78
80
|
path: '/example',
|
|
79
81
|
});
|
|
80
|
-
expect(container.context.
|
|
81
|
-
expect(container.context.
|
|
82
|
+
expect(container.context.registerBreadcrumbs).toHaveBeenCalledTimes(1);
|
|
83
|
+
expect(container.context.unregisterBreadcrumbs).toHaveBeenCalledTimes(0);
|
|
82
84
|
dispose();
|
|
83
|
-
expect(container.context.
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
);
|
|
85
|
+
expect(container.context.unregisterBreadcrumbs).toHaveBeenCalledTimes(1);
|
|
86
|
+
const ids = Object.keys(container.context.registerBreadcrumbs.mock.calls[0][0]);
|
|
87
|
+
expect(container.context.unregisterBreadcrumbs.mock.calls[0][0]).toEqual(ids);
|
|
87
88
|
});
|
|
88
89
|
});
|