@kubb/plugin-mcp 5.0.0-alpha.29 → 5.0.0-alpha.30

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/dist/index.js CHANGED
@@ -1,10 +1,10 @@
1
1
  import "./chunk--u3MIqq1.js";
2
2
  import path from "node:path";
3
- import { caseParams, createFunctionParameter, createFunctionParameters, createOperationParams, createParameterGroup, transform, walk } from "@kubb/ast";
3
+ import { caseParams, createFunctionParameter, createFunctionParameters, createOperationParams, createParameterGroup } from "@kubb/ast";
4
4
  import { functionPrinter, pluginTsName } from "@kubb/plugin-ts";
5
5
  import { Const, File, Function as Function$1 } from "@kubb/react-fabric";
6
6
  import { Fragment, jsx, jsxs } from "@kubb/react-fabric/jsx-runtime";
7
- import { createPlugin, defineGenerator, definePresets, defineResolver, getBarrelFiles, getPreset, runGeneratorOperation, runGeneratorOperations, runGeneratorSchema } from "@kubb/core";
7
+ import { createPlugin, defineGenerator, definePresets, defineResolver, getPreset, mergeGenerators } from "@kubb/core";
8
8
  import { pluginZodName } from "@kubb/plugin-zod";
9
9
  import { pluginClientName } from "@kubb/plugin-client";
10
10
  import { source } from "@kubb/plugin-client/templates/clients/axios.source";
