@decaf-ts/utils 0.1.6

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 (112) hide show
  1. package/LICENSE.md +157 -0
  2. package/README.md +95 -0
  3. package/dist/esm/utils.js +1 -0
  4. package/dist/types/bin/tag-release.d.ts +1 -0
  5. package/dist/types/bin/update-scripts.d.ts +1 -0
  6. package/dist/types/cli/command.d.ts +110 -0
  7. package/dist/types/cli/commands/index.d.ts +2 -0
  8. package/dist/types/cli/commands/tag-release.d.ts +105 -0
  9. package/dist/types/cli/commands/update-scripts.d.ts +211 -0
  10. package/dist/types/cli/constants.d.ts +73 -0
  11. package/dist/types/cli/index.d.ts +4 -0
  12. package/dist/types/cli/types.d.ts +28 -0
  13. package/dist/types/index.d.ts +39 -0
  14. package/dist/types/input/index.d.ts +2 -0
  15. package/dist/types/input/input.d.ts +472 -0
  16. package/dist/types/input/types.d.ts +76 -0
  17. package/dist/types/output/common.d.ts +51 -0
  18. package/dist/types/output/index.d.ts +3 -0
  19. package/dist/types/output/logging.d.ts +177 -0
  20. package/dist/types/output/types.d.ts +203 -0
  21. package/dist/types/utils/accumulator.d.ts +105 -0
  22. package/dist/types/utils/constants.d.ts +136 -0
  23. package/dist/types/utils/environment.d.ts +57 -0
  24. package/dist/types/utils/fs.d.ts +133 -0
  25. package/dist/types/utils/http.d.ts +41 -0
  26. package/dist/types/utils/index.d.ts +7 -0
  27. package/dist/types/utils/md.d.ts +156 -0
  28. package/dist/types/utils/tests.d.ts +170 -0
  29. package/dist/types/utils/text.d.ts +106 -0
  30. package/dist/types/utils/timeout.d.ts +1 -0
  31. package/dist/types/utils/types.d.ts +81 -0
  32. package/dist/types/utils/utils.d.ts +91 -0
  33. package/dist/types/utils/web.d.ts +7 -0
  34. package/dist/types/writers/OutputWriter.d.ts +49 -0
  35. package/dist/types/writers/RegexpOutputWriter.d.ts +69 -0
  36. package/dist/types/writers/StandardOutputWriter.d.ts +91 -0
  37. package/dist/types/writers/index.d.ts +4 -0
  38. package/dist/types/writers/types.d.ts +29 -0
  39. package/dist/utils.js +1 -0
  40. package/lib/assets/slogans.json +802 -0
  41. package/lib/bin/tag-release.cjs +12 -0
  42. package/lib/bin/update-scripts.cjs +12 -0
  43. package/lib/cli/command.cjs +153 -0
  44. package/lib/cli/commands/index.cjs +20 -0
  45. package/lib/cli/commands/tag-release.cjs +168 -0
  46. package/lib/cli/commands/update-scripts.cjs +511 -0
  47. package/lib/cli/constants.cjs +80 -0
  48. package/lib/cli/index.cjs +22 -0
  49. package/lib/cli/types.cjs +4 -0
  50. package/lib/esm/assets/slogans.json +802 -0
  51. package/lib/esm/bin/tag-release.js +10 -0
  52. package/lib/esm/bin/update-scripts.js +10 -0
  53. package/lib/esm/cli/command.js +149 -0
  54. package/lib/esm/cli/commands/index.js +4 -0
  55. package/lib/esm/cli/commands/tag-release.js +164 -0
  56. package/lib/esm/cli/commands/update-scripts.js +504 -0
  57. package/lib/esm/cli/constants.js +77 -0
  58. package/lib/esm/cli/index.js +6 -0
  59. package/lib/esm/cli/types.js +3 -0
  60. package/lib/esm/index.js +41 -0
  61. package/lib/esm/input/index.js +4 -0
  62. package/lib/esm/input/input.js +570 -0
  63. package/lib/esm/input/types.js +3 -0
  64. package/lib/esm/output/common.js +93 -0
  65. package/lib/esm/output/index.js +5 -0
  66. package/lib/esm/output/logging.js +350 -0
  67. package/lib/esm/output/types.js +3 -0
  68. package/lib/esm/utils/accumulator.js +145 -0
  69. package/lib/esm/utils/constants.js +176 -0
  70. package/lib/esm/utils/environment.js +91 -0
  71. package/lib/esm/utils/fs.js +271 -0
  72. package/lib/esm/utils/http.js +70 -0
  73. package/lib/esm/utils/index.js +9 -0
  74. package/lib/esm/utils/md.js +3 -0
  75. package/lib/esm/utils/tests.js +223 -0
  76. package/lib/esm/utils/text.js +142 -0
  77. package/lib/esm/utils/timeout.js +5 -0
  78. package/lib/esm/utils/types.js +3 -0
  79. package/lib/esm/utils/utils.js +220 -0
  80. package/lib/esm/utils/web.js +12 -0
  81. package/lib/esm/writers/OutputWriter.js +3 -0
  82. package/lib/esm/writers/RegexpOutputWriter.js +98 -0
  83. package/lib/esm/writers/StandardOutputWriter.js +127 -0
  84. package/lib/esm/writers/index.js +6 -0
  85. package/lib/esm/writers/types.js +3 -0
  86. package/lib/index.cjs +58 -0
  87. package/lib/input/index.cjs +20 -0
  88. package/lib/input/input.cjs +577 -0
  89. package/lib/input/types.cjs +4 -0
  90. package/lib/output/common.cjs +100 -0
  91. package/lib/output/index.cjs +21 -0
  92. package/lib/output/logging.cjs +355 -0
  93. package/lib/output/types.cjs +4 -0
  94. package/lib/utils/accumulator.cjs +149 -0
  95. package/lib/utils/constants.cjs +179 -0
  96. package/lib/utils/environment.cjs +95 -0
  97. package/lib/utils/fs.cjs +288 -0
  98. package/lib/utils/http.cjs +77 -0
  99. package/lib/utils/index.cjs +25 -0
  100. package/lib/utils/md.cjs +4 -0
  101. package/lib/utils/tests.cjs +263 -0
  102. package/lib/utils/text.cjs +153 -0
  103. package/lib/utils/timeout.cjs +8 -0
  104. package/lib/utils/types.cjs +4 -0
  105. package/lib/utils/utils.cjs +226 -0
  106. package/lib/utils/web.cjs +15 -0
  107. package/lib/writers/OutputWriter.cjs +4 -0
  108. package/lib/writers/RegexpOutputWriter.cjs +102 -0
  109. package/lib/writers/StandardOutputWriter.cjs +131 -0
  110. package/lib/writers/index.cjs +22 -0
  111. package/lib/writers/types.cjs +4 -0
  112. package/package.json +121 -0
