@isoftdata/utility-dashboard-backend 3.3.0 → 3.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,201 +1,201 @@
1
- # utility-dashboard-backend
2
-
3
- A backend utility for formatting and loading dashboard chart and report data to be usable by the [frontend dashboard component](https://github.com/ISoft-Data-Systems/ractive-component-web-dashboard).
4
-
5
- ## Installation
6
-
7
- ```bash
8
- npm i @isoftdata/utility-dashboard-backend
9
- ```
10
-
11
- > Breaking change in version 3: ESM style exports
12
-
13
- ## Prerequisites
14
- >
15
- > Version 3.Y.Z of the frontend component is required for use with version 2.Y.Z of the backend component.
16
-
17
- * A MySQL database schema as outlined in [schema.md](schema.md)
18
- * A backend that can fetches rows from the chart, report, and report chart tables from the database with their primary keys. Any json columns should be parsed as objects.
19
- * A connection or pool of connections from the `mysql` NPM module for running the charts' queries
20
- * The [dashboard Ractive component](https://github.com/ISoft-Data-Systems/ractive-component-web-dashboard) on the client
21
-
22
- ## API
23
-
24
- ### formatReportMetadata
25
-
26
- This function returns data in the format expected for the `loadReportMetadata` function on the dashboard client component.
27
-
28
- #### Function signature
29
-
30
- ```js
31
- async formatReportMetadata(mysqlConnection, { report, chartsInReport, session })
32
- ```
33
-
34
- #### Example Usage (From Pro Web `server/chart-loader.js`)
35
-
36
- ```js
37
- async function loadReportMetadata({ dashboardReportId, chartId, session }) {
38
- const report = await db.dashboardReport.loadById({ dashboardReportId }) // gets a report by its id
39
- const chartsInReport = await db.dashboardChart.loadByReport({ dashboardReportId, chartId }) // gets all charts for a specified report, or if `chartId` is specified, only gets that chart for that report.
40
- return await formatReportMetadata(db.pool, { report, chartsInReport, session })
41
- }
42
- ```
43
-
44
- #### mysqlConnection
45
-
46
- A connection or pool of connections from the `mysql` npm module.
47
-
48
- #### report
49
-
50
- A report `object`, a single row from the `dashboard_report`/`wa_dashboard_report` table/view. The `parameters` Array from the `json` column should also be parsed from JSON and appended to this object.
51
-
52
- Example:
53
-
54
- ```js
55
- {
56
- dashboardReportId: 1,
57
- reportName: 'report_overview',
58
- reportTitle: 'Overview',
59
- shareType: 'everyone',
60
- shareId: null,
61
- ownerId: null,
62
- parameters: [ // parameters deconstructed from `json` column after parsing
63
- {
64
- name: 'date_range',
65
- type: 'dateRange',
66
- title: 'Date Range',
67
- default: 'This Year'
68
- }
69
- ]
70
- }
71
- ```
72
-
73
- #### chartsInReport
74
-
75
- An `Array` of chart `object`s, one for each chart in the report, multiple rows from the `dashboard_chart`/`wa_dashboard_chart` table/view joined with `dashboard_report_chart`/`wa_dashboard_report_chart` to get the chart's rank.
76
-
77
- Example:
78
-
79
- ```js
80
- [
81
- {
82
- chartId: 10,
83
- name: 'line_sales_over_time_and_previous_period',
84
- title: 'Sales over Time',
85
- supertype: 'google',
86
- formatting: { Sales: [Object] },
87
- multiSeries: {
88
- value: 'Sales',
89
- series: 'Period',
90
- tooltip: 'Tooltip',
91
- groupXAxisBy: 'Date'
92
- },
93
- chartWrapper: { options: [Object], chartType: 'LineChart' },
94
- rank: 1
95
- },
96
- {
97
- chartId: 16,
98
- name: 'map_sales_by_lat_long',
99
- title: 'Sales Map',
100
- supertype: 'google',
101
- formatting: { Sales: [Object] },
102
- chartWrapper: { options: [Object], chartType: 'GeoChart' },
103
- rank: 2
104
- }
105
- ]
106
- ```
107
-
108
- #### session
109
-
110
- Session object from the Auth Module
111
-
112
- #### site (optional)
113
-
114
- The 'type' of site for the product this is used in. Determines the MySQL table to query for site selection parameters, and used to calculate `siteIdColumn` if that is not specified.
115
-
116
- #### siteIdColumn (optional)
117
-
118
- The name of the column that stores the site id in the site table. Defaults to `${site}id`.
119
-
120
- #### siteNameColumn (optional)
121
-
122
- The store name column.
123
-
124
- ### formatChartDataForReport
125
-
126
- This function returns data in the format expected for the `loadChartDataForReport` function on the dashboard client component, including applying any report-specific chart options overrides and running the chart's query.
127
-
128
- #### Function signature
129
-
130
- ```js
131
- async formatChartDataForReport(mysqlConnection, { reportParameters, chart, reportChart, parameterSelectionList, session })
132
- ```
133
-
134
- #### Example usage: (from Pro Web `server/chart-loader.js`)
135
-
136
- ```js
137
- async function loadChartDataForReport ({ dashboardReportId, chartId, parameterSelectionList, session }) {
138
- const report = await db.dashboardReport.loadById({ dashboardReportId }) // get the report object
139
- const chart = await db.dashboardChart.loadById({ chartId }) // get the chart object
140
- const reportChart = await db.dashboardReportChart.loadByReportAndChartId({ chartId, dashboardReportId }) // get the report chart for the rank/overrides
141
- try {
142
- const chartData = await formatChartDataForReport(db.pool, { reportParameters: report.parameters, chart, reportChart, parameterSelectionList, session })
143
- return chartData
144
- } catch (err) {
145
- console.error(err)
146
- return { isErrored: true }
147
- }
148
- }
149
- ```
150
-
151
- #### mysqlConnection
152
-
153
- A connection or pool of connections from the `mysql` npm module.
154
-
155
- #### reportParameters
156
-
157
- The `parameters` array from a report object.
158
-
159
- #### chartId
160
-
161
- The id of a chart row in `wa_dashboard_chart`.
162
-
163
- #### parameterSelectionList
164
-
165
- The array of selected parameters sent from the client dashboard.
166
-
167
- #### session
168
-
169
- Session object from the Auth Module
170
-
171
- ### loadOutputParameterValues
172
-
173
- This function outputs the report's parameter values in the format expected by the dashboard client and backend. When sending to the client, including `forClient: true` will not include the properties only needed by the backend.
174
-
175
- ### Function signature
176
-
177
- ```js
178
- async function loadOutputParameterValues(mysqlConnection, { definitionList, selectionList = [], forClient = false })
179
- ```
180
-
181
- #### Example Usage
182
-
183
- #### mysqlConnection
184
-
185
- A connection or pool of connections from the `mysql` npm module.
186
-
187
- #### definitionList
188
-
189
- The `parameters` property from the `json` column of a row in the `dashboard_report` table.
190
-
191
- #### selectionList
192
-
193
- An array of objects representing the selected parameters sent from the client. Only needed when loading the chart data, not when loading the report "metadata". Each parameter object should match the format specified in [schema.md](schema.md).
194
-
195
- #### forClient
196
-
197
- If this value is truthy, parameters' `queryValues` properties will be excluded, as the client does not need them.
198
-
199
- ### Returns
200
-
201
- An array of objects matching the format outlined in [schema.md](schema.md)
1
+ # utility-dashboard-backend
2
+
3
+ A backend utility for formatting and loading dashboard chart and report data to be usable by the [frontend dashboard component](https://github.com/ISoft-Data-Systems/ractive-component-web-dashboard).
4
+
5
+ ## Installation
6
+
7
+ ```bash
8
+ npm i @isoftdata/utility-dashboard-backend
9
+ ```
10
+
11
+ > Breaking change in version 3: ESM style exports
12
+
13
+ ## Prerequisites
14
+ >
15
+ > Version 3.Y.Z of the frontend component is required for use with version 2.Y.Z of the backend component.
16
+
17
+ * A MySQL database schema as outlined in [schema.md](schema.md)
18
+ * A backend that can fetches rows from the chart, report, and report chart tables from the database with their primary keys. Any json columns should be parsed as objects.
19
+ * A connection or pool of connections from the `mysql` NPM module for running the charts' queries
20
+ * The [dashboard Ractive component](https://github.com/ISoft-Data-Systems/ractive-component-web-dashboard) on the client
21
+
22
+ ## API
23
+
24
+ ### formatReportMetadata
25
+
26
+ This function returns data in the format expected for the `loadReportMetadata` function on the dashboard client component.
27
+
28
+ #### Function signature
29
+
30
+ ```js
31
+ async formatReportMetadata(mysqlConnection, { report, chartsInReport, session })
32
+ ```
33
+
34
+ #### Example Usage (From Pro Web `server/chart-loader.js`)
35
+
36
+ ```js
37
+ async function loadReportMetadata({ dashboardReportId, chartId, session }) {
38
+ const report = await db.dashboardReport.loadById({ dashboardReportId }) // gets a report by its id
39
+ const chartsInReport = await db.dashboardChart.loadByReport({ dashboardReportId, chartId }) // gets all charts for a specified report, or if `chartId` is specified, only gets that chart for that report.
40
+ return await formatReportMetadata(db.pool, { report, chartsInReport, session })
41
+ }
42
+ ```
43
+
44
+ #### mysqlConnection
45
+
46
+ A connection or pool of connections from the `mysql` npm module.
47
+
48
+ #### report
49
+
50
+ A report `object`, a single row from the `dashboard_report`/`wa_dashboard_report` table/view. The `parameters` Array from the `json` column should also be parsed from JSON and appended to this object.
51
+
52
+ Example:
53
+
54
+ ```js
55
+ {
56
+ dashboardReportId: 1,
57
+ reportName: 'report_overview',
58
+ reportTitle: 'Overview',
59
+ shareType: 'everyone',
60
+ shareId: null,
61
+ ownerId: null,
62
+ parameters: [ // parameters deconstructed from `json` column after parsing
63
+ {
64
+ name: 'date_range',
65
+ type: 'dateRange',
66
+ title: 'Date Range',
67
+ default: 'This Year'
68
+ }
69
+ ]
70
+ }
71
+ ```
72
+
73
+ #### chartsInReport
74
+
75
+ An `Array` of chart `object`s, one for each chart in the report, multiple rows from the `dashboard_chart`/`wa_dashboard_chart` table/view joined with `dashboard_report_chart`/`wa_dashboard_report_chart` to get the chart's rank.
76
+
77
+ Example:
78
+
79
+ ```js
80
+ [
81
+ {
82
+ chartId: 10,
83
+ name: 'line_sales_over_time_and_previous_period',
84
+ title: 'Sales over Time',
85
+ supertype: 'google',
86
+ formatting: { Sales: [Object] },
87
+ multiSeries: {
88
+ value: 'Sales',
89
+ series: 'Period',
90
+ tooltip: 'Tooltip',
91
+ groupXAxisBy: 'Date'
92
+ },
93
+ chartWrapper: { options: [Object], chartType: 'LineChart' },
94
+ rank: 1
95
+ },
96
+ {
97
+ chartId: 16,
98
+ name: 'map_sales_by_lat_long',
99
+ title: 'Sales Map',
100
+ supertype: 'google',
101
+ formatting: { Sales: [Object] },
102
+ chartWrapper: { options: [Object], chartType: 'GeoChart' },
103
+ rank: 2
104
+ }
105
+ ]
106
+ ```
107
+
108
+ #### session
109
+
110
+ Session object from the Auth Module
111
+
112
+ #### site (optional)
113
+
114
+ The 'type' of site for the product this is used in. Determines the MySQL table to query for site selection parameters, and used to calculate `siteIdColumn` if that is not specified.
115
+
116
+ #### siteIdColumn (optional)
117
+
118
+ The name of the column that stores the site id in the site table. Defaults to `${site}id`.
119
+
120
+ #### siteNameColumn (optional)
121
+
122
+ The store name column.
123
+
124
+ ### formatChartDataForReport
125
+
126
+ This function returns data in the format expected for the `loadChartDataForReport` function on the dashboard client component, including applying any report-specific chart options overrides and running the chart's query.
127
+
128
+ #### Function signature
129
+
130
+ ```js
131
+ async formatChartDataForReport(mysqlConnection, { reportParameters, chart, reportChart, parameterSelectionList, session })
132
+ ```
133
+
134
+ #### Example usage: (from Pro Web `server/chart-loader.js`)
135
+
136
+ ```js
137
+ async function loadChartDataForReport ({ dashboardReportId, chartId, parameterSelectionList, session }) {
138
+ const report = await db.dashboardReport.loadById({ dashboardReportId }) // get the report object
139
+ const chart = await db.dashboardChart.loadById({ chartId }) // get the chart object
140
+ const reportChart = await db.dashboardReportChart.loadByReportAndChartId({ chartId, dashboardReportId }) // get the report chart for the rank/overrides
141
+ try {
142
+ const chartData = await formatChartDataForReport(db.pool, { reportParameters: report.parameters, chart, reportChart, parameterSelectionList, session })
143
+ return chartData
144
+ } catch (err) {
145
+ console.error(err)
146
+ return { isErrored: true }
147
+ }
148
+ }
149
+ ```
150
+
151
+ #### mysqlConnection
152
+
153
+ A connection or pool of connections from the `mysql` npm module.
154
+
155
+ #### reportParameters
156
+
157
+ The `parameters` array from a report object.
158
+
159
+ #### chartId
160
+
161
+ The id of a chart row in `wa_dashboard_chart`.
162
+
163
+ #### parameterSelectionList
164
+
165
+ The array of selected parameters sent from the client dashboard.
166
+
167
+ #### session
168
+
169
+ Session object from the Auth Module
170
+
171
+ ### loadOutputParameterValues
172
+
173
+ This function outputs the report's parameter values in the format expected by the dashboard client and backend. When sending to the client, including `forClient: true` will not include the properties only needed by the backend.
174
+
175
+ ### Function signature
176
+
177
+ ```js
178
+ async function loadOutputParameterValues(mysqlConnection, { definitionList, selectionList = [], forClient = false })
179
+ ```
180
+
181
+ #### Example Usage
182
+
183
+ #### mysqlConnection
184
+
185
+ A connection or pool of connections from the `mysql` npm module.
186
+
187
+ #### definitionList
188
+
189
+ The `parameters` property from the `json` column of a row in the `dashboard_report` table.
190
+
191
+ #### selectionList
192
+
193
+ An array of objects representing the selected parameters sent from the client. Only needed when loading the chart data, not when loading the report "metadata". Each parameter object should match the format specified in [schema.md](schema.md).
194
+
195
+ #### forClient
196
+
197
+ If this value is truthy, parameters' `queryValues` properties will be excluded, as the client does not need them.
198
+
199
+ ### Returns
200
+
201
+ An array of objects matching the format outlined in [schema.md](schema.md)
@@ -1,6 +1,6 @@
1
1
  import { Connection, RowDataPacket } from 'mysql';
2
2
  import type { Formatting, GoogleDataTable, MultiSeriesOptions, ProcessedFormatting, Table } from './types/chart.js';
3
- export type FieldType = 'string' | 'number' | 'datetime' | 'timeofday' | 'date';
3
+ export type FieldType = 'string' | 'number' | 'datetime' | 'timeofday' | 'date' | 'boolean';
4
4
  export type QueryFieldsObject = Record<string, FieldType>;
5
5
  export declare function queryWithFields(connection: Connection, query: {
6
6
  sql: string;
@@ -37,6 +37,29 @@ function mysqlToGoogleChartsDataTypeMap(mysqlDataType) {
37
37
  return 'string';
38
38
  }
39
39
  }
40
+ const roleRegex = /^role:(\w+)([ \-_]\w+)?/;
41
+ function getRoleFromColumnName(name) {
42
+ const match = name.match(roleRegex);
43
+ return match?.[1] ?? null;
44
+ }
45
+ function getColumnRoleType(role, dataType) {
46
+ if (role?.startsWith('role:')) {
47
+ role = role.replace('role:', '');
48
+ }
49
+ switch (role) {
50
+ case 'certainty':
51
+ case 'emphasis':
52
+ case 'scope':
53
+ return 'boolean';
54
+ case 'interval':
55
+ return 'number';
56
+ case 'domain':
57
+ case 'data':
58
+ return dataType;
59
+ default:
60
+ return 'string';
61
+ }
62
+ }
40
63
  function makeDataTableCol(key, fields, role = null) {
41
64
  return {
42
65
  id: toSnakeCase(key).toLowerCase(),
@@ -69,9 +92,10 @@ export function queryWithFields(connection, query) {
69
92
  resolve({
70
93
  results,
71
94
  fields: fields?.reduce((sum, field) => {
95
+ const fieldType = mysqlToGoogleChartsDataTypeMap(mysqlDataTypes[field.type] || field.type);
72
96
  return {
73
97
  ...sum,
74
- [field.name]: mysqlToGoogleChartsDataTypeMap(mysqlDataTypes[field.type] || field.type),
98
+ [field.name]: field.name.startsWith('role:') ? getColumnRoleType(field.name, fieldType) : fieldType,
75
99
  };
76
100
  }, {}) ?? {},
77
101
  });
@@ -85,12 +109,21 @@ export function queryWithFields(connection, query) {
85
109
  }
86
110
  export function getMultiSeriesData({ data: queryResult, seriesOptions, formatting, fields }) {
87
111
  const { groupXAxisBy, series, value, tooltip } = seriesOptions;
88
- const allOfTheKeysInTheSeries = new Set(queryResult.map(row => row[series]));
112
+ const allOfTheKeysInTheSeries = new Set(queryResult.flatMap(row => {
113
+ const keys = [row[series]];
114
+ const roleKeys = Object.keys(row)
115
+ .filter(key => key.startsWith('role:'))
116
+ .map(key => `${key}-${row[series]}`);
117
+ if (roleKeys.length) {
118
+ keys.push(...roleKeys);
119
+ }
120
+ return keys;
121
+ }));
89
122
  const objectOfAllKeys = {};
90
123
  for (const key of allOfTheKeysInTheSeries) {
91
124
  objectOfAllKeys[key] = [];
92
- if (tooltip) {
93
- objectOfAllKeys[`${tooltip} ${key}`] = [];
125
+ if (tooltip && !key.startsWith('role:')) {
126
+ objectOfAllKeys[`role:tooltip-${key}`] = [];
94
127
  }
95
128
  }
96
129
  const grouped = {};
@@ -102,16 +135,25 @@ export function getMultiSeriesData({ data: queryResult, seriesOptions, formattin
102
135
  grouped[groupXAxisByValue] = { ...klona(objectOfAllKeys) };
103
136
  }
104
137
  grouped[groupXAxisByValue][row[series]].push(row[value]);
138
+ const roleKeys = Object.keys(row).filter(key => key.startsWith('role:'));
139
+ roleKeys.forEach(key => {
140
+ grouped[groupXAxisByValue][`${key}-${row[series]}`].push(row[key]);
141
+ });
105
142
  if (tooltip) {
106
- grouped[groupXAxisByValue][`${tooltip} ${row[series]}`].push(row[tooltip]);
143
+ grouped[groupXAxisByValue][`role:tooltip-${row[series]}`].push(row[tooltip]);
107
144
  }
108
145
  }
109
146
  const seriesFields = { [groupXAxisBy]: fields[groupXAxisBy] };
110
147
  const seriesFormatting = {};
111
148
  for (const key of allOfTheKeysInTheSeries) {
112
- seriesFields[key] = fields[value];
113
- if (tooltip) {
114
- seriesFields[`${tooltip} ${key}`] = fields[tooltip];
149
+ if (key.startsWith('role:')) {
150
+ seriesFields[key] = getColumnRoleType(getRoleFromColumnName(key), fields[value]);
151
+ }
152
+ else {
153
+ seriesFields[key] = fields[value];
154
+ }
155
+ if (tooltip && !key.startsWith('role:')) {
156
+ seriesFields[`role:tooltip-${key}`] = fields[tooltip];
115
157
  }
116
158
  if (formatting && value in formatting) {
117
159
  seriesFormatting[key] = formatting[value];
@@ -187,7 +229,7 @@ function getSeriesRole(seriesName, multiSeries) {
187
229
  seriesName,
188
230
  };
189
231
  }
190
- const match = seriesName.match(/^role:(\w+)\s(.*)/);
232
+ const match = seriesName.match(roleRegex);
191
233
  if (match) {
192
234
  return { role: match[1], seriesName: seriesName };
193
235
  }
@@ -268,4 +310,4 @@ export function getSvelteDataTableFormat(rows, fields, formatting, styleTemplate
268
310
  };
269
311
  }
270
312
  export { getSvelteDataTableFormat as getRactiveDataTableFormat };
271
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhcnQtaGVscGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2NoYXJ0LWhlbHBlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFHQSxPQUFPLG1CQUFtQixNQUFNLDJCQUEyQixDQUFBO0FBQzNELE9BQU8sV0FBVyxNQUFNLGVBQWUsQ0FBQTtBQUV2QyxPQUFPLGNBQWMsTUFBTSx1Q0FBdUMsQ0FBQTtBQUNsRSxPQUFPLGFBQWEsTUFBTSxzQkFBc0IsQ0FBQTtBQUNoRCxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sT0FBTyxDQUFBO0FBRTdCLFNBQVMsOEJBQThCLENBQUMsYUFBcUI7SUFDNUQsUUFBUSxhQUFhLEVBQUUsQ0FBQztRQUN2QixLQUFLLFlBQVksQ0FBQztRQUNsQixLQUFLLFFBQVEsQ0FBQztRQUNkLEtBQUssTUFBTSxDQUFDO1FBQ1osS0FBSyxTQUFTO1lBQ2IsT0FBTyxRQUFRLENBQUE7UUFDaEIsS0FBSyxTQUFTLENBQUM7UUFDZixLQUFLLFlBQVksQ0FBQztRQUNsQixLQUFLLEtBQUssQ0FBQztRQUNYLEtBQUssTUFBTSxDQUFDO1FBQ1osS0FBSyxPQUFPLENBQUM7UUFDYixLQUFLLE1BQU0sQ0FBQztRQUNaLEtBQUssT0FBTyxDQUFDO1FBQ2IsS0FBSyxRQUFRLENBQUM7UUFDZCxLQUFLLFVBQVUsQ0FBQztRQUNoQixLQUFLLE9BQU8sQ0FBQztRQUNiLEtBQUssTUFBTTtZQUNWLE9BQU8sUUFBUSxDQUFBO1FBQ2hCLEtBQUssV0FBVyxDQUFDO1FBQ2pCLEtBQUssVUFBVSxDQUFDO1FBQ2hCLEtBQUssWUFBWSxDQUFDO1FBQ2xCLEtBQUssV0FBVztZQUNmLE9BQU8sVUFBVSxDQUFBO1FBQ2xCLEtBQUssTUFBTSxDQUFDO1FBQ1osS0FBSyxTQUFTO1lBQ2IsT0FBTyxNQUFNLENBQUE7UUFDZCxLQUFLLE1BQU0sQ0FBQztRQUNaLEtBQUssT0FBTztZQUNYLE9BQU8sV0FBVyxDQUFBO1FBQ25CO1lBQ0MsT0FB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
313
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhcnQtaGVscGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2NoYXJ0LWhlbHBlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFHQSxPQUFPLG1CQUFtQixNQUFNLDJCQUEyQixDQUFBO0FBQzNELE9BQU8sV0FBVyxNQUFNLGVBQWUsQ0FBQTtBQUV2QyxPQUFPLGNBQWMsTUFBTSx1Q0FBdUMsQ0FBQTtBQUNsRSxPQUFPLGFBQWEsTUFBTSxzQkFBc0IsQ0FBQTtBQUNoRCxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sT0FBTyxDQUFBO0FBRTdCLFNBQVMsOEJBQThCLENBQUMsYUFBcUI7SUFDNUQsUUFBUSxhQUFhLEVBQUUsQ0FBQztRQUN2QixLQUFLLFlBQVksQ0FBQztRQUNsQixLQUFLLFFBQVEsQ0FBQztRQUNkLEtBQUssTUFBTSxDQUFDO1FBQ1osS0FBSyxTQUFTO1lBQ2IsT0FBTyxRQUFRLENBQUE7UUFDaEIsS0FBSyxTQUFTLENBQUM7UUFDZixLQUFLLFlBQVksQ0FBQztRQUNsQixLQUFLLEtBQUssQ0FBQztRQUNYLEtBQUssTUFBTSxDQUFDO1FBQ1osS0FBSyxPQUFPLENBQUM7UUFDYixLQUFLLE1BQU0sQ0FBQztRQUNaLEtBQUssT0FBTyxDQUFDO1FBQ2IsS0FBSyxRQUFRLENBQUM7UUFDZCxLQUFLLFVBQVUsQ0FBQztRQUNoQixLQUFLLE9BQU8sQ0FBQztRQUNiLEtBQUssTUFBTTtZQUNWLE9BQU8sUUFBUSxDQUFBO1FBQ2hCLEtBQUssV0FBVyxDQUFDO1FBQ2pCLEtBQUssVUFBVSxDQUFDO1FBQ2hCLEtBQUssWUFBWSxDQUFDO1FBQ2xCLEtBQUssV0FBVztZQUNmLE9BQU8sVUFBVSxDQUFBO1FBQ2xCLEtBQUssTUFBTSxDQUFDO1FBQ1osS0FBSyxTQUFTO1lBQ2IsT0FBTyxNQUFNLENBQUE7UUFDZCxLQUFLLE1BQU0sQ0FBQztRQUNaLEtBQUssT0FBTztZQUNYLE9BQU8sV0FBVyxDQUFBO1FBQ25CO1lBQ0MsT0FB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
package/package.json CHANGED
@@ -1,67 +1,66 @@
1
- {
2
- "name": "@isoftdata/utility-dashboard-backend",
3
- "version": "3.3.0",
4
- "description": "A utility for formatting chart and report data to be usable by the frontend dashboard component.",
5
- "main": "dist/index.js",
6
- "type": "module",
7
- "scripts": {
8
- "test": "echo \"Error: no test specified\" && exit 1",
9
- "build": "tsc",
10
- "prepublishOnly": "npm run build"
11
- },
12
- "author": "Charles Kaup",
13
- "license": "ISC",
14
- "files": [
15
- "dist/**/*.*"
16
- ],
17
- "types": "dist/index.d.ts",
18
- "exports": {
19
- ".": {
20
- "import": "./dist/index.js",
21
- "types": "./dist/index.d.ts"
22
- },
23
- "./chart-helper": {
24
- "import": "./dist/chart-helper.js",
25
- "types": "./dist/chart-helper.d.ts"
26
- }
27
- },
28
- "dependencies": {
29
- "@isoftdata/utility-date-time": "^4.0.1",
30
- "@isoftdata/utility-db": "^3.2.1",
31
- "@types/to-snake-case": "^1.0.2",
32
- "camelcase": "^6.3.0",
33
- "date-fns": "^3.6.0",
34
- "deepmerge": "^4.2.2",
35
- "klona": "^2.0.6",
36
- "mathjs": "^11.5.0",
37
- "mysql": "^2.18.1",
38
- "snakeize": "^0.1.0",
39
- "to-snake-case": "^1.0.0"
40
- },
41
- "devDependencies": {
42
- "@isoftdata/eslint-config-typescript": "^2.0.0",
43
- "@isoftdata/prettier-config": "^1.0.3",
44
- "@types/google.visualization": "^0.0.68",
45
- "@types/mysql": "github:types/mysql",
46
- "@types/node": "^18.11.18",
47
- "eslint": "^7.32.0",
48
- "package-preview": "^4.0.0",
49
- "prettier": "^3.3.3",
50
- "type-fest": "^4.26.1",
51
- "typescript": "^5.6.2"
52
- },
53
- "prettier": "@isoftdata/prettier-config",
54
- "eslintConfig": {
55
- "extends": [
56
- "@isoftdata/typescript",
57
- "prettier"
58
- ],
59
- "ignorePatterns": "dist/**",
60
- "rules": {
61
- "@typescript-eslint/no-var-requires": 0
62
- }
63
- },
64
- "engines": {
65
- "pnpm": "10.x"
66
- }
67
- }
1
+ {
2
+ "name": "@isoftdata/utility-dashboard-backend",
3
+ "version": "3.4.1",
4
+ "description": "A utility for formatting chart and report data to be usable by the frontend dashboard component.",
5
+ "main": "dist/index.js",
6
+ "type": "module",
7
+ "author": "Charles Kaup",
8
+ "license": "ISC",
9
+ "files": [
10
+ "dist/**/*.*"
11
+ ],
12
+ "types": "dist/index.d.ts",
13
+ "exports": {
14
+ ".": {
15
+ "import": "./dist/index.js",
16
+ "types": "./dist/index.d.ts"
17
+ },
18
+ "./chart-helper": {
19
+ "import": "./dist/chart-helper.js",
20
+ "types": "./dist/chart-helper.d.ts"
21
+ }
22
+ },
23
+ "dependencies": {
24
+ "@isoftdata/utility-date-time": "^4.0.1",
25
+ "@isoftdata/utility-db": "^3.2.1",
26
+ "@types/to-snake-case": "^1.0.2",
27
+ "camelcase": "^6.3.0",
28
+ "date-fns": "^4.1.0",
29
+ "deepmerge": "^4.2.2",
30
+ "klona": "^2.0.6",
31
+ "mathjs": "^11.5.0",
32
+ "mysql": "^2.18.1",
33
+ "snakeize": "^0.1.0",
34
+ "to-snake-case": "^1.0.0"
35
+ },
36
+ "devDependencies": {
37
+ "@isoftdata/eslint-config-typescript": "^2.0.0",
38
+ "@isoftdata/prettier-config": "^1.0.3",
39
+ "@types/google.visualization": "^0.0.68",
40
+ "@types/mysql": "github:types/mysql",
41
+ "@types/node": "^18.11.18",
42
+ "eslint": "^7.32.0",
43
+ "package-preview": "^4.0.0",
44
+ "prettier": "^3.3.3",
45
+ "type-fest": "^4.26.1",
46
+ "typescript": "^5.6.2"
47
+ },
48
+ "prettier": "@isoftdata/prettier-config",
49
+ "eslintConfig": {
50
+ "extends": [
51
+ "@isoftdata/typescript",
52
+ "prettier"
53
+ ],
54
+ "ignorePatterns": "dist/**",
55
+ "rules": {
56
+ "@typescript-eslint/no-var-requires": 0
57
+ }
58
+ },
59
+ "engines": {
60
+ "pnpm": "10.x"
61
+ },
62
+ "scripts": {
63
+ "test": "echo \"Error: no test specified\" && exit 1",
64
+ "build": "tsc"
65
+ }
66
+ }