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

officecli-sdk

v0.1.2

Published

Node.js SDK for officecli — a thin async client over the officecli resident pipe (read/write .docx/.xlsx/.pptx).

Readme

officecli-sdk

A thin async Node.js client over officecli's resident pipe. It does one thing: forward a command to the running resident and hand back the response. There is no second vocabulary to learn — a command is the same object you'd put in an officecli batch list.

npm install officecli-sdk

Installing the SDK pulls @officecli/officecli, which bundles an auto-updating native binary — so the CLI comes with it and you don't manage it separately. If the binary is ever missing, the SDK provisions it on first use (downloads the bundled signed binary, or falls back to the official installer).

Usage

const oc = require('officecli-sdk');

const doc = await oc.create('report.xlsx', ['--force']);
try {
  await doc.send({ command: 'set', path: '/Sheet1/A1', props: { text: 'Hello' } });
  const a1 = await doc.send({ command: 'get', path: '/Sheet1/A1' }); // → envelope object
  console.log(a1);

  // Many writes in one round-trip:
  await doc.batch([
    { command: 'set', path: '/Sheet1/B1', props: { text: '42' } },
    { command: 'set', path: '/Sheet1/C1', props: { text: 'world' } },
  ]);
} finally {
  await doc.close(); // flushes to disk
}

On Node ≥ 24 you can use await using and skip the explicit close:

await using doc = await oc.open('existing.xlsx');
await doc.send({ command: 'get', path: '/body/p[1]' });

Two surfaces

  • bootstrap (infrequent): create() / open() spawn one CLI process.
  • hot path: send() / batch() are pure pipe round-trips, no per-command process spawn.

API

  • await create(path, args?, options?) → Document — make a new file. Extra CLI flags pass through verbatim (['--force'], ['--type', 'docx']).
  • await open(path, options?) → Document — open an existing file.
  • Document.send(item, asJson = true, timeoutMs?) — forward one command. asJson = false requests plain-text output (view/raw/dump).
  • Document.batch(items, { force = true, stopOnError = false, timeoutMs? }).
  • Document.alive(timeoutMs?) — is a resident serving this file?
  • Document.close() — stop the resident (flushes to disk).
  • install() — run the official installer (unix only).

options: { binary?, timeoutMs?, autoInstall? }. Pass binary to point at a specific officecli; autoInstall: false to disable provisioning a missing CLI.

Errors vs business outcomes

Transport/process failures throw OfficeCliError. Business outcomes are not exceptions — they live in the returned envelope's success field, exactly like the CLI's exit code. Check result.success yourself.

Lifecycle

// Owner — close on exit:
const d = await oc.open(f);
try { /* ... */ } finally { await d.close(); }

// Borrow — leave a resident another program owns running:
const d = await oc.open(f);
await d.send(/* ... */); // no close()

A dead resident is transparently restarted and the command retried once. An alive-but-busy pipe raises OfficeCliError (retry, or close() and reopen) — the SDK never bypasses a live resident, which would race its save.

Licensed under Apache-2.0.