Skip to content

Commit 7d38f20

Browse files
authored
Release 6.3.0 (#196)
* feat: --type-suffix, --type-prefix options (issue #191, thanks @the-ult); feat: onFormatTypeName hook * bump: up version to 6.3.0
1 parent c9753aa commit 7d38f20

File tree

15 files changed

+30033
-34
lines changed

15 files changed

+30033
-34
lines changed

CHANGELOG.md

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,16 @@
11
# next release
22

3+
# 6.3.0
4+
5+
Features:
6+
- `--type-suffix` option. Allows to set suffix for data contract name. (issue #191, thanks @the-ult)
7+
- `--type-prefix` option. Allows to set prefix for data contract name. (issue #191, thanks @the-ult)
8+
Examples [here](./spec/typeSuffixPrefix/schema.ts)
9+
- `onFormatTypeName(usageTypeName, rawTypeName)` hook. Allow to format data contract names as you want.
10+
11+
Internal:
12+
- rename and split `checkAndRenameModelName` -> `formatModelName`, `fixModelName`
13+
314
# 6.2.1
415

516
Fixes:

README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,8 @@ Options:
6060
--single-http-client Ability to send HttpClient instance to Api constructor (default: false)
6161
--silent Output only errors to console (default: false)
6262
--default-response <type> default type for empty response schema (default: "void")
63+
--type-prefix <string> data contract name prefix (default: "")
64+
--type-suffix <string> data contract name suffix (default: "")
6365
-h, --help display help for command
6466
```
6567

index.d.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,7 @@ interface GenerateApiParams {
115115
onCreateRequestParams?: (
116116
rawType: SchemaComponent["rawTypeData"],
117117
) => SchemaComponent["rawTypeData"] | void;
118+
onFormatTypeName?: (typeName: string, rawTypeName?: string) => string | void;
118119
}>;
119120
/**
120121
* extra templates

index.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,8 @@ program
6767
.option("--single-http-client", "Ability to send HttpClient instance to Api constructor", false)
6868
.option("--silent", "Output only errors to console", false)
6969
.option("--default-response <type>", "default type for empty response schema", TS_KEYWORDS.VOID)
70+
.option("--type-prefix <string>", "data contract name prefix", "")
71+
.option("--type-suffix <string>", "data contract name suffix", "")
7072
.option(
7173
"--clean-output",
7274
"clean output folder before generate api. WARNING: May cause data loss",
@@ -97,6 +99,8 @@ const {
9799
singleHttpClient,
98100
axios,
99101
silent,
102+
typePrefix,
103+
typeSuffix,
100104
} = program;
101105

102106
generateApi({
@@ -122,4 +126,6 @@ generateApi({
122126
singleHttpClient: !!singleHttpClient,
123127
cleanOutput: !!cleanOutput,
124128
silent: !!silent,
129+
typePrefix,
130+
typeSuffix,
125131
});

package-lock.json

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "swagger-typescript-api",
3-
"version": "6.2.1",
3+
"version": "6.3.0",
44
"description": "Create typescript api module from swagger schema",
55
"scripts": {
66
"cli:json": "node index.js -r -d -p ./swagger-test-cli.json -n swagger-test-cli.ts --extract-request-params --enum-names-as-values",
@@ -34,6 +34,7 @@
3434
"test:--js--axios": "node tests/spec/jsAxios/test.js",
3535
"test:--axios": "node tests/spec/axios/test.js",
3636
"test:--axios--single-http-client": "node tests/spec/axiosSingleHttpClient/test.js",
37+
"test:--type-suffix--type-prefix": "node tests/spec/typeSuffixPrefix/test.js",
3738
"test:partialBaseTemplate": "node tests/spec/partialBaseTemplate/test.js",
3839
"test:partialDefaultTemplate": "node tests/spec/partialDefaultTemplate/test.js"
3940
},

src/config.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ const config = {
4949
onPrepareConfig: (apiConfig) => apiConfig,
5050
onCreateRequestParams: (rawType) => {},
5151
onCreateRouteName: () => {},
52+
onFormatTypeName: (typeName, rawTypeName) => {},
5253
},
5354
defaultResponseType: TS_KEYWORDS.VOID,
5455
singleHttpClient: false,
@@ -69,6 +70,8 @@ const config = {
6970
templatesToRender: {},
7071
toJS: false,
7172
silent: false,
73+
typePrefix: "",
74+
typeSuffix: "",
7275
};
7376

7477
/** needs to use data everywhere in project */

src/index.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,8 @@ module.exports = {
4747
disableStrictSSL = config.disableStrictSSL,
4848
cleanOutput,
4949
silent = config.silent,
50+
typePrefix = config.typePrefix,
51+
typeSuffix = config.typeSuffix,
5052
}) =>
5153
new Promise((resolve, reject) => {
5254
addToConfig({
@@ -71,6 +73,8 @@ module.exports = {
7173
constants,
7274
silent,
7375
toJS: translateToJavaScript,
76+
typePrefix,
77+
typeSuffix,
7478
});
7579
(spec ? convertSwaggerObject(spec) : getSwaggerObject(input, url, disableStrictSSL))
7680
.then(({ usageSchema, originalSchema }) => {

src/modelNames.js

Lines changed: 30 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -5,21 +5,7 @@ const isValidName = (name) => /^([A-Za-z$_]{1,})$/g.test(name);
55

66
const formattedModelNamesMap = new Map();
77

8-
const checkAndRenameModelName = (name) => {
9-
if (typeof name !== "string") {
10-
if (!config.silent) console.warn("🔨 wrong name of the model name", name, config.silent);
11-
12-
return name;
13-
}
14-
15-
if (formattedModelNamesMap.has(name)) {
16-
return formattedModelNamesMap.get(name);
17-
}
18-
19-
if (/^([A-Z_]{1,})$/g.test(name)) {
20-
return name;
21-
}
22-
8+
const fixModelName = (name) => {
239
if (!isValidName(name)) {
2410
if (!/^[a-zA-Z_$]/g.test(name)) {
2511
name = `Type ${name}`;
@@ -37,14 +23,39 @@ const checkAndRenameModelName = (name) => {
3723
if (name.includes("-")) name = _.startCase(name).replace(/ /g, "");
3824
}
3925

40-
const formattedModelName = _.replace(_.startCase(name), /\s/g, "");
26+
return name;
27+
};
28+
29+
const formatModelName = (name) => {
30+
if (typeof name !== "string") {
31+
if (!config.silent) console.warn("🔨 wrong name of the model name", name);
32+
33+
return name;
34+
}
35+
36+
if (/^([A-Z_]{1,})$/g.test(name)) {
37+
return name;
38+
}
39+
40+
if (formattedModelNamesMap.has(name)) {
41+
return formattedModelNamesMap.get(name);
42+
}
43+
44+
const fixedModelName = fixModelName(name);
45+
46+
const formattedModelName = _.replace(
47+
_.startCase(`${config.typePrefix}_${fixedModelName}_${config.typeSuffix}`),
48+
/\s/g,
49+
"",
50+
);
51+
const modelName = config.hooks.onFormatTypeName(formattedModelName, name) || formattedModelName;
4152

42-
formattedModelNamesMap.set(name, formattedModelName);
53+
formattedModelNamesMap.set(name, modelName);
4354

44-
return formattedModelName;
55+
return modelName;
4556
};
4657

4758
module.exports = {
48-
checkAndRenameModelName,
59+
formatModelName: formatModelName,
4960
isValidName,
5061
};

src/modelTypes.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
const { formatters } = require("./typeFormatters");
2-
const { checkAndRenameModelName } = require("./modelNames");
2+
const { formatModelName } = require("./modelNames");
33
const { config } = require("./config");
44
const { getTypeData } = require("./components");
55

@@ -12,7 +12,7 @@ const prepareModelType = (typeInfo) => {
1212
}
1313

1414
const resultContent = formatters[type] ? formatters[type](content) : content;
15-
const name = checkAndRenameModelName(originalName);
15+
const name = formatModelName(originalName);
1616

1717
return {
1818
typeIdentifier,

src/routes.js

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ const {
66
getInlineParseContent,
77
checkAndAddNull,
88
} = require("./schema");
9-
const { checkAndRenameModelName } = require("./modelNames");
9+
const { formatModelName } = require("./modelNames");
1010
const {
1111
DEFAULT_BODY_ARG_NAME,
1212
SUCCESS_RESPONSE_STATUS_RANGE,
@@ -49,15 +49,15 @@ const getTypeFromRequestInfo = ({ requestInfo, parsedSchemas, operationId, defau
4949
const content = getInlineParseContent(schema, "none");
5050
const foundedSchemaByName = _.find(
5151
parsedSchemas,
52-
(parsedSchema) => checkAndRenameModelName(parsedSchema.name) === content,
52+
(parsedSchema) => formatModelName(parsedSchema.name) === content,
5353
);
5454
const foundSchemaByContent = _.find(parsedSchemas, (parsedSchema) =>
5555
_.isEqual(parsedSchema.content, content),
5656
);
5757

5858
const foundSchema = foundedSchemaByName || foundSchemaByContent;
5959

60-
return foundSchema ? checkAndRenameModelName(foundSchema.name) : content;
60+
return foundSchema ? formatModelName(foundSchema.name) : content;
6161
}
6262

6363
if (refTypeInfo) {
@@ -67,12 +67,12 @@ const getTypeFromRequestInfo = ({ requestInfo, parsedSchemas, operationId, defau
6767
// TODO:HACK fix problem of swagger2opeanpi
6868
const typeNameWithoutOpId = _.replace(refTypeInfo.typeName, operationId, "");
6969
if (_.find(parsedSchemas, (schema) => schema.name === typeNameWithoutOpId)) {
70-
return checkAndRenameModelName(typeNameWithoutOpId);
70+
return formatModelName(typeNameWithoutOpId);
7171
}
7272

7373
switch (refTypeInfo.componentName) {
7474
case "schemas":
75-
return checkAndRenameModelName(refTypeInfo.typeName);
75+
return formatModelName(refTypeInfo.typeName);
7676
case "responses":
7777
case "requestBodies":
7878
return getInlineParseContent(getSchemaFromRequestType(refTypeInfo.rawTypeData), "none");

src/schema.js

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
const _ = require("lodash");
22
const { inlineExtraFormatters } = require("./typeFormatters");
3-
const { isValidName, checkAndRenameModelName } = require("./modelNames");
3+
const { isValidName, formatModelName } = require("./modelNames");
44
const { formatDescription, internalCase } = require("./common");
55
const { JS_PRIMITIVE_TYPES, JS_EMPTY_TYPES, TS_KEYWORDS, SCHEMA_TYPES } = require("./constants");
66
const { config } = require("./config");
@@ -95,7 +95,7 @@ const getType = (schema) => {
9595
const refTypeInfo = getRefType(schema);
9696

9797
if (refTypeInfo) {
98-
return checkAndAddNull(schema, checkAndRenameModelName(refTypeInfo.typeName));
98+
return checkAndAddNull(schema, formatModelName(refTypeInfo.typeName));
9999
}
100100

101101
const primitiveType = getTypeAlias(schema);
@@ -230,15 +230,14 @@ const schemaParsers = {
230230

231231
if (enumNamesAsValues && _.size(enumNames)) {
232232
content = _.map(enumNames, (enumName, index) => ({
233-
key: checkAndRenameModelName(enumName),
233+
key: formatModelName(enumName),
234234
type: TS_KEYWORDS.STRING,
235235
value: `"${enumName}"`,
236236
}));
237237
} else if (_.size(enumNames) > _.size(schema.enum)) {
238238
content = _.map(enumNames, (enumName, index) => ({
239239
key:
240-
(enumNames && enumNames[index]) ||
241-
(isIntegerEnum ? enumName : checkAndRenameModelName(enumName)),
240+
(enumNames && enumNames[index]) || (isIntegerEnum ? enumName : formatModelName(enumName)),
242241
type: keyType,
243242
value: enumName === null ? enumName : isIntegerEnum ? `${enumName}` : `"${enumName}"`,
244243
}));
@@ -247,7 +246,7 @@ const schemaParsers = {
247246
const enumName = enumNames && enumNames[index];
248247

249248
return {
250-
key: enumName || (isIntegerEnum ? key : checkAndRenameModelName(key)),
249+
key: enumName || (isIntegerEnum ? key : formatModelName(key)),
251250
type: keyType,
252251
value: key === null ? key : isIntegerEnum ? `${key}` : `"${key}"`,
253252
};

0 commit comments

Comments
 (0)