@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.
- package/LICENSE.md +157 -0
- package/README.md +95 -0
- package/dist/esm/utils.js +1 -0
- package/dist/types/bin/tag-release.d.ts +1 -0
- package/dist/types/bin/update-scripts.d.ts +1 -0
- package/dist/types/cli/command.d.ts +110 -0
- package/dist/types/cli/commands/index.d.ts +2 -0
- package/dist/types/cli/commands/tag-release.d.ts +105 -0
- package/dist/types/cli/commands/update-scripts.d.ts +211 -0
- package/dist/types/cli/constants.d.ts +73 -0
- package/dist/types/cli/index.d.ts +4 -0
- package/dist/types/cli/types.d.ts +28 -0
- package/dist/types/index.d.ts +39 -0
- package/dist/types/input/index.d.ts +2 -0
- package/dist/types/input/input.d.ts +472 -0
- package/dist/types/input/types.d.ts +76 -0
- package/dist/types/output/common.d.ts +51 -0
- package/dist/types/output/index.d.ts +3 -0
- package/dist/types/output/logging.d.ts +177 -0
- package/dist/types/output/types.d.ts +203 -0
- package/dist/types/utils/accumulator.d.ts +105 -0
- package/dist/types/utils/constants.d.ts +136 -0
- package/dist/types/utils/environment.d.ts +57 -0
- package/dist/types/utils/fs.d.ts +133 -0
- package/dist/types/utils/http.d.ts +41 -0
- package/dist/types/utils/index.d.ts +7 -0
- package/dist/types/utils/md.d.ts +156 -0
- package/dist/types/utils/tests.d.ts +170 -0
- package/dist/types/utils/text.d.ts +106 -0
- package/dist/types/utils/timeout.d.ts +1 -0
- package/dist/types/utils/types.d.ts +81 -0
- package/dist/types/utils/utils.d.ts +91 -0
- package/dist/types/utils/web.d.ts +7 -0
- package/dist/types/writers/OutputWriter.d.ts +49 -0
- package/dist/types/writers/RegexpOutputWriter.d.ts +69 -0
- package/dist/types/writers/StandardOutputWriter.d.ts +91 -0
- package/dist/types/writers/index.d.ts +4 -0
- package/dist/types/writers/types.d.ts +29 -0
- package/dist/utils.js +1 -0
- package/lib/assets/slogans.json +802 -0
- package/lib/bin/tag-release.cjs +12 -0
- package/lib/bin/update-scripts.cjs +12 -0
- package/lib/cli/command.cjs +153 -0
- package/lib/cli/commands/index.cjs +20 -0
- package/lib/cli/commands/tag-release.cjs +168 -0
- package/lib/cli/commands/update-scripts.cjs +511 -0
- package/lib/cli/constants.cjs +80 -0
- package/lib/cli/index.cjs +22 -0
- package/lib/cli/types.cjs +4 -0
- package/lib/esm/assets/slogans.json +802 -0
- package/lib/esm/bin/tag-release.js +10 -0
- package/lib/esm/bin/update-scripts.js +10 -0
- package/lib/esm/cli/command.js +149 -0
- package/lib/esm/cli/commands/index.js +4 -0
- package/lib/esm/cli/commands/tag-release.js +164 -0
- package/lib/esm/cli/commands/update-scripts.js +504 -0
- package/lib/esm/cli/constants.js +77 -0
- package/lib/esm/cli/index.js +6 -0
- package/lib/esm/cli/types.js +3 -0
- package/lib/esm/index.js +41 -0
- package/lib/esm/input/index.js +4 -0
- package/lib/esm/input/input.js +570 -0
- package/lib/esm/input/types.js +3 -0
- package/lib/esm/output/common.js +93 -0
- package/lib/esm/output/index.js +5 -0
- package/lib/esm/output/logging.js +350 -0
- package/lib/esm/output/types.js +3 -0
- package/lib/esm/utils/accumulator.js +145 -0
- package/lib/esm/utils/constants.js +176 -0
- package/lib/esm/utils/environment.js +91 -0
- package/lib/esm/utils/fs.js +271 -0
- package/lib/esm/utils/http.js +70 -0
- package/lib/esm/utils/index.js +9 -0
- package/lib/esm/utils/md.js +3 -0
- package/lib/esm/utils/tests.js +223 -0
- package/lib/esm/utils/text.js +142 -0
- package/lib/esm/utils/timeout.js +5 -0
- package/lib/esm/utils/types.js +3 -0
- package/lib/esm/utils/utils.js +220 -0
- package/lib/esm/utils/web.js +12 -0
- package/lib/esm/writers/OutputWriter.js +3 -0
- package/lib/esm/writers/RegexpOutputWriter.js +98 -0
- package/lib/esm/writers/StandardOutputWriter.js +127 -0
- package/lib/esm/writers/index.js +6 -0
- package/lib/esm/writers/types.js +3 -0
- package/lib/index.cjs +58 -0
- package/lib/input/index.cjs +20 -0
- package/lib/input/input.cjs +577 -0
- package/lib/input/types.cjs +4 -0
- package/lib/output/common.cjs +100 -0
- package/lib/output/index.cjs +21 -0
- package/lib/output/logging.cjs +355 -0
- package/lib/output/types.cjs +4 -0
- package/lib/utils/accumulator.cjs +149 -0
- package/lib/utils/constants.cjs +179 -0
- package/lib/utils/environment.cjs +95 -0
- package/lib/utils/fs.cjs +288 -0
- package/lib/utils/http.cjs +77 -0
- package/lib/utils/index.cjs +25 -0
- package/lib/utils/md.cjs +4 -0
- package/lib/utils/tests.cjs +263 -0
- package/lib/utils/text.cjs +153 -0
- package/lib/utils/timeout.cjs +8 -0
- package/lib/utils/types.cjs +4 -0
- package/lib/utils/utils.cjs +226 -0
- package/lib/utils/web.cjs +15 -0
- package/lib/writers/OutputWriter.cjs +4 -0
- package/lib/writers/RegexpOutputWriter.cjs +102 -0
- package/lib/writers/StandardOutputWriter.cjs +131 -0
- package/lib/writers/index.cjs +22 -0
- package/lib/writers/types.cjs +4 -0
- package/package.json +121 -0
package/lib/utils/fs.cjs
ADDED
|
@@ -0,0 +1,288 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.patchFile = patchFile;
|
|
7
|
+
exports.readFile = readFile;
|
|
8
|
+
exports.writeFile = writeFile;
|
|
9
|
+
exports.getPackage = getPackage;
|
|
10
|
+
exports.setPackageAttribute = setPackageAttribute;
|
|
11
|
+
exports.getPackageVersion = getPackageVersion;
|
|
12
|
+
exports.getDependencies = getDependencies;
|
|
13
|
+
exports.updateDependencies = updateDependencies;
|
|
14
|
+
exports.installIfNotAvailable = installIfNotAvailable;
|
|
15
|
+
exports.pushToGit = pushToGit;
|
|
16
|
+
exports.installDependencies = installDependencies;
|
|
17
|
+
exports.normalizeImport = normalizeImport;
|
|
18
|
+
const fs_1 = __importDefault(require("fs"));
|
|
19
|
+
const path_1 = __importDefault(require("path"));
|
|
20
|
+
const logging_1 = require("../output/logging.cjs");
|
|
21
|
+
const text_1 = require("./text.cjs");
|
|
22
|
+
const utils_1 = require("./utils.cjs");
|
|
23
|
+
const logger = logging_1.Logging.for("fs");
|
|
24
|
+
/**
|
|
25
|
+
* @description Patches a file with given values.
|
|
26
|
+
* @summary Reads a file, applies patches using TextUtils, and writes the result back to the file.
|
|
27
|
+
*
|
|
28
|
+
* @param {string} path - The path to the file to be patched.
|
|
29
|
+
* @param {Record<string, number | string>} values - The values to patch into the file.
|
|
30
|
+
* @return {void}
|
|
31
|
+
*
|
|
32
|
+
* @function patchFile
|
|
33
|
+
*
|
|
34
|
+
* @mermaid
|
|
35
|
+
* sequenceDiagram
|
|
36
|
+
* participant Caller
|
|
37
|
+
* participant patchFile
|
|
38
|
+
* participant fs
|
|
39
|
+
* participant readFile
|
|
40
|
+
* participant TextUtils
|
|
41
|
+
* participant writeFile
|
|
42
|
+
* Caller->>patchFile: Call with path and values
|
|
43
|
+
* patchFile->>fs: Check if file exists
|
|
44
|
+
* patchFile->>readFile: Read file content
|
|
45
|
+
* readFile->>fs: Read file
|
|
46
|
+
* fs-->>readFile: Return file content
|
|
47
|
+
* readFile-->>patchFile: Return file content
|
|
48
|
+
* patchFile->>TextUtils: Patch string
|
|
49
|
+
* TextUtils-->>patchFile: Return patched content
|
|
50
|
+
* patchFile->>writeFile: Write patched content
|
|
51
|
+
* writeFile->>fs: Write to file
|
|
52
|
+
* fs-->>writeFile: File written
|
|
53
|
+
* writeFile-->>patchFile: File written
|
|
54
|
+
* patchFile-->>Caller: Patching complete
|
|
55
|
+
*
|
|
56
|
+
* @memberOf module:fs-utils
|
|
57
|
+
*/
|
|
58
|
+
function patchFile(path, values) {
|
|
59
|
+
const log = logger.for(patchFile);
|
|
60
|
+
if (!fs_1.default.existsSync(path))
|
|
61
|
+
throw new Error(`File not found at path "${path}".`);
|
|
62
|
+
let content = readFile(path);
|
|
63
|
+
try {
|
|
64
|
+
log.verbose(`Patching file "${path}"...`);
|
|
65
|
+
log.debug(`with value: ${JSON.stringify(values)}`);
|
|
66
|
+
content = (0, text_1.patchString)(content, values);
|
|
67
|
+
}
|
|
68
|
+
catch (error) {
|
|
69
|
+
throw new Error(`Error patching file: ${error}`);
|
|
70
|
+
}
|
|
71
|
+
writeFile(path, content);
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* @description Reads a file and returns its content.
|
|
75
|
+
* @summary Reads the content of a file at the specified path and returns it as a string.
|
|
76
|
+
*
|
|
77
|
+
* @param {string} path - The path to the file to be read.
|
|
78
|
+
* @return {string} The content of the file.
|
|
79
|
+
*
|
|
80
|
+
* @function readFile
|
|
81
|
+
*
|
|
82
|
+
* @memberOf module:utils
|
|
83
|
+
*/
|
|
84
|
+
function readFile(path) {
|
|
85
|
+
const log = logger.for(readFile);
|
|
86
|
+
try {
|
|
87
|
+
log.verbose(`Reading file "${path}"...`);
|
|
88
|
+
return fs_1.default.readFileSync(path, "utf8");
|
|
89
|
+
}
|
|
90
|
+
catch (error) {
|
|
91
|
+
log.verbose(`Error reading file "${path}": ${error}`);
|
|
92
|
+
throw new Error(`Error reading file "${path}": ${error}`);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* @description Writes data to a file.
|
|
97
|
+
* @summary Writes the provided data to a file at the specified path.
|
|
98
|
+
*
|
|
99
|
+
* @param {string} path - The path to the file to be written.
|
|
100
|
+
* @param {string | Buffer} data - The data to be written to the file.
|
|
101
|
+
* @return {void}
|
|
102
|
+
*
|
|
103
|
+
* @function writeFile
|
|
104
|
+
*
|
|
105
|
+
* @memberOf module:utils
|
|
106
|
+
*/
|
|
107
|
+
function writeFile(path, data) {
|
|
108
|
+
const log = logger.for(writeFile);
|
|
109
|
+
try {
|
|
110
|
+
log.verbose(`Writing file "${path} with ${data.length} bytes...`);
|
|
111
|
+
fs_1.default.writeFileSync(path, data, "utf8");
|
|
112
|
+
}
|
|
113
|
+
catch (error) {
|
|
114
|
+
log.verbose(`Error writing file "${path}": ${error}`);
|
|
115
|
+
throw new Error(`Error writing file "${path}": ${error}`);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* @description Retrieves package information from package.json.
|
|
120
|
+
* @summary Loads and parses the package.json file from a specified directory or the current working directory. Can return the entire package object or a specific property.
|
|
121
|
+
* @param {string} [p=process.cwd()] - The directory path where the package.json file is located.
|
|
122
|
+
* @param {string} [property] - Optional. The specific property to retrieve from package.json.
|
|
123
|
+
* @return {object | string} The parsed contents of package.json or the value of the specified property.
|
|
124
|
+
* @function getPackage
|
|
125
|
+
* @mermaid
|
|
126
|
+
* sequenceDiagram
|
|
127
|
+
* participant Caller
|
|
128
|
+
* participant getPackage
|
|
129
|
+
* participant readFile
|
|
130
|
+
* participant JSON
|
|
131
|
+
* Caller->>getPackage: Call with path and optional property
|
|
132
|
+
* getPackage->>readFile: Read package.json
|
|
133
|
+
* readFile-->>getPackage: Return file content
|
|
134
|
+
* getPackage->>JSON: Parse file content
|
|
135
|
+
* JSON-->>getPackage: Return parsed object
|
|
136
|
+
* alt property specified
|
|
137
|
+
* getPackage->>getPackage: Check if property exists
|
|
138
|
+
* alt property exists
|
|
139
|
+
* getPackage-->>Caller: Return property value
|
|
140
|
+
* else property doesn't exist
|
|
141
|
+
* getPackage-->>Caller: Throw Error
|
|
142
|
+
* end
|
|
143
|
+
* else no property specified
|
|
144
|
+
* getPackage-->>Caller: Return entire package object
|
|
145
|
+
* end
|
|
146
|
+
* @memberOf module:utils
|
|
147
|
+
*/
|
|
148
|
+
function getPackage(p = process.cwd(), property) {
|
|
149
|
+
let pkg;
|
|
150
|
+
try {
|
|
151
|
+
pkg = JSON.parse(readFile(path_1.default.join(p, `package.json`)));
|
|
152
|
+
}
|
|
153
|
+
catch (error) {
|
|
154
|
+
throw new Error(`Failed to retrieve package information" ${error}`);
|
|
155
|
+
}
|
|
156
|
+
if (property) {
|
|
157
|
+
if (!(property in pkg))
|
|
158
|
+
throw new Error(`Property "${property}" not found in package.json`);
|
|
159
|
+
return pkg[property];
|
|
160
|
+
}
|
|
161
|
+
return pkg;
|
|
162
|
+
}
|
|
163
|
+
function setPackageAttribute(attr, value, p = process.cwd()) {
|
|
164
|
+
const pkg = getPackage(p);
|
|
165
|
+
pkg[attr] = value;
|
|
166
|
+
writeFile(path_1.default.join(p, `package.json`), JSON.stringify(pkg, null, 2));
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* @description Retrieves the version from package.json.
|
|
170
|
+
* @summary A convenience function that calls getPackage to retrieve the "version" property from package.json.
|
|
171
|
+
* @param {string} [p=process.cwd()] - The directory path where the package.json file is located.
|
|
172
|
+
* @return {string} The version string from package.json.
|
|
173
|
+
* @function getPackageVersion
|
|
174
|
+
* @memberOf module:fs-utils
|
|
175
|
+
*/
|
|
176
|
+
function getPackageVersion(p = process.cwd()) {
|
|
177
|
+
return getPackage(p, "version");
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* @description Retrieves all dependencies from the project.
|
|
181
|
+
* @summary Executes 'npm ls --json' command to get a detailed list of all dependencies (production, development, and peer) and their versions.
|
|
182
|
+
* @param {string} [path=process.cwd()] - The directory path of the project.
|
|
183
|
+
* @return {Promise<{prod: Array<{name: string, version: string}>, dev: Array<{name: string, version: string}>, peer: Array<{name: string, version: string}>}>} An object containing arrays of production, development, and peer dependencies.
|
|
184
|
+
* @function getDependencies
|
|
185
|
+
* @mermaid
|
|
186
|
+
* sequenceDiagram
|
|
187
|
+
* participant Caller
|
|
188
|
+
* participant getDependencies
|
|
189
|
+
* participant runCommand
|
|
190
|
+
* participant JSON
|
|
191
|
+
* Caller->>getDependencies: Call with optional path
|
|
192
|
+
* getDependencies->>runCommand: Execute 'npm ls --json'
|
|
193
|
+
* runCommand-->>getDependencies: Return command output
|
|
194
|
+
* getDependencies->>JSON: Parse command output
|
|
195
|
+
* JSON-->>getDependencies: Return parsed object
|
|
196
|
+
* getDependencies->>getDependencies: Process dependencies
|
|
197
|
+
* getDependencies-->>Caller: Return processed dependencies
|
|
198
|
+
* @memberOf module:fs-utils
|
|
199
|
+
*/
|
|
200
|
+
async function getDependencies(path = process.cwd()) {
|
|
201
|
+
let pkg;
|
|
202
|
+
try {
|
|
203
|
+
pkg = JSON.parse(await (0, utils_1.runCommand)(`npm ls --json`, { cwd: path }).promise);
|
|
204
|
+
}
|
|
205
|
+
catch (e) {
|
|
206
|
+
throw new Error(`Failed to retrieve dependencies: ${e}`);
|
|
207
|
+
}
|
|
208
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
209
|
+
const mapper = (entry, index) => ({
|
|
210
|
+
name: entry[0],
|
|
211
|
+
version: entry[1].version,
|
|
212
|
+
});
|
|
213
|
+
return {
|
|
214
|
+
prod: Object.entries(pkg.dependencies || {}).map(mapper),
|
|
215
|
+
dev: Object.entries(pkg.devDependencies || {}).map(mapper),
|
|
216
|
+
peer: Object.entries(pkg.peerDependencies || {}).map(mapper),
|
|
217
|
+
};
|
|
218
|
+
}
|
|
219
|
+
async function updateDependencies() {
|
|
220
|
+
const log = logger.for(updateDependencies);
|
|
221
|
+
log.info("checking for updates...");
|
|
222
|
+
await (0, utils_1.runCommand)("npx npm-check-updates -u").promise;
|
|
223
|
+
log.info("updating...");
|
|
224
|
+
await (0, utils_1.runCommand)("npx npm run do-install").promise;
|
|
225
|
+
}
|
|
226
|
+
async function installIfNotAvailable(deps, dependencies) {
|
|
227
|
+
if (!dependencies) {
|
|
228
|
+
const d = await getDependencies();
|
|
229
|
+
dependencies = {
|
|
230
|
+
prod: d.prod?.map((p) => p.name) || [],
|
|
231
|
+
dev: d.dev?.map((d) => d.name) || [],
|
|
232
|
+
peer: d.peer?.map((p) => p.name) || [],
|
|
233
|
+
};
|
|
234
|
+
}
|
|
235
|
+
const { prod, dev, peer } = dependencies;
|
|
236
|
+
const installed = Array.from(new Set([...(prod || []), ...(dev || []), ...(peer || [])]));
|
|
237
|
+
deps = typeof deps === "string" ? [deps] : deps;
|
|
238
|
+
const toInstall = deps.filter((d) => !installed.includes(d));
|
|
239
|
+
if (toInstall.length)
|
|
240
|
+
await installDependencies({ dev: toInstall });
|
|
241
|
+
dependencies.dev = dependencies.dev || [];
|
|
242
|
+
dependencies.dev.push(...toInstall);
|
|
243
|
+
return dependencies;
|
|
244
|
+
}
|
|
245
|
+
async function pushToGit() {
|
|
246
|
+
const log = logger.for(pushToGit);
|
|
247
|
+
const gitUser = await (0, utils_1.runCommand)("git config user.name").promise;
|
|
248
|
+
const gitEmail = await (0, utils_1.runCommand)("git config user.email").promise;
|
|
249
|
+
log.verbose(`cached git id: ${gitUser}/${gitEmail}. changing to automation`);
|
|
250
|
+
await (0, utils_1.runCommand)('git config user.email "automation@decaf.ts"').promise;
|
|
251
|
+
await (0, utils_1.runCommand)('git config user.name "decaf"').promise;
|
|
252
|
+
log.info("Pushing changes to git...");
|
|
253
|
+
await (0, utils_1.runCommand)("git add .").promise;
|
|
254
|
+
await (0, utils_1.runCommand)(`git commit -m "refs #1 - after repo setup"`).promise;
|
|
255
|
+
await (0, utils_1.runCommand)("git push").promise;
|
|
256
|
+
await (0, utils_1.runCommand)(`git config user.email "${gitEmail}"`).promise;
|
|
257
|
+
await (0, utils_1.runCommand)(`git config user.name "${gitUser}"`).promise;
|
|
258
|
+
log.verbose(`reverted to git id: ${gitUser}/${gitEmail}`);
|
|
259
|
+
}
|
|
260
|
+
async function installDependencies(dependencies) {
|
|
261
|
+
const log = logger.for(installDependencies);
|
|
262
|
+
const prod = dependencies.prod || [];
|
|
263
|
+
const dev = dependencies.dev || [];
|
|
264
|
+
const peer = dependencies.peer || [];
|
|
265
|
+
if (prod.length) {
|
|
266
|
+
log.info(`Installing dependencies ${prod.join(", ")}...`);
|
|
267
|
+
await (0, utils_1.runCommand)(`npm install ${prod.join(" ")}`, { cwd: process.cwd() })
|
|
268
|
+
.promise;
|
|
269
|
+
}
|
|
270
|
+
if (dev.length) {
|
|
271
|
+
log.info(`Installing devDependencies ${dev.join(", ")}...`);
|
|
272
|
+
await (0, utils_1.runCommand)(`npm install --save-dev ${dev.join(" ")}`, {
|
|
273
|
+
cwd: process.cwd(),
|
|
274
|
+
}).promise;
|
|
275
|
+
}
|
|
276
|
+
if (peer.length) {
|
|
277
|
+
log.info(`Installing peerDependencies ${peer.join(", ")}...`);
|
|
278
|
+
await (0, utils_1.runCommand)(`npm install --save-peer ${peer.join(" ")}`, {
|
|
279
|
+
cwd: process.cwd(),
|
|
280
|
+
}).promise;
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
async function normalizeImport(importPromise) {
|
|
284
|
+
// CommonJS's `module.exports` is wrapped as `default` in ESModule.
|
|
285
|
+
return importPromise.then((m) => (m.default || m));
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
//# sourceMappingURL=data:application/json;charset=utf8;base64,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LEVBQUUsQ0FBQztRQUNmLEdBQUcsQ0FBQyxJQUFJLENBQUMsOEJBQThCLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzVELE1BQU0sSUFBQSxrQkFBVSxFQUFDLDBCQUEwQixHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUU7WUFDMUQsR0FBRyxFQUFFLE9BQU8sQ0FBQyxHQUFHLEVBQUU7U0FDbkIsQ0FBQyxDQUFDLE9BQU8sQ0FBQztJQUNiLENBQUM7SUFDRCxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNoQixHQUFHLENBQUMsSUFBSSxDQUFDLCtCQUErQixJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM5RCxNQUFNLElBQUEsa0JBQVUsRUFBQywyQkFBMkIsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFO1lBQzVELEdBQUcsRUFBRSxPQUFPLENBQUMsR0FBRyxFQUFFO1NBQ25CLENBQUMsQ0FBQyxPQUFPLENBQUM7SUFDYixDQUFDO0FBQ0gsQ0FBQztBQUVNLEtBQUssVUFBVSxlQUFlLENBQ25DLGFBQXlCO0lBRXpCLG1FQUFtRTtJQUNuRSxPQUFPLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFNLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLENBQU0sQ0FBQyxDQUFDO0FBQy9ELENBQUMiLCJmaWxlIjoidXRpbHMvZnMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgZnMgZnJvbSBcImZzXCI7XG5pbXBvcnQgcGF0aCBmcm9tIFwicGF0aFwiO1xuaW1wb3J0IHsgTG9nZ2luZyB9IGZyb20gXCIuLi9vdXRwdXQvbG9nZ2luZ1wiO1xuaW1wb3J0IHsgcGF0Y2hTdHJpbmcgfSBmcm9tIFwiLi90ZXh0XCI7XG5pbXBvcnQgeyBydW5Db21tYW5kIH0gZnJvbSBcIi4vdXRpbHNcIjtcbmltcG9ydCB7IERlcGVuZGVuY3lNYXAsIFNpbXBsZURlcGVuZGVuY3lNYXAgfSBmcm9tIFwiLi90eXBlc1wiO1xuXG5jb25zdCBsb2dnZXIgPSBMb2dnaW5nLmZvcihcImZzXCIpO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBQYXRjaGVzIGEgZmlsZSB3aXRoIGdpdmVuIHZhbHVlcy5cbiAqIEBzdW1tYXJ5IFJlYWRzIGEgZmlsZSwgYXBwbGllcyBwYXRjaGVzIHVzaW5nIFRleHRVdGlscywgYW5kIHdyaXRlcyB0aGUgcmVzdWx0IGJhY2sgdG8gdGhlIGZpbGUuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHBhdGggLSBUaGUgcGF0aCB0byB0aGUgZmlsZSB0byBiZSBwYXRjaGVkLlxuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBudW1iZXIgfCBzdHJpbmc+fSB2YWx1ZXMgLSBUaGUgdmFsdWVzIHRvIHBhdGNoIGludG8gdGhlIGZpbGUuXG4gKiBAcmV0dXJuIHt2b2lkfVxuICpcbiAqIEBmdW5jdGlvbiBwYXRjaEZpbGVcbiAqXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IENhbGxlclxuICogICBwYXJ0aWNpcGFudCBwYXRjaEZpbGVcbiAqICAgcGFydGljaXBhbnQgZnNcbiAqICAgcGFydGljaXBhbnQgcmVhZEZpbGVcbiAqICAgcGFydGljaXBhbnQgVGV4dFV0aWxzXG4gKiAgIHBhcnRpY2lwYW50IHdyaXRlRmlsZVxuICogICBDYWxsZXItPj5wYXRjaEZpbGU6IENhbGwgd2l0aCBwYXRoIGFuZCB2YWx1ZXNcbiAqICAgcGF0Y2hGaWxlLT4+ZnM6IENoZWNrIGlmIGZpbGUgZXhpc3RzXG4gKiAgIHBhdGNoRmlsZS0+PnJlYWRGaWxlOiBSZWFkIGZpbGUgY29udGVudFxuICogICByZWFkRmlsZS0+PmZzOiBSZWFkIGZpbGVcbiAqICAgZnMtLT4+cmVhZEZpbGU6IFJldHVybiBmaWxlIGNvbnRlbnRcbiAqICAgcmVhZEZpbGUtLT4+cGF0Y2hGaWxlOiBSZXR1cm4gZmlsZSBjb250ZW50XG4gKiAgIHBhdGNoRmlsZS0+PlRleHRVdGlsczogUGF0Y2ggc3RyaW5nXG4gKiAgIFRleHRVdGlscy0tPj5wYXRjaEZpbGU6IFJldHVybiBwYXRjaGVkIGNvbnRlbnRcbiAqICAgcGF0Y2hGaWxlLT4+d3JpdGVGaWxlOiBXcml0ZSBwYXRjaGVkIGNvbnRlbnRcbiAqICAgd3JpdGVGaWxlLT4+ZnM6IFdyaXRlIHRvIGZpbGVcbiAqICAgZnMtLT4+d3JpdGVGaWxlOiBGaWxlIHdyaXR0ZW5cbiAqICAgd3JpdGVGaWxlLS0+PnBhdGNoRmlsZTogRmlsZSB3cml0dGVuXG4gKiAgIHBhdGNoRmlsZS0tPj5DYWxsZXI6IFBhdGNoaW5nIGNvbXBsZXRlXG4gKlxuICogQG1lbWJlck9mIG1vZHVsZTpmcy11dGlsc1xuICovXG5leHBvcnQgZnVuY3Rpb24gcGF0Y2hGaWxlKFxuICBwYXRoOiBzdHJpbmcsXG4gIHZhbHVlczogUmVjb3JkPHN0cmluZywgbnVtYmVyIHwgc3RyaW5nPlxuKSB7XG4gIGNvbnN0IGxvZyA9IGxvZ2dlci5mb3IocGF0Y2hGaWxlKTtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKHBhdGgpKVxuICAgIHRocm93IG5ldyBFcnJvcihgRmlsZSBub3QgZm91bmQgYXQgcGF0aCBcIiR7cGF0aH1cIi5gKTtcbiAgbGV0IGNvbnRlbnQgPSByZWFkRmlsZShwYXRoKTtcblxuICB0cnkge1xuICAgIGxvZy52ZXJib3NlKGBQYXRjaGluZyBmaWxlIFwiJHtwYXRofVwiLi4uYCk7XG4gICAgbG9nLmRlYnVnKGB3aXRoIHZhbHVlOiAke0pTT04uc3RyaW5naWZ5KHZhbHVlcyl9YCk7XG4gICAgY29udGVudCA9IHBhdGNoU3RyaW5nKGNvbnRlbnQsIHZhbHVlcyk7XG4gIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciBwYXRjaGluZyBmaWxlOiAke2Vycm9yfWApO1xuICB9XG4gIHdyaXRlRmlsZShwYXRoLCBjb250ZW50KTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gUmVhZHMgYSBmaWxlIGFuZCByZXR1cm5zIGl0cyBjb250ZW50LlxuICogQHN1bW1hcnkgUmVhZHMgdGhlIGNvbnRlbnQgb2YgYSBmaWxlIGF0IHRoZSBzcGVjaWZpZWQgcGF0aCBhbmQgcmV0dXJucyBpdCBhcyBhIHN0cmluZy5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcGF0aCAtIFRoZSBwYXRoIHRvIHRoZSBmaWxlIHRvIGJlIHJlYWQuXG4gKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBjb250ZW50IG9mIHRoZSBmaWxlLlxuICpcbiAqIEBmdW5jdGlvbiByZWFkRmlsZVxuICpcbiAqIEBtZW1iZXJPZiBtb2R1bGU6dXRpbHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlYWRGaWxlKHBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IGxvZyA9IGxvZ2dlci5mb3IocmVhZEZpbGUpO1xuICB0cnkge1xuICAgIGxvZy52ZXJib3NlKGBSZWFkaW5nIGZpbGUgXCIke3BhdGh9XCIuLi5gKTtcbiAgICByZXR1cm4gZnMucmVhZEZpbGVTeW5jKHBhdGgsIFwidXRmOFwiKTtcbiAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICBsb2cudmVyYm9zZShgRXJyb3IgcmVhZGluZyBmaWxlIFwiJHtwYXRofVwiOiAke2Vycm9yfWApO1xuICAgIHRocm93IG5ldyBFcnJvcihgRXJyb3IgcmVhZGluZyBmaWxlIFwiJHtwYXRofVwiOiAke2Vycm9yfWApO1xuICB9XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFdyaXRlcyBkYXRhIHRvIGEgZmlsZS5cbiAqIEBzdW1tYXJ5IFdyaXRlcyB0aGUgcHJvdmlkZWQgZGF0YSB0byBhIGZpbGUgYXQgdGhlIHNwZWNpZmllZCBwYXRoLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIC0gVGhlIHBhdGggdG8gdGhlIGZpbGUgdG8gYmUgd3JpdHRlbi5cbiAqIEBwYXJhbSB7c3RyaW5nIHwgQnVmZmVyfSBkYXRhIC0gVGhlIGRhdGEgdG8gYmUgd3JpdHRlbiB0byB0aGUgZmlsZS5cbiAqIEByZXR1cm4ge3ZvaWR9XG4gKlxuICogQGZ1bmN0aW9uIHdyaXRlRmlsZVxuICpcbiAqIEBtZW1iZXJPZiBtb2R1bGU6dXRpbHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdyaXRlRmlsZShwYXRoOiBzdHJpbmcsIGRhdGE6IHN0cmluZyB8IEJ1ZmZlcik6IHZvaWQge1xuICBjb25zdCBsb2cgPSBsb2dnZXIuZm9yKHdyaXRlRmlsZSk7XG4gIHRyeSB7XG4gICAgbG9nLnZlcmJvc2UoYFdyaXRpbmcgZmlsZSBcIiR7cGF0aH0gd2l0aCAke2RhdGEubGVuZ3RofSBieXRlcy4uLmApO1xuICAgIGZzLndyaXRlRmlsZVN5bmMocGF0aCwgZGF0YSwgXCJ1dGY4XCIpO1xuICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgIGxvZy52ZXJib3NlKGBFcnJvciB3cml0aW5nIGZpbGUgXCIke3BhdGh9XCI6ICR7ZXJyb3J9YCk7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciB3cml0aW5nIGZpbGUgXCIke3BhdGh9XCI6ICR7ZXJyb3J9YCk7XG4gIH1cbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gUmV0cmlldmVzIHBhY2thZ2UgaW5mb3JtYXRpb24gZnJvbSBwYWNrYWdlLmpzb24uXG4gKiBAc3VtbWFyeSBMb2FkcyBhbmQgcGFyc2VzIHRoZSBwYWNrYWdlLmpzb24gZmlsZSBmcm9tIGEgc3BlY2lmaWVkIGRpcmVjdG9yeSBvciB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeS4gQ2FuIHJldHVybiB0aGUgZW50aXJlIHBhY2thZ2Ugb2JqZWN0IG9yIGEgc3BlY2lmaWMgcHJvcGVydHkuXG4gKiBAcGFyYW0ge3N0cmluZ30gW3A9cHJvY2Vzcy5jd2QoKV0gLSBUaGUgZGlyZWN0b3J5IHBhdGggd2hlcmUgdGhlIHBhY2thZ2UuanNvbiBmaWxlIGlzIGxvY2F0ZWQuXG4gKiBAcGFyYW0ge3N0cmluZ30gW3Byb3BlcnR5XSAtIE9wdGlvbmFsLiBUaGUgc3BlY2lmaWMgcHJvcGVydHkgdG8gcmV0cmlldmUgZnJvbSBwYWNrYWdlLmpzb24uXG4gKiBAcmV0dXJuIHtvYmplY3QgfCBzdHJpbmd9IFRoZSBwYXJzZWQgY29udGVudHMgb2YgcGFja2FnZS5qc29uIG9yIHRoZSB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIHByb3BlcnR5LlxuICogQGZ1bmN0aW9uIGdldFBhY2thZ2VcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQ2FsbGVyXG4gKiAgIHBhcnRpY2lwYW50IGdldFBhY2thZ2VcbiAqICAgcGFydGljaXBhbnQgcmVhZEZpbGVcbiAqICAgcGFydGljaXBhbnQgSlNPTlxuICogICBDYWxsZXItPj5nZXRQYWNrYWdlOiBDYWxsIHdpdGggcGF0aCBhbmQgb3B0aW9uYWwgcHJvcGVydHlcbiAqICAgZ2V0UGFja2FnZS0+PnJlYWRGaWxlOiBSZWFkIHBhY2thZ2UuanNvblxuICogICByZWFkRmlsZS0tPj5nZXRQYWNrYWdlOiBSZXR1cm4gZmlsZSBjb250ZW50XG4gKiAgIGdldFBhY2thZ2UtPj5KU09OOiBQYXJzZSBmaWxlIGNvbnRlbnRcbiAqICAgSlNPTi0tPj5nZXRQYWNrYWdlOiBSZXR1cm4gcGFyc2VkIG9iamVjdFxuICogICBhbHQgcHJvcGVydHkgc3BlY2lmaWVkXG4gKiAgICAgZ2V0UGFja2FnZS0+PmdldFBhY2thZ2U6IENoZWNrIGlmIHByb3BlcnR5IGV4aXN0c1xuICogICAgIGFsdCBwcm9wZXJ0eSBleGlzdHNcbiAqICAgICAgIGdldFBhY2thZ2UtLT4+Q2FsbGVyOiBSZXR1cm4gcHJvcGVydHkgdmFsdWVcbiAqICAgICBlbHNlIHByb3BlcnR5IGRvZXNuJ3QgZXhpc3RcbiAqICAgICAgIGdldFBhY2thZ2UtLT4+Q2FsbGVyOiBUaHJvdyBFcnJvclxuICogICAgIGVuZFxuICogICBlbHNlIG5vIHByb3BlcnR5IHNwZWNpZmllZFxuICogICAgIGdldFBhY2thZ2UtLT4+Q2FsbGVyOiBSZXR1cm4gZW50aXJlIHBhY2thZ2Ugb2JqZWN0XG4gKiAgIGVuZFxuICogQG1lbWJlck9mIG1vZHVsZTp1dGlsc1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0UGFja2FnZShcbiAgcDogc3RyaW5nID0gcHJvY2Vzcy5jd2QoKSxcbiAgcHJvcGVydHk/OiBzdHJpbmdcbik6IG9iamVjdCB8IHN0cmluZyB7XG4gIGxldCBwa2c6IGFueTtcbiAgdHJ5IHtcbiAgICBwa2cgPSBKU09OLnBhcnNlKHJlYWRGaWxlKHBhdGguam9pbihwLCBgcGFja2FnZS5qc29uYCkpKTtcbiAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byByZXRyaWV2ZSBwYWNrYWdlIGluZm9ybWF0aW9uXCIgJHtlcnJvcn1gKTtcbiAgfVxuXG4gIGlmIChwcm9wZXJ0eSkge1xuICAgIGlmICghKHByb3BlcnR5IGluIHBrZykpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFByb3BlcnR5IFwiJHtwcm9wZXJ0eX1cIiBub3QgZm91bmQgaW4gcGFja2FnZS5qc29uYCk7XG4gICAgcmV0dXJuIHBrZ1twcm9wZXJ0eV0gYXMgc3RyaW5nO1xuICB9XG4gIHJldHVybiBwa2c7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXRQYWNrYWdlQXR0cmlidXRlKFxuICBhdHRyOiBzdHJpbmcsXG4gIHZhbHVlOiBzdHJpbmcsXG4gIHA6IHN0cmluZyA9IHByb2Nlc3MuY3dkKClcbik6IHZvaWQge1xuICBjb25zdCBwa2cgPSBnZXRQYWNrYWdlKHApIGFzIFJlY29yZDxzdHJpbmcsIGFueT47XG4gIHBrZ1thdHRyXSA9IHZhbHVlO1xuICB3cml0ZUZpbGUocGF0aC5qb2luKHAsIGBwYWNrYWdlLmpzb25gKSwgSlNPTi5zdHJpbmdpZnkocGtnLCBudWxsLCAyKSk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFJldHJpZXZlcyB0aGUgdmVyc2lvbiBmcm9tIHBhY2thZ2UuanNvbi5cbiAqIEBzdW1tYXJ5IEEgY29udmVuaWVuY2UgZnVuY3Rpb24gdGhhdCBjYWxscyBnZXRQYWNrYWdlIHRvIHJldHJpZXZlIHRoZSBcInZlcnNpb25cIiBwcm9wZXJ0eSBmcm9tIHBhY2thZ2UuanNvbi5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbcD1wcm9jZXNzLmN3ZCgpXSAtIFRoZSBkaXJlY3RvcnkgcGF0aCB3aGVyZSB0aGUgcGFja2FnZS5qc29uIGZpbGUgaXMgbG9jYXRlZC5cbiAqIEByZXR1cm4ge3N0cmluZ30gVGhlIHZlcnNpb24gc3RyaW5nIGZyb20gcGFja2FnZS5qc29uLlxuICogQGZ1bmN0aW9uIGdldFBhY2thZ2VWZXJzaW9uXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmZzLXV0aWxzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRQYWNrYWdlVmVyc2lvbihwID0gcHJvY2Vzcy5jd2QoKSk6IHN0cmluZyB7XG4gIHJldHVybiBnZXRQYWNrYWdlKHAsIFwidmVyc2lvblwiKSBhcyBzdHJpbmc7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFJldHJpZXZlcyBhbGwgZGVwZW5kZW5jaWVzIGZyb20gdGhlIHByb2plY3QuXG4gKiBAc3VtbWFyeSBFeGVjdXRlcyAnbnBtIGxzIC0tanNvbicgY29tbWFuZCB0byBnZXQgYSBkZXRhaWxlZCBsaXN0IG9mIGFsbCBkZXBlbmRlbmNpZXMgKHByb2R1Y3Rpb24sIGRldmVsb3BtZW50LCBhbmQgcGVlcikgYW5kIHRoZWlyIHZlcnNpb25zLlxuICogQHBhcmFtIHtzdHJpbmd9IFtwYXRoPXByb2Nlc3MuY3dkKCldIC0gVGhlIGRpcmVjdG9yeSBwYXRoIG9mIHRoZSBwcm9qZWN0LlxuICogQHJldHVybiB7UHJvbWlzZTx7cHJvZDogQXJyYXk8e25hbWU6IHN0cmluZywgdmVyc2lvbjogc3RyaW5nfT4sIGRldjogQXJyYXk8e25hbWU6IHN0cmluZywgdmVyc2lvbjogc3RyaW5nfT4sIHBlZXI6IEFycmF5PHtuYW1lOiBzdHJpbmcsIHZlcnNpb246IHN0cmluZ30+fT59IEFuIG9iamVjdCBjb250YWluaW5nIGFycmF5cyBvZiBwcm9kdWN0aW9uLCBkZXZlbG9wbWVudCwgYW5kIHBlZXIgZGVwZW5kZW5jaWVzLlxuICogQGZ1bmN0aW9uIGdldERlcGVuZGVuY2llc1xuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBDYWxsZXJcbiAqICAgcGFydGljaXBhbnQgZ2V0RGVwZW5kZW5jaWVzXG4gKiAgIHBhcnRpY2lwYW50IHJ1bkNvbW1hbmRcbiAqICAgcGFydGljaXBhbnQgSlNPTlxuICogICBDYWxsZXItPj5nZXREZXBlbmRlbmNpZXM6IENhbGwgd2l0aCBvcHRpb25hbCBwYXRoXG4gKiAgIGdldERlcGVuZGVuY2llcy0+PnJ1bkNvbW1hbmQ6IEV4ZWN1dGUgJ25wbSBscyAtLWpzb24nXG4gKiAgIHJ1bkNvbW1hbmQtLT4+Z2V0RGVwZW5kZW5jaWVzOiBSZXR1cm4gY29tbWFuZCBvdXRwdXRcbiAqICAgZ2V0RGVwZW5kZW5jaWVzLT4+SlNPTjogUGFyc2UgY29tbWFuZCBvdXRwdXRcbiAqICAgSlNPTi0tPj5nZXREZXBlbmRlbmNpZXM6IFJldHVybiBwYXJzZWQgb2JqZWN0XG4gKiAgIGdldERlcGVuZGVuY2llcy0+PmdldERlcGVuZGVuY2llczogUHJvY2VzcyBkZXBlbmRlbmNpZXNcbiAqICAgZ2V0RGVwZW5kZW5jaWVzLS0+PkNhbGxlcjogUmV0dXJuIHByb2Nlc3NlZCBkZXBlbmRlbmNpZXNcbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZnMtdXRpbHNcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldERlcGVuZGVuY2llcyhcbiAgcGF0aDogc3RyaW5nID0gcHJvY2Vzcy5jd2QoKVxuKTogUHJvbWlzZTxEZXBlbmRlbmN5TWFwPiB7XG4gIGxldCBwa2c6IGFueTtcblxuICB0cnkge1xuICAgIHBrZyA9IEpTT04ucGFyc2UoYXdhaXQgcnVuQ29tbWFuZChgbnBtIGxzIC0tanNvbmAsIHsgY3dkOiBwYXRoIH0pLnByb21pc2UpO1xuICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gcmV0cmlldmUgZGVwZW5kZW5jaWVzOiAke2V9YCk7XG4gIH1cblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gIGNvbnN0IG1hcHBlciA9IChlbnRyeTogW3N0cmluZywgdW5rbm93bl0sIGluZGV4OiBudW1iZXIpID0+ICh7XG4gICAgbmFtZTogZW50cnlbMF0sXG4gICAgdmVyc2lvbjogKGVudHJ5WzFdIGFzIGFueSkudmVyc2lvbixcbiAgfSk7XG5cbiAgcmV0dXJuIHtcbiAgICBwcm9kOiBPYmplY3QuZW50cmllcyhwa2cuZGVwZW5kZW5jaWVzIHx8IHt9KS5tYXAobWFwcGVyKSxcbiAgICBkZXY6IE9iamVjdC5lbnRyaWVzKHBrZy5kZXZEZXBlbmRlbmNpZXMgfHwge30pLm1hcChtYXBwZXIpLFxuICAgIHBlZXI6IE9iamVjdC5lbnRyaWVzKHBrZy5wZWVyRGVwZW5kZW5jaWVzIHx8IHt9KS5tYXAobWFwcGVyKSxcbiAgfTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHVwZGF0ZURlcGVuZGVuY2llcygpIHtcbiAgY29uc3QgbG9nID0gbG9nZ2VyLmZvcih1cGRhdGVEZXBlbmRlbmNpZXMpO1xuICBsb2cuaW5mbyhcImNoZWNraW5nIGZvciB1cGRhdGVzLi4uXCIpO1xuICBhd2FpdCBydW5Db21tYW5kKFwibnB4IG5wbS1jaGVjay11cGRhdGVzIC11XCIpLnByb21pc2U7XG4gIGxvZy5pbmZvKFwidXBkYXRpbmcuLi5cIik7XG4gIGF3YWl0IHJ1bkNvbW1hbmQoXCJucHggbnBtIHJ1biBkby1pbnN0YWxsXCIpLnByb21pc2U7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpbnN0YWxsSWZOb3RBdmFpbGFibGUoXG4gIGRlcHM6IHN0cmluZ1tdIHwgc3RyaW5nLFxuICBkZXBlbmRlbmNpZXM/OiBTaW1wbGVEZXBlbmRlbmN5TWFwXG4pIHtcbiAgaWYgKCFkZXBlbmRlbmNpZXMpIHtcbiAgICBjb25zdCBkOiBEZXBlbmRlbmN5TWFwID0gYXdhaXQgZ2V0RGVwZW5kZW5jaWVzKCk7XG4gICAgZGVwZW5kZW5jaWVzID0ge1xuICAgICAgcHJvZDogZC5wcm9kPy5tYXAoKHApID0+IHAubmFtZSkgfHwgW10sXG4gICAgICBkZXY6IGQuZGV2Py5tYXAoKGQpID0+IGQubmFtZSkgfHwgW10sXG4gICAgICBwZWVyOiBkLnBlZXI/Lm1hcCgocCkgPT4gcC5uYW1lKSB8fCBbXSxcbiAgICB9O1xuICB9XG4gIGNvbnN0IHsgcHJvZCwgZGV2LCBwZWVyIH0gPSBkZXBlbmRlbmNpZXM7XG4gIGNvbnN0IGluc3RhbGxlZCA9IEFycmF5LmZyb20oXG4gICAgbmV3IFNldChbLi4uKHByb2QgfHwgW10pLCAuLi4oZGV2IHx8IFtdKSwgLi4uKHBlZXIgfHwgW10pXSlcbiAgKTtcbiAgZGVwcyA9IHR5cGVvZiBkZXBzID09PSBcInN0cmluZ1wiID8gW2RlcHNdIDogZGVwcztcbiAgY29uc3QgdG9JbnN0YWxsID0gZGVwcy5maWx0ZXIoKGQpID0+ICFpbnN0YWxsZWQuaW5jbHVkZXMoZCkpO1xuXG4gIGlmICh0b0luc3RhbGwubGVuZ3RoKSBhd2FpdCBpbnN0YWxsRGVwZW5kZW5jaWVzKHsgZGV2OiB0b0luc3RhbGwgfSk7XG4gIGRlcGVuZGVuY2llcy5kZXYgPSBkZXBlbmRlbmNpZXMuZGV2IHx8IFtdO1xuICBkZXBlbmRlbmNpZXMuZGV2LnB1c2goLi4udG9JbnN0YWxsKTtcbiAgcmV0dXJuIGRlcGVuZGVuY2llcztcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHB1c2hUb0dpdCgpIHtcbiAgY29uc3QgbG9nID0gbG9nZ2VyLmZvcihwdXNoVG9HaXQpO1xuICBjb25zdCBnaXRVc2VyID0gYXdhaXQgcnVuQ29tbWFuZChcImdpdCBjb25maWcgdXNlci5uYW1lXCIpLnByb21pc2U7XG4gIGNvbnN0IGdpdEVtYWlsID0gYXdhaXQgcnVuQ29tbWFuZChcImdpdCBjb25maWcgdXNlci5lbWFpbFwiKS5wcm9taXNlO1xuICBsb2cudmVyYm9zZShgY2FjaGVkIGdpdCBpZDogJHtnaXRVc2VyfS8ke2dpdEVtYWlsfS4gY2hhbmdpbmcgdG8gYXV0b21hdGlvbmApO1xuICBhd2FpdCBydW5Db21tYW5kKCdnaXQgY29uZmlnIHVzZXIuZW1haWwgXCJhdXRvbWF0aW9uQGRlY2FmLnRzXCInKS5wcm9taXNlO1xuICBhd2FpdCBydW5Db21tYW5kKCdnaXQgY29uZmlnIHVzZXIubmFtZSBcImRlY2FmXCInKS5wcm9taXNlO1xuICBsb2cuaW5mbyhcIlB1c2hpbmcgY2hhbmdlcyB0byBnaXQuLi5cIik7XG4gIGF3YWl0IHJ1bkNvbW1hbmQoXCJnaXQgYWRkIC5cIikucHJvbWlzZTtcbiAgYXdhaXQgcnVuQ29tbWFuZChgZ2l0IGNvbW1pdCAtbSBcInJlZnMgIzEgLSBhZnRlciByZXBvIHNldHVwXCJgKS5wcm9taXNlO1xuICBhd2FpdCBydW5Db21tYW5kKFwiZ2l0IHB1c2hcIikucHJvbWlzZTtcbiAgYXdhaXQgcnVuQ29tbWFuZChgZ2l0IGNvbmZpZyB1c2VyLmVtYWlsIFwiJHtnaXRFbWFpbH1cImApLnByb21pc2U7XG4gIGF3YWl0IHJ1bkNvbW1hbmQoYGdpdCBjb25maWcgdXNlci5uYW1lIFwiJHtnaXRVc2VyfVwiYCkucHJvbWlzZTtcbiAgbG9nLnZlcmJvc2UoYHJldmVydGVkIHRvIGdpdCBpZDogJHtnaXRVc2VyfS8ke2dpdEVtYWlsfWApO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaW5zdGFsbERlcGVuZGVuY2llcyhkZXBlbmRlbmNpZXM6IHtcbiAgcHJvZD86IHN0cmluZ1tdO1xuICBkZXY/OiBzdHJpbmdbXTtcbiAgcGVlcj86IHN0cmluZ1tdO1xufSkge1xuICBjb25zdCBsb2cgPSBsb2dnZXIuZm9yKGluc3RhbGxEZXBlbmRlbmNpZXMpO1xuICBjb25zdCBwcm9kID0gZGVwZW5kZW5jaWVzLnByb2QgfHwgW107XG4gIGNvbnN0IGRldiA9IGRlcGVuZGVuY2llcy5kZXYgfHwgW107XG4gIGNvbnN0IHBlZXIgPSBkZXBlbmRlbmNpZXMucGVlciB8fCBbXTtcbiAgaWYgKHByb2QubGVuZ3RoKSB7XG4gICAgbG9nLmluZm8oYEluc3RhbGxpbmcgZGVwZW5kZW5jaWVzICR7cHJvZC5qb2luKFwiLCBcIil9Li4uYCk7XG4gICAgYXdhaXQgcnVuQ29tbWFuZChgbnBtIGluc3RhbGwgJHtwcm9kLmpvaW4oXCIgXCIpfWAsIHsgY3dkOiBwcm9jZXNzLmN3ZCgpIH0pXG4gICAgICAucHJvbWlzZTtcbiAgfVxuICBpZiAoZGV2Lmxlbmd0aCkge1xuICAgIGxvZy5pbmZvKGBJbnN0YWxsaW5nIGRldkRlcGVuZGVuY2llcyAke2Rldi5qb2luKFwiLCBcIil9Li4uYCk7XG4gICAgYXdhaXQgcnVuQ29tbWFuZChgbnBtIGluc3RhbGwgLS1zYXZlLWRldiAke2Rldi5qb2luKFwiIFwiKX1gLCB7XG4gICAgICBjd2Q6IHByb2Nlc3MuY3dkKCksXG4gICAgfSkucHJvbWlzZTtcbiAgfVxuICBpZiAocGVlci5sZW5ndGgpIHtcbiAgICBsb2cuaW5mbyhgSW5zdGFsbGluZyBwZWVyRGVwZW5kZW5jaWVzICR7cGVlci5qb2luKFwiLCBcIil9Li4uYCk7XG4gICAgYXdhaXQgcnVuQ29tbWFuZChgbnBtIGluc3RhbGwgLS1zYXZlLXBlZXIgJHtwZWVyLmpvaW4oXCIgXCIpfWAsIHtcbiAgICAgIGN3ZDogcHJvY2Vzcy5jd2QoKSxcbiAgICB9KS5wcm9taXNlO1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBub3JtYWxpemVJbXBvcnQ8VD4oXG4gIGltcG9ydFByb21pc2U6IFByb21pc2U8VD5cbik6IFByb21pc2U8VD4ge1xuICAvLyBDb21tb25KUydzIGBtb2R1bGUuZXhwb3J0c2AgaXMgd3JhcHBlZCBhcyBgZGVmYXVsdGAgaW4gRVNNb2R1bGUuXG4gIHJldHVybiBpbXBvcnRQcm9taXNlLnRoZW4oKG06IGFueSkgPT4gKG0uZGVmYXVsdCB8fCBtKSBhcyBUKTtcbn1cbiJdfQ==
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.HttpClient = void 0;
|
|
7
|
+
const https_1 = __importDefault(require("https"));
|
|
8
|
+
const logging_1 = require("../output/logging.cjs");
|
|
9
|
+
/**
|
|
10
|
+
* @description A simple HTTP client for downloading files.
|
|
11
|
+
* @summary This class provides functionality to download files from HTTPS URLs.
|
|
12
|
+
* It uses Node.js built-in https module to make requests.
|
|
13
|
+
*
|
|
14
|
+
* @class
|
|
15
|
+
*/
|
|
16
|
+
class HttpClient {
|
|
17
|
+
static { this.log = logging_1.Logging.for(HttpClient); }
|
|
18
|
+
/**
|
|
19
|
+
* @description Downloads a file from a given URL.
|
|
20
|
+
* @summary This method sends a GET request to the specified URL and returns the response body as a string.
|
|
21
|
+
* It handles different scenarios such as non-200 status codes and network errors.
|
|
22
|
+
*
|
|
23
|
+
* @param url - The URL of the file to download.
|
|
24
|
+
* @return A promise that resolves with the file content as a string.
|
|
25
|
+
*
|
|
26
|
+
* @mermaid
|
|
27
|
+
* sequenceDiagram
|
|
28
|
+
* participant Client
|
|
29
|
+
* participant HttpClient
|
|
30
|
+
* participant HTTPS
|
|
31
|
+
* participant Server
|
|
32
|
+
* Client->>HttpClient: downloadFile(url)
|
|
33
|
+
* HttpClient->>HTTPS: get(url)
|
|
34
|
+
* HTTPS->>Server: GET request
|
|
35
|
+
* Server-->>HTTPS: Response
|
|
36
|
+
* HTTPS-->>HttpClient: Response object
|
|
37
|
+
* alt Status code is 200
|
|
38
|
+
* loop For each data chunk
|
|
39
|
+
* HTTPS->>HttpClient: 'data' event
|
|
40
|
+
* HttpClient->>HttpClient: Accumulate data
|
|
41
|
+
* end
|
|
42
|
+
* HTTPS->>HttpClient: 'end' event
|
|
43
|
+
* HttpClient-->>Client: Resolve with data
|
|
44
|
+
* else Status code is not 200
|
|
45
|
+
* HttpClient-->>Client: Reject with error
|
|
46
|
+
* end
|
|
47
|
+
*/
|
|
48
|
+
static async downloadFile(url) {
|
|
49
|
+
return new Promise((resolve, reject) => {
|
|
50
|
+
function request(url) {
|
|
51
|
+
url = encodeURI(url);
|
|
52
|
+
https_1.default.get(url, (res) => {
|
|
53
|
+
if (res.statusCode === 301 || res.statusCode === 307)
|
|
54
|
+
return request(res.headers.location);
|
|
55
|
+
if (res.statusCode !== 200) {
|
|
56
|
+
HttpClient.log.error(`Failed to fetch ${url} (status: ${res.statusCode})`);
|
|
57
|
+
return reject(new Error(`Failed to fetch ${url}`));
|
|
58
|
+
}
|
|
59
|
+
let data = "";
|
|
60
|
+
res.on("data", (chunk) => {
|
|
61
|
+
data += chunk;
|
|
62
|
+
});
|
|
63
|
+
res.on("error", (error) => {
|
|
64
|
+
reject(error);
|
|
65
|
+
});
|
|
66
|
+
res.on("end", () => {
|
|
67
|
+
resolve(data);
|
|
68
|
+
});
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
request(url);
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
exports.HttpClient = HttpClient;
|
|
76
|
+
|
|
77
|
+
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy91dGlscy9odHRwLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLGtEQUEwQjtBQUMxQiwrQ0FBNEM7QUFFNUM7Ozs7OztHQU1HO0FBQ0gsTUFBYSxVQUFVO2FBQ0osUUFBRyxHQUFHLGlCQUFPLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQy9DOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztPQTZCRztJQUNILE1BQU0sQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLEdBQVc7UUFDbkMsT0FBTyxJQUFJLE9BQU8sQ0FBUyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRTtZQUM3QyxTQUFTLE9BQU8sQ0FBQyxHQUFXO2dCQUMxQixHQUFHLEdBQUcsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUNyQixlQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFO29CQUNyQixJQUFJLEdBQUcsQ0FBQyxVQUFVLEtBQUssR0FBRyxJQUFJLEdBQUcsQ0FBQyxVQUFVLEtBQUssR0FBRzt3QkFDbEQsT0FBTyxPQUFPLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxRQUFrQixDQUFDLENBQUM7b0JBRWpELElBQUksR0FBRyxDQUFDLFVBQVUsS0FBSyxHQUFHLEVBQUUsQ0FBQzt3QkFDM0IsVUFBVSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQ2xCLG1CQUFtQixHQUFHLGFBQWEsR0FBRyxDQUFDLFVBQVUsR0FBRyxDQUNyRCxDQUFDO3dCQUNGLE9BQU8sTUFBTSxDQUFDLElBQUksS0FBSyxDQUFDLG1CQUFtQixHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUM7b0JBQ3JELENBQUM7b0JBQ0QsSUFBSSxJQUFJLEdBQUcsRUFBRSxDQUFDO29CQUNkLEdBQUcsQ0FBQyxFQUFFLENBQUMsTUFBTSxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUU7d0JBQ3ZCLElBQUksSUFBSSxLQUFLLENBQUM7b0JBQ2hCLENBQUMsQ0FBQyxDQUFDO29CQUNILEdBQUcsQ0FBQyxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUU7d0JBQ3hCLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztvQkFDaEIsQ0FBQyxDQUFDLENBQUM7b0JBRUgsR0FBRyxDQUFDLEVBQUUsQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFO3dCQUNqQixPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7b0JBQ2hCLENBQUMsQ0FBQyxDQUFDO2dCQUNMLENBQUMsQ0FBQyxDQUFDO1lBQ0wsQ0FBQztZQUNELE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNmLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzs7QUE3REgsZ0NBOERDIiwiZmlsZSI6InV0aWxzL2h0dHAuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgaHR0cHMgZnJvbSBcImh0dHBzXCI7XG5pbXBvcnQgeyBMb2dnaW5nIH0gZnJvbSBcIi4uL291dHB1dC9sb2dnaW5nXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEEgc2ltcGxlIEhUVFAgY2xpZW50IGZvciBkb3dubG9hZGluZyBmaWxlcy5cbiAqIEBzdW1tYXJ5IFRoaXMgY2xhc3MgcHJvdmlkZXMgZnVuY3Rpb25hbGl0eSB0byBkb3dubG9hZCBmaWxlcyBmcm9tIEhUVFBTIFVSTHMuXG4gKiBJdCB1c2VzIE5vZGUuanMgYnVpbHQtaW4gaHR0cHMgbW9kdWxlIHRvIG1ha2UgcmVxdWVzdHMuXG4gKlxuICogQGNsYXNzXG4gKi9cbmV4cG9ydCBjbGFzcyBIdHRwQ2xpZW50IHtcbiAgcHJvdGVjdGVkIHN0YXRpYyBsb2cgPSBMb2dnaW5nLmZvcihIdHRwQ2xpZW50KTtcbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBEb3dubG9hZHMgYSBmaWxlIGZyb20gYSBnaXZlbiBVUkwuXG4gICAqIEBzdW1tYXJ5IFRoaXMgbWV0aG9kIHNlbmRzIGEgR0VUIHJlcXVlc3QgdG8gdGhlIHNwZWNpZmllZCBVUkwgYW5kIHJldHVybnMgdGhlIHJlc3BvbnNlIGJvZHkgYXMgYSBzdHJpbmcuXG4gICAqIEl0IGhhbmRsZXMgZGlmZmVyZW50IHNjZW5hcmlvcyBzdWNoIGFzIG5vbi0yMDAgc3RhdHVzIGNvZGVzIGFuZCBuZXR3b3JrIGVycm9ycy5cbiAgICpcbiAgICogQHBhcmFtIHVybCAtIFRoZSBVUkwgb2YgdGhlIGZpbGUgdG8gZG93bmxvYWQuXG4gICAqIEByZXR1cm4gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgZmlsZSBjb250ZW50IGFzIGEgc3RyaW5nLlxuICAgKlxuICAgKiBAbWVybWFpZFxuICAgKiBzZXF1ZW5jZURpYWdyYW1cbiAgICogICBwYXJ0aWNpcGFudCBDbGllbnRcbiAgICogICBwYXJ0aWNpcGFudCBIdHRwQ2xpZW50XG4gICAqICAgcGFydGljaXBhbnQgSFRUUFNcbiAgICogICBwYXJ0aWNpcGFudCBTZXJ2ZXJcbiAgICogICBDbGllbnQtPj5IdHRwQ2xpZW50OiBkb3dubG9hZEZpbGUodXJsKVxuICAgKiAgIEh0dHBDbGllbnQtPj5IVFRQUzogZ2V0KHVybClcbiAgICogICBIVFRQUy0+PlNlcnZlcjogR0VUIHJlcXVlc3RcbiAgICogICBTZXJ2ZXItLT4+SFRUUFM6IFJlc3BvbnNlXG4gICAqICAgSFRUUFMtLT4+SHR0cENsaWVudDogUmVzcG9uc2Ugb2JqZWN0XG4gICAqICAgYWx0IFN0YXR1cyBjb2RlIGlzIDIwMFxuICAgKiAgICAgbG9vcCBGb3IgZWFjaCBkYXRhIGNodW5rXG4gICAqICAgICAgIEhUVFBTLT4+SHR0cENsaWVudDogJ2RhdGEnIGV2ZW50XG4gICAqICAgICAgIEh0dHBDbGllbnQtPj5IdHRwQ2xpZW50OiBBY2N1bXVsYXRlIGRhdGFcbiAgICogICAgIGVuZFxuICAgKiAgICAgSFRUUFMtPj5IdHRwQ2xpZW50OiAnZW5kJyBldmVudFxuICAgKiAgICAgSHR0cENsaWVudC0tPj5DbGllbnQ6IFJlc29sdmUgd2l0aCBkYXRhXG4gICAqICAgZWxzZSBTdGF0dXMgY29kZSBpcyBub3QgMjAwXG4gICAqICAgICBIdHRwQ2xpZW50LS0+PkNsaWVudDogUmVqZWN0IHdpdGggZXJyb3JcbiAgICogICBlbmRcbiAgICovXG4gIHN0YXRpYyBhc3luYyBkb3dubG9hZEZpbGUodXJsOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZTxzdHJpbmc+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGZ1bmN0aW9uIHJlcXVlc3QodXJsOiBzdHJpbmcpIHtcbiAgICAgICAgdXJsID0gZW5jb2RlVVJJKHVybCk7XG4gICAgICAgIGh0dHBzLmdldCh1cmwsIChyZXMpID0+IHtcbiAgICAgICAgICBpZiAocmVzLnN0YXR1c0NvZGUgPT09IDMwMSB8fCByZXMuc3RhdHVzQ29kZSA9PT0gMzA3KVxuICAgICAgICAgICAgcmV0dXJuIHJlcXVlc3QocmVzLmhlYWRlcnMubG9jYXRpb24gYXMgc3RyaW5nKTtcblxuICAgICAgICAgIGlmIChyZXMuc3RhdHVzQ29kZSAhPT0gMjAwKSB7XG4gICAgICAgICAgICBIdHRwQ2xpZW50LmxvZy5lcnJvcihcbiAgICAgICAgICAgICAgYEZhaWxlZCB0byBmZXRjaCAke3VybH0gKHN0YXR1czogJHtyZXMuc3RhdHVzQ29kZX0pYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHJldHVybiByZWplY3QobmV3IEVycm9yKGBGYWlsZWQgdG8gZmV0Y2ggJHt1cmx9YCkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBsZXQgZGF0YSA9IFwiXCI7XG4gICAgICAgICAgcmVzLm9uKFwiZGF0YVwiLCAoY2h1bmspID0+IHtcbiAgICAgICAgICAgIGRhdGEgKz0gY2h1bms7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmVzLm9uKFwiZXJyb3JcIiwgKGVycm9yKSA9PiB7XG4gICAgICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgcmVzLm9uKFwiZW5kXCIsICgpID0+IHtcbiAgICAgICAgICAgIHJlc29sdmUoZGF0YSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgcmVxdWVzdCh1cmwpO1xuICAgIH0pO1xuICB9XG59XG4iXX0=
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./constants.cjs"), exports);
|
|
18
|
+
__exportStar(require("./environment.cjs"), exports);
|
|
19
|
+
__exportStar(require("./fs.cjs"), exports);
|
|
20
|
+
__exportStar(require("./http.cjs"), exports);
|
|
21
|
+
__exportStar(require("./text.cjs"), exports);
|
|
22
|
+
__exportStar(require("./types.cjs"), exports);
|
|
23
|
+
__exportStar(require("./utils.cjs"), exports);
|
|
24
|
+
|
|
25
|
+
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy91dGlscy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsOENBQTRCO0FBQzVCLGdEQUE4QjtBQUM5Qix1Q0FBcUI7QUFDckIseUNBQXVCO0FBQ3ZCLHlDQUF1QjtBQUN2QiwwQ0FBd0I7QUFDeEIsMENBQXdCIiwiZmlsZSI6InV0aWxzL2luZGV4LmpzIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9lbnZpcm9ubWVudFwiO1xuZXhwb3J0ICogZnJvbSBcIi4vZnNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2h0dHBcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3RleHRcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3R5cGVzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi91dGlsc1wiO1xuIl19
|
package/lib/utils/md.cjs
ADDED
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
|
|
4
|
+
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy91dGlscy9tZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwiZmlsZSI6InV0aWxzL21kLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAZGVzY3JpcHRpb24gU2luZ2xlIGxpbmUgbWFya2Rvd24gZWxlbWVudCB0eXBlXG4gKiBAc3VtbWFyeSBSZXByZXNlbnRzIHRoZSBwb3NzaWJsZSBoZWFkZXIgbGV2ZWxzIGluIG1hcmtkb3duXG4gKiBAdHlwZWRlZiB7XCJoMVwifFwiaDJcInxcImgzXCJ8XCJoNFwifFwiaDVcInxcImg2XCJ9IE1kU2luZ2xlTGluZUVsZW1lbnRcbiAqIEBtZW1iZXJPZiBAZGVjYWYtdHMvdXRpbHNcbiAqL1xuZXhwb3J0IHR5cGUgTWRTaW5nbGVMaW5lRWxlbWVudCA9IFwiaDFcIiB8IFwiaDJcIiB8IFwiaDNcIiB8IFwiaDRcIiB8IFwiaDVcIiB8IFwiaDZcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gTXVsdGktbGluZSBlbGVtZW50IHR5cGVzIGluIG1hcmtkb3duXG4gKiBAc3VtbWFyeSBEZWZpbmVzIHRoZSBhdmFpbGFibGUgbXVsdGktbGluZSBlbGVtZW50IHR5cGVzXG4gKiBAdHlwZWRlZiB7XCJwXCJ8XCJibG9ja3F1b3RlXCJ9IE1kTXVsdGlMaW5lRWxlbWVudFxuICogQG1lbWJlck9mIEBkZWNhZi10cy91dGlsc1xuICovXG5leHBvcnQgdHlwZSBNZE11bHRpTGluZUVsZW1lbnQgPSBcInBcIiB8IFwiYmxvY2txdW90ZVwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBMaXN0IGVsZW1lbnQgdHlwZXMgaW4gbWFya2Rvd25cbiAqIEBzdW1tYXJ5IERlZmluZXMgdGhlIGF2YWlsYWJsZSBsaXN0IHR5cGVzXG4gKiBAdHlwZWRlZiB7XCJ1bFwifFwib2xcIn0gTWRMaXN0RWxlbWVudFxuICogQG1lbWJlck9mIEBkZWNhZi10cy91dGlsc1xuICovXG5leHBvcnQgdHlwZSBNZExpc3RFbGVtZW50ID0gXCJ1bFwiIHwgXCJvbFwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBMaXN0IGVsZW1lbnQgdHlwZXMgaW4gbWFya2Rvd25cbiAqIEBzdW1tYXJ5IERlZmluZXMgdGhlIGF2YWlsYWJsZSBsaXN0IHR5cGVzXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBNZFNpbmdsZUxpbmVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbdWxdIC0gdW5vcmRlcmVkIGxpc3RcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbb2xdIC0gb3JkZXJlZCBsaXN0XG4gKiBAbWVtYmVyT2YgQGRlY2FmLXRzL3V0aWxzXG4gKi9cbmV4cG9ydCB0eXBlIE1kU2luZ2xlTGluZSA9IHtcbiAgW2sgaW4gTWRTaW5nbGVMaW5lRWxlbWVudF0/OiBzdHJpbmc7XG59O1xuLyoqXG4gKiBAZGVzY3JpcHRpb24gTXVsdGktbGluZSBtYXJrZG93biBlbGVtZW50IHR5cGVcbiAqIEBzdW1tYXJ5IFJlcHJlc2VudHMgbWFya2Rvd24gZWxlbWVudHMgdGhhdCBjYW4gY29udGFpbiBtdWx0aXBsZSBsaW5lcyBvZiB0ZXh0XG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBNZE11bHRpTGluZVxuICogQHByb3BlcnR5IHtzdHJpbmd8c3RyaW5nW119IFtwXSAtIFBhcmFncmFwaCBjb250ZW50XG4gKiBAcHJvcGVydHkge3N0cmluZ3xzdHJpbmdbXX0gW2Jsb2NrcXVvdGVdIC0gQmxvY2txdW90ZSBjb250ZW50XG4gKiBAbWVtYmVyT2YgQGRlY2FmLXRzL3V0aWxzXG4gKi9cbmV4cG9ydCB0eXBlIE1kTXVsdGlMaW5lID0geyBbayBpbiBNZE11bHRpTGluZUVsZW1lbnRdPzogc3RyaW5nIHwgc3RyaW5nW10gfTtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gSW1hZ2UgZGVmaW5pdGlvbiB0eXBlIGluIG1hcmtkb3duXG4gKiBAc3VtbWFyeSBEZWZpbmVzIHRoZSBzdHJ1Y3R1cmUgZm9yIGltYWdlIGVsZW1lbnRzXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBNZEltYWdlRGVmaW5pdGlvblxuICogQHByb3BlcnR5IHtzdHJpbmd9IFt0aXRsZV0gLSBPcHRpb25hbCBpbWFnZSB0aXRsZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IHNvdXJjZSAtIEltYWdlIHNvdXJjZSBVUkxcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbYWx0XSAtIE9wdGlvbmFsIGFsdGVybmF0aXZlIHRleHRcbiAqIEBtZW1iZXJPZiBAZGVjYWYtdHMvdXRpbHNcbiAqL1xuZXhwb3J0IHR5cGUgTWRJbWFnZURlZmluaXRpb24gPSB7XG4gIHRpdGxlPzogc3RyaW5nO1xuICBzb3VyY2U6IHN0cmluZztcbiAgYWx0Pzogc3RyaW5nO1xufTtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gSW1hZ2UgZWxlbWVudCB0eXBlIGluIG1hcmtkb3duXG4gKiBAc3VtbWFyeSBSZXByZXNlbnRzIGFuIGltYWdlIGVsZW1lbnQgd2l0aCBpdHMgcHJvcGVydGllc1xuICogQHR5cGVkZWYge09iamVjdH0gTWRJbWFnZVxuICogQHByb3BlcnR5IHtNZEltYWdlRGVmaW5pdGlvbn0gaW1nIC0gVGhlIGltYWdlIGRlZmluaXRpb24gb2JqZWN0XG4gKiBAbWVtYmVyT2YgQGRlY2FmLXRzL3V0aWxzXG4gKi9cbmV4cG9ydCB0eXBlIE1kSW1hZ2UgPSB7IGltZzogTWRJbWFnZURlZmluaXRpb24gfTtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gTGlzdCBpdGVtIGVsZW1lbnQgdHlwZSBpbiBtYXJrZG93blxuICogQHN1bW1hcnkgUmVwcmVzZW50cyBvcmRlcmVkIGFuZCB1bm9yZGVyZWQgbGlzdHMgaW4gbWFya2Rvd25cbiAqIEB0eXBlZGVmIHtPYmplY3R9IE1kTGlzdEl0ZW1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nW119IHVsIC0gVW5vcmRlcmVkIGxpc3QgaXRlbXNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nW119IG9sIC0gT3JkZXJlZCBsaXN0IGl0ZW1zXG4gKiBAbWVtYmVyT2YgQGRlY2FmLXRzL3V0aWxzXG4gKi9cbmV4cG9ydCB0eXBlIE1kTGlzdEl0ZW0gPSB7IFtrIGluIE1kTGlzdEVsZW1lbnRdOiBzdHJpbmdbXSB9O1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBUYWJsZSBkZWZpbml0aW9uIHR5cGUgaW4gbWFya2Rvd25cbiAqIEBzdW1tYXJ5IERlZmluZXMgdGhlIHN0cnVjdHVyZSBmb3IgdGFibGUgZWxlbWVudHNcbiAqIEB0eXBlZGVmIHtPYmplY3R9IE1kVGFibGVEZWZpbml0aW9uXG4gKiBAcHJvcGVydHkge3N0cmluZ1tdfSBoZWFkZXJzIC0gQXJyYXkgb2YgdGFibGUgaGVhZGVyIG5hbWVzXG4gKiBAcHJvcGVydHkge09iamVjdFtdfSByb3dzIC0gQXJyYXkgb2Ygcm93IG9iamVjdHMgY29udGFpbmluZyBjb2x1bW4gdmFsdWVzXG4gKiBAbWVtYmVyT2YgQGRlY2FmLXRzL3V0aWxzXG4gKi9cbmV4cG9ydCB0eXBlIE1kVGFibGVEZWZpbml0aW9uID0ge1xuICBoZWFkZXJzOiBzdHJpbmdbXTtcbiAgcm93czogeyBbY29sdW1uOiBzdHJpbmddOiBzdHJpbmcgfCBzdHJpbmdbXSB9W107XG59O1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBUYWJsZSBlbGVtZW50IHR5cGUgaW4gbWFya2Rvd25cbiAqIEBzdW1tYXJ5IFJlcHJlc2VudHMgYSB0YWJsZSBzdHJ1Y3R1cmUgd2l0aCBoZWFkZXJzIGFuZCByb3dzXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBNZFRhYmxlXG4gKiBAcHJvcGVydHkge01kVGFibGVEZWZpbml0aW9ufSB0YWJsZSAtIFRoZSB0YWJsZSBkZWZpbml0aW9uIG9iamVjdFxuICogQG1lbWJlck9mIEBkZWNhZi10cy91dGlsc1xuICovXG5leHBvcnQgdHlwZSBNZFRhYmxlID0geyB0YWJsZTogTWRUYWJsZURlZmluaXRpb24gfTtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQ29kZSBibG9jayBkZWZpbml0aW9uIHR5cGUgaW4gbWFya2Rvd25cbiAqIEBzdW1tYXJ5IERlZmluZXMgdGhlIHN0cnVjdHVyZSBmb3IgY29kZSBibG9ja3NcbiAqIEB0eXBlZGVmIHtPYmplY3R9IE1kQ29kZURlZmluaXRpb25cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbbGFuZ3VhZ2VdIC0gT3B0aW9uYWwgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2Ugc3BlY2lmaWNhdGlvblxuICogQHByb3BlcnR5IHtzdHJpbmd8c3RyaW5nW119IGNvbnRlbnQgLSBUaGUgY29kZSBjb250ZW50IGFzIHN0cmluZyBvciBhcnJheSBvZiBzdHJpbmdzXG4gKiBAbWVtYmVyT2YgQGRlY2FmLXRzL3V0aWxzXG4gKi9cbmV4cG9ydCB0eXBlIE1kQ29kZURlZmluaXRpb24gPSB7XG4gIGxhbmd1YWdlPzogc3RyaW5nO1xuICBjb250ZW50OiBzdHJpbmcgfCBzdHJpbmdbXTtcbn07XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIENvZGUgYmxvY2sgZWxlbWVudCB0eXBlIGluIG1hcmtkb3duXG4gKiBAc3VtbWFyeSBSZXByZXNlbnRzIGEgY29kZSBibG9jayB3aXRoIG9wdGlvbmFsIGxhbmd1YWdlIHNwZWNpZmljYXRpb25cbiAqIEB0eXBlZGVmIHtPYmplY3R9IE1kQ29kZVxuICogQHByb3BlcnR5IHtNZENvZGVEZWZpbml0aW9ufSBjb2RlIC0gVGhlIGNvZGUgYmxvY2sgZGVmaW5pdGlvbiBvYmplY3RcbiAqIEBtZW1iZXJPZiBAZGVjYWYtdHMvdXRpbHNcbiAqL1xuZXhwb3J0IHR5cGUgTWRDb2RlID0geyBjb2RlOiBNZENvZGVEZWZpbml0aW9uIH07XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEhvcml6b250YWwgcnVsZSBlbGVtZW50IHR5cGUgaW4gbWFya2Rvd25cbiAqIEBzdW1tYXJ5IFJlcHJlc2VudHMgYSBob3Jpem9udGFsIHJ1bGUgc2VwYXJhdG9yXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBNZFNlcGFyYXRvclxuICogQHByb3BlcnR5IHtzdHJpbmd9IGhyIC0gVGhlIGhvcml6b250YWwgcnVsZSByZXByZXNlbnRhdGlvblxuICogQG1lbWJlck9mIEBkZWNhZi10cy91dGlsc1xuICovXG5leHBvcnQgdHlwZSBNZFNlcGFyYXRvciA9IHsgaHI6IHN0cmluZyB9O1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBMaW5rIGVsZW1lbnQgdHlwZSBpbiBtYXJrZG93blxuICogQHN1bW1hcnkgUmVwcmVzZW50cyBhIGh5cGVybGluayB3aXRoIHRpdGxlIGFuZCBzb3VyY2VcbiAqIEB0eXBlZGVmIHtPYmplY3R9IE1kTGlua1xuICogQHByb3BlcnR5IHt7dGl0bGU6IHN0cmluZywgc291cmNlOiBzdHJpbmd9fSBsaW5rIC0gVGhlIGxpbmsgZGVmaW5pdGlvbiBvYmplY3RcbiAqIEBtZW1iZXJPZiBAZGVjYWYtdHMvdXRpbHNcbiAqL1xuZXhwb3J0IHR5cGUgTWRMaW5rID0ge1xuICBsaW5rOiB7XG4gICAgdGl0bGU6IHN0cmluZztcbiAgICBzb3VyY2U6IHN0cmluZztcbiAgfTtcbn07XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIE1hcmtkb3duIGVsZW1lbnQgdHlwZSBkZWZpbml0aW9uXG4gKiBAc3VtbWFyeSBSZXByZXNlbnRzIGFsbCBwb3NzaWJsZSBtYXJrZG93biBlbGVtZW50cyB0aGF0IGNhbiBiZSB1c2VkIGluIGRvY3VtZW50IGdlbmVyYXRpb24uXG4gKiBUaGlzIHR5cGUgY29tYmluZXMgdmFyaW91cyBtYXJrZG93biBlbGVtZW50cyBpbmNsdWRpbmcgaGVhZGVycywgcGFyYWdyYXBocywgaW1hZ2VzLCBsaXN0cyxcbiAqIHRhYmxlcywgY29kZSBibG9ja3MsIHNlcGFyYXRvcnMsIGFuZCBsaW5rcyBpbnRvIGEgdW5pb24gdHlwZSBmb3IgZmxleGlibGUgbWFya2Rvd24gY29udGVudCBjcmVhdGlvbi5cbiAqIEB0eXBlZGVmIHsoTWRTaW5nbGVMaW5lIHwgTWRNdWx0aUxpbmUgfCBNZEltYWdlIHwgTWRMaXN0SXRlbSB8IE1kVGFibGUgfCBNZENvZGUgfCBNZFNlcGFyYXRvciB8IE1kTGluayl9IE1kRWxlbWVudHNcbiAqIEBtZW1iZXJPZiBAZGVjYWYtdHMvdXRpbHNcbiAqL1xuZXhwb3J0IHR5cGUgTWRFbGVtZW50cyA9XG4gIHwgTWRTaW5nbGVMaW5lXG4gIHwgTWRNdWx0aUxpbmVcbiAgfCBNZEltYWdlXG4gIHwgTWRMaXN0SXRlbVxuICB8IE1kVGFibGVcbiAgfCBNZENvZGVcbiAgfCBNZFNlcGFyYXRvclxuICB8IE1kTGluaztcbiJdfQ==
|