Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

importando modulo para o cli.js (Printando array pelo terminal)

Estou tentando passar o caminho do arquivo pelo terminal para a função "pegaArquivo" mas o terminal diz que aparentemente não conseguiu encontrar ela porque eu não exportei direito... Bom meus códigos estão assim:

ERRO DO TERMINAL

import pegaArquivo from './index.js';
       ^^^^^^^^^^^
SyntaxError: The requested module './index.js' does not provide an export named 'default'

index.JS

import chalk from 'chalk';
import fs, { link } from 'fs';
import { text } from 'stream/consumers';



const texto = "São geralmente recuperados a partir de um objeto [FileList](https://developer.mozilla.org/pt-BR/docs/Web/API/FileList) que é retornado como resultado da seleção, pelo usuário, de arquivos através do elemento [<input>](https://developer.mozilla.org/pt-BR/docs/Web/HTML/Element/Input), a partir do objeto [DataTransfer](https://developer.mozilla.org/pt-BR/docs/Web/API/DataTransfer) utilizado em operações de arrastar e soltar, ou a partir da API `mozGetAsFile()` em um [HTMLCanvasElement](https://developer.mozilla.org/pt-BR/docs/Web/API/HTMLCanvasElement). Em Gecko, códigos com privilégiios podem criar objetos File representando qualquer arquivo local sem a intereção do usuário (veja [Implementation notes](https://developer.mozilla.org/pt-BR/docs/Web/API/File#implementation_notes) para mais informações.)";

function extraiLinks(texto) {
    const regex = /\[([^\]]*)\]\((https?:\/\/[^$#\s].[^\s]*)\)/gm;
    const arrayResultados = [];
    let temp;
    while((temp = regex.exec(texto)) !== null) {
        arrayResultados.push({[temp[1]]: temp[2]});
    }
    return arrayResultados;
}


function trataErro(erro) {
    throw new Error(chalk.red(erro.code, 'não há um arquivo'));
}

async function pegaArquivo(caminhoDoArquivo) {
    const encoding = 'utf-8';

    try {
        const texto = await fs.promises.readFile(caminhoDoArquivo, encoding)
        console.log(extraiLinks(texto));

    } catch(erro) {
        trataErro(erro);
    }
}

// pegaArquivo("./arquivos/texto1.md");

module.exports = pegaArquivo;

cli.JS

import pegaArquivo from './index.js';
// const pegaArquivo = require('./index')
const caminho = process.argv;

console.log(pegaArquivo(caminho[2]));

Já dei umas pesquisadas na internet e fiz alguns testes mas mesmo assim não funcionou, alguém consegue me ajudar?

edit package.json mais pro início do curso tive que acrescentar a linha 7 nesse arquivo. Vi algo relacionado a type: module ou type:commonjs acredito que pode ter alguma relação (ou não) porque quando eu tentei importar os modulos usando "require" igual indicado no curso ele reclamava de algo parecido.

{
  "name": "nodejs-criando-sua-primeira-biblioteca",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "type": "module",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "dependencies": {
    "chalk": "^5.0.1"
  }
}
1 resposta
solução!

Oi Pedro,

O problema pode estar acontecendo porque você está importando pegaArquivos usando uma forma (que chamamos de ESM):

import pegaArquivo from './index.js';

Porém no arquivo index.js você está exportando a função utilizando outra forma (que chamamos de CJS):

module.exports = pegaArquivo;

Em nossos projetos ou escolhemos uma forma, ou outra. Por exemplo, a forma mais "nativa" do NodeJS (CJS) fica dessa forma:

// exportação
module.exports = pegaArquivo;

//importação
const pegaArquivo = require('./index')

A forma mais recente em implantação (ESM) fica dessa forma:

//exportação
export pegaArquivo;

//importação
import pegaArquivo from './index.js';

Então, se quiser usar a sintaxe ESM (import e export) a função module.exports não vai funcionar... Há outras maneiras de se exportar módulos, por exemplo se quiser exportar vários módulos de uma vez e outros casos. Esse artigo dá exemplos de cada caso.

Ah, outra coisa importante: sempre que usar ESM, é necessário adicionar a extensão do arquivo .js nas importações.

Bons estudos! :)