JSPM

  • Created
  • Published
  • Downloads 29310
  • Score
    100M100P100Q159808F
  • License MIT

Spec-agnostic AST layer for Kubb. Defines nodes, visitor pattern, and factory functions used across codegen plugins.

Package Exports

  • @kubb/ast
  • @kubb/ast/package.json
  • @kubb/ast/types

Readme

Spec-agnostic AST layer for Kubb. Defines nodes, visitor pattern, factory functions, and type guards used across codegen plugins.

Imports

Path Contents
@kubb/ast Runtime: factory functions, guards, visitor, ref helpers, constants
@kubb/ast/types Types only: all node interfaces, type aliases, visitor types

Node tree

RootNode
├── 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

import { createRoot, createOperation, createSchema, createProperty } from '@kubb/ast'

const root = createRoot({
  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 { walk, transform, collect } from '@kubb/ast'

// Side effects
await walk(root, {
  schema(node) { console.log(node.type) },
})

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

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

Guards

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

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

Refs

import { buildRefMap, resolveRef } from '@kubb/ast'

const refMap = buildRefMap(root)
const pet = resolveRef(refMap, 'Pet')

Supporting Kubb

Kubb uses an MIT-licensed open source project with its ongoing development made possible entirely by the support of Sponsors. If you would like to become a sponsor, please consider:

My sponsors