@kubb/core 5.0.0-alpha.2 → 5.0.0-alpha.20

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.
Files changed (55) hide show
  1. package/dist/{types-B7eZvqwD.d.ts → PluginDriver-BkSenc-R.d.ts} +521 -299
  2. package/dist/hooks.cjs +101 -8
  3. package/dist/hooks.cjs.map +1 -1
  4. package/dist/hooks.d.ts +83 -4
  5. package/dist/hooks.js +99 -8
  6. package/dist/hooks.js.map +1 -1
  7. package/dist/index.cjs +850 -536
  8. package/dist/index.cjs.map +1 -1
  9. package/dist/index.d.ts +438 -89
  10. package/dist/index.js +839 -532
  11. package/dist/index.js.map +1 -1
  12. package/package.json +6 -6
  13. package/src/Kubb.ts +37 -55
  14. package/src/{PluginManager.ts → PluginDriver.ts} +51 -40
  15. package/src/build.ts +74 -29
  16. package/src/config.ts +9 -8
  17. package/src/constants.ts +44 -1
  18. package/src/createAdapter.ts +25 -0
  19. package/src/createPlugin.ts +28 -0
  20. package/src/createStorage.ts +58 -0
  21. package/src/defineGenerator.ts +134 -0
  22. package/src/defineLogger.ts +13 -3
  23. package/src/definePreset.ts +23 -0
  24. package/src/definePresets.ts +16 -0
  25. package/src/defineResolver.ts +131 -0
  26. package/src/hooks/index.ts +2 -1
  27. package/src/hooks/useKubb.ts +160 -0
  28. package/src/hooks/useMode.ts +5 -2
  29. package/src/hooks/usePlugin.ts +5 -2
  30. package/src/hooks/usePluginDriver.ts +11 -0
  31. package/src/index.ts +12 -6
  32. package/src/renderNode.tsx +108 -0
  33. package/src/storages/fsStorage.ts +2 -2
  34. package/src/storages/memoryStorage.ts +2 -2
  35. package/src/types.ts +150 -38
  36. package/src/utils/FunctionParams.ts +2 -2
  37. package/src/utils/TreeNode.ts +24 -1
  38. package/src/utils/diagnostics.ts +4 -1
  39. package/src/utils/executeStrategies.ts +23 -10
  40. package/src/utils/formatters.ts +10 -21
  41. package/src/utils/getBarrelFiles.ts +79 -9
  42. package/src/utils/getConfigs.ts +8 -22
  43. package/src/utils/getPreset.ts +41 -0
  44. package/src/utils/linters.ts +23 -3
  45. package/src/utils/mergeResolvers.ts +8 -0
  46. package/src/utils/packageJSON.ts +76 -0
  47. package/src/BarrelManager.ts +0 -74
  48. package/src/PackageManager.ts +0 -180
  49. package/src/PromiseManager.ts +0 -40
  50. package/src/defineAdapter.ts +0 -22
  51. package/src/definePlugin.ts +0 -12
  52. package/src/defineStorage.ts +0 -56
  53. package/src/errors.ts +0 -1
  54. package/src/hooks/usePluginManager.ts +0 -8
  55. package/src/utils/getPlugins.ts +0 -23
package/dist/hooks.cjs CHANGED
@@ -1,26 +1,119 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- require("./chunk-ByKO4r7w.cjs");
2
+ const require_chunk = require("./chunk-ByKO4r7w.cjs");
3
+ let node_path = require("node:path");
4
+ node_path = require_chunk.__toESM(node_path);
3
5
  let _kubb_react_fabric = require("@kubb/react-fabric");
6
+ //#region src/hooks/useKubb.ts
7
+ /**
8
+ * Generates the default "Generated by Kubb" banner from node metadata.
9
+ */
10
+ function buildDefaultBanner({ title, description, version, config }) {
11
+ try {
12
+ let source = "";
13
+ if (Array.isArray(config.input)) {
14
+ const first = config.input[0];
15
+ if (first && "path" in first) source = node_path.default.basename(first.path);
16
+ } else if ("path" in config.input) source = node_path.default.basename(config.input.path);
17
+ else if ("data" in config.input) source = "text content";
18
+ let banner = "/**\n* Generated by Kubb (https://kubb.dev/).\n* Do not edit manually.\n";
19
+ if (config.output.defaultBanner === "simple") {
20
+ banner += "*/\n";
21
+ return banner;
22
+ }
23
+ if (source) banner += `* Source: ${source}\n`;
24
+ if (title) banner += `* Title: ${title}\n`;
25
+ if (description) {
26
+ const formattedDescription = description.replace(/\n/gm, "\n* ");
27
+ banner += `* Description: ${formattedDescription}\n`;
28
+ }
29
+ if (version) banner += `* OpenAPI spec version: ${version}\n`;
30
+ banner += "*/\n";
31
+ return banner;
32
+ } catch (_error) {
33
+ return "/**\n* Generated by Kubb (https://kubb.dev/).\n* Do not edit manually.\n*/";
34
+ }
35
+ }
36
+ /**
37
+ * React-Fabric hook that exposes the current plugin context inside a generator component.
38
+ *
39
+ * Returns the active `plugin`, `mode`, `config`, and a set of resolver helpers
40
+ * (`getFile`, `resolveName`, `resolvePath`, `resolveBanner`, `resolveFooter`) that
41
+ * all default to the current plugin when no explicit `pluginName` is provided.
42
+ *
43
+ * @example
44
+ * ```ts
45
+ * function Operation({ node }: OperationProps) {
46
+ * const { config, resolvePath } = useKubb()
47
+ * const filePath = resolvePath({ baseName: node.operationId })
48
+ * return <File path={filePath}>...</File>
49
+ * }
50
+ * ```
51
+ */
52
+ function useKubb() {
53
+ const { meta } = (0, _kubb_react_fabric.useFabric)();
54
+ const config = meta.driver.config;
55
+ const defaultPluginName = meta.plugin.name;
56
+ const output = meta.plugin.options?.output;
57
+ return {
58
+ plugin: meta.plugin,
59
+ mode: meta.mode,
60
+ config,
61
+ getPluginByName: (pluginName = defaultPluginName) => meta.driver.getPluginByName.call(meta.driver, pluginName),
62
+ getFile: ({ pluginName = defaultPluginName, ...rest }) => meta.driver.getFile.call(meta.driver, {
63
+ pluginName,
64
+ ...rest
65
+ }),
66
+ resolveName: ({ pluginName = defaultPluginName, ...rest }) => meta.driver.resolveName.call(meta.driver, {
67
+ pluginName,
68
+ ...rest
69
+ }),
70
+ resolvePath: ({ pluginName = defaultPluginName, ...rest }) => meta.driver.resolvePath.call(meta.driver, {
71
+ pluginName,
72
+ ...rest
73
+ }),
74
+ resolveBanner: (node) => {
75
+ if (typeof output?.banner === "function") return node ? output.banner(node) : buildDefaultBanner({ config });
76
+ if (typeof output?.banner === "string") return output.banner;
77
+ if (config.output.defaultBanner === false) return;
78
+ return buildDefaultBanner({ config });
79
+ },
80
+ resolveFooter: (node) => {
81
+ if (typeof output?.footer === "function") return node ? output.footer(node) : void 0;
82
+ if (typeof output?.footer === "string") return output.footer;
83
+ }
84
+ };
85
+ }
86
+ //#endregion
4
87
  //#region src/hooks/useMode.ts
