Skip to content

Commit f0887ea

Browse files
committed
Commit the build result for local operation check
1 parent e969b90 commit f0887ea

21 files changed

+248
-1
lines changed

.gitignore

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
.vscode/
22
.serverless/
33
coverage/
4-
lib/
54
node_modules/
65

76
*.log

lib/cleanup.d.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export declare function cleanupTempFiles(): Promise<void>;

lib/cleanup.js

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
"use strict";
2+
3+
Object.defineProperty(exports, "__esModule", {
4+
value: true
5+
});
6+
exports.cleanupTempFiles = cleanupTempFiles;
7+
var _promises = _interopRequireDefault(require("fs/promises"));
8+
var _del = _interopRequireDefault(require("del"));
9+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
10+
// Removes temp files generated by LibreOffice
11+
async function cleanupTempFiles() {
12+
const files = await _promises.default.readdir(`/tmp`);
13+
for (const file of files) {
14+
if (file.endsWith('.tmp') === true || file.startsWith('OSL_PIPE')) {
15+
try {
16+
await (0, _del.default)([`/tmp/${file}`, `/tmp/${file}/*`], {
17+
force: true
18+
});
19+
// eslint-disable-next-line no-empty
20+
} catch (error) {}
21+
}
22+
}
23+
}

lib/convert.d.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
export declare const DEFAULT_ARGS: string[];
2+
export declare function convertTo(filename: string, format: string): Promise<string>;

lib/convert.js

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
"use strict";
2+
3+
Object.defineProperty(exports, "__esModule", {
4+
value: true
5+
});
6+
exports.DEFAULT_ARGS = void 0;
7+
exports.convertTo = convertTo;
8+
var _child_process = _interopRequireDefault(require("child_process"));
9+
var _util = _interopRequireDefault(require("util"));
10+
var _cleanup = require("./cleanup");
11+
var _logs = require("./logs");
12+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
13+
const exec = _util.default.promisify(_child_process.default.exec);
14+
const DEFAULT_ARGS = ['--headless', '--invisible', '--nodefault', '--view', '--nolockcheck', '--nologo', '--norestore'];
15+
exports.DEFAULT_ARGS = DEFAULT_ARGS;
16+
const LO_BINARY_PATH = process.env.LO_BINARY_PATH ?? 'libreoffice7.6';
17+
async function convertTo(filename, format) {
18+
await (0, _cleanup.cleanupTempFiles)();
19+
const argumentsString = DEFAULT_ARGS.join(' ');
20+
const outputFilename = filename.split(/\\ /).join(' ');
21+
const cmd = `cd /tmp && ${LO_BINARY_PATH} ${argumentsString} --convert-to ${format} --outdir /tmp '/tmp/${outputFilename}'`;
22+
let logs;
23+
24+
// due to an unknown issue, we need to run command twice
25+
try {
26+
logs = (await exec(cmd)).stdout;
27+
} catch (e) {
28+
logs = (await exec(cmd)).stdout;
29+
}
30+
await exec(`rm '/tmp/${outputFilename}'`);
31+
await (0, _cleanup.cleanupTempFiles)();
32+
return (0, _logs.getConvertedFilePath)(logs.toString());
33+
}

lib/index.d.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
export * from './convert';
2+
export * from './validations';

lib/index.js

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
"use strict";
2+
3+
Object.defineProperty(exports, "__esModule", {
4+
value: true
5+
});
6+
var _convert = require("./convert");
7+
Object.keys(_convert).forEach(function (key) {
8+
if (key === "default" || key === "__esModule") return;
9+
if (key in exports && exports[key] === _convert[key]) return;
10+
Object.defineProperty(exports, key, {
11+
enumerable: true,
12+
get: function () {
13+
return _convert[key];
14+
}
15+
});
16+
});
17+
var _validations = require("./validations");
18+
Object.keys(_validations).forEach(function (key) {
19+
if (key === "default" || key === "__esModule") return;
20+
if (key in exports && exports[key] === _validations[key]) return;
21+
Object.defineProperty(exports, key, {
22+
enumerable: true,
23+
get: function () {
24+
return _validations[key];
25+
}
26+
});
27+
});

