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.
- package/CONTRIBUTING.md +291 -292
- package/INSTRUCTIONS.md +327 -327
- package/LICENSE +202 -202
- package/README.md +231 -227
- package/dist/cli/logger.d.ts +26 -0
- package/dist/cli/logger.js +36 -0
- package/dist/cli/logo.js +5 -5
- package/dist/generators/components/connector-generator/generator.d.ts +12 -0
- package/dist/generators/components/connector-generator/generator.js +116 -0
- package/dist/generators/components/connector-generator/templates.d.ts +18 -0
- package/dist/generators/components/connector-generator/templates.js +222 -0
- package/dist/generators/components/connector-generator/types.d.ts +32 -0
- package/dist/generators/components/connector-generator/types.js +7 -0
- package/dist/generators/components/schema-analyzer/index.d.ts +17 -0
- package/dist/generators/components/schema-analyzer/index.js +20 -0
- package/dist/generators/components/schema-analyzer/intent-detector.d.ts +17 -0
- package/dist/generators/components/schema-analyzer/intent-detector.js +143 -0
- package/dist/generators/components/schema-analyzer/openapi-reader.d.ts +11 -0
- package/dist/generators/components/schema-analyzer/openapi-reader.js +76 -0
- package/dist/generators/components/schema-analyzer/resource-grouper.d.ts +6 -0
- package/dist/generators/components/schema-analyzer/resource-grouper.js +132 -0
- package/dist/generators/components/schema-analyzer/schema-field-mapper.d.ts +35 -0
- package/dist/generators/components/schema-analyzer/schema-field-mapper.js +220 -0
- package/dist/generators/components/schema-analyzer/types.d.ts +156 -0
- package/dist/generators/components/schema-analyzer/types.js +7 -0
- package/dist/generators/nuxt-server/generator.d.ts +2 -1
- package/dist/generators/nuxt-server/generator.js +21 -21
- package/dist/generators/shared/runtime/apiHelpers.d.ts +81 -41
- package/dist/generators/shared/runtime/apiHelpers.js +97 -104
- package/dist/generators/shared/runtime/pagination.d.ts +168 -0
- package/dist/generators/shared/runtime/pagination.js +179 -0
- package/dist/generators/shared/runtime/useDeleteConnector.d.ts +16 -0
- package/dist/generators/shared/runtime/useDeleteConnector.js +93 -0
- package/dist/generators/shared/runtime/useDetailConnector.d.ts +14 -0
- package/dist/generators/shared/runtime/useDetailConnector.js +50 -0
- package/dist/generators/shared/runtime/useFormConnector.d.ts +19 -0
- package/dist/generators/shared/runtime/useFormConnector.js +113 -0
- package/dist/generators/shared/runtime/useListConnector.d.ts +25 -0
- package/dist/generators/shared/runtime/useListConnector.js +125 -0
- package/dist/generators/shared/runtime/zod-error-merger.d.ts +23 -0
- package/dist/generators/shared/runtime/zod-error-merger.js +106 -0
- package/dist/generators/shared/templates/api-callbacks-plugin.js +54 -11
- package/dist/generators/shared/templates/api-pagination-plugin.d.ts +51 -0
- package/dist/generators/shared/templates/api-pagination-plugin.js +152 -0
- package/dist/generators/use-async-data/generator.d.ts +2 -1
- package/dist/generators/use-async-data/generator.js +14 -14
- package/dist/generators/use-async-data/runtime/useApiAsyncData.js +114 -13
- package/dist/generators/use-async-data/runtime/useApiAsyncDataRaw.js +88 -10
- package/dist/generators/use-async-data/templates.js +17 -17
- package/dist/generators/use-fetch/generator.d.ts +2 -1
- package/dist/generators/use-fetch/generator.js +12 -12
- package/dist/generators/use-fetch/runtime/useApiRequest.js +149 -40
- package/dist/generators/use-fetch/templates.js +14 -14
- package/dist/index.js +25 -0
- package/dist/module/index.d.ts +4 -0
- package/dist/module/index.js +93 -0
- package/dist/module/types.d.ts +27 -0
- package/dist/module/types.js +1 -0
- package/docs/API-REFERENCE.md +886 -887
- package/docs/generated-components.md +615 -0
- package/docs/headless-composables-ui.md +569 -0
- package/eslint.config.js +13 -0
- package/package.json +29 -2
- package/src/cli/config.ts +140 -140
- package/src/cli/logger.ts +124 -66
- package/src/cli/logo.ts +25 -25
- package/src/cli/types.ts +50 -50
- package/src/generators/components/connector-generator/generator.ts +138 -0
- package/src/generators/components/connector-generator/templates.ts +254 -0
- package/src/generators/components/connector-generator/types.ts +34 -0
- package/src/generators/components/schema-analyzer/index.ts +44 -0
- package/src/generators/components/schema-analyzer/intent-detector.ts +187 -0
- package/src/generators/components/schema-analyzer/openapi-reader.ts +96 -0
- package/src/generators/components/schema-analyzer/resource-grouper.ts +166 -0
- package/src/generators/components/schema-analyzer/schema-field-mapper.ts +268 -0
- package/src/generators/components/schema-analyzer/types.ts +177 -0
- package/src/generators/nuxt-server/generator.ts +272 -270
- package/src/generators/shared/runtime/apiHelpers.ts +535 -507
- package/src/generators/shared/runtime/pagination.ts +323 -0
- package/src/generators/shared/runtime/useDeleteConnector.ts +109 -0
- package/src/generators/shared/runtime/useDetailConnector.ts +64 -0
- package/src/generators/shared/runtime/useFormConnector.ts +139 -0
- package/src/generators/shared/runtime/useListConnector.ts +148 -0
- package/src/generators/shared/runtime/zod-error-merger.ts +119 -0
- package/src/generators/shared/templates/api-callbacks-plugin.ts +399 -352
- package/src/generators/shared/templates/api-pagination-plugin.ts +158 -0
- package/src/generators/use-async-data/generator.ts +205 -204
- package/src/generators/use-async-data/runtime/useApiAsyncData.ts +329 -229
- package/src/generators/use-async-data/runtime/useApiAsyncDataRaw.ts +324 -245
- package/src/generators/use-async-data/templates.ts +257 -257
- package/src/generators/use-fetch/generator.ts +170 -169
- package/src/generators/use-fetch/runtime/useApiRequest.ts +354 -234
- package/src/generators/use-fetch/templates.ts +214 -214
- package/src/index.ts +303 -265
- package/src/module/index.ts +133 -0
- package/src/module/types.ts +31 -0
- 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
|
-
}
|