import from CSON file api

This commit is contained in:
Simon Leigh 2019-12-09 17:41:31 +09:00
parent 49d6be920f
commit 6256e14b5f
4 changed files with 96 additions and 0 deletions

12
package-lock.json generated
View File

@ -3846,6 +3846,11 @@
"resolved": "https://registry.npmjs.org/codemirror/-/codemirror-5.49.0.tgz", "resolved": "https://registry.npmjs.org/codemirror/-/codemirror-5.49.0.tgz",
"integrity": "sha512-Hyzr0HToBdZpLBN9dYFO/KlJAsKH37/cXVHPAqa+imml0R92tb9AkmsvjnXL+SluEvjjdfkDgRjc65NG5jnMYA==" "integrity": "sha512-Hyzr0HToBdZpLBN9dYFO/KlJAsKH37/cXVHPAqa+imml0R92tb9AkmsvjnXL+SluEvjjdfkDgRjc65NG5jnMYA=="
}, },
"coffeescript": {
"version": "2.4.1",
"resolved": "https://registry.npmjs.org/coffeescript/-/coffeescript-2.4.1.tgz",
"integrity": "sha512-34GV1aHrsMpTaO3KfMJL40ZNuvKDR/g98THHnE9bQj8HjMaZvSrLik99WWqyMhRtbe8V5hpx5iLgdcSvM/S2wg=="
},
"collapse-white-space": { "collapse-white-space": {
"version": "1.0.4", "version": "1.0.4",
"resolved": "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-1.0.4.tgz", "resolved": "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-1.0.4.tgz",
@ -4338,6 +4343,13 @@
"resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-3.1.9-1.tgz", "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-3.1.9-1.tgz",
"integrity": "sha1-/aGedh/Ad+Af+/3G6f38WeiAbNg=" "integrity": "sha1-/aGedh/Ad+Af+/3G6f38WeiAbNg="
}, },
"cson-parser": {
"version": "git+https://github.com/ButteryCrumpet/cson-parser.git#8d9e9d15ceabe2059459e699bb6c07c654c7bea0",
"from": "git+https://github.com/ButteryCrumpet/cson-parser.git",
"requires": {
"coffeescript": "^2.4.1"
}
},
"css-color-keywords": { "css-color-keywords": {
"version": "1.0.0", "version": "1.0.0",
"resolved": "https://registry.npmjs.org/css-color-keywords/-/css-color-keywords-1.0.0.tgz", "resolved": "https://registry.npmjs.org/css-color-keywords/-/css-color-keywords-1.0.0.tgz",

View File

@ -94,6 +94,7 @@
"classcat": "^4.0.2", "classcat": "^4.0.2",
"codemirror": "^5.49.0", "codemirror": "^5.49.0",
"copy-webpack-plugin": "^5.0.4", "copy-webpack-plugin": "^5.0.4",
"cson-parser": "git+https://github.com/ButteryCrumpet/cson-parser.git",
"dotenv": "^8.2.0", "dotenv": "^8.2.0",
"filenamify": "^2.1.0", "filenamify": "^2.1.0",
"hast-util-sanitize": "^2.0.1", "hast-util-sanitize": "^2.0.1",

72
src/lib/legacy-import.ts Normal file
View File

@ -0,0 +1,72 @@
import { readAsText } from './utils/files'
import { parse } from 'cson-parser'
import ow from 'ow'
type ParseErrors = 'read_error' | 'parse_error' | 'not_markdown'
type ParsedNote = {
content: string
tags: string[]
title: string
}
type ConvertResult =
| { err: true; data: ParseErrors }
| { err: false; data: ParsedNote }
export const convertCSONFileToNote = async (
file: File
): Promise<ConvertResult> => {
const text = await readFile(file)
if (text === 'read_error') {
return { err: true, data: text }
}
const parsed = await parseCSON(text)
if (parsed === 'parse_error') {
return { err: true, data: parsed }
}
const validated = validateNoteSchema(parsed)
if (validated === 'parse_error') {
return { err: true, data: validated }
}
const { type, content, title, tags } = validated
if (type !== 'MARKDOWN_NOTE') {
return { err: true, data: 'not_markdown' }
}
return { err: false, data: { content, title, tags } }
}
const readFile = (file: File) => readAsText(file).catch(() => 'read_error')
const parseCSON = (text: string) => {
try {
return parse(text)
} catch {
return 'parse_error'
}
}
const validateNoteSchema = (
obj: any
): ParsedNote & { type: string } | 'parse_error' => {
const validator = ow.object.partialShape({
tags: ow.optional.array.ofType(ow.string),
content: ow.string,
title: ow.string,
type: ow.string
})
try {
ow(obj, validator)
return obj
} catch (e) {
console.log(e)
return 'parse_error'
}
}

11
src/lib/utils/files.ts Normal file
View File

@ -0,0 +1,11 @@
export const readAsText = (file: File): Promise<string> => {
return new Promise((res, rej) => {
const reader = new FileReader()
reader.onload = e => res(e.target!.result as string)
reader.onerror = () => {
reader.abort()
rej()
}
reader.readAsText(file)
})
}