ast-visitor-pattern

द्वारा prisma

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,…

npx skills add https://github.com/prisma/prisma-next --skill ast-visitor-pattern

AST Class/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.

Structure

Four pieces, always in the same file:

// 1. Abstract base (not exported — consumers use the union type)
abstract class FooNode {
  abstract readonly kind: string;
  abstract accept<R>(visitor: FooVisitor<R>): R;
  protected freeze(): void { Object.freeze(this); }
}

// 2. Visitor interface
export interface FooVisitor<R> {
  bar(node: BarNode): R;
  baz(node: BazNode): R;
}

// 3. Concrete subclasses — readonly fields, freeze() in constructor
export class BarNode extends FooNode {
  readonly kind = 'bar' as const;
  readonly value: string;
  constructor(value: string) {
    super();
    this.value = value;
    this.freeze();
  }
  accept<R>(visitor: FooVisitor<R>): R { return visitor.bar(this); }
}

export class BazNode extends FooNode {
  readonly kind = 'baz' as const;
  readonly count: number;
  constructor(count: number) {
    super();
    this.count = count;
    this.freeze();
  }
  accept<R>(visitor: FooVisitor<R>): R { return visitor.baz(this); }
}

// 4. Union type
export type Foo = BarNode | BazNode;

Consuming

Define a visitor object (or class) per concern:

const renderVisitor: FooVisitor<string> = {
  bar(node) { return node.value; },
  baz(node) { return String(node.count); },
};

function render(node: Foo): string {
  return node.accept(renderVisitor);
}

Always construct instances, never frozen object literals

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.

// ✅
const call = new BarNode('x');
export function bar(value: string): BarNode { return new BarNode(value); }

// ❌
const call: Foo = { kind: 'bar', value: 'x' };
export function bar(value: string): Foo { return Object.freeze({ kind: 'bar', value }); }

When NOT to use

  • Single dispatch site → plain union + switch is simpler
  • Fewer than 3 variants with no expected growth → not worth the boilerplate

Codebase examples

  • MongoAstNode / MongoDdlCommandVisitorpackages/2-mongo-family/4-query/query-ast/src/ddl-commands.ts
  • OpFactoryCall / OpFactoryCallVisitorpackages/3-mongo-target/1-mongo-target/src/core/op-factory-call.ts

prisma की और Skills

prisma-cli-migrate-reset
prisma
prisma माइग्रेट रीसेट
official
prisma-cli-validate
prisma
prisma वैधता। इस Prisma सुविधा का उपयोग करते समय संदर्भ।
official
prisma-next-extension-upgrade
prisma
Upgrade Prisma Next in your extension. Bumps every `@prisma-next/*` dependency to the requested target (or npm `latest`), runs the per-transition upgrade…
official
adr-review
prisma
एक या अधिक ADRs की नई दृष्टि से समीक्षा करें (बिना पूर्व संदर्भ के एक टीम सदस्य के रूप में), कथा और संरचनात्मक मुद्दों की पहचान करें, फिर उन्हें पुनः लिखें। तब उपयोग करें जब...
official
prisma-next-upgrade
prisma
Upgrade Prisma Next in your app. Bumps every `@prisma-next/*` dependency from the version pinned in the lockfile to the requested target (or npm `latest`),…
official
prisma-cli
prisma
Prisma CLI कमांड, विकल्पों और वर्कफ़्लो का पूर्ण संदर्भ, जिसमें सेटअप, माइग्रेशन और डेटाबेस संचालन शामिल हैं। इसमें प्राथमिकता के अनुसार व्यवस्थित 20+ कमांड शामिल हैं: सेटअप (init), जनरेशन (generate), डेवलपमेंट (dev), डेटाबेस संचालन (db pull/push/seed/execute), और माइग्रेशन (migrate dev/deploy/reset/status/diff/resolve)। इसमें Prisma 7.x परिवर्तन शामिल हैं: नई prisma.config.ts कॉन्फ़िगरेशन फ़ाइल, हटाए गए फ़्लैग (--skip-generate,
official
prisma-client-api
prisma
Prisma क्लाइंट API का पूर्ण संदर्भ, जिसमें मॉडल क्वेरी, CRUD संचालन, फ़िल्टरिंग, संबंध और लेन-देन शामिल हैं। इसमें 17 मॉडल क्वेरी विधियाँ शामिल हैं, जिनमें findUnique, findMany, create, update, delete, upsert और रिटर्न वेरिएंट के साथ बल्क संचालन शामिल हैं। परिणामों को आकार देने के लिए क्वेरी विकल्प प्रदान करता है: select, include, omit, orderBy, take, skip, cursor और distinct। इसमें स्केलर और लॉजिकल फ़िल्टर ऑपरेटर (equals, in, contains, startsWith, lt, gt) के साथ-स
official
prisma-compute
prisma
Prisma Compute deployment and hosting guide. Use whenever the user mentions Prisma Compute, `prisma.compute.ts`, `defineComputeConfig`, deploying or hosting a Prisma app, `@prisma/cli app deploy`, `compute:deploy`, `create-prisma --deploy`, `PRISMA_SERVICE_TOKEN`, `auth workspace`, Compute apps/deployments/build logs/domains, `@prisma/cli agent install`, localhost vs `0.0.0.0`, deploy port binding, or framework deploy readiness for Hono, Elysia, Next.js, TanStack Start, Astro, Nuxt, Svelte,...
developmentdevopsofficial