@canon-protocol/sdk 8.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 (165) hide show
  1. package/dist/canons/Canon.d.ts +2 -0
  2. package/dist/canons/Canon.js +2 -0
  3. package/dist/canons/DefinedCanon.d.ts +5 -0
  4. package/dist/canons/DefinedCanon.js +4 -0
  5. package/dist/canons/EmbeddedCanon.d.ts +3 -0
  6. package/dist/canons/EmbeddedCanon.js +3 -0
  7. package/dist/canons/ReferenceCanon.d.ts +6 -0
  8. package/dist/canons/ReferenceCanon.js +10 -0
  9. package/dist/canons/SubjectCanon.d.ts +6 -0
  10. package/dist/canons/SubjectCanon.js +6 -0
  11. package/dist/canons/index.d.ts +5 -0
  12. package/dist/canons/index.js +5 -0
  13. package/dist/ctl/CtlCanonUri.d.ts +28 -0
  14. package/dist/ctl/CtlCanonUri.js +230 -0
  15. package/dist/ctl/CtlGraphResolver.d.ts +14 -0
  16. package/dist/ctl/CtlGraphResolver.js +411 -0
  17. package/dist/ctl/CtlMarkdownRenderer.d.ts +17 -0
  18. package/dist/ctl/CtlMarkdownRenderer.js +262 -0
  19. package/dist/ctl/CtlParser.d.ts +10 -0
  20. package/dist/ctl/CtlParser.js +331 -0
  21. package/dist/ctl/CtlValidator.d.ts +12 -0
  22. package/dist/ctl/CtlValidator.js +207 -0
  23. package/dist/ctl/ResourceTypeClassifier.d.ts +21 -0
  24. package/dist/ctl/ResourceTypeClassifier.js +126 -0
  25. package/dist/ctl/index.d.ts +12 -0
  26. package/dist/ctl/index.js +9 -0
  27. package/dist/filtering/GitIgnoreFilter.d.ts +7 -0
  28. package/dist/filtering/GitIgnoreFilter.js +32 -0
  29. package/dist/filtering/IGitIgnoreFilter.d.ts +3 -0
  30. package/dist/filtering/IGitIgnoreFilter.js +1 -0
  31. package/dist/filtering/index.d.ts +2 -0
  32. package/dist/filtering/index.js +1 -0
  33. package/dist/index.d.ts +19 -0
  34. package/dist/index.js +8 -0
  35. package/dist/parsing/CanonObjectParser.d.ts +21 -0
  36. package/dist/parsing/CanonObjectParser.js +242 -0
  37. package/dist/parsing/CanonParser.d.ts +21 -0
  38. package/dist/parsing/CanonParser.js +457 -0
  39. package/dist/parsing/ICanonObjectParser.d.ts +7 -0
  40. package/dist/parsing/ICanonObjectParser.js +1 -0
  41. package/dist/parsing/PropertyMetadata.d.ts +7 -0
  42. package/dist/parsing/PropertyMetadata.js +7 -0
  43. package/dist/parsing/index.d.ts +6 -0
  44. package/dist/parsing/index.js +3 -0
  45. package/dist/repositories/CompositeCanonDocumentRepository.d.ts +28 -0
  46. package/dist/repositories/CompositeCanonDocumentRepository.js +125 -0
  47. package/dist/repositories/FileSystemCanonDocumentRepository.d.ts +28 -0
  48. package/dist/repositories/FileSystemCanonDocumentRepository.js +295 -0
  49. package/dist/repositories/HttpCanonDocumentRepository.d.ts +24 -0
  50. package/dist/repositories/HttpCanonDocumentRepository.js +79 -0
  51. package/dist/repositories/InMemoryCanonDocumentRepository.d.ts +23 -0
  52. package/dist/repositories/InMemoryCanonDocumentRepository.js +149 -0
  53. package/dist/repositories/PublisherConfig.d.ts +12 -0
  54. package/dist/repositories/PublisherConfig.js +62 -0
  55. package/dist/repositories/PublisherIndex.d.ts +20 -0
  56. package/dist/repositories/PublisherIndex.js +127 -0
  57. package/dist/repositories/RepositoryFactory.d.ts +6 -0
  58. package/dist/repositories/RepositoryFactory.js +13 -0
  59. package/dist/repositories/index.d.ts +9 -0
  60. package/dist/repositories/index.js +7 -0
  61. package/dist/resolution/CanonUri.d.ts +10 -0
  62. package/dist/resolution/CanonUri.js +55 -0
  63. package/dist/resolution/CanonUriBuilder.d.ts +12 -0
  64. package/dist/resolution/CanonUriBuilder.js +51 -0
  65. package/dist/resolution/ResourceResolutionResult.d.ts +9 -0
  66. package/dist/resolution/ResourceResolutionResult.js +1 -0
  67. package/dist/resolution/ResourceResolver.d.ts +27 -0
  68. package/dist/resolution/ResourceResolver.js +266 -0
  69. package/dist/resolution/TypeResolver.d.ts +15 -0
  70. package/dist/resolution/TypeResolver.js +110 -0
  71. package/dist/resolution/index.d.ts +6 -0
  72. package/dist/resolution/index.js +4 -0
  73. package/dist/statements/BooleanStatement.d.ts +3 -0
  74. package/dist/statements/BooleanStatement.js +3 -0
  75. package/dist/statements/EmbeddedStatement.d.ts +4 -0
  76. package/dist/statements/EmbeddedStatement.js +3 -0
  77. package/dist/statements/IStatement.d.ts +2 -0
  78. package/dist/statements/IStatement.js +1 -0
  79. package/dist/statements/ListStatement.d.ts +4 -0
  80. package/dist/statements/ListStatement.js +3 -0
  81. package/dist/statements/NumberStatement.d.ts +4 -0
  82. package/dist/statements/NumberStatement.js +10 -0
  83. package/dist/statements/ReferenceStatement.d.ts +5 -0
  84. package/dist/statements/ReferenceStatement.js +10 -0
  85. package/dist/statements/ScalarStatement.d.ts +3 -0
  86. package/dist/statements/ScalarStatement.js +3 -0
  87. package/dist/statements/Statement.d.ts +6 -0
  88. package/dist/statements/Statement.js +4 -0
  89. package/dist/statements/StringStatement.d.ts +4 -0
  90. package/dist/statements/StringStatement.js +10 -0
  91. package/dist/statements/index.d.ts +9 -0
  92. package/dist/statements/index.js +8 -0
  93. package/dist/validation/CanonObjectValidator.d.ts +21 -0
  94. package/dist/validation/CanonObjectValidator.js +150 -0
  95. package/dist/validation/ICanonObjectValidator.d.ts +7 -0
  96. package/dist/validation/ICanonObjectValidator.js +1 -0
  97. package/dist/validation/OntologyValidationError.d.ts +15 -0
  98. package/dist/validation/OntologyValidationError.js +25 -0
  99. package/dist/validation/OntologyValidationResult.d.ts +7 -0
  100. package/dist/validation/OntologyValidationResult.js +8 -0
  101. package/dist/validation/ValidationContext.d.ts +6 -0
  102. package/dist/validation/ValidationContext.js +10 -0
  103. package/dist/validation/ValidationSeverity.d.ts +4 -0
  104. package/dist/validation/ValidationSeverity.js +5 -0
  105. package/dist/validation/index.d.ts +10 -0
  106. package/dist/validation/index.js +7 -0
  107. package/dist/validation/rules/document/EmbeddedCanonNoExplicitTypeRule.d.ts +8 -0
  108. package/dist/validation/rules/document/EmbeddedCanonNoExplicitTypeRule.js +53 -0
  109. package/dist/validation/rules/document/IDocumentValidationRule.d.ts +6 -0
  110. package/dist/validation/rules/document/IDocumentValidationRule.js +1 -0
  111. package/dist/validation/rules/document/NamespacePrefixRule.d.ts +10 -0
  112. package/dist/validation/rules/document/NamespacePrefixRule.js +51 -0
  113. package/dist/validation/rules/document/PropertyTypeSpecificityRule.d.ts +11 -0
  114. package/dist/validation/rules/document/PropertyTypeSpecificityRule.js +89 -0
  115. package/dist/validation/rules/document/ResourceNamingRule.d.ts +12 -0
  116. package/dist/validation/rules/document/ResourceNamingRule.js +79 -0
  117. package/dist/validation/rules/document/SubjectCanonTypeRequiredRule.d.ts +7 -0
  118. package/dist/validation/rules/document/SubjectCanonTypeRequiredRule.js +33 -0
  119. package/dist/validation/rules/document/index.d.ts +6 -0
  120. package/dist/validation/rules/document/index.js +5 -0
  121. package/dist/validation/rules/normalizeToStringList.d.ts +1 -0
  122. package/dist/validation/rules/normalizeToStringList.js +9 -0
  123. package/dist/validation/rules/repository/AmbiguousReferenceRule.d.ts +14 -0
  124. package/dist/validation/rules/repository/AmbiguousReferenceRule.js +155 -0
  125. package/dist/validation/rules/repository/ClassDefinitionRule.d.ts +12 -0
  126. package/dist/validation/rules/repository/ClassDefinitionRule.js +205 -0
  127. package/dist/validation/rules/repository/ClassHierarchyCycleRule.d.ts +11 -0
  128. package/dist/validation/rules/repository/ClassHierarchyCycleRule.js +98 -0
  129. package/dist/validation/rules/repository/DefinitionPropertyReferenceRule.d.ts +13 -0
  130. package/dist/validation/rules/repository/DefinitionPropertyReferenceRule.js +162 -0
  131. package/dist/validation/rules/repository/IRepositoryValidationRule.d.ts +7 -0
  132. package/dist/validation/rules/repository/IRepositoryValidationRule.js +1 -0
  133. package/dist/validation/rules/repository/ImportExistenceRule.d.ts +12 -0
  134. package/dist/validation/rules/repository/ImportExistenceRule.js +124 -0
  135. package/dist/validation/rules/repository/InstancePropertyReferenceRule.d.ts +13 -0
  136. package/dist/validation/rules/repository/InstancePropertyReferenceRule.js +161 -0
  137. package/dist/validation/rules/repository/NamespaceImportCycleRule.d.ts +11 -0
  138. package/dist/validation/rules/repository/NamespaceImportCycleRule.js +85 -0
  139. package/dist/validation/rules/repository/ObjectPropertyImportRule.d.ts +9 -0
  140. package/dist/validation/rules/repository/ObjectPropertyImportRule.js +113 -0
  141. package/dist/validation/rules/repository/ObjectPropertyValueValidationRule.d.ts +12 -0
  142. package/dist/validation/rules/repository/ObjectPropertyValueValidationRule.js +281 -0
  143. package/dist/validation/rules/repository/PropertyDomainRule.d.ts +14 -0
  144. package/dist/validation/rules/repository/PropertyDomainRule.js +221 -0
  145. package/dist/validation/rules/repository/PropertyHierarchyCycleRule.d.ts +11 -0
  146. package/dist/validation/rules/repository/PropertyHierarchyCycleRule.js +104 -0
  147. package/dist/validation/rules/repository/PropertyRangeReferenceRule.d.ts +13 -0
  148. package/dist/validation/rules/repository/PropertyRangeReferenceRule.js +184 -0
  149. package/dist/validation/rules/repository/PropertyRangeRequiredRule.d.ts +8 -0
  150. package/dist/validation/rules/repository/PropertyRangeRequiredRule.js +40 -0
  151. package/dist/validation/rules/repository/PropertyValueTypeRule.d.ts +11 -0
  152. package/dist/validation/rules/repository/PropertyValueTypeRule.js +171 -0
  153. package/dist/validation/rules/repository/SubClassOfReferenceRule.d.ts +11 -0
  154. package/dist/validation/rules/repository/SubClassOfReferenceRule.js +133 -0
  155. package/dist/validation/rules/repository/SubPropertyOfReferenceRule.d.ts +11 -0
  156. package/dist/validation/rules/repository/SubPropertyOfReferenceRule.js +133 -0
  157. package/dist/validation/rules/repository/TypeAmbiguityRule.d.ts +10 -0
  158. package/dist/validation/rules/repository/TypeAmbiguityRule.js +104 -0
  159. package/dist/validation/rules/repository/UnresolvedReferenceRule.d.ts +11 -0
  160. package/dist/validation/rules/repository/UnresolvedReferenceRule.js +91 -0
  161. package/dist/validation/rules/repository/XsdImportRule.d.ts +11 -0
  162. package/dist/validation/rules/repository/XsdImportRule.js +125 -0
  163. package/dist/validation/rules/repository/index.d.ts +20 -0
  164. package/dist/validation/rules/repository/index.js +19 -0
  165. package/package.json +82 -0
