@forestadmin/plugin-flattener 1.0.92 → 1.1.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/flatten-column/customization.d.ts +2 -2
- package/dist/flatten-column/customization.js +5 -4
- package/dist/flatten-column/index.d.ts +4 -0
- package/dist/flatten-column/index.js +14 -10
- package/dist/flatten-json-column/index.d.ts +54 -0
- package/dist/flatten-json-column/index.js +76 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +4 -2
- package/package.json +3 -3
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { CollectionCustomizer, HookBeforeCreateContext, HookBeforeUpdateContext } from '@forestadmin/datasource-customizer';
|
|
2
|
-
import {
|
|
3
|
-
export declare function makeField(columnName: string, path: string,
|
|
2
|
+
import { ColumnType } from '@forestadmin/datasource-toolkit';
|
|
3
|
+
export declare function makeField(columnName: string, path: string, baseColumnType: ColumnType): {
|
|
4
4
|
columnType: ColumnType;
|
|
5
5
|
dependencies: string[];
|
|
6
6
|
getValues: (records: any) => any;
|
|
@@ -7,8 +7,8 @@ exports.makeUpdateHook = exports.makeCreateHook = exports.makeWriteHandler = exp
|
|
|
7
7
|
const datasource_toolkit_1 = require("@forestadmin/datasource-toolkit");
|
|
8
8
|
const object_hash_1 = __importDefault(require("object-hash"));
|
|
9
9
|
const helpers_1 = require("./helpers");
|
|
10
|
-
function makeField(columnName, path,
|
|
11
|
-
const columnType = (0, helpers_1.getValue)({ [columnName]:
|
|
10
|
+
function makeField(columnName, path, baseColumnType) {
|
|
11
|
+
const columnType = (0, helpers_1.getValue)({ [columnName]: baseColumnType }, path);
|
|
12
12
|
if (!columnType)
|
|
13
13
|
throw new Error(`Cannot add field '${path}' (dependency not found).`);
|
|
14
14
|
return {
|
|
@@ -49,8 +49,9 @@ function makeUpdateHook(collection, columnName, paths) {
|
|
|
49
49
|
const patchForThatRecord = { [columnName]: record[columnName] };
|
|
50
50
|
(0, helpers_1.deepUpdateInPlace)(patchForThatRecord, { [columnName]: context.patch[columnName] });
|
|
51
51
|
const hash = (0, object_hash_1.default)(patchForThatRecord);
|
|
52
|
-
if (!recordsByPatch.has(hash))
|
|
52
|
+
if (!recordsByPatch.has(hash)) {
|
|
53
53
|
recordsByPatch.set(hash, { matches: [], patch: patchForThatRecord });
|
|
54
|
+
}
|
|
54
55
|
recordsByPatch.get(hash).matches.push(record);
|
|
55
56
|
}
|
|
56
57
|
if (recordsByPatch.size === 1) {
|
|
@@ -75,4 +76,4 @@ function makeUpdateHook(collection, columnName, paths) {
|
|
|
75
76
|
};
|
|
76
77
|
}
|
|
77
78
|
exports.makeUpdateHook = makeUpdateHook;
|
|
78
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
79
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3VzdG9taXphdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9mbGF0dGVuLWNvbHVtbi9jdXN0b21pemF0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQU9BLHdFQUFnRztBQUNoRyw4REFBcUM7QUFFckMsdUNBQStFO0FBRS9FLFNBQWdCLFNBQVMsQ0FBQyxVQUFrQixFQUFFLElBQVksRUFBRSxjQUEwQjtJQUNwRixNQUFNLFVBQVUsR0FBRyxJQUFBLGtCQUFRLEVBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxFQUFFLGNBQWMsRUFBRSxFQUFFLElBQUksQ0FBZSxDQUFDO0lBQ2xGLElBQUksQ0FBQyxVQUFVO1FBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyxxQkFBcUIsSUFBSSwyQkFBMkIsQ0FBQyxDQUFDO0lBRXZGLE9BQU87UUFDTCxVQUFVO1FBQ1YsWUFBWSxFQUFFLENBQUMsVUFBVSxDQUFDO1FBQzFCLFNBQVMsRUFBRSxPQUFPLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFBLGtCQUFRLEVBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO0tBQzFELENBQUM7QUFDSixDQUFDO0FBVEQsOEJBU0M7QUFFRCxTQUFnQixnQkFBZ0IsQ0FBQyxJQUFZO0lBQzNDLCtGQUErRjtJQUMvRiw2RkFBNkY7SUFFN0YsdUJBQXVCO0lBQ3ZCLE9BQU8sR0FBRyxFQUFFO1FBQ1YsTUFBTSxJQUFJLEtBQUssQ0FBQyxtQ0FBbUMsSUFBSSxpQ0FBaUMsQ0FBQyxDQUFDO0lBQzVGLENBQUMsQ0FBQztBQUNKLENBQUM7QUFSRCw0Q0FRQztBQUVELFNBQWdCLGNBQWMsQ0FBQyxLQUFlO0lBQzVDLE9BQU8sS0FBSyxFQUFFLE9BQWdDLEVBQUUsRUFBRTtRQUNoRCxLQUFLLE1BQU0sTUFBTSxJQUFJLE9BQU8sQ0FBQyxJQUFJLEVBQUU7WUFDakMsSUFBQSwrQkFBcUIs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
|
|
@@ -1,10 +1,14 @@
|
|
|
1
1
|
import type { CollectionCustomizer, DataSourceCustomizer } from '@forestadmin/datasource-customizer';
|
|
2
|
+
import { ColumnType } from '@forestadmin/datasource-toolkit';
|
|
2
3
|
export type FlattenColumnOptions = {
|
|
3
4
|
columnName: string;
|
|
4
5
|
include?: string[];
|
|
5
6
|
exclude?: string[];
|
|
6
7
|
level?: number;
|
|
7
8
|
readonly?: boolean;
|
|
9
|
+
columnType?: {
|
|
10
|
+
[key: string]: ColumnType;
|
|
11
|
+
};
|
|
8
12
|
};
|
|
9
13
|
/**
|
|
10
14
|
* Flatten a column which have a composite type
|
|
@@ -3,26 +3,30 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
const customization_1 = require("./customization");
|
|
4
4
|
const helpers_1 = require("./helpers");
|
|
5
5
|
function optionsToPaths(collection, options) {
|
|
6
|
-
const { columnName, include, exclude, level } = options;
|
|
6
|
+
const { columnName, include, exclude, level, columnType } = options;
|
|
7
7
|
const errorMessage = `'${collection.name}.${columnName}' cannot be flattened`;
|
|
8
8
|
const schema = collection.schema.fields[options.columnName];
|
|
9
9
|
if (!schema)
|
|
10
|
-
throw new Error(`${errorMessage}
|
|
10
|
+
throw new Error(`${errorMessage} (not found).`);
|
|
11
11
|
if (schema.type !== 'Column')
|
|
12
|
-
throw new Error(`${errorMessage}
|
|
13
|
-
if (typeof schema.columnType === 'string')
|
|
14
|
-
throw new Error(`${errorMessage}' (primitive).`);
|
|
12
|
+
throw new Error(`${errorMessage} (not a column).`);
|
|
15
13
|
if (Array.isArray(schema.columnType))
|
|
16
|
-
throw new Error(`${errorMessage}
|
|
14
|
+
throw new Error(`${errorMessage} (array not supported).`);
|
|
15
|
+
if (!columnType && typeof schema.columnType === 'string') {
|
|
16
|
+
if (schema.columnType === 'Json') {
|
|
17
|
+
throw new Error(`${errorMessage} using flattenColumn please use flattenJsonColumn.`);
|
|
18
|
+
}
|
|
19
|
+
throw new Error(`${errorMessage} (primitive type '${schema.columnType}' not supported).`);
|
|
20
|
+
}
|
|
17
21
|
let paths = include?.map(p => (0, helpers_1.includeStrToPath)(columnName, p));
|
|
18
22
|
if (!paths?.length) {
|
|
19
23
|
if (level < 1)
|
|
20
24
|
throw new Error('options.level must be greater than 0.');
|
|
21
|
-
paths = (0, helpers_1.listPaths)(columnName, schema.columnType, level ?? 1);
|
|
25
|
+
paths = (0, helpers_1.listPaths)(columnName, columnType || schema.columnType, level ?? 1);
|
|
22
26
|
}
|
|
23
27
|
paths = paths.filter(path => !exclude?.find(p => path === (0, helpers_1.includeStrToPath)(columnName, p)));
|
|
24
28
|
if (!paths.length)
|
|
25
|
-
throw new Error(`${errorMessage}
|
|
29
|
+
throw new Error(`${errorMessage} (no fields match level/include/exclude).`);
|
|
26
30
|
return paths;
|
|
27
31
|
}
|
|
28
32
|
/**
|
|
@@ -46,7 +50,7 @@ async function flattenColumn(dataSource, collection, options) {
|
|
|
46
50
|
const schema = collection.schema.fields[options.columnName];
|
|
47
51
|
// Add fields that reads the value from the deeply nested column
|
|
48
52
|
for (const path of paths) {
|
|
49
|
-
collection.addField(path, (0, customization_1.makeField)(options.columnName, path, schema));
|
|
53
|
+
collection.addField(path, (0, customization_1.makeField)(options.columnName, path, options.columnType || schema.columnType));
|
|
50
54
|
}
|
|
51
55
|
// Implement write
|
|
52
56
|
if (!schema.isReadOnly && !options.readonly) {
|
|
@@ -62,4 +66,4 @@ async function flattenColumn(dataSource, collection, options) {
|
|
|
62
66
|
}
|
|
63
67
|
}
|
|
64
68
|
exports.default = flattenColumn;
|
|
65
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
69
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZmxhdHRlbi1jb2x1bW4vaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFPQSxtREFBOEY7QUFDOUYsdUNBQXdEO0FBV3hELFNBQVMsY0FBYyxDQUFDLFVBQWdDLEVBQUUsT0FBNkI7SUFDckYsTUFBTSxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsR0FBRyxPQUFPLENBQUM7SUFDcEUsTUFBTSxZQUFZLEdBQUcsSUFBSSxVQUFVLENBQUMsSUFBSSxJQUFJLFVBQVUsdUJBQXVCLENBQUM7SUFDOUUsTUFBTSxNQUFNLEdBQUcsVUFBVSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBRTVELElBQUksQ0FBQyxNQUFNO1FBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyxHQUFHLFlBQVksZUFBZSxDQUFDLENBQUM7SUFDN0QsSUFBSSxNQUFNLENBQUMsSUFBSSxLQUFLLFFBQVE7UUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLEdBQUcsWUFBWSxrQkFBa0IsQ0FBQyxDQUFDO0lBRWpGLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDO1FBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyxHQUFHLFlBQVkseUJBQXlCLENBQUMsQ0FBQztJQUVoRyxJQUFJLENBQUMsVUFBVSxJQUFJLE9BQU8sTUFBTSxDQUFDLFVBQVUsS0FBSyxRQUFRLEVBQUU7UUFDeEQsSUFBSSxNQUFNLENBQUMsVUFBVSxLQUFLLE1BQU0sRUFBRTtZQUNoQyxNQUFNLElBQUksS0FBSyxDQUFDLEdBQUcsWUFBWSxvREFBb0QsQ0FBQyxDQUFDO1NBQ3RGO1FBRUQsTUFBTSxJQUFJLEtBQUssQ0FBQyxHQUFHLFlBQVkscUJBQXFCLE1BQU0sQ0FBQyxVQUFVLG1CQUFtQixDQUFDLENBQUM7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
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import type { CollectionCustomizer, DataSourceCustomizer } from '@forestadmin/datasource-customizer';
|
|
2
|
+
import { ColumnType } from '@forestadmin/datasource-toolkit';
|
|
3
|
+
export type FlattenJsonColumnOptions = {
|
|
4
|
+
columnName: string;
|
|
5
|
+
columnType: {
|
|
6
|
+
[key: string]: ColumnType;
|
|
7
|
+
};
|
|
8
|
+
level?: number;
|
|
9
|
+
readonly?: boolean;
|
|
10
|
+
keepOriginalColumn?: boolean;
|
|
11
|
+
};
|
|
12
|
+
/**
|
|
13
|
+
* Flatten a JSON column which have a composite type
|
|
14
|
+
*
|
|
15
|
+
* @param dataSource The dataSource customizer provided by the agent.
|
|
16
|
+
* @param collection The collection customizer instance provided by the agent.
|
|
17
|
+
* @param options The options of the plugin.
|
|
18
|
+
* @param options.columnName The name of the json column that you want to flatten.
|
|
19
|
+
* @param options.columnType A json object representing a subset of the shape of the data in
|
|
20
|
+
* the json column, with keys the column names, and values either json (to flatten further)
|
|
21
|
+
* or the primitive type.
|
|
22
|
+
* @param options.level The maximum level of nested fields to import by default all levels. if
|
|
23
|
+
* missing the default value is the level of nesting of options.columnType
|
|
24
|
+
* @param options.readonly Should the imported fields be read-only?
|
|
25
|
+
* @param options.keepOriginalColumn Should the original column be kept?
|
|
26
|
+
*
|
|
27
|
+
* @example
|
|
28
|
+
* collection.use(flattenJsonColumn, {
|
|
29
|
+
* columnName: 'address',
|
|
30
|
+
* columnType: {
|
|
31
|
+
* zipCode : 'String',
|
|
32
|
+
* road: {
|
|
33
|
+
* name: 'String', number: 'Number'
|
|
34
|
+
* }
|
|
35
|
+
* city: 'String',
|
|
36
|
+
* country: 'String'
|
|
37
|
+
* },
|
|
38
|
+
* });
|
|
39
|
+
*
|
|
40
|
+
* @example
|
|
41
|
+
* collection.use(flattenJsonColumn, {
|
|
42
|
+
* columnName: 'meta',
|
|
43
|
+
* columnType: {
|
|
44
|
+
* bio: 'String',
|
|
45
|
+
* sex: 'String',
|
|
46
|
+
* sidejob: { area: 'String', job: 'String' },
|
|
47
|
+
* },
|
|
48
|
+
* readonly: true,
|
|
49
|
+
* level: 2,
|
|
50
|
+
* keepOriginalColumn: true,
|
|
51
|
+
* });
|
|
52
|
+
*/
|
|
53
|
+
export default function flattenJsonColumn(dataSource: DataSourceCustomizer, collection: CollectionCustomizer, options?: FlattenJsonColumnOptions): void;
|
|
54
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const flatten_column_1 = __importDefault(require("../flatten-column"));
|
|
7
|
+
const getObjectDepth = (obj) => Object(obj) === obj ? 1 + Math.max(-1, ...Object.values(obj).map(getObjectDepth)) : 0;
|
|
8
|
+
/**
|
|
9
|
+
* Flatten a JSON column which have a composite type
|
|
10
|
+
*
|
|
11
|
+
* @param dataSource The dataSource customizer provided by the agent.
|
|
12
|
+
* @param collection The collection customizer instance provided by the agent.
|
|
13
|
+
* @param options The options of the plugin.
|
|
14
|
+
* @param options.columnName The name of the json column that you want to flatten.
|
|
15
|
+
* @param options.columnType A json object representing a subset of the shape of the data in
|
|
16
|
+
* the json column, with keys the column names, and values either json (to flatten further)
|
|
17
|
+
* or the primitive type.
|
|
18
|
+
* @param options.level The maximum level of nested fields to import by default all levels. if
|
|
19
|
+
* missing the default value is the level of nesting of options.columnType
|
|
20
|
+
* @param options.readonly Should the imported fields be read-only?
|
|
21
|
+
* @param options.keepOriginalColumn Should the original column be kept?
|
|
22
|
+
*
|
|
23
|
+
* @example
|
|
24
|
+
* collection.use(flattenJsonColumn, {
|
|
25
|
+
* columnName: 'address',
|
|
26
|
+
* columnType: {
|
|
27
|
+
* zipCode : 'String',
|
|
28
|
+
* road: {
|
|
29
|
+
* name: 'String', number: 'Number'
|
|
30
|
+
* }
|
|
31
|
+
* city: 'String',
|
|
32
|
+
* country: 'String'
|
|
33
|
+
* },
|
|
34
|
+
* });
|
|
35
|
+
*
|
|
36
|
+
* @example
|
|
37
|
+
* collection.use(flattenJsonColumn, {
|
|
38
|
+
* columnName: 'meta',
|
|
39
|
+
* columnType: {
|
|
40
|
+
* bio: 'String',
|
|
41
|
+
* sex: 'String',
|
|
42
|
+
* sidejob: { area: 'String', job: 'String' },
|
|
43
|
+
* },
|
|
44
|
+
* readonly: true,
|
|
45
|
+
* level: 2,
|
|
46
|
+
* keepOriginalColumn: true,
|
|
47
|
+
* });
|
|
48
|
+
*/
|
|
49
|
+
function flattenJsonColumn(dataSource, collection, options) {
|
|
50
|
+
if (!options || !options.columnName || !options.columnType) {
|
|
51
|
+
throw new Error('options.columnName and options.columnType are required.');
|
|
52
|
+
}
|
|
53
|
+
if (!collection)
|
|
54
|
+
throw new Error('This plugin can only be called when customizing collections.');
|
|
55
|
+
const errorMessage = `'${collection.name}.${options.columnName} cannot be flattened`;
|
|
56
|
+
const schema = collection.schema.fields[options.columnName];
|
|
57
|
+
if (schema?.columnType !== 'Json') {
|
|
58
|
+
throw new Error(`${errorMessage}' (only available on primitive JSON column) prefer flattenColumn otherwise.`);
|
|
59
|
+
}
|
|
60
|
+
if (!Object.keys(options.columnType).length) {
|
|
61
|
+
throw new Error(
|
|
62
|
+
// eslint-disable-next-line max-len
|
|
63
|
+
'options.columnType must be defined as json object representing a subset of the shape of the data in the json column.');
|
|
64
|
+
}
|
|
65
|
+
collection.use(flatten_column_1.default, {
|
|
66
|
+
columnName: options.columnName,
|
|
67
|
+
columnType: options.columnType,
|
|
68
|
+
readonly: options.readonly,
|
|
69
|
+
level: options.level ?? getObjectDepth(options.columnType),
|
|
70
|
+
});
|
|
71
|
+
if (!options.keepOriginalColumn) {
|
|
72
|
+
collection.removeField(options.columnName);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
exports.default = flattenJsonColumn;
|
|
76
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZmxhdHRlbi1qc29uLWNvbHVtbi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQU9BLHVFQUE4QztBQVU5QyxNQUFNLGNBQWMsR0FBRyxDQUFDLEdBQVcsRUFBRSxFQUFFLENBQ3JDLE1BQU0sQ0FBQyxHQUFHLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBRXhGOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBd0NHO0FBQ0gsU0FBd0IsaUJBQWlCLENBQ3ZDLFVBQWdDLEVBQ2hDLFVBQWdDLEVBQ2hDLE9BQWtDO0lBRWxDLElBQUksQ0FBQyxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRTtRQUMxRCxNQUFNLElBQUksS0FBSyxDQUFDLHlEQUF5RCxDQUFDLENBQUM7S0FDNUU7SUFFRCxJQUFJLENBQUMsVUFBVTtRQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsOERBQThELENBQUMsQ0FBQztJQUVqRyxNQUFNLFlBQVksR0FBRyxJQUFJLFVBQVUsQ0FBQyxJQUFJLElBQUksT0FBTyxDQUFDLFVBQVUsc0JBQXNCLENBQUM7SUFDckYsTUFBTSxNQUFNLEdBQUcsVUFBVSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBaUIsQ0FBQztJQUU1RSxJQUFJLE1BQU0sRUFBRSxVQUFVLEtBQUssTUFBTSxFQUFFO1FBQ2pDLE1BQU0sSUFBSSxLQUFLLENBQ2IsR0FBRyxZQUFZLDZFQUE2RSxDQUM3RixDQUFDO0tBQ0g7SUFFRCxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsTUFBTSxFQUFFO1FBQzNDLE1BQU0sSUFBSSxLQUFLO1FBQ2IsbUNBQW1DO1FBQ25DLHNIQUFzSCxDQUN2SCxDQUFDO0tBQ0g7SUFFRCxVQUFVLENBQUMsR0FBRyxDQUFDLHdCQUFhLEVBQUU7UUFDNUIsVUFBVSxFQUFFLE9BQU8sQ0FBQyxVQUFVO1FBQzlCLFVBQVUsRUFBRSxPQUFPLENBQUMsVUFBVTtRQUM5QixRQUFRLEVBQUUsT0FBTyxDQUFDLFFBQVE7UUFDMUIsS0FBSyxFQUFFLE9BQU8sQ0FBQyxLQUFLLElBQUksY0FBYyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUM7S0FDM0QsQ0FBQyxDQUFDO0lBRUgsSUFBSSxDQUFDLE9BQU8sQ0FBQyxrQkFBa0IsRUFBRTtRQUMvQixVQUFVLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQztLQUM1QztBQUNILENBQUM7QUFyQ0Qsb0NBcUNDIn0=
|
package/dist/index.d.ts
CHANGED
package/dist/index.js
CHANGED
|
@@ -3,9 +3,11 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.flattenColumn = exports.flattenRelation = void 0;
|
|
6
|
+
exports.flattenJsonColumn = exports.flattenColumn = exports.flattenRelation = void 0;
|
|
7
7
|
var index_1 = require("./flatten-relation/index");
|
|
8
8
|
Object.defineProperty(exports, "flattenRelation", { enumerable: true, get: function () { return __importDefault(index_1).default; } });
|
|
9
9
|
var index_2 = require("./flatten-column/index");
|
|
10
10
|
Object.defineProperty(exports, "flattenColumn", { enumerable: true, get: function () { return __importDefault(index_2).default; } });
|
|
11
|
-
|
|
11
|
+
var index_3 = require("./flatten-json-column/index");
|
|
12
|
+
Object.defineProperty(exports, "flattenJsonColumn", { enumerable: true, get: function () { return __importDefault(index_3).default; } });
|
|
13
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsa0RBQXNFO0FBQTdELHlIQUFBLE9BQU8sT0FBbUI7QUFDbkMsZ0RBQWtFO0FBQXpELHVIQUFBLE9BQU8sT0FBaUI7QUFDakMscURBQTJFO0FBQWxFLDJIQUFBLE9BQU8sT0FBcUIifQ==
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@forestadmin/plugin-flattener",
|
|
3
|
-
"version": "1.0
|
|
3
|
+
"version": "1.1.0",
|
|
4
4
|
"description": "A plugin that allows to flatten columns and relations in Forest Admin",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"license": "GPL-3.0",
|
|
@@ -24,11 +24,11 @@
|
|
|
24
24
|
"test": "jest"
|
|
25
25
|
},
|
|
26
26
|
"devDependencies": {
|
|
27
|
-
"@forestadmin/datasource-customizer": "1.43.
|
|
27
|
+
"@forestadmin/datasource-customizer": "1.43.6",
|
|
28
28
|
"@types/object-hash": "^3.0.2"
|
|
29
29
|
},
|
|
30
30
|
"dependencies": {
|
|
31
|
-
"@forestadmin/datasource-toolkit": "1.32.
|
|
31
|
+
"@forestadmin/datasource-toolkit": "1.32.2",
|
|
32
32
|
"object-hash": "^3.0.0"
|
|
33
33
|
}
|
|
34
34
|
}
|