npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

@openfactu/sdk

v0.1.0

Published

SDK oficial para integración con OpenFactu ERP — crea documentos, gestiona partners, items y más desde código externo.

Readme

@openfactu/sdk

Cliente REST oficial para integración con OpenFactu ERP desde aplicaciones externas.

¿Desarrollas plugins? Este no es tu paquete. Usa @openfactu/plugin-sdk para acceso a FactuApi, transacciones atómicas y la base de datos directa.

Diferencia clave

| Paquete | Caso de uso | Transacciones | DB directa | |---|---|---|---| | @openfactu/sdk | Apps externas (React, Node, etc.) | ❌ HTTP REST | ❌ | | @openfactu/plugin-sdk | Plugins dentro del servidor | ✅ FactuApi.transaction() | ✅ Drizzle |

Instalación

npm install @openfactu/sdk

Configuración

import { OpenFactuClient } from '@openfactu/sdk';

const client = new OpenFactuClient({
  baseUrl: 'http://localhost:3000',
  token: 'eyJhbGci...',
  tenantId: 'abc-123',
  timeout: 30000,
});

Documentos

Crear factura

const invoice = await client.documents.create('SINV', {
  partnerId: '...',
  seriesId: '...',
  periodId: '...',
  lines: [{ itemId: '...', quantity: 2, price: 100, taxGroupId: '...' }],
});

Asentar y cancelar

await client.documents.post('SINV', invoice.id);
await client.documents.cancel('SINV', invoice.id);

Listar y consultar

const invoices = await client.documents.list('SINV');
const detail = await client.documents.get('SINV', invoice.id);

Partners

const partners = await client.partners.list();
const partner = await client.partners.create({ name: 'Acme SL' });
await client.partners.update(partner.id, { email: '[email protected]' });
await client.partners.delete(partner.id);

Nota: get(id) realiza un list() completo y filtra localmente porque la API no expone GET /api/partners/:id.

Items

const items = await client.items.list();
const item = await client.items.create({ name: 'Laptop', uomId: '...', basePrice: 999 });

// Stock, lotes y UOMs
const stock = await client.items.getStock(item.id);
const batches = await client.items.getBatches(item.id);
const uoms = await client.items.getUoms(item.id);

Campos custom (p_*)

OpenFactu permite campos personalizados en items. Puedes pasarlos directamente:

const item = await client.items.create({
  name: 'Producto',
  uomId: '...',
  p_color: 'Rojo',
  p_size: 'XL',
});

Cambiar de token o tenant

// Mismo servidor, otro usuario
const otherUser = client.withToken('otro-jwt');

// Mismo usuario, otra empresa
const otherTenant = client.withTenant('tenant-456');

Manejo de errores

import { OpenFactuError } from '@openfactu/sdk';

try {
  await client.documents.create('SINV', { ... });
} catch (err) {
  if (err instanceof OpenFactuError) {
    console.error(err.statusCode, err.message, err.path);
  }
}

Tipos exportados

import type {
  DocType,
  DocumentCreateParams,
  DocumentResponse,
  DocumentListItem,
  DocumentDetail,
  Partner,
  PartnerCreateParams,
  Item,
  ItemCreateParams,
  ItemBatch,
  ItemStock,
  ItemUom,
  ConnectionConfig,
} from '@openfactu/sdk';

Referencia

| Recurso | Métodos | |---|---| | client.documents | create, post, cancel, get, list | | client.partners | list, get, create, update, delete | | client.items | list, get, create, update, delete, getBatches, getStock, getUoms, addUom, removeUom |

Licencia

MIT — Copyright (c) 2026 Keirost