@forestadmin/agent 1.0.0-alpha.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.d.ts +76 -0
- package/dist/agent.js +133 -0
- package/dist/framework-mounter.d.ts +43 -0
- package/dist/framework-mounter.js +157 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.js +15 -0
- package/dist/routes/access/api-chart.d.ts +16 -0
- package/dist/routes/access/api-chart.js +47 -0
- package/dist/routes/access/chart.d.ts +18 -0
- package/dist/routes/access/chart.js +162 -0
- package/dist/routes/access/count-related.d.ts +9 -0
- package/dist/routes/access/count-related.js +31 -0
- package/dist/routes/access/count.d.ts +9 -0
- package/dist/routes/access/count.js +31 -0
- package/dist/routes/access/csv-related.d.ts +9 -0
- package/dist/routes/access/csv-related.js +33 -0
- package/dist/routes/access/csv.d.ts +9 -0
- package/dist/routes/access/csv.js +31 -0
- package/dist/routes/access/get.d.ts +9 -0
- package/dist/routes/access/get.js +29 -0
- package/dist/routes/access/list-related.d.ts +9 -0
- package/dist/routes/access/list-related.js +25 -0
- package/dist/routes/access/list.d.ts +9 -0
- package/dist/routes/access/list.js +22 -0
- package/dist/routes/base-route.d.ts +13 -0
- package/dist/routes/base-route.js +13 -0
- package/dist/routes/collection-route.d.ts +12 -0
- package/dist/routes/collection-route.js +20 -0
- package/dist/routes/index.d.ts +30 -0
- package/dist/routes/index.js +108 -0
- package/dist/routes/modification/action.d.ts +16 -0
- package/dist/routes/modification/action.js +104 -0
- package/dist/routes/modification/associate-related.d.ts +12 -0
- package/dist/routes/modification/associate-related.js +51 -0
- package/dist/routes/modification/create.d.ts +14 -0
- package/dist/routes/modification/create.js +83 -0
- package/dist/routes/modification/delete.d.ts +11 -0
- package/dist/routes/modification/delete.js +41 -0
- package/dist/routes/modification/dissociate-delete-related.d.ts +20 -0
- package/dist/routes/modification/dissociate-delete-related.js +89 -0
- package/dist/routes/modification/update-field.d.ts +9 -0
- package/dist/routes/modification/update-field.js +39 -0
- package/dist/routes/modification/update-relation.d.ts +11 -0
- package/dist/routes/modification/update-relation.js +59 -0
- package/dist/routes/modification/update.d.ts +9 -0
- package/dist/routes/modification/update.js +31 -0
- package/dist/routes/relation-route.d.ts +10 -0
- package/dist/routes/relation-route.js +18 -0
- package/dist/routes/security/authentication.d.ts +15 -0
- package/dist/routes/security/authentication.js +74 -0
- package/dist/routes/security/ip-whitelist.d.ts +14 -0
- package/dist/routes/security/ip-whitelist.js +35 -0
- package/dist/routes/security/scope-invalidation.d.ts +11 -0
- package/dist/routes/security/scope-invalidation.js +28 -0
- package/dist/routes/system/error-handling.d.ts +13 -0
- package/dist/routes/system/error-handling.js +75 -0
- package/dist/routes/system/healthcheck.d.ts +11 -0
- package/dist/routes/system/healthcheck.js +22 -0
- package/dist/routes/system/logger.d.ts +10 -0
- package/dist/routes/system/logger.js +35 -0
- package/dist/services/authorization/authorization.d.ts +15 -0
- package/dist/services/authorization/authorization.js +45 -0
- package/dist/services/authorization/index.d.ts +5 -0
- package/dist/services/authorization/index.js +16 -0
- package/dist/services/authorization/internal/action-permission.d.ts +16 -0
- package/dist/services/authorization/internal/action-permission.js +68 -0
- package/dist/services/authorization/internal/generate-action-identifier.d.ts +4 -0
- package/dist/services/authorization/internal/generate-action-identifier.js +12 -0
- package/dist/services/authorization/internal/generate-actions-from-permissions.d.ts +8 -0
- package/dist/services/authorization/internal/generate-actions-from-permissions.js +87 -0
- package/dist/services/authorization/internal/types.d.ts +61 -0
- package/dist/services/authorization/internal/types.js +26 -0
- package/dist/services/index.d.ts +12 -0
- package/dist/services/index.js +16 -0
- package/dist/services/permissions.d.ts +19 -0
- package/dist/services/permissions.js +85 -0
- package/dist/services/serializer.d.ts +12 -0
- package/dist/services/serializer.js +120 -0
- package/dist/types.d.ts +41 -0
- package/dist/types.js +23 -0
- package/dist/utils/body-parser.d.ts +7 -0
- package/dist/utils/body-parser.js +18 -0
- package/dist/utils/condition-tree-parser.d.ts +11 -0
- package/dist/utils/condition-tree-parser.js +53 -0
- package/dist/utils/context-filter-factory.d.ts +7 -0
- package/dist/utils/context-filter-factory.js +28 -0
- package/dist/utils/csv-generator.d.ts +12 -0
- package/dist/utils/csv-generator.js +39 -0
- package/dist/utils/csv-route-context.d.ts +5 -0
- package/dist/utils/csv-route-context.js +14 -0
- package/dist/utils/forest-http-api.d.ts +68 -0
- package/dist/utils/forest-http-api.js +202 -0
- package/dist/utils/forest-schema/action-values.d.ts +34 -0
- package/dist/utils/forest-schema/action-values.js +144 -0
- package/dist/utils/forest-schema/emitter.d.ts +20 -0
- package/dist/utils/forest-schema/emitter.js +70 -0
- package/dist/utils/forest-schema/filterable.d.ts +16 -0
- package/dist/utils/forest-schema/filterable.js +68 -0
- package/dist/utils/forest-schema/generator-actions.d.ts +14 -0
- package/dist/utils/forest-schema/generator-actions.js +99 -0
- package/dist/utils/forest-schema/generator-collection.d.ts +7 -0
- package/dist/utils/forest-schema/generator-collection.js +36 -0
- package/dist/utils/forest-schema/generator-fields.d.ts +14 -0
- package/dist/utils/forest-schema/generator-fields.js +160 -0
- package/dist/utils/forest-schema/generator-segments.d.ts +6 -0
- package/dist/utils/forest-schema/generator-segments.js +9 -0
- package/dist/utils/forest-schema/types.d.ts +85 -0
- package/dist/utils/forest-schema/types.js +16 -0
- package/dist/utils/forest-schema/validation.d.ts +10 -0
- package/dist/utils/forest-schema/validation.js +28 -0
- package/dist/utils/id.d.ts +8 -0
- package/dist/utils/id.js +43 -0
- package/dist/utils/options-validator.d.ts +12 -0
- package/dist/utils/options-validator.js +92 -0
- package/dist/utils/query-string.d.ts +14 -0
- package/dist/utils/query-string.js +134 -0
- package/package.json +66 -0
|
@@ -0,0 +1,92 @@
|
|
|
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 fs_1 = require("fs");
|
|
7
|
+
const path_1 = __importDefault(require("path"));
|
|
8
|
+
class OptionsValidator {
|
|
9
|
+
static withDefaults(options) {
|
|
10
|
+
const copyOptions = { ...options };
|
|
11
|
+
const defaultLogger = (level, data) => {
|
|
12
|
+
const loggerLevel = options.loggerLevel ?? 'Info';
|
|
13
|
+
const levels = Object.keys(this.loggerPrefix);
|
|
14
|
+
if (levels.indexOf(level) >= levels.indexOf(loggerLevel)) {
|
|
15
|
+
console.error(OptionsValidator.loggerPrefix[level], data);
|
|
16
|
+
}
|
|
17
|
+
};
|
|
18
|
+
copyOptions.logger = copyOptions.logger || defaultLogger;
|
|
19
|
+
copyOptions.schemaPath = copyOptions.schemaPath || '.forestadmin-schema.json';
|
|
20
|
+
copyOptions.forestServerUrl = copyOptions.forestServerUrl || 'https://api.forestadmin.com';
|
|
21
|
+
copyOptions.typingsMaxDepth = copyOptions.typingsMaxDepth ?? 5;
|
|
22
|
+
copyOptions.prefix = copyOptions.prefix || '';
|
|
23
|
+
return {
|
|
24
|
+
loggerLevel: 'Info',
|
|
25
|
+
permissionsCacheDurationInSeconds: 15 * 60,
|
|
26
|
+
...copyOptions,
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
static validate(options) {
|
|
30
|
+
OptionsValidator.checkForestServerOptions(options);
|
|
31
|
+
OptionsValidator.checkAuthOptions(options);
|
|
32
|
+
OptionsValidator.checkOtherOptions(options);
|
|
33
|
+
return options;
|
|
34
|
+
}
|
|
35
|
+
static checkForestServerOptions(options) {
|
|
36
|
+
if (typeof options.envSecret !== 'string' || !/^[0-9a-f]{64}$/.test(options.envSecret)) {
|
|
37
|
+
throw new Error('options.envSecret is invalid. You can retrieve its value from ' +
|
|
38
|
+
'https://www.forestadmin.com');
|
|
39
|
+
}
|
|
40
|
+
if (!OptionsValidator.isUrl(options.forestServerUrl)) {
|
|
41
|
+
throw new Error('options.forestServerUrl is invalid. It should contain an URL ' +
|
|
42
|
+
'(i.e. "https://api.forestadmin.com")');
|
|
43
|
+
}
|
|
44
|
+
if (!OptionsValidator.isExistingPath(options.schemaPath)) {
|
|
45
|
+
throw new Error('options.schemaPath is invalid. It should contain a relative filepath ' +
|
|
46
|
+
'where the schema should be loaded/updated (i.e. "./.forestadmin-schema.json")');
|
|
47
|
+
}
|
|
48
|
+
if (options.typingsPath && !OptionsValidator.isExistingPath(options.typingsPath)) {
|
|
49
|
+
throw new Error('options.typingsPath is invalid. It should contain a relative filepath ' +
|
|
50
|
+
'where the schema should be loaded/updated (i.e. "./src/typings.ts")');
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
static checkAuthOptions(options) {
|
|
54
|
+
if (typeof options.authSecret !== 'string') {
|
|
55
|
+
throw new Error('options.authSecret is invalid. Any long random string should work ' +
|
|
56
|
+
'(i.e. "OfpssLrbgF3P4vHJTTpb"');
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
static checkOtherOptions(options) {
|
|
60
|
+
if (typeof options.prefix !== 'string' || !/^[-~/\w]*$/i.test(options.prefix)) {
|
|
61
|
+
throw new Error('options.prefix is invalid. It should contain the prefix on which ' +
|
|
62
|
+
'forest admin routes should be mounted (i.e. "/api/v1")');
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
static isExistingPath(string) {
|
|
66
|
+
if (typeof string !== 'string') {
|
|
67
|
+
return false;
|
|
68
|
+
}
|
|
69
|
+
const parsed = path_1.default.parse(string);
|
|
70
|
+
return parsed.dir.length ? (0, fs_1.existsSync)(parsed.dir) : true;
|
|
71
|
+
}
|
|
72
|
+
static isUrl(string) {
|
|
73
|
+
if (typeof string !== 'string') {
|
|
74
|
+
return false;
|
|
75
|
+
}
|
|
76
|
+
try {
|
|
77
|
+
const url = new URL(string);
|
|
78
|
+
return url.protocol === 'http:' || url.protocol === 'https:';
|
|
79
|
+
}
|
|
80
|
+
catch (_) {
|
|
81
|
+
return false;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
exports.default = OptionsValidator;
|
|
86
|
+
OptionsValidator.loggerPrefix = {
|
|
87
|
+
Debug: '\x1b[34mdebug:\x1b[0m',
|
|
88
|
+
Info: '\x1b[32minfo:\x1b[0m',
|
|
89
|
+
Warn: '\x1b[33mwarning:\x1b[0m',
|
|
90
|
+
Error: '\x1b[31merror:\x1b[0m',
|
|
91
|
+
};
|
|
92
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3B0aW9ucy12YWxpZGF0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdXRpbHMvb3B0aW9ucy12YWxpZGF0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSwyQkFBZ0M7QUFDaEMsZ0RBQXdCO0FBSXhCLE1BQXFCLGdCQUFnQjtJQVFuQyxNQUFNLENBQUMsWUFBWSxDQUFDLE9BQXFCO1FBQ3ZDLE1BQU0sV0FBVyxHQUFHLEVBQUUsR0FBRyxPQUFPLEVBQUUsQ0FBQztRQUVuQyxNQUFNLGFBQWEsR0FBRyxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsRUFBRTtZQUNwQyxNQUFNLFdBQVcsR0FBRyxPQUFPLENBQUMsV0FBVyxJQUFJLE1BQU0sQ0FBQztZQUNsRCxNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUU5QyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsRUFBRTtnQkFDeEQsT0FBTyxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7YUFDM0Q7UUFDSCxDQUFDLENBQUM7UUFFRixXQUFXLENBQUMsTUFBTSxHQUFHLFdBQVcsQ0FBQyxNQUFNLElBQUksYUFBYSxDQUFDO1FBQ3pELFdBQVcsQ0FBQyxVQUFVLEdBQUcsV0FBVyxDQUFDLFVBQVUsSUFBSSwwQkFBMEIsQ0FBQztRQUM5RSxXQUFXLENBQUMsZUFBZSxHQUFHLFdBQVcsQ0FBQyxlQUFlLElBQUksNkJBQTZCLENBQUM7UUFDM0YsV0FBVyxDQUFDLGVBQWUsR0FBRyxXQUFXLENBQUMsZUFBZSxJQUFJLENBQUMsQ0FBQztRQUMvRCxXQUFXLENBQUMsTUFBTSxHQUFHLFdBQVcsQ0FBQyxNQUFNLElBQUksRUFBRSxDQUFDO1FBRTlDLE9B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
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { Caller, 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 parseCaller(context: Context): Caller;
|
|
11
|
+
static parsePagination(context: Context): Page;
|
|
12
|
+
static parseSort(collection: Collection, context: Context): Sort;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=query-string.d.ts.map
|
|
@@ -0,0 +1,134 @@
|
|
|
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 condition_tree_parser_1 = __importDefault(require("./condition-tree-parser"));
|
|
8
|
+
const DEFAULT_ITEMS_PER_PAGE = 15;
|
|
9
|
+
const DEFAULT_PAGE_TO_SKIP = 1;
|
|
10
|
+
class QueryStringParser {
|
|
11
|
+
static parseConditionTree(collection, context) {
|
|
12
|
+
try {
|
|
13
|
+
const filters = context.request.body?.data?.attributes?.all_records_subset_query?.filters ??
|
|
14
|
+
context.request.body?.filters ??
|
|
15
|
+
context.request.query?.filters;
|
|
16
|
+
if (!filters)
|
|
17
|
+
return null;
|
|
18
|
+
const json = JSON.parse(filters.toString());
|
|
19
|
+
const conditionTree = condition_tree_parser_1.default.fromPlainObject(collection, json);
|
|
20
|
+
datasource_toolkit_1.ConditionTreeValidator.validate(conditionTree, collection);
|
|
21
|
+
return conditionTree;
|
|
22
|
+
}
|
|
23
|
+
catch (e) {
|
|
24
|
+
throw new datasource_toolkit_1.ValidationError(`Invalid filters (${e.message})`);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
static parseProjection(collection, context) {
|
|
28
|
+
try {
|
|
29
|
+
const fields = context.request.query[`fields[${collection.name}]`];
|
|
30
|
+
if (fields === '' || fields === undefined) {
|
|
31
|
+
return datasource_toolkit_1.ProjectionFactory.all(collection);
|
|
32
|
+
}
|
|
33
|
+
const rootFields = fields.toString().split(',');
|
|
34
|
+
const explicitRequest = rootFields.map(field => {
|
|
35
|
+
const schema = collection.schema.fields[field];
|
|
36
|
+
return schema.type === 'Column'
|
|
37
|
+
? field
|
|
38
|
+
: `${field}:${context.request.query[`fields[${field}]`]}`;
|
|
39
|
+
});
|
|
40
|
+
datasource_toolkit_1.ProjectionValidator.validate(collection, explicitRequest);
|
|
41
|
+
return new datasource_toolkit_1.Projection(...explicitRequest);
|
|
42
|
+
}
|
|
43
|
+
catch (e) {
|
|
44
|
+
throw new datasource_toolkit_1.ValidationError(`Invalid projection`);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
static parseProjectionWithPks(collection, context) {
|
|
48
|
+
const projection = QueryStringParser.parseProjection(collection, context);
|
|
49
|
+
// Primary keys are not explicitly listed in the projections that the frontend
|
|
50
|
+
// is sending, but are still required for the frontend to work.
|
|
51
|
+
return projection.withPks(collection);
|
|
52
|
+
}
|
|
53
|
+
static parseSearch(collection, context) {
|
|
54
|
+
const search = context.request.body?.data?.attributes?.all_records_subset_query?.search?.toString() ??
|
|
55
|
+
context.request.query.search?.toString();
|
|
56
|
+
if (search && !collection.schema.searchable) {
|
|
57
|
+
throw new datasource_toolkit_1.ValidationError(`Collection is not searchable`);
|
|
58
|
+
}
|
|
59
|
+
return search ?? null;
|
|
60
|
+
}
|
|
61
|
+
static parseSearchExtended(context) {
|
|
62
|
+
const { request } = context;
|
|
63
|
+
const extended = request.body?.data?.attributes?.all_records_subset_query?.searchExtended?.toString() ??
|
|
64
|
+
request.query.searchExtended?.toString();
|
|
65
|
+
return !!extended && extended !== '0' && extended !== 'false';
|
|
66
|
+
}
|
|
67
|
+
static parseSegment(collection, context) {
|
|
68
|
+
const segment = context.request.body?.data?.attributes?.all_records_subset_query?.segment?.toString() ??
|
|
69
|
+
context.request.query.segment?.toString();
|
|
70
|
+
if (!segment) {
|
|
71
|
+
return null;
|
|
72
|
+
}
|
|
73
|
+
if (!collection.schema.segments.includes(segment)) {
|
|
74
|
+
throw new datasource_toolkit_1.ValidationError(`Invalid segment: "${segment}"`);
|
|
75
|
+
}
|
|
76
|
+
return segment;
|
|
77
|
+
}
|
|
78
|
+
static parseCaller(context) {
|
|
79
|
+
const timezone = context.request.query.timezone?.toString();
|
|
80
|
+
if (!timezone) {
|
|
81
|
+
throw new datasource_toolkit_1.ValidationError('Missing timezone');
|
|
82
|
+
}
|
|
83
|
+
// This is a method to validate a timezone using node only
|
|
84
|
+
// @see https://stackoverflow.com/questions/44115681
|
|
85
|
+
if (!Intl || !Intl.DateTimeFormat().resolvedOptions().timeZone) {
|
|
86
|
+
throw new Error('Time zones are not available in this environment');
|
|
87
|
+
}
|
|
88
|
+
try {
|
|
89
|
+
Intl.DateTimeFormat('en-US', { timeZone: timezone });
|
|
90
|
+
}
|
|
91
|
+
catch {
|
|
92
|
+
throw new datasource_toolkit_1.ValidationError(`Invalid timezone: "${timezone}"`);
|
|
93
|
+
}
|
|
94
|
+
return { ...context.state.user, timezone };
|
|
95
|
+
}
|
|
96
|
+
static parsePagination(context) {
|
|
97
|
+
const queryItemsPerPage = (context.request.body?.data?.attributes?.all_records_subset_query?.['page[size]'] ??
|
|
98
|
+
context.request.query['page[size]'] ??
|
|
99
|
+
DEFAULT_ITEMS_PER_PAGE).toString();
|
|
100
|
+
const queryPageToSkip = (context.request.body?.data?.attributes?.all_records_subset_query?.['page[number]'] ??
|
|
101
|
+
context.request.query['page[number]'] ??
|
|
102
|
+
DEFAULT_PAGE_TO_SKIP).toString();
|
|
103
|
+
const itemsPerPage = Number.parseInt(queryItemsPerPage, 10);
|
|
104
|
+
let pageToSkip = Number.parseInt(queryPageToSkip, 10);
|
|
105
|
+
if (Number.isNaN(itemsPerPage) ||
|
|
106
|
+
Number.isNaN(pageToSkip) ||
|
|
107
|
+
itemsPerPage <= 0 ||
|
|
108
|
+
pageToSkip <= 0) {
|
|
109
|
+
throw new datasource_toolkit_1.ValidationError(`Invalid pagination [limit: ${itemsPerPage}, skip: ${pageToSkip}]`);
|
|
110
|
+
}
|
|
111
|
+
pageToSkip = Math.max(pageToSkip - 1, 0);
|
|
112
|
+
pageToSkip *= itemsPerPage;
|
|
113
|
+
return new datasource_toolkit_1.Page(pageToSkip, itemsPerPage);
|
|
114
|
+
}
|
|
115
|
+
static parseSort(collection, context) {
|
|
116
|
+
const sortString = context.request.body?.data?.attributes?.all_records_subset_query?.sort?.toString() ??
|
|
117
|
+
context.request.query.sort?.toString();
|
|
118
|
+
try {
|
|
119
|
+
if (!sortString)
|
|
120
|
+
return datasource_toolkit_1.SortFactory.byPrimaryKeys(collection);
|
|
121
|
+
const sort = new datasource_toolkit_1.Sort({
|
|
122
|
+
field: sortString.replace(/^-/, '').replace('.', ':'),
|
|
123
|
+
ascending: !sortString.startsWith('-'),
|
|
124
|
+
});
|
|
125
|
+
datasource_toolkit_1.SortValidator.validate(collection, sort);
|
|
126
|
+
return sort;
|
|
127
|
+
}
|
|
128
|
+
catch {
|
|
129
|
+
throw new datasource_toolkit_1.ValidationError(`Invalid sort: ${sortString}`);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
exports.default = QueryStringParser;
|
|
134
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVlcnktc3RyaW5nLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3V0aWxzL3F1ZXJ5LXN0cmluZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLHdFQWF5QztBQUV6QyxvRkFBMEQ7QUFFMUQsTUFBTSxzQkFBc0IsR0FBRyxFQUFFLENBQUM7QUFDbEMsTUFBTSxvQkFBb0IsR0FBRyxDQUFDLENBQUM7QUFFL0IsTUFBcUIsaUJBQWlCO0lBQ3BDLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxVQUFzQixFQUFFLE9BQWdCO1FBQ2hFLElBQUk7WUFDRixNQUFNLE9BQU8sR0FDWCxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLHdCQUF3QixFQUFFLE9BQU87Z0JBQ3pFLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLE9BQU87Z0JBQzdCLE9BQU8sQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQztZQUVqQyxJQUFJLENBQUMsT0FBTztnQkFBRSxPQUFPLElBQUksQ0FBQztZQUUxQixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO1lBQzVDLE1BQU0sYUFBYSxHQUFHLCtCQUFtQixDQUFDLGVBQWUsQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDNUUsMkNBQXNCLENBQUMsUUFBUSxDQUFDLGFBQWEsRUFBRSxVQUFVLENBQUMsQ0FBQztZQUUzRCxPQUFPLGFBQWEsQ0FBQztTQUN0QjtRQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQ1YsTUFBTSxJQUFJLG9DQUFlLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxPQUFPLEdBQUcsQ0FBQyxDQUFDO1NBQzdEO0lBQ0gsQ0FBQztJQUVELE1BQU0sQ0FBQyxlQUFlLENBQUMsVUFBc0IsRUFBRSxPQUFnQjtRQUM3RCxJQUFJO1lBQ0YsTUFBTSxNQUFNLEdB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
|
package/package.json
ADDED
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@forestadmin/agent",
|
|
3
|
+
"version": "1.0.0-alpha.1",
|
|
4
|
+
"main": "dist/index.js",
|
|
5
|
+
"license": "GPL-3.0",
|
|
6
|
+
"publishConfig": {
|
|
7
|
+
"access": "public"
|
|
8
|
+
},
|
|
9
|
+
"repository": {
|
|
10
|
+
"type": "git",
|
|
11
|
+
"url": "git+https://github.com/ForestAdmin/agent-nodejs.git",
|
|
12
|
+
"directory": "packages/agent"
|
|
13
|
+
},
|
|
14
|
+
"dependencies": {
|
|
15
|
+
"@fast-csv/format": "^4.3.5",
|
|
16
|
+
"@fastify/express": "^1.1.0",
|
|
17
|
+
"@forestadmin/datasource-customizer": "1.0.0-alpha.1",
|
|
18
|
+
"@forestadmin/datasource-toolkit": "1.0.0-alpha.1",
|
|
19
|
+
"@koa/cors": "^3.3.0",
|
|
20
|
+
"@koa/router": "^10.1.1",
|
|
21
|
+
"forest-ip-utils": "^1.0.1",
|
|
22
|
+
"json-api-serializer": "^2.6.6",
|
|
23
|
+
"json-stringify-pretty-compact": "^3.0.0",
|
|
24
|
+
"jsonwebtoken": "^8.5.1",
|
|
25
|
+
"koa": "^2.13.4",
|
|
26
|
+
"koa-bodyparser": "^4.3.0",
|
|
27
|
+
"koa-jwt": "^4.0.3",
|
|
28
|
+
"lru-cache": "^7.3.1",
|
|
29
|
+
"luxon": "^2.3.0",
|
|
30
|
+
"object-hash": "^3.0.0",
|
|
31
|
+
"openid-client": "5.1.3",
|
|
32
|
+
"superagent": "^7.0.1",
|
|
33
|
+
"uuid": "^8.3.2"
|
|
34
|
+
},
|
|
35
|
+
"files": [
|
|
36
|
+
"dist/**/*.js",
|
|
37
|
+
"dist/**/*.d.ts"
|
|
38
|
+
],
|
|
39
|
+
"scripts": {
|
|
40
|
+
"build": "tsc",
|
|
41
|
+
"build:watch": "tsc --watch",
|
|
42
|
+
"clean": "rm -rf coverage dist",
|
|
43
|
+
"lint": "eslint src test",
|
|
44
|
+
"test": "jest"
|
|
45
|
+
},
|
|
46
|
+
"devDependencies": {
|
|
47
|
+
"@nestjs/common": "^8.4.5",
|
|
48
|
+
"@nestjs/core": "^8.4.5",
|
|
49
|
+
"@nestjs/platform-express": "^8.4.5",
|
|
50
|
+
"@nestjs/platform-fastify": "^8.4.5",
|
|
51
|
+
"@shopify/jest-koa-mocks": "^3.1.0",
|
|
52
|
+
"@types/json-api-serializer": "2.6.3",
|
|
53
|
+
"@types/jsonwebtoken": "^8.5.8",
|
|
54
|
+
"@types/koa": "^2.13.4",
|
|
55
|
+
"@types/koa-bodyparser": "^4.3.5",
|
|
56
|
+
"@types/koa__cors": "^3.1.1",
|
|
57
|
+
"@types/koa__router": "^8.0.11",
|
|
58
|
+
"@types/superagent": "^4.1.15",
|
|
59
|
+
"express": "^4.18.1",
|
|
60
|
+
"fastify": "^3.29.0",
|
|
61
|
+
"fastify2": "npm:fastify@^2.15.3",
|
|
62
|
+
"fishery": "^2.1.0",
|
|
63
|
+
"reflect-metadata": "^0.1.13",
|
|
64
|
+
"rxjs": "^7.5.5"
|
|
65
|
+
}
|
|
66
|
+
}
|