Menu
CoddyTech

package.json

Parte da seção Fundamentos de Node.js do Journey de Node.js da Coddy. Lição 22 de 24.

Um projeto precisa de um lugar que informe como ele se chama, qual é a sua versão e como executá-lo.

Esse lugar é package.json. "type": "module" permite que arquivos .js usem import, scripts nomeia comandos para npm run, e dependencies lista os pacotes que npm install express baixa para node_modules. Um programa pode importar o próprio arquivo:

{
  "name": "weather",
  "version": "0.3.1",
  "type": "module",
  "scripts": { "start": "node weather.js" },
  "dependencies": { "express": "^5.1.0" }
}
import pkg from './package.json' with { type: 'json' };
console.log(pkg.version);

with { type: 'json' } informa ao Node que o arquivo contém dados, não código. Sem isso, o Node recusa a importação.

challenge icon

Desafio

Fácil
  • Um comando version exibe notes 1.2.0: o name e o version lidos de package.json.

Execute node notes.js version. Em seguida, defina a versão como 1.3.0 em package.json e execute novamente.

Experimente você mesmo

// Sua ferramenta de anotações começa aqui.
import { rmSync } from 'node:fs';
import path from 'node:path';
import { formatNote } from './format.js';
import stats from './legacy/stats.cjs';
import store from './store.js';

const [command, ...words] = process.argv.slice(2);
const text = words.join(' ');

store.on('added', (note, n) => {
    console.log(`Saved note ${n}.`);
});

const noteNumber = (word) => {
    const n = Number(word);
    if (!Number.isInteger(n) || n < 1 || n > store.notes.length) {
        console.error(`No note ${word}`);
        process.exit(1);
    }
    return n;
};

if (command === 'add') {
    await store.add(text);
} else if (command === 'list') {
    const owner = process.env.NOTES_OWNER ?? 'you';
    console.log(`Notes for ${owner}`);
    if (store.notes.length === 0) {
        console.log('No notes yet');
    }
    const lines = store.notes.map((note, i) => formatNote(i + 1, note));
    if (store.settings.sort === 'newest') {
        lines.reverse();
    }
    lines.forEach((line) => console.log(line));
} else if (command === 'where') {
    const file = path.join(process.cwd(), 'notes.json');
    console.log(file);
    console.log(path.basename(file));
} else if (command === 'stats') {
    console.log(`${store.notes.length} notes, ${stats.countWords(store.notes)} words`);
} else if (command === 'done') {
    const removed = await store.remove(noteNumber(words[0]));
    console.log(`Done: ${removed}`);
} else if (command === 'remind') {
    const note = store.notes[noteNumber(words[0]) - 1];
    let count = 3;
    const timer = setInterval(() => {
        if (count > 0) {
            console.log(count);
            count -= 1;
        } else {
            console.log(note);
            clearInterval(timer);
        }
    }, 200);
} else if (command === 'import') {
    let input = '';
    for await (const chunk of process.stdin) {
        input += chunk;
    }
    const lines = input
        .split('\n')
        .map((line) => line.trim())
        .filter((line) => line !== '');
    for (const line of lines) {
        await store.add(line);
    }
    console.log(`Imported ${lines.length} notes.`);
} else if (command === 'clear') {
    rmSync('notes.json', { force: true });
    console.log('Deleted notes.json');
} else {
    if (command) {
        console.error(`Unknown command: ${command}`);
    }
    console.error('Usage: node notes.js <command> [words]');
    process.exit(1);
}
quiz iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de Fundamentos de Node.js