Pular para o conteúdo

Worker em Node

Terminal window
oren init worker minha-task --template node
import { task } from '@oren-sh/sdk';
type Inputs = { defaultChange: 'major' | 'minor' | 'patch' | 'none' };
type Outputs = { change: string; commitCount: number };
await task<Inputs, Outputs>(async ({ inputs, path, log }) => {
const source = path('source');
log('analisando', source);
return { change: inputs.defaultChange, commitCount: 3 };
});

O que a função devolver vira a saída da task. Lançar aborta o step com código de saída 1 — a CLI trata o resto.

inputs entradas validadas contra o contrato, com defaults aplicados
execution pipeline, step, task, dependências montadas
path(nome) caminho onde uma dependência foi montada
log(...) escreve em stderr

TaskError tem a mensagem exibida sem stack trace — ela é para quem escreveu o pipeline, não para quem escreveu o worker.

import { task, TaskError } from '@oren-sh/sdk';
await task(async ({ path }) => {
const source = path('source');
if (!existsSync(join(source, '.git'))) {
throw new TaskError(`${source} não contém um repositório git`);
}
// ...
});

Um worker em shell fica em cerca de 34 MB; o mesmo em Node, 283 MB — o runtime. Em troca você tem tipos nas entradas e saídas, erros estruturados e lógica testável fora do container.

As duas satisfazem o mesmo contrato e pedem exatamente as mesmas dependências, então a escolha é de manutenção, não de privilégio.

O protocolo é ler um arquivo e escrever outro. Um worker em Go, Python ou Rust funciona igual, sem nada do Node envolvido. Este pacote existe para você não reimplementar leitura de caminho e tratamento de erro em cada worker.