mirror of
https://github.com/BoostIO/BoostNote-App.git
synced 2024-10-04 16:18:06 +03:00
import from CSON file api
This commit is contained in:
parent
49d6be920f
commit
6256e14b5f
12
package-lock.json
generated
12
package-lock.json
generated
@ -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",
|
||||||
|
@ -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
72
src/lib/legacy-import.ts
Normal 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
11
src/lib/utils/files.ts
Normal 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)
|
||||||
|
})
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user