piral-breadcrumbs 1.0.0-pre.1960 → 1.0.0

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.
Files changed (55) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +16 -2
  3. package/esm/Breadcrumbs.d.ts +2 -0
  4. package/esm/Breadcrumbs.js +23 -0
  5. package/esm/Breadcrumbs.js.map +1 -0
  6. package/esm/actions.d.ts +4 -0
  7. package/esm/actions.js +11 -0
  8. package/esm/actions.js.map +1 -0
  9. package/esm/components.d.ts +3 -0
  10. package/esm/components.js +4 -0
  11. package/esm/components.js.map +1 -0
  12. package/esm/create.d.ts +16 -0
  13. package/esm/create.js +80 -0
  14. package/esm/create.js.map +1 -0
  15. package/esm/default.d.ts +4 -0
  16. package/esm/default.js +5 -0
  17. package/esm/default.js.map +1 -0
  18. package/esm/index.d.ts +5 -0
  19. package/esm/index.js +6 -0
  20. package/esm/index.js.map +1 -0
  21. package/esm/types.d.ts +112 -0
  22. package/esm/types.js +2 -0
  23. package/esm/types.js.map +1 -0
  24. package/esm/useBreadcrumbs.d.ts +2 -0
  25. package/esm/useBreadcrumbs.js +41 -0
  26. package/esm/useBreadcrumbs.js.map +1 -0
  27. package/lib/Breadcrumbs.js +19 -17
  28. package/lib/Breadcrumbs.js.map +1 -1
  29. package/lib/actions.d.ts +3 -3
  30. package/lib/actions.js +11 -9
  31. package/lib/actions.js.map +1 -1
  32. package/lib/components.d.ts +3 -4
  33. package/lib/components.js +3 -3
  34. package/lib/components.js.map +1 -1
  35. package/lib/create.js +45 -29
  36. package/lib/create.js.map +1 -1
  37. package/lib/default.js +6 -4
  38. package/lib/default.js.map +1 -1
  39. package/lib/index.js +1 -1
  40. package/lib/types.d.ts +21 -7
  41. package/lib/useBreadcrumbs.d.ts +2 -1
  42. package/lib/useBreadcrumbs.js +10 -10
  43. package/lib/useBreadcrumbs.js.map +1 -1
  44. package/package.json +38 -8
  45. package/piral-breadcrumbs.min.js +1 -0
  46. package/src/Breadcrumbs.test.tsx +15 -15
  47. package/src/Breadcrumbs.tsx +3 -2
  48. package/src/actions.test.ts +12 -9
  49. package/src/actions.ts +11 -5
  50. package/src/components.tsx +2 -6
  51. package/src/create.test.ts +28 -27
  52. package/src/create.ts +46 -22
  53. package/src/default.test.tsx +9 -9
  54. package/src/types.ts +21 -8
  55. package/src/useBreadcrumbs.ts +2 -2
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
- var tslib_1 = require("tslib");
5
- var ptr = require("path-to-regexp");
6
- var actions = require("./actions");
7
- var piral_core_1 = require("piral-core");
8
- var default_1 = require("./default");
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
- var breadcrumbs = {};
22
- var i = 0;
23
- for (var _i = 0, items_1 = items; _i < items_1.length; _i++) {
24
- var settings = items_1[_i];
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: 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
- if (config === void 0) { config = {}; }
38
- var _a = config.breadcrumbs, breadcrumbs = _a === void 0 ? [] : _a;
39
- return function (context) {
41
+ function createBreadcrumbsApi(config = {}) {
42
+ const { breadcrumbs = [] } = config;
43
+ return (context) => {
40
44
  context.defineActions(actions);
41
- context.dispatch(function (state) { return (tslib_1.__assign(tslib_1.__assign({}, state), { components: tslib_1.__assign({ BreadcrumbItem: default_1.DefaultBreadbrumbItem, BreadcrumbsContainer: default_1.DefaultBreadcrumbsContainer }, state.components), registry: tslib_1.__assign(tslib_1.__assign({}, state.registry), { breadcrumbs: getBreadcrumbs(breadcrumbs) }) })); });
42
- return function (api, target) {
43
- var pilet = target.name;
44
- var next = 0;
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
- registerBreadcrumb: function (name, settings) {
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
- var id = piral_core_1.buildName(pilet, name);
52
- context.registerBreadcrumb(id, {
53
- pilet: pilet,
54
- matcher: getMatcher(settings),
55
- settings: settings,
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 function () { return api.unregisterBreadcrumb(name); };
73
+ return () => context.unregisterBreadcrumbs([id]);
58
74
  },
59
- unregisterBreadcrumb: function (name) {
60
- var id = piral_core_1.buildName(pilet, name);
61
- context.unregisterBreadcrumb(id);
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,oCAAsC;AACtC,mCAAqC;AACrC,yCAA0D;AAC1D,qCAA+E;AAc/E,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,IAAM,WAAW,GAAiC,EAAE,CAAC;IACrD,IAAI,CAAC,GAAG,CAAC,CAAC;IAEV,KAAuB,UAAK,EAAL,eAAK,EAAL,mBAAK,EAAL,IAAK,EAAE;QAAzB,IAAM,QAAQ,cAAA;QACjB,WAAW,CAAC,YAAU,CAAC,EAAI,CAAC,GAAG;YAC7B,KAAK,EAAE,SAAS;YAChB,OAAO,EAAE,UAAU,CAAC,QAAQ,CAAC;YAC7B,QAAQ,UAAA;SACT,CAAC;KACH;IAED,OAAO,WAAW,CAAC;AACrB,CAAC;AAED;;GAEG;AACH,SAAgB,oBAAoB,CAAC,MAA4B;IAA5B,uBAAA,EAAA,WAA4B;IACvD,IAAA,KAAqB,MAAM,YAAX,EAAhB,WAAW,mBAAG,EAAE,KAAA,CAAY;IAEpC,OAAO,UAAC,OAAO;QACb,OAAO,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;QAE/B,OAAO,CAAC,QAAQ,CAAC,UAAC,KAAK,IAAK,OAAA,uCACvB,KAAK,KACR,UAAU,qBACR,cAAc,EAAE,+BAAqB,EACrC,oBAAoB,EAAE,qCAA2B,IAC9C,KAAK,CAAC,UAAU,GAErB,QAAQ,wCACH,KAAK,CAAC,QAAQ,KACjB,WAAW,EAAE,cAAc,CAAC,WAAW,CAAC,OAE1C,EAX0B,CAW1B,CAAC,CAAC;QAEJ,OAAO,UAAC,GAAG,EAAE,MAAM;YACjB,IAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC;YAC1B,IAAI,IAAI,GAAG,CAAC,CAAC;YAEb,OAAO;gBACL,kBAAkB,EAAlB,UAAmB,IAAI,EAAE,QAAS;oBAChC,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE;wBAC5B,QAAQ,GAAG,IAAI,CAAC;wBAChB,IAAI,GAAG,IAAI,EAAE,CAAC;qBACf;oBAED,IAAM,EAAE,GAAG,sBAAS,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;oBAClC,OAAO,CAAC,kBAAkB,CAAC,EAAE,EAAE;wBAC7B,KAAK,OAAA;wBACL,OAAO,EAAE,UAAU,CAAC,QAAQ,CAAC;wBAC7B,QAAQ,UAAA;qBACT,CAAC,CAAC;oBACH,OAAO,cAAM,OAAA,GAAG,CAAC,oBAAoB,CAAC,IAAI,CAAC,EAA9B,CAA8B,CAAC;gBAC9C,CAAC;gBACD,oBAAoB,YAAC,IAAI;oBACvB,IAAM,EAAE,GAAG,sBAAS,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;oBAClC,OAAO,CAAC,oBAAoB,CAAC,EAAE,CAAC,CAAC;gBACnC,CAAC;aACF,CAAC;QACJ,CAAC,CAAC;IACJ,CAAC,CAAC;AACJ,CAAC;AA7CD,oDA6CC"}
1
+ {"version":3,"file":"create.js","sourceRoot":"","sources":["../src/create.ts"],"names":[],"mappings":"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"}
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
- var React = require("react");
5
- var piral_core_1 = require("piral-core");
6
- exports.DefaultBreadcrumbsContainer = function (props) { return (React.createElement(piral_core_1.ExtensionSlot, { name: "breadcrumbs", params: props, empty: function () { return piral_core_1.defaultRender(props.children, 'default_breadcrumbs'); } })); };
7
- exports.DefaultBreadbrumbItem = function (props) { return piral_core_1.defaultRender(props.children); };
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
@@ -1 +1 @@
1
- {"version":3,"file":"default.js","sourceRoot":"","sources":["../src/default.tsx"],"names":[],"mappings":";;;AAAA,6BAA+B;AAC/B,yCAA0D;AAG7C,QAAA,2BAA2B,GAAwC,UAAC,KAAK,IAAK,OAAA,CACzF,oBAAC,0BAAa,IAAC,IAAI,EAAC,aAAa,EAAC,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,cAAM,OAAA,0BAAa,CAAC,KAAK,CAAC,QAAQ,EAAE,qBAAqB,CAAC,EAApD,CAAoD,GAAI,CACvH,EAF0F,CAE1F,CAAC;AAEW,QAAA,qBAAqB,GAAkC,UAAC,KAAK,IAAK,OAAA,0BAAa,CAAC,KAAK,CAAC,QAAQ,CAAC,EAA7B,CAA6B,CAAC"}
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
- var tslib_1 = require("tslib");
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, ReactChild } from 'react';
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 name The name of the breadcrumb.
12
- * @param value The breadcrumb registration.
11
+ * @param values The breadcrumbs to register.
13
12
  */
14
- registerBreadcrumb(name: string, value: BreadcrumbRegistration): void;
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
- unregisterBreadcrumb(name: string): void;
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: ReactChild;
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.
@@ -1 +1,2 @@
1
- export declare function useBreadcrumbs(path: string): any[];
1
+ import { BreadcrumbRegistration } from './types';
2
+ export declare function useBreadcrumbs(path: string): BreadcrumbRegistration[];
@@ -1,17 +1,17 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.useBreadcrumbs = void 0;
4
- var piral_core_1 = require("piral-core");
4
+ const piral_core_1 = require("piral-core");
5
5
  function getExact(breadcrumbs, path) {
6
- var bc = breadcrumbs.filter(function (m) { return m.matcher.test(path); })[0];
6
+ const [bc] = breadcrumbs.filter((m) => m.matcher.test(path));
7
7
  return bc;
8
8
  }
9
9
  function getClosest(breadcrumbs, path) {
10
- var segments = path.split('/');
10
+ const segments = path.split('/');
11
11
  while (segments.length > 1) {
12
12
  segments.pop();
13
- var newPath = segments.join('/');
14
- var next = getNext(breadcrumbs, newPath);
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
- var breadcrumbs = piral_core_1.useGlobalState(function (s) { return s.registry.breadcrumbs; });
29
- var list = Object.keys(breadcrumbs).map(function (id) { return breadcrumbs[id]; });
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
- var current = getNext(list, path);
31
+ const current = getNext(list, path);
32
32
  if (current) {
33
- var links = [current];
34
- var previous = getNext(list, current.settings.parent);
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,yCAA4C;AAG5C,SAAS,QAAQ,CAAC,WAA0C,EAAE,IAAY;IACjE,IAAA,EAAE,GAAI,WAAW,CAAC,MAAM,CAAC,UAAC,CAAC,IAAK,OAAA,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAApB,CAAoB,CAAC,GAAnD,CAAoD;IAC7D,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,SAAS,UAAU,CAAC,WAA0C,EAAE,IAAY;IAC1E,IAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAEjC,OAAO,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE;QAC1B,QAAQ,CAAC,GAAG,EAAE,CAAC;QACf,IAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACnC,IAAM,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,IAAM,WAAW,GAAG,2BAAc,CAAC,UAAC,CAAC,IAAK,OAAA,CAAC,CAAC,QAAQ,CAAC,WAAW,EAAtB,CAAsB,CAAC,CAAC;IAClE,IAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,UAAC,EAAE,IAAK,OAAA,WAAW,CAAC,EAAE,CAAC,EAAf,CAAe,CAAC,CAAC;IAEnE,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE;QACnB,IAAM,OAAO,GAAG,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAEpC,IAAI,OAAO,EAAE;YACX,IAAM,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"}
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.0-pre.1960",
3
+ "version": "1.0.0",
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,28 @@
32
52
  "url": "https://github.com/smapiot/piral/issues"
33
53
  },
34
54
  "scripts": {
35
- "build": "tsc",
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.1960"
41
- },
42
63
  "dependencies": {
43
64
  "path-to-regexp": "^1.8.0"
44
65
  },
66
+ "devDependencies": {
67
+ "@types/react": "^18.0.0",
68
+ "@types/react-router": "^5.1.8",
69
+ "piral-core": "^1.0.0",
70
+ "react": "^18.0.0",
71
+ "react-router": "^5.2.0"
72
+ },
45
73
  "peerDependencies": {
46
- "piral-core": "0.12.x || 1.x"
74
+ "piral-core": "0.14.x || 0.15.x",
75
+ "react": ">=16.8.0",
76
+ "react-router": "5.x"
47
77
  },
48
- "gitHead": "ec5c91705d6fcf618d0de589c9b48943cad934a0"
78
+ "gitHead": "67d9a2920bd5231baf10bc87ae8985666b18fa3a"
49
79
  }
@@ -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])}}})}})();
@@ -1,13 +1,13 @@
1
1
  import * as React from 'react';
