@jetio/validator 1.0.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 (57) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +1362 -0
  3. package/dist/cli.js +219 -0
  4. package/dist/compileSchema.d.ts +148 -0
  5. package/dist/compileSchema.js +2199 -0
  6. package/dist/compileSchema.js.map +1 -0
  7. package/dist/formats.d.ts +41 -0
  8. package/dist/formats.js +166 -0
  9. package/dist/formats.js.map +1 -0
  10. package/dist/index.cjs.js +6167 -0
  11. package/dist/index.d.ts +9 -0
  12. package/dist/index.esm.js +6148 -0
  13. package/dist/index.js +28 -0
  14. package/dist/index.js.map +1 -0
  15. package/dist/jet-validator.d.ts +88 -0
  16. package/dist/jet-validator.js +983 -0
  17. package/dist/jet-validator.js.map +1 -0
  18. package/dist/resolver.d.ts +348 -0
  19. package/dist/resolver.js +2459 -0
  20. package/dist/resolver.js.map +1 -0
  21. package/dist/scripts/load-metaschemas.d.ts +1 -0
  22. package/dist/scripts/metaschema-loader.d.ts +2 -0
  23. package/dist/src/compileSchema.d.ts +148 -0
  24. package/dist/src/formats.d.ts +41 -0
  25. package/dist/src/index.d.ts +9 -0
  26. package/dist/src/jet-validator.d.ts +88 -0
  27. package/dist/src/resolver.d.ts +348 -0
  28. package/dist/src/types/format.d.ts +7 -0
  29. package/dist/src/types/keywords.d.ts +78 -0
  30. package/dist/src/types/schema.d.ts +123 -0
  31. package/dist/src/types/standalone.d.ts +4 -0
  32. package/dist/src/types/validation.d.ts +49 -0
  33. package/dist/src/utilities/index.d.ts +11 -0
  34. package/dist/src/utilities/schema.d.ts +10 -0
  35. package/dist/types/format.d.ts +7 -0
  36. package/dist/types/format.js +3 -0
  37. package/dist/types/format.js.map +1 -0
  38. package/dist/types/keywords.d.ts +78 -0
  39. package/dist/types/keywords.js +4 -0
  40. package/dist/types/keywords.js.map +1 -0
  41. package/dist/types/schema.d.ts +123 -0
  42. package/dist/types/schema.js +3 -0
  43. package/dist/types/schema.js.map +1 -0
  44. package/dist/types/standalone.d.ts +4 -0
  45. package/dist/types/standalone.js +3 -0
  46. package/dist/types/standalone.js.map +1 -0
  47. package/dist/types/validation.d.ts +49 -0
  48. package/dist/types/validation.js +3 -0
  49. package/dist/types/validation.js.map +1 -0
  50. package/dist/utilities/index.d.ts +11 -0
  51. package/dist/utilities/index.js +146 -0
  52. package/dist/utilities/index.js.map +1 -0
  53. package/dist/utilities/schema.d.ts +10 -0
  54. package/dist/utilities/schema.js +232 -0
  55. package/dist/utilities/schema.js.map +1 -0
  56. package/dist/validator.umd.js +6196 -0
  57. package/package.json +79 -0
