diff --git a/.changeset/violet-beans-push.md b/.changeset/violet-beans-push.md new file mode 100644 index 0000000000..a61bdbee01 --- /dev/null +++ b/.changeset/violet-beans-push.md @@ -0,0 +1,5 @@ +--- +"@hey-api/openapi-ts": patch +--- + +fix: escape backticks in strings starting with backtick diff --git a/packages/openapi-ts/src/compiler/utils.ts b/packages/openapi-ts/src/compiler/utils.ts index 171018aba5..3535377917 100644 --- a/packages/openapi-ts/src/compiler/utils.ts +++ b/packages/openapi-ts/src/compiler/utils.ts @@ -65,11 +65,11 @@ export const ots = { if (unescape) { value = unescapeName(value); } - if ( - (value.includes('\n') || (value.includes("'") && value.includes('"'))) && - !value.startsWith('`') && - !value.endsWith('`') - ) { + const hasBothQuotes = value.includes("'") && value.includes('"'); + const hasNewlines = value.includes('\n'); + const hasUnescapedBackticks = value.startsWith('`'); + const isBacktickEscaped = value.startsWith('\\`') && value.endsWith('\\`'); + if ((hasNewlines || hasBothQuotes || hasUnescapedBackticks) && !isBacktickEscaped) { value = `\`${value.replace(/`/g, '\\`')}\``; } const text = encodeURIComponent(value); diff --git a/packages/openapi-ts/test/__snapshots__/test/generated/v3/models.ts.snap b/packages/openapi-ts/test/__snapshots__/test/generated/v3/models.ts.snap index 2db63d8ff9..f283546203 100644 --- a/packages/openapi-ts/test/__snapshots__/test/generated/v3/models.ts.snap +++ b/packages/openapi-ts/test/__snapshots__/test/generated/v3/models.ts.snap @@ -273,6 +273,11 @@ export type ModelWithString = { prop?: string; }; +/** + * `Comment` or `VoiceComment`. The JSON object for adding voice comments to tickets is different. See [Adding voice comments to tickets](/documentation/ticketing/managing-tickets/adding-voice-comments-to-tickets) + */ +export type ModelFromZendesk = string; + /** * This is a model with one string property */ @@ -835,7 +840,7 @@ export type DefaultData = { export type SimpleData = { responses: { - ApiVversionOdataControllerCount: ModelWithString; + ApiVversionOdataControllerCount: ModelFromZendesk; GetCallWithoutParametersAndResponse: void; PutCallWithoutParametersAndResponse: void; PostCallWithoutParametersAndResponse: void; diff --git a/packages/openapi-ts/test/__snapshots__/test/generated/v3/schemas.ts.snap b/packages/openapi-ts/test/__snapshots__/test/generated/v3/schemas.ts.snap index 00cc756994..ef92fa7f45 100644 --- a/packages/openapi-ts/test/__snapshots__/test/generated/v3/schemas.ts.snap +++ b/packages/openapi-ts/test/__snapshots__/test/generated/v3/schemas.ts.snap @@ -323,6 +323,11 @@ export const $ModelWithString = { }, } as const; +export const $ModelFromZendesk = { + description: `\`Comment\` or \`VoiceComment\`. The JSON object for adding voice comments to tickets is different. See [Adding voice comments to tickets](/documentation/ticketing/managing-tickets/adding-voice-comments-to-tickets)`, + type: 'string', +} as const; + export const $ModelWithNullableString = { description: 'This is a model with one string property', type: 'object', diff --git a/packages/openapi-ts/test/__snapshots__/test/generated/v3/services.ts.snap b/packages/openapi-ts/test/__snapshots__/test/generated/v3/services.ts.snap index e13c86249a..f3f9411650 100644 --- a/packages/openapi-ts/test/__snapshots__/test/generated/v3/services.ts.snap +++ b/packages/openapi-ts/test/__snapshots__/test/generated/v3/services.ts.snap @@ -57,7 +57,7 @@ export class DefaultService { export class SimpleService { /** - * @returns ModelWithString Success + * @returns ModelFromZendesk Success * @throws ApiError */ public static apiVVersionOdataControllerCount(): CancelablePromise< diff --git a/packages/openapi-ts/test/__snapshots__/test/generated/v3_angular/models.ts.snap b/packages/openapi-ts/test/__snapshots__/test/generated/v3_angular/models.ts.snap index df440f5502..7cae3bcbeb 100644 --- a/packages/openapi-ts/test/__snapshots__/test/generated/v3_angular/models.ts.snap +++ b/packages/openapi-ts/test/__snapshots__/test/generated/v3_angular/models.ts.snap @@ -223,6 +223,11 @@ export type ModelWithString = { prop?: string; }; +/** + * `Comment` or `VoiceComment`. The JSON object for adding voice comments to tickets is different. See [Adding voice comments to tickets](/documentation/ticketing/managing-tickets/adding-voice-comments-to-tickets) + */ +export type ModelFromZendesk = string; + /** * This is a model with one string property */ @@ -732,7 +737,7 @@ export type DefaultData = { export type SimpleData = { responses: { - ApiVversionOdataControllerCount: ModelWithString; + ApiVversionOdataControllerCount: ModelFromZendesk; GetCallWithoutParametersAndResponse: void; PutCallWithoutParametersAndResponse: void; PostCallWithoutParametersAndResponse: void; diff --git a/packages/openapi-ts/test/__snapshots__/test/generated/v3_angular/schemas.ts.snap b/packages/openapi-ts/test/__snapshots__/test/generated/v3_angular/schemas.ts.snap index 00cc756994..ef92fa7f45 100644 --- a/packages/openapi-ts/test/__snapshots__/test/generated/v3_angular/schemas.ts.snap +++ b/packages/openapi-ts/test/__snapshots__/test/generated/v3_angular/schemas.ts.snap @@ -323,6 +323,11 @@ export const $ModelWithString = { }, } as const; +export const $ModelFromZendesk = { + description: `\`Comment\` or \`VoiceComment\`. The JSON object for adding voice comments to tickets is different. See [Adding voice comments to tickets](/documentation/ticketing/managing-tickets/adding-voice-comments-to-tickets)`, + type: 'string', +} as const; + export const $ModelWithNullableString = { description: 'This is a model with one string property', type: 'object', diff --git a/packages/openapi-ts/test/__snapshots__/test/generated/v3_angular/services.ts.snap b/packages/openapi-ts/test/__snapshots__/test/generated/v3_angular/services.ts.snap index f6e316c822..850bfd9fc2 100644 --- a/packages/openapi-ts/test/__snapshots__/test/generated/v3_angular/services.ts.snap +++ b/packages/openapi-ts/test/__snapshots__/test/generated/v3_angular/services.ts.snap @@ -69,7 +69,7 @@ export class SimpleService { constructor(public readonly http: HttpClient) {} /** - * @returns ModelWithString Success + * @returns ModelFromZendesk Success * @throws ApiError */ public apiVVersionOdataControllerCount(): Observable { diff --git a/packages/openapi-ts/test/__snapshots__/test/generated/v3_client/models.ts.snap b/packages/openapi-ts/test/__snapshots__/test/generated/v3_client/models.ts.snap index 3ff3c2f71f..eb7efad053 100644 --- a/packages/openapi-ts/test/__snapshots__/test/generated/v3_client/models.ts.snap +++ b/packages/openapi-ts/test/__snapshots__/test/generated/v3_client/models.ts.snap @@ -273,6 +273,11 @@ export type ModelWithString = { prop?: string; }; +/** + * `Comment` or `VoiceComment`. The JSON object for adding voice comments to tickets is different. See [Adding voice comments to tickets](/documentation/ticketing/managing-tickets/adding-voice-comments-to-tickets) + */ +export type ModelFromZendesk = string; + /** * This is a model with one string property */ @@ -835,7 +840,7 @@ export type DefaultData = { export type SimpleData = { responses: { - ApiVversionOdataControllerCount: ModelWithString; + ApiVversionOdataControllerCount: ModelFromZendesk; GetCallWithoutParametersAndResponse: void; PutCallWithoutParametersAndResponse: void; PostCallWithoutParametersAndResponse: void; diff --git a/packages/openapi-ts/test/__snapshots__/test/generated/v3_client/services.ts.snap b/packages/openapi-ts/test/__snapshots__/test/generated/v3_client/services.ts.snap index 467faba3b6..80a8d12106 100644 --- a/packages/openapi-ts/test/__snapshots__/test/generated/v3_client/services.ts.snap +++ b/packages/openapi-ts/test/__snapshots__/test/generated/v3_client/services.ts.snap @@ -60,7 +60,7 @@ export class SimpleService { constructor(public readonly httpRequest: BaseHttpRequest) {} /** - * @returns ModelWithString Success + * @returns ModelFromZendesk Success * @throws ApiError */ public apiVVersionOdataControllerCount(): CancelablePromise< diff --git a/packages/openapi-ts/test/__snapshots__/test/generated/v3_date/models.ts.snap b/packages/openapi-ts/test/__snapshots__/test/generated/v3_date/models.ts.snap index 036b4c2e47..bc6d5e1b6b 100644 --- a/packages/openapi-ts/test/__snapshots__/test/generated/v3_date/models.ts.snap +++ b/packages/openapi-ts/test/__snapshots__/test/generated/v3_date/models.ts.snap @@ -28,7 +28,7 @@ export type DefaultData = { export type SimpleData = { responses: { - ApiVversionOdataControllerCount: ModelWithString; + ApiVversionOdataControllerCount: ModelFromZendesk; GetCallWithoutParametersAndResponse: void; PutCallWithoutParametersAndResponse: void; PostCallWithoutParametersAndResponse: void; diff --git a/packages/openapi-ts/test/__snapshots__/test/generated/v3_date/schemas.ts.snap b/packages/openapi-ts/test/__snapshots__/test/generated/v3_date/schemas.ts.snap index 00cc756994..ef92fa7f45 100644 --- a/packages/openapi-ts/test/__snapshots__/test/generated/v3_date/schemas.ts.snap +++ b/packages/openapi-ts/test/__snapshots__/test/generated/v3_date/schemas.ts.snap @@ -323,6 +323,11 @@ export const $ModelWithString = { }, } as const; +export const $ModelFromZendesk = { + description: `\`Comment\` or \`VoiceComment\`. The JSON object for adding voice comments to tickets is different. See [Adding voice comments to tickets](/documentation/ticketing/managing-tickets/adding-voice-comments-to-tickets)`, + type: 'string', +} as const; + export const $ModelWithNullableString = { description: 'This is a model with one string property', type: 'object', diff --git a/packages/openapi-ts/test/__snapshots__/test/generated/v3_enums_typescript/models.ts.snap b/packages/openapi-ts/test/__snapshots__/test/generated/v3_enums_typescript/models.ts.snap index c8058f86e1..a2d90a8e40 100644 --- a/packages/openapi-ts/test/__snapshots__/test/generated/v3_enums_typescript/models.ts.snap +++ b/packages/openapi-ts/test/__snapshots__/test/generated/v3_enums_typescript/models.ts.snap @@ -259,6 +259,11 @@ export type ModelWithString = { prop?: string; }; +/** + * `Comment` or `VoiceComment`. The JSON object for adding voice comments to tickets is different. See [Adding voice comments to tickets](/documentation/ticketing/managing-tickets/adding-voice-comments-to-tickets) + */ +export type ModelFromZendesk = string; + /** * This is a model with one string property */ @@ -777,7 +782,7 @@ export type DefaultData = { export type SimpleData = { responses: { - ApiVversionOdataControllerCount: ModelWithString; + ApiVversionOdataControllerCount: ModelFromZendesk; GetCallWithoutParametersAndResponse: void; PutCallWithoutParametersAndResponse: void; PostCallWithoutParametersAndResponse: void; diff --git a/packages/openapi-ts/test/__snapshots__/test/generated/v3_enums_typescript/schemas.ts.snap b/packages/openapi-ts/test/__snapshots__/test/generated/v3_enums_typescript/schemas.ts.snap index 00cc756994..ef92fa7f45 100644 --- a/packages/openapi-ts/test/__snapshots__/test/generated/v3_enums_typescript/schemas.ts.snap +++ b/packages/openapi-ts/test/__snapshots__/test/generated/v3_enums_typescript/schemas.ts.snap @@ -323,6 +323,11 @@ export const $ModelWithString = { }, } as const; +export const $ModelFromZendesk = { + description: `\`Comment\` or \`VoiceComment\`. The JSON object for adding voice comments to tickets is different. See [Adding voice comments to tickets](/documentation/ticketing/managing-tickets/adding-voice-comments-to-tickets)`, + type: 'string', +} as const; + export const $ModelWithNullableString = { description: 'This is a model with one string property', type: 'object', diff --git a/packages/openapi-ts/test/__snapshots__/test/generated/v3_enums_typescript/services.ts.snap b/packages/openapi-ts/test/__snapshots__/test/generated/v3_enums_typescript/services.ts.snap index e13c86249a..f3f9411650 100644 --- a/packages/openapi-ts/test/__snapshots__/test/generated/v3_enums_typescript/services.ts.snap +++ b/packages/openapi-ts/test/__snapshots__/test/generated/v3_enums_typescript/services.ts.snap @@ -57,7 +57,7 @@ export class DefaultService { export class SimpleService { /** - * @returns ModelWithString Success + * @returns ModelFromZendesk Success * @throws ApiError */ public static apiVVersionOdataControllerCount(): CancelablePromise< diff --git a/packages/openapi-ts/test/__snapshots__/test/generated/v3_experimental/models.ts.snap b/packages/openapi-ts/test/__snapshots__/test/generated/v3_experimental/models.ts.snap index cc389e200c..5533f844a1 100644 --- a/packages/openapi-ts/test/__snapshots__/test/generated/v3_experimental/models.ts.snap +++ b/packages/openapi-ts/test/__snapshots__/test/generated/v3_experimental/models.ts.snap @@ -223,6 +223,11 @@ export type ModelWithString = { prop?: string; }; +/** + * `Comment` or `VoiceComment`. The JSON object for adding voice comments to tickets is different. See [Adding voice comments to tickets](/documentation/ticketing/managing-tickets/adding-voice-comments-to-tickets) + */ +export type ModelFromZendesk = string; + /** * This is a model with one string property */ @@ -734,7 +739,7 @@ export type DefaultData = { export type SimpleData = { responses: { - ApiVversionOdataControllerCount: ModelWithString; + ApiVversionOdataControllerCount: ModelFromZendesk; GetCallWithoutParametersAndResponse: void; PutCallWithoutParametersAndResponse: void; PostCallWithoutParametersAndResponse: void; diff --git a/packages/openapi-ts/test/__snapshots__/test/generated/v3_experimental/schemas.ts.snap b/packages/openapi-ts/test/__snapshots__/test/generated/v3_experimental/schemas.ts.snap index 00cc756994..ef92fa7f45 100644 --- a/packages/openapi-ts/test/__snapshots__/test/generated/v3_experimental/schemas.ts.snap +++ b/packages/openapi-ts/test/__snapshots__/test/generated/v3_experimental/schemas.ts.snap @@ -323,6 +323,11 @@ export const $ModelWithString = { }, } as const; +export const $ModelFromZendesk = { + description: `\`Comment\` or \`VoiceComment\`. The JSON object for adding voice comments to tickets is different. See [Adding voice comments to tickets](/documentation/ticketing/managing-tickets/adding-voice-comments-to-tickets)`, + type: 'string', +} as const; + export const $ModelWithNullableString = { description: 'This is a model with one string property', type: 'object', diff --git a/packages/openapi-ts/test/__snapshots__/test/generated/v3_experimental/services.ts.snap b/packages/openapi-ts/test/__snapshots__/test/generated/v3_experimental/services.ts.snap index 00d2e96733..1cf2f223ae 100644 --- a/packages/openapi-ts/test/__snapshots__/test/generated/v3_experimental/services.ts.snap +++ b/packages/openapi-ts/test/__snapshots__/test/generated/v3_experimental/services.ts.snap @@ -57,7 +57,7 @@ export class DefaultService { export class SimpleService { /** - * @returns ModelWithString Success + * @returns ModelFromZendesk Success * @throws ApiError */ public static apiVVersionOdataControllerCount(): CancelablePromise< diff --git a/packages/openapi-ts/test/__snapshots__/test/generated/v3_models/models.ts.snap b/packages/openapi-ts/test/__snapshots__/test/generated/v3_models/models.ts.snap index df440f5502..7cae3bcbeb 100644 --- a/packages/openapi-ts/test/__snapshots__/test/generated/v3_models/models.ts.snap +++ b/packages/openapi-ts/test/__snapshots__/test/generated/v3_models/models.ts.snap @@ -223,6 +223,11 @@ export type ModelWithString = { prop?: string; }; +/** + * `Comment` or `VoiceComment`. The JSON object for adding voice comments to tickets is different. See [Adding voice comments to tickets](/documentation/ticketing/managing-tickets/adding-voice-comments-to-tickets) + */ +export type ModelFromZendesk = string; + /** * This is a model with one string property */ @@ -732,7 +737,7 @@ export type DefaultData = { export type SimpleData = { responses: { - ApiVversionOdataControllerCount: ModelWithString; + ApiVversionOdataControllerCount: ModelFromZendesk; GetCallWithoutParametersAndResponse: void; PutCallWithoutParametersAndResponse: void; PostCallWithoutParametersAndResponse: void; diff --git a/packages/openapi-ts/test/spec/v3.json b/packages/openapi-ts/test/spec/v3.json index 3aa165e068..750bf50356 100644 --- a/packages/openapi-ts/test/spec/v3.json +++ b/packages/openapi-ts/test/spec/v3.json @@ -60,7 +60,7 @@ "content": { "application/json; type=collection": { "schema": { - "$ref": "#/components/schemas/ModelWithString" + "$ref": "#/components/schemas/ModelFromZendesk" } } } @@ -2048,6 +2048,10 @@ } } }, + "ModelFromZendesk": { + "description": "`Comment` or `VoiceComment`. The JSON object for adding voice comments to tickets is different. See [Adding voice comments to tickets](/documentation/ticketing/managing-tickets/adding-voice-comments-to-tickets)", + "type": "string" + }, "ModelWithNullableString": { "description": "This is a model with one string property", "type": "object",