@forestadmin/agent 1.0.0-beta.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/LICENSE +674 -0
- package/README.md +0 -0
- package/dist/agent/forestadmin-http-driver.d.ts +34 -0
- package/dist/agent/forestadmin-http-driver.js +73 -0
- package/dist/agent/routes/access/chart.d.ts +17 -0
- package/dist/agent/routes/access/chart.js +125 -0
- package/dist/agent/routes/access/count-related.d.ts +9 -0
- package/dist/agent/routes/access/count-related.js +24 -0
- package/dist/agent/routes/access/count.d.ts +9 -0
- package/dist/agent/routes/access/count.js +24 -0
- package/dist/agent/routes/access/csv-related.d.ts +9 -0
- package/dist/agent/routes/access/csv-related.js +33 -0
- package/dist/agent/routes/access/csv.d.ts +9 -0
- package/dist/agent/routes/access/csv.js +30 -0
- package/dist/agent/routes/access/get.d.ts +9 -0
- package/dist/agent/routes/access/get.js +28 -0
- package/dist/agent/routes/access/list-related.d.ts +9 -0
- package/dist/agent/routes/access/list-related.js +26 -0
- package/dist/agent/routes/access/list.d.ts +9 -0
- package/dist/agent/routes/access/list.js +23 -0
- package/dist/agent/routes/base-route.d.ts +14 -0
- package/dist/agent/routes/base-route.js +16 -0
- package/dist/agent/routes/collection-route.d.ts +12 -0
- package/dist/agent/routes/collection-route.js +20 -0
- package/dist/agent/routes/index.d.ts +30 -0
- package/dist/agent/routes/index.js +90 -0
- package/dist/agent/routes/modification/action.d.ts +17 -0
- package/dist/agent/routes/modification/action.js +103 -0
- package/dist/agent/routes/modification/associate-related.d.ts +12 -0
- package/dist/agent/routes/modification/associate-related.js +49 -0
- package/dist/agent/routes/modification/create.d.ts +14 -0
- package/dist/agent/routes/modification/create.js +81 -0
- package/dist/agent/routes/modification/delete.d.ts +11 -0
- package/dist/agent/routes/modification/delete.js +40 -0
- package/dist/agent/routes/modification/dissociate-delete-related.d.ts +20 -0
- package/dist/agent/routes/modification/dissociate-delete-related.js +88 -0
- package/dist/agent/routes/modification/update-relation.d.ts +11 -0
- package/dist/agent/routes/modification/update-relation.js +53 -0
- package/dist/agent/routes/modification/update.d.ts +9 -0
- package/dist/agent/routes/modification/update.js +29 -0
- package/dist/agent/routes/relation-route.d.ts +10 -0
- package/dist/agent/routes/relation-route.js +18 -0
- package/dist/agent/routes/security/authentication.d.ts +17 -0
- package/dist/agent/routes/security/authentication.js +86 -0
- package/dist/agent/routes/security/ip-whitelist.d.ts +14 -0
- package/dist/agent/routes/security/ip-whitelist.js +35 -0
- package/dist/agent/routes/security/scope-invalidation.d.ts +11 -0
- package/dist/agent/routes/security/scope-invalidation.js +28 -0
- package/dist/agent/routes/system/error-handling.d.ts +11 -0
- package/dist/agent/routes/system/error-handling.js +56 -0
- package/dist/agent/routes/system/healthcheck.d.ts +11 -0
- package/dist/agent/routes/system/healthcheck.js +22 -0
- package/dist/agent/routes/system/logger.d.ts +10 -0
- package/dist/agent/routes/system/logger.js +36 -0
- package/dist/agent/services/index.d.ts +10 -0
- package/dist/agent/services/index.js +12 -0
- package/dist/agent/services/permissions.d.ts +19 -0
- package/dist/agent/services/permissions.js +79 -0
- package/dist/agent/services/serializer.d.ts +17 -0
- package/dist/agent/services/serializer.js +120 -0
- package/dist/agent/types.d.ts +23 -0
- package/dist/agent/types.js +22 -0
- package/dist/agent/utils/body-parser.d.ts +7 -0
- package/dist/agent/utils/body-parser.js +18 -0
- package/dist/agent/utils/context-filter-factory.d.ts +7 -0
- package/dist/agent/utils/context-filter-factory.js +29 -0
- package/dist/agent/utils/csv-generator.d.ts +12 -0
- package/dist/agent/utils/csv-generator.js +39 -0
- package/dist/agent/utils/csv-route-context.d.ts +5 -0
- package/dist/agent/utils/csv-route-context.js +14 -0
- package/dist/agent/utils/forest-http-api.d.ts +63 -0
- package/dist/agent/utils/forest-http-api.js +173 -0
- package/dist/agent/utils/forest-schema/action-values.d.ts +34 -0
- package/dist/agent/utils/forest-schema/action-values.js +144 -0
- package/dist/agent/utils/forest-schema/emitter.d.ts +20 -0
- package/dist/agent/utils/forest-schema/emitter.js +70 -0
- package/dist/agent/utils/forest-schema/filterable.d.ts +16 -0
- package/dist/agent/utils/forest-schema/filterable.js +68 -0
- package/dist/agent/utils/forest-schema/generator-actions.d.ts +14 -0
- package/dist/agent/utils/forest-schema/generator-actions.js +99 -0
- package/dist/agent/utils/forest-schema/generator-collection.d.ts +7 -0
- package/dist/agent/utils/forest-schema/generator-collection.js +31 -0
- package/dist/agent/utils/forest-schema/generator-fields.d.ts +13 -0
- package/dist/agent/utils/forest-schema/generator-fields.js +131 -0
- package/dist/agent/utils/forest-schema/generator-segments.d.ts +6 -0
- package/dist/agent/utils/forest-schema/generator-segments.js +9 -0
- package/dist/agent/utils/forest-schema/types.d.ts +79 -0
- package/dist/agent/utils/forest-schema/types.js +16 -0
- package/dist/agent/utils/forest-schema/validation.d.ts +10 -0
- package/dist/agent/utils/forest-schema/validation.js +26 -0
- package/dist/agent/utils/http-driver-options.d.ts +13 -0
- package/dist/agent/utils/http-driver-options.js +86 -0
- package/dist/agent/utils/id.d.ts +8 -0
- package/dist/agent/utils/id.js +43 -0
- package/dist/agent/utils/query-string.d.ts +14 -0
- package/dist/agent/utils/query-string.js +130 -0
- package/dist/builder/agent.d.ts +81 -0
- package/dist/builder/agent.js +113 -0
- package/dist/builder/collection.d.ts +148 -0
- package/dist/builder/collection.js +226 -0
- package/dist/builder/types.d.ts +5 -0
- package/dist/builder/types.js +3 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.js +22 -0
- package/dist/types.d.ts +22 -0
- package/dist/types.js +11 -0
- package/dist/utils/csv-generator.d.ts +12 -0
- package/dist/utils/csv-generator.js +39 -0
- package/package.json +55 -0
|
@@ -0,0 +1,99 @@
|
|
|
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 datasource_toolkit_1 = require("@forestadmin/datasource-toolkit");
|
|
7
|
+
const path_1 = __importDefault(require("path"));
|
|
8
|
+
const action_values_1 = __importDefault(require("./action-values"));
|
|
9
|
+
class SchemaGeneratorActions {
|
|
10
|
+
static async buildSchema(prefix, collection, name) {
|
|
11
|
+
const schema = collection.schema.actions[name];
|
|
12
|
+
const actionIndex = Object.keys(collection.schema.actions).indexOf(name);
|
|
13
|
+
// Generate url-safe friendly name (which won't be unique, but that's OK).
|
|
14
|
+
const slug = name.toLocaleLowerCase().replace(/[^a-z0-9-]+/g, '-');
|
|
15
|
+
const fields = await SchemaGeneratorActions.buildFields(collection, name, schema);
|
|
16
|
+
return {
|
|
17
|
+
id: `${collection.name}-${actionIndex}-${slug}`,
|
|
18
|
+
name,
|
|
19
|
+
type: schema.scope.toLowerCase(),
|
|
20
|
+
baseUrl: null,
|
|
21
|
+
endpoint: path_1.default.join('/', prefix, '_actions', collection.name, String(actionIndex), slug),
|
|
22
|
+
httpMethod: 'POST',
|
|
23
|
+
redirect: null,
|
|
24
|
+
download: Boolean(schema.generateFile),
|
|
25
|
+
fields,
|
|
26
|
+
hooks: {
|
|
27
|
+
load: !schema.staticForm,
|
|
28
|
+
// Always registering the change hook has no consequences, even if we don't use it.
|
|
29
|
+
change: ['changeHook'],
|
|
30
|
+
},
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
/** Build schema for given field */
|
|
34
|
+
static buildFieldSchema(dataSource, field) {
|
|
35
|
+
const { label, description, isRequired, isReadOnly, watchChanges, type } = field;
|
|
36
|
+
const output = { description, isRequired, isReadOnly };
|
|
37
|
+
output.field = label;
|
|
38
|
+
output.value = action_values_1.default.valueToForest(field, field.value);
|
|
39
|
+
if (watchChanges)
|
|
40
|
+
output.hook = 'changeHook';
|
|
41
|
+
if (type === 'Collection') {
|
|
42
|
+
const collection = dataSource.getCollection(field.collectionName);
|
|
43
|
+
const [pk] = datasource_toolkit_1.SchemaUtils.getPrimaryKeys(collection.schema);
|
|
44
|
+
const pkSchema = collection.schema.fields[pk];
|
|
45
|
+
output.type = pkSchema.columnType;
|
|
46
|
+
output.reference = `${collection.name}.${pk}`;
|
|
47
|
+
}
|
|
48
|
+
else if (type.endsWith('List')) {
|
|
49
|
+
output.type = [type.substring(0, type.length - 4)];
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
output.type = type;
|
|
53
|
+
}
|
|
54
|
+
if (type === 'Enum' || type === 'EnumList') {
|
|
55
|
+
output.enums = field.enumValues;
|
|
56
|
+
}
|
|
57
|
+
return output;
|
|
58
|
+
}
|
|
59
|
+
static async buildFields(collection, name, schema) {
|
|
60
|
+
// We want the schema to be generated on usage => send dummy schema
|
|
61
|
+
if (!schema.staticForm) {
|
|
62
|
+
return SchemaGeneratorActions.defaultFields;
|
|
63
|
+
}
|
|
64
|
+
// Ask the action to generate a form
|
|
65
|
+
const fields = await collection.getForm(name);
|
|
66
|
+
if (fields) {
|
|
67
|
+
// When sending to server, we need to rename 'value' into 'defaultValue'
|
|
68
|
+
// otherwise, it does not gets applied 🤷♂️
|
|
69
|
+
return fields.map(field => {
|
|
70
|
+
const newField = SchemaGeneratorActions.buildFieldSchema(collection.dataSource, field);
|
|
71
|
+
newField.defaultValue = newField.value;
|
|
72
|
+
delete newField.value;
|
|
73
|
+
return newField;
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
return [];
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
exports.default = SchemaGeneratorActions;
|
|
80
|
+
/**
|
|
81
|
+
* 'fields' sent to forestadmin-server when we want to generate the form on demand.
|
|
82
|
+
* This works around a bug in frontend which won't call the server if no fields are defined.
|
|
83
|
+
*/
|
|
84
|
+
SchemaGeneratorActions.defaultFields = [
|
|
85
|
+
{
|
|
86
|
+
field: 'Loading...',
|
|
87
|
+
type: 'String',
|
|
88
|
+
isReadOnly: true,
|
|
89
|
+
defaultValue: 'Form is loading',
|
|
90
|
+
value: undefined,
|
|
91
|
+
description: '',
|
|
92
|
+
enums: null,
|
|
93
|
+
hook: null,
|
|
94
|
+
isRequired: false,
|
|
95
|
+
reference: null,
|
|
96
|
+
widget: null,
|
|
97
|
+
},
|
|
98
|
+
];
|
|
99
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VuZXJhdG9yLWFjdGlvbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvYWdlbnQvdXRpbHMvZm9yZXN0LXNjaGVtYS9nZW5lcmF0b3ItYWN0aW9ucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLHdFQVF5QztBQUN6QyxnREFBd0I7QUFHeEIsb0VBQW1EO0FBRW5ELE1BQXFCLHNCQUFzQjtJQXFCekMsTUFBTSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQ3RCLE1BQWMsRUFDZCxVQUFzQixFQUN0QixJQUFZO1FBRVosTUFBTSxNQUFNLEdBQUcsVUFBVSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDL0MsTUFBTSxXQUFXLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUV6RSwwRUFBMEU7UUFDMUUsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUMsT0FBTyxDQUFDLGNBQWMsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUNuRSxNQUFNLE1BQU0sR0FBRyxNQUFNLHNCQUFzQixDQUFDLFdBQVcsQ0FBQyxVQUFVLEVBQUUsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBRWxGLE9BQU87WUFDTCxFQUFFLEVBQUUsR0FBRyxVQUFVLENBQUMsSUFBSSxJQUFJLFdBQVcsSUFBSSxJQUFJLEVBQUU7WUFDL0MsSUFBSTtZQUNKLElBQUksRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLFdBQVcsRUFBa0M7WUFDaEUsT0FBTyxFQUFFLElBQUk7WUFDYixRQUFRLEVBQUUsY0FBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxVQUFVLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxXQUFXLENBQUMsRUFBRSxJQUFJLENBQUM7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
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { Collection } from '@forestadmin/datasource-toolkit';
|
|
2
|
+
import { ForestServerCollection } from './types';
|
|
3
|
+
export default class SchemaGeneratorCollection {
|
|
4
|
+
/** Build forest-server schema for a collection */
|
|
5
|
+
static buildSchema(prefix: string, collection: Collection): Promise<ForestServerCollection>;
|
|
6
|
+
}
|
|
7
|
+
//# sourceMappingURL=generator-collection.d.ts.map
|
|
@@ -0,0 +1,31 @@
|
|
|
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 datasource_toolkit_1 = require("@forestadmin/datasource-toolkit");
|
|
7
|
+
const generator_actions_1 = __importDefault(require("./generator-actions"));
|
|
8
|
+
const generator_fields_1 = __importDefault(require("./generator-fields"));
|
|
9
|
+
const generator_segments_1 = __importDefault(require("./generator-segments"));
|
|
10
|
+
class SchemaGeneratorCollection {
|
|
11
|
+
/** Build forest-server schema for a collection */
|
|
12
|
+
static async buildSchema(prefix, collection) {
|
|
13
|
+
return {
|
|
14
|
+
actions: await Promise.all(Object.keys(collection.schema.actions).map(name => generator_actions_1.default.buildSchema(prefix, collection, name))),
|
|
15
|
+
fields: Object.keys(collection.schema.fields)
|
|
16
|
+
.filter(name => !datasource_toolkit_1.SchemaUtils.isForeignKey(collection.schema, name))
|
|
17
|
+
.map(name => generator_fields_1.default.buildSchema(collection, name)),
|
|
18
|
+
icon: null,
|
|
19
|
+
integration: null,
|
|
20
|
+
isReadOnly: Object.values(collection.schema.fields).every(field => field.type === 'Column' && field.isReadOnly),
|
|
21
|
+
isSearchable: collection.schema.searchable,
|
|
22
|
+
isVirtual: false,
|
|
23
|
+
name: collection.name,
|
|
24
|
+
onlyForRelationships: false,
|
|
25
|
+
paginationType: 'page',
|
|
26
|
+
segments: collection.schema.segments.map(name => generator_segments_1.default.buildSchema(collection, name)),
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
exports.default = SchemaGeneratorCollection;
|
|
31
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VuZXJhdG9yLWNvbGxlY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvYWdlbnQvdXRpbHMvZm9yZXN0LXNjaGVtYS9nZW5lcmF0b3ItY29sbGVjdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLHdFQUEwRTtBQUUxRSw0RUFBeUQ7QUFDekQsMEVBQXVEO0FBQ3ZELDhFQUEyRDtBQUUzRCxNQUFxQix5QkFBeUI7SUFDNUMsa0RBQWtEO0lBQ2xELE1BQU0sQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUN0QixNQUFjLEVBQ2QsVUFBc0I7UUFFdEIsT0FBTztZQUNMLE9BQU8sRUFBRSxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQ3hCLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FDaEQsMkJBQXNCLENBQUMsV0FBVyxDQUFDLE1BQU0sRUFBRSxVQUFVLEVBQUUsSUFBSSxDQUFDLENBQzdELENBQ0Y7WUFDRCxNQUFNLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQztpQkFDMUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxnQ0FBVyxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDO2lCQUNsRSxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQywwQkFBcUIsQ0FBQyxXQUFXLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ25FLElBQUksRUFBRSxJQUFJO1lBQ1YsV0FBVyxFQUFFLElBQUk7WUFDakIsVUFBVSxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxLQUFLLENBQ3ZELEtBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLElBQUksS0FBSyxRQUFRLElBQUksS0FBSyxDQUFDLFVBQVUsQ0FDckQ7WUFDRCxZQUFZLEVBQUUsVUFBVSxDQUFDLE1BQU0sQ0FBQyxVQUFVO1lBQzFDLFNBQVMsRUFBRSxLQUFLO1lBQ2hCLElBQUksRUFBRSxVQUFVLENBQUMsSUFBSTtZQUNyQixvQkFBb0IsRUFBRSxLQUFLO1lBQzNCLGNBQWMsRUFBRSxNQUFNO1lBQ3RCLFFBQVEsRUFBRSxVQUFVLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FDOUMsNEJBQXVCLENBQUMsV0FBVyxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsQ0FDdEQ7U0FDRixDQUFDO0lBQ0osQ0FBQztDQUNGO0FBOUJELDRDQThCQyJ9
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { Collection } from '@forestadmin/datasource-toolkit';
|
|
2
|
+
import { ForestServerField } from './types';
|
|
3
|
+
export default class SchemaGeneratorFields {
|
|
4
|
+
private static relationMap;
|
|
5
|
+
static buildSchema(collection: Collection, name: string): ForestServerField;
|
|
6
|
+
private static buildColumnSchema;
|
|
7
|
+
private static buildToManyRelationSchema;
|
|
8
|
+
private static isForeignCollectionFilterable;
|
|
9
|
+
private static buildOneToOneSchema;
|
|
10
|
+
private static buildManyToOneSchema;
|
|
11
|
+
private static buildRelationSchema;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=generator-fields.d.ts.map
|
|
@@ -0,0 +1,131 @@
|
|
|
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 datasource_toolkit_1 = require("@forestadmin/datasource-toolkit");
|
|
7
|
+
const filterable_1 = __importDefault(require("./filterable"));
|
|
8
|
+
const validation_1 = __importDefault(require("./validation"));
|
|
9
|
+
class SchemaGeneratorFields {
|
|
10
|
+
static buildSchema(collection, name) {
|
|
11
|
+
const { type } = collection.schema.fields[name];
|
|
12
|
+
let schema;
|
|
13
|
+
switch (type) {
|
|
14
|
+
case 'Column':
|
|
15
|
+
schema = SchemaGeneratorFields.buildColumnSchema(collection, name);
|
|
16
|
+
break;
|
|
17
|
+
case 'ManyToOne':
|
|
18
|
+
case 'OneToMany':
|
|
19
|
+
case 'ManyToMany':
|
|
20
|
+
case 'OneToOne':
|
|
21
|
+
schema = SchemaGeneratorFields.buildRelationSchema(collection, name);
|
|
22
|
+
break;
|
|
23
|
+
default:
|
|
24
|
+
throw new Error('Invalid field type');
|
|
25
|
+
}
|
|
26
|
+
return Object.entries(schema)
|
|
27
|
+
.sort()
|
|
28
|
+
.reduce((sortedSchema, [key, value]) => {
|
|
29
|
+
sortedSchema[key] = value;
|
|
30
|
+
return sortedSchema;
|
|
31
|
+
}, {});
|
|
32
|
+
}
|
|
33
|
+
static buildColumnSchema(collection, name) {
|
|
34
|
+
const column = collection.schema.fields[name];
|
|
35
|
+
return {
|
|
36
|
+
defaultValue: column.defaultValue ?? null,
|
|
37
|
+
enums: column.enumValues ?? null,
|
|
38
|
+
field: name,
|
|
39
|
+
integration: null,
|
|
40
|
+
inverseOf: null,
|
|
41
|
+
isFilterable: filterable_1.default.isFilterable(column.columnType, column.filterOperators),
|
|
42
|
+
isPrimaryKey: Boolean(column.isPrimaryKey),
|
|
43
|
+
isReadOnly: Boolean(column.isReadOnly),
|
|
44
|
+
isRequired: column.validation?.some(v => v.operator === 'Present') ?? false,
|
|
45
|
+
isSortable: Boolean(column.isSortable),
|
|
46
|
+
isVirtual: false,
|
|
47
|
+
reference: null,
|
|
48
|
+
type: column.columnType,
|
|
49
|
+
validations: validation_1.default.convertValidationList(column.validation),
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
static buildToManyRelationSchema(relation, foreignCollection, baseSchema) {
|
|
53
|
+
const key = relation.type === 'OneToMany' ? relation.originKeyTarget : relation.foreignKeyTarget;
|
|
54
|
+
const keySchema = foreignCollection.schema.fields[key];
|
|
55
|
+
return {
|
|
56
|
+
type: [keySchema.columnType],
|
|
57
|
+
defaultValue: null,
|
|
58
|
+
isFilterable: false,
|
|
59
|
+
isPrimaryKey: false,
|
|
60
|
+
isRequired: false,
|
|
61
|
+
isSortable: false,
|
|
62
|
+
validations: [],
|
|
63
|
+
reference: `${foreignCollection.name}.${key}`,
|
|
64
|
+
...baseSchema,
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
static isForeignCollectionFilterable(foreignCollection) {
|
|
68
|
+
return Object.values(foreignCollection.schema.fields).some(field => field.type === 'Column' &&
|
|
69
|
+
filterable_1.default.isFilterable(field.columnType, field.filterOperators));
|
|
70
|
+
}
|
|
71
|
+
static buildOneToOneSchema(relation, foreignCollection, baseSchema) {
|
|
72
|
+
const key = relation.originKeyTarget;
|
|
73
|
+
const keySchema = foreignCollection.schema.fields[key];
|
|
74
|
+
return {
|
|
75
|
+
type: keySchema.columnType,
|
|
76
|
+
defaultValue: null,
|
|
77
|
+
isFilterable: SchemaGeneratorFields.isForeignCollectionFilterable(foreignCollection),
|
|
78
|
+
isPrimaryKey: false,
|
|
79
|
+
isRequired: false,
|
|
80
|
+
isSortable: Boolean(keySchema.isSortable),
|
|
81
|
+
validations: [],
|
|
82
|
+
reference: `${foreignCollection.name}.${key}`,
|
|
83
|
+
...baseSchema,
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
static buildManyToOneSchema(relation, collection, foreignCollection, baseSchema) {
|
|
87
|
+
const key = relation.foreignKey;
|
|
88
|
+
const keySchema = collection.schema.fields[key];
|
|
89
|
+
return {
|
|
90
|
+
type: keySchema.columnType,
|
|
91
|
+
defaultValue: keySchema.defaultValue ?? null,
|
|
92
|
+
isFilterable: SchemaGeneratorFields.isForeignCollectionFilterable(foreignCollection),
|
|
93
|
+
isPrimaryKey: Boolean(keySchema.isPrimaryKey),
|
|
94
|
+
isRequired: keySchema.validation?.some(v => v.operator === 'Present') ?? false,
|
|
95
|
+
isSortable: Boolean(keySchema.isSortable),
|
|
96
|
+
validations: validation_1.default.convertValidationList(keySchema.validation),
|
|
97
|
+
reference: `${foreignCollection.name}.${relation.foreignKeyTarget}`,
|
|
98
|
+
...baseSchema,
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
static buildRelationSchema(collection, name) {
|
|
102
|
+
const relation = collection.schema.fields[name];
|
|
103
|
+
const foreignCollection = collection.dataSource.getCollection(relation.foreignCollection);
|
|
104
|
+
const relationSchema = {
|
|
105
|
+
field: name,
|
|
106
|
+
enums: null,
|
|
107
|
+
integration: null,
|
|
108
|
+
isReadOnly: false,
|
|
109
|
+
isVirtual: false,
|
|
110
|
+
inverseOf: datasource_toolkit_1.CollectionUtils.getInverseRelation(collection, name),
|
|
111
|
+
relationship: SchemaGeneratorFields.relationMap[relation.type],
|
|
112
|
+
};
|
|
113
|
+
switch (relation.type) {
|
|
114
|
+
case 'ManyToMany':
|
|
115
|
+
case 'OneToMany':
|
|
116
|
+
return SchemaGeneratorFields.buildToManyRelationSchema(relation, foreignCollection, relationSchema);
|
|
117
|
+
case 'OneToOne':
|
|
118
|
+
return SchemaGeneratorFields.buildOneToOneSchema(relation, foreignCollection, relationSchema);
|
|
119
|
+
default:
|
|
120
|
+
return SchemaGeneratorFields.buildManyToOneSchema(relation, collection, foreignCollection, relationSchema);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
exports.default = SchemaGeneratorFields;
|
|
125
|
+
SchemaGeneratorFields.relationMap = {
|
|
126
|
+
ManyToMany: 'BelongsToMany',
|
|
127
|
+
ManyToOne: 'BelongsTo',
|
|
128
|
+
OneToMany: 'HasMany',
|
|
129
|
+
OneToOne: 'HasOne',
|
|
130
|
+
};
|
|
131
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VuZXJhdG9yLWZpZWxkcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9hZ2VudC91dGlscy9mb3Jlc3Qtc2NoZW1hL2dlbmVyYXRvci1maWVsZHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSx3RUFVeUM7QUFFekMsOERBQW1EO0FBQ25ELDhEQUFtRDtBQUVuRCxNQUFxQixxQkFBcUI7SUFReEMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxVQUFzQixFQUFFLElBQVk7UUFDckQsTUFBTSxFQUFFLElBQUksRUFBRSxHQUFHLFVBQVUsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRWhELElBQUksTUFBeUIsQ0FBQztRQUU5QixRQUFRLElBQUksRUFBRTtZQUNaLEtBQUssUUFBUTtnQkFDWCxNQUFNLEdBQUcscUJBQXFCLENBQUMsaUJBQWlCLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxDQUFDO2dCQUNuRSxNQUFNO1lBRVIsS0FBSyxXQUFXLENBQUM7WUFDakIsS0FBSyxXQUFXLENBQUM7WUFDakIsS0FBSyxZQUFZLENBQUM7WUFDbEIsS0FBSyxVQUFVO2dCQUNiLE1BQU0sR0FBRyxxQkFBcUIsQ0FBQyxtQkFBbUIsQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLENBQUM7Z0JBQ3JFLE1BQU07WUFFUjtnQkFDRSxNQUFNLElBQUksS0FBSyxDQUFDLG9CQUFvQixDQUFDLENBQUM7U0FDekM7UUFFRCxPQUFPLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDO2FBQzFCLElBQUksRUFBRTthQUNOLE1BQU0sQ0FBQyxDQUFDLFlBQVksRUFBRSxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsRUFBRSxFQUFFO1lBQ3JDLFlBQVksQ0FBQyxHQUFHLENBQUMsR0FBRyxLQUFLLENBQUM7WUFFMUIsT0FBTyxZQUFZLENBQUM7UUFDdEIsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ1gs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
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { Collection, CollectionSchema } from '@forestadmin/datasource-toolkit';
|
|
2
|
+
import { ForestServerSegment } from './types';
|
|
3
|
+
export default class SchemaGeneratorSegments {
|
|
4
|
+
static buildSchema(collection: Collection, name: CollectionSchema['segments'][number]): ForestServerSegment;
|
|
5
|
+
}
|
|
6
|
+
//# sourceMappingURL=generator-segments.d.ts.map
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
class SchemaGeneratorSegments {
|
|
4
|
+
static buildSchema(collection, name) {
|
|
5
|
+
return { id: `${collection.name}.${name}`, name };
|
|
6
|
+
}
|
|
7
|
+
}
|
|
8
|
+
exports.default = SchemaGeneratorSegments;
|
|
9
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VuZXJhdG9yLXNlZ21lbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2FnZW50L3V0aWxzL2ZvcmVzdC1zY2hlbWEvZ2VuZXJhdG9yLXNlZ21lbnRzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBR0EsTUFBcUIsdUJBQXVCO0lBQzFDLE1BQU0sQ0FBQyxXQUFXLENBQ2hCLFVBQXNCLEVBQ3RCLElBQTBDO1FBRTFDLE9BQU8sRUFBRSxFQUFFLEVBQUUsR0FBRyxVQUFVLENBQUMsSUFBSSxJQUFJLElBQUksRUFBRSxFQUFFLElBQUksRUFBRSxDQUFDO0lBQ3BELENBQUM7Q0FDRjtBQVBELDBDQU9DIn0=
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { ColumnType } from '@forestadmin/datasource-toolkit';
|
|
2
|
+
export declare type ForestServerCollection = {
|
|
3
|
+
name: string;
|
|
4
|
+
icon: null;
|
|
5
|
+
integration: null;
|
|
6
|
+
isReadOnly: boolean;
|
|
7
|
+
isSearchable: boolean;
|
|
8
|
+
isVirtual: false;
|
|
9
|
+
onlyForRelationships: boolean;
|
|
10
|
+
paginationType: 'page';
|
|
11
|
+
actions: Array<ForestServerAction>;
|
|
12
|
+
fields: Array<ForestServerField>;
|
|
13
|
+
segments: Array<ForestServerSegment>;
|
|
14
|
+
};
|
|
15
|
+
export declare type ForestServerAction = {
|
|
16
|
+
id: string;
|
|
17
|
+
name: string;
|
|
18
|
+
type: 'single' | 'bulk' | 'global';
|
|
19
|
+
baseUrl: string;
|
|
20
|
+
endpoint: string;
|
|
21
|
+
httpMethod: 'POST';
|
|
22
|
+
redirect: unknown;
|
|
23
|
+
download: boolean;
|
|
24
|
+
fields: ForestServerActionField[];
|
|
25
|
+
hooks: {
|
|
26
|
+
load: boolean;
|
|
27
|
+
change: Array<unknown>;
|
|
28
|
+
};
|
|
29
|
+
};
|
|
30
|
+
export declare type ForestServerActionField = {
|
|
31
|
+
value: unknown;
|
|
32
|
+
defaultValue: unknown;
|
|
33
|
+
description: string | null;
|
|
34
|
+
enums: string[];
|
|
35
|
+
field: string;
|
|
36
|
+
hook: string;
|
|
37
|
+
isReadOnly: boolean;
|
|
38
|
+
isRequired: boolean;
|
|
39
|
+
reference: string | null;
|
|
40
|
+
type: ColumnType;
|
|
41
|
+
widget: null | 'belongsto select' | 'file picker';
|
|
42
|
+
};
|
|
43
|
+
export declare type ForestServerField = Partial<{
|
|
44
|
+
field: string;
|
|
45
|
+
type: ColumnType;
|
|
46
|
+
defaultValue: unknown;
|
|
47
|
+
enums: null | string[];
|
|
48
|
+
integration: null;
|
|
49
|
+
isFilterable: boolean;
|
|
50
|
+
isPrimaryKey: boolean;
|
|
51
|
+
isReadOnly: boolean;
|
|
52
|
+
isRequired: boolean;
|
|
53
|
+
isSortable: boolean;
|
|
54
|
+
isVirtual: boolean;
|
|
55
|
+
reference: null | string;
|
|
56
|
+
inverseOf: null | string;
|
|
57
|
+
relationship: 'BelongsTo' | 'BelongsToMany' | 'HasMany' | 'HasOne';
|
|
58
|
+
validations: Array<{
|
|
59
|
+
message: null;
|
|
60
|
+
type: ValidationType;
|
|
61
|
+
value: unknown;
|
|
62
|
+
}>;
|
|
63
|
+
}>;
|
|
64
|
+
export declare type ForestServerSegment = {
|
|
65
|
+
id: string;
|
|
66
|
+
name: string;
|
|
67
|
+
};
|
|
68
|
+
export declare enum ValidationType {
|
|
69
|
+
Present = "is present",
|
|
70
|
+
GreaterThan = "is greater than",
|
|
71
|
+
LessThan = "is less than",
|
|
72
|
+
Before = "is before",
|
|
73
|
+
After = "is after",
|
|
74
|
+
LongerThan = "is longer than",
|
|
75
|
+
ShorterThan = "is shorter than",
|
|
76
|
+
Contains = "contains",
|
|
77
|
+
Like = "is like"
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ValidationType = void 0;
|
|
4
|
+
var ValidationType;
|
|
5
|
+
(function (ValidationType) {
|
|
6
|
+
ValidationType["Present"] = "is present";
|
|
7
|
+
ValidationType["GreaterThan"] = "is greater than";
|
|
8
|
+
ValidationType["LessThan"] = "is less than";
|
|
9
|
+
ValidationType["Before"] = "is before";
|
|
10
|
+
ValidationType["After"] = "is after";
|
|
11
|
+
ValidationType["LongerThan"] = "is longer than";
|
|
12
|
+
ValidationType["ShorterThan"] = "is shorter than";
|
|
13
|
+
ValidationType["Contains"] = "contains";
|
|
14
|
+
ValidationType["Like"] = "is like";
|
|
15
|
+
})(ValidationType = exports.ValidationType || (exports.ValidationType = {}));
|
|
16
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvYWdlbnQvdXRpbHMvZm9yZXN0LXNjaGVtYS90eXBlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFxRUEsSUFBWSxjQVVYO0FBVkQsV0FBWSxjQUFjO0lBQ3hCLHdDQUFzQixDQUFBO0lBQ3RCLGlEQUErQixDQUFBO0lBQy9CLDJDQUF5QixDQUFBO0lBQ3pCLHNDQUFvQixDQUFBO0lBQ3BCLG9DQUFrQixDQUFBO0lBQ2xCLCtDQUE2QixDQUFBO0lBQzdCLGlEQUErQixDQUFBO0lBQy9CLHVDQUFxQixDQUFBO0lBQ3JCLGtDQUFnQixDQUFBO0FBQ2xCLENBQUMsRUFWVyxjQUFjLEdBQWQsc0JBQWMsS0FBZCxzQkFBYyxRQVV6QiJ9
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { ColumnSchema } from '@forestadmin/datasource-toolkit';
|
|
2
|
+
import { ForestServerField } from './types';
|
|
3
|
+
declare type FrontendValidation = ForestServerField['validations'][number];
|
|
4
|
+
declare type Validation = ColumnSchema['validation'][number];
|
|
5
|
+
export default class FrontendValidationUtils {
|
|
6
|
+
private static operatorValidationTypeMap;
|
|
7
|
+
static convertValidationList(predicates?: Validation[]): FrontendValidation[];
|
|
8
|
+
}
|
|
9
|
+
export {};
|
|
10
|
+
//# sourceMappingURL=validation.d.ts.map
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const types_1 = require("./types");
|
|
4
|
+
class FrontendValidationUtils {
|
|
5
|
+
static convertValidationList(predicates) {
|
|
6
|
+
if (!predicates)
|
|
7
|
+
return [];
|
|
8
|
+
return predicates
|
|
9
|
+
.map(p => {
|
|
10
|
+
const type = FrontendValidationUtils.operatorValidationTypeMap[p.operator];
|
|
11
|
+
return type ? { type, value: p.value, message: null } : null;
|
|
12
|
+
})
|
|
13
|
+
.filter(Boolean);
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
exports.default = FrontendValidationUtils;
|
|
17
|
+
FrontendValidationUtils.operatorValidationTypeMap = {
|
|
18
|
+
Present: types_1.ValidationType.Present,
|
|
19
|
+
GreaterThan: types_1.ValidationType.GreaterThan,
|
|
20
|
+
LessThan: types_1.ValidationType.LessThan,
|
|
21
|
+
LongerThan: types_1.ValidationType.LongerThan,
|
|
22
|
+
ShorterThan: types_1.ValidationType.ShorterThan,
|
|
23
|
+
Contains: types_1.ValidationType.Contains,
|
|
24
|
+
Like: types_1.ValidationType.Like,
|
|
25
|
+
};
|
|
26
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9hZ2VudC91dGlscy9mb3Jlc3Qtc2NoZW1hL3ZhbGlkYXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFDQSxtQ0FBNEQ7QUFLNUQsTUFBcUIsdUJBQXVCO0lBVzFDLE1BQU0sQ0FBQyxxQkFBcUIsQ0FBQyxVQUF5QjtRQUNwRCxJQUFJLENBQUMsVUFBVTtZQUFFLE9BQU8sRUFBRSxDQUFDO1FBRTNCLE9BQU8sVUFBVTthQUNkLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRTtZQUNQLE1BQU0sSUFBSSxHQUFHLHVCQUF1QixDQUFDLHlCQUF5QixDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUUzRSxPQUFPLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFDL0QsQ0FBQyxDQUFDO2FBQ0QsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3JCLENBQUM7O0FBckJILDBDQXNCQztBQXJCZ0IsaURBQXlCLEdBQThDO0lBQ3BGLE9BQU8sRUFBRSxzQkFBYyxDQUFDLE9BQU87SUFDL0IsV0FBVyxFQUFFLHNCQUFjLENBQUMsV0FBVztJQUN2QyxRQUFRLEVBQUUsc0JBQWMsQ0FBQyxRQUFRO0lBQ2pDLFVBQVUsRUFBRSxzQkFBYyxDQUFDLFVBQVU7SUFDckMsV0FBVyxFQUFFLHNCQUFjLENBQUMsV0FBVztJQUN2QyxRQUFRLEVBQUUsc0JBQWMsQ0FBQyxRQUFRO0lBQ2pDLElBQUksRUFBRSxzQkFBYyxDQUFDLElBQUk7Q0FDMUIsQ0FBQyJ9
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { AgentOptions } from '../../types';
|
|
2
|
+
import { AgentOptionsWithDefaults } from '../types';
|
|
3
|
+
export default class OptionsUtils {
|
|
4
|
+
private static loggerPrefix;
|
|
5
|
+
static withDefaults(options: AgentOptions): AgentOptionsWithDefaults;
|
|
6
|
+
static validate(options: AgentOptionsWithDefaults): void;
|
|
7
|
+
private static checkForestServerOptions;
|
|
8
|
+
private static checkAuthOptions;
|
|
9
|
+
private static checkOtherOptions;
|
|
10
|
+
private static isExistingPath;
|
|
11
|
+
private static isUrl;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=http-driver-options.d.ts.map
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const fs_1 = require("fs");
|
|
4
|
+
const path_1 = require("path");
|
|
5
|
+
const types_1 = require("../../types");
|
|
6
|
+
class OptionsUtils {
|
|
7
|
+
static withDefaults(options) {
|
|
8
|
+
return Object.freeze({
|
|
9
|
+
clientId: null,
|
|
10
|
+
forestServerUrl: 'https://api.forestadmin.com',
|
|
11
|
+
logger: (level, data) => console.error(OptionsUtils.loggerPrefix[level], data),
|
|
12
|
+
prefix: '/forest',
|
|
13
|
+
schemaPath: '.forestadmin-schema.json',
|
|
14
|
+
permissionsCacheDurationInSeconds: 15 * 60,
|
|
15
|
+
...options,
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
static validate(options) {
|
|
19
|
+
OptionsUtils.checkForestServerOptions(options);
|
|
20
|
+
OptionsUtils.checkAuthOptions(options);
|
|
21
|
+
OptionsUtils.checkOtherOptions(options);
|
|
22
|
+
}
|
|
23
|
+
static checkForestServerOptions(options) {
|
|
24
|
+
if (typeof options.envSecret !== 'string' || !/^[0-9a-f]{64}$/.test(options.envSecret)) {
|
|
25
|
+
throw new Error('options.envSecret is invalid. You can retrieve its value from ' +
|
|
26
|
+
'https://www.forestadmin.com');
|
|
27
|
+
}
|
|
28
|
+
if (!OptionsUtils.isUrl(options.forestServerUrl)) {
|
|
29
|
+
throw new Error('options.forestServerUrl is invalid. It should contain an URL ' +
|
|
30
|
+
'(i.e. "https://api.forestadmin.com")');
|
|
31
|
+
}
|
|
32
|
+
if (!OptionsUtils.isExistingPath(options.schemaPath)) {
|
|
33
|
+
throw new Error('options.schemaPath is invalid. It should contain a relative filepath ' +
|
|
34
|
+
'where the schema should be loaded/updated (i.e. "./.forestadmin-schema.json")');
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
static checkAuthOptions(options) {
|
|
38
|
+
if (!OptionsUtils.isUrl(options.agentUrl)) {
|
|
39
|
+
throw new Error('options.agentUrl is invalid. It should contain an url where your agent is reachable ' +
|
|
40
|
+
'(i.e. "https://api-forestadmin.mycompany.com")');
|
|
41
|
+
}
|
|
42
|
+
if (typeof options.authSecret !== 'string') {
|
|
43
|
+
throw new Error('options.authSecret is invalid. Any long random string should work ' +
|
|
44
|
+
'(i.e. "OfpssLrbgF3P4vHJTTpb"');
|
|
45
|
+
}
|
|
46
|
+
if (options.clientId === null) {
|
|
47
|
+
options.logger?.(types_1.LoggerLevel.Warn, 'options.clientId was not provided. Using NodeJS cluster mode, ' +
|
|
48
|
+
'or multiple instances of the agent will break authentication');
|
|
49
|
+
}
|
|
50
|
+
else if (typeof options.clientId !== 'string') {
|
|
51
|
+
throw new Error('options.clientId is invalid.');
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
static checkOtherOptions(options) {
|
|
55
|
+
if (typeof options.prefix !== 'string' || !/[-/a-z+]/.test(options.prefix)) {
|
|
56
|
+
throw new Error('options.prefix is invalid. It should contain the prefix on which ' +
|
|
57
|
+
'forest admin routes should be mounted (i.e. "/forest")');
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
static isExistingPath(string) {
|
|
61
|
+
if (typeof string !== 'string') {
|
|
62
|
+
return false;
|
|
63
|
+
}
|
|
64
|
+
const parsed = (0, path_1.parse)(string);
|
|
65
|
+
return parsed.dir.length ? (0, fs_1.existsSync)(parsed.dir) : true;
|
|
66
|
+
}
|
|
67
|
+
static isUrl(string) {
|
|
68
|
+
if (typeof string !== 'string') {
|
|
69
|
+
return false;
|
|
70
|
+
}
|
|
71
|
+
try {
|
|
72
|
+
const url = new URL(string);
|
|
73
|
+
return url.protocol === 'http:' || url.protocol === 'https:';
|
|
74
|
+
}
|
|
75
|
+
catch (_) {
|
|
76
|
+
return false;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
exports.default = OptionsUtils;
|
|
81
|
+
OptionsUtils.loggerPrefix = {
|
|
82
|
+
[types_1.LoggerLevel.Info]: '\x1b[34minfo:\x1b[0m',
|
|
83
|
+
[types_1.LoggerLevel.Warn]: '\x1b[33mwarning:\x1b[0m',
|
|
84
|
+
[types_1.LoggerLevel.Error]: '\x1b[31merror:\x1b[0m',
|
|
85
|
+
};
|
|
86
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHR0cC1kcml2ZXItb3B0aW9ucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9hZ2VudC91dGlscy9odHRwLWRyaXZlci1vcHRpb25zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsMkJBQWdDO0FBQ2hDLCtCQUEwQztBQUUxQyx1Q0FBd0Q7QUFHeEQsTUFBcUIsWUFBWTtJQU8vQixNQUFNLENBQUMsWUFBWSxDQUFDLE9BQXFCO1FBQ3ZDLE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQztZQUNuQixRQUFRLEVBQUUsSUFBSTtZQUNkLGVBQWUsRUFBRSw2QkFBNkI7WUFDOUMsTUFBTSxFQUFFLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxFQUFFLElBQUksQ0FBQztZQUM5RSxNQUFNLEVBQUUsU0FBUztZQUNqQixVQUFVLEVBQUUsMEJBQTBCO1lBQ3RDLGlDQUFpQyxFQUFFLEVBQUUsR0FBRyxFQUFFO1lBQzFDLEdBQUcsT0FBTztTQUNYLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxNQUFNLENBQUMsUUFBUSxDQUFDLE9BQWlDO1FBQy9DLFlBQVksQ0FBQyx3QkFBd0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUMvQyxZQUFZLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDdkMsWUFBWSxDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzFDLENBQUM7SUFFTyxNQUFNLENBQUMsd0JBQXdCLENBQUMsT0FBaUM7UUFDdkUsSUFBSSxPQUFPLE9BQU8sQ0FBQyxTQUFTLEtBQUssUUFBUSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsRUFBRTtZQUN0RixNQUFNLElBQUksS0FBSyxDQUNiLGdFQUFnRTtnQkFDOUQsNkJBQTZCLENBQ2hDLENB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
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { CollectionSchema, CompositeId, RecordData } from '@forestadmin/datasource-toolkit';
|
|
2
|
+
export default class IdUtils {
|
|
3
|
+
static packIds(schema: CollectionSchema, records: RecordData[]): string[];
|
|
4
|
+
static packId(schema: CollectionSchema, record: RecordData): string;
|
|
5
|
+
static unpackIds(schema: CollectionSchema, packedIds: string[]): CompositeId[];
|
|
6
|
+
static unpackId(schema: CollectionSchema, packedId: string): CompositeId;
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=id.d.ts.map
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const datasource_toolkit_1 = require("@forestadmin/datasource-toolkit");
|
|
4
|
+
class IdUtils {
|
|
5
|
+
static packIds(schema, records) {
|
|
6
|
+
return records.map(packedId => IdUtils.packId(schema, packedId));
|
|
7
|
+
}
|
|
8
|
+
static packId(schema, record) {
|
|
9
|
+
const pkNames = datasource_toolkit_1.SchemaUtils.getPrimaryKeys(schema);
|
|
10
|
+
if (!pkNames.length) {
|
|
11
|
+
throw new Error('This collection has no primary key');
|
|
12
|
+
}
|
|
13
|
+
if (pkNames.some(pkName => record[pkName] === undefined)) {
|
|
14
|
+
throw new Error(`Missing one of expected fields: '${pkNames.join("', '")}'`);
|
|
15
|
+
}
|
|
16
|
+
return pkNames.map(pk => String(record[pk])).join('|');
|
|
17
|
+
}
|
|
18
|
+
static unpackIds(schema, packedIds) {
|
|
19
|
+
if (!Array.isArray(packedIds)) {
|
|
20
|
+
throw new datasource_toolkit_1.ValidationError(`Expected array, received: ${typeof packedIds}`);
|
|
21
|
+
}
|
|
22
|
+
return packedIds.map(packedId => IdUtils.unpackId(schema, packedId));
|
|
23
|
+
}
|
|
24
|
+
static unpackId(schema, packedId) {
|
|
25
|
+
if (typeof packedId !== 'string') {
|
|
26
|
+
throw new datasource_toolkit_1.ValidationError(`Expected string, received: ${typeof packedId}`);
|
|
27
|
+
}
|
|
28
|
+
const pkNames = datasource_toolkit_1.SchemaUtils.getPrimaryKeys(schema);
|
|
29
|
+
const pkValues = packedId.split('|');
|
|
30
|
+
if (pkValues.length !== pkNames.length) {
|
|
31
|
+
throw new datasource_toolkit_1.ValidationError(`Expected ${pkNames.length} values, found ${pkValues.length}`);
|
|
32
|
+
}
|
|
33
|
+
return pkNames.map((pkName, index) => {
|
|
34
|
+
const schemaField = schema.fields[pkName];
|
|
35
|
+
const value = pkValues[index];
|
|
36
|
+
const castedValue = schemaField.columnType === 'Number' ? Number(value) : value;
|
|
37
|
+
datasource_toolkit_1.FieldValidator.validateValue(pkName, schemaField, castedValue);
|
|
38
|
+
return castedValue;
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
exports.default = IdUtils;
|
|
43
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYWdlbnQvdXRpbHMvaWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSx3RUFReUM7QUFFekMsTUFBcUIsT0FBTztJQUMxQixNQUFNLENBQUMsT0FBTyxDQUFDLE1BQXdCLEVBQUUsT0FBcUI7UUFDNUQsT0FBTyxPQUFPLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQztJQUNuRSxDQUFDO0lBRUQsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUF3QixFQUFFLE1BQWtCO1FBQ3hELE1BQU0sT0FBTyxHQUFHLGdDQUFXLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBRW5ELElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFO1lBQ25CLE1BQU0sSUFBSSxLQUFLLENBQUMsb0NBQW9DLENBQUMsQ0FBQztTQUN2RDtRQUVELElBQUksT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxTQUFTLENBQUMsRUFBRTtZQUN4RCxNQUFNLElBQUksS0FBSyxDQUFDLG9DQUFvQyxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztTQUM5RTtRQUVELE9BQU8sT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUN6RCxDQUFDO0lBRUQsTUFBTSxDQUFDLFNBQVMsQ0FBQyxNQUF3QixFQUFFLFNBQW1CO1FBQzVELElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxFQUFFO1lBQzdCLE1BQU0sSUFBSSxvQ0FBZSxDQUFDLDZCQUE2QixPQUFPLFNBQVMsRUFBRSxDQUFDLENBQUM7U0FDNUU7UUFFRCxPQUFPLFNBQVMsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDO0lBQ3ZFLENBQUM7SUFFRCxNQUFNLENBQUMsUUFBUSxDQUFDLE1BQXdCLEVBQUUsUUFBZ0I7UUFDeEQsSUFBSSxPQUFPLFFBQVEsS0FBSyxRQUFRLEVBQUU7WUFDaEMsTUFBTSxJQUFJLG9DQUFlLENBQUMsOEJBQThCLE9BQU8sUUFBUSxFQUFFLENBQUMsQ0FBQztTQUM1RTtRQUVELE1BQU0sT0FBTyxHQUFHLGdDQUFXLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ25ELE1BQU0sUUFBUSxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7UUFFckMsSUFBSSxRQUFRLENBQUMsTUFBTSxLQUFLLE9BQU8sQ0FBQyxNQUFNLEVBQUU7WUFDdEMsTUFBTSxJQUFJLG9DQUFlLENBQUMsWUFBWSxPQUFPLENBQUMsTUFBTSxrQkFBa0IsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7U0FDMUY7UUFFRCxPQUFPLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLEVBQUU7WUFDbkMsTUFBTSxXQUFXLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQWlCLENBQUM7WUFDMUQsTUFBTSxLQUFLLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBRTlCLE1BQU0sV0FBVyxHQUFHLFdBQVcsQ0FBQyxVQUFVLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztZQUNoRixtQ0FBYyxDQUFDLGFBQWEsQ0FBQyxNQUFNLEVBQUUsV0FBVyxFQUFFLFdBQVcsQ0FBQyxDQUFDO1lBRS9ELE9BQU8sV0FBVyxDQUFDO1FBQ3JCLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztDQUNGO0FBakRELDBCQWlEQyJ9
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { Collection, ConditionTree, Page, Projection, Sort } from '@forestadmin/datasource-toolkit';
|
|
2
|
+
import { Context } from 'koa';
|
|
3
|
+
export default class QueryStringParser {
|
|
4
|
+
static parseConditionTree(collection: Collection, context: Context): ConditionTree;
|
|
5
|
+
static parseProjection(collection: Collection, context: Context): Projection;
|
|
6
|
+
static parseProjectionWithPks(collection: Collection, context: Context): Projection;
|
|
7
|
+
static parseSearch(collection: Collection, context: Context): string;
|
|
8
|
+
static parseSearchExtended(context: Context): boolean;
|
|
9
|
+
static parseSegment(collection: Collection, context: Context): string;
|
|
10
|
+
static parseTimezone(context: Context): string;
|
|
11
|
+
static parsePagination(context: Context): Page;
|
|
12
|
+
static parseSort(collection: Collection, context: Context): Sort;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=query-string.d.ts.map
|