ts-runtime-validation 1.2.6 → 1.3.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 (49) hide show
  1. package/README.md +34 -7
  2. package/dist/SchemaGenerator.js +11 -9
  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/index.js +2 -0
  7. package/dist/index.js.map +1 -1
  8. package/dist/test/basic-scenario/types.jsonschema.js +3 -0
  9. package/dist/test/basic-scenario/types.jsonschema.js.map +1 -0
  10. package/dist/test/duplicate-symbols-different-implementation/IBaseType.js +3 -0
  11. package/dist/test/duplicate-symbols-different-implementation/IBaseType.js.map +1 -0
  12. package/dist/test/duplicate-symbols-different-implementation/IBaseTypeDefinitionReplicated.js +3 -0
  13. package/dist/test/duplicate-symbols-different-implementation/IBaseTypeDefinitionReplicated.js.map +1 -0
  14. package/dist/test/duplicate-symbols-different-implementation/IBasicTypesA.jsonschema.js +3 -0
  15. package/dist/test/duplicate-symbols-different-implementation/IBasicTypesA.jsonschema.js.map +1 -0
  16. package/dist/test/duplicate-symbols-different-implementation/IBasicTypesB.jsonschema.js +3 -0
  17. package/dist/test/duplicate-symbols-different-implementation/IBasicTypesB.jsonschema.js.map +1 -0
  18. package/dist/test/duplicate-symbols-identitcal-implementation/IBaseType.js +3 -0
  19. package/dist/test/duplicate-symbols-identitcal-implementation/IBaseType.js.map +1 -0
  20. package/dist/test/duplicate-symbols-identitcal-implementation/IBaseTypeDefinitionReplicated.js +3 -0
  21. package/dist/test/duplicate-symbols-identitcal-implementation/IBaseTypeDefinitionReplicated.js.map +1 -0
  22. package/dist/test/duplicate-symbols-identitcal-implementation/IBasicTypesA.jsonschema.js +3 -0
  23. package/dist/test/duplicate-symbols-identitcal-implementation/IBasicTypesA.jsonschema.js.map +1 -0
  24. package/dist/test/duplicate-symbols-identitcal-implementation/IBasicTypesB.jsonschema.js +3 -0
  25. package/dist/test/duplicate-symbols-identitcal-implementation/IBasicTypesB.jsonschema.js.map +1 -0
  26. package/dist/test/output/basic-scenario/SchemaDefinition.js +7 -0
  27. package/dist/test/output/basic-scenario/SchemaDefinition.js.map +1 -0
  28. package/dist/test/output/basic-scenario/isValidSchema.js +39 -0
  29. package/dist/test/output/basic-scenario/isValidSchema.js.map +1 -0
  30. package/dist/test/output/basic-scenario/validation.schema.json +21 -0
  31. package/dist/test/output/duplicate-symbols-identitcal-implementation/SchemaDefinition.js +8 -0
  32. package/dist/test/output/duplicate-symbols-identitcal-implementation/SchemaDefinition.js.map +1 -0
  33. package/dist/test/output/duplicate-symbols-identitcal-implementation/isValidSchema.js +39 -0
  34. package/dist/test/output/duplicate-symbols-identitcal-implementation/isValidSchema.js.map +1 -0
  35. package/dist/test/output/duplicate-symbols-identitcal-implementation/validation.schema.json +49 -0
  36. package/jest.config.js +10 -0
  37. package/package.json +12 -8
  38. package/src/SchemaGenerator.test.ts +118 -0
  39. package/src/SchemaGenerator.ts +16 -2
  40. package/src/index.ts +3 -0
  41. package/src/test/basic-scenario/types.jsonschema.ts +4 -0
  42. package/src/test/duplicate-symbols-different-implementation/IBaseType.ts +3 -0
  43. package/src/test/duplicate-symbols-different-implementation/IBaseTypeDefinitionReplicated.ts +3 -0
  44. package/src/test/duplicate-symbols-different-implementation/IBasicTypesA.jsonschema.ts +6 -0
  45. package/src/test/duplicate-symbols-different-implementation/IBasicTypesB.jsonschema.ts +6 -0
  46. package/src/test/duplicate-symbols-identitcal-implementation/IBaseType.ts +3 -0
  47. package/src/test/duplicate-symbols-identitcal-implementation/IBaseTypeDefinitionReplicated.ts +3 -0
  48. package/src/test/duplicate-symbols-identitcal-implementation/IBasicTypesA.jsonschema.ts +6 -0
  49. package/src/test/duplicate-symbols-identitcal-implementation/IBasicTypesB.jsonschema.ts +6 -0
