@atomic-ehr/fhir-canonical-manager 0.0.13 → 0.0.15

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 (170) hide show
  1. package/dist/cache.d.ts +17 -0
  2. package/dist/cache.d.ts.map +1 -0
  3. package/dist/cache.js +50 -0
  4. package/dist/cache.js.map +1 -0
  5. package/dist/cli/index.d.ts.map +1 -1
  6. package/dist/cli/index.js +15 -15
  7. package/dist/cli/index.js.map +1 -1
  8. package/dist/cli/init.d.ts.map +1 -1
  9. package/dist/cli/init.js +7 -10
  10. package/dist/cli/init.js.map +1 -1
  11. package/dist/cli/list.d.ts.map +1 -1
  12. package/dist/cli/list.js +14 -10
  13. package/dist/cli/list.js.map +1 -1
  14. package/dist/cli/resolve.js +7 -7
  15. package/dist/cli/resolve.js.map +1 -1
  16. package/dist/cli/search.js +9 -9
  17. package/dist/cli/search.js.map +1 -1
  18. package/dist/cli/searchparam.d.ts.map +1 -1
  19. package/dist/cli/searchparam.js +27 -24
  20. package/dist/cli/searchparam.js.map +1 -1
  21. package/dist/fs/index.d.ts +1 -1
  22. package/dist/fs/index.d.ts.map +1 -1
  23. package/dist/fs/index.js +1 -1
  24. package/dist/fs/index.js.map +1 -1
  25. package/dist/fs/utils.js +2 -2
  26. package/dist/fs/utils.js.map +1 -1
  27. package/dist/index.d.ts +6 -6
  28. package/dist/index.d.ts.map +1 -1
  29. package/dist/index.js +4 -4
  30. package/dist/index.js.map +1 -1
  31. package/dist/manager/canonical.d.ts +1 -1
  32. package/dist/manager/canonical.d.ts.map +1 -1
  33. package/dist/manager/canonical.js +77 -45
  34. package/dist/manager/canonical.js.map +1 -1
  35. package/dist/manager/index.d.ts +1 -2
  36. package/dist/manager/index.d.ts.map +1 -1
  37. package/dist/manager/index.js +1 -2
  38. package/dist/manager/index.js.map +1 -1
  39. package/dist/package.d.ts +4 -0
  40. package/dist/package.d.ts.map +1 -0
  41. package/dist/package.js +69 -0
  42. package/dist/package.js.map +1 -0
  43. package/dist/{reference/manager.d.ts → reference.d.ts} +8 -3
  44. package/dist/reference.d.ts.map +1 -0
  45. package/dist/{reference/manager.js → reference.js} +13 -4
  46. package/dist/reference.js.map +1 -0
  47. package/dist/resolver.d.ts +4 -0
  48. package/dist/resolver.d.ts.map +1 -0
  49. package/dist/{resolver/context.js → resolver.js} +2 -2
  50. package/dist/resolver.js.map +1 -0
  51. package/dist/scanner/directory.d.ts +2 -2
  52. package/dist/scanner/directory.d.ts.map +1 -1
  53. package/dist/scanner/directory.js +24 -27
  54. package/dist/scanner/directory.js.map +1 -1
  55. package/dist/scanner/index.d.ts +4 -4
  56. package/dist/scanner/index.d.ts.map +1 -1
  57. package/dist/scanner/index.js +4 -4
  58. package/dist/scanner/index.js.map +1 -1
  59. package/dist/scanner/package.d.ts +1 -1
  60. package/dist/scanner/package.d.ts.map +1 -1
  61. package/dist/scanner/package.js +4 -4
  62. package/dist/scanner/package.js.map +1 -1
  63. package/dist/scanner/parser.d.ts +2 -2
  64. package/dist/scanner/parser.d.ts.map +1 -1
  65. package/dist/scanner/parser.js +1 -1
  66. package/dist/scanner/parser.js.map +1 -1
  67. package/dist/scanner/processor.d.ts +2 -2
  68. package/dist/scanner/processor.d.ts.map +1 -1
  69. package/dist/scanner/processor.js +3 -3
  70. package/dist/scanner/processor.js.map +1 -1
  71. package/dist/search/index.d.ts +2 -2
  72. package/dist/search/index.d.ts.map +1 -1
  73. package/dist/search/index.js +2 -2
  74. package/dist/search/index.js.map +1 -1
  75. package/dist/search/smart.d.ts +1 -1
  76. package/dist/search/smart.d.ts.map +1 -1
  77. package/dist/search/smart.js +3 -7
  78. package/dist/search/smart.js.map +1 -1
  79. package/dist/search/terms.js.map +1 -1
  80. package/dist/types/core.d.ts +5 -4
  81. package/dist/types/core.d.ts.map +1 -1
  82. package/dist/types/index.d.ts +2 -2
  83. package/dist/types/index.js +2 -2
  84. package/dist/types/internal.d.ts +7 -4
  85. package/dist/types/internal.d.ts.map +1 -1
  86. package/package.json +12 -2
  87. package/src/cache.ts +59 -0
  88. package/src/cli/index.ts +112 -114
  89. package/src/cli/init.ts +104 -108
  90. package/src/cli/list.ts +84 -77
  91. package/src/cli/resolve.ts +57 -57
  92. package/src/cli/search.ts +72 -72
  93. package/src/cli/searchparam.ts +118 -117
  94. package/src/constants.ts +1 -1
  95. package/src/fs/index.ts +1 -1
  96. package/src/fs/utils.ts +16 -16
  97. package/src/index.ts +9 -12
  98. package/src/manager/canonical.ts +349 -360
  99. package/src/manager/index.ts +1 -3
  100. package/src/package.ts +79 -0
  101. package/src/reference.ts +77 -0
  102. package/src/resolver.ts +38 -0
  103. package/src/scanner/directory.ts +25 -31
  104. package/src/scanner/index.ts +4 -4
  105. package/src/scanner/package.ts +26 -29
  106. package/src/scanner/parser.ts +25 -27
  107. package/src/scanner/processor.ts +51 -55
  108. package/src/search/index.ts +2 -2
  109. package/src/search/smart.ts +41 -48
  110. package/src/search/terms.ts +17 -17
  111. package/src/types/core.ts +102 -89
  112. package/src/types/index.ts +2 -2
  113. package/src/types/internal.ts +36 -34
  114. package/dist/cache/core.d.ts +0 -7
  115. package/dist/cache/core.d.ts.map +0 -1
  116. package/dist/cache/core.js +0 -11
  117. package/dist/cache/core.js.map +0 -1
  118. package/dist/cache/index.d.ts +0 -4
  119. package/dist/cache/index.d.ts.map +0 -1
  120. package/dist/cache/index.js +0 -4
  121. package/dist/cache/index.js.map +0 -1
  122. package/dist/cache/persistence.d.ts +0 -5
  123. package/dist/cache/persistence.d.ts.map +0 -1
  124. package/dist/cache/persistence.js +0 -25
  125. package/dist/cache/persistence.js.map +0 -1
  126. package/dist/cache/validation.d.ts +0 -2
  127. package/dist/cache/validation.d.ts.map +0 -1
  128. package/dist/cache/validation.js +0 -21
  129. package/dist/cache/validation.js.map +0 -1
  130. package/dist/package/detector.d.ts +0 -2
  131. package/dist/package/detector.d.ts.map +0 -1
  132. package/dist/package/detector.js +0 -19
  133. package/dist/package/detector.js.map +0 -1
  134. package/dist/package/index.d.ts +0 -3
  135. package/dist/package/index.d.ts.map +0 -1
  136. package/dist/package/index.js +0 -3
  137. package/dist/package/index.js.map +0 -1
  138. package/dist/package/installer.d.ts +0 -2
  139. package/dist/package/installer.d.ts.map +0 -1
  140. package/dist/package/installer.js +0 -55
  141. package/dist/package/installer.js.map +0 -1
  142. package/dist/reference/index.d.ts +0 -5
  143. package/dist/reference/index.d.ts.map +0 -1
  144. package/dist/reference/index.js +0 -4
  145. package/dist/reference/index.js.map +0 -1
  146. package/dist/reference/manager.d.ts.map +0 -1
  147. package/dist/reference/manager.js.map +0 -1
  148. package/dist/reference/store.d.ts +0 -6
  149. package/dist/reference/store.d.ts.map +0 -1
  150. package/dist/reference/store.js +0 -6
  151. package/dist/reference/store.js.map +0 -1
  152. package/dist/resolver/context.d.ts +0 -4
  153. package/dist/resolver/context.d.ts.map +0 -1
  154. package/dist/resolver/context.js.map +0 -1
  155. package/dist/resolver/index.d.ts +0 -2
  156. package/dist/resolver/index.d.ts.map +0 -1
  157. package/dist/resolver/index.js +0 -2
  158. package/dist/resolver/index.js.map +0 -1
  159. package/src/cache/core.ts +0 -20
  160. package/src/cache/index.ts +0 -7
  161. package/src/cache/persistence.ts +0 -39
  162. package/src/cache/validation.ts +0 -27
  163. package/src/package/detector.ts +0 -24
  164. package/src/package/index.ts +0 -6
  165. package/src/package/installer.ts +0 -77
  166. package/src/reference/index.ts +0 -10
  167. package/src/reference/manager.ts +0 -51
  168. package/src/reference/store.ts +0 -15
  169. package/src/resolver/context.ts +0 -25
  170. package/src/resolver/index.ts +0 -5
