@forestadmin/agent 1.66.0 → 1.66.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.
Files changed (37) hide show
  1. package/dist/agent/services/chart.d.ts +102 -0
  2. package/dist/agent/services/chart.js +114 -0
  3. package/dist/routes/access/api-chart.d.ts +16 -0
  4. package/dist/routes/access/api-chart.js +47 -0
  5. package/dist/routes/modification/action.d.ts +16 -0
  6. package/dist/routes/modification/action.js +121 -0
  7. package/dist/services/authorization/internal/action-permission.d.ts +20 -0
  8. package/dist/services/authorization/internal/action-permission.js +98 -0
  9. package/dist/services/authorization/internal/generate-action-identifier.d.ts +12 -0
  10. package/dist/services/authorization/internal/generate-action-identifier.js +15 -0
  11. package/dist/services/authorization/internal/generate-actions-from-permissions.d.ts +12 -0
  12. package/dist/services/authorization/internal/generate-actions-from-permissions.js +139 -0
  13. package/dist/services/authorization/internal/generate-user-scope.d.ts +10 -0
  14. package/dist/services/authorization/internal/generate-user-scope.js +45 -0
  15. package/dist/services/authorization/internal/hash-chart.d.ts +5 -0
  16. package/dist/services/authorization/internal/hash-chart.js +58 -0
  17. package/dist/services/authorization/internal/rendering-permission.d.ts +39 -0
  18. package/dist/services/authorization/internal/rendering-permission.js +121 -0
  19. package/dist/services/authorization/internal/types.d.ts +255 -0
  20. package/dist/services/authorization/internal/types.js +54 -0
  21. package/dist/services/authorization/internal/user-permission.d.ts +16 -0
  22. package/dist/services/authorization/internal/user-permission.js +46 -0
  23. package/dist/services/permissions.d.ts +19 -0
  24. package/dist/services/permissions.js +85 -0
  25. package/dist/utils/forest-http-api.d.ts +37 -0
  26. package/dist/utils/forest-http-api.js +100 -0
  27. package/dist/utils/forest-schema/column-schema-validation.d.ts +5 -0
  28. package/dist/utils/forest-schema/column-schema-validation.js +14 -0
  29. package/dist/utils/forest-schema/emitter.d.ts +17 -0
  30. package/dist/utils/forest-schema/emitter.js +38 -0
  31. package/dist/utils/forest-schema/schema-generator.d.ts +6 -0
  32. package/dist/utils/forest-schema/schema-generator.js +13 -0
  33. package/dist/utils/forest-schema/schema-serializer.d.ts +12 -0
  34. package/dist/utils/forest-schema/schema-serializer.js +35 -0
  35. package/dist/utils/forest-schema/types.d.ts +85 -0
  36. package/dist/utils/forest-schema/types.js +16 -0
  37. package/package.json +4 -1