package/dist/cli.js ADDED
@@ -0,0 +1,219 @@
1
+ #!/usr/bin/env node
2
+ 'use strict';
3
+
4
+ var path = require('path');
5
+ var fs = require('fs/promises');
6
+
7
+ function _interopNamespace(e) {
8
+ if (e && e.__esModule) return e;
9
+ var n = Object.create(null);
10
+ if (e) {
11
+ Object.keys(e).forEach(function (k) {
12
+ if (k !== 'default') {
13
+ var d = Object.getOwnPropertyDescriptor(e, k);
14
+ Object.defineProperty(n, k, d.get ? d : {
15
+ enumerable: true,
16
+ get: function () { return e[k]; }
17
+ });
18
+ }
19
+ });
20
+ }
21
+ n["default"] = e;
22
+ return Object.freeze(n);
23
+ }
24
+
25
+ var path__namespace = /*#__PURE__*/_interopNamespace(path);
26
+ var fs__namespace = /*#__PURE__*/_interopNamespace(fs);
27
+
28
+ const METASCHEMA_CONFIGS = {
29
+ "draft-06": {
30
+ main: "https://json-schema.org/draft-06/schema",
31
+ subSchemas: [],
32
+ },
33
+ "draft-07": {
34
+ main: "https://json-schema.org/draft-07/schema",
35
+ subSchemas: [],
36
+ },
37
+ "draft/2019-09": {
38
+ main: "https://json-schema.org/draft/2019-09/schema",
39
+ subSchemas: [
40
+ "https://json-schema.org/draft/2019-09/meta/core",
41
+ "https://json-schema.org/draft/2019-09/meta/applicator",
42
+ "https://json-schema.org/draft/2019-09/meta/validation",
43
+ "https://json-schema.org/draft/2019-09/meta/meta-data",
44
+ "https://json-schema.org/draft/2019-09/meta/format",
45
+ "https://json-schema.org/draft/2019-09/meta/content",
46
+ ],
47
+ },
48
+ "draft/2020-12": {
49
+ main: "https://json-schema.org/draft/2020-12/schema",
50
+ subSchemas: [
51
+ "https://json-schema.org/draft/2020-12/meta/core",
52
+ "https://json-schema.org/draft/2020-12/meta/applicator",
53
+ "https://json-schema.org/draft/2020-12/meta/unevaluated",
54
+ "https://json-schema.org/draft/2020-12/meta/validation",
55
+ "https://json-schema.org/draft/2020-12/meta/meta-data",
56
+ "https://json-schema.org/draft/2020-12/meta/format-annotation",
57
+ "https://json-schema.org/draft/2020-12/meta/content",
58
+ ],
59
+ },
60
+ };
61
+ async function fetchSchema(url) {
62
+ const response = await fetch(url);
63
+ if (!response.ok) {
64
+ throw new Error(`Failed to fetch ${url}: ${response.status} ${response.statusText}`);
65
+ }
66
+ return await response.json();
67
+ }
68
+ async function loadSingleVersion(version, baseOutputDir = "./meta-schemas") {
69
+ const config = METASCHEMA_CONFIGS[version];
70
+ const outputDir = path__namespace.join(baseOutputDir, version);
71
+ await fs__namespace.mkdir(outputDir, { recursive: true });
72
+ const mainSchema = await fetchSchema(config.main);
73
+ const strippedMain = mainSchema;
74
+ const mainFile = path__namespace.join(outputDir, "schema.json");
75
+ await fs__namespace.writeFile(mainFile, JSON.stringify(strippedMain, null, 2));
76
+ console.log(` ✓ ${mainFile}`);
77
+ for (const subUrl of config.subSchemas) {
78
+ const subSchema = await fetchSchema(subUrl);
79
+ const strippedSub = subSchema;
80
+ const metaDir = path__namespace.join(outputDir, "meta");
81
+ await fs__namespace.mkdir(metaDir, { recursive: true });
82
+ const filename = subUrl.split("/meta/")[1] + ".json";
83
+ const filepath = path__namespace.join(metaDir, filename);
84
+ await fs__namespace.writeFile(filepath, JSON.stringify(strippedSub, null, 2));
85
+ console.log(` ✓ ${filepath}`);
86
+ }
87
+ console.log(`✓ Saved ${version} to ${outputDir}\n`);
88
+ }
89
+ async function parseExistingLoader(loaderPath) {
90
+ try {
91
+ const content = await fs__namespace.readFile(loaderPath, "utf-8");
92
+ const existingVersions = new Set();
93
+ for (const version of Object.keys(METASCHEMA_CONFIGS)) {
94
+ const funcName = "load" +
95
+ version.replace(/^draft[-\/]/, "Draft").replace(/[-\/\.]/g, "");
96
+ if (content.includes(`function ${funcName}(`)) {
97
+ existingVersions.add(version);
98
+ }
99
+ }
100
+ return existingVersions.size > 0 ? existingVersions : null;
101
+ }
102
+ catch {
103
+ return null;
104
+ }
105
+ }
106
+ async function generateLoaderFiles(outputDir, loadedVersions) {
107
+ const loaderJsPath = path__namespace.join(outputDir, "loader.js");
108
+ const loaderDtsPath = path__namespace.join(outputDir, "loader.d.ts");
109
+ const existingVersions = await parseExistingLoader(loaderJsPath);
110
+ const allVersions = new Set([...(existingVersions || []), ...loadedVersions]);
111
+ let jsImports = "";
112
+ let jsLoadFunctions = "";
113
+ let dtsExports = "";
114
+ const functionNames = [];
115
+ for (const version of allVersions) {
116
+ const config = METASCHEMA_CONFIGS[version];
117
+ const funcName = "load" + version.replace(/^draft[-\/]/, "Draft").replace(/[-\/\.]/g, "");
118
+ functionNames.push(funcName);
119
+ const mainImportName = `schema_${version.replace(/[-\/\.]/g, "_")}`;
120
+ jsImports += `const ${mainImportName} = require('./${version}/schema.json');\n`;
121
+ const subImports = [];
122
+ for (const subUrl of config.subSchemas) {
123
+ const filename = subUrl.split("/meta/")[1];
124
+ const subImportName = `schema_${version.replace(/[-\/\.]/g, "_")}_${filename.replace(/[-\/\.]/g, "_")}`;
125
+ jsImports += `const ${subImportName} = require('./${version}/meta/${filename}.json');\n`;
126
+ subImports.push({ name: subImportName, url: subUrl });
127
+ }
128
+ jsImports += "\n";
129
+ jsLoadFunctions += `function ${funcName}(jetValidator) {
130
+ jetValidator.addMetaSchema(${mainImportName}, '${config.main}');
131
+ jetValidator.addMetaSchema(${mainImportName}, '${version}');
132
+
133
+ `;
134
+ for (const sub of subImports) {
135
+ jsLoadFunctions += ` jetValidator.addMetaSchema(${sub.name}, '${sub.url}');\n`;
136
+ const relativePath = sub.url.split("/meta/")[1];
137
+ if (relativePath) {
138
+ jsLoadFunctions += ` jetValidator.addMetaSchema(${sub.name}, '${version}/meta/${relativePath}');\n`;
139
+ }
140
+ }
141
+ jsLoadFunctions += `}\n\n`;
142
+ dtsExports += `export function ${funcName}(jetValidator: any): void;\n`;
143
+ }
144
+ jsLoadFunctions += `function loadAllMetaSchemas(jetValidator) {
145
+ `;
146
+ for (const funcName of functionNames) {
147
+ jsLoadFunctions += ` ${funcName}(jetValidator);\n`;
148
+ }
149
+ jsLoadFunctions += `}\n\n`;
150
+ dtsExports += `export function loadAllMetaSchemas(jetValidator: any): void;\n`;
151
+ const jsExports = functionNames.map((name) => name).join(",\n ");
152
+ const jsContent = `/**
153
+ * Auto-generated meta-schema loader
154
+ * Generated by: jetvalidator-meta load
155
+ *
156
+ * Usage:
157
+ * const { loadDraft07, loadAllMetaSchemas } = require('./loader');
158
+ *
159
+ * const jetValidator = new JetValidator();
160
+ * loadDraft07(jetValidator); // Load specific version
161
+ * // OR
162
+ * loadAllMetaSchemas(jetValidator); // Load all versions
163
+ */
164
+
165
+ ${jsImports}
166
+ ${jsLoadFunctions}
167
+ module.exports = {
168
+ ${jsExports},
169
+ loadAllMetaSchemas
170
+ };
171
+ `;
172
+ const dtsContent = `/**
173
+ * Auto-generated meta-schema loader
174
+ * Generated by: jetvalidator-meta load
175
+ */
176
+
177
+ ${dtsExports}`;
178
+ await fs__namespace.writeFile(loaderJsPath, jsContent);
179
+ await fs__namespace.writeFile(loaderDtsPath, dtsContent);
180
+ const isAppending = existingVersions && existingVersions.size > 0;
181
+ console.log(`\n✓ ${isAppending ? "Updated" : "Generated"}: ${loaderJsPath}`);
182
+ console.log(`✓ ${isAppending ? "Updated" : "Generated"}: ${loaderDtsPath}`);
183
+ if (isAppending) {
184
+ console.log(` (Merged with ${existingVersions.size} existing version(s))`);
185
+ }
186
+ console.log(`\nUsage (CommonJS):`);
187
+ console.log(` const { ${functionNames.join(", ")}, loadAllMetaSchemas } = require('${outputDir}/loader');\n`);
188
+ console.log(`Usage (ES Modules):`);
189
+ console.log(` import { ${functionNames.join(", ")}, loadAllMetaSchemas } from '${outputDir}/loader';\n`);
190
+ }
191
+ async function loadMetaschema(version, outputDir = "./meta-schemas") {
192
+ const loadedVersions = new Set();
193
+ if (version === "all") {
194
+ const versions = Object.keys(METASCHEMA_CONFIGS);
195
+ for (const v of versions) {
196
+ await loadSingleVersion(v, outputDir);
197
+ loadedVersions.add(v);
198
+ }
199
+ }
200
+ else {
201
+ await loadSingleVersion(version, outputDir);
202
+ loadedVersions.add(version);
203
+ }
204
+ await generateLoaderFiles(outputDir, loadedVersions);
205
+ }
206
+
207
+ async function main() {
208
+ const args = process.argv.slice(2);
209
+ if (args[0] === "load") {
210
+ args.shift(); // remove 'load'
211
+ }
212
+ const version = args[0] || "all";
213
+ const outputDir = args[1] || "./meta-schemas";
214
+ console.log(`Loading meta-schema: ${version}`);
215
+ console.log(`Output directory: ${path__namespace.resolve(outputDir)}`);
216
+ await loadMetaschema(version, outputDir);
217
+ console.log("✓ Meta-schemas downloaded and saved");
218
+ }
219
+ main();
@@ -0,0 +1,148 @@
1
+ import { ArraySchema, ObjectSchema, SchemaDefinition } from "./types/schema";
2
+ import { ValidatorOptions } from "./types/validation";
3
+ import { CompiledValidateFunction } from "./types/keywords";
4
+ import { JetValidator } from "./jet-validator";
5
+ export type Extra = {
6
+ before: string;
7
+ after: string;
8
+ refAfter?: string;
9
+ };
10
+ interface ErrorInfo {
11
+ keyword: string;
12
+ value: string;
13
+ message: string;
14
+ expected?: string;
15
+ dataPath?: string;
16
+ schemaPath?: string;
17
+ }
18
+ /**
19
+ * PathContext: Lightweight object containing only path strings.
20
+ * Created on every recursion but only contains 4 strings (cheap to allocate).
21
+ *
22
+ * TrackingState: Mutable state for unevaluated* tracking.
23
+ * Mutated in place when possible to avoid allocations.
24
+ * Only spread when crossing schema boundaries that introduce new tracking requirements.
25
+ *
26
+ * this.options: Immutable config stored in class instance.
27
+ * Never passed as parameter - accessed via this.options.
28
+ *
29
+ * Performance: This design reduces allocations by ~60% compared to
30
+ * spreading a single 13-property object on every recursion.
31
+ */
32
+ interface PathContext {
33
+ schema: string;
34
+ data: string;
35
+ $data: string;
36
+ alt?: string;
37
+ alt2?: string;
38
+ }
39
+ interface TrackingState {
40
+ isSubschema?: boolean;
41
+ parentHasUnevaluatedProperties?: boolean;
42
+ hasOwnUnevaluatedProperties?: boolean;
43
+ shouldTrackEvaluatedProperties?: boolean;
44
+ parentHasUnevaluatedItems?: boolean;
45
+ hasOwnUnevaluatedItems?: boolean;
46
+ shouldTrackEvaluatedItems?: boolean;
47
+ parentUnevaluatedPropVar?: string;
48
+ unevaluatedPropVar?: string;
49
+ parentUnevaluatedItemVar?: string;
50
+ unevaluatedItemVar?: string;
51
+ unEvaluatedPropertiesSetVar?: string;
52
+ unEvaluatedItemsSetVar?: string;
53
+ }
54
+ export declare class Compiler {
55
+ private refables;
56
+ private ranRefables;
57
+ private refCall;
58
+ private schema;
59
+ private options;
60
+ private errorVariableDeclared;
61
+ private errorVariable;
62
+ private compiledKeywords;
63
+ regexCache: Map<string, string>;
64
+ private validateKeywords;
65
+ private allKeywords;
66
+ private jetValidator;
67
+ private notLogic;
68
+ private noreturn;
69
+ private neutralError;
70
+ private compileContext;
71
+ private standAlone;
72
+ private hasCompileKeyword;
73
+ needslen_of: boolean;
74
+ needsStringify: boolean;
75
+ needsDeepEqual: boolean;
76
+ mainFunctionName: string;
77
+ hoistedFunctions: string[];
78
+ constructor(refables: any[] | undefined, schema: SchemaDefinition | boolean, options: Partial<ValidatorOptions>, jetValidator: JetValidator, allKeywords: Set<string>, compileContext: {
79
+ hasUnevaluatedProperties: boolean;
80
+ hasUnevaluatedItems: boolean;
81
+ hasRootReference: boolean;
82
+ referencedFunctions: string[];
83
+ uses$Data: boolean;
84
+ }, standalone?: boolean);
85
+ getCompiledKeywords(): {
86
+ compiledKeywords: Map<string, CompiledValidateFunction>;
87
+ validateKeywords: Set<string>;
88
+ hasCompileKeyword: boolean;
89
+ };
90
+ private createSubschemaOptions;
91
+ private handleCustomKeywords;
92
+ private handleCodeKeyword;
93
+ private handleCompileKeyword;
94
+ private handleValidateKeyword;
95
+ compileSchema(rootSchema: SchemaDefinition | boolean, pathContext?: PathContext, trackingState?: TrackingState, accessPattern?: string, extra?: Extra, inlined?: boolean, first?: boolean): string;
96
+ initializeDefault(src: string[], schema: SchemaDefinition, varName: string, accessPattern: string, inlined: boolean): void;
97
+ private initializePropertyTracking;
98
+ private initializeItemTracking;
99
+ inilineRefFunction(src: string[], schema: SchemaDefinition, varName: string, pathContext: PathContext, trackingState: TrackingState, extra: Extra): void;
100
+ initializeRefables(pathContext: PathContext): void;
101
+ initializeSchemaRefables(src: string[], schema: SchemaDefinition, varName: string, pathContext: PathContext, trackingState: TrackingState, extra: Extra): void;
102
+ handleReference(src: string[], schema: SchemaDefinition, varName: string, pathContext: PathContext, trackingState: TrackingState, extra: Extra): string | void;
103
+ private buildRefCallArgs;
104
+ handleLogicalOperators(src: string[], schema: SchemaDefinition, varName: string, pathContext: PathContext, trackingState: TrackingState, extra: Extra): void;
105
+ handleNotOperator(src: string[], schema: SchemaDefinition, varName: string, pathContext: PathContext, extra: Extra): void;
106
+ handleAnyOfOperator(src: string[], schema: SchemaDefinition, varName: string, pathContext: PathContext, trackingState: TrackingState, extra: Extra): void;
107
+ handleOneOfOperator(src: string[], schema: SchemaDefinition, varName: string, pathContext: PathContext, trackingState: TrackingState, extra: Extra): void;
108
+ handleAllOfOperator(src: string[], schema: SchemaDefinition, varName: string, pathContext: PathContext, trackingState: TrackingState, extra: Extra): void;
109
+ handleConditionalLogic(src: string[], schema: SchemaDefinition, varName: string, pathContext: PathContext, trackingState: TrackingState, extra: Extra): void;
110
+ handleElseIfConditions(src: string[], schema: SchemaDefinition, varName: string, pathContext: PathContext, trackingState: TrackingState, previousIfValid: string, elseIfVariableArray: string[]): any;
111
+ handleElseIfThen(src: string[], schema: SchemaDefinition, varName: string, pathContext: PathContext, trackingState: TrackingState, elseIfVariableArray: any, extra: Extra): void;
112
+ handleTypeValidation(src: string[], schema: SchemaDefinition, varName: string, pathContext: PathContext, trackingState: TrackingState, extra: Extra): void;
113
+ private generateTypeCheck;
114
+ handlePrimitive(src: string[], schema: SchemaDefinition, varName: string, pathContext: PathContext, extra: Extra): void;
115
+ private handleConst;
116
+ private handleMinLength;
117
+ private handleMaxLength;
118
+ private handleMinimum;
119
+ private handleMaximum;
120
+ private handleExclusiveMinimum;
121
+ private handleExclusiveMaximum;
122
+ handleMultipleOf(src: string[], schema: SchemaDefinition, varName: string, pathContext: PathContext, extra: Extra): void;
123
+ handlePattern(src: string[], schema: SchemaDefinition, varName: string, pathContext: PathContext, extra: Extra): void;
124
+ handleEnum(src: string[], schema: SchemaDefinition, varName: string, pathContext: PathContext, extra: Extra): void;
125
+ handleFormat(src: string[], schema: SchemaDefinition, varName: string, pathContext: PathContext, extra: Extra): void;
126
+ handleObject(src: string[], schema: ObjectSchema, varName: string, pathContext: PathContext, trackingState: TrackingState, condition: boolean, extra: Extra): void;
127
+ handleRequiredProperties(src: string[], schema: ObjectSchema, varName: string, pathContext: PathContext, trackingState: TrackingState, extra: Extra): void;
128
+ collectAllAllowedProperties(schema: SchemaDefinition | boolean): {
129
+ allowedProperties: Set<string>;
130
+ patternProperties: string[];
131
+ };
132
+ handlePatternProperties(src: string[], schema: ObjectSchema, varName: string, pathContext: PathContext, trackingState: TrackingState, extra: Extra): void;
133
+ handleAdditionalProperties(src: string[], schema: SchemaDefinition, varName: string, pathContext: PathContext, trackingState: TrackingState, extra: Extra): void;
134
+ handlePropertyConstraints(src: string[], schema: ObjectSchema, varName: string, pathContext: PathContext, extra: Extra): void;
135
+ handlePropertyNames(src: string[], schema: ObjectSchema, varName: string, pathContext: PathContext, extra: Extra): void;
136
+ handleDependentSchemas(src: string[], schema: ObjectSchema, varName: string, pathContext: PathContext, trackingState: TrackingState, extra: Extra): void;
137
+ private handleRequiredFields;
138
+ private handleDependentSchema;
139
+ handleObjectProperties(src: string[], schema: ObjectSchema, varName: string, pathContext: PathContext, trackingState: TrackingState, propertyKeys: string[], extra: Extra): void;
140
+ handleUnevaluatedProperties(src: string[], schema: ObjectSchema, varName: string, pathContext: PathContext, trackingState: TrackingState, extra: Extra): void;
141
+ handleArray(src: string[], schema: ArraySchema, varName: string, pathContext: PathContext, trackingState: TrackingState, condition: boolean, extra: Extra): void;
142
+ handleArrayConstraints(src: string[], schema: ArraySchema, varName: string, pathContext: PathContext, extra: Extra): void;
143
+ handleArrayItems(src: string[], schema: ArraySchema, varName: string, pathContext: PathContext, trackingState: TrackingState, extra: Extra): void;
144
+ handleArrayContains(src: string[], schema: ArraySchema, varName: string, pathContext: PathContext, trackingState: TrackingState, extra: Extra): void;
145
+ handleUnevaluatedItems(src: string[], schema: ArraySchema, varName: string, pathContext: PathContext, trackingState: TrackingState, extra: Extra): void;
146
+ buildErrorReturn(pathContext: PathContext, error: ErrorInfo, spreads?: string): string;
147
+ }
148
+ export {};