customerio-expo-plugin 2.7.1 → 2.7.3
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/package.json +4 -3
- package/plugin/lib/commonjs/android/withAndroidManifestUpdates.js +5 -4
- package/plugin/lib/commonjs/android/withAndroidManifestUpdates.js.map +1 -1
- package/plugin/lib/commonjs/android/withAppGoogleServices.js +2 -1
- package/plugin/lib/commonjs/android/withAppGoogleServices.js.map +1 -1
- package/plugin/lib/commonjs/android/withCIOAndroid.js +17 -11
- package/plugin/lib/commonjs/android/withCIOAndroid.js.map +1 -1
- package/plugin/lib/commonjs/android/withGistMavenRepository.js +2 -1
- package/plugin/lib/commonjs/android/withGistMavenRepository.js.map +1 -1
- package/plugin/lib/commonjs/android/withGoogleServicesJSON.js +4 -3
- package/plugin/lib/commonjs/android/withGoogleServicesJSON.js.map +1 -1
- package/plugin/lib/commonjs/android/withMainApplicationModifications.js +2 -1
- package/plugin/lib/commonjs/android/withMainApplicationModifications.js.map +1 -1
- package/plugin/lib/commonjs/helpers/utils/fileManagement.js +5 -4
- package/plugin/lib/commonjs/helpers/utils/fileManagement.js.map +1 -1
- package/plugin/lib/commonjs/helpers/utils/injectCIOPodfileCode.js +2 -1
- package/plugin/lib/commonjs/helpers/utils/injectCIOPodfileCode.js.map +1 -1
- package/plugin/lib/commonjs/helpers/utils/patchPluginNativeCode.js +5 -1
- package/plugin/lib/commonjs/helpers/utils/patchPluginNativeCode.js.map +1 -1
- package/plugin/lib/commonjs/index.js +3 -11
- package/plugin/lib/commonjs/index.js.map +1 -1
- package/plugin/lib/commonjs/ios/withAppDelegateModifications.js +2 -1
- package/plugin/lib/commonjs/ios/withAppDelegateModifications.js.map +1 -1
- package/plugin/lib/commonjs/ios/withCIOIos.js +7 -3
- package/plugin/lib/commonjs/ios/withCIOIos.js.map +1 -1
- package/plugin/lib/commonjs/ios/withCIOIosSwift.js +11 -10
- package/plugin/lib/commonjs/ios/withCIOIosSwift.js.map +1 -1
- package/plugin/lib/commonjs/ios/withGoogleServicesJsonFile.js +8 -7
- package/plugin/lib/commonjs/ios/withGoogleServicesJsonFile.js.map +1 -1
- package/plugin/lib/commonjs/ios/withNotificationsXcodeProject.js +29 -23
- package/plugin/lib/commonjs/ios/withNotificationsXcodeProject.js.map +1 -1
- package/plugin/lib/commonjs/utils/android.js +2 -1
- package/plugin/lib/commonjs/utils/android.js.map +1 -1
- package/plugin/lib/commonjs/utils/config.js +3 -2
- package/plugin/lib/commonjs/utils/config.js.map +1 -1
- package/plugin/lib/commonjs/utils/logger.js +35 -0
- package/plugin/lib/commonjs/utils/logger.js.map +1 -0
- package/plugin/lib/commonjs/utils/validation.js +68 -25
- package/plugin/lib/commonjs/utils/validation.js.map +1 -1
- package/plugin/lib/commonjs/utils/xcode.js +2 -1
- package/plugin/lib/commonjs/utils/xcode.js.map +1 -1
- package/plugin/lib/module/android/withAndroidManifestUpdates.js +6 -4
- package/plugin/lib/module/android/withAndroidManifestUpdates.js.map +1 -1
- package/plugin/lib/module/android/withAppGoogleServices.js +2 -1
- package/plugin/lib/module/android/withAppGoogleServices.js.map +1 -1
- package/plugin/lib/module/android/withCIOAndroid.js +17 -11
- package/plugin/lib/module/android/withCIOAndroid.js.map +1 -1
- package/plugin/lib/module/android/withGistMavenRepository.js +2 -1
- package/plugin/lib/module/android/withGistMavenRepository.js.map +1 -1
- package/plugin/lib/module/android/withGoogleServicesJSON.js +4 -3
- package/plugin/lib/module/android/withGoogleServicesJSON.js.map +1 -1
- package/plugin/lib/module/android/withMainApplicationModifications.js +2 -1
- package/plugin/lib/module/android/withMainApplicationModifications.js.map +1 -1
- package/plugin/lib/module/helpers/utils/fileManagement.js +6 -5
- package/plugin/lib/module/helpers/utils/fileManagement.js.map +1 -1
- package/plugin/lib/module/helpers/utils/injectCIOPodfileCode.js +2 -1
- package/plugin/lib/module/helpers/utils/injectCIOPodfileCode.js.map +1 -1
- package/plugin/lib/module/helpers/utils/patchPluginNativeCode.js +5 -1
- package/plugin/lib/module/helpers/utils/patchPluginNativeCode.js.map +1 -1
- package/plugin/lib/module/index.js +3 -12
- package/plugin/lib/module/index.js.map +1 -1
- package/plugin/lib/module/ios/withAppDelegateModifications.js +2 -1
- package/plugin/lib/module/ios/withAppDelegateModifications.js.map +1 -1
- package/plugin/lib/module/ios/withCIOIos.js +7 -3
- package/plugin/lib/module/ios/withCIOIos.js.map +1 -1
- package/plugin/lib/module/ios/withCIOIosSwift.js +11 -10
- package/plugin/lib/module/ios/withCIOIosSwift.js.map +1 -1
- package/plugin/lib/module/ios/withGoogleServicesJsonFile.js +8 -7
- package/plugin/lib/module/ios/withGoogleServicesJsonFile.js.map +1 -1
- package/plugin/lib/module/ios/withNotificationsXcodeProject.js +29 -23
- package/plugin/lib/module/ios/withNotificationsXcodeProject.js.map +1 -1
- package/plugin/lib/module/utils/android.js +2 -1
- package/plugin/lib/module/utils/android.js.map +1 -1
- package/plugin/lib/module/utils/config.js +4 -2
- package/plugin/lib/module/utils/config.js.map +1 -1
- package/plugin/lib/module/utils/logger.js +29 -0
- package/plugin/lib/module/utils/logger.js.map +1 -0
- package/plugin/lib/module/utils/validation.js +68 -27
- package/plugin/lib/module/utils/validation.js.map +1 -1
- package/plugin/lib/module/utils/xcode.js +2 -1
- package/plugin/lib/module/utils/xcode.js.map +1 -1
- package/plugin/lib/typescript/android/withCIOAndroid.d.ts +1 -1
- package/plugin/lib/typescript/ios/withCIOIos.d.ts +1 -1
- package/plugin/lib/typescript/ios/withCIOIosSwift.d.ts +1 -1
- package/plugin/lib/typescript/utils/logger.d.ts +8 -0
- package/plugin/lib/typescript/utils/validation.d.ts +6 -3
- package/plugin/src/android/withAndroidManifestUpdates.ts +5 -4
- package/plugin/src/android/withAppGoogleServices.ts +2 -1
- package/plugin/src/android/withCIOAndroid.ts +18 -12
- package/plugin/src/android/withGistMavenRepository.ts +3 -2
- package/plugin/src/android/withGoogleServicesJSON.ts +4 -3
- package/plugin/src/android/withMainApplicationModifications.ts +2 -1
- package/plugin/src/helpers/utils/fileManagement.ts +10 -9
- package/plugin/src/helpers/utils/injectCIOPodfileCode.ts +2 -1
- package/plugin/src/helpers/utils/patchPluginNativeCode.ts +6 -1
- package/plugin/src/index.ts +3 -13
- package/plugin/src/ios/withAppDelegateModifications.ts +2 -1
- package/plugin/src/ios/withCIOIos.ts +12 -8
- package/plugin/src/ios/withCIOIosSwift.ts +15 -14
- package/plugin/src/ios/withGoogleServicesJsonFile.ts +8 -7
- package/plugin/src/ios/withNotificationsXcodeProject.ts +31 -35
- package/plugin/src/utils/android.ts +2 -1
- package/plugin/src/utils/config.ts +3 -2
- package/plugin/src/utils/logger.ts +37 -0
- package/plugin/src/utils/validation.ts +96 -32
- package/plugin/src/utils/xcode.ts +2 -1
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { CustomerIOPluginOptionsIOS, NativeSDKConfig, RichPushConfig } from '../types/cio-types';
|
|
2
|
+
import { logger } from './logger';
|
|
2
3
|
|
|
3
4
|
/**
|
|
4
5
|
* Merges config values with env values for backward compatibility.
|
|
@@ -25,12 +26,12 @@ function mergeConfigWithEnvValues(
|
|
|
25
26
|
` config.region: "${nativeRegion}"\n` +
|
|
26
27
|
` env.region: "${envRegion}"`;
|
|
27
28
|
|
|
28
|
-
|
|
29
|
+
logger.error(errorMessage);
|
|
29
30
|
throw new Error(errorMessage);
|
|
30
31
|
}
|
|
31
32
|
|
|
32
33
|
// Values match - warn about redundant configuration
|
|
33
|
-
|
|
34
|
+
logger.warn(
|
|
34
35
|
`Both 'config' and 'ios.pushNotification.env' are provided with matching values. ` +
|
|
35
36
|
`Consider removing 'ios.pushNotification.env' since 'config' is already specified.`
|
|
36
37
|
);
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
// Use CUSTOMERIO_DEBUG_MODE if defined; otherwise enable in development mode only
|
|
2
|
+
const VERBOSE_MODE =
|
|
3
|
+
process.env.CUSTOMERIO_DEBUG_MODE !== undefined
|
|
4
|
+
? process.env.CUSTOMERIO_DEBUG_MODE === 'true'
|
|
5
|
+
: process.env.NODE_ENV === 'development';
|
|
6
|
+
const PREFIX = '[CustomerIO]';
|
|
7
|
+
const formatMessage = (message: string): string => `${PREFIX} ${message}`;
|
|
8
|
+
|
|
9
|
+
export const logger = {
|
|
10
|
+
format: formatMessage,
|
|
11
|
+
|
|
12
|
+
error: (message: string, ...args: unknown[]): void => {
|
|
13
|
+
console.error(formatMessage(message), ...args);
|
|
14
|
+
},
|
|
15
|
+
|
|
16
|
+
warn: (message: string, ...args: unknown[]): void => {
|
|
17
|
+
console.warn(formatMessage(message), ...args);
|
|
18
|
+
},
|
|
19
|
+
|
|
20
|
+
info: (message: string, ...args: unknown[]): void => {
|
|
21
|
+
if (VERBOSE_MODE) {
|
|
22
|
+
console.info(formatMessage(message), ...args);
|
|
23
|
+
}
|
|
24
|
+
},
|
|
25
|
+
|
|
26
|
+
log: (message: string, ...args: unknown[]): void => {
|
|
27
|
+
if (VERBOSE_MODE) {
|
|
28
|
+
console.log(formatMessage(message), ...args);
|
|
29
|
+
}
|
|
30
|
+
},
|
|
31
|
+
|
|
32
|
+
debug: (message: string, ...args: unknown[]): void => {
|
|
33
|
+
if (VERBOSE_MODE) {
|
|
34
|
+
console.debug(formatMessage(message), ...args);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
};
|
|
@@ -1,21 +1,51 @@
|
|
|
1
|
-
import type { NativeSDKConfig } from '../types/cio-types';
|
|
1
|
+
import type { NativeSDKConfig, RichPushConfig } from '../types/cio-types';
|
|
2
|
+
import { logger } from './logger';
|
|
2
3
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
4
|
+
/**
|
|
5
|
+
* Validates a condition and handles errors based on CUSTOMERIO_STRICT_MODE flag.
|
|
6
|
+
* @param isValid - Function that returns true if validation passes
|
|
7
|
+
* @param messageFactory - Function that returns the error message if validation fails
|
|
8
|
+
* @returns true if validation passes, false if it fails
|
|
9
|
+
*/
|
|
10
|
+
function validate(isValid: () => boolean, messageFactory: () => string): boolean {
|
|
11
|
+
if (isValid()) {
|
|
12
|
+
return true;
|
|
6
13
|
}
|
|
7
|
-
}
|
|
8
14
|
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
15
|
+
// Throw errors unless explicitly disabled, default to strict validation
|
|
16
|
+
const message = messageFactory();
|
|
17
|
+
// Throw an error if strict mode is enabled, log a warning otherwise
|
|
18
|
+
if (process.env.CUSTOMERIO_STRICT_MODE === 'true') {
|
|
19
|
+
throw new Error(logger.format(message));
|
|
20
|
+
} else {
|
|
21
|
+
logger.warn(message);
|
|
12
22
|
}
|
|
23
|
+
return false;
|
|
13
24
|
}
|
|
14
25
|
|
|
15
|
-
function
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
26
|
+
function isUndefined(value: unknown): boolean {
|
|
27
|
+
return value === undefined;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
function validateRequired(value: unknown, fieldName: string, context: string): boolean {
|
|
31
|
+
return validate(
|
|
32
|
+
() => !isUndefined(value) && value !== null,
|
|
33
|
+
() => `${context}: ${fieldName} is required, received: ${value}`
|
|
34
|
+
);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
function validateString(value: unknown, fieldName: string, context: string): boolean {
|
|
38
|
+
return validate(
|
|
39
|
+
() => isUndefined(value) || (typeof value === 'string' && value.trim() !== ''),
|
|
40
|
+
() => `${context}: ${fieldName} must be a non-empty string, received: ${typeof value === 'string' ? `"${value}"` : value}`
|
|
41
|
+
);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
function validateBoolean(value: unknown, fieldName: string, context: string): boolean {
|
|
45
|
+
return validate(
|
|
46
|
+
() => isUndefined(value) || typeof value === 'boolean',
|
|
47
|
+
() => `${context}: ${fieldName} must be a boolean, received: ${value}`
|
|
48
|
+
);
|
|
19
49
|
}
|
|
20
50
|
|
|
21
51
|
function validateEnum<T extends string>(
|
|
@@ -23,32 +53,66 @@ function validateEnum<T extends string>(
|
|
|
23
53
|
fieldName: string,
|
|
24
54
|
allowedValues: readonly T[],
|
|
25
55
|
context: string
|
|
26
|
-
):
|
|
27
|
-
if (value
|
|
56
|
+
): boolean {
|
|
57
|
+
if (isUndefined(value)) return true;
|
|
28
58
|
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
const lowerAllowedValues = allowedValues.map(v => v.toLowerCase());
|
|
33
|
-
if (!lowerAllowedValues.includes(lowerValue)) {
|
|
34
|
-
const valuesStr = allowedValues.map(v => `"${v}"`).join(', ');
|
|
35
|
-
throw new Error(`${context}: ${fieldName} must be one of ${valuesStr}, received: ${value}`);
|
|
59
|
+
// First validate it's a string
|
|
60
|
+
if (!validateString(value, fieldName, context)) {
|
|
61
|
+
return false;
|
|
36
62
|
}
|
|
63
|
+
|
|
64
|
+
// Then validate it's in the allowed values
|
|
65
|
+
return validate(
|
|
66
|
+
() => {
|
|
67
|
+
const lowerValue = (value as string).toLowerCase();
|
|
68
|
+
const lowerAllowedValues = allowedValues.map(v => v.toLowerCase());
|
|
69
|
+
return lowerAllowedValues.includes(lowerValue);
|
|
70
|
+
},
|
|
71
|
+
() => {
|
|
72
|
+
const valuesStr = allowedValues.map(v => `"${v}"`).join(', ');
|
|
73
|
+
return `${context}: ${fieldName} must be one of ${valuesStr}, received: ${value}`;
|
|
74
|
+
}
|
|
75
|
+
);
|
|
37
76
|
}
|
|
38
77
|
|
|
39
|
-
function
|
|
78
|
+
function validateRegion(value: unknown, fieldName: string, context: string): boolean {
|
|
79
|
+
return validateEnum(value, fieldName, ['US', 'EU'], context);
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
function validateNativeSDKConfig(config: NativeSDKConfig): boolean {
|
|
40
83
|
const context = 'NativeSDKConfig';
|
|
41
84
|
|
|
42
|
-
|
|
43
|
-
|
|
85
|
+
let isValid = true;
|
|
86
|
+
|
|
87
|
+
isValid = validateRequired(config.cdpApiKey, 'cdpApiKey', context) && isValid;
|
|
88
|
+
isValid = validateString(config.cdpApiKey, 'cdpApiKey', context) && isValid;
|
|
89
|
+
isValid = validateRegion(config.region, 'region', context) && isValid;
|
|
90
|
+
isValid = validateEnum(config.screenViewUse, 'screenViewUse', ['all', 'inapp'], context) && isValid;
|
|
91
|
+
isValid = validateEnum(config.logLevel, 'logLevel', ['none', 'error', 'info', 'debug'], context) && isValid;
|
|
92
|
+
isValid = validateBoolean(config.autoTrackDeviceAttributes, 'autoTrackDeviceAttributes', context) && isValid;
|
|
93
|
+
isValid = validateBoolean(config.trackApplicationLifecycleEvents, 'trackApplicationLifecycleEvents', context) && isValid;
|
|
94
|
+
isValid = validateString(config.siteId, 'siteId', context) && isValid;
|
|
95
|
+
isValid = validateString(config.migrationSiteId, 'migrationSiteId', context) && isValid;
|
|
44
96
|
|
|
45
|
-
|
|
46
|
-
validateEnum(config.screenViewUse, 'screenViewUse', ['all', 'inapp'] as const, context);
|
|
47
|
-
validateEnum(config.logLevel, 'logLevel', ['none', 'error', 'info', 'debug'] as const, context);
|
|
48
|
-
validateBoolean(config.autoTrackDeviceAttributes, 'autoTrackDeviceAttributes', context);
|
|
49
|
-
validateBoolean(config.trackApplicationLifecycleEvents, 'trackApplicationLifecycleEvents', context);
|
|
50
|
-
validateString(config.siteId, 'siteId', context);
|
|
51
|
-
validateString(config.migrationSiteId, 'migrationSiteId', context);
|
|
97
|
+
return isValid;
|
|
52
98
|
}
|
|
53
99
|
|
|
54
|
-
|
|
100
|
+
function validateRichPushConfig(config: RichPushConfig | undefined): boolean {
|
|
101
|
+
const context = 'NotificationServiceExtension';
|
|
102
|
+
|
|
103
|
+
let isValid = true;
|
|
104
|
+
|
|
105
|
+
isValid = validateRequired(config?.cdpApiKey, 'cdpApiKey', context) && isValid;
|
|
106
|
+
isValid = validateString(config?.cdpApiKey, 'cdpApiKey', context) && isValid;
|
|
107
|
+
isValid = validateRegion(config?.region, 'region', context) && isValid;
|
|
108
|
+
|
|
109
|
+
return isValid;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
export {
|
|
113
|
+
validateNativeSDKConfig,
|
|
114
|
+
validateRequired,
|
|
115
|
+
validateRichPushConfig,
|
|
116
|
+
validateString
|
|
117
|
+
};
|
|
118
|
+
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type { XcodeProject } from "@expo/config-plugins";
|
|
2
2
|
import path from 'path';
|
|
3
3
|
import { FileManagement } from "../helpers/utils/fileManagement";
|
|
4
|
+
import { logger } from './logger';
|
|
4
5
|
|
|
5
6
|
/**
|
|
6
7
|
* Gets an existing CustomerIO group or creates a new one in the Xcode project
|
|
@@ -68,7 +69,7 @@ export function copyFileToXcode({
|
|
|
68
69
|
xcodeProject.addSourceFile(`${projectName}/${targetFileName}`, null, customerIOGroup);
|
|
69
70
|
return destinationPath;
|
|
70
71
|
} catch (error) {
|
|
71
|
-
|
|
72
|
+
logger.warn(`Failed to add ${targetFileName} to Xcode project:`, error);
|
|
72
73
|
throw error;
|
|
73
74
|
}
|
|
74
75
|
}
|