@atlaskit/react-ufo 5.4.11 → 5.5.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/CHANGELOG.md +7 -0
- package/dist/cjs/set-terminal-error/index.js +44 -3
- package/dist/es2019/set-terminal-error/index.js +39 -3
- package/dist/esm/set-terminal-error/index.js +43 -3
- package/dist/types/set-terminal-error/index.d.ts +18 -2
- package/dist/types-ts4.5/set-terminal-error/index.d.ts +18 -2
- package/package.json +4 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,12 @@
|
|
|
1
1
|
# @atlaskit/ufo-interaction-ignore
|
|
2
2
|
|
|
3
|
+
## 5.5.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- [`b6474459ca8ec`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/b6474459ca8ec) -
|
|
8
|
+
Improve Terminal Error Metric to internally extract statusCode & traceId
|
|
9
|
+
|
|
3
10
|
## 5.4.11
|
|
4
11
|
|
|
5
12
|
### Patch Changes
|
|
@@ -4,11 +4,15 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
|
|
|
4
4
|
Object.defineProperty(exports, "__esModule", {
|
|
5
5
|
value: true
|
|
6
6
|
});
|
|
7
|
+
exports.isRelayNetworkError = void 0;
|
|
7
8
|
exports.setTerminalError = setTerminalError;
|
|
8
9
|
exports.sinkTerminalErrorHandler = sinkTerminalErrorHandler;
|
|
9
10
|
exports.useReportTerminalError = useReportTerminalError;
|
|
10
11
|
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
12
|
+
var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
|
|
11
13
|
var _react = require("react");
|
|
14
|
+
var _platformFeatureFlags = require("@atlaskit/platform-feature-flags");
|
|
15
|
+
var _experienceTraceIdContext = require("../experience-trace-id-context");
|
|
12
16
|
var _interactionContext = require("../interaction-context");
|
|
13
17
|
var _interactionMetrics = require("../interaction-metrics");
|
|
14
18
|
var _routeNameContext = _interopRequireDefault(require("../route-name-context"));
|
|
@@ -18,19 +22,56 @@ var sinkHandlerFn = function sinkHandlerFn() {};
|
|
|
18
22
|
function sinkTerminalErrorHandler(fn) {
|
|
19
23
|
sinkHandlerFn = fn;
|
|
20
24
|
}
|
|
25
|
+
var RELAY_NETWORK_ERRORS_NAME = 'RelayNetwork';
|
|
26
|
+
/**
|
|
27
|
+
* Relay error structure
|
|
28
|
+
*/
|
|
29
|
+
|
|
30
|
+
var isRelayNetworkError = exports.isRelayNetworkError = function isRelayNetworkError(error) {
|
|
31
|
+
return error.name === RELAY_NETWORK_ERRORS_NAME;
|
|
32
|
+
};
|
|
33
|
+
var isErrorObject = function isErrorObject(error) {
|
|
34
|
+
return (0, _typeof2.default)(error) === 'object' && error !== null;
|
|
35
|
+
};
|
|
36
|
+
var getErrorStatusCode = function getErrorStatusCode(error) {
|
|
37
|
+
if (!isErrorObject(error)) {
|
|
38
|
+
return undefined;
|
|
39
|
+
}
|
|
40
|
+
if (isRelayNetworkError(error)) {
|
|
41
|
+
var _error$source;
|
|
42
|
+
return (_error$source = error.source) === null || _error$source === void 0 || (_error$source = _error$source.errors) === null || _error$source === void 0 || (_error$source = _error$source[0]) === null || _error$source === void 0 || (_error$source = _error$source.extensions) === null || _error$source === void 0 ? void 0 : _error$source.statusCode;
|
|
43
|
+
}
|
|
44
|
+
if ('statusCode' in error && typeof error.statusCode === 'number') {
|
|
45
|
+
return error.statusCode;
|
|
46
|
+
}
|
|
47
|
+
return undefined;
|
|
48
|
+
};
|
|
49
|
+
var getErrorTraceId = function getErrorTraceId(error) {
|
|
50
|
+
return isErrorObject(error) && 'traceId' in error && typeof error.traceId === 'string' ? error.traceId : undefined;
|
|
51
|
+
};
|
|
21
52
|
function setTerminalError(error, additionalAttributes, labelStack) {
|
|
22
|
-
var _error$message, _activeInteraction$uf, _activeInteraction$id, _activeInteraction$ty, _PreviousInteractionL, _PreviousInteractionL2, _PreviousInteractionL3, _UFORouteName$current;
|
|
53
|
+
var _error$message, _getActiveTrace$trace, _getActiveTrace, _activeInteraction$uf, _activeInteraction$id, _activeInteraction$ty, _PreviousInteractionL, _PreviousInteractionL2, _PreviousInteractionL3, _UFORouteName$current;
|
|
23
54
|
if (additionalAttributes !== null && additionalAttributes !== void 0 && additionalAttributes.isClientNetworkError) {
|
|
24
55
|
// Exclude client network errors from being reported to UFO
|
|
25
56
|
return;
|
|
26
57
|
}
|
|
27
58
|
var activeInteraction = (0, _interactionMetrics.getActiveInteraction)();
|
|
28
59
|
var currentTime = performance.now();
|
|
29
|
-
var
|
|
60
|
+
var baseErrorData = {
|
|
30
61
|
errorType: error.name || 'Error',
|
|
31
62
|
errorMessage: ((_error$message = error.message) === null || _error$message === void 0 ? void 0 : _error$message.slice(0, 100)) || 'Unknown error',
|
|
32
63
|
timestamp: currentTime
|
|
33
|
-
}
|
|
64
|
+
};
|
|
65
|
+
var errorData = (0, _platformFeatureFlags.fg)('platform_ufo_terminal_errors_fix_missing_data') ? _objectSpread(_objectSpread({}, baseErrorData), {}, {
|
|
66
|
+
statusCode: getErrorStatusCode(error),
|
|
67
|
+
// Fallback to traceId from error object if it exists (e.g. FetchError)
|
|
68
|
+
traceId: (_getActiveTrace$trace = (_getActiveTrace = (0, _experienceTraceIdContext.getActiveTrace)()) === null || _getActiveTrace === void 0 ? void 0 : _getActiveTrace.traceId) !== null && _getActiveTrace$trace !== void 0 ? _getActiveTrace$trace : getErrorTraceId(error),
|
|
69
|
+
teamName: additionalAttributes === null || additionalAttributes === void 0 ? void 0 : additionalAttributes.teamName,
|
|
70
|
+
packageName: additionalAttributes === null || additionalAttributes === void 0 ? void 0 : additionalAttributes.packageName,
|
|
71
|
+
errorBoundaryId: additionalAttributes === null || additionalAttributes === void 0 ? void 0 : additionalAttributes.errorBoundaryId,
|
|
72
|
+
errorHash: additionalAttributes === null || additionalAttributes === void 0 ? void 0 : additionalAttributes.errorHash,
|
|
73
|
+
fallbackType: additionalAttributes === null || additionalAttributes === void 0 ? void 0 : additionalAttributes.fallbackType
|
|
74
|
+
}) : _objectSpread(_objectSpread({}, baseErrorData), additionalAttributes);
|
|
34
75
|
|
|
35
76
|
// Calculate time since previous interaction
|
|
36
77
|
var timeSincePreviousInteraction = _interactionMetrics.PreviousInteractionLog.timestamp != null ? currentTime - _interactionMetrics.PreviousInteractionLog.timestamp : null;
|
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
import { useEffect, useRef } from 'react';
|
|
2
|
+
import { fg } from '@atlaskit/platform-feature-flags';
|
|
3
|
+
import { getActiveTrace } from '../experience-trace-id-context';
|
|
2
4
|
import { useInteractionContext } from '../interaction-context';
|
|
3
5
|
import { getActiveInteraction, PreviousInteractionLog } from '../interaction-metrics';
|
|
4
6
|
import UFORouteName from '../route-name-context';
|
|
@@ -6,18 +8,52 @@ let sinkHandlerFn = () => {};
|
|
|
6
8
|
export function sinkTerminalErrorHandler(fn) {
|
|
7
9
|
sinkHandlerFn = fn;
|
|
8
10
|
}
|
|
11
|
+
const RELAY_NETWORK_ERRORS_NAME = 'RelayNetwork';
|
|
12
|
+
/**
|
|
13
|
+
* Relay error structure
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
export const isRelayNetworkError = error => error.name === RELAY_NETWORK_ERRORS_NAME;
|
|
17
|
+
const isErrorObject = error => typeof error === 'object' && error !== null;
|
|
18
|
+
const getErrorStatusCode = error => {
|
|
19
|
+
if (!isErrorObject(error)) {
|
|
20
|
+
return undefined;
|
|
21
|
+
}
|
|
22
|
+
if (isRelayNetworkError(error)) {
|
|
23
|
+
var _error$source, _error$source$errors, _error$source$errors$, _error$source$errors$2;
|
|
24
|
+
return (_error$source = error.source) === null || _error$source === void 0 ? void 0 : (_error$source$errors = _error$source.errors) === null || _error$source$errors === void 0 ? void 0 : (_error$source$errors$ = _error$source$errors[0]) === null || _error$source$errors$ === void 0 ? void 0 : (_error$source$errors$2 = _error$source$errors$.extensions) === null || _error$source$errors$2 === void 0 ? void 0 : _error$source$errors$2.statusCode;
|
|
25
|
+
}
|
|
26
|
+
if ('statusCode' in error && typeof error.statusCode === 'number') {
|
|
27
|
+
return error.statusCode;
|
|
28
|
+
}
|
|
29
|
+
return undefined;
|
|
30
|
+
};
|
|
31
|
+
const getErrorTraceId = error => isErrorObject(error) && 'traceId' in error && typeof error.traceId === 'string' ? error.traceId : undefined;
|
|
9
32
|
export function setTerminalError(error, additionalAttributes, labelStack) {
|
|
10
|
-
var _error$message, _activeInteraction$uf, _activeInteraction$id, _activeInteraction$ty, _PreviousInteractionL, _PreviousInteractionL2, _PreviousInteractionL3, _UFORouteName$current;
|
|
33
|
+
var _error$message, _getActiveTrace$trace, _getActiveTrace, _activeInteraction$uf, _activeInteraction$id, _activeInteraction$ty, _PreviousInteractionL, _PreviousInteractionL2, _PreviousInteractionL3, _UFORouteName$current;
|
|
11
34
|
if (additionalAttributes !== null && additionalAttributes !== void 0 && additionalAttributes.isClientNetworkError) {
|
|
12
35
|
// Exclude client network errors from being reported to UFO
|
|
13
36
|
return;
|
|
14
37
|
}
|
|
15
38
|
const activeInteraction = getActiveInteraction();
|
|
16
39
|
const currentTime = performance.now();
|
|
17
|
-
const
|
|
40
|
+
const baseErrorData = {
|
|
18
41
|
errorType: error.name || 'Error',
|
|
19
42
|
errorMessage: ((_error$message = error.message) === null || _error$message === void 0 ? void 0 : _error$message.slice(0, 100)) || 'Unknown error',
|
|
20
|
-
timestamp: currentTime
|
|
43
|
+
timestamp: currentTime
|
|
44
|
+
};
|
|
45
|
+
const errorData = fg('platform_ufo_terminal_errors_fix_missing_data') ? {
|
|
46
|
+
...baseErrorData,
|
|
47
|
+
statusCode: getErrorStatusCode(error),
|
|
48
|
+
// Fallback to traceId from error object if it exists (e.g. FetchError)
|
|
49
|
+
traceId: (_getActiveTrace$trace = (_getActiveTrace = getActiveTrace()) === null || _getActiveTrace === void 0 ? void 0 : _getActiveTrace.traceId) !== null && _getActiveTrace$trace !== void 0 ? _getActiveTrace$trace : getErrorTraceId(error),
|
|
50
|
+
teamName: additionalAttributes === null || additionalAttributes === void 0 ? void 0 : additionalAttributes.teamName,
|
|
51
|
+
packageName: additionalAttributes === null || additionalAttributes === void 0 ? void 0 : additionalAttributes.packageName,
|
|
52
|
+
errorBoundaryId: additionalAttributes === null || additionalAttributes === void 0 ? void 0 : additionalAttributes.errorBoundaryId,
|
|
53
|
+
errorHash: additionalAttributes === null || additionalAttributes === void 0 ? void 0 : additionalAttributes.errorHash,
|
|
54
|
+
fallbackType: additionalAttributes === null || additionalAttributes === void 0 ? void 0 : additionalAttributes.fallbackType
|
|
55
|
+
} : {
|
|
56
|
+
...baseErrorData,
|
|
21
57
|
...additionalAttributes
|
|
22
58
|
};
|
|
23
59
|
|
|
@@ -1,7 +1,10 @@
|
|
|
1
1
|
import _defineProperty from "@babel/runtime/helpers/defineProperty";
|
|
2
|
+
import _typeof from "@babel/runtime/helpers/typeof";
|
|
2
3
|
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
3
4
|
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
4
5
|
import { useEffect, useRef } from 'react';
|
|
6
|
+
import { fg } from '@atlaskit/platform-feature-flags';
|
|
7
|
+
import { getActiveTrace } from '../experience-trace-id-context';
|
|
5
8
|
import { useInteractionContext } from '../interaction-context';
|
|
6
9
|
import { getActiveInteraction, PreviousInteractionLog } from '../interaction-metrics';
|
|
7
10
|
import UFORouteName from '../route-name-context';
|
|
@@ -9,19 +12,56 @@ var sinkHandlerFn = function sinkHandlerFn() {};
|
|
|
9
12
|
export function sinkTerminalErrorHandler(fn) {
|
|
10
13
|
sinkHandlerFn = fn;
|
|
11
14
|
}
|
|
15
|
+
var RELAY_NETWORK_ERRORS_NAME = 'RelayNetwork';
|
|
16
|
+
/**
|
|
17
|
+
* Relay error structure
|
|
18
|
+
*/
|
|
19
|
+
|
|
20
|
+
export var isRelayNetworkError = function isRelayNetworkError(error) {
|
|
21
|
+
return error.name === RELAY_NETWORK_ERRORS_NAME;
|
|
22
|
+
};
|
|
23
|
+
var isErrorObject = function isErrorObject(error) {
|
|
24
|
+
return _typeof(error) === 'object' && error !== null;
|
|
25
|
+
};
|
|
26
|
+
var getErrorStatusCode = function getErrorStatusCode(error) {
|
|
27
|
+
if (!isErrorObject(error)) {
|
|
28
|
+
return undefined;
|
|
29
|
+
}
|
|
30
|
+
if (isRelayNetworkError(error)) {
|
|
31
|
+
var _error$source;
|
|
32
|
+
return (_error$source = error.source) === null || _error$source === void 0 || (_error$source = _error$source.errors) === null || _error$source === void 0 || (_error$source = _error$source[0]) === null || _error$source === void 0 || (_error$source = _error$source.extensions) === null || _error$source === void 0 ? void 0 : _error$source.statusCode;
|
|
33
|
+
}
|
|
34
|
+
if ('statusCode' in error && typeof error.statusCode === 'number') {
|
|
35
|
+
return error.statusCode;
|
|
36
|
+
}
|
|
37
|
+
return undefined;
|
|
38
|
+
};
|
|
39
|
+
var getErrorTraceId = function getErrorTraceId(error) {
|
|
40
|
+
return isErrorObject(error) && 'traceId' in error && typeof error.traceId === 'string' ? error.traceId : undefined;
|
|
41
|
+
};
|
|
12
42
|
export function setTerminalError(error, additionalAttributes, labelStack) {
|
|
13
|
-
var _error$message, _activeInteraction$uf, _activeInteraction$id, _activeInteraction$ty, _PreviousInteractionL, _PreviousInteractionL2, _PreviousInteractionL3, _UFORouteName$current;
|
|
43
|
+
var _error$message, _getActiveTrace$trace, _getActiveTrace, _activeInteraction$uf, _activeInteraction$id, _activeInteraction$ty, _PreviousInteractionL, _PreviousInteractionL2, _PreviousInteractionL3, _UFORouteName$current;
|
|
14
44
|
if (additionalAttributes !== null && additionalAttributes !== void 0 && additionalAttributes.isClientNetworkError) {
|
|
15
45
|
// Exclude client network errors from being reported to UFO
|
|
16
46
|
return;
|
|
17
47
|
}
|
|
18
48
|
var activeInteraction = getActiveInteraction();
|
|
19
49
|
var currentTime = performance.now();
|
|
20
|
-
var
|
|
50
|
+
var baseErrorData = {
|
|
21
51
|
errorType: error.name || 'Error',
|
|
22
52
|
errorMessage: ((_error$message = error.message) === null || _error$message === void 0 ? void 0 : _error$message.slice(0, 100)) || 'Unknown error',
|
|
23
53
|
timestamp: currentTime
|
|
24
|
-
}
|
|
54
|
+
};
|
|
55
|
+
var errorData = fg('platform_ufo_terminal_errors_fix_missing_data') ? _objectSpread(_objectSpread({}, baseErrorData), {}, {
|
|
56
|
+
statusCode: getErrorStatusCode(error),
|
|
57
|
+
// Fallback to traceId from error object if it exists (e.g. FetchError)
|
|
58
|
+
traceId: (_getActiveTrace$trace = (_getActiveTrace = getActiveTrace()) === null || _getActiveTrace === void 0 ? void 0 : _getActiveTrace.traceId) !== null && _getActiveTrace$trace !== void 0 ? _getActiveTrace$trace : getErrorTraceId(error),
|
|
59
|
+
teamName: additionalAttributes === null || additionalAttributes === void 0 ? void 0 : additionalAttributes.teamName,
|
|
60
|
+
packageName: additionalAttributes === null || additionalAttributes === void 0 ? void 0 : additionalAttributes.packageName,
|
|
61
|
+
errorBoundaryId: additionalAttributes === null || additionalAttributes === void 0 ? void 0 : additionalAttributes.errorBoundaryId,
|
|
62
|
+
errorHash: additionalAttributes === null || additionalAttributes === void 0 ? void 0 : additionalAttributes.errorHash,
|
|
63
|
+
fallbackType: additionalAttributes === null || additionalAttributes === void 0 ? void 0 : additionalAttributes.fallbackType
|
|
64
|
+
}) : _objectSpread(_objectSpread({}, baseErrorData), additionalAttributes);
|
|
25
65
|
|
|
26
66
|
// Calculate time since previous interaction
|
|
27
67
|
var timeSincePreviousInteraction = PreviousInteractionLog.timestamp != null ? currentTime - PreviousInteractionLog.timestamp : null;
|
|
@@ -4,10 +4,10 @@ export interface TerminalErrorAdditionalAttributes {
|
|
|
4
4
|
packageName?: string;
|
|
5
5
|
errorBoundaryId?: string;
|
|
6
6
|
errorHash?: string;
|
|
7
|
-
traceId?: string;
|
|
8
7
|
fallbackType?: 'page' | 'flag' | 'custom';
|
|
9
|
-
statusCode?: number;
|
|
10
8
|
isClientNetworkError?: boolean;
|
|
9
|
+
traceId?: string;
|
|
10
|
+
statusCode?: number;
|
|
11
11
|
}
|
|
12
12
|
export interface TerminalErrorData extends TerminalErrorAdditionalAttributes {
|
|
13
13
|
errorType: string;
|
|
@@ -26,5 +26,21 @@ export interface TerminalErrorContext {
|
|
|
26
26
|
routeName: string | null;
|
|
27
27
|
}
|
|
28
28
|
export declare function sinkTerminalErrorHandler(fn: (errorData: TerminalErrorData, context: TerminalErrorContext) => void | Promise<void>): void;
|
|
29
|
+
/**
|
|
30
|
+
* Relay error structure
|
|
31
|
+
*/
|
|
32
|
+
type RelayNetworkErrors = {
|
|
33
|
+
name: string;
|
|
34
|
+
type: string;
|
|
35
|
+
source?: {
|
|
36
|
+
errors?: {
|
|
37
|
+
extensions?: {
|
|
38
|
+
statusCode?: number;
|
|
39
|
+
};
|
|
40
|
+
}[];
|
|
41
|
+
};
|
|
42
|
+
};
|
|
43
|
+
export declare const isRelayNetworkError: (error: RelayNetworkErrors | Error) => error is RelayNetworkErrors;
|
|
29
44
|
export declare function setTerminalError(error: Error, additionalAttributes?: TerminalErrorAdditionalAttributes, labelStack?: LabelStack): void;
|
|
30
45
|
export declare function useReportTerminalError(error: Error | null | undefined, additionalAttributes?: TerminalErrorAdditionalAttributes): void;
|
|
46
|
+
export {};
|
|
@@ -4,10 +4,10 @@ export interface TerminalErrorAdditionalAttributes {
|
|
|
4
4
|
packageName?: string;
|
|
5
5
|
errorBoundaryId?: string;
|
|
6
6
|
errorHash?: string;
|
|
7
|
-
traceId?: string;
|
|
8
7
|
fallbackType?: 'page' | 'flag' | 'custom';
|
|
9
|
-
statusCode?: number;
|
|
10
8
|
isClientNetworkError?: boolean;
|
|
9
|
+
traceId?: string;
|
|
10
|
+
statusCode?: number;
|
|
11
11
|
}
|
|
12
12
|
export interface TerminalErrorData extends TerminalErrorAdditionalAttributes {
|
|
13
13
|
errorType: string;
|
|
@@ -26,5 +26,21 @@ export interface TerminalErrorContext {
|
|
|
26
26
|
routeName: string | null;
|
|
27
27
|
}
|
|
28
28
|
export declare function sinkTerminalErrorHandler(fn: (errorData: TerminalErrorData, context: TerminalErrorContext) => void | Promise<void>): void;
|
|
29
|
+
/**
|
|
30
|
+
* Relay error structure
|
|
31
|
+
*/
|
|
32
|
+
type RelayNetworkErrors = {
|
|
33
|
+
name: string;
|
|
34
|
+
type: string;
|
|
35
|
+
source?: {
|
|
36
|
+
errors?: {
|
|
37
|
+
extensions?: {
|
|
38
|
+
statusCode?: number;
|
|
39
|
+
};
|
|
40
|
+
}[];
|
|
41
|
+
};
|
|
42
|
+
};
|
|
43
|
+
export declare const isRelayNetworkError: (error: RelayNetworkErrors | Error) => error is RelayNetworkErrors;
|
|
29
44
|
export declare function setTerminalError(error: Error, additionalAttributes?: TerminalErrorAdditionalAttributes, labelStack?: LabelStack): void;
|
|
30
45
|
export declare function useReportTerminalError(error: Error | null | undefined, additionalAttributes?: TerminalErrorAdditionalAttributes): void;
|
|
46
|
+
export {};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@atlaskit/react-ufo",
|
|
3
|
-
"version": "5.
|
|
3
|
+
"version": "5.5.0",
|
|
4
4
|
"description": "Parts of React UFO that are publicly available",
|
|
5
5
|
"author": "Atlassian Pty Ltd",
|
|
6
6
|
"license": "Apache-2.0",
|
|
@@ -200,6 +200,9 @@
|
|
|
200
200
|
"platform_ufo_enable_terminal_errors": {
|
|
201
201
|
"type": "boolean"
|
|
202
202
|
},
|
|
203
|
+
"platform_ufo_terminal_errors_fix_missing_data": {
|
|
204
|
+
"type": "boolean"
|
|
205
|
+
},
|
|
203
206
|
"ufo_vc_revision_trim_enabled": {
|
|
204
207
|
"type": "boolean"
|
|
205
208
|
},
|