lib/logs.d.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export declare function getConvertedFilePath(logs: string): string;

lib/logs.js

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
"use strict";
2+
3+
Object.defineProperty(exports, "__esModule", {
4+
value: true
5+
});
6+
exports.getConvertedFilePath = getConvertedFilePath;
7+
function getConvertedFilePath(logs) {
8+
try {
9+
return logs.match(/\/tmp\/.+->\s(\/tmp\/.+) using/)[1];
10+
} catch (e) {
11+
const ErrorWithExtendedMessage = new Error(e);
12+
ErrorWithExtendedMessage.message += `;\tTried to parse string: "${logs}"`;
13+
throw ErrorWithExtendedMessage;
14+
}
15+
}

lib/validations.d.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export declare function canBeConvertedToPDF(filename: string): boolean;

lib/validations.js

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
"use strict";
2+
3+
Object.defineProperty(exports, "__esModule", {
4+
value: true
5+
});
6+
exports.canBeConvertedToPDF = canBeConvertedToPDF;
7+
var _isVideo = _interopRequireDefault(require("is-video"));
8+
var _isImage = _interopRequireDefault(require("is-image"));
9+
var _isAudioFilepath = _interopRequireDefault(require("@shelf/is-audio-filepath"));
10+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
11+
const UNSUPPORTED_FILE_EXTENSIONS = ['.chm', '.heic', '.gdoc', '.gsheet', '.gslides', '.zip', '.dwg'];
12+
function canBeConvertedToPDF(filename) {
13+
filename = filename.toLowerCase();
14+
const isFileExtensionUnsupported = UNSUPPORTED_FILE_EXTENSIONS.some(ext => filename.endsWith(ext));
15+
if (isFileExtensionUnsupported) {
16+
return false;
17+
}
18+
return !(0, _isImage.default)(filename) && !(0, _isVideo.default)(filename) && !(0, _isAudioFilepath.default)(filename);
19+
}

test/lib/cleanup.d.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export declare function cleanupTempFiles(): Promise<void>;

test/lib/cleanup.js

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
"use strict";
2+
3+
Object.defineProperty(exports, "__esModule", {
4+
value: true
5+
});
6+
exports.cleanupTempFiles = cleanupTempFiles;
7+
var _promises = _interopRequireDefault(require("fs/promises"));
8+
var _del = _interopRequireDefault(require("del"));
9+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
10+
// Removes temp files generated by LibreOffice
11+
async function cleanupTempFiles() {
12+
const files = await _promises.default.readdir(`/tmp`);
13+
for (const file of files) {
14+
if (file.endsWith('.tmp') === true || file.startsWith('OSL_PIPE')) {
15+
try {
16+
await (0, _del.default)([`/tmp/${file}`, `/tmp/${file}/*`], {
17+
force: true
18+
});
19+
// eslint-disable-next-line no-empty
20+
} catch (error) {}
21+
}
22+
}
23+
}

test/lib/convert.d.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
export declare const DEFAULT_ARGS: string[];
2+
export declare function convertTo(filename: string, format: string): Promise<string>;