@@ -3,14 +3,14 @@
3
3
  */
4
4
 
5
5
  import { CanonicalManager } from "../index.js";
6
- import { parseArgs, loadPackageJson, getConfigFromPackageJson } from "./index.js";
7
6
  import type { SearchParameter } from "../types/index.js";
7
+ import { getConfigFromPackageJson, loadPackageJson, parseArgs } from "./index.js";
8
8
 
9
9
  export async function searchParamCommand(args: string[]): Promise<void> {
10
- const { positional, options } = parseArgs(args);
11
-
12
- if (options.help || positional.length === 0) {
13
- console.log(`
10
+ const { positional, options } = parseArgs(args);
11
+
12
+ if (options.help || positional.length === 0) {
13
+ console.log(`
14
14
  Usage: fcm searchparam <resourceType> [options]
15
15
 
16
16
  Display search parameters for a specific FHIR resource type
@@ -27,136 +27,137 @@ Examples:
27
27
  fcm searchparam Observation --format json
28
28
  fcm searchparam Encounter --format csv
29
29
  `);
30
- return;
31
- }
32
-
33
- const resourceType = positional[0];
34
- const format = (options.format as string) || 'table';
35
-
36
- // Load config from package.json
37
- const packageJson = await loadPackageJson();
38
- if (!packageJson) {
39
- throw new Error(
40
- "No package.json found. Run 'fcm init' to initialize a project.",
41
- );
42
- }
43
-
44
- const config = getConfigFromPackageJson(packageJson);
45
- const manager = CanonicalManager({
46
- packages: config.packages || [],
47
- registry: config.registry,
48
- workingDir: config.workingDir || process.cwd(),
49
- });
50
-
51
- await manager.init();
52
-
53
- try {
54
- const searchParams = await manager.getSearchParametersForResource(resourceType!);
55
-
56
- if (searchParams.length === 0) {
57
- console.log(`No search parameters found for resource type '${resourceType}'`);
58
- return;
30
+ return;
31
+ }
32
+
33
+ const resourceType = positional[0];
34
+ if (!resourceType) {
35
+ console.error("Error: Resource type is required");
36
+ process.exit(1);
59
37
  }
60
-
61
- // Format output based on requested format
62
- switch (format) {
63
- case 'json':
64
- outputJson(searchParams);
65
- break;
66
- case 'csv':
67
- outputCsv(searchParams);
68
- break;
69
- case 'table':
70
- default:
71
- outputTable(searchParams);
72
- break;
38
+ const format = (options.format as string) || "table";
39
+
40
+ // Load config from package.json
41
+ const packageJson = await loadPackageJson();
42
+ if (!packageJson) {
43
+ throw new Error("No package.json found. Run 'fcm init' to initialize a project.");
44
+ }
45
+
46
+ const config = getConfigFromPackageJson(packageJson);
47
+ const manager = CanonicalManager({
48
+ packages: config.packages || [],
49
+ registry: config.registry,
50
+ workingDir: config.workingDir || process.cwd(),
51
+ });
52
+
53
+ await manager.init();
54
+
55
+ try {
56
+ const searchParams = await manager.getSearchParametersForResource(resourceType);
57
+
58
+ if (searchParams.length === 0) {
59
+ console.log(`No search parameters found for resource type '${resourceType}'`);
60
+ return;
61
+ }
62
+
63
+ // Format output based on requested format
64
+ switch (format) {
65
+ case "json":
66
+ outputJson(searchParams);
67
+ break;
68
+ case "csv":
69
+ outputCsv(searchParams);
70
+ break;
71
+ default:
72
+ outputTable(searchParams);
73
+ break;
74
+ }
75
+ } finally {
76
+ await manager.destroy();
73
77
  }
74
- } finally {
75
- await manager.destroy();
76
- }
77
78
  }
78
79
 
79
80
  function outputTable(searchParams: SearchParameter[]): void {
80
- console.log('');
81
-
82
- // Display each parameter as a multiline block
83
- for (const param of searchParams) {
84
- const code = param.code || '';
85
- const type = param.type || '';
86
- const expression = param.expression || '';
87
- const url = param.url || '';
88
-
89
- console.log(`Code: ${code}`);
90
- console.log(`Type: ${type}`);
91
- if (expression) {
92
- // Wrap long expressions
93
- if (expression.length > 60) {
94
- console.log(`Expression: ${wrapText(expression, 60, ' ')}`);
95
- } else {
96
- console.log(`Expression: ${expression}`);
97
- }
98
- } else {
99
- console.log(`Expression: (none)`);
81
+ console.log("");
82
+
83
+ // Display each parameter as a multiline block
84
+ for (const param of searchParams) {
85
+ const code = param.code || "";
86
+ const type = param.type || "";
87
+ const expression = param.expression || "";
88
+ const url = param.url || "";
89
+
90
+ console.log(`Code: ${code}`);
91
+ console.log(`Type: ${type}`);
92
+ if (expression) {
93
+ // Wrap long expressions
94
+ if (expression.length > 60) {
95
+ console.log(`Expression: ${wrapText(expression, 60, " ")}`);
96
+ } else {
97
+ console.log(`Expression: ${expression}`);
98
+ }
99
+ } else {
100
+ console.log(`Expression: (none)`);
101
+ }
102
+ console.log(`URL: ${url}`);
103
+ console.log("---");
100
104
  }
101
- console.log(`URL: ${url}`);
102
- console.log('---');
103
- }
104
-
105
- console.log(`Total: ${searchParams.length} search parameters`);
105
+
106
+ console.log(`Total: ${searchParams.length} search parameters`);
106
107
  }
107
108
 
108
109
  // Helper function to wrap text at specified width
109
110
  function wrapText(text: string, width: number, indent: string): string {
110
- const words = text.split(' ');
111
- const lines: string[] = [];
112
- let currentLine = '';
113
-
114
- for (const word of words) {
115
- if (currentLine.length + word.length + 1 <= width) {
116
- currentLine += (currentLine ? ' ' : '') + word;
117
- } else {
118
- if (currentLine) {
111
+ const words = text.split(" ");
112
+ const lines: string[] = [];
113
+ let currentLine = "";
114
+
115
+ for (const word of words) {
116
+ if (currentLine.length + word.length + 1 <= width) {
117
+ currentLine += (currentLine ? " " : "") + word;
118
+ } else {
119
+ if (currentLine) {
120
+ lines.push(currentLine);
121
+ }
122
+ currentLine = word;
123
+ }
124
+ }
125
+
126
+ if (currentLine) {
119
127
  lines.push(currentLine);
120
- }
121
- currentLine = word;
122
128
  }
123
- }
124
-
125
- if (currentLine) {
126
- lines.push(currentLine);
127
- }
128
-
129
- return lines.join('\n' + indent);
129
+
130
+ return lines.join(`\n${indent}`);
130
131
  }
131
132
 
132
133
  function outputJson(searchParams: SearchParameter[]): void {
133
- const output = searchParams.map(param => ({
134
- code: param.code,
135
- type: param.type,
136
- expression: param.expression || null,
137
- url: param.url,
138
- }));
139
- console.log(JSON.stringify(output, null, 2));
134
+ const output = searchParams.map((param) => ({
135
+ code: param.code,
136
+ type: param.type,
137
+ expression: param.expression || null,
138
+ url: param.url,
139
+ }));
140
+ console.log(JSON.stringify(output, null, 2));
140
141
  }
141
142
 
142
143
  function outputCsv(searchParams: SearchParameter[]): void {
143
- // CSV header
144
- console.log('Code,Type,Expression,URL');
145
-
146
- // CSV rows - no truncation for CSV output
147
- for (const param of searchParams) {
148
- const code = escapeCsv(param.code || '');
149
- const type = escapeCsv(param.type || '');
150
- const expression = escapeCsv(param.expression || '');
151
- const url = escapeCsv(param.url || '');
152
- console.log(`${code},${type},${expression},${url}`);
153
- }
144
+ // CSV header
145
+ console.log("Code,Type,Expression,URL");
146
+
147
+ // CSV rows - no truncation for CSV output
148
+ for (const param of searchParams) {
149
+ const code = escapeCsv(param.code || "");
150
+ const type = escapeCsv(param.type || "");
151
+ const expression = escapeCsv(param.expression || "");
152
+ const url = escapeCsv(param.url || "");
153
+ console.log(`${code},${type},${expression},${url}`);
154
+ }
154
155
  }
155
156
 
156
157
  function escapeCsv(value: string): string {
157
- // Escape CSV values that contain commas, quotes, or newlines
158
- if (value.includes(',') || value.includes('"') || value.includes('\n')) {
159
- return '"' + value.replace(/"/g, '""') + '"';
160
- }
161
- return value;
162
- }
158
+ // Escape CSV values that contain commas, quotes, or newlines
159
+ if (value.includes(",") || value.includes('"') || value.includes("\n")) {
160
+ return `"${value.replace(/"/g, '""')}"`;
161
+ }
162
+ return value;
163
+ }
package/src/constants.ts CHANGED
@@ -3,4 +3,4 @@
3
3
  */
