Skip to content

Commit 9fb27fd

Browse files
authored
Merge pull request #14 from Q42/feature/esm-output
Feature/esm output
2 parents 92095c4 + 0469b50 commit 9fb27fd

File tree

6 files changed

+70
-40
lines changed

6 files changed

+70
-40
lines changed

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: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "openapi-typescript-validator",
3-
"version": "3.2.0",
3+
"version": "3.3.0",
44
"description": "Generate typescript with ajv validation based on openapi schemas",
55
"main": "dist/index.js",
66
"types": "dist/index.d.ts",

src/GenerateOptions.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,4 +71,9 @@ export interface GenerateOptions {
7171
* don't output decoder files
7272
*/
7373
skipDecoders?: boolean;
74+
75+
/**
76+
* when this option is enabled, standaloneOptions.validatorOutput is automatically set to "module"
77+
*/
78+
esm?: boolean;
7479
}

src/generate.ts

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,8 @@ export async function generate(options: GenerateOptions) {
5555
schema,
5656
options.addFormats ?? false,
5757
options.formatOptions,
58-
options.standalone.validatorOutput,
58+
options.esm ? "module" : options.standalone.validatorOutput,
59+
options.esm ?? false,
5960
directories,
6061
prettierOptions
6162
);
@@ -65,7 +66,8 @@ export async function generate(options: GenerateOptions) {
6566
schema,
6667
options.addFormats ?? false,
6768
options.formatOptions,
68-
options.standalone.validatorOutput,
69+
options.esm ? "module" : options.standalone.validatorOutput,
70+
options.esm ?? false,
6971
directories,
7072
prettierOptions
7173
);
@@ -81,7 +83,7 @@ export async function generate(options: GenerateOptions) {
8183
generateHelpers(prettierOptions, directories);
8284

8385
if (options.skipMetaFile !== true) {
84-
generateMetaFile(allDefinitions, directories, prettierOptions);
86+
generateMetaFile(allDefinitions, directories, prettierOptions, options.esm ?? false);
8587
}
8688

8789
console.info(`Successfully generated files for ${schemaFile}`);

src/generate/generate-meta.ts

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,21 @@
11
import { format, Options } from "prettier";
22
import { mkdirSync, writeFileSync } from "fs";
33
import path from "path";
4+
import { ValidatorOutput } from "../GenerateOptions";
45

56
export function generateMetaFile(
67
definitionNames: string[],
78
outDirs: string[],
8-
prettierOptions: Options
9+
prettierOptions: Options,
10+
esm: boolean
911
): void {
1012
const metas = definitionNames
1113
.map((definitionName) => {
1214
return `${definitionName}: info<${definitionName}>('${definitionName}', '#/definitions/${definitionName}'),`;
1315
})
1416
.join("\n");
1517

16-
const rawOutput = metaTemplate
18+
const rawOutput = metaTemplate(esm)
1719
.replace(/\$Definitions/g, metas)
1820
.replace(/\$ModelImports/g, definitionNames.join(", "))
1921

@@ -25,9 +27,11 @@ export function generateMetaFile(
2527
});
2628
}
2729

