mirror of
https://github.com/BoostIo/Boostnote
synced 2025-12-12 17:26:17 +00:00
122 lines
3.3 KiB
JavaScript
122 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,
|
|
linesHighlighted: article.linesHighlighted
|
|
}
|
|
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,
|
|
linesHighlighted: article.linesHighlighted
|
|
}
|
|
]
|
|
}
|
|
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
|