88
+ /**
89
+ * @deprecated use `useKubb` instead
90
+ */
5
91
  function useMode() {
6
- const { meta } = (0, _kubb_react_fabric.useApp)();
92
+ const { meta } = (0, _kubb_react_fabric.useFabric)();
7
93
  return meta.mode;
8
94
  }
9
95
  //#endregion
10
96
  //#region src/hooks/usePlugin.ts
97
+ /**
98
+ * @deprecated use useKubb instead
99
+ */
11
100
  function usePlugin() {
12
- const { meta } = (0, _kubb_react_fabric.useApp)();
101
+ const { meta } = (0, _kubb_react_fabric.useFabric)();
13
102
  return meta.plugin;
14
103
  }
15
104
  //#endregion
16
- //#region src/hooks/usePluginManager.ts
17
- function usePluginManager() {
18
- const { meta } = (0, _kubb_react_fabric.useApp)();
19
- return meta.pluginManager;
105
+ //#region src/hooks/usePluginDriver.ts
106
+ /**
107
+ * @deprecated use `useKubb` instead
108
+ */
109
+ function usePluginDriver() {
110
+ const { meta } = (0, _kubb_react_fabric.useFabric)();
111
+ return meta.driver;
20
112
  }
21
113
  //#endregion
114
+ exports.useKubb = useKubb;
22
115
  exports.useMode = useMode;
23
116
  exports.usePlugin = usePlugin;
24
- exports.usePluginManager = usePluginManager;
117
+ exports.usePluginDriver = usePluginDriver;
25
118
 
26
119
  //# sourceMappingURL=hooks.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"hooks.cjs","names":[],"sources":["../src/hooks/useMode.ts","../src/hooks/usePlugin.ts","../src/hooks/usePluginManager.ts"],"sourcesContent":["import type { KubbFile } from '@kubb/fabric-core/types'\nimport { useApp } from '@kubb/react-fabric'\n\nexport function useMode(): KubbFile.Mode {\n const { meta } = useApp<{ mode: KubbFile.Mode }>()\n\n return meta.mode\n}\n","import { useApp } from '@kubb/react-fabric'\nimport type { Plugin, PluginFactoryOptions } from '../types.ts'\n\nexport function usePlugin<TOptions extends PluginFactoryOptions = PluginFactoryOptions>(): Plugin<TOptions> {\n const { meta } = useApp<{ plugin: Plugin<TOptions> }>()\n\n return meta.plugin\n}\n","import { useApp } from '@kubb/react-fabric'\nimport type { PluginManager } from '../PluginManager.ts'\n\nexport function usePluginManager(): PluginManager {\n const { meta } = useApp<{ pluginManager: PluginManager }>()\n\n return meta.pluginManager\n}\n"],"mappings":";;;;AAGA,SAAgB,UAAyB;CACvC,MAAM,EAAE,UAAA,GAAA,mBAAA,SAA0C;AAElD,QAAO,KAAK;;;;ACHd,SAAgB,YAA4F;CAC1G,MAAM,EAAE,UAAA,GAAA,mBAAA,SAA+C;AAEvD,QAAO,KAAK;;;;ACHd,SAAgB,mBAAkC;CAChD,MAAM,EAAE,UAAA,GAAA,mBAAA,SAAmD;AAE3D,QAAO,KAAK"}
1
+ {"version":3,"file":"hooks.cjs","names":["path"],"sources":["../src/hooks/useKubb.ts","../src/hooks/useMode.ts","../src/hooks/usePlugin.ts","../src/hooks/usePluginDriver.ts"],"sourcesContent":["import path from 'node:path'\nimport type { RootNode } from '@kubb/ast/types'\nimport type { KubbFile } from '@kubb/fabric-core/types'\nimport { useFabric } from '@kubb/react-fabric'\nimport type { GetFileOptions, PluginDriver } from '../PluginDriver.ts'\nimport type { Config, Plugin, PluginFactoryOptions, ResolveNameParams, ResolvePathParams } from '../types.ts'\n\ntype ResolvePathOptions = {\n pluginName?: string\n group?: {\n tag?: string\n path?: string\n }\n type?: ResolveNameParams['type']\n}\n\ntype UseKubbReturn<TOptions extends PluginFactoryOptions = PluginFactoryOptions> = {\n plugin: Plugin<TOptions>\n mode: KubbFile.Mode\n config: Config\n /**\n * Returns the plugin whose `name` matches `pluginName`, defaulting to the current plugin.\n */\n getPluginByName: (pluginName?: string) => Plugin | undefined\n /**\n * Resolves a file reference, defaulting `pluginName` to the current plugin.\n */\n getFile: (params: Omit<GetFileOptions<ResolvePathOptions>, 'pluginName'> & { pluginName?: string }) => KubbFile.File<{ pluginName: string }>\n /**\n * Resolves a name, defaulting `pluginName` to the current plugin.\n * @deprecated user `resolver` from options instead\n */\n resolveName: (params: Omit<ResolveNameParams, 'pluginName'> & { pluginName?: string }) => string\n /**\n * Resolves a path, defaulting `pluginName` to the current plugin.\n */\n resolvePath: <TPathOptions = object>(params: Omit<ResolvePathParams<TPathOptions>, 'pluginName'> & { pluginName?: string }) => KubbFile.Path\n /**\n * Resolves the banner using the plugin's `output.banner` option.\n * Falls back to the default \"Generated by Kubb\" banner when `output.banner` is unset.\n * When `output.banner` is a function and no node is provided, returns the default banner.\n */\n resolveBanner: (node?: RootNode) => string | undefined\n /**\n * Resolves the footer using the plugin's `output.footer` option.\n * Returns `undefined` when no footer is configured.\n * When `output.footer` is a function and no node is provided, returns `undefined`.\n */\n resolveFooter: (node?: RootNode) => string | undefined\n}\n\n/**\n * Generates the default \"Generated by Kubb\" banner from node metadata.\n */\nfunction buildDefaultBanner({ title, description, version, config }: { title?: string; description?: string; version?: string; config: Config }): string {\n try {\n let source = ''\n if (Array.isArray(config.input)) {\n const first = config.input[0]\n if (first && 'path' in first) {\n source = path.basename(first.path)\n }\n } else if ('path' in config.input) {\n source = path.basename(config.input.path)\n } else if ('data' in config.input) {\n source = 'text content'\n }\n\n let banner = '/**\\n* Generated by Kubb (https://kubb.dev/).\\n* Do not edit manually.\\n'\n\n if (config.output.defaultBanner === 'simple') {\n banner += '*/\\n'\n return banner\n }\n\n if (source) {\n banner += `* Source: ${source}\\n`\n }\n\n if (title) {\n banner += `* Title: ${title}\\n`\n }\n\n if (description) {\n const formattedDescription = description.replace(/\\n/gm, '\\n* ')\n banner += `* Description: ${formattedDescription}\\n`\n }\n\n if (version) {\n banner += `* OpenAPI spec version: ${version}\\n`\n }\n\n banner += '*/\\n'\n return banner\n } catch (_error) {\n return '/**\\n* Generated by Kubb (https://kubb.dev/).\\n* Do not edit manually.\\n*/'\n }\n}\n\n/**\n * React-Fabric hook that exposes the current plugin context inside a generator component.\n *\n * Returns the active `plugin`, `mode`, `config`, and a set of resolver helpers\n * (`getFile`, `resolveName`, `resolvePath`, `resolveBanner`, `resolveFooter`) that\n * all default to the current plugin when no explicit `pluginName` is provided.\n *\n * @example\n * ```ts\n * function Operation({ node }: OperationProps) {\n * const { config, resolvePath } = useKubb()\n * const filePath = resolvePath({ baseName: node.operationId })\n * return <File path={filePath}>...</File>\n * }\n * ```\n */\nexport function useKubb<TOptions extends PluginFactoryOptions = PluginFactoryOptions>(): UseKubbReturn<TOptions> {\n const { meta } = useFabric<{\n plugin: Plugin<TOptions>\n mode: KubbFile.Mode\n driver: PluginDriver\n }>()\n\n const config = meta.driver.config\n const defaultPluginName = meta.plugin.name\n\n const output = (\n meta.plugin.options as { output?: { banner?: string | ((node: RootNode) => string); footer?: string | ((node: RootNode) => string) } } | undefined\n )?.output\n\n return {\n plugin: meta.plugin as Plugin<TOptions>,\n mode: meta.mode,\n config,\n getPluginByName: (pluginName = defaultPluginName) => meta.driver.getPluginByName.call(meta.driver, pluginName),\n getFile: ({ pluginName = defaultPluginName, ...rest }) => meta.driver.getFile.call(meta.driver, { pluginName, ...rest }),\n resolveName: ({ pluginName = defaultPluginName, ...rest }) => meta.driver.resolveName.call(meta.driver, { pluginName, ...rest }),\n resolvePath: ({ pluginName = defaultPluginName, ...rest }) => meta.driver.resolvePath.call(meta.driver, { pluginName, ...rest }),\n resolveBanner: (node?: RootNode) => {\n if (typeof output?.banner === 'function') {\n return node ? output.banner(node) : buildDefaultBanner({ config })\n }\n if (typeof output?.banner === 'string') {\n return output.banner\n }\n if (config.output.defaultBanner === false) {\n return undefined\n }\n return buildDefaultBanner({ config })\n },\n resolveFooter: (node?: RootNode) => {\n if (typeof output?.footer === 'function') {\n return node ? output.footer(node) : undefined\n }\n if (typeof output?.footer === 'string') {\n return output.footer\n }\n return undefined\n },\n }\n}\n","import type { KubbFile } from '@kubb/fabric-core/types'\nimport { useFabric } from '@kubb/react-fabric'\n\n/**\n * @deprecated use `useKubb` instead\n */\nexport function useMode(): KubbFile.Mode {\n const { meta } = useFabric<{ mode: KubbFile.Mode }>()\n\n return meta.mode\n}\n","import { useFabric } from '@kubb/react-fabric'\nimport type { Plugin, PluginFactoryOptions } from '../types.ts'\n\n/**\n * @deprecated use useKubb instead\n */\nexport function usePlugin<TOptions extends PluginFactoryOptions = PluginFactoryOptions>(): Plugin<TOptions> {\n const { meta } = useFabric<{ plugin: Plugin<TOptions> }>()\n\n return meta.plugin\n}\n","import { useFabric } from '@kubb/react-fabric'\nimport type { PluginDriver } from '../PluginDriver.ts'\n\n/**\n * @deprecated use `useKubb` instead\n */\nexport function usePluginDriver(): PluginDriver {\n const { meta } = useFabric<{ driver: PluginDriver }>()\n\n return meta.driver\n}\n"],"mappings":";;;;;;;;;AAsDA,SAAS,mBAAmB,EAAE,OAAO,aAAa,SAAS,UAA8F;AACvJ,KAAI;EACF,IAAI,SAAS;AACb,MAAI,MAAM,QAAQ,OAAO,MAAM,EAAE;GAC/B,MAAM,QAAQ,OAAO,MAAM;AAC3B,OAAI,SAAS,UAAU,MACrB,UAASA,UAAAA,QAAK,SAAS,MAAM,KAAK;aAE3B,UAAU,OAAO,MAC1B,UAASA,UAAAA,QAAK,SAAS,OAAO,MAAM,KAAK;WAChC,UAAU,OAAO,MAC1B,UAAS;EAGX,IAAI,SAAS;AAEb,MAAI,OAAO,OAAO,kBAAkB,UAAU;AAC5C,aAAU;AACV,UAAO;;AAGT,MAAI,OACF,WAAU,aAAa,OAAO;AAGhC,MAAI,MACF,WAAU,YAAY,MAAM;AAG9B,MAAI,aAAa;GACf,MAAM,uBAAuB,YAAY,QAAQ,QAAQ,OAAO;AAChE,aAAU,kBAAkB,qBAAqB;;AAGnD,MAAI,QACF,WAAU,2BAA2B,QAAQ;AAG/C,YAAU;AACV,SAAO;UACA,QAAQ;AACf,SAAO;;;;;;;;;;;;;;;;;;;AAoBX,SAAgB,UAAiG;CAC/G,MAAM,EAAE,UAAA,GAAA,mBAAA,YAIJ;CAEJ,MAAM,SAAS,KAAK,OAAO;CAC3B,MAAM,oBAAoB,KAAK,OAAO;CAEtC,MAAM,SACJ,KAAK,OAAO,SACX;AAEH,QAAO;EACL,QAAQ,KAAK;EACb,MAAM,KAAK;EACX;EACA,kBAAkB,aAAa,sBAAsB,KAAK,OAAO,gBAAgB,KAAK,KAAK,QAAQ,WAAW;EAC9G,UAAU,EAAE,aAAa,mBAAmB,GAAG,WAAW,KAAK,OAAO,QAAQ,KAAK,KAAK,QAAQ;GAAE;GAAY,GAAG;GAAM,CAAC;EACxH,cAAc,EAAE,aAAa,mBAAmB,GAAG,WAAW,KAAK,OAAO,YAAY,KAAK,KAAK,QAAQ;GAAE;GAAY,GAAG;GAAM,CAAC;EAChI,cAAc,EAAE,aAAa,mBAAmB,GAAG,WAAW,KAAK,OAAO,YAAY,KAAK,KAAK,QAAQ;GAAE;GAAY,GAAG;GAAM,CAAC;EAChI,gBAAgB,SAAoB;AAClC,OAAI,OAAO,QAAQ,WAAW,WAC5B,QAAO,OAAO,OAAO,OAAO,KAAK,GAAG,mBAAmB,EAAE,QAAQ,CAAC;AAEpE,OAAI,OAAO,QAAQ,WAAW,SAC5B,QAAO,OAAO;AAEhB,OAAI,OAAO,OAAO,kBAAkB,MAClC;AAEF,UAAO,mBAAmB,EAAE,QAAQ,CAAC;;EAEvC,gBAAgB,SAAoB;AAClC,OAAI,OAAO,QAAQ,WAAW,WAC5B,QAAO,OAAO,OAAO,OAAO,KAAK,GAAG,KAAA;AAEtC,OAAI,OAAO,QAAQ,WAAW,SAC5B,QAAO,OAAO;;EAInB;;;;;;;ACxJH,SAAgB,UAAyB;CACvC,MAAM,EAAE,UAAA,GAAA,mBAAA,YAA6C;AAErD,QAAO,KAAK;;;;;;;ACHd,SAAgB,YAA4F;CAC1G,MAAM,EAAE,UAAA,GAAA,mBAAA,YAAkD;AAE1D,QAAO,KAAK;;;;;;;ACHd,SAAgB,kBAAgC;CAC9C,MAAM,EAAE,UAAA,GAAA,mBAAA,YAA8C;AAEtD,QAAO,KAAK"}
package/dist/hooks.d.ts CHANGED
@@ -1,15 +1,94 @@
1
1
  import { t as __name } from "./chunk--u3MIqq1.js";
2
- import { M as PluginManager, _ as PluginFactoryOptions, h as Plugin } from "./types-B7eZvqwD.js";
2
+ import { b as PluginFactoryOptions, j as ResolvePathParams, k as ResolveNameParams, l as Config, n as PluginDriver, t as GetFileOptions, v as Plugin } from "./PluginDriver-BkSenc-R.js";
3
+ import { RootNode } from "@kubb/ast/types";
3
4
  import { KubbFile } from "@kubb/fabric-core/types";
4
5
 
6
+ //#region src/hooks/useKubb.d.ts
7
+ type ResolvePathOptions = {
8
+ pluginName?: string;
9
+ group?: {
10
+ tag?: string;
11
+ path?: string;
12
+ };
13
+ type?: ResolveNameParams['type'];
14
+ };
15
+ type UseKubbReturn<TOptions extends PluginFactoryOptions = PluginFactoryOptions> = {
16
+ plugin: Plugin<TOptions>;
17
+ mode: KubbFile.Mode;
18
+ config: Config;
19
+ /**
20
+ * Returns the plugin whose `name` matches `pluginName`, defaulting to the current plugin.
21
+ */
22
+ getPluginByName: (pluginName?: string) => Plugin | undefined;
23
+ /**
24
+ * Resolves a file reference, defaulting `pluginName` to the current plugin.
25
+ */
26
+ getFile: (params: Omit<GetFileOptions<ResolvePathOptions>, 'pluginName'> & {
27
+ pluginName?: string;
28
+ }) => KubbFile.File<{
29
+ pluginName: string;
30
+ }>;
31
+ /**
32
+ * Resolves a name, defaulting `pluginName` to the current plugin.
33
+ * @deprecated user `resolver` from options instead
34
+ */
35
+ resolveName: (params: Omit<ResolveNameParams, 'pluginName'> & {
36
+ pluginName?: string;
37
+ }) => string;
38
+ /**
39
+ * Resolves a path, defaulting `pluginName` to the current plugin.
40
+ */
41
+ resolvePath: <TPathOptions = object>(params: Omit<ResolvePathParams<TPathOptions>, 'pluginName'> & {
42
+ pluginName?: string;
43
+ }) => KubbFile.Path;
44
+ /**
45
+ * Resolves the banner using the plugin's `output.banner` option.
46
+ * Falls back to the default "Generated by Kubb" banner when `output.banner` is unset.
47
+ * When `output.banner` is a function and no node is provided, returns the default banner.
48
+ */
49
+ resolveBanner: (node?: RootNode) => string | undefined;
50
+ /**
51
+ * Resolves the footer using the plugin's `output.footer` option.
52
+ * Returns `undefined` when no footer is configured.
53
+ * When `output.footer` is a function and no node is provided, returns `undefined`.
54
+ */
55
+ resolveFooter: (node?: RootNode) => string | undefined;
56
+ };
57
+ /**
58
+ * React-Fabric hook that exposes the current plugin context inside a generator component.
59
+ *
60
+ * Returns the active `plugin`, `mode`, `config`, and a set of resolver helpers
61
+ * (`getFile`, `resolveName`, `resolvePath`, `resolveBanner`, `resolveFooter`) that
62
+ * all default to the current plugin when no explicit `pluginName` is provided.
63
+ *
64
+ * @example
65
+ * ```ts
66
+ * function Operation({ node }: OperationProps) {
67
+ * const { config, resolvePath } = useKubb()
68
+ * const filePath = resolvePath({ baseName: node.operationId })
69
+ * return <File path={filePath}>...</File>
70
+ * }
71
+ * ```
72
+ */
73
+ declare function useKubb<TOptions extends PluginFactoryOptions = PluginFactoryOptions>(): UseKubbReturn<TOptions>;
74
+ //#endregion
5
75
  //#region src/hooks/useMode.d.ts
76
+ /**
77
+ * @deprecated use `useKubb` instead
78
+ */
6
79
  declare function useMode(): KubbFile.Mode;
7
80
  //#endregion
8
81
  //#region src/hooks/usePlugin.d.ts
82
+ /**
83
+ * @deprecated use useKubb instead
84
+ */
9
85
  declare function usePlugin<TOptions extends PluginFactoryOptions = PluginFactoryOptions>(): Plugin<TOptions>;
10
86
  //#endregion
11
- //#region src/hooks/usePluginManager.d.ts
12
- declare function usePluginManager(): PluginManager;
87
+ //#region src/hooks/usePluginDriver.d.ts
88
+ /**
89
+ * @deprecated use `useKubb` instead
90
+ */
91
+ declare function usePluginDriver(): PluginDriver;
13
92
  //#endregion
14
- export { useMode, usePlugin, usePluginManager };
93
+ export { useKubb, useMode, usePlugin, usePluginDriver };
15
94
  //# sourceMappingURL=hooks.d.ts.map
package/dist/hooks.js CHANGED
@@ -1,23 +1,114 @@
1
1
  import "./chunk--u3MIqq1.js";
2
- import { useApp } from "@kubb/react-fabric";
2
+ import path from "node:path";
3
+ import { useFabric } from "@kubb/react-fabric";
4
+ //#region src/hooks/useKubb.ts
5
+ /**
6
+ * Generates the default "Generated by Kubb" banner from node metadata.
7
+ */
8
+ function buildDefaultBanner({ title, description, version, config }) {
9
+ try {
10
+ let source = "";
11
+ if (Array.isArray(config.input)) {
12
+ const first = config.input[0];
13
+ if (first && "path" in first) source = path.basename(first.path);
14
+ } else if ("path" in config.input) source = path.basename(config.input.path);
15
+ else if ("data" in config.input) source = "text content";
16
+ let banner = "/**\n* Generated by Kubb (https://kubb.dev/).\n* Do not edit manually.\n";
17
+ if (config.output.defaultBanner === "simple") {
18
+ banner += "*/\n";
19
+ return banner;
20
+ }
21
+ if (source) banner += `* Source: ${source}\n`;
22
+ if (title) banner += `* Title: ${title}\n`;
23
+ if (description) {
24
+ const formattedDescription = description.replace(/\n/gm, "\n* ");
25
+ banner += `* Description: ${formattedDescription}\n`;
26
+ }
27
+ if (version) banner += `* OpenAPI spec version: ${version}\n`;
28
+ banner += "*/\n";
29
+ return banner;
30
+ } catch (_error) {
31
+ return "/**\n* Generated by Kubb (https://kubb.dev/).\n* Do not edit manually.\n*/";
32
+ }
33
+ }
34
+ /**
35
+ * React-Fabric hook that exposes the current plugin context inside a generator component.
36
+ *
37
+ * Returns the active `plugin`, `mode`, `config`, and a set of resolver helpers
38
+ * (`getFile`, `resolveName`, `resolvePath`, `resolveBanner`, `resolveFooter`) that
39
+ * all default to the current plugin when no explicit `pluginName` is provided.
40
+ *
41
+ * @example
42
+ * ```ts
43
+ * function Operation({ node }: OperationProps) {
44
+ * const { config, resolvePath } = useKubb()
45
+ * const filePath = resolvePath({ baseName: node.operationId })
46
+ * return <File path={filePath}>...</File>
47
+ * }
48
+ * ```
49
+ */
50
+ function useKubb() {
51
+ const { meta } = useFabric();
52
+ const config = meta.driver.config;
53
+ const defaultPluginName = meta.plugin.name;
54
+ const output = meta.plugin.options?.output;
55
+ return {
56
+ plugin: meta.plugin,
57
+ mode: meta.mode,
58
+ config,
59
+ getPluginByName: (pluginName = defaultPluginName) => meta.driver.getPluginByName.call(meta.driver, pluginName),
60
+ getFile: ({ pluginName = defaultPluginName, ...rest }) => meta.driver.getFile.call(meta.driver, {
61
+ pluginName,
62
+ ...rest
63
+ }),
64
+ resolveName: ({ pluginName = defaultPluginName, ...rest }) => meta.driver.resolveName.call(meta.driver, {
65
+ pluginName,
66
+ ...rest
67
+ }),
68
+ resolvePath: ({ pluginName = defaultPluginName, ...rest }) => meta.driver.resolvePath.call(meta.driver, {
69
+ pluginName,
70
+ ...rest
71
+ }),
72
+ resolveBanner: (node) => {
73
+ if (typeof output?.banner === "function") return node ? output.banner(node) : buildDefaultBanner({ config });
74
+ if (typeof output?.banner === "string") return output.banner;
75
+ if (config.output.defaultBanner === false) return;
76
+ return buildDefaultBanner({ config });
77
+ },
78
+ resolveFooter: (node) => {
79
+ if (typeof output?.footer === "function") return node ? output.footer(node) : void 0;
80
+ if (typeof output?.footer === "string") return output.footer;
81
+ }
82
+ };
83
+ }
84
+ //#endregion
3
85
  //#region src/hooks/useMode.ts
86
+ /**
87
+ * @deprecated use `useKubb` instead
88
+ */
4
89
  function useMode() {
5
- const { meta } = useApp();
90
+ const { meta } = useFabric();
6
91
  return meta.mode;
7
92
  }
8
93
  //#endregion
9
94
  //#region src/hooks/usePlugin.ts
95
+ /**
96
+ * @deprecated use useKubb instead
97
+ */
10
98
  function usePlugin() {
11
- const { meta } = useApp();
99
+ const { meta } = useFabric();
12
100
  return meta.plugin;
13
101
  }
14
102
  //#endregion
15
- //#region src/hooks/usePluginManager.ts
16
- function usePluginManager() {
17
- const { meta } = useApp();
18
- return meta.pluginManager;
103
+ //#region src/hooks/usePluginDriver.ts
104
+ /**
105
+ * @deprecated use `useKubb` instead
106
+ */
107
+ function usePluginDriver() {
108
+ const { meta } = useFabric();
109
+ return meta.driver;
19
110
  }
20
111
  //#endregion
21
- export { useMode, usePlugin, usePluginManager };
112
+ export { useKubb, useMode, usePlugin, usePluginDriver };
22
113
 
23
114
  //# sourceMappingURL=hooks.js.map
package/dist/hooks.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"hooks.js","names":[],"sources":["../src/hooks/useMode.ts","../src/hooks/usePlugin.ts","../src/hooks/usePluginManager.ts"],"sourcesContent":["import type { KubbFile } from '@kubb/fabric-core/types'\nimport { useApp } from '@kubb/react-fabric'\n\nexport function useMode(): KubbFile.Mode {\n const { meta } = useApp<{ mode: KubbFile.Mode }>()\n\n return meta.mode\n}\n","import { useApp } from '@kubb/react-fabric'\nimport type { Plugin, PluginFactoryOptions } from '../types.ts'\n\nexport function usePlugin<TOptions extends PluginFactoryOptions = PluginFactoryOptions>(): Plugin<TOptions> {\n const { meta } = useApp<{ plugin: Plugin<TOptions> }>()\n\n return meta.plugin\n}\n","import { useApp } from '@kubb/react-fabric'\nimport type { PluginManager } from '../PluginManager.ts'\n\nexport function usePluginManager(): PluginManager {\n const { meta } = useApp<{ pluginManager: PluginManager }>()\n\n return meta.pluginManager\n}\n"],"mappings":";;;AAGA,SAAgB,UAAyB;CACvC,MAAM,EAAE,SAAS,QAAiC;AAElD,QAAO,KAAK;;;;ACHd,SAAgB,YAA4F;CAC1G,MAAM,EAAE,SAAS,QAAsC;AAEvD,QAAO,KAAK;;;;ACHd,SAAgB,mBAAkC;CAChD,MAAM,EAAE,SAAS,QAA0C;AAE3D,QAAO,KAAK"}
1
+ {"version":3,"file":"hooks.js","names":[],"sources":["../src/hooks/useKubb.ts","../src/hooks/useMode.ts","../src/hooks/usePlugin.ts","../src/hooks/usePluginDriver.ts"],"sourcesContent":["import path from 'node:path'\nimport type { RootNode } from '@kubb/ast/types'\nimport type { KubbFile } from '@kubb/fabric-core/types'\nimport { useFabric } from '@kubb/react-fabric'\nimport type { GetFileOptions, PluginDriver } from '../PluginDriver.ts'\nimport type { Config, Plugin, PluginFactoryOptions, ResolveNameParams, ResolvePathParams } from '../types.ts'\n\ntype ResolvePathOptions = {\n pluginName?: string\n group?: {\n tag?: string\n path?: string\n }\n type?: ResolveNameParams['type']\n}\n\ntype UseKubbReturn<TOptions extends PluginFactoryOptions = PluginFactoryOptions> = {\n plugin: Plugin<TOptions>\n mode: KubbFile.Mode\n config: Config\n /**\n * Returns the plugin whose `name` matches `pluginName`, defaulting to the current plugin.\n */\n getPluginByName: (pluginName?: string) => Plugin | undefined\n /**\n * Resolves a file reference, defaulting `pluginName` to the current plugin.\n */\n getFile: (params: Omit<GetFileOptions<ResolvePathOptions>, 'pluginName'> & { pluginName?: string }) => KubbFile.File<{ pluginName: string }>\n /**\n * Resolves a name, defaulting `pluginName` to the current plugin.\n * @deprecated user `resolver` from options instead\n */\n resolveName: (params: Omit<ResolveNameParams, 'pluginName'> & { pluginName?: string }) => string\n /**\n * Resolves a path, defaulting `pluginName` to the current plugin.\n */\n resolvePath: <TPathOptions = object>(params: Omit<ResolvePathParams<TPathOptions>, 'pluginName'> & { pluginName?: string }) => KubbFile.Path\n /**\n * Resolves the banner using the plugin's `output.banner` option.\n * Falls back to the default \"Generated by Kubb\" banner when `output.banner` is unset.\n * When `output.banner` is a function and no node is provided, returns the default banner.\n */\n resolveBanner: (node?: RootNode) => string | undefined\n /**\n * Resolves the footer using the plugin's `output.footer` option.\n * Returns `undefined` when no footer is configured.\n * When `output.footer` is a function and no node is provided, returns `undefined`.\n */\n resolveFooter: (node?: RootNode) => string | undefined\n}\n\n/**\n * Generates the default \"Generated by Kubb\" banner from node metadata.\n */\nfunction buildDefaultBanner({ title, description, version, config }: { title?: string; description?: string; version?: string; config: Config }): string {\n try {\n let source = ''\n if (Array.isArray(config.input)) {\n const first = config.input[0]\n if (first && 'path' in first) {\n source = path.basename(first.path)\n }\n } else if ('path' in config.input) {\n source = path.basename(config.input.path)\n } else if ('data' in config.input) {\n source = 'text content'\n }\n\n let banner = '/**\\n* Generated by Kubb (https://kubb.dev/).\\n* Do not edit manually.\\n'\n\n if (config.output.defaultBanner === 'simple') {\n banner += '*/\\n'\n return banner\n }\n\n if (source) {\n banner += `* Source: ${source}\\n`\n }\n\n if (title) {\n banner += `* Title: ${title}\\n`\n }\n\n if (description) {\n const formattedDescription = description.replace(/\\n/gm, '\\n* ')\n banner += `* Description: ${formattedDescription}\\n`\n }\n\n if (version) {\n banner += `* OpenAPI spec version: ${version}\\n`\n }\n\n banner += '*/\\n'\n return banner\n } catch (_error) {\n return '/**\\n* Generated by Kubb (https://kubb.dev/).\\n* Do not edit manually.\\n*/'\n }\n}\n\n/**\n * React-Fabric hook that exposes the current plugin context inside a generator component.\n *\n * Returns the active `plugin`, `mode`, `config`, and a set of resolver helpers\n * (`getFile`, `resolveName`, `resolvePath`, `resolveBanner`, `resolveFooter`) that\n * all default to the current plugin when no explicit `pluginName` is provided.\n *\n * @example\n * ```ts\n * function Operation({ node }: OperationProps) {\n * const { config, resolvePath } = useKubb()\n * const filePath = resolvePath({ baseName: node.operationId })\n * return <File path={filePath}>...</File>\n * }\n * ```\n */\nexport function useKubb<TOptions extends PluginFactoryOptions = PluginFactoryOptions>(): UseKubbReturn<TOptions> {\n const { meta } = useFabric<{\n plugin: Plugin<TOptions>\n mode: KubbFile.Mode\n driver: PluginDriver\n }>()\n\n const config = meta.driver.config\n const defaultPluginName = meta.plugin.name\n\n const output = (\n meta.plugin.options as { output?: { banner?: string | ((node: RootNode) => string); footer?: string | ((node: RootNode) => string) } } | undefined\n )?.output\n\n return {\n plugin: meta.plugin as Plugin<TOptions>,\n mode: meta.mode,\n config,\n getPluginByName: (pluginName = defaultPluginName) => meta.driver.getPluginByName.call(meta.driver, pluginName),\n getFile: ({ pluginName = defaultPluginName, ...rest }) => meta.driver.getFile.call(meta.driver, { pluginName, ...rest }),\n resolveName: ({ pluginName = defaultPluginName, ...rest }) => meta.driver.resolveName.call(meta.driver, { pluginName, ...rest }),\n resolvePath: ({ pluginName = defaultPluginName, ...rest }) => meta.driver.resolvePath.call(meta.driver, { pluginName, ...rest }),\n resolveBanner: (node?: RootNode) => {\n if (typeof output?.banner === 'function') {\n return node ? output.banner(node) : buildDefaultBanner({ config })\n }\n if (typeof output?.banner === 'string') {\n return output.banner\n }\n if (config.output.defaultBanner === false) {\n return undefined\n }\n return buildDefaultBanner({ config })\n },\n resolveFooter: (node?: RootNode) => {\n if (typeof output?.footer === 'function') {\n return node ? output.footer(node) : undefined\n }\n if (typeof output?.footer === 'string') {\n return output.footer\n }\n return undefined\n },\n }\n}\n","import type { KubbFile } from '@kubb/fabric-core/types'\nimport { useFabric } from '@kubb/react-fabric'\n\n/**\n * @deprecated use `useKubb` instead\n */\nexport function useMode(): KubbFile.Mode {\n const { meta } = useFabric<{ mode: KubbFile.Mode }>()\n\n return meta.mode\n}\n","import { useFabric } from '@kubb/react-fabric'\nimport type { Plugin, PluginFactoryOptions } from '../types.ts'\n\n/**\n * @deprecated use useKubb instead\n */\nexport function usePlugin<TOptions extends PluginFactoryOptions = PluginFactoryOptions>(): Plugin<TOptions> {\n const { meta } = useFabric<{ plugin: Plugin<TOptions> }>()\n\n return meta.plugin\n}\n","import { useFabric } from '@kubb/react-fabric'\nimport type { PluginDriver } from '../PluginDriver.ts'\n\n/**\n * @deprecated use `useKubb` instead\n */\nexport function usePluginDriver(): PluginDriver {\n const { meta } = useFabric<{ driver: PluginDriver }>()\n\n return meta.driver\n}\n"],"mappings":";;;;;;;AAsDA,SAAS,mBAAmB,EAAE,OAAO,aAAa,SAAS,UAA8F;AACvJ,KAAI;EACF,IAAI,SAAS;AACb,MAAI,MAAM,QAAQ,OAAO,MAAM,EAAE;GAC/B,MAAM,QAAQ,OAAO,MAAM;AAC3B,OAAI,SAAS,UAAU,MACrB,UAAS,KAAK,SAAS,MAAM,KAAK;aAE3B,UAAU,OAAO,MAC1B,UAAS,KAAK,SAAS,OAAO,MAAM,KAAK;WAChC,UAAU,OAAO,MAC1B,UAAS;EAGX,IAAI,SAAS;AAEb,MAAI,OAAO,OAAO,kBAAkB,UAAU;AAC5C,aAAU;AACV,UAAO;;AAGT,MAAI,OACF,WAAU,aAAa,OAAO;AAGhC,MAAI,MACF,WAAU,YAAY,MAAM;AAG9B,MAAI,aAAa;GACf,MAAM,uBAAuB,YAAY,QAAQ,QAAQ,OAAO;AAChE,aAAU,kBAAkB,qBAAqB;;AAGnD,MAAI,QACF,WAAU,2BAA2B,QAAQ;AAG/C,YAAU;AACV,SAAO;UACA,QAAQ;AACf,SAAO;;;;;;;;;;;;;;;;;;;AAoBX,SAAgB,UAAiG;CAC/G,MAAM,EAAE,SAAS,WAIb;CAEJ,MAAM,SAAS,KAAK,OAAO;CAC3B,MAAM,oBAAoB,KAAK,OAAO;CAEtC,MAAM,SACJ,KAAK,OAAO,SACX;AAEH,QAAO;EACL,QAAQ,KAAK;EACb,MAAM,KAAK;EACX;EACA,kBAAkB,aAAa,sBAAsB,KAAK,OAAO,gBAAgB,KAAK,KAAK,QAAQ,WAAW;EAC9G,UAAU,EAAE,aAAa,mBAAmB,GAAG,WAAW,KAAK,OAAO,QAAQ,KAAK,KAAK,QAAQ;GAAE;GAAY,GAAG;GAAM,CAAC;EACxH,cAAc,EAAE,aAAa,mBAAmB,GAAG,WAAW,KAAK,OAAO,YAAY,KAAK,KAAK,QAAQ;GAAE;GAAY,GAAG;GAAM,CAAC;EAChI,cAAc,EAAE,aAAa,mBAAmB,GAAG,WAAW,KAAK,OAAO,YAAY,KAAK,KAAK,QAAQ;GAAE;GAAY,GAAG;GAAM,CAAC;EAChI,gBAAgB,SAAoB;AAClC,OAAI,OAAO,QAAQ,WAAW,WAC5B,QAAO,OAAO,OAAO,OAAO,KAAK,GAAG,mBAAmB,EAAE,QAAQ,CAAC;AAEpE,OAAI,OAAO,QAAQ,WAAW,SAC5B,QAAO,OAAO;AAEhB,OAAI,OAAO,OAAO,kBAAkB,MAClC;AAEF,UAAO,mBAAmB,EAAE,QAAQ,CAAC;;EAEvC,gBAAgB,SAAoB;AAClC,OAAI,OAAO,QAAQ,WAAW,WAC5B,QAAO,OAAO,OAAO,OAAO,KAAK,GAAG,KAAA;AAEtC,OAAI,OAAO,QAAQ,WAAW,SAC5B,QAAO,OAAO;;EAInB;;;;;;;ACxJH,SAAgB,UAAyB;CACvC,MAAM,EAAE,SAAS,WAAoC;AAErD,QAAO,KAAK;;;;;;;ACHd,SAAgB,YAA4F;CAC1G,MAAM,EAAE,SAAS,WAAyC;AAE1D,QAAO,KAAK;;;;;;;ACHd,SAAgB,kBAAgC;CAC9C,MAAM,EAAE,SAAS,WAAqC;AAEtD,QAAO,KAAK"}