kuzzle 2.17.6 → 2.18.0
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/bin/start-kuzzle-server +1 -1
- package/lib/api/controllers/adminController.js +1 -1
- package/lib/api/controllers/authController.js +7 -2
- package/lib/api/controllers/baseController.js +1 -1
- package/lib/api/controllers/bulkController.js +1 -1
- package/lib/api/controllers/clusterController.js +1 -1
- package/lib/api/controllers/collectionController.js +1 -1
- package/lib/api/controllers/documentController.js +7 -2
- package/lib/api/controllers/index.js +1 -1
- package/lib/api/controllers/indexController.js +11 -7
- package/lib/api/controllers/memoryStorageController.js +1 -1
- package/lib/api/controllers/realtimeController.js +1 -1
- package/lib/api/controllers/securityController.js +55 -23
- package/lib/api/controllers/serverController.js +1 -1
- package/lib/api/documentExtractor.js +1 -1
- package/lib/api/funnel.js +1 -1
- package/lib/api/httpRoutes.js +7 -5
- package/lib/api/openapi/OpenApiManager.js +5 -1
- package/lib/api/openapi/components/document/get.yaml +1 -1
- package/lib/api/openapi/components/document/index.d.ts +2 -0
- package/lib/api/openapi/components/document/index.js +6 -1
- package/lib/api/openapi/components/document/mCreateOrReplace.yaml +93 -0
- package/lib/api/openapi/components/document/update.yaml +1 -1
- package/lib/api/openapi/components/index.d.ts +1 -0
- package/lib/api/openapi/components/index.js +1 -0
- package/lib/api/openapi/components/security/index.d.ts +2 -0
- package/lib/api/openapi/components/security/index.js +10 -0
- package/lib/api/openapi/components/security/upsertUser.yaml +59 -0
- package/lib/api/openapi/openApiGenerator.js +1 -1
- package/lib/api/rateLimiter.js +1 -1
- package/lib/api/request/kuzzleRequest.d.ts +21 -0
- package/lib/api/request/kuzzleRequest.js +49 -3
- package/lib/api/request/requestContext.js +1 -1
- package/lib/api/request/requestInput.js +1 -1
- package/lib/api/request/requestResponse.js +1 -1
- package/lib/cluster/command.js +1 -1
- package/lib/cluster/idCardHandler.js +1 -1
- package/lib/cluster/index.js +1 -1
- package/lib/cluster/node.js +8 -8
- package/lib/cluster/publisher.js +1 -1
- package/lib/cluster/state.js +1 -1
- package/lib/cluster/subscriber.js +4 -1
- package/lib/config/documentEventAliases.js +1 -1
- package/lib/config/index.js +1 -1
- package/lib/core/auth/formatProcessing.js +1 -1
- package/lib/core/auth/passportResponse.js +1 -1
- package/lib/core/auth/passportWrapper.js +1 -1
- package/lib/core/auth/tokenManager.js +1 -1
- package/lib/core/backend/applicationManager.js +1 -1
- package/lib/core/backend/backend.js +1 -1
- package/lib/core/backend/backendCluster.js +1 -1
- package/lib/core/backend/backendConfig.js +1 -1
- package/lib/core/backend/backendController.js +1 -1
- package/lib/core/backend/backendErrors.js +1 -1
- package/lib/core/backend/backendHook.js +1 -1
- package/lib/core/backend/backendImport.js +1 -1
- package/lib/core/backend/backendOpenApi.js +1 -1
- package/lib/core/backend/backendPipe.js +1 -1
- package/lib/core/backend/backendPlugin.js +1 -1
- package/lib/core/backend/backendStorage.js +1 -1
- package/lib/core/backend/backendVault.js +1 -1
- package/lib/core/backend/internalLogger.js +1 -1
- package/lib/core/cache/cacheDbEnum.js +1 -1
- package/lib/core/cache/cacheEngine.js +1 -1
- package/lib/core/network/accessLogger.js +12 -7
- package/lib/core/network/clientConnection.js +1 -1
- package/lib/core/network/context.js +1 -1
- package/lib/core/network/entryPoint.js +6 -6
- package/lib/core/network/httpRouter/index.js +1 -1
- package/lib/core/network/httpRouter/routeHandler.js +1 -1
- package/lib/core/network/httpRouter/routePart.js +1 -1
- package/lib/core/network/protocolManifest.js +1 -1
- package/lib/core/network/protocols/httpMessage.js +1 -1
- package/lib/core/network/protocols/httpwsProtocol.js +5 -10
- package/lib/core/network/protocols/internalProtocol.js +1 -1
- package/lib/core/network/protocols/mqttProtocol.js +4 -3
- package/lib/core/network/protocols/protocol.js +1 -1
- package/lib/core/network/router.js +11 -2
- package/lib/core/plugin/plugin.js +1 -1
- package/lib/core/plugin/pluginContext.js +1 -1
- package/lib/core/plugin/pluginManifest.js +1 -1
- package/lib/core/plugin/pluginRepository.js +1 -1
- package/lib/core/plugin/pluginsManager.js +1 -1
- package/lib/core/plugin/privilegedContext.js +1 -1
- package/lib/core/realtime/actionEnum.js +1 -1
- package/lib/core/realtime/channel.js +1 -1
- package/lib/core/realtime/connectionRooms.js +1 -1
- package/lib/core/realtime/hotelClerk.js +66 -24
- package/lib/core/realtime/index.js +1 -1
- package/lib/core/realtime/notification/document.js +1 -1
- package/lib/core/realtime/notification/index.js +1 -1
- package/lib/core/realtime/notification/server.js +1 -1
- package/lib/core/realtime/notification/user.js +1 -1
- package/lib/core/realtime/notifier.js +1 -1
- package/lib/core/realtime/room.js +1 -1
- package/lib/core/realtime/subscription.js +1 -1
- package/lib/core/security/index.js +1 -1
- package/lib/core/security/profileRepository.js +1 -1
- package/lib/core/security/roleRepository.js +1 -1
- package/lib/core/security/securityLoader.js +1 -1
- package/lib/core/security/tokenRepository.js +1 -1
- package/lib/core/security/userRepository.js +1 -1
- package/lib/core/shared/KoncordeWrapper.js +1 -1
- package/lib/core/shared/abstractManifest.js +1 -1
- package/lib/core/shared/repository.js +1 -1
- package/lib/core/shared/sdk/embeddedSdk.d.ts +2 -2
- package/lib/core/shared/sdk/embeddedSdk.js +4 -3
- package/lib/core/shared/sdk/funnelProtocol.d.ts +13 -0
- package/lib/core/shared/sdk/funnelProtocol.js +76 -81
- package/lib/core/shared/sdk/impersonatedSdk.js +1 -1
- package/lib/core/shared/store.js +1 -1
- package/lib/core/statistics/index.js +1 -1
- package/lib/core/statistics/statistics.js +1 -1
- package/lib/core/storage/clientAdapter.js +1 -1
- package/lib/core/storage/indexCache.js +1 -1
- package/lib/core/storage/storageEngine.js +1 -1
- package/lib/core/storage/storeScopeEnum.js +1 -1
- package/lib/core/validation/baseType.js +1 -1
- package/lib/core/validation/index.js +1 -1
- package/lib/core/validation/types/anything.js +1 -1
- package/lib/core/validation/types/boolean.js +1 -1
- package/lib/core/validation/types/date.js +1 -1
- package/lib/core/validation/types/email.js +1 -1
- package/lib/core/validation/types/enum.js +1 -1
- package/lib/core/validation/types/geoPoint.js +1 -1
- package/lib/core/validation/types/geoShape.js +1 -1
- package/lib/core/validation/types/integer.js +1 -1
- package/lib/core/validation/types/ipAddress.js +1 -1
- package/lib/core/validation/types/numeric.js +1 -1
- package/lib/core/validation/types/object.js +1 -1
- package/lib/core/validation/types/string.js +1 -1
- package/lib/core/validation/types/url.js +1 -1
- package/lib/core/validation/validation.js +1 -1
- package/lib/kerror/codes/1-services.json +1 -1
- package/lib/kerror/codes/index.js +1 -1
- package/lib/kerror/errors/badRequestError.js +1 -1
- package/lib/kerror/errors/externalServiceError.js +1 -1
- package/lib/kerror/errors/forbiddenError.js +1 -1
- package/lib/kerror/errors/gatewayTimeoutError.js +1 -1
- package/lib/kerror/errors/index.js +1 -1
- package/lib/kerror/errors/internalError.js +1 -1
- package/lib/kerror/errors/kuzzleError.d.ts +1 -1
- package/lib/kerror/errors/kuzzleError.js +1 -1
- package/lib/kerror/errors/multipleErrorsError.js +1 -1
- package/lib/kerror/errors/notFoundError.js +1 -1
- package/lib/kerror/errors/partialError.js +1 -1
- package/lib/kerror/errors/pluginImplementationError.js +1 -1
- package/lib/kerror/errors/preconditionError.js +1 -1
- package/lib/kerror/errors/serviceUnavailableError.js +1 -1
- package/lib/kerror/errors/sizeLimitError.js +1 -1
- package/lib/kerror/errors/tooManyRequestsError.js +1 -1
- package/lib/kerror/errors/unauthorizedError.js +1 -1
- package/lib/kerror/index.js +2 -4
- package/lib/kuzzle/dumpGenerator.js +1 -1
- package/lib/kuzzle/event/kuzzleEventEmitter.js +39 -1
- package/lib/kuzzle/event/pipeRunner.js +1 -1
- package/lib/kuzzle/event/waterfall.js +1 -1
- package/lib/kuzzle/index.js +1 -1
- package/lib/kuzzle/internalIndexHandler.js +1 -1
- package/lib/kuzzle/kuzzle.js +1 -1
- package/lib/kuzzle/kuzzleStateEnum.js +1 -1
- package/lib/kuzzle/log.js +1 -1
- package/lib/kuzzle/vault.js +1 -1
- package/lib/model/security/profile.js +1 -1
- package/lib/model/security/rights.js +1 -1
- package/lib/model/security/role.js +1 -1
- package/lib/model/security/token.js +1 -1
- package/lib/model/security/user.js +6 -7
- package/lib/model/storage/apiKey.js +1 -1
- package/lib/model/storage/baseModel.js +1 -1
- package/lib/service/cache/redis.js +1 -1
- package/lib/service/service.js +1 -1
- package/lib/service/storage/elasticsearch.js +108 -39
- package/lib/service/storage/esWrapper.js +1 -1
- package/lib/service/storage/queryTranslator.js +1 -1
- package/lib/types/Controller.js +1 -1
- package/lib/types/ControllerDefinition.js +1 -1
- package/lib/types/Deprecation.js +1 -1
- package/lib/types/EventHandler.js +1 -1
- package/lib/types/KuzzleDocument.d.ts +3 -0
- package/lib/types/Plugin.js +1 -1
- package/lib/types/PluginManifest.js +1 -1
- package/lib/types/RequestPayload.js +1 -1
- package/lib/types/ResponsePayload.js +1 -1
- package/lib/types/StrategyDefinition.js +1 -1
- package/lib/types/Token.js +1 -1
- package/lib/types/User.js +1 -1
- package/lib/types/index.d.ts +0 -1
- package/lib/types/index.js +1 -2
- package/lib/util/array.js +1 -1
- package/lib/util/assertType.js +1 -1
- package/lib/util/asyncStore.js +1 -1
- package/lib/util/debug.js +1 -1
- package/lib/util/deprecate.js +1 -1
- package/lib/util/didYouMean.js +1 -1
- package/lib/util/dump-collection.d.ts +35 -0
- package/lib/util/dump-collection.js +11 -8
- package/lib/util/extractFields.js +1 -1
- package/lib/util/inflector.js +1 -1
- package/lib/util/koncordeCompat.js +1 -1
- package/lib/util/memoize.js +1 -1
- package/lib/util/mutex.js +1 -1
- package/lib/util/name-generator.js +1 -1
- package/lib/util/promback.js +1 -1
- package/lib/util/requestAssertions.js +1 -1
- package/lib/util/safeObject.js +1 -1
- package/lib/util/stackTrace.js +56 -17
- package/lib/util/wildcard.js +1 -1
- package/package-lock.json +102 -83
- package/package.json +18 -17
- package/lib/core/network/removeErrorStack.js +0 -56
package/lib/types/Token.js
CHANGED
package/lib/types/User.js
CHANGED
package/lib/types/index.d.ts
CHANGED
|
@@ -2,7 +2,6 @@ export * from './Plugin';
|
|
|
2
2
|
export * from './Controller';
|
|
3
3
|
export * from './ControllerDefinition';
|
|
4
4
|
export * from './ControllerRights';
|
|
5
|
-
export * from './RequestPayload';
|
|
6
5
|
export * from './ResponsePayload';
|
|
7
6
|
export * from './Deprecation';
|
|
8
7
|
export * from './EventHandler';
|
package/lib/types/index.js
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
* Kuzzle, a backend software, self-hostable and ready to use
|
|
4
4
|
* to power modern apps
|
|
5
5
|
*
|
|
6
|
-
* Copyright 2015-
|
|
6
|
+
* Copyright 2015-2022 Kuzzle
|
|
7
7
|
* mailto: support AT kuzzle.io
|
|
8
8
|
* website: http://kuzzle.io
|
|
9
9
|
*
|
|
@@ -38,7 +38,6 @@ __exportStar(require("./Plugin"), exports);
|
|
|
38
38
|
__exportStar(require("./Controller"), exports);
|
|
39
39
|
__exportStar(require("./ControllerDefinition"), exports);
|
|
40
40
|
__exportStar(require("./ControllerRights"), exports);
|
|
41
|
-
__exportStar(require("./RequestPayload"), exports);
|
|
42
41
|
__exportStar(require("./ResponsePayload"), exports);
|
|
43
42
|
__exportStar(require("./Deprecation"), exports);
|
|
44
43
|
__exportStar(require("./EventHandler"), exports);
|
package/lib/util/array.js
CHANGED
package/lib/util/assertType.js
CHANGED
package/lib/util/asyncStore.js
CHANGED
package/lib/util/debug.js
CHANGED
package/lib/util/deprecate.js
CHANGED
package/lib/util/didYouMean.js
CHANGED
|
@@ -1,3 +1,38 @@
|
|
|
1
1
|
import { JSONObject } from '../../index';
|
|
2
2
|
import { HttpStream } from '../types';
|
|
3
|
+
/**
|
|
4
|
+
* Flatten an object transform:
|
|
5
|
+
* {
|
|
6
|
+
* title: "kuzzle",
|
|
7
|
+
* info : {
|
|
8
|
+
* tag: "news"
|
|
9
|
+
* }
|
|
10
|
+
* }
|
|
11
|
+
*
|
|
12
|
+
* Into an object like:
|
|
13
|
+
* {
|
|
14
|
+
* title: "kuzzle",
|
|
15
|
+
* info.tag: news
|
|
16
|
+
* }
|
|
17
|
+
*
|
|
18
|
+
* @param {Object} target the object we have to flatten
|
|
19
|
+
* @returns {Object} the flattened object
|
|
20
|
+
*/
|
|
21
|
+
export declare function flattenObject(target: JSONObject): JSONObject;
|
|
22
|
+
/**
|
|
23
|
+
* Extract fields from mapping by removing the properties from es mapping
|
|
24
|
+
*
|
|
25
|
+
* @param mapping
|
|
26
|
+
* @returns
|
|
27
|
+
*/
|
|
28
|
+
export declare function extractMappingFields(mapping: JSONObject): any;
|
|
29
|
+
/**
|
|
30
|
+
* An iteration-order-safe version of lodash.values
|
|
31
|
+
*
|
|
32
|
+
* @param object The object containing the values
|
|
33
|
+
* @param fields The field names to pick in the right order
|
|
34
|
+
* @returns The values in the same order as the fields
|
|
35
|
+
* @see https://lodash.com/docs/4.17.15#values
|
|
36
|
+
*/
|
|
37
|
+
export declare function pickValues(object: any, fields: string[]): any[];
|
|
3
38
|
export declare function dumpCollectionDocuments(index: string, collection: string, query?: any, format?: string, fields?: string[], options?: JSONObject): HttpStream;
|
|
@@ -26,7 +26,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
26
26
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
27
27
|
};
|
|
28
28
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
29
|
-
exports.dumpCollectionDocuments = void 0;
|
|
29
|
+
exports.dumpCollectionDocuments = exports.pickValues = exports.extractMappingFields = exports.flattenObject = void 0;
|
|
30
30
|
const ndjson_1 = __importDefault(require("ndjson"));
|
|
31
31
|
const get_1 = __importDefault(require("lodash/get"));
|
|
32
32
|
const isObject_1 = __importDefault(require("lodash/isObject"));
|
|
@@ -56,6 +56,7 @@ function flattenObject(target) {
|
|
|
56
56
|
flattenStep(output, target);
|
|
57
57
|
return output;
|
|
58
58
|
}
|
|
59
|
+
exports.flattenObject = flattenObject;
|
|
59
60
|
function flattenStep(output, object, prev = null) {
|
|
60
61
|
const keys = Object.keys(object);
|
|
61
62
|
for (let i = 0; i < keys.length; i++) {
|
|
@@ -63,8 +64,8 @@ function flattenStep(output, object, prev = null) {
|
|
|
63
64
|
const value = object[key];
|
|
64
65
|
const newKey = prev ? prev + '.' + key : key;
|
|
65
66
|
if (Object.prototype.toString.call(value) === '[object Object]') {
|
|
66
|
-
output[newKey] = value;
|
|
67
67
|
flattenStep(output, value, newKey);
|
|
68
|
+
continue;
|
|
68
69
|
}
|
|
69
70
|
output[newKey] = value;
|
|
70
71
|
}
|
|
@@ -77,19 +78,20 @@ function flattenStep(output, object, prev = null) {
|
|
|
77
78
|
*/
|
|
78
79
|
function extractMappingFields(mapping) {
|
|
79
80
|
const newMapping = {};
|
|
81
|
+
if (mapping.properties) {
|
|
82
|
+
return extractMappingFields(mapping.properties);
|
|
83
|
+
}
|
|
80
84
|
for (const key of Object.keys(mapping)) {
|
|
81
|
-
if (
|
|
82
|
-
newMapping[key] = extractMappingFields(mapping[key]);
|
|
83
|
-
}
|
|
84
|
-
else if ((0, isObject_1.default)(mapping[key]) && mapping[key].type) {
|
|
85
|
+
if ((0, isObject_1.default)(mapping[key]) && mapping[key].type) {
|
|
85
86
|
newMapping[key] = mapping[key].type;
|
|
86
87
|
}
|
|
87
|
-
else {
|
|
88
|
-
newMapping[key] = mapping[key];
|
|
88
|
+
else if ((0, isObject_1.default)(mapping[key])) {
|
|
89
|
+
newMapping[key] = extractMappingFields(mapping[key]);
|
|
89
90
|
}
|
|
90
91
|
}
|
|
91
92
|
return newMapping;
|
|
92
93
|
}
|
|
94
|
+
exports.extractMappingFields = extractMappingFields;
|
|
93
95
|
/**
|
|
94
96
|
* An iteration-order-safe version of lodash.values
|
|
95
97
|
*
|
|
@@ -101,6 +103,7 @@ function extractMappingFields(mapping) {
|
|
|
101
103
|
function pickValues(object, fields) {
|
|
102
104
|
return fields.map(f => formatValueForCSV((0, get_1.default)(object, f)));
|
|
103
105
|
}
|
|
106
|
+
exports.pickValues = pickValues;
|
|
104
107
|
/**
|
|
105
108
|
* Formats the value for correct CSV output, avoiding to return
|
|
106
109
|
* values that would badly serialize in CSV.
|
package/lib/util/inflector.js
CHANGED
package/lib/util/memoize.js
CHANGED
package/lib/util/mutex.js
CHANGED
package/lib/util/promback.js
CHANGED
package/lib/util/safeObject.js
CHANGED
package/lib/util/stackTrace.js
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* Kuzzle, a backend software, self-hostable and ready to use
|
|
3
3
|
* to power modern apps
|
|
4
4
|
*
|
|
5
|
-
* Copyright 2015-
|
|
5
|
+
* Copyright 2015-2022 Kuzzle
|
|
6
6
|
* mailto: support AT kuzzle.io
|
|
7
7
|
* website: http://kuzzle.io
|
|
8
8
|
*
|
|
@@ -21,33 +21,72 @@
|
|
|
21
21
|
|
|
22
22
|
'use strict';
|
|
23
23
|
|
|
24
|
+
const util = require('util');
|
|
25
|
+
|
|
26
|
+
const MARKER = '>';
|
|
27
|
+
const PADDING = ' ';
|
|
28
|
+
|
|
24
29
|
/**
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
30
|
+
* Hilight user code
|
|
31
|
+
*
|
|
32
|
+
* e.g.
|
|
33
|
+
* at BackendController._add (/home/kuzzle/lib/core/application/backend.ts:261:28)
|
|
34
|
+
* at BackendController.register (/home/kuzzle/lib/core/application/backend.ts:187:10)
|
|
35
|
+
* >>>> at registerFoo (/home/aschen/projets/app/test.ts:12:18)
|
|
36
|
+
* >>>> at init (/home/aschen/projets/app/test.ts:8:3)
|
|
37
|
+
* at Module._compile (internal/modules/cjs/loader.js:1133:30)
|
|
38
|
+
*/
|
|
34
39
|
function hilightUserCode (line) {
|
|
35
40
|
// ignore first line (error message) or already enhanced
|
|
36
|
-
if (! line.includes(' at ') || line.startsWith(
|
|
41
|
+
if (! line.includes(' at ') || line.startsWith(MARKER)) {
|
|
37
42
|
return line;
|
|
38
43
|
}
|
|
39
44
|
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
+
const isKuzzleCode = line.includes('kuzzle/lib/');
|
|
46
|
+
const isNodeCode = ! line.includes('at /')
|
|
47
|
+
&& ! line.includes('at async /')
|
|
48
|
+
&& line.charAt(line.indexOf('(') + 1) !== '/';
|
|
49
|
+
const isModuleCode = line.includes('node_modules');
|
|
50
|
+
if (isKuzzleCode || isNodeCode || isModuleCode) {
|
|
51
|
+
return PADDING + line;
|
|
45
52
|
}
|
|
46
53
|
|
|
47
54
|
// hilight user code
|
|
48
|
-
return
|
|
55
|
+
return MARKER + line;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* utility method: must be invoked by all protocols to remove stack traces
|
|
60
|
+
* from payloads before sending them
|
|
61
|
+
* @param {Error|Object} data - expected: plain error object or serialized
|
|
62
|
+
* request response
|
|
63
|
+
* @returns {*} return the data minus the stack trace
|
|
64
|
+
*/
|
|
65
|
+
function removeStacktrace (data) {
|
|
66
|
+
if (util.types.isNativeError(data)) {
|
|
67
|
+
if (global.NODE_ENV !== 'development') {
|
|
68
|
+
data.stack = undefined;
|
|
69
|
+
}
|
|
70
|
+
else {
|
|
71
|
+
data.stack = data.stack.split('\n').map(hilightUserCode).join('\n');
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
else if (data && data.content && data.content.error) {
|
|
75
|
+
// @todo v3: stack should be removed only for "production" env
|
|
76
|
+
if (global.NODE_ENV !== 'development') {
|
|
77
|
+
data.content.error.stack = undefined;
|
|
78
|
+
}
|
|
79
|
+
else {
|
|
80
|
+
data.content.error.stack = data.content.error.stack
|
|
81
|
+
? data.content.error.stack.split('\n').map(hilightUserCode).join('\n')
|
|
82
|
+
: undefined;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
return data;
|
|
49
87
|
}
|
|
50
88
|
|
|
51
89
|
module.exports = {
|
|
52
90
|
hilightUserCode,
|
|
91
|
+
removeStacktrace,
|
|
53
92
|
};
|