@forestadmin/agent-client 0.1.0 → 1.0.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.
Files changed (69) hide show
  1. package/dist/action-fields/action-field-checkbox-group.d.ts +8 -0
  2. package/dist/action-fields/action-field-checkbox-group.js +23 -0
  3. package/dist/action-fields/action-field-checkbox.d.ts +6 -0
  4. package/dist/action-fields/action-field-checkbox.js +16 -0
  5. package/dist/action-fields/action-field-color-picker.d.ts +7 -0
  6. package/dist/action-fields/action-field-color-picker.js +19 -0
  7. package/dist/action-fields/action-field-date.d.ts +5 -0
  8. package/dist/action-fields/action-field-date.js +13 -0
  9. package/dist/action-fields/action-field-dropdown.d.ts +7 -0
  10. package/dist/action-fields/action-field-dropdown.js +16 -0
  11. package/dist/action-fields/action-field-enum.d.ts +6 -0
  12. package/dist/action-fields/action-field-enum.js +18 -0
  13. package/dist/action-fields/action-field-json.d.ts +5 -0
  14. package/dist/action-fields/action-field-json.js +13 -0
  15. package/dist/action-fields/action-field-multiple-choice.d.ts +7 -0
  16. package/dist/action-fields/action-field-multiple-choice.js +19 -0
  17. package/dist/action-fields/action-field-number-list.d.ts +6 -0
  18. package/dist/action-fields/action-field-number-list.js +20 -0
  19. package/dist/action-fields/action-field-number.d.ts +5 -0
  20. package/dist/action-fields/action-field-number.js +13 -0
  21. package/dist/action-fields/action-field-radio-group.d.ts +7 -0
  22. package/dist/action-fields/action-field-radio-group.js +16 -0
  23. package/dist/action-fields/action-field-string-list.d.ts +6 -0
  24. package/dist/action-fields/action-field-string-list.js +20 -0
  25. package/dist/action-fields/action-field-string.d.ts +5 -0
  26. package/dist/action-fields/action-field-string.js +13 -0
  27. package/dist/action-fields/action-field.d.ts +15 -0
  28. package/dist/action-fields/action-field.js +34 -0
  29. package/dist/action-fields/field-form-states.d.ts +25 -0
  30. package/dist/action-fields/field-form-states.js +94 -0
  31. package/dist/action-fields/field-getter.d.ts +10 -0
  32. package/dist/action-fields/field-getter.js +21 -0
  33. package/dist/action-fields/types.d.ts +28 -0
  34. package/dist/action-fields/types.js +3 -0
  35. package/dist/action-layout/action-layout-container.d.ts +9 -0
  36. package/dist/action-layout/action-layout-container.js +24 -0
  37. package/dist/action-layout/action-layout-element.d.ts +14 -0
  38. package/dist/action-layout/action-layout-element.js +47 -0
  39. package/dist/action-layout/action-layout-input.d.ts +7 -0
  40. package/dist/action-layout/action-layout-input.js +12 -0
  41. package/dist/action-layout/action-layout-page.d.ts +8 -0
  42. package/dist/action-layout/action-layout-page.js +18 -0
  43. package/dist/action-layout/action-layout-root.d.ts +6 -0
  44. package/dist/action-layout/action-layout-root.js +19 -0
  45. package/dist/action-layout/errors.d.ts +8 -0
  46. package/dist/action-layout/errors.js +16 -0
  47. package/dist/domains/action.d.ts +58 -0
  48. package/dist/domains/action.js +125 -0
  49. package/dist/domains/chart.d.ts +21 -0
  50. package/dist/domains/chart.js +39 -0
  51. package/dist/domains/collection-chart.d.ts +19 -0
  52. package/dist/domains/collection-chart.js +40 -0
  53. package/dist/domains/collection.d.ts +25 -0
  54. package/dist/domains/collection.js +109 -0
  55. package/dist/domains/relation.d.ts +11 -0
  56. package/dist/domains/relation.js +23 -0
  57. package/dist/domains/remote-agent-client.d.ts +42 -0
  58. package/dist/domains/remote-agent-client.js +43 -0
  59. package/dist/domains/segment.d.ts +14 -0
  60. package/dist/domains/segment.js +49 -0
  61. package/dist/http-requester.d.ts +28 -0
  62. package/dist/http-requester.js +66 -0
  63. package/dist/index.d.ts +10 -0
  64. package/dist/index.js +18 -0
  65. package/dist/query-serializer.d.ts +8 -0
  66. package/dist/query-serializer.js +77 -0
  67. package/dist/types.d.ts +26 -0
  68. package/dist/types.js +3 -0
  69. package/package.json +2 -14
