nuxt-openapi-hyperfetch 0.3.8-beta → 1.0.0

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 (64) hide show
  1. package/README.md +218 -212
  2. package/dist/generators/components/connector-generator/templates.js +67 -17
  3. package/dist/generators/components/schema-analyzer/intent-detector.js +1 -12
  4. package/dist/generators/components/schema-analyzer/openapi-reader.js +10 -1
  5. package/dist/generators/components/schema-analyzer/resource-grouper.js +7 -0
  6. package/dist/generators/components/schema-analyzer/schema-field-mapper.js +1 -22
  7. package/dist/generators/components/schema-analyzer/types.d.ts +10 -0
  8. package/dist/generators/connectors/generator.d.ts +12 -0
  9. package/dist/generators/connectors/generator.js +115 -0
  10. package/dist/generators/connectors/runtime/connector-types.d.ts +147 -0
  11. package/dist/generators/connectors/runtime/connector-types.js +10 -0
  12. package/dist/generators/connectors/runtime/useCreateConnector.d.ts +26 -0
  13. package/dist/generators/connectors/runtime/useCreateConnector.js +156 -0
  14. package/dist/generators/connectors/runtime/useDeleteConnector.d.ts +30 -0
  15. package/dist/generators/connectors/runtime/useDeleteConnector.js +143 -0
  16. package/dist/generators/connectors/runtime/useGetAllConnector.d.ts +25 -0
  17. package/dist/generators/connectors/runtime/useGetAllConnector.js +127 -0
  18. package/dist/generators/connectors/runtime/useGetConnector.d.ts +15 -0
  19. package/dist/generators/connectors/runtime/useGetConnector.js +99 -0
  20. package/dist/generators/connectors/runtime/useUpdateConnector.d.ts +34 -0
  21. package/dist/generators/connectors/runtime/useUpdateConnector.js +211 -0
  22. package/dist/generators/connectors/runtime/zod-error-merger.d.ts +23 -0
  23. package/dist/generators/connectors/runtime/zod-error-merger.js +106 -0
  24. package/dist/generators/connectors/templates.d.ts +4 -0
  25. package/dist/generators/connectors/templates.js +376 -0
  26. package/dist/generators/connectors/types.d.ts +37 -0
  27. package/dist/generators/connectors/types.js +7 -0
  28. package/dist/generators/shared/runtime/useDeleteConnector.js +4 -2
  29. package/dist/generators/shared/runtime/useDetailConnector.d.ts +0 -1
  30. package/dist/generators/shared/runtime/useDetailConnector.js +9 -20
  31. package/dist/generators/shared/runtime/useFormConnector.js +4 -3
  32. package/dist/generators/use-async-data/runtime/useApiAsyncData.js +14 -5
  33. package/dist/generators/use-async-data/templates.js +20 -16
  34. package/dist/generators/use-fetch/templates.js +1 -1
  35. package/dist/index.js +1 -16
  36. package/dist/module/index.js +2 -3
  37. package/package.json +4 -3
  38. package/src/cli/prompts.ts +1 -7
  39. package/src/generators/components/connector-generator/templates.ts +97 -22
  40. package/src/generators/components/schema-analyzer/intent-detector.ts +1 -16
  41. package/src/generators/components/schema-analyzer/openapi-reader.ts +14 -1
  42. package/src/generators/components/schema-analyzer/resource-grouper.ts +9 -0
  43. package/src/generators/components/schema-analyzer/schema-field-mapper.ts +1 -26
  44. package/src/generators/components/schema-analyzer/types.ts +11 -0
  45. package/src/generators/connectors/generator.ts +137 -0
  46. package/src/generators/connectors/runtime/connector-types.ts +207 -0
  47. package/src/generators/connectors/runtime/useCreateConnector.ts +199 -0
  48. package/src/generators/connectors/runtime/useDeleteConnector.ts +179 -0
  49. package/src/generators/connectors/runtime/useGetAllConnector.ts +151 -0
  50. package/src/generators/connectors/runtime/useGetConnector.ts +120 -0
  51. package/src/generators/connectors/runtime/useUpdateConnector.ts +257 -0
  52. package/src/generators/connectors/runtime/zod-error-merger.ts +119 -0
  53. package/src/generators/connectors/templates.ts +481 -0
  54. package/src/generators/connectors/types.ts +39 -0
  55. package/src/generators/shared/runtime/useDeleteConnector.ts +4 -2
  56. package/src/generators/shared/runtime/useDetailConnector.ts +8 -19
  57. package/src/generators/shared/runtime/useFormConnector.ts +4 -3
  58. package/src/generators/use-async-data/runtime/useApiAsyncData.ts +16 -5
  59. package/src/generators/use-async-data/templates.ts +24 -16
  60. package/src/generators/use-fetch/templates.ts +1 -1
  61. package/src/index.ts +2 -19
  62. package/src/module/index.ts +2 -5
  63. package/docs/generated-components.md +0 -615
  64. package/docs/headless-composables-ui.md +0 -569
