@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 +1 -1
- package/dist/index.js +4 -2
- package/dist/validation.d.ts +29 -0
- package/dist/validation.js +59 -1
- package/package.json +1 -1
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
|
-
|
|
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==
|
package/dist/validation.d.ts
CHANGED
|
@@ -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;
|
package/dist/validation.js
CHANGED
|
@@ -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
|
-
|
|
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy92YWxpZGF0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBTUEsNENBd0JDO0FBS0Qsa0RBaUNDO0FBS0QsZ0RBdUJDO0FBS0Qsc0RBZUM7QUFLRCwwQ0FXQztBQUtELGdDQVVDO0FBZ0JELG9EQW9CQztBQWVELHNDQWtCQztBQXZORCwyQ0FBNkM7QUFFN0M7O0dBRUc7QUFDSCxTQUFnQixnQkFBZ0IsQ0FDOUIsUUFBZ0IsRUFDaEIsV0FBbUIsRUFDbkIsU0FBaUI7SUFFakIsTUFBTSxTQUFTLEdBQUcsMkJBQXFELENBQUE7SUFFdkUsSUFBSSxRQUFRLEtBQUssa0JBQWtCLEVBQUUsQ0FBQztRQUNwQyxPQUFPLDJCQUFlLENBQUMsa0JBQWtCLENBQUMsQ0FBQTtJQUM1QyxDQUFDO0lBRUQsTUFBTSxjQUFjLEdBQUcsU0FBUyxDQUFDLFFBQVEsQ0FFNUIsQ0FBQTtJQUNiLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUNwQixPQUFPLElBQUksQ0FBQTtJQUNiLENBQUM7SUFFRCxNQUFNLGlCQUFpQixHQUFHLGNBQWMsQ0FBQyxXQUFXLENBQUMsQ0FBQTtJQUNyRCxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztRQUN2QixPQUFPLElBQUksQ0FBQTtJQUNiLENBQUM7SUFFRCxPQUFPLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxJQUFJLElBQUksQ0FBQTtBQUM3QyxDQUFDO0FBRUQ7O0dBRUc7QUFDSCxTQUFnQixtQkFBbUIsQ0FDakMsUUFBZ0IsRUFDaEIsV0FBbUIsRUFDbkIsU0FBaUIsRUFDakIsSUFBNEI7SUFFNUIsTUFBTSxNQUFNLEdBQWEsRUFBRSxDQUFBO0lBRTNCLDZCQUE2QjtJQUM3QixNQUFNLFFBQVEsR0FBRyxnQkFBZ0IsQ0FBQyxRQUFRLEVBQUUsV0FBVyxFQUFFLFNBQVMsQ0FBQyxDQUFBO0lBRW5FLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUNkLE1BQU0sQ0FBQyxJQUFJLENBQ1QscUNBQXFDLFFBQVEsbUJBQW1CLFdBQVcsaUJBQWlCLFNBQVMsR0FBRyxDQUN6RyxDQUFBO1FBQ0QsT0FBTyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLENBQUE7SUFDakMsQ0FBQztJQUVELHVDQUF1QztJQUN2QyxNQUFNLGdCQUFnQixHQUFHLFFBQVEsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUNoRCxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsQ0FDbEMsQ0FBQTtJQUVELElBQUksZ0JBQWdCLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQ2hDLE1BQU0sQ0FBQyxJQUFJLENBQ1Qsa0NBQWtDLFNBQVMsS0FBSyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FDOUUsQ0FBQTtJQUNILENBQUM7SUFFRCxPQUFPO1FBQ0wsS0FBSyxFQUFFLE1BQU0sQ0FBQyxNQUFNLEtBQUssQ0FBQztRQUMxQixNQUFNO0tBQ1AsQ0FBQTtBQUNILENBQUM7QUFFRDs7R0FFRztBQUNILFNBQWdCLGtCQUFrQixDQUNoQyxRQUFnQixFQUNoQixXQUFtQjtJQUVuQixNQUFNLFNBQVMsR0FBRywyQkFBcUQsQ0FBQTtJQUV2RSxJQUFJLFFBQVEsS0FBSyxrQkFBa0IsRUFBRSxDQUFDO1FBQ3BDLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxDQUFBO0lBQzdCLENBQUM7SUFFRCxNQUFNLGNBQWMsR0FBRyxTQUFTLENBQUMsUUFBUSxDQUU1QixDQUFBO0lBQ2IsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ3BCLE9BQU8sRUFBRSxDQUFBO0lBQ1gsQ0FBQztJQUVELE1BQU0saUJBQWlCLEdBQUcsY0FBYyxDQUFDLFdBQVcsQ0FBQyxDQUFBO0lBQ3JELElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBQ3ZCLE9BQU8sRUFBRSxDQUFBO0lBQ1gsQ0FBQztJQUVELE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFBO0FBQ3ZDLENBQUM7QUFFRDs7R0FFRztBQUNILFNBQWdCLHFCQUFxQixDQUFDLFFBQWdCO0lBQ3BELE1BQU0sU0FBUyxHQUFHLDJCQUFxRCxDQUFBO0lBRXZFLElBQUksUUFBUSxLQUFLLGtCQUFrQixFQUFFLENBQUM7UUFDcEMsT0FBTyxFQUFFLENBQUE7SUFDWCxDQUFDO0lBRUQsTUFBTSxjQUFjLEdBQUcsU0FBUyxDQUFDLFFBQVEsQ0FFNUIsQ0FBQTtJQUNiLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUNwQixPQUFPLEVBQUUsQ0FBQTtJQUNYLENBQUM7SUFFRCxPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUE7QUFDcEMsQ0FBQztBQUVEOztHQUVHO0FBQ0gsU0FBZ0IsZUFBZSxDQUM3QixRQUFnQixFQUNoQixXQUFtQixFQUNuQixTQUFpQixFQUNqQixXQUFnRDtJQUVoRCxNQUFNLFFBQVEsR0FBRyxnQkFBZ0IsQ0FBQyxRQUFRLEVBQUUsV0FBVyxFQUFFLFNBQVMsQ0FBQyxDQUFBO0lBQ25FLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUNkLE9BQU8sSUFBSSxDQUFBO0lBQ2IsQ0FBQztJQUNELE9BQU8sUUFBUSxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMsQ0FBQTtBQUMzQyxDQUFDO0FBRUQ7O0dBRUc7QUFDSCxTQUFnQixVQUFVLENBQ3hCLFFBQWdCLEVBQ2hCLFdBQW1CLEVBQ25CLFNBQWlCO0lBRWpCLE1BQU0sUUFBUSxHQUFHLGdCQUFnQixDQUFDLFFBQVEsRUFBRSxXQUFXLEVBQUUsU0FBUyxDQUFDLENBQUE7SUFDbkUsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ2QsT0FBTyxJQUFJLENBQUE7SUFDYixDQUFDO0lBQ0QsT0FBTyxRQUFRLENBQUMsT0FBTyxDQUFBO0FBQ3pCLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7OztHQWFHO0FBQ0gsU0FBZ0Isb0JBQW9CLENBQ2xDLEtBQWEsRUFDYixZQUFvQixHQUFHO0lBRXZCLElBQUksU0FBUyxHQUFHLEtBQUs7UUFDbkIsbUZBQW1GO1NBQ2xGLE9BQU8sQ0FBQyxZQUFZLEVBQUUsR0FBRyxDQUFDO1FBQzNCLG9GQUFvRjtTQUNuRixPQUFPLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQztTQUNuQixPQUFPLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQztRQUNwQixvQ0FBb0M7U0FDbkMsT0FBTyxDQUFDLFNBQVMsRUFBRSxHQUFHLENBQUM7U0FDdkIsSUFBSSxFQUFFLENBQUE7SUFFVCxzQ0FBc0M7SUFDdEMsSUFBSSxTQUFTLENBQUMsTUFBTSxHQUFHLFNBQVMsRUFBRSxDQUFDO1FBQ2pDLFNBQVMsR0FBRyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxTQUFTLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLEdBQUcsR0FBRyxDQUFBO0lBQ2hFLENBQUM7SUFFRCxPQUFPLFNBQVMsQ0FBQTtBQUNsQixDQUFDO0FBRUQ7Ozs7Ozs7Ozs7OztHQVlHO0FBQ0gsU0FBZ0IsYUFBYSxDQUMzQixlQUF1QixFQUN2QixJQUE0QixFQUM1QixZQUFvQixHQUFHO0lBRXZCLElBQUksUUFBUSxHQUFHLGVBQWUsQ0FBQTtJQUU5Qiw4REFBOEQ7SUFDOUQsUUFBUSxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxNQUFNLEVBQUUsR0FBVyxFQUFFLEVBQUU7UUFDcEUsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFBO1FBQ3ZCLElBQUksS0FBSyxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ3hCLE9BQU8sb0JBQW9CLENBQUMsS0FBSyxFQUFFLFNBQVMsQ0FBQyxDQUFBO1FBQy9DLENBQUM7UUFDRCxPQUFPLEVBQUUsQ0FBQTtJQUNYLENBQUMsQ0FBQyxDQUFBO0lBRUYsbURBQW1EO0lBQ25ELE9BQU8sb0JBQW9CLENBQUMsUUFBUSxFQUFFLFNBQVMsQ0FBQyxDQUFBO0FBQ2xELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IEVtYWlsVGVtcGxhdGVDb25maWcsIEVtYWlsVmFsaWRhdGlvblJlc3VsdCB9IGZyb20gJy4vdHlwZXMnXG5pbXBvcnQgeyBFTUFJTF9URU1QTEFURVMgfSBmcm9tICcuL3RlbXBsYXRlcydcblxuLyoqXG4gKiBHZXQgZW1haWwgdGVtcGxhdGUgY29uZmlndXJhdGlvbiBmb3IgYSBnaXZlbiBjYXRlZ29yeSwgc3ViY2F0ZWdvcnksIGFuZCBldmVudCB0eXBlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRFbWFpbFRlbXBsYXRlKFxuICBjYXRlZ29yeTogc3RyaW5nLFxuICBzdWJDYXRlZ29yeTogc3RyaW5nLFxuICBldmVudFR5cGU6IHN0cmluZ1xuKTogRW1haWxUZW1wbGF0ZUNvbmZpZyB8IG51bGwge1xuICBjb25zdCB0ZW1wbGF0ZXMgPSBFTUFJTF9URU1QTEFURVMgYXMgdW5rbm93biBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuXG4gIGlmIChjYXRlZ29yeSA9PT0gJ0RlZmF1bHQtVGVtcGxhdGUnKSB7XG4gICAgcmV0dXJuIEVNQUlMX1RFTVBMQVRFU1snRGVmYXVsdC1UZW1wbGF0ZSddXG4gIH1cblxuICBjb25zdCBjYXRlZ29yeUNvbmZpZyA9IHRlbXBsYXRlc1tjYXRlZ29yeV0gYXNcbiAgICB8IFJlY29yZDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIEVtYWlsVGVtcGxhdGVDb25maWc+PlxuICAgIHwgdW5kZWZpbmVkXG4gIGlmICghY2F0ZWdvcnlDb25maWcpIHtcbiAgICByZXR1cm4gbnVsbFxuICB9XG5cbiAgY29uc3Qgc3ViQ2F0ZWdvcnlDb25maWcgPSBjYXRlZ29yeUNvbmZpZ1tzdWJDYXRlZ29yeV1cbiAgaWYgKCFzdWJDYXRlZ29yeUNvbmZpZykge1xuICAgIHJldHVybiBudWxsXG4gIH1cblxuICByZXR1cm4gc3ViQ2F0ZWdvcnlDb25maWdbZXZlbnRUeXBlXSB8fCBudWxsXG59XG5cbi8qKlxuICogVmFsaWRhdGUgZW1haWwgcXVldWUgcGFyYW1ldGVycyBhZ2FpbnN0IHRlbXBsYXRlIGNvbmZpZ3VyYXRpb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlRW1haWxQYXJhbXMoXG4gIGNhdGVnb3J5OiBzdHJpbmcsXG4gIHN1YkNhdGVnb3J5OiBzdHJpbmcsXG4gIGV2ZW50VHlwZTogc3RyaW5nLFxuICBkYXRhOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+XG4pOiBFbWFpbFZhbGlkYXRpb25SZXN1bHQge1xuICBjb25zdCBlcnJvcnM6IHN0cmluZ1tdID0gW11cblxuICAvLyBHZXQgdGVtcGxhdGUgY29uZmlndXJhdGlvblxuICBjb25zdCB0ZW1wbGF0ZSA9IGdldEVtYWlsVGVtcGxhdGUoY2F0ZWdvcnksIHN1YkNhdGVnb3J5LCBldmVudFR5cGUpXG5cbiAgaWYgKCF0ZW1wbGF0ZSkge1xuICAgIGVycm9ycy5wdXNoKFxuICAgICAgYEludmFsaWQgZW1haWwgdGVtcGxhdGU6IGNhdGVnb3J5PVwiJHtjYXRlZ29yeX1cIiwgc3ViQ2F0ZWdvcnk9XCIke3N1YkNhdGVnb3J5fVwiLCBldmVudFR5cGU9XCIke2V2ZW50VHlwZX1cImBcbiAgICApXG4gICAgcmV0dXJuIHsgdmFsaWQ6IGZhbHNlLCBlcnJvcnMgfVxuICB9XG5cbiAgLy8gQ2hlY2sgZm9yIG1pc3NpbmcgcmVxdWlyZWQgdmFyaWFibGVzXG4gIGNvbnN0IG1pc3NpbmdWYXJpYWJsZXMgPSB0ZW1wbGF0ZS52YXJpYWJsZXMuZmlsdGVyKFxuICAgICh2YXJpYWJsZSkgPT4gISh2YXJpYWJsZSBpbiBkYXRhKVxuICApXG5cbiAgaWYgKG1pc3NpbmdWYXJpYWJsZXMubGVuZ3RoID4gMCkge1xuICAgIGVycm9ycy5wdXNoKFxuICAgICAgYE1pc3NpbmcgcmVxdWlyZWQgdmFyaWFibGVzIGZvciAke2V2ZW50VHlwZX06ICR7bWlzc2luZ1ZhcmlhYmxlcy5qb2luKCcsICcpfWBcbiAgICApXG4gIH1cblxuICByZXR1cm4ge1xuICAgIHZhbGlkOiBlcnJvcnMubGVuZ3RoID09PSAwLFxuICAgIGVycm9yc1xuICB9XG59XG5cbi8qKlxuICogR2V0IGFsbCB2YWxpZCBldmVudCB0eXBlcyBmb3IgYSBjYXRlZ29yeSBhbmQgc3ViY2F0ZWdvcnlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFZhbGlkRXZlbnRUeXBlcyhcbiAgY2F0ZWdvcnk6IHN0cmluZyxcbiAgc3ViQ2F0ZWdvcnk6IHN0cmluZ1xuKTogc3RyaW5nW10ge1xuICBjb25zdCB0ZW1wbGF0ZXMgPSBFTUFJTF9URU1QTEFURVMgYXMgdW5rbm93biBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuXG4gIGlmIChjYXRlZ29yeSA9PT0gJ0RlZmF1bHQtVGVtcGxhdGUnKSB7XG4gICAgcmV0dXJuIFsnRGVmYXVsdC1UZW1wbGF0ZSddXG4gIH1cblxuICBjb25zdCBjYXRlZ29yeUNvbmZpZyA9IHRlbXBsYXRlc1tjYXRlZ29yeV0gYXNcbiAgICB8IFJlY29yZDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIEVtYWlsVGVtcGxhdGVDb25maWc+PlxuICAgIHwgdW5kZWZpbmVkXG4gIGlmICghY2F0ZWdvcnlDb25maWcpIHtcbiAgICByZXR1cm4gW11cbiAgfVxuXG4gIGNvbnN0IHN1YkNhdGVnb3J5Q29uZmlnID0gY2F0ZWdvcnlDb25maWdbc3ViQ2F0ZWdvcnldXG4gIGlmICghc3ViQ2F0ZWdvcnlDb25maWcpIHtcbiAgICByZXR1cm4gW11cbiAgfVxuXG4gIHJldHVybiBPYmplY3Qua2V5cyhzdWJDYXRlZ29yeUNvbmZpZylcbn1cblxuLyoqXG4gKiBHZXQgYWxsIHZhbGlkIHN1YmNhdGVnb3JpZXMgZm9yIGEgY2F0ZWdvcnlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFZhbGlkU3ViQ2F0ZWdvcmllcyhjYXRlZ29yeTogc3RyaW5nKTogc3RyaW5nW10ge1xuICBjb25zdCB0ZW1wbGF0ZXMgPSBFTUFJTF9URU1QTEFURVMgYXMgdW5rbm93biBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuXG4gIGlmIChjYXRlZ29yeSA9PT0gJ0RlZmF1bHQtVGVtcGxhdGUnKSB7XG4gICAgcmV0dXJuIFtdXG4gIH1cblxuICBjb25zdCBjYXRlZ29yeUNvbmZpZyA9IHRlbXBsYXRlc1tjYXRlZ29yeV0gYXNcbiAgICB8IFJlY29yZDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIEVtYWlsVGVtcGxhdGVDb25maWc+PlxuICAgIHwgdW5kZWZpbmVkXG4gIGlmICghY2F0ZWdvcnlDb25maWcpIHtcbiAgICByZXR1cm4gW11cbiAgfVxuXG4gIHJldHVybiBPYmplY3Qua2V5cyhjYXRlZ29yeUNvbmZpZylcbn1cblxuLyoqXG4gKiBHZXQgdGhlIFNFUyB0ZW1wbGF0ZSBuYW1lIGZvciBhbiBlbnZpcm9ubWVudFxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0VGVtcGxhdGVOYW1lKFxuICBjYXRlZ29yeTogc3RyaW5nLFxuICBzdWJDYXRlZ29yeTogc3RyaW5nLFxuICBldmVudFR5cGU6IHN0cmluZyxcbiAgZW52aXJvbm1lbnQ6ICdkZXZlbG9wbWVudCcgfCAncWEnIHwgJ3Byb2R1Y3Rpb24nXG4pOiBzdHJpbmcgfCBudWxsIHtcbiAgY29uc3QgdGVtcGxhdGUgPSBnZXRFbWFpbFRlbXBsYXRlKGNhdGVnb3J5LCBzdWJDYXRlZ29yeSwgZXZlbnRUeXBlKVxuICBpZiAoIXRlbXBsYXRlKSB7XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuICByZXR1cm4gdGVtcGxhdGUudGVtcGxhdGVOYW1lW2Vudmlyb25tZW50XVxufVxuXG4vKipcbiAqIEdldCB0aGUgc3ViamVjdCBsaW5lIGZvciBhbiBlbWFpbCB0ZW1wbGF0ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3ViamVjdChcbiAgY2F0ZWdvcnk6IHN0cmluZyxcbiAgc3ViQ2F0ZWdvcnk6IHN0cmluZyxcbiAgZXZlbnRUeXBlOiBzdHJpbmdcbik6IHN0cmluZyB8IG51bGwge1xuICBjb25zdCB0ZW1wbGF0ZSA9IGdldEVtYWlsVGVtcGxhdGUoY2F0ZWdvcnksIHN1YkNhdGVnb3J5LCBldmVudFR5cGUpXG4gIGlmICghdGVtcGxhdGUpIHtcbiAgICByZXR1cm4gbnVsbFxuICB9XG4gIHJldHVybiB0ZW1wbGF0ZS5zdWJqZWN0XG59XG5cbi8qKlxuICogU2FuaXRpemUgYSBzdHJpbmcgdmFsdWUgZm9yIHNhZmUgdXNlIGluIGFuIGVtYWlsIHN1YmplY3QgbGluZS5cbiAqXG4gKiBDdXJseSBicmFjZXMgeyB9IGNhbiBicmVhayBTRVMgdGVtcGxhdGUgcmVuZGVyaW5nIGFuZCBNSU1FIGhlYWRlciBlbmNvZGluZy5cbiAqIE5ld2xpbmVzIGNhbiBjYXVzZSBNSU1FIGhlYWRlciBpbmplY3Rpb24uIExvbmcgc3ViamVjdHMgY2FuIGNhdXNlIGltcHJvcGVyXG4gKiBNSU1FIGhlYWRlciBmb2xkaW5nLlxuICpcbiAqIFRoaXMgZnVuY3Rpb246XG4gKiAtIFN0cmlwcyBuZXdsaW5lIC8gY2FycmlhZ2UgcmV0dXJuIGNoYXJhY3RlcnNcbiAqIC0gUmVwbGFjZXMgY3VybHkgYnJhY2VzIHdpdGggcGFyZW50aGVzZXMgKHByZXNlcnZlcyByZWFkYWJpbGl0eSlcbiAqIC0gQ29sbGFwc2VzIG11bHRpcGxlIHNwYWNlc1xuICogLSBUcmltcyB3aGl0ZXNwYWNlXG4gKiAtIE9wdGlvbmFsbHkgdHJ1bmNhdGVzIHRvIGEgbWF4IGxlbmd0aCAoZGVmYXVsdCAyMDAgY2hhcnMpXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzYW5pdGl6ZVN1YmplY3RWYWx1ZShcbiAgdmFsdWU6IHN0cmluZyxcbiAgbWF4TGVuZ3RoOiBudW1iZXIgPSAyMDBcbik6IHN0cmluZyB7XG4gIGxldCBzYW5pdGl6ZWQgPSB2YWx1ZVxuICAgIC8vIFJlbW92ZSBhbnkgbmV3bGluZSAvIGNhcnJpYWdlIHJldHVybiBjaGFyYWN0ZXJzIChwcmV2ZW50cyBNSU1FIGhlYWRlciBpbmplY3Rpb24pXG4gICAgLnJlcGxhY2UoL1tcXHJcXG5cXHRdKy9nLCAnICcpXG4gICAgLy8gUmVwbGFjZSBjdXJseSBicmFjZXMgd2l0aCBwYXJlbnRoZXNlcyAocHJldmVudHMgU0VTIHRlbXBsYXRlIGVuZ2luZSBpbnRlcmZlcmVuY2UpXG4gICAgLnJlcGxhY2UoL1xcey9nLCAnKCcpXG4gICAgLnJlcGxhY2UoL1xcfS9nLCAnKScpXG4gICAgLy8gQ29sbGFwc2UgbXVsdGlwbGUgc3BhY2VzIGludG8gb25lXG4gICAgLnJlcGxhY2UoL1xcc3syLH0vZywgJyAnKVxuICAgIC50cmltKClcblxuICAvLyBUcnVuY2F0ZSBpZiBuZWVkZWQsIGFkZGluZyBlbGxpcHNpc1xuICBpZiAoc2FuaXRpemVkLmxlbmd0aCA+IG1heExlbmd0aCkge1xuICAgIHNhbml0aXplZCA9IHNhbml0aXplZC5zdWJzdHJpbmcoMCwgbWF4TGVuZ3RoIC0gMSkudHJpbSgpICsgJ+KApidcbiAgfVxuXG4gIHJldHVybiBzYW5pdGl6ZWRcbn1cblxuLyoqXG4gKiBSZW5kZXIgYSBzdWJqZWN0IHRlbXBsYXRlIGJ5IHN1YnN0aXR1dGluZyB7e3ZhcmlhYmxlfX0gcGxhY2Vob2xkZXJzIHdpdGhcbiAqIHNhbml0aXplZCBkYXRhIHZhbHVlcy5cbiAqXG4gKiBFeGFtcGxlOlxuICogICByZW5kZXJTdWJqZWN0KCdBSSBGZWVkYmFjayBvbiB7e3Rhc2tfdGl0bGV9fScsIHsgdGFza190aXRsZTogJy9kcmFmdC97aWR9L2pvaW50cycgfSlcbiAqICAg4oaSICdBSSBGZWVkYmFjayBvbiAvZHJhZnQvKGlkKS9qb2ludHMnXG4gKlxuICogQHBhcmFtIHN1YmplY3RUZW1wbGF0ZSAtIFRoZSBzdWJqZWN0IHRlbXBsYXRlIHN0cmluZyB3aXRoIHt7dmFyaWFibGV9fSBwbGFjZWhvbGRlcnNcbiAqIEBwYXJhbSBkYXRhICAgICAgICAgICAgLSBUaGUgdGVtcGxhdGUgZGF0YSB2YWx1ZXNcbiAqIEBwYXJhbSBtYXhMZW5ndGggICAgICAgLSBNYXhpbXVtIGxlbmd0aCBmb3IgdGhlIGZpbmFsIHJlbmRlcmVkIHN1YmplY3QgKGRlZmF1bHQgMjAwKVxuICogQHJldHVybnMgVGhlIHJlbmRlcmVkIGFuZCBzYW5pdGl6ZWQgc3ViamVjdCBzdHJpbmdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbmRlclN1YmplY3QoXG4gIHN1YmplY3RUZW1wbGF0ZTogc3RyaW5nLFxuICBkYXRhOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LFxuICBtYXhMZW5ndGg6IG51bWJlciA9IDIwMFxuKTogc3RyaW5nIHtcbiAgbGV0IHJlbmRlcmVkID0gc3ViamVjdFRlbXBsYXRlXG5cbiAgLy8gUmVwbGFjZSBhbGwge3t2YXJpYWJsZX19IHBsYWNlaG9sZGVycyB3aXRoIHNhbml0aXplZCB2YWx1ZXNcbiAgcmVuZGVyZWQgPSByZW5kZXJlZC5yZXBsYWNlKC9cXHtcXHsoXFx3KylcXH1cXH0vZywgKF9tYXRjaCwga2V5OiBzdHJpbmcpID0+IHtcbiAgICBjb25zdCB2YWx1ZSA9IGRhdGFba2V5XVxuICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gc2FuaXRpemVTdWJqZWN0VmFsdWUodmFsdWUsIG1heExlbmd0aClcbiAgICB9XG4gICAgcmV0dXJuICcnXG4gIH0pXG5cbiAgLy8gRmluYWwgcGFzczogc2FuaXRpemUgdGhlIGVudGlyZSByZW5kZXJlZCBzdWJqZWN0XG4gIHJldHVybiBzYW5pdGl6ZVN1YmplY3RWYWx1ZShyZW5kZXJlZCwgbWF4TGVuZ3RoKVxufSJdfQ==
|