@livetronics/wocul-email-config 1.4.0 → 1.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/dist/index.d.ts CHANGED
@@ -1,4 +1,4 @@
1
1
  export * from './types';
2
2
  export { EMAIL_TEMPLATES } from './templates';
3
3
  export { default as EMAIL_TEMPLATES_DEFAULT } from './templates';
4
- export { getEmailTemplate, validateEmailParams, getValidEventTypes, getValidSubCategories, getTemplateName, getSubject } from './validation';
4
+ export { getEmailTemplate, validateEmailParams, getValidEventTypes, getValidSubCategories, getTemplateName, getSubject, sanitizeSubjectValue, renderSubject } from './validation';
package/dist/index.js CHANGED
@@ -17,7 +17,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
17
17
  return (mod && mod.__esModule) ? mod : { "default": mod };
18
18
  };
19
19
  Object.defineProperty(exports, "__esModule", { value: true });
20
- exports.getSubject = exports.getTemplateName = exports.getValidSubCategories = exports.getValidEventTypes = exports.validateEmailParams = exports.getEmailTemplate = exports.EMAIL_TEMPLATES_DEFAULT = exports.EMAIL_TEMPLATES = void 0;
20
+ exports.renderSubject = exports.sanitizeSubjectValue = exports.getSubject = exports.getTemplateName = exports.getValidSubCategories = exports.getValidEventTypes = exports.validateEmailParams = exports.getEmailTemplate = exports.EMAIL_TEMPLATES_DEFAULT = exports.EMAIL_TEMPLATES = void 0;
21
21
  // Export all types
22
22
  __exportStar(require("./types"), exports);
23
23
  // Export templates