@@ -15,7 +15,6 @@ function generateFileHeader(): string {
15
15
  */
16
16
 
17
17
  /* eslint-disable */
18
- // @ts-nocheck
19
18
  `;
20
19
  }
21
20
 
@@ -123,6 +122,18 @@ function generateImports(method: MethodInfo, apiImportPath: string, isRaw: boole
123
122
  imports += `import { useApiAsyncData, type ApiAsyncDataOptions } from '../runtime/useApiAsyncData';`;
124
123
  }
125
124
 
125
+ // Vue imports needed by the generated function body
126
+ const vueImports: string[] = ['shallowRef'];
127
+ if (method.requestType) {
128
+ vueImports.push('isRef');
129
+ }
130
+ if (method.hasBody || method.hasQueryParams || method.pathParams.length > 0) {
131
+ vueImports.push('computed');
132
+ }
133
+ const vueTypeImports = method.requestType ? ['Ref', 'ComputedRef'] : [];
134
+ const allVueImports = [...vueImports, ...vueTypeImports.map((t) => `type ${t}`)].join(', ');
135
+ imports += `\nimport { ${allVueImports} } from 'vue';`;
136
+
126
137
  return imports;
127
138
  }
128
139
 
@@ -170,26 +181,23 @@ function generateFunctionBody(
170
181
  ? `ReturnType<typeof ${wrapperFunction}<${responseType}, DataT, PickT, Options>>`
171
182
  : `ReturnType<typeof ${wrapperFunction}<${responseType}, Options>>`;
172
183
 
173
- const pInit = hasParams ? `\n const p = shallowRef(params)` : '';
184
+ const pInit = hasParams ? `\n const p = isRef(params) ? params : shallowRef(params)` : '';
174
185
 
175
186
  const argsExtraction = hasParams
176
187
  ? ` const _hasKey = typeof args[0] === 'string'\n const params = _hasKey ? args[1] : args[0]\n const options = _hasKey ? { cacheKey: args[0], ...args[2] } : args[1]`
177
188
  : ` const _hasKey = typeof args[0] === 'string'\n const options = _hasKey ? { cacheKey: args[0], ...args[1] } : args[0]`;
178
189
 
179
- return `${description}export function ${composableName}<
180
- DataT = ${responseType},
181
- PickT extends ReadonlyArray<string> | undefined = undefined,
182
- Options extends ${optionsType} = ${optionsDefaultType}
183
- >(key: string, ${args}): ${returnType}
184
- export function ${composableName}<
185
- DataT = ${responseType},
186
- PickT extends ReadonlyArray<string> | undefined = undefined,
187
- Options extends ${optionsType} = ${optionsDefaultType}
188
- >(${args}): ${returnType}
189
- export function ${composableName}(...args: any[]) {
190
- ${argsExtraction}${pInit}
191
- return ${wrapperCall}(${key}, ${url}, ${fetchOptions})
192
- }`;
190
+ const genericTypeParams = `<\n DataT = ${responseType},\n PickT extends ReadonlyArray<string> | undefined = undefined,\n Options extends ${optionsType} = ${optionsDefaultType}\n>`;
191
+
192
+ const refParamsStr = hasParams
193
+ ? `params: Ref<${method.requestType}> | ComputedRef<${method.requestType}>, ${optionsArg}`
194
+ : '';
195
+
196
+ const refOverloads = hasParams
197
+ ? `\nexport function ${composableName}${genericTypeParams}(${refParamsStr}): ${returnType}\nexport function ${composableName}${genericTypeParams}(key: string, ${refParamsStr}): ${returnType}`
198
+ : '';
199
+
200
+ return `${description}export function ${composableName}${genericTypeParams}(${args}): ${returnType}\nexport function ${composableName}${genericTypeParams}(key: string, ${args}): ${returnType}${refOverloads}\nexport function ${composableName}(...args: any[]) {\n${argsExtraction}${pInit}\n return ${wrapperCall}(${key}, ${url}, ${fetchOptions})\n}`;
193
201
  }
194
202
 
195
203
  /**
@@ -126,7 +126,7 @@ function generateFunctionBody(method: MethodInfo, options?: GenerateOptions): st
126
126
 
127
127
  const description = method.description ? `/**\n * ${method.description}\n */\n` : '';
128
128
 
129
- const pInit = hasParams ? `\n const p = shallowRef(params)` : '';
129
+ const pInit = hasParams ? `\n const p = isRef(params) ? params : shallowRef(params)` : '';
130
130
 
131
131
  return `${description}export const ${method.composableName} = <
132
132
  DataT = ${responseType},
package/src/index.ts CHANGED
@@ -1,13 +1,11 @@
1
1
  #!/usr/bin/env node
2
2
  import { Command } from 'commander';
3
3
  import * as p from '@clack/prompts';
4
- import { existsSync } from 'fs';
5
- import * as path from 'path';
6
4
  import { generateOpenApiFiles, generateHeyApiFiles, checkJavaInstalled } from './generate.js';
7
5
  import { generateUseFetchComposables } from './generators/use-fetch/generator.js';
8
6
  import { generateUseAsyncDataComposables } from './generators/use-async-data/generator.js';
9
7
  import { generateNuxtServerRoutes } from './generators/nuxt-server/generator.js';
10
- import { generateConnectors } from './generators/components/connector-generator/generator.js';
8
+ import { generateConnectors } from './generators/connectors/generator.js';
11
9
  import {
12
10
  promptInitialInputs,
13
11
  promptInputPath,
@@ -114,7 +112,7 @@ program
114
112
  : config.generator === 'heyapi'
115
113
  ? 'heyapi'
116
114
  : config.backend;
117
- // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
115
+
118
116
  const backend = await promptGeneratorBackend(resolvedBackend);
119
117
 
120
118
  // Check Java availability when official backend is selected
@@ -209,7 +207,6 @@ program
209
207
  const spinner = p.spinner();
210
208
  spinner.start(`Generating ${composable}...`);
211
209
 
212
- // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
213
210
  const generateOptions = { baseUrl: config.baseUrl, backend };
214
211
 
215
212
  try {
@@ -240,7 +237,6 @@ program
240
237
  break;
241
238
  case 'nuxtServer':
242
239
  if (!config.dryRun) {
243
- // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
244
240
  await generateNuxtServerRoutes(outputPath, serverRoutePath, { enableBff, backend });
245
241
  spinner.stop(`✓ Generated Nuxt server routes`);
246
242
  } else {
@@ -255,19 +251,6 @@ program
255
251
  }
256
252
 
257
253
  // Generate headless connectors if requested (requires useAsyncData)
258
- if (generateConnectorsFlag) {
259
- // Check zod is available in the user's project by probing their node_modules,
260
- // not via import() which resolves from the CLI's own context (npx sandbox).
261
- const zodPath = path.resolve(process.cwd(), 'node_modules', 'zod');
262
- if (!existsSync(zodPath)) {
263
- p.log.warn(
264
- 'Skipping connectors: "zod" is not installed in this project.\n' +
265
- ' Run: npm install zod'
266
- );
267
- generateConnectorsFlag = false;
268
- }
269
- }
270
-
271
254
  if (generateConnectorsFlag) {
272
255
  const spinner = p.spinner();
273
256
  spinner.start('Generating headless UI connectors...');
@@ -5,7 +5,7 @@ import { checkJavaInstalled } from '../generate.js';
5
5
  import { generateUseFetchComposables } from '../generators/use-fetch/generator.js';
6
6
  import { generateUseAsyncDataComposables } from '../generators/use-async-data/generator.js';
7
7
  import { generateNuxtServerRoutes } from '../generators/nuxt-server/generator.js';
8
- import { generateConnectors } from '../generators/components/connector-generator/generator.js';
8
+ import { generateConnectors } from '../generators/connectors/generator.js';
9
9
  import { createConsoleLogger } from '../cli/logger.js';
10
10
  import type { ModuleOptions } from './types.js';
11
11
 
@@ -103,10 +103,7 @@ export default defineNuxtModule<ModuleOptions>({
103
103
  }
104
104
 
105
105
  // 3. Generate headless connectors if requested (requires useAsyncData)
106
- if (
107
- options.createUseAsyncDataConnectors &&
108
- selectedGenerators.includes('useAsyncData')
109
- ) {
106
+ if (options.createUseAsyncDataConnectors && selectedGenerators.includes('useAsyncData')) {
110
107
  const connectorsOutputDir = path.join(composablesOutputDir, 'connectors');
111
108
  await generateConnectors(
112
109
  {