refactor: handle larger files in importer (#2692)

This commit is contained in:
Aman Harwara
2023-12-11 16:30:31 +05:30
committed by GitHub
parent 63e69b5e4b
commit 82d5a36932
22 changed files with 614 additions and 513 deletions

View File

@@ -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,
)

View File

@@ -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,