@the-cascade-protocol/cli 0.2.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/.dockerignore +7 -0
  2. package/.eslintrc.json +23 -0
  3. package/.prettierrc +7 -0
  4. package/DOCKER.md +36 -0
  5. package/Dockerfile +18 -0
  6. package/README.md +69 -0
  7. package/dist/commands/capabilities.d.ts +9 -0
  8. package/dist/commands/capabilities.d.ts.map +1 -0
  9. package/dist/commands/capabilities.js +194 -0
  10. package/dist/commands/capabilities.js.map +1 -0
  11. package/dist/commands/conformance.d.ts +15 -0
  12. package/dist/commands/conformance.d.ts.map +1 -0
  13. package/dist/commands/conformance.js +348 -0
  14. package/dist/commands/conformance.js.map +1 -0
  15. package/dist/commands/convert.d.ts +21 -0
  16. package/dist/commands/convert.d.ts.map +1 -0
  17. package/dist/commands/convert.js +134 -0
  18. package/dist/commands/convert.js.map +1 -0
  19. package/dist/commands/pod/export.d.ts +8 -0
  20. package/dist/commands/pod/export.d.ts.map +1 -0
  21. package/dist/commands/pod/export.js +72 -0
  22. package/dist/commands/pod/export.js.map +1 -0
  23. package/dist/commands/pod/helpers.d.ts +79 -0
  24. package/dist/commands/pod/helpers.d.ts.map +1 -0
  25. package/dist/commands/pod/helpers.js +369 -0
  26. package/dist/commands/pod/helpers.js.map +1 -0
  27. package/dist/commands/pod/index.d.ts +20 -0
  28. package/dist/commands/pod/index.d.ts.map +1 -0
  29. package/dist/commands/pod/index.js +29 -0
  30. package/dist/commands/pod/index.js.map +1 -0
  31. package/dist/commands/pod/info.d.ts +9 -0
  32. package/dist/commands/pod/info.d.ts.map +1 -0
  33. package/dist/commands/pod/info.js +196 -0
  34. package/dist/commands/pod/info.js.map +1 -0
  35. package/dist/commands/pod/init.d.ts +9 -0
  36. package/dist/commands/pod/init.d.ts.map +1 -0
  37. package/dist/commands/pod/init.js +251 -0
  38. package/dist/commands/pod/init.js.map +1 -0
  39. package/dist/commands/pod/query.d.ts +9 -0
  40. package/dist/commands/pod/query.d.ts.map +1 -0
  41. package/dist/commands/pod/query.js +169 -0
  42. package/dist/commands/pod/query.js.map +1 -0
  43. package/dist/commands/pod 2.js +1017 -0
  44. package/dist/commands/pod.d.ts +28 -0
  45. package/dist/commands/pod.d.ts 2.map +1 -0
  46. package/dist/commands/pod.d.ts.map +1 -0
  47. package/dist/commands/pod.js +1031 -0
  48. package/dist/commands/pod.js 2.map +1 -0
  49. package/dist/commands/pod.js.map +1 -0
  50. package/dist/commands/serve.d.ts +33 -0
  51. package/dist/commands/serve.d.ts.map +1 -0
  52. package/dist/commands/serve.js +74 -0
  53. package/dist/commands/serve.js.map +1 -0
  54. package/dist/commands/validate.d.ts +18 -0
  55. package/dist/commands/validate.d.ts.map +1 -0
  56. package/dist/commands/validate.js +275 -0
  57. package/dist/commands/validate.js.map +1 -0
  58. package/dist/index.d.ts +19 -0
  59. package/dist/index.d.ts.map +1 -0
  60. package/dist/index.js +49 -0
  61. package/dist/index.js.map +1 -0
  62. package/dist/lib/fhir-converter/cascade-to-fhir.d.ts +17 -0
  63. package/dist/lib/fhir-converter/cascade-to-fhir.d.ts.map +1 -0
  64. package/dist/lib/fhir-converter/cascade-to-fhir.js +358 -0
  65. package/dist/lib/fhir-converter/cascade-to-fhir.js.map +1 -0
  66. package/dist/lib/fhir-converter/converters-clinical.d.ts +29 -0
  67. package/dist/lib/fhir-converter/converters-clinical.d.ts.map +1 -0
  68. package/dist/lib/fhir-converter/converters-clinical.js +391 -0
  69. package/dist/lib/fhir-converter/converters-clinical.js.map +1 -0
  70. package/dist/lib/fhir-converter/converters-demographics.d.ts +20 -0
  71. package/dist/lib/fhir-converter/converters-demographics.d.ts.map +1 -0
  72. package/dist/lib/fhir-converter/converters-demographics.js +242 -0
  73. package/dist/lib/fhir-converter/converters-demographics.js.map +1 -0
  74. package/dist/lib/fhir-converter/fhir-to-cascade.d.ts +17 -0
  75. package/dist/lib/fhir-converter/fhir-to-cascade.d.ts.map +1 -0
  76. package/dist/lib/fhir-converter/fhir-to-cascade.js +63 -0
  77. package/dist/lib/fhir-converter/fhir-to-cascade.js.map +1 -0
  78. package/dist/lib/fhir-converter/index.d.ts +36 -0
  79. package/dist/lib/fhir-converter/index.d.ts.map +1 -0
  80. package/dist/lib/fhir-converter/index.js +187 -0
  81. package/dist/lib/fhir-converter/index.js.map +1 -0
  82. package/dist/lib/fhir-converter/types.d.ts +77 -0
  83. package/dist/lib/fhir-converter/types.d.ts.map +1 -0
  84. package/dist/lib/fhir-converter/types.js +236 -0
  85. package/dist/lib/fhir-converter/types.js.map +1 -0
  86. package/dist/lib/fhir-converter.d.ts +62 -0
  87. package/dist/lib/fhir-converter.d.ts.map +1 -0
  88. package/dist/lib/fhir-converter.js +1474 -0
  89. package/dist/lib/fhir-converter.js.map +1 -0
  90. package/dist/lib/mcp/audit.d.ts +24 -0
  91. package/dist/lib/mcp/audit.d.ts.map +1 -0
  92. package/dist/lib/mcp/audit.js +85 -0
  93. package/dist/lib/mcp/audit.js.map +1 -0
  94. package/dist/lib/mcp/server.d.ts +38 -0
  95. package/dist/lib/mcp/server.d.ts.map +1 -0
  96. package/dist/lib/mcp/server.js +172 -0
  97. package/dist/lib/mcp/server.js.map +1 -0
  98. package/dist/lib/mcp/tools.d.ts +47 -0
  99. package/dist/lib/mcp/tools.d.ts.map +1 -0
  100. package/dist/lib/mcp/tools.js +547 -0
  101. package/dist/lib/mcp/tools.js.map +1 -0
  102. package/dist/lib/output.d.ts +26 -0
  103. package/dist/lib/output.d.ts.map +1 -0
  104. package/dist/lib/output.js +64 -0
  105. package/dist/lib/output.js.map +1 -0
  106. package/dist/lib/shacl-validator.d.ts +53 -0
  107. package/dist/lib/shacl-validator.d.ts.map +1 -0
  108. package/dist/lib/shacl-validator.js +245 -0
  109. package/dist/lib/shacl-validator.js.map +1 -0
  110. package/dist/lib/turtle-parser.d.ts +64 -0
  111. package/dist/lib/turtle-parser.d.ts.map +1 -0
  112. package/dist/lib/turtle-parser.js +236 -0
  113. package/dist/lib/turtle-parser.js.map +1 -0
  114. package/dist/shapes/checkup.shapes.ttl +1459 -0
  115. package/dist/shapes/clinical.shapes.ttl +1350 -0
  116. package/dist/shapes/clinical.ttl +1369 -0
  117. package/dist/shapes/core.shapes.ttl +450 -0
  118. package/dist/shapes/core.ttl +603 -0
  119. package/dist/shapes/coverage.shapes.ttl +214 -0
  120. package/dist/shapes/coverage.ttl +182 -0
  121. package/dist/shapes/health.shapes.ttl +697 -0
  122. package/dist/shapes/health.ttl +859 -0
  123. package/dist/shapes/pots.shapes.ttl +481 -0
  124. package/package.json +54 -0
  125. package/src/commands/capabilities.ts +235 -0
  126. package/src/commands/conformance.ts +447 -0
  127. package/src/commands/convert.ts +164 -0
  128. package/src/commands/pod/export.ts +85 -0
  129. package/src/commands/pod/helpers.ts +449 -0
  130. package/src/commands/pod/index.ts +32 -0
  131. package/src/commands/pod/info.ts +239 -0
  132. package/src/commands/pod/init.ts +273 -0
  133. package/src/commands/pod/query.ts +224 -0
  134. package/src/commands/serve.ts +92 -0
  135. package/src/commands/validate.ts +303 -0
  136. package/src/index.ts +58 -0
  137. package/src/lib/fhir-converter/cascade-to-fhir.ts +369 -0
  138. package/src/lib/fhir-converter/converters-clinical.ts +446 -0
  139. package/src/lib/fhir-converter/converters-demographics.ts +270 -0
  140. package/src/lib/fhir-converter/fhir-to-cascade.ts +82 -0
  141. package/src/lib/fhir-converter/index.ts +215 -0
  142. package/src/lib/fhir-converter/types.ts +318 -0
  143. package/src/lib/mcp/audit.ts +107 -0
  144. package/src/lib/mcp/server.ts +192 -0
  145. package/src/lib/mcp/tools.ts +668 -0
  146. package/src/lib/output.ts +76 -0
  147. package/src/lib/shacl-validator.ts +314 -0
  148. package/src/lib/turtle-parser.ts +277 -0
  149. package/src/shapes/checkup.shapes.ttl +1459 -0
  150. package/src/shapes/clinical.shapes.ttl +1350 -0
  151. package/src/shapes/clinical.ttl +1369 -0
  152. package/src/shapes/core.shapes.ttl +450 -0
  153. package/src/shapes/core.ttl +603 -0
  154. package/src/shapes/coverage.shapes.ttl +214 -0
  155. package/src/shapes/coverage.ttl +182 -0
  156. package/src/shapes/health.shapes.ttl +697 -0
  157. package/src/shapes/health.ttl +859 -0
  158. package/src/shapes/pots.shapes.ttl +481 -0
  159. package/test-fixtures/fhir-bundle-example.json +216 -0
  160. package/test-fixtures/fhir-medication-example.json +18 -0
  161. package/tests/cli.test.ts +126 -0
  162. package/tests/fhir-converter.test.ts +874 -0
  163. package/tests/mcp-server.test.ts +396 -0
  164. package/tests/pod.test.ts +400 -0
  165. package/tsconfig.json +24 -0
