@andre1502/react-utilities 0.9.0
Sign up to get free protection for your applications and to get access to all the features.
- package/README.md +340 -0
- package/dist/Config/Config.d.ts +28 -0
- package/dist/Config/Config.js +200 -0
- package/dist/Config/Config.js.map +1 -0
- package/dist/Config/GoogleAuth.d.ts +15 -0
- package/dist/Config/GoogleAuth.js +71 -0
- package/dist/Config/GoogleAuth.js.map +1 -0
- package/dist/Config/Locales.d.ts +18 -0
- package/dist/Config/Locales.js +62 -0
- package/dist/Config/Locales.js.map +1 -0
- package/dist/Config/Output.d.ts +10 -0
- package/dist/Config/Output.js +28 -0
- package/dist/Config/Output.js.map +1 -0
- package/dist/Config/Sitemap.d.ts +13 -0
- package/dist/Config/Sitemap.js +73 -0
- package/dist/Config/Sitemap.js.map +1 -0
- package/dist/Format/NumberFormat.d.ts +6 -0
- package/dist/Format/NumberFormat.js +77 -0
- package/dist/Format/NumberFormat.js.map +1 -0
- package/dist/Format/NumberParser.d.ts +9 -0
- package/dist/Format/NumberParser.js +51 -0
- package/dist/Format/NumberParser.js.map +1 -0
- package/dist/React-BaJ1KfGF.js +87 -0
- package/dist/React-BaJ1KfGF.js.map +1 -0
- package/dist/React-qUl0CBmE.js +109 -0
- package/dist/React-qUl0CBmE.js.map +1 -0
- package/dist/ReactNative-CqUrY2ZJ.js +3856 -0
- package/dist/ReactNative-CqUrY2ZJ.js.map +1 -0
- package/dist/ReactNative-mNnws-b5.js +3834 -0
- package/dist/ReactNative-mNnws-b5.js.map +1 -0
- package/dist/Sentry/Build.d.ts +9 -0
- package/dist/Sentry/Build.js +88 -0
- package/dist/Sentry/Build.js.map +1 -0
- package/dist/Sentry/React.d.ts +18 -0
- package/dist/Sentry/React.js +104 -0
- package/dist/Sentry/React.js.map +1 -0
- package/dist/Sentry/ReactNative.d.ts +18 -0
- package/dist/Sentry/ReactNative.js +114 -0
- package/dist/Sentry/ReactNative.js.map +1 -0
- package/dist/Sentry/Utils.d.ts +2 -0
- package/dist/Sentry/Utils.js +24 -0
- package/dist/Sentry/Utils.js.map +1 -0
- package/dist/Utils/Files.d.ts +7 -0
- package/dist/Utils/Files.js +52 -0
- package/dist/Utils/Files.js.map +1 -0
- package/dist/Utils-Cq948gfa.js +20 -0
- package/dist/Utils-Cq948gfa.js.map +1 -0
- package/dist/Utils-Dilye04y.js +22 -0
- package/dist/Utils-Dilye04y.js.map +1 -0
- package/dist/config-cli.cjs +471 -0
- package/dist/config-cli.cjs.map +1 -0
- package/dist/config-cli.d.ts +34 -0
- package/dist/config-cli.js +220 -0
- package/dist/config-cli.js.map +1 -0
- package/dist/config-cli.mjs +443 -0
- package/dist/config-cli.mjs.map +1 -0
- package/dist/enums/CurrencySymbolEnum.d.ts +5 -0
- package/dist/enums/CurrencySymbolEnum.js +13 -0
- package/dist/enums/CurrencySymbolEnum.js.map +1 -0
- package/dist/format.cjs +122 -0
- package/dist/format.cjs.map +1 -0
- package/dist/format.d.ts +3 -0
- package/dist/format.js +55 -0
- package/dist/format.js.map +1 -0
- package/dist/format.mjs +117 -0
- package/dist/format.mjs.map +1 -0
- package/dist/index-cli.cjs +24 -0
- package/dist/index-cli.cjs.map +1 -0
- package/dist/index-cli.d.ts +2 -0
- package/dist/index-cli.js +28 -0
- package/dist/index-cli.js.map +1 -0
- package/dist/index-cli.mjs +12 -0
- package/dist/index-cli.mjs.map +1 -0
- package/dist/index-fmt.cjs +16 -0
- package/dist/index-fmt.cjs.map +1 -0
- package/dist/index-fmt.d.ts +1 -0
- package/dist/index-fmt.js +17 -0
- package/dist/index-fmt.js.map +1 -0
- package/dist/index-fmt.mjs +3 -0
- package/dist/index-fmt.mjs.map +1 -0
- package/dist/index-rn.cjs +21 -0
- package/dist/index-rn.cjs.map +1 -0
- package/dist/index-rn.d.ts +2 -0
- package/dist/index-rn.js +28 -0
- package/dist/index-rn.js.map +1 -0
- package/dist/index-rn.mjs +6 -0
- package/dist/index-rn.mjs.map +1 -0
- package/dist/index.cjs +21 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +28 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +6 -0
- package/dist/index.mjs.map +1 -0
- package/dist/interfaces/Config/ConfigOptions.d.ts +8 -0
- package/dist/interfaces/Config/ConfigOptions.js +6 -0
- package/dist/interfaces/Config/ConfigOptions.js.map +1 -0
- package/dist/interfaces/Config/OutputMap.d.ts +3 -0
- package/dist/interfaces/Config/OutputMap.js +6 -0
- package/dist/interfaces/Config/OutputMap.js.map +1 -0
- package/dist/interfaces/Config/OutputOptions.d.ts +7 -0
- package/dist/interfaces/Config/OutputOptions.js +6 -0
- package/dist/interfaces/Config/OutputOptions.js.map +1 -0
- package/dist/interfaces/Config/SitemapMap.d.ts +5 -0
- package/dist/interfaces/Config/SitemapMap.js +6 -0
- package/dist/interfaces/Config/SitemapMap.js.map +1 -0
- package/dist/interfaces/Config/StringMap.d.ts +3 -0
- package/dist/interfaces/Config/StringMap.js +6 -0
- package/dist/interfaces/Config/StringMap.js.map +1 -0
- package/dist/interfaces/Format/FormatOptions.d.ts +14 -0
- package/dist/interfaces/Format/FormatOptions.js +6 -0
- package/dist/interfaces/Format/FormatOptions.js.map +1 -0
- package/dist/interfaces/Sentry/InitOptions.d.ts +20 -0
- package/dist/interfaces/Sentry/InitOptions.js +6 -0
- package/dist/interfaces/Sentry/InitOptions.js.map +1 -0
- package/dist/interfaces/Sentry/InitOptionsRN.d.ts +4 -0
- package/dist/interfaces/Sentry/InitOptionsRN.js +6 -0
- package/dist/interfaces/Sentry/InitOptionsRN.js.map +1 -0
- package/dist/interfaces/Sentry/SourceMapOptions.d.ts +7 -0
- package/dist/interfaces/Sentry/SourceMapOptions.js +6 -0
- package/dist/interfaces/Sentry/SourceMapOptions.js.map +1 -0
- package/dist/sentry-cli.cjs +119 -0
- package/dist/sentry-cli.cjs.map +1 -0
- package/dist/sentry-cli.d.ts +9 -0
- package/dist/sentry-cli.js +50 -0
- package/dist/sentry-cli.js.map +1 -0
- package/dist/sentry-cli.mjs +98 -0
- package/dist/sentry-cli.mjs.map +1 -0
- package/dist/sentry-rn.cjs +11 -0
- package/dist/sentry-rn.cjs.map +1 -0
- package/dist/sentry-rn.d.ts +2 -0
- package/dist/sentry-rn.js +28 -0
- package/dist/sentry-rn.js.map +1 -0
- package/dist/sentry-rn.mjs +4 -0
- package/dist/sentry-rn.mjs.map +1 -0
- package/dist/sentry.cjs +11 -0
- package/dist/sentry.cjs.map +1 -0
- package/dist/sentry.d.ts +2 -0
- package/dist/sentry.js +28 -0
- package/dist/sentry.js.map +1 -0
- package/dist/sentry.mjs +4 -0
- package/dist/sentry.mjs.map +1 -0
- package/dist/types/Config/OptionType.d.ts +2 -0
- package/dist/types/Config/OptionType.js +6 -0
- package/dist/types/Config/OptionType.js.map +1 -0
- package/dist/types/Format/OptionType.d.ts +3 -0
- package/dist/types/Format/OptionType.js +6 -0
- package/dist/types/Format/OptionType.js.map +1 -0
- package/dist/types/Sentry/OptionType.d.ts +1 -0
- package/dist/types/Sentry/OptionType.js +6 -0
- package/dist/types/Sentry/OptionType.js.map +1 -0
- package/package.json +139 -0
- package/src/Config/Config.ts +258 -0
- package/src/Config/GoogleAuth.ts +54 -0
- package/src/Config/Locales.ts +72 -0
- package/src/Config/Output.ts +29 -0
- package/src/Config/Sitemap.ts +67 -0
- package/src/Format/NumberFormat.ts +96 -0
- package/src/Format/NumberParser.ts +42 -0
- package/src/Sentry/Build.ts +67 -0
- package/src/Sentry/React.ts +127 -0
- package/src/Sentry/ReactNative.ts +133 -0
- package/src/Sentry/Utils.ts +26 -0
- package/src/Utils/Files.ts +51 -0
- package/src/config-cli.ts +152 -0
- package/src/enums/CurrencySymbolEnum.ts +5 -0
- package/src/format.ts +39 -0
- package/src/index-cli.ts +2 -0
- package/src/index-fmt.ts +1 -0
- package/src/index-rn.ts +2 -0
- package/src/index.ts +2 -0
- package/src/interfaces/Config/ConfigOptions.ts +9 -0
- package/src/interfaces/Config/OutputMap.ts +3 -0
- package/src/interfaces/Config/OutputOptions.ts +8 -0
- package/src/interfaces/Config/SitemapMap.ts +5 -0
- package/src/interfaces/Config/StringMap.ts +3 -0
- package/src/interfaces/Format/FormatOptions.ts +19 -0
- package/src/interfaces/Sentry/InitOptions.ts +23 -0
- package/src/interfaces/Sentry/InitOptionsRN.ts +5 -0
- package/src/interfaces/Sentry/SourceMapOptions.ts +7 -0
- package/src/sentry-cli.ts +16 -0
- package/src/sentry-rn.ts +2 -0
- package/src/sentry.ts +2 -0
- package/src/types/Config/OptionType.ts +2 -0
- package/src/types/Format/OptionType.ts +15 -0
- package/src/types/Sentry/OptionType.ts +1 -0
@@ -0,0 +1,96 @@
|
|
1
|
+
import { NumberFormat } from '@formatjs/intl-numberformat';
|
2
|
+
import { CurrencySymbolEnum } from '../enums/CurrencySymbolEnum';
|
3
|
+
import { FormatOptions } from '../interfaces/Format/FormatOptions';
|
4
|
+
import { NumberParser } from './NumberParser';
|
5
|
+
|
6
|
+
const formatAccountNumber = (
|
7
|
+
accountNumber: string,
|
8
|
+
separator: string = ' ',
|
9
|
+
) => {
|
10
|
+
return accountNumber
|
11
|
+
?.replace(/\s?/g, '')
|
12
|
+
.replace(/(\d{4})/g, `$1${separator}`)
|
13
|
+
.trim();
|
14
|
+
};
|
15
|
+
|
16
|
+
const getCurrencySymbol = (currency: string, showCurrency: boolean = true) => {
|
17
|
+
let symbol;
|
18
|
+
|
19
|
+
switch (currency) {
|
20
|
+
case 'TWD':
|
21
|
+
symbol = CurrencySymbolEnum.TWD;
|
22
|
+
break;
|
23
|
+
case 'USD':
|
24
|
+
symbol = CurrencySymbolEnum.USD;
|
25
|
+
break;
|
26
|
+
case 'VND':
|
27
|
+
symbol = CurrencySymbolEnum.VND;
|
28
|
+
break;
|
29
|
+
default:
|
30
|
+
symbol = '';
|
31
|
+
}
|
32
|
+
|
33
|
+
if (!showCurrency) {
|
34
|
+
symbol = '';
|
35
|
+
}
|
36
|
+
|
37
|
+
return symbol;
|
38
|
+
};
|
39
|
+
|
40
|
+
const formatNumber = (options: FormatOptions) => {
|
41
|
+
options.value = options.value ?? 0;
|
42
|
+
options.styleCurrency = options.styleCurrency ?? 'currency';
|
43
|
+
options.currencyDisplay = options.currencyDisplay ?? 'code';
|
44
|
+
options.showValue = options.showValue ?? true;
|
45
|
+
options.showCurrency = options.showCurrency ?? true;
|
46
|
+
options.minimumFractionDigits = options.minimumFractionDigits ?? 0;
|
47
|
+
options.maximumFractionDigits = options.maximumFractionDigits ?? 0;
|
48
|
+
options.trailingZeroDisplay = options.trailingZeroDisplay ?? 'stripIfInteger';
|
49
|
+
|
50
|
+
// console.log(`options: ${JSON.stringify(options)}.`);
|
51
|
+
|
52
|
+
let formatOptions = {
|
53
|
+
style: options.styleCurrency,
|
54
|
+
currency: options.currency,
|
55
|
+
currencyDisplay: options.currencyDisplay,
|
56
|
+
minimumFractionDigits: options.minimumFractionDigits,
|
57
|
+
maximumFractionDigits: options.maximumFractionDigits,
|
58
|
+
trailingZeroDisplay: options.trailingZeroDisplay,
|
59
|
+
};
|
60
|
+
|
61
|
+
if (options.options) {
|
62
|
+
formatOptions = {
|
63
|
+
...formatOptions,
|
64
|
+
...options.options,
|
65
|
+
};
|
66
|
+
}
|
67
|
+
|
68
|
+
let localizedNumber = NumberFormat(options.lang, formatOptions)
|
69
|
+
.format(options.value)
|
70
|
+
.replace(/^([\d,.]+)(\s*)([A-Z]{3})$/, '$3$2$1')
|
71
|
+
.replace(/([\d,.]+)$/, options.showValue ? ' $1' : ' ********')
|
72
|
+
.replace(
|
73
|
+
options.currency,
|
74
|
+
getCurrencySymbol(options.currency, options.showCurrency),
|
75
|
+
)
|
76
|
+
.trim();
|
77
|
+
|
78
|
+
// console.log(`localizedNumber: ${localizedNumber}.`);
|
79
|
+
|
80
|
+
return localizedNumber;
|
81
|
+
};
|
82
|
+
|
83
|
+
const parseFormatNumber = (lang: string, value: string) => {
|
84
|
+
if (!value) {
|
85
|
+
return null;
|
86
|
+
}
|
87
|
+
|
88
|
+
return new NumberParser(lang).parse(value);
|
89
|
+
};
|
90
|
+
|
91
|
+
export {
|
92
|
+
formatAccountNumber,
|
93
|
+
formatNumber,
|
94
|
+
getCurrencySymbol,
|
95
|
+
parseFormatNumber,
|
96
|
+
};
|
@@ -0,0 +1,42 @@
|
|
1
|
+
import { NumberFormat } from '@formatjs/intl-numberformat';
|
2
|
+
|
3
|
+
class NumberParser {
|
4
|
+
private _group: RegExp;
|
5
|
+
private _decimal: RegExp;
|
6
|
+
private _numeral: RegExp;
|
7
|
+
private _index: (d: any) => any;
|
8
|
+
|
9
|
+
constructor(locale: string) {
|
10
|
+
const parts = new NumberFormat(locale).formatToParts(12345.6);
|
11
|
+
|
12
|
+
const numerals = [
|
13
|
+
...new NumberFormat(locale, { useGrouping: false }).format(9876543210),
|
14
|
+
].reverse();
|
15
|
+
|
16
|
+
const index = new Map(numerals.map((d, i) => [d, i]));
|
17
|
+
|
18
|
+
this._group = new RegExp(
|
19
|
+
`[${parts.find((d) => d.type === 'group')?.value}]`,
|
20
|
+
'g',
|
21
|
+
);
|
22
|
+
|
23
|
+
this._decimal = new RegExp(
|
24
|
+
`[${parts.find((d) => d.type === 'decimal')?.value}]`,
|
25
|
+
);
|
26
|
+
|
27
|
+
this._numeral = new RegExp(`[${numerals.join('')}]`, 'g');
|
28
|
+
this._index = (d) => index.get(d);
|
29
|
+
}
|
30
|
+
|
31
|
+
parse(value: string) {
|
32
|
+
value = value
|
33
|
+
?.trim()
|
34
|
+
?.replace(this._group, '')
|
35
|
+
?.replace(this._decimal, '.')
|
36
|
+
?.replace(this._numeral, this._index);
|
37
|
+
|
38
|
+
return value ? +value : NaN;
|
39
|
+
}
|
40
|
+
}
|
41
|
+
|
42
|
+
export { NumberParser };
|
@@ -0,0 +1,67 @@
|
|
1
|
+
// sentry-cli sourcemaps inject --org <org> --project <project> ./build/static/js && sentry-cli sourcemaps upload --org <org> --project <project> ./build/static/js
|
2
|
+
|
3
|
+
import SentryCli from '@sentry/cli';
|
4
|
+
import { SourceMapOptions } from '../interfaces/Sentry/SourceMapOptions';
|
5
|
+
import { deleteFile } from '../Utils/Files';
|
6
|
+
|
7
|
+
/**
|
8
|
+
* Create Sentry release and upload to Sentry host.
|
9
|
+
*
|
10
|
+
* @param {SourceMapOptions} options
|
11
|
+
* @return {Promise<void>}
|
12
|
+
*/
|
13
|
+
const releaseSourceMap = async (options: SourceMapOptions): Promise<void> => {
|
14
|
+
if (
|
15
|
+
!options.requiredEnvForSourceMap ||
|
16
|
+
options.requiredEnvForSourceMap.length <= 0
|
17
|
+
) {
|
18
|
+
options.requiredEnvForSourceMap = ['production'];
|
19
|
+
}
|
20
|
+
|
21
|
+
if (!options.urlPrefix) {
|
22
|
+
options.urlPrefix = '';
|
23
|
+
}
|
24
|
+
|
25
|
+
if (!options.includeFolder || options.includeFolder.length <= 0) {
|
26
|
+
console.error('includeFolder value is empty.');
|
27
|
+
return;
|
28
|
+
}
|
29
|
+
|
30
|
+
if (!options.requiredEnvForSourceMap.includes(options.env)) {
|
31
|
+
console.log(
|
32
|
+
'No need to upload sentry source map, required env:',
|
33
|
+
options.requiredEnvForSourceMap,
|
34
|
+
);
|
35
|
+
|
36
|
+
options.includeFolder.forEach((folder) => deleteFile(folder, ['.map']));
|
37
|
+
|
38
|
+
return;
|
39
|
+
}
|
40
|
+
|
41
|
+
try {
|
42
|
+
const cli = new SentryCli();
|
43
|
+
|
44
|
+
console.log('Now creating sentry release ' + options.release);
|
45
|
+
|
46
|
+
await cli.releases.new(options.release);
|
47
|
+
|
48
|
+
console.log('Now uploading source maps');
|
49
|
+
await cli.releases.uploadSourceMaps(options.release, {
|
50
|
+
urlPrefix: options.urlPrefix,
|
51
|
+
include: options.includeFolder,
|
52
|
+
rewrite: true,
|
53
|
+
validate: true,
|
54
|
+
useArtifactBundle: true,
|
55
|
+
});
|
56
|
+
|
57
|
+
console.log('Releasing release');
|
58
|
+
|
59
|
+
await cli.releases.finalize(options.release);
|
60
|
+
|
61
|
+
options.includeFolder.forEach((folder) => deleteFile(folder, ['.map']));
|
62
|
+
} catch (ex) {
|
63
|
+
console.error('Source maps uploading failed:', ex);
|
64
|
+
}
|
65
|
+
};
|
66
|
+
|
67
|
+
export { releaseSourceMap };
|
@@ -0,0 +1,127 @@
|
|
1
|
+
import * as Sentry from '@sentry/react';
|
2
|
+
import { InitOptions } from '../interfaces/Sentry/InitOptions';
|
3
|
+
import { StringRegexArr } from '../types/Sentry/OptionType';
|
4
|
+
import { recordSentryHttp } from './Utils';
|
5
|
+
|
6
|
+
/**
|
7
|
+
* Initialize Sentry for React.
|
8
|
+
*
|
9
|
+
* @param {InitOptions} options
|
10
|
+
* @return {void}
|
11
|
+
*/
|
12
|
+
const initSentry = (options: InitOptions): void => {
|
13
|
+
let shouldSendToSentry = options?.requiredEnvForSendToSentry?.includes(
|
14
|
+
options.env,
|
15
|
+
);
|
16
|
+
|
17
|
+
let ignoreErrors: StringRegexArr = [
|
18
|
+
/antd:/,
|
19
|
+
/is deprecated in StrictMode/,
|
20
|
+
/React Intl/,
|
21
|
+
];
|
22
|
+
|
23
|
+
if (options?.ignoreErrorsOptions) {
|
24
|
+
ignoreErrors = ignoreErrors.concat(options.ignoreErrorsOptions);
|
25
|
+
}
|
26
|
+
|
27
|
+
if (options?.options?.ignoreErrors) {
|
28
|
+
ignoreErrors = ignoreErrors.concat(options.options.ignoreErrors);
|
29
|
+
delete options.options.ignoreErrors;
|
30
|
+
}
|
31
|
+
|
32
|
+
let integrations: any[] = [];
|
33
|
+
|
34
|
+
if (
|
35
|
+
options?.httpClientIntegrationOptions?.failedRequestStatusCodes &&
|
36
|
+
options?.httpClientIntegrationOptions?.failedRequestTargets
|
37
|
+
) {
|
38
|
+
integrations.push(
|
39
|
+
Sentry.httpClientIntegration({
|
40
|
+
failedRequestStatusCodes:
|
41
|
+
options.httpClientIntegrationOptions.failedRequestStatusCodes,
|
42
|
+
failedRequestTargets:
|
43
|
+
options.httpClientIntegrationOptions.failedRequestTargets,
|
44
|
+
}),
|
45
|
+
);
|
46
|
+
}
|
47
|
+
|
48
|
+
if (options?.captureConsoleIntegrationOptions?.levels) {
|
49
|
+
integrations.push(
|
50
|
+
Sentry.captureConsoleIntegration({
|
51
|
+
levels: options.captureConsoleIntegrationOptions.levels,
|
52
|
+
}),
|
53
|
+
);
|
54
|
+
}
|
55
|
+
|
56
|
+
if (options?.options?.hasOwnProperty('integrations')) {
|
57
|
+
options.options.integrations = [
|
58
|
+
...options.options.integrations,
|
59
|
+
...integrations,
|
60
|
+
];
|
61
|
+
} else {
|
62
|
+
options.options = options.options || {};
|
63
|
+
options.options.integrations = integrations;
|
64
|
+
}
|
65
|
+
|
66
|
+
let sentryOptions: Sentry.BrowserOptions = {
|
67
|
+
dsn: options.dsn,
|
68
|
+
debug: options.debug,
|
69
|
+
release: options.release,
|
70
|
+
environment: options.env,
|
71
|
+
ignoreErrors: ignoreErrors,
|
72
|
+
sampleRate: 1.0,
|
73
|
+
maxBreadcrumbs: 50,
|
74
|
+
attachStacktrace: true,
|
75
|
+
autoSessionTracking: true,
|
76
|
+
sendClientReports: true,
|
77
|
+
enableTracing: true,
|
78
|
+
// Performance Monitoring
|
79
|
+
tracesSampleRate: 1.0, // Capture 100% of the transactions
|
80
|
+
// Set 'tracePropagationTargets' to control for which URLs distributed tracing should be enabled
|
81
|
+
tracePropagationTargets: ['localhost'],
|
82
|
+
sendDefaultPii: true,
|
83
|
+
beforeSend: (event) => {
|
84
|
+
if (
|
85
|
+
event?.message?.includes('antd:') ||
|
86
|
+
event?.message?.includes('is deprecated in StrictMode') ||
|
87
|
+
event?.message?.includes('React Intl') ||
|
88
|
+
!shouldSendToSentry
|
89
|
+
) {
|
90
|
+
return null;
|
91
|
+
}
|
92
|
+
|
93
|
+
return event;
|
94
|
+
},
|
95
|
+
};
|
96
|
+
|
97
|
+
if (options?.beforeSend) {
|
98
|
+
sentryOptions.beforeSend = options.beforeSend;
|
99
|
+
}
|
100
|
+
|
101
|
+
if (options?.options) {
|
102
|
+
sentryOptions = {
|
103
|
+
...sentryOptions,
|
104
|
+
...options.options,
|
105
|
+
};
|
106
|
+
}
|
107
|
+
|
108
|
+
Sentry.init(sentryOptions);
|
109
|
+
};
|
110
|
+
|
111
|
+
/**
|
112
|
+
* Record additional http data for Sentry.
|
113
|
+
*
|
114
|
+
* @param {any | null} config
|
115
|
+
* @param {any | null} request
|
116
|
+
* @param {any | null} response
|
117
|
+
* @return {void}
|
118
|
+
*/
|
119
|
+
const recordAdditionalSentryHttp = (
|
120
|
+
config?: any,
|
121
|
+
request?: any,
|
122
|
+
response?: any,
|
123
|
+
) => {
|
124
|
+
recordSentryHttp(Sentry, config, request, response);
|
125
|
+
};
|
126
|
+
|
127
|
+
export { initSentry, recordAdditionalSentryHttp };
|
@@ -0,0 +1,133 @@
|
|
1
|
+
import {
|
2
|
+
captureConsoleIntegration,
|
3
|
+
httpClientIntegration,
|
4
|
+
} from '@sentry/integrations';
|
5
|
+
import * as Sentry from '@sentry/react-native';
|
6
|
+
import { InitOptionsRN } from '../interfaces/Sentry/InitOptionsRN';
|
7
|
+
import { StringRegexArr } from '../types/Sentry/OptionType';
|
8
|
+
import { recordSentryHttp } from './Utils';
|
9
|
+
|
10
|
+
/**
|
11
|
+
* Initialize Sentry for React Native.
|
12
|
+
*
|
13
|
+
* @param {InitOptionsRN} options
|
14
|
+
* @return {void}
|
15
|
+
*/
|
16
|
+
const initSentry = (options: InitOptionsRN): void => {
|
17
|
+
let shouldSendToSentry = options?.requiredEnvForSendToSentry?.includes(
|
18
|
+
options.env,
|
19
|
+
);
|
20
|
+
|
21
|
+
let ignoreErrors: StringRegexArr = [/StallTracking/];
|
22
|
+
|
23
|
+
if (options?.ignoreErrorsOptions) {
|
24
|
+
ignoreErrors = ignoreErrors.concat(options.ignoreErrorsOptions);
|
25
|
+
}
|
26
|
+
|
27
|
+
if (options?.options?.ignoreErrors) {
|
28
|
+
ignoreErrors = ignoreErrors.concat(options.options.ignoreErrors);
|
29
|
+
delete options.options.ignoreErrors;
|
30
|
+
}
|
31
|
+
|
32
|
+
let integrations: any[] = [];
|
33
|
+
|
34
|
+
if (
|
35
|
+
options?.httpClientIntegrationOptions?.failedRequestStatusCodes &&
|
36
|
+
options?.httpClientIntegrationOptions?.failedRequestTargets
|
37
|
+
) {
|
38
|
+
integrations.push(
|
39
|
+
httpClientIntegration({
|
40
|
+
failedRequestStatusCodes:
|
41
|
+
options.httpClientIntegrationOptions.failedRequestStatusCodes,
|
42
|
+
failedRequestTargets:
|
43
|
+
options.httpClientIntegrationOptions.failedRequestTargets,
|
44
|
+
}),
|
45
|
+
);
|
46
|
+
}
|
47
|
+
|
48
|
+
if (options?.captureConsoleIntegrationOptions?.levels) {
|
49
|
+
integrations.push(
|
50
|
+
captureConsoleIntegration({
|
51
|
+
levels: options.captureConsoleIntegrationOptions.levels,
|
52
|
+
}),
|
53
|
+
);
|
54
|
+
}
|
55
|
+
|
56
|
+
if (options?.options?.hasOwnProperty('integrations')) {
|
57
|
+
options.options.integrations = [
|
58
|
+
...options.options.integrations,
|
59
|
+
...integrations,
|
60
|
+
];
|
61
|
+
} else {
|
62
|
+
options.options = options.options || {};
|
63
|
+
options.options.integrations = integrations;
|
64
|
+
}
|
65
|
+
|
66
|
+
let sentryOptions: Sentry.ReactNativeOptions = {
|
67
|
+
dsn: options.dsn,
|
68
|
+
debug: options.debug,
|
69
|
+
environment: options.env,
|
70
|
+
ignoreErrors: ignoreErrors,
|
71
|
+
sampleRate: 1.0,
|
72
|
+
maxBreadcrumbs: 50,
|
73
|
+
autoSessionTracking: true,
|
74
|
+
attachScreenshot: true,
|
75
|
+
enableCaptureFailedRequests: true,
|
76
|
+
enableTracing: true,
|
77
|
+
tracesSampleRate: 1.0,
|
78
|
+
enableNative: true,
|
79
|
+
autoInitializeNativeSdk: true,
|
80
|
+
enableNativeCrashHandling: true,
|
81
|
+
enableNativeNagger: true,
|
82
|
+
enableAutoSessionTracking: true,
|
83
|
+
enableNdkScopeSync: true,
|
84
|
+
attachThreads: true,
|
85
|
+
enableAutoPerformanceTracing: true,
|
86
|
+
enableWatchdogTerminationTracking: true,
|
87
|
+
enableAppHangTracking: true,
|
88
|
+
appHangTimeoutInterval: 5,
|
89
|
+
sendDefaultPii: true,
|
90
|
+
beforeSend: (event) => {
|
91
|
+
if (event?.message?.includes('StallTracking') || !shouldSendToSentry) {
|
92
|
+
return null;
|
93
|
+
}
|
94
|
+
|
95
|
+
return event;
|
96
|
+
},
|
97
|
+
};
|
98
|
+
|
99
|
+
if (options?.release) {
|
100
|
+
sentryOptions.release = options.release;
|
101
|
+
}
|
102
|
+
|
103
|
+
if (options?.beforeSend) {
|
104
|
+
sentryOptions.beforeSend = options.beforeSend;
|
105
|
+
}
|
106
|
+
|
107
|
+
if (options?.options) {
|
108
|
+
sentryOptions = {
|
109
|
+
...sentryOptions,
|
110
|
+
...options.options,
|
111
|
+
};
|
112
|
+
}
|
113
|
+
|
114
|
+
Sentry.init(sentryOptions);
|
115
|
+
};
|
116
|
+
|
117
|
+
/**
|
118
|
+
* Record additional http data for Sentry.
|
119
|
+
*
|
120
|
+
* @param {any | null} config
|
121
|
+
* @param {any | null} request
|
122
|
+
* @param {any | null} response
|
123
|
+
* @return {void}
|
124
|
+
*/
|
125
|
+
const recordAdditionalSentryHttp = (
|
126
|
+
config?: any,
|
127
|
+
request?: any,
|
128
|
+
response?: any,
|
129
|
+
) => {
|
130
|
+
recordSentryHttp(Sentry, config, request, response);
|
131
|
+
};
|
132
|
+
|
133
|
+
export { initSentry, recordAdditionalSentryHttp };
|
@@ -0,0 +1,26 @@
|
|
1
|
+
const recordSentryHttp = (
|
2
|
+
Sentry: any,
|
3
|
+
config?: any,
|
4
|
+
request?: any,
|
5
|
+
response?: any,
|
6
|
+
) => {
|
7
|
+
if (config) {
|
8
|
+
Sentry.withScope((scope: any) => {
|
9
|
+
scope.setContext('config', config);
|
10
|
+
});
|
11
|
+
}
|
12
|
+
|
13
|
+
if (request) {
|
14
|
+
Sentry.withScope((scope: any) => {
|
15
|
+
scope.setContext('request', request);
|
16
|
+
});
|
17
|
+
}
|
18
|
+
|
19
|
+
if (response) {
|
20
|
+
Sentry.withScope((scope: any) => {
|
21
|
+
scope.setContext('response', response);
|
22
|
+
});
|
23
|
+
}
|
24
|
+
};
|
25
|
+
|
26
|
+
export { recordSentryHttp };
|
@@ -0,0 +1,51 @@
|
|
1
|
+
import { lstatSync, readdir, unlinkSync } from 'fs';
|
2
|
+
import * as path from 'path';
|
3
|
+
|
4
|
+
/**
|
5
|
+
* @param {string} path - The path.
|
6
|
+
* @returns {boolean} Whether path is a directory, otherwise always false.
|
7
|
+
*/
|
8
|
+
const isDir = (path: string): boolean => {
|
9
|
+
try {
|
10
|
+
const stat = lstatSync(path);
|
11
|
+
return stat.isDirectory();
|
12
|
+
} catch (error) {
|
13
|
+
// lstatSync throws an error if path doesn't exist
|
14
|
+
return false;
|
15
|
+
}
|
16
|
+
};
|
17
|
+
|
18
|
+
/**
|
19
|
+
* @param {string} dirPath - Directory path.
|
20
|
+
* @param {string[]} exts - List of Extension file need to be removed.
|
21
|
+
* @returns {void}
|
22
|
+
*/
|
23
|
+
const deleteFile = (dirPath: string, exts: string[]): void => {
|
24
|
+
readdir(dirPath, (err, files) => {
|
25
|
+
if (err) {
|
26
|
+
console.error(err);
|
27
|
+
}
|
28
|
+
|
29
|
+
files.forEach((file) => {
|
30
|
+
const fileDir = path.join(`${dirPath}/${file}`);
|
31
|
+
// Get the extension name of the file, lowercase it, then see if it is in the array of extensions
|
32
|
+
// defined above. If so, remove it.
|
33
|
+
|
34
|
+
if (isDir(fileDir)) {
|
35
|
+
deleteFile(fileDir, exts);
|
36
|
+
return;
|
37
|
+
}
|
38
|
+
|
39
|
+
if (
|
40
|
+
file.toLowerCase() === '.ds_store' ||
|
41
|
+
exts.includes(path.extname(file).toLowerCase())
|
42
|
+
) {
|
43
|
+
unlinkSync(fileDir);
|
44
|
+
|
45
|
+
console.log(`File: ${fileDir} deleted successfully.`);
|
46
|
+
}
|
47
|
+
});
|
48
|
+
});
|
49
|
+
};
|
50
|
+
|
51
|
+
export { deleteFile };
|
@@ -0,0 +1,152 @@
|
|
1
|
+
import { GoogleAuth } from 'google-auth-library';
|
2
|
+
import { JSONClient } from 'google-auth-library/build/src/auth/googleauth';
|
3
|
+
import { exportConfig, processConfig } from './Config/Config';
|
4
|
+
import { authorizeServiceAccount, fetchGoogleSheet } from './Config/GoogleAuth';
|
5
|
+
import { exportLocales, processLocales } from './Config/Locales';
|
6
|
+
import { ConfigOptions } from './interfaces/Config/ConfigOptions';
|
7
|
+
|
8
|
+
export { transformConfig } from './Config/Config';
|
9
|
+
export { transformSitemap } from './Config/Sitemap';
|
10
|
+
export * from './interfaces/Config/ConfigOptions';
|
11
|
+
export * from './interfaces/Config/OutputOptions';
|
12
|
+
export type { ExportAs, FormatAs } from './types/Config/OptionType';
|
13
|
+
|
14
|
+
/**
|
15
|
+
* Private function to fetch locales
|
16
|
+
*
|
17
|
+
* @param {GoogleAuth<JSONClient>} auth
|
18
|
+
* @param {ConfigOption} options
|
19
|
+
* @return {Promise<void>}
|
20
|
+
*/
|
21
|
+
const innerFetchLocales = async (
|
22
|
+
auth: GoogleAuth<JSONClient>,
|
23
|
+
options: ConfigOptions,
|
24
|
+
): Promise<void> => {
|
25
|
+
// console.log('auth', auth);
|
26
|
+
|
27
|
+
const values = await fetchGoogleSheet(
|
28
|
+
auth,
|
29
|
+
options.spreadsheetId,
|
30
|
+
options.spreadsheetTab,
|
31
|
+
);
|
32
|
+
|
33
|
+
if (!values || values.length === 0) {
|
34
|
+
console.log('No data found.');
|
35
|
+
return;
|
36
|
+
}
|
37
|
+
|
38
|
+
// console.log('values,', values);
|
39
|
+
|
40
|
+
const data = processLocales(values);
|
41
|
+
|
42
|
+
exportLocales(data, options.output);
|
43
|
+
};
|
44
|
+
|
45
|
+
/**
|
46
|
+
* Private function to fetch config
|
47
|
+
*
|
48
|
+
* @param {GoogleAuth<JSONClient>} auth
|
49
|
+
* @param {ConfigOption} options
|
50
|
+
* @return {Promise<void>}
|
51
|
+
*/
|
52
|
+
const innerFetchConfig = async (
|
53
|
+
auth: GoogleAuth<JSONClient>,
|
54
|
+
options: ConfigOptions,
|
55
|
+
): Promise<void> => {
|
56
|
+
// console.log('auth', auth);
|
57
|
+
|
58
|
+
const values = await fetchGoogleSheet(
|
59
|
+
auth,
|
60
|
+
options.spreadsheetId,
|
61
|
+
options.spreadsheetTab,
|
62
|
+
);
|
63
|
+
|
64
|
+
if (!values || values.length === 0) {
|
65
|
+
console.log('No data found.');
|
66
|
+
return;
|
67
|
+
}
|
68
|
+
|
69
|
+
// console.log('values,', values);
|
70
|
+
|
71
|
+
const data = processConfig(values);
|
72
|
+
|
73
|
+
exportConfig(data, options.output);
|
74
|
+
};
|
75
|
+
|
76
|
+
/**
|
77
|
+
* Fetch locales
|
78
|
+
*
|
79
|
+
* @param {ConfigOptions} options
|
80
|
+
* @return {void}
|
81
|
+
*/
|
82
|
+
export const fetchLocales = (options: ConfigOptions): void => {
|
83
|
+
try {
|
84
|
+
const auth = authorizeServiceAccount();
|
85
|
+
|
86
|
+
innerFetchLocales(auth, options);
|
87
|
+
} catch (error) {
|
88
|
+
console.error(error);
|
89
|
+
}
|
90
|
+
};
|
91
|
+
|
92
|
+
/**
|
93
|
+
* Fetch config
|
94
|
+
*
|
95
|
+
* @param {ConfigOptions} options
|
96
|
+
* @return {void}
|
97
|
+
*/
|
98
|
+
export const fetchConfig = (options: ConfigOptions): void => {
|
99
|
+
try {
|
100
|
+
const auth = authorizeServiceAccount();
|
101
|
+
|
102
|
+
innerFetchConfig(auth, options);
|
103
|
+
} catch (error) {
|
104
|
+
console.error(error);
|
105
|
+
}
|
106
|
+
};
|
107
|
+
|
108
|
+
/**
|
109
|
+
* Fetch all format from array options
|
110
|
+
*
|
111
|
+
* @param {ConfigOptions[]} options
|
112
|
+
* @return {void}
|
113
|
+
*/
|
114
|
+
export const fetchAll = (options: ConfigOptions[]): void => {
|
115
|
+
try {
|
116
|
+
const auth = authorizeServiceAccount();
|
117
|
+
|
118
|
+
options.forEach((option) => {
|
119
|
+
if (option.formatAs === 'locales') {
|
120
|
+
innerFetchLocales(auth, option);
|
121
|
+
} else if (option.formatAs === 'config') {
|
122
|
+
innerFetchConfig(auth, option);
|
123
|
+
}
|
124
|
+
});
|
125
|
+
} catch (error) {
|
126
|
+
console.error(error);
|
127
|
+
}
|
128
|
+
};
|
129
|
+
|
130
|
+
/**
|
131
|
+
* Fetch raw value
|
132
|
+
*
|
133
|
+
* @param {ConfigOptions} options
|
134
|
+
* @return {Promise<any[][] | null | undefined>}
|
135
|
+
*/
|
136
|
+
export const fetchRawValue = async (
|
137
|
+
options: ConfigOptions,
|
138
|
+
): Promise<any[][] | null | undefined> => {
|
139
|
+
try {
|
140
|
+
const auth = authorizeServiceAccount();
|
141
|
+
|
142
|
+
return await fetchGoogleSheet(
|
143
|
+
auth,
|
144
|
+
options.spreadsheetId,
|
145
|
+
options.spreadsheetTab,
|
146
|
+
);
|
147
|
+
} catch (error) {
|
148
|
+
console.error(error);
|
149
|
+
}
|
150
|
+
|
151
|
+
return null;
|
152
|
+
};
|