@opra/core 0.15.0 → 0.16.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/cjs/adapter/adapter.js +29 -27
- package/cjs/adapter/http/http-adapter.js +6 -5
- package/cjs/adapter/internal/metadata.resource.js +1 -1
- package/esm/adapter/adapter.js +48 -41
- package/esm/adapter/http/express-adapter.js +11 -6
- package/esm/adapter/http/http-adapter.js +66 -61
- package/esm/adapter/http/http-request-context.host.js +6 -2
- package/esm/adapter/http/http-request.host.js +6 -2
- package/esm/adapter/http/http-response.host.js +6 -2
- package/esm/adapter/interfaces/logger.interface.js +2 -1
- package/esm/adapter/interfaces/request-context.interface.js +2 -1
- package/esm/adapter/interfaces/request.interface.js +2 -1
- package/esm/adapter/interfaces/response.interface.js +2 -1
- package/esm/adapter/internal/metadata.resource.js +15 -12
- package/esm/adapter/request-context.host.js +6 -2
- package/esm/adapter/request.host.js +5 -1
- package/esm/adapter/response.host.js +5 -1
- package/esm/augmentation/resource.augmentation.js +11 -9
- package/esm/index.js +13 -10
- package/esm/types.js +2 -1
- package/i18n/en/error.json +1 -1
- package/package.json +5 -4
- package/{esm → types}/adapter/adapter.d.ts +3 -2
- package/{esm → types}/adapter/http/http-adapter.d.ts +1 -1
- package/{esm → types}/adapter/internal/metadata.resource.d.ts +1 -1
- /package/{esm → types}/adapter/http/express-adapter.d.ts +0 -0
- /package/{esm → types}/adapter/http/http-request-context.host.d.ts +0 -0
- /package/{esm → types}/adapter/http/http-request.host.d.ts +0 -0
- /package/{esm → types}/adapter/http/http-response.host.d.ts +0 -0
- /package/{esm → types}/adapter/interfaces/logger.interface.d.ts +0 -0
- /package/{esm → types}/adapter/interfaces/request-context.interface.d.ts +0 -0
- /package/{esm → types}/adapter/interfaces/request.interface.d.ts +0 -0
- /package/{esm → types}/adapter/interfaces/response.interface.d.ts +0 -0
- /package/{esm → types}/adapter/request-context.host.d.ts +0 -0
- /package/{esm → types}/adapter/request.host.d.ts +0 -0
- /package/{esm → types}/adapter/response.host.d.ts +0 -0
- /package/{esm → types}/augmentation/resource.augmentation.d.ts +0 -0
- /package/{esm → types}/index.d.ts +0 -0
- /package/{esm → types}/types.d.ts +0 -0
package/cjs/adapter/adapter.js
CHANGED
|
@@ -3,13 +3,15 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.OpraAdapter = void 0;
|
|
4
4
|
const tslib_1 = require("tslib");
|
|
5
5
|
const path_1 = tslib_1.__importDefault(require("path"));
|
|
6
|
+
const strict_typed_events_1 = require("strict-typed-events");
|
|
6
7
|
const common_1 = require("@opra/common");
|
|
7
8
|
const metadata_resource_js_1 = require("./internal/metadata.resource.js");
|
|
8
9
|
/**
|
|
9
10
|
* @class OpraAdapter
|
|
10
11
|
*/
|
|
11
|
-
class OpraAdapter {
|
|
12
|
+
class OpraAdapter extends strict_typed_events_1.AsyncEventEmitter {
|
|
12
13
|
constructor(api) {
|
|
14
|
+
super();
|
|
13
15
|
this.api = api;
|
|
14
16
|
}
|
|
15
17
|
/**
|
|
@@ -28,6 +30,8 @@ class OpraAdapter {
|
|
|
28
30
|
this.i18n = this.i18n || common_1.I18n.defaultInstance;
|
|
29
31
|
if (!this.i18n.isInitialized)
|
|
30
32
|
await this.i18n.init();
|
|
33
|
+
if (options?.onRequest)
|
|
34
|
+
this.on('request', options.onRequest);
|
|
31
35
|
this._internalDoc = await common_1.DocumentFactory.createDocument({
|
|
32
36
|
version: common_1.OpraSchema.SpecVersion,
|
|
33
37
|
info: {
|
|
@@ -58,6 +62,7 @@ class OpraAdapter {
|
|
|
58
62
|
await Promise.allSettled(promises);
|
|
59
63
|
}
|
|
60
64
|
async executeRequest(context) {
|
|
65
|
+
await this.emitAsync('request', context);
|
|
61
66
|
const { request, response } = context;
|
|
62
67
|
const { resource, operation } = request;
|
|
63
68
|
if (resource instanceof common_1.Collection || resource instanceof common_1.Singleton) {
|
|
@@ -69,36 +74,33 @@ class OpraAdapter {
|
|
|
69
74
|
code: 'RESOLVER_FORBIDDEN'
|
|
70
75
|
});
|
|
71
76
|
const value = await endpoint.handler(context);
|
|
77
|
+
// if (value == null)
|
|
72
78
|
if (value != null)
|
|
73
79
|
response.value = value;
|
|
74
|
-
|
|
80
|
+
const { crud, many } = request;
|
|
81
|
+
if (crud === 'delete' || (crud === 'update' && many)) {
|
|
82
|
+
let affected = 0;
|
|
83
|
+
if (typeof response.value === 'number')
|
|
84
|
+
affected = response.value;
|
|
85
|
+
if (typeof response.value === 'boolean')
|
|
86
|
+
affected = response.value ? 1 : 0;
|
|
87
|
+
if (typeof response.value === 'object')
|
|
88
|
+
affected = response.value.affectedRows || response.value.affected;
|
|
89
|
+
response.value = {
|
|
90
|
+
operation: request.operation,
|
|
91
|
+
affected
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
else if (response.value != null) {
|
|
95
|
+
if (!request.many)
|
|
96
|
+
response.value = Array.isArray(response.value) ? response.value[0] : response.value;
|
|
97
|
+
else
|
|
98
|
+
response.value = Array.isArray(response.value) ? response.value : [response.value];
|
|
99
|
+
}
|
|
100
|
+
if ((request.operation === 'get' || request.operation === 'update') && response.value == null)
|
|
101
|
+
throw new common_1.ResourceNotFoundError(resource.name, request.args.key);
|
|
75
102
|
}
|
|
76
103
|
}
|
|
77
|
-
async afterExecuteRequest(context) {
|
|
78
|
-
const { request, response } = context;
|
|
79
|
-
const { resource, crud, many } = request;
|
|
80
|
-
if (crud === 'delete' || (crud === 'update' && many)) {
|
|
81
|
-
let affected = 0;
|
|
82
|
-
if (typeof response.value === 'number')
|
|
83
|
-
affected = response.value;
|
|
84
|
-
if (typeof response.value === 'boolean')
|
|
85
|
-
affected = response.value ? 1 : 0;
|
|
86
|
-
if (typeof response.value === 'object')
|
|
87
|
-
affected = response.value.affectedRows || response.value.affected;
|
|
88
|
-
response.value = {
|
|
89
|
-
operation: request.operation,
|
|
90
|
-
affected
|
|
91
|
-
};
|
|
92
|
-
}
|
|
93
|
-
else if (response.value != null) {
|
|
94
|
-
if (!request.many)
|
|
95
|
-
response.value = Array.isArray(response.value) ? response.value[0] : response.value;
|
|
96
|
-
else
|
|
97
|
-
response.value = Array.isArray(response.value) ? response.value : [response.value];
|
|
98
|
-
}
|
|
99
|
-
if ((request.operation === 'get' || request.operation === 'update') && response.value == null)
|
|
100
|
-
throw new common_1.ResourceNotFoundError(resource.name, request.args.key);
|
|
101
|
-
}
|
|
102
104
|
async _createI18n(options) {
|
|
103
105
|
const opts = {
|
|
104
106
|
...options,
|
|
@@ -31,7 +31,7 @@ class OpraHttpAdapter extends adapter_js_1.OpraAdapter {
|
|
|
31
31
|
const task = new power_tasks_1.Task(async () => {
|
|
32
32
|
try {
|
|
33
33
|
await this.executeRequest(context);
|
|
34
|
-
if (request.operation === '
|
|
34
|
+
if (request.operation === 'findMany' && request.args.count && response.count != null) {
|
|
35
35
|
response.switchToHttp().header(common_1.HttpHeaderCodes.X_Opra_Total_Matches, String(response.count));
|
|
36
36
|
}
|
|
37
37
|
}
|
|
@@ -47,6 +47,7 @@ class OpraHttpAdapter extends adapter_js_1.OpraAdapter {
|
|
|
47
47
|
this.logger?.error?.(e);
|
|
48
48
|
outgoing.sendStatus(500);
|
|
49
49
|
});
|
|
50
|
+
await this.emitAsync('request-finish', context);
|
|
50
51
|
return;
|
|
51
52
|
}
|
|
52
53
|
throw new common_1.BadRequestError({ message: 'Unsupported Content-Type' });
|
|
@@ -93,8 +94,8 @@ class OpraHttpAdapter extends adapter_js_1.OpraAdapter {
|
|
|
93
94
|
return;
|
|
94
95
|
logFn.apply(this.logger, [String(message), ...optionalParams]);
|
|
95
96
|
}
|
|
96
|
-
async
|
|
97
|
-
await super.
|
|
97
|
+
async executeRequest(context) {
|
|
98
|
+
await super.executeRequest(context);
|
|
98
99
|
const { request } = context;
|
|
99
100
|
const response = context.response;
|
|
100
101
|
const { crud } = request;
|
|
@@ -212,9 +213,9 @@ class OpraHttpAdapter extends adapter_js_1.OpraAdapter {
|
|
|
212
213
|
}, incoming);
|
|
213
214
|
}
|
|
214
215
|
return new http_request_host_js_1.HttpRequestHost({
|
|
215
|
-
kind: '
|
|
216
|
+
kind: 'CollectionFindManyRequest',
|
|
216
217
|
resource,
|
|
217
|
-
operation: '
|
|
218
|
+
operation: 'findMany',
|
|
218
219
|
crud: 'read',
|
|
219
220
|
many: true,
|
|
220
221
|
args: {
|
|
@@ -13,7 +13,7 @@ let MetadataResource = class MetadataResource {
|
|
|
13
13
|
}
|
|
14
14
|
};
|
|
15
15
|
tslib_1.__decorate([
|
|
16
|
-
common_1.Singleton.
|
|
16
|
+
common_1.Singleton.Get(),
|
|
17
17
|
tslib_1.__metadata("design:type", Function),
|
|
18
18
|
tslib_1.__metadata("design:paramtypes", []),
|
|
19
19
|
tslib_1.__metadata("design:returntype", void 0)
|
package/esm/adapter/adapter.js
CHANGED
|
@@ -1,11 +1,17 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.OpraAdapter = void 0;
|
|
4
|
+
const tslib_1 = require("tslib");
|
|
5
|
+
const path_1 = tslib_1.__importDefault(require("path"));
|
|
6
|
+
const strict_typed_events_1 = require("strict-typed-events");
|
|
7
|
+
const common_1 = require("@opra/common");
|
|
8
|
+
const metadata_resource_js_1 = require("./internal/metadata.resource.js");
|
|
4
9
|
/**
|
|
5
10
|
* @class OpraAdapter
|
|
6
11
|
*/
|
|
7
|
-
|
|
12
|
+
class OpraAdapter extends strict_typed_events_1.AsyncEventEmitter {
|
|
8
13
|
constructor(api) {
|
|
14
|
+
super();
|
|
9
15
|
this.api = api;
|
|
10
16
|
}
|
|
11
17
|
/**
|
|
@@ -15,23 +21,25 @@ export class OpraAdapter {
|
|
|
15
21
|
*/
|
|
16
22
|
async init(options) {
|
|
17
23
|
this.logger = options?.logger;
|
|
18
|
-
if (options?.i18n instanceof I18n)
|
|
24
|
+
if (options?.i18n instanceof common_1.I18n)
|
|
19
25
|
this.i18n = options.i18n;
|
|
20
26
|
else if (typeof options?.i18n === 'function')
|
|
21
27
|
this.i18n = await options.i18n();
|
|
22
28
|
else
|
|
23
29
|
this.i18n = await this._createI18n(options?.i18n);
|
|
24
|
-
this.i18n = this.i18n || I18n.defaultInstance;
|
|
30
|
+
this.i18n = this.i18n || common_1.I18n.defaultInstance;
|
|
25
31
|
if (!this.i18n.isInitialized)
|
|
26
32
|
await this.i18n.init();
|
|
27
|
-
|
|
28
|
-
|
|
33
|
+
if (options?.onRequest)
|
|
34
|
+
this.on('request', options.onRequest);
|
|
35
|
+
this._internalDoc = await common_1.DocumentFactory.createDocument({
|
|
36
|
+
version: common_1.OpraSchema.SpecVersion,
|
|
29
37
|
info: {
|
|
30
|
-
version: OpraSchema.SpecVersion,
|
|
38
|
+
version: common_1.OpraSchema.SpecVersion,
|
|
31
39
|
title: 'Internal resources',
|
|
32
40
|
},
|
|
33
41
|
references: { 'api': this.api },
|
|
34
|
-
resources: [new MetadataResource(this.api)]
|
|
42
|
+
resources: [new metadata_resource_js_1.MetadataResource(this.api)]
|
|
35
43
|
});
|
|
36
44
|
const promises = [];
|
|
37
45
|
for (const r of this.api.resources.values()) {
|
|
@@ -54,58 +62,57 @@ export class OpraAdapter {
|
|
|
54
62
|
await Promise.allSettled(promises);
|
|
55
63
|
}
|
|
56
64
|
async executeRequest(context) {
|
|
65
|
+
await this.emitAsync('request', context);
|
|
57
66
|
const { request, response } = context;
|
|
58
67
|
const { resource, operation } = request;
|
|
59
|
-
if (resource instanceof Collection || resource instanceof Singleton) {
|
|
68
|
+
if (resource instanceof common_1.Collection || resource instanceof common_1.Singleton) {
|
|
60
69
|
const endpoint = resource.operations[operation];
|
|
61
70
|
if (!endpoint?.handler)
|
|
62
|
-
throw new ForbiddenError({
|
|
63
|
-
message: translate('RESOLVER_FORBIDDEN', { operation }, `The resource endpoint does not accept '{{operation}}' operations`),
|
|
71
|
+
throw new common_1.ForbiddenError({
|
|
72
|
+
message: (0, common_1.translate)('RESOLVER_FORBIDDEN', { operation }, `The resource endpoint does not accept '{{operation}}' operations`),
|
|
64
73
|
severity: 'error',
|
|
65
74
|
code: 'RESOLVER_FORBIDDEN'
|
|
66
75
|
});
|
|
67
76
|
const value = await endpoint.handler(context);
|
|
77
|
+
// if (value == null)
|
|
68
78
|
if (value != null)
|
|
69
79
|
response.value = value;
|
|
70
|
-
|
|
80
|
+
const { crud, many } = request;
|
|
81
|
+
if (crud === 'delete' || (crud === 'update' && many)) {
|
|
82
|
+
let affected = 0;
|
|
83
|
+
if (typeof response.value === 'number')
|
|
84
|
+
affected = response.value;
|
|
85
|
+
if (typeof response.value === 'boolean')
|
|
86
|
+
affected = response.value ? 1 : 0;
|
|
87
|
+
if (typeof response.value === 'object')
|
|
88
|
+
affected = response.value.affectedRows || response.value.affected;
|
|
89
|
+
response.value = {
|
|
90
|
+
operation: request.operation,
|
|
91
|
+
affected
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
else if (response.value != null) {
|
|
95
|
+
if (!request.many)
|
|
96
|
+
response.value = Array.isArray(response.value) ? response.value[0] : response.value;
|
|
97
|
+
else
|
|
98
|
+
response.value = Array.isArray(response.value) ? response.value : [response.value];
|
|
99
|
+
}
|
|
100
|
+
if ((request.operation === 'get' || request.operation === 'update') && response.value == null)
|
|
101
|
+
throw new common_1.ResourceNotFoundError(resource.name, request.args.key);
|
|
71
102
|
}
|
|
72
103
|
}
|
|
73
|
-
async afterExecuteRequest(context) {
|
|
74
|
-
const { request, response } = context;
|
|
75
|
-
const { resource, crud, many } = request;
|
|
76
|
-
if (crud === 'delete' || (crud === 'update' && many)) {
|
|
77
|
-
let affected = 0;
|
|
78
|
-
if (typeof response.value === 'number')
|
|
79
|
-
affected = response.value;
|
|
80
|
-
if (typeof response.value === 'boolean')
|
|
81
|
-
affected = response.value ? 1 : 0;
|
|
82
|
-
if (typeof response.value === 'object')
|
|
83
|
-
affected = response.value.affectedRows || response.value.affected;
|
|
84
|
-
response.value = {
|
|
85
|
-
operation: request.operation,
|
|
86
|
-
affected
|
|
87
|
-
};
|
|
88
|
-
}
|
|
89
|
-
else if (response.value != null) {
|
|
90
|
-
if (!request.many)
|
|
91
|
-
response.value = Array.isArray(response.value) ? response.value[0] : response.value;
|
|
92
|
-
else
|
|
93
|
-
response.value = Array.isArray(response.value) ? response.value : [response.value];
|
|
94
|
-
}
|
|
95
|
-
if ((request.operation === 'get' || request.operation === 'update') && response.value == null)
|
|
96
|
-
throw new ResourceNotFoundError(resource.name, request.args.key);
|
|
97
|
-
}
|
|
98
104
|
async _createI18n(options) {
|
|
99
105
|
const opts = {
|
|
100
106
|
...options,
|
|
101
107
|
};
|
|
102
108
|
delete opts.resourceDirs;
|
|
103
|
-
const instance = I18n.createInstance(opts);
|
|
109
|
+
const instance = common_1.I18n.createInstance(opts);
|
|
104
110
|
await instance.init();
|
|
105
|
-
await instance.loadResourceDir(
|
|
111
|
+
await instance.loadResourceDir(path_1.default.resolve((0, common_1.getStackFileName)(), '../../../i18n'));
|
|
106
112
|
if (options?.resourceDirs)
|
|
107
113
|
for (const dir of options.resourceDirs)
|
|
108
114
|
await instance.loadResourceDir(dir);
|
|
109
115
|
return instance;
|
|
110
116
|
}
|
|
111
117
|
}
|
|
118
|
+
exports.OpraAdapter = OpraAdapter;
|
|
@@ -1,8 +1,12 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.OpraExpressAdapter = void 0;
|
|
4
|
+
const tslib_1 = require("tslib");
|
|
5
|
+
const body_parser_1 = tslib_1.__importDefault(require("body-parser"));
|
|
6
|
+
const common_1 = require("@opra/common");
|
|
7
|
+
const http_adapter_js_1 = require("./http-adapter.js");
|
|
4
8
|
const noOp = () => void 0;
|
|
5
|
-
|
|
9
|
+
class OpraExpressAdapter extends http_adapter_js_1.OpraHttpAdapter {
|
|
6
10
|
constructor() {
|
|
7
11
|
super(...arguments);
|
|
8
12
|
this.platform = 'express';
|
|
@@ -10,8 +14,8 @@ export class OpraExpressAdapter extends OpraHttpAdapter {
|
|
|
10
14
|
static async create(app, document, options) {
|
|
11
15
|
const adapter = new OpraExpressAdapter(document);
|
|
12
16
|
await adapter.init(options);
|
|
13
|
-
const prefix = '/' + normalizePath(options?.prefix, true);
|
|
14
|
-
app.use(prefix,
|
|
17
|
+
const prefix = '/' + (0, common_1.normalizePath)(options?.prefix, true);
|
|
18
|
+
app.use(prefix, body_parser_1.default.json());
|
|
15
19
|
app.use(prefix, (req, res, next) => {
|
|
16
20
|
req.end = noOp;
|
|
17
21
|
req.send = noOp;
|
|
@@ -20,3 +24,4 @@ export class OpraExpressAdapter extends OpraHttpAdapter {
|
|
|
20
24
|
return adapter;
|
|
21
25
|
}
|
|
22
26
|
}
|
|
27
|
+
exports.OpraExpressAdapter = OpraExpressAdapter;
|
|
@@ -1,14 +1,17 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.OpraHttpAdapter = void 0;
|
|
4
|
+
const power_tasks_1 = require("power-tasks");
|
|
5
|
+
const common_1 = require("@opra/common");
|
|
6
|
+
const adapter_js_1 = require("../adapter.js");
|
|
7
|
+
const http_request_host_js_1 = require("./http-request.host.js");
|
|
8
|
+
const http_request_context_host_js_1 = require("./http-request-context.host.js");
|
|
9
|
+
const http_response_host_js_1 = require("./http-response.host.js");
|
|
7
10
|
/**
|
|
8
11
|
*
|
|
9
12
|
* @class OpraHttpAdapter
|
|
10
13
|
*/
|
|
11
|
-
|
|
14
|
+
class OpraHttpAdapter extends adapter_js_1.OpraAdapter {
|
|
12
15
|
/**
|
|
13
16
|
* Main http request handler
|
|
14
17
|
* @param incoming
|
|
@@ -19,17 +22,17 @@ export class OpraHttpAdapter extends OpraAdapter {
|
|
|
19
22
|
try {
|
|
20
23
|
// Batch
|
|
21
24
|
if (incoming.is('multipart/mixed')) {
|
|
22
|
-
throw new BadRequestError({ message: 'Not implemented yet' });
|
|
25
|
+
throw new common_1.BadRequestError({ message: 'Not implemented yet' });
|
|
23
26
|
}
|
|
24
27
|
if (!(incoming.method === 'POST' || incoming.method === 'PATCH') || incoming.is('json')) {
|
|
25
28
|
const request = await this.parseRequest(incoming);
|
|
26
|
-
const response = new HttpResponseHost({}, outgoing);
|
|
27
|
-
const context = new HttpRequestContextHost(this.platform, this.api, request, response);
|
|
28
|
-
const task = new Task(async () => {
|
|
29
|
+
const response = new http_response_host_js_1.HttpResponseHost({}, outgoing);
|
|
30
|
+
const context = new http_request_context_host_js_1.HttpRequestContextHost(this.platform, this.api, request, response);
|
|
31
|
+
const task = new power_tasks_1.Task(async () => {
|
|
29
32
|
try {
|
|
30
33
|
await this.executeRequest(context);
|
|
31
|
-
if (request.operation === '
|
|
32
|
-
response.switchToHttp().header(HttpHeaderCodes.X_Opra_Total_Matches, String(response.count));
|
|
34
|
+
if (request.operation === 'findMany' && request.args.count && response.count != null) {
|
|
35
|
+
response.switchToHttp().header(common_1.HttpHeaderCodes.X_Opra_Total_Matches, String(response.count));
|
|
33
36
|
}
|
|
34
37
|
}
|
|
35
38
|
catch (error) {
|
|
@@ -44,9 +47,10 @@ export class OpraHttpAdapter extends OpraAdapter {
|
|
|
44
47
|
this.logger?.error?.(e);
|
|
45
48
|
outgoing.sendStatus(500);
|
|
46
49
|
});
|
|
50
|
+
await this.emitAsync('request-finish', context);
|
|
47
51
|
return;
|
|
48
52
|
}
|
|
49
|
-
throw new BadRequestError({ message: 'Unsupported Content-Type' });
|
|
53
|
+
throw new common_1.BadRequestError({ message: 'Unsupported Content-Type' });
|
|
50
54
|
}
|
|
51
55
|
catch (error) {
|
|
52
56
|
await this.errorHandler(incoming, outgoing, [error]);
|
|
@@ -54,30 +58,30 @@ export class OpraHttpAdapter extends OpraAdapter {
|
|
|
54
58
|
}
|
|
55
59
|
async errorHandler(incoming, outgoing, errors) {
|
|
56
60
|
errors.forEach(e => {
|
|
57
|
-
this.log((e instanceof OpraException) ? 'error' : 'fatal', incoming, e); // todo. implement a better logger
|
|
61
|
+
this.log((e instanceof common_1.OpraException) ? 'error' : 'fatal', incoming, e); // todo. implement a better logger
|
|
58
62
|
});
|
|
59
|
-
errors = errors.map(wrapException);
|
|
63
|
+
errors = errors.map(common_1.wrapException);
|
|
60
64
|
let status = outgoing.statusCode || 0;
|
|
61
65
|
// Sort errors from fatal to info
|
|
62
66
|
errors.sort((a, b) => {
|
|
63
|
-
const i = IssueSeverity.Keys.indexOf(a.issue.severity) - IssueSeverity.Keys.indexOf(b.issue.severity);
|
|
67
|
+
const i = common_1.IssueSeverity.Keys.indexOf(a.issue.severity) - common_1.IssueSeverity.Keys.indexOf(b.issue.severity);
|
|
64
68
|
if (i === 0)
|
|
65
69
|
return b.status - a.status;
|
|
66
70
|
return i;
|
|
67
71
|
});
|
|
68
|
-
if (!status || status < HttpStatusCodes.BAD_REQUEST) {
|
|
72
|
+
if (!status || status < common_1.HttpStatusCodes.BAD_REQUEST) {
|
|
69
73
|
status = errors[0].status;
|
|
70
|
-
if (status < HttpStatusCodes.BAD_REQUEST)
|
|
71
|
-
status = HttpStatusCodes.INTERNAL_SERVER_ERROR;
|
|
74
|
+
if (status < common_1.HttpStatusCodes.BAD_REQUEST)
|
|
75
|
+
status = common_1.HttpStatusCodes.INTERNAL_SERVER_ERROR;
|
|
72
76
|
}
|
|
73
77
|
const body = this.i18n.deep({
|
|
74
78
|
errors: errors.map(e => e.issue)
|
|
75
79
|
});
|
|
76
|
-
outgoing.set(HttpHeaderCodes.Content_Type, 'application/json; charset=utf-8');
|
|
77
|
-
outgoing.set(HttpHeaderCodes.Cache_Control, 'no-cache');
|
|
78
|
-
outgoing.set(HttpHeaderCodes.Pragma, 'no-cache');
|
|
79
|
-
outgoing.set(HttpHeaderCodes.Expires, '-1');
|
|
80
|
-
outgoing.set(HttpHeaderCodes.X_Opra_Version, OpraSchema.SpecVersion);
|
|
80
|
+
outgoing.set(common_1.HttpHeaderCodes.Content_Type, 'application/json; charset=utf-8');
|
|
81
|
+
outgoing.set(common_1.HttpHeaderCodes.Cache_Control, 'no-cache');
|
|
82
|
+
outgoing.set(common_1.HttpHeaderCodes.Pragma, 'no-cache');
|
|
83
|
+
outgoing.set(common_1.HttpHeaderCodes.Expires, '-1');
|
|
84
|
+
outgoing.set(common_1.HttpHeaderCodes.X_Opra_Version, common_1.OpraSchema.SpecVersion);
|
|
81
85
|
outgoing.status(status);
|
|
82
86
|
outgoing.send(JSON.stringify(body));
|
|
83
87
|
outgoing.end();
|
|
@@ -90,19 +94,19 @@ export class OpraHttpAdapter extends OpraAdapter {
|
|
|
90
94
|
return;
|
|
91
95
|
logFn.apply(this.logger, [String(message), ...optionalParams]);
|
|
92
96
|
}
|
|
93
|
-
async
|
|
94
|
-
await super.
|
|
97
|
+
async executeRequest(context) {
|
|
98
|
+
await super.executeRequest(context);
|
|
95
99
|
const { request } = context;
|
|
96
100
|
const response = context.response;
|
|
97
101
|
const { crud } = request;
|
|
98
102
|
const httpResponse = response.switchToHttp();
|
|
99
|
-
if (request.resource instanceof Singleton || request.resource instanceof Collection) {
|
|
100
|
-
httpResponse.set(HttpHeaderCodes.X_Opra_Data_Type, request.resource.type.name);
|
|
101
|
-
httpResponse.set(HttpHeaderCodes.X_Opra_Operation, request.operation);
|
|
103
|
+
if (request.resource instanceof common_1.Singleton || request.resource instanceof common_1.Collection) {
|
|
104
|
+
httpResponse.set(common_1.HttpHeaderCodes.X_Opra_Data_Type, request.resource.type.name);
|
|
105
|
+
httpResponse.set(common_1.HttpHeaderCodes.X_Opra_Operation, request.operation);
|
|
102
106
|
}
|
|
103
107
|
if (crud === 'create') {
|
|
104
108
|
if (!response.value)
|
|
105
|
-
throw new InternalServerError();
|
|
109
|
+
throw new common_1.InternalServerError();
|
|
106
110
|
// todo validate
|
|
107
111
|
httpResponse.status(201);
|
|
108
112
|
}
|
|
@@ -114,7 +118,7 @@ export class OpraHttpAdapter extends OpraAdapter {
|
|
|
114
118
|
*/
|
|
115
119
|
async parseRequest(incoming) {
|
|
116
120
|
try {
|
|
117
|
-
const url = new OpraURL();
|
|
121
|
+
const url = new common_1.OpraURL();
|
|
118
122
|
url.searchParams.define({
|
|
119
123
|
'$pick': { codec: 'string', array: true },
|
|
120
124
|
'$omit': { codec: 'string', array: true },
|
|
@@ -129,10 +133,10 @@ export class OpraHttpAdapter extends OpraAdapter {
|
|
|
129
133
|
url.parse(incoming.url);
|
|
130
134
|
// const {context, url, method, headers, body, contentId} = args;
|
|
131
135
|
if (!url.path.size)
|
|
132
|
-
throw new BadRequestError();
|
|
136
|
+
throw new common_1.BadRequestError();
|
|
133
137
|
const method = incoming.method;
|
|
134
138
|
if (method !== 'GET' && url.path.size > 1)
|
|
135
|
-
throw new BadRequestError();
|
|
139
|
+
throw new common_1.BadRequestError();
|
|
136
140
|
// const pathLen = url.path.size;
|
|
137
141
|
// let pathIndex = 0;
|
|
138
142
|
const params = url.searchParams;
|
|
@@ -148,11 +152,11 @@ export class OpraHttpAdapter extends OpraAdapter {
|
|
|
148
152
|
/*
|
|
149
153
|
* Collection
|
|
150
154
|
*/
|
|
151
|
-
if (resource instanceof Collection) {
|
|
155
|
+
if (resource instanceof common_1.Collection) {
|
|
152
156
|
switch (method) {
|
|
153
157
|
case 'POST': {
|
|
154
158
|
if (!p.key) {
|
|
155
|
-
return new HttpRequestHost({
|
|
159
|
+
return new http_request_host_js_1.HttpRequestHost({
|
|
156
160
|
kind: 'CollectionCreateRequest',
|
|
157
161
|
resource,
|
|
158
162
|
operation: 'create',
|
|
@@ -170,7 +174,7 @@ export class OpraHttpAdapter extends OpraAdapter {
|
|
|
170
174
|
}
|
|
171
175
|
case 'DELETE': {
|
|
172
176
|
if (p.key) {
|
|
173
|
-
return new HttpRequestHost({
|
|
177
|
+
return new http_request_host_js_1.HttpRequestHost({
|
|
174
178
|
kind: 'CollectionDeleteRequest',
|
|
175
179
|
resource,
|
|
176
180
|
operation: 'delete',
|
|
@@ -181,7 +185,7 @@ export class OpraHttpAdapter extends OpraAdapter {
|
|
|
181
185
|
}
|
|
182
186
|
}, incoming);
|
|
183
187
|
}
|
|
184
|
-
return new HttpRequestHost({
|
|
188
|
+
return new http_request_host_js_1.HttpRequestHost({
|
|
185
189
|
kind: 'CollectionDeleteManyRequest',
|
|
186
190
|
resource,
|
|
187
191
|
operation: 'deleteMany',
|
|
@@ -194,7 +198,7 @@ export class OpraHttpAdapter extends OpraAdapter {
|
|
|
194
198
|
}
|
|
195
199
|
case 'GET': {
|
|
196
200
|
if (p.key) {
|
|
197
|
-
return new HttpRequestHost({
|
|
201
|
+
return new http_request_host_js_1.HttpRequestHost({
|
|
198
202
|
kind: 'CollectionGetRequest',
|
|
199
203
|
resource,
|
|
200
204
|
operation: 'get',
|
|
@@ -208,10 +212,10 @@ export class OpraHttpAdapter extends OpraAdapter {
|
|
|
208
212
|
}
|
|
209
213
|
}, incoming);
|
|
210
214
|
}
|
|
211
|
-
return new HttpRequestHost({
|
|
212
|
-
kind: '
|
|
215
|
+
return new http_request_host_js_1.HttpRequestHost({
|
|
216
|
+
kind: 'CollectionFindManyRequest',
|
|
213
217
|
resource,
|
|
214
|
-
operation: '
|
|
218
|
+
operation: 'findMany',
|
|
215
219
|
crud: 'read',
|
|
216
220
|
many: true,
|
|
217
221
|
args: {
|
|
@@ -229,7 +233,7 @@ export class OpraHttpAdapter extends OpraAdapter {
|
|
|
229
233
|
}
|
|
230
234
|
case 'PATCH': {
|
|
231
235
|
if (p.key) {
|
|
232
|
-
return new HttpRequestHost({
|
|
236
|
+
return new http_request_host_js_1.HttpRequestHost({
|
|
233
237
|
kind: 'CollectionUpdateRequest',
|
|
234
238
|
resource,
|
|
235
239
|
operation: 'update',
|
|
@@ -244,7 +248,7 @@ export class OpraHttpAdapter extends OpraAdapter {
|
|
|
244
248
|
}
|
|
245
249
|
}, incoming);
|
|
246
250
|
}
|
|
247
|
-
return new HttpRequestHost({
|
|
251
|
+
return new http_request_host_js_1.HttpRequestHost({
|
|
248
252
|
kind: 'CollectionUpdateManyRequest',
|
|
249
253
|
resource,
|
|
250
254
|
operation: 'updateMany',
|
|
@@ -262,10 +266,10 @@ export class OpraHttpAdapter extends OpraAdapter {
|
|
|
262
266
|
/*
|
|
263
267
|
* Singleton
|
|
264
268
|
*/
|
|
265
|
-
if (resource instanceof Singleton && !p.key) {
|
|
269
|
+
if (resource instanceof common_1.Singleton && !p.key) {
|
|
266
270
|
switch (method) {
|
|
267
271
|
case 'POST': {
|
|
268
|
-
return new HttpRequestHost({
|
|
272
|
+
return new http_request_host_js_1.HttpRequestHost({
|
|
269
273
|
kind: 'SingletonCreateRequest',
|
|
270
274
|
resource,
|
|
271
275
|
operation: 'create',
|
|
@@ -280,7 +284,7 @@ export class OpraHttpAdapter extends OpraAdapter {
|
|
|
280
284
|
}, incoming);
|
|
281
285
|
}
|
|
282
286
|
case 'DELETE': {
|
|
283
|
-
return new HttpRequestHost({
|
|
287
|
+
return new http_request_host_js_1.HttpRequestHost({
|
|
284
288
|
kind: 'SingletonDeleteRequest',
|
|
285
289
|
resource,
|
|
286
290
|
operation: 'delete',
|
|
@@ -290,7 +294,7 @@ export class OpraHttpAdapter extends OpraAdapter {
|
|
|
290
294
|
}, incoming);
|
|
291
295
|
}
|
|
292
296
|
case 'GET': {
|
|
293
|
-
return new HttpRequestHost({
|
|
297
|
+
return new http_request_host_js_1.HttpRequestHost({
|
|
294
298
|
kind: 'SingletonGetRequest',
|
|
295
299
|
resource,
|
|
296
300
|
operation: 'get',
|
|
@@ -304,7 +308,7 @@ export class OpraHttpAdapter extends OpraAdapter {
|
|
|
304
308
|
}, incoming);
|
|
305
309
|
}
|
|
306
310
|
case 'PATCH': {
|
|
307
|
-
return new HttpRequestHost({
|
|
311
|
+
return new http_request_host_js_1.HttpRequestHost({
|
|
308
312
|
kind: 'SingletonUpdateRequest',
|
|
309
313
|
resource,
|
|
310
314
|
operation: 'update',
|
|
@@ -321,7 +325,7 @@ export class OpraHttpAdapter extends OpraAdapter {
|
|
|
321
325
|
}
|
|
322
326
|
}
|
|
323
327
|
else
|
|
324
|
-
throw new InternalServerError();
|
|
328
|
+
throw new common_1.InternalServerError();
|
|
325
329
|
// if (query instanceof SingletonGetQuery || query instanceof CollectionGetQuery || query instanceof ElementReadQuery) {
|
|
326
330
|
// // Move through properties
|
|
327
331
|
// let parentType: DataType;
|
|
@@ -343,14 +347,14 @@ export class OpraHttpAdapter extends OpraAdapter {
|
|
|
343
347
|
// parent = parent.child;
|
|
344
348
|
// }
|
|
345
349
|
// }
|
|
346
|
-
throw new MethodNotAllowedError({
|
|
350
|
+
throw new common_1.MethodNotAllowedError({
|
|
347
351
|
message: `Method "${method}" is not allowed by target endpoint`
|
|
348
352
|
});
|
|
349
353
|
}
|
|
350
354
|
catch (e) {
|
|
351
|
-
if (e instanceof OpraException)
|
|
355
|
+
if (e instanceof common_1.OpraException)
|
|
352
356
|
throw e;
|
|
353
|
-
throw new BadRequestError(e);
|
|
357
|
+
throw new common_1.BadRequestError(e);
|
|
354
358
|
}
|
|
355
359
|
}
|
|
356
360
|
// async parseMultiPart(
|
|
@@ -434,23 +438,23 @@ export class OpraHttpAdapter extends OpraAdapter {
|
|
|
434
438
|
async sendResponse(context) {
|
|
435
439
|
const { request, response } = context;
|
|
436
440
|
const outgoing = response.switchToHttp();
|
|
437
|
-
const errors = response.errors?.map(e => wrapException(e));
|
|
441
|
+
const errors = response.errors?.map(e => (0, common_1.wrapException)(e));
|
|
438
442
|
if (errors && errors.length) {
|
|
439
443
|
await this.errorHandler(request.switchToHttp(), outgoing, errors);
|
|
440
444
|
return;
|
|
441
445
|
}
|
|
442
|
-
outgoing.set(HttpHeaderCodes.Cache_Control, 'no-cache');
|
|
443
|
-
outgoing.set(HttpHeaderCodes.Pragma, 'no-cache');
|
|
444
|
-
outgoing.set(HttpHeaderCodes.Expires, '-1');
|
|
445
|
-
outgoing.set(HttpHeaderCodes.X_Opra_Version, OpraSchema.SpecVersion);
|
|
446
|
-
outgoing.status(outgoing.statusCode || HttpStatusCodes.OK);
|
|
446
|
+
outgoing.set(common_1.HttpHeaderCodes.Cache_Control, 'no-cache');
|
|
447
|
+
outgoing.set(common_1.HttpHeaderCodes.Pragma, 'no-cache');
|
|
448
|
+
outgoing.set(common_1.HttpHeaderCodes.Expires, '-1');
|
|
449
|
+
outgoing.set(common_1.HttpHeaderCodes.X_Opra_Version, common_1.OpraSchema.SpecVersion);
|
|
450
|
+
outgoing.status(outgoing.statusCode || common_1.HttpStatusCodes.OK);
|
|
447
451
|
if (response.value) {
|
|
448
452
|
if (typeof response.value === 'object') {
|
|
449
|
-
if (isReadable(response.value) || Buffer.isBuffer(response.value))
|
|
453
|
+
if ((0, common_1.isReadable)(response.value) || Buffer.isBuffer(response.value))
|
|
450
454
|
outgoing.send(response.value);
|
|
451
455
|
else {
|
|
452
456
|
const body = this.i18n.deep(response.value);
|
|
453
|
-
outgoing.set(HttpHeaderCodes.Content_Type, 'application/json; charset=utf-8');
|
|
457
|
+
outgoing.set(common_1.HttpHeaderCodes.Content_Type, 'application/json; charset=utf-8');
|
|
454
458
|
outgoing.send(JSON.stringify(body));
|
|
455
459
|
}
|
|
456
460
|
}
|
|
@@ -460,3 +464,4 @@ export class OpraHttpAdapter extends OpraAdapter {
|
|
|
460
464
|
outgoing.end();
|
|
461
465
|
}
|
|
462
466
|
}
|
|
467
|
+
exports.OpraHttpAdapter = OpraHttpAdapter;
|
|
@@ -1,5 +1,8 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.HttpRequestContextHost = void 0;
|
|
4
|
+
const request_context_host_js_1 = require("../request-context.host.js");
|
|
5
|
+
class HttpRequestContextHost extends request_context_host_js_1.RequestContextHost {
|
|
3
6
|
constructor(platform, api, _request, _response) {
|
|
4
7
|
super('http', platform, api, _request, _response);
|
|
5
8
|
this.platform = platform;
|
|
@@ -22,3 +25,4 @@ export class HttpRequestContextHost extends RequestContextHost {
|
|
|
22
25
|
throw new TypeError('Not executing in an "RPC" protocol');
|
|
23
26
|
}
|
|
24
27
|
}
|
|
28
|
+
exports.HttpRequestContextHost = HttpRequestContextHost;
|
|
@@ -1,5 +1,8 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.HttpRequestHost = void 0;
|
|
4
|
+
const request_host_js_1 = require("../request.host.js");
|
|
5
|
+
class HttpRequestHost extends request_host_js_1.RequestHost {
|
|
3
6
|
constructor(init, _incoming) {
|
|
4
7
|
super(init);
|
|
5
8
|
this._incoming = _incoming;
|
|
@@ -8,3 +11,4 @@ export class HttpRequestHost extends RequestHost {
|
|
|
8
11
|
return this._incoming;
|
|
9
12
|
}
|
|
10
13
|
}
|
|
14
|
+
exports.HttpRequestHost = HttpRequestHost;
|
|
@@ -1,5 +1,8 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.HttpResponseHost = void 0;
|
|
4
|
+
const response_host_js_1 = require("../response.host.js");
|
|
5
|
+
class HttpResponseHost extends response_host_js_1.ResponseHost {
|
|
3
6
|
constructor(init, _outgoing) {
|
|
4
7
|
super(init);
|
|
5
8
|
this._outgoing = _outgoing;
|
|
@@ -8,3 +11,4 @@ export class HttpResponseHost extends ResponseHost {
|
|
|
8
11
|
return this._outgoing;
|
|
9
12
|
}
|
|
10
13
|
}
|
|
14
|
+
exports.HttpResponseHost = HttpResponseHost;
|
|
@@ -1 +1,2 @@
|
|
|
1
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
@@ -1 +1,2 @@
|
|
|
1
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
@@ -1 +1,2 @@
|
|
|
1
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
@@ -1 +1,2 @@
|
|
|
1
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
@@ -1,24 +1,27 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.MetadataResource = void 0;
|
|
4
|
+
const tslib_1 = require("tslib");
|
|
5
|
+
const common_1 = require("@opra/common");
|
|
3
6
|
let MetadataResource = class MetadataResource {
|
|
4
7
|
constructor(document) {
|
|
5
8
|
this.document = document;
|
|
6
9
|
this._schema = document.exportSchema();
|
|
7
10
|
}
|
|
8
11
|
get() {
|
|
9
|
-
return cloneObject(this.document.exportSchema(), true);
|
|
12
|
+
return (0, common_1.cloneObject)(this.document.exportSchema(), true);
|
|
10
13
|
}
|
|
11
14
|
};
|
|
12
|
-
__decorate([
|
|
13
|
-
Singleton.
|
|
14
|
-
__metadata("design:type", Function),
|
|
15
|
-
__metadata("design:paramtypes", []),
|
|
16
|
-
__metadata("design:returntype", void 0)
|
|
15
|
+
tslib_1.__decorate([
|
|
16
|
+
common_1.Singleton.Get(),
|
|
17
|
+
tslib_1.__metadata("design:type", Function),
|
|
18
|
+
tslib_1.__metadata("design:paramtypes", []),
|
|
19
|
+
tslib_1.__metadata("design:returntype", void 0)
|
|
17
20
|
], MetadataResource.prototype, "get", null);
|
|
18
|
-
MetadataResource = __decorate([
|
|
19
|
-
Singleton(Object, {
|
|
21
|
+
MetadataResource = tslib_1.__decorate([
|
|
22
|
+
(0, common_1.Singleton)(Object, {
|
|
20
23
|
name: '$metadata',
|
|
21
24
|
}),
|
|
22
|
-
__metadata("design:paramtypes", [ApiDocument])
|
|
25
|
+
tslib_1.__metadata("design:paramtypes", [common_1.ApiDocument])
|
|
23
26
|
], MetadataResource);
|
|
24
|
-
|
|
27
|
+
exports.MetadataResource = MetadataResource;
|
|
@@ -1,5 +1,8 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.RequestContextHost = void 0;
|
|
4
|
+
const strict_typed_events_1 = require("strict-typed-events");
|
|
5
|
+
class RequestContextHost extends strict_typed_events_1.AsyncEventEmitter {
|
|
3
6
|
constructor(protocol, platform, api, _request, _response) {
|
|
4
7
|
super();
|
|
5
8
|
this.protocol = protocol;
|
|
@@ -24,3 +27,4 @@ export class RequestContextHost extends AsyncEventEmitter {
|
|
|
24
27
|
throw new TypeError('Not executing in an "RPC" protocol');
|
|
25
28
|
}
|
|
26
29
|
}
|
|
30
|
+
exports.RequestContextHost = RequestContextHost;
|
|
@@ -1,4 +1,7 @@
|
|
|
1
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.RequestHost = void 0;
|
|
4
|
+
class RequestHost {
|
|
2
5
|
constructor(init) {
|
|
3
6
|
Object.assign(this, init);
|
|
4
7
|
this.resourceKind = this.resource.kind;
|
|
@@ -13,3 +16,4 @@ export class RequestHost {
|
|
|
13
16
|
throw new TypeError('Not executing in an "RPC" protocol');
|
|
14
17
|
}
|
|
15
18
|
}
|
|
19
|
+
exports.RequestHost = RequestHost;
|
|
@@ -1,4 +1,7 @@
|
|
|
1
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ResponseHost = void 0;
|
|
4
|
+
class ResponseHost {
|
|
2
5
|
constructor(init) {
|
|
3
6
|
if (init)
|
|
4
7
|
Object.assign(this, init);
|
|
@@ -14,3 +17,4 @@ export class ResponseHost {
|
|
|
14
17
|
throw new TypeError('Not executing in an "RPC" protocol');
|
|
15
18
|
}
|
|
16
19
|
}
|
|
20
|
+
exports.ResponseHost = ResponseHost;
|
|
@@ -1,24 +1,26 @@
|
|
|
1
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const common_1 = require("@opra/common");
|
|
2
4
|
// @ts-ignore
|
|
3
|
-
const oldConstruct = Resource.prototype._construct;
|
|
5
|
+
const oldConstruct = common_1.Resource.prototype._construct;
|
|
4
6
|
// @ts-ignore
|
|
5
|
-
Resource.prototype._construct = function (init) {
|
|
7
|
+
common_1.Resource.prototype._construct = function (init) {
|
|
6
8
|
oldConstruct.call(this, init);
|
|
7
9
|
const _this = this;
|
|
8
10
|
_this.onInit = init.onInit;
|
|
9
11
|
_this.onShutdown = init.onShutdown;
|
|
10
12
|
};
|
|
11
|
-
Collection.OnInit = Singleton.OnInit = function () {
|
|
13
|
+
common_1.Collection.OnInit = common_1.Singleton.OnInit = function () {
|
|
12
14
|
return (target, propertyKey) => {
|
|
13
|
-
const resourceMetadata = (Reflect.getOwnMetadata(METADATA_KEY, target.constructor) || {});
|
|
15
|
+
const resourceMetadata = (Reflect.getOwnMetadata(common_1.METADATA_KEY, target.constructor) || {});
|
|
14
16
|
resourceMetadata.onInit = target[propertyKey];
|
|
15
|
-
Reflect.defineMetadata(METADATA_KEY, target.constructor, resourceMetadata);
|
|
17
|
+
Reflect.defineMetadata(common_1.METADATA_KEY, target.constructor, resourceMetadata);
|
|
16
18
|
};
|
|
17
19
|
};
|
|
18
|
-
Collection.OnShutdown = Singleton.OnShutdown = function () {
|
|
20
|
+
common_1.Collection.OnShutdown = common_1.Singleton.OnShutdown = function () {
|
|
19
21
|
return (target, propertyKey) => {
|
|
20
|
-
const resourceMetadata = (Reflect.getOwnMetadata(METADATA_KEY, target.constructor) || {});
|
|
22
|
+
const resourceMetadata = (Reflect.getOwnMetadata(common_1.METADATA_KEY, target.constructor) || {});
|
|
21
23
|
resourceMetadata.onShutdown = target[propertyKey];
|
|
22
|
-
Reflect.defineMetadata(METADATA_KEY, target.constructor, resourceMetadata);
|
|
24
|
+
Reflect.defineMetadata(common_1.METADATA_KEY, target.constructor, resourceMetadata);
|
|
23
25
|
};
|
|
24
26
|
};
|
package/esm/index.js
CHANGED
|
@@ -1,10 +1,13 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const tslib_1 = require("tslib");
|
|
4
|
+
require("reflect-metadata");
|
|
5
|
+
require("./augmentation/resource.augmentation.js");
|
|
6
|
+
tslib_1.__exportStar(require("./types.js"), exports);
|
|
7
|
+
tslib_1.__exportStar(require("./adapter/adapter.js"), exports);
|
|
8
|
+
tslib_1.__exportStar(require("./adapter/http/express-adapter.js"), exports);
|
|
9
|
+
tslib_1.__exportStar(require("./adapter/http/http-adapter.js"), exports);
|
|
10
|
+
tslib_1.__exportStar(require("./adapter/interfaces/request-context.interface.js"), exports);
|
|
11
|
+
tslib_1.__exportStar(require("./adapter/interfaces/logger.interface.js"), exports);
|
|
12
|
+
tslib_1.__exportStar(require("./adapter/interfaces/request.interface.js"), exports);
|
|
13
|
+
tslib_1.__exportStar(require("./adapter/interfaces/response.interface.js"), exports);
|
package/esm/types.js
CHANGED
|
@@ -1 +1,2 @@
|
|
|
1
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
package/i18n/en/error.json
CHANGED
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
"NOT_FOUND": "Not found",
|
|
9
9
|
"UNAUTHORIZED": "You have not been authenticated to perform this action",
|
|
10
10
|
"UNPROCESSABLE_ENTITY": "Unprocessable entity",
|
|
11
|
-
"RESOURCE_NOT_FOUND": "
|
|
11
|
+
"RESOURCE_NOT_FOUND": "Resource not found: '{{resource}}'",
|
|
12
12
|
"RESOURCE_CONFLICT": "There is already an other {{resource}} resource with same field values ({{fields}})",
|
|
13
13
|
"RESOLVER_FORBIDDEN": "The resource endpoint does not accept '{{operation}}' operations",
|
|
14
14
|
"UNACCEPTED_SORT_FIELD": "Field '{{field}}' is not available for sort operation"
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@opra/core",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.16.1",
|
|
4
4
|
"description": "Opra schema package",
|
|
5
5
|
"author": "Panates",
|
|
6
6
|
"license": "MIT",
|
|
@@ -27,7 +27,7 @@
|
|
|
27
27
|
"clean:cover": "rimraf ../../coverage/core"
|
|
28
28
|
},
|
|
29
29
|
"dependencies": {
|
|
30
|
-
"@opra/common": "^0.
|
|
30
|
+
"@opra/common": "^0.16.1",
|
|
31
31
|
"content-type": "^1.0.5",
|
|
32
32
|
"lodash.isnil": "^4.0.0",
|
|
33
33
|
"lodash.omitby": "^4.6.0",
|
|
@@ -43,14 +43,14 @@
|
|
|
43
43
|
},
|
|
44
44
|
"devDependencies": {
|
|
45
45
|
"@faker-js/faker": "^7.6.0",
|
|
46
|
+
"@types/content-type": "^1.1.5",
|
|
46
47
|
"@types/dicer": "^0.2.2",
|
|
47
48
|
"@types/express": "^4.17.17",
|
|
48
|
-
"@types/content-type": "^1.1.5",
|
|
49
49
|
"cors": "^2.8.5",
|
|
50
50
|
"ts-gems": "^2.3.0"
|
|
51
51
|
},
|
|
52
52
|
"type": "module",
|
|
53
|
-
"types": "
|
|
53
|
+
"types": "types/index.d.ts",
|
|
54
54
|
"exports": {
|
|
55
55
|
".": {
|
|
56
56
|
"require": "./cjs/index.js",
|
|
@@ -68,6 +68,7 @@
|
|
|
68
68
|
"cjs/",
|
|
69
69
|
"esm/",
|
|
70
70
|
"i18n/",
|
|
71
|
+
"types/",
|
|
71
72
|
"LICENSE",
|
|
72
73
|
"README.md"
|
|
73
74
|
],
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { AsyncEventEmitter } from 'strict-typed-events';
|
|
1
2
|
import { ApiDocument, FallbackLng, I18n, LanguageResource } from '@opra/common';
|
|
2
3
|
import { ILogger } from './interfaces/logger.interface.js';
|
|
3
4
|
import { RequestContext } from './interfaces/request-context.interface.js';
|
|
@@ -8,6 +9,7 @@ export declare namespace OpraAdapter {
|
|
|
8
9
|
interface Options {
|
|
9
10
|
i18n?: I18n | I18nOptions | (() => Promise<I18n>);
|
|
10
11
|
logger?: ILogger;
|
|
12
|
+
onRequest?: (ctx: RequestContext) => void | Promise<void>;
|
|
11
13
|
}
|
|
12
14
|
interface I18nOptions {
|
|
13
15
|
/**
|
|
@@ -40,7 +42,7 @@ export declare namespace OpraAdapter {
|
|
|
40
42
|
/**
|
|
41
43
|
* @class OpraAdapter
|
|
42
44
|
*/
|
|
43
|
-
export declare abstract class OpraAdapter {
|
|
45
|
+
export declare abstract class OpraAdapter extends AsyncEventEmitter {
|
|
44
46
|
readonly api: ApiDocument;
|
|
45
47
|
protected _internalDoc: ApiDocument;
|
|
46
48
|
i18n: I18n;
|
|
@@ -57,6 +59,5 @@ export declare abstract class OpraAdapter {
|
|
|
57
59
|
*/
|
|
58
60
|
close(): Promise<void>;
|
|
59
61
|
protected executeRequest(context: RequestContext): Promise<void>;
|
|
60
|
-
protected afterExecuteRequest(context: RequestContext): Promise<void>;
|
|
61
62
|
protected _createI18n(options?: OpraAdapter.I18nOptions): Promise<I18n>;
|
|
62
63
|
}
|
|
@@ -26,7 +26,7 @@ export declare abstract class OpraHttpAdapter extends OpraAdapter {
|
|
|
26
26
|
protected handler(incoming: HttpRequestMessage, outgoing: HttpResponseMessage): Promise<void>;
|
|
27
27
|
protected errorHandler(incoming: HttpRequestMessage, outgoing: HttpResponseMessage, errors: any[]): Promise<void>;
|
|
28
28
|
protected log(logType: keyof ILogger, incoming: HttpRequestMessage, message: string, ...optionalParams: any[]): void;
|
|
29
|
-
protected
|
|
29
|
+
protected executeRequest(context: RequestContext): Promise<void>;
|
|
30
30
|
/**
|
|
31
31
|
*
|
|
32
32
|
* @param incoming
|
|
@@ -3,5 +3,5 @@ export declare class MetadataResource {
|
|
|
3
3
|
readonly document: ApiDocument;
|
|
4
4
|
private _schema;
|
|
5
5
|
constructor(document: ApiDocument);
|
|
6
|
-
get(): import("
|
|
6
|
+
get(): import("@opra/common/types/schema/document.interface").ApiDocument;
|
|
7
7
|
}
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|