4
4
 
5
5
  // Default FHIR package registry
6
- export const DEFAULT_REGISTRY = "https://fs.get-ig.org/pkgs/";
6
+ export const DEFAULT_REGISTRY = "https://fs.get-ig.org/pkgs/";
package/src/fs/index.ts CHANGED
@@ -2,4 +2,4 @@
2
2
  * File system utilities exports
3
3
  */
4
4
 
5
- export { fileExists, ensureDir, isFhirPackage } from './utils.js';
5
+ export { ensureDir, fileExists, isFhirPackage } from "./utils.js";
package/src/fs/utils.ts CHANGED
@@ -2,27 +2,27 @@
2
2
  * File system utility functions
3
3
  */
4
4
 
5
- import * as fs from 'fs/promises';
6
- import * as path from 'path';
5
+ import * as fs from "node:fs/promises";
6
+ import * as path from "node:path";
7
7
 
8
8
  export const fileExists = async (filePath: string): Promise<boolean> => {
9
- try {
10
- await fs.access(filePath);
11
- return true;
12
- } catch {
13
- return false;
14
- }
9
+ try {
10
+ await fs.access(filePath);
11
+ return true;
12
+ } catch {
13
+ return false;
14
+ }
15
15
  };
16
16
 
17
17
  export const ensureDir = async (dirPath: string): Promise<void> => {
18
- try {
19
- await fs.mkdir(dirPath, { recursive: true });
20
- } catch {
21
- // Ignore errors
22
- }
18
+ try {
19
+ await fs.mkdir(dirPath, { recursive: true });
20
+ } catch {
21
+ // Ignore errors
22
+ }
23
23
  };
