@balena/pinejs 14.60.0-build-translated-models-85baf731130de328e2067a26c40b37309cdb1ac5-1 → 15.0.0-build-15-x-9f7b9bfe63741d7ae5f446e013251758d9d6ca26-1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (75) hide show
  1. package/.pinejs-cache.json +1 -1
  2. package/.versionbot/CHANGELOG.yml +103 -6
  3. package/CHANGELOG.md +14 -2
  4. package/VERSION +1 -1
  5. package/build/browser.ts +0 -1
  6. package/out/bin/abstract-sql-compiler.js +0 -0
  7. package/out/bin/abstract-sql-compiler.js.map +1 -1
  8. package/out/bin/odata-compiler.js +1 -4
  9. package/out/bin/odata-compiler.js.map +1 -1
  10. package/out/bin/sbvr-compiler.js +0 -0
  11. package/out/bin/sbvr-compiler.js.map +1 -1
  12. package/out/config-loader/config-loader.d.ts +2 -5
  13. package/out/config-loader/config-loader.js +19 -38
  14. package/out/config-loader/config-loader.js.map +1 -1
  15. package/out/config-loader/env.js +4 -4
  16. package/out/config-loader/env.js.map +1 -1
  17. package/out/data-server/sbvr-server.d.ts +1 -13
  18. package/out/data-server/sbvr-server.js +17 -1
  19. package/out/data-server/sbvr-server.js.map +1 -1
  20. package/out/database-layer/db.js +12 -15
  21. package/out/database-layer/db.js.map +1 -1
  22. package/out/express-emulator/express.js +4 -4
  23. package/out/express-emulator/express.js.map +1 -1
  24. package/out/http-transactions/transactions.d.ts +1 -12
  25. package/out/http-transactions/transactions.js +18 -0
  26. package/out/http-transactions/transactions.js.map +1 -1
  27. package/out/migrator/async.js +12 -16
  28. package/out/migrator/async.js.map +1 -1
  29. package/out/migrator/sync.js +6 -12
  30. package/out/migrator/sync.js.map +1 -1
  31. package/out/migrator/utils.d.ts +5 -4
  32. package/out/migrator/utils.js +38 -20
  33. package/out/migrator/utils.js.map +1 -1
  34. package/out/pinejs-session-store/pinejs-session-store.js +18 -3
  35. package/out/pinejs-session-store/pinejs-session-store.js.map +1 -1
  36. package/out/sbvr-api/abstract-sql.js +2 -4
  37. package/out/sbvr-api/abstract-sql.js.map +1 -1
  38. package/out/sbvr-api/cached-compile.js +1 -1
  39. package/out/sbvr-api/cached-compile.js.map +1 -1
  40. package/out/sbvr-api/hooks.d.ts +3 -3
  41. package/out/sbvr-api/hooks.js +32 -48
  42. package/out/sbvr-api/hooks.js.map +1 -1
  43. package/out/sbvr-api/odata-response.js +4 -5
  44. package/out/sbvr-api/odata-response.js.map +1 -1
  45. package/out/sbvr-api/permissions.js +25 -65
  46. package/out/sbvr-api/permissions.js.map +1 -1
  47. package/out/sbvr-api/sbvr-utils.d.ts +5 -11
  48. package/out/sbvr-api/sbvr-utils.js +94 -145
  49. package/out/sbvr-api/sbvr-utils.js.map +1 -1
  50. package/out/sbvr-api/uri-parser.d.ts +1 -4
  51. package/out/sbvr-api/uri-parser.js +4 -11
  52. package/out/sbvr-api/uri-parser.js.map +1 -1
  53. package/package.json +7 -7
  54. package/src/bin/abstract-sql-compiler.ts +2 -1
  55. package/src/bin/odata-compiler.ts +2 -4
  56. package/src/bin/sbvr-compiler.ts +2 -1
  57. package/src/config-loader/config-loader.ts +24 -62
  58. package/src/config-loader/env.ts +3 -7
  59. package/src/data-server/sbvr-server.js +17 -1
  60. package/src/database-layer/db.ts +1 -1
  61. package/src/express-emulator/express.js +4 -4
  62. package/src/http-transactions/transactions.js +18 -0
  63. package/src/migrator/utils.ts +40 -20
  64. package/src/pinejs-session-store/pinejs-session-store.ts +15 -0
  65. package/src/sbvr-api/abstract-sql.ts +1 -2
  66. package/src/sbvr-api/hooks.ts +33 -80
  67. package/src/sbvr-api/odata-response.ts +1 -2
  68. package/src/sbvr-api/permissions.ts +20 -68
  69. package/src/sbvr-api/sbvr-utils.ts +107 -195
  70. package/src/sbvr-api/uri-parser.ts +5 -8
  71. package/tsconfig.json +1 -1
  72. package/out/sbvr-api/translations.d.ts +0 -6
  73. package/out/sbvr-api/translations.js +0 -136
  74. package/out/sbvr-api/translations.js.map +0 -1
  75. package/src/sbvr-api/translations.ts +0 -219
