1
0
mirror of https://github.com/laurent22/joplin.git synced 2024-12-18 09:35:20 +02:00
joplin/packages/lib/fs-driver-node.ts

205 lines
5.3 KiB
TypeScript
Raw Normal View History

import FsDriverBase, { Stat } from './fs-driver-base';
import time from './time';
2022-11-13 13:37:05 +02:00
const md5File = require('md5-file');
const fs = require('fs-extra');
2017-07-05 23:52:31 +02:00
Plugins: Added support for content scripts - For now, supports Markdown-it plugins - Also fixed slow rendering of notes in some cases - Simplified how Markdown-It plugins are created and cleaned MdToHtml code commit 89576de2896c99134f25f2a2db25008514cb1315 Merge: c75aa21f 5292fc14 Author: Laurent Cozic <laurent@cozic.net> Date: Wed Oct 21 00:23:00 2020 +0100 Merge branch 'release-1.3' into plugin_content_scripts commit c75aa21ffdc42764d71dc9deadba7a7ef4233995 Author: Laurent Cozic <laurent@cozic.net> Date: Wed Oct 21 00:19:52 2020 +0100 Fixed tests commit 075187729d11a16d385b651cbf1ebb89f14935e0 Author: Laurent Cozic <laurent@cozic.net> Date: Wed Oct 21 00:11:53 2020 +0100 Fixed tests commit 14696b8c651e7afdaf71269bcdbadf0d58d3ef8a Author: Laurent Cozic <laurent@cozic.net> Date: Tue Oct 20 23:27:58 2020 +0100 Fixed slow rendering of note commit 61c09f5bf856481f91b00cfe87ff05596c63d4bc Author: Laurent Cozic <laurent@cozic.net> Date: Tue Oct 20 22:35:21 2020 +0100 Clean up commit 9f7ea7d865a990b3a21cc8c59093390d9db61653 Author: Laurent Cozic <laurent@cozic.net> Date: Tue Oct 20 20:05:31 2020 +0100 Updated doc commit 98bf3bde8d6663f2f91ff965304b4aac00bdd98b Author: Laurent Cozic <laurent@cozic.net> Date: Tue Oct 20 19:56:34 2020 +0100 Finished converting plugins commit fe90d92e01427bd2b38200393713ea28763507a9 Author: Laurent Cozic <laurent@cozic.net> Date: Tue Oct 20 17:52:02 2020 +0100 Simplified how Markdown-It plugins are created commit 47c7b864cbb864d5df79849f27625aecf312df4b Author: Laurent Cozic <laurent@cozic.net> Date: Mon Oct 19 16:40:11 2020 +0100 Clean up rules commit d927a238bb635a4be45f9216d776f7d07cb0a584 Author: Laurent Cozic <laurent@cozic.net> Date: Mon Oct 19 14:29:40 2020 +0100 Fixed tests commit 388a56c5dde4c382e3ee0035791137150adaba1b Author: Laurent Cozic <laurent@cozic.net> Date: Mon Oct 19 14:00:47 2020 +0100 Add support for content scripts
2020-10-21 01:23:55 +02:00
export default class FsDriverNode extends FsDriverBase {
private fsErrorToJsError_(error: any, path: string = null) {
2018-01-28 19:36:36 +02:00
let msg = error.toString();
2019-09-19 23:51:18 +02:00
if (path !== null) msg += `. Path: ${path}`;
const output: any = new Error(msg);
2018-01-28 19:36:36 +02:00
if (error.code) output.code = error.code;
return output;
}
public appendFileSync(path: string, string: string) {
2017-07-05 23:52:31 +02:00
return fs.appendFileSync(path, string);
}
public async appendFile(path: string, string: string, encoding = 'base64') {
2018-01-28 19:36:36 +02:00
try {
return await fs.appendFile(path, string, { encoding: encoding });
} catch (error) {
throw this.fsErrorToJsError_(error, path);
}
}
public async writeFile(path: string, string: string, encoding = 'base64') {
2018-01-28 19:36:36 +02:00
try {
if (encoding === 'buffer') {
return await fs.writeFile(path, string);
} else {
return await fs.writeFile(path, string, { encoding: encoding });
}
2018-01-28 19:36:36 +02:00
} catch (error) {
throw this.fsErrorToJsError_(error, path);
}
}
// same as rm -rf
public async remove(path: string) {
2018-01-28 19:36:36 +02:00
try {
const r = await fs.remove(path);
return r;
2018-01-28 19:36:36 +02:00
} catch (error) {
throw this.fsErrorToJsError_(error, path);
}
}
public async move(source: string, dest: string) {
let lastError = null;
for (let i = 0; i < 5; i++) {
try {
const output = await fs.move(source, dest, { overwrite: true });
return output;
} catch (error) {
lastError = error;
// Normally cannot happen with the `overwrite` flag but sometime it still does.
// In this case, retry.
2022-07-23 11:33:12 +02:00
if (error.code === 'EEXIST') {
await time.sleep(1);
continue;
}
2018-01-28 19:36:36 +02:00
throw this.fsErrorToJsError_(error);
}
}
throw lastError;
}
public exists(path: string) {
return fs.pathExists(path);
}
public async mkdir(path: string) {
// Note that mkdirp() does not throw an error if the directory
// could not be created. This would make the synchroniser to
// incorrectly try to sync with a non-existing dir:
// https://github.com/laurent22/joplin/issues/2117
const r = await fs.mkdirp(path);
if (!(await this.exists(path))) throw new Error(`Could not create directory: ${path}`);
return r;
}
public async stat(path: string): Promise<Stat> {
try {
const stat = await fs.stat(path);
return {
birthtime: stat.birthtime,
mtime: stat.mtime,
isDirectory: () => stat.isDirectory(),
path: path,
size: stat.size,
};
} catch (error) {
2022-07-23 11:33:12 +02:00
if (error.code === 'ENOENT') return null;
throw error;
}
}
public async setTimestamp(path: string, timestampDate: any) {
return fs.utimes(path, timestampDate, timestampDate);
}
public async readDirStats(path: string, options: any = null) {
if (!options) options = {};
if (!('recursive' in options)) options.recursive = false;
2018-02-26 20:43:50 +02:00
let items = [];
try {
items = await fs.readdir(path);
} catch (error) {
throw this.fsErrorToJsError_(error);
}
let output: Stat[] = [];
for (let i = 0; i < items.length; i++) {
const item = items[i];
const stat = await this.stat(`${path}/${item}`);
if (!stat) continue; // Has been deleted between the readdir() call and now
stat.path = stat.path.substr(path.length + 1);
output.push(stat);
output = await this.readDirStatsHandleRecursion_(path, stat, output, options);
}
return output;
}
public async open(path: string, mode: any) {
2018-01-28 19:36:36 +02:00
try {
return await fs.open(path, mode);
} catch (error) {
throw this.fsErrorToJsError_(error, path);
}
}
public async close(handle: any) {
2018-01-28 19:36:36 +02:00
try {
return await fs.close(handle);
} catch (error) {
throw this.fsErrorToJsError_(error, '');
2018-01-28 19:36:36 +02:00
}
}
public async readFile(path: string, encoding = 'utf8') {
try {
if (encoding === 'Buffer') return await fs.readFile(path); // Returns the raw buffer
return await fs.readFile(path, encoding);
} catch (error) {
throw this.fsErrorToJsError_(error, path);
}
}
// Always overwrite destination
public async copy(source: string, dest: string) {
try {
return await fs.copy(source, dest, { overwrite: true });
} catch (error) {
throw this.fsErrorToJsError_(error, source);
}
2017-07-05 23:52:31 +02:00
}
public async chmod(source: string, mode: string | number) {
return fs.chmod(source, mode);
}
public async unlink(path: string) {
try {
await fs.unlink(path);
} catch (error) {
if (error.code === 'ENOENT') return; // Don't throw if the file does not exist
throw error;
}
}
public async readFileChunk(handle: any, length: number, encoding = 'base64') {
2019-10-09 21:35:13 +02:00
// let buffer = new Buffer(length);
2018-09-27 20:35:10 +02:00
let buffer = Buffer.alloc(length);
2017-12-23 22:21:11 +02:00
const result = await fs.read(handle, buffer, 0, length, null);
if (!result.bytesRead) return null;
2017-12-23 22:21:11 +02:00
buffer = buffer.slice(0, result.bytesRead);
if (encoding === 'base64') return buffer.toString('base64');
if (encoding === 'ascii') return buffer.toString('ascii');
2019-09-19 23:51:18 +02:00
throw new Error(`Unsupported encoding: ${encoding}`);
}
public resolve(...pathComponents: string[]) {
return require('path').resolve(...pathComponents);
Plugins: Added support for content scripts - For now, supports Markdown-it plugins - Also fixed slow rendering of notes in some cases - Simplified how Markdown-It plugins are created and cleaned MdToHtml code commit 89576de2896c99134f25f2a2db25008514cb1315 Merge: c75aa21f 5292fc14 Author: Laurent Cozic <laurent@cozic.net> Date: Wed Oct 21 00:23:00 2020 +0100 Merge branch 'release-1.3' into plugin_content_scripts commit c75aa21ffdc42764d71dc9deadba7a7ef4233995 Author: Laurent Cozic <laurent@cozic.net> Date: Wed Oct 21 00:19:52 2020 +0100 Fixed tests commit 075187729d11a16d385b651cbf1ebb89f14935e0 Author: Laurent Cozic <laurent@cozic.net> Date: Wed Oct 21 00:11:53 2020 +0100 Fixed tests commit 14696b8c651e7afdaf71269bcdbadf0d58d3ef8a Author: Laurent Cozic <laurent@cozic.net> Date: Tue Oct 20 23:27:58 2020 +0100 Fixed slow rendering of note commit 61c09f5bf856481f91b00cfe87ff05596c63d4bc Author: Laurent Cozic <laurent@cozic.net> Date: Tue Oct 20 22:35:21 2020 +0100 Clean up commit 9f7ea7d865a990b3a21cc8c59093390d9db61653 Author: Laurent Cozic <laurent@cozic.net> Date: Tue Oct 20 20:05:31 2020 +0100 Updated doc commit 98bf3bde8d6663f2f91ff965304b4aac00bdd98b Author: Laurent Cozic <laurent@cozic.net> Date: Tue Oct 20 19:56:34 2020 +0100 Finished converting plugins commit fe90d92e01427bd2b38200393713ea28763507a9 Author: Laurent Cozic <laurent@cozic.net> Date: Tue Oct 20 17:52:02 2020 +0100 Simplified how Markdown-It plugins are created commit 47c7b864cbb864d5df79849f27625aecf312df4b Author: Laurent Cozic <laurent@cozic.net> Date: Mon Oct 19 16:40:11 2020 +0100 Clean up rules commit d927a238bb635a4be45f9216d776f7d07cb0a584 Author: Laurent Cozic <laurent@cozic.net> Date: Mon Oct 19 14:29:40 2020 +0100 Fixed tests commit 388a56c5dde4c382e3ee0035791137150adaba1b Author: Laurent Cozic <laurent@cozic.net> Date: Mon Oct 19 14:00:47 2020 +0100 Add support for content scripts
2020-10-21 01:23:55 +02:00
}
2021-01-27 19:42:58 +02:00
public async md5File(path: string): Promise<string> {
return md5File(path);
}
public async tarExtract(options: any) {
await require('tar').extract(options);
}
public async tarCreate(options: any, filePaths: string[]) {
await require('tar').create(options, filePaths);
}
2017-07-05 23:52:31 +02:00
}