@atomic-ehr/codegen 0.0.9 → 0.0.10-canary.20260327083848.a80dea0
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 +55 -1
- package/dist/cli/index.js +5 -5
- package/dist/index.d.ts +237 -69
- package/dist/index.js +439 -360
- package/dist/index.js.map +1 -1
- package/package.json +3 -4
package/README.md
CHANGED
|
@@ -22,6 +22,7 @@
|
|
|
22
22
|
- [Tree Shaking](#tree-shaking)
|
|
23
23
|
- [Field-Level Tree Shaking](#field-level-tree-shaking)
|
|
24
24
|
- [Logical Model Promotion](#logical-model-promotion)
|
|
25
|
+
- [Resolving Schema Collisions](#resolving-schema-collisions)
|
|
25
26
|
- [Generation](#generation)
|
|
26
27
|
- [1. Writer-Based Generation (Programmatic)](#1-writer-based-generation-programmatic)
|
|
27
28
|
- [2. Mustache Template-Based Generation (Declarative)](#2-mustache-template-based-generation-declarative)
|
|
@@ -147,6 +148,7 @@ const builder = new APIBuilder()
|
|
|
147
148
|
.typeSchema({
|
|
148
149
|
treeShake: { ... }, // Include only specified types
|
|
149
150
|
promoteLogical: { ... }, // Process logical models as resources
|
|
151
|
+
resolveCollisions: { ... },// Resolve duplicate schema collisions
|
|
150
152
|
})
|
|
151
153
|
|
|
152
154
|
// Code generator (choose one)
|
|
@@ -233,7 +235,7 @@ Tree shaking optimizes the generated output by including only the resources you
|
|
|
233
235
|
})
|
|
234
236
|
```
|
|
235
237
|
|
|
236
|
-
This feature automatically resolves and includes all dependencies (referenced types, base resources, nested types) while excluding unused resources, significantly reducing the size of generated code and improving compilation times.
|
|
238
|
+
This feature automatically resolves and includes all dependencies (referenced types, base resources, nested types, and extension definitions used by profiles) while excluding unused resources, significantly reducing the size of generated code and improving compilation times.
|
|
237
239
|
|
|
238
240
|
##### Field-Level Tree Shaking
|
|
239
241
|
|
|
@@ -259,6 +261,7 @@ Beyond resource-level filtering, tree shaking supports fine-grained field select
|
|
|
259
261
|
- `selectFields`: Only includes the specified fields (whitelist approach)
|
|
260
262
|
- `ignoreFields`: Removes specified fields, keeps everything else (blacklist approach)
|
|
261
263
|
- These options are **mutually exclusive** - you cannot use both in the same rule
|
|
264
|
+
- `ignoreExtensions`: Removes specific extensions from a profile by canonical URL
|
|
262
265
|
|
|
263
266
|
**Polymorphic Field Handling:**
|
|
264
267
|
|
|
@@ -282,6 +285,57 @@ const builder = new APIBuilder({})
|
|
|
282
285
|
})
|
|
283
286
|
```
|
|
284
287
|
|
|
288
|
+
#### Resolving Schema Collisions
|
|
289
|
+
|
|
290
|
+
When multiple StructureDefinitions produce the same binding (e.g. `ObservationCategory` from both `Observation` and `ObservationDefinition`), the schemas may differ in strength or value set. By default the generator picks the most common variant and emits a warning:
|
|
291
|
+
|
|
292
|
+
```
|
|
293
|
+
! ts: 'urn:fhir:binding:ObservationCategory' from 'shared' has 2 versions (#duplicateSchema)
|
|
294
|
+
```
|
|
295
|
+
|
|
296
|
+
To fix this, add `resolveCollisions` to `.typeSchema()` specifying which source should win for each binding URL:
|
|
297
|
+
|
|
298
|
+
```typescript
|
|
299
|
+
.typeSchema({
|
|
300
|
+
resolveCollisions: {
|
|
301
|
+
"urn:fhir:binding:ObservationCategory": {
|
|
302
|
+
package: "hl7.fhir.r4.core#4.0.1",
|
|
303
|
+
canonical: "http://hl7.org/fhir/StructureDefinition/Observation",
|
|
304
|
+
},
|
|
305
|
+
},
|
|
306
|
+
})
|
|
307
|
+
```
|
|
308
|
+
|
|
309
|
+
- **`package`** — the FHIR package ID (`name#version`) that contains the preferred source
|
|
310
|
+
- **`canonical`** — the StructureDefinition URL that should provide the authoritative binding
|
|
311
|
+
|
|
312
|
+
The generated `README.md` report (from `.introspection()`) lists all collisions with version details and includes a ready-to-paste `resolveCollisions` config for any unresolved ones. Example output:
|
|
313
|
+
|
|
314
|
+
```markdown
|
|
315
|
+
## Schema Collisions
|
|
316
|
+
|
|
317
|
+
- `urn:fhir:binding:CommunicationReason` (2 versions)
|
|
318
|
+
- Version 1 (selected): Communication (hl7.fhir.r4.core#4.0.1)
|
|
319
|
+
- Version 2: CommunicationRequest (hl7.fhir.r4.core#4.0.1)
|
|
320
|
+
- `urn:fhir:binding:ProcessPriority` (2 versions)
|
|
321
|
+
- Version 1 (auto): Claim (hl7.fhir.r4.core#4.0.1), CoverageEligibilityRequest (hl7.fhir.r4.core#4.0.1)
|
|
322
|
+
- Version 2: ExplanationOfBenefit (hl7.fhir.r4.core#4.0.1)
|
|
323
|
+
|
|
324
|
+
### Suggested `resolveCollisions` config
|
|
325
|
+
|
|
326
|
+
.typeSchema({
|
|
327
|
+
resolveCollisions: {
|
|
328
|
+
"urn:fhir:binding:ProcessPriority": {
|
|
329
|
+
package: "hl7.fhir.r4.core#4.0.1",
|
|
330
|
+
canonical: "http://hl7.org/fhir/StructureDefinition/Claim",
|
|
331
|
+
},
|
|
332
|
+
},
|
|
333
|
+
})
|
|
334
|
+
```
|
|
335
|
+
|
|
336
|
+
- **(selected)** — resolved by your `resolveCollisions` config
|
|
337
|
+
- **(auto)** — picked automatically (most common variant); add to config to make explicit
|
|
338
|
+
|
|
285
339
|
### Generation
|
|
286
340
|
|
|
287
341
|
The generation stage transforms Type Schema into target language code using two complementary approaches:
|
package/dist/cli/index.js
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import b from'picocolors';import an from'yargs';import {hideBin}from'yargs/helpers';import {mkdir,writeFile}from'fs/promises';import {dirname}from'path';import {createHash}from'crypto';import Ne from'assert';import {CanonicalManager}from'@atomic-ehr/fhir-canonical-manager';import*as pe from'@atomic-ehr/fhirschema';import {isStructureDefinition}from'@atomic-ehr/fhirschema';var Z=e=>{console.log(),console.log(b.cyan(b.bold(`\u2501\u2501\u2501 ${e} \u2501\u2501\u2501`)));},ee=(e,n,i)=>{let t=e;if(n&&(t+=` ${b.gray(`(${n}ms)`)}`),console.log(`${b.green("")} ${t}`),i)for(let[o,r]of Object.entries(i))console.log(b.gray(` ${o}: ${r}`));},I=(e,n="\u2022")=>{for(let i of e)console.log(b.gray(` ${n} ${i}`));};var ne={DEBUG:0,INFO:1,WARN:2,ERROR:3,SILENT:4};function C(e={}){let n=e.prefix??"",i=new Set(e.suppressTags??[]),t={},o=[],r=new Set,a=e.level??"INFO",s=p=>ne[p]>=ne[a],c={DEBUG:p=>p,INFO:p=>p,WARN:b.yellow,ERROR:b.red,SILENT:p=>p},l=(p,m,f,g)=>{let y=n?`${n}: `:"",S=g?` ${b.dim(`(${g})`)}`:"";return c[p](`${m} ${y}${f}`)+S},d=(p,m,f,g=false)=>{o.push({level:p,tag:f,message:m,suppressed:g,prefix:n,timestamp:Date.now()});},u=(p,m,f,g=false)=>(...y)=>{let S=y.length===2?y[0]:void 0,k=y.length===2?y[1]:y[0];S&&(t[S]=(t[S]??0)+1);let R=S!==void 0&&i.has(S);if(d(p,k,S,R),!R&&s(p)){if(g){let Y=`${p}::${S??""}::${k}`;if(r.has(Y))return;r.add(Y);}f(l(p,m,k,S));}},h={warn:u("WARN","!",console.warn),dryWarn:u("WARN","!",console.warn,true),info:u("INFO","i",console.log),error:u("ERROR","X",console.error),debug:u("DEBUG","D",console.log),fork(p,m){let f=n?`${n}/${p}`:p,g=[...i,...m?.suppressTags??[]];return C({prefix:f,suppressTags:g,level:m?.level??a})},as(){return h},tagCounts(){return t},printTagSummary(){let p=Object.entries(t);if(p.length===0)return;let m=n?`${n}: `:"",f=p.filter(([y])=>!i.has(y)),g=p.filter(([y])=>i.has(y));if(f.length>0){let y=f.reduce((k,[,R])=>k+R,0),S=f.map(([k,R])=>`${k}: ${R}`).join(", ");console.warn(b.yellow(`! ${m}${y} warnings (${S})`));}if(g.length>0){let y=g.reduce((k,[,R])=>k+R,0),S=g.map(([k,R])=>`${k}: ${R}`).join(", ");console.log(b.dim(`i ${m}${y} suppressed (${S})`));}},buffer(){return o},bufferClear(){o.length=0;}};return h}var E="Use CodeableReference which is not provided by FHIR R4.",Te="Use Availability which is not provided by FHIR R4.",M={"hl7.fhir.uv.extensions.r4":{"http://hl7.org/fhir/StructureDefinition/extended-contact-availability":Te,"http://hl7.org/fhir/StructureDefinition/immunization-procedure":E,"http://hl7.org/fhir/StructureDefinition/specimen-additive":E,"http://hl7.org/fhir/StructureDefinition/workflow-barrier":E,"http://hl7.org/fhir/StructureDefinition/workflow-protectiveFactor":E,"http://hl7.org/fhir/StructureDefinition/workflow-reason":E},"hl7.fhir.r5.core#5.0.0":{"http://hl7.org/fhir/StructureDefinition/shareablecodesystem":"FIXME: CodeSystem.concept.concept defined by ElementReference. FHIR Schema generator output broken value in it, so we just skip it for now.","http://hl7.org/fhir/StructureDefinition/publishablecodesystem":"Uses R5-only base types not available in R4 generation."}};function F(e,n){let i=`${e.name}#${e.version}`,t=M[i]?.[n];if(t)return {shouldSkip:true,reason:t};let o=M[e.name]?.[n];return o?{shouldSkip:true,reason:o}:{shouldSkip:false}}var x=e=>`${e.name}#${e.version}`,te=e=>`${e.name}@${e.version}`;var oe=e=>{let n=JSON.stringify(e);return createHash("sha256").update(n).digest("hex").slice(0,16)},ie=(e,n)=>({...e,package_meta:e.package_meta||n,name:e.name,url:e.url,base:e.base});var re=e=>e?.kind==="nested",ae=e=>e?.kind==="profile",D=(...e)=>{let n=e.filter(t=>t!==void 0).flatMap(t=>t.map(o=>[o.url,o]));return n.length===0?void 0:Object.values(Object.fromEntries(n)).sort((t,o)=>t.url.localeCompare(o.url))};var se=(e,n)=>{if(!e.url)throw new Error("ValueSet must have a URL");if(!e.name)throw new Error("ValueSet must have a name");return {...e,package_meta:e.package_meta||n,name:e.name,url:e.url}};function B(e){let n=e.split("|")[0];return n||e}function De(e){return e.split("|")[1]}function Pe(e){return e.derivation==="constraint"?"profile":e.kind==="primitive-type"?"primitive-type":e.kind==="complex-type"?"complex-type":e.kind==="resource"?"resource":e.kind==="logical"?"logical":"resource"}function v(e){return {kind:Pe(e),package:e.package_meta.name,version:e.package_meta.version,name:e.name,url:e.url}}var Le=e=>{let n=e.split("/"),i=n[n.length-1];return i&&i.length>0?i.split(/[-_]/).map(t=>t.charAt(0).toUpperCase()+t.slice(1).toLowerCase()).join(""):e};function P(e,n,i){let t=B(i),o=Le(t),r={package_meta:{name:"missing_valuesets",version:De(t)||"0.0.0"},id:i},a=e.resolveVs(n,t)||r,s=a?.id&&!/^[a-zA-Z0-9_-]{20,}$/.test(a.id)?a.id:o;return {kind:"value-set",package:a.package_meta.name,version:a.package_meta.version,name:s,url:t}}function L(e,n,i){let t=i.binding?.bindingName,o=n.join("."),[r,a,s]=t?[{name:"shared",version:"1.0.0"},t,`urn:fhir:binding:${t}`]:[e.package_meta,`${e.name}.${o}_binding`,`${e.url}#${o}_binding`];return {kind:"binding",package:r.name,version:r.version,name:a,url:s}}function _(e,n,i,t){let o=B(i)||i,r=e.resolveVs(n,o);if(r)return we(e,r)}function we(e,n,i){if(n.expansion?.contains)return n.expansion.contains.filter(o=>o.code!==void 0).map(o=>(Ne(o.code),{code:o.code,display:o.display,system:o.system}));let t=[];if(n.compose?.include){for(let o of n.compose.include)if(o.concept)for(let r of o.concept)t.push({system:o.system,code:r.code,display:r.display});else if(o.system&&!o.filter)try{let r=e.resolveAny(o.system);if(r?.concept){let a=(s,c)=>{for(let l of s)t.push({system:c,code:l.code,display:l.display}),l.concept&&a(l.concept,c);};a(r.concept,o.system);}}catch{}}return t.length>0?t:void 0}var ce=100,A=new Set(["code","Coding","CodeableConcept","CodeableReference","Quantity","string","uri","Duration"]);function G(e,n,i,t){if(!i.binding)return;let o=i.binding.strength,r=i.binding.valueSet;if(!r)return;if(!A.has(i.type??"")){t?.dryWarn("#binding",`eld-11: Binding on non-bindable type '${i.type}' (valueSet: ${r})`);return}if(!(o==="required"||o==="extensible"||o==="preferred"))return;let s=_(e,n.package_meta,r);if(!s||s.length===0)return;let c=s.map(l=>l.code).filter(l=>l&&typeof l=="string"&&l.trim().length>0);if(c.length>ce){t?.dryWarn("#largeValueSet",`Value set ${r} has ${c.length} which is more than ${ce} codes, which may cause issues with code generation.`);return}if(c.length!==0)return {isOpen:o!=="required",values:c}}function Ue(e,n,i,t,o){if(!t.binding?.valueSet)return;let r=L(n,i,t),a=P(e,n.package_meta,t.binding.valueSet),s=G(e,n,t,o);return {identifier:r,valueset:a,strength:t.binding.strength,enum:s,dependencies:[a]}}function le(e,n,i){let t=new Set;if(!n.elements)return [];let o=[];function r(c,l){for(let[d,u]of Object.entries(c)){let h=[...l,d],p=h.join("."),m=e.resolveElementSnapshot(n,h);if(!t.has(p)){if(t.add(p),m.binding){let f=Ue(e,n,h,m,i);f&&o.push(f);}u.elements&&r(u.elements,h);}}}r(n.elements,[]),o.sort((c,l)=>c.identifier.name.localeCompare(l.identifier.name));let a=[],s=new Set;for(let c of o)s.has(c.identifier.url)||(s.add(c.identifier.url),a.push(c));return a}var q=e=>e!==null&&typeof e=="object"&&e.resourceType==="CodeSystem";var N=e=>e!==null&&typeof e=="object"&&e.resourceType==="ValueSet";var $e=async(e,n)=>{let i=await e.packageJson(n.name);if(!i)return [];let t=i.dependencies;return t!==void 0?Object.entries(t).map(([o,r])=>({name:o,version:r})):[]},de=e=>({pkg:e,canonicalResolution:{},fhirSchemas:{},valueSets:{}}),me=async(e,n,i,t,o)=>{let r=x(n);if(o?.info(`${" ".repeat(i*2)}+ ${r}`),t[r])return t[r];let a=de(n);for(let c of await e.search({package:n})){let l=c.url;if(!l||!(isStructureDefinition(c)||N(c)||q(c)))continue;let d=l;a.canonicalResolution[d]&&o?.dryWarn("#duplicateCanonical",`Duplicate canonical URL: ${d} at ${r}.`),a.canonicalResolution[d]=[{deep:i,pkg:n,pkgId:r,resource:c}];}let s=await $e(e,n);for(let c of s){let{canonicalResolution:l}=await me(e,c,i+1,t,o);for(let[d,u]of Object.entries(l)){let h=d;a.canonicalResolution[h]=[...a.canonicalResolution[h]||[],...u];}}for(let c of Object.values(a.canonicalResolution))c.sort((l,d)=>l.deep-d.deep);return t[r]=a,a},He=(e,n)=>{for(let{pkg:i,canonicalResolution:t}of Object.values(e)){let o=x(i);if(!e[o])throw new Error(`Package ${o} not found`);let r=0;n?.info(`FHIR Schema conversion for '${x(i)}' begins...`);for(let[a,s]of Object.entries(t)){let c=s[0];if(!c)throw new Error("Resource not found");let l=c.resource,d=c.pkg;if(isStructureDefinition(l)){let u=pe.translate(l),h=ie(u,d);r++,e[o].fhirSchemas[h.url]=h;}if(N(l)){let u=se(l,d);e[o].valueSets[u.url]=u;}}n?.info(`FHIR Schema conversion for '${x(i)}' completed: ${r} successful`);}},Oe=(e,n,i)=>{let t=Object.values(e).flatMap(o=>o.canonicalResolution[n]);if(!t)throw new Error(`No canonical resolution found for ${n} in any package`);return t[0]?.resource},je=async(e,{logger:n,focusedPackages:i})=>{let t=i??await e.packages(),o={};for(let p of t)await me(e,p,0,o,n);He(o,n);let r=(p,m)=>{let f=o[x(p)];if(f){let g=f.canonicalResolution[m]?.[0];if(g)return o[g.pkgId]?.fhirSchemas[m]}for(let g of Object.values(o)){let y=g.fhirSchemas[m];if(y&&y.package_meta.name===p.name)return y}for(let g of Object.values(o)){let y=g.fhirSchemas[m];if(y)return y}},a=(p,m)=>{let f=o[x(p)];if(f){let g=f.canonicalResolution[m]?.[0];if(g)return o[g.pkgId]?.valueSets[m]}for(let g of Object.values(o)){let y=g.valueSets[m];if(y&&y.package_meta.name===p.name)return y}for(let g of Object.values(o)){let y=g.valueSets[m];if(y)return y}},s=p=>(p.includes("|")&&(p=p.split("|")[0]),p.match(/^[a-zA-Z0-9]+$/)?`http://hl7.org/fhir/StructureDefinition/${p}`:p),c=(p,m)=>{let f=r(p,m);if(f===void 0)throw new Error(`Failed to resolve FHIR Schema: '${m}'`);let g=[f];for(;f?.base;){let y=f.package_meta,S=s(f.base);if(f=r(y,S),f===void 0)throw new Error(`Failed to resolve FHIR Schema base for '${m}'. Problem: '${S}' from '${x(y)}'`);g.push(f);}return g},l=(p,m)=>c(p,m).filter(f=>f.derivation==="specialization"),d=(p,m)=>{let f=c(p.package_meta,p.url),g=U(f,m);return z(g)},u=p=>{let m=new Set;for(let[f,g]of Object.entries(p)){m.add(f);for(let y of g?.choices||[])p[y]||m.add(y);}return Array.from(m)},h;return {testAppendFs(p){let m=x(p.package_meta);o[m]||(o[m]=de(p.package_meta)),o[m].fhirSchemas[p.url]=p,h=void 0;},resolveFs:r,resolveFsGenealogy:c,resolveFsSpecializations:l,ensureSpecializationCanonicalUrl:s,resolveSd:(p,m)=>{let f=o[x(p)]?.canonicalResolution[m]?.[0]?.resource;if(isStructureDefinition(f))return f},allSd:()=>Object.values(o).flatMap(p=>Object.values(p.canonicalResolution).flatMap(m=>m.map(f=>{let g=f.resource;return g.package_name?g:{...g,package_name:p.pkg.name,package_version:p.pkg.version}}))).filter(p=>isStructureDefinition(p)).sort((p,m)=>p.url.localeCompare(m.url)),allFs:()=>Object.values(o).flatMap(p=>Object.values(p.fhirSchemas)),allVs:()=>Object.values(o).flatMap(p=>Object.values(p.valueSets)),resolveVs:a,resolveAny:p=>Oe(o,p),resolveElementSnapshot:d,getAllElementKeys:u,resolver:o,resolutionTree:()=>{if(h)return h;let p={};for(let[m,f]of Object.entries(o)){let g=f.pkg.name;p[g]={};for(let[y,S]of Object.entries(f.canonicalResolution)){let k=y;p[g][k]=[];for(let R of S)p[g][k].push({deep:R.deep,pkg:R.pkg});}}return h=p,p}}},ue=async(e,n)=>{let i=e.map(te);n?.logger?.info(`Loading FHIR packages: ${i.join(", ")}`);let t=CanonicalManager({packages:i,workingDir:".codegen-cache/canonical-manager-cache",registry:n.registry||void 0});return await t.init(),await je(t,{...n,focusedPackages:e})},U=(e,n)=>{let[i,...t]=n;return i===void 0?[]:e.map(o=>{if(!o.elements)return;let r=o.elements?.[i];for(let a of t)r=r?.elements?.[a];return r}).filter(o=>o!==void 0)};function z(e){let n=e.reverse(),i=Object.assign({},...n);return i.elements=void 0,i}var fe=(e,n,i)=>{let t=e.resolveFsSpecializations(n.package_meta,n.url),o=U(t,i),r=z(o).type,a;if(r){let s=e.ensureSpecializationCanonicalUrl(r),l=e.resolveFsGenealogy(n.package_meta,s).flatMap(d=>Object.keys(d.elements??{}));l.length>0&&(a=new Set(l));}for(let s of o)if(!(!s.elements||Object.keys(s.elements).length===0)&&!(a&&!Object.keys(s.elements).some(c=>!a.has(c))))return true;return false},W=(e,n,i,t,o)=>t.type==="BackboneElement"?true:!o?.elements||o.choiceOf!==void 0?false:fe(e,n,i),Me=e=>e.elements?new Set(K(e,[],e.elements).filter(([n,i])=>i.elements&&Object.keys(i.elements).length>0).map(([n])=>n.join("."))):new Set;function V(e,n,i){let t={},o=n.derivation==="constraint"?e.resolveFsSpecializations(n.package_meta,n.url):e.resolveFsGenealogy(n.package_meta,n.url);for(let d of [...o].reverse()){let u=Me(d);for(let h of u)t[h]=`${d.url}#${h}`;}let r=i.join("."),a=t[r]??`${n.url}#${r}`,s=a.split("#")[0],l=e.resolveFs(n.package_meta,s)?.package_meta??n.package_meta;return {kind:"nested",package:l.name,version:l.version,name:r,url:a}}function K(e,n,i){let t=[];for(let[o,r]of Object.entries(i)){let a=[...n,o];r.elements&&r.choiceOf===void 0&&t.push([a,r]),r.elements&&t.push(...K(e,a,r.elements));}return t}function Be(e,n,i,t,o){let r={},a=e.resolveFsGenealogy(n.package_meta,n.url),s=U(a,i),c=new Set;for(let l of s)if(l.elements)for(let d of Object.keys(l.elements))c.add(d);for(let l of c){let d=[...i,l],u=e.resolveElementSnapshot(n,d);W(e,n,d,u,t[l])?r[l]=H(e,n,d,u):r[l]=$(e,n,d,u,o);}return r}function ge(e,n,i){if(!n.elements)return;let t=K(n,[],n.elements).filter(([r,a])=>!a.elements||Object.keys(a.elements).length===0?false:a.type!=="BackboneElement"?fe(e,n,r):true),o=[];for(let[r,a]of t){let s=V(e,n,r),c;a.type==="BackboneElement"||!a.type?c="BackboneElement":c=a.type;let l=e.ensureSpecializationCanonicalUrl(c),d=e.resolveFs(n.package_meta,l);if(!d)throw new Error(`Could not resolve base type ${c}`);let u={kind:"complex-type",package:d.package_meta.name,version:d.package_meta.version,name:c,url:l},h=Be(e,n,r,a.elements??{},i),p={identifier:s,base:u,fields:h};o.push(p);}return o.sort((r,a)=>r.identifier.url.localeCompare(a.identifier.url)),o.length===0?void 0:o}function ye(e){let n=[];for(let i of e){i.base&&n.push(i.base);for(let t of Object.values(i.fields||{}))"type"in t&&t.type&&n.push(t.type),"binding"in t&&t.binding&&n.push(t.binding);}return n}function he(e,n,i){let t=i[i.length-1];if(!t)throw new Error(`Internal error: fieldName is missing for path ${i.join("/")}`);let o=i.slice(0,-1),r=e.resolveFsGenealogy(n.package_meta,n.url).flatMap(a=>{if(o.length===0)return a.required||[];if(!a.elements)return [];let s=a;for(let c of o)s=s?.elements?.[c];return s?.required||[]});return new Set(r).has(t)}function Se(e,n,i){let t=i[i.length-1];if(!t)throw new Error(`Internal error: fieldName is missing for path ${i.join("/")}`);let o=i.slice(0,-1),r=e.resolveFsGenealogy(n.package_meta,n.url).flatMap(a=>{if(o.length===0)return a.excluded||[];if(!a.elements)return [];let s=a;for(let c of o)s=s?.elements?.[c];return s?.excluded||[]});return new Set(r).has(t)}var _e=(e,n,i)=>{if(i.refers)return i.refers.map(t=>{let o=e.ensureSpecializationCanonicalUrl(t),r=e.resolveFs(n.package_meta,o);if(!r)throw new Error(`Failed to resolve fs for ${o}`);return v(r)})},Ae=e=>{let n=new Set,i=new Set;if(e.required)for(let o of e.required)n.add(o);if(e.excluded)for(let o of e.excluded)i.add(o);if(e.elements)for(let[o,r]of Object.entries(e.elements))r.min!==void 0&&r.min>0&&n.add(o);let t=e.elements?Object.keys(e.elements):void 0;return {required:n.size>0?Array.from(n):void 0,excluded:i.size>0?Array.from(i):void 0,elements:t&&t.length>0?t:void 0}},Ge=e=>!e||typeof e=="object"&&Object.keys(e).length===0,J=(e,n,i)=>{let t=e;for(let r=0;r<n.length-1;r++){let a=n[r];(!t[a]||typeof t[a]!="object")&&(t[a]={}),t=t[a];}let o=n[n.length-1];t[o]=i;},qe=(e,n)=>{let i=e;for(let t of n)if(i&&typeof i=="object"&&!Array.isArray(i))i=i[t];else return;return i},xe=(e,n,i,t)=>{if(i>=n.length||!e.elements)return;let o=n[i],r=e.elements[o];if(r){if(i===n.length-1&&r.fixed?.value!==void 0){J(t,n,r.fixed.value);return}if(r.slicing?.slices){let a=n.slice(i+1);for(let s of Object.values(r.slicing.slices)){if(!s.min||s.min<1||!s.match||typeof s.match!="object")continue;let c=s.match;if(Object.keys(c).length!==0)if(a.length>0){let l=qe(c,a);l!==void 0&&J(t,n,l);}else J(t,n.slice(0,i+1),c);}return}xe(r,n,i+1,t);}},ze=(e,n)=>{if(!n?.elements||!e||e.length===0)return;let i={};for(let t of e){let o=t.path.split(".");xe(n,o,0,i);}return Object.keys(i).length>0?i:void 0},ke=e=>{let n=e.slicing;if(!n)return;let i={};for(let[t,o]of Object.entries(n.slices??{})){if(!o)continue;let{required:r,excluded:a,elements:s}=o.schema?Ae(o.schema):{};i[t]={min:o.min,max:o.max,match:Ge(o.match)?ze(n.discriminator??[],o.schema):o.match,required:r,excluded:a,elements:s};}return {discriminator:n.discriminator,rules:n.rules,ordered:n.ordered,slices:Object.keys(i).length>0?i:void 0}};function O(e,n,i,t,o){if(t.elementReference){let r=t.elementReference.slice(1).filter((a,s)=>s%2===1);return V(e,n,r)}else if(t.type){let r=e.ensureSpecializationCanonicalUrl(t.type),a=e.resolveFs(n.package_meta,r);if(!a)throw new Error(`Could not resolve field type: <${n.url}>.${i.join(".")}: <${t.type}> (pkg: '${x(n.package_meta)}'))`);return v(a)}else {if(t.choices)return;if(n.derivation==="constraint")return;o?.dryWarn("#fieldTypeNotFound",`Can't recognize element type: <${n.url}>.${i.join(".")} (pkg: '${x(n.package_meta)}'): missing type info`);return}}var $=(e,n,i,t,o,r)=>{let a,s;t.binding&&(a=L(n,i,t),A.has(t.type??"")&&(s=G(e,n,t,o)));let c=O(e,n,i,t,o);c||o?.dryWarn("#fieldTypeNotFound",`Field type not found for '${n.url}#${i.join(".")}' (${n.derivation})`);let l;t.pattern?l={kind:"pattern",type:t.pattern.type,value:t.pattern.value}:t.fixed&&(l={kind:"fixed",type:t.fixed.type,value:t.fixed.value});let d=r??t;if(!l&&d.elements?.coding?.slicing?.slices){let u=d.elements.coding.slicing.slices,h=Object.values(u);if(h.length>0&&h.every(m=>m.min!==void 0&&m.min>=1&&m.match&&typeof m.match=="object"&&Object.keys(m.match).length>0)){let m=h.map(f=>f.match);l={kind:"fixed",type:"CodeableConcept",value:{coding:m.length===1?[m[0]]:m}};}}return {type:c,required:he(e,n,i),excluded:Se(e,n,i),reference:_e(e,n,t),array:t.array||false,min:t.min,max:t.max,slicing:ke(t),choices:t.choices,choiceOf:t.choiceOf,binding:a,enum:s,valueConstraint:l,mustSupport:t.mustSupport}};function H(e,n,i,t){return {type:V(e,n,i),array:t.array||false,required:he(e,n,i),excluded:Se(e,n,i),slicing:ke(t)}}var We=(e,n,i,t)=>{let o=e.resolveFs(n.package_meta,i);if(!o?.elements)return;let r=[];for(let[a,s]of Object.entries(o.elements)){if(s.choiceOf!=="value"&&!a.startsWith("value"))continue;let c=O(e,o,[a],s,t);c&&r.push(c);}return D(r)},Ke=(e,n,i)=>{let t=[];if(!n.elements)return t;for(let[o,r]of Object.entries(n.elements)){if(!o.startsWith("extension:"))continue;let a=o.split(":")[1];if(!a)continue;let s;for(let[c,l]of Object.entries(r.elements??{}))if(!(l.choiceOf!=="value"&&!c.startsWith("value"))&&(s=O(e,n,[o,c],l,i),s))break;t.push({name:a,url:r.url??a,valueType:s,min:r.min,max:r.max!==void 0?String(r.max):void 0});}return t},Je=e=>{let n=[],t=e.elements?.extension?.slicing?.slices;if(!t||typeof t!="object")return n;for(let[o,r]of Object.entries(t)){let a=r,s=a.schema;if(!s)continue;let c;for(let[l,d]of Object.entries(s.elements??{})){let u=d;if(!(u.choiceOf!=="value"&&!l.startsWith("value"))&&u.type){c={kind:"complex-type",package:e.package_meta.name,version:e.package_meta.version,name:u.type,url:`http://hl7.org/fhir/StructureDefinition/${u.type}`};break}}n.push({name:o,url:a.match?.url??o,valueType:c,min:s._required?1:s.min??0,max:s.max!==void 0?String(s.max):s.array?"*":"1"});}return n},Qe=(e,n,i,t)=>{let o=e.resolveFs(n.package_meta,i);if(!o?.elements)return;let r=Ke(e,o,t),a=Je(o),s=[...r,...a];return s.length>0?s:void 0},Re=(e,n,i)=>{let t=[],o=(c,l,d)=>{let u=d.url,h=u?We(e,n,u,i):void 0,p=u?Qe(e,n,u,i):void 0;if(!u){let f=n.elements?.extension?.slicing?.slices?.[l]?.schema;if(f){u=f.elements?.url?.fixed?.value??l;for(let[g,y]of Object.entries(f.elements??{})){let S=y;if(S.choiceOf==="value"&&S.type){h=[{kind:"complex-type",package:n.package_meta.name,version:n.package_meta.version,name:S.type,url:`http://hl7.org/fhir/StructureDefinition/${S.type}`}];break}}}}let m=p&&p.length>0;t.push({name:l,path:[...c,"extension"].join("."),url:u,min:d.min,max:d.max!==void 0?String(d.max):void 0,mustSupport:d.mustSupport,valueTypes:h,subExtensions:p,isComplex:m});},r=(c,l)=>{if(l.extensions)for(let[d,u]of Object.entries(l.extensions))o(c,d,u);if(l.elements)for(let[d,u]of Object.entries(l.elements))r([...c,d],u);};r([],n);let a=new Set,s=t.filter(c=>{let l=`${c.url}:${c.path}`;return a.has(l)?false:(a.add(l),true)});return s.length===0?void 0:s};function Xe(e,n,i,t,o){if(!t)return;let r={};for(let a of e.getAllElementKeys(t)){let s=[...i,a],c=e.resolveElementSnapshot(n,s),l=c.type?e.ensureSpecializationCanonicalUrl(c.type):void 0;if(l&&F(n.package_meta,l).shouldSkip){o?.warn("#skipCanonical",`Skipping field ${s} for ${l} due to skip hack ${F(n.package_meta,l).reason}`);continue}W(e,n,s,c,t[a])?r[a]=H(e,n,s,c):r[a]=$(e,n,s,c,o,t[a]);}return r}function Ye(e){let n=[];for(let i of Object.values(e))"type"in i&&i.type&&n.push(i.type),"binding"in i&&i.binding&&n.push(i.binding);return n}async function Ce(e,n,i){if(!n.url)throw new Error("ValueSet URL is required");let t=P(e,n.package_meta,n.url),o=_(e,n.package_meta,n.url);return {identifier:t,description:n.description,concept:o,compose:o?void 0:n.compose}}function Ze(e,n,i,t){let o=[];n&&o.push(n),i&&o.push(...Ye(i)),t&&o.push(...ye(t));let r=new Set(t?.map(s=>s.identifier.url)),a=o.filter(s=>s.url===e.url?false:ae(e)||!re(s)?true:!r.has(s.url));return D(a)}function en(e,n,i){let t=v(n),o;if(n.base){let h=e.resolveFs(n.package_meta,e.ensureSpecializationCanonicalUrl(n.base));if(!h)throw new Error(`Base resource not found '${n.base}' for <${n.url}> from ${x(n.package_meta)}`);o=v(h);}let r=Xe(e,n,[],n.elements,i),a=ge(e,n,i),s=n.derivation==="constraint"?Re(e,n,i):void 0,c=s?.flatMap(h=>h.valueTypes??[])??[],l=Ze(t,o,r,a),d={identifier:t,base:o,fields:r,nested:a,description:n.description,dependencies:D(l,c),extensions:s},u=le(e,n,i);return [d,...u]}async function be(e,n,i){return en(e,n,i)}var nn=(e,n)=>{let i={};for(let r of e){let a=`${r.schema.identifier.url}|${r.schema.identifier.package}`,s=oe(r.schema);i[a]??={},i[a][s]??={typeSchema:r.schema,sources:[]},i[a][s].sources.push(r);}let t=[],o={};for(let r of Object.values(i)){let a=Object.values(r).sort((c,l)=>l.sources.length-c.sources.length),s=a[0];if(s&&(t.push(s.typeSchema),a.length>1)){let c=s.typeSchema.identifier.package,l=s.typeSchema.identifier.url;n?.dryWarn("#duplicateSchema",`'${l}' from '${c}' has ${a.length} versions`),o[c]??={},o[c][l]=a.flatMap(d=>d.sources.map(u=>({typeSchema:d.typeSchema,sourcePackage:u.sourcePackage,sourceCanonical:u.sourceCanonical})));}}return {schemas:t,collisions:o}},Ie=async(e,n)=>{let i=[];for(let t of e.allFs()){let o=x(t.package_meta),r=F(t.package_meta,t.url);if(r.shouldSkip){n?.dryWarn("#skipCanonical",`Skip ${t.url} from ${o}. Reason: ${r.reason}`);continue}for(let a of await be(e,t,n))i.push({schema:a,sourcePackage:o,sourceCanonical:t.url});}for(let t of e.allVs())i.push({schema:await Ce(e,t),sourcePackage:x(t.package_meta),sourceCanonical:t.url});return nn(i,n)};var Fe={command:"generate <packages..>",describe:"Generate TypeSchema files from FHIR packages",builder:{packages:{type:"string",array:true,demandOption:true,describe:"FHIR packages to process (e.g., hl7.fhir.r4.core@4.0.1)"},output:{alias:"o",type:"string",describe:"Output file or directory",default:"./schemas.ndjson"},format:{alias:"f",type:"string",choices:["ndjson","json"],default:"ndjson",describe:"Output format for TypeSchema files"},treeshake:{alias:"t",type:"string",array:true,describe:"Only generate TypeSchemas for specific ResourceTypes (treeshaking)"},singleFile:{alias:"s",type:"boolean",default:false,describe:"Generate single TypeSchema file instead of multiple files (NDJSON format)"},verbose:{alias:"v",type:"boolean",default:false,describe:"Enable verbose output"},registry:{alias:"r",type:"string",describe:"Custom FHIR package registry URL (default: https://fs.get-ig.org/pkgs/)"}},handler:async e=>{let n=C({prefix:"TypeSchema"});try{n.info("Generating TypeSchema from FHIR packages"),n.info(`Packages: ${e.packages.join(", ")}`),n.info(`Output: ${e.output}`);let i=e.singleFile?"ndjson":e.format;n.debug(`Format: ${i}${e.singleFile&&e.format==="json"?" (forced from json due to singleFile)":""}`),e.treeshake&&e.treeshake.length>0&&n.info(`Treeshaking enabled for ResourceTypes: ${e.treeshake.join(", ")}`),e.singleFile&&n.info("Single file output enabled (NDJSON format)"),e.registry&&n.info(`Using custom registry: ${e.registry}`);let t=Date.now(),o=e.packages.map(d=>{if(d.includes("@")){let u=d.lastIndexOf("@");return {name:d.slice(0,u),version:d.slice(u+1)||"latest"}}return {name:d,version:"latest"}});n.info(`Processing packages: ${o.map(d=>`${d.name}@${d.version}`).join(", ")}`);let r=await ue(o,{logger:n,registry:e.registry,focusedPackages:o}),{schemas:a}=await Ie(r,n);if(a.length===0)throw new Error("No schemas were generated from the specified packages");let s=e.output;if(!s)throw new Error("Output format not specified");await mkdir(dirname(s),{recursive:!0});let c;i==="json"?c=JSON.stringify(a,null,2):c=a.map(d=>JSON.stringify(d)).join(`
|
|
3
|
-
`),await writeFile(
|
|
2
|
+
import b from'picocolors';import ln from'yargs';import {hideBin}from'yargs/helpers';import {mkdir,writeFile}from'fs/promises';import {dirname}from'path';import Ce from'assert';import {createHash}from'crypto';import {CanonicalManager}from'@atomic-ehr/fhir-canonical-manager';import*as pe from'@atomic-ehr/fhirschema';import {isStructureDefinition}from'@atomic-ehr/fhirschema';var ee=e=>{console.log(),console.log(b.cyan(b.bold(`\u2501\u2501\u2501 ${e} \u2501\u2501\u2501`)));},ne=(e,n,o)=>{let t=e;if(n&&(t+=` ${b.gray(`(${n}ms)`)}`),console.log(`${b.green("")} ${t}`),o)for(let[i,r]of Object.entries(o))console.log(b.gray(` ${i}: ${r}`));},F=(e,n="\u2022")=>{for(let o of e)console.log(b.gray(` ${n} ${o}`));};var te={DEBUG:0,INFO:1,WARN:2,ERROR:3,SILENT:4};function C(e={}){let n=e.prefix??"",o=new Set(e.suppressTags??[]),t={},i=[],r=new Set,a=e.level??"INFO",c=p=>te[p]>=te[a],l={DEBUG:p=>p,INFO:p=>p,WARN:b.yellow,ERROR:b.red,SILENT:p=>p},s=(p,m,f,g)=>{let y=n?`${n}: `:"",S=g?` ${b.dim(`(${g})`)}`:"";return l[p](`${m} ${y}${f}`)+S},d=(p,m,f,g=false)=>{i.push({level:p,tag:f,message:m,suppressed:g,prefix:n,timestamp:Date.now()});},u=(p,m,f,g=false)=>(...y)=>{let S=y.length===2?y[0]:void 0,x=y.length===2?y[1]:y[0];S&&(t[S]=(t[S]??0)+1);let k=S!==void 0&&o.has(S);if(d(p,x,S,k),!k&&c(p)){if(g){let D=`${p}::${S??""}::${x}`;if(r.has(D))return;r.add(D);}f(s(p,m,x,S));}},h={warn:u("WARN","!",console.warn),dryWarn:u("WARN","!",console.warn,true),info:u("INFO","i",console.log),error:u("ERROR","X",console.error),debug:u("DEBUG","D",console.log),fork(p,m){let f=n?`${n}/${p}`:p,g=[...o,...m?.suppressTags??[]];return C({prefix:f,suppressTags:g,level:m?.level??a})},as(){return h},tagCounts(){return t},printTagSummary(){let p=Object.entries(t);if(p.length===0)return;let m=n?`${n}: `:"",f=p.filter(([y])=>!o.has(y)),g=p.filter(([y])=>o.has(y));if(f.length>0){let y=f.reduce((x,[,k])=>x+k,0),S=f.map(([x,k])=>`${x}: ${k}`).join(", ");console.warn(b.yellow(`! ${m}${y} warnings (${S})`));}if(g.length>0){let y=g.reduce((x,[,k])=>x+k,0),S=g.map(([x,k])=>`${x}: ${k}`).join(", ");console.log(b.dim(`i ${m}${y} suppressed (${S})`));}},buffer(){return i},bufferClear(){i.length=0;}};return h}var P="Use CodeableReference which is not provided by FHIR R4.",He="Use Availability which is not provided by FHIR R4.",_={"hl7.fhir.uv.extensions.r4":{"http://hl7.org/fhir/StructureDefinition/extended-contact-availability":He,"http://hl7.org/fhir/StructureDefinition/immunization-procedure":P,"http://hl7.org/fhir/StructureDefinition/specimen-additive":P,"http://hl7.org/fhir/StructureDefinition/workflow-barrier":P,"http://hl7.org/fhir/StructureDefinition/workflow-protectiveFactor":P,"http://hl7.org/fhir/StructureDefinition/workflow-reason":P},"hl7.fhir.r5.core#5.0.0":{"http://hl7.org/fhir/StructureDefinition/shareablecodesystem":"FIXME: CodeSystem.concept.concept defined by ElementReference. FHIR Schema generator output broken value in it, so we just skip it for now.","http://hl7.org/fhir/StructureDefinition/publishablecodesystem":"Uses R5-only base types not available in R4 generation."}};function T(e,n){let o=`${e.name}#${e.version}`,t=_[o]?.[n];if(t)return {shouldSkip:true,reason:t};let i=_[e.name]?.[n];return i?{shouldSkip:true,reason:i}:{shouldSkip:false}}var R=e=>`${e.name}#${e.version}`,ie=e=>`${e.name}@${e.version}`,oe=e=>{let n=JSON.stringify(e);return createHash("sha256").update(n).digest("hex").slice(0,16)},re=(e,n)=>{let o=e.derivation==="constraint"?"constraint":"specialization";return {...e,derivation:o,kind:e.kind,package_meta:e.package_meta||n,name:e.name,url:e.url,base:e.base}};var A=e=>e?.kind==="nested";var v=(...e)=>{let n=e.filter(t=>t!==void 0).flatMap(t=>t.map(i=>[i.url,i]));return n.length===0?void 0:Object.values(Object.fromEntries(n)).sort((t,i)=>t.url.localeCompare(i.url))};var ae=e=>[...e.valueFieldTypes??[],...e.profile?[e.profile]:[],...e.subExtensions?.flatMap(n=>n.valueFieldType?[n.valueFieldType]:[])??[]];var se=(e,n)=>{if(!e.url)throw new Error("ValueSet must have a URL");if(!e.name)throw new Error("ValueSet must have a name");return {...e,package_meta:e.package_meta||n,name:e.name,url:e.url}};function G(e){let n=e.split("|")[0];return n||e}function Ne(e){return e.split("|")[1]}var Le=e=>({package:e.package_meta.name,version:e.package_meta.version,name:e.name,url:e.url});function I(e){let n=Le(e);return e.derivation==="constraint"?{kind:"profile",...n}:e.kind==="primitive-type"?{kind:"primitive-type",...n}:e.kind==="complex-type"?{kind:"complex-type",...n}:e.kind==="resource"?{kind:"resource",...n}:e.kind==="logical"?{kind:"logical",...n}:{kind:"resource",...n}}var Ue=e=>{let n=e.split("/"),o=n[n.length-1];return o&&o.length>0?o.split(/[-_]/).map(t=>t.charAt(0).toUpperCase()+t.slice(1).toLowerCase()).join(""):e};function N(e,n,o){let t=G(o),i=Ue(t),r={package_meta:{name:"missing_valuesets",version:Ne(t)||"0.0.0"},id:o},a=e.resolveVs(n,t)||r,c=a?.id&&!/^[a-zA-Z0-9_-]{20,}$/.test(a.id)?a.id:i;return {kind:"value-set",package:a.package_meta.name,version:a.package_meta.version,name:c,url:t}}function L(e,n,o){let t=o.binding?.bindingName,i=n.join("."),[r,a,c]=t?[{name:"shared",version:"1.0.0"},t,`urn:fhir:binding:${t}`]:[e.package_meta,`${e.name}.${i}_binding`,`${e.url}#${i}_binding`];return {kind:"binding",package:r.name,version:r.version,name:a,url:c}}function z(e,n,o,t){let i=G(o)||o,r=e.resolveVs(n,i);if(r)return $e(e,r)}function $e(e,n,o){if(n.expansion?.contains)return n.expansion.contains.filter(i=>i.code!==void 0).map(i=>(Ce(i.code),{code:i.code,display:i.display,system:i.system}));let t=[];if(n.compose?.include){for(let i of n.compose.include)if(i.concept)for(let r of i.concept)t.push({system:i.system,code:r.code,display:r.display});else if(i.system&&!i.filter)try{let r=e.resolveAny(i.system);if(r?.concept){let a=(c,l)=>{for(let s of c)t.push({system:l,code:s.code,display:s.display}),s.concept&&a(s.concept,l);};a(r.concept,i.system);}}catch{}}return t.length>0?t:void 0}var ce=100,W=new Set(["code","Coding","CodeableConcept","CodeableReference","Quantity","string","uri","Duration"]);function q(e,n,o,t){if(!o.binding)return;let i=o.binding.strength,r=o.binding.valueSet;if(!r)return;if(!W.has(o.type??"")){t?.dryWarn("#binding",`eld-11: Binding on non-bindable type '${o.type}' (valueSet: ${r})`);return}if(!(i==="required"||i==="extensible"||i==="preferred"))return;let c=z(e,n.package_meta,r);if(!c||c.length===0)return;let l=c.map(s=>s.code).filter(s=>s&&typeof s=="string"&&s.trim().length>0);if(l.length>ce){t?.dryWarn("#largeValueSet",`Value set ${r} has ${l.length} which is more than ${ce} codes, which may cause issues with code generation.`);return}if(l.length!==0)return {isOpen:i!=="required",values:l}}function Ve(e,n,o,t,i){if(!t.binding?.valueSet)return;let r=L(n,o,t),a=N(e,n.package_meta,t.binding.valueSet),c=q(e,n,t,i);return {identifier:r,valueset:a,strength:t.binding.strength,enum:c,dependencies:[a]}}function le(e,n,o){let t=new Set;if(!n.elements)return [];let i=[];function r(l,s){for(let[d,u]of Object.entries(l)){let h=[...s,d],p=h.join("."),m=e.resolveElementSnapshot(n,h);if(!t.has(p)){if(t.add(p),m.binding){let f=Ve(e,n,h,m,o);f&&i.push(f);}u.elements&&r(u.elements,h);}}}r(n.elements,[]),i.sort((l,s)=>l.identifier.name.localeCompare(s.identifier.name));let a=[],c=new Set;for(let l of i)c.has(l.identifier.url)||(c.add(l.identifier.url),a.push(l));return a}var K=e=>e!==null&&typeof e=="object"&&e.resourceType==="CodeSystem";var U=e=>e!==null&&typeof e=="object"&&e.resourceType==="ValueSet";var je=async(e,n)=>{let o=await e.packageJson(n.name);if(!o)return [];let t=o.dependencies;return t!==void 0?Object.entries(t).map(([i,r])=>({name:i,version:r})):[]},de=e=>({pkg:e,canonicalResolution:{},fhirSchemas:{},valueSets:{}}),me=async(e,n,o,t,i)=>{let r=R(n);if(i?.info(`${" ".repeat(o*2)}+ ${r}`),t[r])return t[r];let a=de(n);for(let l of await e.search({package:n})){let s=l.url;if(!s||!(isStructureDefinition(l)||U(l)||K(l)))continue;let d=s;a.canonicalResolution[d]&&i?.dryWarn("#duplicateCanonical",`Duplicate canonical URL: ${d} at ${r}.`),a.canonicalResolution[d]=[{deep:o,pkg:n,pkgId:r,resource:l}];}let c=await je(e,n);for(let l of c){let{canonicalResolution:s}=await me(e,l,o+1,t,i);for(let[d,u]of Object.entries(s)){let h=d;a.canonicalResolution[h]=[...a.canonicalResolution[h]||[],...u];}}for(let l of Object.values(a.canonicalResolution))l.sort((s,d)=>s.deep-d.deep);return t[r]=a,a},Oe=(e,n)=>{for(let{pkg:o,canonicalResolution:t}of Object.values(e)){let i=R(o);if(!e[i])throw new Error(`Package ${i} not found`);let r=0;n?.info(`FHIR Schema conversion for '${R(o)}' begins...`);for(let[a,c]of Object.entries(t)){let l=c[0];if(!l)throw new Error("Resource not found");let s=l.resource,d=l.pkg;if(isStructureDefinition(s)){let u=pe.translate(s),h=re(u,d);r++,e[i].fhirSchemas[h.url]=h;}if(U(s)){let u=se(s,d);e[i].valueSets[u.url]=u;}}n?.info(`FHIR Schema conversion for '${R(o)}' completed: ${r} successful`);}},Me=(e,n,o)=>{let t=Object.values(e).flatMap(i=>i.canonicalResolution[n]);if(!t)throw new Error(`No canonical resolution found for ${n} in any package`);return t[0]?.resource},_e=async(e,{logger:n,focusedPackages:o})=>{let t=o??await e.packages(),i={};for(let p of t)await me(e,p,0,i,n);Oe(i,n);let r=(p,m)=>{let f=i[R(p)];if(f){let g=f.canonicalResolution[m]?.[0];if(g)return i[g.pkgId]?.fhirSchemas[m]}for(let g of Object.values(i)){let y=g.fhirSchemas[m];if(y&&y.package_meta.name===p.name)return y}for(let g of Object.values(i)){let y=g.fhirSchemas[m];if(y)return y}},a=(p,m)=>{let f=i[R(p)];if(f){let g=f.canonicalResolution[m]?.[0];if(g)return i[g.pkgId]?.valueSets[m]}for(let g of Object.values(i)){let y=g.valueSets[m];if(y&&y.package_meta.name===p.name)return y}for(let g of Object.values(i)){let y=g.valueSets[m];if(y)return y}},c=p=>(p.includes("|")&&(p=p.split("|")[0]),p.match(/^[a-zA-Z0-9]+$/)?`http://hl7.org/fhir/StructureDefinition/${p}`:p),l=(p,m)=>{let f=r(p,m);if(f===void 0)throw new Error(`Failed to resolve FHIR Schema: '${m}'`);let g=[f];for(;f?.base;){let y=f.package_meta,S=c(f.base);if(f=r(y,S),f===void 0)throw new Error(`Failed to resolve FHIR Schema base for '${m}'. Problem: '${S}' from '${R(y)}'`);g.push(f);}return g},s=(p,m)=>l(p,m).filter(f=>f.derivation==="specialization"),d=(p,m)=>{let f=l(p.package_meta,p.url),g=$(f,m);return J(g)},u=p=>{let m=new Set;for(let[f,g]of Object.entries(p)){m.add(f);for(let y of g?.choices||[])p[y]||m.add(y);}return Array.from(m)},h;return {testAppendFs(p){let m=R(p.package_meta);i[m]||(i[m]=de(p.package_meta)),i[m].fhirSchemas[p.url]=p,h=void 0;},resolveFs:r,resolveFsGenealogy:l,resolveFsSpecializations:s,ensureSpecializationCanonicalUrl:c,resolveSd:(p,m)=>{let f=i[R(p)]?.canonicalResolution[m]?.[0]?.resource;if(isStructureDefinition(f))return f},allSd:()=>Object.values(i).flatMap(p=>Object.values(p.canonicalResolution).flatMap(m=>m.map(f=>{let g=f.resource;return g.package_name?g:{...g,package_name:p.pkg.name,package_version:p.pkg.version}}))).filter(p=>isStructureDefinition(p)).sort((p,m)=>p.url.localeCompare(m.url)),allFs:()=>Object.values(i).flatMap(p=>Object.values(p.fhirSchemas)),allVs:()=>Object.values(i).flatMap(p=>Object.values(p.valueSets)),resolveVs:a,resolveAny:p=>Me(i,p),resolveElementSnapshot:d,getAllElementKeys:u,resolver:i,resolutionTree:()=>{if(h)return h;let p={};for(let[m,f]of Object.entries(i)){let g=f.pkg.name;p[g]={};for(let[y,S]of Object.entries(f.canonicalResolution)){let x=y;p[g][x]=[];for(let k of S)p[g][x].push({deep:k.deep,pkg:k.pkg});}}return h=p,p}}},ue=async(e,n)=>{let o=e.map(ie);n?.logger?.info(`Loading FHIR packages: ${o.join(", ")}`);let t=CanonicalManager({packages:o,workingDir:".codegen-cache/canonical-manager-cache",registry:n.registry||void 0});return await t.init(),await _e(t,{...n,focusedPackages:e})},$=(e,n)=>{let[o,...t]=n;return o===void 0?[]:e.map(i=>{if(!i.elements)return;let r=i.elements?.[o];for(let a of t)r=r?.elements?.[a];return r}).filter(i=>i!==void 0)};function J(e){let n=e.reverse(),o=Object.assign({},...n);return o.elements=void 0,o}var fe=(e,n,o)=>{let t=e.resolveFsSpecializations(n.package_meta,n.url),i=$(t,o),r=J(i).type,a;if(r){let c=e.ensureSpecializationCanonicalUrl(r),s=e.resolveFsGenealogy(n.package_meta,c).flatMap(d=>Object.keys(d.elements??{}));s.length>0&&(a=new Set(s));}for(let c of i)if(!(!c.elements||Object.keys(c.elements).length===0)&&!(a&&!Object.keys(c.elements).some(l=>!a.has(l))))return true;return false},Y=(e,n,o,t,i)=>t.type==="BackboneElement"?true:!i?.elements||i.choiceOf!==void 0?false:fe(e,n,o),Ae=e=>e.elements?new Set(Z(e,[],e.elements).filter(([n,o])=>o.elements&&Object.keys(o.elements).length>0).map(([n])=>n.join("."))):new Set;function V(e,n,o){let t={},i=n.derivation==="constraint"?e.resolveFsSpecializations(n.package_meta,n.url):e.resolveFsGenealogy(n.package_meta,n.url);for(let d of [...i].reverse()){let u=Ae(d);for(let h of u)t[h]=`${d.url}#${h}`;}let r=o.join("."),a=t[r]??`${n.url}#${r}`,c=a.split("#")[0],s=e.resolveFs(n.package_meta,c)?.package_meta??n.package_meta;return {kind:"nested",package:s.name,version:s.version,name:r,url:a}}function Z(e,n,o){let t=[];for(let[i,r]of Object.entries(o)){let a=[...n,i];r.elements&&r.choiceOf===void 0&&t.push([a,r]),r.elements&&t.push(...Z(e,a,r.elements));}return t}function Ge(e,n,o,t,i){let r={},a=e.resolveFsGenealogy(n.package_meta,n.url),c=$(a,o),l=new Set;for(let s of c)if(s.elements)for(let d of Object.keys(s.elements))l.add(d);for(let s of l){let d=[...o,s],u=e.resolveElementSnapshot(n,d);Y(e,n,d,u,t[s])?r[s]=j(e,n,d,u):r[s]=B(e,n,d,u,i);}return r}function ge(e,n,o){if(!n.elements)return;let t=Z(n,[],n.elements).filter(([r,a])=>!a.elements||Object.keys(a.elements).length===0?false:a.type!=="BackboneElement"?fe(e,n,r):true),i=[];for(let[r,a]of t){let c=V(e,n,r),l;a.type==="BackboneElement"||!a.type?l="BackboneElement":l=a.type;let s=e.ensureSpecializationCanonicalUrl(l),d=e.resolveFs(n.package_meta,s);if(!d)throw new Error(`Could not resolve base type ${l}`);let u={kind:"complex-type",package:d.package_meta.name,version:d.package_meta.version,name:l,url:s},h=Ge(e,n,r,a.elements??{},o),p={identifier:c,base:u,fields:h};i.push(p);}return i.sort((r,a)=>r.identifier.url.localeCompare(a.identifier.url)),i.length===0?void 0:i}function ye(e){let n=[];for(let o of e){o.base&&n.push(o.base);for(let t of Object.values(o.fields||{}))"type"in t&&t.type&&n.push(t.type),"binding"in t&&t.binding&&n.push(t.binding);}return n}function he(e,n,o){let t=o[o.length-1];if(!t)throw new Error(`Internal error: fieldName is missing for path ${o.join("/")}`);let i=o.slice(0,-1),r=e.resolveFsGenealogy(n.package_meta,n.url).flatMap(a=>{if(i.length===0)return a.required||[];if(!a.elements)return [];let c=a;for(let l of i)c=c?.elements?.[l];return c?.required||[]});return new Set(r).has(t)}function Se(e,n,o){let t=o[o.length-1];if(!t)throw new Error(`Internal error: fieldName is missing for path ${o.join("/")}`);let i=o.slice(0,-1),r=e.resolveFsGenealogy(n.package_meta,n.url).flatMap(a=>{if(i.length===0)return a.excluded||[];if(!a.elements)return [];let c=a;for(let l of i)c=c?.elements?.[l];return c?.excluded||[]});return new Set(r).has(t)}var ze=(e,n,o)=>{if(o.refers)return o.refers.map(t=>{let i=e.ensureSpecializationCanonicalUrl(t),r=e.resolveFs(n.package_meta,i);if(!r)throw new Error(`Failed to resolve fs for ${i}`);return I(r)})},We=e=>{let n=new Set,o=new Set;if(e.required)for(let i of e.required)n.add(i);if(e.excluded)for(let i of e.excluded)o.add(i);if(e.elements)for(let[i,r]of Object.entries(e.elements))r.min!==void 0&&r.min>0&&n.add(i);let t=e.elements?Object.keys(e.elements):void 0;return {required:n.size>0?Array.from(n):void 0,excluded:o.size>0?Array.from(o):void 0,elements:t&&t.length>0?t:void 0}},qe=e=>!e||typeof e=="object"&&Object.keys(e).length===0,O=(e,n,o)=>{let t=e;for(let r=0;r<n.length-1;r++){let a=n[r];(!t[a]||typeof t[a]!="object")&&(t[a]={}),t=t[a];}let i=n[n.length-1];t[i]=o;},Ke=(e,n)=>{let o=e;for(let t of n)if(o&&typeof o=="object"&&!Array.isArray(o))o=o[t];else return;return o},Re=(e,n,o,t)=>{if(o>=n.length||!e.elements)return;let i=n[o],r=e.elements[i];if(r){if(o===n.length-1&&r.fixed?.value!==void 0){O(t,n,r.fixed.value);return}if(r.slicing?.slices){let a=n.slice(o+1);for(let c of Object.values(r.slicing.slices)){if(!c.min||c.min<1||!c.match||typeof c.match!="object")continue;let l=c.match;if(Object.keys(l).length!==0)if(a.length>0){let s=Ke(l,a);s!==void 0&&O(t,n,s);}else O(t,n.slice(0,o+1),l);}return}Re(r,n,o+1,t);}},Je=(e,n,o)=>{if(e==="$this")return;let t=e.split("."),i=n;for(let a of t)if(i=i?.elements?.[a],!i)return;let r=i.type;!r||r.includes("/")||O(o,t,{resourceType:r});},Ye=(e,n)=>{if(!n||!e||e.length===0)return;let o={};for(let t of e)if(t.type==="type")Je(t.path,n,o);else {if(!n.elements)continue;let i=t.path.split(".");Re(n,i,0,o);}return Object.keys(o).length>0?o:void 0},xe=e=>{let n=e.slicing;if(!n)return;let o={};for(let[t,i]of Object.entries(n.slices??{})){if(!i)continue;let{required:r,excluded:a,elements:c}=i.schema?We(i.schema):{};o[t]={min:i.min,max:i.max,match:qe(i.match)?Ye(n.discriminator??[],i.schema):i.match,required:r,excluded:a,elements:c};}return {discriminator:n.discriminator??[],rules:n.rules,ordered:n.ordered,slices:Object.keys(o).length>0?o:void 0}};function E(e,n,o,t,i){if(t.elementReference){let r=t.elementReference.slice(1).filter((a,c)=>c%2===1);return V(e,n,r)}else if(t.type){let r=e.ensureSpecializationCanonicalUrl(t.type),a=e.resolveFs(n.package_meta,r);if(!a)throw new Error(`Could not resolve field type: <${n.url}>.${o.join(".")}: <${t.type}> (pkg: '${R(n.package_meta)}'))`);return I(a)}else {if(t.choices)return;if(n.derivation==="constraint")return;i?.dryWarn("#fieldTypeNotFound",`Can't recognize element type: <${n.url}>.${o.join(".")} (pkg: '${R(n.package_meta)}'): missing type info`);return}}var B=(e,n,o,t,i,r)=>{let a,c;t.binding&&(a=L(n,o,t),W.has(t.type??"")&&(c=q(e,n,t,i)));let l=E(e,n,o,t,i);l||i?.dryWarn("#fieldTypeNotFound",`Field type not found for '${n.url}#${o.join(".")}' (${n.derivation})`);let s;t.pattern?s={kind:"pattern",type:t.pattern.type,value:t.pattern.value}:t.fixed&&(s={kind:"fixed",type:t.fixed.type,value:t.fixed.value});let d=r??t;if(!s&&d.elements?.coding?.slicing?.slices){let u=d.elements.coding.slicing.slices,h=Object.values(u);if(h.length>0&&h.every(m=>m.min!==void 0&&m.min>=1&&m.match&&typeof m.match=="object"&&Object.keys(m.match).length>0)){let m=h.map(f=>f.match);s={kind:"fixed",type:"CodeableConcept",value:{coding:m.length===1?[m[0]]:m}};}}return {type:l,required:he(e,n,o),excluded:Se(e,n,o),reference:ze(e,n,t),array:t.array||false,min:t.min,max:t.max,slicing:xe(t),choices:t.choices,choiceOf:t.choiceOf,binding:a,enum:c,valueConstraint:s,mustSupport:t.mustSupport}};function j(e,n,o,t){return {type:V(e,n,o),array:t.array||false,required:he(e,n,o),excluded:Se(e,n,o),slicing:xe(t)}}var Ze=(e,n,o,t)=>{let i=e.resolveFs(n.package_meta,o);if(!i?.elements)return;let r=[];for(let[a,c]of Object.entries(i.elements)){if(c.choiceOf!=="value"&&!a.startsWith("value"))continue;let l=E(e,i,[a],c,t);l&&r.push(l);}return v(r)},Qe=(e,n,o)=>{let t=[];if(!n.elements)return t;for(let[i,r]of Object.entries(n.elements)){if(!i.startsWith("extension:"))continue;let a=i.split(":")[1];if(!a)continue;let c;for(let[l,s]of Object.entries(r.elements??{}))if(!(s.choiceOf!=="value"&&!l.startsWith("value"))&&(c=E(e,n,[i,l],s,o),c))break;t.push({name:a,url:r.url??a,valueFieldType:c,min:r.min,max:r.max!==void 0?String(r.max):void 0});}return t},Xe=(e,n,o)=>{let t=[],r=n.elements?.extension?.slicing?.slices;if(!r||typeof r!="object")return t;for(let[a,c]of Object.entries(r)){let l=c,s=l.schema;if(!s)continue;let d;for(let[u,h]of Object.entries(s.elements??{})){let p=h;if(!(p.choiceOf!=="value"&&!u.startsWith("value"))&&(d=E(e,n,[u],p,o),d))break}t.push({name:a,url:l.match?.url??a,valueFieldType:d,min:s._required?1:s.min??0,max:s.max!==void 0?String(s.max):s.array?"*":"1"});}return t},en=(e,n,o,t)=>{let i=e.resolveFs(n.package_meta,o);if(!i?.elements)return;let r=Qe(e,i,t),a=Xe(e,i,t),c=[...r,...a];return c.length>0?c:void 0},ke=(e,n,o)=>{let t=[],i=(l,s,d)=>{let u=d.url,h=u?Ze(e,n,u,o):void 0,p=u?en(e,n,u,o):void 0;if(!u){let y=n.elements?.extension?.slicing?.slices?.[s]?.schema;if(y){u=y.elements?.url?.fixed?.value??s;for(let[S,x]of Object.entries(y.elements??{})){let k=x;if(k.choiceOf==="value"||S.startsWith("value")){let D=E(e,n,[S],k,o);if(D){h=[D];break}}}}}let m=p&&p.length>0,f=u?e.resolveFs(n.package_meta,u):void 0,g=f?I(f):void 0;t.push({name:s,path:[...l,"extension"].join("."),url:u,profile:g,min:d.min,max:d.max!==void 0?String(d.max):void 0,mustSupport:d.mustSupport,valueFieldTypes:h,subExtensions:p,isComplex:m});},r=(l,s)=>{if(s.extensions)for(let[d,u]of Object.entries(s.extensions))i(l,d,u);if(s.elements)for(let[d,u]of Object.entries(s.elements))r([...l,d],u);};r([],n);let a=new Set,c=t.filter(l=>{let s=`${l.url}:${l.path}`;return a.has(s)?false:(a.add(s),true)});return c.length===0?void 0:c};function nn(e,n,o,t,i){if(!t)return;let r={};for(let a of e.getAllElementKeys(t)){let c=[...o,a],l=e.resolveElementSnapshot(n,c),s=l.type?e.ensureSpecializationCanonicalUrl(l.type):void 0;if(s&&T(n.package_meta,s).shouldSkip){i?.warn("#skipCanonical",`Skipping field ${c} for ${s} due to skip hack ${T(n.package_meta,s).reason}`);continue}Y(e,n,c,l,t[a])?r[a]=j(e,n,c,l):r[a]=B(e,n,c,l,i,t[a]);}return r}function tn(e){let n=[];for(let o of Object.values(e))"type"in o&&o.type&&n.push(o.type),"binding"in o&&o.binding&&n.push(o.binding);return n}async function be(e,n,o){if(!n.url)throw new Error("ValueSet URL is required");let t=N(e,n.package_meta,n.url),i=z(e,n.package_meta,n.url);return {identifier:t,description:n.description,concept:i,compose:i?void 0:n.compose}}var Fe=(e,n,o)=>{let t=[];return e&&t.push(e),n&&t.push(...tn(n)),o&&t.push(...ye(o)),t},Ie=(e,n,o,t)=>{let r=Fe(n,o,t).filter(a=>!(a.url===e.url||A(a)));return v(r)},on=(e,n,o,t)=>{let r=Fe(n,o,t).filter(a=>a.url!==e.url);return v(r)};function Te(e,n,o){let t;if(n.base){let s=e.resolveFs(n.package_meta,e.ensureSpecializationCanonicalUrl(n.base));if(!s)throw new Error(`Base resource not found '${n.base}' for <${n.url}> from ${R(n.package_meta)}`);let d=I(s);Ce(!A(d),`Unexpected nested base for ${n.url}`),t=d;}let i=nn(e,n,[],n.elements,o),r=ge(e,n,o),a=le(e,n,o);if(n.derivation==="constraint"){let s=I(n);if(!t)throw new Error(`Profile ${n.url} must have a base type`);let d=ke(e,n,o),u=d?.flatMap(ae),h=on(s,t,i,r);return [{identifier:s,base:t,fields:i,nested:r,description:n.description,dependencies:v(h,u),extensions:d},...a]}if(n.kind==="primitive-type"){let s=I(n);return Ce(t,`Primitive type ${n.url} must have a base type`),[{identifier:s,description:n.description,base:t,dependencies:Ie(s,t,i,r)},...a]}let c=I(n);return [{identifier:c,base:t,fields:i,nested:r,description:n.description,dependencies:Ie(c,t,i,r),typeFamily:void 0},...a]}var rn=(e,n,o)=>{let t={};for(let a of e){let c=`${a.schema.identifier.url}|${a.schema.identifier.package}`,l=oe(a.schema);t[c]??={},t[c][l]??={typeSchema:a.schema,sources:[]},t[c][l].sources.push(a);}let i=[],r={};for(let a of Object.values(t)){let c=Object.values(a).sort((s,d)=>d.sources.length-s.sources.length),l=c[0];if(l)if(c.length>1){let s=l.typeSchema.identifier.url,d=l.typeSchema.identifier.package;o?.dryWarn("#duplicateSchema",`'${s}' from '${d}' has ${c.length} versions`),i.push(l.typeSchema);r[d]??={},r[d][s]=c.flatMap(h=>h.sources.map(p=>({typeSchema:h.typeSchema,sourcePackage:p.sourcePackage,sourceCanonical:p.sourceCanonical})));}else i.push(l.typeSchema);}return {schemas:i,collisions:r}},ve=async(e,n,o)=>{let t=[];for(let i of e.allFs()){let r=R(i.package_meta),a=T(i.package_meta,i.url);if(a.shouldSkip){o?.dryWarn("#skipCanonical",`Skip ${i.url} from ${r}. Reason: ${a.reason}`);continue}for(let c of Te(e,i,o))t.push({schema:c,sourcePackage:r,sourceCanonical:i.url});}for(let i of e.allVs())t.push({schema:await be(e,i),sourcePackage:R(i.package_meta),sourceCanonical:i.url});return rn(t,n,o)};var Ee={command:"generate <packages..>",describe:"Generate TypeSchema files from FHIR packages",builder:{packages:{type:"string",array:true,demandOption:true,describe:"FHIR packages to process (e.g., hl7.fhir.r4.core@4.0.1)"},output:{alias:"o",type:"string",describe:"Output file or directory",default:"./schemas.ndjson"},format:{alias:"f",type:"string",choices:["ndjson","json"],default:"ndjson",describe:"Output format for TypeSchema files"},treeshake:{alias:"t",type:"string",array:true,describe:"Only generate TypeSchemas for specific ResourceTypes (treeshaking)"},singleFile:{alias:"s",type:"boolean",default:false,describe:"Generate single TypeSchema file instead of multiple files (NDJSON format)"},verbose:{alias:"v",type:"boolean",default:false,describe:"Enable verbose output"},registry:{alias:"r",type:"string",describe:"Custom FHIR package registry URL (default: https://fs.get-ig.org/pkgs/)"}},handler:async e=>{let n=C({prefix:"TypeSchema"});try{n.info("Generating TypeSchema from FHIR packages"),n.info(`Packages: ${e.packages.join(", ")}`),n.info(`Output: ${e.output}`);let o=e.singleFile?"ndjson":e.format;n.debug(`Format: ${o}${e.singleFile&&e.format==="json"?" (forced from json due to singleFile)":""}`),e.treeshake&&e.treeshake.length>0&&n.info(`Treeshaking enabled for ResourceTypes: ${e.treeshake.join(", ")}`),e.singleFile&&n.info("Single file output enabled (NDJSON format)"),e.registry&&n.info(`Using custom registry: ${e.registry}`);let t=Date.now(),i=e.packages.map(d=>{if(d.includes("@")){let u=d.lastIndexOf("@");return {name:d.slice(0,u),version:d.slice(u+1)||"latest"}}return {name:d,version:"latest"}});n.info(`Processing packages: ${i.map(d=>`${d.name}@${d.version}`).join(", ")}`);let r=await ue(i,{logger:n,registry:e.registry,focusedPackages:i}),{schemas:a}=await ve(r,void 0,n);if(a.length===0)throw new Error("No schemas were generated from the specified packages");let c=e.output;if(!c)throw new Error("Output format not specified");await mkdir(dirname(c),{recursive:!0});let l;o==="json"?l=JSON.stringify(a,null,2):l=a.map(d=>JSON.stringify(d)).join(`
|
|
3
|
+
`),await writeFile(c,l,"utf-8");let s=Date.now()-t;if(ne(`Generated ${a.length} TypeSchema definitions`,s,{schemas:a.length}),n.info(`Output: ${c}`),e.verbose){n.debug("Generated schemas:");let d=a.map(u=>`${u.identifier?.name||"Unknown"} (${u.identifier?.kind||"unknown"})`);F(d);}}catch(o){n.error(`Failed to generate TypeSchema: ${o instanceof Error?o.message:String(o)}`),process.exit(1);}}};var Q=C({prefix:"typeschema"}),De={command:"typeschema [subcommand]",describe:"TypeSchema operations - generate, validate and merge schemas",builder:e=>e.command(Ee).help().example("$0 typeschema generate hl7.fhir.r4.core@4.0.1","Generate TypeSchema from FHIR R4 core package"),handler:e=>{if(!e.subcommand&&e._.length===1){Q.info("Available typeschema subcommands:"),F(["generate Generate TypeSchema files from FHIR packages"]),console.log(`
|
|
4
4
|
Use 'atomic-codegen typeschema <subcommand> --help' for more information about a subcommand.`),console.log(`
|
|
5
|
-
Examples:`),
|
|
6
|
-
Use 'atomic-codegen typeschema <subcommand> --help' for more information about a subcommand.`),process.exit(1));}};var
|
|
5
|
+
Examples:`),F(["atomic-codegen typeschema generate hl7.fhir.r4.core@4.0.1 -o schemas.ndjson","atomic-codegen typeschema validate schemas.ndjson","atomic-codegen typeschema merge schema1.ndjson schema2.ndjson -o merged.ndjson"]);return}e.subcommand&&!["generate","validate","merge"].includes(e.subcommand)&&(Q.error(`Unknown typeschema subcommand: ${e.subcommand}`),Q.info("Available typeschema subcommands:"),F(["generate Generate TypeSchema files from FHIR packages","validate Validate TypeSchema files for correctness and consistency","merge Merge multiple TypeSchema files into a single file"]),console.log(`
|
|
6
|
+
Use 'atomic-codegen typeschema <subcommand> --help' for more information about a subcommand.`),process.exit(1));}};var M=C({prefix:"cli"});async function dn(e){let n=e.logLevel??(e.debug||e.verbose?"DEBUG":"INFO");M=C({prefix:"cli",level:n});}function mn(){return ln(hideBin(process.argv)).scriptName("atomic-codegen").usage("$0 <command> [options]").middleware(dn).command(De).option("verbose",{alias:"v",type:"boolean",description:"Enable verbose output",default:false,global:true}).option("debug",{alias:"d",type:"boolean",description:"Enable debug output with detailed logging",default:false,global:true}).option("log-level",{alias:"l",type:"string",choices:["DEBUG","INFO","WARN","ERROR","SILENT"],description:"Set the log level (default: INFO)",global:true}).demandCommand(0).middleware(e=>{e._.length===0&&(ee("Welcome to Atomic Codegen!"),console.log("Available commands:"),console.log(" typeschema Generate, validate and merge TypeSchema files"),console.log(`
|
|
7
7
|
Use 'atomic-codegen <command> --help' for more information about a command.`),console.log(`
|
|
8
8
|
Quick examples:`),console.log(" atomic-codegen typeschema generate hl7.fhir.r4.core@4.0.1 -o schemas.ndjson"),console.log(`
|
|
9
|
-
Use 'atomic-codegen --help' to see all options.`),process.exit(0));}).help().version("0.1.0").example("$0 typeschema generate hl7.fhir.r4.core@4.0.1 -o schemas.ndjson","Generate TypeSchemas from FHIR package").fail((e,n,
|
|
9
|
+
Use 'atomic-codegen --help' to see all options.`),process.exit(0));}).help().version("0.1.0").example("$0 typeschema generate hl7.fhir.r4.core@4.0.1 -o schemas.ndjson","Generate TypeSchemas from FHIR package").fail((e,n,o)=>{M.error(n?n.message:e),M.error("Use --help for usage information"),process.exit(1);}).wrap(Math.min(120,process.stdout.columns||80))}async function X(){await mn().parseAsync();}import.meta.main&&X().catch(e=>{M.error(String(e)),process.exit(1);});X().catch(e=>{console.error("CLI Error:",e instanceof Error?e.message:e),process.exit(1);});
|