New:Introducing Socket Scanning for VS Code Marketplace Extensions.Learn more →
Get Started

@kubb/ast

Package Overview
Dependencies
Maintainers
1
Versions
490
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@kubb/ast

Spec-agnostic AST layer for Kubb. Defines the node tree, visitor pattern, factory functions, and type guards used across all code generation plugins.

Source
npmnpm
Version
5.9.6
Version published
Weekly downloads
270K
-3.05%
Maintainers
1
Weekly downloads
 
Created
Source
Kubb banner

npm version npm downloads Stars License Node

Documentation · Report Bug · Request Feature


@kubb/ast

Spec-agnostic AST layer for Kubb

Defines the node tree, visitor pattern, factory functions, and type guards used across every Kubb code generation plugin.

Imports

PathContents
@kubb/astRuntime: node definitions, guards, visitor, macro engine, constants
ast.factory (via @kubb/ast)Node constructors (createSchema, createFile, and friends), the ts.factory analogue
kubb/kitRe-exports the ast and factory namespaces, the way most Kubb code reaches the AST without a direct dependency

@kubb/ast is an internal library. Inside the Kubb ecosystem the whole surface travels on the ast namespace from kubb/kit, so plugins and generators reach it there instead of depending on this package directly. The examples below import from @kubb/ast for clarity; through kubb/kit the same calls read as ast.transform, ast.factory.createSchema, and so on.

Node tree

InputNode
├── schemas: SchemaNode[]
└── operations: OperationNode[]
    ├── parameters: ParameterNode[]   → SchemaNode
    ├── requestBody?: SchemaNode
    └── responses: ResponseNode[]     → SchemaNode?

SchemaNode (discriminated union)
  object        → properties: PropertyNode[] → SchemaNode
  array | tuple → items: SchemaNode[]
  union | intersection → members: SchemaNode[]
  enum | ref | string | number | integer | bigint
  boolean | null | any | unknown | void
  date | datetime | time | uuid | email | url | blob

Usage

Factory

Constructors are available as ast.factory from @kubb/ast, mirroring ts.factory.createX.

import { ast } from '@kubb/ast'

const { createInput, createSchema, createProperty } = ast.factory

const root = createInput({
  schemas: [
    createSchema({
      name: 'Pet',
      type: 'object',
      properties: [
        createProperty({
          name: 'id',
          schema: createSchema({ type: 'integer' }),
          required: true,
        }),
        createProperty({
          name: 'name',
          schema: createSchema({ type: 'string' }),
          required: true,
        }),
      ],
    }),
  ],
})

Visitor

import { collectSync, transform } from '@kubb/ast'

// Immutable transformation
const updated = transform(root, {
  schema(node) {
    return { ...node, description: 'generated' }
  },
})

// Extraction
const types = collectSync<string>(root, {
  schema(node) {
    return node.type
  },
})

Guards

import { narrowSchema } from '@kubb/ast'
import type { Node } from '@kubb/ast'

function process(node: Node) {
  if (node.kind === 'Schema') {
    const obj = narrowSchema(node, 'object')
    obj?.properties?.forEach((p) => console.log(p.name))
  }
}

Refs

import { resolveRefName } from '@kubb/ast'

resolveRefName({ kind: 'Schema', type: 'ref', ref: '#/components/schemas/Pet' }) // 'Pet'

Adding a node

Adding a node touches three files.

  • Define the node type and its createFoo function in its own src/nodes/*.ts file, and add the kind to NodeKind in src/nodes/base.ts.
  • Add the type to the Node union and re-export createFoo in src/nodes/index.ts, and export the type from src/types.ts.
  • When the node has children or a visitor callback, add it to VISITOR_KEYS and VISITOR_KEY_BY_KIND in src/visitor.ts.

Supporting Kubb

Kubb is an open source project, and its development is funded entirely by sponsors. If you would like to become a sponsor, please consider:

My sponsors

License

MIT

Keywords

ast

FAQs

Package last updated on 15 Oct 2026

Related posts