@rudderstack/integrations-lib 0.2.58 → 0.2.60

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.
@@ -0,0 +1,208 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.DEFAULT_SANITIZATION_CONFIG = exports.CONTROL_CHARS_REGEX = void 0;
7
+ exports.sanitize = sanitize;
8
+ exports.sanitizeResponse = sanitizeResponse;
9
+ const validator_1 = __importDefault(require("validator"));
10
+ /**
11
+ * Response Sanitization Utility
12
+ *
13
+ * Provides comprehensive sanitization for API responses to prevent XSS attacks
14
+ * and other security vulnerabilities.
15
+ *
16
+ * Key Features:
17
+ * - HTML entity escaping (always enabled, uses validator library)
18
+ * - Control character removal (configurable)
19
+ * - String length truncation (configurable)
20
+ * - Deep object traversal (configurable depth)
21
+ * - Type preservation (numbers, booleans, null remain unchanged)
22
+ * - Non-destructive (returns new objects without mutating originals)
23
+ *
24
+ * @packageDocumentation
25
+ */
26
+ /**
27
+ * Regular expression to match dangerous control characters
28
+ *
29
+ * Matches ASCII control characters (0x00-0x1F and 0x7F) EXCEPT:
30
+ * - \x09 (tab)
31
+ * - \x0A (newline)
32
+ * - \x0D (carriage return)
33
+ *
34
+ * Range breakdown:
35
+ * - \x00-\x08: NULL to BACKSPACE
36
+ * - \x0B: Vertical Tab (skips \x09 tab and \x0A newline)
37
+ * - \x0C: Form Feed (skips \x0D carriage return)
38
+ * - \x0E-\x1F: Shift Out to Unit Separator
39
+ * - \x7F: DELETE
40
+ *
41
+ * These characters can cause issues in logs, APIs, and downstream systems.
42
+ */
43
+ // eslint-disable-next-line no-control-regex
44
+ exports.CONTROL_CHARS_REGEX = /[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]/g;
45
+ /**
46
+ * Default sanitization configuration
47
+ * Suitable for general-purpose API responses
48
+ *
49
+ * For specific use cases, create custom configs:
50
+ * - Processor responses: { maxStringLength: 50000, maxDepth: 50, removeControlChars: true }
51
+ * - Delivery responses: { maxStringLength: 20000, maxDepth: 30, removeControlChars: true }
52
+ */
53
+ exports.DEFAULT_SANITIZATION_CONFIG = {
54
+ removeControlChars: true,
55
+ maxStringLength: 10240, // 10KB per string
56
+ maxDepth: 50,
57
+ };
58
+ /**
59
+ * Sanitize a single string value
60
+ *
61
+ * Processing order:
62
+ * 1. Remove control characters (if enabled)
63
+ * 2. Escape HTML entities (always applied)
64
+ * 3. Truncate if exceeds max length (if enabled)
65
+ *
66
+ * @param value - The string to sanitize
67
+ * @param config - Sanitization configuration
68
+ * @returns Sanitized string with HTML entities escaped
69
+ * @private
70
+ */
71
+ function sanitizeString(value, config) {
72
+ if (typeof value !== 'string') {
73
+ return value;
74
+ }
75
+ let sanitized = value;
76
+ // Step 1: Remove control characters (except newline \n, carriage return \r, and tab \t)
77
+ // Control characters (0x00-0x1F, 0x7F) can break logs and cause security issues
78
+ // We preserve \n (0x0A), \r (0x0D), \t (0x09) for legitimate formatting
79
+ if (config.removeControlChars) {
80
+ sanitized = sanitized.replace(exports.CONTROL_CHARS_REGEX, '');
81
+ }
82
+ // Step 2: Escape HTML entities to prevent XSS attacks
83
+ // This is ALWAYS applied regardless of config
84
+ // Uses validator.escape() which converts: < > " ' & / to HTML entities
85
+ sanitized = validator_1.default.escape(sanitized);
86
+ // Step 3: Truncate long strings to prevent DOS attacks
87
+ // Adds '... [truncated]' suffix to indicate truncation
88
+ if (config.maxStringLength > 0 && sanitized.length > config.maxStringLength) {
89
+ sanitized = `${sanitized.substring(0, config.maxStringLength)}... [truncated]`;
90
+ }
91
+ return sanitized;
92
+ }
93
+ /**
94
+ * Deep sanitize an object, array, or primitive value
95
+ *
96
+ * This function recursively processes data structures:
97
+ * - Arrays: Sanitizes each element
98
+ * - Objects: Sanitizes both keys and values
99
+ * - Strings: Applies HTML escaping and other string sanitization
100
+ * - Primitives: Returns as-is (numbers, booleans, null, undefined)
101
+ *
102
+ * @param data - The data to sanitize (any type)
103
+ * @param config - Sanitization configuration (defaults to DEFAULT_SANITIZATION_CONFIG)
104
+ * @param depth - Current recursion depth (internal use, starts at 0)
105
+ * @returns Sanitized copy of the data
106
+ *
107
+ * @example Sanitize an object
108
+ * ```typescript
109
+ * const data = {
110
+ * user: '<script>xss</script>',
111
+ * count: 42,
112
+ * active: true
113
+ * };
114
+ * const clean = sanitize(data);
115
+ * // Returns: { user: '&lt;script&gt;xss&lt;&#x2F;script&gt;', count: 42, active: true }
116
+ * ```
117
+ *
118
+ * @example Sanitize an array
119
+ * ```typescript
120
+ * const data = ['<b>item1</b>', '<i>item2</i>'];
121
+ * const clean = sanitize(data);
122
+ * // Returns: ['&lt;b&gt;item1&lt;&#x2F;b&gt;', '&lt;i&gt;item2&lt;&#x2F;i&gt;']
123
+ * ```
124
+ */
125
+ function sanitize(data, config = exports.DEFAULT_SANITIZATION_CONFIG, depth = 0) {
126
+ // Handle null and undefined - return as-is
127
+ if (data === null || data === undefined) {
128
+ return data;
129
+ }
130
+ // Prevent infinite recursion by checking depth limit
131
+ // Replaces deeply nested data with a warning string
132
+ if (depth > config.maxDepth) {
133
+ return '[Max depth exceeded]';
134
+ }
135
+ // Handle arrays - recursively sanitize each element
136
+ if (Array.isArray(data)) {
137
+ return data.map((item) => sanitize(item, config, depth + 1));
138
+ }
139
+ // Handle strings - apply string-level sanitization
140
+ if (typeof data === 'string') {
141
+ return sanitizeString(data, config);
142
+ }
143
+ // Handle objects - sanitize both keys and values
144
+ if (typeof data === 'object') {
145
+ const sanitized = {};
146
+ // eslint-disable-next-line no-restricted-syntax
147
+ for (const [key, value] of Object.entries(data)) {
148
+ // Sanitize the key itself to prevent malicious property names
149
+ const sanitizedKey = sanitizeString(key, config);
150
+ // Recursively sanitize the value, incrementing depth
151
+ sanitized[sanitizedKey] = sanitize(value, config, depth + 1);
152
+ }
153
+ return sanitized;
154
+ }
155
+ // Return primitives as-is (numbers, booleans, bigints, symbols)
156
+ // These types don't need sanitization
157
+ return data;
158
+ }
159
+ /**
160
+ * Sanitize any response data to prevent XSS attacks and security vulnerabilities
161
+ *
162
+ * This is a convenience function that merges custom config with defaults.
163
+ * For direct control, use the `sanitize` function directly.
164
+ *
165
+ * This function:
166
+ * - Escapes HTML entities in all strings (ALWAYS, cannot be disabled)
167
+ * - Removes dangerous control characters (configurable)
168
+ * - Truncates overly long strings (configurable)
169
+ * - Handles nested objects/arrays recursively
170
+ * - Preserves data types (numbers, booleans, null)
171
+ *
172
+ * @param data - The data to sanitize (objects, arrays, primitives)
173
+ * @param config - Optional partial configuration (merged with defaults)
174
+ * @returns Sanitized copy of the data with same type
175
+ *
176
+ * @example Basic usage with defaults
177
+ * ```typescript
178
+ * const unsafe = { message: '<script>alert("xss")</script>' };
179
+ * const safe = sanitizeResponse(unsafe);
180
+ * // Result: { message: '&lt;script&gt;alert(&quot;xss&quot;)&lt;&#x2F;script&gt;' }
181
+ * ```
182
+ *
183
+ * @example Custom configuration for large payloads
184
+ * ```typescript
185
+ * const response = sanitizeResponse(processorData, {
186
+ * maxStringLength: 50000,
187
+ * maxDepth: 50,
188
+ * removeControlChars: true
189
+ * });
190
+ * ```
191
+ *
192
+ * @example In a Koa controller
193
+ * ```typescript
194
+ * export class Controller {
195
+ * async transform(ctx: Context) {
196
+ * const result = await transformData(ctx.request.body);
197
+ * ctx.body = sanitizeResponse(result);
198
+ * }
199
+ * }
200
+ * ```
201
+ */
202
+ function sanitizeResponse(data, config) {
203
+ return sanitize(data, {
204
+ ...exports.DEFAULT_SANITIZATION_CONFIG,
205
+ ...config,
206
+ });
207
+ }
208
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2FuaXRpemVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3V0aWxzL3Nhbml0aXplci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFnS0EsNEJBNkNDO0FBNkNELDRDQUtDO0FBL1BELDBEQUFrQztBQUVsQzs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSDs7Ozs7Ozs7Ozs7Ozs7OztHQWdCRztBQUNILDRDQUE0QztBQUMvQixRQUFBLG1CQUFtQixHQUFHLG1DQUFtQyxDQUFDO0FBb0N2RTs7Ozs7OztHQU9HO0FBQ1UsUUFBQSwyQkFBMkIsR0FBdUI7SUFDN0Qsa0JBQWtCLEVBQUUsSUFBSTtJQUN4QixlQUFlLEVBQUUsS0FBSyxFQUFFLGtCQUFrQjtJQUMxQyxRQUFRLEVBQUUsRUFBRTtDQUNiLENBQUM7QUFFRjs7Ozs7Ozs7Ozs7O0dBWUc7QUFDSCxTQUFTLGNBQWMsQ0FBQyxLQUFhLEVBQUUsTUFBMEI7SUFDL0QsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUM5QixPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRCxJQUFJLFNBQVMsR0FBRyxLQUFLLENBQUM7SUFFdEIsd0ZBQXdGO0lBQ3hGLGdGQUFnRjtJQUNoRix3RUFBd0U7SUFDeEUsSUFBSSxNQUFNLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztRQUM5QixTQUFTLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBQywyQkFBbUIsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUN6RCxDQUFDO0lBRUQsc0RBQXNEO0lBQ3RELDhDQUE4QztJQUM5Qyx1RUFBdUU7SUFDdkUsU0FBUyxHQUFHLG1CQUFTLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBRXhDLHVEQUF1RDtJQUN2RCx1REFBdUQ7SUFDdkQsSUFBSSxNQUFNLENBQUMsZUFBZSxHQUFHLENBQUMsSUFBSSxTQUFTLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUM1RSxTQUFTLEdBQUcsR0FBRyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsZUFBZSxDQUFDLGlCQUFpQixDQUFDO0lBQ2pGLENBQUM7SUFFRCxPQUFPLFNBQVMsQ0FBQztBQUNuQixDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0ErQkc7QUFDSCxTQUFnQixRQUFRLENBQ3RCLElBQU8sRUFDUCxTQUE2QixtQ0FBMkIsRUFDeEQsUUFBZ0IsQ0FBQztJQUVqQiwyQ0FBMkM7SUFDM0MsSUFBSSxJQUFJLEtBQUssSUFBSSxJQUFJLElBQUksS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUN4QyxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxxREFBcUQ7SUFDckQsb0RBQW9EO0lBQ3BELElBQUksS0FBSyxHQUFHLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUM1QixPQUFPLHNCQUEyQixDQUFDO0lBQ3JDLENBQUM7SUFFRCxvREFBb0Q7SUFDcEQsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7UUFDeEIsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQU0sQ0FBQztJQUNwRSxDQUFDO0lBRUQsbURBQW1EO0lBQ25ELElBQUksT0FBTyxJQUFJLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDN0IsT0FBTyxjQUFjLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBTSxDQUFDO0lBQzNDLENBQUM7SUFFRCxpREFBaUQ7SUFDakQsSUFBSSxPQUFPLElBQUksS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUM3QixNQUFNLFNBQVMsR0FBNEIsRUFBRSxDQUFDO1FBRTlDLGdEQUFnRDtRQUNoRCxLQUFLLE1BQU0sQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQ2hELDhEQUE4RDtZQUM5RCxNQUFNLFlBQVksR0FBRyxjQUFjLENBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBRWpELHFEQUFxRDtZQUNyRCxTQUFTLENBQUMsWUFBWSxDQUFDLEdBQUcsUUFBUSxDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQy9ELENBQUM7UUFFRCxPQUFPLFNBQWMsQ0FBQztJQUN4QixDQUFDO0lBRUQsZ0VBQWdFO0lBQ2hFLHNDQUFzQztJQUN0QyxPQUFPLElBQUksQ0FBQztBQUNkLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBMENHO0FBQ0gsU0FBZ0IsZ0JBQWdCLENBQUksSUFBTyxFQUFFLE1BQW9DO0lBQy9FLE9BQU8sUUFBUSxDQUFDLElBQUksRUFBRTtRQUNwQixHQUFHLG1DQUEyQjtRQUM5QixHQUFHLE1BQU07S0FDVixDQUFDLENBQUM7QUFDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHZhbGlkYXRvciBmcm9tICd2YWxpZGF0b3InO1xuXG4vKipcbiAqIFJlc3BvbnNlIFNhbml0aXphdGlvbiBVdGlsaXR5XG4gKlxuICogUHJvdmlkZXMgY29tcHJlaGVuc2l2ZSBzYW5pdGl6YXRpb24gZm9yIEFQSSByZXNwb25zZXMgdG8gcHJldmVudCBYU1MgYXR0YWNrc1xuICogYW5kIG90aGVyIHNlY3VyaXR5IHZ1bG5lcmFiaWxpdGllcy5cbiAqXG4gKiBLZXkgRmVhdHVyZXM6XG4gKiAtIEhUTUwgZW50aXR5IGVzY2FwaW5nIChhbHdheXMgZW5hYmxlZCwgdXNlcyB2YWxpZGF0b3IgbGlicmFyeSlcbiAqIC0gQ29udHJvbCBjaGFyYWN0ZXIgcmVtb3ZhbCAoY29uZmlndXJhYmxlKVxuICogLSBTdHJpbmcgbGVuZ3RoIHRydW5jYXRpb24gKGNvbmZpZ3VyYWJsZSlcbiAqIC0gRGVlcCBvYmplY3QgdHJhdmVyc2FsIChjb25maWd1cmFibGUgZGVwdGgpXG4gKiAtIFR5cGUgcHJlc2VydmF0aW9uIChudW1iZXJzLCBib29sZWFucywgbnVsbCByZW1haW4gdW5jaGFuZ2VkKVxuICogLSBOb24tZGVzdHJ1Y3RpdmUgKHJldHVybnMgbmV3IG9iamVjdHMgd2l0aG91dCBtdXRhdGluZyBvcmlnaW5hbHMpXG4gKlxuICogQHBhY2thZ2VEb2N1bWVudGF0aW9uXG4gKi9cblxuLyoqXG4gKiBSZWd1bGFyIGV4cHJlc3Npb24gdG8gbWF0Y2ggZGFuZ2Vyb3VzIGNvbnRyb2wgY2hhcmFjdGVyc1xuICpcbiAqIE1hdGNoZXMgQVNDSUkgY29udHJvbCBjaGFyYWN0ZXJzICgweDAwLTB4MUYgYW5kIDB4N0YpIEVYQ0VQVDpcbiAqIC0gXFx4MDkgKHRhYilcbiAqIC0gXFx4MEEgKG5ld2xpbmUpXG4gKiAtIFxceDBEIChjYXJyaWFnZSByZXR1cm4pXG4gKlxuICogUmFuZ2UgYnJlYWtkb3duOlxuICogLSBcXHgwMC1cXHgwODogTlVMTCB0byBCQUNLU1BBQ0VcbiAqIC0gXFx4MEI6IFZlcnRpY2FsIFRhYiAoc2tpcHMgXFx4MDkgdGFiIGFuZCBcXHgwQSBuZXdsaW5lKVxuICogLSBcXHgwQzogRm9ybSBGZWVkIChza2lwcyBcXHgwRCBjYXJyaWFnZSByZXR1cm4pXG4gKiAtIFxceDBFLVxceDFGOiBTaGlmdCBPdXQgdG8gVW5pdCBTZXBhcmF0b3JcbiAqIC0gXFx4N0Y6IERFTEVURVxuICpcbiAqIFRoZXNlIGNoYXJhY3RlcnMgY2FuIGNhdXNlIGlzc3VlcyBpbiBsb2dzLCBBUElzLCBhbmQgZG93bnN0cmVhbSBzeXN0ZW1zLlxuICovXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29udHJvbC1yZWdleFxuZXhwb3J0IGNvbnN0IENPTlRST0xfQ0hBUlNfUkVHRVggPSAvW1xceDAwLVxceDA4XFx4MEJcXHgwQ1xceDBFLVxceDFGXFx4N0ZdL2c7XG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiBmb3IgcmVzcG9uc2Ugc2FuaXRpemF0aW9uXG4gKlxuICogVGhpcyBjb25maWd1cmF0aW9uIGNvbnRyb2xzIGhvdyB0aGUgc2FuaXRpemF0aW9uIHV0aWxpdHkgcHJvY2Vzc2VzIGRhdGE6XG4gKiAtIEhUTUwgZXNjYXBpbmcgaXMgQUxXQVlTIGVuYWJsZWQgKGNhbm5vdCBiZSBkaXNhYmxlZCBmb3Igc2VjdXJpdHkpXG4gKiAtIENvbnRyb2wgY2hhcmFjdGVyIHJlbW92YWwgaXMgY29uZmlndXJhYmxlXG4gKiAtIFN0cmluZyBsZW5ndGggbGltaXRzIGFyZSBjb25maWd1cmFibGVcbiAqIC0gT2JqZWN0IGRlcHRoIGxpbWl0cyBhcmUgY29uZmlndXJhYmxlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2FuaXRpemF0aW9uQ29uZmlnIHtcbiAgLyoqXG4gICAqIFJlbW92ZSBkYW5nZXJvdXMgY29udHJvbCBjaGFyYWN0ZXJzICgweDAwLTB4MUYsIDB4N0YpXG4gICAqIFByZXNlcnZlcyBzYWZlIGZvcm1hdHRpbmcgY2hhcmFjdGVyczogXFxuIChuZXdsaW5lKSwgXFxyIChjYXJyaWFnZSByZXR1cm4pLCBcXHQgKHRhYilcbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgcmVtb3ZlQ29udHJvbENoYXJzOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBNYXhpbXVtIHN0cmluZyBsZW5ndGggYmVmb3JlIHRydW5jYXRpb24gKGluIGNoYXJhY3RlcnMpXG4gICAqIFByZXZlbnRzIERPUyBhdHRhY2tzIGJ5IGxpbWl0aW5nIHN0cmluZyBzaXplXG4gICAqIFNldCB0byAwIHRvIGRpc2FibGUgdHJ1bmNhdGlvblxuICAgKiBAZGVmYXVsdCAxMDI0MFxuICAgKi9cbiAgbWF4U3RyaW5nTGVuZ3RoOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIE1heGltdW0gb2JqZWN0IGRlcHRoIHRvIHRyYXZlcnNlXG4gICAqIFByZXZlbnRzIHN0YWNrIG92ZXJmbG93IGZyb20gZGVlcGx5IG5lc3RlZCBvYmplY3RzXG4gICAqIE9iamVjdHMgZGVlcGVyIHRoYW4gdGhpcyB3aWxsIGJlIHJlcGxhY2VkIHdpdGggJ1tNYXggZGVwdGggZXhjZWVkZWRdJ1xuICAgKiBAZGVmYXVsdCA1MFxuICAgKi9cbiAgbWF4RGVwdGg6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBEZWZhdWx0IHNhbml0aXphdGlvbiBjb25maWd1cmF0aW9uXG4gKiBTdWl0YWJsZSBmb3IgZ2VuZXJhbC1wdXJwb3NlIEFQSSByZXNwb25zZXNcbiAqXG4gKiBGb3Igc3BlY2lmaWMgdXNlIGNhc2VzLCBjcmVhdGUgY3VzdG9tIGNvbmZpZ3M6XG4gKiAtIFByb2Nlc3NvciByZXNwb25zZXM6IHsgbWF4U3RyaW5nTGVuZ3RoOiA1MDAwMCwgbWF4RGVwdGg6IDUwLCByZW1vdmVDb250cm9sQ2hhcnM6IHRydWUgfVxuICogLSBEZWxpdmVyeSByZXNwb25zZXM6IHsgbWF4U3RyaW5nTGVuZ3RoOiAyMDAwMCwgbWF4RGVwdGg6IDMwLCByZW1vdmVDb250cm9sQ2hhcnM6IHRydWUgfVxuICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9TQU5JVElaQVRJT05fQ09ORklHOiBTYW5pdGl6YXRpb25Db25maWcgPSB7XG4gIHJlbW92ZUNvbnRyb2xDaGFyczogdHJ1ZSxcbiAgbWF4U3RyaW5nTGVuZ3RoOiAxMDI0MCwgLy8gMTBLQiBwZXIgc3RyaW5nXG4gIG1heERlcHRoOiA1MCxcbn07XG5cbi8qKlxuICogU2FuaXRpemUgYSBzaW5nbGUgc3RyaW5nIHZhbHVlXG4gKlxuICogUHJvY2Vzc2luZyBvcmRlcjpcbiAqIDEuIFJlbW92ZSBjb250cm9sIGNoYXJhY3RlcnMgKGlmIGVuYWJsZWQpXG4gKiAyLiBFc2NhcGUgSFRNTCBlbnRpdGllcyAoYWx3YXlzIGFwcGxpZWQpXG4gKiAzLiBUcnVuY2F0ZSBpZiBleGNlZWRzIG1heCBsZW5ndGggKGlmIGVuYWJsZWQpXG4gKlxuICogQHBhcmFtIHZhbHVlIC0gVGhlIHN0cmluZyB0byBzYW5pdGl6ZVxuICogQHBhcmFtIGNvbmZpZyAtIFNhbml0aXphdGlvbiBjb25maWd1cmF0aW9uXG4gKiBAcmV0dXJucyBTYW5pdGl6ZWQgc3RyaW5nIHdpdGggSFRNTCBlbnRpdGllcyBlc2NhcGVkXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBzYW5pdGl6ZVN0cmluZyh2YWx1ZTogc3RyaW5nLCBjb25maWc6IFNhbml0aXphdGlvbkNvbmZpZyk6IHN0cmluZyB7XG4gIGlmICh0eXBlb2YgdmFsdWUgIT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cbiAgbGV0IHNhbml0aXplZCA9IHZhbHVlO1xuXG4gIC8vIFN0ZXAgMTogUmVtb3ZlIGNvbnRyb2wgY2hhcmFjdGVycyAoZXhjZXB0IG5ld2xpbmUgXFxuLCBjYXJyaWFnZSByZXR1cm4gXFxyLCBhbmQgdGFiIFxcdClcbiAgLy8gQ29udHJvbCBjaGFyYWN0ZXJzICgweDAwLTB4MUYsIDB4N0YpIGNhbiBicmVhayBsb2dzIGFuZCBjYXVzZSBzZWN1cml0eSBpc3N1ZXNcbiAgLy8gV2UgcHJlc2VydmUgXFxuICgweDBBKSwgXFxyICgweDBEKSwgXFx0ICgweDA5KSBmb3IgbGVnaXRpbWF0ZSBmb3JtYXR0aW5nXG4gIGlmIChjb25maWcucmVtb3ZlQ29udHJvbENoYXJzKSB7XG4gICAgc2FuaXRpemVkID0gc2FuaXRpemVkLnJlcGxhY2UoQ09OVFJPTF9DSEFSU19SRUdFWCwgJycpO1xuICB9XG5cbiAgLy8gU3RlcCAyOiBFc2NhcGUgSFRNTCBlbnRpdGllcyB0byBwcmV2ZW50IFhTUyBhdHRhY2tzXG4gIC8vIFRoaXMgaXMgQUxXQVlTIGFwcGxpZWQgcmVnYXJkbGVzcyBvZiBjb25maWdcbiAgLy8gVXNlcyB2YWxpZGF0b3IuZXNjYXBlKCkgd2hpY2ggY29udmVydHM6IDwgPiBcIiAnICYgLyB0byBIVE1MIGVudGl0aWVzXG4gIHNhbml0aXplZCA9IHZhbGlkYXRvci5lc2NhcGUoc2FuaXRpemVkKTtcblxuICAvLyBTdGVwIDM6IFRydW5jYXRlIGxvbmcgc3RyaW5ncyB0byBwcmV2ZW50IERPUyBhdHRhY2tzXG4gIC8vIEFkZHMgJy4uLiBbdHJ1bmNhdGVkXScgc3VmZml4IHRvIGluZGljYXRlIHRydW5jYXRpb25cbiAgaWYgKGNvbmZpZy5tYXhTdHJpbmdMZW5ndGggPiAwICYmIHNhbml0aXplZC5sZW5ndGggPiBjb25maWcubWF4U3RyaW5nTGVuZ3RoKSB7XG4gICAgc2FuaXRpemVkID0gYCR7c2FuaXRpemVkLnN1YnN0cmluZygwLCBjb25maWcubWF4U3RyaW5nTGVuZ3RoKX0uLi4gW3RydW5jYXRlZF1gO1xuICB9XG5cbiAgcmV0dXJuIHNhbml0aXplZDtcbn1cblxuLyoqXG4gKiBEZWVwIHNhbml0aXplIGFuIG9iamVjdCwgYXJyYXksIG9yIHByaW1pdGl2ZSB2YWx1ZVxuICpcbiAqIFRoaXMgZnVuY3Rpb24gcmVjdXJzaXZlbHkgcHJvY2Vzc2VzIGRhdGEgc3RydWN0dXJlczpcbiAqIC0gQXJyYXlzOiBTYW5pdGl6ZXMgZWFjaCBlbGVtZW50XG4gKiAtIE9iamVjdHM6IFNhbml0aXplcyBib3RoIGtleXMgYW5kIHZhbHVlc1xuICogLSBTdHJpbmdzOiBBcHBsaWVzIEhUTUwgZXNjYXBpbmcgYW5kIG90aGVyIHN0cmluZyBzYW5pdGl6YXRpb25cbiAqIC0gUHJpbWl0aXZlczogUmV0dXJucyBhcy1pcyAobnVtYmVycywgYm9vbGVhbnMsIG51bGwsIHVuZGVmaW5lZClcbiAqXG4gKiBAcGFyYW0gZGF0YSAtIFRoZSBkYXRhIHRvIHNhbml0aXplIChhbnkgdHlwZSlcbiAqIEBwYXJhbSBjb25maWcgLSBTYW5pdGl6YXRpb24gY29uZmlndXJhdGlvbiAoZGVmYXVsdHMgdG8gREVGQVVMVF9TQU5JVElaQVRJT05fQ09ORklHKVxuICogQHBhcmFtIGRlcHRoIC0gQ3VycmVudCByZWN1cnNpb24gZGVwdGggKGludGVybmFsIHVzZSwgc3RhcnRzIGF0IDApXG4gKiBAcmV0dXJucyBTYW5pdGl6ZWQgY29weSBvZiB0aGUgZGF0YVxuICpcbiAqIEBleGFtcGxlIFNhbml0aXplIGFuIG9iamVjdFxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgZGF0YSA9IHtcbiAqICAgdXNlcjogJzxzY3JpcHQ+eHNzPC9zY3JpcHQ+JyxcbiAqICAgY291bnQ6IDQyLFxuICogICBhY3RpdmU6IHRydWVcbiAqIH07XG4gKiBjb25zdCBjbGVhbiA9IHNhbml0aXplKGRhdGEpO1xuICogLy8gUmV0dXJuczogeyB1c2VyOiAnJmx0O3NjcmlwdCZndDt4c3MmbHQ7JiN4MkY7c2NyaXB0Jmd0OycsIGNvdW50OiA0MiwgYWN0aXZlOiB0cnVlIH1cbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlIFNhbml0aXplIGFuIGFycmF5XG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCBkYXRhID0gWyc8Yj5pdGVtMTwvYj4nLCAnPGk+aXRlbTI8L2k+J107XG4gKiBjb25zdCBjbGVhbiA9IHNhbml0aXplKGRhdGEpO1xuICogLy8gUmV0dXJuczogWycmbHQ7YiZndDtpdGVtMSZsdDsmI3gyRjtiJmd0OycsICcmbHQ7aSZndDtpdGVtMiZsdDsmI3gyRjtpJmd0OyddXG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNhbml0aXplPFQ+KFxuICBkYXRhOiBULFxuICBjb25maWc6IFNhbml0aXphdGlvbkNvbmZpZyA9IERFRkFVTFRfU0FOSVRJWkFUSU9OX0NPTkZJRyxcbiAgZGVwdGg6IG51bWJlciA9IDAsXG4pOiBUIHtcbiAgLy8gSGFuZGxlIG51bGwgYW5kIHVuZGVmaW5lZCAtIHJldHVybiBhcy1pc1xuICBpZiAoZGF0YSA9PT0gbnVsbCB8fCBkYXRhID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gZGF0YTtcbiAgfVxuXG4gIC8vIFByZXZlbnQgaW5maW5pdGUgcmVjdXJzaW9uIGJ5IGNoZWNraW5nIGRlcHRoIGxpbWl0XG4gIC8vIFJlcGxhY2VzIGRlZXBseSBuZXN0ZWQgZGF0YSB3aXRoIGEgd2FybmluZyBzdHJpbmdcbiAgaWYgKGRlcHRoID4gY29uZmlnLm1heERlcHRoKSB7XG4gICAgcmV0dXJuICdbTWF4IGRlcHRoIGV4Y2VlZGVkXScgYXMgVDtcbiAgfVxuXG4gIC8vIEhhbmRsZSBhcnJheXMgLSByZWN1cnNpdmVseSBzYW5pdGl6ZSBlYWNoIGVsZW1lbnRcbiAgaWYgKEFycmF5LmlzQXJyYXkoZGF0YSkpIHtcbiAgICByZXR1cm4gZGF0YS5tYXAoKGl0ZW0pID0+IHNhbml0aXplKGl0ZW0sIGNvbmZpZywgZGVwdGggKyAxKSkgYXMgVDtcbiAgfVxuXG4gIC8vIEhhbmRsZSBzdHJpbmdzIC0gYXBwbHkgc3RyaW5nLWxldmVsIHNhbml0aXphdGlvblxuICBpZiAodHlwZW9mIGRhdGEgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHNhbml0aXplU3RyaW5nKGRhdGEsIGNvbmZpZykgYXMgVDtcbiAgfVxuXG4gIC8vIEhhbmRsZSBvYmplY3RzIC0gc2FuaXRpemUgYm90aCBrZXlzIGFuZCB2YWx1ZXNcbiAgaWYgKHR5cGVvZiBkYXRhID09PSAnb2JqZWN0Jykge1xuICAgIGNvbnN0IHNhbml0aXplZDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXN0cmljdGVkLXN5bnRheFxuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGRhdGEpKSB7XG4gICAgICAvLyBTYW5pdGl6ZSB0aGUga2V5IGl0c2VsZiB0byBwcmV2ZW50IG1hbGljaW91cyBwcm9wZXJ0eSBuYW1lc1xuICAgICAgY29uc3Qgc2FuaXRpemVkS2V5ID0gc2FuaXRpemVTdHJpbmcoa2V5LCBjb25maWcpO1xuXG4gICAgICAvLyBSZWN1cnNpdmVseSBzYW5pdGl6ZSB0aGUgdmFsdWUsIGluY3JlbWVudGluZyBkZXB0aFxuICAgICAgc2FuaXRpemVkW3Nhbml0aXplZEtleV0gPSBzYW5pdGl6ZSh2YWx1ZSwgY29uZmlnLCBkZXB0aCArIDEpO1xuICAgIH1cblxuICAgIHJldHVybiBzYW5pdGl6ZWQgYXMgVDtcbiAgfVxuXG4gIC8vIFJldHVybiBwcmltaXRpdmVzIGFzLWlzIChudW1iZXJzLCBib29sZWFucywgYmlnaW50cywgc3ltYm9scylcbiAgLy8gVGhlc2UgdHlwZXMgZG9uJ3QgbmVlZCBzYW5pdGl6YXRpb25cbiAgcmV0dXJuIGRhdGE7XG59XG5cbi8qKlxuICogU2FuaXRpemUgYW55IHJlc3BvbnNlIGRhdGEgdG8gcHJldmVudCBYU1MgYXR0YWNrcyBhbmQgc2VjdXJpdHkgdnVsbmVyYWJpbGl0aWVzXG4gKlxuICogVGhpcyBpcyBhIGNvbnZlbmllbmNlIGZ1bmN0aW9uIHRoYXQgbWVyZ2VzIGN1c3RvbSBjb25maWcgd2l0aCBkZWZhdWx0cy5cbiAqIEZvciBkaXJlY3QgY29udHJvbCwgdXNlIHRoZSBgc2FuaXRpemVgIGZ1bmN0aW9uIGRpcmVjdGx5LlxuICpcbiAqIFRoaXMgZnVuY3Rpb246XG4gKiAtIEVzY2FwZXMgSFRNTCBlbnRpdGllcyBpbiBhbGwgc3RyaW5ncyAoQUxXQVlTLCBjYW5ub3QgYmUgZGlzYWJsZWQpXG4gKiAtIFJlbW92ZXMgZGFuZ2Vyb3VzIGNvbnRyb2wgY2hhcmFjdGVycyAoY29uZmlndXJhYmxlKVxuICogLSBUcnVuY2F0ZXMgb3Zlcmx5IGxvbmcgc3RyaW5ncyAoY29uZmlndXJhYmxlKVxuICogLSBIYW5kbGVzIG5lc3RlZCBvYmplY3RzL2FycmF5cyByZWN1cnNpdmVseVxuICogLSBQcmVzZXJ2ZXMgZGF0YSB0eXBlcyAobnVtYmVycywgYm9vbGVhbnMsIG51bGwpXG4gKlxuICogQHBhcmFtIGRhdGEgLSBUaGUgZGF0YSB0byBzYW5pdGl6ZSAob2JqZWN0cywgYXJyYXlzLCBwcmltaXRpdmVzKVxuICogQHBhcmFtIGNvbmZpZyAtIE9wdGlvbmFsIHBhcnRpYWwgY29uZmlndXJhdGlvbiAobWVyZ2VkIHdpdGggZGVmYXVsdHMpXG4gKiBAcmV0dXJucyBTYW5pdGl6ZWQgY29weSBvZiB0aGUgZGF0YSB3aXRoIHNhbWUgdHlwZVxuICpcbiAqIEBleGFtcGxlIEJhc2ljIHVzYWdlIHdpdGggZGVmYXVsdHNcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IHVuc2FmZSA9IHsgbWVzc2FnZTogJzxzY3JpcHQ+YWxlcnQoXCJ4c3NcIik8L3NjcmlwdD4nIH07XG4gKiBjb25zdCBzYWZlID0gc2FuaXRpemVSZXNwb25zZSh1bnNhZmUpO1xuICogLy8gUmVzdWx0OiB7IG1lc3NhZ2U6ICcmbHQ7c2NyaXB0Jmd0O2FsZXJ0KCZxdW90O3hzcyZxdW90OykmbHQ7JiN4MkY7c2NyaXB0Jmd0OycgfVxuICogYGBgXG4gKlxuICogQGV4YW1wbGUgQ3VzdG9tIGNvbmZpZ3VyYXRpb24gZm9yIGxhcmdlIHBheWxvYWRzXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCByZXNwb25zZSA9IHNhbml0aXplUmVzcG9uc2UocHJvY2Vzc29yRGF0YSwge1xuICogICBtYXhTdHJpbmdMZW5ndGg6IDUwMDAwLFxuICogICBtYXhEZXB0aDogNTAsXG4gKiAgIHJlbW92ZUNvbnRyb2xDaGFyczogdHJ1ZVxuICogfSk7XG4gKiBgYGBcbiAqXG4gKiBAZXhhbXBsZSBJbiBhIEtvYSBjb250cm9sbGVyXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBleHBvcnQgY2xhc3MgQ29udHJvbGxlciB7XG4gKiAgIGFzeW5jIHRyYW5zZm9ybShjdHg6IENvbnRleHQpIHtcbiAqICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0cmFuc2Zvcm1EYXRhKGN0eC5yZXF1ZXN0LmJvZHkpO1xuICogICAgIGN0eC5ib2R5ID0gc2FuaXRpemVSZXNwb25zZShyZXN1bHQpO1xuICogICB9XG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNhbml0aXplUmVzcG9uc2U8VD4oZGF0YTogVCwgY29uZmlnPzogUGFydGlhbDxTYW5pdGl6YXRpb25Db25maWc+KTogVCB7XG4gIHJldHVybiBzYW5pdGl6ZShkYXRhLCB7XG4gICAgLi4uREVGQVVMVF9TQU5JVElaQVRJT05fQ09ORklHLFxuICAgIC4uLmNvbmZpZyxcbiAgfSk7XG59XG4iXX0=
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rudderstack/integrations-lib",
3
- "version": "0.2.58",
3
+ "version": "0.2.60",
4
4
  "description": "",
5
5
  "main": "build/index.js",
6
6
  "module": "build/index.js",
@@ -55,11 +55,13 @@
55
55
  "sqlstring": "^2.3.3",
56
56
  "tslib": "^2.4.0",
57
57
  "uuid": "^11.0.5",
58
+ "validator": "^13.15.26",
58
59
  "winston": "^3.11.0",
59
60
  "zod": "^3.24.2"
60
61
  },
61
62
  "devDependencies": {
62
63
  "@commitlint/config-conventional": "^18.5.0",
64
+ "@linear/sdk": "^68.0.0",
63
65
  "@types/get-value": "^3.0.3",
64
66
  "@types/jest": "^29.5.4",
65
67
  "@types/lodash": "^4.14.195",
@@ -67,6 +69,7 @@
67
69
  "@types/set-value": "^4.0.1",
68
70
  "@types/sha256": "^0.2.0",
69
71
  "@types/sqlstring": "^2.3.2",
72
+ "@types/validator": "^13.15.10",
70
73
  "@typescript-eslint/eslint-plugin": "^6.20.0",
71
74
  "@typescript-eslint/parser": "^6.20.0",
72
75
  "axios-mock-adapter": "^2.1.0",