Skip to content

Commit 621265f

Browse files
committed
feat(writers): gesture directory
1 parent 60810aa commit 621265f

File tree

6 files changed

+68
-34
lines changed

6 files changed

+68
-34
lines changed

src/core/writers/singleMode.ts

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
1-
import {writeFileSync} from 'fs';
1+
import {camel} from 'case';
2+
import {existsSync, mkdirSync, writeFileSync} from 'fs';
23
import {OutputOptions} from '../../types';
34
import {WriteSpecsProps} from '../../types/writers';
5+
import {getFileInfo} from '../../utils/file';
46
import {isObject, isString} from '../../utils/is';
57
import {getFilesHeader} from '../../utils/messages/inline';
68
import {generateImports} from '../generators/imports';
@@ -14,7 +16,15 @@ export const writeSingleMode = ({
1416
info,
1517
output
1618
}: WriteSpecsProps & {output: string | OutputOptions}) => {
17-
const path = (isString(output) ? output : output?.target) || '';
19+
const {path, dirname} = getFileInfo(
20+
isString(output) ? output : output.target,
21+
camel(info.title)
22+
);
23+
24+
if (!existsSync(dirname)) {
25+
mkdirSync(dirname);
26+
}
27+
1828
const {
1929
definition,
2030
imports,

src/core/writers/specs.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import {Options, OutputMode} from '../../types';
1+
import {Options, OutputMode, OutputOptions} from '../../types';
22
import {WriteSpecsProps} from '../../types/writers';
33
import {isObject, isString} from '../../utils/is';
44
import {createSuccessMessage} from '../../utils/messages/logs';
@@ -7,6 +7,9 @@ import {writeSingleMode} from './singleMode';
77
import {writeSplitMode} from './splitMode';
88
import {writeTagsMode} from './tagsMode';
99

10+
const isSingleMode = (output: string | OutputOptions): output is string =>
11+
isString(output) || !output.mode || output.mode === OutputMode.SINGLE;
12+
1013
export const writeSpecs = (options: Options, backend?: string) => ({
1114
operations,
1215
schemas,
@@ -27,7 +30,7 @@ export const writeSpecs = (options: Options, backend?: string) => ({
2730
return;
2831
}
2932

30-
if (isString(output) || !output.mode || output.mode === OutputMode.SINGLE) {
33+
if (isSingleMode(output)) {
3134
writeSingleMode({operations, output, info, schemas});
3235
} else if (output.mode === OutputMode.SPLIT) {
3336
writeSplitMode({operations, output, info, schemas});

src/core/writers/splitMode.ts

Lines changed: 17 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
1-
import {pascal} from 'case';
2-
import {writeFileSync} from 'fs';
3-
import {basename, dirname, join} from 'path';
1+
import {camel, pascal} from 'case';
2+
import {existsSync, mkdirSync, writeFileSync} from 'fs';
3+
import {join} from 'path';
44
import {OutputOptions} from '../../types';
55
import {WriteSpecsProps} from '../../types/writers';
6+
import {getFileInfo} from '../../utils/file';
67
import {getFilesHeader} from '../../utils/messages/inline';
78
import {generateImports} from '../generators/imports';
89
import {generateModelsInline} from '../generators/modelsInline';
@@ -15,7 +16,15 @@ export const writeSplitMode = ({
1516
info,
1617
output
1718
}: WriteSpecsProps & {output: OutputOptions}) => {
18-
const path = output.target!;
19+
const {path, filename, dirname, extension} = getFileInfo(
20+
output.target,
21+
camel(info.title)
22+
);
23+
24+
if (!existsSync(dirname)) {
25+
mkdirSync(dirname);
26+
}
27+
1928
const {
2029
definition,
2130
imports,
@@ -29,9 +38,6 @@ export const writeSplitMode = ({
2938
let implementationData = header;
3039
let mockData = header;
3140

32-
const filename = basename(path, '.ts');
33-
const dir = dirname(path);
34-
3541
definitionData += "import { AxiosPromise } from 'axios'\n";
3642

3743
const definitionPath = './' + filename + '.definition';
@@ -54,7 +60,7 @@ export const writeSplitMode = ({
5460
const schemasPath = './' + filename + '.schemas';
5561
const schemasData = header + generateModelsInline(schemas);
5662

57-
writeFileSync(join(dir, schemasPath + '.ts'), schemasData);
63+
writeFileSync(join(dirname, schemasPath + extension), schemasData);
5864

5965
definitionData += generateImports(imports, schemasPath, true);
6066
implementationData += generateImports(imports, schemasPath, true);
@@ -66,11 +72,11 @@ export const writeSplitMode = ({
6672
mockData += implementationMocks;
6773

6874
if (path) {
69-
writeFileSync(join(dir, definitionPath + '.ts'), definitionData);
70-
writeFileSync(join(dir, filename + '.ts'), implementationData);
75+
writeFileSync(join(dirname, definitionPath + extension), definitionData);
76+
writeFileSync(join(dirname, filename + extension), implementationData);
7177

7278
if (output.mock) {
73-
writeFileSync(join(dir, filename + '.mock.ts'), mockData);
79+
writeFileSync(join(dirname, filename + '.mock' + extension), mockData);
7480
}
7581
}
7682
};

src/core/writers/tagsMode.ts

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,15 @@
1-
import {kebab, pascal} from 'case';
2-
import {writeFileSync} from 'fs';
1+
import {camel, kebab, pascal} from 'case';
2+
import {existsSync, mkdirSync, writeFileSync} from 'fs';
33
import {InfoObject} from 'openapi3-ts';
4-
import {basename, dirname, join} from 'path';
4+
import {join} from 'path';
55
import {OutputOptions} from '../../types';
66
import {
77
GeneratorOperation,
88
GeneratorOperations,
99
GeneratorTarget
1010
} from '../../types/generator';
1111
import {WriteSpecsProps} from '../../types/writers';
12+
import {getFileInfo} from '../../utils/file';
1213
import {generalTypesFilter} from '../../utils/filters';
1314
import {isObject} from '../../utils/is';
1415
import {getFilesHeader} from '../../utils/messages/inline';
@@ -89,11 +90,16 @@ export const writeTagsMode = ({
8990
info,
9091
output
9192
}: WriteSpecsProps & {output: OutputOptions}) => {
92-
const path = output.target!;
93-
const target = generateTarget(operations, info);
93+
const {path, filename, dirname, extension} = getFileInfo(
94+
output.target,
95+
camel(info.title)
96+
);
97+
98+
if (!existsSync(dirname)) {
99+
mkdirSync(dirname);
100+
}
94101

95-
const filename = basename(path, '.ts');
96-
const dir = dirname(path);
102+
const target = generateTarget(operations, info);
97103

98104
Object.entries(target).forEach(([tag, target]) => {
99105
const {definition, imports, implementation, implementationMocks} = target;
@@ -110,7 +116,7 @@ export const writeTagsMode = ({
110116
const schemasPath = './' + filename + '.schemas';
111117
const schemasData = header + generateModelsInline(schemas);
112118

113-
writeFileSync(join(dir, schemasPath + '.ts'), schemasData);
119+
writeFileSync(join(dirname, schemasPath + extension), schemasData);
114120

115121
data += generateImports(imports, schemasPath, true);
116122
}
@@ -125,6 +131,6 @@ export const writeTagsMode = ({
125131
data += implementationMocks;
126132
}
127133

128-
writeFileSync(join(dir, `${filename}.${kebab(tag)}.ts`), data);
134+
writeFileSync(join(dirname, `${filename}.${kebab(tag)}${extension}`), data);
129135
});
130136
};

src/utils/file.ts

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
import {basename, dirname, join} from 'path';
2+
import {isDirectory} from './is';
3+
4+
export const getFileInfo = (target: string = '', backupFilename: string) => {
5+
const isDir = isDirectory(target);
6+
const extension = '.ts';
7+
const path = isDir ? join(target, backupFilename + extension) : target;
8+
const dir = dirname(path);
9+
const filename = basename(path, '.ts');
10+
11+
return {
12+
path,
13+
extension,
14+
isDirectory: isDir,
15+
dirname: dir,
16+
filename
17+
};
18+
};

src/utils/is.ts

Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
import {existsSync, lstatSync} from 'fs';
21
import {ReferenceObject} from 'openapi3-ts';
32
import {extname} from 'path';
43

@@ -11,15 +10,7 @@ export const isReference = (property: any): property is ReferenceObject => {
1110
return Boolean(property.$ref);
1211
};
1312

14-
export const isDirectory = async (path: string) => {
15-
if (path.endsWith('/')) {
16-
return true;
17-
}
18-
19-
if (existsSync(path)) {
20-
return lstatSync(path).isDirectory();
21-
}
22-
13+
export const isDirectory = (path: string) => {
2314
return !extname(path);
2415
};
2516

0 commit comments

Comments
 (0)