package/README.md CHANGED
@@ -33,12 +33,14 @@ Ensure your project files containing the schemas you want to validate end with t
33
33
  Usage: ts-runtime-validation [options]
34
34
 
35
35
  Options:
36
- --glob Glob file path of typescript files to generate ts-interface -> json-schema validations - default: *.jsonschema.{ts,tsx}
37
- --rootPath <rootFolder> RootPath of source (default: "./src")
38
- --output <outputFolder> Code generation output directory (relative to root path) (default: "./.ts-runtime-validation")
39
- --generate-helpers Only generate JSON schema without typescript helper files (default: true)
40
- --additionalProperties Allow additional properties to pass validation (default: false)
41
- -h, --help display help for command
36
+ --glob Glob file path of typescript files to generate ts-interface -> json-schema validations - default: *.jsonschema.{ts,tsx}
37
+ --rootPath <rootFolder> RootPath of source (default: "./src")
38
+ --output <outputFolder> Code generation output directory (relative to root path) (default: "./.ts-runtime-validation")
39
+ --tsconfigPath <tsconfigPath> Path to customt tsconfig (relative to root path) (default: "")
40
+ --generate-helpers Only generate JSON schema without typescript helper files (default: true)
41
+ --additionalProperties Allow additional properties to pass validation (default: false)
42
+ -h, --help display help for command
43
+ Done in 0.44s.
42
44
  ```
43
45
 
44
46
  ## npm script usage
@@ -56,7 +58,9 @@ The intended use for ts-runtime-validation is as a npm script. Here it can also
56
58
  }
57
59
  ```
58
60
 
59
- ## Example usage of generated ts type validation
61
+ ## Example snippets
62
+
63
+ ### Type guard
60
64
 
61
65
  ```typescript
62
66
  import { isValidSchema } from "./.ts-runtime-validation/isValidSchema"; // this is autogenerated by the CLI as a helper file
@@ -69,6 +73,29 @@ if (isValidSchema(data, "#/definitions/ITypeA")) {
69
73
  }
70
74
  ```
71
75
 
76
+ ### Type assertion
77
+
78
+ ```
79
+ import * as schema from "../runtime-validation/validation.schema.json";
80
+ import Ajv from "ajv";
81
+ import { ISchema, schemas } from "../runtime-validation/SchemaDefinition";
82
+
83
+ const validator = new Ajv({ allErrors: true });
84
+ validator.compile(schema);
85
+
86
+ export const assertValidSchema = <T extends keyof typeof schemas>(data: unknown, schemaKeyRef: T): data is ISchema[T] => {
87
+ validator.validate(schemaKeyRef as string, data);
88
+ if (validator.errors || Boolean(validator.errors)) {
89
+ const error = { schemaKeyRef, errors: validator.errorsText(), data };
90
+ if (process.env.ENVIRONMENT === "dev") {
91
+ console.log(error);
92
+ }
93
+ throw new Error(JSON.stringify(error));
94
+ }
95
+ return true;
96
+ };
97
+ ```
98
+
72
99
  ## Contributing
73
100
 
74
101
  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,
@@ -98,16 +99,11 @@ class SchemaGenerator {
98
99
  return api.withPromise();
99
100
  });