@@ -33,4 +33,6 @@ Object.defineProperty(exports, "getValidEventTypes", { enumerable: true, get: fu
33
33
  Object.defineProperty(exports, "getValidSubCategories", { enumerable: true, get: function () { return validation_1.getValidSubCategories; } });
34
34
  Object.defineProperty(exports, "getTemplateName", { enumerable: true, get: function () { return validation_1.getTemplateName; } });
35
35
  Object.defineProperty(exports, "getSubject", { enumerable: true, get: function () { return validation_1.getSubject; } });
36
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxtQkFBbUI7QUFDbkIsMENBQXVCO0FBRXZCLG1CQUFtQjtBQUNuQix5Q0FBNkM7QUFBcEMsNEdBQUEsZUFBZSxPQUFBO0FBQ3hCLHlDQUFnRTtBQUF2RCxxSUFBQSxPQUFPLE9BQTJCO0FBRTNDLDhCQUE4QjtBQUM5QiwyQ0FPcUI7QUFObkIsOEdBQUEsZ0JBQWdCLE9BQUE7QUFDaEIsaUhBQUEsbUJBQW1CLE9BQUE7QUFDbkIsZ0hBQUEsa0JBQWtCLE9BQUE7QUFDbEIsbUhBQUEscUJBQXFCLE9BQUE7QUFDckIsNkdBQUEsZUFBZSxPQUFBO0FBQ2Ysd0dBQUEsVUFBVSxPQUFBIiwic291cmNlc0NvbnRlbnQiOlsiLy8gRXhwb3J0IGFsbCB0eXBlc1xuZXhwb3J0ICogZnJvbSAnLi90eXBlcydcblxuLy8gRXhwb3J0IHRlbXBsYXRlc1xuZXhwb3J0IHsgRU1BSUxfVEVNUExBVEVTIH0gZnJvbSAnLi90ZW1wbGF0ZXMnXG5leHBvcnQgeyBkZWZhdWx0IGFzIEVNQUlMX1RFTVBMQVRFU19ERUZBVUxUIH0gZnJvbSAnLi90ZW1wbGF0ZXMnXG5cbi8vIEV4cG9ydCB2YWxpZGF0aW9uIGZ1bmN0aW9uc1xuZXhwb3J0IHtcbiAgZ2V0RW1haWxUZW1wbGF0ZSxcbiAgdmFsaWRhdGVFbWFpbFBhcmFtcyxcbiAgZ2V0VmFsaWRFdmVudFR5cGVzLFxuICBnZXRWYWxpZFN1YkNhdGVnb3JpZXMsXG4gIGdldFRlbXBsYXRlTmFtZSxcbiAgZ2V0U3ViamVjdFxufSBmcm9tICcuL3ZhbGlkYXRpb24nIl19
36
+ Object.defineProperty(exports, "sanitizeSubjectValue", { enumerable: true, get: function () { return validation_1.sanitizeSubjectValue; } });
37
+ Object.defineProperty(exports, "renderSubject", { enumerable: true, get: function () { return validation_1.renderSubject; } });
38
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxtQkFBbUI7QUFDbkIsMENBQXVCO0FBRXZCLG1CQUFtQjtBQUNuQix5Q0FBNkM7QUFBcEMsNEdBQUEsZUFBZSxPQUFBO0FBQ3hCLHlDQUFnRTtBQUF2RCxxSUFBQSxPQUFPLE9BQTJCO0FBRTNDLDhCQUE4QjtBQUM5QiwyQ0FTcUI7QUFSbkIsOEdBQUEsZ0JBQWdCLE9BQUE7QUFDaEIsaUhBQUEsbUJBQW1CLE9BQUE7QUFDbkIsZ0hBQUEsa0JBQWtCLE9BQUE7QUFDbEIsbUhBQUEscUJBQXFCLE9BQUE7QUFDckIsNkdBQUEsZUFBZSxPQUFBO0FBQ2Ysd0dBQUEsVUFBVSxPQUFBO0FBQ1Ysa0hBQUEsb0JBQW9CLE9BQUE7QUFDcEIsMkdBQUEsYUFBYSxPQUFBIiwic291cmNlc0NvbnRlbnQiOlsiLy8gRXhwb3J0IGFsbCB0eXBlc1xuZXhwb3J0ICogZnJvbSAnLi90eXBlcydcblxuLy8gRXhwb3J0IHRlbXBsYXRlc1xuZXhwb3J0IHsgRU1BSUxfVEVNUExBVEVTIH0gZnJvbSAnLi90ZW1wbGF0ZXMnXG5leHBvcnQgeyBkZWZhdWx0IGFzIEVNQUlMX1RFTVBMQVRFU19ERUZBVUxUIH0gZnJvbSAnLi90ZW1wbGF0ZXMnXG5cbi8vIEV4cG9ydCB2YWxpZGF0aW9uIGZ1bmN0aW9uc1xuZXhwb3J0IHtcbiAgZ2V0RW1haWxUZW1wbGF0ZSxcbiAgdmFsaWRhdGVFbWFpbFBhcmFtcyxcbiAgZ2V0VmFsaWRFdmVudFR5cGVzLFxuICBnZXRWYWxpZFN1YkNhdGVnb3JpZXMsXG4gIGdldFRlbXBsYXRlTmFtZSxcbiAgZ2V0U3ViamVjdCxcbiAgc2FuaXRpemVTdWJqZWN0VmFsdWUsXG4gIHJlbmRlclN1YmplY3Rcbn0gZnJvbSAnLi92YWxpZGF0aW9uJyJdfQ==
@@ -23,3 +23,32 @@ export declare function getTemplateName(category: string, subCategory: string, e
23
23
  * Get the subject line for an email template
24
24
  */
25
25
  export declare function getSubject(category: string, subCategory: string, eventType: string): string | null;
26
+ /**
27
+ * Sanitize a string value for safe use in an email subject line.
28
+ *
29
+ * Curly braces { } can break SES template rendering and MIME header encoding.
30
+ * Newlines can cause MIME header injection. Long subjects can cause improper
31
+ * MIME header folding.
32
+ *
33
+ * This function:
34
+ * - Strips newline / carriage return characters
35
+ * - Replaces curly braces with parentheses (preserves readability)
36
+ * - Collapses multiple spaces
37
+ * - Trims whitespace
38
+ * - Optionally truncates to a max length (default 200 chars)
39
+ */
40
+ export declare function sanitizeSubjectValue(value: string, maxLength?: number): string;
41
+ /**
42
+ * Render a subject template by substituting {{variable}} placeholders with
43
+ * sanitized data values.
44
+ *
45
+ * Example:
46
+ * renderSubject('AI Feedback on {{task_title}}', { task_title: '/draft/{id}/joints' })
47
+ * → 'AI Feedback on /draft/(id)/joints'
48
+ *
49
+ * @param subjectTemplate - The subject template string with {{variable}} placeholders
50
+ * @param data - The template data values
51
+ * @param maxLength - Maximum length for the final rendered subject (default 200)
52
+ * @returns The rendered and sanitized subject string
53
+ */
54
+ export declare function renderSubject(subjectTemplate: string, data: Record<string, string>, maxLength?: number): string;
@@ -6,6 +6,8 @@ exports.getValidEventTypes = getValidEventTypes;
6
6
  exports.getValidSubCategories = getValidSubCategories;
7
7
  exports.getTemplateName = getTemplateName;
8
8
  exports.getSubject = getSubject;
9
+ exports.sanitizeSubjectValue = sanitizeSubjectValue;
10
+ exports.renderSubject = renderSubject;
9
11
  const templates_1 = require("./templates");
10
12
  /**
11
13
  * Get email template configuration for a given category, subcategory, and event type
@@ -98,4 +100,60 @@ function getSubject(category, subCategory, eventType) {
98
100
  }
99
101
  return template.subject;
100
102
  }
101
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy92YWxpZGF0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBTUEsNENBd0JDO0FBS0Qsa0RBaUNDO0FBS0QsZ0RBdUJDO0FBS0Qsc0RBZUM7QUFLRCwwQ0FXQztBQUtELGdDQVVDO0FBbEpELDJDQUE2QztBQUU3Qzs7R0FFRztBQUNILFNBQWdCLGdCQUFnQixDQUM5QixRQUFnQixFQUNoQixXQUFtQixFQUNuQixTQUFpQjtJQUVqQixNQUFNLFNBQVMsR0FBRywyQkFBcUQsQ0FBQTtJQUV2RSxJQUFJLFFBQVEsS0FBSyxrQkFBa0IsRUFBRSxDQUFDO1FBQ3BDLE9BQU8sMkJBQWUsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFBO0lBQzVDLENBQUM7SUFFRCxNQUFNLGNBQWMsR0FBRyxTQUFTLENBQUMsUUFBUSxDQUU1QixDQUFBO0lBQ2IsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ3BCLE9BQU8sSUFBSSxDQUFBO0lBQ2IsQ0FBQztJQUVELE1BQU0saUJBQWlCLEdBQUcsY0FBYyxDQUFDLFdBQVcsQ0FBQyxDQUFBO0lBQ3JELElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBQ3ZCLE9BQU8sSUFBSSxDQUFBO0lBQ2IsQ0FBQztJQUVELE9BQU8saUJBQWlCLENBQUMsU0FBUyxDQUFDLElBQUksSUFBSSxDQUFBO0FBQzdDLENBQUM7QUFFRDs7R0FFRztBQUNILFNBQWdCLG1CQUFtQixDQUNqQyxRQUFnQixFQUNoQixXQUFtQixFQUNuQixTQUFpQixFQUNqQixJQUE0QjtJQUU1QixNQUFNLE1BQU0sR0FBYSxFQUFFLENBQUE7SUFFM0IsNkJBQTZCO0lBQzdCLE1BQU0sUUFBUSxHQUFHLGdCQUFnQixDQUFDLFFBQVEsRUFBRSxXQUFXLEVBQUUsU0FBUyxDQUFDLENBQUE7SUFFbkUsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ2QsTUFBTSxDQUFDLElBQUksQ0FDVCxxQ0FBcUMsUUFBUSxtQkFBbUIsV0FBVyxpQkFBaUIsU0FBUyxHQUFHLENBQ3pHLENBQUE7UUFDRCxPQUFPLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsQ0FBQTtJQUNqQyxDQUFDO0lBRUQsdUNBQXVDO0lBQ3ZDLE1BQU0sZ0JBQWdCLEdBQUcsUUFBUSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQ2hELENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxJQUFJLElBQUksQ0FBQyxDQUNsQyxDQUFBO0lBRUQsSUFBSSxnQkFBZ0IsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDaEMsTUFBTSxDQUFDLElBQUksQ0FDVCxrQ0FBa0MsU0FBUyxLQUFLLGdCQUFnQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUM5RSxDQUFBO0lBQ0gsQ0FBQztJQUVELE9BQU87UUFDTCxLQUFLLEVBQUUsTUFBTSxDQUFDLE1BQU0sS0FBSyxDQUFDO1FBQzFCLE1BQU07S0FDUCxDQUFBO0FBQ0gsQ0FBQztBQUVEOztHQUVHO0FBQ0gsU0FBZ0Isa0JBQWtCLENBQ2hDLFFBQWdCLEVBQ2hCLFdBQW1CO0lBRW5CLE1BQU0sU0FBUyxHQUFHLDJCQUFxRCxDQUFBO0lBRXZFLElBQUksUUFBUSxLQUFLLGtCQUFrQixFQUFFLENBQUM7UUFDcEMsT0FBTyxDQUFDLGtCQUFrQixDQUFDLENBQUE7SUFDN0IsQ0FBQztJQUVELE1BQU0sY0FBYyxHQUFHLFNBQVMsQ0FBQyxRQUFRLENBRTVCLENBQUE7SUFDYixJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDcEIsT0FBTyxFQUFFLENBQUE7SUFDWCxDQUFDO0lBRUQsTUFBTSxpQkFBaUIsR0FBRyxjQUFjLENBQUMsV0FBVyxDQUFDLENBQUE7SUFDckQsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFDdkIsT0FBTyxFQUFFLENBQUE7SUFDWCxDQUFDO0lBRUQsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUE7QUFDdkMsQ0FBQztBQUVEOztHQUVHO0FBQ0gsU0FBZ0IscUJBQXFCLENBQUMsUUFBZ0I7SUFDcEQsTUFBTSxTQUFTLEdBQUcsMkJBQXFELENBQUE7SUFFdkUsSUFBSSxRQUFRLEtBQUssa0JBQWtCLEVBQUUsQ0FBQztRQUNwQyxPQUFPLEVBQUUsQ0FBQTtJQUNYLENBQUM7SUFFRCxNQUFNLGNBQWMsR0FBRyxTQUFTLENBQUMsUUFBUSxDQUU1QixDQUFBO0lBQ2IsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ3BCLE9BQU8sRUFBRSxDQUFBO0lBQ1gsQ0FBQztJQUVELE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQTtBQUNwQyxDQUFDO0FBRUQ7O0dBRUc7QUFDSCxTQUFnQixlQUFlLENBQzdCLFFBQWdCLEVBQ2hCLFdBQW1CLEVBQ25CLFNBQWlCLEVBQ2pCLFdBQWdEO0lBRWhELE1BQU0sUUFBUSxHQUFHLGdCQUFnQixDQUFDLFFBQVEsRUFBRSxXQUFXLEVBQUUsU0FBUyxDQUFDLENBQUE7SUFDbkUsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ2QsT0FBTyxJQUFJLENBQUE7SUFDYixDQUFDO0lBQ0QsT0FBTyxRQUFRLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxDQUFBO0FBQzNDLENBQUM7QUFFRDs7R0FFRztBQUNILFNBQWdCLFVBQVUsQ0FDeEIsUUFBZ0IsRUFDaEIsV0FBbUIsRUFDbkIsU0FBaUI7SUFFakIsTUFBTSxRQUFRLEdBQUcsZ0JBQWdCLENBQUMsUUFBUSxFQUFFLFdBQVcsRUFBRSxTQUFTLENBQUMsQ0FBQTtJQUNuRSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDZCxPQUFPLElBQUksQ0FBQTtJQUNiLENBQUM7SUFDRCxPQUFPLFFBQVEsQ0FBQyxPQUFPLENBQUE7QUFDekIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgRW1haWxUZW1wbGF0ZUNvbmZpZywgRW1haWxWYWxpZGF0aW9uUmVzdWx0IH0gZnJvbSAnLi90eXBlcydcbmltcG9ydCB7IEVNQUlMX1RFTVBMQVRFUyB9IGZyb20gJy4vdGVtcGxhdGVzJ1xuXG4vKipcbiAqIEdldCBlbWFpbCB0ZW1wbGF0ZSBjb25maWd1cmF0aW9uIGZvciBhIGdpdmVuIGNhdGVnb3J5LCBzdWJjYXRlZ29yeSwgYW5kIGV2ZW50IHR5cGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEVtYWlsVGVtcGxhdGUoXG4gIGNhdGVnb3J5OiBzdHJpbmcsXG4gIHN1YkNhdGVnb3J5OiBzdHJpbmcsXG4gIGV2ZW50VHlwZTogc3RyaW5nXG4pOiBFbWFpbFRlbXBsYXRlQ29uZmlnIHwgbnVsbCB7XG4gIGNvbnN0IHRlbXBsYXRlcyA9IEVNQUlMX1RFTVBMQVRFUyBhcyB1bmtub3duIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+XG5cbiAgaWYgKGNhdGVnb3J5ID09PSAnRGVmYXVsdC1UZW1wbGF0ZScpIHtcbiAgICByZXR1cm4gRU1BSUxfVEVNUExBVEVTWydEZWZhdWx0LVRlbXBsYXRlJ11cbiAgfVxuXG4gIGNvbnN0IGNhdGVnb3J5Q29uZmlnID0gdGVtcGxhdGVzW2NhdGVnb3J5XSBhc1xuICAgIHwgUmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZywgRW1haWxUZW1wbGF0ZUNvbmZpZz4+XG4gICAgfCB1bmRlZmluZWRcbiAgaWYgKCFjYXRlZ29yeUNvbmZpZykge1xuICAgIHJldHVybiBudWxsXG4gIH1cblxuICBjb25zdCBzdWJDYXRlZ29yeUNvbmZpZyA9IGNhdGVnb3J5Q29uZmlnW3N1YkNhdGVnb3J5XVxuICBpZiAoIXN1YkNhdGVnb3J5Q29uZmlnKSB7XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIHJldHVybiBzdWJDYXRlZ29yeUNvbmZpZ1tldmVudFR5cGVdIHx8IG51bGxcbn1cblxuLyoqXG4gKiBWYWxpZGF0ZSBlbWFpbCBxdWV1ZSBwYXJhbWV0ZXJzIGFnYWluc3QgdGVtcGxhdGUgY29uZmlndXJhdGlvblxuICovXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVFbWFpbFBhcmFtcyhcbiAgY2F0ZWdvcnk6IHN0cmluZyxcbiAgc3ViQ2F0ZWdvcnk6IHN0cmluZyxcbiAgZXZlbnRUeXBlOiBzdHJpbmcsXG4gIGRhdGE6IFJlY29yZDxzdHJpbmcsIHN0cmluZz5cbik6IEVtYWlsVmFsaWRhdGlvblJlc3VsdCB7XG4gIGNvbnN0IGVycm9yczogc3RyaW5nW10gPSBbXVxuXG4gIC8vIEdldCB0ZW1wbGF0ZSBjb25maWd1cmF0aW9uXG4gIGNvbnN0IHRlbXBsYXRlID0gZ2V0RW1haWxUZW1wbGF0ZShjYXRlZ29yeSwgc3ViQ2F0ZWdvcnksIGV2ZW50VHlwZSlcblxuICBpZiAoIXRlbXBsYXRlKSB7XG4gICAgZXJyb3JzLnB1c2goXG4gICAgICBgSW52YWxpZCBlbWFpbCB0ZW1wbGF0ZTogY2F0ZWdvcnk9XCIke2NhdGVnb3J5fVwiLCBzdWJDYXRlZ29yeT1cIiR7c3ViQ2F0ZWdvcnl9XCIsIGV2ZW50VHlwZT1cIiR7ZXZlbnRUeXBlfVwiYFxuICAgIClcbiAgICByZXR1cm4geyB2YWxpZDogZmFsc2UsIGVycm9ycyB9XG4gIH1cblxuICAvLyBDaGVjayBmb3IgbWlzc2luZyByZXF1aXJlZCB2YXJpYWJsZXNcbiAgY29uc3QgbWlzc2luZ1ZhcmlhYmxlcyA9IHRlbXBsYXRlLnZhcmlhYmxlcy5maWx0ZXIoXG4gICAgKHZhcmlhYmxlKSA9PiAhKHZhcmlhYmxlIGluIGRhdGEpXG4gIClcblxuICBpZiAobWlzc2luZ1ZhcmlhYmxlcy5sZW5ndGggPiAwKSB7XG4gICAgZXJyb3JzLnB1c2goXG4gICAgICBgTWlzc2luZyByZXF1aXJlZCB2YXJpYWJsZXMgZm9yICR7ZXZlbnRUeXBlfTogJHttaXNzaW5nVmFyaWFibGVzLmpvaW4oJywgJyl9YFxuICAgIClcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgdmFsaWQ6IGVycm9ycy5sZW5ndGggPT09IDAsXG4gICAgZXJyb3JzXG4gIH1cbn1cblxuLyoqXG4gKiBHZXQgYWxsIHZhbGlkIGV2ZW50IHR5cGVzIGZvciBhIGNhdGVnb3J5IGFuZCBzdWJjYXRlZ29yeVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0VmFsaWRFdmVudFR5cGVzKFxuICBjYXRlZ29yeTogc3RyaW5nLFxuICBzdWJDYXRlZ29yeTogc3RyaW5nXG4pOiBzdHJpbmdbXSB7XG4gIGNvbnN0IHRlbXBsYXRlcyA9IEVNQUlMX1RFTVBMQVRFUyBhcyB1bmtub3duIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+XG5cbiAgaWYgKGNhdGVnb3J5ID09PSAnRGVmYXVsdC1UZW1wbGF0ZScpIHtcbiAgICByZXR1cm4gWydEZWZhdWx0LVRlbXBsYXRlJ11cbiAgfVxuXG4gIGNvbnN0IGNhdGVnb3J5Q29uZmlnID0gdGVtcGxhdGVzW2NhdGVnb3J5XSBhc1xuICAgIHwgUmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZywgRW1haWxUZW1wbGF0ZUNvbmZpZz4+XG4gICAgfCB1bmRlZmluZWRcbiAgaWYgKCFjYXRlZ29yeUNvbmZpZykge1xuICAgIHJldHVybiBbXVxuICB9XG5cbiAgY29uc3Qgc3ViQ2F0ZWdvcnlDb25maWcgPSBjYXRlZ29yeUNvbmZpZ1tzdWJDYXRlZ29yeV1cbiAgaWYgKCFzdWJDYXRlZ29yeUNvbmZpZykge1xuICAgIHJldHVybiBbXVxuICB9XG5cbiAgcmV0dXJuIE9iamVjdC5rZXlzKHN1YkNhdGVnb3J5Q29uZmlnKVxufVxuXG4vKipcbiAqIEdldCBhbGwgdmFsaWQgc3ViY2F0ZWdvcmllcyBmb3IgYSBjYXRlZ29yeVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0VmFsaWRTdWJDYXRlZ29yaWVzKGNhdGVnb3J5OiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IHRlbXBsYXRlcyA9IEVNQUlMX1RFTVBMQVRFUyBhcyB1bmtub3duIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+XG5cbiAgaWYgKGNhdGVnb3J5ID09PSAnRGVmYXVsdC1UZW1wbGF0ZScpIHtcbiAgICByZXR1cm4gW11cbiAgfVxuXG4gIGNvbnN0IGNhdGVnb3J5Q29uZmlnID0gdGVtcGxhdGVzW2NhdGVnb3J5XSBhc1xuICAgIHwgUmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZywgRW1haWxUZW1wbGF0ZUNvbmZpZz4+XG4gICAgfCB1bmRlZmluZWRcbiAgaWYgKCFjYXRlZ29yeUNvbmZpZykge1xuICAgIHJldHVybiBbXVxuICB9XG5cbiAgcmV0dXJuIE9iamVjdC5rZXlzKGNhdGVnb3J5Q29uZmlnKVxufVxuXG4vKipcbiAqIEdldCB0aGUgU0VTIHRlbXBsYXRlIG5hbWUgZm9yIGFuIGVudmlyb25tZW50XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRUZW1wbGF0ZU5hbWUoXG4gIGNhdGVnb3J5OiBzdHJpbmcsXG4gIHN1YkNhdGVnb3J5OiBzdHJpbmcsXG4gIGV2ZW50VHlwZTogc3RyaW5nLFxuICBlbnZpcm9ubWVudDogJ2RldmVsb3BtZW50JyB8ICdxYScgfCAncHJvZHVjdGlvbidcbik6IHN0cmluZyB8IG51bGwge1xuICBjb25zdCB0ZW1wbGF0ZSA9IGdldEVtYWlsVGVtcGxhdGUoY2F0ZWdvcnksIHN1YkNhdGVnb3J5LCBldmVudFR5cGUpXG4gIGlmICghdGVtcGxhdGUpIHtcbiAgICByZXR1cm4gbnVsbFxuICB9XG4gIHJldHVybiB0ZW1wbGF0ZS50ZW1wbGF0ZU5hbWVbZW52aXJvbm1lbnRdXG59XG5cbi8qKlxuICogR2V0IHRoZSBzdWJqZWN0IGxpbmUgZm9yIGFuIGVtYWlsIHRlbXBsYXRlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRTdWJqZWN0KFxuICBjYXRlZ29yeTogc3RyaW5nLFxuICBzdWJDYXRlZ29yeTogc3RyaW5nLFxuICBldmVudFR5cGU6IHN0cmluZ1xuKTogc3RyaW5nIHwgbnVsbCB7XG4gIGNvbnN0IHRlbXBsYXRlID0gZ2V0RW1haWxUZW1wbGF0ZShjYXRlZ29yeSwgc3ViQ2F0ZWdvcnksIGV2ZW50VHlwZSlcbiAgaWYgKCF0ZW1wbGF0ZSkge1xuICAgIHJldHVybiBudWxsXG4gIH1cbiAgcmV0dXJuIHRlbXBsYXRlLnN1YmplY3Rcbn0iXX0=
103
+ /**
104
+ * Sanitize a string value for safe use in an email subject line.
105
+ *
106
+ * Curly braces { } can break SES template rendering and MIME header encoding.
107
+ * Newlines can cause MIME header injection. Long subjects can cause improper
108
+ * MIME header folding.
109
+ *
110
+ * This function:
111
+ * - Strips newline / carriage return characters
112
+ * - Replaces curly braces with parentheses (preserves readability)
113
+ * - Collapses multiple spaces
114
+ * - Trims whitespace
115
+ * - Optionally truncates to a max length (default 200 chars)
116
+ */
117
+ function sanitizeSubjectValue(value, maxLength = 200) {
118
+ let sanitized = value
119
+ // Remove any newline / carriage return characters (prevents MIME header injection)
120
+ .replace(/[\r\n\t]+/g, ' ')
121
+ // Replace curly braces with parentheses (prevents SES template engine interference)
122
+ .replace(/\{/g, '(')
123
+ .replace(/\}/g, ')')
124
+ // Collapse multiple spaces into one
125
+ .replace(/\s{2,}/g, ' ')
126
+ .trim();
127
+ // Truncate if needed, adding ellipsis
128
+ if (sanitized.length > maxLength) {
129
+ sanitized = sanitized.substring(0, maxLength - 1).trim() + '…';
130
+ }
131
+ return sanitized;
132
+ }
133
+ /**
134
+ * Render a subject template by substituting {{variable}} placeholders with
135
+ * sanitized data values.
136
+ *
137
+ * Example:
138
+ * renderSubject('AI Feedback on {{task_title}}', { task_title: '/draft/{id}/joints' })
139
+ * → 'AI Feedback on /draft/(id)/joints'
140
+ *
141
+ * @param subjectTemplate - The subject template string with {{variable}} placeholders
142
+ * @param data - The template data values
143
+ * @param maxLength - Maximum length for the final rendered subject (default 200)
144
+ * @returns The rendered and sanitized subject string
145
+ */
146
+ function renderSubject(subjectTemplate, data, maxLength = 200) {
147
+ let rendered = subjectTemplate;
148
+ // Replace all {{variable}} placeholders with sanitized values
149
+ rendered = rendered.replace(/\{\{(\w+)\}\}/g, (_match, key) => {
150
+ const value = data[key];
151
+ if (value !== undefined) {
152
+ return sanitizeSubjectValue(value, maxLength);
153
+ }
154
+ return '';
155
+ });
156
+ // Final pass: sanitize the entire rendered subject
157
+ return sanitizeSubjectValue(rendered, maxLength);
158
+ }
159
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy92YWxpZGF0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBTUEsNENBd0JDO0FBS0Qsa0RBaUNDO0FBS0QsZ0RBdUJDO0FBS0Qsc0RBZUM7QUFLRCwwQ0FXQztBQUtELGdDQVVDO0FBZ0JELG9EQW9CQztBQWVELHNDQWtCQztBQXZORCwyQ0FBNkM7QUFFN0M7O0dBRUc7QUFDSCxTQUFnQixnQkFBZ0IsQ0FDOUIsUUFBZ0IsRUFDaEIsV0FBbUIsRUFDbkIsU0FBaUI7SUFFakIsTUFBTSxTQUFTLEdBQUcsMkJBQXFELENBQUE7SUFFdkUsSUFBSSxRQUFRLEtBQUssa0JBQWtCLEVBQUUsQ0FBQztRQUNwQyxPQUFPLDJCQUFlLENBQUMsa0JBQWtCLENBQUMsQ0FBQTtJQUM1QyxDQUFDO0lBRUQsTUFBTSxjQUFjLEdBQUcsU0FBUyxDQUFDLFFBQVEsQ0FFNUIsQ0FBQTtJQUNiLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUNwQixPQUFPLElBQUksQ0FBQTtJQUNiLENBQUM7SUFFRCxNQUFNLGlCQUFpQixHQUFHLGNBQWMsQ0FBQyxXQUFXLENBQUMsQ0FBQTtJQUNyRCxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztRQUN2QixPQUFPLElBQUksQ0FBQTtJQUNiLENBQUM7SUFFRCxPQUFPLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxJQUFJLElBQUksQ0FBQTtBQUM3QyxDQUFDO0FBRUQ7O0dBRUc7QUFDSCxTQUFnQixtQkFBbUIsQ0FDakMsUUFBZ0IsRUFDaEIsV0FBbUIsRUFDbkIsU0FBaUIsRUFDakIsSUFBNEI7SUFFNUIsTUFBTSxNQUFNLEdBQWEsRUFBRSxDQUFBO0lBRTNCLDZCQUE2QjtJQUM3QixNQUFNLFFBQVEsR0FBRyxnQkFBZ0IsQ0FBQyxRQUFRLEVBQUUsV0FBVyxFQUFFLFNBQVMsQ0FBQyxDQUFBO0lBRW5FLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FB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dGVudCI6WyJpbXBvcnQgdHlwZSB7IEVtYWlsVGVtcGxhdGVDb25maWcsIEVtYWlsVmFsaWRhdGlvblJlc3VsdCB9IGZyb20gJy4vdHlwZXMnXG5pbXBvcnQgeyBFTUFJTF9URU1QTEFURVMgfSBmcm9tICcuL3RlbXBsYXRlcydcblxuLyoqXG4gKiBHZXQgZW1haWwgdGVtcGxhdGUgY29uZmlndXJhdGlvbiBmb3IgYSBnaXZlbiBjYXRlZ29yeSwgc3ViY2F0ZWdvcnksIGFuZCBldmVudCB0eXBlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRFbWFpbFRlbXBsYXRlKFxuICBjYXRlZ29yeTogc3RyaW5nLFxuICBzdWJDYXRlZ29yeTogc3RyaW5nLFxuICBldmVudFR5cGU6IHN0cmluZ1xuKTogRW1haWxUZW1wbGF0ZUNvbmZpZyB8IG51bGwge1xuICBjb25zdCB0ZW1wbGF0ZXMgPSBFTUFJTF9URU1QTEFURVMgYXMgdW5rbm93biBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuXG4gIGlmIChjYXRlZ29yeSA9PT0gJ0RlZmF1bHQtVGVtcGxhdGUnKSB7XG4gICAgcmV0dXJuIEVNQUlMX1RFTVBMQVRFU1snRGVmYXVsdC1UZW1wbGF0ZSddXG4gIH1cblxuICBjb25zdCBjYXRlZ29yeUNvbmZpZyA9IHRlbXBsYXRlc1tjYXRlZ29yeV0gYXNcbiAgICB8IFJlY29yZDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIEVtYWlsVGVtcGxhdGVDb25maWc+PlxuICAgIHwgdW5kZWZpbmVkXG4gIGlmICghY2F0ZWdvcnlDb25maWcpIHtcbiAgICByZXR1cm4gbnVsbFxuICB9XG5cbiAgY29uc3Qgc3ViQ2F0ZWdvcnlDb25maWcgPSBjYXRlZ29yeUNvbmZpZ1tzdWJDYXRlZ29yeV1cbiAgaWYgKCFzdWJDYXRlZ29yeUNvbmZpZykge1xuICAgIHJldHVybiBudWxsXG4gIH1cblxuICByZXR1cm4gc3ViQ2F0ZWdvcnlDb25maWdbZXZlbnRUeXBlXSB8fCBudWxsXG59XG5cbi8qKlxuICogVmFsaWRhdGUgZW1haWwgcXVldWUgcGFyYW1ldGVycyBhZ2FpbnN0IHRlbXBsYXRlIGNvbmZpZ3VyYXRpb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlRW1haWxQYXJhbXMoXG4gIGNhdGVnb3J5OiBzdHJpbmcsXG4gIHN1YkNhdGVnb3J5OiBzdHJpbmcsXG4gIGV2ZW50VHlwZTogc3RyaW5nLFxuICBkYXRhOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+XG4pOiBFbWFpbFZhbGlkYXRpb25SZXN1bHQge1xuICBjb25zdCBlcnJvcnM6IHN0cmluZ1tdID0gW11cblxuICAvLyBHZXQgdGVtcGxhdGUgY29uZmlndXJhdGlvblxuICBjb25zdCB0ZW1wbGF0ZSA9IGdldEVtYWlsVGVtcGxhdGUoY2F0ZWdvcnksIHN1YkNhdGVnb3J5LCBldmVudFR5cGUpXG5cbiAgaWYgKCF0ZW1wbGF0ZSkge1xuICAgIGVycm9ycy5wdXNoKFxuICAgICAgYEludmFsaWQgZW1haWwgdGVtcGxhdGU6IGNhdGVnb3J5PVwiJHtjYXRlZ29yeX1cIiwgc3ViQ2F0ZWdvcnk9XCIke3N1YkNhdGVnb3J5fVwiLCBldmVudFR5cGU9XCIke2V2ZW50VHlwZX1cImBcbiAgICApXG4gICAgcmV0dXJuIHsgdmFsaWQ6IGZhbHNlLCBlcnJvcnMgfVxuICB9XG5cbiAgLy8gQ2hlY2sgZm9yIG1pc3NpbmcgcmVxdWlyZWQgdmFyaWFibGVzXG4gIGNvbnN0IG1pc3NpbmdWYXJpYWJsZXMgPSB0ZW1wbGF0ZS52YXJpYWJsZXMuZmlsdGVyKFxuICAgICh2YXJpYWJsZSkgPT4gISh2YXJpYWJsZSBpbiBkYXRhKVxuICApXG5cbiAgaWYgKG1pc3NpbmdWYXJpYWJsZXMubGVuZ3RoID4gMCkge1xuICAgIGVycm9ycy5wdXNoKFxuICAgICAgYE1pc3NpbmcgcmVxdWlyZWQgdmFyaWFibGVzIGZvciAke2V2ZW50VHlwZX06ICR7bWlzc2luZ1ZhcmlhYmxlcy5qb2luKCcsICcpfWBcbiAgICApXG4gIH1cblxuICByZXR1cm4ge1xuICAgIHZhbGlkOiBlcnJvcnMubGVuZ3RoID09PSAwLFxuICAgIGVycm9yc1xuICB9XG59XG5cbi8qKlxuICogR2V0IGFsbCB2YWxpZCBldmVudCB0eXBlcyBmb3IgYSBjYXRlZ29yeSBhbmQgc3ViY2F0ZWdvcnlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFZhbGlkRXZlbnRUeXBlcyhcbiAgY2F0ZWdvcnk6IHN0cmluZyxcbiAgc3ViQ2F0ZWdvcnk6IHN0cmluZ1xuKTogc3RyaW5nW10ge1xuICBjb25zdCB0ZW1wbGF0ZXMgPSBFTUFJTF9URU1QTEFURVMgYXMgdW5rbm93biBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuXG4gIGlmIChjYXRlZ29yeSA9PT0gJ0RlZmF1bHQtVGVtcGxhdGUnKSB7XG4gICAgcmV0dXJuIFsnRGVmYXVsdC1UZW1wbGF0ZSddXG4gIH1cblxuICBjb25zdCBjYXRlZ29yeUNvbmZpZyA9IHRlbXBsYXRlc1tjYXRlZ29yeV0gYXNcbiAgICB8IFJlY29yZDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIEVtYWlsVGVtcGxhdGVDb25maWc+PlxuICAgIHwgdW5kZWZpbmVkXG4gIGlmICghY2F0ZWdvcnlDb25maWcpIHtcbiAgICByZXR1cm4gW11cbiAgfVxuXG4gIGNvbnN0IHN1YkNhdGVnb3J5Q29uZmlnID0gY2F0ZWdvcnlDb25maWdbc3ViQ2F0ZWdvcnldXG4gIGlmICghc3ViQ2F0ZWdvcnlDb25maWcpIHtcbiAgICByZXR1cm4gW11cbiAgfVxuXG4gIHJldHVybiBPYmplY3Qua2V5cyhzdWJDYXRlZ29yeUNvbmZpZylcbn1cblxuLyoqXG4gKiBHZXQgYWxsIHZhbGlkIHN1YmNhdGVnb3JpZXMgZm9yIGEgY2F0ZWdvcnlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFZhbGlkU3ViQ2F0ZWdvcmllcyhjYXRlZ29yeTogc3RyaW5nKTogc3RyaW5nW10ge1xuICBjb25zdCB0ZW1wbGF0ZXMgPSBFTUFJTF9URU1QTEFURVMgYXMgdW5rbm93biBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuXG4gIGlmIChjYXRlZ29yeSA9PT0gJ0RlZmF1bHQtVGVtcGxhdGUnKSB7XG4gICAgcmV0dXJuIFtdXG4gIH1cblxuICBjb25zdCBjYXRlZ29yeUNvbmZpZyA9IHRlbXBsYXRlc1tjYXRlZ29yeV0gYXNcbiAgICB8IFJlY29yZDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIEVtYWlsVGVtcGxhdGVDb25maWc+PlxuICAgIHwgdW5kZWZpbmVkXG4gIGlmICghY2F0ZWdvcnlDb25maWcpIHtcbiAgICByZXR1cm4gW11cbiAgfVxuXG4gIHJldHVybiBPYmplY3Qua2V5cyhjYXRlZ29yeUNvbmZpZylcbn1cblxuLyoqXG4gKiBHZXQgdGhlIFNFUyB0ZW1wbGF0ZSBuYW1lIGZvciBhbiBlbnZpcm9ubWVudFxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0VGVtcGxhdGVOYW1lKFxuICBjYXRlZ29yeTogc3RyaW5nLFxuICBzdWJDYXRlZ29yeTogc3RyaW5nLFxuICBldmVudFR5cGU6IHN0cmluZyxcbiAgZW52aXJvbm1lbnQ6ICdkZXZlbG9wbWVudCcgfCAncWEnIHwgJ3Byb2R1Y3Rpb24nXG4pOiBzdHJpbmcgfCBudWxsIHtcbiAgY29uc3QgdGVtcGxhdGUgPSBnZXRFbWFpbFRlbXBsYXRlKGNhdGVnb3J5LCBzdWJDYXRlZ29yeSwgZXZlbnRUeXBlKVxuICBpZiAoIXRlbXBsYXRlKSB7XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuICByZXR1cm4gdGVtcGxhdGUudGVtcGxhdGVOYW1lW2Vudmlyb25tZW50XVxufVxuXG4vKipcbiAqIEdldCB0aGUgc3ViamVjdCBsaW5lIGZvciBhbiBlbWFpbCB0ZW1wbGF0ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3ViamVjdChcbiAgY2F0ZWdvcnk6IHN0cmluZyxcbiAgc3ViQ2F0ZWdvcnk6IHN0cmluZyxcbiAgZXZlbnRUeXBlOiBzdHJpbmdcbik6IHN0cmluZyB8IG51bGwge1xuICBjb25zdCB0ZW1wbGF0ZSA9IGdldEVtYWlsVGVtcGxhdGUoY2F0ZWdvcnksIHN1YkNhdGVnb3J5LCBldmVudFR5cGUpXG4gIGlmICghdGVtcGxhdGUpIHtcbiAgICByZXR1cm4gbnVsbFxuICB9XG4gIHJldHVybiB0ZW1wbGF0ZS5zdWJqZWN0XG59XG5cbi8qKlxuICogU2FuaXRpemUgYSBzdHJpbmcgdmFsdWUgZm9yIHNhZmUgdXNlIGluIGFuIGVtYWlsIHN1YmplY3QgbGluZS5cbiAqXG4gKiBDdXJseSBicmFjZXMgeyB9IGNhbiBicmVhayBTRVMgdGVtcGxhdGUgcmVuZGVyaW5nIGFuZCBNSU1FIGhlYWRlciBlbmNvZGluZy5cbiAqIE5ld2xpbmVzIGNhbiBjYXVzZSBNSU1FIGhlYWRlciBpbmplY3Rpb24uIExvbmcgc3ViamVjdHMgY2FuIGNhdXNlIGltcHJvcGVyXG4gKiBNSU1FIGhlYWRlciBmb2xkaW5nLlxuICpcbiAqIFRoaXMgZnVuY3Rpb246XG4gKiAtIFN0cmlwcyBuZXdsaW5lIC8gY2FycmlhZ2UgcmV0dXJuIGNoYXJhY3RlcnNcbiAqIC0gUmVwbGFjZXMgY3VybHkgYnJhY2VzIHdpdGggcGFyZW50aGVzZXMgKHByZXNlcnZlcyByZWFkYWJpbGl0eSlcbiAqIC0gQ29sbGFwc2VzIG11bHRpcGxlIHNwYWNlc1xuICogLSBUcmltcyB3aGl0ZXNwYWNlXG4gKiAtIE9wdGlvbmFsbHkgdHJ1bmNhdGVzIHRvIGEgbWF4IGxlbmd0aCAoZGVmYXVsdCAyMDAgY2hhcnMpXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzYW5pdGl6ZVN1YmplY3RWYWx1ZShcbiAgdmFsdWU6IHN0cmluZyxcbiAgbWF4TGVuZ3RoOiBudW1iZXIgPSAyMDBcbik6IHN0cmluZyB7XG4gIGxldCBzYW5pdGl6ZWQgPSB2YWx1ZVxuICAgIC8vIFJlbW92ZSBhbnkgbmV3bGluZSAvIGNhcnJpYWdlIHJldHVybiBjaGFyYWN0ZXJzIChwcmV2ZW50cyBNSU1FIGhlYWRlciBpbmplY3Rpb24pXG4gICAgLnJlcGxhY2UoL1tcXHJcXG5cXHRdKy9nLCAnICcpXG4gICAgLy8gUmVwbGFjZSBjdXJseSBicmFjZXMgd2l0aCBwYXJlbnRoZXNlcyAocHJldmVudHMgU0VTIHRlbXBsYXRlIGVuZ2luZSBpbnRlcmZlcmVuY2UpXG4gICAgLnJlcGxhY2UoL1xcey9nLCAnKCcpXG4gICAgLnJlcGxhY2UoL1xcfS9nLCAnKScpXG4gICAgLy8gQ29sbGFwc2UgbXVsdGlwbGUgc3BhY2VzIGludG8gb25lXG4gICAgLnJlcGxhY2UoL1xcc3syLH0vZywgJyAnKVxuICAgIC50cmltKClcblxuICAvLyBUcnVuY2F0ZSBpZiBuZWVkZWQsIGFkZGluZyBlbGxpcHNpc1xuICBpZiAoc2FuaXRpemVkLmxlbmd0aCA+IG1heExlbmd0aCkge1xuICAgIHNhbml0aXplZCA9IHNhbml0aXplZC5zdWJzdHJpbmcoMCwgbWF4TGVuZ3RoIC0gMSkudHJpbSgpICsgJ+KApidcbiAgfVxuXG4gIHJldHVybiBzYW5pdGl6ZWRcbn1cblxuLyoqXG4gKiBSZW5kZXIgYSBzdWJqZWN0IHRlbXBsYXRlIGJ5IHN1YnN0aXR1dGluZyB7e3ZhcmlhYmxlfX0gcGxhY2Vob2xkZXJzIHdpdGhcbiAqIHNhbml0aXplZCBkYXRhIHZhbHVlcy5cbiAqXG4gKiBFeGFtcGxlOlxuICogICByZW5kZXJTdWJqZWN0KCdBSSBGZWVkYmFjayBvbiB7e3Rhc2tfdGl0bGV9fScsIHsgdGFza190aXRsZTogJy9kcmFmdC97aWR9L2pvaW50cycgfSlcbiAqICAg4oaSICdBSSBGZWVkYmFjayBvbiAvZHJhZnQvKGlkKS9qb2ludHMnXG4gKlxuICogQHBhcmFtIHN1YmplY3RUZW1wbGF0ZSAtIFRoZSBzdWJqZWN0IHRlbXBsYXRlIHN0cmluZyB3aXRoIHt7dmFyaWFibGV9fSBwbGFjZWhvbGRlcnNcbiAqIEBwYXJhbSBkYXRhICAgICAgICAgICAgLSBUaGUgdGVtcGxhdGUgZGF0YSB2YWx1ZXNcbiAqIEBwYXJhbSBtYXhMZW5ndGggICAgICAgLSBNYXhpbXVtIGxlbmd0aCBmb3IgdGhlIGZpbmFsIHJlbmRlcmVkIHN1YmplY3QgKGRlZmF1bHQgMjAwKVxuICogQHJldHVybnMgVGhlIHJlbmRlcmVkIGFuZCBzYW5pdGl6ZWQgc3ViamVjdCBzdHJpbmdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbmRlclN1YmplY3QoXG4gIHN1YmplY3RUZW1wbGF0ZTogc3RyaW5nLFxuICBkYXRhOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LFxuICBtYXhMZW5ndGg6IG51bWJlciA9IDIwMFxuKTogc3RyaW5nIHtcbiAgbGV0IHJlbmRlcmVkID0gc3ViamVjdFRlbXBsYXRlXG5cbiAgLy8gUmVwbGFjZSBhbGwge3t2YXJpYWJsZX19IHBsYWNlaG9sZGVycyB3aXRoIHNhbml0aXplZCB2YWx1ZXNcbiAgcmVuZGVyZWQgPSByZW5kZXJlZC5yZXBsYWNlKC9cXHtcXHsoXFx3KylcXH1cXH0vZywgKF9tYXRjaCwga2V5OiBzdHJpbmcpID0+IHtcbiAgICBjb25zdCB2YWx1ZSA9IGRhdGFba2V5XVxuICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gc2FuaXRpemVTdWJqZWN0VmFsdWUodmFsdWUsIG1heExlbmd0aClcbiAgICB9XG4gICAgcmV0dXJuICcnXG4gIH0pXG5cbiAgLy8gRmluYWwgcGFzczogc2FuaXRpemUgdGhlIGVudGlyZSByZW5kZXJlZCBzdWJqZWN0XG4gIHJldHVybiBzYW5pdGl6ZVN1YmplY3RWYWx1ZShyZW5kZXJlZCwgbWF4TGVuZ3RoKVxufSJdfQ==
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@livetronics/wocul-email-config",
3
- "version": "1.4.0",
3
+ "version": "1.5.0",
4
4
  "description": "Email configuration utilities for Wocul services",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",