@@ -0,0 +1,38 @@
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 promises_1 = require("fs/promises");
7
+ const json_stringify_pretty_compact_1 = __importDefault(require("json-stringify-pretty-compact"));
8
+ const schema_generator_1 = __importDefault(require("./schema-generator"));
9
+ const schema_serializer_1 = __importDefault(require("./schema-serializer"));
10
+ // Load version from package.json at startup
11
+ // eslint-disable-next-line @typescript-eslint/no-var-requires
12
+ const { version } = require('../../../package.json');
13
+ /**
14
+ * Generate and dispatch dataSource schema on agent start.
15
+ */
16
+ class SchemaEmitter {
17
+ static async getSerializedSchema(options, dataSource) {
18
+ const schema = options.isProduction
19
+ ? await SchemaEmitter.loadFromDisk(options.schemaPath)
20
+ : await schema_generator_1.default.generate(dataSource);
21
+ if (!options.isProduction) {
22
+ const pretty = (0, json_stringify_pretty_compact_1.default)(schema, { maxLength: 80 });
23
+ await (0, promises_1.writeFile)(options.schemaPath, pretty, { encoding: 'utf-8' });
24
+ }
25
+ return schema_serializer_1.default.serialize(schema, version);
26
+ }
27
+ static async loadFromDisk(schemaPath) {
28
+ try {
29
+ const fileContent = await (0, promises_1.readFile)(schemaPath, { encoding: 'utf-8' });
30
+ return JSON.parse(fileContent);
31
+ }
32
+ catch (e) {
33
+ throw new Error(`Cannot load ${schemaPath}. Providing a schema is mandatory in production mode.`);
34
+ }
35
+ }
36
+ }
37
+ exports.default = SchemaEmitter;
38
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW1pdHRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy91dGlscy9mb3Jlc3Qtc2NoZW1hL2VtaXR0ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFDQSwwQ0FBa0Q7QUFDbEQsa0dBQXNEO0FBR3RELDBFQUFpRDtBQUNqRCw0RUFBbUQ7QUFPbkQsNENBQTRDO0FBQzVDLDhEQUE4RDtBQUM5RCxNQUFNLEVBQUUsT0FBTyxFQUFFLEdBQUcsT0FBTyxDQUFDLHVCQUF1QixDQUFDLENBQUM7QUFFckQ7O0dBRUc7QUFDSCxNQUFxQixhQUFhO0lBQ2hDLE1BQU0sQ0FBQyxLQUFLLENBQUMsbUJBQW1CLENBQzlCLE9BQWdCLEVBQ2hCLFVBQXNCO1FBRXRCLE1BQU0sTUFBTSxHQUFjLE9BQU8sQ0FBQyxZQUFZO1lBQzVDLENBQUMsQ0FBQyxNQUFNLGFBQWEsQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQztZQUN0RCxDQUFDLENBQUMsTUFBTSwwQkFBZSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUUvQyxJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksRUFBRTtZQUN6QixNQUFNLE1BQU0sR0FBRyxJQUFBLHVDQUFTLEVBQUMsTUFBTSxFQUFFLEVBQUUsU0FBUyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDcEQsTUFBTSxJQUFBLG9CQUFTLEVBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRSxNQUFNLEVBQUUsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQztTQUNwRTtRQUVELE9BQU8sMkJBQWdCLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQztJQUNyRCxDQUFDO0lBRU8sTUFBTSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsVUFBa0I7UUFDbEQsSUFBSTtZQUNGLE1BQU0sV0FBVyxHQUFHLE1BQU0sSUFBQSxtQkFBUSxFQUFDLFVBQVUsRUFBRSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDO1lBRXRFLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQztTQUNoQztRQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQ1YsTUFBTSxJQUFJLEtBQUssQ0FDYixlQUFlLFVBQVUsdURBQXVELENBQ2pGLENBQUM7U0FDSDtJQUNILENBQUM7Q0FDRjtBQTVCRCxnQ0E0QkMifQ==
@@ -0,0 +1,6 @@
1
+ import { DataSource } from '@forestadmin/datasource-toolkit';
2
+ import { ForestServerCollection } from './types';
3
+ export default class SchemaGenerator {
4
+ static generate(dataSource: DataSource): Promise<ForestServerCollection[]>;
5
+ }
6
+ //# sourceMappingURL=schema-generator.d.ts.map
@@ -0,0 +1,13 @@
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 generator_collection_1 = __importDefault(require("./generator-collection"));
7
+ class SchemaGenerator {
8
+ static async generate(dataSource) {
9
+ return Promise.all(dataSource.collections.map(collection => generator_collection_1.default.buildSchema(collection)));
10
+ }
11
+ }
12
+ exports.default = SchemaGenerator;
13
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NoZW1hLWdlbmVyYXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy91dGlscy9mb3Jlc3Qtc2NoZW1hL3NjaGVtYS1nZW5lcmF0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFFQSxrRkFBK0Q7QUFHL0QsTUFBcUIsZUFBZTtJQUNsQyxNQUFNLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxVQUFzQjtRQUMxQyxPQUFPLE9BQU8sQ0FBQyxHQUFHLENBQ2hCLFVBQVUsQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsOEJBQXlCLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQzVGLENBQUM7SUFDSixDQUFDO0NBQ0Y7QUFORCxrQ0FNQyJ9
@@ -0,0 +1,12 @@
1
+ import { ForestServerCollection } from './types';
2
+ declare type SerializedSchema = {
3
+ meta: {
4
+ schemaFileHash: string;
5
+ };
6
+ };
7
+ export default class SchemaSerializer {
8
+ private static readonly meta;
9
+ static serialize(schema: ForestServerCollection[], lianaVersion: string): SerializedSchema;
10
+ }
11
+ export {};
12
+ //# sourceMappingURL=schema-serializer.d.ts.map
@@ -0,0 +1,35 @@
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 crypto_1 = __importDefault(require("crypto"));
7
+ const json_api_serializer_1 = __importDefault(require("json-api-serializer"));
8
+ class SchemaSerializer {
9
+ static serialize(schema, lianaVersion) {
10
+ const hash = crypto_1.default.createHash('sha1').update(JSON.stringify(schema)).digest('hex');
11
+ // Build serializer
12
+ const serializer = new json_api_serializer_1.default();
13
+ serializer.register('collections', {
14
+ // Pass the metadata provided to the serialization fn
15
+ topLevelMeta: (extraData) => extraData,
16
+ relationships: {
17
+ segments: { type: 'segments' },
18
+ actions: { type: 'actions' },
19
+ },
20
+ });
21
+ serializer.register('segments', {});
22
+ serializer.register('actions', {});
23
+ // Serialize
24
+ return serializer.serialize('collections', schema.map(c => ({ id: c.name, ...c })), { ...SchemaSerializer.meta, liana_version: lianaVersion, schemaFileHash: hash });
25
+ }
26
+ }
27
+ exports.default = SchemaSerializer;
28
+ SchemaSerializer.meta = {
29
+ liana: 'forest-nodejs-agent',
30
+ stack: {
31
+ engine: 'nodejs',
32
+ engine_version: process.versions && process.versions.node,
33
+ },
34
+ };
35
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NoZW1hLXNlcmlhbGl6ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdXRpbHMvZm9yZXN0LXNjaGVtYS9zY2hlbWEtc2VyaWFsaXplci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLG9EQUE0QjtBQUM1Qiw4RUFBb0Q7QUFNcEQsTUFBcUIsZ0JBQWdCO0lBU25DLE1BQU0sQ0FBQyxTQUFTLENBQUMsTUFBZ0MsRUFBRSxZQUFvQjtRQUNyRSxNQUFNLElBQUksR0FBRyxnQkFBTSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUVwRixtQkFBbUI7UUFDbkIsTUFBTSxVQUFVLEdBQUcsSUFBSSw2QkFBaUIsRUFBRSxDQUFDO1FBRTNDLFVBQVUsQ0FBQyxRQUFRLENBQUMsYUFBYSxFQUFFO1lBQ2pDLHFEQUFxRDtZQUNyRCxZQUFZLEVBQUUsQ0FBQyxTQUFrQixFQUFFLEVBQUUsQ0FBQyxTQUFTO1lBQy9DLGFBQWEsRUFBRTtnQkFDYixRQUFRLEVBQUUsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFO2dCQUM5QixPQUFPLEVBQUUsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFO2FBQzdCO1NBQ0YsQ0FBQyxDQUFDO1FBQ0gsVUFBVSxDQUFDLFFBQVEsQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDcEMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFbkMsWUFBWTtRQUNaLE9BQU8sVUFBVSxDQUFDLFNBQVMsQ0FDekIsYUFBYSxFQUNiLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQ3ZDLEVBQUUsR0FBRyxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUUsYUFBYSxFQUFFLFlBQVksRUFBRSxjQUFjLEVBQUUsSUFBSSxFQUFFLENBQzVELENBQUM7SUFDeEIsQ0FBQzs7QUFoQ0gsbUNBaUNDO0FBaEN5QixxQkFBSSxHQUFHO0lBQzdCLEtBQUssRUFBRSxxQkFBcUI7SUFDNUIsS0FBSyxFQUFFO1FBQ0wsTUFBTSxFQUFFLFFBQVE7UUFDaEIsY0FBYyxFQUFFLE9BQU8sQ0FBQyxRQUFRLElBQUksT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJO0tBQzFEO0NBQ0YsQ0FBQyJ9
@@ -0,0 +1,85 @@
1
+ import { PrimitiveTypes } from '@forestadmin/datasource-toolkit';
2
+ export declare type ForestServerColumnType = PrimitiveTypes | [ForestServerColumnType] | {
3
+ fields: Array<{
4
+ field: string;
5
+ type: ForestServerColumnType;
6
+ }>;
7
+ };
8
+ export declare type ForestServerCollection = {
9
+ name: string;
10
+ icon: null;
11
+ integration: null;
12
+ isReadOnly: boolean;
13
+ isSearchable: boolean;
14
+ isVirtual: false;
15
+ onlyForRelationships: boolean;
16
+ paginationType: 'page';
17
+ actions: Array<ForestServerAction>;
18
+ fields: Array<ForestServerField>;
19
+ segments: Array<ForestServerSegment>;
20
+ };
21
+ export declare type ForestServerAction = {
22
+ id: string;
23
+ name: string;
24
+ type: 'single' | 'bulk' | 'global';
25
+ baseUrl: string;
26
+ endpoint: string;
27
+ httpMethod: 'POST';
28
+ redirect: unknown;
29
+ download: boolean;
30
+ fields: ForestServerActionField[];
31
+ hooks: {
32
+ load: boolean;
33
+ change: Array<unknown>;
34
+ };
35
+ };
36
+ export declare type ForestServerActionField = {
37
+ value: unknown;
38
+ defaultValue: unknown;
39
+ description: string | null;
40
+ enums: string[];
41
+ field: string;
42
+ hook: string;
43
+ isReadOnly: boolean;
44
+ isRequired: boolean;
45
+ reference: string | null;
46
+ type: ForestServerColumnType;
47
+ widget: null | 'belongsto select' | 'file picker';
48
+ };
49
+ export declare type ForestServerField = Partial<{
50
+ field: string;
51
+ type: ForestServerColumnType;
52
+ defaultValue: unknown;
53
+ enums: null | string[];
54
+ integration: null;
55
+ isFilterable: boolean;
56
+ isPrimaryKey: boolean;
57
+ isReadOnly: boolean;
58
+ isRequired: boolean;
59
+ isSortable: boolean;
60
+ isVirtual: boolean;
61
+ reference: null | string;
62
+ inverseOf: null | string;
63
+ relationship: 'BelongsTo' | 'BelongsToMany' | 'HasMany' | 'HasOne';
64
+ validations: Array<{
65
+ message: string | null;
66
+ type: ValidationType;
67
+ value: unknown;
68
+ }>;
69
+ }>;
70
+ export declare type ForestServerSegment = {
71
+ id: string;
72
+ name: string;
73
+ };
74
+ export declare enum ValidationType {
75
+ Present = "is present",
76
+ GreaterThan = "is greater than",
77
+ LessThan = "is less than",
78
+ Before = "is before",
79
+ After = "is after",
80
+ LongerThan = "is longer than",
81
+ ShorterThan = "is shorter than",
82
+ Contains = "contains",
83
+ Like = "is like"
84
+ }
85
+ //# 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdXRpbHMvZm9yZXN0LXNjaGVtYS90eXBlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUEwRUEsSUFBWSxjQVVYO0FBVkQsV0FBWSxjQUFjO0lBQ3hCLHdDQUFzQixDQUFBO0lBQ3RCLGlEQUErQixDQUFBO0lBQy9CLDJDQUF5QixDQUFBO0lBQ3pCLHNDQUFvQixDQUFBO0lBQ3BCLG9DQUFrQixDQUFBO0lBQ2xCLCtDQUE2QixDQUFBO0lBQzdCLGlEQUErQixDQUFBO0lBQy9CLHVDQUFxQixDQUFBO0lBQ3JCLGtDQUFnQixDQUFBO0FBQ2xCLENBQUMsRUFWVyxjQUFjLEdBQWQsc0JBQWMsS0FBZCxzQkFBYyxRQVV6QiJ9
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@forestadmin/agent",
3
- "version": "1.66.0",
3
+ "version": "1.66.1",
4
4
  "main": "dist/index.js",
5
5
  "license": "GPL-3.0",
6
6
  "publishConfig": {
@@ -60,5 +60,8 @@
60
60
  "openid-client": "^5.7.1",
61
61
  "reflect-metadata": "^0.1.13",
62
62
  "rxjs": "^7.8.0"
63
+ },
64
+ "overrides": {
65
+ "@paralleldrive/cuid2": "2.2.2"
63
66
  }
64
67
  }