@stxt-lang/core 0.5.1
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.
- package/out/all.d.ts +19 -0
- package/out/all.js +42 -0
- package/out/all.js.map +1 -0
- package/out/core/Constants.d.ts +9 -0
- package/out/core/Constants.js +14 -0
- package/out/core/Constants.js.map +1 -0
- package/out/core/Line.d.ts +9 -0
- package/out/core/Line.js +17 -0
- package/out/core/Line.js.map +1 -0
- package/out/core/LineParser.d.ts +2 -0
- package/out/core/LineParser.js +72 -0
- package/out/core/LineParser.js.map +1 -0
- package/out/core/NameNamespace.d.ts +7 -0
- package/out/core/NameNamespace.js +17 -0
- package/out/core/NameNamespace.js.map +1 -0
- package/out/core/NameNamespaceParser.d.ts +5 -0
- package/out/core/NameNamespaceParser.js +43 -0
- package/out/core/NameNamespaceParser.js.map +1 -0
- package/out/core/NamespaceValidator.d.ts +4 -0
- package/out/core/NamespaceValidator.js +17 -0
- package/out/core/NamespaceValidator.js.map +1 -0
- package/out/core/Node.d.ts +29 -0
- package/out/core/Node.js +116 -0
- package/out/core/Node.js.map +1 -0
- package/out/core/NodeCreator.d.ts +3 -0
- package/out/core/NodeCreator.js +52 -0
- package/out/core/NodeCreator.js.map +1 -0
- package/out/core/ParseResult.d.ts +12 -0
- package/out/core/ParseResult.js +26 -0
- package/out/core/ParseResult.js.map +1 -0
- package/out/core/Parser.d.ts +16 -0
- package/out/core/Parser.js +142 -0
- package/out/core/Parser.js.map +1 -0
- package/out/core/StringUtils.d.ts +8 -0
- package/out/core/StringUtils.js +46 -0
- package/out/core/StringUtils.js.map +1 -0
- package/out/exceptions/ParseException.d.ts +6 -0
- package/out/exceptions/ParseException.js +17 -0
- package/out/exceptions/ParseException.js.map +1 -0
- package/out/exceptions/RuntimeException.d.ts +6 -0
- package/out/exceptions/RuntimeException.js +20 -0
- package/out/exceptions/RuntimeException.js.map +1 -0
- package/out/exceptions/ValidationException.d.ts +4 -0
- package/out/exceptions/ValidationException.js +13 -0
- package/out/exceptions/ValidationException.js.map +1 -0
- package/out/processors/Observer.d.ts +8 -0
- package/out/processors/Observer.js +3 -0
- package/out/processors/Observer.js.map +1 -0
- package/out/processors/Validator.d.ts +5 -0
- package/out/processors/Validator.js +3 -0
- package/out/processors/Validator.js.map +1 -0
- package/out/runtime/ConditionalValidator.d.ts +9 -0
- package/out/runtime/ConditionalValidator.js +18 -0
- package/out/runtime/ConditionalValidator.js.map +1 -0
- package/out/runtime/NodeWriter.d.ts +12 -0
- package/out/runtime/NodeWriter.js +59 -0
- package/out/runtime/NodeWriter.js.map +1 -0
- package/out/runtime/UnifiedSchemaProvider.d.ts +22 -0
- package/out/runtime/UnifiedSchemaProvider.js +80 -0
- package/out/runtime/UnifiedSchemaProvider.js.map +1 -0
- package/out/schema/ChildDefinition.d.ts +21 -0
- package/out/schema/ChildDefinition.js +50 -0
- package/out/schema/ChildDefinition.js.map +1 -0
- package/out/schema/NodeDefinition.d.ts +34 -0
- package/out/schema/NodeDefinition.js +74 -0
- package/out/schema/NodeDefinition.js.map +1 -0
- package/out/schema/Schema.d.ts +30 -0
- package/out/schema/Schema.js +43 -0
- package/out/schema/Schema.js.map +1 -0
- package/out/schema/SchemaParser.d.ts +3 -0
- package/out/schema/SchemaParser.js +117 -0
- package/out/schema/SchemaParser.js.map +1 -0
- package/out/schema/SchemaProvider.d.ts +4 -0
- package/out/schema/SchemaProvider.js +3 -0
- package/out/schema/SchemaProvider.js.map +1 -0
- package/out/schema/SchemaProviderMemory.d.ts +11 -0
- package/out/schema/SchemaProviderMemory.js +44 -0
- package/out/schema/SchemaProviderMemory.js.map +1 -0
- package/out/schema/SchemaProviderMeta.d.ts +8 -0
- package/out/schema/SchemaProviderMeta.js +92 -0
- package/out/schema/SchemaProviderMeta.js.map +1 -0
- package/out/schema/SchemaValidator.d.ts +16 -0
- package/out/schema/SchemaValidator.js +115 -0
- package/out/schema/SchemaValidator.js.map +1 -0
- package/out/schema/Type.d.ts +6 -0
- package/out/schema/Type.js +3 -0
- package/out/schema/Type.js.map +1 -0
- package/out/schema/TypeRegistry.d.ts +8 -0
- package/out/schema/TypeRegistry.js +69 -0
- package/out/schema/TypeRegistry.js.map +1 -0
- package/out/schema/type/BASE64.d.ts +2 -0
- package/out/schema/type/BASE64.js +30 -0
- package/out/schema/type/BASE64.js.map +1 -0
- package/out/schema/type/BINARY.d.ts +2 -0
- package/out/schema/type/BINARY.js +18 -0
- package/out/schema/type/BINARY.js.map +1 -0
- package/out/schema/type/BLOCK.d.ts +2 -0
- package/out/schema/type/BLOCK.js +16 -0
- package/out/schema/type/BLOCK.js.map +1 -0
- package/out/schema/type/BOOLEAN.d.ts +1 -0
- package/out/schema/type/BOOLEAN.js +6 -0
- package/out/schema/type/BOOLEAN.js.map +1 -0
- package/out/schema/type/DATE.d.ts +1 -0
- package/out/schema/type/DATE.js +6 -0
- package/out/schema/type/DATE.js.map +1 -0
- package/out/schema/type/EMAIL.d.ts +1 -0
- package/out/schema/type/EMAIL.js +6 -0
- package/out/schema/type/EMAIL.js.map +1 -0
- package/out/schema/type/ENUM.d.ts +2 -0
- package/out/schema/type/ENUM.js +21 -0
- package/out/schema/type/ENUM.js.map +1 -0
- package/out/schema/type/GROUP.d.ts +2 -0
- package/out/schema/type/GROUP.js +16 -0
- package/out/schema/type/GROUP.js.map +1 -0
- package/out/schema/type/HEXADECIMAL.d.ts +2 -0
- package/out/schema/type/HEXADECIMAL.js +18 -0
- package/out/schema/type/HEXADECIMAL.js.map +1 -0
- package/out/schema/type/INLINE.d.ts +2 -0
- package/out/schema/type/INLINE.js +16 -0
- package/out/schema/type/INLINE.js.map +1 -0
- package/out/schema/type/INTEGER.d.ts +1 -0
- package/out/schema/type/INTEGER.js +6 -0
- package/out/schema/type/INTEGER.js.map +1 -0
- package/out/schema/type/MARKDOWN.d.ts +2 -0
- package/out/schema/type/MARKDOWN.js +17 -0
- package/out/schema/type/MARKDOWN.js.map +1 -0
- package/out/schema/type/NATURAL.d.ts +1 -0
- package/out/schema/type/NATURAL.js +6 -0
- package/out/schema/type/NATURAL.js.map +1 -0
- package/out/schema/type/NUMBER.d.ts +1 -0
- package/out/schema/type/NUMBER.js +6 -0
- package/out/schema/type/NUMBER.js.map +1 -0
- package/out/schema/type/TEXT.d.ts +2 -0
- package/out/schema/type/TEXT.js +15 -0
- package/out/schema/type/TEXT.js.map +1 -0
- package/out/schema/type/TIME.d.ts +1 -0
- package/out/schema/type/TIME.js +6 -0
- package/out/schema/type/TIME.js.map +1 -0
- package/out/schema/type/TIMESTAMP.d.ts +1 -0
- package/out/schema/type/TIMESTAMP.js +6 -0
- package/out/schema/type/TIMESTAMP.js.map +1 -0
- package/out/schema/type/URL.d.ts +2 -0
- package/out/schema/type/URL.js +27 -0
- package/out/schema/type/URL.js.map +1 -0
- package/out/schema/type/UUID.d.ts +1 -0
- package/out/schema/type/UUID.js +6 -0
- package/out/schema/type/UUID.js.map +1 -0
- package/out/schema/type/binaryValue.d.ts +2 -0
- package/out/schema/type/binaryValue.js +13 -0
- package/out/schema/type/binaryValue.js.map +1 -0
- package/out/schema/type/regexType.d.ts +2 -0
- package/out/schema/type/regexType.js +20 -0
- package/out/schema/type/regexType.js.map +1 -0
- package/out/template/ChildLine.d.ts +12 -0
- package/out/template/ChildLine.js +28 -0
- package/out/template/ChildLine.js.map +1 -0
- package/out/template/ChildLineParser.d.ts +7 -0
- package/out/template/ChildLineParser.js +98 -0
- package/out/template/ChildLineParser.js.map +1 -0
- package/out/template/MetaTemplateSchemaProvider.d.ts +8 -0
- package/out/template/MetaTemplateSchemaProvider.js +35 -0
- package/out/template/MetaTemplateSchemaProvider.js.map +1 -0
- package/out/template/TemplateParser.d.ts +3 -0
- package/out/template/TemplateParser.js +214 -0
- package/out/template/TemplateParser.js.map +1 -0
- package/out/template/TemplateSchemaProviderMemory.d.ts +6 -0
- package/out/template/TemplateSchemaProviderMemory.js +37 -0
- package/out/template/TemplateSchemaProviderMemory.js.map +1 -0
- package/package.json +45 -0
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { ChildDefinition } from "./ChildDefinition";
|
|
2
|
+
export declare class NodeDefinition {
|
|
3
|
+
private readonly name;
|
|
4
|
+
private readonly normalizedName;
|
|
5
|
+
private readonly type;
|
|
6
|
+
private description;
|
|
7
|
+
private readonly children;
|
|
8
|
+
private readonly values;
|
|
9
|
+
constructor(name: string, type: string, line: number, description: string | undefined);
|
|
10
|
+
getName(): string;
|
|
11
|
+
getNormalizedName(): string;
|
|
12
|
+
getType(): string;
|
|
13
|
+
getChildren(): ReadonlyMap<string, ChildDefinition>;
|
|
14
|
+
getDescription(): string | undefined;
|
|
15
|
+
setDescription(description: string): void;
|
|
16
|
+
addChildDefinition(childDefinition: ChildDefinition): void;
|
|
17
|
+
addValue(value: string, line?: number): void;
|
|
18
|
+
isAllowedValue(value: string): boolean;
|
|
19
|
+
getValues(): ReadonlySet<string>;
|
|
20
|
+
toJSON(): {
|
|
21
|
+
name: string;
|
|
22
|
+
normalizedName: string;
|
|
23
|
+
type: string;
|
|
24
|
+
description: string | undefined;
|
|
25
|
+
children: {
|
|
26
|
+
name: string;
|
|
27
|
+
normalizedName: string;
|
|
28
|
+
namespace: string;
|
|
29
|
+
min: number | null;
|
|
30
|
+
max: number | null;
|
|
31
|
+
}[];
|
|
32
|
+
values: string[];
|
|
33
|
+
};
|
|
34
|
+
}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.NodeDefinition = void 0;
|
|
4
|
+
const ValidationException_1 = require("../exceptions/ValidationException");
|
|
5
|
+
const StringUtils_1 = require("../core/StringUtils");
|
|
6
|
+
class NodeDefinition {
|
|
7
|
+
constructor(name, type, line, description) {
|
|
8
|
+
this.children = new Map();
|
|
9
|
+
this.values = new Set();
|
|
10
|
+
this.name = StringUtils_1.StringUtils.compactSpaces(name);
|
|
11
|
+
this.normalizedName = StringUtils_1.StringUtils.normalize(name);
|
|
12
|
+
this.type = type;
|
|
13
|
+
this.description = description;
|
|
14
|
+
if (this.normalizedName.length === 0) {
|
|
15
|
+
throw new ValidationException_1.ValidationException(line, "INVALID_NODE_NAME", `Node name not valid: ${name}`);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
getName() {
|
|
19
|
+
return this.name;
|
|
20
|
+
}
|
|
21
|
+
getNormalizedName() {
|
|
22
|
+
return this.normalizedName;
|
|
23
|
+
}
|
|
24
|
+
getType() {
|
|
25
|
+
return this.type;
|
|
26
|
+
}
|
|
27
|
+
getChildren() {
|
|
28
|
+
return this.children;
|
|
29
|
+
}
|
|
30
|
+
getDescription() {
|
|
31
|
+
return this.description;
|
|
32
|
+
}
|
|
33
|
+
setDescription(description) {
|
|
34
|
+
this.description = description;
|
|
35
|
+
}
|
|
36
|
+
addChildDefinition(childDefinition) {
|
|
37
|
+
const qname = childDefinition.getQualifiedName();
|
|
38
|
+
if (this.children.has(qname)) {
|
|
39
|
+
throw new ValidationException_1.ValidationException(0, "CHILD_DEF_ALREADY_DEFINED", `Exists a previous node definition with: ${qname}`);
|
|
40
|
+
}
|
|
41
|
+
this.children.set(qname, childDefinition);
|
|
42
|
+
}
|
|
43
|
+
// STXT-SCHEMA-SPEC 13.9 / STXT-TEMPLATE-SPEC 14.14: no puede haber valores duplicados
|
|
44
|
+
// tras la normalización por trim. Mismo código que ChildLineParser: es la misma condición
|
|
45
|
+
// por la otra puerta de entrada.
|
|
46
|
+
addValue(value, line) {
|
|
47
|
+
const trimmed = value?.trim() ?? "";
|
|
48
|
+
if (this.values.has(trimmed)) {
|
|
49
|
+
throw new ValidationException_1.ValidationException(line ?? 0, "VALUE_DUPLICATED", `The values ${trimmed} is duplicated`);
|
|
50
|
+
}
|
|
51
|
+
this.values.add(trimmed);
|
|
52
|
+
}
|
|
53
|
+
isAllowedValue(value) {
|
|
54
|
+
if (this.values.size === 0) {
|
|
55
|
+
return true;
|
|
56
|
+
}
|
|
57
|
+
return this.values.has(value);
|
|
58
|
+
}
|
|
59
|
+
getValues() {
|
|
60
|
+
return this.values;
|
|
61
|
+
}
|
|
62
|
+
toJSON() {
|
|
63
|
+
return {
|
|
64
|
+
name: this.getName(),
|
|
65
|
+
normalizedName: this.getNormalizedName(),
|
|
66
|
+
type: this.getType(),
|
|
67
|
+
description: this.description,
|
|
68
|
+
children: Array.from(this.getChildren().values()).map(c => c.toJSON()),
|
|
69
|
+
values: Array.from(this.getValues()),
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
exports.NodeDefinition = NodeDefinition;
|
|
74
|
+
//# sourceMappingURL=NodeDefinition.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NodeDefinition.js","sourceRoot":"","sources":["../../src/schema/NodeDefinition.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { NodeDefinition } from "./NodeDefinition";
|
|
2
|
+
export declare class Schema {
|
|
3
|
+
static readonly SCHEMA_NAMESPACE = "@stxt.schema";
|
|
4
|
+
private readonly nodes;
|
|
5
|
+
private readonly namespace;
|
|
6
|
+
private readonly description;
|
|
7
|
+
constructor(namespace: string | null | undefined, line: number, description: string | undefined);
|
|
8
|
+
getNodes(): ReadonlyMap<string, NodeDefinition>;
|
|
9
|
+
getNodeDefinition(name: string): NodeDefinition | undefined;
|
|
10
|
+
addNodeDefinition(nodeDefinition: NodeDefinition): void;
|
|
11
|
+
getNamespace(): string;
|
|
12
|
+
toJSON(): {
|
|
13
|
+
namespace: string;
|
|
14
|
+
nodes: {
|
|
15
|
+
name: string;
|
|
16
|
+
normalizedName: string;
|
|
17
|
+
type: string;
|
|
18
|
+
description: string | undefined;
|
|
19
|
+
children: {
|
|
20
|
+
name: string;
|
|
21
|
+
normalizedName: string;
|
|
22
|
+
namespace: string;
|
|
23
|
+
min: number | null;
|
|
24
|
+
max: number | null;
|
|
25
|
+
}[];
|
|
26
|
+
values: string[];
|
|
27
|
+
}[];
|
|
28
|
+
};
|
|
29
|
+
toString(): string;
|
|
30
|
+
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Schema = void 0;
|
|
4
|
+
const NamespaceValidator_1 = require("../core/NamespaceValidator");
|
|
5
|
+
const StringUtils_1 = require("../core/StringUtils");
|
|
6
|
+
const ValidationException_1 = require("../exceptions/ValidationException");
|
|
7
|
+
class Schema {
|
|
8
|
+
constructor(namespace, line, description) {
|
|
9
|
+
this.nodes = new Map();
|
|
10
|
+
this.namespace = StringUtils_1.StringUtils.lowerCase(namespace);
|
|
11
|
+
this.description = description;
|
|
12
|
+
NamespaceValidator_1.NamespaceValidator.validateNamespaceFormat(this.namespace, line);
|
|
13
|
+
}
|
|
14
|
+
getNodes() {
|
|
15
|
+
return this.nodes;
|
|
16
|
+
}
|
|
17
|
+
getNodeDefinition(name) {
|
|
18
|
+
return this.nodes.get(StringUtils_1.StringUtils.normalize(name));
|
|
19
|
+
}
|
|
20
|
+
addNodeDefinition(nodeDefinition) {
|
|
21
|
+
const qname = nodeDefinition.getNormalizedName();
|
|
22
|
+
if (this.nodes.has(qname)) {
|
|
23
|
+
throw new ValidationException_1.ValidationException(0, "NODE_DEF_ALREADY_DEFINED", `Exists a previous node definition with: ${qname}`);
|
|
24
|
+
}
|
|
25
|
+
this.nodes.set(qname, nodeDefinition);
|
|
26
|
+
}
|
|
27
|
+
getNamespace() {
|
|
28
|
+
return this.namespace;
|
|
29
|
+
}
|
|
30
|
+
// Dentro de la clase Schema
|
|
31
|
+
toJSON() {
|
|
32
|
+
return {
|
|
33
|
+
namespace: this.namespace,
|
|
34
|
+
nodes: Array.from(this.nodes.values()).map(n => n.toJSON()),
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
toString() {
|
|
38
|
+
return JSON.stringify(this, null, 2); // pretty print
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
exports.Schema = Schema;
|
|
42
|
+
Schema.SCHEMA_NAMESPACE = "@stxt.schema";
|
|
43
|
+
//# sourceMappingURL=Schema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Schema.js","sourceRoot":"","sources":["../../src/schema/Schema.ts"],"names":[],"mappings":";;;AAAA,mEAAgE;AAChE,qDAAkD;AAClD,2EAAwE;AAGxE,MAAa,MAAM;IAOf,YAAY,SAAoC,EAAE,IAAY,EAAE,WAA+B;QAJ9E,UAAK,GAAgC,IAAI,GAAG,EAAE,CAAC;QAK5D,IAAI,CAAC,SAAS,GAAG,yBAAW,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QAClD,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;QAC/B,uCAAkB,CAAC,uBAAuB,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;IACrE,CAAC;IAED,QAAQ;QACJ,OAAO,IAAI,CAAC,KAAK,CAAC;IACtB,CAAC;IAED,iBAAiB,CAAC,IAAY;QAC1B,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,yBAAW,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;IACvD,CAAC;IAED,iBAAiB,CAAC,cAA8B;QAC5C,MAAM,KAAK,GAAG,cAAc,CAAC,iBAAiB,EAAE,CAAC;QAEjD,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;YACxB,MAAM,IAAI,yCAAmB,CAAC,CAAC,EAAE,0BAA0B,EAAE,2CAA2C,KAAK,EAAE,CAAC,CAAC;QACrH,CAAC;QAED,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,cAAc,CAAC,CAAC;IAC1C,CAAC;IAED,YAAY;QACR,OAAO,IAAI,CAAC,SAAS,CAAC;IAC1B,CAAC;IAED,4BAA4B;IAE5B,MAAM;QACF,OAAO;YACH,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;SAC9D,CAAC;IACN,CAAC;IAED,QAAQ;QACJ,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,eAAe;IACzD,CAAC;;AA9CL,wBAgDC;AA/CmB,uBAAgB,GAAG,cAAc,AAAjB,CAAkB"}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.transformNodeToSchema = transformNodeToSchema;
|
|
4
|
+
const Schema_1 = require("./Schema");
|
|
5
|
+
const NodeDefinition_1 = require("./NodeDefinition");
|
|
6
|
+
const ChildDefinition_1 = require("./ChildDefinition");
|
|
7
|
+
const ValidationException_1 = require("../exceptions/ValidationException");
|
|
8
|
+
const RuntimeException_1 = require("../exceptions/RuntimeException");
|
|
9
|
+
const NameNamespaceParser_1 = require("../core/NameNamespaceParser");
|
|
10
|
+
const TypeRegistry_1 = require("./TypeRegistry");
|
|
11
|
+
function transformNodeToSchema(node) {
|
|
12
|
+
// Node name
|
|
13
|
+
const nodeName = node.getNormalizedName();
|
|
14
|
+
const namespaceSchema = node.getNamespace();
|
|
15
|
+
// Obtenemos name y namespace
|
|
16
|
+
if (nodeName !== "schema" || namespaceSchema !== Schema_1.Schema.SCHEMA_NAMESPACE) {
|
|
17
|
+
throw new ValidationException_1.ValidationException(node.getLine(), "NOT_STXT_SCHEMA", `Se espera schema(${Schema_1.Schema.SCHEMA_NAMESPACE}) y es ${nodeName}(${namespaceSchema})`);
|
|
18
|
+
}
|
|
19
|
+
// Obtenemos description
|
|
20
|
+
const descrip = node.getChild("description")?.getText();
|
|
21
|
+
const schema = new Schema_1.Schema(node.getValue(), node.getLine(), descrip);
|
|
22
|
+
// Para validar
|
|
23
|
+
const allNames = new Set(); // Para validar que existan los childs
|
|
24
|
+
// Obtenemos los nodos
|
|
25
|
+
for (const n of node.getChildrenByName("node")) {
|
|
26
|
+
const schNode = createFrom(n, schema.getNamespace());
|
|
27
|
+
schema.addNodeDefinition(schNode);
|
|
28
|
+
allNames.add(schNode.getNormalizedName());
|
|
29
|
+
}
|
|
30
|
+
// Validamos que todos los nombres estén definidos
|
|
31
|
+
for (const schNode of schema.getNodes().values()) {
|
|
32
|
+
for (const schChild of schNode.getChildren().values()) {
|
|
33
|
+
// Sólo validamos del mismo namespace
|
|
34
|
+
if (schChild.getNamespace() === schema.getNamespace()) {
|
|
35
|
+
// Ojo: en Java aquí se usa schChild.getNormalizedName(), pero ChildDefinition no lo expone.
|
|
36
|
+
// Para mantener el comportamiento, se recomienda añadir getNormalizedName() a ChildDefinition.
|
|
37
|
+
const childNorm = schChild.getNormalizedName?.();
|
|
38
|
+
if (!childNorm) {
|
|
39
|
+
throw new RuntimeException_1.RuntimeException("CHILD_DEFINITION_API_MISMATCH", "ChildDefinition.getNormalizedName() is missing in TypeScript version. Add it to ChildDefinition.");
|
|
40
|
+
}
|
|
41
|
+
if (!allNames.has(childNorm)) {
|
|
42
|
+
throw new ValidationException_1.ValidationException(0, "CHILD_NOT_DEFINED", `Child ${childNorm} not defined in ${schema.getNamespace()}`);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
return schema;
|
|
48
|
+
}
|
|
49
|
+
function createFrom(n, namespace) {
|
|
50
|
+
const name = n.getValue();
|
|
51
|
+
let type = "INLINE";
|
|
52
|
+
const typeNode = n.getChild("type");
|
|
53
|
+
if (typeNode) {
|
|
54
|
+
type = typeNode.getValue();
|
|
55
|
+
}
|
|
56
|
+
const description = n.getChild("description")?.getText();
|
|
57
|
+
const result = new NodeDefinition_1.NodeDefinition(name, type, n.getLine(), description);
|
|
58
|
+
const children = n.getChild("children");
|
|
59
|
+
if (children) {
|
|
60
|
+
// Error de schema 13.5: Children en un Node cuyo tipo no admite hijos
|
|
61
|
+
if (!TypeRegistry_1.TypeRegistry.admitsChildren(type)) {
|
|
62
|
+
throw new ValidationException_1.ValidationException(children.getLine(), "CHILDREN_NOT_ALLOWED_FOR_TYPE", `Type ${type} does not allow children (node ${name})`);
|
|
63
|
+
}
|
|
64
|
+
for (const child of children.getChildrenByName("child")) {
|
|
65
|
+
putChildToSchemaNode(result, child, namespace);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
// Miramos values
|
|
69
|
+
let valuesNodes = n.getChildrenByName("values");
|
|
70
|
+
if (valuesNodes && valuesNodes.length > 0) {
|
|
71
|
+
if (type !== "ENUM") {
|
|
72
|
+
throw new ValidationException_1.ValidationException(n.getLine(), "VALUES_ONLY_SUPPORTED_BY_ENUM", `Values only supported for type ENUM, not for type ${type}`);
|
|
73
|
+
}
|
|
74
|
+
if (valuesNodes.length > 1) {
|
|
75
|
+
throw new RuntimeException_1.RuntimeException("INVALID_SIZE_VALUES", `Unexpected number of values: ${valuesNodes.length}`);
|
|
76
|
+
}
|
|
77
|
+
const valuesNode = valuesNodes[0];
|
|
78
|
+
const values = valuesNode.getChildrenByName("value");
|
|
79
|
+
for (const v of values) {
|
|
80
|
+
result.addValue(v.getValue(), v.getLine());
|
|
81
|
+
}
|
|
82
|
+
// Para la comprobación final de ENUM
|
|
83
|
+
valuesNodes = values;
|
|
84
|
+
}
|
|
85
|
+
// Miramos enum
|
|
86
|
+
if (type === "ENUM" && (!valuesNodes || valuesNodes.length === 0)) {
|
|
87
|
+
throw new ValidationException_1.ValidationException(n.getLine(), "VALUES_EMPTY_FOR_ENUM", "ENUM Type must include values");
|
|
88
|
+
}
|
|
89
|
+
return result;
|
|
90
|
+
}
|
|
91
|
+
function putChildToSchemaNode(schemaNode, child, defNamespace) {
|
|
92
|
+
// Obtenemos name y namespace
|
|
93
|
+
const ns = NameNamespaceParser_1.NameNamespaceParser.parse(child.getValue(), defNamespace, child.getLine(), child.getValue());
|
|
94
|
+
const name = ns.getName();
|
|
95
|
+
const namespace = ns.getNamespace();
|
|
96
|
+
const min = getInteger(child, "min");
|
|
97
|
+
const max = getInteger(child, "max");
|
|
98
|
+
// Cardinalidad inválida si Min > Max (STXT-SCHEMA-SPEC 10 y 13.7)
|
|
99
|
+
if (min !== null && max !== null && min > max) {
|
|
100
|
+
throw new ValidationException_1.ValidationException(child.getLine(), "MIN_GREATER_THAN_MAX", `Min ${min} greater than Max ${max}`);
|
|
101
|
+
}
|
|
102
|
+
const schemaChild = new ChildDefinition_1.ChildDefinition(name, namespace, min, max, child.getLine());
|
|
103
|
+
schemaNode.addChildDefinition(schemaChild);
|
|
104
|
+
}
|
|
105
|
+
function getInteger(node, name) {
|
|
106
|
+
const n = node.getChild(name);
|
|
107
|
+
if (!n) {
|
|
108
|
+
return null;
|
|
109
|
+
}
|
|
110
|
+
const raw = n.getValue();
|
|
111
|
+
const parsed = Number.parseInt(raw, 10);
|
|
112
|
+
if (Number.isNaN(parsed)) {
|
|
113
|
+
throw new ValidationException_1.ValidationException(node.getLine(), "INVALID_INTEGER", `Integer not valid: ${raw}`);
|
|
114
|
+
}
|
|
115
|
+
return parsed;
|
|
116
|
+
}
|
|
117
|
+
//# sourceMappingURL=SchemaParser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SchemaParser.js","sourceRoot":"","sources":["../../src/schema/SchemaParser.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SchemaProvider.js","sourceRoot":"","sources":["../../src/schema/SchemaProvider.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { Schema } from "./Schema";
|
|
2
|
+
import { SchemaProvider } from "./SchemaProvider";
|
|
3
|
+
export declare class SchemaProviderMemory implements SchemaProvider {
|
|
4
|
+
private readonly parentSchema;
|
|
5
|
+
constructor(parent?: SchemaProvider | null | undefined);
|
|
6
|
+
protected readonly schemas: Map<string, Schema>;
|
|
7
|
+
getSchema(namespace: string): Schema | undefined | null;
|
|
8
|
+
addSchema(txt: string): void;
|
|
9
|
+
clear(): void;
|
|
10
|
+
getAllSchemas(): ReadonlyArray<Schema>;
|
|
11
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SchemaProviderMemory = void 0;
|
|
4
|
+
const Parser_1 = require("../core/Parser");
|
|
5
|
+
const StringUtils_1 = require("../core/StringUtils");
|
|
6
|
+
const SchemaParser_1 = require("./SchemaParser");
|
|
7
|
+
const SchemaProviderMeta_1 = require("./SchemaProviderMeta");
|
|
8
|
+
const SchemaValidator_1 = require("./SchemaValidator");
|
|
9
|
+
class SchemaProviderMemory {
|
|
10
|
+
constructor(parent) {
|
|
11
|
+
this.schemas = new Map();
|
|
12
|
+
if (!parent) {
|
|
13
|
+
this.parentSchema = new SchemaProviderMeta_1.SchemaProviderMeta();
|
|
14
|
+
}
|
|
15
|
+
else {
|
|
16
|
+
this.parentSchema = parent;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
getSchema(namespace) {
|
|
20
|
+
const key = StringUtils_1.StringUtils.lowerCase(namespace);
|
|
21
|
+
let result = this.schemas.get(key);
|
|
22
|
+
if (!result) {
|
|
23
|
+
result = this.parentSchema.getSchema(namespace);
|
|
24
|
+
}
|
|
25
|
+
return result;
|
|
26
|
+
}
|
|
27
|
+
addSchema(txt) {
|
|
28
|
+
const parser = new Parser_1.Parser();
|
|
29
|
+
const node = parser.parse(txt)[0];
|
|
30
|
+
const schema = (0, SchemaParser_1.transformNodeToSchema)(node);
|
|
31
|
+
const schemaValidator = new SchemaValidator_1.SchemaValidator(new SchemaProviderMeta_1.SchemaProviderMeta(), true);
|
|
32
|
+
schemaValidator.validate(node);
|
|
33
|
+
const key = schema.getNamespace();
|
|
34
|
+
this.schemas.set(key, schema);
|
|
35
|
+
}
|
|
36
|
+
clear() {
|
|
37
|
+
this.schemas.clear();
|
|
38
|
+
}
|
|
39
|
+
getAllSchemas() {
|
|
40
|
+
return Array.from(this.schemas.values());
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
exports.SchemaProviderMemory = SchemaProviderMemory;
|
|
44
|
+
//# sourceMappingURL=SchemaProviderMemory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SchemaProviderMemory.js","sourceRoot":"","sources":["../../src/schema/SchemaProviderMemory.ts"],"names":[],"mappings":";;;AACA,2CAAwC;AACxC,qDAAkD;AAElD,iDAAuD;AAEvD,6DAA0D;AAC1D,uDAAoD;AAEpD,MAAa,oBAAoB;IAG7B,YAAY,MAA0C;QAQnC,YAAO,GAAwB,IAAI,GAAG,EAAE,CAAC;QAPxD,IAAI,CAAC,MAAM,EAAE,CAAC;YACV,IAAI,CAAC,YAAY,GAAG,IAAI,uCAAkB,EAAE,CAAC;QACjD,CAAC;aAAM,CAAC;YACJ,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC;QAC/B,CAAC;IACL,CAAC;IAID,SAAS,CAAC,SAAiB;QACvB,MAAM,GAAG,GAAG,yBAAW,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QAE7C,IAAI,MAAM,GAA8B,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC9D,IAAI,CAAC,MAAM,EAAE,CAAC;YACV,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QACpD,CAAC;QACD,OAAO,MAAM,CAAC;IAClB,CAAC;IAED,SAAS,CAAC,GAAW;QACjB,MAAM,MAAM,GAAW,IAAI,eAAM,EAAE,CAAC;QACpC,MAAM,IAAI,GAAS,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACxC,MAAM,MAAM,GAAW,IAAA,oCAAqB,EAAC,IAAI,CAAC,CAAC;QAEnD,MAAM,eAAe,GAAG,IAAI,iCAAe,CAAC,IAAI,uCAAkB,EAAE,EAAE,IAAI,CAAC,CAAC;QAC5E,eAAe,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QAE/B,MAAM,GAAG,GAAG,MAAM,CAAC,YAAY,EAAE,CAAC;QAClC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IAClC,CAAC;IAED,KAAK;QACD,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;IACzB,CAAC;IAED,aAAa;QACT,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAC7C,CAAC;CACJ;AA1CD,oDA0CC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { Schema } from "./Schema";
|
|
2
|
+
import { SchemaProvider } from "./SchemaProvider";
|
|
3
|
+
export declare class SchemaProviderMeta implements SchemaProvider {
|
|
4
|
+
private static readonly META_TEXT;
|
|
5
|
+
private readonly meta;
|
|
6
|
+
constructor();
|
|
7
|
+
getSchema(namespace: string): Schema;
|
|
8
|
+
}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SchemaProviderMeta = void 0;
|
|
4
|
+
const Schema_1 = require("./Schema");
|
|
5
|
+
const Parser_1 = require("../core/Parser");
|
|
6
|
+
const ValidationException_1 = require("../exceptions/ValidationException");
|
|
7
|
+
const RuntimeException_1 = require("../exceptions/RuntimeException");
|
|
8
|
+
const SchemaParser_1 = require("./SchemaParser");
|
|
9
|
+
class SchemaProviderMeta {
|
|
10
|
+
constructor() {
|
|
11
|
+
const parser = new Parser_1.Parser();
|
|
12
|
+
const nodes = parser.parse(SchemaProviderMeta.META_TEXT);
|
|
13
|
+
if (nodes.length !== 1) {
|
|
14
|
+
throw new ValidationException_1.ValidationException(0, "META_SCHEMA_INVALID", `Meta schema must produce exactly 1 document, got ${nodes.length}`);
|
|
15
|
+
}
|
|
16
|
+
this.meta = (0, SchemaParser_1.transformNodeToSchema)(nodes[0]);
|
|
17
|
+
}
|
|
18
|
+
getSchema(namespace) {
|
|
19
|
+
if (namespace !== Schema_1.Schema.SCHEMA_NAMESPACE) {
|
|
20
|
+
throw new RuntimeException_1.RuntimeException("RESOURCE_NOT_FOUND", `Not found '${namespace}' in namespace: ${Schema_1.Schema.SCHEMA_NAMESPACE}`);
|
|
21
|
+
}
|
|
22
|
+
if (!this.meta) {
|
|
23
|
+
throw new ValidationException_1.ValidationException(0, "META_SCHEMA_NOT_AVAILABLE", "Meta schema not available");
|
|
24
|
+
}
|
|
25
|
+
return this.meta;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
exports.SchemaProviderMeta = SchemaProviderMeta;
|
|
29
|
+
SchemaProviderMeta.META_TEXT = `Schema (@stxt.schema): @stxt.schema
|
|
30
|
+
Node: Schema
|
|
31
|
+
Children:
|
|
32
|
+
Child: Description
|
|
33
|
+
Max: 1
|
|
34
|
+
Child: Node
|
|
35
|
+
Min: 1
|
|
36
|
+
Node: Node
|
|
37
|
+
Children:
|
|
38
|
+
Child: Type
|
|
39
|
+
Max: 1
|
|
40
|
+
Child: Children
|
|
41
|
+
Max: 1
|
|
42
|
+
Child: Description
|
|
43
|
+
Max: 1
|
|
44
|
+
Child: Values
|
|
45
|
+
Max: 1
|
|
46
|
+
Node: Children
|
|
47
|
+
Type: GROUP
|
|
48
|
+
Children:
|
|
49
|
+
Child: Child
|
|
50
|
+
Min: 1
|
|
51
|
+
Node: Description
|
|
52
|
+
Type: TEXT
|
|
53
|
+
Node: Child
|
|
54
|
+
Children:
|
|
55
|
+
Child: Min
|
|
56
|
+
Max: 1
|
|
57
|
+
Child: Max
|
|
58
|
+
Max: 1
|
|
59
|
+
Node: Min
|
|
60
|
+
Type: NATURAL
|
|
61
|
+
Node: Max
|
|
62
|
+
Type: NATURAL
|
|
63
|
+
Node: Type
|
|
64
|
+
Type: ENUM
|
|
65
|
+
Values:
|
|
66
|
+
Value: INLINE
|
|
67
|
+
Value: BLOCK
|
|
68
|
+
Value: TEXT
|
|
69
|
+
Value: BOOLEAN
|
|
70
|
+
Value: URL
|
|
71
|
+
Value: INTEGER
|
|
72
|
+
Value: NATURAL
|
|
73
|
+
Value: NUMBER
|
|
74
|
+
Value: DATE
|
|
75
|
+
Value: TIME
|
|
76
|
+
Value: TIMESTAMP
|
|
77
|
+
Value: UUID
|
|
78
|
+
Value: EMAIL
|
|
79
|
+
Value: HEXADECIMAL
|
|
80
|
+
Value: BINARY
|
|
81
|
+
Value: BASE64
|
|
82
|
+
Value: GROUP
|
|
83
|
+
Value: ENUM
|
|
84
|
+
Value: MARKDOWN
|
|
85
|
+
Node: Values
|
|
86
|
+
Type: GROUP
|
|
87
|
+
Children:
|
|
88
|
+
Child: Value
|
|
89
|
+
Min: 1
|
|
90
|
+
Node: Value
|
|
91
|
+
`;
|
|
92
|
+
//# sourceMappingURL=SchemaProviderMeta.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SchemaProviderMeta.js","sourceRoot":"","sources":["../../src/schema/SchemaProviderMeta.ts"],"names":[],"mappings":";;;AAAA,qCAAkC;AAElC,2CAAwC;AAExC,2EAAwE;AACxE,qEAAkE;AAClE,iDAAuD;AAEvD,MAAa,kBAAkB;IAmE3B;QACI,MAAM,MAAM,GAAG,IAAI,eAAM,EAAE,CAAC;QAC5B,MAAM,KAAK,GAAW,MAAM,CAAC,KAAK,CAAC,kBAAkB,CAAC,SAAS,CAAC,CAAC;QAEjE,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACrB,MAAM,IAAI,yCAAmB,CAAC,CAAC,EAAE,qBAAqB,EAAE,oDAAoD,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;QAChI,CAAC;QAED,IAAI,CAAC,IAAI,GAAG,IAAA,oCAAqB,EAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAChD,CAAC;IAED,SAAS,CAAC,SAAiB;QACvB,IAAI,SAAS,KAAK,eAAM,CAAC,gBAAgB,EAAE,CAAC;YACxC,MAAM,IAAI,mCAAgB,CAAC,oBAAoB,EAAE,cAAc,SAAS,mBAAmB,eAAM,CAAC,gBAAgB,EAAE,CAAC,CAAC;QAC1H,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YACb,MAAM,IAAI,yCAAmB,CAAC,CAAC,EAAE,2BAA2B,EAAE,2BAA2B,CAAC,CAAC;QAC/F,CAAC;QAED,OAAO,IAAI,CAAC,IAAI,CAAC;IACrB,CAAC;;AAxFL,gDAyFC;AAxF2B,4BAAS,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8DvC,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { Node } from "../core/Node";
|
|
2
|
+
import { ValidationException } from "../exceptions/ValidationException";
|
|
3
|
+
import { Validator } from "../processors/Validator";
|
|
4
|
+
import { SchemaProvider } from "./SchemaProvider";
|
|
5
|
+
import { Schema } from "./Schema";
|
|
6
|
+
export declare class SchemaValidator implements Validator {
|
|
7
|
+
private readonly schemaProvider;
|
|
8
|
+
private readonly recursiveValidation;
|
|
9
|
+
constructor(schemaProvider: SchemaProvider, recursive?: boolean);
|
|
10
|
+
validate(node: Node): ValidationException[];
|
|
11
|
+
validateAgainstSchema(node: Node, schema: Schema): ValidationException[];
|
|
12
|
+
private static validateChildrenDeclared;
|
|
13
|
+
private static validateValue;
|
|
14
|
+
private static validateCount;
|
|
15
|
+
private static validateCountChild;
|
|
16
|
+
}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SchemaValidator = void 0;
|
|
4
|
+
const ValidationException_1 = require("../exceptions/ValidationException");
|
|
5
|
+
const TypeRegistry_1 = require("./TypeRegistry");
|
|
6
|
+
class SchemaValidator {
|
|
7
|
+
constructor(schemaProvider, recursive = false) {
|
|
8
|
+
this.schemaProvider = schemaProvider;
|
|
9
|
+
this.recursiveValidation = recursive;
|
|
10
|
+
}
|
|
11
|
+
validate(node) {
|
|
12
|
+
const errors = [];
|
|
13
|
+
// Obtenemos namespace
|
|
14
|
+
const namespace = node.getNamespace();
|
|
15
|
+
const schema = this.schemaProvider.getSchema(namespace);
|
|
16
|
+
if (!schema) {
|
|
17
|
+
errors.push(new ValidationException_1.ValidationException(node.getLine(), "SCHEMA_NOT_FOUND", `Not found schema: ${namespace}`));
|
|
18
|
+
return errors;
|
|
19
|
+
}
|
|
20
|
+
// Validamos nodo
|
|
21
|
+
errors.push(...this.validateAgainstSchema(node, schema));
|
|
22
|
+
// Validamos children
|
|
23
|
+
if (this.recursiveValidation) {
|
|
24
|
+
for (const childNode of node.getChildren()) {
|
|
25
|
+
errors.push(...this.validate(childNode));
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
return errors;
|
|
29
|
+
}
|
|
30
|
+
validateAgainstSchema(node, schema) {
|
|
31
|
+
const errors = [];
|
|
32
|
+
const schemaNode = schema.getNodeDefinition(node.getNormalizedName());
|
|
33
|
+
if (!schemaNode) {
|
|
34
|
+
const error = `NOT EXIST NODE ${node.getNormalizedName()} for namespace ${schema.getNamespace()}`;
|
|
35
|
+
errors.push(new ValidationException_1.ValidationException(node.getLine(), "NODE_NOT_EXIST_IN_SCHEMA", error));
|
|
36
|
+
return errors;
|
|
37
|
+
}
|
|
38
|
+
errors.push(...SchemaValidator.validateValue(schemaNode, node));
|
|
39
|
+
errors.push(...SchemaValidator.validateChildrenDeclared(schemaNode, node));
|
|
40
|
+
errors.push(...SchemaValidator.validateCount(schemaNode, node));
|
|
41
|
+
return errors;
|
|
42
|
+
}
|
|
43
|
+
// Modelo de contenido cerrado (STXT-SCHEMA-SPEC, sección 6): solo se permiten
|
|
44
|
+
// los hijos directos declarados en la definición del padre; sin Children, cierre total
|
|
45
|
+
static validateChildrenDeclared(nodeDef, node) {
|
|
46
|
+
const errors = [];
|
|
47
|
+
for (const child of node.getChildren()) {
|
|
48
|
+
if (!nodeDef.getChildren().has(child.getQualifiedName())) {
|
|
49
|
+
errors.push(new ValidationException_1.ValidationException(child.getLine(), "CHILD_NOT_DECLARED", `Child '${child.getQualifiedName()}' not declared in node '${node.getQualifiedName()}'`));
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
return errors;
|
|
53
|
+
}
|
|
54
|
+
static validateValue(nodeDef, node) {
|
|
55
|
+
const errors = [];
|
|
56
|
+
const nodeType = nodeDef.getType();
|
|
57
|
+
const validator = TypeRegistry_1.TypeRegistry.get(nodeType);
|
|
58
|
+
if (!validator) {
|
|
59
|
+
errors.push(new ValidationException_1.ValidationException(node.getLine(), "TYPE_NOT_SUPPORTED", `Node type not supported: ${nodeType}`));
|
|
60
|
+
return errors;
|
|
61
|
+
}
|
|
62
|
+
try {
|
|
63
|
+
validator.validate(nodeDef, node);
|
|
64
|
+
}
|
|
65
|
+
catch (e) {
|
|
66
|
+
if (e instanceof ValidationException_1.ValidationException) {
|
|
67
|
+
errors.push(e);
|
|
68
|
+
}
|
|
69
|
+
else if (e instanceof Error) {
|
|
70
|
+
errors.push(new ValidationException_1.ValidationException(node.getLine(), "VALIDATION_ERROR", e.message));
|
|
71
|
+
}
|
|
72
|
+
else {
|
|
73
|
+
errors.push(new ValidationException_1.ValidationException(node.getLine(), "UNKNOWN_VALIDATION_ERROR", String(e)));
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
return errors;
|
|
77
|
+
}
|
|
78
|
+
static validateCount(nodeDef, node) {
|
|
79
|
+
const errors = [];
|
|
80
|
+
const count = new Map();
|
|
81
|
+
const childrenByType = new Map();
|
|
82
|
+
for (const child of node.getChildren()) {
|
|
83
|
+
const childName = child.getQualifiedName();
|
|
84
|
+
count.set(childName, (count.get(childName) ?? 0) + 1);
|
|
85
|
+
if (!childrenByType.has(childName)) {
|
|
86
|
+
childrenByType.set(childName, []);
|
|
87
|
+
}
|
|
88
|
+
childrenByType.get(childName).push(child);
|
|
89
|
+
}
|
|
90
|
+
for (const childDef of nodeDef.getChildren().values()) {
|
|
91
|
+
const qname = childDef.getQualifiedName();
|
|
92
|
+
errors.push(...SchemaValidator.validateCountChild(childDef, count.get(qname) ?? 0, node, childrenByType.get(qname) ?? []));
|
|
93
|
+
}
|
|
94
|
+
return errors;
|
|
95
|
+
}
|
|
96
|
+
static validateCountChild(childDef, childCount, node, children) {
|
|
97
|
+
const errors = [];
|
|
98
|
+
const min = childDef.getMin(); // number | null
|
|
99
|
+
const max = childDef.getMax(); // number | null
|
|
100
|
+
if (min !== null && childCount < min) {
|
|
101
|
+
errors.push(new ValidationException_1.ValidationException(node.getLine(), "INVALID_NUMBER", `${childCount} nodes of '${childDef.getQualifiedName()}' and min is ${min}`));
|
|
102
|
+
}
|
|
103
|
+
if (max !== null && childCount > max) {
|
|
104
|
+
// Error en el parent
|
|
105
|
+
errors.push(new ValidationException_1.ValidationException(node.getLine(), "INVALID_NUMBER", `${childCount} nodes of '${childDef.getQualifiedName()}' and max is ${max}`));
|
|
106
|
+
// Error en cada nodo hijo que excede el máximo permitido
|
|
107
|
+
for (const child of children) {
|
|
108
|
+
errors.push(new ValidationException_1.ValidationException(child.getLine(), "INVALID_NUMBER", `Too many '${childDef.getQualifiedName()}' nodes: found ${childCount}, max is ${max}`));
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
return errors;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
exports.SchemaValidator = SchemaValidator;
|
|
115
|
+
//# sourceMappingURL=SchemaValidator.js.map
|