@openapi-codegen/typescript
Advanced tools
Comparing version 1.0.0 to 1.1.0
@@ -5,3 +5,3 @@ import ts from "typescript"; | ||
*/ | ||
export declare const getVariablesType: ({ requestBodyType, requestBodyOptional, headersType, headersOptional, pathParamsType, pathParamsOptional, queryParamsType, queryParamsOptional, contextTypeName, }: { | ||
export declare const getVariablesType: ({ requestBodyType, requestBodyOptional, headersType, headersOptional, pathParamsType, pathParamsOptional, queryParamsType, queryParamsOptional, contextTypeName, withContextType, }: { | ||
requestBodyType: ts.TypeNode; | ||
@@ -16,2 +16,3 @@ requestBodyOptional: boolean; | ||
contextTypeName: string; | ||
}) => ts.IntersectionTypeNode | ts.IndexedAccessTypeNode; | ||
withContextType: boolean; | ||
}) => ts.TypeLiteralNode | ts.IntersectionTypeNode | ts.IndexedAccessTypeNode | ts.KeywordTypeNode<ts.SyntaxKind.VoidKeyword>; |
@@ -9,3 +9,3 @@ "use strict"; | ||
*/ | ||
const getVariablesType = ({ requestBodyType, requestBodyOptional, headersType, headersOptional, pathParamsType, pathParamsOptional, queryParamsType, queryParamsOptional, contextTypeName, }) => { | ||
const getVariablesType = ({ requestBodyType, requestBodyOptional, headersType, headersOptional, pathParamsType, pathParamsOptional, queryParamsType, queryParamsOptional, contextTypeName, withContextType, }) => { | ||
const variablesItems = []; | ||
@@ -36,11 +36,18 @@ const hasProperties = (node) => { | ||
} | ||
const fetcherOptionsType = typescript_1.factory.createIndexedAccessTypeNode(typescript_1.factory.createTypeReferenceNode(typescript_1.factory.createIdentifier(contextTypeName), undefined), typescript_1.factory.createLiteralTypeNode(typescript_1.factory.createStringLiteral("fetcherOptions"))); | ||
return variablesItems.length === 0 | ||
? fetcherOptionsType | ||
: typescript_1.factory.createIntersectionTypeNode([ | ||
typescript_1.factory.createTypeLiteralNode(variablesItems), | ||
fetcherOptionsType, | ||
]); | ||
if (withContextType) { | ||
const fetcherOptionsType = typescript_1.factory.createIndexedAccessTypeNode(typescript_1.factory.createTypeReferenceNode(typescript_1.factory.createIdentifier(contextTypeName), undefined), typescript_1.factory.createLiteralTypeNode(typescript_1.factory.createStringLiteral("fetcherOptions"))); | ||
return variablesItems.length === 0 | ||
? fetcherOptionsType | ||
: typescript_1.factory.createIntersectionTypeNode([ | ||
typescript_1.factory.createTypeLiteralNode(variablesItems), | ||
fetcherOptionsType, | ||
]); | ||
} | ||
else { | ||
return variablesItems.length === 0 | ||
? typescript_1.factory.createKeywordTypeNode(typescript_1.default.SyntaxKind.VoidKeyword) | ||
: typescript_1.factory.createTypeLiteralNode(variablesItems); | ||
} | ||
}; | ||
exports.getVariablesType = getVariablesType; | ||
//# sourceMappingURL=getVariablesType.js.map |
@@ -7,13 +7,9 @@ "use strict"; | ||
const c = (0, tslib_1.__importStar)(require("case")); | ||
const schemaToTypeAliasDeclaration_1 = require("../core/schemaToTypeAliasDeclaration"); | ||
const getUsedImports_1 = require("../core/getUsedImports"); | ||
const getVariablesType_1 = require("../core/getVariablesType"); | ||
const paramsToSchema_1 = require("../core/paramsToSchema"); | ||
const getResponseType_1 = require("../core/getResponseType"); | ||
const getRequestBodyType_1 = require("../core/getRequestBodyType"); | ||
const getParamsGroupByType_1 = require("../core/getParamsGroupByType"); | ||
const isRequestBodyOptional_1 = require("../core/isRequestBodyOptional"); | ||
const createWatermark_1 = require("../core/createWatermark"); | ||
const createOperationFetcherFnNodes_1 = require("../core/createOperationFetcherFnNodes"); | ||
const isVerb_1 = require("../core/isVerb"); | ||
const isOperationObject_1 = require("../core/isOperationObject"); | ||
const getOperationTypes_1 = require("../core/getOperationTypes"); | ||
const createNamedImport_1 = require("../core/createNamedImport"); | ||
const fetcher_1 = require("../templates/fetcher"); | ||
@@ -64,98 +60,13 @@ const context_1 = require("../templates/context"); | ||
operationIds.push(operationId); | ||
// Retrieve dataType | ||
let dataType = (0, getResponseType_1.getResponseType)({ | ||
responses: operation.responses, | ||
components: context.openAPIDocument.components, | ||
filter: (statusCode) => statusCode.startsWith("2"), | ||
const { dataType, errorType, requestBodyType, pathParamsType, variablesType, queryParamsType, headersType, declarationNodes, } = (0, getOperationTypes_1.getOperationTypes)({ | ||
contextTypeName, | ||
openAPIDocument: context.openAPIDocument, | ||
operation, | ||
operationId, | ||
printNodes, | ||
injectedHeaders: config.injectedHeaders, | ||
pathParameters: verbs.parameters, | ||
withContextType: true, | ||
}); | ||
// Retrieve errorType | ||
let errorType = (0, getResponseType_1.getResponseType)({ | ||
responses: operation.responses, | ||
components: context.openAPIDocument.components, | ||
filter: (statusCode) => !statusCode.startsWith("2"), | ||
printNodes, | ||
}); | ||
// Retrieve requestBodyType | ||
let requestBodyType = (0, getRequestBodyType_1.getRequestBodyType)({ | ||
requestBody: operation.requestBody, | ||
components: context.openAPIDocument.components, | ||
}); | ||
// Generate params types | ||
const { pathParams, queryParams, headerParams } = (0, getParamsGroupByType_1.getParamsGroupByType)([...(verbs.parameters || []), ...(operation.parameters || [])], context.openAPIDocument.components); | ||
// Check if types can be marked as optional (all properties are optional) | ||
const requestBodyOptional = (0, isRequestBodyOptional_1.isRequestBodyOptional)({ | ||
requestBody: operation.requestBody, | ||
components: context.openAPIDocument.components, | ||
}); | ||
const headersOptional = headerParams.reduce((mem, p) => { | ||
if ((config.injectedHeaders || []).includes(p.name)) | ||
return mem; | ||
return mem && !p.required; | ||
}, true); | ||
const pathParamsOptional = pathParams.reduce((mem, p) => { | ||
return mem && !p.required; | ||
}, true); | ||
const queryParamsOptional = queryParams.reduce((mem, p) => { | ||
return mem && !p.required; | ||
}, true); | ||
if (pathParams.length > 0) { | ||
nodes.push(...(0, schemaToTypeAliasDeclaration_1.schemaToTypeAliasDeclaration)(`${operationId}PathParams`, (0, paramsToSchema_1.paramsToSchema)(pathParams), { | ||
currentComponent: null, | ||
openAPIDocument: context.openAPIDocument, | ||
})); | ||
} | ||
if (queryParams.length > 0) { | ||
nodes.push(...(0, schemaToTypeAliasDeclaration_1.schemaToTypeAliasDeclaration)(`${operationId}QueryParams`, (0, paramsToSchema_1.paramsToSchema)(queryParams), { | ||
currentComponent: null, | ||
openAPIDocument: context.openAPIDocument, | ||
})); | ||
} | ||
if (headerParams.length > 0) { | ||
nodes.push(...(0, schemaToTypeAliasDeclaration_1.schemaToTypeAliasDeclaration)(`${operationId}Headers`, (0, paramsToSchema_1.paramsToSchema)(headerParams, config.injectedHeaders), { | ||
currentComponent: null, | ||
openAPIDocument: context.openAPIDocument, | ||
})); | ||
} | ||
// Export error type if needed | ||
if (shouldExtractNode(errorType)) { | ||
const errorTypeIdentifier = c.pascal(`${operationId}Error`); | ||
nodes.push(typescript_1.factory.createTypeAliasDeclaration(undefined, [typescript_1.factory.createModifier(typescript_1.default.SyntaxKind.ExportKeyword)], typescript_1.factory.createIdentifier(errorTypeIdentifier), undefined, errorType)); | ||
errorType = typescript_1.factory.createTypeReferenceNode(errorTypeIdentifier); | ||
} | ||
// Export data type if needed | ||
if (shouldExtractNode(dataType)) { | ||
const dataTypeIdentifier = c.pascal(`${operationId}Response`); | ||
nodes.push(typescript_1.factory.createTypeAliasDeclaration(undefined, [typescript_1.factory.createModifier(typescript_1.default.SyntaxKind.ExportKeyword)], typescript_1.factory.createIdentifier(dataTypeIdentifier), undefined, dataType)); | ||
dataType = typescript_1.factory.createTypeReferenceNode(dataTypeIdentifier); | ||
} | ||
// Export requestBody type if needed | ||
if (shouldExtractNode(requestBodyType)) { | ||
const requestBodyIdentifier = c.pascal(`${operationId}RequestBody`); | ||
nodes.push(typescript_1.factory.createTypeAliasDeclaration(undefined, [typescript_1.factory.createModifier(typescript_1.default.SyntaxKind.ExportKeyword)], typescript_1.factory.createIdentifier(requestBodyIdentifier), undefined, requestBodyType)); | ||
requestBodyType = typescript_1.factory.createTypeReferenceNode(requestBodyIdentifier); | ||
} | ||
const pathParamsType = pathParams.length > 0 | ||
? typescript_1.factory.createTypeReferenceNode(`${c.pascal(operationId)}PathParams`) | ||
: typescript_1.factory.createTypeLiteralNode([]); | ||
const queryParamsType = queryParams.length > 0 | ||
? typescript_1.factory.createTypeReferenceNode(`${c.pascal(operationId)}QueryParams`) | ||
: typescript_1.factory.createTypeLiteralNode([]); | ||
const headersType = headerParams.length > 0 | ||
? typescript_1.factory.createTypeReferenceNode(`${c.pascal(operationId)}Headers`) | ||
: typescript_1.factory.createTypeLiteralNode([]); | ||
// Generate fetcher variables type | ||
const variablesIdentifier = c.pascal(`${operationId}Variables`); | ||
const variablesType = typescript_1.factory.createTypeReferenceNode(variablesIdentifier); | ||
nodes.push(typescript_1.factory.createTypeAliasDeclaration(undefined, [typescript_1.factory.createModifier(typescript_1.default.SyntaxKind.ExportKeyword)], typescript_1.factory.createIdentifier(variablesIdentifier), undefined, (0, getVariablesType_1.getVariablesType)({ | ||
requestBodyType, | ||
headersType, | ||
pathParamsType, | ||
queryParamsType, | ||
contextTypeName, | ||
headersOptional, | ||
pathParamsOptional, | ||
queryParamsOptional, | ||
requestBodyOptional, | ||
}))); | ||
nodes.push(...declarationNodes); | ||
const operationFetcherFnName = `fetch${c.pascal(operationId)}`; | ||
@@ -168,3 +79,3 @@ const component = operation["x-openapi-codegen-component"] || | ||
} | ||
nodes.push(...createOperationFetcherFnNodes({ | ||
nodes.push(...(0, createOperationFetcherFnNodes_1.createOperationFetcherFnNodes)({ | ||
dataType, | ||
@@ -205,4 +116,4 @@ requestBodyType, | ||
createReactQueryImport(), | ||
createNamedImport([contextHookName, contextTypeName], `./${contextFilename}`), | ||
createNamedImport(fetcherFn, `./${fetcherFilename}`), | ||
(0, createNamedImport_1.createNamedImport)([contextHookName, contextTypeName], `./${contextFilename}`), | ||
(0, createNamedImport_1.createNamedImport)(fetcherFn, `./${fetcherFilename}`), | ||
...(0, getUsedImports_1.getUsedImports)(nodes, config.schemasFiles), | ||
@@ -213,37 +124,2 @@ ...nodes, | ||
exports.generateReactQueryComponents = generateReactQueryComponents; | ||
/** | ||
* Create the declaration of the fetcher function. | ||
* | ||
* @returns Array of nodes | ||
*/ | ||
const createOperationFetcherFnNodes = ({ dataType, requestBodyType, queryParamsType, pathParamsType, headersType, variablesType, fetcherFn, operation, url, verb, name, }) => { | ||
const nodes = []; | ||
if (operation.description) { | ||
nodes.push(typescript_1.factory.createJSDocComment(operation.description.trim(), [])); | ||
} | ||
nodes.push(typescript_1.factory.createVariableStatement([typescript_1.factory.createModifier(typescript_1.default.SyntaxKind.ExportKeyword)], typescript_1.factory.createVariableDeclarationList([ | ||
typescript_1.factory.createVariableDeclaration(typescript_1.factory.createIdentifier(name), undefined, undefined, typescript_1.factory.createArrowFunction(undefined, undefined, variablesType.kind !== typescript_1.default.SyntaxKind.VoidKeyword | ||
? [ | ||
typescript_1.factory.createParameterDeclaration(undefined, undefined, undefined, typescript_1.factory.createIdentifier("variables"), undefined, variablesType, undefined), | ||
] | ||
: [], undefined, typescript_1.factory.createToken(typescript_1.default.SyntaxKind.EqualsGreaterThanToken), typescript_1.factory.createCallExpression(typescript_1.factory.createIdentifier(fetcherFn), [ | ||
dataType, | ||
requestBodyType, | ||
headersType, | ||
queryParamsType, | ||
pathParamsType, | ||
], [ | ||
typescript_1.factory.createObjectLiteralExpression([ | ||
typescript_1.factory.createPropertyAssignment(typescript_1.factory.createIdentifier("url"), typescript_1.factory.createStringLiteral(camelizedPathParams(url))), | ||
typescript_1.factory.createPropertyAssignment(typescript_1.factory.createIdentifier("method"), typescript_1.factory.createStringLiteral(verb)), | ||
...(variablesType.kind !== typescript_1.default.SyntaxKind.VoidKeyword | ||
? [ | ||
typescript_1.factory.createSpreadAssignment(typescript_1.factory.createIdentifier("variables")), | ||
] | ||
: []), | ||
], false), | ||
]))), | ||
], typescript_1.default.NodeFlags.Const))); | ||
return nodes; | ||
}; | ||
const createMutationHook = ({ operationFetcherFnName, contextHookName, dataType, errorType, variablesType, name, operation, }) => { | ||
@@ -324,19 +200,2 @@ const nodes = []; | ||
const createReactQueryImport = () => typescript_1.factory.createImportDeclaration(undefined, undefined, typescript_1.factory.createImportClause(false, undefined, typescript_1.factory.createNamespaceImport(typescript_1.factory.createIdentifier("reactQuery"))), typescript_1.factory.createStringLiteral("react-query"), undefined); | ||
const createNamedImport = (fnName, filename) => { | ||
const fnNames = Array.isArray(fnName) ? fnName : [fnName]; | ||
return typescript_1.factory.createImportDeclaration(undefined, undefined, typescript_1.factory.createImportClause(false, undefined, typescript_1.factory.createNamedImports(fnNames.map((name) => typescript_1.factory.createImportSpecifier(false, undefined, typescript_1.factory.createIdentifier(name))))), typescript_1.factory.createStringLiteral(filename), undefined); | ||
}; | ||
/** | ||
* Define if the type should be extracted. | ||
*/ | ||
const shouldExtractNode = (node) => typescript_1.default.isIntersectionTypeNode(node) || | ||
(typescript_1.default.isTypeLiteralNode(node) && node.members.length > 0) || | ||
typescript_1.default.isArrayTypeNode(node); | ||
/** | ||
* Transform url params case to camel. | ||
* | ||
* @example | ||
* `pet/{pet_id}` -> `pet/{petId}` | ||
*/ | ||
const camelizedPathParams = (url) => url.replace(/\{\w*\}/g, (match) => `{${c.camel(match)}}`); | ||
//# sourceMappingURL=generateReactQueryComponents.js.map |
export { generateSchemaTypes } from "./generators/generateSchemaTypes"; | ||
export { generateReactQueryComponents } from "./generators/generateReactQueryComponents"; | ||
export { generateFetchers } from "./generators/generateFetchers"; | ||
export { renameComponent } from "./utils/renameComponent"; | ||
export { forceReactQueryComponent } from "./utils/forceReactQueryComponent"; |
"use strict"; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
exports.forceReactQueryComponent = exports.renameComponent = exports.generateReactQueryComponents = exports.generateSchemaTypes = void 0; | ||
exports.forceReactQueryComponent = exports.renameComponent = exports.generateFetchers = exports.generateReactQueryComponents = exports.generateSchemaTypes = void 0; | ||
// Generators | ||
@@ -9,2 +9,4 @@ var generateSchemaTypes_1 = require("./generators/generateSchemaTypes"); | ||
Object.defineProperty(exports, "generateReactQueryComponents", { enumerable: true, get: function () { return generateReactQueryComponents_1.generateReactQueryComponents; } }); | ||
var generateFetchers_1 = require("./generators/generateFetchers"); | ||
Object.defineProperty(exports, "generateFetchers", { enumerable: true, get: function () { return generateFetchers_1.generateFetchers; } }); | ||
// Utils | ||
@@ -11,0 +13,0 @@ var renameComponent_1 = require("./utils/renameComponent"); |
/** | ||
* Get fetcher template | ||
*/ | ||
export declare const getFetcher: (prefix: string, contextPath: string) => string; | ||
export declare const getFetcher: (prefix: string, contextPath?: string | undefined) => string; |
@@ -9,3 +9,5 @@ "use strict"; | ||
const getFetcher = (prefix, contextPath) => `import qs from "qs"; | ||
import { ${(0, case_1.pascal)(prefix)}Context } from "./${contextPath}"; | ||
${contextPath | ||
? `import { ${(0, case_1.pascal)(prefix)}Context } from "./${contextPath}";` | ||
: ""} | ||
@@ -19,3 +21,3 @@ export type ${(0, case_1.pascal)(prefix)}FetcherOptions<TBody, THeaders, TQueryParams, TPathParams> = { | ||
pathParams?: TPathParams; | ||
} & ${(0, case_1.pascal)(prefix)}Context["fetcherOptions"]; | ||
}${contextPath ? ` & ${(0, case_1.pascal)(prefix)}Context["fetcherOptions"];` : ""} | ||
@@ -22,0 +24,0 @@ export async function ${(0, case_1.camel)(prefix)}Fetch< |
{ | ||
"name": "@openapi-codegen/typescript", | ||
"version": "1.0.0", | ||
"version": "1.1.0", | ||
"description": "OpenAPI Codegen typescript generators", | ||
@@ -44,3 +44,3 @@ "main": "lib/index.js", | ||
}, | ||
"gitHead": "a1eaff80e3f59d02816e1bbfa3c601eaad3d2388" | ||
"gitHead": "894978115e2235dc5b57665459e3896f82667d69" | ||
} |
@@ -103,2 +103,8 @@ # OpenAPI Codegen typescript | ||
### generateFetchers | ||
Generate some generic fetchers, `{filenamePrefix}Fetcher.ts` can be customized to fit your needs. | ||
`{filenamePrefix}Components.ts` will use this fetcher with the OpenAPI types passed as generic. | ||
## Utils | ||
@@ -105,0 +111,0 @@ |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
155327
80
1952
202