ts-runtime-validation 1.2.8 → 1.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. package/README.md +27 -1
  2. package/dist/SchemaGenerator.js +60 -1
  3. package/dist/SchemaGenerator.js.map +1 -1
  4. package/dist/SchemaGenerator.test.js +125 -0
  5. package/dist/SchemaGenerator.test.js.map +1 -0
  6. package/dist/test/basic-scenario/types.jsonschema.js +3 -0
  7. package/dist/test/basic-scenario/types.jsonschema.js.map +1 -0
  8. package/dist/test/duplicate-symbols-different-implementation/IBaseType.js +3 -0
  9. package/dist/test/duplicate-symbols-different-implementation/IBaseType.js.map +1 -0
  10. package/dist/test/duplicate-symbols-different-implementation/IBaseTypeDefinitionReplicated.js +3 -0
  11. package/dist/test/duplicate-symbols-different-implementation/IBaseTypeDefinitionReplicated.js.map +1 -0
  12. package/dist/test/duplicate-symbols-different-implementation/IBasicTypesA.jsonschema.js +3 -0
  13. package/dist/test/duplicate-symbols-different-implementation/IBasicTypesA.jsonschema.js.map +1 -0
  14. package/dist/test/duplicate-symbols-different-implementation/IBasicTypesB.jsonschema.js +3 -0
  15. package/dist/test/duplicate-symbols-different-implementation/IBasicTypesB.jsonschema.js.map +1 -0
  16. package/dist/test/duplicate-symbols-identitcal-implementation/IBaseType.js +3 -0
  17. package/dist/test/duplicate-symbols-identitcal-implementation/IBaseType.js.map +1 -0
  18. package/dist/test/duplicate-symbols-identitcal-implementation/IBaseTypeDefinitionReplicated.js +3 -0
  19. package/dist/test/duplicate-symbols-identitcal-implementation/IBaseTypeDefinitionReplicated.js.map +1 -0
  20. package/dist/test/duplicate-symbols-identitcal-implementation/IBasicTypesA.jsonschema.js +3 -0
  21. package/dist/test/duplicate-symbols-identitcal-implementation/IBasicTypesA.jsonschema.js.map +1 -0
  22. package/dist/test/duplicate-symbols-identitcal-implementation/IBasicTypesB.jsonschema.js +3 -0
  23. package/dist/test/duplicate-symbols-identitcal-implementation/IBasicTypesB.jsonschema.js.map +1 -0
  24. package/dist/test/output/basic-scenario/ValidationType.js +3 -0
  25. package/dist/test/output/basic-scenario/ValidationType.js.map +1 -0
  26. package/dist/test/output/basic-scenario/isValidSchema.js +39 -0
  27. package/dist/test/output/basic-scenario/isValidSchema.js.map +1 -0
  28. package/jest.config.js +10 -0
  29. package/package.json +14 -10
  30. package/src/SchemaGenerator.test.ts +118 -0
  31. package/src/SchemaGenerator.ts +72 -1
  32. package/src/test/basic-scenario/types.jsonschema.ts +4 -0
  33. package/src/test/duplicate-symbols-different-implementation/IBaseType.ts +3 -0
  34. package/src/test/duplicate-symbols-different-implementation/IBaseTypeDefinitionReplicated.ts +3 -0
  35. package/src/test/duplicate-symbols-different-implementation/IBasicTypesA.jsonschema.ts +6 -0
  36. package/src/test/duplicate-symbols-different-implementation/IBasicTypesB.jsonschema.ts +6 -0
  37. package/src/test/duplicate-symbols-identitcal-implementation/IBaseType.ts +3 -0
  38. package/src/test/duplicate-symbols-identitcal-implementation/IBaseTypeDefinitionReplicated.ts +3 -0
  39. package/src/test/duplicate-symbols-identitcal-implementation/IBasicTypesA.jsonschema.ts +6 -0
  40. package/src/test/duplicate-symbols-identitcal-implementation/IBasicTypesB.jsonschema.ts +6 -0
package/README.md CHANGED
@@ -11,6 +11,7 @@ This is a code generator that is designed to run as a yarn / npm script. By defa
11
11
  1. `./src/ts-runtime-validation/validation.schema.json` - containing the [jsonschema](http://json-schema.org/) types
12
12
  1. `./src/SchemaDefinition.ts` - containing the typescript.
13
13
  1. `./src/isValidSchema.ts` - containing a type guard type inferring helper method (intended for consumption in your code base - examples below)
14
+ 1. `./src/ValidationType.ts` - containing an exported namespace containing every single exported validation type
14
15
 
15
16
  ## Footnote
16
17
 
@@ -58,7 +59,9 @@ The intended use for ts-runtime-validation is as a npm script. Here it can also
58
59
  }