@@ -0,0 +1,109 @@
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 action_1 = __importDefault(require("./action"));
7
+ const collection_chart_1 = __importDefault(require("./collection-chart"));
8
+ const relation_1 = __importDefault(require("./relation"));
9
+ const segment_1 = __importDefault(require("./segment"));
10
+ const field_form_states_1 = __importDefault(require("../action-fields/field-form-states"));
11
+ const query_serializer_1 = __importDefault(require("../query-serializer"));
12
+ class Collection extends collection_chart_1.default {
13
+ constructor(name, httpRequester, actionEndpoints) {
14
+ super(name, httpRequester);
15
+ this.name = name;
16
+ this.actionEndpoints = actionEndpoints;
17
+ }
18
+ async action(actionName, actionContext) {
19
+ const actionPath = this.getActionPath(this.actionEndpoints, this.name, actionName);
20
+ const ids = (actionContext?.recordIds ?? [actionContext?.recordId]).filter(Boolean).map(String);
21
+ const fieldsFormStates = new field_form_states_1.default(actionName, actionPath, this.name, this.httpRequester, ids);
22
+ const action = new action_1.default(this.name, this.httpRequester, actionPath, fieldsFormStates, ids);
23
+ await fieldsFormStates.loadInitialState();
24
+ return action;
25
+ }
26
+ segment(name) {
27
+ return new segment_1.default(name, this.name, this.httpRequester);
28
+ }
29
+ liveQuerySegment(options) {
30
+ // there is no name for live query
31
+ return new segment_1.default(undefined, this.name, this.httpRequester, options);
32
+ }
33
+ relation(name, parentId) {
34
+ return new relation_1.default(name, this.name, parentId, this.httpRequester);
35
+ }
36
+ async search(content) {
37
+ return this.list({ search: content });
38
+ }
39
+ async list(options) {
40
+ return this.httpRequester.query({
41
+ method: 'get',
42
+ path: `/forest/${this.name}`,
43
+ query: query_serializer_1.default.serialize(options, this.name),
44
+ });
45
+ }
46
+ async exportCsv(stream, options) {
47
+ await this.httpRequester.stream({
48
+ path: `/forest/${this.name}.csv`,
49
+ contentType: 'text/csv',
50
+ query: {
51
+ ...query_serializer_1.default.serialize(options, this.name),
52
+ ...{ header: JSON.stringify(options?.fields) },
53
+ },
54
+ stream,
55
+ });
56
+ }
57
+ async count(options) {
58
+ return Number((await this.httpRequester.query({
59
+ method: 'get',
60
+ path: `/forest/${this.name}/count`,
61
+ query: query_serializer_1.default.serialize(options, this.name),
62
+ })).count);
63
+ }
64
+ async delete(ids) {
65
+ const serializedIds = ids.map((id) => id.toString());
66
+ const requestBody = {
67
+ data: {
68
+ attributes: { collection_name: this.name, ids: serializedIds },
69
+ type: 'action-requests',
70
+ },
71
+ };
72
+ return this.httpRequester.query({
73
+ method: 'delete',
74
+ path: `/forest/${this.name}`,
75
+ body: requestBody,
76
+ });
77
+ }
78
+ async create(attributes) {
79
+ const requestBody = { data: { attributes, type: this.name } };
80
+ return this.httpRequester.query({
81
+ method: 'post',
82
+ path: `/forest/${this.name}`,
83
+ body: requestBody,
84
+ });
85
+ }
86
+ async update(id, attributes) {
87
+ const requestBody = { data: { attributes, type: this.name, id: id.toString() } };
88
+ return this.httpRequester.query({
89
+ method: 'put',
90
+ path: `/forest/${this.name}/${id.toString()}`,
91
+ body: requestBody,
92
+ });
93
+ }
94
+ getActionPath(actionEndpoints, collectionName, actionName) {
95
+ const collection = actionEndpoints[collectionName];
96
+ if (!collection)
97
+ throw new Error(`Collection ${collectionName} not found in schema`);
98
+ const action = collection[actionName];
99
+ if (!action) {
100
+ throw new Error(`Action ${actionName} not found in collection ${collectionName}`);
101
+ }
102
+ if (!action.endpoint) {
103
+ throw new Error(`Action ${actionName} not found in collection ${collectionName}`);
104
+ }
105
+ return action.endpoint;
106
+ }
107
+ }
108
+ exports.default = Collection;
109
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sbGVjdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kb21haW5zL2NvbGxlY3Rpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFJQSxzREFBa0Y7QUFDbEYsMEVBQWlEO0FBQ2pELDBEQUFrQztBQUNsQyx3REFBZ0M7QUFDaEMsMkZBQWlFO0FBRWpFLDJFQUFrRDtBQUVsRCxNQUFxQixVQUEwQixTQUFRLDBCQUFlO0lBSXBFLFlBQ0UsSUFBWSxFQUNaLGFBQTRCLEVBQzVCLGVBQTRDO1FBRTVDLEtBQUssQ0FBQyxJQUFJLEVBQUUsYUFBYSxDQUFDLENBQUM7UUFFM0IsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7UUFDakIsSUFBSSxDQUFDLGVBQWUsR0FBRyxlQUFlLENBQUM7SUFDekMsQ0FBQztJQUVELEtBQUssQ0FBQyxNQUFNLENBQ1YsVUFBa0IsRUFDbEIsYUFBaUM7UUFFakMsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDbkYsTUFBTSxHQUFHLEdBQUcsQ0FBQyxhQUFhLEVBQUUsU0FBUyxJQUFJLENBQUMsYUFBYSxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUVoRyxNQUFNLGdCQUFnQixHQUFHLElBQUksMkJBQWUsQ0FDMUMsVUFBVSxFQUNWLFVBQVUsRUFDVixJQUFJLENBQUMsSUFBSSxFQUNULElBQUksQ0FBQyxhQUFhLEVBQ2xCLEdBQUcsQ0FDSixDQUFDO1FBRUYsTUFBTSxNQUFNLEdBQUcsSUFBSSxnQkFBTSxDQUN2QixJQUFJLENBQUMsSUFBSSxFQUNULElBQUksQ0FBQyxhQUFhLEVBQ2xCLFVBQVUsRUFDVixnQkFBZ0IsRUFDaEIsR0FBRyxDQUNKLENBQUM7UUFF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
@@ -0,0 +1,11 @@
1
+ import type HttpRequester from '../http-requester';
2
+ import type { SelectOptions } from '../types';
3
+ export default class Relation<TypingsSchema> {
4
+ private readonly name;
5
+ private readonly collectionName;
6
+ private readonly parentId;
7
+ private readonly httpRequester;
8
+ constructor(name: string, collectionName: string, parentId: string | number, httpRequester: HttpRequester);
9
+ list<Data = unknown>(options?: SelectOptions): Promise<Data[]>;
10
+ }
11
+ //# sourceMappingURL=relation.d.ts.map
@@ -0,0 +1,23 @@
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 query_serializer_1 = __importDefault(require("../query-serializer"));
7
+ class Relation {
8
+ constructor(name, collectionName, parentId, httpRequester) {
9
+ this.name = name;
10
+ this.collectionName = collectionName;
11
+ this.httpRequester = httpRequester;
12
+ this.parentId = parentId;
13
+ }
14
+ list(options) {
15
+ return this.httpRequester.query({
16
+ method: 'get',
17
+ path: `/forest/${this.collectionName}/${this.parentId}/relationships/${this.name}`,
18
+ query: query_serializer_1.default.serialize(options, this.collectionName),
19
+ });
20
+ }
21
+ }
22
+ exports.default = Relation;
23
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVsYXRpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZG9tYWlucy9yZWxhdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUdBLDJFQUFrRDtBQUVsRCxNQUFxQixRQUFRO0lBTTNCLFlBQ0UsSUFBWSxFQUNaLGNBQXNCLEVBQ3RCLFFBQXlCLEVBQ3pCLGFBQTRCO1FBRTVCLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO1FBQ2pCLElBQUksQ0FBQyxjQUFjLEdBQUcsY0FBYyxDQUFDO1FBQ3JDLElBQUksQ0FBQyxhQUFhLEdBQUcsYUFBYSxDQUFDO1FBQ25DLElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO0lBQzNCLENBQUM7SUFFRCxJQUFJLENBQWlCLE9BQXVCO1FBQzFDLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQVM7WUFDdEMsTUFBTSxFQUFFLEtBQUs7WUFDYixJQUFJLEVBQUUsV0FBVyxJQUFJLENBQUMsY0FBYyxJQUFJLElBQUksQ0FBQyxRQUFRLGtCQUFrQixJQUFJLENBQUMsSUFBSSxFQUFFO1lBQ2xGLEtBQUssRUFBRSwwQkFBZSxDQUFDLFNBQVMsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLGNBQWMsQ0FBQztTQUMvRCxDQUFDLENBQUM7SUFDTCxDQUFDO0NBQ0Y7QUF6QkQsMkJBeUJDIn0=
@@ -0,0 +1,42 @@
1
+ import { RawTreeWithSources } from '@forestadmin/forestadmin-client';
2
+ import { ActionEndpointsByCollection } from './action';
3
+ import Chart from './chart';
4
+ import Collection from './collection';
5
+ import HttpRequester from '../http-requester';
6
+ export type SmartActionPermissionsOverride = Partial<{
7
+ triggerEnabled: boolean;
8
+ triggerConditions: RawTreeWithSources;
9
+ approvalRequired: boolean;
10
+ approvalRequiredConditions: RawTreeWithSources;
11
+ userApprovalEnabled: boolean;
12
+ userApprovalConditions: RawTreeWithSources;
13
+ selfApprovalEnabled: boolean;
14
+ }>;
15
+ export type CollectionPermissionsOverride = Partial<{
16
+ browseEnabled: boolean;
17
+ deleteEnabled: boolean;
18
+ editEnabled: boolean;
19
+ exportEnabled: boolean;
20
+ addEnabled: boolean;
21
+ readEnabled: boolean;
22
+ }>;
23
+ export type PermissionsOverride = Record<string, {
24
+ collection: CollectionPermissionsOverride;
25
+ actions: Record<string, SmartActionPermissionsOverride>;
26
+ }>;
27
+ type CollectionName<T> = keyof T & string;
28
+ export default class RemoteAgentClient<TypingsSchema extends Record<string, unknown> = Record<string, unknown>> extends Chart {
29
+ protected actionEndpoints?: ActionEndpointsByCollection;
30
+ private overridePermissions?;
31
+ constructor(params?: {
32
+ actionEndpoints?: ActionEndpointsByCollection;
33
+ httpRequester: HttpRequester;
34
+ overridePermissions?: (permissions: PermissionsOverride) => Promise<void>;
35
+ });
36
+ overrideCollectionPermission(collectionName: CollectionName<TypingsSchema>, permissions: CollectionPermissionsOverride): Promise<void>;
37
+ overrideActionPermission(collectionName: CollectionName<TypingsSchema>, actionName: string, permissions: SmartActionPermissionsOverride): Promise<void>;
38
+ clearPermissionOverride(): Promise<void>;
39
+ collection(name: CollectionName<TypingsSchema>): Collection<TypingsSchema>;
40
+ }
41
+ export {};
42
+ //# sourceMappingURL=remote-agent-client.d.ts.map
@@ -0,0 +1,43 @@
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 chart_1 = __importDefault(require("./chart"));
7
+ const collection_1 = __importDefault(require("./collection"));
8
+ class RemoteAgentClient extends chart_1.default {
9
+ constructor(params) {
10
+ super();
11
+ if (!params)
12
+ return;
13
+ this.httpRequester = params.httpRequester;
14
+ this.actionEndpoints = params.actionEndpoints;
15
+ this.overridePermissions = params.overridePermissions;
16
+ }
17
+ async overrideCollectionPermission(collectionName, permissions) {
18
+ await this.overridePermissions?.({
19
+ [collectionName]: {
20
+ collection: permissions,
21
+ actions: {},
22
+ },
23
+ });
24
+ }
25
+ async overrideActionPermission(collectionName, actionName, permissions) {
26
+ await this.overridePermissions?.({
27
+ [collectionName]: {
28
+ collection: {},
29
+ actions: {
30
+ [actionName]: permissions,
31
+ },
32
+ },
33
+ });
34
+ }
35
+ async clearPermissionOverride() {
36
+ await this.overridePermissions?.({});
37
+ }
38
+ collection(name) {
39
+ return new collection_1.default(name, this.httpRequester, this.actionEndpoints);
40
+ }
41
+ }
42
+ exports.default = RemoteAgentClient;
43
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVtb3RlLWFnZW50LWNsaWVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kb21haW5zL3JlbW90ZS1hZ2VudC1jbGllbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFHQSxvREFBNEI7QUFDNUIsOERBQXNDO0FBZ0N0QyxNQUFxQixpQkFFbkIsU0FBUSxlQUFLO0lBS2IsWUFBWSxNQUlYO1FBQ0MsS0FBSyxFQUFFLENBQUM7UUFDUixJQUFJLENBQUMsTUFBTTtZQUFFLE9BQU87UUFDcEIsSUFBSSxDQUFDLGFBQWEsR0FBRyxNQUFNLENBQUMsYUFBYSxDQUFDO1FBQzFDLElBQUksQ0FBQyxlQUFlLEdBQUcsTUFBTSxDQUFDLGVBQWUsQ0FBQztRQUM5QyxJQUFJLENBQUMsbUJBQW1CLEdBQUcsTUFBTSxDQUFDLG1CQUFtQixDQUFDO0lBQ3hELENBQUM7SUFFRCxLQUFLLENBQUMsNEJBQTRCLENBQ2hDLGNBQTZDLEVBQzdDLFdBQTBDO1FBRTFDLE1BQU0sSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7WUFDL0IsQ0FBQyxjQUFjLENBQUMsRUFBRTtnQkFDaEIsVUFBVSxFQUFFLFdBQVc7Z0JBQ3ZCLE9BQU8sRUFBRSxFQUFFO2FBQ1o7U0FDRixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsS0FBSyxDQUFDLHdCQUF3QixDQUM1QixjQUE2QyxFQUM3QyxVQUFrQixFQUNsQixXQUEyQztRQUUzQyxNQUFNLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1lBQy9CLENBQUMsY0FBYyxDQUFDLEVBQUU7Z0JBQ2hCLFVBQVUsRUFBRSxFQUFFO2dCQUNkLE9BQU8sRUFBRTtvQkFDUCxDQUFDLFVBQVUsQ0FBQyxFQUFFLFdBQVc7aUJBQzFCO2FBQ0Y7U0FDRixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsS0FBSyxDQUFDLHVCQUF1QjtRQUMzQixNQUFNLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7SUFFRCxVQUFVLENBQUMsSUFBbUM7UUFDNUMsT0FBTyxJQUFJLG9CQUFVLENBQWdCLElBQUksRUFBRSxJQUFJLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztJQUN2RixDQUFDO0NBQ0Y7QUFyREQsb0NBcURDIn0=
@@ -0,0 +1,14 @@
1
+ import type HttpRequester from '../http-requester';
2
+ import type { ExportOptions, LiveQueryOptions, SelectOptions } from '../types';
3
+ import { WriteStream } from 'node:fs';
4
+ export default class Segment<TypingsSchema> {
5
+ private readonly name?;
6
+ private readonly collectionName;
7
+ private readonly httpRequester;
8
+ private readonly liveQuerySegment?;
9
+ constructor(name: string | undefined, collectionName: string, httpRequester: HttpRequester, liveQuerySegment?: LiveQueryOptions);
10
+ list<Data = unknown>(options?: SelectOptions): Promise<Data[]>;
11
+ exportCsv(stream: WriteStream, options?: ExportOptions): Promise<void>;
12
+ private serializeQuery;
13
+ }
14
+ //# sourceMappingURL=segment.d.ts.map
@@ -0,0 +1,49 @@
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 query_serializer_1 = __importDefault(require("../query-serializer"));
7
+ class Segment {
8
+ constructor(name, collectionName, httpRequester, liveQuerySegment) {
9
+ this.name = name;
10
+ this.collectionName = collectionName;
11
+ this.httpRequester = httpRequester;
12
+ this.liveQuerySegment = liveQuerySegment;
13
+ }
14
+ async list(options) {
15
+ return this.httpRequester.query({
16
+ method: 'get',
17
+ path: `/forest/${this.collectionName}`,
18
+ query: this.serializeQuery(options),
19
+ });
20
+ }
21
+ async exportCsv(stream, options) {
22
+ await this.httpRequester.stream({
23
+ path: `/forest/${this.collectionName}.csv`,
24
+ contentType: 'text/csv',
25
+ query: {
26
+ ...this.serializeQuery(options),
27
+ ...{ header: JSON.stringify(options?.fields) },
28
+ },
29
+ stream,
30
+ });
31
+ }
32
+ serializeQuery(options) {
33
+ if (this.liveQuerySegment) {
34
+ return query_serializer_1.default.serialize({
35
+ ...(options ?? {}),
36
+ ...{
37
+ segmentQuery: this.liveQuerySegment.query,
38
+ connectionName: this.liveQuerySegment.connectionName,
39
+ },
40
+ }, this.collectionName);
41
+ }
42
+ return {
43
+ ...query_serializer_1.default.serialize(options, this.collectionName),
44
+ segment: this.name,
45
+ };
46
+ }
47
+ }
48
+ exports.default = Segment;
49
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VnbWVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kb21haW5zL3NlZ21lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFLQSwyRUFBa0Q7QUFFbEQsTUFBcUIsT0FBTztJQU0xQixZQUNFLElBQXdCLEVBQ3hCLGNBQXNCLEVBQ3RCLGFBQTRCLEVBQzVCLGdCQUFtQztRQUVuQyxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztRQUNqQixJQUFJLENBQUMsY0FBYyxHQUFHLGNBQWMsQ0FBQztRQUNyQyxJQUFJLENBQUMsYUFBYSxHQUFHLGFBQWEsQ0FBQztRQUNuQyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsZ0JBQWdCLENBQUM7SUFDM0MsQ0FBQztJQUVELEtBQUssQ0FBQyxJQUFJLENBQWlCLE9BQXVCO1FBQ2hELE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQVM7WUFDdEMsTUFBTSxFQUFFLEtBQUs7WUFDYixJQUFJLEVBQUUsV0FBVyxJQUFJLENBQUMsY0FBYyxFQUFFO1lBQ3RDLEtBQUssRUFBRSxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQztTQUNwQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsS0FBSyxDQUFDLFNBQVMsQ0FBQyxNQUFtQixFQUFFLE9BQXVCO1FBQzFELE1BQU0sSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUM7WUFDOUIsSUFBSSxFQUFFLFdBQVcsSUFBSSxDQUFDLGNBQWMsTUFBTTtZQUMxQyxXQUFXLEVBQUUsVUFBVTtZQUN2QixLQUFLLEVBQUU7Z0JBQ0wsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQztnQkFDL0IsR0FBRyxFQUFFLE1BQU0sRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsRUFBRTthQUMvQztZQUNELE1BQU07U0FDUCxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU8sY0FBYyxDQUFDLE9BQXVCO1FBQzVDLElBQUksSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7WUFDMUIsT0FBTywwQkFBZSxDQUFDLFNBQVMsQ0FDOUI7Z0JBQ0UsR0FBRyxDQUFDLE9BQU8sSUFBSSxFQUFFLENBQUM7Z0JBQ2xCLEdBQUc7b0JBQ0QsWUFBWSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLO29CQUN6QyxjQUFjLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGNBQWM7aUJBQ3JEO2FBQ0YsRUFDRCxJQUFJLENBQUMsY0FBYyxDQUNwQixDQUFDO1FBQ0osQ0FBQztRQUVELE9BQU87WUFDTCxHQUFHLDBCQUFlLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsY0FBYyxDQUFDO1lBQzFELE9BQU8sRUFBRSxJQUFJLENBQUMsSUFBSTtTQUNuQixDQUFDO0lBQ0osQ0FBQztDQUNGO0FBekRELDBCQXlEQyJ9
@@ -0,0 +1,28 @@
1
+ import { WriteStream } from 'fs';
2
+ export default class HttpRequester {
3
+ private readonly token;
4
+ private readonly options;
5
+ private readonly deserializer;
6
+ private get baseUrl();
7
+ constructor(token: string, options: {
8
+ prefix?: string;
9
+ url: string;
10
+ });
11
+ query<Data = unknown>({ method, path, body, query, maxTimeAllowed, contentType, }: {
12
+ method: 'get' | 'post' | 'put' | 'delete';
13
+ path: string;
14
+ body?: Record<string, unknown>;
15
+ query?: Record<string, unknown>;
16
+ maxTimeAllowed?: number;
17
+ contentType?: 'application/json' | 'text/csv';
18
+ }): Promise<Data>;
19
+ stream({ path: reqPath, query, contentType, maxTimeAllowed, stream, }: {
20
+ path: string;
21
+ query?: Record<string, unknown>;
22
+ contentType: 'text/csv';
23
+ maxTimeAllowed?: number;
24
+ stream: WriteStream;
25
+ }): Promise<void>;
26
+ static escapeUrlSlug(name: string): string;
27
+ }
28
+ //# sourceMappingURL=http-requester.d.ts.map
@@ -0,0 +1,66 @@
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 jsonapi_serializer_1 = require("jsonapi-serializer");
7
+ const superagent_1 = __importDefault(require("superagent"));
8
+ class HttpRequester {
9
+ get baseUrl() {
10
+ const prefix = this.options.prefix ? `/${this.options.prefix}` : '';
11
+ return `${this.options.url}${prefix}`;
12
+ }
13
+ constructor(token, options) {
14
+ this.token = token;
15
+ this.options = options;
16
+ this.deserializer = new jsonapi_serializer_1.Deserializer({ keyForAttribute: 'camelCase' });
17
+ }
18
+ async query({ method, path, body, query, maxTimeAllowed, contentType, }) {
19
+ try {
20
+ const url = new URL(`${this.baseUrl}${HttpRequester.escapeUrlSlug(path)}`).toString();
21
+ const req = superagent_1.default[method](url)
22
+ .timeout(maxTimeAllowed ?? 10000)
23
+ .set('Authorization', `Bearer ${this.token}`)
24
+ .set('Content-Type', contentType ?? 'application/json')
25
+ .query({ timezone: 'Europe/Paris', ...query });
26
+ if (body)
27
+ req.send(body);
28
+ const response = await req;
29
+ try {
30
+ return (await this.deserializer.deserialize(response.body));
31
+ }
32
+ catch {
33
+ return (response.body ?? response.text);
34
+ }
35
+ }
36
+ catch (error) {
37
+ if (!error.response)
38
+ throw error;
39
+ throw new Error(JSON.stringify({ error: error.response.error, body }, null, 4));
40
+ }
41
+ }
42
+ async stream({ path: reqPath, query, contentType = 'text/csv', maxTimeAllowed, stream, }) {
43
+ const url = new URL(`${this.baseUrl}${HttpRequester.escapeUrlSlug(reqPath)}`).toString();
44
+ return new Promise((resolve, reject) => {
45
+ superagent_1.default
46
+ .get(url)
47
+ .timeout(maxTimeAllowed ?? 10000)
48
+ .set('Authorization', `Bearer ${this.token}`)
49
+ .set('Accept', contentType)
50
+ .query({ timezone: 'Europe/Paris', ...query })
51
+ .pipe(stream)
52
+ .on('finish', () => {
53
+ resolve();
54
+ })
55
+ .on('error', err => {
56
+ console.error('Error occurred while streaming response:', err);
57
+ reject(err);
58
+ });
59
+ });
60
+ }
61
+ static escapeUrlSlug(name) {
62
+ return encodeURI(name).replace(/([+?*])/g, '\\$1');
63
+ }
64
+ }
65
+ exports.default = HttpRequester;
66
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHR0cC1yZXF1ZXN0ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaHR0cC1yZXF1ZXN0ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFDQSwyREFBa0Q7QUFDbEQsNERBQW9DO0FBRXBDLE1BQXFCLGFBQWE7SUFHaEMsSUFBWSxPQUFPO1FBQ2pCLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUVwRSxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEdBQUcsTUFBTSxFQUFFLENBQUM7SUFDeEMsQ0FBQztJQUVELFlBQ21CLEtBQWEsRUFDYixPQUF5QztRQUR6QyxVQUFLLEdBQUwsS0FBSyxDQUFRO1FBQ2IsWUFBTyxHQUFQLE9BQU8sQ0FBa0M7UUFFMUQsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLGlDQUFZLENBQUMsRUFBRSxlQUFlLEVBQUUsV0FBVyxFQUFFLENBQUMsQ0FBQztJQUN6RSxDQUFDO0lBRUQsS0FBSyxDQUFDLEtBQUssQ0FBaUIsRUFDMUIsTUFBTSxFQUNOLElBQUksRUFDSixJQUFJLEVBQ0osS0FBSyxFQUNMLGNBQWMsRUFDZCxXQUFXLEdBUVo7UUFDQyxJQUFJLENBQUM7WUFDSCxNQUFNLEdBQUcsR0FBRyxJQUFJLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLEdBQUcsYUFBYSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUM7WUFFdEYsTUFBTSxHQUFHLEdBQUcsb0JBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUM7aUJBQ2hDLE9BQU8sQ0FBQyxjQUFjLElBQUksS0FBTSxDQUFDO2lCQUNqQyxHQUFHLENBQUMsZUFBZSxFQUFFLFVBQVUsSUFBSSxD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
@@ -0,0 +1,10 @@
1
+ import { ActionEndpointsByCollection } from './domains/action';
2
+ import RemoteAgentClient, { PermissionsOverride } from './domains/remote-agent-client';
3
+ export declare function createRemoteAgentClient(params: {
4
+ overridePermissions?: (permissions: PermissionsOverride) => Promise<void>;
5
+ actionEndpoints?: ActionEndpointsByCollection;
6
+ token?: string;
7
+ url: string;
8
+ }): RemoteAgentClient<Record<string, unknown>>;
9
+ export type { SelectOptions } from './types';
10
+ //# sourceMappingURL=index.d.ts.map
package/dist/index.js ADDED
@@ -0,0 +1,18 @@
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
+ exports.createRemoteAgentClient = createRemoteAgentClient;
7
+ const remote_agent_client_1 = __importDefault(require("./domains/remote-agent-client"));
8
+ const http_requester_1 = __importDefault(require("./http-requester"));
9
+ // eslint-disable-next-line import/prefer-default-export
10
+ function createRemoteAgentClient(params) {
11
+ const httpRequester = new http_requester_1.default(params.token, { url: params.url });
12
+ return new remote_agent_client_1.default({
13
+ actionEndpoints: params.actionEndpoints,
14
+ httpRequester,
15
+ overridePermissions: params.overridePermissions,
16
+ });
17
+ }
18
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFLQSwwREFhQztBQWpCRCx3RkFBdUY7QUFDdkYsc0VBQTZDO0FBRTdDLHdEQUF3RDtBQUN4RCxTQUFnQix1QkFBdUIsQ0FBQyxNQUt2QztJQUNDLE1BQU0sYUFBYSxHQUFHLElBQUksd0JBQWEsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLEVBQUUsR0FBRyxFQUFFLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO0lBRTNFLE9BQU8sSUFBSSw2QkFBaUIsQ0FBQztRQUMzQixlQUFlLEVBQUUsTUFBTSxDQUFDLGVBQWU7UUFDdkMsYUFBYTtRQUNiLG1CQUFtQixFQUFFLE1BQU0sQ0FBQyxtQkFBbUI7S0FDaEQsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyJ9
@@ -0,0 +1,8 @@
1
+ import type { SelectOptions } from './types';
2
+ export default class QuerySerializer {
3
+ static serialize(query: SelectOptions, collectionName: string): Record<string, unknown>;
4
+ private static formatSort;
5
+ private static formatFilters;
6
+ private static formatFields;
7
+ }
8
+ //# sourceMappingURL=query-serializer.d.ts.map
@@ -0,0 +1,77 @@
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 http_requester_1 = __importDefault(require("./http-requester"));
7
+ class QuerySerializer {
8
+ static serialize(query, collectionName) {
9
+ if (!query)
10
+ return {};
11
+ return {
12
+ ...query,
13
+ ...query.filters,
14
+ sort: QuerySerializer.formatSort(query.sort),
15
+ filters: QuerySerializer.formatFilters(query.filters),
16
+ searchExtended: !!query.shouldSearchInRelation,
17
+ 'page[size]': query.pagination?.size,
18
+ 'page[number]': query.pagination?.number,
19
+ ...(query.fields?.length ? QuerySerializer.formatFields(collectionName, query.fields) : {}),
20
+ };
21
+ }
22
+ static formatSort(sort) {
23
+ if (!sort)
24
+ return undefined;
25
+ return sort.ascending ? sort.field : `-${sort.field}`;
26
+ }
27
+ static formatFilters(filters) {
28
+ if (!filters)
29
+ return undefined;
30
+ return JSON.stringify(filters);
31
+ }
32
+ static formatFields(collectionName, fields) {
33
+ if (!fields)
34
+ return {};
35
+ const projectionName = `fields[${http_requester_1.default.escapeUrlSlug(collectionName)}]`;
36
+ const projection = {
37
+ [projectionName]: [],
38
+ };
39
+ fields.forEach(field => {
40
+ // Skip empty or whitespace-only field names
41
+ const trimmedField = field.trim();
42
+ if (!trimmedField)
43
+ return;
44
+ if (trimmedField.includes('@@@')) {
45
+ const separatorIndex = trimmedField.indexOf('@@@');
46
+ const relatedCollection = trimmedField.substring(0, separatorIndex);
47
+ const relatedField = trimmedField.substring(separatorIndex + 3);
48
+ const trimmedRelation = relatedCollection.trim();
49
+ const trimmedRelatedField = relatedField?.trim();
50
+ // Validate: both relation name and field must be non-empty
51
+ if (!trimmedRelation || !trimmedRelatedField) {
52
+ // Skip malformed separators like "@@@field", "relation@@@", or "@@@"
53
+ return;
54
+ }
55
+ // Avoid duplicate relation names in the projection array
56
+ if (!projection[projectionName].includes(trimmedRelation)) {
57
+ projection[projectionName].push(trimmedRelation);
58
+ }
59
+ // Add related field to its collection projection
60
+ const relatedProjectionName = `fields[${http_requester_1.default.escapeUrlSlug(trimmedRelation)}]`;
61
+ if (!projection[relatedProjectionName]) {
62
+ projection[relatedProjectionName] = [];
63
+ }
64
+ if (!projection[relatedProjectionName].includes(trimmedRelatedField)) {
65
+ projection[relatedProjectionName].push(trimmedRelatedField);
66
+ }
67
+ }
68
+ else if (!projection[projectionName].includes(trimmedField)) {
69
+ // Avoid duplicate field names
70
+ projection[projectionName].push(trimmedField);
71
+ }
72
+ });
73
+ return projection;
74
+ }
75
+ }
76
+ exports.default = QuerySerializer;
77
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVlcnktc2VyaWFsaXplci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9xdWVyeS1zZXJpYWxpemVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBR0Esc0VBQTZDO0FBRTdDLE1BQXFCLGVBQWU7SUFDbEMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxLQUFvQixFQUFFLGNBQXNCO1FBQzNELElBQUksQ0FBQyxLQUFLO1lBQUUsT0FBTyxFQUFFLENBQUM7UUFFdEIsT0FBTztZQUNMLEdBQUcsS0FBSztZQUNSLEdBQUcsS0FBSyxDQUFDLE9BQU87WUFDaEIsSUFBSSxFQUFFLGVBQWUsQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQztZQUM1QyxPQUFPLEVBQUUsZUFBZSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDO1lBQ3JELGNBQWMsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLHNCQUFzQjtZQUM5QyxZQUFZLEVBQUUsS0FBSyxDQUFDLFVBQVUsRUFBRSxJQUFJO1lBQ3BDLGNBQWMsRUFBRSxLQUFLLENBQUMsVUFBVSxFQUFFLE1BQU07WUFDeEMsR0FBRyxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsWUFBWSxDQUFDLGNBQWMsRUFBRSxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztTQUM1RixDQUFDO0lBQ0osQ0FBQztJQUVPLE1BQU0sQ0FBQyxVQUFVLENBQUMsSUFBcUI7UUFDN0MsSUFBSSxDQUFDLElBQUk7WUFBRSxPQUFPLFNBQVMsQ0FBQztRQUU1QixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQ3hELENBQUM7SUFFTyxNQUFNLENBQUMsYUFBYSxDQUFDLE9BQXFDO1FBQ2hF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
@@ -0,0 +1,26 @@
1
+ import { PlainFilter, PlainSortClause } from '@forestadmin/datasource-toolkit';
2
+ export type BaseOptions = {
3
+ filters?: PlainFilter['conditionTree'];
4
+ sort?: PlainSortClause;
5
+ search?: string;
6
+ fields?: string[];
7
+ shouldSearchInRelation?: boolean;
8
+ };
9
+ export type ExportOptions = BaseOptions;
10
+ export type LiveQueryOptions = {
11
+ connectionName: string;
12
+ query: string;
13
+ };
14
+ export type SegmentOptions = BaseOptions & {
15
+ liveQuerySegment?: {
16
+ connectionName: string;
17
+ query: string;
18
+ };
19
+ };
20
+ export type SelectOptions = BaseOptions & {
21
+ pagination?: {
22
+ size?: number;
23
+ number?: number;
24
+ };
25
+ };
26
+ //# sourceMappingURL=types.d.ts.map
package/dist/types.js ADDED
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvdHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiJ9
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@forestadmin/agent-client",
3
- "version": "0.1.0",
3
+ "version": "1.0.0",
4
4
  "main": "dist/index.js",
