1 | import dataUrls from "data-urls";
|
2 | import fs from "fs";
|
3 | import whatwgEncoding from "whatwg-encoding";
|
4 | // TODO: Find out why TSLint complains about whitespace
|
5 | // tslint:disable:whitespace
|
6 | /**
|
7 | * Returns the string corresponding to the provided `url`.
|
8 | *
|
9 | * @param url URL for the text content.
|
10 | */
|
11 | export async function getText(url) {
|
12 | switch (url.protocol) {
|
13 | case "data:":
|
14 | return getTextByDataUrl(url);
|
15 | case "file:":
|
16 | return getTextByFileUrl(url);
|
17 | default:
|
18 | throw new Error(`UnsupportedProtocol ${url.protocol} for: ${url}`);
|
19 | }
|
20 | }
|
21 | // tslint:enable
|
22 | /**
|
23 | * Synchronous variant of `getText`.
|
24 | */
|
25 | export function getTextSync(url) {
|
26 | switch (url.protocol) {
|
27 | case "data:":
|
28 | return getTextByDataUrl(url);
|
29 | case "file:":
|
30 | return getTextByFileUrlSync(url);
|
31 | default:
|
32 | throw new Error(`UnsupportedProtocol ${url.protocol} for: ${url}`);
|
33 | }
|
34 | }
|
35 | export function getTextByDataUrl(url) {
|
36 | const parsed = dataUrls(url.toString());
|
37 | if (parsed === null) {
|
38 | throw new Error(`CannotParseDataUrl: ${url}`);
|
39 | }
|
40 | const charset = parsed.mimeType.parameters.get("charset");
|
41 | let encodingName;
|
42 | if (charset !== undefined) {
|
43 | encodingName = whatwgEncoding.labelToName(charset);
|
44 | }
|
45 | else {
|
46 | // Not sure what the default should be...
|
47 | encodingName = "UTF-8";
|
48 | }
|
49 | if (encodingName === null) {
|
50 | throw new Error(`Unable to resolve encoding for data URL: ${url}`);
|
51 | }
|
52 | return whatwgEncoding.decode(parsed.body, encodingName);
|
53 | }
|
54 | export async function getTextByFileUrl(url) {
|
55 | return fs.promises.readFile(url, { encoding: "UTF-8" });
|
56 | }
|
57 | export function getTextByFileUrlSync(url) {
|
58 | return fs.readFileSync(url, { encoding: "UTF-8" });
|
59 | }
|
60 | export function getTextSyncFromSourceStore(_sources) {
|
61 | const cache = new Map();
|
62 | return (url) => {
|
63 | const cached = cache.get(url.toString());
|
64 | if (typeof cached === "string") {
|
65 | return cached;
|
66 | }
|
67 | const sourceText = getTextSync(url);
|
68 | cache.set(url.toString(), sourceText);
|
69 | return sourceText;
|
70 | };
|
71 | }
|
72 |
|
73 | //# sourceMappingURL=data:application/json;charset=utf8;base64,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TUFBTSxLQUFLLFFBQVEsRUFBRTtZQUM5QixPQUFPLE1BQU0sQ0FBQztTQUNmO1FBQ0QsTUFBTSxVQUFVLEdBQVcsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzVDLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQ3RDLE9BQU8sVUFBVSxDQUFDO0lBQ3BCLENBQUMsQ0FBQztBQUNKLENBQUMiLCJmaWxlIjoiZ2V0LXRleHQuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgZGF0YVVybHMgZnJvbSBcImRhdGEtdXJsc1wiO1xuaW1wb3J0IGZzIGZyb20gXCJmc1wiO1xuaW1wb3J0IHVybE1vZCBmcm9tIFwidXJsXCI7XG5pbXBvcnQgd2hhdHdnRW5jb2RpbmcgZnJvbSBcIndoYXR3Zy1lbmNvZGluZ1wiO1xuaW1wb3J0IHsgTnVsbGFibGVTb3VyY2VUZXh0IH0gZnJvbSBcIi4vc291cmNlLW1hcC9zb3VyY2Utc3RvcmVcIjtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBgc3RyaW5nYCBjb3JyZXNwb25kaW5nIHRvIHRoZSBwcm92aWRlZCBVUkwgcmVjb3JkLlxuICovXG5leHBvcnQgdHlwZSBHZXRUZXh0ID0gKHVybDogUmVhZG9ubHk8dXJsTW9kLlVSTD4pID0+IFByb21pc2U8c3RyaW5nPjtcblxuLyoqXG4gKiBTeW5jaHJvbm91cyB2YXJpYW50IG9mIGBHZXRUZXh0YC5cbiAqL1xuZXhwb3J0IHR5cGUgR2V0VGV4dFN5bmMgPSAodXJsOiBSZWFkb25seTx1cmxNb2QuVVJMPikgPT4gc3RyaW5nO1xuXG4vLyBUT0RPOiBGaW5kIG91dCB3aHkgVFNMaW50IGNvbXBsYWlucyBhYm91dCB3aGl0ZXNwYWNlXG4vLyB0c2xpbnQ6ZGlzYWJsZTp3aGl0ZXNwYWNlXG4vKipcbiAqIFJldHVybnMgdGhlIHN0cmluZyBjb3JyZXNwb25kaW5nIHRvIHRoZSBwcm92aWRlZCBgdXJsYC5cbiAqXG4gKiBAcGFyYW0gdXJsIFVSTCBmb3IgdGhlIHRleHQgY29udGVudC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldFRleHQodXJsOiBSZWFkb25seTx1cmxNb2QuVVJMPik6IFByb21pc2U8c3RyaW5nPiB7XG4gIHN3aXRjaCAodXJsLnByb3RvY29sKSB7XG4gICAgY2FzZSBcImRhdGE6XCI6XG4gICAgICByZXR1cm4gZ2V0VGV4dEJ5RGF0YVVybCh1cmwpO1xuICAgIGNhc2UgXCJmaWxlOlwiOlxuICAgICAgcmV0dXJuIGdldFRleHRCeUZpbGVVcmwodXJsKTtcbiAgICBkZWZhdWx0OlxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbnN1cHBvcnRlZFByb3RvY29sICR7dXJsLnByb3RvY29sfSBmb3I6ICR7dXJsfWApO1xuICB9XG59XG4vLyB0c2xpbnQ6ZW5hYmxlXG5cbi8qKlxuICogU3luY2hyb25vdXMgdmFyaWFudCBvZiBgZ2V0VGV4dGAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRUZXh0U3luYyh1cmw6IFJlYWRvbmx5PHVybE1vZC5VUkw+KTogc3RyaW5nIHtcbiAgc3dpdGNoICh1cmwucHJvdG9jb2wpIHtcbiAgICBjYXNlIFwiZGF0YTpcIjpcbiAgICAgIHJldHVybiBnZXRUZXh0QnlEYXRhVXJsKHVybCk7XG4gICAgY2FzZSBcImZpbGU6XCI6XG4gICAgICByZXR1cm4gZ2V0VGV4dEJ5RmlsZVVybFN5bmModXJsKTtcbiAgICBkZWZhdWx0OlxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbnN1cHBvcnRlZFByb3RvY29sICR7dXJsLnByb3RvY29sfSBmb3I6ICR7dXJsfWApO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRUZXh0QnlEYXRhVXJsKHVybDogUmVhZG9ubHk8dXJsTW9kLlVSTD4pOiBzdHJpbmcge1xuICBjb25zdCBwYXJzZWQ6IGRhdGFVcmxzLkRhdGFVUkwgfCBudWxsID0gZGF0YVVybHModXJsLnRvU3RyaW5nKCkpO1xuICBpZiAocGFyc2VkID09PSBudWxsKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3RQYXJzZURhdGFVcmw6ICR7dXJsfWApO1xuICB9XG4gIGNvbnN0IGNoYXJzZXQ6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHBhcnNlZC5taW1lVHlwZS5wYXJhbWV0ZXJzLmdldChcImNoYXJzZXRcIik7XG4gIGxldCBlbmNvZGluZ05hbWU6IHN0cmluZyB8IG51bGw7XG4gIGlmIChjaGFyc2V0ICE9PSB1bmRlZmluZWQpIHtcbiAgICBlbmNvZGluZ05hbWUgPSB3aGF0d2dFbmNvZGluZy5sYWJlbFRvTmFtZShjaGFyc2V0KTtcbiAgfSBlbHNlIHtcbiAgICAvLyBOb3Qgc3VyZSB3aGF0IHRoZSBkZWZhdWx0IHNob3VsZCBiZS4uLlxuICAgIGVuY29kaW5nTmFtZSA9IFwiVVRGLThcIjtcbiAgfVxuICBpZiAoZW5jb2RpbmdOYW1lID09PSBudWxsKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBVbmFibGUgdG8gcmVzb2x2ZSBlbmNvZGluZyBmb3IgZGF0YSBVUkw6ICR7dXJsfWApO1xuICB9XG4gIHJldHVybiB3aGF0d2dFbmNvZGluZy5kZWNvZGUocGFyc2VkLmJvZHksIGVuY29kaW5nTmFtZSk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRUZXh0QnlGaWxlVXJsKHVybDogUmVhZG9ubHk8dXJsTW9kLlVSTD4pOiBQcm9taXNlPHN0cmluZz4ge1xuICByZXR1cm4gZnMucHJvbWlzZXMucmVhZEZpbGUodXJsLCB7ZW5jb2Rpbmc6IFwiVVRGLThcIn0pIGFzIFByb21pc2U8c3RyaW5nPjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFRleHRCeUZpbGVVcmxTeW5jKHVybDogUmVhZG9ubHk8dXJsTW9kLlVSTD4pOiBzdHJpbmcge1xuICByZXR1cm4gZnMucmVhZEZpbGVTeW5jKHVybCwge2VuY29kaW5nOiBcIlVURi04XCJ9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFRleHRTeW5jRnJvbVNvdXJjZVN0b3JlKF9zb3VyY2VzOiBJdGVyYWJsZTxbc3RyaW5nLCBOdWxsYWJsZVNvdXJjZVRleHRdPik6IEdldFRleHRTeW5jIHtcbiAgY29uc3QgY2FjaGU6IE1hcDxzdHJpbmcsIE51bGxhYmxlU291cmNlVGV4dD4gPSBuZXcgTWFwKCk7XG4gIHJldHVybiAodXJsOiBSZWFkb25seTx1cmxNb2QuVVJMPik6IHN0cmluZyA9PiB7XG4gICAgY29uc3QgY2FjaGVkOiBOdWxsYWJsZVNvdXJjZVRleHQgfCB1bmRlZmluZWQgPSBjYWNoZS5nZXQodXJsLnRvU3RyaW5nKCkpO1xuICAgIGlmICh0eXBlb2YgY2FjaGVkID09PSBcInN0cmluZ1wiKSB7XG4gICAgICByZXR1cm4gY2FjaGVkO1xuICAgIH1cbiAgICBjb25zdCBzb3VyY2VUZXh0OiBzdHJpbmcgPSBnZXRUZXh0U3luYyh1cmwpO1xuICAgIGNhY2hlLnNldCh1cmwudG9TdHJpbmcoKSwgc291cmNlVGV4dCk7XG4gICAgcmV0dXJuIHNvdXJjZVRleHQ7XG4gIH07XG59XG4iXSwic291cmNlUm9vdCI6IiJ9
|