@kubb/core 5.0.0-beta.75 → 5.0.0-beta.8
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 +9 -39
- package/dist/{PluginDriver-BXibeQk-.cjs → PluginDriver-Cu1Kj9S-.cjs} +95 -56
- package/dist/PluginDriver-Cu1Kj9S-.cjs.map +1 -0
- package/dist/{PluginDriver-DV3p2Hky.js → PluginDriver-D8Z0Htid.js} +90 -57
- package/dist/PluginDriver-D8Z0Htid.js.map +1 -0
- package/dist/{types-CuNocrbJ.d.ts → createKubb-Cagd4PIe.d.ts} +1427 -1493
- package/dist/index.cjs +119 -127
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +3 -143
- package/dist/index.js +119 -127
- package/dist/index.js.map +1 -1
- package/dist/mocks.cjs +1 -1
- package/dist/mocks.cjs.map +1 -1
- package/dist/mocks.d.ts +1 -1
- package/dist/mocks.js +1 -1
- package/dist/mocks.js.map +1 -1
- package/package.json +5 -12
- package/src/PluginDriver.ts +40 -7
- package/src/constants.ts +1 -1
- package/src/createAdapter.ts +77 -1
- package/src/createKubb.ts +802 -82
- package/src/defineGenerator.ts +92 -4
- package/src/defineLogger.ts +42 -3
- package/src/defineMiddleware.ts +1 -1
- package/src/definePlugin.ts +304 -8
- package/src/defineResolver.ts +184 -51
- package/src/devtools.ts +8 -1
- package/src/index.ts +1 -1
- package/src/mocks.ts +1 -2
- package/src/storages/fsStorage.ts +6 -30
- package/src/types.ts +37 -1292
- package/dist/PluginDriver-BXibeQk-.cjs.map +0 -1
- package/dist/PluginDriver-DV3p2Hky.js.map +0 -1
- package/src/Kubb.ts +0 -300
- package/src/renderNode.ts +0 -35
- package/src/utils/diagnostics.ts +0 -18
- package/src/utils/isInputPath.ts +0 -10
- package/src/utils/packageJSON.ts +0 -99
package/dist/mocks.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mocks.js","names":[],"sources":["../src/mocks.ts"],"sourcesContent":["import { resolve } from 'node:path'\nimport type { FileNode, OperationNode, SchemaNode, Visitor } from '@kubb/ast'\nimport { transform } from '@kubb/ast'\nimport { FileManager } from './FileManager.ts'\nimport { PluginDriver } from './PluginDriver.ts'\nimport
|
|
1
|
+
{"version":3,"file":"mocks.js","names":[],"sources":["../src/mocks.ts"],"sourcesContent":["import { resolve } from 'node:path'\nimport type { FileNode, OperationNode, SchemaNode, Visitor } from '@kubb/ast'\nimport { transform } from '@kubb/ast'\nimport { FileManager } from './FileManager.ts'\nimport { applyHookResult, PluginDriver } from './PluginDriver.ts'\nimport type { Adapter, AdapterFactoryOptions, Config, Generator, GeneratorContext, NormalizedPlugin, PluginFactoryOptions } from './types.ts'\n\n/**\n\n * Creates a minimal `PluginDriver` mock for unit tests.\n */\nexport function createMockedPluginDriver(options: { name?: string; plugin?: NormalizedPlugin; config?: Config } = {}): PluginDriver {\n return {\n config: options?.config ?? {\n root: '.',\n output: {\n path: './path',\n },\n },\n getPlugin(_pluginName: string): NormalizedPlugin | undefined {\n return options?.plugin\n },\n getResolver: (_pluginName: string) => options?.plugin?.resolver,\n fileManager: new FileManager(),\n } as unknown as PluginDriver\n}\n\n/**\n * Creates a minimal `Adapter` mock for unit tests.\n * `parse` returns an empty `InputNode` by default; override via `options.parse`.\n * `getImports` returns `[]` by default.\n */\nexport function createMockedAdapter<TOptions extends AdapterFactoryOptions = AdapterFactoryOptions>(\n options: {\n name?: TOptions['name']\n resolvedOptions?: TOptions['resolvedOptions']\n inputNode?: Adapter<TOptions>['inputNode']\n parse?: Adapter<TOptions>['parse']\n getImports?: Adapter<TOptions>['getImports']\n } = {},\n): Adapter<TOptions> {\n const inputNode = options.inputNode ?? null\n return {\n name: (options.name ?? 'oas') as TOptions['name'],\n options: (options.resolvedOptions ?? {}) as TOptions['resolvedOptions'],\n inputNode,\n parse: options.parse ?? (async () => ({ kind: 'Input' as const, schemas: [], operations: [] })),\n getImports: options.getImports ?? ((_node: SchemaNode, _resolve: (schemaName: string) => { name: string; path: string }) => []),\n } as Adapter<TOptions>\n}\n\n/**\n * Creates a minimal plugin mock for unit tests.\n *\n * @example\n * `const plugin = createMockedPlugin<PluginTs>({ name: '@kubb/plugin-ts', options })`\n */\nexport function createMockedPlugin<TOptions extends PluginFactoryOptions = PluginFactoryOptions>(params: {\n name: TOptions['name']\n options: TOptions['resolvedOptions']\n resolver?: TOptions['resolver']\n transformer?: Visitor\n dependencies?: Array<string>\n}): NormalizedPlugin<TOptions> {\n return {\n name: params.name,\n options: params.options,\n resolver: params.resolver,\n transformer: params.transformer,\n dependencies: params.dependencies,\n hooks: {},\n } as unknown as NormalizedPlugin<TOptions>\n}\n\ntype RenderGeneratorOptions<TOptions extends PluginFactoryOptions> = {\n config: Config\n adapter: Adapter\n driver: PluginDriver\n plugin: NormalizedPlugin<TOptions>\n options: TOptions['resolvedOptions']\n resolver: TOptions['resolver']\n}\n\nfunction createMockedPluginContext<TOptions extends PluginFactoryOptions>(opts: RenderGeneratorOptions<TOptions>): Omit<GeneratorContext<TOptions>, 'options'> {\n const root = resolve(opts.config.root, opts.config.output.path)\n\n return {\n config: opts.config,\n root,\n getMode: (output: { path: string }) => PluginDriver.getMode(resolve(root, output.path)),\n adapter: opts.adapter,\n resolver: opts.resolver,\n plugin: opts.plugin,\n driver: opts.driver,\n getResolver: (name: string) => opts.driver.getResolver(name),\n inputNode: { kind: 'Input', schemas: [], operations: [] },\n addFile: async (...files: Array<FileNode>) => opts.driver.fileManager.add(...files),\n upsertFile: async (...files: Array<FileNode>) => opts.driver.fileManager.upsert(...files),\n hooks: opts.driver.hooks ?? ({} as never),\n warn: (msg: string) => console.warn(msg),\n error: (msg: string) => console.error(msg),\n info: (msg: string) => console.info(msg),\n openInStudio: async () => {},\n } as unknown as Omit<GeneratorContext<TOptions>, 'options'>\n}\n\n/**\n * Renders a generator's `schema` method in a test context.\n *\n * @example\n * ```ts\n * await renderGeneratorSchema(typeGenerator, node, { config, adapter, driver, plugin, options, resolver })\n * await matchFiles(driver.fileManager.files)\n * ```\n */\nexport async function renderGeneratorSchema<TOptions extends PluginFactoryOptions>(\n generator: Generator<TOptions>,\n node: SchemaNode,\n opts: RenderGeneratorOptions<TOptions>,\n): Promise<void> {\n if (!generator.schema) return\n const context = createMockedPluginContext(opts)\n const transformedNode = opts.plugin.transformer ? transform(node, opts.plugin.transformer) : node\n const result = await generator.schema(transformedNode, {\n ...context,\n options: opts.options,\n })\n await applyHookResult(result, opts.driver, generator.renderer ?? undefined)\n}\n\n/**\n * Renders a generator's `operation` method in a test context.\n *\n * @example\n * ```ts\n * await renderGeneratorOperation(typeGenerator, node, { config, adapter, driver, plugin, options, resolver })\n * await matchFiles(driver.fileManager.files)\n * ```\n */\nexport async function renderGeneratorOperation<TOptions extends PluginFactoryOptions>(\n generator: Generator<TOptions>,\n node: OperationNode,\n opts: RenderGeneratorOptions<TOptions>,\n): Promise<void> {\n if (!generator.operation) return\n const context = createMockedPluginContext(opts)\n const transformedNode = opts.plugin.transformer ? transform(node, opts.plugin.transformer) : node\n const result = await generator.operation(transformedNode, {\n ...context,\n options: opts.options,\n })\n await applyHookResult(result, opts.driver, generator.renderer ?? undefined)\n}\n\n/**\n * Renders a generator's `operations` method in a test context.\n *\n * @example\n * ```ts\n * await renderGeneratorOperations(classClientGenerator, nodes, { config, adapter, driver, plugin, options, resolver })\n * await matchFiles(driver.fileManager.files)\n * ```\n */\nexport async function renderGeneratorOperations<TOptions extends PluginFactoryOptions>(\n generator: Generator<TOptions>,\n nodes: Array<OperationNode>,\n opts: RenderGeneratorOptions<TOptions>,\n): Promise<void> {\n if (!generator.operations) return\n const context = createMockedPluginContext(opts)\n const transformedNodes = opts.plugin.transformer ? nodes.map((n) => transform(n, opts.plugin.transformer!)) : nodes\n const result = await generator.operations(transformedNodes, {\n ...context,\n options: opts.options,\n })\n await applyHookResult(result, opts.driver, generator.renderer ?? undefined)\n}\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,20 +1,13 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@kubb/core",
|
|
3
|
-
"version": "5.0.0-beta.
|
|
4
|
-
"description": "Core
|
|
3
|
+
"version": "5.0.0-beta.8",
|
|
4
|
+
"description": "Core engine for Kubb's plugin-based code generation system. Provides the plugin driver, file manager, defineConfig, and build orchestration used by every Kubb plugin.",
|
|
5
5
|
"keywords": [
|
|
6
|
-
"ast",
|
|
7
6
|
"code-generator",
|
|
8
7
|
"codegen",
|
|
9
|
-
"core-library",
|
|
10
|
-
"file-system",
|
|
11
8
|
"kubb",
|
|
12
|
-
"oas",
|
|
13
9
|
"openapi",
|
|
14
|
-
"plugin-framework",
|
|
15
10
|
"plugin-system",
|
|
16
|
-
"plugins",
|
|
17
|
-
"swagger",
|
|
18
11
|
"typescript"
|
|
19
12
|
],
|
|
20
13
|
"license": "MIT",
|
|
@@ -65,15 +58,15 @@
|
|
|
65
58
|
"dependencies": {
|
|
66
59
|
"fflate": "^0.8.2",
|
|
67
60
|
"tinyexec": "^1.1.2",
|
|
68
|
-
"@kubb/ast": "5.0.0-beta.
|
|
61
|
+
"@kubb/ast": "5.0.0-beta.8"
|
|
69
62
|
},
|
|
70
63
|
"devDependencies": {
|
|
71
64
|
"p-limit": "^7.3.0",
|
|
72
65
|
"@internals/utils": "0.0.0",
|
|
73
|
-
"@kubb/renderer-jsx": "5.0.0-beta.
|
|
66
|
+
"@kubb/renderer-jsx": "5.0.0-beta.8"
|
|
74
67
|
},
|
|
75
68
|
"peerDependencies": {
|
|
76
|
-
"@kubb/renderer-jsx": "5.0.0-beta.
|
|
69
|
+
"@kubb/renderer-jsx": "5.0.0-beta.8"
|
|
77
70
|
},
|
|
78
71
|
"size-limit": [
|
|
79
72
|
{
|
package/src/PluginDriver.ts
CHANGED
|
@@ -1,14 +1,15 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { resolve } from 'node:path'
|
|
2
2
|
import type { AsyncEventEmitter } from '@internals/utils'
|
|
3
3
|
import type { FileNode, InputNode, OperationNode, SchemaNode } from '@kubb/ast'
|
|
4
4
|
import { createFile } from '@kubb/ast'
|
|
5
5
|
import { DEFAULT_STUDIO_URL } from './constants.ts'
|
|
6
6
|
import type { Generator } from './defineGenerator.ts'
|
|
7
7
|
import type { Plugin } from './definePlugin.ts'
|
|
8
|
+
import { getMode } from './definePlugin.ts'
|
|
8
9
|
import { defineResolver } from './defineResolver.ts'
|
|
9
10
|
import { openInStudio as openInStudioFn } from './devtools.ts'
|
|
10
11
|
import { FileManager } from './FileManager.ts'
|
|
11
|
-
import {
|
|
12
|
+
import type { RendererFactory } from './createRenderer.ts'
|
|
12
13
|
|
|
13
14
|
import type {
|
|
14
15
|
Adapter,
|
|
@@ -46,10 +47,7 @@ export class PluginDriver {
|
|
|
46
47
|
* ```
|
|
47
48
|
*/
|
|
48
49
|
static getMode(fileOrFolder: string | undefined | null): 'single' | 'split' {
|
|
49
|
-
|
|
50
|
-
return 'split'
|
|
51
|
-
}
|
|
52
|
-
return extname(fileOrFolder) ? 'single' : 'split'
|
|
50
|
+
return getMode(fileOrFolder)
|
|
53
51
|
}
|
|
54
52
|
|
|
55
53
|
/**
|
|
@@ -138,6 +136,8 @@ export class PluginDriver {
|
|
|
138
136
|
registerPluginHooks(hookPlugin: Plugin, normalizedPlugin: NormalizedPlugin): void {
|
|
139
137
|
const { hooks } = hookPlugin
|
|
140
138
|
|
|
139
|
+
if (!hooks) return
|
|
140
|
+
|
|
141
141
|
// kubb:plugin:setup gets special treatment: the globally emitted context is wrapped with
|
|
142
142
|
// plugin-specific implementations so that addGenerator / setResolver / etc. target
|
|
143
143
|
// this plugin's normalizedPlugin entry rather than being no-ops.
|
|
@@ -189,6 +189,7 @@ export class PluginDriver {
|
|
|
189
189
|
*/
|
|
190
190
|
async emitSetupHooks(): Promise<void> {
|
|
191
191
|
const noop = () => {}
|
|
192
|
+
|
|
192
193
|
await this.hooks.emit('kubb:plugin:setup', {
|
|
193
194
|
config: this.config,
|
|
194
195
|
options: {},
|
|
@@ -300,7 +301,7 @@ export class PluginDriver {
|
|
|
300
301
|
return existingResolver
|
|
301
302
|
}
|
|
302
303
|
|
|
303
|
-
const resolver = defineResolver<PluginFactoryOptions>((
|
|
304
|
+
const resolver = defineResolver<PluginFactoryOptions>(() => ({
|
|
304
305
|
name: 'default',
|
|
305
306
|
pluginName,
|
|
306
307
|
}))
|
|
@@ -422,3 +423,35 @@ export class PluginDriver {
|
|
|
422
423
|
return plugin
|
|
423
424
|
}
|
|
424
425
|
}
|
|
426
|
+
|
|
427
|
+
/**
|
|
428
|
+
* Handles the return value of a plugin AST hook or generator method.
|
|
429
|
+
*
|
|
430
|
+
* - Renderer output → rendered via the provided `rendererFactory` (e.g. JSX), files stored in `driver.fileManager`
|
|
431
|
+
* - `Array<FileNode>` → added directly into `driver.fileManager`
|
|
432
|
+
* - `void` / `null` / `undefined` → no-op (plugin handled it via `this.upsertFile`)
|
|
433
|
+
*
|
|
434
|
+
* Pass a `rendererFactory` (e.g. `jsxRenderer` from `@kubb/renderer-jsx`) when the result
|
|
435
|
+
* may be a renderer element. Generators that only return `Array<FileNode>` do not need one.
|
|
436
|
+
*/
|
|
437
|
+
export async function applyHookResult<TElement = unknown>(
|
|
438
|
+
result: TElement | Array<FileNode> | void,
|
|
439
|
+
driver: PluginDriver,
|
|
440
|
+
rendererFactory?: RendererFactory<TElement>,
|
|
441
|
+
): Promise<void> {
|
|
442
|
+
if (!result) return
|
|
443
|
+
|
|
444
|
+
if (Array.isArray(result)) {
|
|
445
|
+
driver.fileManager.upsert(...(result as Array<FileNode>))
|
|
446
|
+
return
|
|
447
|
+
}
|
|
448
|
+
|
|
449
|
+
if (!rendererFactory) {
|
|
450
|
+
return
|
|
451
|
+
}
|
|
452
|
+
|
|
453
|
+
const renderer = rendererFactory()
|
|
454
|
+
await renderer.render(result)
|
|
455
|
+
driver.fileManager.upsert(...renderer.files)
|
|
456
|
+
renderer.unmount()
|
|
457
|
+
}
|
package/src/constants.ts
CHANGED
|
@@ -3,7 +3,7 @@ import type { FileNode } from '@kubb/ast'
|
|
|
3
3
|
/**
|
|
4
4
|
* Base URL for the Kubb Studio web app.
|
|
5
5
|
*/
|
|
6
|
-
export const DEFAULT_STUDIO_URL = 'https://
|
|
6
|
+
export const DEFAULT_STUDIO_URL = 'https://kubb.studio' as const
|
|
7
7
|
|
|
8
8
|
/**
|
|
9
9
|
* Maximum number of files processed in parallel by FileProcessor.
|
package/src/createAdapter.ts
CHANGED
|
@@ -1,4 +1,80 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { PossiblePromise } from '@internals/utils'
|
|
2
|
+
import type { ImportNode, InputNode, SchemaNode } from '@kubb/ast'
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Source data passed to an adapter's `parse` function.
|
|
6
|
+
* Mirrors the config input shape with paths resolved to absolute.
|
|
7
|
+
*/
|
|
8
|
+
export type AdapterSource = { type: 'path'; path: string } | { type: 'data'; data: string | unknown } | { type: 'paths'; paths: Array<string> }
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Generic type parameters for an adapter definition.
|
|
12
|
+
*
|
|
13
|
+
* - `TName` — unique identifier (e.g. `'oas'`, `'asyncapi'`)
|
|
14
|
+
* - `TOptions` — user-facing options passed to the adapter factory
|
|
15
|
+
* - `TResolvedOptions` — options after defaults applied
|
|
16
|
+
* - `TDocument` — type of the parsed source document
|
|
17
|
+
*/
|
|
18
|
+
export type AdapterFactoryOptions<
|
|
19
|
+
TName extends string = string,
|
|
20
|
+
TOptions extends object = object,
|
|
21
|
+
TResolvedOptions extends object = TOptions,
|
|
22
|
+
TDocument = unknown,
|
|
23
|
+
> = {
|
|
24
|
+
name: TName
|
|
25
|
+
options: TOptions
|
|
26
|
+
resolvedOptions: TResolvedOptions
|
|
27
|
+
document: TDocument
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Adapter that converts input files or data into an `InputNode`.
|
|
32
|
+
*
|
|
33
|
+
* Adapters parse different schema formats (OpenAPI, AsyncAPI, Drizzle, etc.) into Kubb's
|
|
34
|
+
* universal intermediate representation that all plugins consume.
|
|
35
|
+
*
|
|
36
|
+
* @example
|
|
37
|
+
* ```ts
|
|
38
|
+
* import { adapterOas } from '@kubb/adapter-oas'
|
|
39
|
+
*
|
|
40
|
+
* export default defineConfig({
|
|
41
|
+
* adapter: adapterOas(),
|
|
42
|
+
* input: { path: './openapi.yaml' },
|
|
43
|
+
* plugins: [pluginTs(), pluginZod()],
|
|
44
|
+
* })
|
|
45
|
+
* ```
|
|
46
|
+
*/
|
|
47
|
+
export type Adapter<TOptions extends AdapterFactoryOptions = AdapterFactoryOptions> = {
|
|
48
|
+
/**
|
|
49
|
+
* Human-readable adapter identifier (e.g. `'oas'`, `'asyncapi'`).
|
|
50
|
+
*/
|
|
51
|
+
name: TOptions['name']
|
|
52
|
+
/**
|
|
53
|
+
* Resolved adapter options after defaults have been applied.
|
|
54
|
+
*/
|
|
55
|
+
options: TOptions['resolvedOptions']
|
|
56
|
+
/**
|
|
57
|
+
* Parsed source document after the first `parse()` call. `null` before parsing.
|
|
58
|
+
*/
|
|
59
|
+
document: TOptions['document'] | null
|
|
60
|
+
inputNode: InputNode | null
|
|
61
|
+
/**
|
|
62
|
+
* Parse the source into a universal `InputNode`.
|
|
63
|
+
*/
|
|
64
|
+
parse: (source: AdapterSource) => PossiblePromise<InputNode>
|
|
65
|
+
/**
|
|
66
|
+
* Extract `ImportNode` entries for a schema tree.
|
|
67
|
+
* Returns an empty array before the first `parse()` call.
|
|
68
|
+
*
|
|
69
|
+
* The `resolve` callback receives the collision-corrected schema name and must
|
|
70
|
+
* return `{ name, path }` for the import, or `undefined` to skip it.
|
|
71
|
+
*/
|
|
72
|
+
getImports: (node: SchemaNode, resolve: (schemaName: string) => { name: string; path: string }) => Array<ImportNode>
|
|
73
|
+
/**
|
|
74
|
+
* Validate the document at the given path or URL.
|
|
75
|
+
*/
|
|
76
|
+
validate: (input: string, options?: { throwOnError?: boolean }) => Promise<void>
|
|
77
|
+
}
|
|
2
78
|
|
|
3
79
|
type AdapterBuilder<T extends AdapterFactoryOptions> = (options: T['options']) => Adapter<T>
|
|
4
80
|
|