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.
Files changed (106) hide show
  1. package/package.json +4 -3
  2. package/plugin/lib/commonjs/android/withAndroidManifestUpdates.js +5 -4
  3. package/plugin/lib/commonjs/android/withAndroidManifestUpdates.js.map +1 -1
  4. package/plugin/lib/commonjs/android/withAppGoogleServices.js +2 -1
  5. package/plugin/lib/commonjs/android/withAppGoogleServices.js.map +1 -1
  6. package/plugin/lib/commonjs/android/withCIOAndroid.js +17 -11
  7. package/plugin/lib/commonjs/android/withCIOAndroid.js.map +1 -1
  8. package/plugin/lib/commonjs/android/withGistMavenRepository.js +2 -1
  9. package/plugin/lib/commonjs/android/withGistMavenRepository.js.map +1 -1
  10. package/plugin/lib/commonjs/android/withGoogleServicesJSON.js +4 -3
  11. package/plugin/lib/commonjs/android/withGoogleServicesJSON.js.map +1 -1
  12. package/plugin/lib/commonjs/android/withMainApplicationModifications.js +2 -1
  13. package/plugin/lib/commonjs/android/withMainApplicationModifications.js.map +1 -1
  14. package/plugin/lib/commonjs/helpers/utils/fileManagement.js +5 -4
  15. package/plugin/lib/commonjs/helpers/utils/fileManagement.js.map +1 -1
  16. package/plugin/lib/commonjs/helpers/utils/injectCIOPodfileCode.js +2 -1
  17. package/plugin/lib/commonjs/helpers/utils/injectCIOPodfileCode.js.map +1 -1
  18. package/plugin/lib/commonjs/helpers/utils/patchPluginNativeCode.js +5 -1
  19. package/plugin/lib/commonjs/helpers/utils/patchPluginNativeCode.js.map +1 -1
  20. package/plugin/lib/commonjs/index.js +3 -11
  21. package/plugin/lib/commonjs/index.js.map +1 -1
  22. package/plugin/lib/commonjs/ios/withAppDelegateModifications.js +2 -1
  23. package/plugin/lib/commonjs/ios/withAppDelegateModifications.js.map +1 -1
  24. package/plugin/lib/commonjs/ios/withCIOIos.js +7 -3
  25. package/plugin/lib/commonjs/ios/withCIOIos.js.map +1 -1
  26. package/plugin/lib/commonjs/ios/withCIOIosSwift.js +11 -10
  27. package/plugin/lib/commonjs/ios/withCIOIosSwift.js.map +1 -1
  28. package/plugin/lib/commonjs/ios/withGoogleServicesJsonFile.js +8 -7
  29. package/plugin/lib/commonjs/ios/withGoogleServicesJsonFile.js.map +1 -1
  30. package/plugin/lib/commonjs/ios/withNotificationsXcodeProject.js +29 -23
  31. package/plugin/lib/commonjs/ios/withNotificationsXcodeProject.js.map +1 -1
  32. package/plugin/lib/commonjs/utils/android.js +2 -1
  33. package/plugin/lib/commonjs/utils/android.js.map +1 -1
  34. package/plugin/lib/commonjs/utils/config.js +3 -2
  35. package/plugin/lib/commonjs/utils/config.js.map +1 -1
  36. package/plugin/lib/commonjs/utils/logger.js +35 -0
  37. package/plugin/lib/commonjs/utils/logger.js.map +1 -0
  38. package/plugin/lib/commonjs/utils/validation.js +68 -25
  39. package/plugin/lib/commonjs/utils/validation.js.map +1 -1
  40. package/plugin/lib/commonjs/utils/xcode.js +2 -1
  41. package/plugin/lib/commonjs/utils/xcode.js.map +1 -1
  42. package/plugin/lib/module/android/withAndroidManifestUpdates.js +6 -4
  43. package/plugin/lib/module/android/withAndroidManifestUpdates.js.map +1 -1
  44. package/plugin/lib/module/android/withAppGoogleServices.js +2 -1
  45. package/plugin/lib/module/android/withAppGoogleServices.js.map +1 -1
  46. package/plugin/lib/module/android/withCIOAndroid.js +17 -11
  47. package/plugin/lib/module/android/withCIOAndroid.js.map +1 -1
  48. package/plugin/lib/module/android/withGistMavenRepository.js +2 -1
  49. package/plugin/lib/module/android/withGistMavenRepository.js.map +1 -1
  50. package/plugin/lib/module/android/withGoogleServicesJSON.js +4 -3
  51. package/plugin/lib/module/android/withGoogleServicesJSON.js.map +1 -1
  52. package/plugin/lib/module/android/withMainApplicationModifications.js +2 -1
  53. package/plugin/lib/module/android/withMainApplicationModifications.js.map +1 -1
  54. package/plugin/lib/module/helpers/utils/fileManagement.js +6 -5
  55. package/plugin/lib/module/helpers/utils/fileManagement.js.map +1 -1
  56. package/plugin/lib/module/helpers/utils/injectCIOPodfileCode.js +2 -1
  57. package/plugin/lib/module/helpers/utils/injectCIOPodfileCode.js.map +1 -1
  58. package/plugin/lib/module/helpers/utils/patchPluginNativeCode.js +5 -1
  59. package/plugin/lib/module/helpers/utils/patchPluginNativeCode.js.map +1 -1
  60. package/plugin/lib/module/index.js +3 -12
  61. package/plugin/lib/module/index.js.map +1 -1
  62. package/plugin/lib/module/ios/withAppDelegateModifications.js +2 -1
  63. package/plugin/lib/module/ios/withAppDelegateModifications.js.map +1 -1
  64. package/plugin/lib/module/ios/withCIOIos.js +7 -3
  65. package/plugin/lib/module/ios/withCIOIos.js.map +1 -1
  66. package/plugin/lib/module/ios/withCIOIosSwift.js +11 -10
  67. package/plugin/lib/module/ios/withCIOIosSwift.js.map +1 -1
  68. package/plugin/lib/module/ios/withGoogleServicesJsonFile.js +8 -7
  69. package/plugin/lib/module/ios/withGoogleServicesJsonFile.js.map +1 -1
  70. package/plugin/lib/module/ios/withNotificationsXcodeProject.js +29 -23
  71. package/plugin/lib/module/ios/withNotificationsXcodeProject.js.map +1 -1
  72. package/plugin/lib/module/utils/android.js +2 -1
  73. package/plugin/lib/module/utils/android.js.map +1 -1
  74. package/plugin/lib/module/utils/config.js +4 -2
  75. package/plugin/lib/module/utils/config.js.map +1 -1
  76. package/plugin/lib/module/utils/logger.js +29 -0
  77. package/plugin/lib/module/utils/logger.js.map +1 -0
  78. package/plugin/lib/module/utils/validation.js +68 -27
  79. package/plugin/lib/module/utils/validation.js.map +1 -1
  80. package/plugin/lib/module/utils/xcode.js +2 -1
  81. package/plugin/lib/module/utils/xcode.js.map +1 -1
  82. package/plugin/lib/typescript/android/withCIOAndroid.d.ts +1 -1
  83. package/plugin/lib/typescript/ios/withCIOIos.d.ts +1 -1
  84. package/plugin/lib/typescript/ios/withCIOIosSwift.d.ts +1 -1
  85. package/plugin/lib/typescript/utils/logger.d.ts +8 -0
  86. package/plugin/lib/typescript/utils/validation.d.ts +6 -3
  87. package/plugin/src/android/withAndroidManifestUpdates.ts +5 -4
  88. package/plugin/src/android/withAppGoogleServices.ts +2 -1
  89. package/plugin/src/android/withCIOAndroid.ts +18 -12
  90. package/plugin/src/android/withGistMavenRepository.ts +3 -2
  91. package/plugin/src/android/withGoogleServicesJSON.ts +4 -3
  92. package/plugin/src/android/withMainApplicationModifications.ts +2 -1
  93. package/plugin/src/helpers/utils/fileManagement.ts +10 -9
  94. package/plugin/src/helpers/utils/injectCIOPodfileCode.ts +2 -1
  95. package/plugin/src/helpers/utils/patchPluginNativeCode.ts +6 -1
  96. package/plugin/src/index.ts +3 -13
  97. package/plugin/src/ios/withAppDelegateModifications.ts +2 -1
  98. package/plugin/src/ios/withCIOIos.ts +12 -8
  99. package/plugin/src/ios/withCIOIosSwift.ts +15 -14
  100. package/plugin/src/ios/withGoogleServicesJsonFile.ts +8 -7
  101. package/plugin/src/ios/withNotificationsXcodeProject.ts +31 -35
  102. package/plugin/src/utils/android.ts +2 -1
  103. package/plugin/src/utils/config.ts +3 -2
  104. package/plugin/src/utils/logger.ts +37 -0
  105. package/plugin/src/utils/validation.ts +96 -32
  106. 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
