From 244a0abed5a65dbeb480568899e288d985518b62 Mon Sep 17 00:00:00 2001 From: chungyau97 Date: Mon, 24 Apr 2023 23:47:54 +0700 Subject: [PATCH] add JSON loader --- .../nodes/documentloaders/Json/Json.ts | 74 +++++++++++++++++++ .../nodes/documentloaders/Json/json.svg | 7 ++ 2 files changed, 81 insertions(+) create mode 100644 packages/components/nodes/documentloaders/Json/Json.ts create mode 100644 packages/components/nodes/documentloaders/Json/json.svg diff --git a/packages/components/nodes/documentloaders/Json/Json.ts b/packages/components/nodes/documentloaders/Json/Json.ts new file mode 100644 index 000000000..f928b3f40 --- /dev/null +++ b/packages/components/nodes/documentloaders/Json/Json.ts @@ -0,0 +1,74 @@ +import { INode, INodeData, INodeParams } from '../../../src/Interface' +import { TextSplitter } from 'langchain/text_splitter' +import { JSONLoader } from 'langchain/document_loaders/fs/json' + +class Json_DocumentLoaders implements INode { + label: string + name: string + description: string + type: string + icon: string + category: string + baseClasses: string[] + inputs: INodeParams[] + + constructor() { + this.label = 'Json File' + this.name = 'jsonFile' + this.type = 'Document' + this.icon = 'json.svg' + this.category = 'Document Loaders' + this.description = `Load data from JSON files` + this.baseClasses = [this.type] + this.inputs = [ + { + label: 'Json File', + name: 'jsonFile', + type: 'file', + fileType: '.json' + }, + { + label: 'Text Splitter', + name: 'textSplitter', + type: 'TextSplitter', + optional: true + }, + { + label: 'Pointers Extraction (separated by commas)', + name: 'pointersName', + type: 'string', + description: 'Extracting multiple pointers', + placeholder: 'Enter pointers name', + optional: true + } + ] + } + + async init(nodeData: INodeData): Promise { + const textSplitter = nodeData.inputs?.textSplitter as TextSplitter + const jsonFileBase64 = nodeData.inputs?.jsonFile as string + const pointersName = nodeData.inputs?.pointersName as string + const splitDataURI = jsonFileBase64.split(',') + splitDataURI.pop() + const bf = Buffer.from(splitDataURI.pop() || '', 'base64') + + let pointers: string[] = [] + if (pointersName) { + const outputString = pointersName.replace(/[^a-zA-Z0-9,]+/g, ',') + pointers = outputString.split(',').map((pointer) => "/" + pointer.trim()) + } + + const blob = new Blob([bf]) + const loader = new JSONLoader(blob, pointers.length != 0 ? pointers : undefined) + + if (textSplitter) { + const docs = await loader.loadAndSplit(textSplitter) + return docs + } else { + const docs = await loader.load() + return docs + } + } +} + +module.exports = { nodeClass: Json_DocumentLoaders } diff --git a/packages/components/nodes/documentloaders/Json/json.svg b/packages/components/nodes/documentloaders/Json/json.svg new file mode 100644 index 000000000..c27646e2d --- /dev/null +++ b/packages/components/nodes/documentloaders/Json/json.svg @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file