babelfhir-ts 1.0.14 → 1.0.16

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 (2) hide show
  1. package/out/main.js +49 -28
  2. package/package.json +2 -1
package/out/main.js CHANGED
@@ -12,7 +12,7 @@ function printUsage() {
12
12
  console.log("");
13
13
  console.log("Usage:");
14
14
  console.log(" babelfhir-ts [options] [<input> [output]]");
15
- console.log(" babelfhir-ts install [--package] <pkg@version> [--registry <url>] [options]");
15
+ console.log(" babelfhir-ts install [--package] <pkg@version|path> [--registry <url>] [options]");
16
16
  console.log("");
17
17
  console.log("Arguments:");
18
18
  console.log(" input Input can be:");
@@ -35,12 +35,13 @@ function printUsage() {
35
35
  console.log(" --registry <url> FHIR package registry URL (default: https://packages.simplifier.net)");
36
36
  console.log("");
37
37
  console.log("Examples:");
38
- console.log(" babelfhir-ts # Process ./input to ./output");
39
- console.log(" babelfhir-ts package.tgz # Process package to ./output");
38
+ console.log(" babelfhir-ts # Process ./input to ./output");
39
+ console.log(" babelfhir-ts package.tgz # Process package to current directory");
40
40
  console.log(" babelfhir-ts package.tgz modified-package.tgz # Embed interfaces in package");
41
41
  console.log(" babelfhir-ts profiles/ generated/ # Process directory to directory");
42
42
  console.log(" babelfhir-ts --package hl7.fhir.us.core@8.0.0 # Download and process from default registry");
43
43
  console.log(" babelfhir-ts install de.gematik.isik-basismodul@3.1.0 # Download, process, and npm install");
44
+ console.log(" babelfhir-ts install ./package.tgz # Install from local package file");
44
45
  console.log(" babelfhir-ts install hl7.fhir.us.core@8.0.0 --registry <url> # Install from custom registry");
45
46
  console.log(" babelfhir-ts install --package hl7.fhir.us.core@8.0.0 --registry <url> # Alternative syntax");
46
47
  }
@@ -203,57 +204,69 @@ async function run() {
203
204
  // Package can come from --package flag OR as positional argument after 'install'
204
205
  const packageToInstall = packageSpec || positionals[1];
205
206
  if (!packageToInstall) {
206
- console.error('Error: install command requires a package name');
207
+ console.error('Error: install command requires a package name or local .tgz/.zip file');
207
208
  console.error('Example: babelfhir-ts install de.gematik.isik-basismodul@3.1.0');
208
209
  console.error(' or: babelfhir-ts install --package hl7.fhir.us.core@8.0.0');
210
+ console.error(' or: babelfhir-ts install ./package.tgz');
209
211
  process.exit(1);
210
212
  }
213
+ // Force no-cache for install command
214
+ flags.noCache = true;
211
215
  try {
212
- // Download and process package
213
- const downloadedPath = await downloadPackage(packageToInstall, registry);
216
+ let downloadedPath;
217
+ // Check if packageToInstall is a local file path
218
+ if (fs.existsSync(packageToInstall) && (packageToInstall.endsWith('.tgz') || packageToInstall.endsWith('.zip'))) {
219
+ console.log(`Using local package: ${packageToInstall}`);
220
+ downloadedPath = path.resolve(packageToInstall);
221
+ }
222
+ else {
223
+ // Download from registry
224
+ downloadedPath = await downloadPackage(packageToInstall, registry);
225
+ }
214
226
  console.log(`Processing package...`);
215
227
  const baseName = path.basename(downloadedPath, path.extname(downloadedPath));
216
228
  const outputArchive = path.join(process.cwd(), `${baseName}.with-generated.tgz`);
217
229
  await generateIntoPackage(downloadedPath, outputArchive, flags);
218
- // Clean up temp directory
219
- const tempDir = path.join(process.cwd(), '.temp-download');
220
- if (fs.existsSync(tempDir)) {
221
- fs.rmSync(tempDir, { recursive: true, force: true });
230
+ // Clean up temp directory only if we downloaded from registry (not for local files)
231
+ if (!fs.existsSync(packageToInstall) || !(packageToInstall.endsWith('.tgz') || packageToInstall.endsWith('.zip'))) {
232
+ const tempDir = path.join(process.cwd(), '.temp-download');
233
+ if (fs.existsSync(tempDir)) {
234
+ fs.rmSync(tempDir, { recursive: true, force: true });
235
+ }
222
236
  }
223
237
  console.log(`✓ Package processed successfully: ${path.basename(outputArchive)}`);
224
238
  // Extract the archive to access generated folder
225
- console.log(`Extracting package for installation...`);
239
+ console.log(`Extracting generated code...`);
226
240
  const { extract } = await import('tar');
227
241
  const extractDir = path.join(process.cwd(), '.temp-install');
228
242
  if (!fs.existsSync(extractDir)) {
229
243
  fs.mkdirSync(extractDir, { recursive: true });
230
244
  }
231
245
  await extract({ cwd: extractDir, file: outputArchive });
232
- // Create a tarball from the generated folder
233
- const generatedDir = path.join(extractDir, 'generated');
246
+ // Look for generated folder - could be at root or under 'package' subfolder
247
+ let generatedDir = path.join(extractDir, 'generated');
248
+ if (!fs.existsSync(generatedDir)) {
249
+ generatedDir = path.join(extractDir, 'package', 'generated');
250
+ }
234
251
  if (!fs.existsSync(generatedDir)) {
235
252
  throw new Error('Generated folder not found in package archive');
236
253
  }
237
- console.log(`Creating package from generated folder...`);
238
- const { create } = await import('tar');
239
- const generatedTarball = path.join(process.cwd(), `${baseName}-generated.tgz`);
240
- await create({
241
- gzip: true,
242
- file: generatedTarball,
243
- cwd: generatedDir
244
- }, ['.']);
245
- // Install the generated tarball with npm
246
- await npmInstall(generatedTarball);
247
- // Clean up extraction directory and archives
254
+ // Verify package.json exists
255
+ const pkgJsonPath = path.join(generatedDir, 'package.json');
256
+ if (!fs.existsSync(pkgJsonPath)) {
257
+ throw new Error(`package.json not found in generated folder: ${generatedDir}`);
258
+ }
259
+ console.log(`Installing from: ${path.relative(process.cwd(), generatedDir)}`);
260
+ // Install directly from the generated folder
261
+ await npmInstall(generatedDir);
262
+ // Clean up temporary files
248
263
  console.log(`Cleaning up temporary files...`);
249
264
  if (fs.existsSync(extractDir)) {
250
265
  fs.rmSync(extractDir, { recursive: true, force: true });
251
266
  }
252
267
  if (fs.existsSync(outputArchive)) {
253
268
  fs.unlinkSync(outputArchive);
254
- }
255
- if (fs.existsSync(generatedTarball)) {
256
- fs.unlinkSync(generatedTarball);
269
+ console.log(`✓ Removed ${path.basename(outputArchive)}`);
257
270
  }
258
271
  if (flags.noCache) {
259
272
  cleanupCache();
@@ -262,7 +275,7 @@ async function run() {
262
275
  return;
263
276
  }
264
277
  catch (error) {
265
- // Clean up temp directory and archive on error
278
+ // Clean up temporary files on error
266
279
  const tempDir = path.join(process.cwd(), '.temp-download');
267
280
  if (fs.existsSync(tempDir)) {
268
281
  fs.rmSync(tempDir, { recursive: true, force: true });
@@ -271,6 +284,14 @@ async function run() {
271
284
  if (fs.existsSync(extractDir)) {
272
285
  fs.rmSync(extractDir, { recursive: true, force: true });
273
286
  }
287
+ // Clean up any leftover archive
288
+ const baseName = packageToInstall.includes('@')
289
+ ? packageToInstall.replace('@', '-').replace(/\//g, '-')
290
+ : path.basename(packageToInstall, path.extname(packageToInstall));
291
+ const outputArchive = path.join(process.cwd(), `${baseName}.with-generated.tgz`);
292
+ if (fs.existsSync(outputArchive)) {
293
+ fs.unlinkSync(outputArchive);
294
+ }
274
295
  console.error(`Error: ${error.message}`);
275
296
  process.exit(1);
276
297
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "babelfhir-ts",
3
- "version": "1.0.14",
3
+ "version": "1.0.16",
4
4
  "description": "BabelFHIR-TS: generate TypeScript interfaces, validators, and helper classes from FHIR R4 StructureDefinitions (profiles) directly inside package archives.",
5
5
  "type": "module",
6
6
  "main": "out/main.js",
@@ -66,6 +66,7 @@
66
66
  "@vitest/eslint-plugin": "^1.1.44",
67
67
  "axios": "^1.8.4",
68
68
  "fhirpath": "^4.0.0",
69
+ "pink.admission-generated": "file:.temp-install/generated",
69
70
  "tar": "^7.4.3",
70
71
  "ts-morph": "^25.0.1",
71
72
  "tsx": "^4.19.3",