59
60
  ```
60
61
 
61
- ## Example usage of generated ts type validation
62
+ ## Example snippets
63
+
64
+ ### Type guard
62
65
 
63
66
  ```typescript
64
67
  import { isValidSchema } from "./.ts-runtime-validation/isValidSchema"; // this is autogenerated by the CLI as a helper file
@@ -71,6 +74,29 @@ if (isValidSchema(data, "#/definitions/ITypeA")) {
71
74
  }
72
75
  ```
73
76
 
77
+ ### Type assertion
78
+
79
+ ```
80
+ import * as schema from "../runtime-validation/validation.schema.json";
81
+ import Ajv from "ajv";
82
+ import { ISchema, schemas } from "../runtime-validation/SchemaDefinition";
83
+
84
+ const validator = new Ajv({ allErrors: true });
85
+ validator.compile(schema);
86
+
87
+ export const assertValidSchema = <T extends keyof typeof schemas>(data: unknown, schemaKeyRef: T): data is ISchema[T] => {
88
+ validator.validate(schemaKeyRef as string, data);
89
+ if (validator.errors || Boolean(validator.errors)) {
90
+ const error = { schemaKeyRef, errors: validator.errorsText(), data };
91
+ if (process.env.ENVIRONMENT === "dev") {
92
+ console.log(error);
93
+ }
94
+ throw new Error(JSON.stringify(error));
95
+ }
96
+ return true;
97
+ };
98
+ ```
99
+
74
100
  ## Contributing
75
101
 
76
102
  Submit a PR
@@ -42,6 +42,7 @@ const picomatch_1 = __importDefault(require("picomatch"));
42
42
  const path_1 = __importDefault(require("path"));
43
43
  const ts_morph_1 = require("ts-morph");
44
44
  const tsj = __importStar(require("ts-json-schema-generator"));
45
+ const assert_1 = __importDefault(require("assert"));
45
46
  const defaultTsMorphProjectSettings = {
46
47
  manipulationSettings: {
47
48
  indentationText: ts_morph_1.IndentationText.FourSpaces,
@@ -56,12 +57,14 @@ const defaultCreateFileOptions = {
56
57
  };
57
58
  const validationSchemaFileName = "validation.schema.json";
58
59
  const schemaDefinitionFileName = "SchemaDefinition.ts";
60
+ const validationInterfacesFile = "ValidationType.ts";
59
61
  class SchemaGenerator {
60
62
  constructor(options) {
61
63
  this.options = options;
62
64
  this.outputPath = path_1.default.join(this.options.rootPath, this.options.output);
63
65
  this.jsonSchemaOutputFile = path_1.default.join(this.options.rootPath, this.options.output, validationSchemaFileName);
64
66
  this.tsSchemaDefinitionOutputFile = path_1.default.join(this.options.rootPath, this.options.output, schemaDefinitionFileName);
67
+ this.validationTypesOutputFile = path_1.default.join(this.options.rootPath, this.options.output, validationInterfacesFile);
65
68
  this.isValidSchemaOutputFile = path_1.default.join(this.options.rootPath, this.options.output, "isValidSchema.ts");
66
69
  this.Generate = () => __awaiter(this, void 0, void 0, function* () {
67
70
  const { helpers, glob } = this.options;
@@ -83,6 +86,8 @@ class SchemaGenerator {
83
86
  }
84
87
  yield this.writeSchemaMapToValidationTypes(fileSchemas);
85
88
  this.writeValidatorFunction();
89
+ console.log("Writing validation types file");
90
+ this.writeValidationTypes(fileSchemas);
86
91
  });
87
92
  this.getMatchingFiles = () => __awaiter(this, void 0, void 0, function* () {
88
93
  const { glob, rootPath } = this.options;
@@ -126,7 +131,13 @@ class SchemaGenerator {
126
131
  const defs = (_a = fileSchema.definitions) !== null && _a !== void 0 ? _a : {};
127
132
  Object.keys(defs).forEach((key) => {
128
133
  if (definitions[key] !== undefined) {
129
- throw new Error(`Duplicate symbol: ${key} found`);
134
+ try {
135
+ assert_1.default.deepEqual(definitions[key], defs[key]);
136
+ }
137
+ catch (e) {
138
+ console.error(`Duplicate symbol: ${key} found with varying definitions.\nDefinition 1:\n${JSON.stringify(definitions[key], null, 4)}\nDefinition 2:\n${JSON.stringify(defs[key], null, 4)}`);
139
+ throw e;
140
+ }
130
141
  }
131
142
  const schema = defs[key];
132
143
  definitions[key] = schema;
@@ -235,6 +246,54 @@ class SchemaGenerator {
235
246
  });
236
247
  yield project.save();
237
248
  });
249
+ this.writeValidationTypes = (schemaMap) => __awaiter(this, void 0, void 0, function* () {
250
+ const project = new ts_morph_1.Project(defaultTsMorphProjectSettings);
251
+ const readerProject = new ts_morph_1.Project(defaultTsMorphProjectSettings);
252
+ const symbols = [];
253
+ const importMap = new Map();
254
+ schemaMap.forEach((schema, filePath) => {
255
+ var _a;
256
+ const dir = path_1.default.dirname(filePath);
257
+ const fileWithoutExtension = path_1.default.parse(filePath).name;
258
+ const relativeFilePath = path_1.default.relative(this.outputPath, dir);
259
+ const importPath = `${relativeFilePath}/${fileWithoutExtension}`;
260
+ const defs = (_a = schema.definitions) !== null && _a !== void 0 ? _a : {};
261
+ const readerSourceFile = readerProject.addSourceFileAtPath(filePath);
262
+ Object.keys(defs).forEach((symbol) => {
263
+ var _a;
264
+ const typeAlias = readerSourceFile.getTypeAlias(symbol);
265
+ const typeInterface = readerSourceFile.getInterface(symbol);
266
+ const hasTypeOrInterface = (typeAlias !== null && typeAlias !== void 0 ? typeAlias : typeInterface) !== undefined;
267
+ if (hasTypeOrInterface) {
268
+ const namedImports = (_a = importMap.get(importPath)) !== null && _a !== void 0 ? _a : [];
269
+ namedImports.push(symbol);
270
+ importMap.set(importPath, namedImports);
271
+ symbols.push(symbol);
272
+ }
273
+ });
274
+ });
275
+ const sourceFile = project.createSourceFile(this.validationTypesOutputFile, {}, defaultCreateFileOptions);
276
+ importMap.forEach((namedImports, importPath) => {
277
+ const declaration = sourceFile.addImportDeclaration({ moduleSpecifier: importPath });
278
+ namedImports.forEach((namedImport) => {
279
+ const name = namedImport.valueOf();
280
+ const alias = `_${name}`;
281
+ declaration.addNamedImport({ name, alias });
282
+ });
283
+ });
284
+ const namespace = sourceFile.addModule({
285
+ name: "ValidationType",
286
+ isExported: true,
287
+ });
288
+ importMap.forEach((namedImports) => {
289
+ namedImports.forEach((namedImport) => {
290
+ const name = namedImport.valueOf();
291
+ const alias = `_${name}`;
292
+ namespace.addTypeAlias({ name, type: alias, isExported: true });
293
+ });
294
+ });
295
+ yield project.save();
296
+ });
238
297
  }
239
298
  }
240
299
  exports.SchemaGenerator = SchemaGenerator;
@@ -1 +1 @@
1
- {"version":3,"file":"SchemaGenerator.js","sourceRoot":"","sources":["../src/SchemaGenerator.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"SchemaGenerator.js","sourceRoot":"","sources":["../src/SchemaGenerator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,125 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ var __importDefault = (this && this.__importDefault) || function (mod) {
12
+ return (mod && mod.__esModule) ? mod : { "default": mod };
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ const fs_1 = __importDefault(require("fs"));
16
+ const path_1 = __importDefault(require("path"));
17
+ const SchemaGenerator_1 = require("./SchemaGenerator");
18
+ const cleanupTestOutput = () => {
19
+ const outputDir = path_1.default.resolve(__dirname, "./test/output");
20
+ const doesDirectoryExist = fs_1.default.existsSync(outputDir);
21
+ if (doesDirectoryExist) {
22
+ fs_1.default.rmdirSync(outputDir, { recursive: true });
23
+ }
24
+ };
25
+ const getGeneratorConfig = (scenarioPath) => {
26
+ const options = {
27
+ glob: "*.jsonschema.ts",
28
+ rootPath: path_1.default.resolve(__dirname, `./test/${scenarioPath}`),
29
+ output: `../output/${scenarioPath}`,
30
+ helpers: true,
31
+ additionalProperties: false,
32
+ tsconfigPath: "",
33
+ };
34
+ return options;
35
+ };
36
+ const getOutputSchemaPath = (scenarioPath) => {
37
+ return path_1.default.resolve(__dirname, `./test/output/${scenarioPath}`, "validation.schema.json");
38
+ };
39
+ beforeAll(cleanupTestOutput);
40
+ afterAll(cleanupTestOutput);
41
+ describe("SchemaGenerator", () => {
42
+ test("it should generate the correct schema for a basic interface", () => __awaiter(void 0, void 0, void 0, function* () {
43
+ const scenarioPath = "basic-scenario";
44
+ const options = getGeneratorConfig(scenarioPath);
45
+ const generator = new SchemaGenerator_1.SchemaGenerator(options);
46
+ yield generator.Generate();
47
+ const rawFile = fs_1.default.readFileSync(getOutputSchemaPath(scenarioPath)).toString();
48
+ const result = JSON.parse(rawFile);
49
+ const expected = {
50
+ $schema: "http://json-schema.org/draft-07/schema#",
51
+ definitions: {
52
+ IBasicTypes: {
53
+ type: "object",
54
+ properties: {
55
+ propertyA: {
56
+ type: "string",
57
+ },
58
+ propertyB: {
59
+ type: "string",
60
+ },
61
+ },
62
+ required: ["propertyA", "propertyB"],
63
+ additionalProperties: false,
64
+ },
65
+ },
66
+ };
67
+ expect(result).toStrictEqual(expected);
68
+ }));
69
+ test("it should throw an error when there are different implementations of an interface", () => __awaiter(void 0, void 0, void 0, function* () {
70
+ const options = getGeneratorConfig("duplicate-symbols-different-implementation");
71
+ const generator = new SchemaGenerator_1.SchemaGenerator(options);
72
+ yield expect(generator.Generate()).rejects.toThrow();
73
+ }));
74
+ test("it should not an error when there are identical definitions interface", () => __awaiter(void 0, void 0, void 0, function* () {
75
+ const scenarioPath = "duplicate-symbols-identitcal-implementation";
76
+ const options = getGeneratorConfig(scenarioPath);
77
+ const generator = new SchemaGenerator_1.SchemaGenerator(options);
78
+ yield generator.Generate();
79
+ const rawFile = fs_1.default.readFileSync(getOutputSchemaPath(scenarioPath)).toString();
80
+ const result = JSON.parse(rawFile);
81
+ const expected = {
82
+ $schema: "http://json-schema.org/draft-07/schema#",
83
+ definitions: {
84
+ IBasicTypesA: {
85
+ type: "object",
86
+ properties: {
87
+ propertyA: {
88
+ $ref: "#/definitions/IBaseType",
89
+ },
90
+ propertyB: {
91
+ $ref: "#/definitions/IBaseType",
92
+ },
93
+ },
94
+ required: ["propertyA", "propertyB"],
95
+ additionalProperties: false,
96
+ },
97
+ IBaseType: {
98
+ type: "object",
99
+ properties: {
100
+ someProperty: {
101
+ type: "string",
102
+ },
103
+ },
104
+ required: ["someProperty"],
105
+ additionalProperties: false,
106
+ },
107
+ IBasicTypesB: {
108
+ type: "object",
109
+ properties: {
110
+ propertyA: {
111
+ $ref: "#/definitions/IBaseType",
112
+ },
113
+ propertyB: {
114
+ $ref: "#/definitions/IBaseType",
115
+ },
116
+ },
117
+ required: ["propertyA", "propertyB"],
118
+ additionalProperties: false,
119
+ },
120
+ },
121
+ };
122
+ expect(result).toStrictEqual(expected);
123
+ }));
124
+ });
125
+ //# sourceMappingURL=SchemaGenerator.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SchemaGenerator.test.js","sourceRoot":"","sources":["../src/SchemaGenerator.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=types.jsonschema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.jsonschema.js","sourceRoot":"","sources":["../../../src/test/basic-scenario/types.jsonschema.ts"],"names":[],"mappings":""}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=IBaseType.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IBaseType.js","sourceRoot":"","sources":["../../../src/test/duplicate-symbols-different-implementation/IBaseType.ts"],"names":[],"mappings":""}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=IBaseTypeDefinitionReplicated.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IBaseTypeDefinitionReplicated.js","sourceRoot":"","sources":["../../../src/test/duplicate-symbols-different-implementation/IBaseTypeDefinitionReplicated.ts"],"names":[],"mappings":""}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=IBasicTypesA.jsonschema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IBasicTypesA.jsonschema.js","sourceRoot":"","sources":["../../../src/test/duplicate-symbols-different-implementation/IBasicTypesA.jsonschema.ts"],"names":[],"mappings":""}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=IBasicTypesB.jsonschema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IBasicTypesB.jsonschema.js","sourceRoot":"","sources":["../../../src/test/duplicate-symbols-different-implementation/IBasicTypesB.jsonschema.ts"],"names":[],"mappings":""}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=IBaseType.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IBaseType.js","sourceRoot":"","sources":["../../../src/test/duplicate-symbols-identitcal-implementation/IBaseType.ts"],"names":[],"mappings":""}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=IBaseTypeDefinitionReplicated.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IBaseTypeDefinitionReplicated.js","sourceRoot":"","sources":["../../../src/test/duplicate-symbols-identitcal-implementation/IBaseTypeDefinitionReplicated.ts"],"names":[],"mappings":""}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=IBasicTypesA.jsonschema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IBasicTypesA.jsonschema.js","sourceRoot":"","sources":["../../../src/test/duplicate-symbols-identitcal-implementation/IBasicTypesA.jsonschema.ts"],"names":[],"mappings":""}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=IBasicTypesB.jsonschema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IBasicTypesB.jsonschema.js","sourceRoot":"","sources":["../../../src/test/duplicate-symbols-identitcal-implementation/IBasicTypesB.jsonschema.ts"],"names":[],"mappings":""}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=ValidationType.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ValidationType.js","sourceRoot":"","sources":["../../../../src/test/output/basic-scenario/ValidationType.ts"],"names":[],"mappings":""}
@@ -0,0 +1,39 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ var __importDefault = (this && this.__importDefault) || function (mod) {
26
+ return (mod && mod.__esModule) ? mod : { "default": mod };
27
+ };
28
+ Object.defineProperty(exports, "__esModule", { value: true });
29
+ exports.isValidSchema = exports.validator = void 0;
30
+ const schema = __importStar(require("./validation.schema.json"));
31
+ const ajv_1 = __importDefault(require("ajv"));
32
+ exports.validator = new ajv_1.default({ allErrors: true });
33
+ exports.validator.compile(schema);
34
+ const isValidSchema = (data, schemaKeyRef) => {
35
+ exports.validator.validate(schemaKeyRef, data);
36
+ return Boolean(exports.validator.errors) === false;
37
+ };
38
+ exports.isValidSchema = isValidSchema;
39
+ //# sourceMappingURL=isValidSchema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"isValidSchema.js","sourceRoot":"","sources":["../../../../src/test/output/basic-scenario/isValidSchema.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,iEAAmD;AACnD,8CAAsB;AAGT,QAAA,SAAS,GAAG,IAAI,aAAG,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;AAClD,iBAAS,CAAC,OAAO,CAAC,MAAM,CAAC,CAC5B;AAEM,MAAM,aAAa,GAAG,CAAiC,IAAa,EAAE,YAAe,EAAsB,EAAE;IAChH,iBAAS,CAAC,QAAQ,CAAC,YAAsB,EAAE,IAAI,CAAC,CAAC;IACjD,OAAO,OAAO,CAAC,iBAAS,CAAC,MAAM,CAAC,KAAK,KAAK,CAAC;AAC3C,CAAC,CACJ;AAJY,QAAA,aAAa,iBAIzB"}
package/jest.config.js ADDED
@@ -0,0 +1,10 @@
1
+ module.exports = {
2
+ collectCoverage: true,
3
+ collectCoverageFrom: ["**/*.{ts,tsx}", "!**/node_modules/**"],
4
+ roots: ["<rootDir>/src"],
5
+ testMatch: ["**/__tests__/**/*.+(ts|tsx)", "**/?(*.)+(test).+(ts|tsx)"],
6
+ transform: {
7
+ "^.+\\.(ts|tsx)$": "ts-jest",
8
+ },
9
+ testTimeout: 15000,
10
+ };
package/package.json CHANGED
@@ -1,28 +1,32 @@
1
1
  {
2
2
  "name": "ts-runtime-validation",
3
- "version": "1.2.8",
3
+ "version": "1.4.0",
4
4
  "author": "Matthew Duong <thegalah@gmail.com>",
5
5
  "license": "MIT",
6
6
  "dependencies": {
7
- "commander": "^9.1.0",
8
- "fdir": "^5.2.0",
7
+ "commander": "^9.5.0",
8
+ "fdir": "^5.3.0",
9
9
  "picomatch": "^2.3.1",
10
- "ts-json-schema-generator": "^1.0.0",
11
- "ts-morph": "^14.0.0"
10
+ "ts-json-schema-generator": "^1.2.0",
11
+ "ts-morph": "^17.0.1"
12
12
  },
13
13
  "bin": {
14
14
  "ts-runtime-validation": "dist/index.js"
15
15
  },
16
16
  "scripts": {
17
17
  "build": "tsc",
18
- "prettier": "prettier --write \"{src,web,.scripts}/**/*.{js,jsx,ts,tsx}\" \"*.{js,json,md,yml,yaml}\""
18
+ "prettier": "prettier --write \"{src,web,.scripts}/**/*.{js,jsx,ts,tsx}\" \"*.{js,json,md,yml,yaml}\"",
19
+ "test": "jest --silent --collectCoverage false"
19
20
  },
20
21
  "devDependencies": {
21
- "@types/node": "^17.0.24",
22
+ "@types/jest": "^29.2.5",
23
+ "@types/node": "^18.11.18",
22
24
  "@types/picomatch": "^2.3.0",
23
- "prettier": "^2.6.2",
24
- "ts-node": "^10.7.0",
25
- "typescript": "^4.6.3"
25
+ "jest": "^29.3.1",
26
+ "prettier": "^2.8.2",
27
+ "ts-jest": "^29.0.3",
28
+ "ts-node": "^10.9.1",
29
+ "typescript": "^4.9.4"
26
30
  },
27
31
  "description": "A set of tools to generate json-schema validations from typescript interface(s) and methods to validate unknown data at runtime against them",
28
32
  "main": "index.js",
@@ -0,0 +1,118 @@
1
+ import fs from "fs";
2
+ import path from "path";
3
+ import { ICommandOptions } from "./index";
4
+ import { SchemaGenerator } from "./SchemaGenerator";
5
+
6
+ const cleanupTestOutput = () => {
7
+ const outputDir = path.resolve(__dirname, "./test/output");
8
+ const doesDirectoryExist = fs.existsSync(outputDir);
9
+ if (doesDirectoryExist) {
10
+ fs.rmdirSync(outputDir, { recursive: true });
11
+ }
12
+ };
13
+
14
+ const getGeneratorConfig = (scenarioPath: string) => {
15
+ const options: ICommandOptions = {
16
+ glob: "*.jsonschema.ts",
17
+ rootPath: path.resolve(__dirname, `./test/${scenarioPath}`),
18
+ output: `../output/${scenarioPath}`,
19
+ helpers: true,
20
+ additionalProperties: false,
21
+ tsconfigPath: "",
22
+ };
23
+ return options;
24
+ };
25
+
26
+ const getOutputSchemaPath = (scenarioPath: string) => {
27
+ return path.resolve(__dirname, `./test/output/${scenarioPath}`, "validation.schema.json");
28
+ };
29
+
30
+ beforeAll(cleanupTestOutput);
31
+ afterAll(cleanupTestOutput);
32
+
33
+ describe("SchemaGenerator", () => {
34
+ test("it should generate the correct schema for a basic interface", async () => {
35
+ const scenarioPath = "basic-scenario";
36
+ const options = getGeneratorConfig(scenarioPath);
37
+ const generator = new SchemaGenerator(options);
38
+ await generator.Generate();
39
+ const rawFile = fs.readFileSync(getOutputSchemaPath(scenarioPath)).toString();
40
+ const result = JSON.parse(rawFile);
41
+ const expected = {
42
+ $schema: "http://json-schema.org/draft-07/schema#",
43
+ definitions: {
44
+ IBasicTypes: {
45
+ type: "object",
46
+ properties: {
47
+ propertyA: {
48
+ type: "string",
49
+ },
50
+ propertyB: {
51
+ type: "string",
52
+ },
53
+ },
54
+ required: ["propertyA", "propertyB"],
55
+ additionalProperties: false,
56
+ },
57
+ },
58
+ };
59
+ expect(result).toStrictEqual(expected);
60
+ });
61
+
62
+ test("it should throw an error when there are different implementations of an interface", async () => {
63
+ const options = getGeneratorConfig("duplicate-symbols-different-implementation");
64
+ const generator = new SchemaGenerator(options);
65
+ await expect(generator.Generate()).rejects.toThrow();
66
+ });
67
+
68
+ test("it should not an error when there are identical definitions interface", async () => {
69
+ const scenarioPath = "duplicate-symbols-identitcal-implementation";
70
+ const options = getGeneratorConfig(scenarioPath);
71
+ const generator = new SchemaGenerator(options);
72
+ await generator.Generate();
73
+ const rawFile = fs.readFileSync(getOutputSchemaPath(scenarioPath)).toString();
74
+ const result = JSON.parse(rawFile);
75
+ const expected = {
76
+ $schema: "http://json-schema.org/draft-07/schema#",
77
+ definitions: {
78
+ IBasicTypesA: {
79
+ type: "object",
80
+ properties: {
81
+ propertyA: {
82
+ $ref: "#/definitions/IBaseType",
83
+ },
84
+ propertyB: {
85
+ $ref: "#/definitions/IBaseType",
86
+ },
87
+ },
88
+ required: ["propertyA", "propertyB"],
89
+ additionalProperties: false,
90
+ },
91
+ IBaseType: {
92
+ type: "object",
93
+ properties: {
94
+ someProperty: {
95
+ type: "string",
96
+ },
97
+ },
98
+ required: ["someProperty"],
99
+ additionalProperties: false,
100
+ },
101
+ IBasicTypesB: {
102
+ type: "object",
103
+ properties: {
104
+ propertyA: {
105
+ $ref: "#/definitions/IBaseType",
106
+ },
107
+ propertyB: {
108
+ $ref: "#/definitions/IBaseType",
109
+ },
110
+ },
111
+ required: ["propertyA", "propertyB"],
112
+ additionalProperties: false,
113
+ },
114
+ },
115
+ };
116
+ expect(result).toStrictEqual(expected);
117
+ });
118
+ });
@@ -16,6 +16,7 @@ import {
16
16
  } from "ts-morph";
17
17
  import * as tsj from "ts-json-schema-generator";
18
18
  import { Config, Schema } from "ts-json-schema-generator";
19
+ import assert from "assert";
19
20
 
20
21
  const defaultTsMorphProjectSettings: ProjectOptions = {
21
22
  manipulationSettings: {
@@ -33,11 +34,13 @@ const defaultCreateFileOptions: SourceFileCreateOptions = {
33
34
 
34
35
  const validationSchemaFileName = "validation.schema.json";
35
36
  const schemaDefinitionFileName = "SchemaDefinition.ts";
37
+ const validationInterfacesFile = "ValidationType.ts";
36
38
 
37
39
  export class SchemaGenerator {
38
40
  private outputPath = path.join(this.options.rootPath, this.options.output);
39
41
  private jsonSchemaOutputFile = path.join(this.options.rootPath, this.options.output, validationSchemaFileName);
40
42
  private tsSchemaDefinitionOutputFile = path.join(this.options.rootPath, this.options.output, schemaDefinitionFileName);
43
+ private validationTypesOutputFile = path.join(this.options.rootPath, this.options.output, validationInterfacesFile);
41
44
  private isValidSchemaOutputFile = path.join(this.options.rootPath, this.options.output, "isValidSchema.ts");
42
45
 
43
46
  public constructor(private options: ICommandOptions) {}
@@ -64,6 +67,8 @@ export class SchemaGenerator {
64
67
  }
65
68
  await this.writeSchemaMapToValidationTypes(fileSchemas);
66
69
  this.writeValidatorFunction();
70
+ console.log("Writing validation types file");
71
+ this.writeValidationTypes(fileSchemas);
67
72
  };
68
73
 
69
74
  private getMatchingFiles = async () => {
@@ -119,7 +124,18 @@ export class SchemaGenerator {
119
124
 
120
125
  Object.keys(defs).forEach((key) => {
121
126
  if (definitions[key] !== undefined) {
122
- throw new Error(`Duplicate symbol: ${key} found`);
127
+ try {
128
+ assert.deepEqual(definitions[key], defs[key]);
129
+ } catch (e) {
130
+ console.error(
131
+ `Duplicate symbol: ${key} found with varying definitions.\nDefinition 1:\n${JSON.stringify(
132
+ definitions[key],
133
+ null,
134
+ 4
135
+ )}\nDefinition 2:\n${JSON.stringify(defs[key], null, 4)}`
136
+ );
137
+ throw e;
138
+ }
123
139
  }
124
140
  const schema = defs[key] as Schema;
125
141
  definitions[key] = schema;
@@ -239,4 +255,59 @@ export class SchemaGenerator {
239
255
  });
240
256
  await project.save();
241
257
  };
258
+
259
+ private writeValidationTypes = async (schemaMap: Map<string, Schema>) => {
260
+ const project = new Project(defaultTsMorphProjectSettings);
261
+ const readerProject = new Project(defaultTsMorphProjectSettings);
262
+
263
+ const symbols: Array<string> = [];
264
+
265
+ const importMap = new Map<string, Array<string>>();
266
+ schemaMap.forEach((schema, filePath) => {
267
+ const dir = path.dirname(filePath);
268
+ const fileWithoutExtension = path.parse(filePath).name;
269
+ const relativeFilePath = path.relative(this.outputPath, dir);
270
+ const importPath = `${relativeFilePath}/${fileWithoutExtension}`;
271
+ const defs = schema.definitions ?? {};
272
+
273
+ const readerSourceFile = readerProject.addSourceFileAtPath(filePath);
274
+
275
+ Object.keys(defs).forEach((symbol) => {
276
+ const typeAlias = readerSourceFile.getTypeAlias(symbol);
277
+ const typeInterface = readerSourceFile.getInterface(symbol);
278
+ const hasTypeOrInterface = (typeAlias ?? typeInterface) !== undefined;
279
+ if (hasTypeOrInterface) {
280
+ const namedImports = importMap.get(importPath) ?? [];
281
+ namedImports.push(symbol);
282
+ importMap.set(importPath, namedImports);
283
+ symbols.push(symbol);
284
+ }
285
+ });
286
+ });
287
+
288
+ const sourceFile = project.createSourceFile(this.validationTypesOutputFile, {}, defaultCreateFileOptions);
289
+
290
+ importMap.forEach((namedImports, importPath) => {
291
+ const declaration = sourceFile.addImportDeclaration({ moduleSpecifier: importPath });
292
+ namedImports.forEach((namedImport) => {
293
+ const name = namedImport.valueOf();
294
+ const alias = `_${name}`;
295
+ declaration.addNamedImport({ name, alias });
296
+ });
297
+ });
298
+ const namespace = sourceFile.addModule({
299
+ name: "ValidationType",
300
+ isExported: true,
301
+ });
302
+
303
+ importMap.forEach((namedImports) => {
304
+ namedImports.forEach((namedImport) => {
305
+ const name = namedImport.valueOf();
306
+ const alias = `_${name}`;
307
+ namespace.addTypeAlias({ name, type: alias, isExported: true });
308
+ });
309
+ });
310
+
311
+ await project.save();
312
+ };
242
313
  }
@@ -0,0 +1,4 @@
1
+ export interface IBasicTypes {
2
+ readonly propertyA: string;
3
+ readonly propertyB: string;
4
+ }
@@ -0,0 +1,3 @@
1
+ export interface IBaseType {
2
+ readonly someProperty: string;
3
+ }
@@ -0,0 +1,3 @@
1
+ export interface IBaseType {
2
+ readonly someProperty: number;
3
+ }
@@ -0,0 +1,6 @@
1
+ import { IBaseType } from "./IBaseType";
2
+
3
+ export interface IBasicTypesA {
4
+ readonly propertyA: IBaseType;
5
+ readonly propertyB: IBaseType;
6
+ }
@@ -0,0 +1,6 @@
1
+ import { IBaseType } from "./IBaseTypeDefinitionReplicated";
2
+
3
+ export interface IBasicTypesB {
4
+ readonly propertyA: IBaseType;
5
+ readonly propertyB: IBaseType;
6
+ }
@@ -0,0 +1,3 @@
1
+ export interface IBaseType {
2
+ readonly someProperty: string;
3
+ }
@@ -0,0 +1,3 @@
1
+ export interface IBaseType {
2
+ readonly someProperty: string;
3
+ }
@@ -0,0 +1,6 @@
1
+ import { IBaseType } from "./IBaseType";
2
+
3
+ export interface IBasicTypesA {
4
+ readonly propertyA: IBaseType;
5
+ readonly propertyB: IBaseType;
6
+ }
@@ -0,0 +1,6 @@
1
+ import { IBaseType } from "./IBaseTypeDefinitionReplicated";
2
+
3
+ export interface IBasicTypesB {
4
+ readonly propertyA: IBaseType;
5
+ readonly propertyB: IBaseType;
6
+ }