@balena/pinejs 15.3.6-build-fixes-expand-on-parent-resource-34e60c2a2921e971b04422e7901f4dbc4df2dde7-1 → 15.3.6-build-balena-lint-v7-c974ff49f97ca861665e55cf2f024372c46006b9-1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (86) hide show
  1. package/.versionbot/CHANGELOG.yml +55 -4
  2. package/CHANGELOG.md +9 -3
  3. package/Gruntfile.ts +4 -1
  4. package/README.md +1 -0
  5. package/out/bin/abstract-sql-compiler.js +1 -1
  6. package/out/bin/abstract-sql-compiler.js.map +1 -1
  7. package/out/bin/odata-compiler.js +1 -1
  8. package/out/bin/odata-compiler.js.map +1 -1
  9. package/out/bin/sbvr-compiler.js +1 -1
  10. package/out/bin/sbvr-compiler.js.map +1 -1
  11. package/out/bin/utils.js.map +1 -1
  12. package/out/config-loader/config-loader.js +2 -2
  13. package/out/config-loader/config-loader.js.map +1 -1
  14. package/out/data-server/sbvr-server.d.ts +1 -1
  15. package/out/data-server/sbvr-server.js +3 -1
  16. package/out/data-server/sbvr-server.js.map +1 -1
  17. package/out/database-layer/db.js +10 -10
  18. package/out/database-layer/db.js.map +1 -1
  19. package/out/express-emulator/express.js +4 -2
  20. package/out/express-emulator/express.js.map +1 -1
  21. package/out/http-transactions/transactions.d.ts +1 -1
  22. package/out/http-transactions/transactions.js +10 -5
  23. package/out/http-transactions/transactions.js.map +1 -1
  24. package/out/migrator/utils.d.ts +2 -2
  25. package/out/passport-pinejs/passport-pinejs.d.ts +1 -1
  26. package/out/passport-pinejs/passport-pinejs.js +4 -1
  27. package/out/passport-pinejs/passport-pinejs.js.map +1 -1
  28. package/out/pinejs-session-store/pinejs-session-store.js +6 -6
  29. package/out/pinejs-session-store/pinejs-session-store.js.map +1 -1
  30. package/out/sbvr-api/abstract-sql.js +1 -1
  31. package/out/sbvr-api/abstract-sql.js.map +1 -1
  32. package/out/sbvr-api/cached-compile.js.map +1 -1
  33. package/out/sbvr-api/hooks.js +3 -4
  34. package/out/sbvr-api/hooks.js.map +1 -1
  35. package/out/sbvr-api/odata-response.d.ts +1 -1
  36. package/out/sbvr-api/odata-response.js +2 -9
  37. package/out/sbvr-api/odata-response.js.map +1 -1
  38. package/out/sbvr-api/permissions.d.ts +4 -5
  39. package/out/sbvr-api/permissions.js +6 -4
  40. package/out/sbvr-api/permissions.js.map +1 -1
  41. package/out/sbvr-api/sbvr-utils.d.ts +1 -1
  42. package/out/sbvr-api/sbvr-utils.js +4 -2
  43. package/out/sbvr-api/sbvr-utils.js.map +1 -1
  44. package/out/sbvr-api/uri-parser.js +1 -1
  45. package/out/sbvr-api/uri-parser.js.map +1 -1
  46. package/out/server-glue/global-ext.d.ts +2 -1
  47. package/out/server-glue/module.js.map +1 -1
  48. package/out/webresource-handler/handlers/NoopHandler.d.ts +1 -1
  49. package/out/webresource-handler/handlers/NoopHandler.js +1 -1
  50. package/out/webresource-handler/handlers/NoopHandler.js.map +1 -1
  51. package/out/webresource-handler/index.d.ts +0 -4
  52. package/out/webresource-handler/index.js +30 -20
  53. package/out/webresource-handler/index.js.map +1 -1
  54. package/package.json +8 -8
  55. package/src/bin/abstract-sql-compiler.ts +1 -1
  56. package/src/bin/odata-compiler.ts +1 -1
  57. package/src/bin/sbvr-compiler.ts +1 -1
  58. package/src/bin/utils.ts +1 -1
  59. package/src/config-loader/config-loader.ts +2 -3
  60. package/src/data-server/sbvr-server.js +3 -1
  61. package/src/database-layer/db.ts +18 -14
  62. package/src/express-emulator/express.js +4 -2
  63. package/src/extended-sbvr-parser/extended-sbvr-parser.ts +1 -1
  64. package/src/http-transactions/transactions.js +10 -5
  65. package/src/migrator/sync.ts +1 -1
  66. package/src/migrator/utils.ts +2 -2
  67. package/src/odata-metadata/odata-metadata-generator.ts +1 -1
  68. package/src/passport-pinejs/passport-pinejs.ts +7 -3
  69. package/src/pinejs-session-store/pinejs-session-store.ts +6 -6
  70. package/src/sbvr-api/abstract-sql.ts +1 -1
  71. package/src/sbvr-api/cached-compile.ts +0 -1
  72. package/src/sbvr-api/express-extension.ts +4 -2
  73. package/src/sbvr-api/hooks.ts +3 -4
  74. package/src/sbvr-api/odata-response.ts +10 -19
  75. package/src/sbvr-api/permissions.ts +20 -14
  76. package/src/sbvr-api/sbvr-utils.ts +8 -4
  77. package/src/sbvr-api/uri-parser.ts +1 -1
  78. package/src/server-glue/global-ext.d.ts +2 -1
  79. package/src/server-glue/module.ts +1 -0
  80. package/src/server-glue/sbvr-loader.ts +1 -1
  81. package/src/server-glue/server.ts +2 -2
  82. package/src/webresource-handler/handlers/NoopHandler.ts +1 -1
  83. package/src/webresource-handler/index.ts +47 -28
  84. package/tsconfig.dev.json +2 -1
  85. package/typings/lf-to-abstract-sql.d.ts +1 -1
  86. 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
- // tslint:disable-next-line:no-var-requires
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
- // tslint:disable:no-var-requires
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
- // tslint:enable:no-var-requires
39
+ /* eslint-enable @typescript-eslint/no-var-requires */
40
40
 
41
41
  app.use(compression());
42
42
 
@@ -11,7 +11,7 @@ export class NoopHandler implements WebResourceHandler {
11
11
  };
12
12
  }
13
13
 
14
- public async removeFile(_fileReference: string): Promise<void> {
14
+ public async removeFile(): Promise<void> {
15
15
  return;
16
16
  }
17
17
 
@@ -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
- return isWebResourceField(
113
- fieldname,
114
- model.abstractSql.tables[sqlResourceName],
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, _info) => {
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
@@ -7,6 +7,7 @@
7
7
  "build/**/*",
8
8
  "src/**/*",
9
9
  "test/**/*",
10
- "typings/**/*.d.ts"
10
+ "typings/**/*.d.ts",
11
+ "Gruntfile.ts"
11
12
  ]
12
13
  }
@@ -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({}): typeof LF2AbstractSQLPrep;
14
+ _extend(obj: object): typeof LF2AbstractSQLPrep;
15
15
  };
16
16
  export const createTranslator: (
17
17
  types: typeof sbvrTypes,
@@ -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
- // tslint:disable-next-line ban-types
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
- // tslint:disable-next-line ban-types
21
- function memoizeWeak<F extends Function>(
19
+
20
+ function memoizeWeak<F extends (...args: any[]) => any>(
22
21
  f: F,
23
22
  options?: MemoizeWeakOptions<F>,
24
23
  ): F & Memoize.Memoized<F>;