@jam-comments/server-utilities 5.4.0 → 5.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/index.js +1 -9
- package/dist/cjs/markupFetcher.js +34 -6
- package/dist/cjs/markupFetcher.test.js +6 -6
- package/dist/cjs/nodeUtils.js +78 -0
- package/dist/cjs/nodeUtils.test.js +48 -0
- package/dist/cjs/utils.js +0 -41
- package/dist/cjs/utils.test.js +0 -38
- package/dist/esm/index.js +0 -3
- package/dist/esm/markupFetcher.js +11 -6
- package/dist/esm/markupFetcher.test.js +6 -6
- package/dist/esm/nodeUtils.js +46 -0
- package/dist/esm/nodeUtils.test.js +46 -0
- package/dist/esm/utils.js +0 -35
- package/dist/esm/utils.test.js +1 -39
- package/dist/types/index.d.ts +0 -2
- package/dist/types/nodeUtils.d.ts +7 -0
- package/dist/types/nodeUtils.test.d.ts +1 -0
- package/dist/types/utils.d.ts +0 -7
- package/package.json +1 -1
package/dist/cjs/index.js
CHANGED
|
@@ -1,17 +1,9 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.logError = exports.log = exports.
|
|
7
|
-
const path_1 = __importDefault(require("path"));
|
|
8
|
-
exports.TEMP_DIRECTORY = path_1.default.join(process.cwd(), "_temp_jc");
|
|
3
|
+
exports.logError = exports.log = exports.fetchAll = exports.markupFetcher = void 0;
|
|
9
4
|
var markupFetcher_1 = require("./markupFetcher");
|
|
10
5
|
Object.defineProperty(exports, "markupFetcher", { enumerable: true, get: function () { return markupFetcher_1.markupFetcher; } });
|
|
11
6
|
Object.defineProperty(exports, "fetchAll", { enumerable: true, get: function () { return markupFetcher_1.fetchAll; } });
|
|
12
|
-
var utils_1 = require("./utils");
|
|
13
|
-
Object.defineProperty(exports, "deleteTempDirectory", { enumerable: true, get: function () { return utils_1.deleteTempDirectory; } });
|
|
14
|
-
Object.defineProperty(exports, "removeFalseyValues", { enumerable: true, get: function () { return utils_1.removeFalseyValues; } });
|
|
15
7
|
var log_1 = require("./log");
|
|
16
8
|
Object.defineProperty(exports, "log", { enumerable: true, get: function () { return log_1.log; } });
|
|
17
9
|
Object.defineProperty(exports, "logError", { enumerable: true, get: function () { return log_1.logError; } });
|
|
@@ -1,4 +1,27 @@
|
|
|
1
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 __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
+
if (mod && mod.__esModule) return mod;
|
|
20
|
+
var result = {};
|
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
+
__setModuleDefault(result, mod);
|
|
23
|
+
return result;
|
|
24
|
+
};
|
|
2
25
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
26
|
exports.fetchAll = fetchAll;
|
|
4
27
|
exports.batchMarkupFetcher = batchMarkupFetcher;
|
|
@@ -9,8 +32,9 @@ const injectSchema_1 = require("./injectSchema");
|
|
|
9
32
|
const utils_1 = require("./utils");
|
|
10
33
|
const BASE_URL = "https://go.jamcomments.com";
|
|
11
34
|
async function fetchAll({ tz = undefined, dateFormat = undefined, domain, apiKey, baseUrl = BASE_URL, environment = (0, utils_1.getEnvironment)(), copy = {}, }, platform, fetchImplementation = fetch, batchMarkupFetcherImpl = batchMarkupFetcher) {
|
|
35
|
+
const { createTempDirectory, deleteTempDirectory, saveFile } = await Promise.resolve().then(() => __importStar(require("./nodeUtils")));
|
|
12
36
|
const fetchBatchMarkup = batchMarkupFetcherImpl(platform, fetchImplementation);
|
|
13
|
-
|
|
37
|
+
await createTempDirectory();
|
|
14
38
|
let shouldKeepFetching = true;
|
|
15
39
|
let page = 1;
|
|
16
40
|
console.log("Fetching comments from JamComments! This might take a sec.");
|
|
@@ -28,7 +52,7 @@ async function fetchAll({ tz = undefined, dateFormat = undefined, domain, apiKey
|
|
|
28
52
|
});
|
|
29
53
|
console.log(`Checking for comment data. Batch: ${current_page}/${last_page}`);
|
|
30
54
|
const saveMarkupPromises = items.map((item) => {
|
|
31
|
-
return
|
|
55
|
+
return saveFile(item.path, item.markup);
|
|
32
56
|
});
|
|
33
57
|
await Promise.all(saveMarkupPromises);
|
|
34
58
|
if (current_page === last_page) {
|
|
@@ -40,7 +64,7 @@ async function fetchAll({ tz = undefined, dateFormat = undefined, domain, apiKey
|
|
|
40
64
|
}
|
|
41
65
|
}
|
|
42
66
|
catch (error) {
|
|
43
|
-
|
|
67
|
+
await deleteTempDirectory();
|
|
44
68
|
throw error;
|
|
45
69
|
}
|
|
46
70
|
}
|
|
@@ -100,11 +124,15 @@ async function makeMarkupRequest({ tz, path, page, domain, apiKey, dateFormat, c
|
|
|
100
124
|
function markupFetcher(platform, fetchImplementation = fetch) {
|
|
101
125
|
return async ({ tz = undefined, path, domain, apiKey, schema, dateFormat, baseUrl = BASE_URL, environment = (0, utils_1.getEnvironment)(), copy = {}, }) => {
|
|
102
126
|
path = path || "/";
|
|
103
|
-
const savedFile = (() => {
|
|
104
|
-
if (
|
|
127
|
+
const savedFile = await (async () => {
|
|
128
|
+
if (typeof process === "undefined") {
|
|
129
|
+
return null;
|
|
130
|
+
}
|
|
131
|
+
const { tempDirectoryExists, readFile, getEmptyMarkup } = await Promise.resolve().then(() => __importStar(require("./nodeUtils")));
|
|
132
|
+
if (!(await tempDirectoryExists())) {
|
|
105
133
|
return null;
|
|
106
134
|
}
|
|
107
|
-
return (
|
|
135
|
+
return (await readFile(path)) || getEmptyMarkup();
|
|
108
136
|
})();
|
|
109
137
|
const markup = savedFile
|
|
110
138
|
? savedFile
|
|
@@ -27,7 +27,7 @@ const vitest_1 = require("vitest");
|
|
|
27
27
|
const injectSchema = __importStar(require("./injectSchema"));
|
|
28
28
|
const fetcherExports = __importStar(require("./markupFetcher"));
|
|
29
29
|
const node_test_1 = require("node:test");
|
|
30
|
-
const utilsExports = __importStar(require("./
|
|
30
|
+
const utilsExports = __importStar(require("./nodeUtils"));
|
|
31
31
|
const { deleteTempDirectory } = utilsExports;
|
|
32
32
|
const { markupFetcher, batchMarkupFetcher } = fetcherExports;
|
|
33
33
|
(0, vitest_1.beforeEach)(() => {
|
|
@@ -498,7 +498,7 @@ const { markupFetcher, batchMarkupFetcher } = fetcherExports;
|
|
|
498
498
|
(0, vitest_1.it)("makes fresh request when temp directory does not exist", async () => {
|
|
499
499
|
const tempDirectoryExistsSpy = vitest_1.vi
|
|
500
500
|
.spyOn(utilsExports, "tempDirectoryExists")
|
|
501
|
-
.mockReturnValue(false);
|
|
501
|
+
.mockReturnValue(Promise.resolve(false));
|
|
502
502
|
const readFileSpy = vitest_1.vi.spyOn(utilsExports, "readFile");
|
|
503
503
|
const fetchMock = vitest_1.vi.fn().mockImplementation(() => {
|
|
504
504
|
return {
|
|
@@ -522,10 +522,10 @@ const { markupFetcher, batchMarkupFetcher } = fetcherExports;
|
|
|
522
522
|
(0, vitest_1.it)("uses saved markup when it exists", async () => {
|
|
523
523
|
const tempDirectoryExistsSpy = vitest_1.vi
|
|
524
524
|
.spyOn(utilsExports, "tempDirectoryExists")
|
|
525
|
-
.mockReturnValue(true);
|
|
525
|
+
.mockReturnValue(Promise.resolve(true));
|
|
526
526
|
const readFileSpy = vitest_1.vi
|
|
527
527
|
.spyOn(utilsExports, "readFile")
|
|
528
|
-
.mockReturnValue("saved markup");
|
|
528
|
+
.mockReturnValue(Promise.resolve("saved markup"));
|
|
529
529
|
const fetchMock = vitest_1.vi.fn();
|
|
530
530
|
const fetcher = markupFetcher("test", fetchMock);
|
|
531
531
|
const result = await fetcher({
|
|
@@ -542,13 +542,13 @@ const { markupFetcher, batchMarkupFetcher } = fetcherExports;
|
|
|
542
542
|
(0, vitest_1.it)("uses the EMPTY template when there's no saved file for a post", async () => {
|
|
543
543
|
const tempDirectoryExistsSpy = vitest_1.vi
|
|
544
544
|
.spyOn(utilsExports, "tempDirectoryExists")
|
|
545
|
-
.mockReturnValue(true);
|
|
545
|
+
.mockReturnValue(Promise.resolve(true));
|
|
546
546
|
const readFileSpy = vitest_1.vi
|
|
547
547
|
.spyOn(utilsExports, "readFile")
|
|
548
548
|
.mockReturnValue(null);
|
|
549
549
|
const getEmptyMarkupSpy = vitest_1.vi
|
|
550
550
|
.spyOn(utilsExports, "getEmptyMarkup")
|
|
551
|
-
.mockReturnValue("<!-- EMPTY -->");
|
|
551
|
+
.mockReturnValue(Promise.resolve("<!-- EMPTY -->"));
|
|
552
552
|
const fetchMock = vitest_1.vi.fn();
|
|
553
553
|
const fetcher = markupFetcher("test", fetchMock);
|
|
554
554
|
const result = await fetcher({
|
|
@@ -0,0 +1,78 @@
|
|
|
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 __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
+
if (mod && mod.__esModule) return mod;
|
|
20
|
+
var result = {};
|
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
+
__setModuleDefault(result, mod);
|
|
23
|
+
return result;
|
|
24
|
+
};
|
|
25
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
|
+
exports.getTempDirectory = getTempDirectory;
|
|
27
|
+
exports.deleteTempDirectory = deleteTempDirectory;
|
|
28
|
+
exports.createTempDirectory = createTempDirectory;
|
|
29
|
+
exports.readFile = readFile;
|
|
30
|
+
exports.getEmptyMarkup = getEmptyMarkup;
|
|
31
|
+
exports.tempDirectoryExists = tempDirectoryExists;
|
|
32
|
+
exports.saveFile = saveFile;
|
|
33
|
+
const utils_1 = require("./utils");
|
|
34
|
+
async function getTempDirectory() {
|
|
35
|
+
const path = await Promise.resolve().then(() => __importStar(require("path")));
|
|
36
|
+
return path.join(process.cwd(), "_temp_jc");
|
|
37
|
+
}
|
|
38
|
+
async function deleteTempDirectory() {
|
|
39
|
+
const tempDirectory = await getTempDirectory();
|
|
40
|
+
const fs = await Promise.resolve().then(() => __importStar(require("fs")));
|
|
41
|
+
if (fs.existsSync(tempDirectory)) {
|
|
42
|
+
fs.rmdirSync(tempDirectory, { recursive: true });
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
async function createTempDirectory(mkdirSyncImpl, existsSyncImpl) {
|
|
46
|
+
const tempDirectory = await getTempDirectory();
|
|
47
|
+
const fs = await Promise.resolve().then(() => __importStar(require("fs")));
|
|
48
|
+
if (!(await tempDirectoryExists(existsSyncImpl || fs.existsSync))) {
|
|
49
|
+
(mkdirSyncImpl || fs.mkdirSync)(tempDirectory);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
async function readFile(name, readFileSyncImpl) {
|
|
53
|
+
const fileName = (0, utils_1.toSavedFileName)(name);
|
|
54
|
+
const fs = await Promise.resolve().then(() => __importStar(require("fs")));
|
|
55
|
+
try {
|
|
56
|
+
return (readFileSyncImpl || fs.readFileSync)(`${await getTempDirectory()}/${fileName}`, "utf8");
|
|
57
|
+
}
|
|
58
|
+
catch (error) {
|
|
59
|
+
return null;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
function getEmptyMarkup() {
|
|
63
|
+
return readFile("EMPTY");
|
|
64
|
+
}
|
|
65
|
+
async function tempDirectoryExists(existsSyncImpl) {
|
|
66
|
+
const fs = await Promise.resolve().then(() => __importStar(require("fs")));
|
|
67
|
+
return (existsSyncImpl || fs.existsSync)(await getTempDirectory());
|
|
68
|
+
}
|
|
69
|
+
async function saveFile(name, data, writeFileImpl) {
|
|
70
|
+
const fileName = (0, utils_1.toSavedFileName)(name);
|
|
71
|
+
const tempDirectory = await getTempDirectory();
|
|
72
|
+
const fs = await Promise.resolve().then(() => __importStar(require("fs")));
|
|
73
|
+
return new Promise((resolve) => {
|
|
74
|
+
(writeFileImpl || fs.writeFile)(`${tempDirectory}/${fileName}`, data, () => {
|
|
75
|
+
resolve();
|
|
76
|
+
});
|
|
77
|
+
});
|
|
78
|
+
}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const vitest_1 = require("vitest");
|
|
4
|
+
const nodeUtils_1 = require("./nodeUtils");
|
|
5
|
+
(0, vitest_1.describe)("createTempDirectory()", () => {
|
|
6
|
+
(0, vitest_1.it)("creates temp directory fresh", async () => {
|
|
7
|
+
const tempDirectory = await (0, nodeUtils_1.getTempDirectory)();
|
|
8
|
+
const mkdirSyncMock = vitest_1.vi.fn();
|
|
9
|
+
const existsSyncMock = vitest_1.vi.fn().mockReturnValue(false);
|
|
10
|
+
await new Promise((resolve) => {
|
|
11
|
+
(0, vitest_1.expect)(async () => {
|
|
12
|
+
await (0, nodeUtils_1.createTempDirectory)(mkdirSyncMock, existsSyncMock);
|
|
13
|
+
resolve();
|
|
14
|
+
}).not.toThrow();
|
|
15
|
+
});
|
|
16
|
+
(0, vitest_1.expect)(mkdirSyncMock).toHaveBeenCalledWith(tempDirectory);
|
|
17
|
+
});
|
|
18
|
+
(0, vitest_1.it)("does not throw error when it already exists", () => {
|
|
19
|
+
const mkdirSyncMock = vitest_1.vi.fn().mockImplementation(() => {
|
|
20
|
+
throw new Error("Directory already exists");
|
|
21
|
+
});
|
|
22
|
+
const existsSyncMock = vitest_1.vi.fn().mockReturnValue(true);
|
|
23
|
+
(0, vitest_1.expect)(() => (0, nodeUtils_1.createTempDirectory)(mkdirSyncMock, existsSyncMock)).not.toThrow();
|
|
24
|
+
(0, vitest_1.expect)(mkdirSyncMock).not.toHaveBeenCalledWith();
|
|
25
|
+
});
|
|
26
|
+
});
|
|
27
|
+
(0, vitest_1.describe)("readFile()", () => {
|
|
28
|
+
(0, vitest_1.it)("reads the file", async () => {
|
|
29
|
+
const readFileSyncMock = vitest_1.vi.fn().mockReturnValue("file contents");
|
|
30
|
+
const tempDirectory = await (0, nodeUtils_1.getTempDirectory)();
|
|
31
|
+
(0, vitest_1.expect)(await (0, nodeUtils_1.readFile)("hey/there", readFileSyncMock)).toEqual("file contents");
|
|
32
|
+
(0, vitest_1.expect)(readFileSyncMock).toHaveBeenCalledWith(`${tempDirectory}/hey::there`, "utf8");
|
|
33
|
+
});
|
|
34
|
+
(0, vitest_1.it)("returns null when file doesn't exist", async () => {
|
|
35
|
+
const readFileSyncMock = vitest_1.vi.fn().mockImplementation(() => {
|
|
36
|
+
throw new Error("File not found");
|
|
37
|
+
});
|
|
38
|
+
(0, vitest_1.expect)(await (0, nodeUtils_1.readFile)("hey/there", readFileSyncMock)).toEqual(null);
|
|
39
|
+
});
|
|
40
|
+
});
|
|
41
|
+
(0, vitest_1.describe)("saveFile()", () => {
|
|
42
|
+
(0, vitest_1.it)("saves the file", async () => {
|
|
43
|
+
const writeFileMock = vitest_1.vi.fn().mockImplementation((file, data, cb) => cb());
|
|
44
|
+
const tempDirectory = await (0, nodeUtils_1.getTempDirectory)();
|
|
45
|
+
await (0, nodeUtils_1.saveFile)("hey/there", "file contents", writeFileMock);
|
|
46
|
+
(0, vitest_1.expect)(writeFileMock).toHaveBeenCalledWith(`${tempDirectory}/hey::there`, "file contents", vitest_1.expect.any(Function));
|
|
47
|
+
});
|
|
48
|
+
});
|
package/dist/cjs/utils.js
CHANGED
|
@@ -4,16 +4,8 @@ exports.isValidTimezone = isValidTimezone;
|
|
|
4
4
|
exports.getEnvironment = getEnvironment;
|
|
5
5
|
exports.parseJson = parseJson;
|
|
6
6
|
exports.unescapeHTML = unescapeHTML;
|
|
7
|
-
exports.deleteTempDirectory = deleteTempDirectory;
|
|
8
|
-
exports.createTempDirectory = createTempDirectory;
|
|
9
7
|
exports.toSavedFileName = toSavedFileName;
|
|
10
|
-
exports.readFile = readFile;
|
|
11
|
-
exports.getEmptyMarkup = getEmptyMarkup;
|
|
12
|
-
exports.tempDirectoryExists = tempDirectoryExists;
|
|
13
|
-
exports.saveFile = saveFile;
|
|
14
8
|
exports.removeFalseyValues = removeFalseyValues;
|
|
15
|
-
const fs_1 = require("fs");
|
|
16
|
-
const _1 = require(".");
|
|
17
9
|
function isValidTimezone(tz) {
|
|
18
10
|
try {
|
|
19
11
|
Intl.DateTimeFormat(undefined, { timeZone: tz });
|
|
@@ -70,42 +62,9 @@ function unescapeHTML(str) {
|
|
|
70
62
|
}
|
|
71
63
|
});
|
|
72
64
|
}
|
|
73
|
-
function deleteTempDirectory() {
|
|
74
|
-
if ((0, fs_1.existsSync)(_1.TEMP_DIRECTORY)) {
|
|
75
|
-
(0, fs_1.rmdirSync)(_1.TEMP_DIRECTORY, { recursive: true });
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
function createTempDirectory(mkdirSyncImpl = fs_1.mkdirSync, existsSyncImpl = fs_1.existsSync) {
|
|
79
|
-
if (!tempDirectoryExists(existsSyncImpl)) {
|
|
80
|
-
mkdirSyncImpl(_1.TEMP_DIRECTORY);
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
65
|
function toSavedFileName(name) {
|
|
84
66
|
return name.replace(/^\//, "").replace(/\//g, "::");
|
|
85
67
|
}
|
|
86
|
-
function readFile(name, readFileSyncImpl = fs_1.readFileSync) {
|
|
87
|
-
const fileName = toSavedFileName(name);
|
|
88
|
-
try {
|
|
89
|
-
return readFileSyncImpl(`${_1.TEMP_DIRECTORY}/${fileName}`, "utf8");
|
|
90
|
-
}
|
|
91
|
-
catch (error) {
|
|
92
|
-
return null;
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
function getEmptyMarkup() {
|
|
96
|
-
return readFile("EMPTY");
|
|
97
|
-
}
|
|
98
|
-
function tempDirectoryExists(existsSyncImpl = fs_1.existsSync) {
|
|
99
|
-
return existsSyncImpl(_1.TEMP_DIRECTORY);
|
|
100
|
-
}
|
|
101
|
-
function saveFile(name, data, writeFileImpl = fs_1.writeFile) {
|
|
102
|
-
const fileName = toSavedFileName(name);
|
|
103
|
-
return new Promise((resolve) => {
|
|
104
|
-
writeFileImpl(`${_1.TEMP_DIRECTORY}/${fileName}`, data, () => {
|
|
105
|
-
resolve();
|
|
106
|
-
});
|
|
107
|
-
});
|
|
108
|
-
}
|
|
109
68
|
function removeFalseyValues(obj) {
|
|
110
69
|
const filteredItems = Object.entries(obj).filter(([, value]) => value);
|
|
111
70
|
return Object.fromEntries(filteredItems);
|
package/dist/cjs/utils.test.js
CHANGED
|
@@ -2,7 +2,6 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
const vitest_1 = require("vitest");
|
|
4
4
|
const utils_1 = require("./utils");
|
|
5
|
-
const _1 = require(".");
|
|
6
5
|
const env = process.env;
|
|
7
6
|
(0, vitest_1.beforeEach)(() => {
|
|
8
7
|
vitest_1.vi.resetModules();
|
|
@@ -45,48 +44,11 @@ const env = process.env;
|
|
|
45
44
|
});
|
|
46
45
|
});
|
|
47
46
|
});
|
|
48
|
-
(0, vitest_1.describe)("createTempDirectory()", () => {
|
|
49
|
-
(0, vitest_1.it)("creates temp directory fresh", () => {
|
|
50
|
-
const mkdirSyncMock = vitest_1.vi.fn();
|
|
51
|
-
const existsSyncMock = vitest_1.vi.fn().mockReturnValue(false);
|
|
52
|
-
(0, vitest_1.expect)(() => (0, utils_1.createTempDirectory)(mkdirSyncMock, existsSyncMock)).not.toThrow();
|
|
53
|
-
(0, vitest_1.expect)(mkdirSyncMock).toHaveBeenCalledWith(_1.TEMP_DIRECTORY);
|
|
54
|
-
});
|
|
55
|
-
(0, vitest_1.it)("does not throw error when it already exists", () => {
|
|
56
|
-
const mkdirSyncMock = vitest_1.vi.fn().mockImplementation(() => {
|
|
57
|
-
throw new Error("Directory already exists");
|
|
58
|
-
});
|
|
59
|
-
const existsSyncMock = vitest_1.vi.fn().mockReturnValue(true);
|
|
60
|
-
(0, vitest_1.expect)(() => (0, utils_1.createTempDirectory)(mkdirSyncMock, existsSyncMock)).not.toThrow();
|
|
61
|
-
(0, vitest_1.expect)(mkdirSyncMock).not.toHaveBeenCalledWith();
|
|
62
|
-
});
|
|
63
|
-
});
|
|
64
47
|
(0, vitest_1.describe)("toSavedFileName()", () => {
|
|
65
48
|
(0, vitest_1.it)("replaces slashes with double colons", () => {
|
|
66
49
|
(0, vitest_1.expect)((0, utils_1.toSavedFileName)("/hey/there")).toEqual("hey::there");
|
|
67
50
|
});
|
|
68
51
|
});
|
|
69
|
-
(0, vitest_1.describe)("readFile()", () => {
|
|
70
|
-
(0, vitest_1.it)("reads the file", () => {
|
|
71
|
-
const readFileSyncMock = vitest_1.vi.fn().mockReturnValue("file contents");
|
|
72
|
-
(0, vitest_1.expect)((0, utils_1.readFile)("hey/there", readFileSyncMock)).toEqual("file contents");
|
|
73
|
-
(0, vitest_1.expect)(readFileSyncMock).toHaveBeenCalledWith(`${_1.TEMP_DIRECTORY}/hey::there`, "utf8");
|
|
74
|
-
});
|
|
75
|
-
(0, vitest_1.it)("returns null when file doesn't exist", () => {
|
|
76
|
-
const readFileSyncMock = vitest_1.vi.fn().mockImplementation(() => {
|
|
77
|
-
throw new Error("File not found");
|
|
78
|
-
});
|
|
79
|
-
(0, vitest_1.expect)((0, utils_1.readFile)("hey/there", readFileSyncMock)).toEqual(null);
|
|
80
|
-
});
|
|
81
|
-
});
|
|
82
|
-
(0, vitest_1.describe)("saveFile()", () => {
|
|
83
|
-
(0, vitest_1.it)("saves the file", async () => {
|
|
84
|
-
const writeFileMock = vitest_1.vi.fn();
|
|
85
|
-
const result = (0, utils_1.saveFile)("hey/there", "file contents", writeFileMock);
|
|
86
|
-
(0, vitest_1.expect)(writeFileMock).toHaveBeenCalledWith(`${_1.TEMP_DIRECTORY}/hey::there`, "file contents", vitest_1.expect.any(Function));
|
|
87
|
-
(0, vitest_1.expect)(result).toBeInstanceOf(Promise);
|
|
88
|
-
});
|
|
89
|
-
});
|
|
90
52
|
(0, vitest_1.describe)("removeFalseyValues()", () => {
|
|
91
53
|
(0, vitest_1.it)("should remove falsey values", () => {
|
|
92
54
|
(0, vitest_1.expect)((0, utils_1.removeFalseyValues)({ a: 1, b: 0, d: null, e: "" })).toEqual({
|
package/dist/esm/index.js
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import { injectSchema } from "./injectSchema";
|
|
2
|
-
import {
|
|
2
|
+
import { getEnvironment, isValidTimezone, parseJson } from "./utils";
|
|
3
3
|
const BASE_URL = "https://go.jamcomments.com";
|
|
4
4
|
export async function fetchAll({ tz = undefined, dateFormat = undefined, domain, apiKey, baseUrl = BASE_URL, environment = getEnvironment(), copy = {}, }, platform, fetchImplementation = fetch, batchMarkupFetcherImpl = batchMarkupFetcher) {
|
|
5
|
+
const { createTempDirectory, deleteTempDirectory, saveFile } = await import("./nodeUtils");
|
|
5
6
|
const fetchBatchMarkup = batchMarkupFetcherImpl(platform, fetchImplementation);
|
|
6
|
-
createTempDirectory();
|
|
7
|
+
await createTempDirectory();
|
|
7
8
|
let shouldKeepFetching = true;
|
|
8
9
|
let page = 1;
|
|
9
10
|
console.log("Fetching comments from JamComments! This might take a sec.");
|
|
@@ -33,7 +34,7 @@ export async function fetchAll({ tz = undefined, dateFormat = undefined, domain,
|
|
|
33
34
|
}
|
|
34
35
|
}
|
|
35
36
|
catch (error) {
|
|
36
|
-
deleteTempDirectory();
|
|
37
|
+
await deleteTempDirectory();
|
|
37
38
|
throw error;
|
|
38
39
|
}
|
|
39
40
|
}
|
|
@@ -93,11 +94,15 @@ export async function makeMarkupRequest({ tz, path, page, domain, apiKey, dateFo
|
|
|
93
94
|
export function markupFetcher(platform, fetchImplementation = fetch) {
|
|
94
95
|
return async ({ tz = undefined, path, domain, apiKey, schema, dateFormat, baseUrl = BASE_URL, environment = getEnvironment(), copy = {}, }) => {
|
|
95
96
|
path = path || "/";
|
|
96
|
-
const savedFile = (() => {
|
|
97
|
-
if (
|
|
97
|
+
const savedFile = await (async () => {
|
|
98
|
+
if (typeof process === "undefined") {
|
|
98
99
|
return null;
|
|
99
100
|
}
|
|
100
|
-
|
|
101
|
+
const { tempDirectoryExists, readFile, getEmptyMarkup } = await import("./nodeUtils");
|
|
102
|
+
if (!(await tempDirectoryExists())) {
|
|
103
|
+
return null;
|
|
104
|
+
}
|
|
105
|
+
return (await readFile(path)) || getEmptyMarkup();
|
|
101
106
|
})();
|
|
102
107
|
const markup = savedFile
|
|
103
108
|
? savedFile
|
|
@@ -2,7 +2,7 @@ import { beforeEach, describe, expect, it, vi } from "vitest";
|
|
|
2
2
|
import * as injectSchema from "./injectSchema";
|
|
3
3
|
import * as fetcherExports from "./markupFetcher";
|
|
4
4
|
import { afterEach } from "node:test";
|
|
5
|
-
import * as utilsExports from "./
|
|
5
|
+
import * as utilsExports from "./nodeUtils";
|
|
6
6
|
const { deleteTempDirectory } = utilsExports;
|
|
7
7
|
const { markupFetcher, batchMarkupFetcher } = fetcherExports;
|
|
8
8
|
beforeEach(() => {
|
|
@@ -473,7 +473,7 @@ describe("markupFetcher", () => {
|
|
|
473
473
|
it("makes fresh request when temp directory does not exist", async () => {
|
|
474
474
|
const tempDirectoryExistsSpy = vi
|
|
475
475
|
.spyOn(utilsExports, "tempDirectoryExists")
|
|
476
|
-
.mockReturnValue(false);
|
|
476
|
+
.mockReturnValue(Promise.resolve(false));
|
|
477
477
|
const readFileSpy = vi.spyOn(utilsExports, "readFile");
|
|
478
478
|
const fetchMock = vi.fn().mockImplementation(() => {
|
|
479
479
|
return {
|
|
@@ -497,10 +497,10 @@ describe("markupFetcher", () => {
|
|
|
497
497
|
it("uses saved markup when it exists", async () => {
|
|
498
498
|
const tempDirectoryExistsSpy = vi
|
|
499
499
|
.spyOn(utilsExports, "tempDirectoryExists")
|
|
500
|
-
.mockReturnValue(true);
|
|
500
|
+
.mockReturnValue(Promise.resolve(true));
|
|
501
501
|
const readFileSpy = vi
|
|
502
502
|
.spyOn(utilsExports, "readFile")
|
|
503
|
-
.mockReturnValue("saved markup");
|
|
503
|
+
.mockReturnValue(Promise.resolve("saved markup"));
|
|
504
504
|
const fetchMock = vi.fn();
|
|
505
505
|
const fetcher = markupFetcher("test", fetchMock);
|
|
506
506
|
const result = await fetcher({
|
|
@@ -517,13 +517,13 @@ describe("markupFetcher", () => {
|
|
|
517
517
|
it("uses the EMPTY template when there's no saved file for a post", async () => {
|
|
518
518
|
const tempDirectoryExistsSpy = vi
|
|
519
519
|
.spyOn(utilsExports, "tempDirectoryExists")
|
|
520
|
-
.mockReturnValue(true);
|
|
520
|
+
.mockReturnValue(Promise.resolve(true));
|
|
521
521
|
const readFileSpy = vi
|
|
522
522
|
.spyOn(utilsExports, "readFile")
|
|
523
523
|
.mockReturnValue(null);
|
|
524
524
|
const getEmptyMarkupSpy = vi
|
|
525
525
|
.spyOn(utilsExports, "getEmptyMarkup")
|
|
526
|
-
.mockReturnValue("<!-- EMPTY -->");
|
|
526
|
+
.mockReturnValue(Promise.resolve("<!-- EMPTY -->"));
|
|
527
527
|
const fetchMock = vi.fn();
|
|
528
528
|
const fetcher = markupFetcher("test", fetchMock);
|
|
529
529
|
const result = await fetcher({
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { toSavedFileName } from "./utils";
|
|
2
|
+
export async function getTempDirectory() {
|
|
3
|
+
const path = await import("path");
|
|
4
|
+
return path.join(process.cwd(), "_temp_jc");
|
|
5
|
+
}
|
|
6
|
+
export async function deleteTempDirectory() {
|
|
7
|
+
const tempDirectory = await getTempDirectory();
|
|
8
|
+
const fs = await import("fs");
|
|
9
|
+
if (fs.existsSync(tempDirectory)) {
|
|
10
|
+
fs.rmdirSync(tempDirectory, { recursive: true });
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
export async function createTempDirectory(mkdirSyncImpl, existsSyncImpl) {
|
|
14
|
+
const tempDirectory = await getTempDirectory();
|
|
15
|
+
const fs = await import("fs");
|
|
16
|
+
if (!(await tempDirectoryExists(existsSyncImpl || fs.existsSync))) {
|
|
17
|
+
(mkdirSyncImpl || fs.mkdirSync)(tempDirectory);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
export async function readFile(name, readFileSyncImpl) {
|
|
21
|
+
const fileName = toSavedFileName(name);
|
|
22
|
+
const fs = await import("fs");
|
|
23
|
+
try {
|
|
24
|
+
return (readFileSyncImpl || fs.readFileSync)(`${await getTempDirectory()}/${fileName}`, "utf8");
|
|
25
|
+
}
|
|
26
|
+
catch (error) {
|
|
27
|
+
return null;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
export function getEmptyMarkup() {
|
|
31
|
+
return readFile("EMPTY");
|
|
32
|
+
}
|
|
33
|
+
export async function tempDirectoryExists(existsSyncImpl) {
|
|
34
|
+
const fs = await import("fs");
|
|
35
|
+
return (existsSyncImpl || fs.existsSync)(await getTempDirectory());
|
|
36
|
+
}
|
|
37
|
+
export async function saveFile(name, data, writeFileImpl) {
|
|
38
|
+
const fileName = toSavedFileName(name);
|
|
39
|
+
const tempDirectory = await getTempDirectory();
|
|
40
|
+
const fs = await import("fs");
|
|
41
|
+
return new Promise((resolve) => {
|
|
42
|
+
(writeFileImpl || fs.writeFile)(`${tempDirectory}/${fileName}`, data, () => {
|
|
43
|
+
resolve();
|
|
44
|
+
});
|
|
45
|
+
});
|
|
46
|
+
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { describe, expect, it, vi } from "vitest";
|
|
2
|
+
import { createTempDirectory, getTempDirectory, readFile, saveFile, } from "./nodeUtils";
|
|
3
|
+
describe("createTempDirectory()", () => {
|
|
4
|
+
it("creates temp directory fresh", async () => {
|
|
5
|
+
const tempDirectory = await getTempDirectory();
|
|
6
|
+
const mkdirSyncMock = vi.fn();
|
|
7
|
+
const existsSyncMock = vi.fn().mockReturnValue(false);
|
|
8
|
+
await new Promise((resolve) => {
|
|
9
|
+
expect(async () => {
|
|
10
|
+
await createTempDirectory(mkdirSyncMock, existsSyncMock);
|
|
11
|
+
resolve();
|
|
12
|
+
}).not.toThrow();
|
|
13
|
+
});
|
|
14
|
+
expect(mkdirSyncMock).toHaveBeenCalledWith(tempDirectory);
|
|
15
|
+
});
|
|
16
|
+
it("does not throw error when it already exists", () => {
|
|
17
|
+
const mkdirSyncMock = vi.fn().mockImplementation(() => {
|
|
18
|
+
throw new Error("Directory already exists");
|
|
19
|
+
});
|
|
20
|
+
const existsSyncMock = vi.fn().mockReturnValue(true);
|
|
21
|
+
expect(() => createTempDirectory(mkdirSyncMock, existsSyncMock)).not.toThrow();
|
|
22
|
+
expect(mkdirSyncMock).not.toHaveBeenCalledWith();
|
|
23
|
+
});
|
|
24
|
+
});
|
|
25
|
+
describe("readFile()", () => {
|
|
26
|
+
it("reads the file", async () => {
|
|
27
|
+
const readFileSyncMock = vi.fn().mockReturnValue("file contents");
|
|
28
|
+
const tempDirectory = await getTempDirectory();
|
|
29
|
+
expect(await readFile("hey/there", readFileSyncMock)).toEqual("file contents");
|
|
30
|
+
expect(readFileSyncMock).toHaveBeenCalledWith(`${tempDirectory}/hey::there`, "utf8");
|
|
31
|
+
});
|
|
32
|
+
it("returns null when file doesn't exist", async () => {
|
|
33
|
+
const readFileSyncMock = vi.fn().mockImplementation(() => {
|
|
34
|
+
throw new Error("File not found");
|
|
35
|
+
});
|
|
36
|
+
expect(await readFile("hey/there", readFileSyncMock)).toEqual(null);
|
|
37
|
+
});
|
|
38
|
+
});
|
|
39
|
+
describe("saveFile()", () => {
|
|
40
|
+
it("saves the file", async () => {
|
|
41
|
+
const writeFileMock = vi.fn().mockImplementation((file, data, cb) => cb());
|
|
42
|
+
const tempDirectory = await getTempDirectory();
|
|
43
|
+
await saveFile("hey/there", "file contents", writeFileMock);
|
|
44
|
+
expect(writeFileMock).toHaveBeenCalledWith(`${tempDirectory}/hey::there`, "file contents", expect.any(Function));
|
|
45
|
+
});
|
|
46
|
+
});
|
package/dist/esm/utils.js
CHANGED
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
import { existsSync, mkdirSync, readFileSync, rmdirSync, writeFile } from "fs";
|
|
2
|
-
import { TEMP_DIRECTORY } from ".";
|
|
3
1
|
export function isValidTimezone(tz) {
|
|
4
2
|
try {
|
|
5
3
|
Intl.DateTimeFormat(undefined, { timeZone: tz });
|
|
@@ -56,42 +54,9 @@ export function unescapeHTML(str) {
|
|
|
56
54
|
}
|
|
57
55
|
});
|
|
58
56
|
}
|
|
59
|
-
export function deleteTempDirectory() {
|
|
60
|
-
if (existsSync(TEMP_DIRECTORY)) {
|
|
61
|
-
rmdirSync(TEMP_DIRECTORY, { recursive: true });
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
export function createTempDirectory(mkdirSyncImpl = mkdirSync, existsSyncImpl = existsSync) {
|
|
65
|
-
if (!tempDirectoryExists(existsSyncImpl)) {
|
|
66
|
-
mkdirSyncImpl(TEMP_DIRECTORY);
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
57
|
export function toSavedFileName(name) {
|
|
70
58
|
return name.replace(/^\//, "").replace(/\//g, "::");
|
|
71
59
|
}
|
|
72
|
-
export function readFile(name, readFileSyncImpl = readFileSync) {
|
|
73
|
-
const fileName = toSavedFileName(name);
|
|
74
|
-
try {
|
|
75
|
-
return readFileSyncImpl(`${TEMP_DIRECTORY}/${fileName}`, "utf8");
|
|
76
|
-
}
|
|
77
|
-
catch (error) {
|
|
78
|
-
return null;
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
export function getEmptyMarkup() {
|
|
82
|
-
return readFile("EMPTY");
|
|
83
|
-
}
|
|
84
|
-
export function tempDirectoryExists(existsSyncImpl = existsSync) {
|
|
85
|
-
return existsSyncImpl(TEMP_DIRECTORY);
|
|
86
|
-
}
|
|
87
|
-
export function saveFile(name, data, writeFileImpl = writeFile) {
|
|
88
|
-
const fileName = toSavedFileName(name);
|
|
89
|
-
return new Promise((resolve) => {
|
|
90
|
-
writeFileImpl(`${TEMP_DIRECTORY}/${fileName}`, data, () => {
|
|
91
|
-
resolve();
|
|
92
|
-
});
|
|
93
|
-
});
|
|
94
|
-
}
|
|
95
60
|
export function removeFalseyValues(obj) {
|
|
96
61
|
const filteredItems = Object.entries(obj).filter(([, value]) => value);
|
|
97
62
|
return Object.fromEntries(filteredItems);
|
package/dist/esm/utils.test.js
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { describe, it, expect, vi, beforeEach, afterEach } from "vitest";
|
|
2
|
-
import { getEnvironment,
|
|
3
|
-
import { TEMP_DIRECTORY } from ".";
|
|
2
|
+
import { getEnvironment, removeFalseyValues, toSavedFileName } from "./utils";
|
|
4
3
|
const env = process.env;
|
|
5
4
|
beforeEach(() => {
|
|
6
5
|
vi.resetModules();
|
|
@@ -43,48 +42,11 @@ describe("getEnvironment()", () => {
|
|
|
43
42
|
});
|
|
44
43
|
});
|
|
45
44
|
});
|
|
46
|
-
describe("createTempDirectory()", () => {
|
|
47
|
-
it("creates temp directory fresh", () => {
|
|
48
|
-
const mkdirSyncMock = vi.fn();
|
|
49
|
-
const existsSyncMock = vi.fn().mockReturnValue(false);
|
|
50
|
-
expect(() => createTempDirectory(mkdirSyncMock, existsSyncMock)).not.toThrow();
|
|
51
|
-
expect(mkdirSyncMock).toHaveBeenCalledWith(TEMP_DIRECTORY);
|
|
52
|
-
});
|
|
53
|
-
it("does not throw error when it already exists", () => {
|
|
54
|
-
const mkdirSyncMock = vi.fn().mockImplementation(() => {
|
|
55
|
-
throw new Error("Directory already exists");
|
|
56
|
-
});
|
|
57
|
-
const existsSyncMock = vi.fn().mockReturnValue(true);
|
|
58
|
-
expect(() => createTempDirectory(mkdirSyncMock, existsSyncMock)).not.toThrow();
|
|
59
|
-
expect(mkdirSyncMock).not.toHaveBeenCalledWith();
|
|
60
|
-
});
|
|
61
|
-
});
|
|
62
45
|
describe("toSavedFileName()", () => {
|
|
63
46
|
it("replaces slashes with double colons", () => {
|
|
64
47
|
expect(toSavedFileName("/hey/there")).toEqual("hey::there");
|
|
65
48
|
});
|
|
66
49
|
});
|
|
67
|
-
describe("readFile()", () => {
|
|
68
|
-
it("reads the file", () => {
|
|
69
|
-
const readFileSyncMock = vi.fn().mockReturnValue("file contents");
|
|
70
|
-
expect(readFile("hey/there", readFileSyncMock)).toEqual("file contents");
|
|
71
|
-
expect(readFileSyncMock).toHaveBeenCalledWith(`${TEMP_DIRECTORY}/hey::there`, "utf8");
|
|
72
|
-
});
|
|
73
|
-
it("returns null when file doesn't exist", () => {
|
|
74
|
-
const readFileSyncMock = vi.fn().mockImplementation(() => {
|
|
75
|
-
throw new Error("File not found");
|
|
76
|
-
});
|
|
77
|
-
expect(readFile("hey/there", readFileSyncMock)).toEqual(null);
|
|
78
|
-
});
|
|
79
|
-
});
|
|
80
|
-
describe("saveFile()", () => {
|
|
81
|
-
it("saves the file", async () => {
|
|
82
|
-
const writeFileMock = vi.fn();
|
|
83
|
-
const result = saveFile("hey/there", "file contents", writeFileMock);
|
|
84
|
-
expect(writeFileMock).toHaveBeenCalledWith(`${TEMP_DIRECTORY}/hey::there`, "file contents", expect.any(Function));
|
|
85
|
-
expect(result).toBeInstanceOf(Promise);
|
|
86
|
-
});
|
|
87
|
-
});
|
|
88
50
|
describe("removeFalseyValues()", () => {
|
|
89
51
|
it("should remove falsey values", () => {
|
|
90
52
|
expect(removeFalseyValues({ a: 1, b: 0, d: null, e: "" })).toEqual({
|
package/dist/types/index.d.ts
CHANGED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export declare function getTempDirectory(): Promise<string>;
|
|
2
|
+
export declare function deleteTempDirectory(): Promise<void>;
|
|
3
|
+
export declare function createTempDirectory(mkdirSyncImpl?: typeof import("fs").mkdirSync, existsSyncImpl?: typeof import("fs").existsSync): Promise<void>;
|
|
4
|
+
export declare function readFile(name: string, readFileSyncImpl?: typeof import("fs").readFileSync): Promise<string>;
|
|
5
|
+
export declare function getEmptyMarkup(): Promise<string>;
|
|
6
|
+
export declare function tempDirectoryExists(existsSyncImpl?: typeof import("fs").existsSync): Promise<boolean>;
|
|
7
|
+
export declare function saveFile(name: string, data: string, writeFileImpl?: typeof import("fs").writeFile): Promise<void>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
package/dist/types/utils.d.ts
CHANGED
|
@@ -1,13 +1,6 @@
|
|
|
1
|
-
import { existsSync, mkdirSync, readFileSync } from "fs";
|
|
2
1
|
export declare function isValidTimezone(tz: string): boolean;
|
|
3
2
|
export declare function getEnvironment(): string;
|
|
4
3
|
export declare function parseJson(json: string): any;
|
|
5
4
|
export declare function unescapeHTML(str: any): any;
|
|
6
|
-
export declare function deleteTempDirectory(): void;
|
|
7
|
-
export declare function createTempDirectory(mkdirSyncImpl?: typeof mkdirSync, existsSyncImpl?: typeof existsSync): void;
|
|
8
5
|
export declare function toSavedFileName(name: string): string;
|
|
9
|
-
export declare function readFile(name: any, readFileSyncImpl?: typeof readFileSync): string;
|
|
10
|
-
export declare function getEmptyMarkup(): string;
|
|
11
|
-
export declare function tempDirectoryExists(existsSyncImpl?: typeof existsSync): boolean;
|
|
12
|
-
export declare function saveFile(name: string, data: string, writeFileImpl?: any): Promise<void>;
|
|
13
6
|
export declare function removeFalseyValues<T>(obj: T): Partial<T>;
|