@atcute/lexicons

中文文档
2.1.1发布于 2026/09/230BSDES Module近 30 天下载 42.2万

AT Protocol core lexicon types and schema validations

原始使用文档
文档目录6 节
  1. usage
  2. validating syntax
  3. parsing AT URIs
  4. branded types
  5. validating records
  6. IPLD types

@atcute/lexicons

core types and syntax validators for AT Protocol.

npm install @atcute/lexicons

this package provides syntax validators for AT Protocol's string formats (handles, DIDs, NSIDs, etc.) and validation functions for use with lexicon schemas from definition packages.

usage

validating syntax

use the syntax validators to check AT Protocol string formats:

import {
    isHandle,
    isDid,
    isNsid,
    isCid,
    isTid,
    isRecordKey,
    isDatetime,
    isResourceUri,
    isActorIdentifier,
} from '@atcute/lexicons/syntax';

// handle format (domain names)
isHandle('alice.bsky.social'); // true
isHandle('invalid'); // false (no TLD)

// DID format
isDid('did:plc:z72i7hdynmk6r22z27h6tvur'); // true
isDid('did:web:example.com'); // true
isDid('not-a-did'); // false

// NSID format (namespaced identifiers)
isNsid('app.bsky.feed.post'); // true
isNsid('com.atproto.repo.createRecord'); // true

// CID format (content identifiers)
isCid('bafyreigdyrzt5sfp7udm7hu76uh7y26nf3efuylqabf3oclgtqy55fbzdi'); // true

// TID format (timestamp identifiers)
isTid('3jzfcijpj2z2a'); // true

// record key format
isRecordKey('3jzfcijpj2z2a'); // true (TID)
isRecordKey('self'); // true (literal "self")

// datetime format (ISO 8601)
isDatetime('2024-01-15T12:00:00.000Z'); // true

// AT URI format
isResourceUri('at://did:plc:123/app.bsky.feed.post/abc'); // true

// actor identifier (handle or DID)
isActorIdentifier('alice.bsky.social'); // true
isActorIdentifier('did:plc:123'); // true

parsing AT URIs

parse AT URIs to extract their components:

import { parseResourceUri, parseCanonicalResourceUri } from '@atcute/lexicons/syntax';

// parse any AT URI (handle or DID authority); throws SyntaxError on invalid input
const uri = parseResourceUri('at://alice.bsky.social/app.bsky.feed.post/123');
console.log(uri.repo); // 'alice.bsky.social'
console.log(uri.collection); // 'app.bsky.feed.post'
console.log(uri.rkey); // '123'

// parse canonical AT URI (DID authority only); throws SyntaxError on invalid input
const canonical = parseCanonicalResourceUri('at://did:plc:123/app.bsky.feed.post/abc');
console.log(canonical.repo); // 'did:plc:123'

branded types

the syntax module exports branded types for type-safe string handling:

import type { Handle, Did, Nsid, Cid, Tid, RecordKey, Datetime } from '@atcute/lexicons/syntax';
import { isHandle } from '@atcute/lexicons/syntax';

function getProfile(handle: Handle): Promise<Profile> {
    // handle is guaranteed to be a valid handle format
}

const input = 'alice.bsky.social';
if (isHandle(input)) {
    // input is narrowed to Handle type
    getProfile(input);
}

validating records

validate data against lexicon schemas using is(), safeParse(), or parse(). schemas come from definition packages like @atcute/bluesky:

import { is, safeParse, parse, ValidationError } from '@atcute/lexicons';
import { AppBskyFeedPost } from '@atcute/bluesky';

const data: unknown = {
    $type: 'app.bsky.feed.post',
    text: 'hello world',
    createdAt: '2024-01-15T12:00:00.000Z',
};

// type guard - returns boolean
if (is(AppBskyFeedPost.mainSchema, data)) {
    // data is typed as AppBskyFeedPost.$record
    console.log(data.text);
}

// safe parse - returns result object
const result = safeParse(AppBskyFeedPost.mainSchema, data);
if (result.ok) {
    console.log(result.value.text);
} else {
    console.log(result.message);
    console.log(result.issues);
}

// parse - throws on failure
try {
    const post = parse(AppBskyFeedPost.mainSchema, data);
    console.log(post.text);
} catch (err) {
    if (err instanceof ValidationError) {
        console.log(err.message);
        console.log(err.issues);
    }
}

IPLD types

the package exports types for IPLD data structures used in AT Protocol:

import type { Blob, Bytes, CidLink } from '@atcute/lexicons';

// Blob - reference to uploaded media (images, videos)
// Bytes - raw binary data (base64 encoded in JSON)
// CidLink - reference to content by CID

版本与发布记录

@atcute/lexicons 共发布 26 个版本,首次发布于 2025/05/14;过去 12 个月发布了 16 个版本。

版本发布日期距今
2.1.1latest2026/09/231 个月前
2.1.02026/08/192 个月前
2.0.32026/07/163 个月前
2.0.22026/06/294 个月前
2.0.12026/06/154 个月前
2.0.02026/05/095 个月前

关于 @atcute/lexicons 的常见问题

@atcute/lexicons 是什么?

AT Protocol core lexicon types and schema validations

如何安装 @atcute/lexicons?

在项目目录运行 npm install @atcute/lexicons,或使用 pnpm add / yarn add / bun add。

@atcute/lexicons 支持 TypeScript 吗?

该包的 package.json 没有声明类型入口。需要类型提示时,可以在 npm 上查找社区维护的 @types/atcute__lexicons 是否存在。

@atcute/lexicons 支持 ESM 还是 CommonJS?

以 ES Module 形式发布,推荐使用 import 引入。在 CommonJS 项目中,Node.js 20.19+ / 22.12+ 可以直接 require() 不含顶层 await 的 ES Module,更早的版本需要改用动态 import()。

@atcute/lexicons 可以商用吗?

@atcute/lexicons 使用 0BSD 许可。几乎没有限制:可自由使用、修改和分发,连保留版权声明也不要求。以上为概括,不构成法律意见,请以许可原文为准。

@atcute/lexicons 的下载量有多少?

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

@atcute/lexicons 还在维护吗?

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