nuxt-openapi-hyperfetch 1.0.3 → 1.0.4

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/src/index.ts CHANGED
@@ -17,7 +17,15 @@ import {
17
17
  } from './cli/prompts.js';
18
18
  import { MESSAGES } from './cli/messages.js';
19
19
  import { displayLogo } from './cli/logo.js';
20
- import { loadConfig, mergeConfig, parseTags, parseGenerators } from './cli/config.js';
20
+ import {
21
+ loadConfig,
22
+ mergeConfig,
23
+ parseTags,
24
+ parseGenerators,
25
+ normalizeGenerators,
26
+ type ComposableGeneratorType,
27
+ } from './cli/config.js';
28
+ import { hasConnectorsConfig } from './config/connectors.js';
21
29
 
22
30
  const program = new Command();
23
31
 
@@ -54,7 +62,7 @@ program
54
62
  .option('--dry-run', 'Preview changes without writing files', false)
55
63
  .option('-v, --verbose', 'Enable verbose logging', false)
56
64
  .option('--watch', 'Watch mode - regenerate on file changes', false)
57
- .option('--generators <types>', 'Generators to use: useFetch,useAsyncData,nuxtServer')
65
+ .option('--generators <types>', 'Generators to use: useFetch,useAsyncData,nuxtServer,connectors')
58
66
  .option('--connectors', 'Generate headless UI connectors on top of useAsyncData', false)
59
67
  .option('--server-route-path <path>', 'Server route path (for nuxtServer mode)')
60
68
  .option('--enable-bff', 'Enable BFF pattern (for nuxtServer mode)', false)
@@ -127,19 +135,28 @@ program
127
135
  }
128
136
 
129
137
  // 1. Determine composables to generate FIRST
130
- let composables: ('useFetch' | 'useAsyncData' | 'nuxtServer')[];
138
+ let composables: ComposableGeneratorType[];
139
+ let generateConnectorsFlag = false;
140
+ const connectorsConfigured = hasConnectorsConfig(config.connectors);
131
141
 
132
142
  if (config.generators) {
133
- // filter out 'connectors' — handled separately below
134
- composables = config.generators.filter(
135
- (g): g is 'useFetch' | 'useAsyncData' | 'nuxtServer' => g !== 'connectors'
143
+ const normalized = normalizeGenerators(
144
+ config.generators,
145
+ config.createUseAsyncDataConnectors
136
146
  );
147
+ composables = normalized.composables;
148
+ generateConnectorsFlag = normalized.generateConnectors;
137
149
  if (config.verbose) {
138
150
  console.log(`Using generators from config: ${composables.join(', ')}`);
139
151
  }
140
152
  } else {
141
153
  const result = await promptComposablesSelection();
142
- composables = result.composables;
154
+ const normalized = normalizeGenerators(
155
+ result.composables,
156
+ config.createUseAsyncDataConnectors
157
+ );
158
+ composables = normalized.composables;
159
+ generateConnectorsFlag = normalized.generateConnectors;
143
160
  }
144
161
 
145
162
  if (composables.length === 0) {
@@ -165,13 +182,24 @@ program
165
182
  outputPath = config.output ?? './swagger';
166
183
  }
167
184
 
168
- // 3. Ask whether to generate headless connectors (only if useAsyncData selected)
169
- let generateConnectorsFlag = false;
185
+ // 3. Ask whether to generate headless connectors (only if still unresolved)
170
186
  if (composables.includes('useAsyncData')) {
171
- if (config.createUseAsyncDataConnectors !== undefined) {
172
- generateConnectorsFlag = config.createUseAsyncDataConnectors;
173
- } else {
187
+ const hasExplicitConnectorsInGenerators =
188
+ config.generators?.includes('connectors') ?? false;
189
+ const shouldPromptConnectors =
190
+ !generateConnectorsFlag &&
191
+ config.createUseAsyncDataConnectors === undefined &&
192
+ !hasExplicitConnectorsInGenerators &&
193
+ !connectorsConfigured;
194
+
195
+ if (shouldPromptConnectors) {
174
196
  generateConnectorsFlag = await promptConnectors();
197
+ } else if (connectorsConfigured) {
198
+ generateConnectorsFlag = true;
199
+ } else if (config.createUseAsyncDataConnectors !== undefined) {
200
+ generateConnectorsFlag = config.createUseAsyncDataConnectors;
201
+ } else if (hasExplicitConnectorsInGenerators) {
202
+ generateConnectorsFlag = true;
175
203
  }
176
204
  }
177
205
 
@@ -261,6 +289,7 @@ program
261
289
  outputDir: `${composablesOutputDir}/connectors`,
262
290
  composablesRelDir: '../use-async-data/composables',
263
291
  runtimeRelDir: '../../runtime',
292
+ connectorsConfig: config.connectors,
264
293
  });
