@atomic-ehr/fhir-canonical-manager 0.0.8 → 0.0.9

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 (156) hide show
  1. package/README.md +72 -0
  2. package/dist/cache/core.d.ts +7 -0
  3. package/dist/cache/core.d.ts.map +1 -0
  4. package/dist/cache/core.js +11 -0
  5. package/dist/cache/core.js.map +1 -0
  6. package/dist/cache/index.d.ts +4 -0
  7. package/dist/cache/index.d.ts.map +1 -0
  8. package/dist/cache/index.js +4 -0
  9. package/dist/cache/index.js.map +1 -0
  10. package/dist/cache/persistence.d.ts +5 -0
  11. package/dist/cache/persistence.d.ts.map +1 -0
  12. package/dist/cache/persistence.js +25 -0
  13. package/dist/cache/persistence.js.map +1 -0
  14. package/dist/cache/validation.d.ts +2 -0
  15. package/dist/cache/validation.d.ts.map +1 -0
  16. package/dist/cache/validation.js +21 -0
  17. package/dist/cache/validation.js.map +1 -0
  18. package/dist/cli/index.d.ts.map +1 -1
  19. package/dist/cli/index.js +8 -4
  20. package/dist/cli/index.js.map +1 -1
  21. package/dist/cli/searchparam.d.ts +2 -0
  22. package/dist/cli/searchparam.d.ts.map +1 -0
  23. package/dist/cli/searchparam.js +131 -0
  24. package/dist/cli/searchparam.js.map +1 -0
  25. package/dist/constants.d.ts +2 -0
  26. package/dist/constants.d.ts.map +1 -0
  27. package/dist/constants.js +2 -0
  28. package/dist/constants.js.map +1 -0
  29. package/dist/fs/index.d.ts +2 -0
  30. package/dist/fs/index.d.ts.map +1 -0
  31. package/dist/fs/index.js +2 -0
  32. package/dist/fs/index.js.map +1 -0
  33. package/dist/fs/utils.d.ts +4 -0
  34. package/dist/fs/utils.d.ts.map +1 -0
  35. package/dist/fs/utils.js +23 -0
  36. package/dist/fs/utils.js.map +1 -0
  37. package/dist/index.d.ts +6 -111
  38. package/dist/index.d.ts.map +1 -1
  39. package/dist/index.js +5 -592
  40. package/dist/index.js.map +1 -1
  41. package/dist/manager/canonical.d.ts +3 -0
  42. package/dist/manager/canonical.d.ts.map +1 -0
  43. package/dist/manager/canonical.js +194 -0
  44. package/dist/manager/canonical.js.map +1 -0
  45. package/dist/manager/index.d.ts +3 -0
  46. package/dist/manager/index.d.ts.map +1 -0
  47. package/dist/manager/index.js +3 -0
  48. package/dist/manager/index.js.map +1 -0
  49. package/dist/package/detector.d.ts +2 -0
  50. package/dist/package/detector.d.ts.map +1 -0
  51. package/dist/package/detector.js +19 -0
  52. package/dist/package/detector.js.map +1 -0
  53. package/dist/package/index.d.ts +3 -0
  54. package/dist/package/index.d.ts.map +1 -0
  55. package/dist/package/index.js +3 -0
  56. package/dist/package/index.js.map +1 -0
  57. package/dist/package/installer.d.ts +2 -0
  58. package/dist/package/installer.d.ts.map +1 -0
  59. package/dist/package/installer.js +55 -0
  60. package/dist/package/installer.js.map +1 -0
  61. package/dist/reference/index.d.ts +5 -0
  62. package/dist/reference/index.d.ts.map +1 -0
  63. package/dist/reference/index.js +4 -0
  64. package/dist/reference/index.js.map +1 -0
  65. package/dist/reference/manager.d.ts +10 -0
  66. package/dist/reference/manager.d.ts.map +1 -0
  67. package/dist/reference/manager.js +36 -0
  68. package/dist/reference/manager.js.map +1 -0
  69. package/dist/reference/store.d.ts +6 -0
  70. package/dist/reference/store.d.ts.map +1 -0
  71. package/dist/reference/store.js +6 -0
  72. package/dist/reference/store.js.map +1 -0
  73. package/dist/resolver/context.d.ts +4 -0
  74. package/dist/resolver/context.d.ts.map +1 -0
  75. package/dist/resolver/context.js +14 -0
  76. package/dist/resolver/context.js.map +1 -0
  77. package/dist/resolver/index.d.ts +2 -0
  78. package/dist/resolver/index.d.ts.map +1 -0
  79. package/dist/resolver/index.js +2 -0
  80. package/dist/resolver/index.js.map +1 -0
  81. package/dist/scanner/directory.d.ts +3 -0
  82. package/dist/scanner/directory.d.ts.map +1 -0
  83. package/dist/scanner/directory.js +33 -0
  84. package/dist/scanner/directory.js.map +1 -0
  85. package/dist/scanner/index.d.ts +5 -0
  86. package/dist/scanner/index.d.ts.map +1 -0
  87. package/dist/scanner/index.js +5 -0
  88. package/dist/scanner/index.js.map +1 -0
  89. package/dist/scanner/package.d.ts +3 -0
  90. package/dist/scanner/package.d.ts.map +1 -0
  91. package/dist/scanner/package.js +26 -0
  92. package/dist/scanner/package.js.map +1 -0
  93. package/dist/scanner/parser.d.ts +5 -0
  94. package/dist/scanner/parser.d.ts.map +1 -0
  95. package/dist/scanner/parser.js +39 -0
  96. package/dist/scanner/parser.js.map +1 -0
  97. package/dist/scanner/processor.d.ts +4 -0
  98. package/dist/scanner/processor.d.ts.map +1 -0
  99. package/dist/scanner/processor.js +53 -0
  100. package/dist/scanner/processor.js.map +1 -0
  101. package/dist/search/index.d.ts +3 -0
  102. package/dist/search/index.d.ts.map +1 -0
  103. package/dist/search/index.js +3 -0
  104. package/dist/search/index.js.map +1 -0
  105. package/dist/search/smart.d.ts +9 -0
  106. package/dist/search/smart.d.ts.map +1 -0
  107. package/dist/search/smart.js +31 -0
  108. package/dist/search/smart.js.map +1 -0
  109. package/dist/search/terms.d.ts +2 -0
  110. package/dist/search/terms.d.ts.map +1 -0
  111. package/dist/search/terms.js +19 -0
  112. package/dist/search/terms.js.map +1 -0
  113. package/dist/types/core.d.ts +91 -0
  114. package/dist/types/core.d.ts.map +1 -0
  115. package/dist/types/core.js +2 -0
  116. package/dist/types/core.js.map +1 -0
  117. package/dist/types/index.d.ts +3 -0
  118. package/dist/types/index.d.ts.map +1 -0
  119. package/dist/types/index.js +3 -0
  120. package/dist/types/index.js.map +1 -0
  121. package/dist/types/internal.d.ts +48 -0
  122. package/dist/types/internal.d.ts.map +1 -0
  123. package/dist/types/internal.js +2 -0
  124. package/dist/types/internal.js.map +1 -0
  125. package/package.json +1 -1
  126. package/src/cache/core.ts +20 -0
  127. package/src/cache/index.ts +7 -0
  128. package/src/cache/persistence.ts +39 -0
  129. package/src/cache/validation.ts +27 -0
  130. package/src/cli/index.ts +8 -4
  131. package/src/cli/searchparam.ts +162 -0
  132. package/src/constants.ts +6 -0
  133. package/src/fs/index.ts +5 -0
  134. package/src/fs/utils.ts +28 -0
  135. package/src/index.ts +13 -990
  136. package/src/manager/canonical.ts +338 -0
  137. package/src/manager/index.ts +8 -0
  138. package/src/package/detector.ts +24 -0
  139. package/src/package/index.ts +6 -0
  140. package/src/package/installer.ts +77 -0
  141. package/src/reference/index.ts +10 -0
  142. package/src/reference/manager.ts +51 -0
  143. package/src/reference/store.ts +15 -0
  144. package/src/resolver/context.ts +25 -0
  145. package/src/resolver/index.ts +5 -0
  146. package/src/scanner/directory.ts +42 -0
  147. package/src/scanner/index.ts +8 -0
  148. package/src/scanner/package.ts +38 -0
  149. package/src/scanner/parser.ts +42 -0
  150. package/src/scanner/processor.ts +69 -0
  151. package/src/search/index.ts +6 -0
  152. package/src/search/smart.ts +57 -0
  153. package/src/search/terms.ts +22 -0
  154. package/src/types/core.ts +117 -0
  155. package/src/types/index.ts +6 -0
  156. package/src/types/internal.ts +57 -0
