mirror of
https://github.com/BoostIo/Boostnote
synced 2025-12-13 01:36:22 +00:00
111 lines
3.3 KiB
JavaScript
111 lines
3.3 KiB
JavaScript
const _ = require('lodash')
|
|
const keygen = require('browser/lib/keygen')
|
|
const resolveStorageData = require('./resolveStorageData')
|
|
const consts = require('browser/lib/consts')
|
|
const CSON = require('@rokt33r/season')
|
|
const path = require('path')
|
|
const sander = require('sander')
|
|
|
|
function migrateFromV5Storage (storageKey, data) {
|
|
let targetStorage
|
|
try {
|
|
const cachedStorageList = JSON.parse(localStorage.getItem('storages'))
|
|
if (!_.isArray(cachedStorageList)) throw new Error('Target storage doesn\'t exist.')
|
|
|
|
targetStorage = _.find(cachedStorageList, {key: storageKey})
|
|
if (targetStorage == null) throw new Error('Target storage doesn\'t exist.')
|
|
} catch (e) {
|
|
return Promise.reject(e)
|
|
}
|
|
return resolveStorageData(targetStorage)
|
|
.then(function (storage) {
|
|
return importAll(storage, data)
|
|
})
|
|
}
|
|
|
|
function importAll (storage, data) {
|
|
const oldArticles = data.articles
|
|
const notes = []
|
|
data.folders
|
|
.forEach(function (oldFolder) {
|
|
let folderKey = keygen()
|
|
while (storage.folders.some((folder) => folder.key === folderKey)) {
|
|
folderKey = keygen()
|
|
}
|
|
const newFolder = {
|
|
key: folderKey,
|
|
name: oldFolder.name,
|
|
color: consts.FOLDER_COLORS[Math.floor(Math.random() * 7) % 7]
|
|
}
|
|
|
|
storage.folders.push(newFolder)
|
|
|
|
const articles = oldArticles.filter((article) => article.FolderKey === oldFolder.key)
|
|
articles.forEach((article) => {
|
|
let noteKey = keygen()
|
|
let isUnique = false
|
|
while (!isUnique) {
|
|
try {
|
|
sander.statSync(path.join(storage.path, 'notes', noteKey + '.cson'))
|
|
noteKey = keygen()
|
|
} catch (err) {
|
|
if (err.code === 'ENOENT') {
|
|
isUnique = true
|
|
} else {
|
|
console.error('Failed to read `notes` directory.')
|
|
throw err
|
|
}
|
|
}
|
|
}
|
|
|
|
if (article.mode === 'markdown') {
|
|
const newNote = {
|
|
tags: article.tags,
|
|
createdAt: article.createdAt,
|
|
updatedAt: article.updatedAt,
|
|
folder: folderKey,
|
|
storage: storage.key,
|
|
type: 'MARKDOWN_NOTE',
|
|
isStarred: false,
|
|
title: article.title,
|
|
content: '# ' + article.title + '\n\n' + article.content,
|
|
key: noteKey
|
|
}
|
|
notes.push(newNote)
|
|
} else {
|
|
const newNote = {
|
|
tags: article.tags,
|
|
createdAt: article.createdAt,
|
|
updatedAt: article.updatedAt,
|
|
folder: folderKey,
|
|
storage: storage.key,
|
|
type: 'SNIPPET_NOTE',
|
|
isStarred: false,
|
|
title: article.title,
|
|
description: article.title,
|
|
key: noteKey,
|
|
snippets: [{
|
|
name: article.mode,
|
|
mode: article.mode,
|
|
content: article.content
|
|
}]
|
|
}
|
|
notes.push(newNote)
|
|
}
|
|
})
|
|
})
|
|
|
|
notes.forEach(function (note) {
|
|
CSON.writeFileSync(path.join(storage.path, 'notes', note.key + '.cson'), _.omit(note, ['storage', 'key']))
|
|
})
|
|
|
|
CSON.writeFileSync(path.join(storage.path, 'boostnote.json'), _.pick(storage, ['version', 'folders']))
|
|
|
|
return {
|
|
storage,
|
|
notes
|
|
}
|
|
}
|
|
|
|
module.exports = migrateFromV5Storage
|