@kubb/plugin-cypress 5.0.0-beta.4 → 5.0.0-beta.42
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +39 -22
- package/dist/index.cjs +161 -57
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +62 -35
- package/dist/index.js +163 -59
- package/dist/index.js.map +1 -1
- package/extension.yaml +635 -168
- package/package.json +9 -13
- package/src/components/Request.tsx +9 -10
- package/src/generators/cypressGenerator.tsx +19 -23
- package/src/plugin.ts +19 -24
- package/src/resolvers/resolverCypress.ts +13 -6
- package/src/types.ts +29 -17
- /package/dist/{chunk--u3MIqq1.js → chunk-C0LytTxp.js} +0 -0
package/package.json
CHANGED
|
@@ -1,21 +1,15 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@kubb/plugin-cypress",
|
|
3
|
-
"version": "5.0.0-beta.
|
|
4
|
-
"description": "Cypress
|
|
3
|
+
"version": "5.0.0-beta.42",
|
|
4
|
+
"description": "Generate Cypress request commands and e2e test fixtures from your OpenAPI specification, enabling automated API testing with zero manual setup.",
|
|
5
5
|
"keywords": [
|
|
6
|
-
"
|
|
7
|
-
"code-generator",
|
|
6
|
+
"code-generation",
|
|
8
7
|
"codegen",
|
|
9
8
|
"cypress",
|
|
10
9
|
"e2e-testing",
|
|
11
|
-
"end-to-end",
|
|
12
|
-
"integration-testing",
|
|
13
10
|
"kubb",
|
|
14
|
-
"oas",
|
|
15
11
|
"openapi",
|
|
16
|
-
"plugins",
|
|
17
12
|
"swagger",
|
|
18
|
-
"test-automation",
|
|
19
13
|
"test-generation",
|
|
20
14
|
"testing",
|
|
21
15
|
"typescript"
|
|
@@ -53,15 +47,16 @@
|
|
|
53
47
|
"registry": "https://registry.npmjs.org/"
|
|
54
48
|
},
|
|
55
49
|
"dependencies": {
|
|
56
|
-
"@kubb/core": "5.0.0-beta.
|
|
57
|
-
"@kubb/renderer-jsx": "5.0.0-beta.
|
|
58
|
-
"@kubb/plugin-ts": "5.0.0-beta.
|
|
50
|
+
"@kubb/core": "5.0.0-beta.42",
|
|
51
|
+
"@kubb/renderer-jsx": "5.0.0-beta.42",
|
|
52
|
+
"@kubb/plugin-ts": "5.0.0-beta.42"
|
|
59
53
|
},
|
|
60
54
|
"devDependencies": {
|
|
55
|
+
"@internals/shared": "0.0.0",
|
|
61
56
|
"@internals/utils": "0.0.0"
|
|
62
57
|
},
|
|
63
58
|
"peerDependencies": {
|
|
64
|
-
"@kubb/renderer-jsx": "5.0.0-beta.
|
|
59
|
+
"@kubb/renderer-jsx": "5.0.0-beta.42"
|
|
65
60
|
},
|
|
66
61
|
"size-limit": [
|
|
67
62
|
{
|
|
@@ -80,6 +75,7 @@
|
|
|
80
75
|
"lint:fix": "oxlint --fix .",
|
|
81
76
|
"release": "pnpm publish --no-git-check",
|
|
82
77
|
"release:canary": "bash ../../.github/canary.sh && node ../../scripts/build.js canary && pnpm publish --no-git-check",
|
|
78
|
+
"release:stage": "pnpm stage publish --no-git-check",
|
|
83
79
|
"start": "tsdown --watch",
|
|
84
80
|
"test": "vitest --passWithNoTests",
|
|
85
81
|
"typecheck": "tsc -p ./tsconfig.json --noEmit --emitDeclarationOnly false"
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { getOperationParameters } from '@internals/shared'
|
|
1
2
|
import { camelCase, URLPath } from '@internals/utils'
|
|
2
3
|
import { ast } from '@kubb/core'
|
|
3
4
|
import type { ResolverTs } from '@kubb/plugin-ts'
|
|
@@ -19,7 +20,7 @@ type Props = {
|
|
|
19
20
|
* TypeScript resolver for resolving param/data/response type names
|
|
20
21
|
*/
|
|
21
22
|
resolver: ResolverTs
|
|
22
|
-
baseURL: string | undefined
|
|
23
|
+
baseURL: string | null | undefined
|
|
23
24
|
dataReturnType: PluginCypress['resolvedOptions']['dataReturnType']
|
|
24
25
|
paramsCasing: PluginCypress['resolvedOptions']['paramsCasing']
|
|
25
26
|
paramsType: PluginCypress['resolvedOptions']['paramsType']
|
|
@@ -29,6 +30,7 @@ type Props = {
|
|
|
29
30
|
const declarationPrinter = functionPrinter({ mode: 'declaration' })
|
|
30
31
|
|
|
31
32
|
export function Request({ baseURL = '', name, dataReturnType, resolver, node, paramsType, pathParamsType, paramsCasing }: Props): KubbReactNode {
|
|
33
|
+
if (!ast.isHttpOperationNode(node)) return null
|
|
32
34
|
const paramsNode = ast.createOperationParams(node, {
|
|
33
35
|
paramsType,
|
|
34
36
|
pathParamsType,
|
|
@@ -47,10 +49,7 @@ export function Request({ baseURL = '', name, dataReturnType, resolver, node, pa
|
|
|
47
49
|
const responseType = resolver.resolveResponseName(node)
|
|
48
50
|
const returnType = dataReturnType === 'data' ? `Cypress.Chainable<${responseType}>` : `Cypress.Chainable<Cypress.Response<${responseType}>>`
|
|
49
51
|
|
|
50
|
-
const casedPathParams =
|
|
51
|
-
node.parameters.filter((p) => p.in === 'path'),
|
|
52
|
-
paramsCasing,
|
|
53
|
-
)
|
|
52
|
+
const casedPathParams = getOperationParameters(node, { paramsCasing }).path
|
|
54
53
|
// Build a lookup keyed by camelCase-normalized name so that path-template names
|
|
55
54
|
// (e.g. `{pet_id}`) correctly resolve to the function-parameter name (`petId`)
|
|
56
55
|
// even when the OpenAPI spec has inconsistent casing between the two.
|
|
@@ -62,11 +61,11 @@ export function Request({ baseURL = '', name, dataReturnType, resolver, node, pa
|
|
|
62
61
|
replacer: (param) => pathParamNameMap.get(camelCase(param)) ?? param,
|
|
63
62
|
})
|
|
64
63
|
|
|
65
|
-
const requestOptions: string
|
|
64
|
+
const requestOptions: Array<string> = [`method: '${node.method}'`, `url: ${urlTemplate}`]
|
|
66
65
|
|
|
67
|
-
const queryParams = node
|
|
66
|
+
const queryParams = getOperationParameters(node).query
|
|
68
67
|
if (queryParams.length > 0) {
|
|
69
|
-
const casedQueryParams =
|
|
68
|
+
const casedQueryParams = getOperationParameters(node, { paramsCasing }).query
|
|
70
69
|
// When paramsCasing renames query params (e.g. page_size → pageSize), we must remap
|
|
71
70
|
// the camelCase keys back to the original API names before passing them to `qs`.
|
|
72
71
|
const needsQsTransform = casedQueryParams.some((p, i) => p.name !== queryParams[i]!.name)
|
|
@@ -78,9 +77,9 @@ export function Request({ baseURL = '', name, dataReturnType, resolver, node, pa
|
|
|
78
77
|
}
|
|
79
78
|
}
|
|
80
79
|
|
|
81
|
-
const headerParams = node
|
|
80
|
+
const headerParams = getOperationParameters(node).header
|
|
82
81
|
if (headerParams.length > 0) {
|
|
83
|
-
const casedHeaderParams =
|
|
82
|
+
const casedHeaderParams = getOperationParameters(node, { paramsCasing }).header
|
|
84
83
|
// When paramsCasing renames header params (e.g. x-api-key → xApiKey), we must remap
|
|
85
84
|
// the camelCase keys back to the original API names before passing them to `headers`.
|
|
86
85
|
const needsHeaderTransform = casedHeaderParams.some((p, i) => p.name !== headerParams[i]!.name)
|
|
@@ -1,14 +1,21 @@
|
|
|
1
|
+
import { resolveOperationTypeNames } from '@internals/shared'
|
|
1
2
|
import { ast, defineGenerator } from '@kubb/core'
|
|
2
3
|
import { pluginTsName } from '@kubb/plugin-ts'
|
|
3
|
-
import { File,
|
|
4
|
+
import { File, jsxRendererSync } from '@kubb/renderer-jsx'
|
|
4
5
|
import { Request } from '../components/Request.tsx'
|
|
5
6
|
import type { PluginCypress } from '../types.ts'
|
|
6
7
|
|
|
8
|
+
/**
|
|
9
|
+
* Built-in generator for `@kubb/plugin-cypress`. Emits one typed
|
|
10
|
+
* `cy.request()` wrapper per OpenAPI operation, ready to call inside Cypress
|
|
11
|
+
* test specs and custom commands.
|
|
12
|
+
*/
|
|
7
13
|
export const cypressGenerator = defineGenerator<PluginCypress>({
|
|
8
14
|
name: 'cypress',
|
|
9
|
-
renderer:
|
|
15
|
+
renderer: jsxRendererSync,
|
|
10
16
|
operation(node, ctx) {
|
|
11
|
-
|
|
17
|
+
if (!ast.isHttpOperationNode(node)) return null
|
|
18
|
+
const { config, resolver, driver, root } = ctx
|
|
12
19
|
const { output, baseURL, dataReturnType, paramsCasing, paramsType, pathParamsType, group } = ctx.options
|
|
13
20
|
|
|
14
21
|
const pluginTs = driver.getPlugin(pluginTsName)
|
|
@@ -19,29 +26,20 @@ export const cypressGenerator = defineGenerator<PluginCypress>({
|
|
|
19
26
|
|
|
20
27
|
const tsResolver = driver.getResolver(pluginTsName)
|
|
21
28
|
|
|
22
|
-
const
|
|
23
|
-
|
|
24
|
-
const pathParams = casedParams.filter((p) => p.in === 'path')
|
|
25
|
-
const queryParams = casedParams.filter((p) => p.in === 'query')
|
|
26
|
-
const headerParams = casedParams.filter((p) => p.in === 'header')
|
|
27
|
-
|
|
28
|
-
const importedTypeNames = [
|
|
29
|
-
...pathParams.map((p) => tsResolver.resolvePathParamsName(node, p)),
|
|
30
|
-
...queryParams.map((p) => tsResolver.resolveQueryParamsName(node, p)),
|
|
31
|
-
...headerParams.map((p) => tsResolver.resolveHeaderParamsName(node, p)),
|
|
32
|
-
node.requestBody?.content?.[0]?.schema ? tsResolver.resolveDataName(node) : undefined,
|
|
33
|
-
tsResolver.resolveResponseName(node),
|
|
34
|
-
].filter(Boolean)
|
|
29
|
+
const importedTypeNames = resolveOperationTypeNames(node, tsResolver, { paramsCasing })
|
|
35
30
|
|
|
36
31
|
const meta = {
|
|
37
32
|
name: resolver.resolveName(node.operationId),
|
|
38
|
-
file: resolver.resolveFile(
|
|
33
|
+
file: resolver.resolveFile(
|
|
34
|
+
{ name: node.operationId, extname: '.ts', tag: node.tags[0] ?? 'default', path: node.path },
|
|
35
|
+
{ root, output, group: group ?? undefined },
|
|
36
|
+
),
|
|
39
37
|
fileTs: tsResolver.resolveFile(
|
|
40
38
|
{ name: node.operationId, extname: '.ts', tag: node.tags[0] ?? 'default', path: node.path },
|
|
41
39
|
{
|
|
42
40
|
root,
|
|
43
41
|
output: pluginTs.options?.output ?? output,
|
|
44
|
-
group: pluginTs.options?.group,
|
|
42
|
+
group: pluginTs.options?.group ?? undefined,
|
|
45
43
|
},
|
|
46
44
|
),
|
|
47
45
|
} as const
|
|
@@ -51,12 +49,10 @@ export const cypressGenerator = defineGenerator<PluginCypress>({
|
|
|
51
49
|
baseName={meta.file.baseName}
|
|
52
50
|
path={meta.file.path}
|
|
53
51
|
meta={meta.file.meta}
|
|
54
|
-
banner={resolver.resolveBanner(
|
|
55
|
-
footer={resolver.resolveFooter(
|
|
52
|
+
banner={resolver.resolveBanner(ctx.meta, { output, config, file: { path: meta.file.path, baseName: meta.file.baseName } })}
|
|
53
|
+
footer={resolver.resolveFooter(ctx.meta, { output, config, file: { path: meta.file.path, baseName: meta.file.baseName } })}
|
|
56
54
|
>
|
|
57
|
-
{meta.fileTs && importedTypeNames.length > 0 &&
|
|
58
|
-
<File.Import name={Array.from(new Set(importedTypeNames))} root={meta.file.path} path={meta.fileTs.path} isTypeOnly />
|
|
59
|
-
)}
|
|
55
|
+
{meta.fileTs && importedTypeNames.length > 0 && <File.Import name={importedTypeNames} root={meta.file.path} path={meta.fileTs.path} isTypeOnly />}
|
|
60
56
|
<Request
|
|
61
57
|
name={meta.name}
|
|
62
58
|
node={node}
|
package/src/plugin.ts
CHANGED
|
@@ -1,29 +1,36 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { definePlugin
|
|
1
|
+
import { createGroupConfig } from '@internals/shared'
|
|
2
|
+
import { definePlugin } from '@kubb/core'
|
|
3
3
|
import { pluginTsName } from '@kubb/plugin-ts'
|
|
4
4
|
import { cypressGenerator } from './generators/cypressGenerator.tsx'
|
|
5
5
|
import { resolverCypress } from './resolvers/resolverCypress.ts'
|
|
6
6
|
import type { PluginCypress } from './types.ts'
|
|
7
7
|
|
|
8
8
|
/**
|
|
9
|
-
* Canonical plugin name for `@kubb/plugin-cypress
|
|
10
|
-
*
|
|
9
|
+
* Canonical plugin name for `@kubb/plugin-cypress`. Used for driver lookups and
|
|
10
|
+
* cross-plugin dependency references.
|
|
11
11
|
*/
|
|
12
12
|
export const pluginCypressName = 'plugin-cypress' satisfies PluginCypress['name']
|
|
13
13
|
|
|
14
14
|
/**
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
* Walks operations, delegates rendering to the active generators,
|
|
19
|
-
* and writes barrel files based on `output.barrelType`.
|
|
15
|
+
* Generates one typed `cy.request()` wrapper per OpenAPI operation. Each helper
|
|
16
|
+
* has typed path params, body, query, and a typed response, so failing API
|
|
17
|
+
* calls in Cypress show up at compile time instead of inside the test runner.
|
|
20
18
|
*
|
|
21
19
|
* @example
|
|
22
20
|
* ```ts
|
|
23
|
-
* import
|
|
21
|
+
* import { defineConfig } from 'kubb'
|
|
22
|
+
* import { pluginTs } from '@kubb/plugin-ts'
|
|
23
|
+
* import { pluginCypress } from '@kubb/plugin-cypress'
|
|
24
24
|
*
|
|
25
25
|
* export default defineConfig({
|
|
26
|
-
*
|
|
26
|
+
* input: { path: './petStore.yaml' },
|
|
27
|
+
* output: { path: './src/gen' },
|
|
28
|
+
* plugins: [
|
|
29
|
+
* pluginTs(),
|
|
30
|
+
* pluginCypress({
|
|
31
|
+
* output: { path: './cypress' },
|
|
32
|
+
* }),
|
|
33
|
+
* ],
|
|
27
34
|
* })
|
|
28
35
|
* ```
|
|
29
36
|
*/
|
|
@@ -44,19 +51,7 @@ export const pluginCypress = definePlugin<PluginCypress>((options) => {
|
|
|
44
51
|
generators: userGenerators = [],
|
|
45
52
|
} = options
|
|
46
53
|
|
|
47
|
-
const groupConfig = group
|
|
48
|
-
? ({
|
|
49
|
-
...group,
|
|
50
|
-
name: group.name
|
|
51
|
-
? group.name
|
|
52
|
-
: (ctx: { group: string }) => {
|
|
53
|
-
if (group.type === 'path') {
|
|
54
|
-
return `${ctx.group.split('/')[1]}`
|
|
55
|
-
}
|
|
56
|
-
return `${camelCase(ctx.group)}Requests`
|
|
57
|
-
},
|
|
58
|
-
} satisfies Group)
|
|
59
|
-
: undefined
|
|
54
|
+
const groupConfig = createGroupConfig(group, { suffix: 'Requests' })
|
|
60
55
|
|
|
61
56
|
return {
|
|
62
57
|
name: pluginCypressName,
|
|
@@ -3,20 +3,27 @@ import { defineResolver } from '@kubb/core'
|
|
|
3
3
|
import type { PluginCypress } from '../types.ts'
|
|
4
4
|
|
|
5
5
|
/**
|
|
6
|
-
*
|
|
6
|
+
* Default resolver used by `@kubb/plugin-cypress`. Decides the names and file
|
|
7
|
+
* paths for every generated `cy.request()` wrapper. Functions and files use
|
|
8
|
+
* camelCase, matching the convention from `@kubb/plugin-client`.
|
|
7
9
|
*
|
|
8
|
-
*
|
|
10
|
+
* @example Resolve a helper name
|
|
11
|
+
* ```ts
|
|
12
|
+
* import { resolverCypress } from '@kubb/plugin-cypress'
|
|
9
13
|
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
14
|
+
* resolverCypress.default('list pets', 'function') // 'listPets'
|
|
15
|
+
* ```
|
|
12
16
|
*/
|
|
13
|
-
export const resolverCypress = defineResolver<PluginCypress>((
|
|
17
|
+
export const resolverCypress = defineResolver<PluginCypress>(() => ({
|
|
14
18
|
name: 'default',
|
|
15
19
|
pluginName: 'plugin-cypress',
|
|
16
20
|
default(name, type) {
|
|
17
21
|
return camelCase(name, { isFile: type === 'file' })
|
|
18
22
|
},
|
|
19
23
|
resolveName(name) {
|
|
20
|
-
return
|
|
24
|
+
return this.default(name, 'function')
|
|
25
|
+
},
|
|
26
|
+
resolvePathName(name, type) {
|
|
27
|
+
return this.default(name, type)
|
|
21
28
|
},
|
|
22
29
|
}))
|
package/src/types.ts
CHANGED
|
@@ -11,6 +11,10 @@ export type ResolverCypress = Resolver & {
|
|
|
11
11
|
* `resolver.resolveName('show pet by id') // -> 'showPetById'`
|
|
12
12
|
*/
|
|
13
13
|
resolveName(this: ResolverCypress, name: string): string
|
|
14
|
+
/**
|
|
15
|
+
* Resolves the output file name for a Cypress request module.
|
|
16
|
+
*/
|
|
17
|
+
resolvePathName(this: ResolverCypress, name: string, type?: 'file' | 'function' | 'type' | 'const'): string
|
|
14
18
|
}
|
|
15
19
|
|
|
16
20
|
/**
|
|
@@ -19,21 +23,23 @@ export type ResolverCypress = Resolver & {
|
|
|
19
23
|
type ParamsTypeOptions =
|
|
20
24
|
| {
|
|
21
25
|
/**
|
|
22
|
-
*
|
|
26
|
+
* Every operation parameter is wrapped in a single destructured object argument.
|
|
23
27
|
*/
|
|
24
28
|
paramsType: 'object'
|
|
25
29
|
/**
|
|
26
|
-
*
|
|
30
|
+
* `pathParamsType` has no effect when `paramsType` is `'object'`.
|
|
27
31
|
*/
|
|
28
32
|
pathParamsType?: never
|
|
29
33
|
}
|
|
30
34
|
| {
|
|
31
35
|
/**
|
|
32
|
-
* Each parameter group emitted as a separate function argument.
|
|
36
|
+
* Each parameter group is emitted as a separate positional function argument.
|
|
33
37
|
*/
|
|
34
38
|
paramsType?: 'inline'
|
|
35
39
|
/**
|
|
36
|
-
* How path parameters are arranged
|
|
40
|
+
* How URL path parameters are arranged inside the inline argument list.
|
|
41
|
+
* - `'object'` groups them into one destructured object.
|
|
42
|
+
* - `'inline'` emits each path param as its own argument.
|
|
37
43
|
*
|
|
38
44
|
* @default 'inline'
|
|
39
45
|
*/
|
|
@@ -42,50 +48,56 @@ type ParamsTypeOptions =
|
|
|
42
48
|
|
|
43
49
|
export type Options = {
|
|
44
50
|
/**
|
|
45
|
-
*
|
|
46
|
-
*
|
|
51
|
+
* Where the generated Cypress helpers are written and how they are exported.
|
|
52
|
+
*
|
|
53
|
+
* @default { path: 'cypress', barrel: { type: 'named' } }
|
|
47
54
|
*/
|
|
48
55
|
output?: Output
|
|
49
56
|
/**
|
|
50
|
-
*
|
|
57
|
+
* Shape of the value returned from each helper.
|
|
58
|
+
* - `'data'` — only the response body.
|
|
59
|
+
* - `'full'` — the full Cypress response object (headers, status, body).
|
|
51
60
|
*
|
|
52
61
|
* @default 'data'
|
|
53
62
|
*/
|
|
54
63
|
dataReturnType?: 'data' | 'full'
|
|
55
64
|
/**
|
|
56
|
-
*
|
|
65
|
+
* Rename parameter properties in the generated helpers (path, query, headers).
|
|
66
|
+
*
|
|
67
|
+
* @note Must match the value of `paramsCasing` on `@kubb/plugin-ts`.
|
|
57
68
|
*/
|
|
58
69
|
paramsCasing?: 'camelcase'
|
|
59
70
|
/**
|
|
60
|
-
* Base URL prepended to every
|
|
71
|
+
* Base URL prepended to every request URL. When omitted, falls back to the
|
|
72
|
+
* adapter's server URL (typically `servers[0].url`).
|
|
61
73
|
*/
|
|
62
74
|
baseURL?: string
|
|
63
75
|
/**
|
|
64
|
-
*
|
|
76
|
+
* Split generated files into subfolders based on the operation's tag.
|
|
65
77
|
*/
|
|
66
78
|
group?: Group
|
|
67
79
|
/**
|
|
68
|
-
*
|
|
80
|
+
* Skip operations matching at least one entry in the list.
|
|
69
81
|
*/
|
|
70
82
|
exclude?: Array<Exclude>
|
|
71
83
|
/**
|
|
72
|
-
*
|
|
84
|
+
* Restrict generation to operations matching at least one entry in the list.
|
|
73
85
|
*/
|
|
74
86
|
include?: Array<Include>
|
|
75
87
|
/**
|
|
76
|
-
*
|
|
88
|
+
* Apply a different options object to operations matching a pattern.
|
|
77
89
|
*/
|
|
78
90
|
override?: Array<Override<ResolvedOptions>>
|
|
79
91
|
/**
|
|
80
|
-
* Override
|
|
92
|
+
* Override how helper names and file paths are built.
|
|
81
93
|
*/
|
|
82
94
|
resolver?: Partial<ResolverCypress> & ThisType<ResolverCypress>
|
|
83
95
|
/**
|
|
84
|
-
* AST visitor to
|
|
96
|
+
* AST visitor applied to each operation node before printing.
|
|
85
97
|
*/
|
|
86
98
|
transformer?: ast.Visitor
|
|
87
99
|
/**
|
|
88
|
-
*
|
|
100
|
+
* Custom generators that run alongside the built-in Cypress generators.
|
|
89
101
|
*/
|
|
90
102
|
generators?: Array<Generator<PluginCypress>>
|
|
91
103
|
} & ParamsTypeOptions
|
|
@@ -95,7 +107,7 @@ type ResolvedOptions = {
|
|
|
95
107
|
exclude: Array<Exclude>
|
|
96
108
|
include: Array<Include> | undefined
|
|
97
109
|
override: Array<Override<ResolvedOptions>>
|
|
98
|
-
group: Group |
|
|
110
|
+
group: Group | null
|
|
99
111
|
baseURL: Options['baseURL'] | undefined
|
|
100
112
|
dataReturnType: NonNullable<Options['dataReturnType']>
|
|
101
113
|
pathParamsType: NonNullable<NonNullable<Options['pathParamsType']>>
|
|
File without changes
|