victory-core 36.6.4 → 36.6.5

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 (95) hide show
  1. package/CHANGELOG.md +9 -0
  2. package/dist/victory-core.js +2053 -4568
  3. package/dist/victory-core.min.js +1 -1
  4. package/es/index.d.ts +0 -1
  5. package/es/index.js +1 -2
  6. package/es/v37/clone.d.ts +23 -0
  7. package/es/v37/clone.js +32 -0
  8. package/es/v37/index.d.ts +5 -0
  9. package/es/v37/index.js +4 -0
  10. package/es/{victory-state → v37/victory-state}/defaults.d.ts +0 -0
  11. package/es/{victory-state → v37/victory-state}/defaults.js +0 -0
  12. package/es/v37/victory-state/helpers/get-axis-data.d.ts +3 -0
  13. package/es/{victory-state → v37/victory-state}/helpers/get-axis-data.js +1 -1
  14. package/es/{victory-state → v37/victory-state}/helpers/get-data.d.ts +1 -1
  15. package/es/{victory-state → v37/victory-state}/helpers/get-data.js +1 -1
  16. package/{lib → es/v37}/victory-state/helpers/get-domain.d.ts +1 -1
  17. package/es/{victory-state → v37/victory-state}/helpers/get-domain.js +1 -1
  18. package/{lib → es/v37}/victory-state/helpers/get-range.d.ts +1 -1
  19. package/es/{victory-state → v37/victory-state}/helpers/get-range.js +2 -2
  20. package/{lib → es/v37}/victory-state/helpers/get-scale.d.ts +1 -1
  21. package/es/{victory-state → v37/victory-state}/helpers/get-scale.js +2 -2
  22. package/es/v37/victory-state/index.d.ts +4 -0
  23. package/es/{victory-state/index.d.ts → v37/victory-state/index.js} +1 -1
  24. package/{lib → es/v37}/victory-state/types.d.ts +2 -2
  25. package/es/{victory-state → v37/victory-state}/types.js +0 -0
  26. package/{lib → es/v37}/victory-state/victory-provider.d.ts +5 -4
  27. package/es/{victory-state → v37/victory-state}/victory-provider.js +58 -27
  28. package/es/v37/victory-state/with-victory-provider.d.ts +7 -0
  29. package/es/v37/victory-state/with-victory-provider.js +43 -0
  30. package/es/{victory-util → v37}/with-container.d.ts +2 -2
  31. package/es/{victory-util → v37}/with-container.js +1 -1
  32. package/es/v37/with-normalized-props.d.ts +17 -0
  33. package/es/v37/with-normalized-props.js +18 -0
  34. package/es/victory-util/immutable-types.d.ts +2523 -0
  35. package/es/victory-util/immutable.d.ts +1 -1
  36. package/es/victory-util/index.d.ts +0 -1
  37. package/es/victory-util/index.js +1 -2
  38. package/lib/index.d.ts +0 -1
  39. package/lib/index.js +0 -14
  40. package/lib/v37/clone.d.ts +23 -0
  41. package/lib/v37/clone.js +43 -0
  42. package/lib/v37/index.d.ts +5 -0
  43. package/lib/v37/index.js +57 -0
  44. package/lib/{victory-state → v37/victory-state}/defaults.d.ts +0 -0
  45. package/lib/{victory-state → v37/victory-state}/defaults.js +0 -0
  46. package/lib/v37/victory-state/helpers/get-axis-data.d.ts +3 -0
  47. package/lib/{victory-state → v37/victory-state}/helpers/get-axis-data.js +1 -1
  48. package/lib/{victory-state → v37/victory-state}/helpers/get-data.d.ts +1 -1
  49. package/lib/{victory-state → v37/victory-state}/helpers/get-data.js +1 -1
  50. package/{es → lib/v37}/victory-state/helpers/get-domain.d.ts +1 -1
  51. package/lib/{victory-state → v37/victory-state}/helpers/get-domain.js +1 -1
  52. package/{es → lib/v37}/victory-state/helpers/get-range.d.ts +1 -1
  53. package/lib/{victory-state → v37/victory-state}/helpers/get-range.js +2 -2
  54. package/{es → lib/v37}/victory-state/helpers/get-scale.d.ts +1 -1
  55. package/lib/{victory-state → v37/victory-state}/helpers/get-scale.js +2 -2
  56. package/lib/v37/victory-state/index.d.ts +4 -0
  57. package/lib/{victory-state → v37/victory-state}/index.js +13 -0
  58. package/{es → lib/v37}/victory-state/types.d.ts +2 -2
  59. package/lib/{victory-state → v37/victory-state}/types.js +0 -0
  60. package/{es → lib/v37}/victory-state/victory-provider.d.ts +5 -4
  61. package/lib/{victory-state → v37/victory-state}/victory-provider.js +60 -28
  62. package/lib/v37/victory-state/with-victory-provider.d.ts +7 -0
  63. package/lib/v37/victory-state/with-victory-provider.js +56 -0
  64. package/lib/{victory-util → v37}/with-container.d.ts +2 -2
  65. package/lib/{victory-util → v37}/with-container.js +1 -1
  66. package/lib/v37/with-normalized-props.d.ts +17 -0
  67. package/lib/v37/with-normalized-props.js +29 -0
  68. package/lib/victory-util/immutable-types.d.ts +2523 -0
  69. package/lib/victory-util/immutable.d.ts +1 -1
  70. package/lib/victory-util/index.d.ts +0 -1
  71. package/lib/victory-util/index.js +0 -14
  72. package/package.json +2 -2
  73. package/src/index.ts +0 -1
  74. package/src/v37/clone.tsx +30 -0
  75. package/src/v37/index.tsx +4 -0
  76. package/src/{victory-state → v37/victory-state}/defaults.ts +0 -0
  77. package/src/{victory-state → v37/victory-state}/helpers/get-axis-data.ts +2 -2
  78. package/src/{victory-state → v37/victory-state}/helpers/get-data.ts +3 -3
  79. package/src/{victory-state → v37/victory-state}/helpers/get-domain.ts +2 -2
  80. package/src/{victory-state → v37/victory-state}/helpers/get-range.ts +3 -3
  81. package/src/{victory-state → v37/victory-state}/helpers/get-scale.ts +6 -3
  82. package/src/{victory-state → v37/victory-state}/index.ts +1 -0
  83. package/src/{victory-state → v37/victory-state}/types.ts +2 -2
  84. package/src/{victory-state → v37/victory-state}/victory-provider.tsx +61 -27
  85. package/src/v37/victory-state/with-victory-provider.tsx +53 -0
  86. package/src/{victory-util → v37}/with-container.tsx +2 -2
  87. package/src/v37/with-normalized-props.tsx +43 -0
  88. package/src/victory-util/data.ts +1 -1
  89. package/src/victory-util/immutable-types.d.ts +2523 -0
  90. package/src/victory-util/immutable.ts +1 -1
  91. package/src/victory-util/index.ts +0 -1
  92. package/es/victory-state/helpers/get-axis-data.d.ts +0 -3
  93. package/es/victory-state/index.js +0 -2
  94. package/lib/victory-state/helpers/get-axis-data.d.ts +0 -3
  95. package/lib/victory-state/index.d.ts +0 -3