5
5
  "license": "GPL-3.0",
6
6
  "publishConfig": {
@@ -12,21 +12,11 @@
12
12
  "directory": "packages/agent-client"
13
13
  },
14
14
  "dependencies": {
15
- "@forestadmin/datasource-customizer": "1.67.1",
16
15
  "@forestadmin/datasource-toolkit": "1.50.0",
17
- "@forestadmin/forestadmin-client": "1.36.14",
16
+ "@forestadmin/forestadmin-client": "1.37.0",
18
17
  "jsonapi-serializer": "^3.6.9",
19
- "jsonwebtoken": "^9.0.0",
20
18
  "superagent": "^10.2.3"
21
19
  },
22
- "peerDependencies": {
23
- "@forestadmin/agent": "^1.0.0"
24
- },
25
- "peerDependenciesMeta": {
26
- "@forestadmin/agent": {
27
- "optional": true
28
- }
29
- },
30
20
  "files": [
31
21
  "dist/**/*.js",
32
22
  "dist/**/*.d.ts"
@@ -39,8 +29,6 @@
39
29
  "test": "jest"
40
30
  },
41
31
  "devDependencies": {
42
- "@forestadmin/agent": "1.66.2",
43
- "@types/jsonwebtoken": "^9.0.1",
44
32
  "@types/superagent": "^8.1.9"
45
33
  }
46
34
  }