@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.
- package/README.md +72 -0
- package/dist/cache/core.d.ts +7 -0
- package/dist/cache/core.d.ts.map +1 -0
- package/dist/cache/core.js +11 -0
- package/dist/cache/core.js.map +1 -0
- package/dist/cache/index.d.ts +4 -0
- package/dist/cache/index.d.ts.map +1 -0
- package/dist/cache/index.js +4 -0
- package/dist/cache/index.js.map +1 -0
- package/dist/cache/persistence.d.ts +5 -0
- package/dist/cache/persistence.d.ts.map +1 -0
- package/dist/cache/persistence.js +25 -0
- package/dist/cache/persistence.js.map +1 -0
- package/dist/cache/validation.d.ts +2 -0
- package/dist/cache/validation.d.ts.map +1 -0
- package/dist/cache/validation.js +21 -0
- package/dist/cache/validation.js.map +1 -0
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +8 -4
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/searchparam.d.ts +2 -0
- package/dist/cli/searchparam.d.ts.map +1 -0
- package/dist/cli/searchparam.js +131 -0
- package/dist/cli/searchparam.js.map +1 -0
- package/dist/constants.d.ts +2 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +2 -0
- package/dist/constants.js.map +1 -0
- package/dist/fs/index.d.ts +2 -0
- package/dist/fs/index.d.ts.map +1 -0
- package/dist/fs/index.js +2 -0
- package/dist/fs/index.js.map +1 -0
- package/dist/fs/utils.d.ts +4 -0
- package/dist/fs/utils.d.ts.map +1 -0
- package/dist/fs/utils.js +23 -0
- package/dist/fs/utils.js.map +1 -0
- package/dist/index.d.ts +6 -111
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -592
- package/dist/index.js.map +1 -1
- package/dist/manager/canonical.d.ts +3 -0
- package/dist/manager/canonical.d.ts.map +1 -0
- package/dist/manager/canonical.js +194 -0
- package/dist/manager/canonical.js.map +1 -0
- package/dist/manager/index.d.ts +3 -0
- package/dist/manager/index.d.ts.map +1 -0
- package/dist/manager/index.js +3 -0
- package/dist/manager/index.js.map +1 -0
- package/dist/package/detector.d.ts +2 -0
- package/dist/package/detector.d.ts.map +1 -0
- package/dist/package/detector.js +19 -0
- package/dist/package/detector.js.map +1 -0
- package/dist/package/index.d.ts +3 -0
- package/dist/package/index.d.ts.map +1 -0
- package/dist/package/index.js +3 -0
- package/dist/package/index.js.map +1 -0
- package/dist/package/installer.d.ts +2 -0
- package/dist/package/installer.d.ts.map +1 -0
- package/dist/package/installer.js +55 -0
- package/dist/package/installer.js.map +1 -0
- package/dist/reference/index.d.ts +5 -0
- package/dist/reference/index.d.ts.map +1 -0
- package/dist/reference/index.js +4 -0
- package/dist/reference/index.js.map +1 -0
- package/dist/reference/manager.d.ts +10 -0
- package/dist/reference/manager.d.ts.map +1 -0
- package/dist/reference/manager.js +36 -0
- package/dist/reference/manager.js.map +1 -0
- package/dist/reference/store.d.ts +6 -0
- package/dist/reference/store.d.ts.map +1 -0
- package/dist/reference/store.js +6 -0
- package/dist/reference/store.js.map +1 -0
- package/dist/resolver/context.d.ts +4 -0
- package/dist/resolver/context.d.ts.map +1 -0
- package/dist/resolver/context.js +14 -0
- package/dist/resolver/context.js.map +1 -0
- package/dist/resolver/index.d.ts +2 -0
- package/dist/resolver/index.d.ts.map +1 -0
- package/dist/resolver/index.js +2 -0
- package/dist/resolver/index.js.map +1 -0
- package/dist/scanner/directory.d.ts +3 -0
- package/dist/scanner/directory.d.ts.map +1 -0
- package/dist/scanner/directory.js +33 -0
- package/dist/scanner/directory.js.map +1 -0
- package/dist/scanner/index.d.ts +5 -0
- package/dist/scanner/index.d.ts.map +1 -0
- package/dist/scanner/index.js +5 -0
- package/dist/scanner/index.js.map +1 -0
- package/dist/scanner/package.d.ts +3 -0
- package/dist/scanner/package.d.ts.map +1 -0
- package/dist/scanner/package.js +26 -0
- package/dist/scanner/package.js.map +1 -0
- package/dist/scanner/parser.d.ts +5 -0
- package/dist/scanner/parser.d.ts.map +1 -0
- package/dist/scanner/parser.js +39 -0
- package/dist/scanner/parser.js.map +1 -0
- package/dist/scanner/processor.d.ts +4 -0
- package/dist/scanner/processor.d.ts.map +1 -0
- package/dist/scanner/processor.js +53 -0
- package/dist/scanner/processor.js.map +1 -0
- package/dist/search/index.d.ts +3 -0
- package/dist/search/index.d.ts.map +1 -0
- package/dist/search/index.js +3 -0
- package/dist/search/index.js.map +1 -0
- package/dist/search/smart.d.ts +9 -0
- package/dist/search/smart.d.ts.map +1 -0
- package/dist/search/smart.js +31 -0
- package/dist/search/smart.js.map +1 -0
- package/dist/search/terms.d.ts +2 -0
- package/dist/search/terms.d.ts.map +1 -0
- package/dist/search/terms.js +19 -0
- package/dist/search/terms.js.map +1 -0
- package/dist/types/core.d.ts +91 -0
- package/dist/types/core.d.ts.map +1 -0
- package/dist/types/core.js +2 -0
- package/dist/types/core.js.map +1 -0
- package/dist/types/index.d.ts +3 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +3 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/internal.d.ts +48 -0
- package/dist/types/internal.d.ts.map +1 -0
- package/dist/types/internal.js +2 -0
- package/dist/types/internal.js.map +1 -0
- package/package.json +1 -1
- package/src/cache/core.ts +20 -0
- package/src/cache/index.ts +7 -0
- package/src/cache/persistence.ts +39 -0
- package/src/cache/validation.ts +27 -0
- package/src/cli/index.ts +8 -4
- package/src/cli/searchparam.ts +162 -0
- package/src/constants.ts +6 -0
- package/src/fs/index.ts +5 -0
- package/src/fs/utils.ts +28 -0
- package/src/index.ts +13 -990
- package/src/manager/canonical.ts +338 -0
- package/src/manager/index.ts +8 -0
- package/src/package/detector.ts +24 -0
- package/src/package/index.ts +6 -0
- package/src/package/installer.ts +77 -0
- package/src/reference/index.ts +10 -0
- package/src/reference/manager.ts +51 -0
- package/src/reference/store.ts +15 -0
- package/src/resolver/context.ts +25 -0
- package/src/resolver/index.ts +5 -0
- package/src/scanner/directory.ts +42 -0
- package/src/scanner/index.ts +8 -0
- package/src/scanner/package.ts +38 -0
- package/src/scanner/parser.ts +42 -0
- package/src/scanner/processor.ts +69 -0
- package/src/search/index.ts +6 -0
- package/src/search/smart.ts +57 -0
- package/src/search/terms.ts +22 -0
- package/src/types/core.ts +117 -0
- package/src/types/index.ts +6 -0
- 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
|
+
}
|
package/src/constants.ts
ADDED
package/src/fs/index.ts
ADDED
package/src/fs/utils.ts
ADDED
|
@@ -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
|
+
};
|