Skip to content

Commit e186638

Browse files
authored
Merge pull request #55 from StefanBRas/adjustable-createApi-import-path
Adjustable create api import path
2 parents bce1f66 + f935565 commit e186638

File tree

6 files changed

+50
-25
lines changed

6 files changed

+50
-25
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ npx @rtk-incubator/rtk-query-codegen-openapi --file generated.api.ts --baseQuery
4545
- `--argSuffix <name>` - change the suffix of the arg type (default: `ApiArg` - ex: `AddPetApiArg`)
4646
- `--responseSuffix <name>` - change the suffix of the response type (default: `ApiResponse` - ex: `AddPetApiResponse`)
4747
- `--baseUrl <url>` - set the `baseUrl` when using `fetchBaseQuery` (will be ignored if you pass `--baseQuery`)
48+
- `--createApiImportPath <path>` - set the entry point to import `createApi` from. Currently only `react` is available. Defaults to `react` if `--hooks` is passed.
4849
- `--hooks` - include React Hooks in the output (ex: `export const { useGetModelQuery, useUpdateModelMutation } = api`)
4950
- `--file <filename>` - specify a filename to output to (ex: `./generated.api.ts`)
5051

src/bin/cli.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ program
2020
.option('--argSuffix <name>', 'pass arg suffix')
2121
.option('--responseSuffix <name>', 'pass response suffix')
2222
.option('--baseUrl <url>', 'pass baseUrl')
23+
.option('--createApiImportPath <path>', 'entry point for createApi import. options: [react]')
2324
.option('-h, --hooks', 'generate React Hooks')
2425
.option('-c, --config <path>', 'pass tsconfig path for resolve path alias')
2526
.option('-f, --file <filename>', 'output file name (ex: generated.api.ts)')
@@ -39,6 +40,7 @@ if (program.args.length === 0) {
3940
'argSuffix',
4041
'responseSuffix',
4142
'baseUrl',
43+
'createApiImportPath',
4244
'hooks',
4345
'file',
4446
'config',

src/codegen.ts

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import * as ts from 'typescript';
22
const { factory } = ts;
3+
import { GenerationOptions } from './types';
34

45
const defaultEndpointBuilder = factory.createIdentifier('build');
56

@@ -127,3 +128,39 @@ export function generateEndpointDefinition({
127128
)
128129
);
129130
}
131+
132+
export function generatePackageImports({
133+
createApiImportPath,
134+
hooks,
135+
isUsingFetchBaseQuery,
136+
}: {
137+
createApiImportPath?: GenerationOptions['createApiImportPath'];
138+
isUsingFetchBaseQuery: boolean;
139+
hooks?: boolean;
140+
}) {
141+
const DEFAULT_IMPORT_PATH = '@reduxjs/toolkit/query';
142+
143+
const entryPoint = hooks ? 'react' : createApiImportPath;
144+
145+
function getBasePackageImportsFromOptions() {
146+
return {
147+
...(entryPoint === 'base' ? { createApi: 'createApi' } : {}),
148+
...(isUsingFetchBaseQuery ? { fetchBaseQuery: 'fetchBaseQuery' } : {}),
149+
};
150+
}
151+
152+
const basePackageImports = getBasePackageImportsFromOptions();
153+
154+
const hasBasePackageImports = Object.keys(basePackageImports).length > 0;
155+
156+
const basePackageImportNode = hasBasePackageImports
157+
? [generateImportNode(DEFAULT_IMPORT_PATH, getBasePackageImportsFromOptions())]
158+
: [];
159+
160+
const subPackageImportNode =
161+
entryPoint !== 'base'
162+
? [generateImportNode(`${DEFAULT_IMPORT_PATH}/${entryPoint}`, { createApi: 'createApi' })]
163+
: [];
164+
165+
return [...subPackageImportNode, ...basePackageImportNode];
166+
}

src/generate.ts

Lines changed: 3 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,10 @@ import {
2121
generateCreateApiCall,
2222
generateEndpointDefinition,
2323
generateStringLiteralArray,
24+
generatePackageImports,
2425
ObjectPropertyDefinitions,
2526
} from './codegen';
2627
import { generateSmartImportNode } from './generators/smart-import-node';
27-
import { generateImportNode } from './generators/import-node';
2828

2929
const { factory } = ts;
3030

@@ -44,6 +44,7 @@ export async function generateApi(
4444
baseQuery = 'fetchBaseQuery',
4545
argSuffix = 'ApiArg',
4646
responseSuffix = 'ApiResponse',
47+
createApiImportPath = 'base',
4748
baseUrl,
4849
hooks,
4950
outputFile,
@@ -127,34 +128,11 @@ export async function generateApi(
127128

128129
const isUsingFetchBaseQuery = baseQuery === 'fetchBaseQuery';
129130

130-
function getBasePackageImportsFromOptions() {
131-
return hooks
132-
? {
133-
...(isUsingFetchBaseQuery ? { fetchBaseQuery: 'fetchBaseQuery' } : {}),
134-
}
135-
: {
136-
createApi: 'createApi',
137-
...(isUsingFetchBaseQuery ? { fetchBaseQuery: 'fetchBaseQuery' } : {}),
138-
};
139-
}
140-
141-
const hasBasePackageImports = Object.keys(getBasePackageImportsFromOptions()).length > 0;
142-
143131
const sourceCode = printer.printNode(
144132
ts.EmitHint.Unspecified,
145133
factory.createSourceFile(
146134
[
147-
// If hooks are specified, we need to import them from the react entry point
148-
...(hooks
149-
? [
150-
generateImportNode('@reduxjs/toolkit/query/react', {
151-
createApi: 'createApi',
152-
}),
153-
]
154-
: []),
155-
...(hasBasePackageImports
156-
? [generateImportNode('@reduxjs/toolkit/query', getBasePackageImportsFromOptions())]
157-
: []),
135+
...generatePackageImports({ hooks, isUsingFetchBaseQuery, createApiImportPath }),
158136
...(customBaseQueryNode ? [customBaseQueryNode] : []),
159137
generateCreateApiCall({
160138
exportName,

src/types.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ export type GenerationOptions = {
1717
argSuffix?: string;
1818
responseSuffix?: string;
1919
baseUrl?: string;
20+
createApiImportPath?: 'base' | 'react';
2021
hooks?: boolean;
2122
outputFile?: string;
2223
compilerOptions?: ts.CompilerOptions;

test/cli.test.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,12 @@ describe('CLI options testing', () => {
8888
expect(numberOfHooks).toEqual(expectedHooks.length);
8989
});
9090

91+
it('should contain the right imports when using custom import path', async () => {
92+
const result = await cli(['--createApiImportPath', 'react', `./test/fixtures/petstore.json`], '.');
93+
expect(result.stdout).toContain(`import { createApi } from \"@reduxjs/toolkit/query/react\";`);
94+
expect(result.stdout).not.toContain('useGetHealthcheckQuery'); // hooks not exported
95+
});
96+
9197
it('should contain the right imports when using hooks and a custom base query', async () => {
9298
const result = await cli(
9399
['-h', `--baseQuery`, `test/fixtures/customBaseQuery.ts:anotherNamedBaseQuery`, `./test/fixtures/petstore.json`],

0 commit comments

Comments
 (0)