100
101
  this.getJsonSchemasForFiles = (filesList) => __awaiter(this, void 0, void 0, function* () {
101
- const { additionalProperties } = this.options;
102
+ const { additionalProperties, tsconfigPath } = this.options;
102
103
  const schemaMap = new Map();
104
+ const tsconfig = tsconfigPath.length > 0 ? tsconfigPath : undefined;
103
105
  filesList.forEach((file) => {
104
- const config = {
105
- path: file,
106
- type: "*",
107
- additionalProperties,
108
- encodeRefs: false,
109
- sortProps: true,
110
- };
106
+ const config = Object.assign({ path: file, type: "*", additionalProperties, encodeRefs: false, sortProps: true }, (tsconfig !== null ? { tsconfig } : {}));
111
107
  const schemaGenerator = tsj.createGenerator(config);
112
108
  const fileSchemas = schemaGenerator.createSchema(config.type);
113
109
  schemaMap.set(file, fileSchemas);
@@ -131,7 +127,13 @@ class SchemaGenerator {
131
127
  const defs = (_a = fileSchema.definitions) !== null && _a !== void 0 ? _a : {};
132
128
  Object.keys(defs).forEach((key) => {
133
129
  if (definitions[key] !== undefined) {
134
- throw new Error(`Duplicate symbol: ${key} found`);
130
+ try {
131
+ assert_1.default.deepEqual(definitions[key], defs[key]);
132
+ }
133
+ catch (e) {
134
+ 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)}`);
135
+ throw e;
136
+ }
135
137
  }
136
138
  const schema = defs[key];
137
139
  definitions[key] = schema;
@@ -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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"}
package/dist/index.js CHANGED
@@ -6,9 +6,11 @@ const commander_1 = require("commander");
6
6
  const defaultGlobPattern = "*.jsonschema.{ts,tsx}";
7
7
  const defaultRootPath = "./src";
8
8
  const defaultOutputFolder = "./.ts-runtime-validation";
9
+ const defaultTsconfig = "";
9
10
  commander_1.program.option("--glob", `Glob file path of typescript files to generate ts-interface -> json-schema validations - default: ${defaultGlobPattern}`, defaultGlobPattern);
10
11
  commander_1.program.option("--rootPath <rootFolder>", `RootPath of source`, defaultRootPath);
11
12
  commander_1.program.option("--output <outputFolder>", `Code generation output directory (relative to root path)`, defaultOutputFolder);
13
+ commander_1.program.option("--tsconfigPath <tsconfigPath>", `Path to customt tsconfig (relative to root path)`, defaultTsconfig);
12
14
  commander_1.program.option("--generate-helpers", "Only generate JSON schema without typescript helper files", true);
13
15
  commander_1.program.option("--additionalProperties", "Allow additional properties to pass validation", false);
14
16
  commander_1.program.parse();
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAEA,uDAAoD;AACpD,yCAAoC;AAEpC,MAAM,kBAAkB,GAAG,uBAAuB,CAAC;AAEnD,MAAM,eAAe,GAAG,OAAO,CAAC;AAChC,MAAM,mBAAmB,GAAG,0BAA0B,CAAC;AAUvD,mBAAO,CAAC,MAAM,CACV,QAAQ,EACR,qGAAqG,kBAAkB,EAAE,EACzH,kBAAkB,CACrB,CAAC;AACF,mBAAO,CAAC,MAAM,CAAC,yBAAyB,EAAE,oBAAoB,EAAE,eAAe,CAAC,CAAC;AACjF,mBAAO,CAAC,MAAM,CAAC,yBAAyB,EAAE,0DAA0D,EAAE,mBAAmB,CAAC,CAAC;AAC3H,mBAAO,CAAC,MAAM,CAAC,oBAAoB,EAAE,2DAA2D,EAAE,IAAI,CAAC,CAAC;AACxG,mBAAO,CAAC,MAAM,CAAC,wBAAwB,EAAE,gDAAgD,EAAE,KAAK,CAAC,CAAC;AAElG,mBAAO,CAAC,KAAK,EAAE,CAAC;AAEhB,MAAM,OAAO,GAAG,mBAAO,CAAC,IAAI,EAAmB,CAAC;AAEhD,MAAM,SAAS,GAAG,IAAI,iCAAe,CAAC,OAAO,CAAC,CAAC;AAC/C,SAAS,CAAC,QAAQ,EAAE,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAEA,uDAAoD;AACpD,yCAAoC;AAEpC,MAAM,kBAAkB,GAAG,uBAAuB,CAAC;AAEnD,MAAM,eAAe,GAAG,OAAO,CAAC;AAChC,MAAM,mBAAmB,GAAG,0BAA0B,CAAC;AACvD,MAAM,eAAe,GAAG,EAAE,CAAC;AAW3B,mBAAO,CAAC,MAAM,CACV,QAAQ,EACR,qGAAqG,kBAAkB,EAAE,EACzH,kBAAkB,CACrB,CAAC;AACF,mBAAO,CAAC,MAAM,CAAC,yBAAyB,EAAE,oBAAoB,EAAE,eAAe,CAAC,CAAC;AACjF,mBAAO,CAAC,MAAM,CAAC,yBAAyB,EAAE,0DAA0D,EAAE,mBAAmB,CAAC,CAAC;AAC3H,mBAAO,CAAC,MAAM,CAAC,+BAA+B,EAAE,kDAAkD,EAAE,eAAe,CAAC,CAAC;AACrH,mBAAO,CAAC,MAAM,CAAC,oBAAoB,EAAE,2DAA2D,EAAE,IAAI,CAAC,CAAC;AACxG,mBAAO,CAAC,MAAM,CAAC,wBAAwB,EAAE,gDAAgD,EAAE,KAAK,CAAC,CAAC;AAElG,mBAAO,CAAC,KAAK,EAAE,CAAC;AAEhB,MAAM,OAAO,GAAG,mBAAO,CAAC,IAAI,EAAmB,CAAC;AAEhD,MAAM,SAAS,GAAG,IAAI,iCAAe,CAAC,OAAO,CAAC,CAAC;AAC/C,SAAS,CAAC,QAAQ,EAAE,CAAC"}
@@ -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,7 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.schemas = void 0;
4
+ exports.schemas = {
5
+ ["#/definitions/IBasicTypes"]: "IBasicTypes",
6
+ };
7
+ //# sourceMappingURL=SchemaDefinition.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SchemaDefinition.js","sourceRoot":"","sources":["../../../../src/test/output/basic-scenario/SchemaDefinition.ts"],"names":[],"mappings":";;;AAEa,QAAA,OAAO,GAAkC;IAClD,CAAC,2BAA2B,CAAC,EAAG,aAAa;CAC5C,CACJ"}
@@ -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"}
@@ -0,0 +1,21 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-07/schema#",
3
+ "definitions": {
4
+ "IBasicTypes": {
5
+ "type": "object",
6
+ "properties": {
7
+ "propertyA": {
8
+ "type": "string"
9
+ },
10
+ "propertyB": {
11
+ "type": "string"
12
+ }
13
+ },
14
+ "required": [
15
+ "propertyA",
16
+ "propertyB"
17
+ ],
18
+ "additionalProperties": false
19
+ }
20
+ }
21
+ }
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.schemas = void 0;
4
+ exports.schemas = {
5
+ ["#/definitions/IBasicTypesA"]: "IBasicTypesA",
6
+ ["#/definitions/IBasicTypesB"]: "IBasicTypesB",
7
+ };
8
+ //# sourceMappingURL=SchemaDefinition.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SchemaDefinition.js","sourceRoot":"","sources":["../../../../src/test/output/duplicate-symbols-identitcal-implementation/SchemaDefinition.ts"],"names":[],"mappings":";;;AAGa,QAAA,OAAO,GAAkC;IAClD,CAAC,4BAA4B,CAAC,EAAG,cAAc;IAC/C,CAAC,4BAA4B,CAAC,EAAG,cAAc;CAC9C,CACJ"}
@@ -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/duplicate-symbols-identitcal-implementation/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"}
@@ -0,0 +1,49 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-07/schema#",
3
+ "definitions": {
4
+ "IBasicTypesA": {
5
+ "type": "object",
6
+ "properties": {
7
+ "propertyA": {
8
+ "$ref": "#/definitions/IBaseType"
9
+ },
10
+ "propertyB": {
11
+ "$ref": "#/definitions/IBaseType"
12
+ }
13
+ },
14
+ "required": [
15
+ "propertyA",
16
+ "propertyB"
17
+ ],
18
+ "additionalProperties": false
19
+ },
20
+ "IBaseType": {
21
+ "type": "object",
22
+ "properties": {
23
+ "someProperty": {
24
+ "type": "string"
25
+ }
26
+ },
27
+ "required": [
28
+ "someProperty"
29
+ ],
30
+ "additionalProperties": false
31
+ },
32
+ "IBasicTypesB": {
33
+ "type": "object",
34
+ "properties": {
35
+ "propertyA": {
36
+ "$ref": "#/definitions/IBaseType"
37
+ },
38
+ "propertyB": {
39
+ "$ref": "#/definitions/IBaseType"
40
+ }
41
+ },
42
+ "required": [
43
+ "propertyA",
44
+ "propertyB"
45
+ ],
46
+ "additionalProperties": false
47
+ }
48
+ }
49
+ }
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.6",
3
+ "version": "1.3.0",
4
4
  "author": "Matthew Duong <thegalah@gmail.com>",
5
5
  "license": "MIT",
6
6
  "dependencies": {
7
- "commander": "^9.1.0",
7
+ "commander": "^9.3.0",
8
8
  "fdir": "^5.2.0",
9
9
  "picomatch": "^2.3.1",
10
10
  "ts-json-schema-generator": "^1.0.0",
11
- "ts-morph": "^14.0.0"
11
+ "ts-morph": "^15.1.0"
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": "^28.1.2",
23
+ "@types/node": "^18.0.0",
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": "^28.1.1",
26
+ "prettier": "^2.7.1",
27
+ "ts-jest": "^28.0.5",
28
+ "ts-node": "^10.8.1",
29
+ "typescript": "^4.7.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: {
@@ -81,8 +82,9 @@ export class SchemaGenerator {
81
82
  };
82
83
 
83
84
  private getJsonSchemasForFiles = async (filesList: Array<string>) => {
84
- const { additionalProperties } = this.options;
85
+ const { additionalProperties, tsconfigPath } = this.options;
85
86
  const schemaMap = new Map<string, Schema>();
87
+ const tsconfig = tsconfigPath.length > 0 ? tsconfigPath : undefined;
86
88
  filesList.forEach((file) => {
87
89
  const config: Config = {
88
90
  path: file,
@@ -90,6 +92,7 @@ export class SchemaGenerator {
90
92
  additionalProperties,
91
93
  encodeRefs: false,
92
94
  sortProps: true,
95
+ ...(tsconfig !== null ? { tsconfig } : {}),
93
96
  };
94
97
 
95
98
  const schemaGenerator = tsj.createGenerator(config);
@@ -117,7 +120,18 @@ export class SchemaGenerator {
117
120
 
118
121
  Object.keys(defs).forEach((key) => {
119
122
  if (definitions[key] !== undefined) {
120
- throw new Error(`Duplicate symbol: ${key} found`);
123
+ try {
124
+ assert.deepEqual(definitions[key], defs[key]);
125
+ } catch (e) {
126
+ console.error(
127
+ `Duplicate symbol: ${key} found with varying definitions.\nDefinition 1:\n${JSON.stringify(
128
+ definitions[key],
129
+ null,
130
+ 4
131
+ )}\nDefinition 2:\n${JSON.stringify(defs[key], null, 4)}`
132
+ );
133
+ throw e;
134
+ }
121
135
  }
122
136
  const schema = defs[key] as Schema;
123
137
  definitions[key] = schema;
package/src/index.ts CHANGED
@@ -7,6 +7,7 @@ const defaultGlobPattern = "*.jsonschema.{ts,tsx}";
7
7
 
8
8
  const defaultRootPath = "./src";
9
9
  const defaultOutputFolder = "./.ts-runtime-validation";
10
+ const defaultTsconfig = "";
10
11
 
11
12
  export interface ICommandOptions {
12
13
  readonly glob: string;
@@ -14,6 +15,7 @@ export interface ICommandOptions {
14
15
  readonly output: string;
15
16
  readonly helpers: boolean;
16
17
  readonly additionalProperties: boolean;
18
+ readonly tsconfigPath: string;
17
19
  }
18
20
 
19
21
  program.option(
@@ -23,6 +25,7 @@ program.option(
23
25
  );
24
26
  program.option("--rootPath <rootFolder>", `RootPath of source`, defaultRootPath);
25
27
  program.option("--output <outputFolder>", `Code generation output directory (relative to root path)`, defaultOutputFolder);
28
+ program.option("--tsconfigPath <tsconfigPath>", `Path to customt tsconfig (relative to root path)`, defaultTsconfig);
26
29
  program.option("--generate-helpers", "Only generate JSON schema without typescript helper files", true);
27
30
  program.option("--additionalProperties", "Allow additional properties to pass validation", false);
28
31
 
@@ -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
+ }