Skip to content

Commit e978e98

Browse files
authored
Release 4.0.5 (#135)
* BREAKING_CHANGE: remove prettier-plugin-organize-imports dependency * bump: up project version to 4.0.5
1 parent 8c7ce99 commit e978e98

File tree

10 files changed

+245
-136
lines changed

10 files changed

+245
-136
lines changed

CHANGELOG.md

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

3+
# 4.0.5
4+
5+
BREAKING_CHANGE:
6+
- remove `'prettier-plugin-organize-imports'` dependency from package
7+
8+
Fixes:
9+
- issue #134 (Thanks @mrfratello)
10+
311
# 4.0.4
412

513
Features:

index.d.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -251,7 +251,7 @@ export interface GenerateApiConfiguration {
251251

252252
export interface GenerateApiOutput {
253253
configuration: GenerateApiConfiguration;
254-
files: { name: string; content: string; declaration?: string }[];
254+
files: { name: string; content: string; declaration: { name: string; content: string } | null }[];
255255
}
256256

257257
export declare function generateApi(

package-lock.json

Lines changed: 2 additions & 18 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "swagger-typescript-api",
3-
"version": "4.0.4",
3+
"version": "4.0.5",
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",
@@ -50,7 +50,6 @@
5050
"lodash": "^4.17.20",
5151
"nanoid": "^3.1.20",
5252
"prettier": "^2.2.1",
53-
"prettier-plugin-organize-imports": "^1.1.1",
5453
"swagger-schema-official": "2.0.0-bab6bed",
5554
"swagger2openapi": "^7.0.4",
5655
"typescript": "^4.1.3"

src/config.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
const constants = require("./constants");
2+
13
const config = {
24
/** CLI flag */
35
templates: "../templates/default",
@@ -34,6 +36,7 @@ const config = {
3436
httpClient: "http-client",
3537
outOfModuleApi: "Common",
3638
},
39+
prettierOptions: constants.PRETTIER_OPTIONS,
3740
hooks: {
3841
onCreateComponent: (schema) => schema,
3942
onParseSchema: (originalSchema, parsedSchema) => parsedSchema,

src/formatFileContent.js

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
const _ = require("lodash");
2+
const prettier = require("prettier");
3+
const { config } = require("./config");
4+
const ts = require("typescript");
5+
6+
class LanguageServiceHost {
7+
constructor(fileName, content) {
8+
const tsconfig = ts.findConfigFile(fileName, ts.sys.fileExists);
9+
10+
Object.assign(this, {
11+
fileName,
12+
content,
13+
compilerOptions: tsconfig
14+
? ts.convertCompilerOptionsFromJson(
15+
ts.readConfigFile(tsconfig, ts.sys.readFile).config.compilerOptions,
16+
).options
17+
: ts.getDefaultCompilerOptions(),
18+
});
19+
}
20+
21+
getNewLine = () => "\n";
22+
getScriptFileNames = () => [this.fileName];
23+
getCompilationSettings = () => this.compilerOptions;
24+
getDefaultLibFileName = () => ts.getDefaultLibFileName(this.getCompilationSettings());
25+
getCurrentDirectory = () => process.cwd();
26+
getScriptVersion = () => ts.version;
27+
getScriptSnapshot = () => ts.ScriptSnapshot.fromString(this.content);
28+
}
29+
30+
const removeUnusedImports = (content) => {
31+
const tempFileName = "file.ts";
32+
33+
const host = new LanguageServiceHost(tempFileName, content);
34+
const languageService = ts.createLanguageService(host);
35+
36+
const fileTextChanges = languageService.organizeImports(
37+
{ type: "file", fileName: tempFileName },
38+
{ newLineCharacter: ts.sys.newLine },
39+
)[0];
40+
41+
if (fileTextChanges && fileTextChanges.textChanges.length) {
42+
return _.reduceRight(
43+
fileTextChanges.textChanges,
44+
(content, { span, newText }) =>
45+
`${content.slice(0, span.start)}${newText}${content.slice(span.start + span.length)}`,
46+
content,
47+
);
48+
}
49+
50+
return content;
51+
};
52+
53+
const prettierFormat = (content) => {
54+
return prettier.format(content, config.prettierOptions);
55+
};
56+
57+
const formatters = [removeUnusedImports, prettierFormat];
58+
59+
module.exports = (content) =>
60+
formatters.reduce((fixedContent, formatter) => formatter(fixedContent), content);

src/index.js

Lines changed: 24 additions & 107 deletions
Original file line numberDiff line numberDiff line change
@@ -6,28 +6,27 @@
66
// License text available at https://opensource.org/licenses/MIT
77
// Repository https://github.com/acacode/swagger-typescript-api
88

9-
const prettier = require("prettier");
109
const _ = require("lodash");
1110
const { parseSchemas } = require("./schema");
1211
const { parseRoutes, groupRoutes } = require("./routes");
1312
const { createApiConfig } = require("./apiConfig");
1413
const { prepareModelType } = require("./modelTypes");
1514
const { getSwaggerObject, fixSwaggerScheme, convertSwaggerObject } = require("./swagger");
1615
const { createComponentsMap, filterComponentsMap } = require("./components");
17-
const { createFile, getFileContent, pathIsExist } = require("./files");
16+
const { createFile, pathIsExist } = require("./files");
1817
const { addToConfig, config } = require("./config");
19-
const { getTemplates, renderTemplate } = require("./templates");
18+
const { getTemplates } = require("./templates");
2019
const constants = require("./constants");
21-
const { classNameCase } = require("./render/utils");
20+
const { generateOutputFiles } = require("./output");
2221

2322
module.exports = {
2423
generateApi: ({
2524
input,
2625
output,
2726
url,
2827
spec,
29-
name,
30-
toJS,
28+
name: fileName,
29+
toJS: translateToJavaScript,
3130
modular,
3231
templates,
3332
generateResponses = config.generateResponses,
@@ -52,6 +51,7 @@ module.exports = {
5251
templates,
5352
generateUnionEnums,
5453
moduleNameIndex,
54+
prettierOptions,
5555
modular,
5656
extractRequestParams,
5757
hooks: _.merge(config.hooks, rawHooks || {}),
@@ -99,119 +99,36 @@ module.exports = {
9999
hasQueryRoutes,
100100
generateResponses,
101101
routes: groupRoutes(routes),
102+
extraTemplates,
103+
fileName,
104+
translateToJavaScript,
102105
utils: {
103106
...require("./render/utils"),
104107
...require("./common"),
105108
},
106109
};
107110

108-
const prettierFormat = (content) => prettier.format(content, prettierOptions);
109-
110111
const configuration = config.hooks.onPrepareConfig(rawConfiguration) || rawConfiguration;
111112

112-
const files = modular
113-
? [
114-
templatesToRender.dataContracts && {
115-
name: `${config.fileNames.dataContracts}.ts`,
116-
content: renderTemplate(templatesToRender.dataContracts, configuration),
117-
},
118-
configuration.config.generateRouteTypes &&
119-
templatesToRender.routeTypes && {
120-
name: `${config.fileNames.routeTypes}.ts`,
121-
content: renderTemplate(templatesToRender.routeTypes, configuration),
122-
},
123-
configuration.config.generateClient &&
124-
templatesToRender.httpClient && {
125-
name: `${config.fileNames.httpClient}.ts`,
126-
content: renderTemplate(templatesToRender.httpClient, configuration),
127-
},
128-
configuration.config.generateClient &&
129-
templatesToRender.api &&
130-
configuration.routes.$outOfModule && {
131-
name: `${config.fileNames.outOfModuleApi}.ts`,
132-
content: renderTemplate(templatesToRender.api, {
133-
...configuration,
134-
route: configuration.routes.$outOfModule,
135-
}),
136-
},
137-
...(configuration.config.generateClient && templatesToRender.api
138-
? _.reduce(
139-
configuration.routes.combined,
140-
(apis, route) => [
141-
...apis,
142-
{
143-
name: `${classNameCase(route.moduleName)}.ts`,
144-
content: renderTemplate(templatesToRender.api, {
145-
...configuration,
146-
route,
147-
}),
148-
},
149-
],
150-
[],
151-
)
152-
: []),
153-
].filter(Boolean)
154-
: [
155-
{
156-
name: name,
157-
content: [
158-
templatesToRender.dataContracts &&
159-
renderTemplate(templatesToRender.dataContracts, configuration),
160-
configuration.config.generateRouteTypes &&
161-
templatesToRender.routeTypes &&
162-
renderTemplate(templatesToRender.routeTypes, configuration),
163-
configuration.config.generateClient &&
164-
templatesToRender.httpClient &&
165-
renderTemplate(templatesToRender.httpClient, configuration),
166-
configuration.config.generateClient &&
167-
templatesToRender.api &&
168-
renderTemplate(templatesToRender.api, configuration),
169-
]
170-
.filter(Boolean)
171-
.join("\n"),
172-
},
173-
];
174-
175-
if (extraTemplates) {
176-
extraTemplates.forEach((extraTemplate) => {
177-
files.push({
178-
name: `${extraTemplate.name}.ts`,
179-
content: renderTemplate(getFileContent(extraTemplate.path), configuration),
180-
});
181-
});
182-
}
113+
const files = generateOutputFiles({
114+
modular,
115+
templatesToRender,
116+
configuration,
117+
});
183118

184119
const generatedFiles = files.map((file) => {
185-
if (toJS) {
186-
const { sourceFile, declarationFile } = require("./translators/JavaScript").translate(
187-
file.name,
188-
file.content,
189-
);
190-
191-
sourceFile.content = prettierFormat(sourceFile.content);
192-
declarationFile.content = prettierFormat(declarationFile.content);
193-
194-
if (pathIsExist(output)) {
195-
createFile(output, sourceFile.name, sourceFile.content);
196-
createFile(output, declarationFile.name, declarationFile.content);
197-
console.log(`✔️ your javascript api file created in "${output}"`);
198-
}
199-
200-
return {
201-
name: file.name,
202-
content: sourceFile.content,
203-
declaration: declarationFile.content,
204-
};
205-
} else {
206-
file.content = prettierFormat(file.content);
207-
208-
if (pathIsExist(output)) {
209-
createFile(output, file.name, file.content);
210-
console.log(`✔️ your typescript api file created in "${output}"`);
211-
}
120+
if (!pathIsExist(output)) return file;
212121

213-
return file;
122+
if (translateToJavaScript) {
123+
createFile(output, file.name, file.content);
124+
createFile(output, file.declaration.name, file.declaration.content);
125+
console.log(`✔️ your javascript api file created in "${output}"`);
126+
} else {
127+
createFile(output, file.name, file.content);
128+
console.log(`✔️ your typescript api file created in "${output}"`);
214129
}
130+
131+
return file;
215132
});
216133

217134
resolve({

0 commit comments

Comments
 (0)