265
294
  spinner.stop('✓ Generated headless UI connectors');
266
295
  } else {
@@ -7,6 +7,8 @@ import { generateUseAsyncDataComposables } from '../generators/use-async-data/ge
7
7
  import { generateNuxtServerRoutes } from '../generators/nuxt-server/generator.js';
8
8
  import { generateConnectors } from '../generators/connectors/generator.js';
9
9
  import { createConsoleLogger } from '../cli/logger.js';
10
+ import { normalizeGenerators } from '../cli/config.js';
11
+ import { isConnectorsRequested } from '../config/connectors.js';
10
12
  import type { ModuleOptions } from './types.js';
11
13
 
12
14
  export default defineNuxtModule<ModuleOptions>({
@@ -39,7 +41,13 @@ export default defineNuxtModule<ModuleOptions>({
39
41
  const resolvedInput = path.resolve(nuxt.options.rootDir, options.input);
40
42
  const resolvedOutput = path.resolve(nuxt.options.rootDir, options.output!);
41
43
  const composablesOutputDir = path.join(resolvedOutput, 'composables');
42
- const selectedGenerators = options.generators ?? ['useFetch', 'useAsyncData'];
44
+ const normalized = normalizeGenerators(
45
+ options.generators ?? ['useFetch', 'useAsyncData'],
46
+ options.createUseAsyncDataConnectors
47
+ );
48
+ const selectedGenerators = normalized.composables;
49
+ const generateConnectorsFlag = normalized.generateConnectors;
50
+ const connectorsRequested = isConnectorsRequested(options);
43
51
  const backend = options.backend ?? 'heyapi';
44
52
  const logger = createConsoleLogger();
45
53
 
@@ -103,7 +111,10 @@ export default defineNuxtModule<ModuleOptions>({
103
111
  }
104
112
 
105
113
  // 3. Generate headless connectors if requested (requires useAsyncData)
106
- if (options.createUseAsyncDataConnectors && selectedGenerators.includes('useAsyncData')) {
114
+ if (
115
+ (generateConnectorsFlag || connectorsRequested) &&
116
+ selectedGenerators.includes('useAsyncData')
117
+ ) {
107
118
  const connectorsOutputDir = path.join(composablesOutputDir, 'connectors');
108
119
  await generateConnectors(
109
120
  {
@@ -111,6 +122,7 @@ export default defineNuxtModule<ModuleOptions>({
111
122
  outputDir: connectorsOutputDir,
112
123
  composablesRelDir: '../use-async-data/composables',
113
124
  runtimeRelDir: '../../runtime',
125
+ connectorsConfig: options.connectors,
114
126
  },
115
127
  logger
116
128
  );
@@ -142,7 +154,10 @@ export default defineNuxtModule<ModuleOptions>({
142
154
  if (selectedGenerators.includes('useAsyncData')) {
143
155
  addImportsDir(path.join(composablesOutputDir, 'use-async-data', 'composables'));
144
156
  }
145
- if (options.createUseAsyncDataConnectors && selectedGenerators.includes('useAsyncData')) {
157
+ if (
158
+ (generateConnectorsFlag || connectorsRequested) &&
159
+ selectedGenerators.includes('useAsyncData')
160
+ ) {
146
161
  addImportsDir(path.join(composablesOutputDir, 'connectors'));
147
162
  }
148
163
  }
@@ -1,4 +1,4 @@
1
- import type { GeneratorConfig } from '../cli/config.js';
1
+ import type { GeneratorConfig } from '../config/types.js';
2
2
 
3
3
  /**
4
4
  * Configuration options for the nuxt-openapi-hyperfetch Nuxt module.
@@ -30,9 +30,9 @@ export interface ModuleOptions extends GeneratorConfig {
30
30
  enableAutoImport?: boolean;
31
31
 
32
32
  /**
33
- * Generate headless UI connector composables on top of useAsyncData.
34
- * Connectors provide ready-made logic for tables, pagination, forms and delete actions.
35
- * Requires useAsyncData to also be in generators.
33
+ * Backward-compatible connectors flag.
34
+ * Prefer `generators: ['connectors']` so module and CLI behave the same.
35
+ * When true, connectors are generated and useAsyncData is added automatically.
36
36
  * @default false
37
37
  */
38
38
  createUseAsyncDataConnectors?: boolean;