@@ -0,0 +1,64 @@
1
+ /**
2
+ * Output formatting utilities for consistent CLI output.
3
+ *
4
+ * Supports both human-readable text and machine-readable JSON output modes.
5
+ */
6
+ /**
7
+ * Format data for output in either JSON or human-readable text mode.
8
+ */
9
+ export function formatOutput(data, opts) {
10
+ if (opts.json) {
11
+ return JSON.stringify(data, null, 2);
12
+ }
13
+ if (typeof data === 'string') {
14
+ return data;
15
+ }
16
+ if (Array.isArray(data)) {
17
+ return data.map((item) => formatSingleItem(item)).join('\n');
18
+ }
19
+ return formatSingleItem(data);
20
+ }
21
+ /**
22
+ * Format a single item for human-readable output.
23
+ */
24
+ function formatSingleItem(item) {
25
+ if (typeof item === 'string') {
26
+ return item;
27
+ }
28
+ if (typeof item === 'object' && item !== null) {
29
+ const entries = Object.entries(item);
30
+ return entries.map(([key, value]) => ` ${key}: ${String(value)}`).join('\n');
31
+ }
32
+ return String(item);
33
+ }
34
+ /**
35
+ * Print result data to stdout.
36
+ */
37
+ export function printResult(data, opts) {
38
+ console.log(formatOutput(data, opts));
39
+ }
40
+ /**
41
+ * Print an error message to stderr.
42
+ */
43
+ export function printError(message, opts) {
44
+ if (opts.json) {
45
+ console.error(JSON.stringify({ error: message }));
46
+ }
47
+ else {
48
+ console.error(`ERROR: ${message}`);
49
+ }
50
+ }
51
+ /**
52
+ * Print a verbose/debug message (only if verbose mode is enabled).
53
+ */
54
+ export function printVerbose(message, opts) {
55
+ if (opts.verbose) {
56
+ if (opts.json) {
57
+ console.error(JSON.stringify({ debug: message }));
58
+ }
59
+ else {
60
+ console.error(`[verbose] ${message}`);
61
+ }
62
+ }
63
+ }
64
+ //# sourceMappingURL=output.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output.js","sourceRoot":"","sources":["../../src/lib/output.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAOH;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,IAAa,EAAE,IAAmB;IAC7D,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;QACd,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IACvC,CAAC;IAED,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC7B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QACxB,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC/D,CAAC;IAED,OAAO,gBAAgB,CAAC,IAAI,CAAC,CAAC;AAChC,CAAC;AAED;;GAEG;AACH,SAAS,gBAAgB,CAAC,IAAa;IACrC,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC7B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;QAC9C,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,IAA+B,CAAC,CAAC;QAChE,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,KAAK,GAAG,KAAK,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAChF,CAAC;IAED,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC;AACtB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,IAAa,EAAE,IAAmB;IAC5D,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;AACxC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,UAAU,CAAC,OAAe,EAAE,IAAmB;IAC7D,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;QACd,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;IACpD,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,KAAK,CAAC,UAAU,OAAO,EAAE,CAAC,CAAC;IACrC,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,OAAe,EAAE,IAAmB;IAC/D,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;QACjB,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACd,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;QACpD,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,KAAK,CAAC,aAAa,OAAO,EAAE,CAAC,CAAC;QACxC,CAAC;IACH,CAAC;AACH,CAAC"}
@@ -0,0 +1,53 @@
1
+ /**
2
+ * SHACL validation utilities.
3
+ *
4
+ * Wraps rdf-validate-shacl to validate RDF data against
5
+ * Cascade Protocol SHACL shapes.
6
+ */
7
+ import { Store } from 'n3';
8
+ import type { ParseResult } from './turtle-parser.js';
9
+ export interface ValidationResult {
10
+ valid: boolean;
11
+ file: string;
12
+ results: ValidationIssue[];
13
+ shapesUsed: string[];
14
+ quadCount: number;
15
+ subjects: Array<{
16
+ uri: string;
17
+ types: string[];
18
+ }>;
19
+ }
20
+ export interface ValidationIssue {
21
+ severity: 'violation' | 'warning' | 'info';
22
+ shape: string;
23
+ property: string;
24
+ message: string;
25
+ focusNode?: string;
26
+ value?: string;
27
+ specLink?: string;
28
+ }
29
+ /**
30
+ * Load all bundled SHACL shapes from the shapes directory into a single store.
31
+ * If a custom shapes path is provided, load from there instead.
32
+ */
33
+ export declare function loadShapes(customShapesPath?: string): {
34
+ store: Store;
35
+ shapeFiles: string[];
36
+ };
37
+ /**
38
+ * Validate an already-parsed Turtle file against SHACL shapes.
39
+ */
40
+ export declare function validateParsed(parseResult: ParseResult, shapesStore: Store, shapeFiles: string[], filePath: string): ValidationResult;
41
+ /**
42
+ * Validate a Turtle string against SHACL shapes.
43
+ */
44
+ export declare function validateTurtle(turtleContent: string, shapesStore: Store, shapeFiles: string[], filePath: string): ValidationResult;
45
+ /**
46
+ * Validate a Turtle file against SHACL shapes.
47
+ */
48
+ export declare function validateFile(filePath: string, shapesStore: Store, shapeFiles: string[]): ValidationResult;
49
+ /**
50
+ * Recursively find all .ttl files in a directory.
51
+ */
52
+ export declare function findTurtleFiles(dirPath: string): string[];
53
+ //# sourceMappingURL=shacl-validator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shacl-validator.d.ts","sourceRoot":"","sources":["../../src/lib/shacl-validator.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,EAAU,KAAK,EAAE,MAAM,IAAI,CAAC;AAGnC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEtD,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,OAAO,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,eAAe,EAAE,CAAC;IAC3B,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,KAAK,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC,CAAC;CACnD;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,WAAW,GAAG,SAAS,GAAG,MAAM,CAAC;IAC3C,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AA6CD;;;GAGG;AACH,wBAAgB,UAAU,CAAC,gBAAgB,CAAC,EAAE,MAAM,GAAG;IAAE,KAAK,EAAE,KAAK,CAAC;IAAC,UAAU,EAAE,MAAM,EAAE,CAAA;CAAE,CAsC5F;AAqDD;;GAEG;AACH,wBAAgB,cAAc,CAC5B,WAAW,EAAE,WAAW,EACxB,WAAW,EAAE,KAAK,EAClB,UAAU,EAAE,MAAM,EAAE,EACpB,QAAQ,EAAE,MAAM,GACf,gBAAgB,CAmElB;AAED;;GAEG;AACH,wBAAgB,cAAc,CAC5B,aAAa,EAAE,MAAM,EACrB,WAAW,EAAE,KAAK,EAClB,UAAU,EAAE,MAAM,EAAE,EACpB,QAAQ,EAAE,MAAM,GACf,gBAAgB,CAGlB;AAED;;GAEG;AACH,wBAAgB,YAAY,CAC1B,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,KAAK,EAClB,UAAU,EAAE,MAAM,EAAE,GACnB,gBAAgB,CAmBlB;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAoBzD"}
@@ -0,0 +1,245 @@
1
+ /**
2
+ * SHACL validation utilities.
3
+ *
4
+ * Wraps rdf-validate-shacl to validate RDF data against
5
+ * Cascade Protocol SHACL shapes.
6
+ */
7
+ import fs from 'node:fs';
8
+ import path from 'node:path';
9
+ import { fileURLToPath } from 'node:url';
10
+ import { Parser, Store } from 'n3';
11
+ import SHACLValidator from 'rdf-validate-shacl';
12
+ import { parseTurtle, detectVocabularies, CASCADE_NAMESPACES } from './turtle-parser.js';
13
+ /** Mapping from shape file prefixes to their documentation base URLs */
14
+ const SPEC_BASE_URLS = {
15
+ core: 'https://cascadeprotocol.org/docs/core/v1',
16
+ health: 'https://cascadeprotocol.org/docs/health/v1',
17
+ clinical: 'https://cascadeprotocol.org/docs/clinical/v1',
18
+ pots: 'https://cascadeprotocol.org/docs/pots/v1',
19
+ checkup: 'https://cascadeprotocol.org/docs/checkup/v1',
20
+ coverage: 'https://cascadeprotocol.org/docs/coverage/v1',
21
+ };
22
+ /**
23
+ * Resolve the bundled shapes directory.
24
+ * Works from both src/ (dev via tsx) and dist/ (built).
25
+ */
26
+ function getShapesDir() {
27
+ const __filename = fileURLToPath(import.meta.url);
28
+ const __dirname = path.dirname(__filename);
29
+ // When running from dist/lib/, shapes are at dist/shapes/
30
+ // When running from src/lib/ (dev), shapes are at src/shapes/
31
+ const shapesDir = path.resolve(__dirname, '..', 'shapes');
32
+ if (!fs.existsSync(shapesDir)) {
33
+ throw new Error(`Shapes directory not found at ${shapesDir}. ` +
34
+ 'Run "npm run build" to bundle shapes.');
35
+ }
36
+ return shapesDir;
37
+ }
38
+ /**
39
+ * Load and parse a Turtle file into an N3 Store.
40
+ */
41
+ function loadTurtleFile(filePath) {
42
+ const content = fs.readFileSync(filePath, 'utf-8');
43
+ const parser = new Parser({ baseIRI: '' });
44
+ const store = new Store();
45
+ const quads = parser.parse(content);
46
+ store.addQuads(quads);
47
+ return store;
48
+ }
49
+ /**
50
+ * Load all bundled SHACL shapes from the shapes directory into a single store.
51
+ * If a custom shapes path is provided, load from there instead.
52
+ */
53
+ export function loadShapes(customShapesPath) {
54
+ const shapesDir = customShapesPath ?? getShapesDir();
55
+ const store = new Store();
56
+ const shapeFiles = [];
57
+ if (!fs.existsSync(shapesDir)) {
58
+ throw new Error(`Shapes directory not found: ${shapesDir}`);
59
+ }
60
+ const files = fs.readdirSync(shapesDir).filter((f) => f.endsWith('.shapes.ttl'));
61
+ if (files.length === 0) {
62
+ throw new Error(`No SHACL shape files (*.shapes.ttl) found in ${shapesDir}`);
63
+ }
64
+ for (const file of files) {
65
+ const filePath = path.join(shapesDir, file);
66
+ const fileStore = loadTurtleFile(filePath);
67
+ for (const quad of fileStore) {
68
+ store.addQuad(quad);
69
+ }
70
+ shapeFiles.push(file);
71
+ }
72
+ // Also load vocabulary/ontology files so the validator knows about class hierarchies
73
+ const vocabFiles = fs.readdirSync(shapesDir).filter((f) => f.endsWith('.ttl') && !f.endsWith('.shapes.ttl'));
74
+ for (const file of vocabFiles) {
75
+ const filePath = path.join(shapesDir, file);
76
+ const fileStore = loadTurtleFile(filePath);
77
+ for (const quad of fileStore) {
78
+ store.addQuad(quad);
79
+ }
80
+ }
81
+ return { store, shapeFiles };
82
+ }
83
+ /**
84
+ * Generate a spec link from a shape URI.
85
+ *
86
+ * Examples:
87
+ * https://ns.cascadeprotocol.org/clinical/v1#MedicationShape
88
+ * -> https://cascadeprotocol.org/docs/clinical/v1#Medication
89
+ * https://ns.cascadeprotocol.org/health/v1#SelfReportShape
90
+ * -> https://cascadeprotocol.org/docs/health/v1#SelfReport
91
+ */
92
+ function generateSpecLink(shapeUri) {
93
+ for (const [vocab, ns] of Object.entries(CASCADE_NAMESPACES)) {
94
+ if (shapeUri.startsWith(ns)) {
95
+ const localName = shapeUri.slice(ns.length);
96
+ // Remove "Shape" suffix for the spec link
97
+ const className = localName.replace(/Shape$/, '');
98
+ const baseUrl = SPEC_BASE_URLS[vocab];
99
+ if (baseUrl) {
100
+ return `${baseUrl}#${className}`;
101
+ }
102
+ }
103
+ }
104
+ return undefined;
105
+ }
106
+ /**
107
+ * Map SHACL severity URI to our severity level.
108
+ */
109
+ function mapSeverity(severityUri) {
110
+ if (severityUri.endsWith('#Violation') || severityUri.endsWith('Violation')) {
111
+ return 'violation';
112
+ }
113
+ if (severityUri.endsWith('#Warning') || severityUri.endsWith('Warning')) {
114
+ return 'warning';
115
+ }
116
+ if (severityUri.endsWith('#Info') || severityUri.endsWith('Info')) {
117
+ return 'info';
118
+ }
119
+ // Default to violation for unknown severity
120
+ return 'violation';
121
+ }
122
+ /**
123
+ * Extract a human-readable name from a URI by taking the fragment or last path segment.
124
+ */
125
+ function uriToName(uri) {
126
+ if (uri.includes('#')) {
127
+ return uri.split('#').pop() ?? uri;
128
+ }
129
+ return uri.split('/').pop() ?? uri;
130
+ }
131
+ /**
132
+ * Validate an already-parsed Turtle file against SHACL shapes.
133
+ */
134
+ export function validateParsed(parseResult, shapesStore, shapeFiles, filePath) {
135
+ if (!parseResult.success) {
136
+ return {
137
+ valid: false,
138
+ file: filePath,
139
+ results: parseResult.errors.map((err) => ({
140
+ severity: 'violation',
141
+ shape: '',
142
+ property: '',
143
+ message: `Parse error: ${err}`,
144
+ })),
145
+ shapesUsed: [],
146
+ quadCount: 0,
147
+ subjects: [],
148
+ };
149
+ }
150
+ // Detect vocabularies used so we can report which shapes apply
151
+ const vocabsUsed = detectVocabularies(parseResult);
152
+ const shapesUsed = shapeFiles.filter((f) => {
153
+ const vocabName = f.replace('.shapes.ttl', '');
154
+ return vocabsUsed.includes(vocabName);
155
+ });
156
+ // Run SHACL validation
157
+ const validator = new SHACLValidator(shapesStore, { allowNamedNodeInList: true });
158
+ const report = validator.validate(parseResult.store);
159
+ // Map results to our interface
160
+ const issues = [];
161
+ for (const result of report.results) {
162
+ const severityUri = result.severity?.value ?? '';
163
+ const severity = mapSeverity(severityUri);
164
+ const shapeUri = result.sourceShape?.value ?? '';
165
+ const pathUri = result.path?.value ?? '';
166
+ const focusNodeUri = result.focusNode?.value ?? '';
167
+ const valueStr = result.value?.value;
168
+ // Get the message - result.message is an array of Terms
169
+ const messages = result.message ?? [];
170
+ const messageText = messages.length > 0
171
+ ? messages.map((m) => m.value).join('; ')
172
+ : `Constraint violation on ${uriToName(pathUri)} of ${uriToName(shapeUri)}`;
173
+ const specLink = generateSpecLink(shapeUri);
174
+ issues.push({
175
+ severity,
176
+ shape: uriToName(shapeUri),
177
+ property: uriToName(pathUri),
178
+ message: messageText,
179
+ focusNode: focusNodeUri || undefined,
180
+ value: valueStr,
181
+ specLink,
182
+ });
183
+ }
184
+ return {
185
+ valid: report.conforms,
186
+ file: filePath,
187
+ results: issues,
188
+ shapesUsed,
189
+ quadCount: parseResult.quadCount,
190
+ subjects: parseResult.subjects,
191
+ };
192
+ }
193
+ /**
194
+ * Validate a Turtle string against SHACL shapes.
195
+ */
196
+ export function validateTurtle(turtleContent, shapesStore, shapeFiles, filePath) {
197
+ const parseResult = parseTurtle(turtleContent);
198
+ return validateParsed(parseResult, shapesStore, shapeFiles, filePath);
199
+ }
200
+ /**
201
+ * Validate a Turtle file against SHACL shapes.
202
+ */
203
+ export function validateFile(filePath, shapesStore, shapeFiles) {
204
+ if (!fs.existsSync(filePath)) {
205
+ return {
206
+ valid: false,
207
+ file: filePath,
208
+ results: [{
209
+ severity: 'violation',
210
+ shape: '',
211
+ property: '',
212
+ message: `File not found: ${filePath}`,
213
+ }],
214
+ shapesUsed: [],
215
+ quadCount: 0,
216
+ subjects: [],
217
+ };
218
+ }
219
+ const content = fs.readFileSync(filePath, 'utf-8');
220
+ return validateTurtle(content, shapesStore, shapeFiles, filePath);
221
+ }
222
+ /**
223
+ * Recursively find all .ttl files in a directory.
224
+ */
225
+ export function findTurtleFiles(dirPath) {
226
+ const results = [];
227
+ function walk(dir) {
228
+ const entries = fs.readdirSync(dir, { withFileTypes: true });
229
+ for (const entry of entries) {
230
+ const fullPath = path.join(dir, entry.name);
231
+ if (entry.isDirectory()) {
232
+ // Skip hidden directories and node_modules
233
+ if (!entry.name.startsWith('.') && entry.name !== 'node_modules') {
234
+ walk(fullPath);
235
+ }
236
+ }
237
+ else if (entry.isFile() && entry.name.endsWith('.ttl')) {
238
+ results.push(fullPath);
239
+ }
240
+ }
241
+ }
242
+ walk(dirPath);
243
+ return results.sort();
244
+ }
245
+ //# sourceMappingURL=shacl-validator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shacl-validator.js","sourceRoot":"","sources":["../../src/lib/shacl-validator.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,IAAI,CAAC;AACnC,OAAO,cAAc,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAsBzF,wEAAwE;AACxE,MAAM,cAAc,GAA2B;IAC7C,IAAI,EAAE,0CAA0C;IAChD,MAAM,EAAE,4CAA4C;IACpD,QAAQ,EAAE,8CAA8C;IACxD,IAAI,EAAE,0CAA0C;IAChD,OAAO,EAAE,6CAA6C;IACtD,QAAQ,EAAE,8CAA8C;CACzD,CAAC;AAEF;;;GAGG;AACH,SAAS,YAAY;IACnB,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAClD,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IAE3C,0DAA0D;IAC1D,8DAA8D;IAC9D,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;IAE1D,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC9B,MAAM,IAAI,KAAK,CACb,iCAAiC,SAAS,IAAI;YAC5C,uCAAuC,CAC1C,CAAC;IACJ,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;GAEG;AACH,SAAS,cAAc,CAAC,QAAgB;IACtC,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IACnD,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC;IAC3C,MAAM,KAAK,GAAG,IAAI,KAAK,EAAE,CAAC;IAC1B,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACpC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IACtB,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,UAAU,CAAC,gBAAyB;IAClD,MAAM,SAAS,GAAG,gBAAgB,IAAI,YAAY,EAAE,CAAC;IACrD,MAAM,KAAK,GAAG,IAAI,KAAK,EAAE,CAAC;IAC1B,MAAM,UAAU,GAAa,EAAE,CAAC;IAEhC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC9B,MAAM,IAAI,KAAK,CAAC,+BAA+B,SAAS,EAAE,CAAC,CAAC;IAC9D,CAAC;IAED,MAAM,KAAK,GAAG,EAAE,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAC;IAEjF,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,MAAM,IAAI,KAAK,CAAC,gDAAgD,SAAS,EAAE,CAAC,CAAC;IAC/E,CAAC;IAED,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;QAC5C,MAAM,SAAS,GAAG,cAAc,CAAC,QAAQ,CAAC,CAAC;QAC3C,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;YAC7B,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACtB,CAAC;QACD,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACxB,CAAC;IAED,qFAAqF;IACrF,MAAM,UAAU,GAAG,EAAE,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,MAAM,CACjD,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,aAAa,CAAC,CACxD,CAAC;IAEF,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;QAC9B,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;QAC5C,MAAM,SAAS,GAAG,cAAc,CAAC,QAAQ,CAAC,CAAC;QAC3C,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;YAC7B,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACtB,CAAC;IACH,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC;AAC/B,CAAC;AAED;;;;;;;;GAQG;AACH,SAAS,gBAAgB,CAAC,QAAgB;IACxC,KAAK,MAAM,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,kBAAkB,CAAC,EAAE,CAAC;QAC7D,IAAI,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,EAAE,CAAC;YAC5B,MAAM,SAAS,GAAG,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC;YAC5C,0CAA0C;YAC1C,MAAM,SAAS,GAAG,SAAS,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;YAClD,MAAM,OAAO,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;YACtC,IAAI,OAAO,EAAE,CAAC;gBACZ,OAAO,GAAG,OAAO,IAAI,SAAS,EAAE,CAAC;YACnC,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;GAEG;AACH,SAAS,WAAW,CAAC,WAAmB;IACtC,IAAI,WAAW,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,WAAW,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;QAC5E,OAAO,WAAW,CAAC;IACrB,CAAC;IACD,IAAI,WAAW,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,WAAW,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;QACxE,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,IAAI,WAAW,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,WAAW,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QAClE,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,4CAA4C;IAC5C,OAAO,WAAW,CAAC;AACrB,CAAC;AAED;;GAEG;AACH,SAAS,SAAS,CAAC,GAAW;IAC5B,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QACtB,OAAO,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,GAAG,CAAC;IACrC,CAAC;IACD,OAAO,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,GAAG,CAAC;AACrC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAC5B,WAAwB,EACxB,WAAkB,EAClB,UAAoB,EACpB,QAAgB;IAEhB,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC;QACzB,OAAO;YACL,KAAK,EAAE,KAAK;YACZ,IAAI,EAAE,QAAQ;YACd,OAAO,EAAE,WAAW,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;gBACxC,QAAQ,EAAE,WAAoB;gBAC9B,KAAK,EAAE,EAAE;gBACT,QAAQ,EAAE,EAAE;gBACZ,OAAO,EAAE,gBAAgB,GAAG,EAAE;aAC/B,CAAC,CAAC;YACH,UAAU,EAAE,EAAE;YACd,SAAS,EAAE,CAAC;YACZ,QAAQ,EAAE,EAAE;SACb,CAAC;IACJ,CAAC;IAED,+DAA+D;IAC/D,MAAM,UAAU,GAAG,kBAAkB,CAAC,WAAW,CAAC,CAAC;IACnD,MAAM,UAAU,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE;QACzC,MAAM,SAAS,GAAG,CAAC,CAAC,OAAO,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC;QAC/C,OAAO,UAAU,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;IAEH,uBAAuB;IACvB,MAAM,SAAS,GAAG,IAAI,cAAc,CAAC,WAAW,EAAE,EAAE,oBAAoB,EAAE,IAAI,EAAE,CAAC,CAAC;IAClF,MAAM,MAAM,GAAG,SAAS,CAAC,QAAQ,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;IAErD,+BAA+B;IAC/B,MAAM,MAAM,GAAsB,EAAE,CAAC;IAErC,KAAK,MAAM,MAAM,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QACpC,MAAM,WAAW,GAAG,MAAM,CAAC,QAAQ,EAAE,KAAK,IAAI,EAAE,CAAC;QACjD,MAAM,QAAQ,GAAG,WAAW,CAAC,WAAW,CAAC,CAAC;QAE1C,MAAM,QAAQ,GAAG,MAAM,CAAC,WAAW,EAAE,KAAK,IAAI,EAAE,CAAC;QACjD,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC;QACzC,MAAM,YAAY,GAAG,MAAM,CAAC,SAAS,EAAE,KAAK,IAAI,EAAE,CAAC;QACnD,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC;QAErC,wDAAwD;QACxD,MAAM,QAAQ,GAAG,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC;QACtC,MAAM,WAAW,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC;YACrC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;YACzC,CAAC,CAAC,2BAA2B,SAAS,CAAC,OAAO,CAAC,OAAO,SAAS,CAAC,QAAQ,CAAC,EAAE,CAAC;QAE9E,MAAM,QAAQ,GAAG,gBAAgB,CAAC,QAAQ,CAAC,CAAC;QAE5C,MAAM,CAAC,IAAI,CAAC;YACV,QAAQ;YACR,KAAK,EAAE,SAAS,CAAC,QAAQ,CAAC;YAC1B,QAAQ,EAAE,SAAS,CAAC,OAAO,CAAC;YAC5B,OAAO,EAAE,WAAW;YACpB,SAAS,EAAE,YAAY,IAAI,SAAS;YACpC,KAAK,EAAE,QAAQ;YACf,QAAQ;SACT,CAAC,CAAC;IACL,CAAC;IAED,OAAO;QACL,KAAK,EAAE,MAAM,CAAC,QAAQ;QACtB,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE,MAAM;QACf,UAAU;QACV,SAAS,EAAE,WAAW,CAAC,SAAS;QAChC,QAAQ,EAAE,WAAW,CAAC,QAAQ;KAC/B,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAC5B,aAAqB,EACrB,WAAkB,EAClB,UAAoB,EACpB,QAAgB;IAEhB,MAAM,WAAW,GAAG,WAAW,CAAC,aAAa,CAAC,CAAC;IAC/C,OAAO,cAAc,CAAC,WAAW,EAAE,WAAW,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC;AACxE,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAC1B,QAAgB,EAChB,WAAkB,EAClB,UAAoB;IAEpB,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC7B,OAAO;YACL,KAAK,EAAE,KAAK;YACZ,IAAI,EAAE,QAAQ;YACd,OAAO,EAAE,CAAC;oBACR,QAAQ,EAAE,WAAW;oBACrB,KAAK,EAAE,EAAE;oBACT,QAAQ,EAAE,EAAE;oBACZ,OAAO,EAAE,mBAAmB,QAAQ,EAAE;iBACvC,CAAC;YACF,UAAU,EAAE,EAAE;YACd,SAAS,EAAE,CAAC;YACZ,QAAQ,EAAE,EAAE;SACb,CAAC;IACJ,CAAC;IAED,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IACnD,OAAO,cAAc,CAAC,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC;AACpE,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,OAAe;IAC7C,MAAM,OAAO,GAAa,EAAE,CAAC;IAE7B,SAAS,IAAI,CAAC,GAAW;QACvB,MAAM,OAAO,GAAG,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;QAC7D,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;YAC5C,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;gBACxB,2CAA2C;gBAC3C,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,cAAc,EAAE,CAAC;oBACjE,IAAI,CAAC,QAAQ,CAAC,CAAC;gBACjB,CAAC;YACH,CAAC;iBAAM,IAAI,KAAK,CAAC,MAAM,EAAE,IAAI,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;gBACzD,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACzB,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,CAAC,OAAO,CAAC,CAAC;IACd,OAAO,OAAO,CAAC,IAAI,EAAE,CAAC;AACxB,CAAC"}
@@ -0,0 +1,64 @@
1
+ /**
2
+ * Turtle parsing utilities.
3
+ *
4
+ * Wraps the n3 library to provide Cascade-specific Turtle parsing
5
+ * with support for Cascade Protocol namespaces.
6
+ */
7
+ import { Store } from 'n3';
8
+ import type { Quad } from 'n3';
9
+ /** Known Cascade Protocol namespace prefixes */
10
+ export declare const CASCADE_NAMESPACES: Record<string, string>;
11
+ export interface ParseResult {
12
+ success: boolean;
13
+ quads: Quad[];
14
+ store: Store;
15
+ quadCount: number;
16
+ prefixes: Record<string, string>;
17
+ errors: string[];
18
+ subjects: SubjectInfo[];
19
+ }
20
+ export interface SubjectInfo {
21
+ uri: string;
22
+ types: string[];
23
+ }
24
+ /**
25
+ * Parse a Turtle string into quads and a Store.
26
+ */
27
+ export declare function parseTurtle(input: string, baseIRI?: string): ParseResult;
28
+ /**
29
+ * Detect which Cascade Protocol vocabularies are used in a parsed Turtle file
30
+ * based on prefixes and type URIs.
31
+ */
32
+ export declare function detectVocabularies(result: ParseResult): string[];
33
+ /**
34
+ * Parse a Turtle file from disk.
35
+ */
36
+ export declare function parseTurtleFile(filePath: string): Promise<ParseResult>;
37
+ /**
38
+ * Return all subject URIs that have rdf:type matching the given type IRI.
39
+ */
40
+ export declare function getSubjectsByType(store: Store, rdfType: string): string[];
41
+ /**
42
+ * Return all predicate-value pairs for a given subject.
43
+ * Returns a map of predicate IRI -> array of object values.
44
+ */
45
+ export declare function getProperties(store: Store, subject: string): Record<string, string[]>;
46
+ /**
47
+ * Count subjects of a given rdf:type.
48
+ */
49
+ export declare function countSubjectsByType(store: Store, rdfType: string): number;
50
+ /**
51
+ * Get all unique rdf:type values in the store.
52
+ */
53
+ export declare function getAllTypes(store: Store): string[];
54
+ /**
55
+ * Shorten a full IRI using known Cascade namespace prefixes.
56
+ * Returns the prefixed form (e.g., "health:MedicationRecord") or the full IRI if no match.
57
+ */
58
+ export declare function shortenIRI(iri: string, prefixes?: Record<string, string>): string;
59
+ /**
60
+ * Extract a human-readable label for a record from its properties.
61
+ * Tries common name predicates in order of preference.
62
+ */
63
+ export declare function extractLabel(props: Record<string, string[]>): string | undefined;
64
+ //# sourceMappingURL=turtle-parser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"turtle-parser.d.ts","sourceRoot":"","sources":["../../src/lib/turtle-parser.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAU,KAAK,EAAe,MAAM,IAAI,CAAC;AAChD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,IAAI,CAAC;AAQ/B,gDAAgD;AAChD,eAAO,MAAM,kBAAkB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAQ5C,CAAC;AAoBX,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,IAAI,EAAE,CAAC;IACd,KAAK,EAAE,KAAK,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,EAAE,WAAW,EAAE,CAAC;CACzB;AAED,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,WAAW,CAqCxE;AAqBD;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,EAAE,CAoChE;AAED;;GAEG;AACH,wBAAsB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAgB5E;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAGzE;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAarF;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAEzE;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,EAAE,CAOlD;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,CAajF;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,GAAG,MAAM,GAAG,SAAS,CAuBhF"}