diff --git a/.github/CHANGELOG.md b/.github/CHANGELOG.md index dec218f6..06ed3d98 100644 --- a/.github/CHANGELOG.md +++ b/.github/CHANGELOG.md @@ -12,6 +12,7 @@ - fix: #81 - fix: #55 - fix: #63 +- fix: crash on first launch due missing directory (#78, #90, #93) ### 0.8.12 diff --git a/package-lock.json b/package-lock.json index 4dea91f0..e6e4a199 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "marktext", - "version": "0.7.17", + "version": "0.8.12", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -6347,6 +6347,19 @@ "ms": "2.0.0" } }, + "fs-extra": { + "version": "0.30.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz", + "integrity": "sha1-8jP/zAjU2n1DLapEl3aYnbHfk/A=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "jsonfile": "2.4.0", + "klaw": "1.3.1", + "path-is-absolute": "1.0.1", + "rimraf": "2.6.2" + } + }, "minimist": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", @@ -8275,16 +8288,23 @@ "integrity": "sha1-mC1ok6+RjnLQjeyehnP/K1qNat0=" }, "fs-extra": { - "version": "0.30.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz", - "integrity": "sha1-8jP/zAjU2n1DLapEl3aYnbHfk/A=", - "dev": true, + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-5.0.0.tgz", + "integrity": "sha512-66Pm4RYbjzdyeuqudYqhFiNBbCIuI9kgRqLPSHIlXHidW8NIQtVdkM1yeZ4lXwuhbTETv3EUGMNHAAw6hiundQ==", "requires": { "graceful-fs": "4.1.11", - "jsonfile": "2.4.0", - "klaw": "1.3.1", - "path-is-absolute": "1.0.1", - "rimraf": "2.6.2" + "jsonfile": "4.0.0", + "universalify": "0.1.1" + }, + "dependencies": { + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "requires": { + "graceful-fs": "4.1.11" + } + } } }, "fs-extra-p": { @@ -8776,8 +8796,7 @@ "jsbn": { "version": "0.1.1", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "json-schema": { "version": "0.2.3", @@ -22479,8 +22498,7 @@ "universalify": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.1.tgz", - "integrity": "sha1-+nG63UQ3r0wUiEHjs7Fl+enlkLc=", - "dev": true + "integrity": "sha1-+nG63UQ3r0wUiEHjs7Fl+enlkLc=" }, "unpipe": { "version": "1.0.0", diff --git a/package.json b/package.json index fa138dd7..d5fa503b 100644 --- a/package.json +++ b/package.json @@ -83,6 +83,7 @@ "electron-window-state": "^4.1.1", "element-ui": "^2.1.0", "file-icons-js": "^1.0.3", + "fs-extra": "^5.0.0", "js-beautify": "^1.7.5", "mousetrap": "^1.6.1", "npm": "^5.7.1", diff --git a/src/main/preference.js b/src/main/preference.js index 8ee1d99b..65f7188f 100644 --- a/src/main/preference.js +++ b/src/main/preference.js @@ -2,7 +2,7 @@ import fs from 'fs' import path from 'path' import { ipcMain, BrowserWindow } from 'electron' import { windows } from './createWindow' -import { getPath, log } from './utils' +import { getPath, log, mkdir } from './utils' const FILE_NAME = 'preference.md' const staticPath = path.join(__static, FILE_NAME) @@ -15,6 +15,7 @@ class Preference { this.userDataPath = userDataPath if (!fs.existsSync(userDataPath)) { + mkdir(getPath('userData')) const content = fs.readFileSync(staticPath, 'utf-8') fs.writeFileSync(userDataPath, content, 'utf-8') } diff --git a/src/main/utils.js b/src/main/utils.js index 593f68e6..48333b9a 100644 --- a/src/main/utils.js +++ b/src/main/utils.js @@ -1,5 +1,6 @@ import fs from 'fs' import path from 'path' +import fse from 'fs-extra' import { app, Menu } from 'electron' import { EXTENSIONS } from './config' @@ -16,6 +17,7 @@ export const log = data => { if (typeof data !== 'string') data = (data.stack || data).toString() const LOG_DATA_PATH = path.join(getPath('userData'), 'error.log') const LOG_TIME = new Date().toLocaleString() + mkdir(getPath('userData')) fs.appendFileSync(LOG_DATA_PATH, `\n${LOG_TIME}\n${data}\n`) } @@ -42,3 +44,14 @@ export const isFile = filepath => { export const isMarkdownFile = filepath => { return isFile(filepath) && hasMarkdownExtension(filepath) } + +// creates a directory if it doesn't already exist. +export const mkdir = function (dirPath) { + try { + fse.ensureDirSync(dirPath) + } catch (e) { + if (e.code !== 'EEXIST') { + throw e + } + } +}