28-
const metaTemplate = `
30+
const metaTemplate = (esm: boolean) => {
31+
const importExtension = esm ? ".js" : "";
32+
return `
2933
/* eslint-disable */
30-
import { $ModelImports } from './models';
34+
import { $ModelImports } from './models${importExtension}';
3135
3236
export const schemaDefinitions = {
3337
$Definitions
@@ -41,4 +45,5 @@ export interface SchemaInfo<T> {
4145
function info<T>(definitionName: string, schemaRef: string): SchemaInfo<T> {
4246
return { definitionName, schemaRef };
4347
}
44-
`;
48+
`
49+
}

src/generate/generate-standalone-decoders.ts

Lines changed: 48 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import addFormats, { FormatsPluginOptions } from "ajv-formats";
55
import standaloneCode from "ajv/dist/standalone";
66
import { mkdirSync, writeFileSync } from "fs";
77
import * as path from "path";
8-
import { ValidatorOutput } from "../GenerateOptions";
8+
import { GenerateOptions, ValidatorOutput } from "../GenerateOptions";
99
import { createDecoderName, createValidatorName } from "./generation-utils";
1010

1111
export function generateStandaloneDecoders(
@@ -14,6 +14,7 @@ export function generateStandaloneDecoders(
1414
addFormats: boolean,
1515
formatOptions: FormatsPluginOptions | undefined,
1616
output: ValidatorOutput,
17+
esm: boolean,
1718
outDirs: string[],
1819
prettierOptions: Options
1920
): void {
@@ -32,12 +33,9 @@ export function generateStandaloneDecoders(
3233
prettierOptions
3334
);
3435

35-
const validatorImportStatement =
36-
output === "module"
37-
? `import { ${validatorName} } from './validator'`
38-
: `const { ${validatorName} } = require("./validator")`;
36+
const validatorImportStatement = createValidatorImportStatement(validatorName, output, false, esm);
3937

40-
let rawDecoderOutput = decoderFileTemplate
38+
let rawDecoderOutput = decoderFileTemplate(esm)
4139
.replace(/\$DecoderName/g, decoderName)
4240
.replace(/\$Class/g, definitionName)
4341
.replace(/\$ValidatorImports/g, validatorImportStatement)
@@ -51,7 +49,7 @@ export function generateStandaloneDecoders(
5149
);
5250

5351
indexExports.push(
54-
`export { ${decoderName} } from './${definitionName}/decoder';`
52+
`export { ${decoderName} } from './${definitionName}/decoder${esm ? ".js" : ""}';`
5553
);
5654

5755
outDirs.forEach((outDir) => {
@@ -91,6 +89,7 @@ export function generateStandaloneMergedDecoders(
9189
addFormats: boolean,
9290
formatOptions: FormatsPluginOptions | undefined,
9391
output: ValidatorOutput,
92+
esm: boolean,
9493
outDirs: string[],
9594
prettierOptions: Options
9695
) {
@@ -108,12 +107,9 @@ export function generateStandaloneMergedDecoders(
108107
.map((d) => createValidatorName(d))
109108
.join(", ");
110109

111-
const validatorImportStatement =
112-
output === "module"
113-
? `import { ${validatorImports} } from './validators';`
114-
: `const { ${validatorImports} } = require("./validators")`;
110+
const validatorImportStatement = createValidatorImportStatement(validatorImports, output, true, esm);
115111

116-
const rawDecoderOutput = mergedDecodersFileTemplate
112+
const rawDecoderOutput = mergedDecodersFileTemplate(esm)
117113
.replace(/\$ValidatorImports/g, validatorImportStatement)
118114
.replace(/\$ModelImports/g, definitionNames.join(", "))
119115
.replace(/\$Decoders/g, decoders);
@@ -150,6 +146,22 @@ export function generateStandaloneMergedDecoders(
150146
});
151147
}
152148

149+
150+
function createValidatorImportStatement(validatorImportString: string, output: ValidatorOutput, merged: boolean, esm: boolean) {
151+
const fileName = merged ? 'validators' : 'validator';
152+
switch (output) {
153+
case 'commonjs':
154+
return `const { ${validatorImportString} } = require("./${fileName}")`
155+
case 'module':
156+
if (esm) {
157+
return `import { ${validatorImportString} } from './${fileName}.js'`
158+
} else {
159+
return `import { ${validatorImportString} } from './${fileName}'`
160+
}
161+
}
162+
}
163+
164+
153165
function standAloneValidatorOutput(
154166
schema: ParsedSchema,
155167
definitions: string[],
@@ -223,30 +235,36 @@ export const $DecoderName: Decoder<$Class> = {
223235
}
224236
`;
225237

226-
const decoderFileTemplate = `
227-
/* eslint-disable */
238+
const decoderFileTemplate = (esm: boolean) => {
239+
const importExtension = esm ? ".js" : "";
240+
return `
241+
/* eslint-disable */
228242
229-
import { Decoder } from '../../helpers';
230-
import { validateJson, Validator } from '../../validate';
231-
import { $Class } from '../../models';
232-
$ValidatorImports
243+
import { Decoder } from '../../helpers${importExtension}';
244+
import { validateJson, Validator } from '../../validate${importExtension}';
245+
import { $Class } from '../../models${importExtension}';
246+
$ValidatorImports
233247
234-
${decoderTemplate}
235-
`;
248+
${decoderTemplate}
249+
`
250+
}
236251

237252
const decodersFileTemplate = `
238253
/* eslint-disable */
239254
240255
$Exports
241256
`;
242257

243-
const mergedDecodersFileTemplate = `
244-
/* eslint-disable */
245-
246-
import { Decoder } from './helpers';
247-
import { validateJson, Validator } from './validate';
248-
import { $ModelImports } from './models';
249-
$ValidatorImports
250-
251-
$Decoders
252-
`;
258+
const mergedDecodersFileTemplate = (esm: boolean) => {
259+
const importExtension = esm ? ".js" : "";
260+
return `
261+
/* eslint-disable */
262+
263+
import { Decoder } from './helpers${importExtension}';
264+
import { validateJson, Validator } from './validate${importExtension}';
265+
import { $ModelImports } from './models${importExtension}';
266+
$ValidatorImports
267+
268+
$Decoders
269+
`
270+
};

0 commit comments

Comments
 (0)