@forestadmin/datasource-customizer 1.35.4 → 1.36.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/datasource-customizer.d.ts +1 -1
- package/dist/datasource-customizer.js +4 -3
- package/dist/decorators/chart/result-builder.d.ts +57 -2
- package/dist/decorators/chart/result-builder.js +109 -16
- package/dist/typing-generator.d.ts +14 -8
- package/dist/typing-generator.js +57 -36
- package/package.json +2 -2
|
@@ -77,6 +77,6 @@ export default class DataSourceCustomizer<S extends TSchema = TSchema> {
|
|
|
77
77
|
use<Options>(plugin: Plugin<Options>, options?: Options): this;
|
|
78
78
|
getDataSource(logger: Logger): Promise<DataSource>;
|
|
79
79
|
getFactory(): DataSourceFactory;
|
|
80
|
-
updateTypesOnFileSystem(typingsPath: string, typingsMaxDepth: number): Promise<void>;
|
|
80
|
+
updateTypesOnFileSystem(typingsPath: string, typingsMaxDepth: number, logger?: Logger): Promise<void>;
|
|
81
81
|
}
|
|
82
82
|
//# sourceMappingURL=datasource-customizer.d.ts.map
|
|
@@ -129,9 +129,10 @@ class DataSourceCustomizer {
|
|
|
129
129
|
getFactory() {
|
|
130
130
|
return async (logger) => this.getDataSource(logger);
|
|
131
131
|
}
|
|
132
|
-
async updateTypesOnFileSystem(typingsPath, typingsMaxDepth) {
|
|
133
|
-
|
|
132
|
+
async updateTypesOnFileSystem(typingsPath, typingsMaxDepth, logger) {
|
|
133
|
+
const typingGenerator = new typing_generator_1.default(logger);
|
|
134
|
+
return typingGenerator.updateTypesOnFileSystem(this.stack.hook, typingsPath, typingsMaxDepth);
|
|
134
135
|
}
|
|
135
136
|
}
|
|
136
137
|
exports.default = DataSourceCustomizer;
|
|
137
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
138
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YXNvdXJjZS1jdXN0b21pemVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2RhdGFzb3VyY2UtY3VzdG9taXplci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQVFBLG9GQUEyRDtBQUUzRCw2RkFBb0U7QUFDcEUscUZBQTREO0FBQzVELHFGQUFpRjtBQUNqRiwyRkFBNEY7QUFHNUYsMEVBQWlEO0FBRWpEOzs7Ozs7Ozs7R0FTRztBQUNILE1BQXFCLG9CQUFvQjtJQUl2Qzs7T0FFRztJQUNILElBQUksTUFBTTtRQUNSLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDO0lBQ3RDLENBQUM7SUFFRDs7T0FFRztJQUNILElBQUksV0FBVztRQUNiLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUMvQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxJQUEwQixDQUFDLENBQ2pELENBQUM7SUFDSixDQUFDO0lBRUQ7UUFDRSxJQUFJLENBQUMsbUJBQW1CLEdBQUcsSUFBSSw4QkFBbUIsRUFBYyxDQUFDO1FBQ2pFLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSwwQkFBZSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO0lBQzdELENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsYUFBYSxDQUFDLE9BQTBCLEVBQUUsT0FBMkI7UUFDbkUsSUFBSSxDQUFDLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLEVBQUMsTUFBTSxFQUFDLEVBQUU7WUFDM0MsSUFBSSxVQUFVLEdBQUcsTUFBTSxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7WUFFdkMsSUFBSSxPQUFPLEVBQUUsT0FBTyxJQUFJLE9BQU8sRUFBRSxPQUFPLEVBQUU7Z0JBQ3hDLE1BQU0sb0JBQW9CLEdBQUcsSUFBSSxvQkFBOEIsQ0FBQyxVQUFVLENB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
|
|
@@ -1,12 +1,67 @@
|
|
|
1
|
-
import { DateOperation, DistributionChart, LeaderboardChart, ObjectiveChart, PercentageChart, SmartChart, TimeBasedChart, ValueChart } from '@forestadmin/datasource-toolkit';
|
|
1
|
+
import { DateOperation, DistributionChart, LeaderboardChart, MultipleTimeBasedChart, ObjectiveChart, PercentageChart, SmartChart, TimeBasedChart, ValueChart } from '@forestadmin/datasource-toolkit';
|
|
2
2
|
export default class ResultBuilder {
|
|
3
3
|
private static readonly formats;
|
|
4
4
|
value(value: number, previousValue?: number): ValueChart;
|
|
5
5
|
distribution(obj: Record<string, number>): DistributionChart;
|
|
6
|
-
|
|
6
|
+
/**
|
|
7
|
+
* Add a TimeBasedChart based on a time range and a set of values.
|
|
8
|
+
* @param {DateOperation} timeRange - The time range for the chart, specified as a DateOperation.
|
|
9
|
+
* @param {Array<{ date: Date; value: number | null }> | Record<string, number>} values -
|
|
10
|
+
* This can be an array of objects with 'date' and 'value' properties,
|
|
11
|
+
* or a record (object) with date-value pairs.
|
|
12
|
+
*
|
|
13
|
+
* @returns {TimeBasedChart} Returns a TimeBasedChart representing the data within the specified
|
|
14
|
+
* time range.
|
|
15
|
+
*
|
|
16
|
+
* @example
|
|
17
|
+
* timeBased(
|
|
18
|
+
* 'Day',
|
|
19
|
+
* [
|
|
20
|
+
* { date: new Date('2023-01-01'), value: 42 },
|
|
21
|
+
* { date: new Date('2023-01-02'), value: 55 },
|
|
22
|
+
* { date: new Date('2023-01-03'), value: null },
|
|
23
|
+
* ]
|
|
24
|
+
* );
|
|
25
|
+
*/
|
|
26
|
+
timeBased(timeRange: DateOperation, values: Array<{
|
|
27
|
+
date: Date;
|
|
28
|
+
value: number | null;
|
|
29
|
+
}> | Record<string, number | null>): TimeBasedChart;
|
|
30
|
+
/**
|
|
31
|
+
* Add a MultipleTimeBasedChart based on a time range,
|
|
32
|
+
* an array of dates, and multiple lines of data.
|
|
33
|
+
*
|
|
34
|
+
* @param {DateOperation} timeRange - The time range for the chart, specified as a DateOperation.
|
|
35
|
+
* @param {Date[]} dates - An array of dates that define the x-axis values for the chart.
|
|
36
|
+
* @param {Array<{ label: string; values: Array<number | null> }>} lines - An array of lines,
|
|
37
|
+
* each containing a label and an array of numeric data values (or null)
|
|
38
|
+
* corresponding to the dates.
|
|
39
|
+
*
|
|
40
|
+
* @returns {MultipleTimeBasedChart} Returns a MultipleTimeBasedChart representing multiple
|
|
41
|
+
* lines of data within the specified time range.
|
|
42
|
+
*
|
|
43
|
+
* @example
|
|
44
|
+
* multipleTimeBased(
|
|
45
|
+
* 'Day',
|
|
46
|
+
* [
|
|
47
|
+
* new Date('1985-10-26'),
|
|
48
|
+
* new Date('2011-10-05T14:48:00.000Z'),
|
|
49
|
+
* new Date()
|
|
50
|
+
* ],
|
|
51
|
+
* [
|
|
52
|
+
* { label: 'line1', values: [1, 2, 3] },
|
|
53
|
+
* { label: 'line2', values: [3, 4, null] }
|
|
54
|
+
* ],
|
|
55
|
+
* );
|
|
56
|
+
*/
|
|
57
|
+
multipleTimeBased(timeRange: DateOperation, dates: Date[], lines: Array<{
|
|
58
|
+
label: string;
|
|
59
|
+
values: Array<number | null>;
|
|
60
|
+
}>): MultipleTimeBasedChart;
|
|
7
61
|
percentage(value: number): PercentageChart;
|
|
8
62
|
objective(value: number, objective: number): ObjectiveChart;
|
|
9
63
|
leaderboard(obj: Record<string, number>): LeaderboardChart;
|
|
10
64
|
smart(data: unknown): SmartChart;
|
|
65
|
+
private static buildTimeBasedChartResult;
|
|
11
66
|
}
|
|
12
67
|
//# sourceMappingURL=result-builder.d.ts.map
|
|
@@ -8,22 +8,75 @@ class ResultBuilder {
|
|
|
8
8
|
distribution(obj) {
|
|
9
9
|
return Object.entries(obj).map(([key, value]) => ({ key, value }));
|
|
10
10
|
}
|
|
11
|
+
/**
|
|
12
|
+
* Add a TimeBasedChart based on a time range and a set of values.
|
|
13
|
+
* @param {DateOperation} timeRange - The time range for the chart, specified as a DateOperation.
|
|
14
|
+
* @param {Array<{ date: Date; value: number | null }> | Record<string, number>} values -
|
|
15
|
+
* This can be an array of objects with 'date' and 'value' properties,
|
|
16
|
+
* or a record (object) with date-value pairs.
|
|
17
|
+
*
|
|
18
|
+
* @returns {TimeBasedChart} Returns a TimeBasedChart representing the data within the specified
|
|
19
|
+
* time range.
|
|
20
|
+
*
|
|
21
|
+
* @example
|
|
22
|
+
* timeBased(
|
|
23
|
+
* 'Day',
|
|
24
|
+
* [
|
|
25
|
+
* { date: new Date('2023-01-01'), value: 42 },
|
|
26
|
+
* { date: new Date('2023-01-02'), value: 55 },
|
|
27
|
+
* { date: new Date('2023-01-03'), value: null },
|
|
28
|
+
* ]
|
|
29
|
+
* );
|
|
30
|
+
*/
|
|
11
31
|
timeBased(timeRange, values) {
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
32
|
+
if (Array.isArray(values))
|
|
33
|
+
return ResultBuilder.buildTimeBasedChartResult(timeRange, values);
|
|
34
|
+
const formattedValues = [];
|
|
35
|
+
Object.entries(values).forEach(([stringDate, value]) => {
|
|
36
|
+
formattedValues.push({ date: new Date(stringDate), value });
|
|
37
|
+
});
|
|
38
|
+
return ResultBuilder.buildTimeBasedChartResult(timeRange, formattedValues);
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Add a MultipleTimeBasedChart based on a time range,
|
|
42
|
+
* an array of dates, and multiple lines of data.
|
|
43
|
+
*
|
|
44
|
+
* @param {DateOperation} timeRange - The time range for the chart, specified as a DateOperation.
|
|
45
|
+
* @param {Date[]} dates - An array of dates that define the x-axis values for the chart.
|
|
46
|
+
* @param {Array<{ label: string; values: Array<number | null> }>} lines - An array of lines,
|
|
47
|
+
* each containing a label and an array of numeric data values (or null)
|
|
48
|
+
* corresponding to the dates.
|
|
49
|
+
*
|
|
50
|
+
* @returns {MultipleTimeBasedChart} Returns a MultipleTimeBasedChart representing multiple
|
|
51
|
+
* lines of data within the specified time range.
|
|
52
|
+
*
|
|
53
|
+
* @example
|
|
54
|
+
* multipleTimeBased(
|
|
55
|
+
* 'Day',
|
|
56
|
+
* [
|
|
57
|
+
* new Date('1985-10-26'),
|
|
58
|
+
* new Date('2011-10-05T14:48:00.000Z'),
|
|
59
|
+
* new Date()
|
|
60
|
+
* ],
|
|
61
|
+
* [
|
|
62
|
+
* { label: 'line1', values: [1, 2, 3] },
|
|
63
|
+
* { label: 'line2', values: [3, 4, null] }
|
|
64
|
+
* ],
|
|
65
|
+
* );
|
|
66
|
+
*/
|
|
67
|
+
multipleTimeBased(timeRange, dates, lines) {
|
|
68
|
+
let formattedTimes;
|
|
69
|
+
const formattedLine = lines.map(line => {
|
|
70
|
+
const values = dates.reduce((computed, date, index) => {
|
|
71
|
+
computed.push({ date, value: line.values[index] });
|
|
72
|
+
return computed;
|
|
73
|
+
}, []);
|
|
74
|
+
const buildTimeBased = ResultBuilder.buildTimeBasedChartResult(timeRange, values);
|
|
75
|
+
if (!formattedTimes)
|
|
76
|
+
formattedTimes = buildTimeBased.map(timeBased => timeBased.label);
|
|
77
|
+
return { key: line.label, values: buildTimeBased.map(timeBased => timeBased.values.value) };
|
|
78
|
+
});
|
|
79
|
+
return { labels: formattedTimes, values: formattedLine };
|
|
27
80
|
}
|
|
28
81
|
percentage(value) {
|
|
29
82
|
return value;
|
|
@@ -37,6 +90,46 @@ class ResultBuilder {
|
|
|
37
90
|
smart(data) {
|
|
38
91
|
return data;
|
|
39
92
|
}
|
|
93
|
+
/*
|
|
94
|
+
* Normalize the time based chart result to have a value for each time range.
|
|
95
|
+
* For example, if the time range is 'Month' and the values are:
|
|
96
|
+
* [
|
|
97
|
+
* // YYYY-MM-DD
|
|
98
|
+
* { date: new Date('2022-01-07'), value: 1 }, // Jan 22
|
|
99
|
+
* { date: new Date('2022-02-02'), value: 2 }, // Feb 22
|
|
100
|
+
* { date: new Date('2022-01-01'), value: 3 }, // Jan 22
|
|
101
|
+
* { date: new Date('2022-02-01'), value: 4 }, // Feb 22
|
|
102
|
+
* ]
|
|
103
|
+
* The result will be:
|
|
104
|
+
* [
|
|
105
|
+
* { label: 'Jan 22', values: { value: 4 } },
|
|
106
|
+
* { label: 'Feb 22', values: { value: 6 } },
|
|
107
|
+
* ]
|
|
108
|
+
*/
|
|
109
|
+
static buildTimeBasedChartResult(timeRange, points) {
|
|
110
|
+
const pointsInDateTime = [];
|
|
111
|
+
points.forEach(point => {
|
|
112
|
+
pointsInDateTime.push({ date: luxon_1.DateTime.fromJSDate(point.date), value: point.value });
|
|
113
|
+
});
|
|
114
|
+
const format = ResultBuilder.formats[timeRange];
|
|
115
|
+
const formatted = {};
|
|
116
|
+
pointsInDateTime.forEach(point => {
|
|
117
|
+
const label = point.date.toFormat(format);
|
|
118
|
+
if (typeof point.value === 'number')
|
|
119
|
+
formatted[label] = (formatted[label] ?? 0) + point.value;
|
|
120
|
+
});
|
|
121
|
+
const dataPoints = [];
|
|
122
|
+
const dates = pointsInDateTime
|
|
123
|
+
.map(p => p.date)
|
|
124
|
+
.sort((dateA, dateB) => dateA.toUnixInteger() - dateB.toUnixInteger());
|
|
125
|
+
const first = dates[0].startOf(timeRange.toLowerCase());
|
|
126
|
+
const last = dates[dates.length - 1];
|
|
127
|
+
for (let current = first; current <= last; current = current.plus({ [timeRange]: 1 })) {
|
|
128
|
+
const label = current.toFormat(format);
|
|
129
|
+
dataPoints.push({ label, values: { value: formatted[label] ?? null } });
|
|
130
|
+
}
|
|
131
|
+
return dataPoints;
|
|
132
|
+
}
|
|
40
133
|
}
|
|
41
134
|
exports.default = ResultBuilder;
|
|
42
135
|
ResultBuilder.formats = {
|
|
@@ -45,4 +138,4 @@ ResultBuilder.formats = {
|
|
|
45
138
|
Month: 'MMM yy',
|
|
46
139
|
Year: 'yyyy',
|
|
47
140
|
};
|
|
48
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
141
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzdWx0LWJ1aWxkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvZGVjb3JhdG9ycy9jaGFydC9yZXN1bHQtYnVpbGRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQVdBLGlDQUErQztBQUUvQyxNQUFxQixhQUFhO0lBUWhDLEtBQUssQ0FBQyxLQUFhLEVBQUUsYUFBc0I7UUFDekMsT0FBTyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsYUFBYSxFQUFFLGFBQWEsRUFBRSxDQUFDO0lBQy9ELENBQUM7SUFFRCxZQUFZLENBQUMsR0FBMkI7UUFDdEMsT0FBTyxNQUFNLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNyRSxDQUFDO0lBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7T0FtQkc7SUFDSCxTQUFTLENBQ1AsU0FBd0IsRUFDeEIsTUFBbUY7UUFFbkYsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQztZQUFFLE9BQU8sYUFBYSxDQUFDLHlCQUF5QixDQUFDLFNBQVMsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUU3RixNQUFNLGVBQWUsR0FBRyxFQUFFLENBQUM7UUFDM0IsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFVBQVUsRUFBRSxLQUFLLENBQUMsRUFBRSxFQUFFO1lBQ3JELGVBQWUsQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLEVBQUUsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztRQUM5RCxDQUFDLENBQUMsQ0FBQztRQUVILE9BQU8sYUFBYSxDQUFDLHlCQUF5QixDQUFDLFNBQVMsRUFBRSxlQUFlLENBQUMs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
|
|
@@ -1,20 +1,26 @@
|
|
|
1
|
+
import type { Logger } from '@forestadmin/datasource-toolkit';
|
|
1
2
|
import { DataSource } from '@forestadmin/datasource-toolkit';
|
|
2
3
|
export default class TypingGenerator {
|
|
4
|
+
private readonly logger;
|
|
5
|
+
private readonly options;
|
|
6
|
+
constructor(logger: Logger, options?: {
|
|
7
|
+
maxFieldsCount?: number;
|
|
8
|
+
});
|
|
3
9
|
/**
|
|
4
10
|
* Write types to disk at a given path.
|
|
5
11
|
* This method read the file which is already there before overwriting so that customers
|
|
6
12
|
* using equivalents to nodemon to not enter restart loops.
|
|
7
13
|
*/
|
|
8
|
-
|
|
14
|
+
updateTypesOnFileSystem(dataSource: DataSource, typingsPath: string, typingsMaxDepth: number): Promise<void>;
|
|
9
15
|
/**
|
|
10
16
|
* Generates types on a string.
|
|
11
17
|
*/
|
|
12
|
-
|
|
13
|
-
private
|
|
14
|
-
private
|
|
15
|
-
private
|
|
16
|
-
private
|
|
17
|
-
private
|
|
18
|
-
private
|
|
18
|
+
generateTypes(dataSource: DataSource, maxDepth: number): string;
|
|
19
|
+
private generateAliases;
|
|
20
|
+
private getRow;
|
|
21
|
+
private getRelations;
|
|
22
|
+
private getFlatRelations;
|
|
23
|
+
private getFieldsOnCollection;
|
|
24
|
+
private getType;
|
|
19
25
|
}
|
|
20
26
|
//# sourceMappingURL=typing-generator.d.ts.map
|
package/dist/typing-generator.js
CHANGED
|
@@ -3,13 +3,20 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
const datasource_toolkit_1 = require("@forestadmin/datasource-toolkit");
|
|
4
4
|
const promises_1 = require("fs/promises");
|
|
5
5
|
class TypingGenerator {
|
|
6
|
+
constructor(logger, options = {}) {
|
|
7
|
+
this.logger = logger;
|
|
8
|
+
this.options = {
|
|
9
|
+
maxFieldsCount: 10000,
|
|
10
|
+
};
|
|
11
|
+
this.options.maxFieldsCount = options.maxFieldsCount ?? this.options.maxFieldsCount;
|
|
12
|
+
}
|
|
6
13
|
/**
|
|
7
14
|
* Write types to disk at a given path.
|
|
8
15
|
* This method read the file which is already there before overwriting so that customers
|
|
9
16
|
* using equivalents to nodemon to not enter restart loops.
|
|
10
17
|
*/
|
|
11
|
-
|
|
12
|
-
const newTypes =
|
|
18
|
+
async updateTypesOnFileSystem(dataSource, typingsPath, typingsMaxDepth) {
|
|
19
|
+
const newTypes = this.generateTypes(dataSource, typingsMaxDepth);
|
|
13
20
|
let olderTypes = null;
|
|
14
21
|
try {
|
|
15
22
|
olderTypes = await (0, promises_1.readFile)(typingsPath, { encoding: 'utf-8' });
|
|
@@ -27,7 +34,7 @@ class TypingGenerator {
|
|
|
27
34
|
/**
|
|
28
35
|
* Generates types on a string.
|
|
29
36
|
*/
|
|
30
|
-
|
|
37
|
+
generateTypes(dataSource, maxDepth) {
|
|
31
38
|
const collections = [...dataSource.collections].sort((a, b) => a.name.localeCompare(b.name));
|
|
32
39
|
return [
|
|
33
40
|
`/* eslint-disable */`,
|
|
@@ -53,7 +60,7 @@ class TypingGenerator {
|
|
|
53
60
|
'};\n',
|
|
54
61
|
].join('\n');
|
|
55
62
|
}
|
|
56
|
-
|
|
63
|
+
generateAliases(dataSource) {
|
|
57
64
|
return dataSource.collections
|
|
58
65
|
.flatMap(collection => {
|
|
59
66
|
const name = collection.name.slice(0, 1).toUpperCase() +
|
|
@@ -71,13 +78,13 @@ class TypingGenerator {
|
|
|
71
78
|
})
|
|
72
79
|
.join('\n');
|
|
73
80
|
}
|
|
74
|
-
|
|
81
|
+
getRow(collection) {
|
|
75
82
|
const content = Object.entries(collection.schema.fields).reduce((memo, [name, field]) => {
|
|
76
83
|
return field.type === 'Column' ? [...memo, ` '${name}': ${this.getType(field)};`] : memo;
|
|
77
84
|
}, []);
|
|
78
85
|
return ` plain: {\n${content.join('\n')}\n };`;
|
|
79
86
|
}
|
|
80
|
-
|
|
87
|
+
getRelations(collection) {
|
|
81
88
|
const content = Object.entries(collection.schema.fields).reduce((memo, [name, field]) => {
|
|
82
89
|
if (field.type === 'ManyToOne' || field.type === 'OneToOne') {
|
|
83
90
|
const relation = field.foreignCollection;
|
|
@@ -90,40 +97,54 @@ class TypingGenerator {
|
|
|
90
97
|
}, []);
|
|
91
98
|
return content.length ? ` nested: {\n${content.join('\n')}\n };` : ` nested: {};`;
|
|
92
99
|
}
|
|
93
|
-
|
|
94
|
-
const fields = this.
|
|
100
|
+
getFlatRelations(collection, maxDepth) {
|
|
101
|
+
const fields = this.getFieldsOnCollection(collection, maxDepth);
|
|
95
102
|
return fields.length
|
|
96
103
|
? ` flat: {\n ${fields.join('\n ')}\n };`
|
|
97
104
|
: ` flat: {};`;
|
|
98
105
|
}
|
|
99
|
-
|
|
100
|
-
const
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
{
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
106
|
+
getFieldsOnCollection(mainCollection, maxDepth) {
|
|
107
|
+
const result = [];
|
|
108
|
+
const queue = [{ collection: mainCollection, depth: 0, prefix: '', traversed: [] }];
|
|
109
|
+
while (queue.length > 0 && result.length < this.options.maxFieldsCount) {
|
|
110
|
+
const { collection, depth, prefix, traversed } = queue.shift();
|
|
111
|
+
if (prefix) {
|
|
112
|
+
result.push(...Object.entries(collection.schema.fields)
|
|
113
|
+
.filter(([, schema]) => schema.type === 'Column')
|
|
114
|
+
.map(([name, schema]) => `'${prefix}:${name}': ${this.getType(schema)};`));
|
|
115
|
+
}
|
|
116
|
+
if (depth < maxDepth) {
|
|
117
|
+
queue.push(...Object.entries(collection.schema.fields)
|
|
118
|
+
.filter(([, schema]) => schema.type === 'ManyToOne' || schema.type === 'OneToOne')
|
|
119
|
+
.map(([name, schema]) => {
|
|
120
|
+
return {
|
|
121
|
+
subCollection: collection.dataSource.getCollection(schema.foreignCollection),
|
|
122
|
+
inverse: datasource_toolkit_1.CollectionUtils.getInverseRelation(collection, name),
|
|
123
|
+
name,
|
|
124
|
+
schema,
|
|
125
|
+
};
|
|
126
|
+
})
|
|
127
|
+
.filter(({ subCollection, inverse }) => {
|
|
128
|
+
// Do not expand inverse relations, as those create useless cycles
|
|
129
|
+
return !traversed.find(({ c, r }) => c === subCollection && r === inverse);
|
|
130
|
+
})
|
|
131
|
+
.map(({ subCollection, name }) => {
|
|
132
|
+
return {
|
|
133
|
+
collection: subCollection,
|
|
134
|
+
depth: depth + 1,
|
|
135
|
+
prefix: prefix ? `${prefix}:${name}` : name,
|
|
136
|
+
traversed: [...traversed, { c: collection, r: name }],
|
|
137
|
+
};
|
|
138
|
+
}));
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
if (queue.length || result.length >= this.options.maxFieldsCount) {
|
|
142
|
+
this.logger?.('Warn', `Fields generation stopped on collection ${mainCollection.name}, ` +
|
|
143
|
+
`try using a lower typingsMaxDepth (${maxDepth}) to avoid this issue.`);
|
|
144
|
+
}
|
|
145
|
+
return result.slice(0, this.options.maxFieldsCount);
|
|
125
146
|
}
|
|
126
|
-
|
|
147
|
+
getType(field) {
|
|
127
148
|
if (Array.isArray(field.columnType)) {
|
|
128
149
|
return `Array<${this.getType({
|
|
129
150
|
columnType: field.columnType[0],
|
|
@@ -153,4 +174,4 @@ class TypingGenerator {
|
|
|
153
174
|
}
|
|
154
175
|
}
|
|
155
176
|
exports.default = TypingGenerator;
|
|
156
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
177
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwaW5nLWdlbmVyYXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy90eXBpbmctZ2VuZXJhdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBRUEsd0VBTXlDO0FBQ3pDLDBDQUFrRDtBQUVsRCxNQUFxQixlQUFlO0lBS2xDLFlBQTZCLE1BQWMsRUFBRSxVQUF1QyxFQUFFO1FBQXpELFdBQU0sR0FBTixNQUFNLENBQVE7UUFKMUIsWUFBTyxHQUFHO1lBQ3pCLGNBQWMsRUFBRSxLQUFNO1NBQ3ZCLENBQUM7UUFHQSxJQUFJLENBQUMsT0FBTyxDQUFDLGNBQWMsR0FBRyxPQUFPLENBQUMsY0FBYyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDO0lBQ3RGLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ksS0FBSyxDQUFDLHVCQUF1QixDQUNsQyxVQUFzQixFQUN0QixXQUFtQixFQUNuQixlQUF1QjtRQUV2QixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLFVBQVUsRUFBRSxlQUFlLENBQUMsQ0FBQztRQUNqRSxJQUFJLFVBQVUsR0FBa0IsSUFBSSxDQUFDO1FBRXJDLElBQUk7WUFDRixVQUFVLEdBQUcsTUFBTSxJQUFBLG1CQUFRLEVBQUMsV0FBVyxFQUFFLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUM7U0FDakU7UUFBQyxPQUFPLENBQUMsRUFBRTtZQUNWLElBQUksQ0FBQyxDQUFDLElBQUksS0FBSyxRQUFRO2dCQUFFLFVBQVUsR0FBRyxJQUFJLENBQUM7O2dCQUN0QyxNQUFNLENBQUMsQ0FBQztTQUNkO1FBRUQsSUFBSSxRQUFRLEtBQUssVUFBVSxFQUFFO1lBQzNCLE1BQU0sSUFBQSxvQkFBUyxFQUFDLFdBQVcsRUFBRSxRQUFRLEVBQUUsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQztTQUMvRDtJQUNILENBQUM7SUFFRDs7T0FFRztJQUNJLGFBQWEsQ0FBQyxV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
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@forestadmin/datasource-customizer",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.36.0",
|
|
4
4
|
"main": "dist/index.js",
|
|
5
5
|
"license": "GPL-3.0",
|
|
6
6
|
"publishConfig": {
|
|
@@ -28,7 +28,7 @@
|
|
|
28
28
|
"@types/uuid": "^9.0.0"
|
|
29
29
|
},
|
|
30
30
|
"dependencies": {
|
|
31
|
-
"@forestadmin/datasource-toolkit": "1.
|
|
31
|
+
"@forestadmin/datasource-toolkit": "1.29.0",
|
|
32
32
|
"file-type": "^16.5.4",
|
|
33
33
|
"luxon": "^3.2.1",
|
|
34
34
|
"object-hash": "^3.0.0",
|