24
24
 
25
25
  export const isFhirPackage = async (dirPath: string): Promise<boolean> => {
26
- const indexPath = path.join(dirPath, ".index.json");
27
- return fileExists(indexPath);
28
- };
26
+ const indexPath = path.join(dirPath, ".index.json");
27
+ return fileExists(indexPath);
28
+ };
package/src/index.ts CHANGED
@@ -3,19 +3,16 @@
3
3
  * A package manager for FHIR resources with canonical URL resolution
4
4
  */
5
5
 
6
- // Re-export all public types
7
- export * from './types/index.js';
8
-
9
- // Re-export reference management
10
- export { createReferenceManager, ReferenceManagerFactory as ReferenceManager } from './reference/index.js';
11
- export type { ReferenceManager as ReferenceManagerType } from './reference/index.js';
12
-
13
6
  // Re-export main CanonicalManager factory and class
14
- export { CanonicalManager, createCanonicalManager } from './manager/index.js';
15
-
7
+ export { CanonicalManager, createCanonicalManager } from "./manager/index.js";
8
+ export type { ReferenceManager as ReferenceManagerType } from "./reference.js";
9
+ // Re-export reference management
10
+ export { createReferenceManager, ReferenceManagerFactory as ReferenceManager } from "./reference.js";
16
11
  // Re-export CanonicalManager type interface with T prefix
17
- export type { CanonicalManager as TCanonicalManager } from './types/core.js';
12
+ export type { CanonicalManager as TCanonicalManager } from "./types/core.js";
13
+ // Re-export all public types
14
+ export * from "./types/index.js";
18
15
 
19
16
  // Default export for backward compatibility
20
- import { createCanonicalManager } from './manager/index.js';
21
- export default createCanonicalManager;
17
+ import { createCanonicalManager } from "./manager/index.js";
18
+ export default createCanonicalManager;