Skip to content

Commit da867d1

Browse files
committed
fix test feedback from @grumpyTofu
1 parent f1cc76b commit da867d1

File tree

3 files changed

+66
-18
lines changed

3 files changed

+66
-18
lines changed

packages/rtk-query-codegen-openapi/package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
{
22
"name": "@rtk-query/codgen-openapi",
33
"version": "1.0.0-alpha.1",
4-
"main": "index.js",
4+
"main": "lib/index.js",
5+
"types": "lib/index.d.ts",
56
"author": "Lenz Weber",
67
"license": "MIT",
78
"repository": {

packages/rtk-query-codegen-openapi/src/generate.ts

Lines changed: 14 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -16,15 +16,7 @@ import {
1616
import type { OpenAPIV3 } from 'openapi-types';
1717
import { generateReactHooks } from './generators/react-hooks';
1818
import type { EndpointOverrides, GenerationOptions, OperationDefinition } from './types';
19-
import { OutputFileOptions } from './types';
20-
import {
21-
capitalize,
22-
getOperationDefinitions,
23-
getV3Doc,
24-
isQuery as testIsQuery,
25-
MESSAGES,
26-
removeUndefined,
27-
} from './utils';
19+
import { capitalize, getOperationDefinitions, getV3Doc, isQuery as testIsQuery, removeUndefined } from './utils';
2820
import type { ObjectPropertyDefinitions } from './codegen';
2921
import { generateCreateApiCall, generateEndpointDefinition, generateImportNode } from './codegen';
3022

@@ -45,7 +37,7 @@ function patternMatches(pattern?: string | RegExp | (string | RegExp)[]) {
4537
if (!pattern) return true;
4638
const operationName = getOperationName(operationDefinition);
4739
return filters.some((filter) =>
48-
typeof filter === 'string' ? filter == operationName : filter?.test(operationName)
40+
typeof filter === 'string' ? filter === operationName : filter?.test(operationName)
4941
);
5042
};
5143
}
@@ -97,17 +89,20 @@ export async function generateApi(
9789
return declaration;
9890
}
9991

100-
if (outputFile && outputFile !== '-') {
92+
if (outputFile) {
10193
outputFile = path.resolve(process.cwd(), outputFile);
102-
apiFile = path.relative(path.dirname(outputFile), apiFile);
94+
if (apiFile.startsWith('.')) {
95+
apiFile = path.relative(path.dirname(outputFile), apiFile);
96+
if (!apiFile.startsWith('.')) apiFile = './' + apiFile;
97+
}
10398
}
10499
apiFile = apiFile.replace(/\.[jt]sx?$/, '');
105100

106101
const sourceCode = printer.printNode(
107102
ts.EmitHint.Unspecified,
108103
factory.createSourceFile(
109104
[
110-
generateImportNode(apiFile, { api: apiImport }),
105+
generateImportNode(apiFile, { [apiImport]: 'api' }),
111106
generateCreateApiCall({
112107
endpointDefinitions: factory.createObjectLiteralExpression(
113108
operationDefinitions.map((operationDefinition) =>
@@ -350,25 +345,25 @@ export async function generateApi(
350345
factory.createIdentifier('method'),
351346
factory.createStringLiteral(verb.toUpperCase())
352347
),
353-
bodyParameter == undefined
348+
bodyParameter === undefined
354349
? undefined
355350
: factory.createPropertyAssignment(
356351
factory.createIdentifier('body'),
357352
factory.createPropertyAccessExpression(rootObject, factory.createIdentifier(bodyParameter.name))
358353
),
359-
cookieParameters.length == 0
354+
cookieParameters.length === 0
360355
? undefined
361356
: factory.createPropertyAssignment(
362357
factory.createIdentifier('cookies'),
363358
generateQuerArgObjectLiteralExpression(cookieParameters, rootObject)
364359
),
365-
headerParameters.length == 0
360+
headerParameters.length === 0
366361
? undefined
367362
: factory.createPropertyAssignment(
368363
factory.createIdentifier('headers'),
369364
generateQuerArgObjectLiteralExpression(headerParameters, rootObject)
370365
),
371-
queryParameters.length == 0
366+
queryParameters.length === 0
372367
? undefined
373368
: factory.createPropertyAssignment(
374369
factory.createIdentifier('params'),
@@ -381,10 +376,12 @@ export async function generateApi(
381376
);
382377
}
383378

379+
// eslint-disable-next-line no-empty-pattern
384380
function generateQueryEndpointProps({}: { operationDefinition: OperationDefinition }): ObjectPropertyDefinitions {
385381
return {}; /* TODO needs implementation - skip for now */
386382
}
387383

384+
// eslint-disable-next-line no-empty-pattern
388385
function generateMutationEndpointProps({}: { operationDefinition: OperationDefinition }): ObjectPropertyDefinitions {
389386
return {}; /* TODO needs implementation - skip for now */
390387
}

packages/rtk-query-codegen-openapi/test/generateEndpoints.test.ts

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
import { resolve } from 'path';
22
import { generateEndpoints } from '../src';
3+
import fs from 'fs';
4+
import path from 'path';
35

46
test('calling without `outputFile` returns the generated api', async () => {
57
const api = await generateEndpoints({
@@ -72,6 +74,54 @@ test('should use brackets in a querystring urls arg, when the arg contains full
7274
apiFile: './fixtures/emptyApi.ts',
7375
schemaFile: resolve(__dirname, 'fixtures/params.json'),
7476
});
77+
// eslint-disable-next-line no-template-curly-in-string
7578
expect(api).toContain('`/api/v1/list/${queryArg["item.id"]}`');
7679
expect(api).toMatchSnapshot();
7780
});
81+
82+
test('apiImport builds correct `import` statement', async () => {
83+
const api = await generateEndpoints({
84+
apiFile: './fixtures/emptyApi.ts',
85+
schemaFile: resolve(__dirname, 'fixtures/params.json'),
86+
filterEndpoints: [],
87+
apiImport: 'myApi',
88+
});
89+
expect(api).toContain('myApi as api');
90+
});
91+
92+
describe('import paths', () => {
93+
beforeEach(async () => {
94+
const dir = resolve(__dirname, 'tmp');
95+
const files = await fs.promises.readdir(dir);
96+
for (const file of files) {
97+
if (!file.startsWith('.')) await fs.promises.unlink(path.join(dir, file));
98+
}
99+
});
100+
101+
test('should create paths relative to `outFile` when `apiFile` is relative (different folder)', async () => {
102+
process.chdir(__dirname);
103+
await generateEndpoints({
104+
apiFile: './fixtures/emptyApi.ts',
105+
outputFile: './tmp/out.ts',
106+
schemaFile: resolve(__dirname, 'fixtures/petstore.json'),
107+
filterEndpoints: [],
108+
hooks: true,
109+
});
110+
expect(await fs.promises.readFile('./tmp/out.ts', 'utf8')).toContain("import { api } from '../fixtures/emptyApi'");
111+
});
112+
113+
test('should create paths relative to `outFile` when `apiFile` is relative (same folder)', async () => {
114+
process.chdir(__dirname);
115+
116+
await fs.promises.writeFile('./tmp/emptyApi.ts', await fs.promises.readFile('./fixtures/emptyApi.ts'));
117+
118+
await generateEndpoints({
119+
apiFile: './tmp/emptyApi.ts',
120+
outputFile: './tmp/out.ts',
121+
schemaFile: resolve(__dirname, 'fixtures/petstore.json'),
122+
filterEndpoints: [],
123+
hooks: true,
124+
});
125+
expect(await fs.promises.readFile('./tmp/out.ts', 'utf8')).toContain("import { api } from './emptyApi'");
126+
});
127+
});

0 commit comments

Comments
 (0)