@@ -1,4 +1,4 @@
1
- import type { Iterable, List, Map } from "immutable";
1
+ import type { Iterable, List, Map } from "./immutable-types";
2
2
  export declare const IMMUTABLE_ITERABLE = "@@__IMMUTABLE_ITERABLE__@@";
3
3
  export declare const IMMUTABLE_RECORD = "@@__IMMUTABLE_RECORD__@@";
4
4
  export declare const IMMUTABLE_LIST = "@@__IMMUTABLE_LIST__@@";
@@ -25,5 +25,4 @@ export { default as TimerContext } from "./timer-context";
25
25
  export * as Transitions from "./transitions";
26
26
  export * as UserProps from "./user-props";
27
27
  export * as Wrapper from "./wrapper";
28
- export * from "./with-container";
29
28
  //# sourceMappingURL=index.d.ts.map
@@ -159,20 +159,6 @@ var _Wrapper = _interopRequireWildcard(require("./wrapper"));
159
159
 
160
160
  exports.Wrapper = _Wrapper;
161
161
 
162
- var _withContainer = require("./with-container");
163
-
164
- Object.keys(_withContainer).forEach(function (key) {
165
- if (key === "default" || key === "__esModule") return;
166
- if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;
167
- if (key in exports && exports[key] === _withContainer[key]) return;
168
- Object.defineProperty(exports, key, {
169
- enumerable: true,
170
- get: function () {
171
- return _withContainer[key];
172
- }
173
- });
174
- });
175
-
176
162
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
177
163
 
