@kubb/renderer-jsx 5.0.0-beta.75 → 5.0.0-beta.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md ADDED
@@ -0,0 +1,124 @@
1
+ <div align="center">
2
+ <h1>@kubb/renderer-jsx</h1>
3
+ <a href="https://kubb.dev" target="_blank" rel="noopener noreferrer">
4
+ <img width="180" src="https://raw.githubusercontent.com/kubb-labs/kubb/main/assets/logo.png" alt="Kubb logo">
5
+ </a>
6
+
7
+ [![npm version][npm-version-src]][npm-version-href]
8
+ [![npm downloads][npm-downloads-src]][npm-downloads-href]
9
+ [![Coverage][coverage-src]][coverage-href]
10
+ [![License][license-src]][license-href]
11
+ [![Sponsors][sponsors-src]][sponsors-href]
12
+
13
+ <h4>
14
+ <a href="https://kubb.dev/" target="_blank">Documentation</a>
15
+ <span> · </span>
16
+ <a href="https://github.com/kubb-labs/kubb/issues/" target="_blank">Report Bug</a>
17
+ <span> · </span>
18
+ <a href="https://github.com/kubb-labs/kubb/issues/" target="_blank">Request Feature</a>
19
+ </h4>
20
+ </div>
21
+
22
+ JSX-based renderer for Kubb. Provides a custom React runtime, reconciler, and built-in components (`File`, `Function`, `Type`, `Const`) for component-based, type-safe code generation inside Kubb plugins.
23
+
24
+ ## Installation
25
+
26
+ ```bash
27
+ bun add @kubb/renderer-jsx
28
+ # or
29
+ pnpm add @kubb/renderer-jsx
30
+ # or
31
+ npm install @kubb/renderer-jsx
32
+ ```
33
+
34
+ ## Usage
35
+
36
+ Use the built-in components inside a Kubb plugin to emit generated files:
37
+
38
+ ```tsx
39
+ import { createRenderer } from '@kubb/renderer-jsx'
40
+ import { File, Function, Type } from '@kubb/renderer-jsx'
41
+
42
+ const renderer = createRenderer()
43
+
44
+ await renderer.render(
45
+ <File baseName="petStore.ts" path="src/gen/petStore.ts">
46
+ <File.Source>
47
+ <Type name="Pet">{'{ id: number; name: string }'}</Type>
48
+ <Function name="getPet" async>
49
+ {"return fetch('/pets')"}
50
+ </Function>
51
+ </File.Source>
52
+ </File>,
53
+ )
54
+
55
+ const files = renderer.files
56
+ renderer.unmount()
57
+ ```
58
+
59
+ ## Built-in Components
60
+
61
+ | Component | Description |
62
+ | --------------- | --------------------------------------------------------------------------- |
63
+ | `<File>` | Declares a generated output file with its path and optional imports/exports |
64
+ | `<File.Source>` | The source content block inside a `<File>` |
65
+ | `<Function>` | Generates a TypeScript function declaration |
66
+ | `<Type>` | Generates a TypeScript type alias |
67
+ | `<Const>` | Generates a `const` variable declaration |
68
+ | `<Jsx>` | Renders JSX expressions inside generated output |
69
+ | `<Root>` | Root container for the renderer tree |
70
+
71
+ ## API
72
+
73
+ ### `createRenderer(options?)`
74
+
75
+ Creates a new renderer instance.
76
+
77
+ ```typescript
78
+ const renderer = createRenderer({ debug: false })
79
+ await renderer.render(<MyComponent />)
80
+ const files = renderer.files // FileNode[]
81
+ renderer.unmount()
82
+ ```
83
+
84
+ ### `jsxRenderer`
85
+
86
+ Pre-built renderer instance for use directly in Kubb plugins as the `jsxRenderer` plugin option.
87
+
88
+ ## JSX Runtime
89
+
90
+ `@kubb/renderer-jsx` ships its own JSX runtime (`jsx-runtime` and `jsx-dev-runtime`). Configure your `tsconfig.json` to use it:
91
+
92
+ ```json
93
+ {
94
+ "compilerOptions": {
95
+ "jsx": "react-jsx",
96
+ "jsxImportSource": "@kubb/renderer-jsx"
97
+ }
98
+ }
99
+ ```
100
+
101
+ ## Supporting Kubb
102
+
103
+ Kubb is an 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:
104
+
105
+ - [Become a Sponsor on GitHub](https://github.com/sponsors/stijnvanhulle)
106
+
107
+ <p align="center">
108
+ <a href="https://github.com/sponsors/stijnvanhulle">
109
+ <img src="https://raw.githubusercontent.com/stijnvanhulle/sponsors/main/sponsors.svg" alt="My sponsors" />
110
+ </a>
111
+ </p>
112
+
113
+ <!-- Badges -->
114
+
115
+ [npm-version-src]: https://img.shields.io/npm/v/@kubb/renderer-jsx?flat&colorA=18181B&colorB=f58517
116
+ [npm-version-href]: https://npmjs.com/package/@kubb/renderer-jsx
117
+ [npm-downloads-src]: https://img.shields.io/npm/dm/@kubb/renderer-jsx?flat&colorA=18181B&colorB=f58517
118
+ [npm-downloads-href]: https://npmjs.com/package/@kubb/renderer-jsx
119
+ [license-src]: https://img.shields.io/github/license/kubb-labs/kubb.svg?flat&colorA=18181B&colorB=f58517
120
+ [license-href]: https://github.com/kubb-labs/kubb/blob/main/LICENSE
121
+ [coverage-src]: https://img.shields.io/codecov/c/github/kubb-labs/kubb?style=flat&colorA=18181B&colorB=f58517
122
+ [coverage-href]: https://www.npmjs.com/package/@kubb/renderer-jsx
123
+ [sponsors-src]: https://img.shields.io/github/sponsors/stijnvanhulle?style=flat&colorA=18181B&colorB=f58517
124
+ [sponsors-href]: https://github.com/sponsors/stijnvanhulle/
package/dist/index.cjs CHANGED
@@ -18078,7 +18078,7 @@ var Runtime = class {
18078
18078
  nodes = [];
18079
18079
  #container;
18080
18080
  #rootNode;
18081
- constructor(options) {
18081
+ constructor(options = {}) {
18082
18082
  this.#options = options;
18083
18083
  this.#rootNode = createNode("kubb-root");
18084
18084
  this.#rootNode.onRender = this.onRender;
@@ -18149,53 +18149,10 @@ var Runtime = class {
18149
18149
  }
18150
18150
  this.resolveExitPromise();
18151
18151
  }
18152
- async waitUntilExit() {
18153
- if (!this.exitPromise) this.exitPromise = new Promise((resolve, reject) => {
18154
- this.resolveExitPromise = resolve;
18155
- this.rejectExitPromise = reject;
18156
- });
18157
- return this.exitPromise;
18158
- }
18159
18152
  };
18160
18153
  //#endregion
18161
18154
  //#region src/createRenderer.tsx
18162
18155
  /**
18163
- * Create a Kubb JSX renderer.
18164
- *
18165
- * The renderer converts a React JSX element tree — built from the components in this
18166
- * package — into an array of {@link FileNode} entries representing the generated files.
18167
- *
18168
- * @example Basic usage
18169
- * ```ts
18170
- * import { createRenderer, File } from '@kubb/renderer-jsx'
18171
- *
18172
- * const renderer = createRenderer()
18173
- * await renderer.render(
18174
- * <File baseName="pet.ts" path="src/models/pet.ts">
18175
- * <File.Source name="Pet" isExportable isIndexable>
18176
- * {`export type Pet = { id: number; name: string }`}
18177
- * </File.Source>
18178
- * </File>
18179
- * )
18180
- * console.log(renderer.files) // [FileNode]
18181
- * renderer.unmount()
18182
- * ```
18183
- */
18184
- function createRenderer(options = {}) {
18185
- const runtime = new Runtime(options);
18186
- return {
18187
- async render(Element) {
18188
- await runtime.render(Element);
18189
- },
18190
- get files() {
18191
- return runtime.nodes;
18192
- },
18193
- unmount(error) {
18194
- runtime.unmount(error);
18195
- }
18196
- };
18197
- }
18198
- /**
18199
18156
  * A renderer factory for generators that produce JSX output.
18200
18157
  *
18201
18158
  * Pass this as the `renderer` property of a `defineGenerator` call so that
@@ -18216,7 +18173,20 @@ function createRenderer(options = {}) {
18216
18173
  * })
18217
18174
  * ```
18218
18175
  */
18219
- const jsxRenderer = () => createRenderer();
18176
+ const jsxRenderer = () => {
18177
+ const runtime = new Runtime();
18178
+ return {
18179
+ async render(element) {
18180
+ await runtime.render(element);
18181
+ },
18182
+ get files() {
18183
+ return runtime.nodes;
18184
+ },
18185
+ unmount(error) {
18186
+ runtime.unmount(error);
18187
+ }
18188
+ };
18189
+ };
18220
18190
  //#endregion
18221
18191
  exports.Const = Const;
18222
18192
  exports.File = File;
@@ -18225,7 +18195,6 @@ exports.Jsx = Jsx;
18225
18195
  exports.Root = Root;
18226
18196
  exports.Type = Type;
18227
18197
  exports.createContext = createContext;
18228
- exports.createRenderer = createRenderer;
18229
18198
  exports.inject = inject;
18230
18199
  exports.jsxRenderer = jsxRenderer;
18231
18200
  exports.provide = provide;
package/dist/index.d.ts CHANGED
@@ -1,6 +1,7 @@
1
1
  import { n as __name } from "./chunk-Bb7HlUDG.js";
2
2
  import { a as JSDoc, h as KubbReactNode, m as KubbReactElement, o as Key } from "./types-nAFMiWFw.js";
3
- import { ExportNode, FileNode, ImportNode, SourceNode } from "@kubb/ast";
3
+ import * as _$_kubb_ast0 from "@kubb/ast";
4
+ import { ExportNode, ImportNode, SourceNode } from "@kubb/ast";
4
5
  import * as _$react from "react";
5
6
 
6
7
  //#region ../../internals/utils/src/context.d.ts
@@ -519,56 +520,6 @@ declare namespace Type {
519
520
  }
520
521
  //#endregion
521
522
  //#region src/createRenderer.d.ts
522
- type Options = {
523
- /**
524
- * Print each render result to the console for debugging.
525
- * Useful when diagnosing output differences between renders.
526
- * @default false
527
- */
528
- debug?: boolean;
529
- };
530
- /**
531
- * The renderer instance returned by {@link createRenderer}.
532
- */
533
- type Renderer = {
534
- /**
535
- * Render a JSX element tree and collect the resulting {@link FileNode} entries.
536
- * Resolves once all synchronous render work (including React's flush) is done.
537
- */
538
- render(Element: KubbReactElement): Promise<void>;
539
- /**
540
- * Tear down the renderer and release all React resources.
541
- * Pass an `Error` to signal an abnormal shutdown.
542
- */
543
- unmount(error?: Error | number | null): void;
544
- /**
545
- * The {@link FileNode} entries collected from the most recent `render` call.
546
- */
547
- files: Array<FileNode>;
548
- };
549
- /**
550
- * Create a Kubb JSX renderer.
551
- *
552
- * The renderer converts a React JSX element tree — built from the components in this
553
- * package — into an array of {@link FileNode} entries representing the generated files.
554
- *
555
- * @example Basic usage
556
- * ```ts
557
- * import { createRenderer, File } from '@kubb/renderer-jsx'
558
- *
559
- * const renderer = createRenderer()
560
- * await renderer.render(
561
- * <File baseName="pet.ts" path="src/models/pet.ts">
562
- * <File.Source name="Pet" isExportable isIndexable>
563
- * {`export type Pet = { id: number; name: string }`}
564
- * </File.Source>
565
- * </File>
566
- * )
567
- * console.log(renderer.files) // [FileNode]
568
- * renderer.unmount()
569
- * ```
570
- */
571
- declare function createRenderer(options?: Options): Renderer;
572
523
  /**
573
524
  * A renderer factory for generators that produce JSX output.
574
525
  *
@@ -590,7 +541,11 @@ declare function createRenderer(options?: Options): Renderer;
590
541
  * })
591
542
  * ```
592
543
  */
593
- declare const jsxRenderer: () => Renderer;
544
+ declare const jsxRenderer: () => {
545
+ render(element: KubbReactElement): Promise<void>;
546
+ readonly files: _$_kubb_ast0.FileNode[];
547
+ unmount(error?: Error | number | null): void;
548
+ };
594
549
  //#endregion
595
- export { Const, File, Function, Jsx, Root, Type, createContext, createRenderer, inject, jsxRenderer, provide, unprovide };
550
+ export { Const, File, Function, Jsx, Root, Type, createContext, inject, jsxRenderer, provide, unprovide };
596
551
  //# sourceMappingURL=index.d.ts.map
package/dist/index.js CHANGED
@@ -18075,7 +18075,7 @@ var Runtime = class {
18075
18075
  nodes = [];
18076
18076
  #container;
18077
18077
  #rootNode;
18078
- constructor(options) {
18078
+ constructor(options = {}) {
18079
18079
  this.#options = options;
18080
18080
  this.#rootNode = createNode("kubb-root");
18081
18081
  this.#rootNode.onRender = this.onRender;
@@ -18146,53 +18146,10 @@ var Runtime = class {
18146
18146
  }
18147
18147
  this.resolveExitPromise();
18148
18148
  }
18149
- async waitUntilExit() {
18150
- if (!this.exitPromise) this.exitPromise = new Promise((resolve, reject) => {
18151
- this.resolveExitPromise = resolve;
18152
- this.rejectExitPromise = reject;
18153
- });
18154
- return this.exitPromise;
18155
- }
18156
18149
  };
18157
18150
  //#endregion
18158
18151
  //#region src/createRenderer.tsx
18159
18152
  /**
18160
- * Create a Kubb JSX renderer.
18161
- *
18162
- * The renderer converts a React JSX element tree — built from the components in this
18163
- * package — into an array of {@link FileNode} entries representing the generated files.
18164
- *
18165
- * @example Basic usage
18166
- * ```ts
18167
- * import { createRenderer, File } from '@kubb/renderer-jsx'
18168
- *
18169
- * const renderer = createRenderer()
18170
- * await renderer.render(
18171
- * <File baseName="pet.ts" path="src/models/pet.ts">
18172
- * <File.Source name="Pet" isExportable isIndexable>
18173
- * {`export type Pet = { id: number; name: string }`}
18174
- * </File.Source>
18175
- * </File>
18176
- * )
18177
- * console.log(renderer.files) // [FileNode]
18178
- * renderer.unmount()
18179
- * ```
18180
- */
18181
- function createRenderer(options = {}) {
18182
- const runtime = new Runtime(options);
18183
- return {
18184
- async render(Element) {
18185
- await runtime.render(Element);
18186
- },
18187
- get files() {
18188
- return runtime.nodes;
18189
- },
18190
- unmount(error) {
18191
- runtime.unmount(error);
18192
- }
18193
- };
18194
- }
18195
- /**
18196
18153
  * A renderer factory for generators that produce JSX output.
18197
18154
  *
18198
18155
  * Pass this as the `renderer` property of a `defineGenerator` call so that
@@ -18213,8 +18170,21 @@ function createRenderer(options = {}) {
18213
18170
  * })
18214
18171
  * ```
18215
18172
  */
18216
- const jsxRenderer = () => createRenderer();
18173
+ const jsxRenderer = () => {
18174
+ const runtime = new Runtime();
18175
+ return {
18176
+ async render(element) {
18177
+ await runtime.render(element);
18178
+ },
18179
+ get files() {
18180
+ return runtime.nodes;
18181
+ },
18182
+ unmount(error) {
18183
+ runtime.unmount(error);
18184
+ }
18185
+ };
18186
+ };
18217
18187
  //#endregion
18218
- export { Const, File, Function$1 as Function, Jsx, Root, Type, createContext, createRenderer, inject, jsxRenderer, provide, unprovide };
18188
+ export { Const, File, Function$1 as Function, Jsx, Root, Type, createContext, inject, jsxRenderer, provide, unprovide };
18219
18189
 
18220
18190
  //# sourceMappingURL=index.js.map
package/package.json CHANGED
@@ -1,19 +1,13 @@
1
1
  {
2
2
  "name": "@kubb/renderer-jsx",
3
- "version": "5.0.0-beta.75",
4
- "description": "React integration for Kubb - JSX runtime and component-based code generation with React reconciler for building type-safe generators",
3
+ "version": "5.0.0-beta.9",
4
+ "description": "JSX-based renderer for Kubb. Provides a custom React runtime, reconciler, and built-in components (File, Function, Type, Const) for component-based, type-safe code generation.",
5
5
  "keywords": [
6
- "code-generator",
7
6
  "codegen",
8
- "component-generation",
9
- "file-generation",
10
7
  "jsx",
11
8
  "jsx-runtime",
12
9
  "kubb",
13
- "plugin-system",
14
- "plugins",
15
10
  "react",
16
- "react-reconciler",
17
11
  "typescript"
18
12
  ],
19
13
  "license": "MIT",
@@ -81,7 +75,7 @@
81
75
  "registry": "https://registry.npmjs.org/"
82
76
  },
83
77
  "dependencies": {
84
- "@kubb/ast": "5.0.0-beta.75"
78
+ "@kubb/ast": "5.0.0-beta.9"
85
79
  },
86
80
  "devDependencies": {
87
81
  "@types/react": "^19.2.14",
package/src/Renderer.ts CHANGED
@@ -155,9 +155,7 @@ export const Renderer = Reconciler({
155
155
  maySuspendCommit() {
156
156
  return false
157
157
  },
158
- // eslint-disable-next-line @typescript-eslint/naming-convention
159
158
  NotPendingTransition: undefined,
160
- // eslint-disable-next-line @typescript-eslint/naming-convention
161
159
  HostTransitionContext: createContext(null) as unknown as ReactContext<unknown>,
162
160
  resetFormInstance() {},
163
161
  requestPostPaintCallback() {},
@@ -180,5 +178,3 @@ export const Renderer = Reconciler({
180
178
  return null
181
179
  },
182
180
  })
183
-
184
- export type { FiberRoot } from 'react-reconciler'
package/src/Runtime.tsx CHANGED
@@ -3,7 +3,7 @@ import type { FileNode } from '@kubb/ast'
3
3
  import { ConcurrentRoot } from 'react-reconciler/constants.js'
4
4
  import { Root } from './components/Root.tsx'
5
5
  import { createNode } from './dom.ts'
6
- import type { FiberRoot } from './Renderer.ts'
6
+ import type { FiberRoot } from 'react-reconciler'
7
7
  import { Renderer } from './Renderer.ts'
8
8
  import type { DOMElement, KubbReactElement } from './types.ts'
9
9
  import { processFiles } from './utils.ts'
@@ -26,7 +26,7 @@ export class Runtime {
26
26
  readonly #container: FiberRoot
27
27
  readonly #rootNode: DOMElement
28
28
 
29
- constructor(options: Options) {
29
+ constructor(options: Options = {}) {
30
30
  this.#options = options
31
31
  this.#rootNode = createNode('kubb-root')
32
32
  this.#rootNode.onRender = this.onRender
@@ -156,15 +156,4 @@ export class Runtime {
156
156
 
157
157
  this.resolveExitPromise()
158
158
  }
159
-
160
- async waitUntilExit(): Promise<void> {
161
- if (!this.exitPromise) {
162
- this.exitPromise = new Promise((resolve, reject) => {
163
- this.resolveExitPromise = resolve
164
- this.rejectExitPromise = reject
165
- })
166
- }
167
-
168
- return this.exitPromise
169
- }
170
159
  }
@@ -1,74 +1,6 @@
1
- import type { FileNode } from '@kubb/ast'
2
1
  import { Runtime } from './Runtime.tsx'
3
2
  import type { KubbReactElement } from './types.ts'
4
3
 
5
- type Options = {
6
- /**
7
- * Print each render result to the console for debugging.
8
- * Useful when diagnosing output differences between renders.
9
- * @default false
10
- */
11
- debug?: boolean
12
- }
13
-
14
- /**
15
- * The renderer instance returned by {@link createRenderer}.
16
- */
17
- type Renderer = {
18
- /**
19
- * Render a JSX element tree and collect the resulting {@link FileNode} entries.
20
- * Resolves once all synchronous render work (including React's flush) is done.
21
- */
22
- render(Element: KubbReactElement): Promise<void>
23
- /**
24
- * Tear down the renderer and release all React resources.
25
- * Pass an `Error` to signal an abnormal shutdown.
26
- */
27
- unmount(error?: Error | number | null): void
28
- /**
29
- * The {@link FileNode} entries collected from the most recent `render` call.
30
- */
31
- files: Array<FileNode>
32
- }
33
-
34
- /**
35
- * Create a Kubb JSX renderer.
36
- *
37
- * The renderer converts a React JSX element tree — built from the components in this
38
- * package — into an array of {@link FileNode} entries representing the generated files.
39
- *
40
- * @example Basic usage
41
- * ```ts
42
- * import { createRenderer, File } from '@kubb/renderer-jsx'
43
- *
44
- * const renderer = createRenderer()
45
- * await renderer.render(
46
- * <File baseName="pet.ts" path="src/models/pet.ts">
47
- * <File.Source name="Pet" isExportable isIndexable>
48
- * {`export type Pet = { id: number; name: string }`}
49
- * </File.Source>
50
- * </File>
51
- * )
52
- * console.log(renderer.files) // [FileNode]
53
- * renderer.unmount()
54
- * ```
55
- */
56
- export function createRenderer(options: Options = {}): Renderer {
57
- const runtime = new Runtime(options)
58
-
59
- return {
60
- async render(Element) {
61
- await runtime.render(Element)
62
- },
63
- get files() {
64
- return runtime.nodes
65
- },
66
- unmount(error) {
67
- runtime.unmount(error)
68
- },
69
- }
70
- }
71
-
72
4
  /**
73
5
  * A renderer factory for generators that produce JSX output.
74
6
  *
@@ -90,4 +22,17 @@ export function createRenderer(options: Options = {}): Renderer {
90
22
  * })
91
23
  * ```
92
24
  */
93
- export const jsxRenderer: () => Renderer = () => createRenderer()
25
+ export const jsxRenderer = () => {
26
+ const runtime = new Runtime()
27
+ return {
28
+ async render(element: KubbReactElement) {
29
+ await runtime.render(element)
30
+ },
31
+ get files() {
32
+ return runtime.nodes
33
+ },
34
+ unmount(error?: Error | number | null) {
35
+ runtime.unmount(error)
36
+ },
37
+ }
38
+ }
package/src/dom.ts CHANGED
@@ -6,14 +6,12 @@ import type { DOMElement, DOMNode, DOMNodeAttribute, TextNode } from './types.ts
6
6
  * The element has no attributes, no children, and no parent.
7
7
  */
8
8
  export const createNode = (nodeName: string): DOMElement => {
9
- const node: DOMElement = {
9
+ return {
10
10
  nodeName: nodeName as DOMElement['nodeName'],
11
11
  attributes: new Map(),
12
12
  childNodes: [],
13
13
  parentNode: undefined,
14
14
  }
15
-
16
- return node
17
15
  }
18
16
 
19
17
  /**
package/src/index.ts CHANGED
@@ -5,4 +5,4 @@ export { Function } from './components/Function.tsx'
5
5
  export { Jsx } from './components/Jsx.tsx'
6
6
  export { Root } from './components/Root.tsx'
7
7
  export { Type } from './components/Type.tsx'
8
- export { createRenderer, jsxRenderer } from './createRenderer.tsx'
8
+ export { jsxRenderer } from './createRenderer.tsx'