@paulof25/emoji-separated-values
Version:
emoji-separated-values (or simply ESV) is your new favorite npm package for handling text-based data. Forget about boring commas โ we use emojis as delimiters. Because why not?
1 lines โข 31.6 kB
Source Map (JSON)
{"version":3,"sources":["../src/index.ts","../src/infra/fs/FileSystemEsvRepository.ts","../src/core/useCases/ReadEsv.ts","../src/core/useCases/WriteEsv.ts","../src/core/entities/EsvFilter.ts","../src/infra/ops/Operations.ts","../src/core/useCases/FilterEsv.ts","../src/core/useCases/UpdateEsv.ts","../src/core/useCases/DeleteEsv.ts","../src/viewNodel/EsvViewModel.ts"],"sourcesContent":["import { EsvViewModel } from \"./viewNodel/EsvViewModel.ts\";\r\nimport { type EsvRow } from \"./core/entities/EsvRow.ts\";\r\nimport { type EsvFilter } from \"./core/entities/EsvFilter.ts\";\r\nimport { FileSystemEsvRepository } from \"./infra/fs/FileSystemEsvRepository.ts\";\r\n\r\nexport const QuickEsv = EsvViewModel;\r\nexport const ManualEsv = FileSystemEsvRepository;\r\nexport type EsvRowType = EsvRow;\r\nexport type EsvFilterType = EsvFilter;\r\nexport { EsvFilterOperator } from \"./core/entities/EsvFilter.ts\";\r\nexport * from \"./infra/ops/Operations.ts\";\r\n","import { type EsvRow } from \"../../core/entities/EsvRow.ts\";\r\nimport ReadLine from \"readline\";\r\nimport fs from \"fs\";\r\n\r\nexport class FileSystemEsvRepository {\r\n //le o arquivo e retorna um stream\r\n async readEsvFile(filePath: string) {\r\n const stream = fs.createReadStream(filePath, { encoding: \"utf-8\" });\r\n\r\n const reader = ReadLine.createInterface({\r\n input: stream,\r\n crlfDelay: Infinity,\r\n });\r\n\r\n return reader;\r\n }\r\n\r\n //cria um stream de escrita\r\n getFileWriteStream(filePath: string, flags: string = \"a\") {\r\n const stream = fs.createWriteStream(filePath, { encoding: \"utf-8\", flags: flags });\r\n return stream;\r\n }\r\n\r\n //escreve um arquivo\r\n async writeEsvFile(filePath: string, data: EsvRow[], separator: string, flags: string = \"a\") {\r\n const fileExists = await this.fileExists(filePath);\r\n const stream = fs.createWriteStream(filePath, { encoding: \"utf-8\", flags: flags });\r\n\r\n let lineCount = 0;\r\n\r\n if (!fileExists && data.length > 0) {\r\n const header = Object.keys(data[0]);\r\n const headerLine = header.map(this.escapeField).join(separator);\r\n stream.write(headerLine + \"\\n\");\r\n }\r\n\r\n for (const record of data) {\r\n const values = Object.values(record).map((value) => this.escapeField(String(value)));\r\n const line = values.join(separator);\r\n stream.write(line + \"\\n\");\r\n lineCount++;\r\n }\r\n stream.end();\r\n\r\n return new Promise<void>((resolve, reject) => {\r\n stream.on(\"finish\", () => {\r\n console.log(\"Esv file written successfully\");\r\n return resolve();\r\n });\r\n stream.on(\"error\", (error) => {\r\n return reject(error);\r\n });\r\n });\r\n }\r\n\r\n //funcao que renomeia um arquivo\r\n renameFile(oldPath: string, newPath: string) {\r\n fs.renameSync(oldPath, newPath);\r\n }\r\n\r\n //funcao que deleta um arquivo\r\n deleteFile(filePath: string) {\r\n fs.unlinkSync(filePath);\r\n }\r\n\r\n //funcao que escapa um campo que contenha as seguintes carateres: \", \\n\r\n escapeField(valor: string): string {\r\n if (/[\",\\n]/.test(valor)) {\r\n return `\"${valor.replace(/\"/g, '\"\"')}\"`;\r\n }\r\n return valor;\r\n }\r\n\r\n //funรงรฃo que divide uma linha em campos usando o emoji como separador\r\n splitEsvLine(line: string, separator: string): string[] {\r\n return line.split(separator);\r\n }\r\n\r\n //transforma uma linha em um objeto EsvRecord\r\n parseEsvLine(line: string, header: string[], separator: string): EsvRow {\r\n const values = this.splitEsvLine(line, separator);\r\n const record: EsvRow = {};\r\n\r\n for (let i = 0; i < header.length; i++) {\r\n record[header[i]] = values[i];\r\n }\r\n\r\n return record;\r\n }\r\n\r\n //funcao que normaliza um valor sem acento\r\n normalizeValue(value: string): string | number | boolean {\r\n const trimmedValue = value.trim();\r\n\r\n const normalized = trimmedValue.normalize(\"NFD\").replace(/[\\u0300-\\u036f]/g, \"\");\r\n\r\n return normalized;\r\n }\r\n\r\n //funcao que verifica se um arquivo existe\r\n async fileExists(filePath: string): Promise<boolean> {\r\n try {\r\n fs.accessSync(filePath);\r\n return true;\r\n } catch {\r\n return false;\r\n }\r\n }\r\n}\r\n","import { FileSystemEsvRepository } from \"../../infra/fs/FileSystemEsvRepository.ts\";\r\nimport { type EsvRow } from \"../entities/EsvRow.ts\";\r\n\r\nexport class ReadEsv {\r\n repository: FileSystemEsvRepository;\r\n\r\n constructor(repository: FileSystemEsvRepository) {\r\n this.repository = repository;\r\n }\r\n\r\n async execute(filePath: string, separator: string, skip?: number, limit?: number) {\r\n const reader = await this.repository.readEsvFile(filePath);\r\n\r\n let lineCount = 0;\r\n let header: string[] = [];\r\n const records: EsvRow[] = [];\r\n\r\n for await (const line of reader) {\r\n if (lineCount === 0) {\r\n header = this.repository\r\n .splitEsvLine(line, separator)\r\n .map((h) => this.repository.normalizeValue(h) as string);\r\n\r\n lineCount++;\r\n continue;\r\n }\r\n\r\n if (skip && skip > 0) {\r\n skip--;\r\n continue;\r\n }\r\n\r\n if (!line) {\r\n continue;\r\n }\r\n\r\n if (limit && lineCount > limit) {\r\n break;\r\n }\r\n\r\n lineCount++;\r\n const record = this.repository.parseEsvLine(line, header, separator);\r\n records.push(record);\r\n }\r\n\r\n reader.close();\r\n\r\n return records;\r\n }\r\n}\r\n","import { type EsvRow } from \"../entities/EsvRow.ts\";\r\nimport { FileSystemEsvRepository } from \"./../../infra/fs/FileSystemEsvRepository.ts\";\r\n\r\nexport class WriteEsv {\r\n repository: FileSystemEsvRepository;\r\n constructor(repository: FileSystemEsvRepository) {\r\n this.repository = repository;\r\n }\r\n\r\n async execute(filePath: string, data: EsvRow[], separator: string) {\r\n return await this.repository.writeEsvFile(filePath, data, separator);\r\n }\r\n}\r\n","export type EsvFilter = {\r\n field: string;\r\n operator: EsvFilterOperator;\r\n value: string | number | boolean;\r\n};\r\n\r\n\r\nexport enum EsvFilterOperator {\r\n Equals = \"equals\",\r\n NotEquals = \"notEquals\",\r\n Contains = \"contains\",\r\n NotContains = \"notContains\",\r\n StartsWith = \"startsWith\",\r\n NotStartsWith = \"notStartsWith\",\r\n EndsWith = \"endsWith\",\r\n NotEndsWith = \"notEndsWith\",\r\n GreaterThan = \"greaterThan\",\r\n LessThan = \"lessThan\",\r\n GreaterThanOrEqual = \"greaterThanOrEqual\",\r\n LessThanOrEqual = \"lessThanOrEqual\",\r\n}","import { type EsvRow } from \"../../core/entities/EsvRow.ts\";\r\nimport { EsvFilterOperator, type EsvFilter } from \"../../core/entities/EsvFilter.ts\";\r\n\r\nexport class Operations {\r\n filterRow(row: EsvRow, filters?: EsvFilter[]) {\r\n if (!filters) {\r\n return true;\r\n }\r\n let filtered = true;\r\n for (const filter of filters) {\r\n if (!this.switchOperations(filter.operator, filter, row)) {\r\n filtered = false;\r\n }\r\n }\r\n return filtered;\r\n }\r\n\r\n switchOperations(operation: EsvFilterOperator, filter: EsvFilter, row: EsvRow) {\r\n switch (operation) {\r\n case EsvFilterOperator.Equals:\r\n return row[filter.field] === filter.value;\r\n break;\r\n\r\n case EsvFilterOperator.NotEquals:\r\n return row[filter.field] !== filter.value;\r\n break;\r\n\r\n case EsvFilterOperator.Contains:\r\n const value = row[filter.field];\r\n if (typeof value === \"string\") return value.includes(filter.value.toString());\r\n break;\r\n\r\n case EsvFilterOperator.NotContains:\r\n const value2 = row[filter.field];\r\n if (typeof value2 === \"string\") return !value2.includes(filter.value.toString());\r\n break;\r\n\r\n case EsvFilterOperator.StartsWith:\r\n const value3 = row[filter.field];\r\n if (typeof value3 === \"string\") return value3.startsWith(filter.value.toString());\r\n break;\r\n\r\n case EsvFilterOperator.NotStartsWith:\r\n const value4 = row[filter.field];\r\n if (typeof value4 === \"string\") return !value4.startsWith(filter.value.toString());\r\n break;\r\n\r\n case EsvFilterOperator.EndsWith:\r\n const value5 = row[filter.field];\r\n if (typeof value5 === \"string\") return value5.endsWith(filter.value.toString());\r\n break;\r\n\r\n case EsvFilterOperator.NotEndsWith:\r\n const value6 = row[filter.field];\r\n if (typeof value6 === \"string\") return !value6.endsWith(filter.value.toString());\r\n break;\r\n\r\n case EsvFilterOperator.GreaterThan:\r\n const res = this.verifyNAN(row[filter.field], filter.value);\r\n if (!res) return false;\r\n return res.first > res.second;\r\n break;\r\n case EsvFilterOperator.LessThan:\r\n const res2 = this.verifyNAN(row[filter.field], filter.value);\r\n if (!res2) return false;\r\n return res2.first < res2.second;\r\n break;\r\n case EsvFilterOperator.GreaterThanOrEqual:\r\n const res3 = this.verifyNAN(row[filter.field], filter.value);\r\n if (!res3) return false;\r\n return res3.first >= res3.second;\r\n break;\r\n case EsvFilterOperator.LessThanOrEqual:\r\n const res4 = this.verifyNAN(row[filter.field], filter.value);\r\n if (!res4) return false;\r\n return res4.first <= res4.second;\r\n break;\r\n }\r\n }\r\n\r\n verifyNAN(first: string | number | boolean, second: string | number | boolean) {\r\n const firstNumber = parseFloat(first.toString());\r\n const secondNumber = parseFloat(second.toString());\r\n if (isNaN(firstNumber) || isNaN(secondNumber)) {\r\n return null;\r\n }\r\n return {\r\n first: firstNumber,\r\n second: secondNumber,\r\n };\r\n }\r\n}\r\n","import { FileSystemEsvRepository } from \"../../infra/fs/FileSystemEsvRepository.ts\";\r\nimport { type EsvRow } from \"../entities/EsvRow.ts\";\r\nimport { type EsvFilter } from \"../entities/EsvFilter.ts\";\r\nimport { Operations } from \"../../infra/ops/Operations.ts\";\r\n\r\nexport class FilterEsv {\r\n repository: FileSystemEsvRepository;\r\n operations: Operations;\r\n\r\n constructor(repository: FileSystemEsvRepository) {\r\n this.repository = repository;\r\n this.operations = new Operations();\r\n }\r\n\r\n async execute(\r\n filePath: string,\r\n separator: string,\r\n skip?: number,\r\n limit?: number,\r\n filters?: EsvFilter[]\r\n ) {\r\n const reader = await this.repository.readEsvFile(filePath);\r\n\r\n let lineCount = 0;\r\n let header: string[] = [];\r\n const records: EsvRow[] = [];\r\n\r\n for await (const line of reader) {\r\n if (lineCount === 0) {\r\n header = this.repository\r\n .splitEsvLine(line, separator)\r\n .map((h) => this.repository.normalizeValue(h) as string);\r\n\r\n lineCount++;\r\n continue;\r\n }\r\n\r\n if (!line) {\r\n continue;\r\n }\r\n\r\n const record = this.repository.parseEsvLine(line, header, separator);\r\n\r\n if (!this.operations.filterRow(record, filters)) {\r\n continue;\r\n }\r\n\r\n if (skip && skip > 0) {\r\n skip--;\r\n continue;\r\n }\r\n\r\n if (limit && lineCount > limit) {\r\n break;\r\n }\r\n\r\n records.push(record);\r\n lineCount++;\r\n }\r\n\r\n reader.close();\r\n\r\n return records;\r\n }\r\n}\r\n","import { FileSystemEsvRepository } from \"../../infra/fs/FileSystemEsvRepository.ts\";\r\nimport { type EsvRow } from \"../entities/EsvRow.ts\";\r\nimport { type EsvFilter } from \"../entities/EsvFilter.ts\";\r\nimport { Operations } from \"../../infra/ops/Operations.ts\";\r\n\r\nexport class UpdateEsv {\r\n repository: FileSystemEsvRepository;\r\n operations: Operations;\r\n tempPath: string;\r\n\r\n constructor(repository: FileSystemEsvRepository) {\r\n this.repository = repository;\r\n this.operations = new Operations();\r\n this.tempPath = \"\";\r\n }\r\n\r\n async execute(filePath: string, separator: string, newData: EsvRow, filters: EsvFilter[]) {\r\n this.tempPath = `${filePath}.tmp`;\r\n\r\n const tmpExists = await this.repository.fileExists(this.tempPath);\r\n\r\n if (tmpExists) {\r\n this.repository.deleteFile(this.tempPath);\r\n }\r\n\r\n const reader = await this.repository.readEsvFile(filePath);\r\n const writer = this.repository.getFileWriteStream(this.tempPath);\r\n\r\n let lineCount = 0;\r\n let header: string[] = [];\r\n let updated = false;\r\n\r\n for await (const line of reader) {\r\n if (lineCount === 0) {\r\n header = this.repository\r\n .splitEsvLine(line, separator)\r\n .map((h) => this.repository.normalizeValue(h) as string);\r\n\r\n writer.write(this.formatHeader(header, separator));\r\n\r\n lineCount++;\r\n continue;\r\n }\r\n\r\n if (!line) {\r\n continue;\r\n }\r\n\r\n const record = this.repository.parseEsvLine(line, header, separator);\r\n\r\n if (!this.operations.filterRow(record, filters)) {\r\n writer.write(line + \"\\n\");\r\n continue;\r\n }\r\n\r\n const updatedLine = this.updateLine(record, newData, separator);\r\n writer.write(updatedLine);\r\n lineCount++;\r\n updated = true;\r\n }\r\n\r\n reader.close();\r\n writer.end();\r\n\r\n return new Promise<void>((resolve, reject) => {\r\n writer.on(\"finish\", () => {\r\n if (!updated) {\r\n this.repository.deleteFile(this.tempPath);\r\n return reject(new Error(\"No record updated\"));\r\n }\r\n console.log(\"Esv file updated successfully\");\r\n this.repository.renameFile(this.tempPath, filePath);\r\n return resolve();\r\n });\r\n writer.on(\"error\", (error) => {\r\n return reject(error);\r\n });\r\n });\r\n }\r\n\r\n updateLine(record: EsvRow, newData: EsvRow, separator: string) {\r\n Object.entries(newData).forEach(([key, value]) => {\r\n record[key] = value;\r\n });\r\n\r\n return this.formatLine(record, separator);\r\n }\r\n\r\n formatLine(record: EsvRow, separator: string) {\r\n const values = Object.values(record).map((value) =>\r\n this.repository.escapeField(String(value))\r\n );\r\n const line = values.join(separator);\r\n\r\n return line + \"\\n\";\r\n }\r\n\r\n formatHeader(header: string[], separator: string) {\r\n const headerLine = header.map((h) => this.repository.escapeField(h)).join(separator);\r\n\r\n return headerLine + \"\\n\";\r\n }\r\n}\r\n","import { FileSystemEsvRepository } from \"../../infra/fs/FileSystemEsvRepository.ts\";\r\nimport { type EsvRow } from \"../entities/EsvRow.ts\";\r\nimport { type EsvFilter } from \"../entities/EsvFilter.ts\";\r\nimport { Operations } from \"../../infra/ops/Operations.ts\";\r\n\r\nexport class DeleteEsv {\r\n repository: FileSystemEsvRepository;\r\n operations: Operations;\r\n tempPath: string;\r\n\r\n constructor(repository: FileSystemEsvRepository) {\r\n this.repository = repository;\r\n this.operations = new Operations();\r\n this.tempPath = \"\";\r\n }\r\n\r\n async execute(filePath: string, separator: string, filters: EsvFilter[]) {\r\n this.tempPath = `${filePath}.tmp`;\r\n\r\n const tmpExists = await this.repository.fileExists(this.tempPath);\r\n\r\n if (tmpExists) {\r\n this.repository.deleteFile(this.tempPath);\r\n }\r\n\r\n const reader = await this.repository.readEsvFile(filePath);\r\n const writer = this.repository.getFileWriteStream(this.tempPath);\r\n\r\n let lineCount = 0;\r\n let header: string[] = [];\r\n let updated = false;\r\n\r\n for await (const line of reader) {\r\n if (lineCount === 0) {\r\n header = this.repository\r\n .splitEsvLine(line, separator)\r\n .map((h) => this.repository.normalizeValue(h) as string);\r\n\r\n writer.write(this.formatHeader(header, separator));\r\n\r\n lineCount++;\r\n continue;\r\n }\r\n\r\n if (!line) {\r\n continue;\r\n }\r\n\r\n const record = this.repository.parseEsvLine(line, header, separator);\r\n lineCount++;\r\n\r\n if (this.operations.filterRow(record, filters)) {\r\n updated = true;\r\n } else {\r\n writer.write(line + \"\\n\");\r\n }\r\n }\r\n\r\n reader.close();\r\n writer.end();\r\n\r\n return new Promise<void>((resolve, reject) => {\r\n writer.on(\"finish\", () => {\r\n if (!updated) {\r\n this.repository.deleteFile(this.tempPath);\r\n return reject(new Error(\"No record deleted\"));\r\n }\r\n console.log(\"Esv record deleted successfully\");\r\n this.repository.renameFile(this.tempPath, filePath);\r\n return resolve();\r\n });\r\n writer.on(\"error\", (error) => {\r\n return reject(error);\r\n });\r\n });\r\n }\r\n\r\n formatHeader(header: string[], separator: string) {\r\n const headerLine = header.map((h) => this.repository.escapeField(h)).join(separator);\r\n\r\n return headerLine + \"\\n\";\r\n }\r\n}\r\n","import { FileSystemEsvRepository } from \"../infra/fs/FileSystemEsvRepository.ts\";\r\nimport { ReadEsv } from \"../core/useCases/ReadEsv.ts\";\r\nimport { WriteEsv } from \"../core/useCases/WriteEsv.ts\";\r\nimport { FilterEsv } from \"../core/useCases/FilterEsv.ts\";\r\nimport { UpdateEsv } from \"../core/useCases/UpdateEsv.ts\";\r\nimport { DeleteEsv } from \"../core/useCases/DeleteEsv.ts\";\r\nimport { type EsvRow } from \"../core/entities/EsvRow.ts\";\r\nimport { type EsvFilter } from \"../core/entities/EsvFilter.ts\";\r\n\r\nexport class EsvViewModel {\r\n private repository: FileSystemEsvRepository;\r\n private readEsv: ReadEsv;\r\n private writeEsv: WriteEsv;\r\n private filterEsv: FilterEsv;\r\n private updateEsv: UpdateEsv;\r\n private deleteEsv: DeleteEsv;\r\n\r\n constructor() {\r\n this.repository = new FileSystemEsvRepository();\r\n this.readEsv = new ReadEsv(this.repository);\r\n this.writeEsv = new WriteEsv(this.repository);\r\n this.filterEsv = new FilterEsv(this.repository);\r\n this.updateEsv = new UpdateEsv(this.repository);\r\n this.deleteEsv = new DeleteEsv(this.repository);\r\n }\r\n\r\n async readEsvFile(filePath: string, skip?: number, limit?: number, separator: string = \"๐\") {\r\n return await this.readEsv.execute(filePath, separator, skip, limit);\r\n }\r\n async writeEsvFile(filePath: string, data: EsvRow[], separator: string = \"๐\") {\r\n return await this.writeEsv.execute(filePath, data, separator);\r\n }\r\n\r\n async filterEsvFile(\r\n filePath: string,\r\n skip?: number,\r\n limit?: number,\r\n filters?: EsvFilter[],\r\n separator: string = \"๐\"\r\n ) {\r\n return await this.filterEsv.execute(filePath, separator, skip, limit, filters);\r\n }\r\n\r\n async updateEsvFile(\r\n filePath: string,\r\n newData: EsvRow,\r\n filters: EsvFilter[],\r\n separator: string = \"๐\"\r\n ) {\r\n return await this.updateEsv.execute(filePath, separator, newData, filters);\r\n }\r\n\r\n async deleteEsvFile(filePath: string, filters: EsvFilter[], separator: string = \"๐\") {\r\n return await this.deleteEsv.execute(filePath, separator, filters);\r\n }\r\n}\r\n"],"mappings":"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","names":["fs","ReadLine","EsvFilterOperator"]}