@balena/pinejs 15.3.6-build-fixes-expand-on-parent-resource-34e60c2a2921e971b04422e7901f4dbc4df2dde7-1 → 15.3.6-build-balena-lint-v7-e12b277bc505d89507b61730b026cea7a7e71bc5-1
Sign up to get free protection for your applications and to get access to all the features.
- package/.versionbot/CHANGELOG.yml +55 -4
- package/CHANGELOG.md +9 -3
- package/Gruntfile.ts +4 -1
- package/README.md +1 -0
- package/out/bin/abstract-sql-compiler.js +1 -1
- package/out/bin/abstract-sql-compiler.js.map +1 -1
- package/out/bin/odata-compiler.js +1 -1
- package/out/bin/odata-compiler.js.map +1 -1
- package/out/bin/sbvr-compiler.js +1 -1
- package/out/bin/sbvr-compiler.js.map +1 -1
- package/out/bin/utils.js.map +1 -1
- package/out/config-loader/config-loader.js +2 -2
- package/out/config-loader/config-loader.js.map +1 -1
- package/out/data-server/sbvr-server.d.ts +1 -1
- package/out/data-server/sbvr-server.js +3 -1
- package/out/data-server/sbvr-server.js.map +1 -1
- package/out/database-layer/db.js +10 -10
- package/out/database-layer/db.js.map +1 -1
- package/out/express-emulator/express.js +4 -2
- package/out/express-emulator/express.js.map +1 -1
- package/out/http-transactions/transactions.d.ts +1 -1
- package/out/http-transactions/transactions.js +10 -5
- package/out/http-transactions/transactions.js.map +1 -1
- package/out/migrator/utils.d.ts +2 -2
- package/out/passport-pinejs/passport-pinejs.d.ts +1 -1
- package/out/passport-pinejs/passport-pinejs.js +5 -1
- package/out/passport-pinejs/passport-pinejs.js.map +1 -1
- package/out/pinejs-session-store/pinejs-session-store.js +6 -6
- package/out/pinejs-session-store/pinejs-session-store.js.map +1 -1
- package/out/sbvr-api/abstract-sql.js +1 -1
- package/out/sbvr-api/abstract-sql.js.map +1 -1
- package/out/sbvr-api/cached-compile.js.map +1 -1
- package/out/sbvr-api/hooks.js +3 -4
- package/out/sbvr-api/hooks.js.map +1 -1
- package/out/sbvr-api/odata-response.d.ts +1 -1
- package/out/sbvr-api/odata-response.js +2 -9
- package/out/sbvr-api/odata-response.js.map +1 -1
- package/out/sbvr-api/permissions.d.ts +4 -5
- package/out/sbvr-api/permissions.js +6 -4
- package/out/sbvr-api/permissions.js.map +1 -1
- package/out/sbvr-api/sbvr-utils.d.ts +1 -1
- package/out/sbvr-api/sbvr-utils.js +4 -2
- package/out/sbvr-api/sbvr-utils.js.map +1 -1
- package/out/sbvr-api/uri-parser.js +1 -1
- package/out/sbvr-api/uri-parser.js.map +1 -1
- package/out/server-glue/global-ext.d.ts +2 -1
- package/out/server-glue/module.js.map +1 -1
- package/out/webresource-handler/handlers/NoopHandler.d.ts +1 -1
- package/out/webresource-handler/handlers/NoopHandler.js +1 -1
- package/out/webresource-handler/handlers/NoopHandler.js.map +1 -1
- package/out/webresource-handler/index.d.ts +0 -4
- package/out/webresource-handler/index.js +30 -20
- package/out/webresource-handler/index.js.map +1 -1
- package/package.json +8 -8
- package/src/bin/abstract-sql-compiler.ts +1 -1
- package/src/bin/odata-compiler.ts +1 -1
- package/src/bin/sbvr-compiler.ts +1 -1
- package/src/bin/utils.ts +1 -1
- package/src/config-loader/config-loader.ts +2 -3
- package/src/data-server/sbvr-server.js +3 -1
- package/src/database-layer/db.ts +18 -14
- package/src/express-emulator/express.js +4 -2
- package/src/extended-sbvr-parser/extended-sbvr-parser.ts +1 -1
- package/src/http-transactions/transactions.js +10 -5
- package/src/migrator/sync.ts +1 -1
- package/src/migrator/utils.ts +2 -2
- package/src/odata-metadata/odata-metadata-generator.ts +1 -1
- package/src/passport-pinejs/passport-pinejs.ts +8 -3
- package/src/pinejs-session-store/pinejs-session-store.ts +6 -6
- package/src/sbvr-api/abstract-sql.ts +1 -1
- package/src/sbvr-api/cached-compile.ts +0 -1
- package/src/sbvr-api/express-extension.ts +4 -2
- package/src/sbvr-api/hooks.ts +3 -4
- package/src/sbvr-api/odata-response.ts +10 -19
- package/src/sbvr-api/permissions.ts +20 -14
- package/src/sbvr-api/sbvr-utils.ts +8 -4
- package/src/sbvr-api/uri-parser.ts +1 -1
- package/src/server-glue/global-ext.d.ts +2 -1
- package/src/server-glue/module.ts +1 -0
- package/src/server-glue/sbvr-loader.ts +1 -1
- package/src/server-glue/server.ts +2 -2
- package/src/webresource-handler/handlers/NoopHandler.ts +1 -1
- package/src/webresource-handler/index.ts +47 -28
- package/tsconfig.dev.json +2 -1
- package/typings/lf-to-abstract-sql.d.ts +1 -1
- package/typings/memoizee.d.ts +3 -4
@@ -66,6 +66,7 @@ export const init = async <T extends string>(
|
|
66
66
|
const promises: Array<Promise<void>> = [];
|
67
67
|
if (process.env.SBVR_SERVER_ENABLED) {
|
68
68
|
const sbvrServer = await import('../data-server/sbvr-server');
|
69
|
+
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
69
70
|
const transactions = require('../http-transactions/transactions');
|
70
71
|
promises.push(cfgLoader.loadConfig(sbvrServer.config));
|
71
72
|
promises.push(
|
@@ -15,7 +15,7 @@ if (!process.browser) {
|
|
15
15
|
global.nodeRequire = require;
|
16
16
|
}
|
17
17
|
// Register a .sbvr loader
|
18
|
-
//
|
18
|
+
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
19
19
|
const fs: typeof Fs = require('fs');
|
20
20
|
nodeRequire.extensions['.sbvr'] = (module: NodeModule, filename: string) =>
|
21
21
|
(module.exports = fs.readFileSync(filename, 'utf8'));
|
@@ -27,7 +27,7 @@ switch (app.get('env')) {
|
|
27
27
|
}
|
28
28
|
|
29
29
|
if (!process.browser) {
|
30
|
-
|
30
|
+
/* eslint-disable @typescript-eslint/no-var-requires */
|
31
31
|
const passport: typeof Passport = require('passport');
|
32
32
|
const path: typeof Path = require('path');
|
33
33
|
const compression: typeof Compression = require('compression');
|
@@ -36,7 +36,7 @@ if (!process.browser) {
|
|
36
36
|
const bodyParser: typeof BodyParser = require('body-parser');
|
37
37
|
const methodOverride: typeof MethodOverride = require('method-override');
|
38
38
|
const expressSession: typeof ExpressSession = require('express-session');
|
39
|
-
|
39
|
+
/* eslint-enable @typescript-eslint/no-var-requires */
|
40
40
|
|
41
41
|
app.use(compression());
|
42
42
|
|
@@ -14,7 +14,6 @@ import {
|
|
14
14
|
import { errors, permissions } from '../server-glue/module';
|
15
15
|
import type { WebResourceType as WebResource } from '@balena/sbvr-types';
|
16
16
|
import { TypedError } from 'typed-error';
|
17
|
-
import { AbstractSqlTable } from '@balena/abstract-sql-compiler';
|
18
17
|
|
19
18
|
export * from './handlers';
|
20
19
|
|
@@ -57,26 +56,6 @@ const getLogger = (vocab?: string): Console => {
|
|
57
56
|
return console;
|
58
57
|
};
|
59
58
|
|
60
|
-
let configuredWebResourceHandler: WebResourceHandler | undefined;
|
61
|
-
export const setupWebresourceHandler = (handler: WebResourceHandler): void => {
|
62
|
-
configuredWebResourceHandler = handler;
|
63
|
-
};
|
64
|
-
|
65
|
-
export const getWebresourceHandler = (): WebResourceHandler | undefined => {
|
66
|
-
return configuredWebResourceHandler;
|
67
|
-
};
|
68
|
-
|
69
|
-
export const isWebResourceField = (
|
70
|
-
odataFieldName: string,
|
71
|
-
{ fields }: AbstractSqlTable,
|
72
|
-
): boolean => {
|
73
|
-
const dbFieldName = odataNameToSqlName(odataFieldName);
|
74
|
-
return fields.some(
|
75
|
-
(field) =>
|
76
|
-
field.fieldName === dbFieldName && field.dataType === 'WebResource',
|
77
|
-
);
|
78
|
-
};
|
79
|
-
|
80
59
|
const isFileInValidPath = async (
|
81
60
|
fieldname: string,
|
82
61
|
req: Express.Request,
|
@@ -109,9 +88,11 @@ const isFileInValidPath = async (
|
|
109
88
|
}
|
110
89
|
|
111
90
|
const sqlResourceName = odataNameToSqlName(resourceName);
|
112
|
-
|
113
|
-
|
114
|
-
|
91
|
+
const fields = model.abstractSql.tables[sqlResourceName].fields;
|
92
|
+
const dbFieldName = odataNameToSqlName(fieldname);
|
93
|
+
return fields.some(
|
94
|
+
(field) =>
|
95
|
+
field.fieldName === dbFieldName && field.dataType === 'WebResource',
|
115
96
|
);
|
116
97
|
};
|
117
98
|
|
@@ -175,7 +156,7 @@ export const getUploaderMiddlware = (
|
|
175
156
|
// multipart requests will have two main parts, the file contents and the form fields
|
176
157
|
// This receives the form fields and transforms them into a standard JSON body
|
177
158
|
// This is a similar behavior as previous multer library did
|
178
|
-
bb.on('field', (name, val
|
159
|
+
bb.on('field', (name, val) => {
|
179
160
|
req.body[name] = val;
|
180
161
|
});
|
181
162
|
|
@@ -242,12 +223,43 @@ const getCreateWebResourceHooks = (
|
|
242
223
|
return {
|
243
224
|
'POSTRUN-ERROR': async ({ tx, request }) => {
|
244
225
|
tx?.on('rollback', () => {
|
245
|
-
deleteRollbackPendingFields(request, webResourceHandler);
|
226
|
+
void deleteRollbackPendingFields(request, webResourceHandler);
|
246
227
|
});
|
247
228
|
},
|
248
229
|
};
|
249
230
|
};
|
250
231
|
|
232
|
+
const getReadWebResourceHooks = (
|
233
|
+
webResourceHandler: WebResourceHandler,
|
234
|
+
): sbvrUtils.Hooks => {
|
235
|
+
return {
|
236
|
+
// Before returning a web resource we might need to do some modifications on the payload (e.g. presigning)
|
237
|
+
PRERESPOND: async ({ request, response }) => {
|
238
|
+
const fields = getWebResourceFields(request, false);
|
239
|
+
|
240
|
+
if (fields.length === 0) {
|
241
|
+
return;
|
242
|
+
}
|
243
|
+
|
244
|
+
if (typeof response.body === 'object' && response.body.d != null) {
|
245
|
+
const transformedItems = await Promise.all(
|
246
|
+
response.body.d.map(async (responseItem: any) => {
|
247
|
+
for (const field of fields) {
|
248
|
+
if (responseItem[field] != null) {
|
249
|
+
responseItem[field] = await webResourceHandler.onPreRespond(
|
250
|
+
responseItem[field],
|
251
|
+
);
|
252
|
+
}
|
253
|
+
}
|
254
|
+
return responseItem;
|
255
|
+
}),
|
256
|
+
);
|
257
|
+
response.body.d = transformedItems;
|
258
|
+
}
|
259
|
+
},
|
260
|
+
};
|
261
|
+
};
|
262
|
+
|
251
263
|
const isDefined = <T>(x: T | undefined | null): x is T => x != null;
|
252
264
|
|
253
265
|
const getWebResourcesHrefs = (
|
@@ -284,7 +296,7 @@ const getRemoveWebResourceHooks = (
|
|
284
296
|
|
285
297
|
// Request failed on DB roundtrip (e.g. DB constraint) and pending files need to be deleted
|
286
298
|
tx.on('rollback', () => {
|
287
|
-
deleteRollbackPendingFields(request, webResourceHandler);
|
299
|
+
void deleteRollbackPendingFields(request, webResourceHandler);
|
288
300
|
});
|
289
301
|
|
290
302
|
if (request.method === 'PATCH') {
|
@@ -383,7 +395,7 @@ const deletePendingFiles = (
|
|
383
395
|
): void => {
|
384
396
|
// on purpose does not await for this promise to resolve
|
385
397
|
try {
|
386
|
-
deleteFiles(keysToDelete, webResourceHandler);
|
398
|
+
void deleteFiles(keysToDelete, webResourceHandler);
|
387
399
|
} catch (err) {
|
388
400
|
getLogger(request.vocabulary).error(`Failed to delete pending files`, err);
|
389
401
|
}
|
@@ -419,4 +431,11 @@ export const setupUploadHooks = (
|
|
419
431
|
resourceName,
|
420
432
|
getCreateWebResourceHooks(handler),
|
421
433
|
);
|
434
|
+
|
435
|
+
sbvrUtils.addPureHook(
|
436
|
+
'GET',
|
437
|
+
apiRoot,
|
438
|
+
resourceName,
|
439
|
+
getReadWebResourceHooks(handler),
|
440
|
+
);
|
422
441
|
};
|
package/tsconfig.dev.json
CHANGED
@@ -11,7 +11,7 @@ declare module '@balena/lf-to-abstract-sql' {
|
|
11
11
|
};
|
12
12
|
export const LF2AbstractSQLPrep: {
|
13
13
|
match: (lfModel: LFModel, rule: 'Process') => LFModel;
|
14
|
-
_extend(
|
14
|
+
_extend(obj: object): typeof LF2AbstractSQLPrep;
|
15
15
|
};
|
16
16
|
export const createTranslator: (
|
17
17
|
types: typeof sbvrTypes,
|
package/typings/memoizee.d.ts
CHANGED
@@ -4,8 +4,7 @@ declare module 'memoizee/weak' {
|
|
4
4
|
type FirstArg<T> = T extends (arg1: infer U) => any ? U : any;
|
5
5
|
type RestArgs<T> = T extends (arg1: any, ...args: infer U) => any ? U : any[];
|
6
6
|
|
7
|
-
|
8
|
-
export interface MemoizeWeakOptions<F extends Function> {
|
7
|
+
export interface MemoizeWeakOptions<F extends (...args: any[]) => any> {
|
9
8
|
length?: number | false;
|
10
9
|
maxAge?: number;
|
11
10
|
max?: number;
|
@@ -17,8 +16,8 @@ declare module 'memoizee/weak' {
|
|
17
16
|
normalizer?(firstArg: FirstArg<F>, restArgs: RestArgs<F>): any;
|
18
17
|
resolvers?: Array<(arg: any) => any>;
|
19
18
|
}
|
20
|
-
|
21
|
-
function memoizeWeak<F extends
|
19
|
+
|
20
|
+
function memoizeWeak<F extends (...args: any[]) => any>(
|
22
21
|
f: F,
|
23
22
|
options?: MemoizeWeakOptions<F>,
|
24
23
|
): F & Memoize.Memoized<F>;
|