@@ -0,0 +1,161 @@
1
+ import { OntologyValidationError } from '../../OntologyValidationError.js';
2
+ import { ValidationSeverity } from '../../ValidationSeverity.js';
3
+ export class InstancePropertyReferenceRule {
4
+ metadataKeys = new Set([
5
+ 'type',
6
+ 'label',
7
+ 'comment',
8
+ 'subClassOf',
9
+ 'subPropertyOf',
10
+ 'domain',
11
+ 'range',
12
+ 'inverseOf',
13
+ 'transitive',
14
+ 'symmetric',
15
+ 'functional',
16
+ 'inverseFunctional'
17
+ ]);
18
+ get ruleName() {
19
+ return 'InstancePropertyReference';
20
+ }
21
+ async validateAsync(document, repository) {
22
+ const errors = [];
23
+ const definedProperties = new Set();
24
+ for (const [entityName, entityDef] of Object.entries(document.body)) {
25
+ if (typeof entityDef === 'object' && entityDef !== null && !Array.isArray(entityDef)) {
26
+ const entity = entityDef;
27
+ const type = entity['type']?.toString();
28
+ if (this.isPropertyType(type)) {
29
+ definedProperties.add(entityName);
30
+ }
31
+ }
32
+ }
33
+ for (const [entityName, entityDef] of Object.entries(document.body)) {
34
+ if (typeof entityDef === 'object' && entityDef !== null && !Array.isArray(entityDef)) {
35
+ const entity = entityDef;
36
+ const type = entity['type']?.toString();
37
+ if (this.isPropertyType(type) || this.isClassType(type)) {
38
+ continue;
39
+ }
40
+ for (const [propertyName, propertyValue] of Object.entries(entity)) {
41
+ if (!propertyName) {
42
+ continue;
43
+ }
44
+ if (this.metadataKeys.has(propertyName)) {
45
+ continue;
46
+ }
47
+ let actualPropertyName = propertyName;
48
+ let namespaceAlias = null;
49
+ if (propertyName.includes('.')) {
50
+ const lastDotIndex = propertyName.lastIndexOf('.');
51
+ namespaceAlias = propertyName.substring(0, lastDotIndex);
52
+ actualPropertyName = propertyName.substring(lastDotIndex + 1);
53
+ }
54
+ if (definedProperties.has(actualPropertyName)) {
55
+ continue;
56
+ }
57
+ const isAvailable = await this.isPropertyAvailableInImports(document, repository, actualPropertyName, namespaceAlias);
58
+ if (!isAvailable) {
59
+ const error = new OntologyValidationError();
60
+ error.ruleType = this.ruleName;
61
+ error.severity = ValidationSeverity.Error;
62
+ error.message = `Property '${propertyName}' is not defined or imported`;
63
+ error.suggestion = namespaceAlias
64
+ ? `The property '${actualPropertyName}' is not found in the imported namespace with alias '${namespaceAlias}'.\n` +
65
+ ` 1. Verify the namespace is imported with the correct alias\n` +
66
+ ` 2. Check if the property name is spelled correctly\n` +
67
+ ` 3. Ensure the imported namespace version contains this property`
68
+ : `The property '${propertyName}' is not defined in this namespace or any imported namespace.\n` +
69
+ ` 1. Define '${propertyName}' as an ObjectProperty or DatatypeProperty in this namespace, OR\n` +
70
+ ` 2. Import the namespace that contains '${propertyName}', OR\n` +
71
+ ` 3. Use a qualified reference like 'alias.${propertyName}' if already imported with an alias`;
72
+ error.entityName = entityName;
73
+ error.propertyName = propertyName;
74
+ error.actualValue = propertyValue?.toString();
75
+ error.expectedValue = 'A defined or imported property';
76
+ errors.push(error);
77
+ }
78
+ }
79
+ }
80
+ }
81
+ return errors;
82
+ }
83
+ isPropertyType(typeStr) {
84
+ if (!typeStr) {
85
+ return false;
86
+ }
87
+ return (typeStr === 'ObjectProperty' ||
88
+ typeStr === 'DatatypeProperty' ||
89
+ typeStr === 'AnnotationProperty' ||
90
+ typeStr === 'Property' ||
91
+ typeStr.endsWith('.ObjectProperty') ||
92
+ typeStr.endsWith('.DatatypeProperty') ||
93
+ typeStr.endsWith('.AnnotationProperty') ||
94
+ typeStr.endsWith('.Property'));
95
+ }
96
+ isClassType(typeStr) {
97
+ if (!typeStr) {
98
+ return false;
99
+ }
100
+ return typeStr === 'Class' || typeStr.endsWith('.Class');
101
+ }
102
+ async isPropertyAvailableInImports(document, repository, propertyName, namespaceAlias) {
103
+ if (!document.metadata.imports) {
104
+ return false;
105
+ }
106
+ for (const [publisher, imports] of Object.entries(document.metadata.imports)) {
107
+ for (const import_ of imports) {
108
+ if (namespaceAlias !== null && import_.alias !== namespaceAlias) {
109
+ continue;
110
+ }
111
+ const importedDoc = await repository.getHighestCompatibleVersionAsync(publisher, import_);
112
+ if (importedDoc) {
113
+ const entityDef = importedDoc.body[propertyName];
114
+ if (entityDef && typeof entityDef === 'object' && !Array.isArray(entityDef)) {
115
+ const entity = entityDef;
116
+ const type = entity['type']?.toString();
117
+ if (this.isPropertyType(type)) {
118
+ return true;
119
+ }
120
+ }
121
+ const visitedDocs = new Set();
122
+ if (await this.isPropertyAvailableInImportsRecursive(importedDoc, repository, propertyName, visitedDocs)) {
123
+ return true;
124
+ }
125
+ }
126
+ }
127
+ }
128
+ return false;
129
+ }
130
+ async isPropertyAvailableInImportsRecursive(document, repository, propertyName, visitedDocs) {
131
+ const docId = document.metadata.namespace_?.toString() ?? '';
132
+ if (docId && visitedDocs.has(docId)) {
133
+ return false;
134
+ }
135
+ if (docId) {
136
+ visitedDocs.add(docId);
137
+ }
138
+ if (!document.metadata.imports) {
139
+ return false;
140
+ }
141
+ for (const [publisher, imports] of Object.entries(document.metadata.imports)) {
142
+ for (const import_ of imports) {
143
+ const importedDoc = await repository.getHighestCompatibleVersionAsync(publisher, import_);
144
+ if (importedDoc) {
145
+ const entityDef = importedDoc.body[propertyName];
146
+ if (entityDef && typeof entityDef === 'object' && !Array.isArray(entityDef)) {
147
+ const entity = entityDef;
148
+ const type = entity['type']?.toString();
149
+ if (this.isPropertyType(type)) {
150
+ return true;
151
+ }
152
+ }
153
+ if (await this.isPropertyAvailableInImportsRecursive(importedDoc, repository, propertyName, visitedDocs)) {
154
+ return true;
155
+ }
156
+ }
157
+ }
158
+ }
159
+ return false;
160
+ }
161
+ }
@@ -0,0 +1,11 @@
1
+ import type { CanonDocument } from '@canon-protocol/types/document/models/types';
2
+ import type { ICanonDocumentRepository } from '@canon-protocol/types/document/models';
3
+ import type { IRepositoryValidationRule } from './IRepositoryValidationRule.js';
4
+ import { OntologyValidationError } from '../../OntologyValidationError.js';
5
+ export declare class NamespaceImportCycleRule implements IRepositoryValidationRule {
6
+ get ruleName(): string;
7
+ validateAsync(document: CanonDocument, repository: ICanonDocumentRepository): Promise<OntologyValidationError[]>;
8
+ private buildImportGraph;
9
+ private detectCycle;
10
+ private detectCycleRecursive;
11
+ }
@@ -0,0 +1,85 @@
1
+ import { OntologyValidationError } from '../../OntologyValidationError.js';
2
+ import { ValidationSeverity } from '../../ValidationSeverity.js';
3
+ export class NamespaceImportCycleRule {
4
+ get ruleName() {
5
+ return 'NamespaceImportCycle';
6
+ }
7
+ async validateAsync(document, repository) {
8
+ const errors = [];
9
+ const currentNamespace = document.metadata.namespace_?.toString();
10
+ if (!currentNamespace) {
11
+ return errors; // No namespace, nothing to validate
12
+ }
13
+ const importGraph = new Map();
14
+ const visitedDocs = new Set();
15
+ await this.buildImportGraph(document, repository, importGraph, visitedDocs);
16
+ const cycle = this.detectCycle(currentNamespace, importGraph);
17
+ if (cycle) {
18
+ const cycleChain = cycle.join(' → ');
19
+ const error = new OntologyValidationError();
20
+ error.ruleType = this.ruleName;
21
+ error.severity = ValidationSeverity.Error;
22
+ error.message = `Circular namespace import detected: ${cycleChain}`;
23
+ error.suggestion =
24
+ 'Remove one of the imports to break the circular dependency. ' +
25
+ 'Circular dependencies prevent proper package resolution.';
26
+ error.entityName = 'imports';
27
+ error.propertyName = 'imports';
28
+ error.actualValue = cycleChain;
29
+ errors.push(error);
30
+ }
31
+ return errors;
32
+ }
33
+ async buildImportGraph(document, repository, importGraph, visitedDocs) {
34
+ const docNamespace = document.metadata.namespace_?.toString() ?? '';
35
+ if (!docNamespace || visitedDocs.has(docNamespace)) {
36
+ return; // Already processed this document
37
+ }
38
+ visitedDocs.add(docNamespace);
39
+ if (document.metadata.imports) {
40
+ const imports = [];
41
+ for (const [publisher, importList] of Object.entries(document.metadata.imports)) {
42
+ for (const import_ of importList) {
43
+ const importNamespace = `${publisher}/${import_.packageName}@${import_.version}`;
44
+ imports.push(importNamespace);
45
+ const importedDoc = await repository.getHighestCompatibleVersionAsync(publisher, import_);
46
+ if (importedDoc) {
47
+ await this.buildImportGraph(importedDoc, repository, importGraph, visitedDocs);
48
+ }
49
+ }
50
+ }
51
+ if (imports.length > 0) {
52
+ importGraph.set(docNamespace, imports);
53
+ }
54
+ }
55
+ }
56
+ detectCycle(startNamespace, importGraph) {
57
+ const path = [];
58
+ const visited = new Set();
59
+ return this.detectCycleRecursive(startNamespace, importGraph, path, visited);
60
+ }
61
+ detectCycleRecursive(currentNamespace, importGraph, path, visited) {
62
+ const pathIndex = path.indexOf(currentNamespace);
63
+ if (pathIndex >= 0) {
64
+ const cycle = path.slice(pathIndex);
65
+ cycle.push(currentNamespace); // Complete the cycle
66
+ return cycle;
67
+ }
68
+ if (visited.has(currentNamespace)) {
69
+ return null;
70
+ }
71
+ path.push(currentNamespace);
72
+ visited.add(currentNamespace);
73
+ const imports = importGraph.get(currentNamespace);
74
+ if (imports) {
75
+ for (const importedNamespace of imports) {
76
+ const cycle = this.detectCycleRecursive(importedNamespace, importGraph, path, visited);
77
+ if (cycle) {
78
+ return cycle;
79
+ }
80
+ }
81
+ }
82
+ path.pop();
83
+ return null;
84
+ }
85
+ }
@@ -0,0 +1,9 @@
1
+ import type { CanonDocument } from '@canon-protocol/types/document/models/types';
2
+ import type { ICanonDocumentRepository } from '@canon-protocol/types/document/models';
3
+ import type { IRepositoryValidationRule } from './IRepositoryValidationRule.js';
4
+ import { OntologyValidationError } from '../../OntologyValidationError.js';
5
+ export declare class ObjectPropertyImportRule implements IRepositoryValidationRule {
6
+ private readonly xsdTypes;
7
+ get ruleName(): string;
8
+ validateAsync(document: CanonDocument, repository: ICanonDocumentRepository): Promise<OntologyValidationError[]>;
9
+ }
@@ -0,0 +1,113 @@
1
+ import { OntologyValidationError } from '../../OntologyValidationError.js';
2
+ import { ValidationSeverity } from '../../ValidationSeverity.js';
3
+ import { ResourceResolver } from '../../../resolution/ResourceResolver.js';
4
+ export class ObjectPropertyImportRule {
5
+ xsdTypes = new Set([
6
+ 'string',
7
+ 'integer',
8
+ 'boolean',
9
+ 'decimal',
10
+ 'float',
11
+ 'double',
12
+ 'date',
13
+ 'dateTime',
14
+ 'time',
15
+ 'duration',
16
+ 'anyURI',
17
+ 'base64Binary',
18
+ 'hexBinary',
19
+ 'long',
20
+ 'int',
21
+ 'short',
22
+ 'byte',
23
+ 'unsignedLong',
24
+ 'unsignedInt',
25
+ 'unsignedShort',
26
+ 'unsignedByte',
27
+ 'positiveInteger',
28
+ 'nonPositiveInteger',
29
+ 'negativeInteger',
30
+ 'nonNegativeInteger',
31
+ 'normalizedString',
32
+ 'token',
33
+ 'language',
34
+ 'Name',
35
+ 'NCName',
36
+ 'ENTITY',
37
+ 'ENTITIES',
38
+ 'IDREF',
39
+ 'IDREFS',
40
+ 'NMTOKEN',
41
+ 'NMTOKENS'
42
+ ]);
43
+ get ruleName() {
44
+ return 'ObjectPropertyImport';
45
+ }
46
+ async validateAsync(document, repository) {
47
+ const errors = [];
48
+ const referencedClasses = new Map(); // class -> properties that reference it
49
+ const resourceResolver = new ResourceResolver(repository);
50
+ await resourceResolver.buildEntityIndexAsync(document);
51
+ for (const [entityName, entityDef] of Object.entries(document.body)) {
52
+ if (typeof entityDef === 'object' && entityDef !== null && !Array.isArray(entityDef)) {
53
+ const entity = entityDef;
54
+ let isObjectProperty = false;
55
+ const typeValue = entity['type'];
56
+ if (Array.isArray(typeValue)) {
57
+ for (const type of typeValue) {
58
+ if (type?.toString() === 'ObjectProperty') {
59
+ isObjectProperty = true;
60
+ break;
61
+ }
62
+ }
63
+ }
64
+ else if (typeValue?.toString() === 'ObjectProperty') {
65
+ isObjectProperty = true;
66
+ }
67
+ if (isObjectProperty) {
68
+ const rangeValue = entity['range'];
69
+ const rangeValues = [];
70
+ if (Array.isArray(rangeValue)) {
71
+ for (const item of rangeValue) {
72
+ const itemStr = item?.toString();
73
+ if (itemStr) {
74
+ rangeValues.push(itemStr);
75
+ }
76
+ }
77
+ }
78
+ else {
79
+ const rangeStr = rangeValue?.toString();
80
+ if (rangeStr) {
81
+ rangeValues.push(rangeStr);
82
+ }
83
+ }
84
+ for (const range of rangeValues) {
85
+ if (!this.xsdTypes.has(range)) {
86
+ if (!referencedClasses.has(range)) {
87
+ referencedClasses.set(range, []);
88
+ }
89
+ referencedClasses.get(range).push(entityName);
90
+ }
91
+ }
92
+ }
93
+ }
94
+ }
95
+ for (const [className, properties] of referencedClasses) {
96
+ const resolution = await resourceResolver.resolveEntityAsync(className, document);
97
+ if (!resolution) {
98
+ for (const propertyName of properties) {
99
+ const error = new OntologyValidationError();
100
+ error.ruleType = this.ruleName;
101
+ error.severity = ValidationSeverity.Warning;
102
+ error.message = `ObjectProperty references class '${className}' which may not be imported`;
103
+ error.suggestion = `Ensure the namespace containing '${className}' is imported, or define '${className}' in this document`;
104
+ error.entityName = propertyName;
105
+ error.propertyName = 'range';
106
+ error.actualValue = className;
107
+ errors.push(error);
108
+ }
109
+ }
110
+ }
111
+ return errors;
112
+ }
113
+ }
@@ -0,0 +1,12 @@
1
+ import type { CanonDocument } from '@canon-protocol/types/document/models/types';
2
+ import type { ICanonDocumentRepository } from '@canon-protocol/types/document/models';
3
+ import type { IRepositoryValidationRule } from './IRepositoryValidationRule.js';
4
+ import { OntologyValidationError } from '../../OntologyValidationError.js';
5
+ export declare class ObjectPropertyValueValidationRule implements IRepositoryValidationRule {
6
+ private readonly standardProperties;
7
+ get ruleName(): string;
8
+ validateAsync(document: CanonDocument, repository: ICanonDocumentRepository): Promise<OntologyValidationError[]>;
9
+ private scanEntityForObjectProperties;
10
+ private validateRangeType;
11
+ private buildPropertyMetadataAsync;
12
+ }