insights-sdk 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.
- package/dist/components/Insights.d.ts +14 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.esm.js +103 -0
- package/dist/index.esm.js.map +1 -0
- package/dist/index.js +123 -0
- package/dist/index.js.map +1 -0
- package/package.json +37 -0
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
type InsightType = "trend" | "contributor";
|
|
3
|
+
type TimeGrain = "daily" | "weekly" | "monthly";
|
|
4
|
+
interface InsightProps {
|
|
5
|
+
type: InsightType;
|
|
6
|
+
metric: string;
|
|
7
|
+
dimension?: string;
|
|
8
|
+
timeGrain: TimeGrain;
|
|
9
|
+
timeRange: number;
|
|
10
|
+
dataResolver: (metric: string, grain: TimeGrain, fromTime: Date, toTime: Date) => Promise<any[]>;
|
|
11
|
+
dimensionValuesResolver?: (metric: string, dimension: string) => Promise<string[]>;
|
|
12
|
+
}
|
|
13
|
+
declare const Insight: ({ type, metric, dimension, timeGrain, timeRange, dataResolver, dimensionValuesResolver }: InsightProps) => React.JSX.Element;
|
|
14
|
+
export default Insight;
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { default as Insight } from './components/Insights';
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
import { useState, useEffect } from 'react';
|
|
3
|
+
|
|
4
|
+
// Resolver output
|
|
5
|
+
// [
|
|
6
|
+
// { "fromtime": "01-01-2025", "totime": "07-01-2025", "Revenue": 123 },
|
|
7
|
+
// { "fromtime": "08-01-2025", "totime": "14-01-2025", "Revenue": 235 },
|
|
8
|
+
// ...
|
|
9
|
+
// ]
|
|
10
|
+
//geneerate data fro this
|
|
11
|
+
const Insight = ({ type, metric, dimension, timeGrain, timeRange, dataResolver, dimensionValuesResolver }) => {
|
|
12
|
+
const [data, setData] = useState([]); //populate this based on the metric revenue or anything and timeLine is important
|
|
13
|
+
const [loading, setLoading] = useState(false);
|
|
14
|
+
const [error, setError] = useState(null);
|
|
15
|
+
const [dimensionValues, setDimensionValues] = useState([]);
|
|
16
|
+
//helper functions
|
|
17
|
+
//dimension - India,NZ and all
|
|
18
|
+
//timeRange -
|
|
19
|
+
//metric -
|
|
20
|
+
//grain - weekly ,
|
|
21
|
+
//should generate based on this
|
|
22
|
+
//then call dataResolcver
|
|
23
|
+
// dataResolver -> // {
|
|
24
|
+
// "fromtime": "01-01-2025",
|
|
25
|
+
// "totime": "01-02-2025",
|
|
26
|
+
// "metric": "Revenue",
|
|
27
|
+
// "grain": "weekly",
|
|
28
|
+
// "type": "Trend"
|
|
29
|
+
// }
|
|
30
|
+
const dateRangeCalculator = () => {
|
|
31
|
+
const toTime = new Date();
|
|
32
|
+
const fromTime = new Date();
|
|
33
|
+
//they give 30 days lets say
|
|
34
|
+
// fromDate(toDate - timeRange);
|
|
35
|
+
fromTime.setDate(toTime.getDate() - timeRange);
|
|
36
|
+
return { toTime, fromTime };
|
|
37
|
+
};
|
|
38
|
+
useEffect(() => {
|
|
39
|
+
const fetchData = async () => {
|
|
40
|
+
setLoading(true);
|
|
41
|
+
setError(null);
|
|
42
|
+
try {
|
|
43
|
+
const { toTime, fromTime } = dateRangeCalculator();
|
|
44
|
+
if (type === "contributor" && !dimension) {
|
|
45
|
+
setError("Dimension is required for contributor insight");
|
|
46
|
+
setLoading(false);
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
if (type == 'contributor' && dimensionValuesResolver && dimension) {
|
|
50
|
+
const dim = await dimensionValuesResolver(metric, dimension);
|
|
51
|
+
setDimensionValues(dim);
|
|
52
|
+
}
|
|
53
|
+
const result = await dataResolver(metric, timeGrain, fromTime, toTime);
|
|
54
|
+
setData(result);
|
|
55
|
+
}
|
|
56
|
+
catch (error) {
|
|
57
|
+
if (error instanceof Error) {
|
|
58
|
+
setError(error.message);
|
|
59
|
+
}
|
|
60
|
+
else {
|
|
61
|
+
setError("Failed to load data!");
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
finally {
|
|
65
|
+
setLoading(false);
|
|
66
|
+
}
|
|
67
|
+
};
|
|
68
|
+
fetchData();
|
|
69
|
+
}, [type, metric, dimension, timeGrain, timeRange, dataResolver, dimensionValuesResolver]);
|
|
70
|
+
if (loading) {
|
|
71
|
+
return (React.createElement("div", { style: { padding: '20px', textAlign: 'center' } },
|
|
72
|
+
React.createElement("p", null,
|
|
73
|
+
"Loading ",
|
|
74
|
+
metric,
|
|
75
|
+
" data...")));
|
|
76
|
+
}
|
|
77
|
+
if (error) {
|
|
78
|
+
return (React.createElement("div", { style: { padding: '20px', textAlign: 'center', color: 'red' } },
|
|
79
|
+
React.createElement("p", null,
|
|
80
|
+
"Error: ",
|
|
81
|
+
error)));
|
|
82
|
+
}
|
|
83
|
+
if (data.length === 0) {
|
|
84
|
+
return (React.createElement("div", { style: { padding: '20px', textAlign: 'center' } },
|
|
85
|
+
React.createElement("p", null, "No data available")));
|
|
86
|
+
}
|
|
87
|
+
return (React.createElement("div", { style: { padding: '20px' } },
|
|
88
|
+
React.createElement("h3", null,
|
|
89
|
+
metric,
|
|
90
|
+
" - ",
|
|
91
|
+
type,
|
|
92
|
+
" (",
|
|
93
|
+
timeGrain,
|
|
94
|
+
")"),
|
|
95
|
+
React.createElement("pre", { style: { background: '#f4f4f4', padding: '10px' } }, JSON.stringify(data, null, 2)),
|
|
96
|
+
dimensionValues.length > 0 && (React.createElement("div", null,
|
|
97
|
+
React.createElement("p", null,
|
|
98
|
+
"Dimensions: ",
|
|
99
|
+
dimensionValues.join(', '))))));
|
|
100
|
+
};
|
|
101
|
+
|
|
102
|
+
export { Insight };
|
|
103
|
+
//# sourceMappingURL=index.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.esm.js","sources":["../src/components/Insights.tsx"],"sourcesContent":["import * as React from \"react\"; \r\nimport { useEffect, useState } from 'react'; \r\n\r\n\r\ntype InsightType = \"trend\" | \"contributor\";\r\ntype TimeGrain = \"daily\" | \"weekly\" | \"monthly\";\r\n\r\ninterface InsightProps {\r\n type: InsightType;\r\n metric: string;\r\n dimension?: string;\r\n timeGrain: TimeGrain;\r\n timeRange: number; \r\n dataResolver: (\r\n metric: string,\r\n grain: TimeGrain,\r\n fromTime: Date,\r\n toTime: Date\r\n ) => Promise<any[]>;\r\n dimensionValuesResolver?: (\r\n metric: string,\r\n dimension: string\r\n ) => Promise<string[]>;\r\n}\r\n\r\n// Resolver output\r\n// [\r\n// { \"fromtime\": \"01-01-2025\", \"totime\": \"07-01-2025\", \"Revenue\": 123 },\r\n// { \"fromtime\": \"08-01-2025\", \"totime\": \"14-01-2025\", \"Revenue\": 235 },\r\n// ...\r\n// ]\r\n //geneerate data fro this\r\n\r\n\r\nconst Insight = ({type,\r\n metric, \r\n dimension, \r\n timeGrain, \r\n timeRange,\r\n dataResolver,\r\n dimensionValuesResolver} :InsightProps) => {\r\n\r\n\r\n const [data,setData] = useState<any[]>([]); //populate this based on the metric revenue or anything and timeLine is important \r\n const [loading , setLoading] = useState<boolean>(false); \r\n const [error , setError] = useState<string|null>(null); \r\n const [dimensionValues, setDimensionValues] = useState<string[]>([]);\r\n\r\n //helper functions\r\n\r\n\r\n //dimension - India,NZ and all \r\n //timeRange - \r\n //metric - \r\n //grain - weekly , \r\n //should generate based on this \r\n //then call dataResolcver\r\n\r\n // dataResolver -> // {\r\n// \"fromtime\": \"01-01-2025\",\r\n// \"totime\": \"01-02-2025\",\r\n// \"metric\": \"Revenue\",\r\n// \"grain\": \"weekly\",\r\n// \"type\": \"Trend\"\r\n// }\r\n\r\n const dateRangeCalculator = () => {\r\n const toTime= new Date(); \r\n const fromTime = new Date(); \r\n //they give 30 days lets say \r\n // fromDate(toDate - timeRange); \r\n fromTime.setDate(toTime.getDate() - timeRange); \r\n\r\n return {toTime,fromTime}; \r\n }\r\n\r\n \r\n\r\n useEffect(() => {\r\n const fetchData = async () => {\r\n setLoading(true); \r\n setError(null); \r\n try {\r\n const {toTime, fromTime} = dateRangeCalculator(); \r\n if (type === \"contributor\" && !dimension) {\r\n setError(\"Dimension is required for contributor insight\");\r\n setLoading(false);\r\n return;\r\n }\r\n if(type == 'contributor' && dimensionValuesResolver && dimension){\r\n const dim = await dimensionValuesResolver(metric,dimension); \r\n setDimensionValues(dim); \r\n }\r\n const result = await dataResolver(metric, timeGrain, fromTime, toTime);\r\n setData(result);\r\n } catch (error) {\r\n if (error instanceof Error) {\r\n setError(error.message);\r\n } else {\r\n setError(\"Failed to load data!\");\r\n }\r\n } finally {\r\n setLoading(false);\r\n }\r\n }\r\n fetchData(); \r\n },[type, metric, dimension, timeGrain, timeRange, dataResolver, dimensionValuesResolver]);\r\n\r\n\r\n if (loading) {\r\n return (\r\n <div style={{ padding: '20px', textAlign: 'center' }}>\r\n <p>Loading {metric} data...</p>\r\n </div>\r\n );\r\n }\r\n\r\n if (error) {\r\n return (\r\n <div style={{ padding: '20px', textAlign: 'center', color: 'red' }}>\r\n <p>Error: {error}</p>\r\n </div>\r\n );\r\n }\r\n if (data.length === 0) {\r\n return (\r\n <div style={{ padding: '20px', textAlign: 'center' }}>\r\n <p>No data available</p>\r\n </div>\r\n );\r\n }\r\nreturn (\r\n <div style={{ padding: '20px' }}>\r\n <h3>{metric} - {type} ({timeGrain})</h3>\r\n <pre style={{ background: '#f4f4f4', padding: '10px' }}>\r\n {JSON.stringify(data, null, 2)}\r\n </pre>\r\n {dimensionValues.length > 0 && (\r\n <div>\r\n <p>Dimensions: {dimensionValues.join(', ')}</p>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\n\r\nexport default Insight; "],"names":[],"mappings":"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"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var React = require('react');
|
|
4
|
+
|
|
5
|
+
function _interopNamespaceDefault(e) {
|
|
6
|
+
var n = Object.create(null);
|
|
7
|
+
if (e) {
|
|
8
|
+
Object.keys(e).forEach(function (k) {
|
|
9
|
+
if (k !== 'default') {
|
|
10
|
+
var d = Object.getOwnPropertyDescriptor(e, k);
|
|
11
|
+
Object.defineProperty(n, k, d.get ? d : {
|
|
12
|
+
enumerable: true,
|
|
13
|
+
get: function () { return e[k]; }
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
n.default = e;
|
|
19
|
+
return Object.freeze(n);
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
var React__namespace = /*#__PURE__*/_interopNamespaceDefault(React);
|
|
23
|
+
|
|
24
|
+
// Resolver output
|
|
25
|
+
// [
|
|
26
|
+
// { "fromtime": "01-01-2025", "totime": "07-01-2025", "Revenue": 123 },
|
|
27
|
+
// { "fromtime": "08-01-2025", "totime": "14-01-2025", "Revenue": 235 },
|
|
28
|
+
// ...
|
|
29
|
+
// ]
|
|
30
|
+
//geneerate data fro this
|
|
31
|
+
const Insight = ({ type, metric, dimension, timeGrain, timeRange, dataResolver, dimensionValuesResolver }) => {
|
|
32
|
+
const [data, setData] = React.useState([]); //populate this based on the metric revenue or anything and timeLine is important
|
|
33
|
+
const [loading, setLoading] = React.useState(false);
|
|
34
|
+
const [error, setError] = React.useState(null);
|
|
35
|
+
const [dimensionValues, setDimensionValues] = React.useState([]);
|
|
36
|
+
//helper functions
|
|
37
|
+
//dimension - India,NZ and all
|
|
38
|
+
//timeRange -
|
|
39
|
+
//metric -
|
|
40
|
+
//grain - weekly ,
|
|
41
|
+
//should generate based on this
|
|
42
|
+
//then call dataResolcver
|
|
43
|
+
// dataResolver -> // {
|
|
44
|
+
// "fromtime": "01-01-2025",
|
|
45
|
+
// "totime": "01-02-2025",
|
|
46
|
+
// "metric": "Revenue",
|
|
47
|
+
// "grain": "weekly",
|
|
48
|
+
// "type": "Trend"
|
|
49
|
+
// }
|
|
50
|
+
const dateRangeCalculator = () => {
|
|
51
|
+
const toTime = new Date();
|
|
52
|
+
const fromTime = new Date();
|
|
53
|
+
//they give 30 days lets say
|
|
54
|
+
// fromDate(toDate - timeRange);
|
|
55
|
+
fromTime.setDate(toTime.getDate() - timeRange);
|
|
56
|
+
return { toTime, fromTime };
|
|
57
|
+
};
|
|
58
|
+
React.useEffect(() => {
|
|
59
|
+
const fetchData = async () => {
|
|
60
|
+
setLoading(true);
|
|
61
|
+
setError(null);
|
|
62
|
+
try {
|
|
63
|
+
const { toTime, fromTime } = dateRangeCalculator();
|
|
64
|
+
if (type === "contributor" && !dimension) {
|
|
65
|
+
setError("Dimension is required for contributor insight");
|
|
66
|
+
setLoading(false);
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
if (type == 'contributor' && dimensionValuesResolver && dimension) {
|
|
70
|
+
const dim = await dimensionValuesResolver(metric, dimension);
|
|
71
|
+
setDimensionValues(dim);
|
|
72
|
+
}
|
|
73
|
+
const result = await dataResolver(metric, timeGrain, fromTime, toTime);
|
|
74
|
+
setData(result);
|
|
75
|
+
}
|
|
76
|
+
catch (error) {
|
|
77
|
+
if (error instanceof Error) {
|
|
78
|
+
setError(error.message);
|
|
79
|
+
}
|
|
80
|
+
else {
|
|
81
|
+
setError("Failed to load data!");
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
finally {
|
|
85
|
+
setLoading(false);
|
|
86
|
+
}
|
|
87
|
+
};
|
|
88
|
+
fetchData();
|
|
89
|
+
}, [type, metric, dimension, timeGrain, timeRange, dataResolver, dimensionValuesResolver]);
|
|
90
|
+
if (loading) {
|
|
91
|
+
return (React__namespace.createElement("div", { style: { padding: '20px', textAlign: 'center' } },
|
|
92
|
+
React__namespace.createElement("p", null,
|
|
93
|
+
"Loading ",
|
|
94
|
+
metric,
|
|
95
|
+
" data...")));
|
|
96
|
+
}
|
|
97
|
+
if (error) {
|
|
98
|
+
return (React__namespace.createElement("div", { style: { padding: '20px', textAlign: 'center', color: 'red' } },
|
|
99
|
+
React__namespace.createElement("p", null,
|
|
100
|
+
"Error: ",
|
|
101
|
+
error)));
|
|
102
|
+
}
|
|
103
|
+
if (data.length === 0) {
|
|
104
|
+
return (React__namespace.createElement("div", { style: { padding: '20px', textAlign: 'center' } },
|
|
105
|
+
React__namespace.createElement("p", null, "No data available")));
|
|
106
|
+
}
|
|
107
|
+
return (React__namespace.createElement("div", { style: { padding: '20px' } },
|
|
108
|
+
React__namespace.createElement("h3", null,
|
|
109
|
+
metric,
|
|
110
|
+
" - ",
|
|
111
|
+
type,
|
|
112
|
+
" (",
|
|
113
|
+
timeGrain,
|
|
114
|
+
")"),
|
|
115
|
+
React__namespace.createElement("pre", { style: { background: '#f4f4f4', padding: '10px' } }, JSON.stringify(data, null, 2)),
|
|
116
|
+
dimensionValues.length > 0 && (React__namespace.createElement("div", null,
|
|
117
|
+
React__namespace.createElement("p", null,
|
|
118
|
+
"Dimensions: ",
|
|
119
|
+
dimensionValues.join(', '))))));
|
|
120
|
+
};
|
|
121
|
+
|
|
122
|
+
exports.Insight = Insight;
|
|
123
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/components/Insights.tsx"],"sourcesContent":["import * as React from \"react\"; \r\nimport { useEffect, useState } from 'react'; \r\n\r\n\r\ntype InsightType = \"trend\" | \"contributor\";\r\ntype TimeGrain = \"daily\" | \"weekly\" | \"monthly\";\r\n\r\ninterface InsightProps {\r\n type: InsightType;\r\n metric: string;\r\n dimension?: string;\r\n timeGrain: TimeGrain;\r\n timeRange: number; \r\n dataResolver: (\r\n metric: string,\r\n grain: TimeGrain,\r\n fromTime: Date,\r\n toTime: Date\r\n ) => Promise<any[]>;\r\n dimensionValuesResolver?: (\r\n metric: string,\r\n dimension: string\r\n ) => Promise<string[]>;\r\n}\r\n\r\n// Resolver output\r\n// [\r\n// { \"fromtime\": \"01-01-2025\", \"totime\": \"07-01-2025\", \"Revenue\": 123 },\r\n// { \"fromtime\": \"08-01-2025\", \"totime\": \"14-01-2025\", \"Revenue\": 235 },\r\n// ...\r\n// ]\r\n //geneerate data fro this\r\n\r\n\r\nconst Insight = ({type,\r\n metric, \r\n dimension, \r\n timeGrain, \r\n timeRange,\r\n dataResolver,\r\n dimensionValuesResolver} :InsightProps) => {\r\n\r\n\r\n const [data,setData] = useState<any[]>([]); //populate this based on the metric revenue or anything and timeLine is important \r\n const [loading , setLoading] = useState<boolean>(false); \r\n const [error , setError] = useState<string|null>(null); \r\n const [dimensionValues, setDimensionValues] = useState<string[]>([]);\r\n\r\n //helper functions\r\n\r\n\r\n //dimension - India,NZ and all \r\n //timeRange - \r\n //metric - \r\n //grain - weekly , \r\n //should generate based on this \r\n //then call dataResolcver\r\n\r\n // dataResolver -> // {\r\n// \"fromtime\": \"01-01-2025\",\r\n// \"totime\": \"01-02-2025\",\r\n// \"metric\": \"Revenue\",\r\n// \"grain\": \"weekly\",\r\n// \"type\": \"Trend\"\r\n// }\r\n\r\n const dateRangeCalculator = () => {\r\n const toTime= new Date(); \r\n const fromTime = new Date(); \r\n //they give 30 days lets say \r\n // fromDate(toDate - timeRange); \r\n fromTime.setDate(toTime.getDate() - timeRange); \r\n\r\n return {toTime,fromTime}; \r\n }\r\n\r\n \r\n\r\n useEffect(() => {\r\n const fetchData = async () => {\r\n setLoading(true); \r\n setError(null); \r\n try {\r\n const {toTime, fromTime} = dateRangeCalculator(); \r\n if (type === \"contributor\" && !dimension) {\r\n setError(\"Dimension is required for contributor insight\");\r\n setLoading(false);\r\n return;\r\n }\r\n if(type == 'contributor' && dimensionValuesResolver && dimension){\r\n const dim = await dimensionValuesResolver(metric,dimension); \r\n setDimensionValues(dim); \r\n }\r\n const result = await dataResolver(metric, timeGrain, fromTime, toTime);\r\n setData(result);\r\n } catch (error) {\r\n if (error instanceof Error) {\r\n setError(error.message);\r\n } else {\r\n setError(\"Failed to load data!\");\r\n }\r\n } finally {\r\n setLoading(false);\r\n }\r\n }\r\n fetchData(); \r\n },[type, metric, dimension, timeGrain, timeRange, dataResolver, dimensionValuesResolver]);\r\n\r\n\r\n if (loading) {\r\n return (\r\n <div style={{ padding: '20px', textAlign: 'center' }}>\r\n <p>Loading {metric} data...</p>\r\n </div>\r\n );\r\n }\r\n\r\n if (error) {\r\n return (\r\n <div style={{ padding: '20px', textAlign: 'center', color: 'red' }}>\r\n <p>Error: {error}</p>\r\n </div>\r\n );\r\n }\r\n if (data.length === 0) {\r\n return (\r\n <div style={{ padding: '20px', textAlign: 'center' }}>\r\n <p>No data available</p>\r\n </div>\r\n );\r\n }\r\nreturn (\r\n <div style={{ padding: '20px' }}>\r\n <h3>{metric} - {type} ({timeGrain})</h3>\r\n <pre style={{ background: '#f4f4f4', padding: '10px' }}>\r\n {JSON.stringify(data, null, 2)}\r\n </pre>\r\n {dimensionValues.length > 0 && (\r\n <div>\r\n <p>Dimensions: {dimensionValues.join(', ')}</p>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\n\r\nexport default Insight; "],"names":["useState","useEffect","React"],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "insights-sdk",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "React SDK for rendering insights",
|
|
5
|
+
"main": "dist/index.js",
|
|
6
|
+
"module": "dist/index.esm.js",
|
|
7
|
+
"types": "dist/index.d.ts",
|
|
8
|
+
"type": "module",
|
|
9
|
+
"files": [
|
|
10
|
+
"dist"
|
|
11
|
+
],
|
|
12
|
+
"scripts": {
|
|
13
|
+
"build": "rollup -c"
|
|
14
|
+
},
|
|
15
|
+
"keywords": ["react", "insights", "sdk"],
|
|
16
|
+
"author": "",
|
|
17
|
+
"license": "ISC",
|
|
18
|
+
"peerDependencies": {
|
|
19
|
+
"react": "^18.0.0 || ^19.0.0",
|
|
20
|
+
"react-dom": "^18.0.0 || ^19.0.0"
|
|
21
|
+
},
|
|
22
|
+
"dependencies": {
|
|
23
|
+
"recharts": "^2.5.0"
|
|
24
|
+
},
|
|
25
|
+
"devDependencies": {
|
|
26
|
+
"@rollup/plugin-commonjs": "^29.0.0",
|
|
27
|
+
"@rollup/plugin-node-resolve": "^16.0.3",
|
|
28
|
+
"@rollup/plugin-typescript": "^12.3.0",
|
|
29
|
+
"@types/react": "^19.2.8",
|
|
30
|
+
"react": "^19.2.3",
|
|
31
|
+
"react-dom": "^19.2.3",
|
|
32
|
+
"rollup": "^4.55.1",
|
|
33
|
+
"rollup-plugin-peer-deps-external": "^2.2.4",
|
|
34
|
+
"tslib": "^2.8.1",
|
|
35
|
+
"typescript": "^5.0.0"
|
|
36
|
+
}
|
|
37
|
+
}
|