这是indexloc提供的服务,不要输入任何密码
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions .changeset/healthy-plants-own.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
---
"@hey-api/openapi-ts": minor
"openapi-ts-docs": minor
---

feat: rename generated files
57 changes: 44 additions & 13 deletions docs/openapi-ts/migrating.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,20 +13,20 @@ These changes haven't been released yet. However, you can migrate your code toda

### Deprecated exports from `index.ts`

Currently, `index.ts` file exports all generated artifacts.
Currently, `index.ts` file exports all generated artifacts. We will be slowly moving away from this practice.

```ts
```js
export { ApiError } from './core/ApiError';
export { CancelablePromise, CancelError } from './core/CancelablePromise';
export { OpenAPI, type OpenAPIConfig } from './core/OpenAPI';
export * from './models';
export * from './schemas';
export * from './services';
export * from './models'; // [!code --]
export * from './schemas'; // [!code --]
export * from './services'; // [!code --]
```

We will be slowly moving away from this practice. Any non-core related imports should be imported as
Any non-core related imports should be imported as

```ts
```js
import type { Model } from 'client/models';
import { $Schema } from 'client/schemas';
import { DefaultService } from 'client/services';
Expand Down Expand Up @@ -54,19 +54,50 @@ This config option is deprecated and will be removed.

### Single `enums.gen.ts` file

Enums are now exported from a single file. If you used imports from `model.ts`, you can change it to `enums.gen.ts`.
Enums are now exported from a separate file. If you use imports from `models.ts`, you can change them to `enums.gen.ts`.

```js
import { Enum } from 'client/models' // [!code --]
import { Enum } from 'client/enums.gen.ts' // [!code ++]
import { Enum } from 'client/enums.gen' // [!code ++]
```

Enums are no longer exported from `index.ts`. If you used imports from index file, you will need to move enums into their own import statement.
### Renamed `models.ts` file

`models.ts` is now called `models.gen.ts`. If you use imports from `models.ts`, you should be able to easily find and replace all instances.

```js
import type { Model } from 'client/models' // [!code --]
import type { Model } from 'client/models.gen' // [!code ++]
```

### Renamed `schemas.ts` file

`schemas.ts` is now called `schemas.gen.ts`. If you use imports from `schemas.ts`, you should be able to easily find and replace all instances.

```js
import { $Schema } from 'client/schemas' // [!code --]
import { $Schema } from 'client/schemas.gen' // [!code ++]
```

### Renamed `services.ts` file

`services.ts` is now called `services.gen.ts`. If you use imports from `services.ts`, you should be able to easily find and replace all instances.

```js
import { DefaultService } from 'client/services' // [!code --]
import { DefaultService } from 'client/services.gen' // [!code ++]
```

### Deprecated exports from `index.ts`

Until this release, `index.ts` file exported all generated artifacts. Starting from this release, enums are no longer exported from `index.ts`. Models, schemas, and services will continue to be exported from `index.ts` to avoid a huge migration lift, but we recommend migrating to import groups per artifact type.

```js
import { Enum, DefaultService } from 'client' // [!code --]
import { Enum } from 'client/enums.gen.ts' // [!code ++]
import { DefaultService } from 'client/services' // [!code ++]
import { Enum, type Model, $Schema, DefaultService } from 'client' // [!code --]
import { Enum } from 'client/enums.gen' // [!code ++]
import type { Model } from 'client/models.gen' // [!code ++]
import { $Schema } from 'client/schemas.gen' // [!code ++]
import { DefaultService } from 'client/services.gen' // [!code ++]
```

## v0.38.0
Expand Down
14 changes: 14 additions & 0 deletions packages/openapi-ts/src/compiler/index.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import { PathLike, rmSync, writeFileSync } from 'node:fs';
import path from 'node:path';

import ts from 'typescript';

Expand All @@ -11,6 +12,19 @@ export type { Property } from './typedef';
export type { Comments } from './utils';
export type { Node, TypeNode } from 'typescript';

// eslint-disable-next-line @typescript-eslint/no-unused-vars
export const generatedFileName = (fileName: string, insertGen = true) => {
const match = fileName.match(/\.[0-9a-z]+$/i);
const extension = match ? match[0].slice(1) : '';
const filePath = fileName.slice(0, fileName.length - (extension ? extension.length + 1 : 0));
return [filePath, insertGen && 'gen', extension].filter(Boolean).join('.');
};

export const filePath = (folderPath: string, fileName: string, insertGen = true) => {
const name = generatedFileName(fileName, insertGen);
return path.resolve(folderPath, name);
};

export class TypeScriptFile {
private _headers: Array<string> = [];
private _imports: Array<ts.Node> = [];
Expand Down
2 changes: 1 addition & 1 deletion packages/openapi-ts/src/templates/client.hbs
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ import { {{{httpRequest}}} } from './core/{{{httpRequest}}}';

{{#if services}}
{{#each services}}
import { {{{name}}}{{{@root.$config.postfixServices}}} } from './services';
import { {{{name}}}{{{@root.$config.postfixServices}}} } from './services.gen';
{{/each}}
{{/if}}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,6 @@ describe('writeTypesAndEnums', () => {

await writeTypesAndEnums(openApi, '/', client);

expect(writeFileSync).toHaveBeenCalledWith(path.resolve('/', '/models.ts'), expect.anything());
expect(writeFileSync).toHaveBeenCalledWith(path.resolve('/', '/models.gen.ts'), expect.anything());
});
});
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,6 @@ describe('writeSchemas', () => {

await writeSchemas(openApi, '/');

expect(writeFileSync).toHaveBeenCalledWith(path.resolve('/', '/schemas.ts'), expect.anything());
expect(writeFileSync).toHaveBeenCalledWith(path.resolve('/', '/schemas.gen.ts'), expect.anything());
});
});
12 changes: 5 additions & 7 deletions packages/openapi-ts/src/utils/write/index.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,4 @@
import path from 'node:path';

import { compiler, TypeScriptFile } from '../../compiler';
import { compiler, filePath, generatedFileName, TypeScriptFile } from '../../compiler';
import type { Client } from '../../types/client';
import { getConfig } from '../config';

Expand All @@ -13,7 +11,7 @@ import { getConfig } from '../config';
export const writeClientIndex = async (client: Client, outputPath: string): Promise<void> => {
const config = getConfig();

const fileIndex = new TypeScriptFile({ path: path.resolve(outputPath, 'index.ts') });
const fileIndex = new TypeScriptFile({ path: filePath(outputPath, 'index.ts', false) });

if (config.name) {
fileIndex.add(compiler.export.named([config.name], `./${config.name}`));
Expand All @@ -37,15 +35,15 @@ export const writeClientIndex = async (client: Client, outputPath: string): Prom

if (client.models.length) {
if (config.exportModels) {
fileIndex.add(compiler.export.all('./models'));
fileIndex.add(compiler.export.all(generatedFileName('./models')));
}
if (config.schemas) {
fileIndex.add(compiler.export.all('./schemas'));
fileIndex.add(compiler.export.all(generatedFileName('./schemas')));
}
}

if (client.services.length && config.exportServices) {
fileIndex.add(compiler.export.all('./services'));
fileIndex.add(compiler.export.all(generatedFileName('./services')));
}

fileIndex.write();
Expand Down
8 changes: 3 additions & 5 deletions packages/openapi-ts/src/utils/write/models.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,4 @@
import path from 'node:path';

import { type Comments, compiler, type Node, TypeScriptFile } from '../../compiler';
import { type Comments, compiler, filePath, type Node, TypeScriptFile } from '../../compiler';
import { addLeadingComment } from '../../compiler/utils';
import type { Model, OpenApi, OperationParameter, Service } from '../../openApi';
import { ensureValidTypeScriptJavaScriptIdentifier } from '../../openApi/common/parser/sanitize';
Expand Down Expand Up @@ -225,8 +223,8 @@ const processServiceTypes = (services: Service[], onNode: OnNode) => {
export const writeTypesAndEnums = async (openApi: OpenApi, outputPath: string, client: Client): Promise<void> => {
const config = getConfig();

const fileEnums = new TypeScriptFile({ path: path.resolve(outputPath, 'enums.gen.ts') });
const fileModels = new TypeScriptFile({ path: path.resolve(outputPath, 'models.ts') });
const fileEnums = new TypeScriptFile({ path: filePath(outputPath, 'enums.ts') });
const fileModels = new TypeScriptFile({ path: filePath(outputPath, 'models.ts') });

for (const model of client.models) {
processModel(client, model, (node, type) => {
Expand Down
6 changes: 2 additions & 4 deletions packages/openapi-ts/src/utils/write/schemas.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,4 @@
import path from 'node:path';

import { compiler, TypeScriptFile } from '../../compiler';
import { compiler, filePath, TypeScriptFile } from '../../compiler';
import type { OpenApi } from '../../openApi';
import { ensureValidTypeScriptJavaScriptIdentifier } from '../../openApi/common/parser/sanitize';
import { getConfig } from '../config';
Expand All @@ -13,7 +11,7 @@ import { getConfig } from '../config';
export const writeSchemas = async (openApi: OpenApi, outputPath: string): Promise<void> => {
const config = getConfig();

const fileSchemas = new TypeScriptFile({ path: path.resolve(outputPath, 'schemas.ts') });
const fileSchemas = new TypeScriptFile({ path: filePath(outputPath, 'schemas.ts') });

const addSchema = (name: string, obj: any) => {
const validName = `$${ensureValidTypeScriptJavaScriptIdentifier(name)}`;
Expand Down
8 changes: 3 additions & 5 deletions packages/openapi-ts/src/utils/write/services.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,4 @@
import path from 'node:path';

import { TypeScriptFile } from '../../compiler';
import { filePath, generatedFileName, TypeScriptFile } from '../../compiler';
import type { OpenApi } from '../../openApi';
import type { Client } from '../../types/client';
import { getConfig } from '../config';
Expand All @@ -22,7 +20,7 @@ export const writeServices = async (
): Promise<void> => {
const config = getConfig();

const fileServices = new TypeScriptFile({ path: path.resolve(outputPath, 'services.ts') });
const fileServices = new TypeScriptFile({ path: filePath(outputPath, 'services.ts') });

let imports: string[] = [];
let results: string[] = [];
Expand Down Expand Up @@ -62,7 +60,7 @@ export const writeServices = async (

// Import all models required by the services.
const models = imports.filter(unique).map(imp => ({ isTypeOnly: true, name: imp }));
fileServices.addNamedImport(models, './models');
fileServices.addNamedImport(models, generatedFileName('./models'));

fileServices.add(...results);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,6 @@
export { ApiError } from './core/ApiError';
export { CancelablePromise, CancelError } from './core/CancelablePromise';
export { OpenAPI, type OpenAPIConfig } from './core/OpenAPI';
export * from './models';
export * from './schemas';
export * from './services';
export * from './models.gen';
export * from './schemas.gen';
export * from './services.gen';
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
import type { CancelablePromise } from './core/CancelablePromise';
import { OpenAPI } from './core/OpenAPI';
import { request as __request } from './core/request';
import type { $OpenApiTs } from './models';
import type { $OpenApiTs } from './models.gen';

export class DefaultService {
/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,6 @@
export { ApiError } from './core/ApiError';
export { CancelablePromise, CancelError } from './core/CancelablePromise';
export { OpenAPI, type OpenAPIConfig } from './core/OpenAPI';
export * from './models';
export * from './schemas';
export * from './services';
export * from './models.gen';
export * from './schemas.gen';
export * from './services.gen';
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
import type { CancelablePromise } from './core/CancelablePromise';
import { OpenAPI } from './core/OpenAPI';
import { request as __request } from './core/request';
import type { $OpenApiTs } from './models';
import type { $OpenApiTs } from './models.gen';

export class DefaultService {
/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,6 @@

export { ApiError } from './core/ApiError';
export { OpenAPI, type OpenAPIConfig } from './core/OpenAPI';
export * from './models';
export * from './schemas';
export * from './services';
export * from './models.gen';
export * from './schemas.gen';
export * from './services.gen';
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import { HttpClient } from '@angular/common/http';
import type { Observable } from 'rxjs';
import { OpenAPI } from './core/OpenAPI';
import { request as __request } from './core/request';
import type { $OpenApiTs } from './models';
import type { $OpenApiTs } from './models.gen';

@Injectable({
providedIn: 'root',
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,29 +3,29 @@ import type { OpenAPIConfig } from './core/OpenAPI';
import { Interceptors } from './core/OpenAPI';
import { FetchHttpRequest } from './core/FetchHttpRequest';

import { CollectionFormatService } from './services';
import { ComplexService } from './services';
import { DefaultService } from './services';
import { DefaultsService } from './services';
import { DeprecatedService } from './services';
import { DescriptionsService } from './services';
import { DuplicateService } from './services';
import { ErrorService } from './services';
import { FileResponseService } from './services';
import { FormDataService } from './services';
import { HeaderService } from './services';
import { MultipartService } from './services';
import { MultipleTags1Service } from './services';
import { MultipleTags2Service } from './services';
import { MultipleTags3Service } from './services';
import { NoContentService } from './services';
import { NonAsciiÆøåÆøÅöôêÊService } from './services';
import { ParametersService } from './services';
import { RequestBodyService } from './services';
import { ResponseService } from './services';
import { SimpleService } from './services';
import { TypesService } from './services';
import { UploadService } from './services';
import { CollectionFormatService } from './services.gen';
import { ComplexService } from './services.gen';
import { DefaultService } from './services.gen';
import { DefaultsService } from './services.gen';
import { DeprecatedService } from './services.gen';
import { DescriptionsService } from './services.gen';
import { DuplicateService } from './services.gen';
import { ErrorService } from './services.gen';
import { FileResponseService } from './services.gen';
import { FormDataService } from './services.gen';
import { HeaderService } from './services.gen';
import { MultipartService } from './services.gen';
import { MultipleTags1Service } from './services.gen';
import { MultipleTags2Service } from './services.gen';
import { MultipleTags3Service } from './services.gen';
import { NoContentService } from './services.gen';
import { NonAsciiÆøåÆøÅöôêÊService } from './services.gen';
import { ParametersService } from './services.gen';
import { RequestBodyService } from './services.gen';
import { ResponseService } from './services.gen';
import { SimpleService } from './services.gen';
import { TypesService } from './services.gen';
import { UploadService } from './services.gen';

type HttpRequestConstructor = new (config: OpenAPIConfig) => BaseHttpRequest;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,5 +5,5 @@ export { ApiError } from './core/ApiError';
export { BaseHttpRequest } from './core/BaseHttpRequest';
export { CancelablePromise, CancelError } from './core/CancelablePromise';
export { OpenAPI, type OpenAPIConfig } from './core/OpenAPI';
export * from './models';
export * from './services';
export * from './models.gen';
export * from './services.gen';
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

import type { CancelablePromise } from './core/CancelablePromise';
import type { BaseHttpRequest } from './core/BaseHttpRequest';
import type { $OpenApiTs } from './models';
import type { $OpenApiTs } from './models.gen';

export class DefaultService {
constructor(public readonly httpRequest: BaseHttpRequest) {}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
// This file is auto-generated by @hey-api/openapi-ts

export * from './models';
export * from './schemas';
export * from './models.gen';
export * from './schemas.gen';
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,6 @@
export { ApiError } from './core/ApiError';
export { CancelablePromise, CancelError } from './core/CancelablePromise';
export { OpenAPI, type OpenAPIConfig } from './core/OpenAPI';
export * from './models';
export * from './schemas';
export * from './services';
export * from './models.gen';
export * from './schemas.gen';
export * from './services.gen';
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
import type { CancelablePromise } from './core/CancelablePromise';
import { OpenAPI } from './core/OpenAPI';
import { request as __request } from './core/request';
import type { $OpenApiTs } from './models';
import type { $OpenApiTs } from './models.gen';

export class DefaultService {
/**
Expand Down
Loading