@sap/cds-dk 7.5.0 → 7.5.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.
@@ -4,7 +4,7 @@ const DEBUG = cds.debug('cli')
4
4
  const cfUtil = require('../util/cf');
5
5
 
6
6
  const axios = require('axios');
7
- require('../util/pruneAxiosErrors');
7
+ require('../util/axios').pruneErrors();
8
8
  const { URL } = require('url');
9
9
  const { bold, highlight } = require('../util/term');
10
10
 
@@ -43,7 +43,8 @@ class MtxExtensionBuildPlugin extends InternalBuildPlugin {
43
43
  await this.collectLanguageBundles(extModel, path.join(destExt, 'i18n'))
44
44
 
45
45
  // perform SQL backend validation to prevent extension deployment problems later on
46
- cds.compile.to.sql(model)
46
+ // REVISIT: disabled - causing stack overflow errors in LinkedCSN for some scenarios
47
+ // cds.compile.to.sql(model)
47
48
 
48
49
  const files = Object.keys(await cds.deploy.resources(model))
49
50
  if (files.length > 0) {
@@ -1843,7 +1843,7 @@ see [Expand](http://docs.oasis-open.org/odata/odata/v4.01/odata-v4.01-part1-prot
1843
1843
  if (suffix === SUFFIX.create)
1844
1844
  schemaProperties[iName] = getSchema(property, SUFFIX.create);
1845
1845
  if (suffix === SUFFIX.update)
1846
- schemaProperties[iName] = getSchema(property, SUFFIX.update);
1846
+ schemaProperties[iName] = getSchema(property, SUFFIX.create);
1847
1847
  }
1848
1848
  } else {
1849
1849
  if (property[voc.Core.Permissions] === "Read" || property[voc.Core.Computed]) {
@@ -5,7 +5,7 @@ const axios = require('axios');
5
5
  const cds = require('../cds');
6
6
  const AuthManager = require('./auth_manager');
7
7
 
8
- require('../util/pruneAxiosErrors');
8
+ require('../util/axios').pruneErrors().setReqTimeout();
9
9
  const { collectFileContent, collectFiles, toUnixPath } = require('./util/fs');
10
10
  const { getMessage } = require('./util/logging');
11
11
  const { handleHttpError } = require('./util/errors');
@@ -4,7 +4,7 @@ const cds = require('../cds');
4
4
  const { SettingsManager } = require('./settings_manager');
5
5
  const { ParamCollection } = require('./params');
6
6
 
7
- require('../util/pruneAxiosErrors');
7
+ require('../util/axios').pruneErrors().setReqTimeout();
8
8
  const { getMessage } = require('./util/logging');
9
9
 
10
10
  const DEBUG = cds.debug('cli');
@@ -4,7 +4,7 @@ const axios = require('axios');
4
4
 
5
5
  const { login } = require('./auth_manager');
6
6
 
7
- require('../util/pruneAxiosErrors');
7
+ require('../util/axios').pruneErrors().setReqTimeout();
8
8
  const { handleHttpError } = require('./util/errors');
9
9
 
10
10
  const DOWNLOAD_FILE_NAME = 'migrated_projects.tgz'; // TODO try to add tenant later, if possible
package/lib/mtx/extend.js CHANGED
@@ -4,7 +4,7 @@ const axios = require('axios');
4
4
 
5
5
  const AuthManager = require('./auth_manager');
6
6
 
7
- require('../util/pruneAxiosErrors');
7
+ require('../util/axios').pruneErrors().setReqTimeout();
8
8
  const { normalizePath, isParent } = require('./util/fs');
9
9
  const Question = require('./util/question');
10
10
  const { getMessage } = require('./util/logging');
package/lib/mtx/pull.js CHANGED
@@ -7,7 +7,7 @@ const axios = require('axios');
7
7
 
8
8
  const { login } = require('./auth_manager');
9
9
 
10
- require('../util/pruneAxiosErrors');
10
+ require('../util/axios').pruneErrors().setReqTimeout();
11
11
  const { getMessage } = require('./util/logging');
12
12
  const { handleHttpError } = require('./util/errors');
13
13
 
package/lib/mtx/push.js CHANGED
@@ -6,7 +6,7 @@ const axios = require('axios');
6
6
  const { login } = require('./auth_manager');
7
7
  const buildSystem = require('../build')
8
8
 
9
- require('../util/pruneAxiosErrors');
9
+ require('../util/axios').pruneErrors().setReqTimeout();
10
10
  const { getMessage } = require('./util/logging');
11
11
  const { schemaRegex } = require('./util/urls');
12
12
  const { handleHttpError } = require('./util/errors');
@@ -2,7 +2,7 @@ const cds = require('../cds');
2
2
  const { ParamCollection } = require('./params');
3
3
  const AuthManager = require('./auth_manager');
4
4
 
5
- require('../util/pruneAxiosErrors');
5
+ require('../util/axios').pruneErrors().setReqTimeout();
6
6
  const { getMessage } = require('./util/logging');
7
7
  const { capitalize } = require('./util/strings');
8
8
  const { handleHttpError } = require('./util/errors');
@@ -2,7 +2,7 @@ const path = require('path');
2
2
  const fs = require('fs').promises;
3
3
 
4
4
  const { concatUrls } = require('./urls');
5
- require('../../util/pruneAxiosErrors');
5
+ require('../../util/axios').pruneErrors().setReqTimeout();
6
6
 
7
7
  const MTX_URL_PATH_PREFIX = 'mtx/v1/model/';
8
8
 
@@ -0,0 +1,84 @@
1
+ module.exports = {
2
+ pruneErrors,
3
+ setReqTimeout
4
+ };
5
+
6
+ // Will only count the time until the server starts responding, not the time until the request is finished.
7
+ const GENERIC_REQUEST_TIMEOUT_MS = 1500;
8
+
9
+ function setReqTimeout() {
10
+ require('axios').interceptors.request.use(
11
+ config => {
12
+ config.timeout = GENERIC_REQUEST_TIMEOUT_MS;
13
+ return config;
14
+ },
15
+ error => {
16
+ return Promise.reject(error)
17
+ }
18
+ );
19
+ return module.exports;
20
+ }
21
+
22
+
23
+ function pruneErrors() {
24
+ function stacklessError(message) {
25
+ const { stackTraceLimit } = Error;
26
+ Error.stackTraceLimit = 0;
27
+ const error = new Error(message);
28
+ Error.stackTraceLimit = stackTraceLimit;
29
+ return error;
30
+ }
31
+
32
+ require('axios').interceptors.response.use(
33
+ response => response,
34
+ axError => {
35
+ const { inspect } = require('util');
36
+ const { url, method } = axError.config ?? {};
37
+ const { errno, code, response = {}, message: axMessage } = axError;
38
+ const prefix = (url && method ? `${method.toUpperCase()} ${url}` : 'Request') + ' failed';
39
+
40
+ let error;
41
+ if (errno) {
42
+ // System error during request.
43
+ const message = prefix
44
+ + `: ${errno} ${code}`
45
+ + (/\b(ENOTFOUND|EAI_AGAIN)\b/.test(code) ? `. Make sure the URL is correct and the server is running.` : '');
46
+ error = stacklessError(message);
47
+ } else {
48
+ // Error after request has been made.
49
+ const { status, statusText } = response;
50
+ let { data } = response;
51
+ if (Buffer.isBuffer(data)) {
52
+ data = data.toString();
53
+ try {
54
+ data = JSON.parse(data);
55
+ } catch (error) { /* unexpected; data will be included in error below */
56
+ }
57
+ }
58
+ const inspectData = data && !data.error_description;
59
+ const reason = !inspectData && data?.error /* RFC 6749 */ && (typeof data.error === 'string' ? data.error : inspect(data.error));
60
+ const details = inspectData ? inspect(data) : data?.error_description /* RFC 6749 */;
61
+ const message = prefix + (
62
+ status || statusText || reason || details
63
+ ? (status || statusText ? ':' : '') +
64
+ (status ? ` ${status}` : '') +
65
+ (statusText ? ` ${statusText}` : '') +
66
+ (reason ? `. ${reason}` : '') +
67
+ (details ? `. Details: ${details}` : '')
68
+ : (axMessage ? `: ${axMessage}` : '')
69
+ );
70
+
71
+ error = stacklessError(message);
72
+ if (status) {
73
+ error.status = status;
74
+ }
75
+ }
76
+
77
+ if (require('../').debug('req')) {
78
+ error.cause = axError;
79
+ }
80
+ return Promise.reject(error);
81
+ }
82
+ );
83
+ return module.exports;
84
+ }