@@ -0,0 +1,162 @@
1
+ /**
2
+ * Search parameters command - displays search parameters for a resource type
3
+ */
4
+
5
+ import { CanonicalManager } from "../index.js";
6
+ import { parseArgs, loadPackageJson, getConfigFromPackageJson } from "./index.js";
7
+ import type { SearchParameter } from "../types/index.js";
8
+
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(`
14
+ Usage: fcm searchparam <resourceType> [options]
15
+
16
+ Display search parameters for a specific FHIR resource type
17
+
18
+ Arguments:
19
+ resourceType The FHIR resource type (e.g., Patient, Observation)
20
+
21
+ Options:
22
+ --format Output format: table (default), json, csv
23
+ --help Show this help message
24
+
25
+ Examples:
26
+ fcm searchparam Patient
27
+ fcm searchparam Observation --format json
28
+ fcm searchparam Encounter --format csv
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;
59
+ }
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;
73
+ }
74
+ } finally {
75
+ await manager.destroy();
76
+ }
77
+ }
78
+
79
+ 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)`);
100
+ }
101
+ console.log(`URL: ${url}`);
102
+ console.log('---');
103
+ }
104
+
105
+ console.log(`Total: ${searchParams.length} search parameters`);
106
+ }
107
+
108
+ // Helper function to wrap text at specified width
109
+ 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) {
119
+ lines.push(currentLine);
120
+ }
121
+ currentLine = word;
122
+ }
123
+ }
124
+
125
+ if (currentLine) {
126
+ lines.push(currentLine);
127
+ }
128
+
129
+ return lines.join('\n' + indent);
130
+ }
131
+
132
+ 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));
140
+ }
141
+
142
+ 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
+ }
154
+ }
155
+
156
+ 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
+ }
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Shared constants for FHIR Canonical Manager
3
+ */
4
+
5
+ // Default FHIR package registry
6
+ export const DEFAULT_REGISTRY = "https://fs.get-ig.org/pkgs/";
@@ -0,0 +1,5 @@
1
+ /**
2
+ * File system utilities exports
3
+ */
4
+
5
+ export { fileExists, ensureDir, isFhirPackage } from './utils';
@@ -0,0 +1,28 @@
1
+ /**
2
+ * File system utility functions
3
+ */
4
+
5
+ import * as fs from 'fs/promises';
6
+ import * as path from 'path';
7
+
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
+ }
15
+ };
16
+
17
+ export const ensureDir = async (dirPath: string): Promise<void> => {
18
+ try {
19
+ await fs.mkdir(dirPath, { recursive: true });
20
+ } catch {
21
+ // Ignore errors
22
+ }
23
+ };
24
+
25
+ export const isFhirPackage = async (dirPath: string): Promise<boolean> => {
26
+ const indexPath = path.join(dirPath, ".index.json");
27
+ return fileExists(indexPath);
28
+ };