@@ -480,42 +480,40 @@ server.registerTool(${JSON.stringify(tool.name)}, {
480
480
  //#region src/generators/mcpGenerator.tsx
481
481
  const mcpGenerator = defineGenerator({
482
482
  name: "mcp",
483
- type: "react",
484
- Operation({ node, options, config, driver, resolver, plugin }) {
483
+ operation(node, options) {
484
+ const { resolver, driver, root } = this;
485
485
  const { output, client, paramsCasing, group } = options;
486
- const root = path.resolve(config.root, config.output.path);
487
486
  const pluginTs = driver.getPlugin(pluginTsName);
488
487
  if (!pluginTs?.resolver) return null;
489
- const transformedNode = plugin.transformer ? transform(node, plugin.transformer) : node;
490
- const casedParams = caseParams(transformedNode.parameters, paramsCasing);
488
+ const casedParams = caseParams(node.parameters, paramsCasing);
491
489
  const pathParams = casedParams.filter((p) => p.in === "path");
492
490
  const queryParams = casedParams.filter((p) => p.in === "query");
493
491
  const headerParams = casedParams.filter((p) => p.in === "header");
494
492
  const importedTypeNames = [
495
- ...pathParams.map((p) => pluginTs.resolver.resolvePathParamsName(transformedNode, p)),
496
- ...queryParams.map((p) => pluginTs.resolver.resolveQueryParamsName(transformedNode, p)),
497
- ...headerParams.map((p) => pluginTs.resolver.resolveHeaderParamsName(transformedNode, p)),
498
- transformedNode.requestBody?.schema ? pluginTs.resolver.resolveDataName(transformedNode) : void 0,
499
- pluginTs.resolver.resolveResponseName(transformedNode),
500
- ...transformedNode.responses.filter((r) => Number(r.statusCode) >= 400).map((r) => pluginTs.resolver.resolveResponseStatusName(transformedNode, r.statusCode))
493
+ ...pathParams.map((p) => pluginTs.resolver.resolvePathParamsName(node, p)),
494
+ ...queryParams.map((p) => pluginTs.resolver.resolveQueryParamsName(node, p)),
495
+ ...headerParams.map((p) => pluginTs.resolver.resolveHeaderParamsName(node, p)),
496
+ node.requestBody?.schema ? pluginTs.resolver.resolveDataName(node) : void 0,
497
+ pluginTs.resolver.resolveResponseName(node),
498
+ ...node.responses.filter((r) => Number(r.statusCode) >= 400).map((r) => pluginTs.resolver.resolveResponseStatusName(node, r.statusCode))
501
499
  ].filter(Boolean);
502
500
  const meta = {
503
- name: resolver.resolveName(transformedNode.operationId),
501
+ name: resolver.resolveName(node.operationId),
504
502
  file: resolver.resolveFile({
505
- name: transformedNode.operationId,
503
+ name: node.operationId,
506
504
  extname: ".ts",
507
- tag: transformedNode.tags[0] ?? "default",
508
- path: transformedNode.path
505
+ tag: node.tags[0] ?? "default",
506
+ path: node.path
509
507
  }, {
510
508
  root,
511
509
  output,
512
510
  group
513
511
  }),
514
512
  fileTs: pluginTs.resolver.resolveFile({
515
- name: transformedNode.operationId,
513
+ name: node.operationId,
516
514
  extname: ".ts",
517
- tag: transformedNode.tags[0] ?? "default",
518
- path: transformedNode.path
515
+ tag: node.tags[0] ?? "default",
516
+ path: node.path
519
517
  }, {
520
518
  root,
521
519
  output: pluginTs.options?.output ?? output,
@@ -587,7 +585,7 @@ const mcpGenerator = defineGenerator({
587
585
  ] }),
588
586
  /* @__PURE__ */ jsx(McpHandler, {
589
587
  name: meta.name,
590
- node: transformedNode,
588
+ node,
591
589
  resolver: pluginTs.resolver,
592
590
  baseURL: client.baseURL,
593
591
  dataReturnType: client.dataReturnType || "data",
@@ -608,10 +606,9 @@ const mcpGenerator = defineGenerator({
608
606
  */
609
607
  const serverGenerator = defineGenerator({
610
608
  name: "operations",
611
- type: "react",
612
- Operations({ nodes, adapter, options, config, driver, resolver, plugin }) {
609
+ operations(nodes, options) {
610
+ const { adapter, config, resolver, plugin, driver, root } = this;
613
611
  const { output, paramsCasing, group } = options;
614
- const root = path.resolve(config.root, config.output.path);
615
612
  const pluginZod = driver.getPlugin(pluginZodName);
616
613
  if (!pluginZod?.resolver) return;
617
614
  const name = "server";
@@ -626,46 +623,45 @@ const serverGenerator = defineGenerator({
626
623
  meta: { pluginName: plugin.name }
627
624
  };
628
625
  const operationsMapped = nodes.map((node) => {
629
- const transformedNode = plugin.transformer ? transform(node, plugin.transformer) : node;
630
- const casedParams = caseParams(transformedNode.parameters, paramsCasing);
626
+ const casedParams = caseParams(node.parameters, paramsCasing);
631
627
  const pathParams = casedParams.filter((p) => p.in === "path");
632
628
  const queryParams = casedParams.filter((p) => p.in === "query");
633
629
  const headerParams = casedParams.filter((p) => p.in === "header");
634
630
  const mcpFile = resolver.resolveFile({
635
- name: transformedNode.operationId,
631
+ name: node.operationId,
636
632
  extname: ".ts",
637
- tag: transformedNode.tags[0] ?? "default",
638
- path: transformedNode.path
633
+ tag: node.tags[0] ?? "default",
634
+ path: node.path
639
635
  }, {
640
636
  root,
641
637
  output,
642
638
  group
643
639
  });
644
640
  const zodFile = pluginZod.resolver.resolveFile({
645
- name: transformedNode.operationId,
641
+ name: node.operationId,
646
642
  extname: ".ts",
647
- tag: transformedNode.tags[0] ?? "default",
648
- path: transformedNode.path
643
+ tag: node.tags[0] ?? "default",
644
+ path: node.path
649
645
  }, {
650
646
  root,
651
647
  output: pluginZod.options?.output ?? output,
652
648
  group: pluginZod.options?.group
653
649
  });
654
- const requestName = transformedNode.requestBody?.schema ? pluginZod.resolver.resolveDataName(transformedNode) : void 0;
655
- const successStatus = findSuccessStatusCode(transformedNode.responses);
656
- const responseName = successStatus ? pluginZod.resolver.resolveResponseStatusName(transformedNode, successStatus) : void 0;
650
+ const requestName = node.requestBody?.schema ? pluginZod.resolver.resolveDataName(node) : void 0;
651
+ const successStatus = findSuccessStatusCode(node.responses);
652
+ const responseName = successStatus ? pluginZod.resolver.resolveResponseStatusName(node, successStatus) : void 0;
657
653
  const resolveParams = (params) => params.map((p) => ({
658
654
  name: p.name,
659
- schemaName: pluginZod.resolver.resolveParamName(transformedNode, p)
655
+ schemaName: pluginZod.resolver.resolveParamName(node, p)
660
656
  }));
661
657
  return {
662
658
  tool: {
663
- name: transformedNode.operationId,
664
- title: transformedNode.summary || void 0,
665
- description: transformedNode.description || `Make a ${transformedNode.method.toUpperCase()} request to ${transformedNode.path}`
659
+ name: node.operationId,
660
+ title: node.summary || void 0,
661
+ description: node.description || `Make a ${node.method.toUpperCase()} request to ${node.path}`
666
662
  },
667
663
  mcp: {
668
- name: resolver.resolveName(transformedNode.operationId),
664
+ name: resolver.resolveName(node.operationId),
669
665
  file: mcpFile
670
666
  },
671
667
  zod: {
@@ -676,7 +672,7 @@ const serverGenerator = defineGenerator({
676
672
  responseName,
677
673
  file: zodFile
678
674
  },
679
- node: transformedNode
675
+ node
680
676
  };
681
677
  });
682
678
  const imports = operationsMapped.flatMap(({ mcp, zod }) => {
@@ -764,10 +760,9 @@ const serverGenerator = defineGenerator({
764
760
  */
765
761
  const serverGeneratorLegacy = defineGenerator({
766
762
  name: "operations",
767
- type: "react",
768
- Operations({ nodes, adapter, options, config, driver, resolver, plugin }) {
763
+ operations(nodes, options) {
764
+ const { adapter, config, resolver, plugin, driver, root } = this;
769
765
  const { output, paramsCasing, group } = options;
770
- const root = path.resolve(config.root, config.output.path);
771
766
  const pluginZod = driver.getPlugin(pluginZodName);
772
767
  if (!pluginZod?.resolver) return;
773
768
  const name = "server";
@@ -782,42 +777,41 @@ const serverGeneratorLegacy = defineGenerator({
782
777
  meta: { pluginName: plugin.name }
783
778
  };
784
779
  const operationsMapped = nodes.map((node) => {
785
- const transformedNode = plugin.transformer ? transform(node, plugin.transformer) : node;
786
- const casedParams = caseParams(transformedNode.parameters, paramsCasing);
780
+ const casedParams = caseParams(node.parameters, paramsCasing);
787
781
  const queryParams = casedParams.filter((p) => p.in === "query");
788
782
  const headerParams = casedParams.filter((p) => p.in === "header");
789
783
  const mcpFile = resolver.resolveFile({
790
- name: transformedNode.operationId,
784
+ name: node.operationId,
791
785
  extname: ".ts",
792
- tag: transformedNode.tags[0] ?? "default",
793
- path: transformedNode.path
786
+ tag: node.tags[0] ?? "default",
787
+ path: node.path
794
788
  }, {
795
789
  root,
796
790
  output,
797
791
  group
798
792
  });
799
793
  const zodFile = pluginZod?.resolver.resolveFile({
800
- name: transformedNode.operationId,
794
+ name: node.operationId,
801
795
  extname: ".ts",
802
- tag: transformedNode.tags[0] ?? "default",
803
- path: transformedNode.path
796
+ tag: node.tags[0] ?? "default",
797
+ path: node.path
804
798
  }, {
805
799
  root,
806
800
  output: pluginZod?.options?.output ?? output,
807
801
  group: pluginZod?.options?.group
808
802
  });
809
- const requestName = transformedNode.requestBody?.schema ? pluginZod?.resolver.resolveDataName(transformedNode) : void 0;
810
- const responseName = pluginZod?.resolver.resolveResponseName(transformedNode);
811
- const zodQueryParams = queryParams.length ? pluginZod?.resolver.resolveQueryParamsName(transformedNode, queryParams[0]) : void 0;
812
- const zodHeaderParams = headerParams.length ? pluginZod?.resolver.resolveHeaderParamsName(transformedNode, headerParams[0]) : void 0;
803
+ const requestName = node.requestBody?.schema ? pluginZod?.resolver.resolveDataName(node) : void 0;
804
+ const responseName = pluginZod?.resolver.resolveResponseName(node);
805
+ const zodQueryParams = queryParams.length ? pluginZod?.resolver.resolveQueryParamsName(node, queryParams[0]) : void 0;
806
+ const zodHeaderParams = headerParams.length ? pluginZod?.resolver.resolveHeaderParamsName(node, headerParams[0]) : void 0;
813
807
  return {
814
808
  tool: {
815
- name: transformedNode.operationId,
816
- title: transformedNode.summary || void 0,
817
- description: transformedNode.description || `Make a ${transformedNode.method.toUpperCase()} request to ${transformedNode.path}`
809
+ name: node.operationId,
810
+ title: node.summary || void 0,
811
+ description: node.description || `Make a ${node.method.toUpperCase()} request to ${node.path}`
818
812
  },
819
813
  mcp: {
820
- name: resolver.resolveName(transformedNode.operationId),
814
+ name: resolver.resolveName(node.operationId),
821
815
  file: mcpFile
822
816
  },
823
817
  zod: {
@@ -828,7 +822,7 @@ const serverGeneratorLegacy = defineGenerator({
828
822
  responseName,
829
823
  file: zodFile
830
824
  },
831
- node: transformedNode
825
+ node
832
826
  };
833
827
  });
834
828
  const imports = operationsMapped.flatMap(({ mcp, zod }) => {
@@ -904,6 +898,9 @@ const serverGeneratorLegacy = defineGenerator({
904
898
  }
905
899
  });
906
900
  //#endregion
901
+ //#region package.json
902
+ var version = "5.0.0-alpha.30";
903
+ //#endregion
907
904
  //#region src/resolvers/resolverMcp.ts
908
905
  /**
909
906
  * Resolver for `@kubb/plugin-mcp` that provides the default naming
@@ -965,8 +962,10 @@ const pluginMcp = createPlugin((options) => {
965
962
  transformer: userTransformer,
966
963
  generators: userGenerators
967
964
  });
965
+ const mergedGenerator = mergeGenerators(preset.generators ?? []);
968
966
  return {
969
967
  name: pluginMcpName,
968
+ version,
970
969
  get resolver() {
971
970
  return preset.resolver;
972
971
  },
@@ -976,6 +975,9 @@ const pluginMcp = createPlugin((options) => {
976
975
  get options() {
977
976
  return {
978
977
  output,
978
+ exclude,
979
+ include,
980
+ override,
979
981
  group: group ? {
980
982
  ...group,
981
983
  name: group.name ? group.name : (ctx) => {
@@ -997,12 +999,19 @@ const pluginMcp = createPlugin((options) => {
997
999
  };
998
1000
  },
999
1001
  pre: [pluginTsName, pluginZodName].filter(Boolean),
1000
- async install() {
1001
- const { config, fabric, plugin, adapter, rootNode, driver } = this;
1002
- const root = path.resolve(config.root, config.output.path);
1003
- const resolver = preset.resolver;
1004
- if (!adapter) throw new Error("Plugin cannot work without adapter being set");
1005
- const baseURL = adapter.rootNode?.meta?.baseURL;
1002
+ async schema(node, options) {
1003
+ return mergedGenerator.schema?.call(this, node, options);
1004
+ },
1005
+ async operation(node, options) {
1006
+ return mergedGenerator.operation?.call(this, node, options);
1007
+ },
1008
+ async operations(nodes, options) {
1009
+ return mergedGenerator.operations?.call(this, nodes, options);
1010
+ },
1011
+ async buildStart() {
1012
+ const { adapter, driver } = this;
1013
+ const root = this.root;
1014
+ const baseURL = adapter?.rootNode?.meta?.baseURL;
1006
1015
  if (baseURL) this.plugin.options.client.baseURL = this.plugin.options.client.baseURL || baseURL;
1007
1016
  const hasClientPlugin = !!driver.getPlugin(pluginClientName);
1008
1017
  if (this.plugin.options.client.bundle && !hasClientPlugin && !this.plugin.options.client.importPath) await this.addFile({
@@ -1029,42 +1038,7 @@ const pluginMcp = createPlugin((options) => {
1029
1038
  imports: [],
1030
1039
  exports: []
1031
1040
  });
1032
- const collectedOperations = [];
1033
- const generatorContext = {
1034
- generators: preset.generators,
1035
- plugin,
1036
- resolver,
1037
- exclude,
1038
- include,
1039
- override,
1040
- fabric,
1041
- adapter,
1042
- config,
1043
- driver
1044
- };
1045
- await walk(rootNode, {
1046
- depth: "shallow",
1047
- async schema(schemaNode) {
1048
- await runGeneratorSchema(schemaNode, generatorContext);
1049
- },
1050
- async operation(operationNode) {
1051
- if (resolver.resolveOptions(operationNode, {
1052
- options: plugin.options,
1053
- exclude,
1054
- include,
1055
- override
1056
- }) !== null) collectedOperations.push(operationNode);
1057
- await runGeneratorOperation(operationNode, generatorContext);
1058
- }
1059
- });
1060
- await runGeneratorOperations(collectedOperations, generatorContext);
1061
- const barrelFiles = await getBarrelFiles(this.fabric.files, {
1062
- type: output.barrelType ?? "named",
1063
- root,
1064
- output,
1065
- meta: { pluginName: this.plugin.name }
1066
- });
1067
- await this.upsertFile(...barrelFiles);
1041
+ await this.openInStudio({ ast: true });
1068
1042
  }
1069
1043
  };
1070
1044
  });