refactor: handle larger files in importer (#2692)
This commit is contained in:
@@ -4,11 +4,11 @@
|
||||
|
||||
import { jsonTextContentData, htmlTestData, jsonListContentData } from './testData'
|
||||
import { GoogleKeepConverter } from './GoogleKeepConverter'
|
||||
import { ContentType, DecryptedTransferPayload, NoteContent } from '@standardnotes/snjs'
|
||||
import { CreateNoteFn } from '../Converter'
|
||||
import { ContentType, SNNote } from '@standardnotes/snjs'
|
||||
import { InsertNoteFn } from '../Converter'
|
||||
|
||||
describe('GoogleKeepConverter', () => {
|
||||
const createNote: CreateNoteFn = ({ title, text, createdAt, updatedAt, trashed, archived, pinned }) =>
|
||||
const insertNote: InsertNoteFn = async ({ title, text, createdAt, updatedAt, trashed, archived, pinned }) =>
|
||||
({
|
||||
uuid: Math.random().toString(),
|
||||
created_at: createdAt,
|
||||
@@ -22,12 +22,12 @@ describe('GoogleKeepConverter', () => {
|
||||
pinned,
|
||||
references: [],
|
||||
},
|
||||
}) as unknown as DecryptedTransferPayload<NoteContent>
|
||||
}) as unknown as SNNote
|
||||
|
||||
it('should parse json data', () => {
|
||||
it('should parse json data', async () => {
|
||||
const converter = new GoogleKeepConverter()
|
||||
|
||||
const textContent = converter.tryParseAsJson(jsonTextContentData, createNote, (md) => md)
|
||||
const textContent = await converter.tryParseAsJson(jsonTextContentData, insertNote, (md) => md)
|
||||
|
||||
expect(textContent).not.toBeNull()
|
||||
expect(textContent?.created_at).toBeInstanceOf(Date)
|
||||
@@ -40,7 +40,7 @@ describe('GoogleKeepConverter', () => {
|
||||
expect(textContent?.content.archived).toBe(false)
|
||||
expect(textContent?.content.pinned).toBe(false)
|
||||
|
||||
const listContent = converter.tryParseAsJson(jsonListContentData, createNote, (md) => md)
|
||||
const listContent = await converter.tryParseAsJson(jsonListContentData, insertNote, (md) => md)
|
||||
|
||||
expect(listContent).not.toBeNull()
|
||||
expect(listContent?.created_at).toBeInstanceOf(Date)
|
||||
@@ -54,15 +54,15 @@ describe('GoogleKeepConverter', () => {
|
||||
expect(textContent?.content.pinned).toBe(false)
|
||||
})
|
||||
|
||||
it('should parse html data', () => {
|
||||
it('should parse html data', async () => {
|
||||
const converter = new GoogleKeepConverter()
|
||||
|
||||
const result = converter.tryParseAsHtml(
|
||||
const result = await converter.tryParseAsHtml(
|
||||
htmlTestData,
|
||||
{
|
||||
name: 'note-2.html',
|
||||
},
|
||||
createNote,
|
||||
insertNote,
|
||||
(html) => html,
|
||||
false,
|
||||
)
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import { DecryptedTransferPayload, NoteContent } from '@standardnotes/models'
|
||||
import { Converter, CreateNoteFn } from '../Converter'
|
||||
import { SNNote } from '@standardnotes/models'
|
||||
import { Converter, InsertNoteFn } from '../Converter'
|
||||
|
||||
type Content =
|
||||
| {
|
||||
@@ -45,32 +45,31 @@ export class GoogleKeepConverter implements Converter {
|
||||
|
||||
convert: Converter['convert'] = async (
|
||||
file,
|
||||
{ createNote, canUseSuper, convertHTMLToSuper, convertMarkdownToSuper, readFileAsText },
|
||||
{ insertNote: createNote, canUseSuper, convertHTMLToSuper, convertMarkdownToSuper, readFileAsText },
|
||||
) => {
|
||||
const content = await readFileAsText(file)
|
||||
|
||||
const possiblePayloadFromJson = this.tryParseAsJson(content, createNote, convertMarkdownToSuper)
|
||||
const note =
|
||||
(await this.tryParseAsJson(content, createNote, convertMarkdownToSuper)) ||
|
||||
(await this.tryParseAsHtml(content, file, createNote, convertHTMLToSuper, canUseSuper))
|
||||
|
||||
if (possiblePayloadFromJson) {
|
||||
return [possiblePayloadFromJson]
|
||||
}
|
||||
|
||||
const possiblePayloadFromHtml = this.tryParseAsHtml(content, file, createNote, convertHTMLToSuper, canUseSuper)
|
||||
|
||||
if (possiblePayloadFromHtml) {
|
||||
return [possiblePayloadFromHtml]
|
||||
if (note) {
|
||||
return {
|
||||
successful: [note],
|
||||
errored: [],
|
||||
}
|
||||
}
|
||||
|
||||
throw new Error('Could not parse Google Keep backup file')
|
||||
}
|
||||
|
||||
tryParseAsHtml(
|
||||
async tryParseAsHtml(
|
||||
data: string,
|
||||
file: { name: string },
|
||||
createNote: CreateNoteFn,
|
||||
insertNote: InsertNoteFn,
|
||||
convertHTMLToSuper: (html: string) => string,
|
||||
canUseSuper: boolean,
|
||||
): DecryptedTransferPayload<NoteContent> {
|
||||
): Promise<SNNote> {
|
||||
const rootElement = document.createElement('html')
|
||||
rootElement.innerHTML = data
|
||||
|
||||
@@ -119,7 +118,7 @@ export class GoogleKeepConverter implements Converter {
|
||||
|
||||
const title = rootElement.getElementsByClassName('title')[0]?.textContent || file.name
|
||||
|
||||
return createNote({
|
||||
return await insertNote({
|
||||
createdAt: date,
|
||||
updatedAt: date,
|
||||
title: title,
|
||||
@@ -150,11 +149,11 @@ export class GoogleKeepConverter implements Converter {
|
||||
)
|
||||
}
|
||||
|
||||
tryParseAsJson(
|
||||
async tryParseAsJson(
|
||||
data: string,
|
||||
createNote: CreateNoteFn,
|
||||
createNote: InsertNoteFn,
|
||||
convertMarkdownToSuper: (md: string) => string,
|
||||
): DecryptedTransferPayload<NoteContent> | null {
|
||||
): Promise<SNNote | null> {
|
||||
try {
|
||||
const parsed = JSON.parse(data) as GoogleKeepJsonNote
|
||||
if (!GoogleKeepConverter.isValidGoogleKeepJson(parsed)) {
|
||||
@@ -172,7 +171,7 @@ export class GoogleKeepConverter implements Converter {
|
||||
.join('\n')
|
||||
}
|
||||
text = convertMarkdownToSuper(text)
|
||||
return createNote({
|
||||
return await createNote({
|
||||
createdAt: date,
|
||||
updatedAt: date,
|
||||
title: parsed.title,
|
||||
|
||||
Reference in New Issue
Block a user