nuxt-openapi-hyperfetch 0.1.7-alpha.1 → 0.2.7-alpha.1

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 (97) hide show
  1. package/CONTRIBUTING.md +291 -292
  2. package/INSTRUCTIONS.md +327 -327
  3. package/LICENSE +202 -202
  4. package/README.md +231 -227
  5. package/dist/cli/logger.d.ts +26 -0
  6. package/dist/cli/logger.js +36 -0
  7. package/dist/cli/logo.js +5 -5
  8. package/dist/generators/components/connector-generator/generator.d.ts +12 -0
  9. package/dist/generators/components/connector-generator/generator.js +116 -0
  10. package/dist/generators/components/connector-generator/templates.d.ts +18 -0
  11. package/dist/generators/components/connector-generator/templates.js +222 -0
  12. package/dist/generators/components/connector-generator/types.d.ts +32 -0
  13. package/dist/generators/components/connector-generator/types.js +7 -0
  14. package/dist/generators/components/schema-analyzer/index.d.ts +17 -0
  15. package/dist/generators/components/schema-analyzer/index.js +20 -0
  16. package/dist/generators/components/schema-analyzer/intent-detector.d.ts +17 -0
  17. package/dist/generators/components/schema-analyzer/intent-detector.js +143 -0
  18. package/dist/generators/components/schema-analyzer/openapi-reader.d.ts +11 -0
  19. package/dist/generators/components/schema-analyzer/openapi-reader.js +76 -0
  20. package/dist/generators/components/schema-analyzer/resource-grouper.d.ts +6 -0
  21. package/dist/generators/components/schema-analyzer/resource-grouper.js +132 -0
  22. package/dist/generators/components/schema-analyzer/schema-field-mapper.d.ts +35 -0
  23. package/dist/generators/components/schema-analyzer/schema-field-mapper.js +220 -0
  24. package/dist/generators/components/schema-analyzer/types.d.ts +156 -0
  25. package/dist/generators/components/schema-analyzer/types.js +7 -0
  26. package/dist/generators/nuxt-server/generator.d.ts +2 -1
  27. package/dist/generators/nuxt-server/generator.js +21 -21
  28. package/dist/generators/shared/runtime/apiHelpers.d.ts +81 -41
  29. package/dist/generators/shared/runtime/apiHelpers.js +97 -104
  30. package/dist/generators/shared/runtime/pagination.d.ts +168 -0
  31. package/dist/generators/shared/runtime/pagination.js +179 -0
  32. package/dist/generators/shared/runtime/useDeleteConnector.d.ts +16 -0
  33. package/dist/generators/shared/runtime/useDeleteConnector.js +93 -0
  34. package/dist/generators/shared/runtime/useDetailConnector.d.ts +14 -0
  35. package/dist/generators/shared/runtime/useDetailConnector.js +50 -0
  36. package/dist/generators/shared/runtime/useFormConnector.d.ts +19 -0
  37. package/dist/generators/shared/runtime/useFormConnector.js +113 -0
  38. package/dist/generators/shared/runtime/useListConnector.d.ts +25 -0
  39. package/dist/generators/shared/runtime/useListConnector.js +125 -0
  40. package/dist/generators/shared/runtime/zod-error-merger.d.ts +23 -0
  41. package/dist/generators/shared/runtime/zod-error-merger.js +106 -0
  42. package/dist/generators/shared/templates/api-callbacks-plugin.js +54 -11
  43. package/dist/generators/shared/templates/api-pagination-plugin.d.ts +51 -0
  44. package/dist/generators/shared/templates/api-pagination-plugin.js +152 -0
  45. package/dist/generators/use-async-data/generator.d.ts +2 -1
  46. package/dist/generators/use-async-data/generator.js +14 -14
  47. package/dist/generators/use-async-data/runtime/useApiAsyncData.js +114 -13
  48. package/dist/generators/use-async-data/runtime/useApiAsyncDataRaw.js +88 -10
  49. package/dist/generators/use-async-data/templates.js +17 -17
  50. package/dist/generators/use-fetch/generator.d.ts +2 -1
  51. package/dist/generators/use-fetch/generator.js +12 -12
  52. package/dist/generators/use-fetch/runtime/useApiRequest.js +149 -40
  53. package/dist/generators/use-fetch/templates.js +14 -14
  54. package/dist/index.js +25 -0
  55. package/dist/module/index.d.ts +4 -0
  56. package/dist/module/index.js +93 -0
  57. package/dist/module/types.d.ts +27 -0
  58. package/dist/module/types.js +1 -0
  59. package/docs/API-REFERENCE.md +886 -887
  60. package/docs/generated-components.md +615 -0
  61. package/docs/headless-composables-ui.md +569 -0
  62. package/eslint.config.js +13 -0
  63. package/package.json +29 -2
  64. package/src/cli/config.ts +140 -140
  65. package/src/cli/logger.ts +124 -66
  66. package/src/cli/logo.ts +25 -25
  67. package/src/cli/types.ts +50 -50
  68. package/src/generators/components/connector-generator/generator.ts +138 -0
  69. package/src/generators/components/connector-generator/templates.ts +254 -0
  70. package/src/generators/components/connector-generator/types.ts +34 -0
  71. package/src/generators/components/schema-analyzer/index.ts +44 -0
  72. package/src/generators/components/schema-analyzer/intent-detector.ts +187 -0
  73. package/src/generators/components/schema-analyzer/openapi-reader.ts +96 -0
  74. package/src/generators/components/schema-analyzer/resource-grouper.ts +166 -0
  75. package/src/generators/components/schema-analyzer/schema-field-mapper.ts +268 -0
  76. package/src/generators/components/schema-analyzer/types.ts +177 -0
  77. package/src/generators/nuxt-server/generator.ts +272 -270
  78. package/src/generators/shared/runtime/apiHelpers.ts +535 -507
  79. package/src/generators/shared/runtime/pagination.ts +323 -0
  80. package/src/generators/shared/runtime/useDeleteConnector.ts +109 -0
  81. package/src/generators/shared/runtime/useDetailConnector.ts +64 -0
  82. package/src/generators/shared/runtime/useFormConnector.ts +139 -0
  83. package/src/generators/shared/runtime/useListConnector.ts +148 -0
  84. package/src/generators/shared/runtime/zod-error-merger.ts +119 -0
  85. package/src/generators/shared/templates/api-callbacks-plugin.ts +399 -352
  86. package/src/generators/shared/templates/api-pagination-plugin.ts +158 -0
  87. package/src/generators/use-async-data/generator.ts +205 -204
  88. package/src/generators/use-async-data/runtime/useApiAsyncData.ts +329 -229
  89. package/src/generators/use-async-data/runtime/useApiAsyncDataRaw.ts +324 -245
  90. package/src/generators/use-async-data/templates.ts +257 -257
  91. package/src/generators/use-fetch/generator.ts +170 -169
  92. package/src/generators/use-fetch/runtime/useApiRequest.ts +354 -234
  93. package/src/generators/use-fetch/templates.ts +214 -214
  94. package/src/index.ts +303 -265
  95. package/src/module/index.ts +133 -0
  96. package/src/module/types.ts +31 -0
  97. package/src/generators/tanstack-query/generator.ts +0 -11