- console.error(errorMessage);
29
+ logger.error(errorMessage);
29
30
  throw new Error(errorMessage);
30
31
  }
31
32
 
32
33
  // Values match - warn about redundant configuration
33
- console.warn(
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
- function validateRequired(value: unknown, fieldName: string, context: string): void {
4
- if (value === undefined || value === null) {
5
- throw new Error(`${context}: ${fieldName} is required, received: ${value}`);
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
- function validateString(value: unknown, fieldName: string, context: string): void {
10
- if (value !== undefined && (typeof value !== 'string' || value.trim() === '')) {
11
- throw new Error(`${context}: ${fieldName} must be a non-empty string, received: ${typeof value === 'string' ? `"${value}"` : value}`);
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 validateBoolean(value: unknown, fieldName: string, context: string): void {
16
- if (value !== undefined && typeof value !== 'boolean') {
17
- throw new Error(`${context}: ${fieldName} must be a boolean, received: ${value}`);
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
- ): void {
27
- if (value === undefined) return;
56
+ ): boolean {
57
+ if (isUndefined(value)) return true;
28
58
 
29
- validateString(value, fieldName, context);
30
-
31
- const lowerValue = (value as string).toLowerCase();
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 validateNativeSDKConfig(config: NativeSDKConfig): void {
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
- validateRequired(config.cdpApiKey, 'cdpApiKey', context);
43
- validateString(config.cdpApiKey, 'cdpApiKey', context);
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
- validateEnum(config.region, 'region', ['US', 'EU'] as const, context);
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
- export { validateNativeSDKConfig };
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
- console.warn(`Failed to add ${targetFileName} to Xcode project:`, error);
72
+ logger.warn(`Failed to add ${targetFileName} to Xcode project:`, error);
72
73
  throw error;
73
74
  }
74
75
  }