@haste-health/cli 1.12.3
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 +1 -0
- package/lib/client.d.ts +1 -0
- package/lib/client.js +67 -0
- package/lib/client.js.map +1 -0
- package/lib/commands/api.d.ts +2 -0
- package/lib/commands/api.js +273 -0
- package/lib/commands/api.js.map +1 -0
- package/lib/commands/generation.d.ts +2 -0
- package/lib/commands/generation.js +135 -0
- package/lib/commands/generation.js.map +1 -0
- package/lib/commands/minimize.d.ts +5 -0
- package/lib/commands/minimize.js +69 -0
- package/lib/commands/minimize.js.map +1 -0
- package/lib/commands/testscript.d.ts +2 -0
- package/lib/commands/testscript.js +82 -0
- package/lib/commands/testscript.js.map +1 -0
- package/lib/commands/validate.d.ts +2 -0
- package/lib/commands/validate.js +30 -0
- package/lib/commands/validate.js.map +1 -0
- package/lib/config.d.ts +23 -0
- package/lib/config.js +171 -0
- package/lib/config.js.map +1 -0
- package/lib/hastehealth.d.ts +1 -0
- package/lib/hastehealth.js +19 -0
- package/lib/hastehealth.js.map +1 -0
- package/lib/logger.d.ts +2 -0
- package/lib/logger.js +9 -0
- package/lib/logger.js.map +1 -0
- package/lib/oxidizedhealth.d.ts +1 -0
- package/lib/oxidizedhealth.js +21 -0
- package/lib/oxidizedhealth.js.map +1 -0
- package/lib/utilities.d.ts +15 -0
- package/lib/utilities.js +57 -0
- package/lib/utilities.js.map +1 -0
- package/package.json +42 -0
package/README.md
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
# HasteHealth CLI
|
package/lib/client.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function createClient(location: string): Promise<import("@haste-health/client").AsynchronousClient<import("@haste-health/client/http").HTTPContext>>;
|
package/lib/client.js
ADDED
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import httpClient from "@haste-health/client/http";
|
|
2
|
+
import { R4, R4B } from "@haste-health/fhir-types/versions";
|
|
3
|
+
import { getCurrentTenant, loadConfig } from "./config.js";
|
|
4
|
+
function configureAuthHeader(tenant) {
|
|
5
|
+
return {
|
|
6
|
+
headers: {
|
|
7
|
+
Authorization: `Basic ${btoa(`${tenant.auth.client_id}:${tenant.auth.client_secret}`)}`,
|
|
8
|
+
},
|
|
9
|
+
};
|
|
10
|
+
}
|
|
11
|
+
function isTokenResponseValid(timeReceived, tokenResponse,
|
|
12
|
+
// Auto setting window to 10 minutes.
|
|
13
|
+
window = 600) {
|
|
14
|
+
if (!tokenResponse)
|
|
15
|
+
return false;
|
|
16
|
+
const curSeconds = new Date().getTime() / 1000;
|
|
17
|
+
return curSeconds - timeReceived < tokenResponse.expires_in - window;
|
|
18
|
+
}
|
|
19
|
+
export async function createClient(location) {
|
|
20
|
+
const config = loadConfig(location);
|
|
21
|
+
const tenant = getCurrentTenant(location, config);
|
|
22
|
+
if (!tenant)
|
|
23
|
+
throw new Error("No tenant configured run config add-tenant.");
|
|
24
|
+
let accessTokenResponse = undefined;
|
|
25
|
+
let timeSent = new Date().getTime() / 1000;
|
|
26
|
+
let wellknown = undefined;
|
|
27
|
+
if (tenant.oidc_discovery_uri) {
|
|
28
|
+
wellknown = await fetch(tenant.oidc_discovery_uri).then((res) => res.json());
|
|
29
|
+
}
|
|
30
|
+
return httpClient({
|
|
31
|
+
url: (fhirversion) => {
|
|
32
|
+
switch (fhirversion) {
|
|
33
|
+
case R4:
|
|
34
|
+
return tenant.r4_url;
|
|
35
|
+
case R4B:
|
|
36
|
+
return tenant.r4b_url;
|
|
37
|
+
default:
|
|
38
|
+
throw new Error(`Unsupported FHIR version: ${fhirversion}`);
|
|
39
|
+
}
|
|
40
|
+
},
|
|
41
|
+
getAccessToken: tenant.auth.type === "public"
|
|
42
|
+
? undefined
|
|
43
|
+
: async function () {
|
|
44
|
+
if (accessTokenResponse &&
|
|
45
|
+
isTokenResponseValid(timeSent, accessTokenResponse)) {
|
|
46
|
+
return accessTokenResponse.access_token;
|
|
47
|
+
}
|
|
48
|
+
timeSent = new Date().getTime() / 1000;
|
|
49
|
+
const response = await fetch(wellknown.token_endpoint, {
|
|
50
|
+
method: "POST",
|
|
51
|
+
body: new URLSearchParams({
|
|
52
|
+
grant_type: "client_credentials",
|
|
53
|
+
}),
|
|
54
|
+
...configureAuthHeader(tenant),
|
|
55
|
+
});
|
|
56
|
+
accessTokenResponse = await response.json();
|
|
57
|
+
if (response.status >= 400) {
|
|
58
|
+
throw new Error(JSON.stringify(accessTokenResponse));
|
|
59
|
+
}
|
|
60
|
+
if (!accessTokenResponse) {
|
|
61
|
+
throw new Error("No access token received");
|
|
62
|
+
}
|
|
63
|
+
return accessTokenResponse.access_token;
|
|
64
|
+
},
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,273 @@
|
|
|
1
|
+
import { confirm } from "@inquirer/prompts";
|
|
2
|
+
import * as r4Sets from "@haste-health/fhir-types/r4/sets";
|
|
3
|
+
import * as r4bSets from "@haste-health/fhir-types/r4b/sets";
|
|
4
|
+
import { R4, R4B } from "@haste-health/fhir-types/versions";
|
|
5
|
+
import { createClient } from "../client.js";
|
|
6
|
+
import { CONFIG_LOCATION } from "../config.js";
|
|
7
|
+
import logger from "../logger.js";
|
|
8
|
+
import { conversion, dataCommand } from "../utilities.js";
|
|
9
|
+
function validateResourceType(fhirVersion, resourceType) {
|
|
10
|
+
switch (fhirVersion) {
|
|
11
|
+
case R4: {
|
|
12
|
+
return r4Sets.resourceTypes.has(resourceType);
|
|
13
|
+
}
|
|
14
|
+
case R4B: {
|
|
15
|
+
return r4bSets.resourceTypes.has(resourceType);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
function isBundle(value) {
|
|
20
|
+
return value?.resourceType === "Bundle";
|
|
21
|
+
}
|
|
22
|
+
function isParameters(value) {
|
|
23
|
+
return value?.resourceType === "Parameters";
|
|
24
|
+
}
|
|
25
|
+
export function apiCommands(command) {
|
|
26
|
+
command
|
|
27
|
+
.command("capabilities")
|
|
28
|
+
.argument("<fhirVersion>", "FHIR Version")
|
|
29
|
+
.action(async (userFHIRVersion) => {
|
|
30
|
+
const client = await createClient(CONFIG_LOCATION);
|
|
31
|
+
const FHIRVersion = conversion.asFHIRType(userFHIRVersion);
|
|
32
|
+
const capabilities = await client.capabilities({}, FHIRVersion);
|
|
33
|
+
logger.info(capabilities);
|
|
34
|
+
});
|
|
35
|
+
dataCommand.command(command
|
|
36
|
+
.command("create")
|
|
37
|
+
.argument("<fhirVersion>", "FHIR Version")
|
|
38
|
+
.action(async (userFHIRVersion, options) => {
|
|
39
|
+
const resourceToSave = dataCommand.readData(options);
|
|
40
|
+
const client = await createClient(CONFIG_LOCATION);
|
|
41
|
+
const FHIRVersion = conversion.asFHIRType(userFHIRVersion);
|
|
42
|
+
if (!resourceToSave) {
|
|
43
|
+
throw new Error("No resource provided to save");
|
|
44
|
+
}
|
|
45
|
+
const resource = await client.create({}, FHIRVersion, resourceToSave);
|
|
46
|
+
logger.info(resource);
|
|
47
|
+
}));
|
|
48
|
+
dataCommand.command(command
|
|
49
|
+
.command("update")
|
|
50
|
+
.argument("<fhirVersion>", "FHIR Version")
|
|
51
|
+
.argument("<resourceType>", "Resource Type")
|
|
52
|
+
.argument("<id>", "Resource ID")
|
|
53
|
+
.action(async (userFHIRVersion, resourceType, id, options) => {
|
|
54
|
+
const FHIRVersion = conversion.asFHIRType(userFHIRVersion);
|
|
55
|
+
if (!validateResourceType(FHIRVersion, resourceType))
|
|
56
|
+
throw new Error("Invalid resource type");
|
|
57
|
+
const resourceToSave = dataCommand.readData(options);
|
|
58
|
+
const client = await createClient(CONFIG_LOCATION);
|
|
59
|
+
if (!resourceToSave) {
|
|
60
|
+
throw new Error("No resource provided to save");
|
|
61
|
+
}
|
|
62
|
+
const resource = await client.update({}, FHIRVersion, resourceType, id, resourceToSave);
|
|
63
|
+
logger.info(resource);
|
|
64
|
+
}));
|
|
65
|
+
dataCommand.command(command
|
|
66
|
+
.command("batch")
|
|
67
|
+
.argument("<fhirVersion>", "FHIR Version")
|
|
68
|
+
.action(async (userFHIRVersion, options) => {
|
|
69
|
+
const batchBundle = dataCommand.readData(options);
|
|
70
|
+
const client = await createClient(CONFIG_LOCATION);
|
|
71
|
+
const FHIRVersion = conversion.asFHIRType(userFHIRVersion);
|
|
72
|
+
if (!batchBundle) {
|
|
73
|
+
throw new Error("No resource provided to save");
|
|
74
|
+
}
|
|
75
|
+
if (!isBundle(batchBundle))
|
|
76
|
+
throw new Error("invalid resource type must be a 'Bundle'.");
|
|
77
|
+
const resource = await client.batch({}, FHIRVersion, batchBundle);
|
|
78
|
+
logger.info(resource);
|
|
79
|
+
}));
|
|
80
|
+
dataCommand.command(command
|
|
81
|
+
.command("transaction")
|
|
82
|
+
.argument("<fhirVersion>", "FHIR Version")
|
|
83
|
+
.action(async (userFHIRVersion, options) => {
|
|
84
|
+
const transaction = dataCommand.readData(options);
|
|
85
|
+
const client = await createClient(CONFIG_LOCATION);
|
|
86
|
+
const FHIRVersion = conversion.asFHIRType(userFHIRVersion);
|
|
87
|
+
if (!transaction) {
|
|
88
|
+
throw new Error("No resource provided to save");
|
|
89
|
+
}
|
|
90
|
+
if (!isBundle(transaction))
|
|
91
|
+
throw new Error("invalid resource type must be a 'Bundle'.");
|
|
92
|
+
const resource = await client.transaction({}, FHIRVersion, transaction);
|
|
93
|
+
logger.info(resource);
|
|
94
|
+
}));
|
|
95
|
+
dataCommand.command(command
|
|
96
|
+
.command("patch")
|
|
97
|
+
.argument("<fhirVersion>", "FHIR Version")
|
|
98
|
+
.argument("<resourceType>", "Resource Type")
|
|
99
|
+
.argument("<id>", "Resource ID")
|
|
100
|
+
.action(async (userFHIRVersion, resourceType, id, options) => {
|
|
101
|
+
const patches = dataCommand.readData(options);
|
|
102
|
+
const client = await createClient(CONFIG_LOCATION);
|
|
103
|
+
const FHIRVersion = conversion.asFHIRType(userFHIRVersion);
|
|
104
|
+
if (!validateResourceType(FHIRVersion, resourceType))
|
|
105
|
+
throw new Error("Invalid resource type");
|
|
106
|
+
if (!patches) {
|
|
107
|
+
throw new Error("No patches provided.");
|
|
108
|
+
}
|
|
109
|
+
const resource = await client.patch({}, FHIRVersion, resourceType, id, patches);
|
|
110
|
+
logger.info(resource);
|
|
111
|
+
}));
|
|
112
|
+
command
|
|
113
|
+
.command("delete")
|
|
114
|
+
.argument("<fhirVersion>", "FHIR Version")
|
|
115
|
+
.argument("<resourceType>", "Resource Type")
|
|
116
|
+
.argument("<id>", "Resource ID")
|
|
117
|
+
.action(async (userFHIRVersion, resourceType, id) => {
|
|
118
|
+
const client = await createClient(CONFIG_LOCATION);
|
|
119
|
+
const FHIRVersion = conversion.asFHIRType(userFHIRVersion);
|
|
120
|
+
if (!validateResourceType(FHIRVersion, resourceType))
|
|
121
|
+
throw new Error("Invalid resource type");
|
|
122
|
+
const shouldDelete = await confirm({
|
|
123
|
+
message: "Are you sure you want to delete this resource?",
|
|
124
|
+
});
|
|
125
|
+
if (shouldDelete) {
|
|
126
|
+
await client.delete_instance({}, FHIRVersion, resourceType, id);
|
|
127
|
+
logger.info("Resource has been deleted.");
|
|
128
|
+
}
|
|
129
|
+
});
|
|
130
|
+
command
|
|
131
|
+
.command("search_system")
|
|
132
|
+
.argument("<fhirVersion>", "FHIR Version")
|
|
133
|
+
.argument("[query]", "query")
|
|
134
|
+
.action(async (userFHIRVersion, query) => {
|
|
135
|
+
const client = await createClient(CONFIG_LOCATION);
|
|
136
|
+
const FHIRVersion = conversion.asFHIRType(userFHIRVersion);
|
|
137
|
+
const searchResponse = await client.search_system({}, FHIRVersion, query ?? "");
|
|
138
|
+
logger.info(searchResponse);
|
|
139
|
+
});
|
|
140
|
+
command
|
|
141
|
+
.command("search_type")
|
|
142
|
+
.argument("<fhirVersion>", "FHIR Version")
|
|
143
|
+
.argument("<resourceType>", "Resource Type")
|
|
144
|
+
.argument("[query]", "query")
|
|
145
|
+
.action(async (userFHIRVersion, resourceType, query) => {
|
|
146
|
+
const client = await createClient(CONFIG_LOCATION);
|
|
147
|
+
const FHIRVersion = conversion.asFHIRType(userFHIRVersion);
|
|
148
|
+
if (!validateResourceType(FHIRVersion, resourceType))
|
|
149
|
+
throw new Error("Invalid resource type");
|
|
150
|
+
const searchResponse = await client.search_type({}, FHIRVersion, resourceType, query ?? "");
|
|
151
|
+
logger.info(searchResponse);
|
|
152
|
+
});
|
|
153
|
+
command
|
|
154
|
+
.command("read")
|
|
155
|
+
.argument("<fhirVersion>", "FHIR Version")
|
|
156
|
+
.argument("<resourceType>", "Resource Type")
|
|
157
|
+
.argument("<id>", "Resource ID")
|
|
158
|
+
.action(async (userFHIRVersion, resourceType, id) => {
|
|
159
|
+
const client = await createClient(CONFIG_LOCATION);
|
|
160
|
+
const FHIRVersion = conversion.asFHIRType(userFHIRVersion);
|
|
161
|
+
if (!validateResourceType(FHIRVersion, resourceType))
|
|
162
|
+
throw new Error("Invalid resource type");
|
|
163
|
+
const resource = await client.read({}, FHIRVersion, resourceType, id);
|
|
164
|
+
logger.info(resource);
|
|
165
|
+
});
|
|
166
|
+
command
|
|
167
|
+
.command("vread")
|
|
168
|
+
.argument("<fhirVersion>", "FHIR Version")
|
|
169
|
+
.argument("<resourceType>", "Resource Type")
|
|
170
|
+
.argument("<id>", "Resource ID")
|
|
171
|
+
.argument("<versionId>", "Resource version ID")
|
|
172
|
+
.action(async (userFHIRVersion, resourceType, id, versionId) => {
|
|
173
|
+
const client = await createClient(CONFIG_LOCATION);
|
|
174
|
+
const FHIRVersion = conversion.asFHIRType(userFHIRVersion);
|
|
175
|
+
if (!validateResourceType(FHIRVersion, resourceType))
|
|
176
|
+
throw new Error("Invalid resource type");
|
|
177
|
+
const resourceVersion = await client.vread({}, FHIRVersion, resourceType, id, versionId);
|
|
178
|
+
logger.info(resourceVersion);
|
|
179
|
+
});
|
|
180
|
+
command
|
|
181
|
+
.command("history_system")
|
|
182
|
+
.argument("<fhirVersion>", "FHIR Version")
|
|
183
|
+
.argument("[query]", "query")
|
|
184
|
+
.action(async (userFHIRVersion, query) => {
|
|
185
|
+
const client = await createClient(CONFIG_LOCATION);
|
|
186
|
+
const FHIRVersion = conversion.asFHIRType(userFHIRVersion);
|
|
187
|
+
const history = await client.history_system({}, FHIRVersion, query);
|
|
188
|
+
logger.info(history);
|
|
189
|
+
});
|
|
190
|
+
command
|
|
191
|
+
.command("history_type")
|
|
192
|
+
.argument("<fhirVersion>", "FHIR Version")
|
|
193
|
+
.argument("<resourceType>", "Resource Type")
|
|
194
|
+
.argument("[query]", "query")
|
|
195
|
+
.action(async (userFHIRVersion, resourceType, query) => {
|
|
196
|
+
const client = await createClient(CONFIG_LOCATION);
|
|
197
|
+
const FHIRVersion = conversion.asFHIRType(userFHIRVersion);
|
|
198
|
+
if (!validateResourceType(FHIRVersion, resourceType))
|
|
199
|
+
throw new Error("Invalid resource type");
|
|
200
|
+
const history = await client.history_type({}, FHIRVersion, resourceType, query);
|
|
201
|
+
logger.info(history);
|
|
202
|
+
});
|
|
203
|
+
command
|
|
204
|
+
.command("history_instance")
|
|
205
|
+
.argument("<fhirVersion>", "FHIR Version")
|
|
206
|
+
.argument("<resourceType>", "Resource Type")
|
|
207
|
+
.argument("<id>", "Resource ID")
|
|
208
|
+
.argument("[query]", "query")
|
|
209
|
+
.action(async (userFHIRVersion, resourceType, id, query) => {
|
|
210
|
+
const client = await createClient(CONFIG_LOCATION);
|
|
211
|
+
const FHIRVersion = conversion.asFHIRType(userFHIRVersion);
|
|
212
|
+
if (!validateResourceType(FHIRVersion, resourceType))
|
|
213
|
+
throw new Error("Invalid resource type");
|
|
214
|
+
const history = await client.history_instance({}, FHIRVersion, resourceType, id, query);
|
|
215
|
+
logger.info(history);
|
|
216
|
+
});
|
|
217
|
+
dataCommand.command(command
|
|
218
|
+
.command("invoke_system")
|
|
219
|
+
.argument("<fhirVersion>", "FHIR Version")
|
|
220
|
+
.argument("<code>", "code")
|
|
221
|
+
.action(async (userFHIRVersion, code, options) => {
|
|
222
|
+
const client = await createClient(CONFIG_LOCATION);
|
|
223
|
+
const FHIRVersion = conversion.asFHIRType(userFHIRVersion);
|
|
224
|
+
const parameters = dataCommand.readData(options);
|
|
225
|
+
if (!parameters) {
|
|
226
|
+
throw new Error("No Parameters provided");
|
|
227
|
+
}
|
|
228
|
+
if (!isParameters(parameters))
|
|
229
|
+
throw new Error("invalid Parameters.");
|
|
230
|
+
const output = await client.invoke_system(code, {}, FHIRVersion, parameters);
|
|
231
|
+
logger.info(output);
|
|
232
|
+
}));
|
|
233
|
+
dataCommand.command(command
|
|
234
|
+
.command("invoke_type")
|
|
235
|
+
.argument("<fhirVersion>", "FHIR Version")
|
|
236
|
+
.argument("<resourceType>", "Resource Type")
|
|
237
|
+
.argument("<code>", "code")
|
|
238
|
+
.action(async (userFHIRVersion, resourceType, code, options) => {
|
|
239
|
+
const client = await createClient(CONFIG_LOCATION);
|
|
240
|
+
const FHIRVersion = conversion.asFHIRType(userFHIRVersion);
|
|
241
|
+
const parameters = dataCommand.readData(options);
|
|
242
|
+
if (!parameters) {
|
|
243
|
+
throw new Error("No Parameters provided");
|
|
244
|
+
}
|
|
245
|
+
if (!isParameters(parameters))
|
|
246
|
+
throw new Error("invalid Parameters.");
|
|
247
|
+
if (!validateResourceType(FHIRVersion, resourceType))
|
|
248
|
+
throw new Error("Invalid resource type");
|
|
249
|
+
const output = await client.invoke_type(code, {}, FHIRVersion, resourceType, parameters);
|
|
250
|
+
logger.info(output);
|
|
251
|
+
}));
|
|
252
|
+
dataCommand.command(command
|
|
253
|
+
.command("invoke_instance")
|
|
254
|
+
.argument("<fhirVersion>", "FHIR Version")
|
|
255
|
+
.argument("<resourceType>", "Resource Type")
|
|
256
|
+
.argument("<id>", "Resource ID")
|
|
257
|
+
.argument("<code>", "code")
|
|
258
|
+
.action(async (userFHIRVersion, resourceType, id, code, options) => {
|
|
259
|
+
const client = await createClient(CONFIG_LOCATION);
|
|
260
|
+
const FHIRVersion = conversion.asFHIRType(userFHIRVersion);
|
|
261
|
+
const parameters = dataCommand.readData(options);
|
|
262
|
+
if (!parameters) {
|
|
263
|
+
throw new Error("No Parameters provided");
|
|
264
|
+
}
|
|
265
|
+
if (!isParameters(parameters))
|
|
266
|
+
throw new Error("invalid Parameters.");
|
|
267
|
+
if (!validateResourceType(FHIRVersion, resourceType))
|
|
268
|
+
throw new Error("Invalid resource type");
|
|
269
|
+
const output = await client.invoke_instance(code, {}, FHIRVersion, resourceType, id, parameters);
|
|
270
|
+
logger.info(output);
|
|
271
|
+
}));
|
|
272
|
+
}
|
|
273
|
+
//# sourceMappingURL=api.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/commands/api.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
import { mkdirSync, readFileSync, writeFileSync } from "fs";
|
|
2
|
+
import path from "path";
|
|
3
|
+
import { fileURLToPath } from "url";
|
|
4
|
+
import { generateIndexFile, loadArtifacts } from "@haste-health/artifacts";
|
|
5
|
+
import { generateMetaData } from "@haste-health/codegen/generate/meta-data";
|
|
6
|
+
import generateOps from "@haste-health/codegen/generate/operation-definition";
|
|
7
|
+
import { generateSets } from "@haste-health/codegen/generate/sets";
|
|
8
|
+
import { generateTypeToCanonicalMap } from "@haste-health/codegen/generate/type-to-canonical";
|
|
9
|
+
import { generateTypes } from "@haste-health/codegen/generate/typescript-types";
|
|
10
|
+
import { FHIR_VERSIONS_SUPPORTED, R4, } from "@haste-health/fhir-types/versions";
|
|
11
|
+
import { StructureDefinitionSnapshot } from "@haste-health/generated-ops/lib/r4/ops";
|
|
12
|
+
import { createClient } from "../client.js";
|
|
13
|
+
import { CONFIG_LOCATION } from "../config.js";
|
|
14
|
+
import logger from "../logger.js";
|
|
15
|
+
import { conversion, getAllFiles } from "../utilities.js";
|
|
16
|
+
export function codeGenerationCommands(command) {
|
|
17
|
+
command
|
|
18
|
+
.command("meta")
|
|
19
|
+
.description("Generate metadata")
|
|
20
|
+
.requiredOption("-o, --output <output>", "output file")
|
|
21
|
+
.option("-v, --version <version>", "FHIR Profiles to use", R4)
|
|
22
|
+
.action(async (options) => {
|
|
23
|
+
const structureDefinitions = loadArtifacts({
|
|
24
|
+
fhirVersion: options.version,
|
|
25
|
+
resourceType: "StructureDefinition",
|
|
26
|
+
currentDirectory: fileURLToPath(import.meta.url),
|
|
27
|
+
});
|
|
28
|
+
mkdirSync(path.join(options.output, ".."), { recursive: true });
|
|
29
|
+
const metadata = generateMetaData(structureDefinitions);
|
|
30
|
+
writeFileSync(options.output, "// Do not this code is generated \nexport default " +
|
|
31
|
+
JSON.stringify(metadata, null, 2));
|
|
32
|
+
});
|
|
33
|
+
command
|
|
34
|
+
.command("type-to-canonical")
|
|
35
|
+
.description("Generate type to canonical url for SD.")
|
|
36
|
+
.requiredOption("-o, --output <output>", "output file")
|
|
37
|
+
.option("-v, --version <version>", "FHIR Profiles to use", R4)
|
|
38
|
+
.action(async (options) => {
|
|
39
|
+
const structureDefinitions = loadArtifacts({
|
|
40
|
+
fhirVersion: options.version,
|
|
41
|
+
resourceType: "StructureDefinition",
|
|
42
|
+
currentDirectory: fileURLToPath(import.meta.url),
|
|
43
|
+
});
|
|
44
|
+
mkdirSync(path.join(options.output, ".."), { recursive: true });
|
|
45
|
+
const typeToCanonical = generateTypeToCanonicalMap(structureDefinitions);
|
|
46
|
+
writeFileSync(options.output, "// Do not this code is generated \nexport default " +
|
|
47
|
+
JSON.stringify(typeToCanonical, null, 2) +
|
|
48
|
+
" as Record<string, string>");
|
|
49
|
+
});
|
|
50
|
+
command
|
|
51
|
+
.command("types-artifacts")
|
|
52
|
+
.description("Generates typescript types off profiles")
|
|
53
|
+
.option("-o, --output <output>", "output file")
|
|
54
|
+
.option("-v, --version <version>", "FHIR Profiles to use", R4)
|
|
55
|
+
.action((options) => {
|
|
56
|
+
if (FHIR_VERSIONS_SUPPORTED.indexOf(options.version) === -1) {
|
|
57
|
+
throw new Error(`${options.version} is not supported must be oneof ${JSON.stringify(FHIR_VERSIONS_SUPPORTED)}`);
|
|
58
|
+
}
|
|
59
|
+
const structureDefinitions = loadArtifacts({
|
|
60
|
+
fhirVersion: options.version,
|
|
61
|
+
resourceType: "StructureDefinition",
|
|
62
|
+
currentDirectory: fileURLToPath(import.meta.url),
|
|
63
|
+
});
|
|
64
|
+
mkdirSync(options.output, { recursive: true });
|
|
65
|
+
const generatedTypes = generateTypes(options.version, structureDefinitions);
|
|
66
|
+
const generatedSets = generateSets(options.version, structureDefinitions);
|
|
67
|
+
writeFileSync(path.join(options.output, "types.ts"), generatedTypes);
|
|
68
|
+
writeFileSync(path.join(options.output, "sets.ts"), generatedSets);
|
|
69
|
+
});
|
|
70
|
+
command
|
|
71
|
+
.command("operations")
|
|
72
|
+
.description("Generate Operation types and classes")
|
|
73
|
+
.option("-o, --output <output>", "output file")
|
|
74
|
+
.option("-v, --version <version>", "FHIR Profiles to use", R4)
|
|
75
|
+
.action(async (options) => {
|
|
76
|
+
if (options.version !== R4) {
|
|
77
|
+
throw new Error("Currently only support r4");
|
|
78
|
+
}
|
|
79
|
+
const operationDefinitions = loadArtifacts({
|
|
80
|
+
fhirVersion: options.version,
|
|
81
|
+
resourceType: "OperationDefinition",
|
|
82
|
+
currentDirectory: fileURLToPath(import.meta.url),
|
|
83
|
+
});
|
|
84
|
+
mkdirSync(options.output, { recursive: true });
|
|
85
|
+
const generatedOpCode = await generateOps(options.version, operationDefinitions);
|
|
86
|
+
writeFileSync(path.join(options.output, "ops.ts"), generatedOpCode);
|
|
87
|
+
});
|
|
88
|
+
command
|
|
89
|
+
.command("index-file")
|
|
90
|
+
.description("Generate a FHIR npm package index file ")
|
|
91
|
+
.option("-p, --packagedir <packagedir>", "")
|
|
92
|
+
.option("-r, --resources <resources>", "")
|
|
93
|
+
.option("-i, --ignore [ignore...]", "")
|
|
94
|
+
.option("-e, --extension <extension>", "")
|
|
95
|
+
.action((options) => {
|
|
96
|
+
const indexFile = generateIndexFile({
|
|
97
|
+
root: options.packagedir,
|
|
98
|
+
artifactLocations: [options.resources],
|
|
99
|
+
ignore: options.ignore,
|
|
100
|
+
extension: options.extension,
|
|
101
|
+
});
|
|
102
|
+
logger.info("generating index file");
|
|
103
|
+
const indexLoc = path.join(options.packagedir, ".index.json");
|
|
104
|
+
writeFileSync(indexLoc, JSON.stringify(indexFile, null, 2));
|
|
105
|
+
logger.info(`index generated and saved at '${indexLoc}'`);
|
|
106
|
+
});
|
|
107
|
+
command
|
|
108
|
+
.command("snapshot")
|
|
109
|
+
.argument("<fhirVersion>", "FHIR Version")
|
|
110
|
+
.description("Generate a snapshot of a StructureDefinition")
|
|
111
|
+
.option("-d, --directory <directory>", "Directory with artifacts to minimize.")
|
|
112
|
+
.action(async (userFHIRVersion, options) => {
|
|
113
|
+
const FHIRVersion = conversion.asFHIRType(userFHIRVersion);
|
|
114
|
+
const profileLocs = getAllFiles(options.directory).filter((f) => !f.endsWith("min.json") && f.endsWith(".json"));
|
|
115
|
+
for (const profileLoc of profileLocs) {
|
|
116
|
+
const fileContents = readFileSync(profileLoc);
|
|
117
|
+
const profile = JSON.parse(fileContents.toString("utf8"));
|
|
118
|
+
if (typeof profile === "object" &&
|
|
119
|
+
profile.resourceType === "StructureDefinition") {
|
|
120
|
+
const client = await createClient(CONFIG_LOCATION);
|
|
121
|
+
if (!profile ||
|
|
122
|
+
typeof profile !== "object" ||
|
|
123
|
+
profile?.resourceType !==
|
|
124
|
+
"StructureDefinition") {
|
|
125
|
+
throw new Error("No StructureDefinition to generate snapshot.");
|
|
126
|
+
}
|
|
127
|
+
const sd = await client.invoke_type(StructureDefinitionSnapshot.Op, {}, FHIRVersion, "StructureDefinition", {
|
|
128
|
+
definition: profile,
|
|
129
|
+
});
|
|
130
|
+
writeFileSync(profileLoc, JSON.stringify(sd, null, 2));
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
//# sourceMappingURL=generation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generation.js","sourceRoot":"","sources":["../../src/commands/generation.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
import { getAllFiles } from "../utilities.js";
|
|
3
|
+
function minimizeResource(resource) {
|
|
4
|
+
switch (resource.resourceType) {
|
|
5
|
+
case "StructureDefinition": {
|
|
6
|
+
const minimizedSd = {
|
|
7
|
+
id: resource.id,
|
|
8
|
+
resourceType: resource.resourceType,
|
|
9
|
+
name: resource.name,
|
|
10
|
+
title: resource.title,
|
|
11
|
+
abstract: resource.abstract,
|
|
12
|
+
url: resource.url,
|
|
13
|
+
version: resource.version,
|
|
14
|
+
context: resource.context,
|
|
15
|
+
type: resource.type,
|
|
16
|
+
baseDefinition: resource.baseDefinition,
|
|
17
|
+
kind: resource.kind,
|
|
18
|
+
derivation: resource.derivation,
|
|
19
|
+
status: resource.status,
|
|
20
|
+
snapshot: {
|
|
21
|
+
element: resource.snapshot?.element?.map((element) => {
|
|
22
|
+
delete element["mapping"];
|
|
23
|
+
return element;
|
|
24
|
+
}) ?? [],
|
|
25
|
+
},
|
|
26
|
+
};
|
|
27
|
+
return minimizedSd;
|
|
28
|
+
}
|
|
29
|
+
case "ValueSet":
|
|
30
|
+
case "CodeSystem":
|
|
31
|
+
case "OperationDefinition":
|
|
32
|
+
default: {
|
|
33
|
+
return resource;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Minimize artifacts Namely StructureDefinition, OperationDefinition, ValueSet, CodeSystem
|
|
39
|
+
*/
|
|
40
|
+
export function minimizeCommands(command) {
|
|
41
|
+
command
|
|
42
|
+
.command("artifacts")
|
|
43
|
+
.description("Minimize Artifacts (Will output as [filename].min.json)")
|
|
44
|
+
.option("-d, --directory <output>", "Directory with artifacts to minimize.")
|
|
45
|
+
.action((options) => {
|
|
46
|
+
const directory = options.directory;
|
|
47
|
+
const files = getAllFiles(directory).filter((f) => !f.endsWith("min.json") && f.endsWith(".json"));
|
|
48
|
+
for (const file of files) {
|
|
49
|
+
const fileContents = fs.readFileSync(file);
|
|
50
|
+
const json = JSON.parse(fileContents.toString("utf8"));
|
|
51
|
+
if (json.resourceType === "Bundle") {
|
|
52
|
+
const bundle = json;
|
|
53
|
+
fs.writeFileSync(file.replace(".json", ".min.json"), JSON.stringify({
|
|
54
|
+
...bundle,
|
|
55
|
+
entry: bundle.entry?.map((e) => {
|
|
56
|
+
if (e.resource) {
|
|
57
|
+
e.resource = minimizeResource(e.resource);
|
|
58
|
+
}
|
|
59
|
+
return e;
|
|
60
|
+
}),
|
|
61
|
+
}));
|
|
62
|
+
}
|
|
63
|
+
else if (json.resourceType) {
|
|
64
|
+
fs.writeFileSync(file.replace(".json", ".min.json"), JSON.stringify(minimizeResource(json)));
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=minimize.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"minimize.js","sourceRoot":"","sources":["../../src/commands/minimize.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import * as ts from "@haste-health/testscript-runner";
|
|
4
|
+
import { createClient } from "../client.js";
|
|
5
|
+
import { CONFIG_LOCATION } from "../config.js";
|
|
6
|
+
import logger from "../logger.js";
|
|
7
|
+
function getAllFiles(location) {
|
|
8
|
+
if (fs.lstatSync(location).isFile()) {
|
|
9
|
+
return [location];
|
|
10
|
+
}
|
|
11
|
+
const files = [];
|
|
12
|
+
const filesInDirectory = fs.readdirSync(location);
|
|
13
|
+
for (const file of filesInDirectory) {
|
|
14
|
+
const absolute = path.join(location, file);
|
|
15
|
+
if (fs.statSync(absolute).isDirectory()) {
|
|
16
|
+
files.push(...getAllFiles(absolute));
|
|
17
|
+
}
|
|
18
|
+
else {
|
|
19
|
+
files.push(absolute);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
return files;
|
|
23
|
+
}
|
|
24
|
+
async function executeTestScript(fhirVersion, testScript, timeout = 0) {
|
|
25
|
+
const client = await createClient(CONFIG_LOCATION);
|
|
26
|
+
const report = await ts.run(logger, client, fhirVersion, testScript, timeout);
|
|
27
|
+
return report;
|
|
28
|
+
}
|
|
29
|
+
export function testscriptCommands(command) {
|
|
30
|
+
command
|
|
31
|
+
.command("run")
|
|
32
|
+
.description("Run testscript files against server.")
|
|
33
|
+
.requiredOption("-i, --input <input>")
|
|
34
|
+
.option("-o --output <output>", "Where to output files")
|
|
35
|
+
.option("-e, --extension <extension>", "Extensions to search for tests", ".testscript.json")
|
|
36
|
+
.option("-t, --timeout <timeout>", "wait time between operations", ".testscript.json")
|
|
37
|
+
.option("--fhir-version <fhirVersion>", "FHIR Version to use", "4.0")
|
|
38
|
+
.action(async (options) => {
|
|
39
|
+
let exitCode = 0;
|
|
40
|
+
const files = getAllFiles(options.input)
|
|
41
|
+
.flat()
|
|
42
|
+
.filter((f) => f.endsWith(options.extension))
|
|
43
|
+
.sort((a, b) => a.localeCompare(b));
|
|
44
|
+
const output = {
|
|
45
|
+
resourceType: "Bundle",
|
|
46
|
+
type: "collection",
|
|
47
|
+
entry: [],
|
|
48
|
+
};
|
|
49
|
+
for (const file of files) {
|
|
50
|
+
const fileContents = fs.readFileSync(file);
|
|
51
|
+
const json = JSON.parse(fileContents.toString("utf8"));
|
|
52
|
+
if (json.resourceType === "Bundle") {
|
|
53
|
+
const bundle = json;
|
|
54
|
+
const testscripts = bundle.entry
|
|
55
|
+
?.map((e) => e.resource)
|
|
56
|
+
.filter((r) => r?.resourceType === "TestScript") ?? [];
|
|
57
|
+
for (const testScript of testscripts) {
|
|
58
|
+
output.entry?.push({ resource: testScript });
|
|
59
|
+
const report = await executeTestScript(options.fhirVersion, testScript, parseInt(options.timeout ?? "0"));
|
|
60
|
+
output.entry?.push({ resource: report });
|
|
61
|
+
if (report.result === "fail") {
|
|
62
|
+
exitCode = 1;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
else if (json.resourceType === "TestScript") {
|
|
67
|
+
const testScript = json;
|
|
68
|
+
output.entry?.push({ resource: testScript });
|
|
69
|
+
const report = await executeTestScript(options.fhirVersion, testScript, parseInt(options.timeout ?? "0"));
|
|
70
|
+
output.entry?.push({ resource: report });
|
|
71
|
+
if (report.result === "fail") {
|
|
72
|
+
exitCode = 1;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
if (options.output) {
|
|
77
|
+
fs.writeFileSync(options.output, JSON.stringify(output, null, 2));
|
|
78
|
+
}
|
|
79
|
+
process.exit(exitCode);
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=testscript.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"testscript.js","sourceRoot":"","sources":["../../src/commands/testscript.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { R4, R4B, } from "@haste-health/fhir-types/versions";
|
|
2
|
+
import { createClient } from "../client.js";
|
|
3
|
+
import { CONFIG_LOCATION } from "../config.js";
|
|
4
|
+
import logger from "../logger.js";
|
|
5
|
+
import { conversion, dataCommand } from "../utilities.js";
|
|
6
|
+
export function validate(command) {
|
|
7
|
+
dataCommand.command(command
|
|
8
|
+
.command("validate")
|
|
9
|
+
.argument("<fhirVersion>", "FHIR Version")
|
|
10
|
+
.action(async (userFHIRVersion, options) => {
|
|
11
|
+
const resource = dataCommand.readData(options);
|
|
12
|
+
const FHIRVersion = conversion.asFHIRType(userFHIRVersion);
|
|
13
|
+
const client = await createClient(CONFIG_LOCATION);
|
|
14
|
+
switch (FHIRVersion) {
|
|
15
|
+
case R4: {
|
|
16
|
+
const result = await client.invoke_type("validate", {}, FHIRVersion, resource.resourceType, {
|
|
17
|
+
resourceType: "Parameters",
|
|
18
|
+
parameter: [{ name: "resource", resource }],
|
|
19
|
+
});
|
|
20
|
+
logger.warn(result);
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
case R4B:
|
|
24
|
+
default: {
|
|
25
|
+
throw new Error("Unsupported FHIR Version");
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}));
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=validate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/commands/validate.ts"],"names":[],"mappings":"AAGA,OAAO,EAEL,EAAE,EACF,GAAG,GAEJ,MAAM,mCAAmC,CAAC;AAE3C,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,MAAM,MAAM,cAAc,CAAC;AAClC,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAE1D,MAAM,UAAU,QAAQ,CAAC,OAAgB;IACvC,WAAW,CAAC,OAAO,CACjB,OAAO;SACJ,OAAO,CAAC,UAAU,CAAC;SACnB,QAAQ,CAAC,eAAe,EAAE,cAAc,CAAC;SACzC,MAAM,CAAC,KAAK,EAAE,eAAe,EAAE,OAAO,EAAE,EAAE;QACzC,MAAM,QAAQ,GAAG,WAAW,CAAC,QAAQ,CAAC,OAAO,CAG5C,CAAC;QACF,MAAM,WAAW,GAAG,UAAU,CAAC,UAAU,CAAC,eAAe,CAAC,CAAC;QAC3D,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,eAAe,CAAC,CAAC;QAEnD,QAAQ,WAAW,EAAE,CAAC;YACpB,KAAK,EAAE,CAAC,CAAC,CAAC;gBACR,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,WAAW,CACrC,UAAkB,EAClB,EAAE,EACF,WAAW,EACX,QAAQ,CAAC,YAAY,EACrB;oBACE,YAAY,EAAE,YAAY;oBAC1B,SAAS,EAAE,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC;iBAC5C,CACF,CAAC;gBAEF,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBACpB,OAAO;YACT,CAAC;YACD,KAAK,GAAG,CAAC;YACT,OAAO,CAAC,CAAC,CAAC;gBACR,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;YAC9C,CAAC;QACH,CAAC;IACH,CAAC,CAAC,CACL,CAAC;AACJ,CAAC"}
|
package/lib/config.d.ts
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { JsonMap } from "@iarna/toml";
|
|
2
|
+
import { Command } from "commander";
|
|
3
|
+
export declare const CONFIG_LOCATION: string;
|
|
4
|
+
export interface Tenant extends JsonMap {
|
|
5
|
+
name: string;
|
|
6
|
+
r4_url: string;
|
|
7
|
+
r4b_url: string;
|
|
8
|
+
oidc_discovery_uri: string;
|
|
9
|
+
auth: {
|
|
10
|
+
type: "public" | "client_credentials";
|
|
11
|
+
client_id?: string;
|
|
12
|
+
client_secret?: string;
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
export interface Config extends JsonMap {
|
|
16
|
+
lastUpdated: string;
|
|
17
|
+
defaultTenant: Tenant["name"];
|
|
18
|
+
tenants: Tenant[];
|
|
19
|
+
}
|
|
20
|
+
export declare function loadConfig(location: string): Config;
|
|
21
|
+
export declare function saveConfig(location: string, config: Config): void;
|
|
22
|
+
export declare function getCurrentTenant(location: string, config: Config): Tenant | undefined;
|
|
23
|
+
export declare function configurationCommands(command: Command): void;
|
package/lib/config.js
ADDED
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
import toml from "@iarna/toml";
|
|
2
|
+
import * as inquirer from "@inquirer/prompts";
|
|
3
|
+
import fs from "node:fs";
|
|
4
|
+
import { homedir } from "node:os";
|
|
5
|
+
import path from "node:path";
|
|
6
|
+
import logger from "./logger.js";
|
|
7
|
+
export const CONFIG_LOCATION = path.join(homedir(), ".haste-health/config.toml");
|
|
8
|
+
function initializeConfig(location) {
|
|
9
|
+
logger.info("Initializing configuration file");
|
|
10
|
+
const initialConfig = {
|
|
11
|
+
defaultTenant: "",
|
|
12
|
+
lastUpdated: new Date().toISOString(),
|
|
13
|
+
tenants: [],
|
|
14
|
+
};
|
|
15
|
+
saveConfig(location, initialConfig);
|
|
16
|
+
return initialConfig;
|
|
17
|
+
}
|
|
18
|
+
export function loadConfig(location) {
|
|
19
|
+
let config;
|
|
20
|
+
try {
|
|
21
|
+
const configuration = fs.readFileSync(location, "utf8");
|
|
22
|
+
config = toml.parse(configuration);
|
|
23
|
+
}
|
|
24
|
+
catch (e) {
|
|
25
|
+
config = initializeConfig(location);
|
|
26
|
+
}
|
|
27
|
+
return config;
|
|
28
|
+
}
|
|
29
|
+
export function saveConfig(location, config) {
|
|
30
|
+
if (!fs.existsSync(path.join(location, "../"))) {
|
|
31
|
+
fs.mkdirSync(path.join(location, "../"), { recursive: true });
|
|
32
|
+
}
|
|
33
|
+
fs.writeFileSync(location, toml.stringify(config), "utf8");
|
|
34
|
+
}
|
|
35
|
+
export function getCurrentTenant(location, config) {
|
|
36
|
+
if (!config.defaultTenant) {
|
|
37
|
+
config = {
|
|
38
|
+
...config,
|
|
39
|
+
defaultTenant: config.tenants[0]?.name,
|
|
40
|
+
};
|
|
41
|
+
saveConfig(location, config);
|
|
42
|
+
}
|
|
43
|
+
return config.tenants.find((tenant) => tenant.name === config.defaultTenant);
|
|
44
|
+
}
|
|
45
|
+
export function configurationCommands(command) {
|
|
46
|
+
command
|
|
47
|
+
.command("switch-tenant")
|
|
48
|
+
.description("Switch tenant to use to add a tenant use add-tenant")
|
|
49
|
+
.option("-t, --tenant <tenant>", "Tenant name")
|
|
50
|
+
.action(async (options) => {
|
|
51
|
+
const config = loadConfig(CONFIG_LOCATION);
|
|
52
|
+
if (options.tenant) {
|
|
53
|
+
const tenant = config.tenants.find((t) => t.name === options.tenant);
|
|
54
|
+
if (!tenant)
|
|
55
|
+
throw new Error("No tenant found with that name");
|
|
56
|
+
saveConfig(CONFIG_LOCATION, { ...config, defaultTenant: tenant.name });
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
const defaultTenant = await inquirer.select({
|
|
60
|
+
message: "Switch tenant to use",
|
|
61
|
+
choices: config.tenants.map((t) => ({
|
|
62
|
+
name: t.name,
|
|
63
|
+
value: t.name,
|
|
64
|
+
})),
|
|
65
|
+
});
|
|
66
|
+
saveConfig(CONFIG_LOCATION, { ...config, defaultTenant });
|
|
67
|
+
}
|
|
68
|
+
});
|
|
69
|
+
command
|
|
70
|
+
.command("delete-tenant")
|
|
71
|
+
.description("Delete a tenant")
|
|
72
|
+
.requiredOption("-t, --tenant <tenant>", "Tenant name")
|
|
73
|
+
.action(async (options) => {
|
|
74
|
+
const config = loadConfig(CONFIG_LOCATION);
|
|
75
|
+
const tenants = config.tenants.filter((t) => t.name !== options.tenant);
|
|
76
|
+
saveConfig(CONFIG_LOCATION, {
|
|
77
|
+
...config,
|
|
78
|
+
defaultTenant: options.tenant === config.defaultTenant ? "" : config.defaultTenant,
|
|
79
|
+
tenants,
|
|
80
|
+
});
|
|
81
|
+
});
|
|
82
|
+
command
|
|
83
|
+
.command("show-tenant")
|
|
84
|
+
.description("Display the current tenant.")
|
|
85
|
+
.action(async () => {
|
|
86
|
+
const config = loadConfig(CONFIG_LOCATION);
|
|
87
|
+
const currentTenant = getCurrentTenant(CONFIG_LOCATION, config);
|
|
88
|
+
if (currentTenant) {
|
|
89
|
+
logger.info(currentTenant);
|
|
90
|
+
}
|
|
91
|
+
else {
|
|
92
|
+
logger.warn("No tenant configured");
|
|
93
|
+
}
|
|
94
|
+
});
|
|
95
|
+
command
|
|
96
|
+
.command("add-tenant")
|
|
97
|
+
.description("Add a tenant to the configuration file")
|
|
98
|
+
.option("-r4, --r4-url <r4Url>", "r4 URL")
|
|
99
|
+
.option("-r4b, --r4b-url <r4bUrl>", "r4b URL")
|
|
100
|
+
.option("-i, --oidc <oidcDiscovery>", "Enter the OIDC discovery URL")
|
|
101
|
+
.option("-a, --auth <authMethod>", "Enter auth method")
|
|
102
|
+
.option("-n, --name <name>", "Tenant name")
|
|
103
|
+
.option("--client-id <clientId>", "Client id")
|
|
104
|
+
.option("--client-secret <clientSecret>", "Client secret")
|
|
105
|
+
.action(async (options) => {
|
|
106
|
+
const config = loadConfig(CONFIG_LOCATION);
|
|
107
|
+
const name = options.name
|
|
108
|
+
? options.name
|
|
109
|
+
: await inquirer.input({
|
|
110
|
+
message: "Enter tenant name:",
|
|
111
|
+
validate: async (value) => {
|
|
112
|
+
const existingTenant = config.tenants.find((t) => t.name === value);
|
|
113
|
+
return existingTenant !== undefined
|
|
114
|
+
? `Tenant with name '${value}' already exists. Must be unique.`
|
|
115
|
+
: true;
|
|
116
|
+
},
|
|
117
|
+
});
|
|
118
|
+
const r4Url = options.r4Url
|
|
119
|
+
? options.r4Url
|
|
120
|
+
: await inquirer.input({
|
|
121
|
+
message: "Enter the R4 URL",
|
|
122
|
+
});
|
|
123
|
+
const r4bUrl = options.r4bUrl
|
|
124
|
+
? options.r4bUrl
|
|
125
|
+
: await inquirer.input({
|
|
126
|
+
message: "Enter an R4B URL. ",
|
|
127
|
+
});
|
|
128
|
+
const authMethod = options.auth
|
|
129
|
+
? options.auth
|
|
130
|
+
: await inquirer.select({
|
|
131
|
+
message: "Select an auth method",
|
|
132
|
+
choices: [
|
|
133
|
+
{ name: "public", value: "public" },
|
|
134
|
+
{ name: "client_credentials", value: "client_credentials" },
|
|
135
|
+
],
|
|
136
|
+
});
|
|
137
|
+
let oidcDiscovery = "";
|
|
138
|
+
let client_id = "";
|
|
139
|
+
let client_secret = "";
|
|
140
|
+
if (authMethod === "client_credentials") {
|
|
141
|
+
oidcDiscovery = options.oidc
|
|
142
|
+
? options.oidc
|
|
143
|
+
: await inquirer.input({
|
|
144
|
+
message: "Enter the url for discovery. ",
|
|
145
|
+
});
|
|
146
|
+
client_id = options.clientId
|
|
147
|
+
? options.clientId
|
|
148
|
+
: await inquirer.input({
|
|
149
|
+
message: "Enter client id:",
|
|
150
|
+
});
|
|
151
|
+
client_secret = options.clientSecret
|
|
152
|
+
? options.clientSecret
|
|
153
|
+
: await inquirer.password({
|
|
154
|
+
message: "Enter client secret:",
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
config.tenants.push({
|
|
158
|
+
r4_url: r4Url,
|
|
159
|
+
r4b_url: r4bUrl,
|
|
160
|
+
oidc_discovery_uri: oidcDiscovery,
|
|
161
|
+
name,
|
|
162
|
+
auth: {
|
|
163
|
+
type: authMethod,
|
|
164
|
+
client_id,
|
|
165
|
+
client_secret,
|
|
166
|
+
},
|
|
167
|
+
});
|
|
168
|
+
saveConfig(CONFIG_LOCATION, config);
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
import { Command } from "commander";
|
|
4
|
+
import { apiCommands } from "./commands/api.js";
|
|
5
|
+
import { codeGenerationCommands } from "./commands/generation.js";
|
|
6
|
+
import { minimizeCommands } from "./commands/minimize.js";
|
|
7
|
+
import { testscriptCommands } from "./commands/testscript.js";
|
|
8
|
+
import { validate } from "./commands/validate.js";
|
|
9
|
+
import { configurationCommands } from "./config.js";
|
|
10
|
+
const program = new Command();
|
|
11
|
+
program.name("HasteHealth CLI Tool").description("HasteHealth CLI interface.");
|
|
12
|
+
configurationCommands(program.command("config"));
|
|
13
|
+
codeGenerationCommands(program.command("generate"));
|
|
14
|
+
apiCommands(program.command("api"));
|
|
15
|
+
validate(program);
|
|
16
|
+
minimizeCommands(program.command("minimize"));
|
|
17
|
+
testscriptCommands(program.command("test"));
|
|
18
|
+
program.parse();
|
|
19
|
+
//# sourceMappingURL=hastehealth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hastehealth.js","sourceRoot":"","sources":["../src/hastehealth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAClD,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAEpD,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC,WAAW,CAAC,4BAA4B,CAAC,CAAC;AAE/E,qBAAqB,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;AACjD,sBAAsB,CAAC,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;AACpD,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;AACpC,QAAQ,CAAC,OAAO,CAAC,CAAC;AAClB,gBAAgB,CAAC,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;AAC9C,kBAAkB,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;AAE5C,OAAO,CAAC,KAAK,EAAE,CAAC"}
|
package/lib/logger.d.ts
ADDED
package/lib/logger.js
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { pino } from "pino";
|
|
2
|
+
import pretty from "pino-pretty";
|
|
3
|
+
const prettyStream = pretty({
|
|
4
|
+
levelFirst: true,
|
|
5
|
+
colorize: true,
|
|
6
|
+
});
|
|
7
|
+
const logger = pino({}, process.env.NODE_ENV !== "production" ? prettyStream : undefined);
|
|
8
|
+
export default logger;
|
|
9
|
+
//# sourceMappingURL=logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,MAAM,MAAM,aAAa,CAAC;AAEjC,MAAM,YAAY,GAAG,MAAM,CAAC;IAC1B,UAAU,EAAE,IAAI;IAChB,QAAQ,EAAE,IAAI;CACf,CAAC,CAAC;AAEH,MAAM,MAAM,GAAG,IAAI,CACjB,EAAE,EACF,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,YAAY,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS,CACjE,CAAC;AAEF,eAAe,MAAM,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
import { Command } from "commander";
|
|
4
|
+
import { apiCommands } from "./commands/api.js";
|
|
5
|
+
import { codeGenerationCommands } from "./commands/generation.js";
|
|
6
|
+
import { minimizeCommands } from "./commands/minimize.js";
|
|
7
|
+
import { testscriptCommands } from "./commands/testscript.js";
|
|
8
|
+
import { validate } from "./commands/validate.js";
|
|
9
|
+
import { configurationCommands } from "./config.js";
|
|
10
|
+
const program = new Command();
|
|
11
|
+
program
|
|
12
|
+
.name("OxidizedHealth CLI Tool")
|
|
13
|
+
.description("OxidizedHealth CLI interface.");
|
|
14
|
+
configurationCommands(program.command("config"));
|
|
15
|
+
codeGenerationCommands(program.command("generate"));
|
|
16
|
+
apiCommands(program.command("api"));
|
|
17
|
+
validate(program);
|
|
18
|
+
minimizeCommands(program.command("minimize"));
|
|
19
|
+
testscriptCommands(program.command("test"));
|
|
20
|
+
program.parse();
|
|
21
|
+
//# sourceMappingURL=oxidizedhealth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oxidizedhealth.js","sourceRoot":"","sources":["../src/oxidizedhealth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAClD,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAEpD,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,yBAAyB,CAAC;KAC/B,WAAW,CAAC,+BAA+B,CAAC,CAAC;AAEhD,qBAAqB,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;AACjD,sBAAsB,CAAC,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;AACpD,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;AACpC,QAAQ,CAAC,OAAO,CAAC,CAAC;AAClB,gBAAgB,CAAC,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;AAC9C,kBAAkB,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;AAE5C,OAAO,CAAC,KAAK,EAAE,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { Command } from "commander";
|
|
2
|
+
import { FHIR_VERSION } from "@haste-health/fhir-types/versions";
|
|
3
|
+
type MutationOptions = {
|
|
4
|
+
file?: string;
|
|
5
|
+
data?: string;
|
|
6
|
+
};
|
|
7
|
+
export declare namespace conversion {
|
|
8
|
+
function asFHIRType(fhirType: string): FHIR_VERSION;
|
|
9
|
+
}
|
|
10
|
+
export declare function getAllFiles(directory: string): string[];
|
|
11
|
+
export declare namespace dataCommand {
|
|
12
|
+
function readData(option: MutationOptions): unknown;
|
|
13
|
+
function command(command: Command): Command;
|
|
14
|
+
}
|
|
15
|
+
export {};
|
package/lib/utilities.js
ADDED
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { R4, R4B } from "@haste-health/fhir-types/versions";
|
|
4
|
+
export var conversion;
|
|
5
|
+
(function (conversion) {
|
|
6
|
+
function asFHIRType(fhirType) {
|
|
7
|
+
switch (fhirType) {
|
|
8
|
+
case "r4":
|
|
9
|
+
case R4: {
|
|
10
|
+
return R4;
|
|
11
|
+
}
|
|
12
|
+
case "r4b":
|
|
13
|
+
case R4B: {
|
|
14
|
+
return R4B;
|
|
15
|
+
}
|
|
16
|
+
default: {
|
|
17
|
+
throw new Error("invalid FHIR version must be 'r4' or 'r4b' or '4.3' or '4.0'");
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
conversion.asFHIRType = asFHIRType;
|
|
22
|
+
})(conversion || (conversion = {}));
|
|
23
|
+
export function getAllFiles(directory) {
|
|
24
|
+
const files = [];
|
|
25
|
+
const filesInDirectory = fs.readdirSync(directory);
|
|
26
|
+
for (const file of filesInDirectory) {
|
|
27
|
+
const absolute = path.join(directory, file);
|
|
28
|
+
if (fs.statSync(absolute).isDirectory()) {
|
|
29
|
+
files.push(...getAllFiles(absolute));
|
|
30
|
+
}
|
|
31
|
+
else {
|
|
32
|
+
files.push(absolute);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
return files;
|
|
36
|
+
}
|
|
37
|
+
export var dataCommand;
|
|
38
|
+
(function (dataCommand) {
|
|
39
|
+
function readData(option) {
|
|
40
|
+
if (option.file) {
|
|
41
|
+
return JSON.parse(fs.readFileSync(option.file, "utf-8"));
|
|
42
|
+
}
|
|
43
|
+
if (option.data) {
|
|
44
|
+
return JSON.parse(option.data);
|
|
45
|
+
}
|
|
46
|
+
throw new Error("No resource provided");
|
|
47
|
+
}
|
|
48
|
+
dataCommand.readData = readData;
|
|
49
|
+
function command(command) {
|
|
50
|
+
command
|
|
51
|
+
.option("-f, --file <file>", "File for resource")
|
|
52
|
+
.option("-d, --data <data>", "Data for resource");
|
|
53
|
+
return command;
|
|
54
|
+
}
|
|
55
|
+
dataCommand.command = command;
|
|
56
|
+
})(dataCommand || (dataCommand = {}));
|
|
57
|
+
//# sourceMappingURL=utilities.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utilities.js","sourceRoot":"","sources":["../src/utilities.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAgB,EAAE,EAAE,GAAG,EAAE,MAAM,mCAAmC,CAAC;AAI1E,MAAM,KAAW,UAAU,CAkB1B;AAlBD,WAAiB,UAAU;IACzB,SAAgB,UAAU,CAAC,QAAgB;QACzC,QAAQ,QAAQ,EAAE,CAAC;YACjB,KAAK,IAAI,CAAC;YACV,KAAK,EAAE,CAAC,CAAC,CAAC;gBACR,OAAO,EAAE,CAAC;YACZ,CAAC;YACD,KAAK,KAAK,CAAC;YACX,KAAK,GAAG,CAAC,CAAC,CAAC;gBACT,OAAO,GAAG,CAAC;YACb,CAAC;YACD,OAAO,CAAC,CAAC,CAAC;gBACR,MAAM,IAAI,KAAK,CACb,8DAA8D,CAC/D,CAAC;YACJ,CAAC;QACH,CAAC;IACH,CAAC;IAhBe,qBAAU,aAgBzB,CAAA;AACH,CAAC,EAlBgB,UAAU,KAAV,UAAU,QAkB1B;AAED,MAAM,UAAU,WAAW,CAAC,SAAiB;IAC3C,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,MAAM,gBAAgB,GAAG,EAAE,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;IACnD,KAAK,MAAM,IAAI,IAAI,gBAAgB,EAAE,CAAC;QACpC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;QAC5C,IAAI,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC;YACxC,KAAK,CAAC,IAAI,CAAC,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC;QACvC,CAAC;aAAM,CAAC;YACN,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACvB,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,KAAW,WAAW,CAkB3B;AAlBD,WAAiB,WAAW;IAC1B,SAAgB,QAAQ,CAAC,MAAuB;QAC9C,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;YAChB,OAAO,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;QAC3D,CAAC;QAED,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;YAChB,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACjC,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC;IAC1C,CAAC;IATe,oBAAQ,WASvB,CAAA;IAED,SAAgB,OAAO,CAAC,OAAgB;QACtC,OAAO;aACJ,MAAM,CAAC,mBAAmB,EAAE,mBAAmB,CAAC;aAChD,MAAM,CAAC,mBAAmB,EAAE,mBAAmB,CAAC,CAAC;QACpD,OAAO,OAAO,CAAC;IACjB,CAAC;IALe,mBAAO,UAKtB,CAAA;AACH,CAAC,EAlBgB,WAAW,KAAX,WAAW,QAkB3B"}
|
package/package.json
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@haste-health/cli",
|
|
3
|
+
"version": "1.12.3",
|
|
4
|
+
"homepage": "https://haste.health",
|
|
5
|
+
"repository": {
|
|
6
|
+
"type": "git",
|
|
7
|
+
"url": "https://github.com/HasteHealth/HasteHealth.git"
|
|
8
|
+
},
|
|
9
|
+
"bin": {
|
|
10
|
+
"haste-health": "lib/hastehealth.js"
|
|
11
|
+
},
|
|
12
|
+
"types": "lib/haste-health.d.ts",
|
|
13
|
+
"target": "node",
|
|
14
|
+
"type": "module",
|
|
15
|
+
"dependencies": {
|
|
16
|
+
"@haste-health/artifacts": "workspace:^",
|
|
17
|
+
"@haste-health/client": "workspace:^",
|
|
18
|
+
"@haste-health/codegen": "workspace:^",
|
|
19
|
+
"@haste-health/generated-ops": "workspace:^",
|
|
20
|
+
"@haste-health/haste-health.fhir.r4.core": "workspace:^",
|
|
21
|
+
"@haste-health/hl7.fhir.r4.core": "workspace:^",
|
|
22
|
+
"@haste-health/hl7.fhir.r4b.core": "workspace:^",
|
|
23
|
+
"@haste-health/testscript-runner": "workspace:^",
|
|
24
|
+
"@iarna/toml": "^2.2.5",
|
|
25
|
+
"@inquirer/prompts": "^5.5.0",
|
|
26
|
+
"@types/node": "^22.15.17",
|
|
27
|
+
"commander": "^12.1.0",
|
|
28
|
+
"pino": "^9.6.0",
|
|
29
|
+
"pino-pretty": "^11.3.0"
|
|
30
|
+
},
|
|
31
|
+
"devDependencies": {
|
|
32
|
+
"@haste-health/fhir-types": "workspace:^",
|
|
33
|
+
"typescript": "5.9.2"
|
|
34
|
+
},
|
|
35
|
+
"scripts": {
|
|
36
|
+
"build": "tsc && node executable.js ./lib/hastehealth.js && chmod +x ./lib/hastehealth.js",
|
|
37
|
+
"publish": "pnpm build && pnpm npm publish --access public --tolerate-republish"
|
|
38
|
+
},
|
|
39
|
+
"files": [
|
|
40
|
+
"lib/**"
|
|
41
|
+
]
|
|
42
|
+
}
|