@@ -0,0 +1,133 @@
1
+ import { defineNuxtModule, addImportsDir } from '@nuxt/kit';
2
+ import { execSync } from 'child_process';
3
+ import * as path from 'path';
4
+ import { checkJavaInstalled } from '../generate.js';
5
+ import { generateUseFetchComposables } from '../generators/use-fetch/generator.js';
6
+ import { generateUseAsyncDataComposables } from '../generators/use-async-data/generator.js';
7
+ import { generateNuxtServerRoutes } from '../generators/nuxt-server/generator.js';
8
+ import { createConsoleLogger } from '../cli/logger.js';
9
+ import type { ModuleOptions } from './types.js';
10
+
11
+ export default defineNuxtModule<ModuleOptions>({
12
+ meta: {
13
+ name: 'nuxt-openapi-hyperfetch',
14
+ configKey: 'openApiHyperFetch',
15
+ },
16
+
17
+ defaults: {
18
+ output: './composables/api',
19
+ generators: ['useFetch', 'useAsyncData'],
20
+ backend: 'heyapi',
21
+ enableDevBuild: true,
22
+ enableProductionBuild: true,
23
+ enableAutoGeneration: false,
24
+ enableAutoImport: true,
25
+ },
26
+
27
+ setup(options: ModuleOptions, nuxt) {
28
+ // --- Guard: input is required ---
29
+ if (!options.input) {
30
+ console.warn(
31
+ '[nuxt-openapi-hyperfetch] No input configured — skipping generation.\n' +
32
+ "Add `openApiHyperFetch: { input: './swagger.yaml' }` to your nuxt.config.ts"
33
+ );
34
+ return;
35
+ }
36
+
37
+ const resolvedInput = path.resolve(nuxt.options.rootDir, options.input);
38
+ const resolvedOutput = path.resolve(nuxt.options.rootDir, options.output!);
39
+ const composablesOutputDir = path.join(resolvedOutput, 'composables');
40
+ const selectedGenerators = options.generators ?? ['useFetch', 'useAsyncData'];
41
+ const backend = options.backend ?? 'heyapi';
42
+ const logger = createConsoleLogger();
43
+
44
+ // --- Core generation function ---
45
+ const runGeneration = async () => {
46
+ logger.log.info('Generating OpenAPI composables...');
47
+
48
+ // 1. Generate OpenAPI SDK files
49
+ if (backend === 'official') {
50
+ if (!checkJavaInstalled()) {
51
+ throw new Error(
52
+ '[nuxt-openapi-hyperfetch] Java not found. The official backend requires Java 11+.\n' +
53
+ 'Install from: https://adoptium.net or set backend: "heyapi" in nuxt.config.ts'
54
+ );
55
+ }
56
+ execSync(
57
+ `npx @openapitools/openapi-generator-cli generate -i "${resolvedInput}" -g typescript-fetch -o "${resolvedOutput}"`,
58
+ { stdio: 'inherit' }
59
+ );
60
+ } else {
61
+ const { createClient } = await import('@hey-api/openapi-ts');
62
+ await createClient({
63
+ input: resolvedInput,
64
+ output: resolvedOutput,
65
+ plugins: ['@hey-api/typescript', '@hey-api/sdk'],
66
+ });
67
+ }
68
+
69
+ // 2. Run selected composable generators
70
+ const genOptions = { backend };
71
+
72
+ if (selectedGenerators.includes('useFetch')) {
73
+ await generateUseFetchComposables(
74
+ resolvedOutput,
75
+ path.join(composablesOutputDir, 'use-fetch'),
76
+ genOptions,
77
+ logger
78
+ );
79
+ }
80
+
81
+ if (selectedGenerators.includes('useAsyncData')) {
82
+ await generateUseAsyncDataComposables(
83
+ resolvedOutput,
84
+ path.join(composablesOutputDir, 'use-async-data'),
85
+ genOptions,
86
+ logger
87
+ );
88
+ }
89
+
90
+ if (selectedGenerators.includes('nuxtServer')) {
91
+ const serverRoutePath = path.resolve(
92
+ nuxt.options.rootDir,
93
+ options.serverRoutePath ?? 'server/routes/api'
94
+ );
95
+ await generateNuxtServerRoutes(
96
+ resolvedOutput,
97
+ serverRoutePath,
98
+ { enableBff: options.enableBff, backend },
99
+ logger
100
+ );
101
+ }
102
+ };
103
+
104
+ // --- Hooks: dev build / production build ---
105
+ const isDev = nuxt.options.dev;
106
+ if ((isDev && options.enableDevBuild) || (!isDev && options.enableProductionBuild)) {
107
+ nuxt.hook('build:before', runGeneration);
108
+ }
109
+
110
+ // --- Hook: auto-regeneration on input file change (dev only) ---
111
+ if (options.enableAutoGeneration) {
112
+ nuxt.hook('builder:watch', async (event: string, watchedPath: string) => {
113
+ const absWatchedPath = path.resolve(nuxt.options.rootDir, watchedPath);
114
+ if (absWatchedPath === resolvedInput && (event === 'change' || event === 'add')) {
115
+ logger.log.info(`Detected change in ${watchedPath}, regenerating composables...`);
116
+ await runGeneration();
117
+ }
118
+ });
119
+ }
120
+
121
+ // --- Auto-import: register composable directories ---
122
+ if (options.enableAutoImport !== false) {
123
+ if (selectedGenerators.includes('useFetch')) {
124
+ addImportsDir(path.join(composablesOutputDir, 'use-fetch', 'composables'));
125
+ }
126
+ if (selectedGenerators.includes('useAsyncData')) {
127
+ addImportsDir(path.join(composablesOutputDir, 'use-async-data', 'composables'));
128
+ }
129
+ }
130
+ },
131
+ });
132
+
133
+ export type { ModuleOptions };
@@ -0,0 +1,31 @@
1
+ import type { GeneratorConfig } from '../cli/config.js';
2
+
3
+ /**
4
+ * Configuration options for the nuxt-openapi-hyperfetch Nuxt module.
5
+ * Extends the CLI GeneratorConfig so the same fields work in both nxh.config.js and nuxt.config.ts.
6
+ */
7
+ export interface ModuleOptions extends GeneratorConfig {
8
+ /**
9
+ * Generate composables before the dev server starts.
10
+ * @default true
11
+ */
12
+ enableDevBuild?: boolean;
13
+
14
+ /**
15
+ * Generate composables before the production build.
16
+ * @default true
17
+ */
18
+ enableProductionBuild?: boolean;
19
+
20
+ /**
21
+ * Watch the input file and regenerate composables on change (dev mode only).
22
+ * @default false
23
+ */
24
+ enableAutoGeneration?: boolean;
25
+
26
+ /**
27
+ * Automatically import generated useFetch/useAsyncData composables project-wide.
28
+ * @default true
29
+ */
30
+ enableAutoImport?: boolean;
31
+ }
@@ -1,11 +0,0 @@
1
- /**
2
- * Placeholder for TanStack Query composables generator
3
- * TODO: Implement TanStack Query generation
4
- */
5
- export function generateTanstackQueryComposables(inputDir: string, outputDir: string): void {
6
- console.log('\nšŸ“¦ @tanstack/vue-query generator\n');
7
- console.log(` Input: ${inputDir}`);
8
- console.log(` Output: ${outputDir}`);
9
- console.log('\nāš ļø This generator is not yet implemented.');
10
- console.log(' Coming soon!\n');
11
- }