@ehmpathy/as-command

中文文档
1.0.5发布于 2025/11/03MITTypeScriptCommonJS近 30 天下载 2761

easily create commands within a pit-of-success

原始使用文档
文档目录8 节
  1. install
  2. usage
  3. default outputs
  4. custom outputs
  5. concepts
  6. command context
  7. output directory structure
  8. input hashing

as-command

test publish

easily create commands within a pit of success

install

npm install @ehmpathy/as-command

usage

default outputs

create a simple command that processes data with automatic logging and output persistence:

import { asCommand } from '@ehmpathy/as-command';
import { COMMANDS_OUTPUT_DIRECTORY } from './constants';

const command = asCommand(
  {
    name: 'processData',
    stage: process.env.STAGE || 'dev',
    dir: COMMANDS_OUTPUT_DIRECTORY,
    log,
  },
  async (input: { userId: string; date: string }, context) => {
    context.log.info('starting data processing', { userId: input.userId });

    // your business logic here
    const result = {
      processed: true,
      recordCount: 42,
      timestamp: new Date().toISOString(),
    };

    context.log.info('processing complete', { result });

    return result;
  },
);

// run directly
if (require.main === module) {
  void command({
    userId: 'user-123',
    date: '2024-01-15',
  });
}

output structure:

__tmp__/dev/processData/
└── 20240115.143022.a1b2c3d4.../
    ├── log.json      # all logs from the run
    └── out.json      # command output

custom outputs

create complex directory structures for organized output:

const command = asCommand(
  {
    name: 'analyzeData',
    stage: 'prod',
    dir: COMMANDS_OUTPUT_DIRECTORY,
    log,
  },
  async (input: { datasetId: string }, context) => {
    // write to nested directories - they're created automatically
    await context.out.write({
      name: 'reports/analytics/user-metrics.json',
      data: JSON.stringify({ activeUsers: 1500 }),
    });

    await context.out.write({
      name: 'reports/analytics/revenue-breakdown.csv',
      data: 'Category,Amount\nSubscriptions,50000\nAds,25000',
    });

    await context.out.write({
      name: 'exports/raw-data.json',
      data: JSON.stringify({ records: [] }),
    });

    return { analyzed: true };
  },
);

output structure:

__tmp__/prod/analyzeData/
└── 20240115.143022.i9j0k1l2.../
    ├── log.json
    ├── out.json
    ├── reports/
    │   └── analytics/
    │       ├── user-metrics.json
    │       └── revenue-breakdown.csv
    └── exports/
        └── raw-data.json

concepts

command context

each command receives a context object with the following methods:

context.log

logs messages at different levels. all logs are written to both console and log.json:

context.log.debug('debug message', { data: 'debug info' });
context.log.info('info message', { userId: 123 });
context.log.warn('warning message', { issue: 'potential problem' });
context.log.error('error message', { error: errorObject });

context.out.write()

writes custom files to the command's output directory:

const result = await context.out.write({
  name: 'report.csv', // supports nested paths: 'reports/analytics/data.csv'
  data: csvString, // string or Buffer
});

// result.path contains the full path to the written file
console.log(result.path);

output directory structure

each command run creates a unique directory based on timestamp and input hash:

{dir}/__tmp__/{stage}/{command-name}/
└── {timestamp}.{input-hash}/
    ├── log.json    # all logs from the run
    ├── out.json    # command return value
    └── ...         # any files created with context.out.write()

example:

/var/app/__tmp__/prod/process-orders/
├── 20240115.091530.a1b2c3d4e5f6.../
│   ├── log.json
│   ├── out.json
│   └── orders-summary.csv
└── 20240115.102045.a1b2c3d4e5f6.../  # same input, different time
    ├── log.json
    ├── out.json
    └── orders-summary.csv

input hashing

commands automatically hash their inputs using SHA-256. this enables:

  • deduplication detection: same inputs produce the same hash
  • audit trails: track when the same operation was run multiple times
  • debugging: quickly find previous runs with identical inputs
// these two runs will have the same hash in their directory names:
await command({ userId: '123', action: 'process' });
await command({ userId: '123', action: 'process' });

// this run will have a different hash:
await command({ userId: '456', action: 'process' });

版本与发布记录

@ehmpathy/as-command 共发布 5 个版本,首次发布于 2024/05/27;过去 12 个月发布了 0 个版本。

版本发布日期距今
1.0.5latest2025/11/031 年前
1.0.42025/11/031 年前
1.0.32024/10/112 年前
1.0.22024/07/282 年前
1.0.12024/05/272 年前

关于 @ehmpathy/as-command 的常见问题

@ehmpathy/as-command 是什么?

easily create commands within a pit-of-success

如何安装 @ehmpathy/as-command?

在项目目录运行 npm install @ehmpathy/as-command,或使用 pnpm add / yarn add / bun add。

@ehmpathy/as-command 支持 TypeScript 吗?

支持。包内自带 TypeScript 类型声明(package.json 声明了 types 入口),安装后即可获得类型提示,无需再安装 @types 包。

@ehmpathy/as-command 支持 ESM 还是 CommonJS?

以 CommonJS 形式发布,可以直接 require();在 ES Module 项目中也可以用 import 引入(Node.js 会把 module.exports 作为默认导出)。

@ehmpathy/as-command 需要什么版本的 Node.js?

package.json 的 engines 字段要求 Node.js >=8.0.0。版本不符时 npm 默认只给出警告,开启 engine-strict 后会拒绝安装。

@ehmpathy/as-command 可以商用吗?

@ehmpathy/as-command 使用 MIT 许可。宽松许可:允许商业使用、修改和再分发,通常只需在分发时保留原版权与许可声明。以上为概括,不构成法律意见,请以许可原文为准。

@ehmpathy/as-command 的下载量有多少?

根据 npm 官方下载统计,@ehmpathy/as-command 在 2026/10/13 – 2026/11/11 这 30 天内被下载 2,761 次,日均约 92 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入,适合横向比较热度,不能直接等同于使用人数。

@ehmpathy/as-command 还在维护吗?

最新版本 1.0.5 发布于 2025/11/03(1 年前);至今共发布 5 个版本,其中过去 12 个月发布了 0 个;首次发布于 2024/05/27。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。