178
164
  function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "victory-core",
3
- "version": "36.6.4",
3
+ "version": "36.6.5",
4
4
  "description": "Victory Core",
5
5
  "keywords": [
6
6
  "data visualization",
@@ -23,7 +23,7 @@
23
23
  "lodash": "^4.17.21",
24
24
  "prop-types": "^15.8.1",
25
25
  "react-fast-compare": "^3.2.0",
26
- "victory-vendor": "^36.6.4"
26
+ "victory-vendor": "^36.6.5"
27
27
  },
28
28
  "peerDependencies": {
29
29
  "react": ">=16.6.0"
package/src/index.ts CHANGED
@@ -15,4 +15,3 @@ export * from "./victory-primitives";
15
15
  export { Border as Box } from "./victory-primitives";
16
16
  export type { BorderProps as BoxProps } from "./victory-primitives";
17
17
  export * from "./victory-util";
18
- export * from "./victory-state";
@@ -0,0 +1,30 @@
1
+ import React from "react";
2
+
3
+ /**
4
+ * Syntax sugar for `React.cloneElement`, so that we can use JSX instead
5
+ *
6
+ * @example
7
+ * // Before:
8
+ * const children = React.cloneElement(props.groupComponent, { prop2 }, props.children);
9
+ * return React.cloneElement(props.containerComponent, { prop1 }, children);
10
+ *
11
+ * // After:
12
+ * return (
13
+ * <Clone element={props.containerComponent} prop1={prop1}>
14
+ * <Clone element={props.groupComponent} prop2={prop2}>
15
+ * {props.children}
16
+ * </Clone>
17
+ * </Clone>
18
+ * );
19
+ */
20
+ export const Clone = <TProps,>(
21
+ props: React.PropsWithChildren<
22
+ {
23
+ element: React.ReactElement<TProps>;
24
+ children?: React.ReactNode | React.ReactNode[];
25
+ } & TProps
26
+ >,
27
+ ) => {
28
+ const { children, element, ...rest } = props;
29
+ return React.cloneElement(element, rest as unknown as TProps, children);
30
+ };
@@ -0,0 +1,4 @@
1
+ export * from "./victory-state";
2
+ export * from "./clone";
3
+ export * from "./with-normalized-props";
4
+ export * from "./with-container";
@@ -1,5 +1,5 @@
1
- import { AxisType, Datum, DomainValue } from "../../types/prop-types";
2
- import { isKeyValueObject } from "../../victory-util/type-helpers";
1
+ import { AxisType, Datum, DomainValue } from "../../../types/prop-types";
2
+ import { isKeyValueObject } from "../../../victory-util/type-helpers";
3
3
 
4
4
  export function getAxisData(data: Datum[], axis: AxisType) {
5
5
  return data.reduce((acc, datum) => {
@@ -1,7 +1,7 @@
1
- import { get, isNil, orderBy } from "lodash";
2
1
  import * as React from "react";
3
- import { Datum, DatumValue } from "../../types/prop-types";
4
- import { isKeyValueObject } from "../../victory-util/type-helpers";
2
+ import { get, isNil, orderBy } from "lodash";
3
+ import { Datum, DatumValue } from "../../../types/prop-types";
4
+ import { isKeyValueObject } from "../../../victory-util/type-helpers";
5
5
  import { VictoryProviderProps } from "../types";
6
6
 
7
7
  type DataProps = Pick<
@@ -4,14 +4,14 @@ import {
4
4
  getValueForAxis,
5
5
  isDate,
6
6
  isTuple,
7
- } from "../../victory-util/type-helpers";
7
+ } from "../../../victory-util/type-helpers";
8
8
  import { VictoryProviderProps } from "../types";
9
9
  import {
10
10
  Tuple,
11
11
  AxisType,
12
12
  DomainTuple,
13
13
  DomainValue,
14
- } from "../../types/prop-types";
14
+ } from "../../../types/prop-types";
15
15
 
16
16
  type DomainProps = Pick<
17
17
  VictoryProviderProps,
@@ -1,6 +1,6 @@
1
- import { AxisType, Padding, RangeTuple } from "../../types/prop-types";
2
- import { getPadding } from "../../victory-util/helpers";
3
- import { getValueForAxis, isTuple } from "../../victory-util/type-helpers";
1
+ import { AxisType, Padding, RangeTuple } from "../../../types/prop-types";
2
+ import { getPadding } from "../../../victory-util/helpers";
3
+ import { getValueForAxis, isTuple } from "../../../victory-util/type-helpers";
4
4
  import { VictoryProviderProps } from "../types";
5
5
 
6
6
  type RangeProps = Pick<
@@ -4,9 +4,12 @@ import {
4
4
  scaleLog,
5
5
  scaleSqrt,
6
6
  } from "victory-vendor/d3-scale";
7
- import { AxisType, D3ScaleFn, ScalePropType } from "../../types/prop-types";
8
- import * as Collection from "../../victory-util/collection";
9
- import { getValueForAxis, isFunction } from "../../victory-util/type-helpers";
7
+ import { AxisType, D3ScaleFn, ScalePropType } from "../../../types/prop-types";
8
+ import * as Collection from "../../../victory-util/collection";
9
+ import {
10
+ getValueForAxis,
11
+ isFunction,
12
+ } from "../../../victory-util/type-helpers";
10
13
  import { VictoryProviderProps } from "../types";
11
14
  import { getAxisData } from "./get-axis-data";
12
15
 
@@ -1,2 +1,3 @@
1
1
  export * from "./victory-provider";
2
2
  export * from "./types";
3
+ export * from "./with-victory-provider";
@@ -5,8 +5,8 @@ import {
5
5
  RangeTuple,
6
6
  ScalePropType,
7
7
  ValueOrAxes,
8
- } from "../types/prop-types";
9
- import { PaddingProps } from "../victory-theme/types";
8
+ } from "../../types/prop-types";
9
+ import { PaddingProps } from "../../victory-theme/types";
10
10
 
11
11
  // These are all the props that are used to calculate data, domain, range, and scale
12
12
  export interface VictoryCalculatedStateProps {
@@ -1,6 +1,6 @@
1
1
  import * as React from "react";
2
2
  import { createContext, useContext } from "react";
3
- import { D3ScaleFn, DomainTuple, ForAxes } from "../types/prop-types";
3
+ import { D3ScaleFn, DomainTuple, ForAxes } from "../../types/prop-types";
4
4
  import { FormattedDatum, getData } from "./helpers/get-data";
5
5
  import { getDomain } from "./helpers/get-domain";
6
6
  import { getRange } from "./helpers/get-range";
@@ -14,27 +14,42 @@ export interface ContextType {
14
14
  data: FormattedDatum[];
15
15
  scale: ScaleType;
16
16
  domain: DomainType;
17
- setChildProps: (id: string, props: VictoryProviderProps) => void;
17
+ updateChildProps: (id: symbol, props: VictoryProviderProps | null) => void;
18
18
  }
19
19
 
20
20
  const VictoryContext = createContext<ContextType | null>(null);
21
21
 
22
- export function VictoryProvider({
23
- children,
24
- ...initialProps
25
- }: VictoryProviderProps) {
26
- // We need to store the props in state so they can be overwritten by child components
27
- const [props, setProps] = React.useState(initialProps);
22
+ type CollectedProps = { [id: symbol]: VictoryCalculatedStateProps };
28
23
 
29
- const setChildProps = React.useCallback(
30
- (id: string, newProps: VictoryCalculatedStateProps) => {
31
- setProps((prevProps) => {
32
- return { ...prevProps, ...newProps };
24
+ function useNormalizedProps(): ContextType {
25
+ const [collectedProps, setCollectedProps] = React.useState<CollectedProps>(
26
+ {},
27
+ );
28
+
29
+ const updateChildProps = React.useCallback(
30
+ (id: symbol, newProps: VictoryCalculatedStateProps | null) => {
31
+ setCollectedProps((prev) => {
32
+ const result = { ...prev };
33
+ if (newProps === null) {
34
+ delete result[id];
35
+ } else {
36
+ result[id] = newProps;
37
+ }
38
+ return result;
33
39
  });
34
40
  },
35
41
  [],
36
42
  );
37
43
 
44
+ // TEMP: combine all props into a single result:
45
+ // TODO: instead, we should intelligently aggregate all these props
46
+ const props = Object.values(
47
+ collectedProps,
48
+ ).reduce<VictoryCalculatedStateProps>(
49
+ (result, childProps) => Object.assign(result, childProps),
50
+ {},
51
+ );
52
+
38
53
  const data = React.useMemo(() => {
39
54
  return getData(props);
40
55
  }, [props]);
@@ -69,18 +84,39 @@ export function VictoryProvider({
69
84
  };
70
85
  }, [props, domain, range]);
71
86
 
72
- const value = {
73
- scale,
74
- data,
75
- domain,
76
- setChildProps,
77
- };
87
+ const normalizedProps = React.useMemo(
88
+ () => ({
89
+ scale,
90
+ data,
91
+ domain,
92
+ updateChildProps,
93
+ }),
94
+ [scale, data, domain, updateChildProps],
95
+ );
96
+
97
+ return normalizedProps;
98
+ }
99
+
100
+ export function VictoryProvider({
101
+ children,
102
+ ...providerProps
103
+ }: VictoryProviderProps) {
104
+ const value = useNormalizedProps();
105
+
106
+ // TODO: sync the providerProps
78
107
 
79
108
  return (
80
109
  <VictoryContext.Provider value={value}>{children}</VictoryContext.Provider>
81
110
  );
82
111
  }
83
112
 
113
+ export function useVictoryContextMaybe<T>(
114
+ selector: (value: ContextType | null) => T,
115
+ ): T {
116
+ const context = useContext(VictoryContext);
117
+ return selector(context);
118
+ }
119
+
84
120
  export function useVictoryContext<T>(selector: (value: ContextType) => T): T {
85
121
  const context = useContext(VictoryContext);
86
122
  if (!context) {
@@ -102,15 +138,13 @@ export function useDomain() {
102
138
  }
103
139
 
104
140
  // This function keeps props in sync betwen the VictoryProvider and child components
105
- export function useVictoryProviderSync(
106
- id: string,
107
- props: VictoryCalculatedStateProps,
108
- ) {
109
- const setChildProps = useVictoryContext((value) => value.setChildProps);
141
+ export function useVictoryProviderSync(props: VictoryCalculatedStateProps) {
142
+ const updateChildProps = useVictoryContext((value) => value.updateChildProps);
143
+ const [myId] = React.useState(() =>
144
+ Symbol("UniqueIdFor(VictoryProviderChild)"),
145
+ );
110
146
 
111
147
  React.useEffect(() => {
112
- setChildProps(id, props);
113
- }, []);
114
-
115
- return props;
148
+ updateChildProps(myId, props);
149
+ }, [updateChildProps, props]);
116
150
  }
@@ -0,0 +1,53 @@
1
+ import * as React from "react";
2
+ import { useVictoryContextMaybe, VictoryProvider } from "./victory-provider";
3
+ import { VictoryCommonProps } from "../../victory-util/common-props";
4
+ import { Clone } from "../clone";
5
+ import { VictoryProviderProps } from "./types";
6
+
7
+ /* eslint-disable react/prop-types */
8
+
9
+ /**
10
+ * Ensures the component is wrapped by a VictoryProvider, if not already.
11
+ */
12
+ export function withVictoryProvider<
13
+ TComp extends React.FC<TProps>,
14
+ TProps extends React.PropsWithChildren<VictoryCommonProps>,
15
+ >(Comp: TComp): TComp {
16
+ const WithVictoryProvider = React.memo((props: TProps) => {
17
+ const updateChildProps = useVictoryContextMaybe(
18
+ (value) => value?.updateChildProps,
19
+ );
20
+ const hasParentProvider = !!updateChildProps;
21
+
22
+ React.useEffect(() => {
23
+ if (!hasParentProvider) return;
24
+
25
+ const id = Symbol("WithVictoryProvider");
26
+ updateChildProps(id, props as VictoryProviderProps);
27
+ // eslint-disable-next-line consistent-return
28
+ return () => updateChildProps(id, null);
29
+ });
30
+
31
+ // @ts-expect-error "TProps not assignable to LibraryManagedAttributes"
32
+ let result = <Comp {...props}>{props.children}</Comp>;
33
+
34
+ if (!hasParentProvider) {
35
+ // Wrap with a parent Provider:
36
+ result = (
37
+ <VictoryProvider>
38
+ <Clone element={props.containerComponent} {...props}>
39
+ {result}
40
+ </Clone>
41
+ </VictoryProvider>
42
+ );
43
+ }
44
+ return result;
45
+ });
46
+ const name = Comp.displayName || Comp.name;
47
+ WithVictoryProvider.displayName = name
48
+ ? `WithVictoryProvider(${name})`
49
+ : "WithVictoryProvider";
50
+
51
+ // @ts-expect-error "WithVictoryProvider does not overlap with TComp"
52
+ return WithVictoryProvider as TComp;
53
+ }
@@ -1,7 +1,7 @@
1
1
  import React from "react";
2
- import { VictoryProvider, VictoryProviderProps } from "../victory-state";
2
+ import { VictoryProvider, VictoryProviderProps } from "./victory-state";
3
3
  import { VictoryContainer } from "../victory-container/victory-container";
4
- import { VictoryCommonProps } from "./common-props";
4
+ import { VictoryCommonProps } from "../victory-util/common-props";
5
5
 
6
6
  const defaultProviderProps = {
7
7
  width: 450,
@@ -0,0 +1,43 @@
1
+ import { VictoryCommonProps } from "../victory-util/common-props";
2
+ import React from "react";
3
+ import {
4
+ useVictoryContext,
5
+ VictoryProviderProps,
6
+ withVictoryProvider,
7
+ } from "./victory-state";
8
+
9
+ type FC<TProps> = (props: TProps) => JSX.Element;
10
+
11
+ export function withNormalizedProps<
12
+ TProps extends React.PropsWithChildren<VictoryCommonProps>,
13
+ TDefaultPropKeys extends keyof TProps,
14
+ >(
15
+ config: {
16
+ displayName: string;
17
+ propTypes?: React.WeakValidationMap<Omit<TProps, keyof VictoryCommonProps>>;
18
+ defaultProps: Pick<TProps, TDefaultPropKeys>;
19
+ /** @deprecated */
20
+ initialProviderProps?: Partial<VictoryProviderProps>;
21
+ },
22
+ WrappedComponent: React.FC<TProps>,
23
+ ) {
24
+ WrappedComponent.displayName = config.displayName;
25
+ const WithNormalizedProps: FC<TProps> = withVictoryProvider<
26
+ FC<TProps>,
27
+ TProps
28
+ >((props: TProps) => {
29
+ const normalizedProps = useVictoryContext((v) => v);
30
+
31
+ return (
32
+ <WrappedComponent {...props} {...normalizedProps}>
33
+ {props.children}
34
+ </WrappedComponent>
35
+ );
36
+ });
37
+
38
+ return Object.assign(WithNormalizedProps, {
39
+ displayName: `WithNormalizedProps(${config.displayName}`,
40
+ defaultProps: config.defaultProps,
41
+ propTypes: config.propTypes,
42
+ });
43
+ }
@@ -33,7 +33,7 @@ function parseDatum(datum) {
33
33
  : datum;
34
34
  }
35
35
 
36
- function getLength(data) {
36
+ function getLength(data: unknown[]) {
37
37
  return Immutable.isIterable(data) ? data.size : data.length;
38
38
  }
39
39