@@ -33,7 +33,6 @@ var abstract_sql_2 = require("./abstract-sql");
33
33
  Object.defineProperty(exports, "resolveOdataBind", { enumerable: true, get: function () { return abstract_sql_2.resolveOdataBind; } });
34
34
  const odataResponse = require("./odata-response");
35
35
  const module_1 = require("../server-glue/module");
36
- const translations_1 = require("./translations");
37
36
  const LF2AbstractSQLTranslator = LF2AbstractSQL.createTranslator(sbvrTypes);
38
37
  const LF2AbstractSQLTranslatorVersion = `${package_json_2.version}+${package_json_3.version}`;
39
38
  const models = {};
@@ -86,7 +85,7 @@ const prettifyConstraintError = (err, request) => {
86
85
  break;
87
86
  case 'postgres':
88
87
  const resourceName = (0, exports.resolveSynonym)(request);
89
- const abstractSqlModel = getFinalAbstractSqlModel(request);
88
+ const abstractSqlModel = (0, exports.getAbstractSqlModel)(request);
90
89
  matches = new RegExp('"' + abstractSqlModel.tables[resourceName].name + '_(.*?)_key"').exec(err.message);
91
90
  break;
92
91
  }
@@ -109,7 +108,7 @@ const prettifyConstraintError = (err, request) => {
109
108
  break;
110
109
  case 'postgres':
111
110
  const resourceName = (0, exports.resolveSynonym)(request);
112
- const abstractSqlModel = getFinalAbstractSqlModel(request);
111
+ const abstractSqlModel = (0, exports.getAbstractSqlModel)(request);
113
112
  const tableName = abstractSqlModel.tables[resourceName].name;
114
113
  matches = new RegExp('"' +
115
114
  tableName +
@@ -130,7 +129,7 @@ const prettifyConstraintError = (err, request) => {
130
129
  }
131
130
  if (err instanceof exports.db.CheckConstraintError) {
132
131
  const resourceName = (0, exports.resolveSynonym)(request);
133
- const abstractSqlModel = getFinalAbstractSqlModel(request);
132
+ const abstractSqlModel = (0, exports.getAbstractSqlModel)(request);
134
133
  const table = abstractSqlModel.tables[resourceName];
135
134
  if (table.checks) {
136
135
  switch (exports.db.engine) {
@@ -144,7 +143,7 @@ const prettifyConstraintError = (err, request) => {
144
143
  if (matches != null) {
145
144
  const checkName = matches[1];
146
145
  const check = table.checks.find((c) => c.name === checkName);
147
- if ((check === null || check === void 0 ? void 0 : check.description) != null) {
146
+ if (check?.description != null) {
148
147
  throw new errors_1.BadRequestError(check.description);
149
148
  }
150
149
  }
@@ -168,11 +167,7 @@ const isModelNew = async (tx, modelName) => {
168
167
  };
169
168
  exports.isModelNew = isModelNew;
170
169
  const validateModel = async (tx, modelName, request) => {
171
- const { sql } = models[modelName];
172
- if (!sql) {
173
- throw new Error(`Tried to validate a virtual model: '${modelName}'`);
174
- }
175
- await Promise.all(sql.rules.map(async (rule) => {
170
+ await Promise.all(models[modelName].sql.rules.map(async (rule) => {
176
171
  if (!(0, abstract_sql_1.isRuleAffected)(rule, request)) {
177
172
  return;
178
173
  }
@@ -196,8 +191,8 @@ const generateAbstractSqlModel = (lfModel) => (0, cached_compile_1.cachedCompile
196
191
  exports.generateAbstractSqlModel = generateAbstractSqlModel;
197
192
  const generateSqlModel = (abstractSql, targetDatabaseEngine) => (0, cached_compile_1.cachedCompile)('sqlModel', package_json_1.version + '+' + targetDatabaseEngine, abstractSql, () => AbstractSQLCompiler[targetDatabaseEngine].compileSchema(abstractSql));
198
193
  exports.generateSqlModel = generateSqlModel;
199
- function generateModels(model, targetDatabaseEngine) {
200
- const { apiRoot: vocab, modelText: se, translateTo, translations } = model;
194
+ const generateModels = (model, targetDatabaseEngine) => {
195
+ const { apiRoot: vocab, modelText: se } = model;
201
196
  let { abstractSql: maybeAbstractSql } = model;
202
197
  let lf;
203
198
  if (se) {
@@ -219,78 +214,48 @@ function generateModels(model, targetDatabaseEngine) {
219
214
  const abstractSql = maybeAbstractSql;
220
215
  const odataMetadata = (0, cached_compile_1.cachedCompile)('metadata', odata_metadata_generator_1.generateODataMetadata.version, { vocab, abstractSqlModel: abstractSql }, () => (0, odata_metadata_generator_1.generateODataMetadata)(vocab, abstractSql));
221
216
  let sql;
222
- let resourceRenames;
223
- if (translateTo != null) {
224
- resourceRenames = (0, translations_1.translateAbstractSqlModel)(abstractSql, models[translateTo].abstractSql, model.apiRoot, translateTo, translations);
217
+ try {
218
+ sql = (0, exports.generateSqlModel)(abstractSql, targetDatabaseEngine);
225
219
  }
226
- else {
227
- for (const [key, table] of Object.entries(abstractSql.tables)) {
228
- abstractSql.tables[`${key}$${model.apiRoot}`] = { ...table };
229
- }
230
- try {
231
- sql = (0, exports.generateSqlModel)(abstractSql, targetDatabaseEngine);
232
- }
233
- catch (e) {
234
- console.error(`Error compiling model '${vocab}':`, e);
235
- throw new Error(`Error compiling model '${vocab}': ` + e);
236
- }
220
+ catch (e) {
221
+ console.error(`Error compiling model '${vocab}':`, e);
222
+ throw new Error(`Error compiling model '${vocab}': ` + e);
237
223
  }
238
- return {
239
- vocab,
240
- translateTo,
241
- resourceRenames,
242
- se,
243
- lf,
244
- abstractSql,
245
- sql,
246
- odataMetadata,
247
- };
248
- }
224
+ return { vocab, se, lf, abstractSql, sql, odataMetadata };
225
+ };
249
226
  exports.generateModels = generateModels;
250
227
  const executeModel = (tx, model) => (0, exports.executeModels)(tx, [model]);
251
228
  exports.executeModel = executeModel;
252
229
  const executeModels = async (tx, execModels) => {
253
230
  try {
254
231
  const compiledModels = await Promise.all(execModels.map(async (model) => {
255
- var _a, _b, _c, _d;
256
232
  const { apiRoot } = model;
257
233
  await syncMigrator.run(tx, model);
258
- const compiledModel = generateModels(model, exports.db.engine);
259
- if (compiledModel.sql) {
260
- for (const createStatement of compiledModel.sql.createSchema) {
261
- const promise = tx.executeSql(createStatement);
262
- if (exports.db.engine === 'websql') {
263
- promise.catch((err) => {
264
- console.warn("Ignoring errors in the create table statements for websql as it doesn't support CREATE IF NOT EXISTS", err);
265
- });
266
- }
267
- await promise;
234
+ const compiledModel = (0, exports.generateModels)(model, exports.db.engine);
235
+ for (const createStatement of compiledModel.sql.createSchema) {
236
+ const promise = tx.executeSql(createStatement);
237
+ if (exports.db.engine === 'websql') {
238
+ promise.catch((err) => {
239
+ console.warn("Ignoring errors in the create table statements for websql as it doesn't support CREATE IF NOT EXISTS", err);
240
+ });
268
241
  }
242
+ await promise;
269
243
  }
270
244
  await syncMigrator.postRun(tx, model);
271
245
  odataResponse.prepareModel(compiledModel.abstractSql);
272
246
  deepFreeze(compiledModel.abstractSql);
273
- const versions = [apiRoot];
274
- if (compiledModel.translateTo != null) {
275
- versions.push(...models[compiledModel.translateTo].versions);
276
- }
277
- models[apiRoot] = {
278
- ...compiledModel,
279
- versions,
280
- };
281
- if (compiledModel.sql) {
282
- await (0, exports.validateModel)(tx, apiRoot);
283
- }
247
+ models[apiRoot] = compiledModel;
248
+ await (0, exports.validateModel)(tx, apiRoot);
284
249
  exports.api[apiRoot] = new PinejsClient('/' + apiRoot + '/');
285
250
  exports.api[apiRoot].logger = { ...console };
286
251
  if (model.logging != null) {
287
- const defaultSetting = (_b = (_a = model.logging) === null || _a === void 0 ? void 0 : _a.default) !== null && _b !== void 0 ? _b : true;
252
+ const defaultSetting = model.logging?.default ?? true;
288
253
  const { logger } = exports.api[apiRoot];
289
254
  for (const k of Object.keys(model.logging)) {
290
255
  const key = k;
291
256
  if (key !== 'Console' &&
292
257
  typeof logger[key] === 'function' &&
293
- !((_d = (_c = model.logging) === null || _c === void 0 ? void 0 : _c[key]) !== null && _d !== void 0 ? _d : defaultSetting)) {
258
+ !(model.logging?.[key] ?? defaultSetting)) {
294
259
  logger[key] = _.noop;
295
260
  }
296
261
  }
@@ -299,7 +264,6 @@ const executeModels = async (tx, execModels) => {
299
264
  }));
300
265
  await Promise.all(compiledModels.map(async (model) => {
301
266
  const updateModel = async (modelType) => {
302
- var _a;
303
267
  if (model[modelType] == null) {
304
268
  return await exports.api.dev.delete({
305
269
  resource: 'model',
@@ -333,10 +297,12 @@ const executeModels = async (tx, execModels) => {
333
297
  let uri = '/dev/model';
334
298
  const body = {
335
299
  is_of__vocabulary: model.vocab,
336
- model_value: model[modelType],
300
+ model_value: typeof model[modelType] === 'string'
301
+ ? { value: model[modelType] }
302
+ : model[modelType],
337
303
  model_type: modelType,
338
304
  };
339
- const id = (_a = result === null || result === void 0 ? void 0 : result[0]) === null || _a === void 0 ? void 0 : _a.id;
305
+ const id = result?.[0]?.id;
340
306
  if (id != null) {
341
307
  uri += '(' + id + ')';
342
308
  method = 'PATCH';
@@ -366,26 +332,23 @@ const cleanupModel = (vocab) => {
366
332
  delete exports.api[vocab];
367
333
  };
368
334
  const deleteModel = async (vocabulary) => {
369
- const { sql } = models[vocabulary];
370
- if (sql) {
371
- await exports.db.transaction(async (tx) => {
372
- const dropStatements = sql.dropSchema.map((dropStatement) => tx.executeSql(dropStatement));
373
- await Promise.all(dropStatements.concat([
374
- exports.api.dev.delete({
375
- resource: 'model',
376
- passthrough: {
377
- tx,
378
- req: permissions.root,
335
+ await exports.db.transaction(async (tx) => {
336
+ const dropStatements = models[vocabulary].sql.dropSchema.map((dropStatement) => tx.executeSql(dropStatement));
337
+ await Promise.all(dropStatements.concat([
338
+ exports.api.dev.delete({
339
+ resource: 'model',
340
+ passthrough: {
341
+ tx,
342
+ req: permissions.root,
343
+ },
344
+ options: {
345
+ $filter: {
346
+ is_of__vocabulary: vocabulary,
379
347
  },
380
- options: {
381
- $filter: {
382
- is_of__vocabulary: vocabulary,
383
- },
384
- },
385
- }),
386
- ]));
387
- });
388
- }
348
+ },
349
+ }),
350
+ ]));
351
+ });
389
352
  await cleanupModel(vocabulary);
390
353
  };
391
354
  exports.deleteModel = deleteModel;
@@ -588,16 +551,10 @@ const runURI = async (method, uri, body = {}, tx, req, custom) => {
588
551
  };
589
552
  exports.runURI = runURI;
590
553
  const getAbstractSqlModel = (request) => {
591
- var _a;
592
- return ((_a = request.abstractSqlModel) !== null && _a !== void 0 ? _a : (request.abstractSqlModel = models[request.vocabulary].abstractSql));
554
+ return (request.abstractSqlModel ??= models[request.vocabulary].abstractSql);
593
555
  };
594
556
  exports.getAbstractSqlModel = getAbstractSqlModel;
595
- const getFinalAbstractSqlModel = (request) => {
596
- var _a;
597
- const finalModel = _.last(request.translateVersions);
598
- return ((_a = request.finalAbstractSqlModel) !== null && _a !== void 0 ? _a : (request.finalAbstractSqlModel = models[finalModel].abstractSql));
599
- };
600
- const getIdField = (request) => getFinalAbstractSqlModel(request).tables[(0, exports.resolveSynonym)(request)].idField;
557
+ const getIdField = (request) => (0, exports.getAbstractSqlModel)(request).tables[(0, exports.resolveSynonym)(request)].idField;
601
558
  const getAffectedIds = async (args) => {
602
559
  const { request } = args;
603
560
  if (request.affectedIds) {
@@ -613,8 +570,6 @@ const getAffectedIds = async (args) => {
613
570
  };
614
571
  exports.getAffectedIds = getAffectedIds;
615
572
  const $getAffectedIds = async ({ req, request, tx, }) => {
616
- var _a;
617
- var _b;
618
573
  if (!['PATCH', 'DELETE'].includes(request.method)) {
619
574
  throw new Error('Can only call `getAffectedIds` with PATCH/DELETE requests');
620
575
  }
@@ -623,7 +578,6 @@ const $getAffectedIds = async ({ req, request, tx, }) => {
623
578
  url: `/${request.vocabulary}${request.url}`,
624
579
  });
625
580
  parsedRequest.engine = request.engine;
626
- parsedRequest.translateVersions = request.translateVersions;
627
581
  let affectedRequest = parsedRequest;
628
582
  const abstractSqlModel = (0, exports.getAbstractSqlModel)(affectedRequest);
629
583
  const resourceName = (0, exports.resolveSynonym)(affectedRequest);
@@ -632,7 +586,7 @@ const $getAffectedIds = async ({ req, request, tx, }) => {
632
586
  throw new Error('Unknown resource: ' + affectedRequest.resourceName);
633
587
  }
634
588
  const { idField } = resourceTable;
635
- (_a = (_b = affectedRequest.odataQuery).options) !== null && _a !== void 0 ? _a : (_b.options = {});
589
+ affectedRequest.odataQuery.options ??= {};
636
590
  affectedRequest.odataQuery.options.$select = {
637
591
  properties: [{ name: idField }],
638
592
  };
@@ -654,14 +608,10 @@ const runODataRequest = (req, vocabulary) => {
654
608
  if (module_1.env.DEBUG) {
655
609
  exports.api[vocabulary].logger.log('Parsing', req.method, req.url);
656
610
  }
657
- const { versions } = models[vocabulary];
658
- const reqHooks = versions.map((version) => [
659
- version,
660
- (0, hooks_1.getHooks)({
661
- method: req.method,
662
- vocabulary: version,
663
- }, version === versions[0]),
664
- ]);
611
+ const reqHooks = (0, hooks_1.getHooks)({
612
+ method: req.method,
613
+ vocabulary,
614
+ });
665
615
  const transactions = [];
666
616
  const tryCancelRequest = () => {
667
617
  transactions.forEach(async (tx) => {
@@ -697,33 +647,14 @@ const runODataRequest = (req, vocabulary) => {
697
647
  }
698
648
  const prepareRequest = async (parsedRequest) => {
699
649
  parsedRequest.engine = exports.db.engine;
700
- parsedRequest.translateVersions = [...versions];
701
650
  const $request = parsedRequest;
651
+ $request.hooks = (0, hooks_1.getHooks)($request);
702
652
  try {
703
- $request.hooks = [];
704
- for (const version of versions) {
705
- const hooks = [
706
- version,
707
- (0, hooks_1.getHooks)({
708
- resourceName: $request.resourceName,
709
- vocabulary: version,
710
- method: $request.method,
711
- }, version === versions[0]),
712
- ];
713
- $request.hooks.push(hooks);
714
- await (0, hooks_1.runHooks)('POSTPARSE', [hooks], {
715
- req,
716
- request: $request,
717
- tx: req.tx,
718
- });
719
- const { resourceRenames } = models[version];
720
- if (resourceRenames) {
721
- const resourceName = (0, exports.resolveSynonym)($request);
722
- if (resourceRenames[resourceName]) {
723
- $request.resourceName = (0, odata_to_abstract_sql_1.sqlNameToODataName)(resourceRenames[resourceName]);
724
- }
725
- }
726
- }
653
+ await (0, hooks_1.runHooks)('POSTPARSE', $request.hooks, {
654
+ req,
655
+ request: $request,
656
+ tx: req.tx,
657
+ });
727
658
  const translatedRequest = await uriParser.translateUri($request);
728
659
  return await (0, abstract_sql_1.compileRequest)(translatedRequest);
729
660
  }
@@ -940,13 +871,12 @@ const runRequest = async (req, tx, request) => {
940
871
  return await prepareResponse(req, request, result, tx);
941
872
  };
942
873
  const runChangeSet = (req, tx) => async (changeSetResults, request) => {
943
- var _a;
944
874
  request = updateBinds(changeSetResults, request);
945
875
  const result = await runRequest(req, tx, request);
946
876
  if (request.id == null) {
947
877
  throw new Error('No request id');
948
878
  }
949
- (_a = result.headers) !== null && _a !== void 0 ? _a : (result.headers = {});
879
+ result.headers ??= {};
950
880
  result.headers['content-id'] = request.id;
951
881
  changeSetResults.set(request.id, result);
952
882
  };
@@ -955,7 +885,7 @@ const updateBinds = (changeSetResults, request) => {
955
885
  request.odataBinds = request.odataBinds.map(([tag, id]) => {
956
886
  if (tag === 'ContentReference') {
957
887
  const ref = changeSetResults.get(id);
958
- if ((ref === null || ref === void 0 ? void 0 : ref.body) == null ||
888
+ if (ref?.body == null ||
959
889
  typeof ref.body === 'string' ||
960
890
  ref.body.id === undefined) {
961
891
  throw new errors_1.BadRequestError('Reference to a non existing resource in Changeset');
@@ -993,9 +923,7 @@ const checkReadOnlyRequests = (request) => {
993
923
  if (hooks == null) {
994
924
  return true;
995
925
  }
996
- return hooks.every(([, versionedHooks]) => Object.values(versionedHooks).every((hookTypeHooks) => {
997
- return (hookTypeHooks == null || hookTypeHooks.every((hook) => hook.readOnlyTx));
998
- }));
926
+ return Object.values(hooks).every((hookTypeHooks) => hookTypeHooks == null || hookTypeHooks.every((hook) => hook.readOnlyTx));
999
927
  };
1000
928
  const runTransaction = async (req, request, callback) => {
1001
929
  if (req.tx != null) {
@@ -1012,7 +940,6 @@ const runTransaction = async (req, request, callback) => {
1012
940
  return await exports.db.transaction(callback);
1013
941
  };
1014
942
  const runQuery = async (tx, request, queryIndex, returningIdField) => {
1015
- var _a;
1016
943
  const { vocabulary } = request;
1017
944
  let { sqlQuery } = request;
1018
945
  if (sqlQuery == null) {
@@ -1034,7 +961,7 @@ const runQuery = async (tx, request, queryIndex, returningIdField) => {
1034
961
  }
1035
962
  const sqlResult = await tx.executeSql(query, values, returningIdField);
1036
963
  if (returningIdField) {
1037
- (_a = request.affectedIds) !== null && _a !== void 0 ? _a : (request.affectedIds = sqlResult.rows.map((row) => row[returningIdField]));
964
+ request.affectedIds ??= sqlResult.rows.map((row) => row[returningIdField]);
1038
965
  }
1039
966
  return sqlResult;
1040
967
  };
@@ -1044,14 +971,13 @@ const runGet = async (_req, request, tx) => {
1044
971
  }
1045
972
  };
1046
973
  const respondGet = async (req, request, result, tx) => {
1047
- var _a;
1048
974
  const vocab = request.vocabulary;
1049
975
  if (request.sqlQuery != null) {
1050
- const format = (_a = request.odataQuery.options) === null || _a === void 0 ? void 0 : _a.$format;
976
+ const format = request.odataQuery.options?.$format;
1051
977
  const metadata = format != null && typeof format === 'object'
1052
978
  ? format.metadata
1053
979
  : undefined;
1054
- const d = await odataResponse.process(vocab, (0, exports.getAbstractSqlModel)(request), request.originalResourceName, result.rows, { includeMetadata: metadata === 'full' });
980
+ const d = await odataResponse.process(vocab, (0, exports.getAbstractSqlModel)(request), request.resourceName, result.rows, { includeMetadata: metadata === 'full' });
1055
981
  const response = {
1056
982
  statusCode: 200,
1057
983
  body: { d },
@@ -1087,19 +1013,18 @@ const runPost = async (_req, request, tx) => {
1087
1013
  if (rowsAffected === 0) {
1088
1014
  throw new errors_1.PermissionError();
1089
1015
  }
1090
- await (0, exports.validateModel)(tx, _.last(request.translateVersions), request);
1016
+ await (0, exports.validateModel)(tx, request.vocabulary, request);
1091
1017
  return insertId;
1092
1018
  };
1093
1019
  const respondPost = async (req, request, id, tx) => {
1094
- var _a, _b;
1095
1020
  const vocab = request.vocabulary;
1096
- const location = odataResponse.resourceURI(vocab, request.originalResourceName, id);
1021
+ const location = odataResponse.resourceURI(vocab, request.resourceName, id);
1097
1022
  if (module_1.env.DEBUG) {
1098
1023
  exports.api[vocab].logger.log('Insert ID: ', request.resourceName, id);
1099
1024
  }
1100
1025
  let result = { d: [{ id }] };
1101
1026
  if (location != null &&
1102
- !['0', 'false'].includes((_b = (_a = request === null || request === void 0 ? void 0 : request.odataQuery) === null || _a === void 0 ? void 0 : _a.options) === null || _b === void 0 ? void 0 : _b.returnResource)) {
1027
+ !['0', 'false'].includes(request?.odataQuery?.options?.returnResource)) {
1103
1028
  try {
1104
1029
  result = (await (0, exports.runURI)('GET', location, undefined, tx, req));
1105
1030
  }
@@ -1136,7 +1061,7 @@ const runPut = async (_req, request, tx) => {
1136
1061
  ({ rowsAffected } = await runQuery(tx, request, undefined, idField));
1137
1062
  }
1138
1063
  if (rowsAffected > 0) {
1139
- await (0, exports.validateModel)(tx, _.last(request.translateVersions), request);
1064
+ await (0, exports.validateModel)(tx, request.vocabulary, request);
1140
1065
  }
1141
1066
  return undefined;
1142
1067
  };
@@ -1158,7 +1083,7 @@ const respondOptions = respondPut;
1158
1083
  const runDelete = async (_req, request, tx) => {
1159
1084
  const { rowsAffected } = await runQuery(tx, request, undefined, getIdField(request));
1160
1085
  if (rowsAffected > 0) {
1161
- await (0, exports.validateModel)(tx, _.last(request.translateVersions), request);
1086
+ await (0, exports.validateModel)(tx, request.vocabulary, request);
1162
1087
  }
1163
1088
  return undefined;
1164
1089
  };
@@ -1175,6 +1100,30 @@ const executeStandardModels = async (tx) => {
1175
1100
  ALTER TABLE "model"
1176
1101
  ADD COLUMN IF NOT EXISTS "modified at" TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL;
1177
1102
  `,
1103
+ '15.0.0-data-types': async ($tx, sbvrUtils) => {
1104
+ switch (sbvrUtils.db.engine) {
1105
+ case 'mysql':
1106
+ await $tx.executeSql(`\
1107
+ ALTER TABLE "model"
1108
+ MODIFY "model value" JSON NOT NULL;
1109
+
1110
+ UPDATE "model"
1111
+ SET "model value" = CAST('{"value":' || CAST("model value" AS CHAR) || '}' AS JSON)
1112
+ WHERE "model type" IN ('se', 'odataMetadata')
1113
+ AND CAST("model value" AS CHAR) LIKE '"%';`);
1114
+ break;
1115
+ case 'postgres':
1116
+ await $tx.executeSql(`\
1117
+ ALTER TABLE "model"
1118
+ ALTER COLUMN "model value" SET DATA TYPE JSONB USING "model value"::JSONB;
1119
+
1120
+ UPDATE "model"
1121
+ SET "model value" = CAST('{"value":' || CAST("model value" AS TEXT) || '}' AS JSON)
1122
+ WHERE "model type" IN ('se', 'odataMetadata')
1123
+ AND CAST("model value" AS TEXT) LIKE '"%';`);
1124
+ break;
1125
+ }
1126
+ },
1178
1127
  },
1179
1128
  });
1180
1129
  await (0, exports.executeModels)(tx, permissions.config.models);