test/lib/convert.js

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
"use strict";
2+
3+
Object.defineProperty(exports, "__esModule", {
4+
value: true
5+
});
6+
exports.DEFAULT_ARGS = void 0;
7+
exports.convertTo = convertTo;
8+
var _child_process = _interopRequireDefault(require("child_process"));
9+
var _util = _interopRequireDefault(require("util"));
10+
var _cleanup = require("./cleanup");
11+
var _logs = require("./logs");
12+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
13+
const exec = _util.default.promisify(_child_process.default.exec);
14+
const DEFAULT_ARGS = ['--headless', '--invisible', '--nodefault', '--view', '--nolockcheck', '--nologo', '--norestore'];
15+
exports.DEFAULT_ARGS = DEFAULT_ARGS;
16+
const LO_BINARY_PATH = process.env.LO_BINARY_PATH ?? 'libreoffice7.6';
17+
async function convertTo(filename, format) {
18+
await (0, _cleanup.cleanupTempFiles)();
19+
const argumentsString = DEFAULT_ARGS.join(' ');
20+
const outputFilename = filename.split(/\\ /).join(' ');
21+
const cmd = `cd /tmp && ${LO_BINARY_PATH} ${argumentsString} --convert-to ${format} --outdir /tmp '/tmp/${outputFilename}'`;
22+
let logs;
23+
24+
// due to an unknown issue, we need to run command twice
25+
try {
26+
logs = (await exec(cmd)).stdout;
27+
} catch (e) {
28+
logs = (await exec(cmd)).stdout;
29+
}
30+
await exec(`rm '/tmp/${outputFilename}'`);
31+
await (0, _cleanup.cleanupTempFiles)();
32+
return (0, _logs.getConvertedFilePath)(logs.toString());
33+
}

test/lib/index.d.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
export * from './convert';
2+
export * from './validations';

test/lib/index.js

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
"use strict";
2+
3+
Object.defineProperty(exports, "__esModule", {
4+
value: true
5+
});
6+
var _convert = require("./convert");
7+
Object.keys(_convert).forEach(function (key) {
8+
if (key === "default" || key === "__esModule") return;
9+
if (key in exports && exports[key] === _convert[key]) return;
10+
Object.defineProperty(exports, key, {
11+
enumerable: true,
12+
get: function () {
13+
return _convert[key];
14+
}
15+
});
16+
});
17+
var _validations = require("./validations");
18+
Object.keys(_validations).forEach(function (key) {
19+
if (key === "default" || key === "__esModule") return;
20+
if (key in exports && exports[key] === _validations[key]) return;
21+
Object.defineProperty(exports, key, {
22+
enumerable: true,
23+
get: function () {
24+
return _validations[key];
25+
}
26+
});
27+
});

test/lib/logs.d.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export declare function getConvertedFilePath(logs: string): string;

test/lib/logs.js

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
"use strict";
2+
3+
Object.defineProperty(exports, "__esModule", {
4+
value: true
5+
});
6+
exports.getConvertedFilePath = getConvertedFilePath;
7+
function getConvertedFilePath(logs) {
8+
try {
9+
return logs.match(/\/tmp\/.+->\s(\/tmp\/.+) using/)[1];
10+
} catch (e) {
11+
const ErrorWithExtendedMessage = new Error(e);
12+
ErrorWithExtendedMessage.message += `;\tTried to parse string: "${logs}"`;
13+
throw ErrorWithExtendedMessage;
14+
}
15+
}

test/lib/validations.d.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export declare function canBeConvertedToPDF(filename: string): boolean;

test/lib/validations.js

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
"use strict";
2+
3+
Object.defineProperty(exports, "__esModule", {
4+
value: true
5+
});
6+
exports.canBeConvertedToPDF = canBeConvertedToPDF;
7+
var _isVideo = _interopRequireDefault(require("is-video"));
8+
var _isImage = _interopRequireDefault(require("is-image"));
9+
var _isAudioFilepath = _interopRequireDefault(require("@shelf/is-audio-filepath"));
10+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
11+
const UNSUPPORTED_FILE_EXTENSIONS = ['.chm', '.heic', '.gdoc', '.gsheet', '.gslides', '.zip', '.dwg'];
12+
function canBeConvertedToPDF(filename) {
13+
filename = filename.toLowerCase();
14+
const isFileExtensionUnsupported = UNSUPPORTED_FILE_EXTENSIONS.some(ext => filename.endsWith(ext));
15+
if (isFileExtensionUnsupported) {
16+
return false;
17+
}
18+
return !(0, _isImage.default)(filename) && !(0, _isVideo.default)(filename) && !(0, _isAudioFilepath.default)(filename);
19+
}

0 commit comments

Comments
 (0)