@@ -0,0 +1,223 @@
1
+ import path from "path";
2
+ import fs from "fs";
3
+ import { installIfNotAvailable } from "./fs";
4
+ export const JestReportersTempPathEnvKey = "JEST_HTML_REPORTERS_TEMP_DIR_PATH";
5
+ const dependencies = ["jest-html-reporters", "json2md", "chartjs-node-canvas"];
6
+ async function normalizeImport(importPromise) {
7
+ // CommonJS's `module.exports` is wrapped as `default` in ESModule.
8
+ return importPromise.then((m) => (m.default || m));
9
+ }
10
+ /**
11
+ * @description Test reporting utility class for managing test results and evidence
12
+ * @summary A comprehensive test reporter that handles various types of test artifacts including messages,
13
+ * attachments, data, images, tables, and graphs. It provides methods to report and store test evidence
14
+ * in different formats and manages dependencies for reporting functionality.
15
+ *
16
+ * @template T - Type of data being reported
17
+ * @param {string} [testCase="tests"] - Name of the test case
18
+ * @param {string} [basePath] - Base path for storing test reports
19
+ * @class
20
+ *
21
+ * @example
22
+ * ```typescript
23
+ * const reporter = new TestReporter('login-test');
24
+ *
25
+ * // Report test messages
26
+ * await reporter.reportMessage('Test Started', 'Login flow initiated');
27
+ *
28
+ * // Report test data
29
+ * await reporter.reportData('user-credentials', { username: 'test' }, 'json');
30
+ *
31
+ * // Report test results table
32
+ * await reporter.reportTable('test-results', {
33
+ * headers: ['Step', 'Status'],
34
+ * rows: [
35
+ * { Step: 'Login', Status: 'Pass' },
36
+ * { Step: 'Validation', Status: 'Pass' }
37
+ * ]
38
+ * });
39
+ *
40
+ * // Report test evidence
41
+ * await reporter.reportAttachment('Screenshot', screenshotBuffer);
42
+ * ```
43
+ *
44
+ * @mermaid
45
+ * sequenceDiagram
46
+ * participant Client
47
+ * participant TestReporter
48
+ * participant FileSystem
49
+ * participant Dependencies
50
+ *
51
+ * Client->>TestReporter: new TestReporter(testCase, basePath)
52
+ * TestReporter->>FileSystem: Create report directory
53
+ *
54
+ * alt Report Message
55
+ * Client->>TestReporter: reportMessage(title, message)
56
+ * TestReporter->>Dependencies: Import helpers
57
+ * TestReporter->>FileSystem: Store message
58
+ * else Report Data
59
+ * Client->>TestReporter: reportData(reference, data, type)
60
+ * TestReporter->>Dependencies: Process data
61
+ * TestReporter->>FileSystem: Store formatted data
62
+ * else Report Table
63
+ * Client->>TestReporter: reportTable(reference, tableDef)
64
+ * TestReporter->>Dependencies: Convert to MD format
65
+ * TestReporter->>FileSystem: Store table
66
+ * end
67
+ */
68
+ export class TestReporter {
69
+ constructor(testCase = "tests", basePath = path.join(process.cwd(), "workdocs", "reports", "evidences")) {
70
+ this.testCase = testCase;
71
+ this.basePath = basePath;
72
+ this.basePath = path.join(basePath, this.testCase);
73
+ if (!fs.existsSync(this.basePath)) {
74
+ fs.mkdirSync(basePath, { recursive: true });
75
+ }
76
+ }
77
+ /**
78
+ * @description Imports required helper functions
79
+ * @summary Ensures all necessary dependencies are available and imports helper functions
80
+ * @return {Promise<void>} Promise that resolves when helpers are imported
81
+ */
82
+ async importHelpers() {
83
+ this.deps = await installIfNotAvailable([dependencies[0]], this.deps);
84
+ // if (!process.env[JestReportersTempPathEnvKey])
85
+ // process.env[JestReportersTempPathEnvKey] = './workdocs/reports';
86
+ const { addMsg, addAttach } = await normalizeImport(import(`${dependencies[0]}/helper`));
87
+ TestReporter.addMsgFunction = addMsg;
88
+ TestReporter.addAttachFunction = addAttach;
89
+ }
90
+ /**
91
+ * @description Reports a message to the test report
92
+ * @summary Adds a formatted message to the test report with an optional title
93
+ * @param {string} title - Title of the message
94
+ * @param {string | object} message - Content of the message
95
+ * @return {Promise<void>} Promise that resolves when the message is reported
96
+ */
97
+ async reportMessage(title, message) {
98
+ if (!TestReporter.addMsgFunction)
99
+ await this.importHelpers();
100
+ const msg = `${title}${message ? `\n${message}` : ""}`;
101
+ await TestReporter.addMsgFunction({ message: msg });
102
+ }
103
+ /**
104
+ * @description Reports an attachment to the test report
105
+ * @summary Adds a formatted message to the test report with an optional title
106
+ * @param {string} title - Title of the message
107
+ * @param {string | Buffer} attachment - Content of the message
108
+ * @return {Promise<void>} Promise that resolves when the message is reported
109
+ */
110
+ async reportAttachment(title, attachment) {
111
+ if (!TestReporter.addAttachFunction)
112
+ await this.importHelpers();
113
+ await TestReporter.addAttachFunction({
114
+ attach: attachment,
115
+ description: title,
116
+ });
117
+ }
118
+ /**
119
+ * @description Reports data with specified type
120
+ * @summary Processes and stores data in the test report with formatting
121
+ * @param {string} reference - Reference identifier for the data
122
+ * @param {string | number | object} data - Data to be reported
123
+ * @param {PayloadType} type - Type of the payload
124
+ * @param {boolean} [trim=false] - Whether to trim the data
125
+ * @return {Promise<void>} Promise that resolves when data is reported
126
+ */
127
+ async report(reference, data, type, trim = false) {
128
+ try {
129
+ let attachFunction = this.reportMessage.bind(this);
130
+ let extension = ".txt";
131
+ switch (type) {
132
+ case "image":
133
+ data = Buffer.from(data);
134
+ extension = ".png";
135
+ attachFunction = this.reportAttachment.bind(this);
136
+ break;
137
+ case "json":
138
+ if (trim) {
139
+ if (data.request)
140
+ delete data["request"];
141
+ if (data.config)
142
+ delete data["config"];
143
+ }
144
+ data = JSON.stringify(data, null, 2);
145
+ extension = ".json";
146
+ break;
147
+ case "md":
148
+ extension = ".md";
149
+ break;
150
+ case "text":
151
+ extension = ".txt";
152
+ break;
153
+ default:
154
+ console.log(`Unsupported type ${type}. assuming text`);
155
+ }
156
+ reference = reference.includes("\n")
157
+ ? reference
158
+ : `${reference}${extension}`;
159
+ await attachFunction(reference, data);
160
+ }
161
+ catch (e) {
162
+ throw new Error(`Could not store attach artifact ${reference} under to test report ${this.testCase} - ${e}`);
163
+ }
164
+ }
165
+ async reportData(reference, data, type = "json", trim = false) {
166
+ return this.report(reference, data, type, trim);
167
+ }
168
+ async reportObject(reference, json, trim = false) {
169
+ return this.report(reference, json, "json", trim);
170
+ }
171
+ /**
172
+ * @description Reports a table in markdown format
173
+ * @summary Converts and stores a table definition in markdown format
174
+ * @param {string} reference - Reference identifier for the table
175
+ * @param {MdTableDefinition} tableDef - Table definition object
176
+ * @return {Promise<void>} Promise that resolves when table is reported
177
+ */
178
+ async reportTable(reference, tableDef) {
179
+ this.deps = await installIfNotAvailable([dependencies[1]], this.deps);
180
+ let txt;
181
+ try {
182
+ const json2md = await normalizeImport(import(`${dependencies[1]}`));
183
+ txt = json2md(tableDef);
184
+ }
185
+ catch (e) {
186
+ throw new Error(`Could not convert JSON to Markdown - ${e}`);
187
+ }
188
+ return this.report(reference, txt, "md");
189
+ }
190
+ /**
191
+ * @description Reports a graph using Chart.js
192
+ * @summary Generates and stores a graph visualization
193
+ * @param {string} reference - Reference identifier for the graph
194
+ * @param {any} config - Chart.js configuration object
195
+ * @return {Promise<void>} Promise that resolves when graph is reported
196
+ */
197
+ async reportGraph(reference, config) {
198
+ this.deps = await installIfNotAvailable([dependencies[2]], this.deps);
199
+ const { ChartJSNodeCanvas } = await normalizeImport(import(dependencies[2]));
200
+ const width = 600; //px
201
+ const height = 800; //px
202
+ const backgroundColour = "white"; // Uses https://www.w3schools.com/tags/canvas_fillstyle.asp
203
+ const chartJSNodeCanvas = new ChartJSNodeCanvas({
204
+ width,
205
+ height,
206
+ backgroundColour,
207
+ });
208
+ const image = await chartJSNodeCanvas.renderToBuffer(config);
209
+ return await this.reportImage(reference, image);
210
+ }
211
+ /**
212
+ * @description Reports an image to the test report
213
+ * @summary Stores an image buffer in the test report
214
+ * @param {string} reference - Reference identifier for the image
215
+ * @param {Buffer} buffer - Image data buffer
216
+ * @return {Promise<void>} Promise that resolves when image is reported
217
+ */
218
+ async reportImage(reference, buffer) {
219
+ return this.report(reference, buffer, "image");
220
+ }
221
+ }
222
+
223
+ //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy91dGlscy90ZXN0cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLElBQUksTUFBTSxNQUFNLENBQUM7QUFDeEIsT0FBTyxFQUFFLE1BQU0sSUFBSSxDQUFDO0FBRXBCLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQW1DN0MsTUFBTSxDQUFDLE1BQU0sMkJBQTJCLEdBQUcsbUNBQW1DLENBQUM7QUFFL0UsTUFBTSxZQUFZLEdBQUcsQ0FBQyxxQkFBcUIsRUFBRSxTQUFTLEVBQUUscUJBQXFCLENBQUMsQ0FBQztBQUUvRSxLQUFLLFVBQVUsZUFBZSxDQUFJLGFBQXlCO0lBQ3pELG1FQUFtRTtJQUNuRSxPQUFPLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFNLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLENBQU0sQ0FBQyxDQUFDO0FBQy9ELENBQUM7QUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBeURHO0FBQ0gsTUFBTSxPQUFPLFlBQVk7SUF3QnZCLFlBQ1ksV0FBbUIsT0FBTyxFQUMxQixXQUFXLElBQUksQ0FBQyxJQUFJLENBQzVCLE9BQU8sQ0FBQyxHQUFHLEVBQUUsRUFDYixVQUFVLEVBQ1YsU0FBUyxFQUNULFdBQVcsQ0FDWjtRQU5TLGFBQVEsR0FBUixRQUFRLENBQWtCO1FBQzFCLGFBQVEsR0FBUixRQUFRLENBS2pCO1FBRUQsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDbkQsSUFBSSxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7WUFDbEMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxRQUFRLEVBQUUsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLENB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QyxTQUFTLEVBQUUsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ2pELENBQUM7Q0FDRiIsImZpbGUiOiJ1dGlscy90ZXN0cy5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCI7XG5pbXBvcnQgZnMgZnJvbSBcImZzXCI7XG5pbXBvcnQgeyBNZFRhYmxlRGVmaW5pdGlvbiB9IGZyb20gXCIuL21kXCI7XG5pbXBvcnQgeyBpbnN0YWxsSWZOb3RBdmFpbGFibGUgfSBmcm9tIFwiLi9mc1wiO1xuaW1wb3J0IHsgU2ltcGxlRGVwZW5kZW5jeU1hcCB9IGZyb20gXCIuL3R5cGVzXCI7XG5cbi8qKlxuICogQGludGVyZmFjZSBBZGRBdHRhY2hQYXJhbXNcbiAqIEBkZXNjcmlwdGlvbiBQYXJhbWV0ZXJzIGZvciBhZGRpbmcgYW4gYXR0YWNobWVudCB0byBhIHJlcG9ydFxuICogQHN1bW1hcnkgSW50ZXJmYWNlIGZvciBhdHRhY2htZW50IHBhcmFtZXRlcnNcbiAqIEBtZW1iZXJPZiBtb2R1bGU6QGRlY2FmLXRzL3V0aWxzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQWRkQXR0YWNoUGFyYW1zIHtcbiAgYXR0YWNoOiBzdHJpbmcgfCBCdWZmZXI7XG4gIGRlc2NyaXB0aW9uOiBzdHJpbmcgfCBvYmplY3Q7XG4gIGNvbnRleHQ/OiBhbnk7XG4gIGJ1ZmZlckZvcm1hdD86IHN0cmluZztcbn1cblxuLyoqXG4gKiBAaW50ZXJmYWNlIEFkZE1zZ1BhcmFtc1xuICogQGRlc2NyaXB0aW9uIFBhcmFtZXRlcnMgZm9yIGFkZGluZyBhIG1lc3NhZ2UgdG8gYSByZXBvcnRcbiAqIEBzdW1tYXJ5IEludGVyZmFjZSBmb3IgbWVzc2FnZSBwYXJhbWV0ZXJzXG4gKiBAbWVtYmVyT2YgbW9kdWxlOkBkZWNhZi10cy91dGlsc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEFkZE1zZ1BhcmFtcyB7XG4gIG1lc3NhZ2U6IHN0cmluZyB8IG9iamVjdDtcbiAgY29udGV4dD86IGFueTtcbn1cblxuLyoqXG4gKiBAdHlwZWRlZiB7KFwianNvblwifFwiaW1hZ2VcInxcInRleHRcInxcIm1kXCIpfSBQYXlsb2FkVHlwZVxuICogQGRlc2NyaXB0aW9uIFR5cGVzIG9mIHBheWxvYWRzIHRoYXQgY2FuIGJlIGhhbmRsZWRcbiAqIEBzdW1tYXJ5IFVuaW9uIHR5cGUgZm9yIHBheWxvYWQgdHlwZXNcbiAqIEBtZW1iZXJPZiBtb2R1bGU6QGRlY2FmLXRzL3V0aWxzXG4gKi9cbmV4cG9ydCB0eXBlIFBheWxvYWRUeXBlID0gXCJqc29uXCIgfCBcImltYWdlXCIgfCBcInRleHRcIiB8IFwibWRcIjtcblxuZXhwb3J0IGNvbnN0IEplc3RSZXBvcnRlcnNUZW1wUGF0aEVudktleSA9IFwiSkVTVF9IVE1MX1JFUE9SVEVSU19URU1QX0RJUl9QQVRIXCI7XG5cbmNvbnN0IGRlcGVuZGVuY2llcyA9IFtcImplc3QtaHRtbC1yZXBvcnRlcnNcIiwgXCJqc29uMm1kXCIsIFwiY2hhcnRqcy1ub2RlLWNhbnZhc1wiXTtcblxuYXN5bmMgZnVuY3Rpb24gbm9ybWFsaXplSW1wb3J0PFQ+KGltcG9ydFByb21pc2U6IFByb21pc2U8VD4pOiBQcm9taXNlPFQ+IHtcbiAgLy8gQ29tbW9uSlMncyBgbW9kdWxlLmV4cG9ydHNgIGlzIHdyYXBwZWQgYXMgYGRlZmF1bHRgIGluIEVTTW9kdWxlLlxuICByZXR1cm4gaW1wb3J0UHJvbWlzZS50aGVuKChtOiBhbnkpID0+IChtLmRlZmF1bHQgfHwgbSkgYXMgVCk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFRlc3QgcmVwb3J0aW5nIHV0aWxpdHkgY2xhc3MgZm9yIG1hbmFnaW5nIHRlc3QgcmVzdWx0cyBhbmQgZXZpZGVuY2VcbiAqIEBzdW1tYXJ5IEEgY29tcHJlaGVuc2l2ZSB0ZXN0IHJlcG9ydGVyIHRoYXQgaGFuZGxlcyB2YXJpb3VzIHR5cGVzIG9mIHRlc3QgYXJ0aWZhY3RzIGluY2x1ZGluZyBtZXNzYWdlcyxcbiAqIGF0dGFjaG1lbnRzLCBkYXRhLCBpbWFnZXMsIHRhYmxlcywgYW5kIGdyYXBocy4gSXQgcHJvdmlkZXMgbWV0aG9kcyB0byByZXBvcnQgYW5kIHN0b3JlIHRlc3QgZXZpZGVuY2VcbiAqIGluIGRpZmZlcmVudCBmb3JtYXRzIGFuZCBtYW5hZ2VzIGRlcGVuZGVuY2llcyBmb3IgcmVwb3J0aW5nIGZ1bmN0aW9uYWxpdHkuXG4gKlxuICogQHRlbXBsYXRlIFQgLSBUeXBlIG9mIGRhdGEgYmVpbmcgcmVwb3J0ZWRcbiAqIEBwYXJhbSB7c3RyaW5nfSBbdGVzdENhc2U9XCJ0ZXN0c1wiXSAtIE5hbWUgb2YgdGhlIHRlc3QgY2FzZVxuICogQHBhcmFtIHtzdHJpbmd9IFtiYXNlUGF0aF0gLSBCYXNlIHBhdGggZm9yIHN0b3JpbmcgdGVzdCByZXBvcnRzXG4gKiBAY2xhc3NcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgcmVwb3J0ZXIgPSBuZXcgVGVzdFJlcG9ydGVyKCdsb2dpbi10ZXN0Jyk7XG4gKlxuICogLy8gUmVwb3J0IHRlc3QgbWVzc2FnZXNcbiAqIGF3YWl0IHJlcG9ydGVyLnJlcG9ydE1lc3NhZ2UoJ1Rlc3QgU3RhcnRlZCcsICdMb2dpbiBmbG93IGluaXRpYXRlZCcpO1xuICpcbiAqIC8vIFJlcG9ydCB0ZXN0IGRhdGFcbiAqIGF3YWl0IHJlcG9ydGVyLnJlcG9ydERhdGEoJ3VzZXItY3JlZGVudGlhbHMnLCB7IHVzZXJuYW1lOiAndGVzdCcgfSwgJ2pzb24nKTtcbiAqXG4gKiAvLyBSZXBvcnQgdGVzdCByZXN1bHRzIHRhYmxlXG4gKiBhd2FpdCByZXBvcnRlci5yZXBvcnRUYWJsZSgndGVzdC1yZXN1bHRzJywge1xuICogICBoZWFkZXJzOiBbJ1N0ZXAnLCAnU3RhdHVzJ10sXG4gKiAgIHJvd3M6IFtcbiAqICAgICB7IFN0ZXA6ICdMb2dpbicsIFN0YXR1czogJ1Bhc3MnIH0sXG4gKiAgICAgeyBTdGVwOiAnVmFsaWRhdGlvbicsIFN0YXR1czogJ1Bhc3MnIH1cbiAqICAgXVxuICogfSk7XG4gKlxuICogLy8gUmVwb3J0IHRlc3QgZXZpZGVuY2VcbiAqIGF3YWl0IHJlcG9ydGVyLnJlcG9ydEF0dGFjaG1lbnQoJ1NjcmVlbnNob3QnLCBzY3JlZW5zaG90QnVmZmVyKTtcbiAqIGBgYFxuICpcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQ2xpZW50XG4gKiAgIHBhcnRpY2lwYW50IFRlc3RSZXBvcnRlclxuICogICBwYXJ0aWNpcGFudCBGaWxlU3lzdGVtXG4gKiAgIHBhcnRpY2lwYW50IERlcGVuZGVuY2llc1xuICpcbiAqICAgQ2xpZW50LT4+VGVzdFJlcG9ydGVyOiBuZXcgVGVzdFJlcG9ydGVyKHRlc3RDYXNlLCBiYXNlUGF0aClcbiAqICAgVGVzdFJlcG9ydGVyLT4+RmlsZVN5c3RlbTogQ3JlYXRlIHJlcG9ydCBkaXJlY3RvcnlcbiAqXG4gKiAgIGFsdCBSZXBvcnQgTWVzc2FnZVxuICogICAgIENsaWVudC0+PlRlc3RSZXBvcnRlcjogcmVwb3J0TWVzc2FnZSh0aXRsZSwgbWVzc2FnZSlcbiAqICAgICBUZXN0UmVwb3J0ZXItPj5EZXBlbmRlbmNpZXM6IEltcG9ydCBoZWxwZXJzXG4gKiAgICAgVGVzdFJlcG9ydGVyLT4+RmlsZVN5c3RlbTogU3RvcmUgbWVzc2FnZVxuICogICBlbHNlIFJlcG9ydCBEYXRhXG4gKiAgICAgQ2xpZW50LT4+VGVzdFJlcG9ydGVyOiByZXBvcnREYXRhKHJlZmVyZW5jZSwgZGF0YSwgdHlwZSlcbiAqICAgICBUZXN0UmVwb3J0ZXItPj5EZXBlbmRlbmNpZXM6IFByb2Nlc3MgZGF0YVxuICogICAgIFRlc3RSZXBvcnRlci0+PkZpbGVTeXN0ZW06IFN0b3JlIGZvcm1hdHRlZCBkYXRhXG4gKiAgIGVsc2UgUmVwb3J0IFRhYmxlXG4gKiAgICAgQ2xpZW50LT4+VGVzdFJlcG9ydGVyOiByZXBvcnRUYWJsZShyZWZlcmVuY2UsIHRhYmxlRGVmKVxuICogICAgIFRlc3RSZXBvcnRlci0+PkRlcGVuZGVuY2llczogQ29udmVydCB0byBNRCBmb3JtYXRcbiAqICAgICBUZXN0UmVwb3J0ZXItPj5GaWxlU3lzdGVtOiBTdG9yZSB0YWJsZVxuICogICBlbmRcbiAqL1xuZXhwb3J0IGNsYXNzIFRlc3RSZXBvcnRlciB7XG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRnVuY3Rpb24gZm9yIGFkZGluZyBtZXNzYWdlcyB0byB0aGUgdGVzdCByZXBvcnRcbiAgICogQHN1bW1hcnkgU3RhdGljIGhhbmRsZXIgZm9yIHByb2Nlc3NpbmcgYW5kIHN0b3JpbmcgdGVzdCBtZXNzYWdlc1xuICAgKiBAdHlwZSB7ZnVuY3Rpb24oQWRkTXNnUGFyYW1zKTogUHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIHByb3RlY3RlZCBzdGF0aWMgYWRkTXNnRnVuY3Rpb246IChwYXJhbXM6IEFkZE1zZ1BhcmFtcykgPT4gUHJvbWlzZTx2b2lkPjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEZ1bmN0aW9uIGZvciBhZGRpbmcgYXR0YWNobWVudHMgdG8gdGhlIHRlc3QgcmVwb3J0XG4gICAqIEBzdW1tYXJ5IFN0YXRpYyBoYW5kbGVyIGZvciBwcm9jZXNzaW5nIGFuZCBzdG9yaW5nIHRlc3QgYXR0YWNobWVudHNcbiAgICogQHR5cGUge2Z1bmN0aW9uKEFkZEF0dGFjaFBhcmFtcyk6IFByb21pc2U8dm9pZD59XG4gICAqL1xuICBwcm90ZWN0ZWQgc3RhdGljIGFkZEF0dGFjaEZ1bmN0aW9uOiAoXG4gICAgcGFyYW1zOiBBZGRBdHRhY2hQYXJhbXNcbiAgKSA9PiBQcm9taXNlPHZvaWQ+O1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gTWFwIG9mIGRlcGVuZGVuY2llcyByZXF1aXJlZCBieSB0aGUgcmVwb3J0ZXJcbiAgICogQHN1bW1hcnkgU3RvcmVzIHRoZSBjdXJyZW50IHN0YXRlIG9mIGRlcGVuZGVuY2llc1xuICAgKiBAdHlwZSB7U2ltcGxlRGVwZW5kZW5jeU1hcH1cbiAgICovXG4gIHByaXZhdGUgZGVwcz86IFNpbXBsZURlcGVuZGVuY3lNYXA7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIHRlc3RDYXNlOiBzdHJpbmcgPSBcInRlc3RzXCIsXG4gICAgcHJvdGVjdGVkIGJhc2VQYXRoID0gcGF0aC5qb2luKFxuICAgICAgcHJvY2Vzcy5jd2QoKSxcbiAgICAgIFwid29ya2RvY3NcIixcbiAgICAgIFwicmVwb3J0c1wiLFxuICAgICAgXCJldmlkZW5jZXNcIlxuICAgIClcbiAgKSB7XG4gICAgdGhpcy5iYXNlUGF0aCA9IHBhdGguam9pbihiYXNlUGF0aCwgdGhpcy50ZXN0Q2FzZSk7XG4gICAgaWYgKCFmcy5leGlzdHNTeW5jKHRoaXMuYmFzZVBhdGgpKSB7XG4gICAgICBmcy5ta2RpclN5bmMoYmFzZVBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gSW1wb3J0cyByZXF1aXJlZCBoZWxwZXIgZnVuY3Rpb25zXG4gICAqIEBzdW1tYXJ5IEVuc3VyZXMgYWxsIG5lY2Vzc2FyeSBkZXBlbmRlbmNpZXMgYXJlIGF2YWlsYWJsZSBhbmQgaW1wb3J0cyBoZWxwZXIgZnVuY3Rpb25zXG4gICAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59IFByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIGhlbHBlcnMgYXJlIGltcG9ydGVkXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGltcG9ydEhlbHBlcnMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5kZXBzID0gYXdhaXQgaW5zdGFsbElmTm90QXZhaWxhYmxlKFtkZXBlbmRlbmNpZXNbMF1dLCB0aGlzLmRlcHMpO1xuICAgIC8vIGlmICghcHJvY2Vzcy5lbnZbSmVzdFJlcG9ydGVyc1RlbXBQYXRoRW52S2V5XSlcbiAgICAvLyAgIHByb2Nlc3MuZW52W0plc3RSZXBvcnRlcnNUZW1wUGF0aEVudktleV0gPSAnLi93b3JrZG9jcy9yZXBvcnRzJztcbiAgICBjb25zdCB7IGFkZE1zZywgYWRkQXR0YWNoIH0gPSBhd2FpdCBub3JtYWxpemVJbXBvcnQoXG4gICAgICBpbXBvcnQoYCR7ZGVwZW5kZW5jaWVzWzBdfS9oZWxwZXJgKVxuICAgICk7XG4gICAgVGVzdFJlcG9ydGVyLmFkZE1zZ0Z1bmN0aW9uID0gYWRkTXNnO1xuICAgIFRlc3RSZXBvcnRlci5hZGRBdHRhY2hGdW5jdGlvbiA9IGFkZEF0dGFjaDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmVwb3J0cyBhIG1lc3NhZ2UgdG8gdGhlIHRlc3QgcmVwb3J0XG4gICAqIEBzdW1tYXJ5IEFkZHMgYSBmb3JtYXR0ZWQgbWVzc2FnZSB0byB0aGUgdGVzdCByZXBvcnQgd2l0aCBhbiBvcHRpb25hbCB0aXRsZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGl0bGUgLSBUaXRsZSBvZiB0aGUgbWVzc2FnZVxuICAgKiBAcGFyYW0ge3N0cmluZyB8IG9iamVjdH0gbWVzc2FnZSAtIENvbnRlbnQgb2YgdGhlIG1lc3NhZ2VcbiAgICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn0gUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIG1lc3NhZ2UgaXMgcmVwb3J0ZWRcbiAgICovXG4gIGFzeW5jIHJlcG9ydE1lc3NhZ2UodGl0bGU6IHN0cmluZywgbWVzc2FnZTogc3RyaW5nIHwgb2JqZWN0KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCFUZXN0UmVwb3J0ZXIuYWRkTXNnRnVuY3Rpb24pIGF3YWl0IHRoaXMuaW1wb3J0SGVscGVycygpO1xuICAgIGNvbnN0IG1zZyA9IGAke3RpdGxlfSR7bWVzc2FnZSA/IGBcXG4ke21lc3NhZ2V9YCA6IFwiXCJ9YDtcbiAgICBhd2FpdCBUZXN0UmVwb3J0ZXIuYWRkTXNnRnVuY3Rpb24oeyBtZXNzYWdlOiBtc2cgfSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJlcG9ydHMgYW4gYXR0YWNobWVudCB0byB0aGUgdGVzdCByZXBvcnRcbiAgICogQHN1bW1hcnkgQWRkcyBhIGZvcm1hdHRlZCBtZXNzYWdlIHRvIHRoZSB0ZXN0IHJlcG9ydCB3aXRoIGFuIG9wdGlvbmFsIHRpdGxlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0aXRsZSAtIFRpdGxlIG9mIHRoZSBtZXNzYWdlXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgQnVmZmVyfSBhdHRhY2htZW50IC0gQ29udGVudCBvZiB0aGUgbWVzc2FnZVxuICAgKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgbWVzc2FnZSBpcyByZXBvcnRlZFxuICAgKi9cbiAgYXN5bmMgcmVwb3J0QXR0YWNobWVudChcbiAgICB0aXRsZTogc3RyaW5nLFxuICAgIGF0dGFjaG1lbnQ6IHN0cmluZyB8IEJ1ZmZlclxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIVRlc3RSZXBvcnRlci5hZGRBdHRhY2hGdW5jdGlvbikgYXdhaXQgdGhpcy5pbXBvcnRIZWxwZXJzKCk7XG4gICAgYXdhaXQgVGVzdFJlcG9ydGVyLmFkZEF0dGFjaEZ1bmN0aW9uKHtcbiAgICAgIGF0dGFjaDogYXR0YWNobWVudCxcbiAgICAgIGRlc2NyaXB0aW9uOiB0aXRsZSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmVwb3J0cyBkYXRhIHdpdGggc3BlY2lmaWVkIHR5cGVcbiAgICogQHN1bW1hcnkgUHJvY2Vzc2VzIGFuZCBzdG9yZXMgZGF0YSBpbiB0aGUgdGVzdCByZXBvcnQgd2l0aCBmb3JtYXR0aW5nXG4gICAqIEBwYXJhbSB7c3RyaW5nfSByZWZlcmVuY2UgLSBSZWZlcmVuY2UgaWRlbnRpZmllciBmb3IgdGhlIGRhdGFcbiAgICogQHBhcmFtIHtzdHJpbmcgfCBudW1iZXIgfCBvYmplY3R9IGRhdGEgLSBEYXRhIHRvIGJlIHJlcG9ydGVkXG4gICAqIEBwYXJhbSB7UGF5bG9hZFR5cGV9IHR5cGUgLSBUeXBlIG9mIHRoZSBwYXlsb2FkXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW3RyaW09ZmFsc2VdIC0gV2hldGhlciB0byB0cmltIHRoZSBkYXRhXG4gICAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59IFByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIGRhdGEgaXMgcmVwb3J0ZWRcbiAgICovXG4gIHByb3RlY3RlZCBhc3luYyByZXBvcnQoXG4gICAgcmVmZXJlbmNlOiBzdHJpbmcsXG4gICAgZGF0YTogc3RyaW5nIHwgbnVtYmVyIHwgb2JqZWN0IHwgQnVmZmVyLFxuICAgIHR5cGU6IFBheWxvYWRUeXBlLFxuICAgIHRyaW06IGJvb2xlYW4gPSBmYWxzZVxuICApIHtcbiAgICB0cnkge1xuICAgICAgbGV0IGF0dGFjaEZ1bmN0aW9uOlxuICAgICAgICB8IHR5cGVvZiB0aGlzLnJlcG9ydE1lc3NhZ2VcbiAgICAgICAgfCB0eXBlb2YgdGhpcy5yZXBvcnRBdHRhY2htZW50ID0gdGhpcy5yZXBvcnRNZXNzYWdlLmJpbmQodGhpcyk7XG4gICAgICBsZXQgZXh0ZW5zaW9uOiBcIi5wbmdcIiB8IFwiLnR4dFwiIHwgXCIubWRcIiB8IFwiLmpzb25cIiA9IFwiLnR4dFwiO1xuXG4gICAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgY2FzZSBcImltYWdlXCI6XG4gICAgICAgICAgZGF0YSA9IEJ1ZmZlci5mcm9tKGRhdGEgYXMgQnVmZmVyKTtcbiAgICAgICAgICBleHRlbnNpb24gPSBcIi5wbmdcIjtcbiAgICAgICAgICBhdHRhY2hGdW5jdGlvbiA9IHRoaXMucmVwb3J0QXR0YWNobWVudC5iaW5kKHRoaXMpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwianNvblwiOlxuICAgICAgICAgIGlmICh0cmltKSB7XG4gICAgICAgICAgICBpZiAoKGRhdGEgYXMgeyByZXF1ZXN0PzogdW5rbm93biB9KS5yZXF1ZXN0KVxuICAgICAgICAgICAgICBkZWxldGUgKGRhdGEgYXMgeyByZXF1ZXN0PzogdW5rbm93biB9KVtcInJlcXVlc3RcIl07XG4gICAgICAgICAgICBpZiAoKGRhdGEgYXMgeyBjb25maWc/OiB1bmtub3duIH0pLmNvbmZpZylcbiAgICAgICAgICAgICAgZGVsZXRlIChkYXRhIGFzIHsgY29uZmlnPzogdW5rbm93biB9KVtcImNvbmZpZ1wiXTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZGF0YSA9IEpTT04uc3RyaW5naWZ5KGRhdGEsIG51bGwsIDIpO1xuICAgICAgICAgIGV4dGVuc2lvbiA9IFwiLmpzb25cIjtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcIm1kXCI6XG4gICAgICAgICAgZXh0ZW5zaW9uID0gXCIubWRcIjtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcInRleHRcIjpcbiAgICAgICAgICBleHRlbnNpb24gPSBcIi50eHRcIjtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBjb25zb2xlLmxvZyhgVW5zdXBwb3J0ZWQgdHlwZSAke3R5cGV9LiBhc3N1bWluZyB0ZXh0YCk7XG4gICAgICB9XG4gICAgICByZWZlcmVuY2UgPSByZWZlcmVuY2UuaW5jbHVkZXMoXCJcXG5cIilcbiAgICAgICAgPyByZWZlcmVuY2VcbiAgICAgICAgOiBgJHtyZWZlcmVuY2V9JHtleHRlbnNpb259YDtcbiAgICAgIGF3YWl0IGF0dGFjaEZ1bmN0aW9uKHJlZmVyZW5jZSwgZGF0YSBhcyBCdWZmZXIgfCBzdHJpbmcpO1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYENvdWxkIG5vdCBzdG9yZSBhdHRhY2ggYXJ0aWZhY3QgJHtyZWZlcmVuY2V9IHVuZGVyIHRvIHRlc3QgcmVwb3J0ICR7dGhpcy50ZXN0Q2FzZX0gLSAke2V9YFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyByZXBvcnREYXRhKFxuICAgIHJlZmVyZW5jZTogc3RyaW5nLFxuICAgIGRhdGE6IHN0cmluZyB8IG51bWJlciB8IG9iamVjdCxcbiAgICB0eXBlOiBQYXlsb2FkVHlwZSA9IFwianNvblwiLFxuICAgIHRyaW0gPSBmYWxzZVxuICApIHtcbiAgICByZXR1cm4gdGhpcy5yZXBvcnQocmVmZXJlbmNlLCBkYXRhLCB0eXBlLCB0cmltKTtcbiAgfVxuXG4gIGFzeW5jIHJlcG9ydE9iamVjdChyZWZlcmVuY2U6IHN0cmluZywganNvbjogb2JqZWN0LCB0cmltID0gZmFsc2UpIHtcbiAgICByZXR1cm4gdGhpcy5yZXBvcnQocmVmZXJlbmNlLCBqc29uLCBcImpzb25cIiwgdHJpbSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJlcG9ydHMgYSB0YWJsZSBpbiBtYXJrZG93biBmb3JtYXRcbiAgICogQHN1bW1hcnkgQ29udmVydHMgYW5kIHN0b3JlcyBhIHRhYmxlIGRlZmluaXRpb24gaW4gbWFya2Rvd24gZm9ybWF0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSByZWZlcmVuY2UgLSBSZWZlcmVuY2UgaWRlbnRpZmllciBmb3IgdGhlIHRhYmxlXG4gICAqIEBwYXJhbSB7TWRUYWJsZURlZmluaXRpb259IHRhYmxlRGVmIC0gVGFibGUgZGVmaW5pdGlvbiBvYmplY3RcbiAgICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn0gUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGFibGUgaXMgcmVwb3J0ZWRcbiAgICovXG4gIGFzeW5jIHJlcG9ydFRhYmxlKHJlZmVyZW5jZTogc3RyaW5nLCB0YWJsZURlZjogTWRUYWJsZURlZmluaXRpb24pIHtcbiAgICB0aGlzLmRlcHMgPSBhd2FpdCBpbnN0YWxsSWZOb3RBdmFpbGFibGUoW2RlcGVuZGVuY2llc1sxXV0sIHRoaXMuZGVwcyk7XG4gICAgbGV0IHR4dDogc3RyaW5nO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBqc29uMm1kID0gYXdhaXQgbm9ybWFsaXplSW1wb3J0KGltcG9ydChgJHtkZXBlbmRlbmNpZXNbMV19YCkpO1xuICAgICAgdHh0ID0ganNvbjJtZCh0YWJsZURlZik7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgY29udmVydCBKU09OIHRvIE1hcmtkb3duIC0gJHtlfWApO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnJlcG9ydChyZWZlcmVuY2UsIHR4dCwgXCJtZFwiKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmVwb3J0cyBhIGdyYXBoIHVzaW5nIENoYXJ0LmpzXG4gICAqIEBzdW1tYXJ5IEdlbmVyYXRlcyBhbmQgc3RvcmVzIGEgZ3JhcGggdmlzdWFsaXphdGlvblxuICAgKiBAcGFyYW0ge3N0cmluZ30gcmVmZXJlbmNlIC0gUmVmZXJlbmNlIGlkZW50aWZpZXIgZm9yIHRoZSBncmFwaFxuICAgKiBAcGFyYW0ge2FueX0gY29uZmlnIC0gQ2hhcnQuanMgY29uZmlndXJhdGlvbiBvYmplY3RcbiAgICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn0gUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gZ3JhcGggaXMgcmVwb3J0ZWRcbiAgICovXG4gIGFzeW5jIHJlcG9ydEdyYXBoKHJlZmVyZW5jZTogc3RyaW5nLCBjb25maWc6IGFueSkge1xuICAgIHRoaXMuZGVwcyA9IGF3YWl0IGluc3RhbGxJZk5vdEF2YWlsYWJsZShbZGVwZW5kZW5jaWVzWzJdXSwgdGhpcy5kZXBzKTtcbiAgICBjb25zdCB7IENoYXJ0SlNOb2RlQ2FudmFzIH0gPSBhd2FpdCBub3JtYWxpemVJbXBvcnQoXG4gICAgICBpbXBvcnQoZGVwZW5kZW5jaWVzWzJdKVxuICAgICk7XG5cbiAgICBjb25zdCB3aWR0aCA9IDYwMDsgLy9weFxuICAgIGNvbnN0IGhlaWdodCA9IDgwMDsgLy9weFxuICAgIGNvbnN0IGJhY2tncm91bmRDb2xvdXIgPSBcIndoaXRlXCI7IC8vIFVzZXMgaHR0cHM6Ly93d3cudzNzY2hvb2xzLmNvbS90YWdzL2NhbnZhc19maWxsc3R5bGUuYXNwXG4gICAgY29uc3QgY2hhcnRKU05vZGVDYW52YXMgPSBuZXcgQ2hhcnRKU05vZGVDYW52YXMoe1xuICAgICAgd2lkdGgsXG4gICAgICBoZWlnaHQsXG4gICAgICBiYWNrZ3JvdW5kQ29sb3VyLFxuICAgIH0pO1xuXG4gICAgY29uc3QgaW1hZ2UgPSBhd2FpdCBjaGFydEpTTm9kZUNhbnZhcy5yZW5kZXJUb0J1ZmZlcihjb25maWcpO1xuICAgIHJldHVybiBhd2FpdCB0aGlzLnJlcG9ydEltYWdlKHJlZmVyZW5jZSwgaW1hZ2UpO1xuICB9XG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmVwb3J0cyBhbiBpbWFnZSB0byB0aGUgdGVzdCByZXBvcnRcbiAgICogQHN1bW1hcnkgU3RvcmVzIGFuIGltYWdlIGJ1ZmZlciBpbiB0aGUgdGVzdCByZXBvcnRcbiAgICogQHBhcmFtIHtzdHJpbmd9IHJlZmVyZW5jZSAtIFJlZmVyZW5jZSBpZGVudGlmaWVyIGZvciB0aGUgaW1hZ2VcbiAgICogQHBhcmFtIHtCdWZmZXJ9IGJ1ZmZlciAtIEltYWdlIGRhdGEgYnVmZmVyXG4gICAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59IFByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIGltYWdlIGlzIHJlcG9ydGVkXG4gICAqL1xuICBhc3luYyByZXBvcnRJbWFnZShyZWZlcmVuY2U6IHN0cmluZywgYnVmZmVyOiBCdWZmZXIpIHtcbiAgICByZXR1cm4gdGhpcy5yZXBvcnQocmVmZXJlbmNlLCBidWZmZXIsIFwiaW1hZ2VcIik7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,142 @@
1
+ /**
2
+ * @description Pads the end of a string with a specified character.
3
+ * @summary Extends the input string to a specified length by adding a padding character to the end.
4
+ * If the input string is already longer than the specified length, it is returned unchanged.
5
+ *
6
+ * @param {string} str - The input string to be padded.
7
+ * @param {number} length - The desired total length of the resulting string.
8
+ * @param {string} [char=" "] - The character to use for padding. Defaults to a space.
9
+ * @return {string} The padded string.
10
+ * @throws {Error} If the padding character is not exactly one character long.
11
+ *
12
+ * @function padEnd
13
+ *
14
+ * @memberOf module:TextUtils
15
+ */
16
+ export function padEnd(str, length, char = " ") {
17
+ if (char.length !== 1)
18
+ throw new Error("Invalid character length for padding. must be one!");
19
+ return str.padEnd(length, char);
20
+ }
21
+ /**
22
+ * @description Replaces placeholders in a string with provided values.
23
+ * @summary Interpolates a string by replacing placeholders of the form ${variableName}
24
+ * with corresponding values from the provided object. If a placeholder doesn't have
25
+ * a corresponding value, it is left unchanged in the string.
26
+ *
27
+ * @param {string} input - The input string containing placeholders to be replaced.
28
+ * @param {Record<string, number | string>} values - An object containing key-value pairs for replacement.
29
+ * @return {string} The interpolated string with placeholders replaced by their corresponding values.
30
+ *
31
+ * @function patchPlaceholders
32
+ *
33
+ * @mermaid
34
+ * sequenceDiagram
35
+ * participant Caller
36
+ * participant patchString
37
+ * participant String.replace
38
+ * Caller->>patchString: Call with input and values
39
+ * patchString->>String.replace: Call with regex and replacement function
40
+ * String.replace->>patchString: Return replaced string
41
+ * patchString-->>Caller: Return patched string
42
+ *
43
+ * @memberOf module:TextUtils
44
+ */
45
+ export function patchPlaceholders(input, values) {
46
+ return input.replace(/\$\{([a-zA-Z0-9_]+)\}/g, (match, variable) => values[variable] || match);
47
+ }
48
+ export function patchString(input, values, flags = "g") {
49
+ Object.entries(values).forEach(([key, val]) => {
50
+ const regexp = new RegExp(escapeRegExp(key), flags);
51
+ input = input.replace(regexp, val);
52
+ });
53
+ return input;
54
+ }
55
+ /**
56
+ * @description Converts a string to camelCase.
57
+ * @summary Transforms the input string into camelCase format, where words are joined without spaces
58
+ * and each word after the first starts with a capital letter.
59
+ *
60
+ * @param {string} text - The input string to be converted.
61
+ * @return {string} The input string converted to camelCase.
62
+ *
63
+ * @function toCamelCase
64
+ *
65
+ * @memberOf module:TextUtils
66
+ */
67
+ export function toCamelCase(text) {
68
+ return text
69
+ .replace(/(?:^\w|[A-Z]|\b\w)/g, (word, index) => index === 0 ? word.toLowerCase() : word.toUpperCase())
70
+ .replace(/\s+/g, "");
71
+ }
72
+ /**
73
+ * @description Converts a string to ENVIRONMENT_VARIABLE format.
74
+ * @summary Transforms the input string into uppercase with words separated by underscores,
75
+ * typically used for environment variable names.
76
+ *
77
+ * @param {string} text - The input string to be converted.
78
+ * @return {string} The input string converted to ENVIRONMENT_VARIABLE format.
79
+ *
80
+ * @function toENVFormat
81
+ *
82
+ * @memberOf module:TextUtils
83
+ */
84
+ export function toENVFormat(text) {
85
+ return toSnakeCase(text).toUpperCase();
86
+ }
87
+ /**
88
+ * @description Converts a string to snake_case.
89
+ * @summary Transforms the input string into lowercase with words separated by underscores.
90
+ *
91
+ * @param {string} text - The input string to be converted.
92
+ * @return {string} The input string converted to snake_case.
93
+ *
94
+ * @function toSnakeCase
95
+ *
96
+ * @memberOf module:TextUtils
97
+ */
98
+ export function toSnakeCase(text) {
99
+ return text
100
+ .replace(/([a-z])([A-Z])/g, "$1_$2")
101
+ .replace(/[\s-]+/g, "_")
102
+ .toLowerCase();
103
+ }
104
+ /**
105
+ * @description Converts a string to kebab-case.
106
+ * @summary Transforms the input string into lowercase with words separated by hyphens.
107
+ *
108
+ * @param {string} text - The input string to be converted.
109
+ * @return {string} The input string converted to kebab-case.
110
+ *
111
+ * @function toKebabCase
112
+ *
113
+ * @memberOf module:TextUtils
114
+ */
115
+ export function toKebabCase(text) {
116
+ return text
117
+ .replace(/([a-z])([A-Z])/g, "$1-$2")
118
+ .replace(/[\s_]+/g, "-")
119
+ .toLowerCase();
120
+ }
121
+ /**
122
+ * @description Converts a string to PascalCase.
123
+ * @summary Transforms the input string into PascalCase format, where words are joined without spaces
124
+ * and each word starts with a capital letter.
125
+ *
126
+ * @param {string} text - The input string to be converted.
127
+ * @return {string} The input string converted to PascalCase.
128
+ *
129
+ * @function toPascalCase
130
+ *
131
+ * @memberOf module:TextUtils
132
+ */
133
+ export function toPascalCase(text) {
134
+ return text
135
+ .replace(/(?:^\w|[A-Z]|\b\w)/g, (word) => word.toUpperCase())
136
+ .replace(/\s+/g, "");
137
+ }
138
+ export function escapeRegExp(string) {
139
+ return string.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); // $& means the whole matched string
140
+ }
141
+
142
+ //# sourceMappingURL=data:application/json;charset=utf8;base64,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QUFNLENBQUMsT0FBTyxDQUFDLHFCQUFxQixFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsb0NBQW9DO0FBQzVGLENBQUMiLCJmaWxlIjoidXRpbHMvdGV4dC5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGRlc2NyaXB0aW9uIFBhZHMgdGhlIGVuZCBvZiBhIHN0cmluZyB3aXRoIGEgc3BlY2lmaWVkIGNoYXJhY3Rlci5cbiAqIEBzdW1tYXJ5IEV4dGVuZHMgdGhlIGlucHV0IHN0cmluZyB0byBhIHNwZWNpZmllZCBsZW5ndGggYnkgYWRkaW5nIGEgcGFkZGluZyBjaGFyYWN0ZXIgdG8gdGhlIGVuZC5cbiAqIElmIHRoZSBpbnB1dCBzdHJpbmcgaXMgYWxyZWFkeSBsb25nZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHIgLSBUaGUgaW5wdXQgc3RyaW5nIHRvIGJlIHBhZGRlZC5cbiAqIEBwYXJhbSB7bnVtYmVyfSBsZW5ndGggLSBUaGUgZGVzaXJlZCB0b3RhbCBsZW5ndGggb2YgdGhlIHJlc3VsdGluZyBzdHJpbmcuXG4gKiBAcGFyYW0ge3N0cmluZ30gW2NoYXI9XCIgXCJdIC0gVGhlIGNoYXJhY3RlciB0byB1c2UgZm9yIHBhZGRpbmcuIERlZmF1bHRzIHRvIGEgc3BhY2UuXG4gKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBwYWRkZWQgc3RyaW5nLlxuICogQHRocm93cyB7RXJyb3J9IElmIHRoZSBwYWRkaW5nIGNoYXJhY3RlciBpcyBub3QgZXhhY3RseSBvbmUgY2hhcmFjdGVyIGxvbmcuXG4gKlxuICogQGZ1bmN0aW9uIHBhZEVuZFxuICpcbiAqIEBtZW1iZXJPZiBtb2R1bGU6VGV4dFV0aWxzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYWRFbmQoXG4gIHN0cjogc3RyaW5nLFxuICBsZW5ndGg6IG51bWJlcixcbiAgY2hhcjogc3RyaW5nID0gXCIgXCJcbik6IHN0cmluZyB7XG4gIGlmIChjaGFyLmxlbmd0aCAhPT0gMSlcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIGNoYXJhY3RlciBsZW5ndGggZm9yIHBhZGRpbmcuIG11c3QgYmUgb25lIVwiKTtcbiAgcmV0dXJuIHN0ci5wYWRFbmQobGVuZ3RoLCBjaGFyKTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gUmVwbGFjZXMgcGxhY2Vob2xkZXJzIGluIGEgc3RyaW5nIHdpdGggcHJvdmlkZWQgdmFsdWVzLlxuICogQHN1bW1hcnkgSW50ZXJwb2xhdGVzIGEgc3RyaW5nIGJ5IHJlcGxhY2luZyBwbGFjZWhvbGRlcnMgb2YgdGhlIGZvcm0gJHt2YXJpYWJsZU5hbWV9XG4gKiB3aXRoIGNvcnJlc3BvbmRpbmcgdmFsdWVzIGZyb20gdGhlIHByb3ZpZGVkIG9iamVjdC4gSWYgYSBwbGFjZWhvbGRlciBkb2Vzbid0IGhhdmVcbiAqIGEgY29ycmVzcG9uZGluZyB2YWx1ZSwgaXQgaXMgbGVmdCB1bmNoYW5nZWQgaW4gdGhlIHN0cmluZy5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gaW5wdXQgLSBUaGUgaW5wdXQgc3RyaW5nIGNvbnRhaW5pbmcgcGxhY2Vob2xkZXJzIHRvIGJlIHJlcGxhY2VkLlxuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBudW1iZXIgfCBzdHJpbmc+fSB2YWx1ZXMgLSBBbiBvYmplY3QgY29udGFpbmluZyBrZXktdmFsdWUgcGFpcnMgZm9yIHJlcGxhY2VtZW50LlxuICogQHJldHVybiB7c3RyaW5nfSBUaGUgaW50ZXJwb2xhdGVkIHN0cmluZyB3aXRoIHBsYWNlaG9sZGVycyByZXBsYWNlZCBieSB0aGVpciBjb3JyZXNwb25kaW5nIHZhbHVlcy5cbiAqXG4gKiBAZnVuY3Rpb24gcGF0Y2hQbGFjZWhvbGRlcnNcbiAqXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IENhbGxlclxuICogICBwYXJ0aWNpcGFudCBwYXRjaFN0cmluZ1xuICogICBwYXJ0aWNpcGFudCBTdHJpbmcucmVwbGFjZVxuICogICBDYWxsZXItPj5wYXRjaFN0cmluZzogQ2FsbCB3aXRoIGlucHV0IGFuZCB2YWx1ZXNcbiAqICAgcGF0Y2hTdHJpbmctPj5TdHJpbmcucmVwbGFjZTogQ2FsbCB3aXRoIHJlZ2V4IGFuZCByZXBsYWNlbWVudCBmdW5jdGlvblxuICogICBTdHJpbmcucmVwbGFjZS0+PnBhdGNoU3RyaW5nOiBSZXR1cm4gcmVwbGFjZWQgc3RyaW5nXG4gKiAgIHBhdGNoU3RyaW5nLS0+PkNhbGxlcjogUmV0dXJuIHBhdGNoZWQgc3RyaW5nXG4gKlxuICogQG1lbWJlck9mIG1vZHVsZTpUZXh0VXRpbHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhdGNoUGxhY2Vob2xkZXJzKFxuICBpbnB1dDogc3RyaW5nLFxuICB2YWx1ZXM6IFJlY29yZDxzdHJpbmcsIG51bWJlciB8IHN0cmluZz5cbik6IHN0cmluZyB7XG4gIHJldHVybiBpbnB1dC5yZXBsYWNlKFxuICAgIC9cXCRcXHsoW2EtekEtWjAtOV9dKylcXH0vZyxcbiAgICAobWF0Y2gsIHZhcmlhYmxlKSA9PiAodmFsdWVzW3ZhcmlhYmxlIGFzIHN0cmluZ10gYXMgc3RyaW5nKSB8fCBtYXRjaFxuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcGF0Y2hTdHJpbmcoXG4gIGlucHV0OiBzdHJpbmcsXG4gIHZhbHVlczogUmVjb3JkPHN0cmluZywgbnVtYmVyIHwgc3RyaW5nPixcbiAgZmxhZ3M6IHN0cmluZyA9IFwiZ1wiXG4pOiBzdHJpbmcge1xuICBPYmplY3QuZW50cmllcyh2YWx1ZXMpLmZvckVhY2goKFtrZXksIHZhbF0pID0+IHtcbiAgICBjb25zdCByZWdleHAgPSBuZXcgUmVnRXhwKGVzY2FwZVJlZ0V4cChrZXkpLCBmbGFncyk7XG4gICAgaW5wdXQgPSBpbnB1dC5yZXBsYWNlKHJlZ2V4cCwgdmFsIGFzIHN0cmluZyk7XG4gIH0pO1xuICByZXR1cm4gaW5wdXQ7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIENvbnZlcnRzIGEgc3RyaW5nIHRvIGNhbWVsQ2FzZS5cbiAqIEBzdW1tYXJ5IFRyYW5zZm9ybXMgdGhlIGlucHV0IHN0cmluZyBpbnRvIGNhbWVsQ2FzZSBmb3JtYXQsIHdoZXJlIHdvcmRzIGFyZSBqb2luZWQgd2l0aG91dCBzcGFjZXNcbiAqIGFuZCBlYWNoIHdvcmQgYWZ0ZXIgdGhlIGZpcnN0IHN0YXJ0cyB3aXRoIGEgY2FwaXRhbCBsZXR0ZXIuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHRleHQgLSBUaGUgaW5wdXQgc3RyaW5nIHRvIGJlIGNvbnZlcnRlZC5cbiAqIEByZXR1cm4ge3N0cmluZ30gVGhlIGlucHV0IHN0cmluZyBjb252ZXJ0ZWQgdG8gY2FtZWxDYXNlLlxuICpcbiAqIEBmdW5jdGlvbiB0b0NhbWVsQ2FzZVxuICpcbiAqIEBtZW1iZXJPZiBtb2R1bGU6VGV4dFV0aWxzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0NhbWVsQ2FzZSh0ZXh0OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gdGV4dFxuICAgIC5yZXBsYWNlKC8oPzpeXFx3fFtBLVpdfFxcYlxcdykvZywgKHdvcmQsIGluZGV4KSA9PlxuICAgICAgaW5kZXggPT09IDAgPyB3b3JkLnRvTG93ZXJDYXNlKCkgOiB3b3JkLnRvVXBwZXJDYXNlKClcbiAgICApXG4gICAgLnJlcGxhY2UoL1xccysvZywgXCJcIik7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIENvbnZlcnRzIGEgc3RyaW5nIHRvIEVOVklST05NRU5UX1ZBUklBQkxFIGZvcm1hdC5cbiAqIEBzdW1tYXJ5IFRyYW5zZm9ybXMgdGhlIGlucHV0IHN0cmluZyBpbnRvIHVwcGVyY2FzZSB3aXRoIHdvcmRzIHNlcGFyYXRlZCBieSB1bmRlcnNjb3JlcyxcbiAqIHR5cGljYWxseSB1c2VkIGZvciBlbnZpcm9ubWVudCB2YXJpYWJsZSBuYW1lcy5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdGV4dCAtIFRoZSBpbnB1dCBzdHJpbmcgdG8gYmUgY29udmVydGVkLlxuICogQHJldHVybiB7c3RyaW5nfSBUaGUgaW5wdXQgc3RyaW5nIGNvbnZlcnRlZCB0byBFTlZJUk9OTUVOVF9WQVJJQUJMRSBmb3JtYXQuXG4gKlxuICogQGZ1bmN0aW9uIHRvRU5WRm9ybWF0XG4gKlxuICogQG1lbWJlck9mIG1vZHVsZTpUZXh0VXRpbHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvRU5WRm9ybWF0KHRleHQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiB0b1NuYWtlQ2FzZSh0ZXh0KS50b1VwcGVyQ2FzZSgpO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBDb252ZXJ0cyBhIHN0cmluZyB0byBzbmFrZV9jYXNlLlxuICogQHN1bW1hcnkgVHJhbnNmb3JtcyB0aGUgaW5wdXQgc3RyaW5nIGludG8gbG93ZXJjYXNlIHdpdGggd29yZHMgc2VwYXJhdGVkIGJ5IHVuZGVyc2NvcmVzLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0IC0gVGhlIGlucHV0IHN0cmluZyB0byBiZSBjb252ZXJ0ZWQuXG4gKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBpbnB1dCBzdHJpbmcgY29udmVydGVkIHRvIHNuYWtlX2Nhc2UuXG4gKlxuICogQGZ1bmN0aW9uIHRvU25ha2VDYXNlXG4gKlxuICogQG1lbWJlck9mIG1vZHVsZTpUZXh0VXRpbHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvU25ha2VDYXNlKHRleHQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiB0ZXh0XG4gICAgLnJlcGxhY2UoLyhbYS16XSkoW0EtWl0pL2csIFwiJDFfJDJcIilcbiAgICAucmVwbGFjZSgvW1xccy1dKy9nLCBcIl9cIilcbiAgICAudG9Mb3dlckNhc2UoKTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQ29udmVydHMgYSBzdHJpbmcgdG8ga2ViYWItY2FzZS5cbiAqIEBzdW1tYXJ5IFRyYW5zZm9ybXMgdGhlIGlucHV0IHN0cmluZyBpbnRvIGxvd2VyY2FzZSB3aXRoIHdvcmRzIHNlcGFyYXRlZCBieSBoeXBoZW5zLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0IC0gVGhlIGlucHV0IHN0cmluZyB0byBiZSBjb252ZXJ0ZWQuXG4gKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBpbnB1dCBzdHJpbmcgY29udmVydGVkIHRvIGtlYmFiLWNhc2UuXG4gKlxuICogQGZ1bmN0aW9uIHRvS2ViYWJDYXNlXG4gKlxuICogQG1lbWJlck9mIG1vZHVsZTpUZXh0VXRpbHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvS2ViYWJDYXNlKHRleHQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiB0ZXh0XG4gICAgLnJlcGxhY2UoLyhbYS16XSkoW0EtWl0pL2csIFwiJDEtJDJcIilcbiAgICAucmVwbGFjZSgvW1xcc19dKy9nLCBcIi1cIilcbiAgICAudG9Mb3dlckNhc2UoKTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQ29udmVydHMgYSBzdHJpbmcgdG8gUGFzY2FsQ2FzZS5cbiAqIEBzdW1tYXJ5IFRyYW5zZm9ybXMgdGhlIGlucHV0IHN0cmluZyBpbnRvIFBhc2NhbENhc2UgZm9ybWF0LCB3aGVyZSB3b3JkcyBhcmUgam9pbmVkIHdpdGhvdXQgc3BhY2VzXG4gKiBhbmQgZWFjaCB3b3JkIHN0YXJ0cyB3aXRoIGEgY2FwaXRhbCBsZXR0ZXIuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHRleHQgLSBUaGUgaW5wdXQgc3RyaW5nIHRvIGJlIGNvbnZlcnRlZC5cbiAqIEByZXR1cm4ge3N0cmluZ30gVGhlIGlucHV0IHN0cmluZyBjb252ZXJ0ZWQgdG8gUGFzY2FsQ2FzZS5cbiAqXG4gKiBAZnVuY3Rpb24gdG9QYXNjYWxDYXNlXG4gKlxuICogQG1lbWJlck9mIG1vZHVsZTpUZXh0VXRpbHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvUGFzY2FsQ2FzZSh0ZXh0OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gdGV4dFxuICAgIC5yZXBsYWNlKC8oPzpeXFx3fFtBLVpdfFxcYlxcdykvZywgKHdvcmQpID0+IHdvcmQudG9VcHBlckNhc2UoKSlcbiAgICAucmVwbGFjZSgvXFxzKy9nLCBcIlwiKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGVzY2FwZVJlZ0V4cChzdHJpbmc6IHN0cmluZykge1xuICByZXR1cm4gc3RyaW5nLnJlcGxhY2UoL1suKis/XiR7fSgpfFtcXF1cXFxcXS9nLCBcIlxcXFwkJlwiKTsgLy8gJCYgbWVhbnMgdGhlIHdob2xlIG1hdGNoZWQgc3RyaW5nXG59XG4iXX0=
@@ -0,0 +1,5 @@
1
+ export async function awaitTimeout(ms) {
2
+ return new Promise((resolve) => setTimeout(resolve, ms));
3
+ }
4
+
5
+ //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy91dGlscy90aW1lb3V0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE1BQU0sQ0FBQyxLQUFLLFVBQVUsWUFBWSxDQUFDLEVBQVU7SUFDM0MsT0FBTyxJQUFJLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsVUFBVSxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQzNELENBQUMiLCJmaWxlIjoidXRpbHMvdGltZW91dC5qcyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBhc3luYyBmdW5jdGlvbiBhd2FpdFRpbWVvdXQobXM6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgbXMpKTtcbn1cbiJdfQ==
@@ -0,0 +1,3 @@
1
+ export {};
2
+
3
+ //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy91dGlscy90eXBlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwiZmlsZSI6InV0aWxzL3R5cGVzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hpbGRQcm9jZXNzV2l0aG91dE51bGxTdHJlYW1zIH0gZnJvbSBcImNoaWxkX3Byb2Nlc3NcIjtcbmltcG9ydCB7IEVudmlyb25tZW50IH0gZnJvbSBcIi4vZW52aXJvbm1lbnRcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGVmaW5lcyB0aGUgc3RydWN0dXJlIGZvciBwcm9taXNlIHJlc29sdXRpb24gYW5kIHJlamVjdGlvbi5cbiAqIEBzdW1tYXJ5IFByb3ZpZGVzIG1ldGhvZHMgdG8gcmVzb2x2ZSBvciByZWplY3QgYSBwcm9taXNlLlxuICogQHRlbXBsYXRlIFIgLSBUaGUgdHlwZSBvZiB0aGUgcmVzb2x2ZWQgdmFsdWUuXG4gKiBAdGVtcGxhdGUgRSAtIFRoZSB0eXBlIG9mIHRoZSBlcnJvciB2YWx1ZSwgZGVmYXVsdGluZyB0byBFcnJvci5cbiAqIEB0eXBlZGVmIHtPYmplY3R9IFByb21pc2VFeGVjdXRvclxuICogQHByb3BlcnR5IHtmdW5jdGlvbihSKTogdm9pZH0gcmVzb2x2ZSAtIEZ1bmN0aW9uIHRvIHJlc29sdmUgdGhlIHByb21pc2UuXG4gKiBAcHJvcGVydHkge2Z1bmN0aW9uKEUpOiB2b2lkfSByZWplY3QgLSBGdW5jdGlvbiB0byByZWplY3QgdGhlIHByb21pc2UuXG4gKiBAbWVtYmVyT2YgQGRlY2FmLXRzL3V0aWxzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvbWlzZUV4ZWN1dG9yPFIsIEUgPSBFcnJvcj4ge1xuICByZXNvbHZlOiAodmFsdWU6IFIgfCBQcm9taXNlTGlrZTxSPikgPT4gdm9pZDtcbiAgcmVqZWN0OiAoZXJyb3I6IEUpID0+IHZvaWQ7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFJlcHJlc2VudHMgdGhlIHJlc3VsdCBvZiBhIGNvbW1hbmQgZXhlY3V0aW9uLlxuICogQHN1bW1hcnkgRXh0ZW5kcyBQcm9taXNlIHdpdGggYWRkaXRpb25hbCBwcm9wZXJ0aWVzIHJlbGF0ZWQgdG8gdGhlIGNvbW1hbmQgZXhlY3V0aW9uLlxuICogVGhpcyBpbnRlcmZhY2UgcHJvdmlkZXMgYSBjb21wcmVoZW5zaXZlIHdheSB0byBoYW5kbGUgYW5kIGludGVyYWN0IHdpdGggdGhlIHJlc3VsdHNcbiAqIG9mIGFuIGFzeW5jaHJvbm91cyBjb21tYW5kIGV4ZWN1dGlvbiwgaW5jbHVkaW5nIGFjY2VzcyB0byB0aGUgY29tbWFuZCBkZXRhaWxzLFxuICogb3V0cHV0IGxvZ3MsIGFuZCB0aGUgYWJpbGl0eSB0byBhYm9ydCB0aGUgZXhlY3V0aW9uLlxuICpcbiAqIEB0ZW1wbGF0ZSBSIC0gVGhlIHR5cGUgb2YgdGhlIHJlc29sdmVkIHZhbHVlLCBkZWZhdWx0aW5nIHRvIHZvaWQuXG4gKiBAaW50ZXJmYWNlIENvbW1hbmRSZXN1bHRcbiAqIEBleHRlbmRzIFByb21pc2U8Uj5cbiAqIEBtZW1iZXJPZiBAZGVjYWYtdHMvdXRpbHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb21tYW5kUmVzdWx0PFIgPSB2b2lkPiB7XG4gIHByb21pc2U6IFByb21pc2U8Uj47XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDb250cm9sbGVyIHRvIGFib3J0IHRoZSBjb21tYW5kIGV4ZWN1dGlvbi5cbiAgICogQHN1bW1hcnkgUHJvdmlkZXMgYSBtZWNoYW5pc20gdG8gY2FuY2VsIHRoZSBvbmdvaW5nIGNvbW1hbmQgZXhlY3V0aW9uLlxuICAgKi9cbiAgYWJvcnQ6IEFib3J0Q29udHJvbGxlcjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRoZSBleGVjdXRlZCBjb21tYW5kIHN0cmluZy5cbiAgICogQHN1bW1hcnkgQ29udGFpbnMgdGhlIGFjdHVhbCBjb21tYW5kIHRoYXQgd2FzIGV4ZWN1dGVkLlxuICAgKi9cbiAgY29tbWFuZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVGhlIGNoaWxkIHByb2Nlc3Mgb2JqZWN0LlxuICAgKiBAc3VtbWFyeSBSZXByZXNlbnRzIHRoZSBOb2RlLmpzIGNoaWxkIHByb2Nlc3MgdGhhdCB3YXMgc3Bhd25lZCB0byBleGVjdXRlIHRoZSBjb21tYW5kLlxuICAgKi9cbiAgY21kPzogQ2hpbGRQcm9jZXNzV2l0aG91dE51bGxTdHJlYW1zO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQXJyYXkgb2Ygc3Rkb3V0IGxvZ3MuXG4gICAqIEBzdW1tYXJ5IENvbnRhaW5zIGFsbCB0aGUgc3RhbmRhcmQgb3V0cHV0IG1lc3NhZ2VzIHByb2R1Y2VkIGR1cmluZyB0aGUgY29tbWFuZCBleGVjdXRpb24uXG4gICAqL1xuICBsb2dzOiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEFycmF5IG9mIHN0ZGVyciBsb2dzLlxuICAgKiBAc3VtbWFyeSBDb250YWlucyBhbGwgdGhlIHN0YW5kYXJkIGVycm9yIG1lc3NhZ2VzIHByb2R1Y2VkIGR1cmluZyB0aGUgY29tbWFuZCBleGVjdXRpb24uXG4gICAqL1xuICBlcnJzOiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIGFsbG93cyBjaGFpbmluZyBjb21tYW5kcy5cbiAgICogQHN1bW1hcnkgYWxsb3dzIGNoYWluaW5nIGNvbW1hbmRzIChvciBwaXBpbmcpLlxuICAgKi9cbiAgcGlwZTogPEU+KGNiOiAocjogUikgPT4gRSkgPT4gUHJvbWlzZTxFPjtcbn1cblxuZXhwb3J0IHR5cGUgRW52aXJvbm1lbnRGYWN0b3J5PFQgZXh0ZW5kcyBvYmplY3QsIEUgZXh0ZW5kcyBFbnZpcm9ubWVudDxUPj4gPSAoXG4gIC4uLmFyZ3M6IHVua25vd25bXVxuKSA9PiBFO1xuXG5leHBvcnQgdHlwZSBEZXBlbmRlbmN5TWFwID0ge1xuICBwcm9kOiB7IG5hbWU6IHN0cmluZzsgdmVyc2lvbjogc3RyaW5nIH1bXTtcbiAgZGV2OiB7IG5hbWU6IHN0cmluZzsgdmVyc2lvbjogc3RyaW5nIH1bXTtcbiAgcGVlcjogeyBuYW1lOiBzdHJpbmc7IHZlcnNpb246IHN0cmluZyB9W107XG59O1xuXG5leHBvcnQgdHlwZSBTaW1wbGVEZXBlbmRlbmN5TWFwID0ge1xuICBwcm9kPzogc3RyaW5nW107XG4gIGRldj86IHN0cmluZ1tdO1xuICBwZWVyPzogc3RyaW5nW107XG59O1xuIl19