Skip to content

Commit dd7ad86

Browse files
committed
refactor: change --use-query-safe-response to accept boolean value
- Removed --no-use-query-safe-response flag - Changed --use-query-safe-response to accept true/false value - Default is now false (SafeResponse not exported by default) - Only export SafeResponse for GET operations when flag is true - Updated help text with clearer examples - Updated test fixtures to default behavior (SafeResponse not exported)
1 parent ea5660a commit dd7ad86

File tree

2 files changed

+30
-30
lines changed

2 files changed

+30
-30
lines changed

src/cli.ts

Lines changed: 30 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1502,18 +1502,16 @@ Options:
15021502
--exclude-prefix PREFIX Exclude operations with operationId starting with PREFIX
15031503
(default: '_deprecated')
15041504
--no-exclude Disable operation exclusion (include all operations)
1505-
--use-query-safe-response Use ApiResponseSafe for GET operations by default
1506-
(default: true; query responses have only readonly fields required)
1507-
--no-use-query-safe-response Disable safe response typing for GET operations
1508-
(all fields required, matching ApiResponse behavior)
1505+
--use-query-safe-response Export SafeResponse type for GET operations
1506+
(default: false; use true to enable)
15091507
--help, -h Show this help message
15101508
15111509
Examples:
15121510
npx @qualisero/openapi-endpoint ./api/openapi.json ./src/generated
15131511
npx @qualisero/openapi-endpoint https://api.example.com/openapi.json ./src/api
15141512
npx @qualisero/openapi-endpoint ./api.json ./src/gen --exclude-prefix _internal
15151513
npx @qualisero/openapi-endpoint ./api.json ./src/gen --no-exclude
1516-
npx @qualisero/openapi-endpoint ./api.json ./src/gen --no-use-query-safe-response
1514+
npx @qualisero/openapi-endpoint ./api.json ./src/gen --use-query-safe-response true
15171515
15181516
This command will generate:
15191517
- openapi-types.ts (TypeScript types from OpenAPI spec)
@@ -1524,13 +1522,17 @@ This command will generate:
15241522
- api-schemas.ts (Type aliases for schema objects from OpenAPI spec)
15251523
15261524
Query Response Typing (--use-query-safe-response):
1527-
GET responses with this flag enabled use ApiResponseSafe, which requires only readonly
1525+
When enabled (true), GET operations export a SafeResponse type that requires only readonly
15281526
fields (typically those provided by the server). This matches the semantic distinction:
15291527
- POST/PATCH request bodies: optional fields (you don't have to provide everything)
15301528
- GET response bodies: readonly fields are always present (server always returns them)
15311529
1532-
Disable this flag to require all fields (ApiResponse) if your API schema doesn't
1533-
properly distinguish readonly fields.
1530+
Example:
1531+
import { api } from './api-client'
1532+
const { data } = api.listPets.useQuery()
1533+
// data has type SafeResponse when --use-query-safe-response true
1534+
1535+
When disabled (default), only the Response type is exported.
15341536
`)
15351537
}
15361538

@@ -1843,7 +1845,7 @@ async function generateApiOperationsFile(
18431845
function generateApiTypesContent(
18441846
operationMap: Record<string, OperationInfo>,
18451847
opEnums: Record<string, Record<string, Record<string, string>>>,
1846-
useQuerySafeResponse = true,
1848+
useQuerySafeResponse = false,
18471849
): string {
18481850
const ids = Object.keys(operationMap).sort()
18491851
const isQuery = (id: string) => ['GET', 'HEAD', 'OPTIONS'].includes(operationMap[id].method)
@@ -1933,7 +1935,7 @@ async function generateApiTypesFile(
19331935
openApiSpec: OpenAPISpec,
19341936
outputDir: string,
19351937
excludePrefix: string | null,
1936-
useQuerySafeResponse = true,
1938+
useQuerySafeResponse = false,
19371939
): Promise<void> {
19381940
console.log('🔨 Generating api-types.ts...')
19391941
const operationMap = buildOperationMap(openApiSpec, excludePrefix)
@@ -1961,7 +1963,7 @@ async function main(): Promise<void> {
19611963

19621964
// Parse options
19631965
let excludePrefix: string | null = '_deprecated' // default
1964-
let useQuerySafeResponse = true // default to true
1966+
let useQuerySafeResponse = false // default to false
19651967

19661968
for (let i = 0; i < optionArgs.length; i++) {
19671969
if (optionArgs[i] === '--no-exclude') {
@@ -1976,9 +1978,21 @@ async function main(): Promise<void> {
19761978
process.exit(1)
19771979
}
19781980
} else if (optionArgs[i] === '--use-query-safe-response') {
1979-
useQuerySafeResponse = true
1980-
} else if (optionArgs[i] === '--no-use-query-safe-response') {
1981-
useQuerySafeResponse = false
1981+
if (i + 1 < optionArgs.length && ['true', 'false'].includes(optionArgs[i + 1])) {
1982+
useQuerySafeResponse = optionArgs[i + 1] === 'true'
1983+
i++ // Skip next arg since we consumed it
1984+
} else {
1985+
console.error('❌ Error: --use-query-safe-response requires a value (true or false)')
1986+
printUsage()
1987+
process.exit(1)
1988+
}
1989+
} else if (optionArgs[i] === '--help' || optionArgs[i] === '-h') {
1990+
printUsage()
1991+
process.exit(0)
1992+
} else {
1993+
console.error(`❌ Error: Unknown option '${optionArgs[i]}'`)
1994+
printUsage()
1995+
process.exit(1)
19821996
}
19831997
}
19841998

@@ -1998,9 +2012,9 @@ async function main(): Promise<void> {
19982012

19992013
// Log query safe response setting
20002014
if (useQuerySafeResponse) {
2001-
console.log(`✅ Using ApiResponseSafe for GET operations (readonly fields only required)`)
2015+
console.log(`✅ SafeResponse enabled for GET operations`)
20022016
} else {
2003-
console.log(`⚠️ Using ApiResponse for all operations (all fields required)`)
2017+
console.log(`ℹ️ SafeResponse not enabled`)
20042018
}
20052019

20062020
// Fetch and parse OpenAPI spec once

tests/fixtures/api-types.ts

Lines changed: 0 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -51,8 +51,6 @@ export namespace Types {
5151
export namespace getConfigJson {
5252
/** Full response type - all fields required. */
5353
export type Response = _ApiResponse<OpenApiOperations, 'getConfigJson'>
54-
/** Response type - only `readonly` fields required. Recommended for GET operations. */
55-
export type SafeResponse = _ApiResponseSafe<OpenApiOperations, 'getConfigJson'>
5654
/** Path parameters. */
5755
export type PathParams = _ApiPathParams<OpenApiOperations, 'getConfigJson'>
5856
/** Query parameters. */
@@ -63,8 +61,6 @@ export namespace Types {
6361
export namespace getDataV1Json {
6462
/** Full response type - all fields required. */
6563
export type Response = _ApiResponse<OpenApiOperations, 'getDataV1Json'>
66-
/** Response type - only `readonly` fields required. Recommended for GET operations. */
67-
export type SafeResponse = _ApiResponseSafe<OpenApiOperations, 'getDataV1Json'>
6864
/** Path parameters. */
6965
export type PathParams = _ApiPathParams<OpenApiOperations, 'getDataV1Json'>
7066
/** Query parameters. */
@@ -75,8 +71,6 @@ export namespace Types {
7571
export namespace getOwners {
7672
/** Full response type - all fields required. */
7773
export type Response = _ApiResponse<OpenApiOperations, 'getOwners'>
78-
/** Response type - only `readonly` fields required. Recommended for GET operations. */
79-
export type SafeResponse = _ApiResponseSafe<OpenApiOperations, 'getOwners'>
8074
/** Path parameters. */
8175
export type PathParams = _ApiPathParams<OpenApiOperations, 'getOwners'>
8276
/** Query parameters. */
@@ -87,8 +81,6 @@ export namespace Types {
8781
export namespace getPet {
8882
/** Full response type - all fields required. */
8983
export type Response = _ApiResponse<OpenApiOperations, 'getPet'>
90-
/** Response type - only `readonly` fields required. Recommended for GET operations. */
91-
export type SafeResponse = _ApiResponseSafe<OpenApiOperations, 'getPet'>
9284
/** Path parameters. */
9385
export type PathParams = _ApiPathParams<OpenApiOperations, 'getPet'>
9486
/** Query parameters. */
@@ -99,8 +91,6 @@ export namespace Types {
9991
export namespace getPetPetId {
10092
/** Full response type - all fields required. */
10193
export type Response = _ApiResponse<OpenApiOperations, 'getPetPetId'>
102-
/** Response type - only `readonly` fields required. Recommended for GET operations. */
103-
export type SafeResponse = _ApiResponseSafe<OpenApiOperations, 'getPetPetId'>
10494
/** Path parameters. */
10595
export type PathParams = _ApiPathParams<OpenApiOperations, 'getPetPetId'>
10696
/** Query parameters. */
@@ -111,8 +101,6 @@ export namespace Types {
111101
export namespace listPets {
112102
/** Full response type - all fields required. */
113103
export type Response = _ApiResponse<OpenApiOperations, 'listPets'>
114-
/** Response type - only `readonly` fields required. Recommended for GET operations. */
115-
export type SafeResponse = _ApiResponseSafe<OpenApiOperations, 'listPets'>
116104
/** Path parameters. */
117105
export type PathParams = _ApiPathParams<OpenApiOperations, 'listPets'>
118106
/** Query parameters. */
@@ -126,8 +114,6 @@ export namespace Types {
126114
export namespace listUserPets {
127115
/** Full response type - all fields required. */
128116
export type Response = _ApiResponse<OpenApiOperations, 'listUserPets'>
129-
/** Response type - only `readonly` fields required. Recommended for GET operations. */
130-
export type SafeResponse = _ApiResponseSafe<OpenApiOperations, 'listUserPets'>
131117
/** Path parameters. */
132118
export type PathParams = _ApiPathParams<OpenApiOperations, 'listUserPets'>
133119
/** Query parameters. */

0 commit comments

Comments
 (0)