2
- import { mount } from 'enzyme';
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', () => ({
@@ -16,13 +16,13 @@ jest.mock('react-router', () => ({
16
16
  pathname: '/example',
17
17
  };
18
18
  },
19
- useParams() {
19
+ useRouteMatch() {
20
20
  return {};
21
21
  },
22
22
  }));
23
23
 
24
24
  function createMockContainer(breadcrumbs = {}) {
25
- const state = Atom.of({
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(deref(state));
42
+ return read(state.getState());
43
43
  },
44
44
  dispatch(update) {
45
- swap(state, update);
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 = mount(
55
+ const node = render(
56
56
  <StateContext.Provider value={context}>
57
57
  <Breadcrumbs />
58
58
  </StateContext.Provider>,
59
59
  );
60
- expect(node.find(MockBcContainer).length).toBe(1);
61
- expect(node.find(MockBcItem).length).toBe(0);
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 = mount(
90
+ const node = render(
91
91
  <StateContext.Provider value={context}>
92
92
  <Breadcrumbs />
93
93
  </StateContext.Provider>,
94
94
  );
95
- expect(node.find(MockBcContainer).length).toBe(1);
96
- expect(node.find(MockBcItem).length).toBe(2);
95
+ expect(node.getAllByRole("container").length).toBe(1);
96
+ expect(node.getAllByRole("dialog").length).toBe(2);
97
97
  });
98
98
  });
@@ -1,13 +1,14 @@
1
1
  import * as React from 'react';
2
- import { useLocation, useParams } from 'react-router';
2
+ import { useLocation, useRouteMatch } from 'react-router';
3
3
  import { PiralBreadcrumbsContainer, PiralBreadcrumbItem } from './components';
4
4
  import { useBreadcrumbs } from './useBreadcrumbs';
5
5
 
6
6
  export const Breadcrumbs: React.FC = () => {
7
7
  const location = useLocation();
8
- const params = useParams();
9
8
  const breadcrumbs = useBreadcrumbs(location.pathname);
10
9
  const currentIndex = breadcrumbs.length - 1;
10
+ const current = breadcrumbs[currentIndex];
11
+ const { params } = useRouteMatch(current?.settings.path ?? '/');
11
12
 
12
13
  const children = breadcrumbs.map(({ settings }, i) => {
13
14
  const { title, path, ...props } = settings;
@@ -1,19 +1,22 @@
1
- import { Atom, deref } from '@dbeining/react-atom';
2
- import { registerBreadcrumb, unregisterBreadcrumb } from './actions';
3
- import { createActions, createListener } from 'piral-core';
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 = Atom.of({
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
- registerBreadcrumb(ctx, 'foo', 10);
16
- expect(deref(state)).toEqual({
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
- unregisterBreadcrumb(ctx, 'foo');
26
- expect(deref(state)).toEqual({
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 { withKey, withoutKey, GlobalStateContext } from 'piral-core';
1
+ import type { GlobalStateContext, Dict } from 'piral-core';
2
2
  import { BreadcrumbRegistration } from './types';
3
3
 
4
- export function registerBreadcrumb(ctx: GlobalStateContext, name: string, value: BreadcrumbRegistration) {
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: withKey(state.registry.breadcrumbs, name, value),
9
+ breadcrumbs: {
10
+ ...state.registry.breadcrumbs,
11
+ ...values,
12
+ },
10
13
  },
11
14
  }));
12
15
  }
13
16
 
14
- export function unregisterBreadcrumb(ctx: GlobalStateContext, name: string) {
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: withoutKey(state.registry.breadcrumbs, name),
22
+ breadcrumbs: names.reduce((prev, name) => {
23
+ const { [name]: _, ...rest } = prev;
24
+ return rest;
25
+ }, state.registry.breadcrumbs),
20
26
  },
21
27
  }));
22
28
  }
@@ -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: React.ComponentType<BreadcrumbsContainerProps> = getPiralComponent(
6
- 'BreadcrumbsContainer',
7
- );
8
- export const PiralBreadcrumbItem: React.ComponentType<BreadcrumbItemProps> = getPiralComponent('BreadcrumbItem');
3
+ export const PiralBreadcrumbsContainer = getPiralComponent('BreadcrumbsContainer');
4
+ export const PiralBreadcrumbItem = getPiralComponent('BreadcrumbItem');