16

I am using Firebase functions to build an API that parses CSV files.

When I try to use csv-parse/sync instead of csv-parse, my deploy to Firebase Functions fail with the following error:

Error: Error parsing triggers: Cannot find module 'csv-parse/sync''
Require stack:
- /Users/xxx/Programming/xxx/Firebase Functions/xxx/functions/lib/index.js
- /usr/local/lib/node_modules/firebase-tools/lib/deploy/functions/runtimes/node/triggerParser.js

Try running "npm install" in your functions directory before deploying.

I have imported using:

import { parse } from 'csv-parse/sync';

Then use in code like this:

interface EventData {
    update: string;
    id: string;
    title: string;
    description: string;
    category: string;
    ages: string;
    place: string;
    placeCoordinate: string;
    startDate: string;
    startTime: string;
    length: string;
    url: string;
    arrName: string;
  }

let events: Array<EventData> = []
const headers = ["update", "id", "title", "description", "ages", "place", "placeCoordinate", "startDate", "startTime", "length", "url", "arrEpost", "arrName", "validated", "skugg"]
try {
    events = parse(text, {columns: headers, from: 6, quote: "\"", delimiter: ";", ltrim: true, rtrim: true})
}...

I have installed by going to /functions-folder and running

npm install --save csv-parse

Deploying in root folder with

firebase deploy

Is this an issue with the framework, with firebase or am I doing something wrong? Normal use of "csv-parse" without sync works just fine. In both cases it seems to import just fine in Visual Studio Code, but not when deploying with "sync". I have tried to clean the node_modules folder, rebuild the package-lock.json-file, upgraded to the latest version of firebase tools, all without success.

I have added a similar question on the framework project issues page: https://github.com/adaltas/node-csv/issues/323

Sunkas
  • 9,542
  • 6
  • 62
  • 102
  • Please provide the following information: - package.json `engines.node` and `scripts.build` - tsconfig.json `target` and `module` - firebase.json `functions.predeploy` – erwinv Feb 28 '22 at 15:22
  • Could you tell us which verison of nodejs you're using and what version of csv-parse is installed? – Florian Bachmann Mar 04 '22 at 09:29

4 Answers4

11

If you are using Typescript you can do

import  parse  from 'csv-parse/sync';

or

import  {parse}  from 'csv-parse/lib/sync';
Jeff Paredes
  • 161
  • 2
1

For me either of the two worked in node.js (based on Jeff Paredes answer):

import parse from 'csv-parse/lib/sync';
const parse = require('csv-parse/lib/sync');

It seems like the folder structure within the node_modules folder was changed. So instead of sync.js being located in csv-parse it is now in csv-parse/lib.

enter image description here

Tobi Obeck
  • 1,918
  • 1
  • 19
  • 31
0

As of today, if you install you should just install node-csv by running yarn add csv or pnpm install csv or npm install csv

Then in your code just do

import { parse } from 'csv'

Then you are done

Pencilcheck
  • 2,664
  • 3
  • 25
  • 14
0

Using csv@6.3.3 (and after having tried using csv-parser on its own unsuccesfully), the following is the only combination that worked for me:

import { parse } from "csv-parse/sync";

Example usage:

import * as fs from "fs";
import { parse } from 'csv-parse/sync';

const csvPath = "./data/users.csv";

type UserRow = {
  id: number;
  name: string;
};

const csvContent = fs.readFileSync(csvPath, "utf-8");
const rows: UserRow[] = parse(csvContent, {
  columns: true,
  skip_empty_lines: true,
});

console.log(rows);

I also had to add "moduleResolution": "node" to the compilerOptions of tsconfig.json.

swimmer
  • 1,971
  • 2
  • 17
  • 28