npx skills add ...
npx skills add prisma/prisma-next --skill ast-visitor-pattern
Use the frozen-class/visitor pattern for discriminated unions that have multiple dispatch sites. Use when creating a new set of variants (commands, IR nodes, factory calls) that will be switched over in 2+ places, or when refactoring an existing union type that has grown multiple switch sites.
npx skills add prisma/prisma-next --skill ast-visitor-pattern
When a discriminated union has 3+ variants and 2+ dispatch sites (renderers, serializers, classifiers, etc.), replace plain union + switch with frozen subclasses and a visitor interface. This makes adding a new variant a compiler error at every consumer, instead of a silent omission.
Four pieces, always in the same file:
Define a visitor object (or class) per concern:
This holds everywhere a node is built — tests and production construction surfaces (contract-free factories, builders). A factory must return new BarNode(...), never Object.freeze({ kind: 'bar', value: 'x' }). A frozen plain object has no prototype, so instanceof fails, accept() is missing, and a downstream shallow-copy ({ ...node }) silently strips the type back to an anonymous bag; constructor-time invariants are skipped too.
MongoAstNode / MongoDdlCommandVisitor — packages/2-mongo-family/4-query/query-ast/src/ddl-commands.tsOpFactoryCall / OpFactoryCallVisitor — packages/3-mongo-target/1-mongo-target/src/core/op-factory-call.ts