@atomic-ehr/codegen 0.0.2-canary.20251117160031.1d3302d → 0.0.2-canary.20251119090005.cdde040

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/dist/cli/index.js CHANGED
@@ -11,14 +11,14 @@ import Ei from'yargs';import {hideBin}from'yargs/helpers';import'perf_hooks';imp
11
11
  `).replace(/\n{3,}/g,`
12
12
 
13
13
  `).trim()}
14
- `}generateSimpleExports(e){e.push("// Exports");let t=Array.from(this.exports.entries());this.sortFunction?t=t.sort(this.sortFunction):t=t.sort(([i],[s])=>i.localeCompare(s));let r=new Map;for(let[i,s]of t)r.has(s)||r.set(s,[]),r.get(s)?.push(i);for(let[i,s]of r){let o=s.sort();o.length===1?e.push(`export type { ${o[0]} } from './${i}';`):o.length<=3?e.push(`export type { ${o.join(", ")} } from './${i}';`):(e.push("export type {"),o.forEach((a,c)=>{let l=c===o.length-1;e.push(` ${a}${l?"":","}`);}),e.push(`} from './${i}';`));}}generateGroupedExports(e){if(!this.groupingFunction)return;let t=new Map;for(let[i,s]of this.exports){let o=this.groupingFunction(i);t.has(o)||t.set(o,new Map);let a=t.get(o);a.has(s)||a.set(s,[]),a.get(s)?.push(i);}let r=Array.from(t.entries()).sort();for(let[i,s]of r){e.push(`// ${i}`);for(let[o,a]of s){let c=a.sort();c.length===1?e.push(`export type { ${c[0]} } from './${o}';`):e.push(`export type { ${c.join(", ")} } from './${o}';`);}e.push("");}}getExports(){return new Map(this.exports)}getNamespaces(){return new Map(this.namespaces)}getReExports(){return new Map(this.reExports)}};});var _=class n{options;dryWarnSet=new Set;constructor(e={}){this.options={timestamp:false,verbose:false,...e};}static consoleLevelsMap={1:console.log,2:console.warn,3:console.error,0:console.log,4:()=>{}};formatMessage(e,t,r){let i=this.options.timestamp?`${b.gray(new Date().toLocaleTimeString())} `:"",s=this.options.prefix?`${b.cyan(`[${this.options.prefix}]`)} `:"";return `${i}${r(e)} ${s}${t}`}isSuppressed(e){return this.options.suppressLoggingLevel==="all"||this.options.suppressLoggingLevel?.includes(e)||false}tryWriteToConsole(e,t){if(this.isSuppressed(e))return;(n.consoleLevelsMap[e]||console.log)(t);}success(e){this.tryWriteToConsole(1,this.formatMessage("",e,b.green));}error(e,t){this.isSuppressed(3)||(console.error(this.formatMessage("X",e,b.red)),t&&this.options.verbose&&(console.error(b.red(` ${t.message}`)),t.stack&&console.error(b.gray(t.stack))));}warn(e){this.tryWriteToConsole(2,this.formatMessage("!",e,b.yellow));}dry_warn(e){this.dryWarnSet.has(e)||(this.warn(e),this.dryWarnSet.add(e));}info(e){this.tryWriteToConsole(1,this.formatMessage("i",e,b.blue));}debug(e){this.options.verbose&&this.tryWriteToConsole(0,this.formatMessage("\u{1F41B}",e,b.magenta));}step(e){this.tryWriteToConsole(1,this.formatMessage("\u{1F680}",e,b.cyan));}progress(e){this.tryWriteToConsole(1,this.formatMessage("\u23F3",e,b.blue));}plain(e,t=r=>r){let r=this.options.timestamp?`${b.gray(new Date().toLocaleTimeString())} `:"",i=this.options.prefix?`${b.cyan(`[${this.options.prefix}]`)} `:"";this.tryWriteToConsole(1,`${r}${i}${t(e)}`);}dim(e){this.plain(e,b.gray);}child(e){return new n({...this.options,prefix:this.options.prefix?`${this.options.prefix}:${e}`:e})}configure(e){this.options={...this.options,...e};}},A=new _;function pe(n){A.success(n);}function C(n,e){A.error(n,e);}function Ge(n){A.warn(n);}function ue(n){A.info(n);}function Ue(n){A.step(n);}function Tt(n){A.dim(n);}function He(n){A.configure(n);}function I(n={}){return new _(n)}function _e(n){console.log(),console.log(b.cyan(b.bold(`\u2501\u2501\u2501 ${n} \u2501\u2501\u2501`)));}function ze(n,e,t){let r=n;e&&(r+=` ${b.gray(`(${e}ms)`)}`),pe(r),t&&Object.entries(t).forEach(([i,s])=>{Tt(` ${i}: ${s}`);});}function j(n,e="\u2022"){n.forEach(t=>{console.log(b.gray(` ${e} ${t}`));});}var ge=(n,e=true)=>{let t=n.split("/").pop();if(t&&(e&&t.includes("#")&&(t=t.split("#")[0]),!!t))return /^\d/.test(t)&&(t=`number_${t}`),t},S=n=>`${n.name}#${n.version}`,qe=n=>`${n.name}@${n.version}`;var We=(n,e)=>(e||(e={name:"undefined",version:"undefined"}),{...n,package_meta:n.package_meta||e,name:n.name,url:n.url,base:n.base}),Je=n=>n?.kind==="primitive-type",N=n=>n?.kind==="nested",xt=n=>n?.kind==="profile";var z=n=>n?.identifier.kind==="resource"||n?.identifier.kind==="complex-type"||n?.identifier.kind==="logical",wt=n=>n?.identifier.kind==="complex-type",P=n=>n?.identifier.kind==="resource",kt=n=>n?.identifier.kind==="primitive-type",Ct=n=>n?.identifier.kind==="logical",de=n=>n?.identifier.kind==="profile";function Z(n){return n?.identifier.kind==="binding"}function Ft(n){return n?.identifier.kind==="value-set"}var X=n=>n?n.choices===void 0:false,q=n=>n?n.choices!==void 0:false,Ke=n=>n?.resourceType==="ValueSet",$t=n=>n?.resourceType==="CodeSystem",Rt=(n,e)=>{if(!n.url)throw new Error("ValueSet must have a URL");if(!n.name)throw new Error("ValueSet must have a name");return {...n,package_meta:n.package_meta||e,name:n.name,url:n.url}};function Ye(n){let e=n.split("|")[0];return e||n}function $r(n){return n.split("|")[1]}function Rr(n){return n.derivation==="constraint"?"profile":n.kind==="primitive-type"?"primitive-type":n.kind==="complex-type"?"complex-type":(n.kind==="resource","resource")}function V(n){return {kind:Rr(n),package:n.package_meta.name,version:n.package_meta.version,name:n.name,url:n.url}}var Ir=n=>{let e=n.split("/"),t=e[e.length-1];return t&&t.length>0?t.split(/[-_]/).map(r=>r.charAt(0).toUpperCase()+r.slice(1).toLowerCase()).join(""):n};function fe(n,e,t){let r=Ye(t),i=Ir(r),s={package_meta:{name:"missing_valuesets",version:$r(r)||"0.0.0"},id:t},o=n.resolveVs(e,r)||s,a=o?.id&&!/^[a-zA-Z0-9_-]{20,}$/.test(o.id)?o.id:i;return {kind:"value-set",package:o.package_meta.name,version:o.package_meta.version,name:a,url:r}}function he(n,e,t){let r=e.join("."),[i,s,o]=t?[{name:"shared",version:"1.0.0"},t,`urn:fhir:binding:${t}`]:[n.package_meta,`${n.name}.${r}_binding`,`${n.url}#${r}_binding`];return {kind:"binding",package:i.name,version:i.version,name:s,url:o}}function me(n,e,t,r){let i={};if(e.derivation==="constraint"){let c=n.resolveFsSpecializations(e.package_meta,e.url).map(l=>Ze(n,l,r)).filter(l=>l!==void 0).flat();for(let l of c.reverse())i[l.identifier.name]=l.identifier.url;}let s=t.join("."),o=i[s]??`${e.url}#${s}`;return {kind:"nested",package:e.package_meta.name,version:e.package_meta.version,name:s,url:o}}function It(n,e,t){let r=[];for(let[i,s]of Object.entries(t)){let o=[...e,i];Q(s)&&r.push([o,s]),s.elements&&r.push(...It(n,o,s.elements));}return r}function Er(n,e,t,r,i){let s={};for(let[o,a]of Object.entries(r)){let c=[...t,o],l=n.resolveElementSnapshot(e,c);Q(l)?s[o]=Se(n,e,c,l,i):s[o]=ye(n,e,c,l,i);}return s}function Ze(n,e,t){if(!e.elements)return;let r=It(e,[],e.elements).filter(([s,o])=>o.elements&&Object.keys(o.elements).length>0),i=[];for(let[s,o]of r){let a=me(n,e,s,t),c;o.type==="BackboneElement"||!o.type?c="BackboneElement":c=o.type;let l=n.ensureSpecializationCanonicalUrl(c),p=n.resolveFs(e.package_meta,l);if(!p)throw new Error(`Could not resolve base type ${c}`);let d={kind:"complex-type",package:p.package_meta.name,version:p.package_meta.version,name:c,url:l},m=Er(n,e,s,o.elements,t),g={identifier:a,base:d,fields:m};i.push(g);}return i.sort((s,o)=>s.identifier.url.localeCompare(o.identifier.url)),i.length===0?void 0:i}function Et(n){let e=[];for(let t of n){t.base&&e.push(t.base);for(let r of Object.values(t.fields||{}))"type"in r&&r.type&&e.push(r.type),"binding"in r&&r.binding&&e.push(r.binding);}return e}function Pt(n,e,t){let r=t[t.length-1],i=t.slice(0,-1),s=n.resolveFsGenealogy(e.package_meta,e.url).flatMap(o=>{if(i.length===0)return o.required||[];if(!o.elements)return [];let a=o;for(let c of i)a=a?.elements?.[c];return a?.required||[]});return new Set(s).has(r)}function Mt(n,e,t){let r=t[t.length-1];if(!r)throw new Error(`Internal error: fieldName is missing for path ${t.join("/")}`);let i=t.slice(0,-1),s=n.resolveFsGenealogy(e.package_meta,e.url).flatMap(o=>{if(i.length===0)return o.excluded||[];if(!o.elements)return [];let a=o;for(let c of i)a=a?.elements?.[c];return a?.excluded||[]});return new Set(s).has(r)}var Pr=(n,e,t)=>{if(t.refers)return t.refers.map(r=>{let i=n.ensureSpecializationCanonicalUrl(r),s=n.resolveFs(e.package_meta,i);if(!s)throw new Error(`Failed to resolve fs for ${i}`);return V(s)})};function Xe(n,e,t,r,i){if(r.elementReference){let s=r.elementReference.slice(1).filter((o,a)=>a%2===1);return me(n,e,s,i)}else if(r.type){let s=n.ensureSpecializationCanonicalUrl(r.type),o=n.resolveFs(e.package_meta,s);if(!o)throw new Error(`Could not resolve field type: '${r.type}' (from '${e.url}' in '${S(e.package_meta)}')`);return V(o)}else {if(r.choices)return;if(e.derivation==="constraint")return;throw i?.error(`Can't recognize element type '${e.url}' (${e.derivation}) at '${t.join(".")}': ${JSON.stringify(r,void 0,2)}`),new Error("Unrecognized element type")}}var ye=(n,e,t,r,i)=>{let s,o;r.binding&&(s=he(e,t,r.binding.bindingName),r.binding.strength==="required"&&r.type==="code"&&(o=Qe(n,e,r,i)));let a=Xe(n,e,t,r,i);return a||i?.warn(`Field type not found for '${e.url}#${t.join(".")}' (${e.derivation})`),{type:a,required:Pt(n,e,t),excluded:Mt(n,e,t),reference:Pr(n,e,r),array:r.array||false,min:r.min,max:r.max,choices:r.choices,choiceOf:r.choiceOf,binding:s,enum:o}};function Q(n){let e=n.type==="BackboneElement",t=n.type==="Element"&&n.elements!==void 0&&Object.keys(n.elements).length>0,r=n.type===void 0&&n.choiceOf===void 0&&n.elements!==void 0&&Object.keys(n.elements).length>0;return e||t||r}function Se(n,e,t,r,i){return {type:me(n,e,t,i),array:r.array||false,required:Pt(n,e,t),excluded:Mt(n,e,t)}}function et(n,e,t,r){let i=Ye(t)||t,s=n.resolveVs(e,i);if(s)return Mr(n,s)}function Mr(n,e,t){if(e.expansion?.contains)return e.expansion.contains;let r=[];if(e.compose?.include){for(let i of e.compose.include)if(i.concept)for(let s of i.concept)r.push({system:i.system,code:s.code,display:s.display});else if(i.system&&!i.filter)try{let s=n.resolveAny(i.system);if(s?.concept){let o=(a,c)=>{for(let l of a)r.push({system:c,code:l.code,display:l.display}),l.concept&&o(l.concept,c);};o(s.concept,i.system);}}catch{}}return r.length>0?r:void 0}var Nt=100;function Qe(n,e,t,r){if(!t.binding)return;let i=t.binding.strength,s=t.binding.valueSet;if(!s||!(i==="required"||i==="extensible"&&(t.type==="code"||t.type==="Coding")||i==="preferred"&&(t.type==="code"||t.type==="Coding")))return;let a=et(n,e.package_meta,s);if(!a||a.length===0)return;let c=a.map(l=>l.code).filter(l=>l&&typeof l=="string"&&l.trim().length>0);if(c.length>Nt){r?.dry_warn(`Value set ${s} has ${c.length} which is more than ${Nt} codes, which may cause issues with code generation.`);return}return c.length>0?c:void 0}function Nr(n,e,t,r,i){if(!r.binding?.valueSet)return;let s=he(e,t,r.binding.bindingName),o=Xe(n,e,t,r,i),a=fe(n,e.package_meta,r.binding.valueSet),c=[];o&&c.push(o),c.push(a);let l=Qe(n,e,r,i);return {identifier:s,type:o,valueset:a,strength:r.binding.strength,enum:l,dependencies:c}}function Ot(n,e,t){let r=new Set;if(!e.elements)return [];let i=[];function s(c,l){for(let[p,d]of Object.entries(c)){let m=[...l,p],g=m.join(".");if(!r.has(g)){if(r.add(g),d.binding){let h=Nr(n,e,m,d,t);h&&i.push(h);}d.elements&&s(d.elements,m);}}}s(e.elements,[]),i.sort((c,l)=>c.identifier.name.localeCompare(l.identifier.name));let o=[],a=new Set;for(let c of i)a.has(c.identifier.url)||(a.add(c.identifier.url),o.push(c));return o}function Or(n,e,t,r,i){if(!r)return;let s={};for(let o of n.getAllElementKeys(r)){let a=[...t,o],c=n.resolveElementSnapshot(e,a);Q(c)?s[o]=Se(n,e,a,c,i):s[o]=ye(n,e,a,c,i);}return s}function Dr(n){let e=[];for(let t of Object.values(n))"type"in t&&t.type&&e.push(t.type),"binding"in t&&t.binding&&e.push(t.binding);return e}function Br(n,e){return !!(n.base==="Extension"||n.base==="http://hl7.org/fhir/StructureDefinition/Extension"||n.url?.includes("/extension/")||n.url?.includes("-extension")||n.name?.toLowerCase().includes("extension")||n.type==="Extension")}async function be(n,e,t){if(!e.url)throw new Error("ValueSet URL is required");let r=fe(n,e.package_meta,e.url),i=et(n,e.package_meta,e.url);return {identifier:r,description:e.description,concept:i,compose:i?void 0:e.compose}}function tt(n,e,t,r){let i=[];e&&i.push(e),t&&i.push(...Dr(t)),r&&i.push(...Et(r));let s={};for(let c of i)c.url!==n.url&&(s[c.url]=c);let o=new Set(r?.map(c=>c.identifier.url)),a=Object.values(s).filter(c=>xt(n)||!N(c)?true:!o.has(c.url)).sort((c,l)=>c.url.localeCompare(l.url));return a.length>0?a:void 0}function Lr(n,e,t){let r=V(e),i;if(e.base&&e.type!=="Element"){let p=n.resolveFs(e.package_meta,n.ensureSpecializationCanonicalUrl(e.base));if(!p)throw new Error(`Base resource not found '${e.base}' for <${e.url}> from ${S(e.package_meta)}`);i=V(p);}let s=Or(n,e,[],e.elements,t),o=Ze(n,e,t),a=tt(r,i,s,o),c={identifier:r,base:i,fields:s,nested:o,description:e.description,dependencies:a},l=Ot(n,e,t);return [c,...l]}async function ve(n,e,t){let r=Lr(n,e,t);if(Br(e,V(e))){let i=r[0];if(!i)throw new Error("Expected schema to be defined");i.metadata={isExtension:true};}return r}var O=class{cache=new Map;config;cacheDir;constructor(e){this.config={enablePersistence:true,cacheDir:".typeschema-cache",maxAge:1440*60*1e3,validateCached:true,...e},this.config.enablePersistence&&this.config.cacheDir&&(this.cacheDir=this.config.cacheDir);}async set(e){let t=this.generateKey(e.identifier);this.cache.set(t,e),this.config.enablePersistence&&this.cacheDir&&await this.persistSchema(e);}get(e){let t=this.generateKey(e);return this.cache.get(t)||null}getByUrl(e){for(let t of this.cache.values())if(t.identifier.url===e)return t;return null}has(e){let t=this.generateKey(e);return this.cache.has(t)}hasByUrl(e){for(let t of this.cache.values())if(t.identifier.url===e)return true;return false}delete(e){let t=this.generateKey(e);return this.cache.delete(t)}deleteByUrl(e){for(let[t,r]of this.cache.entries())if(r.identifier.url===e)return this.cache.delete(t);return false}getByPackage(e){let t=[];for(let r of this.cache.values())r.identifier.package===e&&t.push(r);return t}getByKind(e){let t=[];for(let r of this.cache.values())r.identifier.kind===e&&t.push(r);return t}setMany(e){for(let t of e)this.set(t);}clear(){this.cache.clear();}generateKey(e){return `${e.package}:${e.version}:${e.kind}:${e.name}`}async initialize(){this.config.enablePersistence&&this.cacheDir&&(existsSync(this.cacheDir)||mkdirSync(this.cacheDir,{recursive:true}),await this.loadFromDisk());}async loadFromDisk(){if(!(!this.cacheDir||!existsSync(this.cacheDir)))try{let t=(await readdir(this.cacheDir)).filter(r=>r.endsWith(".typeschema.json"));for(let r of t){let i=join(this.cacheDir,r),s=await stat(i);if(this.config.maxAge&&Date.now()-s.mtimeMs>this.config.maxAge){await unlink(i);continue}try{let o=await readFile(i,"utf-8"),a=JSON.parse(o);if(this.config.validateCached&&!a.schema?.identifier)continue;let c=this.generateKey(a.schema.identifier);this.cache.set(c,a.schema);}catch(o){console.warn(`Failed to load cached schema from ${r}:`,o);}}}catch(e){console.warn("Failed to load cached schemas from disk:",e);}}async persistSchema(e){if(!this.cacheDir)return;existsSync(this.cacheDir)||mkdirSync(this.cacheDir,{recursive:true});let t={schema:e,timestamp:Date.now(),version:e.identifier.version},r=`${e.identifier.package}-${e.identifier.version}-${e.identifier.kind}-${e.identifier.name}.typeschema.json`.replace(/[^a-zA-Z0-9.-]/g,"_"),i=join(this.cacheDir,r);try{await writeFile(i,JSON.stringify(t,null,2),"utf-8");}catch(s){console.warn(`Failed to persist schema to ${i}:`,s);}}async clearDisk(){if(!(!this.cacheDir||!existsSync(this.cacheDir)))try{let t=(await readdir(this.cacheDir)).filter(r=>r.endsWith(".typeschema.json"));for(let r of t)await unlink(join(this.cacheDir,r));}catch(e){console.warn("Failed to clear cache directory:",e);}}};var Gr=async(n,e)=>{let r=(await n.packageJson(e.name)).dependencies;return r!==void 0?Object.entries(r).map(([i,s])=>({name:i,version:s})):[]},Vt=n=>({pkg:n,canonicalResolution:{},fhirSchemas:{},valueSets:{}}),Gt=async(n,e,t,r,i)=>{let s=S(e);if(i?.info(`${" ".repeat(t*2)}+ ${s}`),r[s])return r[s];let o=Vt(e);for(let c of await n.search({package:e})){let l=c.url;if(!l||!(isStructureDefinition(c)||Ke(c)||$t(c)))continue;let p=l;o.canonicalResolution[p]&&i?.dry_warn(`Duplicate canonical URL: ${p} at ${s}.`),o.canonicalResolution[p]=[{deep:t,pkg:e,pkgId:s,resource:c}];}let a=await Gr(n,e);for(let c of a){let{canonicalResolution:l}=await Gt(n,c,t+1,r,i);for(let[p,d]of Object.entries(l)){let m=p;o.canonicalResolution[m]=[...o.canonicalResolution[m]||[],...d];}}for(let c of Object.values(o.canonicalResolution))c.sort((l,p)=>l.deep-p.deep);return r[s]=o,o},At=(n,e,t)=>{let r=Object.values(n).flatMap(i=>i.canonicalResolution[e]);if(!r)throw new Error(`No canonical resolution found for ${e} in any package`);return r[0]?.resource},ee=async(n,{logger:e,fallbackPackageForNameResolution:t,focusedPackages:r})=>{let i=r??await n.packages(),s={};for(let g of i)await Gt(n,g,0,s,e);for(let{pkg:g,canonicalResolution:h}of Object.values(s)){let u=S(g);if(!s[u])throw new Error(`Package ${u} not found`);let f=0;e?.info(`FHIR Schema conversion for '${S(g)}' begins...`);for(let[y,T]of Object.entries(h)){let v=T[0];if(!v)throw new Error("Resource not found");let w=v.resource,Y=v.pkg;if(isStructureDefinition(w)){let k=We(jt.translate(w),Y);f++,s[u].fhirSchemas[k.url]=k;}if(Ke(w)){let k=Rt(w,Y);s[u].valueSets[k.url]=k;}}e?.info(`FHIR Schema conversion for '${S(g)}' completed: ${f} successful`);}let o=(g,h)=>s[S(g)]?.fhirSchemas[h]||t&&s[S(t)]?.fhirSchemas[h],a=(g,h)=>s[S(g)]?.valueSets[h]||t&&s[S(t)]?.valueSets[h],c=g=>g.match(/^[a-zA-Z0-9]+$/)&&`http://hl7.org/fhir/StructureDefinition/${g}`||g,l=(g,h)=>{let u=o(g,h);if(u===void 0)throw new Error(`Failed to resolve FHIR Schema: '${h}'`);let f=[u];for(;u?.base;){let y=u.package_meta,T=c(u.base);if(u=o(y,T),u===void 0)throw new Error(`Failed to resolve FHIR Schema base for '${h}'. Problem: '${T}' from '${S(y)}'`);f.push(u);}return f};return {...n,testAppendFs(g){let h=We(g),u=S(h.package_meta);s[u]||(s[u]=Vt(h.package_meta)),s[u].fhirSchemas[h.url]=h;},resolveFs:o,resolveFsGenealogy:l,resolveFsSpecializations:(g,h)=>l(g,h).filter(u=>u.derivation==="specialization"),ensureSpecializationCanonicalUrl:c,resolveSd:(g,h)=>{let u=At(s,h);if(isStructureDefinition(u))return u},allFs:()=>Object.values(s).flatMap(g=>Object.values(g.fhirSchemas)),allVs:()=>Object.values(s).flatMap(g=>Object.values(g.valueSets)),resolveVs:a,resolveAny:g=>At(s,g),resolveElementSnapshot:(g,h)=>{let u=l(g.package_meta,g.url),f=Ur(u,h);return Hr(f)},getAllElementKeys:g=>{let h=new Set;for(let[u,f]of Object.entries(g)){h.add(u);for(let y of f?.choices||[])g[y]||h.add(y);}return Array.from(h)},resolver:s}};var Ur=(n,e)=>{let[t,...r]=e;return t===void 0?[]:n.map(i=>{if(!i.elements)return;let s=i.elements?.[t];for(let o of r)s=s?.elements?.[o];return s}).filter(i=>i!==void 0)};function Hr(n){let e=n.reverse(),t=Object.assign({},...e);return t.elements=void 0,t}var D=class{manager;options;cacheConfig;cache;logger;constructor(e={},t){this.options={verbose:false,...e},this.manager=e.manager||CanonicalManager({packages:[],workingDir:"tmp/fhir"}),this.cacheConfig=t,this.logger=e.logger||I({verbose:this.options.verbose,prefix:"TypeSchema"});}async initializeCache(){this.cacheConfig&&!this.cache&&(this.cache=new O(this.cacheConfig),await this.cache.initialize());}async registerFromPackageMetas(e){let t=e.map(S);return this.logger?.step(`Loading FHIR packages: ${t.join(", ")}`),await this.manager.init(),ee(this.manager,{focusedPackages:e})}generateFhirSchemas(e){this.logger?.progress(`Converting ${e.length} StructureDefinitions to FHIRSchemas`);let t=this.applyStructureDefinitionTreeshaking(e),r=[],i=0,s=0;for(let o of t)try{let a=jt.translate(o);r.push(a),i++,this.logger?.debug(`Converted StructureDefinition: ${o.name||o.id} (${o.resourceType})`);}catch(a){s++,this.logger?.warn(`Failed to convert StructureDefinition ${o.name||o.id}: ${a instanceof Error?a.message:String(a)}`);}return this.logger?.success(`FHIR Schema conversion completed: ${i}/${t.length} successful, ${s} failed`),r}async generateValueSetSchemas(e,t){e.length>0&&this.logger?.debug(`${e.length} ValueSets available for enum extraction`);let r=await ee(this.manager,{logger:this.logger}),i=[];if(e.length>0){this.logger?.progress(`Converting ${e.length} ValueSets to TypeSchema`);let s=0,o=0;for(let a of e)try{let c=await be(r,a,t);c&&(i.push(c),s++,this.logger?.debug(`Converted ValueSet: ${a.name||a.id}`));}catch(c){o++,this.logger?.warn(`Failed to convert ValueSet ${a.name||a.id}: ${c instanceof Error?c.message:String(c)}`);}this.logger?.success(`ValueSet conversion completed: ${s}/${e.length} successful, ${o} failed`);}return i}async generateFromPackage(e,t,r){if(await this.initializeCache(),this.cache&&!(this.cacheConfig?.forceRegenerate??false)){let l=this.cache.getByPackage(e);if(l.length>0)return this.logger?.info(`Using cached TypeSchemas for package: ${e} (${l.length} schemas)`),l}let i={name:e,version:t||"latest"},s=await this.registerFromPackageMetas([i]),o=await this.generateValueSetSchemas(s.allVs(),r),c=[...(await Promise.all(s.allFs().map(async l=>await ve(s,l,r)))).flat(),...o];if(this.cache)for(let l of c)await this.cache.set(l);return c}applyStructureDefinitionTreeshaking(e){let t=this.options.treeshake;if(!t||t.length===0)return e;this.logger?.info(`Applying treeshaking filter for ResourceTypes: ${t.join(", ")}`);let r=new Map,i=new Map,s=new Map;for(let p of e){let d=p.name||p.id;d&&(r.set(d,p),i.set(d,new Set),s.set(d,new Set));}for(let p of e){let d=p.name||p.id;if(!d)continue;let{realDeps:m,refTargets:g}=this.extractStructureDefinitionDependenciesWithReferences(p);i.set(d,new Set(m)),s.set(d,new Set(g));}let o=new Set;for(let p of t)r.has(p)?o.add(p):this.logger?.warn(`ResourceType '${p}' not found in structure definitions`);let a=(p,d=new Set)=>{if(d.has(p)||!i.has(p))return;d.add(p);let m=i.get(p)||new Set;for(let g of Array.from(m))r.has(g)&&(o.add(g),a(g,d));};for(let p of Array.from(o))a(p);let c=e.filter(p=>{let d=p.name||p.id;return d&&o.has(d)}),l=new Set;for(let p of e){let d=p.name||p.id;d&&!o.has(d)&&Array.from(s.values()).some(g=>g.has(d))&&l.add(d);}return l.size>0&&this.logger?.info(`Excluded reference-only targets: ${Array.from(l).join(", ")}`),this.logger?.success(`Treeshaking completed: kept ${c.length}/${e.length} structure definitions`),c}extractStructureDefinitionDependenciesWithReferences(e){let t=new Set,r=new Set;if(e.baseDefinition){let i=this.extractResourceNameFromUrl(e.baseDefinition);i&&t.add(i);}if(e.snapshot?.element||e.differential?.element){let i=e.snapshot?.element||e.differential?.element;for(let s of i)if(s.type)for(let o of s.type){if(o.code&&(t.add(o.code),o.code==="Reference"&&o.targetProfile))for(let a of o.targetProfile){let c=this.extractResourceNameFromUrl(a);c&&r.add(c);}if(o.profile)for(let a of o.profile){let c=this.extractResourceNameFromUrl(a);c&&t.add(c);}}}return {realDeps:Array.from(t),refTargets:Array.from(r)}}extractResourceNameFromUrl(e){let t=e.match(/\/([^/]+)$/);return t?t[1]??null:null}};var W=class{options;constructor(e={}){this.options={format:"auto",validate:true,strict:false,...e};}async parseFromFile(e){let t=await readFile(e,"utf-8"),r=this.options.format==="auto"?this.detectFormat(t,e):this.options.format;return this.parseFromString(t,r)}async parseFromString(e,t){let r=t||this.detectFormat(e),i;return r==="ndjson"?i=this.parseNDJSON(e):i=this.parseJSON(e),this.options.validate&&this.validateSchemas(i),i}async parseFromFiles(e){let t=[];for(let r of e){let i=await this.parseFromFile(r);t.push(...i);}return t}parseSchema(e){if(!e.identifier)throw new Error("TypeSchema must have an identifier");if(!this.isValidIdentifier(e.identifier))throw new Error("TypeSchema identifier is invalid");return e}findByIdentifier(e,t){return e.filter(r=>this.matchesIdentifier(r.identifier,t))}findByUrl(e,t){return e.find(r=>r.identifier.url===t)}findByKind(e,t){return e.filter(r=>r.identifier.kind===t)}findByPackage(e,t){return e.filter(r=>r.identifier.package===t)}detectFormat(e,t){if(t){if(t.endsWith(".ndjson"))return "ndjson";if(t.endsWith(".json"))return "json"}let r=e.trim();if(r.includes(`
14
+ `}generateSimpleExports(e){e.push("// Exports");let t=Array.from(this.exports.entries());this.sortFunction?t=t.sort(this.sortFunction):t=t.sort(([i],[s])=>i.localeCompare(s));let r=new Map;for(let[i,s]of t)r.has(s)||r.set(s,[]),r.get(s)?.push(i);for(let[i,s]of r){let o=s.sort();o.length===1?e.push(`export type { ${o[0]} } from './${i}';`):o.length<=3?e.push(`export type { ${o.join(", ")} } from './${i}';`):(e.push("export type {"),o.forEach((a,c)=>{let l=c===o.length-1;e.push(` ${a}${l?"":","}`);}),e.push(`} from './${i}';`));}}generateGroupedExports(e){if(!this.groupingFunction)return;let t=new Map;for(let[i,s]of this.exports){let o=this.groupingFunction(i);t.has(o)||t.set(o,new Map);let a=t.get(o);a.has(s)||a.set(s,[]),a.get(s)?.push(i);}let r=Array.from(t.entries()).sort();for(let[i,s]of r){e.push(`// ${i}`);for(let[o,a]of s){let c=a.sort();c.length===1?e.push(`export type { ${c[0]} } from './${o}';`):e.push(`export type { ${c.join(", ")} } from './${o}';`);}e.push("");}}getExports(){return new Map(this.exports)}getNamespaces(){return new Map(this.namespaces)}getReExports(){return new Map(this.reExports)}};});var _=class n{options;dryWarnSet=new Set;constructor(e={}){this.options={timestamp:false,verbose:false,...e};}static consoleLevelsMap={1:console.log,2:console.warn,3:console.error,0:console.log,4:()=>{}};formatMessage(e,t,r){let i=this.options.timestamp?`${b.gray(new Date().toLocaleTimeString())} `:"",s=this.options.prefix?`${b.cyan(`[${this.options.prefix}]`)} `:"";return `${i}${r(e)} ${s}${t}`}isSuppressed(e){return this.options.suppressLoggingLevel==="all"||this.options.suppressLoggingLevel?.includes(e)||false}tryWriteToConsole(e,t){if(this.isSuppressed(e))return;(n.consoleLevelsMap[e]||console.log)(t);}success(e){this.tryWriteToConsole(1,this.formatMessage("",e,b.green));}error(e,t){this.isSuppressed(3)||(console.error(this.formatMessage("X",e,b.red)),t&&this.options.verbose&&(console.error(b.red(` ${t.message}`)),t.stack&&console.error(b.gray(t.stack))));}warn(e){this.tryWriteToConsole(2,this.formatMessage("!",e,b.yellow));}dry_warn(e){this.dryWarnSet.has(e)||(this.warn(e),this.dryWarnSet.add(e));}info(e){this.tryWriteToConsole(1,this.formatMessage("i",e,b.blue));}debug(e){this.options.verbose&&this.tryWriteToConsole(0,this.formatMessage("\u{1F41B}",e,b.magenta));}step(e){this.tryWriteToConsole(1,this.formatMessage("\u{1F680}",e,b.cyan));}progress(e){this.tryWriteToConsole(1,this.formatMessage("\u23F3",e,b.blue));}plain(e,t=r=>r){let r=this.options.timestamp?`${b.gray(new Date().toLocaleTimeString())} `:"",i=this.options.prefix?`${b.cyan(`[${this.options.prefix}]`)} `:"";this.tryWriteToConsole(1,`${r}${i}${t(e)}`);}dim(e){this.plain(e,b.gray);}child(e){return new n({...this.options,prefix:this.options.prefix?`${this.options.prefix}:${e}`:e})}configure(e){this.options={...this.options,...e};}},A=new _;function pe(n){A.success(n);}function C(n,e){A.error(n,e);}function Ge(n){A.warn(n);}function ue(n){A.info(n);}function Ue(n){A.step(n);}function Tt(n){A.dim(n);}function He(n){A.configure(n);}function I(n={}){return new _(n)}function _e(n){console.log(),console.log(b.cyan(b.bold(`\u2501\u2501\u2501 ${n} \u2501\u2501\u2501`)));}function ze(n,e,t){let r=n;e&&(r+=` ${b.gray(`(${e}ms)`)}`),pe(r),t&&Object.entries(t).forEach(([i,s])=>{Tt(` ${i}: ${s}`);});}function j(n,e="\u2022"){n.forEach(t=>{console.log(b.gray(` ${e} ${t}`));});}var ge=(n,e=true)=>{let t=n.split("/").pop();if(t&&(e&&t.includes("#")&&(t=t.split("#")[0]),!!t))return /^\d/.test(t)&&(t=`number_${t}`),t},S=n=>`${n.name}#${n.version}`,qe=n=>`${n.name}@${n.version}`;var We=(n,e)=>(e||(e={name:"undefined",version:"undefined"}),{...n,package_meta:n.package_meta||e,name:n.name,url:n.url,base:n.base}),Je=n=>n?.kind==="primitive-type",N=n=>n?.kind==="nested",xt=n=>n?.kind==="profile";var z=n=>n?.identifier.kind==="resource"||n?.identifier.kind==="complex-type"||n?.identifier.kind==="logical",wt=n=>n?.identifier.kind==="complex-type",P=n=>n?.identifier.kind==="resource",kt=n=>n?.identifier.kind==="primitive-type",Ct=n=>n?.identifier.kind==="logical",de=n=>n?.identifier.kind==="profile";function Z(n){return n?.identifier.kind==="binding"}function Ft(n){return n?.identifier.kind==="value-set"}var X=n=>n?n.choices===void 0:false,q=n=>n?n.choices!==void 0:false,Ke=n=>n?.resourceType==="ValueSet",$t=n=>n?.resourceType==="CodeSystem",Rt=(n,e)=>{if(!n.url)throw new Error("ValueSet must have a URL");if(!n.name)throw new Error("ValueSet must have a name");return {...n,package_meta:n.package_meta||e,name:n.name,url:n.url}};function Ye(n){let e=n.split("|")[0];return e||n}function $r(n){return n.split("|")[1]}function Rr(n){return n.derivation==="constraint"?"profile":n.kind==="primitive-type"?"primitive-type":n.kind==="complex-type"?"complex-type":n.kind==="resource"?"resource":n.kind==="logical"?"logical":"resource"}function V(n){return {kind:Rr(n),package:n.package_meta.name,version:n.package_meta.version,name:n.name,url:n.url}}var Ir=n=>{let e=n.split("/"),t=e[e.length-1];return t&&t.length>0?t.split(/[-_]/).map(r=>r.charAt(0).toUpperCase()+r.slice(1).toLowerCase()).join(""):n};function fe(n,e,t){let r=Ye(t),i=Ir(r),s={package_meta:{name:"missing_valuesets",version:$r(r)||"0.0.0"},id:t},o=n.resolveVs(e,r)||s,a=o?.id&&!/^[a-zA-Z0-9_-]{20,}$/.test(o.id)?o.id:i;return {kind:"value-set",package:o.package_meta.name,version:o.package_meta.version,name:a,url:r}}function he(n,e,t){let r=e.join("."),[i,s,o]=t?[{name:"shared",version:"1.0.0"},t,`urn:fhir:binding:${t}`]:[n.package_meta,`${n.name}.${r}_binding`,`${n.url}#${r}_binding`];return {kind:"binding",package:i.name,version:i.version,name:s,url:o}}function me(n,e,t,r){let i={};if(e.derivation==="constraint"){let c=n.resolveFsSpecializations(e.package_meta,e.url).map(l=>Ze(n,l,r)).filter(l=>l!==void 0).flat();for(let l of c.reverse())i[l.identifier.name]=l.identifier.url;}let s=t.join("."),o=i[s]??`${e.url}#${s}`;return {kind:"nested",package:e.package_meta.name,version:e.package_meta.version,name:s,url:o}}function It(n,e,t){let r=[];for(let[i,s]of Object.entries(t)){let o=[...e,i];Q(s)&&r.push([o,s]),s.elements&&r.push(...It(n,o,s.elements));}return r}function Er(n,e,t,r,i){let s={};for(let[o,a]of Object.entries(r)){let c=[...t,o],l=n.resolveElementSnapshot(e,c);Q(l)?s[o]=Se(n,e,c,l,i):s[o]=ye(n,e,c,l,i);}return s}function Ze(n,e,t){if(!e.elements)return;let r=It(e,[],e.elements).filter(([s,o])=>o.elements&&Object.keys(o.elements).length>0),i=[];for(let[s,o]of r){let a=me(n,e,s,t),c;o.type==="BackboneElement"||!o.type?c="BackboneElement":c=o.type;let l=n.ensureSpecializationCanonicalUrl(c),p=n.resolveFs(e.package_meta,l);if(!p)throw new Error(`Could not resolve base type ${c}`);let d={kind:"complex-type",package:p.package_meta.name,version:p.package_meta.version,name:c,url:l},m=Er(n,e,s,o.elements,t),g={identifier:a,base:d,fields:m};i.push(g);}return i.sort((s,o)=>s.identifier.url.localeCompare(o.identifier.url)),i.length===0?void 0:i}function Et(n){let e=[];for(let t of n){t.base&&e.push(t.base);for(let r of Object.values(t.fields||{}))"type"in r&&r.type&&e.push(r.type),"binding"in r&&r.binding&&e.push(r.binding);}return e}function Pt(n,e,t){let r=t[t.length-1],i=t.slice(0,-1),s=n.resolveFsGenealogy(e.package_meta,e.url).flatMap(o=>{if(i.length===0)return o.required||[];if(!o.elements)return [];let a=o;for(let c of i)a=a?.elements?.[c];return a?.required||[]});return new Set(s).has(r)}function Mt(n,e,t){let r=t[t.length-1];if(!r)throw new Error(`Internal error: fieldName is missing for path ${t.join("/")}`);let i=t.slice(0,-1),s=n.resolveFsGenealogy(e.package_meta,e.url).flatMap(o=>{if(i.length===0)return o.excluded||[];if(!o.elements)return [];let a=o;for(let c of i)a=a?.elements?.[c];return a?.excluded||[]});return new Set(s).has(r)}var Pr=(n,e,t)=>{if(t.refers)return t.refers.map(r=>{let i=n.ensureSpecializationCanonicalUrl(r),s=n.resolveFs(e.package_meta,i);if(!s)throw new Error(`Failed to resolve fs for ${i}`);return V(s)})};function Xe(n,e,t,r,i){if(r.elementReference){let s=r.elementReference.slice(1).filter((o,a)=>a%2===1);return me(n,e,s,i)}else if(r.type){let s=n.ensureSpecializationCanonicalUrl(r.type),o=n.resolveFs(e.package_meta,s);if(!o)throw new Error(`Could not resolve field type: '${r.type}' (from '${e.url}' in '${S(e.package_meta)}')`);return V(o)}else {if(r.choices)return;if(e.derivation==="constraint")return;throw i?.error(`Can't recognize element type '${e.url}' (${e.derivation}) at '${t.join(".")}': ${JSON.stringify(r,void 0,2)}`),new Error("Unrecognized element type")}}var ye=(n,e,t,r,i)=>{let s,o;r.binding&&(s=he(e,t,r.binding.bindingName),r.binding.strength==="required"&&r.type==="code"&&(o=Qe(n,e,r,i)));let a=Xe(n,e,t,r,i);return a||i?.warn(`Field type not found for '${e.url}#${t.join(".")}' (${e.derivation})`),{type:a,required:Pt(n,e,t),excluded:Mt(n,e,t),reference:Pr(n,e,r),array:r.array||false,min:r.min,max:r.max,choices:r.choices,choiceOf:r.choiceOf,binding:s,enum:o}};function Q(n){let e=n.type==="BackboneElement",t=n.type==="Element"&&n.elements!==void 0&&Object.keys(n.elements).length>0,r=n.type===void 0&&n.choiceOf===void 0&&n.elements!==void 0&&Object.keys(n.elements).length>0;return e||t||r}function Se(n,e,t,r,i){return {type:me(n,e,t,i),array:r.array||false,required:Pt(n,e,t),excluded:Mt(n,e,t)}}function et(n,e,t,r){let i=Ye(t)||t,s=n.resolveVs(e,i);if(s)return Mr(n,s)}function Mr(n,e,t){if(e.expansion?.contains)return e.expansion.contains;let r=[];if(e.compose?.include){for(let i of e.compose.include)if(i.concept)for(let s of i.concept)r.push({system:i.system,code:s.code,display:s.display});else if(i.system&&!i.filter)try{let s=n.resolveAny(i.system);if(s?.concept){let o=(a,c)=>{for(let l of a)r.push({system:c,code:l.code,display:l.display}),l.concept&&o(l.concept,c);};o(s.concept,i.system);}}catch{}}return r.length>0?r:void 0}var Nt=100;function Qe(n,e,t,r){if(!t.binding)return;let i=t.binding.strength,s=t.binding.valueSet;if(!s||!(i==="required"||i==="extensible"&&(t.type==="code"||t.type==="Coding")||i==="preferred"&&(t.type==="code"||t.type==="Coding")))return;let a=et(n,e.package_meta,s);if(!a||a.length===0)return;let c=a.map(l=>l.code).filter(l=>l&&typeof l=="string"&&l.trim().length>0);if(c.length>Nt){r?.dry_warn(`Value set ${s} has ${c.length} which is more than ${Nt} codes, which may cause issues with code generation.`);return}return c.length>0?c:void 0}function Nr(n,e,t,r,i){if(!r.binding?.valueSet)return;let s=he(e,t,r.binding.bindingName),o=Xe(n,e,t,r,i),a=fe(n,e.package_meta,r.binding.valueSet),c=[];o&&c.push(o),c.push(a);let l=Qe(n,e,r,i);return {identifier:s,type:o,valueset:a,strength:r.binding.strength,enum:l,dependencies:c}}function Ot(n,e,t){let r=new Set;if(!e.elements)return [];let i=[];function s(c,l){for(let[p,d]of Object.entries(c)){let m=[...l,p],g=m.join(".");if(!r.has(g)){if(r.add(g),d.binding){let h=Nr(n,e,m,d,t);h&&i.push(h);}d.elements&&s(d.elements,m);}}}s(e.elements,[]),i.sort((c,l)=>c.identifier.name.localeCompare(l.identifier.name));let o=[],a=new Set;for(let c of i)a.has(c.identifier.url)||(a.add(c.identifier.url),o.push(c));return o}function Or(n,e,t,r,i){if(!r)return;let s={};for(let o of n.getAllElementKeys(r)){let a=[...t,o],c=n.resolveElementSnapshot(e,a);Q(c)?s[o]=Se(n,e,a,c,i):s[o]=ye(n,e,a,c,i);}return s}function Dr(n){let e=[];for(let t of Object.values(n))"type"in t&&t.type&&e.push(t.type),"binding"in t&&t.binding&&e.push(t.binding);return e}function Br(n,e){return !!(n.base==="Extension"||n.base==="http://hl7.org/fhir/StructureDefinition/Extension"||n.url?.includes("/extension/")||n.url?.includes("-extension")||n.name?.toLowerCase().includes("extension")||n.type==="Extension")}async function be(n,e,t){if(!e.url)throw new Error("ValueSet URL is required");let r=fe(n,e.package_meta,e.url),i=et(n,e.package_meta,e.url);return {identifier:r,description:e.description,concept:i,compose:i?void 0:e.compose}}function tt(n,e,t,r){let i=[];e&&i.push(e),t&&i.push(...Dr(t)),r&&i.push(...Et(r));let s={};for(let c of i)c.url!==n.url&&(s[c.url]=c);let o=new Set(r?.map(c=>c.identifier.url)),a=Object.values(s).filter(c=>xt(n)||!N(c)?true:!o.has(c.url)).sort((c,l)=>c.url.localeCompare(l.url));return a.length>0?a:void 0}function Lr(n,e,t){let r=V(e),i;if(e.base&&e.type!=="Element"){let p=n.resolveFs(e.package_meta,n.ensureSpecializationCanonicalUrl(e.base));if(!p)throw new Error(`Base resource not found '${e.base}' for <${e.url}> from ${S(e.package_meta)}`);i=V(p);}let s=Or(n,e,[],e.elements,t),o=Ze(n,e,t),a=tt(r,i,s,o),c={identifier:r,base:i,fields:s,nested:o,description:e.description,dependencies:a},l=Ot(n,e,t);return [c,...l]}async function ve(n,e,t){let r=Lr(n,e,t);if(Br(e,V(e))){let i=r[0];if(!i)throw new Error("Expected schema to be defined");i.metadata={isExtension:true};}return r}var O=class{cache=new Map;config;cacheDir;constructor(e){this.config={enablePersistence:true,cacheDir:".typeschema-cache",maxAge:1440*60*1e3,validateCached:true,...e},this.config.enablePersistence&&this.config.cacheDir&&(this.cacheDir=this.config.cacheDir);}async set(e){let t=this.generateKey(e.identifier);this.cache.set(t,e),this.config.enablePersistence&&this.cacheDir&&await this.persistSchema(e);}get(e){let t=this.generateKey(e);return this.cache.get(t)||null}getByUrl(e){for(let t of this.cache.values())if(t.identifier.url===e)return t;return null}has(e){let t=this.generateKey(e);return this.cache.has(t)}hasByUrl(e){for(let t of this.cache.values())if(t.identifier.url===e)return true;return false}delete(e){let t=this.generateKey(e);return this.cache.delete(t)}deleteByUrl(e){for(let[t,r]of this.cache.entries())if(r.identifier.url===e)return this.cache.delete(t);return false}getByPackage(e){let t=[];for(let r of this.cache.values())r.identifier.package===e&&t.push(r);return t}getByKind(e){let t=[];for(let r of this.cache.values())r.identifier.kind===e&&t.push(r);return t}setMany(e){for(let t of e)this.set(t);}clear(){this.cache.clear();}generateKey(e){return `${e.package}:${e.version}:${e.kind}:${e.name}`}async initialize(){this.config.enablePersistence&&this.cacheDir&&(existsSync(this.cacheDir)||mkdirSync(this.cacheDir,{recursive:true}),await this.loadFromDisk());}async loadFromDisk(){if(!(!this.cacheDir||!existsSync(this.cacheDir)))try{let t=(await readdir(this.cacheDir)).filter(r=>r.endsWith(".typeschema.json"));for(let r of t){let i=join(this.cacheDir,r),s=await stat(i);if(this.config.maxAge&&Date.now()-s.mtimeMs>this.config.maxAge){await unlink(i);continue}try{let o=await readFile(i,"utf-8"),a=JSON.parse(o);if(this.config.validateCached&&!a.schema?.identifier)continue;let c=this.generateKey(a.schema.identifier);this.cache.set(c,a.schema);}catch(o){console.warn(`Failed to load cached schema from ${r}:`,o);}}}catch(e){console.warn("Failed to load cached schemas from disk:",e);}}async persistSchema(e){if(!this.cacheDir)return;existsSync(this.cacheDir)||mkdirSync(this.cacheDir,{recursive:true});let t={schema:e,timestamp:Date.now(),version:e.identifier.version},r=`${e.identifier.package}-${e.identifier.version}-${e.identifier.kind}-${e.identifier.name}.typeschema.json`.replace(/[^a-zA-Z0-9.-]/g,"_"),i=join(this.cacheDir,r);try{await writeFile(i,JSON.stringify(t,null,2),"utf-8");}catch(s){console.warn(`Failed to persist schema to ${i}:`,s);}}async clearDisk(){if(!(!this.cacheDir||!existsSync(this.cacheDir)))try{let t=(await readdir(this.cacheDir)).filter(r=>r.endsWith(".typeschema.json"));for(let r of t)await unlink(join(this.cacheDir,r));}catch(e){console.warn("Failed to clear cache directory:",e);}}};var Gr=async(n,e)=>{let r=(await n.packageJson(e.name)).dependencies;return r!==void 0?Object.entries(r).map(([i,s])=>({name:i,version:s})):[]},Vt=n=>({pkg:n,canonicalResolution:{},fhirSchemas:{},valueSets:{}}),Gt=async(n,e,t,r,i)=>{let s=S(e);if(i?.info(`${" ".repeat(t*2)}+ ${s}`),r[s])return r[s];let o=Vt(e);for(let c of await n.search({package:e})){let l=c.url;if(!l||!(isStructureDefinition(c)||Ke(c)||$t(c)))continue;let p=l;o.canonicalResolution[p]&&i?.dry_warn(`Duplicate canonical URL: ${p} at ${s}.`),o.canonicalResolution[p]=[{deep:t,pkg:e,pkgId:s,resource:c}];}let a=await Gr(n,e);for(let c of a){let{canonicalResolution:l}=await Gt(n,c,t+1,r,i);for(let[p,d]of Object.entries(l)){let m=p;o.canonicalResolution[m]=[...o.canonicalResolution[m]||[],...d];}}for(let c of Object.values(o.canonicalResolution))c.sort((l,p)=>l.deep-p.deep);return r[s]=o,o},At=(n,e,t)=>{let r=Object.values(n).flatMap(i=>i.canonicalResolution[e]);if(!r)throw new Error(`No canonical resolution found for ${e} in any package`);return r[0]?.resource},ee=async(n,{logger:e,fallbackPackageForNameResolution:t,focusedPackages:r})=>{let i=r??await n.packages(),s={};for(let g of i)await Gt(n,g,0,s,e);for(let{pkg:g,canonicalResolution:h}of Object.values(s)){let u=S(g);if(!s[u])throw new Error(`Package ${u} not found`);let f=0;e?.info(`FHIR Schema conversion for '${S(g)}' begins...`);for(let[y,T]of Object.entries(h)){let v=T[0];if(!v)throw new Error("Resource not found");let w=v.resource,Y=v.pkg;if(isStructureDefinition(w)){let k=We(jt.translate(w),Y);f++,s[u].fhirSchemas[k.url]=k;}if(Ke(w)){let k=Rt(w,Y);s[u].valueSets[k.url]=k;}}e?.info(`FHIR Schema conversion for '${S(g)}' completed: ${f} successful`);}let o=(g,h)=>s[S(g)]?.fhirSchemas[h]||t&&s[S(t)]?.fhirSchemas[h],a=(g,h)=>s[S(g)]?.valueSets[h]||t&&s[S(t)]?.valueSets[h],c=g=>g.match(/^[a-zA-Z0-9]+$/)&&`http://hl7.org/fhir/StructureDefinition/${g}`||g,l=(g,h)=>{let u=o(g,h);if(u===void 0)throw new Error(`Failed to resolve FHIR Schema: '${h}'`);let f=[u];for(;u?.base;){let y=u.package_meta,T=c(u.base);if(u=o(y,T),u===void 0)throw new Error(`Failed to resolve FHIR Schema base for '${h}'. Problem: '${T}' from '${S(y)}'`);f.push(u);}return f};return {...n,testAppendFs(g){let h=We(g),u=S(h.package_meta);s[u]||(s[u]=Vt(h.package_meta)),s[u].fhirSchemas[h.url]=h;},resolveFs:o,resolveFsGenealogy:l,resolveFsSpecializations:(g,h)=>l(g,h).filter(u=>u.derivation==="specialization"),ensureSpecializationCanonicalUrl:c,resolveSd:(g,h)=>{let u=At(s,h);if(isStructureDefinition(u))return u},allFs:()=>Object.values(s).flatMap(g=>Object.values(g.fhirSchemas)),allVs:()=>Object.values(s).flatMap(g=>Object.values(g.valueSets)),resolveVs:a,resolveAny:g=>At(s,g),resolveElementSnapshot:(g,h)=>{let u=l(g.package_meta,g.url),f=Ur(u,h);return Hr(f)},getAllElementKeys:g=>{let h=new Set;for(let[u,f]of Object.entries(g)){h.add(u);for(let y of f?.choices||[])g[y]||h.add(y);}return Array.from(h)},resolver:s}};var Ur=(n,e)=>{let[t,...r]=e;return t===void 0?[]:n.map(i=>{if(!i.elements)return;let s=i.elements?.[t];for(let o of r)s=s?.elements?.[o];return s}).filter(i=>i!==void 0)};function Hr(n){let e=n.reverse(),t=Object.assign({},...e);return t.elements=void 0,t}var D=class{manager;options;cacheConfig;cache;logger;constructor(e={},t){this.options={verbose:false,...e},this.manager=e.manager||CanonicalManager({packages:[],workingDir:"tmp/fhir"}),this.cacheConfig=t,this.logger=e.logger||I({verbose:this.options.verbose,prefix:"TypeSchema"});}async initializeCache(){this.cacheConfig&&!this.cache&&(this.cache=new O(this.cacheConfig),await this.cache.initialize());}async registerFromPackageMetas(e){let t=e.map(S);return this.logger?.step(`Loading FHIR packages: ${t.join(", ")}`),await this.manager.init(),ee(this.manager,{focusedPackages:e})}generateFhirSchemas(e){this.logger?.progress(`Converting ${e.length} StructureDefinitions to FHIRSchemas`);let t=this.applyStructureDefinitionTreeshaking(e),r=[],i=0,s=0;for(let o of t)try{let a=jt.translate(o);r.push(a),i++,this.logger?.debug(`Converted StructureDefinition: ${o.name||o.id} (${o.resourceType})`);}catch(a){s++,this.logger?.warn(`Failed to convert StructureDefinition ${o.name||o.id}: ${a instanceof Error?a.message:String(a)}`);}return this.logger?.success(`FHIR Schema conversion completed: ${i}/${t.length} successful, ${s} failed`),r}async generateValueSetSchemas(e,t){e.length>0&&this.logger?.debug(`${e.length} ValueSets available for enum extraction`);let r=await ee(this.manager,{logger:this.logger}),i=[];if(e.length>0){this.logger?.progress(`Converting ${e.length} ValueSets to TypeSchema`);let s=0,o=0;for(let a of e)try{let c=await be(r,a,t);c&&(i.push(c),s++,this.logger?.debug(`Converted ValueSet: ${a.name||a.id}`));}catch(c){o++,this.logger?.warn(`Failed to convert ValueSet ${a.name||a.id}: ${c instanceof Error?c.message:String(c)}`);}this.logger?.success(`ValueSet conversion completed: ${s}/${e.length} successful, ${o} failed`);}return i}async generateFromPackage(e,t,r){if(await this.initializeCache(),this.cache&&!(this.cacheConfig?.forceRegenerate??false)){let l=this.cache.getByPackage(e);if(l.length>0)return this.logger?.info(`Using cached TypeSchemas for package: ${e} (${l.length} schemas)`),l}let i={name:e,version:t||"latest"},s=await this.registerFromPackageMetas([i]),o=await this.generateValueSetSchemas(s.allVs(),r),c=[...(await Promise.all(s.allFs().map(async l=>await ve(s,l,r)))).flat(),...o];if(this.cache)for(let l of c)await this.cache.set(l);return c}applyStructureDefinitionTreeshaking(e){let t=this.options.treeshake;if(!t||t.length===0)return e;this.logger?.info(`Applying treeshaking filter for ResourceTypes: ${t.join(", ")}`);let r=new Map,i=new Map,s=new Map;for(let p of e){let d=p.name||p.id;d&&(r.set(d,p),i.set(d,new Set),s.set(d,new Set));}for(let p of e){let d=p.name||p.id;if(!d)continue;let{realDeps:m,refTargets:g}=this.extractStructureDefinitionDependenciesWithReferences(p);i.set(d,new Set(m)),s.set(d,new Set(g));}let o=new Set;for(let p of t)r.has(p)?o.add(p):this.logger?.warn(`ResourceType '${p}' not found in structure definitions`);let a=(p,d=new Set)=>{if(d.has(p)||!i.has(p))return;d.add(p);let m=i.get(p)||new Set;for(let g of Array.from(m))r.has(g)&&(o.add(g),a(g,d));};for(let p of Array.from(o))a(p);let c=e.filter(p=>{let d=p.name||p.id;return d&&o.has(d)}),l=new Set;for(let p of e){let d=p.name||p.id;d&&!o.has(d)&&Array.from(s.values()).some(g=>g.has(d))&&l.add(d);}return l.size>0&&this.logger?.info(`Excluded reference-only targets: ${Array.from(l).join(", ")}`),this.logger?.success(`Treeshaking completed: kept ${c.length}/${e.length} structure definitions`),c}extractStructureDefinitionDependenciesWithReferences(e){let t=new Set,r=new Set;if(e.baseDefinition){let i=this.extractResourceNameFromUrl(e.baseDefinition);i&&t.add(i);}if(e.snapshot?.element||e.differential?.element){let i=e.snapshot?.element||e.differential?.element;for(let s of i)if(s.type)for(let o of s.type){if(o.code&&(t.add(o.code),o.code==="Reference"&&o.targetProfile))for(let a of o.targetProfile){let c=this.extractResourceNameFromUrl(a);c&&r.add(c);}if(o.profile)for(let a of o.profile){let c=this.extractResourceNameFromUrl(a);c&&t.add(c);}}}return {realDeps:Array.from(t),refTargets:Array.from(r)}}extractResourceNameFromUrl(e){let t=e.match(/\/([^/]+)$/);return t?t[1]??null:null}};var W=class{options;constructor(e={}){this.options={format:"auto",validate:true,strict:false,...e};}async parseFromFile(e){let t=await readFile(e,"utf-8"),r=this.options.format==="auto"?this.detectFormat(t,e):this.options.format;return this.parseFromString(t,r)}async parseFromString(e,t){let r=t||this.detectFormat(e),i;return r==="ndjson"?i=this.parseNDJSON(e):i=this.parseJSON(e),this.options.validate&&this.validateSchemas(i),i}async parseFromFiles(e){let t=[];for(let r of e){let i=await this.parseFromFile(r);t.push(...i);}return t}parseSchema(e){if(!e.identifier)throw new Error("TypeSchema must have an identifier");if(!this.isValidIdentifier(e.identifier))throw new Error("TypeSchema identifier is invalid");return e}findByIdentifier(e,t){return e.filter(r=>this.matchesIdentifier(r.identifier,t))}findByUrl(e,t){return e.find(r=>r.identifier.url===t)}findByKind(e,t){return e.filter(r=>r.identifier.kind===t)}findByPackage(e,t){return e.filter(r=>r.identifier.package===t)}detectFormat(e,t){if(t){if(t.endsWith(".ndjson"))return "ndjson";if(t.endsWith(".json"))return "json"}let r=e.trim();if(r.includes(`
15
15
  `)){let i=r.split(`
16
16
  `).filter(s=>s.trim());if(i.length>1)try{return i[0]&&JSON.parse(i[0]),"ndjson"}catch{}}return "json"}parseNDJSON(e){let t=[],r=e.split(`
17
- `).filter(i=>i.trim());for(let i of r)try{let s=JSON.parse(i);t.push(this.parseSchema(s));}catch(s){if(this.options.strict)throw new Error(`Failed to parse NDJSON line: ${s}`)}return t}parseJSON(e){try{let t=JSON.parse(e);return Array.isArray(t)?t.map(r=>this.parseSchema(r)):[this.parseSchema(t)]}catch(t){throw new Error(`Failed to parse JSON: ${t}`)}}validateSchemas(e){for(let t of e){if(!t.identifier)throw new Error("Schema missing identifier");if(!this.isValidIdentifier(t.identifier))throw new Error(`Invalid identifier in schema: ${JSON.stringify(t.identifier)}`)}}isValidIdentifier(e){return typeof e=="object"&&e!==null&&typeof e.kind=="string"&&typeof e.package=="string"&&typeof e.version=="string"&&typeof e.name=="string"&&typeof e.url=="string"}matchesIdentifier(e,t){return (!t.kind||e.kind===t.kind)&&(!t.package||e.package===t.package)&&(!t.version||e.version===t.version)&&(!t.name||e.name===t.name)&&(!t.url||e.url===t.url)}};var te="Use CodeableReference which is not provided by FHIR R4.",qr="Use Availability which is not provided by FHIR R4.",Ht={"hl7.fhir.uv.extensions.r4#1.0.0":{"http://hl7.org/fhir/StructureDefinition/extended-contact-availability":qr,"http://hl7.org/fhir/StructureDefinition/immunization-procedure":te,"http://hl7.org/fhir/StructureDefinition/specimen-additive":te,"http://hl7.org/fhir/StructureDefinition/workflow-barrier":te,"http://hl7.org/fhir/StructureDefinition/workflow-protectiveFactor":te,"http://hl7.org/fhir/StructureDefinition/workflow-reason":te},"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."}},_t=async(n,e)=>{let t=[];for(let r of n.allFs()){let i=S(r.package_meta);if(Ht[i]?.[r.url]){e?.dry_warn(`Skip ${r.url} from ${i}. Reason: ${Ht[i]?.[r.url]}`);continue}t.push(...await ve(n,r,e));}for(let r of n.allVs())t.push(await be(n,r));return t};var nt=n=>n.split(/(?<=[a-z])(?=[A-Z])|[-_.\s]/).filter(Boolean),re=n=>nt(n).map(e=>e.toLowerCase()).join("-"),zt=n=>{if(n.length===0)throw new Error("Empty string");return n[0]?.toUpperCase()+n.substring(1).toLowerCase()},qt=n=>{if(n.length===0)throw new Error("Empty string");let[e,...t]=nt(n);return [e?.toLowerCase(),...t.map(zt)].join("")},G=n=>nt(n).map(zt).join("");var E=n=>!n||n.length===0?n:n.charAt(0).toUpperCase()+n.slice(1),xe=n=>n.map(e=>E(e));var Wt=n=>`<${n.identifier.url}> from ${n.identifier.package}#${n.identifier.version}`;var ot=class{opts;currentDir;currentFileDescriptor;writtenFilesSet=new Set;constructor(e){this.opts=e,this.currentDir=e.outputDir;}logger(){return this.opts.logger}cd(e,t){let r=this.currentDir;this.currentDir=e.startsWith("/")?R.join(this.opts.outputDir,e):R.join(this.currentDir,e),F.existsSync(this.currentDir)||F.mkdirSync(this.currentDir,{recursive:true}),this.logger()?.debug(`cd '${this.currentDir}'`),t(),this.currentDir=r;}cat(e,t){if(this.currentFileDescriptor)throw new Error("Can't open file in file");if(e.includes("/"))throw new Error(`Change file path separatly: ${e}`);let r=`${this.currentDir}/${e}`;try{this.currentFileDescriptor=F.openSync(r,"w"),this.writtenFilesSet.add(e),this.logger()?.debug(`cat > '${r}'`),t();}finally{this.currentFileDescriptor&&(F.fsyncSync(this.currentFileDescriptor),F.closeSync(this.currentFileDescriptor)),this.currentFileDescriptor=void 0;}}write(e){if(!this.currentFileDescriptor)throw new Error("No file opened");F.writeSync(this.currentFileDescriptor,e);}generate(e){throw new Error("Not implemented")}writtenFiles(){return Array.from(this.writtenFilesSet)}},J=class extends ot{currentIndent=0;indent(){this.currentIndent+=this.opts.tabSize;}deindent(){this.currentIndent-=this.opts.tabSize;}writeIndent(){this.write(" ".repeat(this.currentIndent));}line(...e){e.length===0?this.write(`
17
+ `).filter(i=>i.trim());for(let i of r)try{let s=JSON.parse(i);t.push(this.parseSchema(s));}catch(s){if(this.options.strict)throw new Error(`Failed to parse NDJSON line: ${s}`)}return t}parseJSON(e){try{let t=JSON.parse(e);return Array.isArray(t)?t.map(r=>this.parseSchema(r)):[this.parseSchema(t)]}catch(t){throw new Error(`Failed to parse JSON: ${t}`)}}validateSchemas(e){for(let t of e){if(!t.identifier)throw new Error("Schema missing identifier");if(!this.isValidIdentifier(t.identifier))throw new Error(`Invalid identifier in schema: ${JSON.stringify(t.identifier)}`)}}isValidIdentifier(e){return typeof e=="object"&&e!==null&&typeof e.kind=="string"&&typeof e.package=="string"&&typeof e.version=="string"&&typeof e.name=="string"&&typeof e.url=="string"}matchesIdentifier(e,t){return (!t.kind||e.kind===t.kind)&&(!t.package||e.package===t.package)&&(!t.version||e.version===t.version)&&(!t.name||e.name===t.name)&&(!t.url||e.url===t.url)}};var te="Use CodeableReference which is not provided by FHIR R4.",qr="Use Availability which is not provided by FHIR R4.",Ht={"hl7.fhir.uv.extensions.r4#1.0.0":{"http://hl7.org/fhir/StructureDefinition/extended-contact-availability":qr,"http://hl7.org/fhir/StructureDefinition/immunization-procedure":te,"http://hl7.org/fhir/StructureDefinition/specimen-additive":te,"http://hl7.org/fhir/StructureDefinition/workflow-barrier":te,"http://hl7.org/fhir/StructureDefinition/workflow-protectiveFactor":te,"http://hl7.org/fhir/StructureDefinition/workflow-reason":te},"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."}},_t=async(n,e)=>{let t=[];for(let r of n.allFs()){let i=S(r.package_meta);if(Ht[i]?.[r.url]){e?.dry_warn(`Skip ${r.url} from ${i}. Reason: ${Ht[i]?.[r.url]}`);continue}t.push(...await ve(n,r,e));}for(let r of n.allVs())t.push(await be(n,r));return t};var nt=n=>n.split(/(?<=[a-z])(?=[A-Z])|[-_.\s]/).filter(Boolean),re=n=>nt(n).map(e=>e.toLowerCase()).join("-"),zt=n=>{if(n.length===0)throw new Error("Empty string");return n[0]?.toUpperCase()+n.substring(1).toLowerCase()},qt=n=>{if(n.length===0)throw new Error("Empty string");let[e,...t]=nt(n);return [e?.toLowerCase(),...t.map(zt)].join("")},G=n=>nt(n).map(zt).join("");var E=n=>!n||n.length===0?n:n.charAt(0).toUpperCase()+n.slice(1),xe=n=>n.map(e=>E(e));var Wt=n=>`<${n.identifier.url}> from ${n.identifier.package}#${n.identifier.version}`;var ot=class{opts;currentDir;currentFileDescriptor;writtenFilesSet=new Set;constructor(e){this.opts=e,this.currentDir=e.outputDir;}logger(){return this.opts.logger}cd(e,t){let r=this.currentDir;this.currentDir=e.startsWith("/")?R.join(this.opts.outputDir,e):R.join(this.currentDir,e),F.existsSync(this.currentDir)||F.mkdirSync(this.currentDir,{recursive:true}),this.logger()?.debug(`cd '${this.currentDir}'`),t(),this.currentDir=r;}cat(e,t){if(this.currentFileDescriptor)throw new Error("Can't open file in file");if(e.includes("/"))throw new Error(`Change file path separatly: ${e}`);let r=`${this.currentDir}/${e}`;try{this.currentFileDescriptor=F.openSync(r,"w"),this.writtenFilesSet.add(e),this.logger()?.debug(`cat > '${r}'`),t();}finally{this.currentFileDescriptor&&(F.fsyncSync(this.currentFileDescriptor),F.closeSync(this.currentFileDescriptor)),this.currentFileDescriptor=void 0;}}write(e){if(!this.currentFileDescriptor)throw new Error("No file opened");F.writeSync(this.currentFileDescriptor,e);}async generate(e){throw new Error("Not implemented")}writtenFiles(){return Array.from(this.writtenFilesSet)}},J=class extends ot{currentIndent=0;indent(){this.currentIndent+=this.opts.tabSize;}deindent(){this.currentIndent-=this.opts.tabSize;}writeIndent(){this.write(" ".repeat(this.currentIndent));}line(...e){e.length===0?this.write(`
18
18
  `):(this.writeIndent(),this.write(`${e.join(" ")}
19
19
  `));}lineSM(...e){this.writeIndent(),this.write(`${e.join(" ")};
20
20
  `);}comment(...e){let t=e.join(" ").split(`
21
- `);for(let r of t)this.line(this.opts.commentLinePrefix,r);}debugComment(...e){this.opts.withDebugComment&&(e=e.map(t=>typeof t=="string"?t:JSON.stringify(t,null,2)),this.comment(...e));}disclaimer(){return ["WARNING: This file is autogenerated by @atomic-ehr/codegen.","GitHub: https://github.com/orgs/atomic-ehr/repositories","Any manual changes made to this file may be overwritten."]}generateDisclaimer(){this.disclaimer().forEach(e=>this.comment(e)),this.line();}indentBlock(e){this.indent(),e(),this.deindent();}curlyBlock(e,t,r){this.line(`${e.filter(Boolean).join(" ")} {`),this.indent(),t(),this.deindent(),this.line(`}${r?.filter(Boolean).join(" ")??""}`);}squareBlock(e,t,r){this.line(`${e.filter(Boolean).join(" ")} [`),this.indent(),t(),this.deindent(),this.line(`]${r?.filter(Boolean).join(" ")??""}`);}};var Jt={"!":"Not","<=":"LessOrEqual",">=":"GreaterOrEqual","<":"Less",">":"Greater","=":"Equal","-":"Dash","+":"Plus","*":"Asterisk","/":"Slash","%":"Percent","&":"And","|":"Or","^":"Xor","~":"Tilde","?":"Question",".":"Dot"};function Wr(n){return n.split("-").map(e=>E(e)).join("-")}function Jr(n){let e=n;for(let t in Jt)e=e.replaceAll(t,Jt[t]??"");return e}function Kr(n){let e=Number(n[0]);return Number.isInteger(e)&&!Number.isNaN(e)?`_${n}`:n}function Kt(n){let e=Wr(n);return e=Kr(e),e=Jr(e),e=E(e),e}function M(n){return E(qt(n.replaceAll(".","-")))}var Yr={boolean:"bool",instant:"string",time:"string",date:"string",dateTime:"string",decimal:"decimal",integer:"int",unsignedInt:"long",positiveInt:"long",integer64:"long",base64Binary:"string",uri:"string",url:"string",canonical:"string",oid:"string",uuid:"string",string:"string",code:"string",markdown:"string",id:"string",xhtml:"string"},Zr=["Reference","Expression"],Xr=n=>n.required?["required"]:[],Qr=n=>{let e=Qt(Xt(n.identifier));return E(e)},ei=n=>n.base?`: ${n.base.name}`:"",ti=(n,e=true)=>{if(!n)return;let t=n.split("/").pop();if(t&&(e&&t.includes("#")&&(t=t.split("#")[0]),!!t))return /^\d/.test(t)&&(t=`number_${t}`),M(t)},Xt=n=>{if(n.kind==="nested"){let e=n.url,t=ti(e,false);if(!t)return "";let[r,i]=t.split("#"),s=xe((i??"").split(".")).join("");return M([r,s].join(""))}return M(n.name)},ri=n=>Zr.includes(n),Qt=n=>ri(n)?`Resource${n}`:n,we=class extends J{enums={};constructor(e){super({tabSize:4,withDebugComment:false,commentLinePrefix:"//",...e});}generate(e){let t=e.collectComplexTypes(),r=e.collectResources(),i=Array.from(new Set(r.map(s=>M(s.identifier.package))));this.generateAllFiles(t,r,i),this.copyStaticFiles();}generateAllFiles(e,t,r){this.generateUsingFile(r),this.generateBaseTypes(e),this.generateResources(t),this.generateEnumFiles(r),this.generateResourceDictionaries(t,r),this.generateHelperFile();}generateType(e,t){let r=Qr(e),i=ei(e);this.curlyBlock(["public","class",r,i],()=>{this.generateFields(e,t),this.generateNestedTypes(e,t),this.line(),this.includeHelperMethods();}),this.line();}generateFields(e,t){if(!e.fields)return;let r=Object.entries(e.fields).sort(([i],[s])=>i.localeCompare(s));for(let[i,s]of r)this.generateField(i,s,t);}generateNestedTypes(e,t){if(!(!("nested"in e)||!e.nested)){this.line();for(let r of e.nested)this.generateType(r,t);}}generateField(e,t,r){try{if(q(t))return;let i=this.buildFieldDeclaration(e,t,r);this.line(...i);}catch(i){this.logger()?.error(`Error processing field ${e}: ${i.message}`);}}buildFieldDeclaration(e,t,r){let i=this.determineFieldType(e,t,r),s=Xr(t),o=G(e);return ["public",...s,i,o,"{ get; set; }"].filter(Boolean)}determineFieldType(e,t,r){let i=this.getBaseTypeName(t);"enum"in t&&t.enum&&(i=this.registerAndGetEnumType(e,t,r)),i=Qt(i);let s="",o=t.required?"":"?",a=t.array?"[]":"";return `${s}${i}${a}${o}`}getBaseTypeName(e){if("type"in e){let t=e.type.name.toString();return e.type.kind==="nested"?t=Xt(e.type):e.type.kind==="primitive-type"&&(t=Yr[e.type.name]??"string"),t}return ""}registerAndGetEnumType(e,t,r){let s=`${M(t.binding?.name??e)}Enum`;return this.enums[r]||(this.enums[r]={}),t.enum&&(this.enums[r][s]=t.enum),s}includeHelperMethods(){this.line("public override string ToString() => "),this.line(" JsonSerializer.Serialize(this, Helper.JsonSerializerOptions);"),this.line();}generateUsingFile(e){this.cd("/",async()=>{this.cat("Usings.cs",()=>{this.generateDisclaimer(),this.generateGlobalUsings(e);});});}generateGlobalUsings(e){let t=["CSharpSDK","System.Text.Json","System.Text.Json.Serialization",this.opts.targetNamespace,...e.map(r=>`${this.opts.targetNamespace}.${r}`)];for(let r of t)this.lineSM("global","using",r);}generateBaseTypes(e){this.cd("/",async()=>{this.cat("base.cs",()=>{this.generateDisclaimer(),this.line(),this.lineSM("namespace",this.opts.targetNamespace);for(let t of e){let r=M(t.identifier.package);this.generateType(t,r);}});});}generateResources(e){for(let t of e)this.generateResourceFile(t);}generateResourceFile(e){let t=M(e.identifier.package);this.cd(`/${t}`,async()=>{this.cat(`${e.identifier.name}.cs`,()=>{this.generateDisclaimer(),this.line(),this.lineSM("namespace",`${this.opts.targetNamespace}.${t}`),this.line(),this.generateType(e,t);});});}generateEnumFiles(e){for(let t of e)this.generatePackageEnums(t);}generatePackageEnums(e){let t=this.enums[e];!t||Object.keys(t).length===0||this.cd(`/${e}`,async()=>{this.cat(`${e}Enums.cs`,()=>{this.generateDisclaimer(),this.generateEnumFileContent(e,t);});});}generateEnumFileContent(e,t){this.lineSM("using","System.ComponentModel"),this.line(),this.lineSM(`namespace ${this.opts.targetNamespace}.${e}`);for(let[r,i]of Object.entries(t))this.generateEnum(r,i);}generateEnum(e,t){this.curlyBlock(["public","enum",e],()=>{for(let r of t)this.line(`[Description("${r}")]`),this.line(`${Kt(r)},`);}),this.line();}generateResourceDictionaries(e,t){this.cd("/",async()=>{for(let r of t){let i=e.filter(s=>M(s.identifier.package)===r);if(i.length===0)return;this.cat(`${r}ResourceDictionary.cs`,()=>{this.generateDisclaimer(),this.line(),this.lineSM(`namespace ${this.opts.targetNamespace}`),this.generateResourceDictionaryClass(r,i);});}});}generateResourceDictionaryClass(e,t){this.curlyBlock(["public","static","class","ResourceDictionary"],()=>{this.curlyBlock(["public static readonly Dictionary<Type, string> Map = new()"],()=>{for(let r of t){let i=r.identifier.name;this.line(`{ typeof(${e}.${i}), "${i}" },`);}}),this.lineSM();});}copyStaticFiles(){if(!this.opts.staticSourceDir)return;let e=R__default.resolve(this.opts.staticSourceDir);F__default.cpSync(e,this.opts.outputDir,{recursive:true});}generateHelperFile(){let e="src/api/writer-generator/csharp/Helper.cs",t=R__default.join(this.opts.outputDir,"Helper.cs");F__default.copyFileSync(e,t);}};var at=n=>{let e={};for(let t of n){let r=t.identifier.package;e[r]||(e[r]=[]),e[r].push(t);}for(let[t,r]of Object.entries(e)){let i={};for(let o of r)i[JSON.stringify(o.identifier)]=o;let s=Object.values(i);s.sort((o,a)=>o.identifier.name.localeCompare(a.identifier.name)),e[t]=s;}return e},ii=(n,e,t)=>{if(n=structuredClone(n),kt(n)||Ft(n)||Z(n))return n;for(let r of e.ignoreFields??[]){if(n.fields&&!n.fields[r])throw new Error(`Field ${r} not found`);n.fields&&delete n.fields[r];}return n.dependencies=tt(n.identifier,n.base,n.fields,n.nested),n},rr=(n,e,t)=>{let r=[];for(let[o,a]of Object.entries(e))for(let[c,l]of Object.entries(a)){let p=n.resolveByUrl(o,c);if(!p)throw new Error(`Schema not found for ${o} ${c}`);let d=ii(p,l);r.push(d);}let i=(o,a)=>{if(o.length===0)return Object.values(a);for(let l of o)a[JSON.stringify(l.identifier)]=l;let c=[];for(let l of o)if(z(l)){if(!l.dependencies)continue;if(l.dependencies.forEach(p=>{let d=n.resolve(p);if(!d)throw new Error(`Schema not found for ${p}`);let m=JSON.stringify(d.identifier);a[m]||c.push(d);}),l.nested)for(let p of l.nested){if(N(p.identifier))continue;let d=JSON.stringify(p.identifier);a[d]||c.push(p);}}return i(c,a)},s=i(r,{});return ct(s,t)},ni=n=>{let e=n.filter(P),t=[];for(let s of e)s.base&&t.push({parent:s.base,child:s.identifier});let r=[...t],i=s=>{let o=t.filter(c=>c.parent.name===s.name).map(c=>c.child),a=[];for(let c of o)a.push(...i(c));return [...o,...a]};for(let s of t){let o=i(s.child);for(let a of o)t.some(c=>c.parent.name===s.parent.name&&c.child.name===a.name)||r.push({parent:s.parent,child:a});}return r},ct=(n,e)=>{let t={},r=u=>{let f=u.identifier.url,y=u.identifier.package;if(t[f]||(t[f]={}),t[f][u.identifier.package]&&y!=="shared"){let T=JSON.stringify(u.identifier,void 0,2),v=JSON.stringify(t[f][y]?.identifier,void 0,2);if(T!==v)throw new Error(`Duplicate schema: ${T} and ${v}`);return}t[f][y]=u;};for(let u of n)r(u);let i=ni(n),s=u=>t[u.url]?.[u.package],o=(u,f)=>t[f]?.[u],a=u=>i.filter(f=>f.parent.name===u.name).map(f=>f.child),c=u=>{let f=[],y=u;for(;y;){f.push(y);let T=y.base;if(T===void 0)break;let v=s(T);if(!v){e?.warn(`Failed to resolve base type: ${f.map(w=>`${w.identifier.url} (${w.identifier.kind})`).join(", ")}`);return}y=v;}return f},l=u=>{let f=c(u);if(f===void 0)throw new Error(`Failed to resolve base type: ${u.identifier.url} (${u.identifier.kind})`);return f},p=u=>{let f=l(u).find(y=>y.identifier.kind!=="profile");if(!f)throw new Error(`No non-constraint schema found in hierarchy for: ${u.identifier.name}`);return f};return {_schemaIndex:t,_relations:i,collectComplexTypes:()=>n.filter(wt),collectResources:()=>n.filter(P),collectLogicalModels:()=>n.filter(Ct),collectProfiles:()=>n.filter(de),resolve:s,resolveByUrl:o,resourceChildren:a,tryHierarchy:c,hierarchy:l,findLastSpecialization:p,findLastSpecializationByIdentifier:u=>{let f=s(u);return f?p(f).identifier:u},flatProfile:u=>{let f=l(u),y=f.filter(k=>k.identifier.kind==="profile"),T=f.find(k=>k.identifier.kind!=="profile");if(!T)throw new Error(`No non-constraint schema found in hierarchy for ${u.identifier.name}`);let v={};for(let k of y.slice().reverse()){let ae=k;if(ae.fields)for(let[ce,vt]of Object.entries(ae.fields))v[ce]?v[ce]={...v[ce],...vt}:v[ce]={...vt};}let w={};for(let k of y.flatMap(ae=>ae.dependencies??[]))w[k.url]=k;let Y=Object.values(w);return {...u,base:T.identifier,fields:v,dependencies:Y}},isWithMetaField:u=>{let f=c(u);return f?f.filter(z).some(y=>y.fields?.meta!==void 0):false},exportTree:async u=>{let f={};for(let[T,v]of Object.entries(at(n))){f[T]={"primitive-type":{},"complex-type":{},resource:{},"value-set":{},nested:{},binding:{},profile:{},logical:{}};for(let w of v){w.identifier;f[T][w.identifier.kind][w.identifier.url]={};}}let y=u.endsWith(".yaml")?tr.stringify(f):JSON.stringify(f,void 0,2);await L.mkdir(R.dirname(u),{recursive:true}),await L.writeFile(u,y);}}};ne();var Re=class{constructor(e){this.options=e;}handleError(e,t){e instanceof $?this.handleGeneratorError(e,t):this.handleUnknownError(e,t);}handleBatchErrors(e){let t=e.filter(i=>i instanceof $),r=e.filter(i=>!(i instanceof $));t.length>0&&this.reportBatchErrors(t),r.forEach(i=>{this.handleUnknownError(i);});}handleGeneratorError(e,t){switch(this.options.outputFormat){case "json":this.reportErrorAsJson(e);break;case "structured":this.reportErrorStructured(e);break;default:this.reportErrorToConsole(e);}}handleUnknownError(e,t){this.options.logger.error("Unexpected error occurred:",e),this.options.verbose&&(this.options.logger.error(`
21
+ `);for(let r of t)this.line(this.opts.commentLinePrefix,r);}debugComment(...e){this.opts.withDebugComment&&(e=e.map(t=>typeof t=="string"?t:JSON.stringify(t,null,2)),this.comment(...e));}disclaimer(){return ["WARNING: This file is autogenerated by @atomic-ehr/codegen.","GitHub: https://github.com/orgs/atomic-ehr/repositories","Any manual changes made to this file may be overwritten."]}generateDisclaimer(){this.disclaimer().forEach(e=>{this.comment(e);}),this.line();}indentBlock(e){this.indent(),e(),this.deindent();}curlyBlock(e,t,r){this.line(`${e.filter(Boolean).join(" ")} {`),this.indent(),t(),this.deindent(),this.line(`}${r?.filter(Boolean).join(" ")??""}`);}squareBlock(e,t,r){this.line(`${e.filter(Boolean).join(" ")} [`),this.indent(),t(),this.deindent(),this.line(`]${r?.filter(Boolean).join(" ")??""}`);}};var Jt={"!":"Not","<=":"LessOrEqual",">=":"GreaterOrEqual","<":"Less",">":"Greater","=":"Equal","-":"Dash","+":"Plus","*":"Asterisk","/":"Slash","%":"Percent","&":"And","|":"Or","^":"Xor","~":"Tilde","?":"Question",".":"Dot"};function Wr(n){return n.split("-").map(e=>E(e)).join("-")}function Jr(n){let e=n;for(let t in Jt)e=e.replaceAll(t,Jt[t]??"");return e}function Kr(n){let e=Number(n[0]);return Number.isInteger(e)&&!Number.isNaN(e)?`_${n}`:n}function Kt(n){let e=Wr(n);return e=Kr(e),e=Jr(e),e=E(e),e}function M(n){return E(qt(n.replaceAll(".","-")))}var Yr={boolean:"bool",instant:"string",time:"string",date:"string",dateTime:"string",decimal:"decimal",integer:"int",unsignedInt:"long",positiveInt:"long",integer64:"long",base64Binary:"string",uri:"string",url:"string",canonical:"string",oid:"string",uuid:"string",string:"string",code:"string",markdown:"string",id:"string",xhtml:"string"},Zr=["Reference","Expression"],Xr=n=>n.required?["required"]:[],Qr=n=>{let e=Qt(Xt(n.identifier));return E(e)},ei=n=>n.base?`: ${n.base.name}`:"",ti=(n,e=true)=>{if(!n)return;let t=n.split("/").pop();if(t&&(e&&t.includes("#")&&(t=t.split("#")[0]),!!t))return /^\d/.test(t)&&(t=`number_${t}`),M(t)},Xt=n=>{if(n.kind==="nested"){let e=n.url,t=ti(e,false);if(!t)return "";let[r,i]=t.split("#"),s=xe((i??"").split(".")).join("");return M([r,s].join(""))}return M(n.name)},ri=n=>Zr.includes(n),Qt=n=>ri(n)?`Resource${n}`:n,we=class extends J{enums={};constructor(e){super({tabSize:4,withDebugComment:false,commentLinePrefix:"//",...e});}async generate(e){let t=e.collectComplexTypes(),r=e.collectResources(),i=Array.from(new Set(r.map(s=>M(s.identifier.package))));this.generateAllFiles(t,r,i),this.copyStaticFiles();}generateAllFiles(e,t,r){this.generateUsingFile(r),this.generateBaseTypes(e),this.generateResources(t),this.generateEnumFiles(r),this.generateResourceDictionaries(t,r),this.generateHelperFile();}generateType(e,t){let r=Qr(e),i=ei(e);this.curlyBlock(["public","class",r,i],()=>{this.generateFields(e,t),this.generateNestedTypes(e,t),this.line(),this.includeHelperMethods();}),this.line();}generateFields(e,t){if(!e.fields)return;let r=Object.entries(e.fields).sort(([i],[s])=>i.localeCompare(s));for(let[i,s]of r)this.generateField(i,s,t);}generateNestedTypes(e,t){if(!(!("nested"in e)||!e.nested)){this.line();for(let r of e.nested)this.generateType(r,t);}}generateField(e,t,r){try{if(q(t))return;let i=this.buildFieldDeclaration(e,t,r);this.line(...i);}catch(i){this.logger()?.error(`Error processing field ${e}: ${i.message}`);}}buildFieldDeclaration(e,t,r){let i=this.determineFieldType(e,t,r),s=Xr(t),o=G(e);return ["public",...s,i,o,"{ get; set; }"].filter(Boolean)}determineFieldType(e,t,r){let i=this.getBaseTypeName(t);"enum"in t&&t.enum&&(i=this.registerAndGetEnumType(e,t,r)),i=Qt(i);let s="",o=t.required?"":"?",a=t.array?"[]":"";return `${s}${i}${a}${o}`}getBaseTypeName(e){if("type"in e){let t=e.type.name.toString();return e.type.kind==="nested"?t=Xt(e.type):e.type.kind==="primitive-type"&&(t=Yr[e.type.name]??"string"),t}return ""}registerAndGetEnumType(e,t,r){let s=`${M(t.binding?.name??e)}Enum`;return this.enums[r]||(this.enums[r]={}),t.enum&&(this.enums[r][s]=t.enum),s}includeHelperMethods(){this.line("public override string ToString() => "),this.line(" JsonSerializer.Serialize(this, Helper.JsonSerializerOptions);"),this.line();}generateUsingFile(e){this.cd("/",async()=>{this.cat("Usings.cs",()=>{this.generateDisclaimer(),this.generateGlobalUsings(e);});});}generateGlobalUsings(e){let t=["CSharpSDK","System.Text.Json","System.Text.Json.Serialization",this.opts.targetNamespace,...e.map(r=>`${this.opts.targetNamespace}.${r}`)];for(let r of t)this.lineSM("global","using",r);}generateBaseTypes(e){this.cd("/",async()=>{this.cat("base.cs",()=>{this.generateDisclaimer(),this.line(),this.lineSM("namespace",this.opts.targetNamespace);for(let t of e){let r=M(t.identifier.package);this.generateType(t,r);}});});}generateResources(e){for(let t of e)this.generateResourceFile(t);}generateResourceFile(e){let t=M(e.identifier.package);this.cd(`/${t}`,async()=>{this.cat(`${e.identifier.name}.cs`,()=>{this.generateDisclaimer(),this.line(),this.lineSM("namespace",`${this.opts.targetNamespace}.${t}`),this.line(),this.generateType(e,t);});});}generateEnumFiles(e){for(let t of e)this.generatePackageEnums(t);}generatePackageEnums(e){let t=this.enums[e];!t||Object.keys(t).length===0||this.cd(`/${e}`,async()=>{this.cat(`${e}Enums.cs`,()=>{this.generateDisclaimer(),this.generateEnumFileContent(e,t);});});}generateEnumFileContent(e,t){this.lineSM("using","System.ComponentModel"),this.line(),this.lineSM(`namespace ${this.opts.targetNamespace}.${e}`);for(let[r,i]of Object.entries(t))this.generateEnum(r,i);}generateEnum(e,t){this.curlyBlock(["public","enum",e],()=>{for(let r of t)this.line(`[Description("${r}")]`),this.line(`${Kt(r)},`);}),this.line();}generateResourceDictionaries(e,t){this.cd("/",async()=>{for(let r of t){let i=e.filter(s=>M(s.identifier.package)===r);if(i.length===0)return;this.cat(`${r}ResourceDictionary.cs`,()=>{this.generateDisclaimer(),this.line(),this.lineSM(`namespace ${this.opts.targetNamespace}`),this.generateResourceDictionaryClass(r,i);});}});}generateResourceDictionaryClass(e,t){this.curlyBlock(["public","static","class","ResourceDictionary"],()=>{this.curlyBlock(["public static readonly Dictionary<Type, string> Map = new()"],()=>{for(let r of t){let i=r.identifier.name;this.line(`{ typeof(${e}.${i}), "${i}" },`);}}),this.lineSM();});}copyStaticFiles(){if(!this.opts.staticSourceDir)return;let e=R__default.resolve(this.opts.staticSourceDir);F__default.cpSync(e,this.opts.outputDir,{recursive:true});}generateHelperFile(){let e="src/api/writer-generator/csharp/Helper.cs",t=R__default.join(this.opts.outputDir,"Helper.cs");F__default.copyFileSync(e,t);}};var at=n=>{let e={};for(let t of n){let r=t.identifier.package;e[r]||(e[r]=[]),e[r].push(t);}for(let[t,r]of Object.entries(e)){let i={};for(let o of r)i[JSON.stringify(o.identifier)]=o;let s=Object.values(i);s.sort((o,a)=>o.identifier.name.localeCompare(a.identifier.name)),e[t]=s;}return e},ii=(n,e,t)=>{if(n=structuredClone(n),kt(n)||Ft(n)||Z(n))return n;for(let r of e.ignoreFields??[]){if(n.fields&&!n.fields[r])throw new Error(`Field ${r} not found`);n.fields&&delete n.fields[r];}return n.dependencies=tt(n.identifier,n.base,n.fields,n.nested),n},rr=(n,e,t)=>{let r=[];for(let[o,a]of Object.entries(e))for(let[c,l]of Object.entries(a)){let p=n.resolveByUrl(o,c);if(!p)throw new Error(`Schema not found for ${o} ${c}`);let d=ii(p,l);r.push(d);}let i=(o,a)=>{if(o.length===0)return Object.values(a);for(let l of o)a[JSON.stringify(l.identifier)]=l;let c=[];for(let l of o)if(z(l)){if(!l.dependencies)continue;if(l.dependencies.forEach(p=>{let d=n.resolve(p);if(!d)throw new Error(`Schema not found for ${p}`);let m=JSON.stringify(d.identifier);a[m]||c.push(d);}),l.nested)for(let p of l.nested){if(N(p.identifier))continue;let d=JSON.stringify(p.identifier);a[d]||c.push(p);}}return i(c,a)},s=i(r,{});return ct(s,t)},ni=n=>{let e=n.filter(P),t=[];for(let s of e)s.base&&t.push({parent:s.base,child:s.identifier});let r=[...t],i=s=>{let o=t.filter(c=>c.parent.name===s.name).map(c=>c.child),a=[];for(let c of o)a.push(...i(c));return [...o,...a]};for(let s of t){let o=i(s.child);for(let a of o)t.some(c=>c.parent.name===s.parent.name&&c.child.name===a.name)||r.push({parent:s.parent,child:a});}return r},ct=(n,e)=>{let t={},r=u=>{let f=u.identifier.url,y=u.identifier.package;if(t[f]||(t[f]={}),t[f][u.identifier.package]&&y!=="shared"){let T=JSON.stringify(u.identifier,void 0,2),v=JSON.stringify(t[f][y]?.identifier,void 0,2);if(T!==v)throw new Error(`Duplicate schema: ${T} and ${v}`);return}t[f][y]=u;};for(let u of n)r(u);let i=ni(n),s=u=>t[u.url]?.[u.package],o=(u,f)=>t[f]?.[u],a=u=>i.filter(f=>f.parent.name===u.name).map(f=>f.child),c=u=>{let f=[],y=u;for(;y;){f.push(y);let T=y.base;if(T===void 0)break;let v=s(T);if(!v){e?.warn(`Failed to resolve base type: ${f.map(w=>`${w.identifier.url} (${w.identifier.kind})`).join(", ")}`);return}y=v;}return f},l=u=>{let f=c(u);if(f===void 0)throw new Error(`Failed to resolve base type: ${u.identifier.url} (${u.identifier.kind})`);return f},p=u=>{let f=l(u).find(y=>y.identifier.kind!=="profile");if(!f)throw new Error(`No non-constraint schema found in hierarchy for: ${u.identifier.name}`);return f};return {_schemaIndex:t,_relations:i,collectComplexTypes:()=>n.filter(wt),collectResources:()=>n.filter(P),collectLogicalModels:()=>n.filter(Ct),collectProfiles:()=>n.filter(de),resolve:s,resolveByUrl:o,resourceChildren:a,tryHierarchy:c,hierarchy:l,findLastSpecialization:p,findLastSpecializationByIdentifier:u=>{let f=s(u);return f?p(f).identifier:u},flatProfile:u=>{let f=l(u),y=f.filter(k=>k.identifier.kind==="profile"),T=f.find(k=>k.identifier.kind!=="profile");if(!T)throw new Error(`No non-constraint schema found in hierarchy for ${u.identifier.name}`);let v={};for(let k of y.slice().reverse()){let ae=k;if(ae.fields)for(let[ce,vt]of Object.entries(ae.fields))v[ce]?v[ce]={...v[ce],...vt}:v[ce]={...vt};}let w={};for(let k of y.flatMap(ae=>ae.dependencies??[]))w[k.url]=k;let Y=Object.values(w);return {...u,base:T.identifier,fields:v,dependencies:Y}},isWithMetaField:u=>{let f=c(u);return f?f.filter(z).some(y=>y.fields?.meta!==void 0):false},exportTree:async u=>{let f={};for(let[T,v]of Object.entries(at(n))){f[T]={"primitive-type":{},"complex-type":{},resource:{},"value-set":{},nested:{},binding:{},profile:{},logical:{}};for(let w of v){w.identifier;f[T][w.identifier.kind][w.identifier.url]={};}}let y=u.endsWith(".yaml")?tr.stringify(f):JSON.stringify(f,void 0,2);await L.mkdir(R.dirname(u),{recursive:true}),await L.writeFile(u,y);}}};ne();var Re=class{constructor(e){this.options=e;}handleError(e,t){e instanceof $?this.handleGeneratorError(e,t):this.handleUnknownError(e,t);}handleBatchErrors(e){let t=e.filter(i=>i instanceof $),r=e.filter(i=>!(i instanceof $));t.length>0&&this.reportBatchErrors(t),r.forEach(i=>{this.handleUnknownError(i);});}handleGeneratorError(e,t){switch(this.options.outputFormat){case "json":this.reportErrorAsJson(e);break;case "structured":this.reportErrorStructured(e);break;default:this.reportErrorToConsole(e);}}handleUnknownError(e,t){this.options.logger.error("Unexpected error occurred:",e),this.options.verbose&&(this.options.logger.error(`
22
22
  \u{1F6A8} Unexpected Error Details:`),this.options.logger.error(` Type: ${e.constructor.name}`),this.options.logger.error(` Message: ${e.message}`),e.stack&&this.options.logger.error(` Stack: ${e.stack}`),t?.schema&&this.options.logger.error(` Schema: ${t.schema.identifier.name}`),t?.filename&&this.options.logger.error(` File: ${t.filename}`)),this.options.logger.error(`
23
23
  \u{1F4A1} General troubleshooting suggestions:`),this.options.logger.error(" \u2022 Run with --verbose flag for more details"),this.options.logger.error(" \u2022 Check your input files for corruption"),this.options.logger.error(" \u2022 Update to the latest version of atomic-codegen"),this.options.logger.error(" \u2022 Report this issue at: https://github.com/atomic-ehr/codegen/issues");}reportErrorToConsole(e){if("getFormattedMessage"in e)this.options.logger.error(e.getFormattedMessage());else {this.options.logger.error(`
24
24
  \u274C ${e.constructor.name}: ${e.message}`);let t=e.getSuggestions();t.length>0&&(this.options.logger.error(`
@@ -30,15 +30,15 @@ import Ei from'yargs';import {hideBin}from'yargs/helpers';import'perf_hooks';imp
30
30
 
31
31
  `)),i?`${r}
32
32
 
33
- ${i}`:r}filterAndSortSchemas(e){return this.collectedValueSets=this.collectValueSets(e),e.filter(t=>!this.shouldSkipSchema(t))}async validateContent(e,t){let r=/export\s+(interface|class|type|enum)\s+\w+/.test(e),i=e.includes("{")&&e.includes("}");if(!r)throw new Error(`Generated content for ${t.schema.identifier.name} does not contain valid export statements`);if(!i)throw new Error(`Generated content for ${t.schema.identifier.name} has invalid syntax (missing braces)`)}async transformSchemas(e){let t=[];for(let r of e){let i=await this.transformSchema(r);i&&t.push(i);}return t}async transformSchema(e){if(this.shouldSkipSchema(e))return;let t={schema:e,typeMapper:this.typeMapper,filename:this.getFilenameForSchema(e),language:"TypeScript",timestamp:new Date().toISOString()},r=await this.generateSchemaContent(e,t);if(!r.trim())return;let i=this.extractImportsFromContent(r,e),s=this.extractExportsFromContent(r,e),o=this.getFilenameForSchema(e);return {content:r,imports:i,exports:Array.from(s),filename:o}}shouldGenerateValueSet(e){if(!Z(e)||!e.enum||!Array.isArray(e.enum)||e.enum.length===0)return false;switch(this.options.valueSetMode||"required-only"){case "all":return true;case "required-only":return e.strength==="required";case "custom":return (this.options.valueSetStrengths||["required"]).includes(e.strength);default:return e.strength==="required"}}collectValueSets(e){let t=new Map;for(let r of e)if(this.shouldGenerateValueSet(r)&&Z(r)){let i=this.typeMapper.formatTypeName(r.identifier.name);t.set(i,r);}return t}shouldUseValueSetType(e){if(!e||!this.tsOptions.generateValueSets)return false;let t=this.typeMapper.formatTypeName(e.name);return this.collectedValueSets.has(t)}getValueSetTypeName(e){return this.typeMapper.formatTypeName(e.name)}shouldUseInlineEnum(e){return !e||this.tsOptions.generateValueSets?false:e.enum&&Array.isArray(e.enum)&&e.enum.length>0}generateInlineEnumType(e){return !e.enum||!Array.isArray(e.enum)?"string":e.enum.map(r=>`'${r}'`).join(" | ")}shouldSkipSchema(e){if(e.identifier.kind==="value-set"||e.identifier.kind==="binding"||e.identifier.kind==="primitive-type")return true;if(!this.tsOptions.includeExtensions){let t=e.identifier.url;if(t?.includes("StructureDefinition/")){let r=t.split("StructureDefinition/")[1];if(r){let i=r.includes("-"),s=e.identifier.kind==="profile";if(i&&s)return true}}}return false}getFilenameForSchema(e){return `${this.typeMapper.formatFileName(e.identifier.name)}${this.getFileExtension()}`}extractImportsFromContent(e,t){let r=new Map,i=/import\s+(?:type\s+)?{\s*([^}]+)\s*}\s+from\s+['"]([^'"]+)['"];?/g,s;for(;(s=i.exec(e))!==null;){let o=s[1],a=s[2];if(!o||!a)continue;let c=o.split(",").map(l=>l.trim());for(let l of c)r.set(l,a);}return r}extractExportsFromContent(e,t){let r=new Set,i=/export\s+(?:interface|class|enum|type)\s+([A-Za-z_$][A-Za-z0-9_$]*)/g,s;for(;(s=i.exec(e))!==null;)s[1]&&r.add(s[1]);return r.add(this.typeMapper.formatTypeName(t.identifier.name)),r}generateReferenceInterface(e){let t=[],r=new Set;if("fields"in e&&e.fields)for(let[,i]of Object.entries(e.fields))this.collectFieldImports(i).forEach(o=>r.add(o));if(t.push("import type { ResourceType } from './utilities.js';"),r.size>0){let i=Array.from(r).sort();for(let s of i)t.push(`import type { ${s} } from './${s}.js';`);}if(t.push(""),this.tsOptions.includeDocuments&&e.description&&(t.push("/**"),t.push(` * ${e.description}`),e.identifier.url&&t.push(` * @see ${e.identifier.url}`),e.identifier.package&&t.push(` * @package ${e.identifier.package}`),t.push(" * @template T - The resource type being referenced"),t.push(" */")),t.push("export interface Reference<T extends ResourceType = ResourceType> {"),"fields"in e&&e.fields)for(let[i,s]of Object.entries(e.fields))if(i==="type")t.push(" type?: T;");else {let o=this.generateFieldLines(i,s);for(let a of o)a&&t.push(` ${a}`);}return t.push("}"),t.join(`
33
+ ${i}`:r}filterAndSortSchemas(e){return this.collectedValueSets=this.collectValueSets(e),e.filter(t=>!this.shouldSkipSchema(t))}async validateContent(e,t){let r=/export\s+(interface|class|type|enum)\s+\w+/.test(e),i=e.includes("{")&&e.includes("}");if(!r)throw new Error(`Generated content for ${t.schema.identifier.name} does not contain valid export statements`);if(!i)throw new Error(`Generated content for ${t.schema.identifier.name} has invalid syntax (missing braces)`)}async transformSchemas(e){let t=[];for(let r of e){let i=await this.transformSchema(r);i&&t.push(i);}return t}async transformSchema(e){if(this.shouldSkipSchema(e))return;let t={schema:e,typeMapper:this.typeMapper,filename:this.getFilenameForSchema(e),language:"TypeScript",timestamp:new Date().toISOString()},r=await this.generateSchemaContent(e,t);if(!r.trim())return;let i=this.extractImportsFromContent(r,e),s=this.extractExportsFromContent(r,e),o=this.getFilenameForSchema(e);return {content:r,imports:i,exports:Array.from(s),filename:o}}shouldGenerateValueSet(e){if(!Z(e)||!e.enum||!Array.isArray(e.enum)||e.enum.length===0)return false;switch(this.options.valueSetMode||"required-only"){case "all":return true;case "required-only":return e.strength==="required";case "custom":return (this.options.valueSetStrengths||["required"]).includes(e.strength);default:return e.strength==="required"}}collectValueSets(e){let t=new Map;for(let r of e)if(this.shouldGenerateValueSet(r)&&Z(r)){let i=this.typeMapper.formatTypeName(r.identifier.name);t.set(i,r);}return t}shouldUseValueSetType(e){if(!e||!this.tsOptions.generateValueSets)return false;let t=this.typeMapper.formatTypeName(e.name);return this.collectedValueSets.has(t)}getValueSetTypeName(e){return this.typeMapper.formatTypeName(e.name)}shouldUseInlineEnum(e){return !e||this.tsOptions.generateValueSets?false:e.enum&&Array.isArray(e.enum)&&e.enum.length>0}generateInlineEnumType(e){return !e.enum||!Array.isArray(e.enum)?"string":e.enum.map(r=>`'${r}'`).join(" | ")}shouldSkipSchema(e){if(e.identifier.kind==="value-set"||e.identifier.kind==="binding"||e.identifier.kind==="primitive-type")return true;if(!this.tsOptions.includeExtensions){let t=e.identifier.url;if(t?.includes("StructureDefinition/")){let r=t.split("StructureDefinition/")[1];if(r){let i=r.includes("-"),s=e.identifier.kind==="profile";if(i&&s)return true}}}return false}getFilenameForSchema(e){return `${this.typeMapper.formatFileName(e.identifier.name)}${this.getFileExtension()}`}extractImportsFromContent(e,t){let r=new Map,i=/import\s+(?:type\s+)?{\s*([^}]+)\s*}\s+from\s+['"]([^'"]+)['"];?/g,s;for(;(s=i.exec(e))!==null;){let o=s[1],a=s[2];if(!o||!a)continue;let c=o.split(",").map(l=>l.trim());for(let l of c)r.set(l,a);}return r}extractExportsFromContent(e,t){let r=new Set,i=/export\s+(?:interface|class|enum|type)\s+([A-Za-z_$][A-Za-z0-9_$]*)/g,s;for(;(s=i.exec(e))!==null;)s[1]&&r.add(s[1]);return r.add(this.typeMapper.formatTypeName(t.identifier.name)),r}generateReferenceInterface(e){let t=[],r=new Set;if("fields"in e&&e.fields)for(let[,i]of Object.entries(e.fields))this.collectFieldImports(i).forEach(o=>{r.add(o);});if(t.push("import type { ResourceType } from './utilities.js';"),r.size>0){let i=Array.from(r).sort();for(let s of i)t.push(`import type { ${s} } from './${s}.js';`);}if(t.push(""),this.tsOptions.includeDocuments&&e.description&&(t.push("/**"),t.push(` * ${e.description}`),e.identifier.url&&t.push(` * @see ${e.identifier.url}`),e.identifier.package&&t.push(` * @package ${e.identifier.package}`),t.push(" * @template T - The resource type being referenced"),t.push(" */")),t.push("export interface Reference<T extends ResourceType = ResourceType> {"),"fields"in e&&e.fields)for(let[i,s]of Object.entries(e.fields))if(i==="type")t.push(" type?: T;");else {let o=this.generateFieldLines(i,s);for(let a of o)a&&t.push(` ${a}`);}return t.push("}"),t.join(`
34
34
  `)}generateTypeScriptInterface(e){let t=[],r=this.typeMapper.formatTypeName(e.identifier.name),i=new Set,s=new Set;if("fields"in e&&e.fields)for(let[,o]of Object.entries(e.fields)){let a=this.collectFieldImports(o);for(let c of a)this.collectedValueSets.has(c)?s.add(c):i.add(c);}if("nested"in e&&e.nested&&Array.isArray(e.nested)){for(let o of e.nested)if(o.fields)for(let[,a]of Object.entries(o.fields)){let c=this.collectFieldImports(a);for(let l of c)this.collectedValueSets.has(l)?s.add(l):i.add(l);}}if(i.size>0){let o=Array.from(i).sort();for(let a of o)t.push(`import type { ${a} } from './${a}.js';`);}if(s.size>0){let a=Array.from(s).sort().join(", ");t.push(`import type { ${a} } from './valuesets/index.js';`);}if((i.size>0||s.size>0)&&t.push(""),this.tsOptions.includeDocuments&&e.description&&(t.push("/**"),t.push(` * ${e.description}`),e.identifier.url&&t.push(` * @see ${e.identifier.url}`),e.identifier.package&&t.push(` * @package ${e.identifier.package}`),t.push(" */")),t.push(`export interface ${r} {`),e.identifier.kind==="resource"&&t.push(` resourceType: '${r}';`),"fields"in e&&e.fields)for(let[o,a]of Object.entries(e.fields)){let c=this.generateFieldLines(o,a);for(let l of c)l&&t.push(` ${l}`);}return t.push("}"),t.join(`
35
35
  `)}collectFieldImports(e){let t=[];if("choices"in e&&e.choices&&Array.isArray(e.choices))return t;if(e.binding&&this.shouldUseValueSetType(e.binding)){let r=this.getValueSetTypeName(e.binding);return t.push(r),t}if("type"in e&&e.type){if(e.type.kind==="nested")return t;let r=this.typeMapper.mapType(e.type);!r.isPrimitive&&r.name!=="any"&&(["string","number","boolean","Date","object","unknown","any"].includes(r.name)||t.push(r.name));}return [...new Set(t)]}extractReferenceTypes(e){let t=[];if(!Array.isArray(e))return t;for(let r of e)if(!(!r||typeof r!="object")&&r.kind==="resource"&&r.name){let i=this.typeMapper.formatTypeName(r.name);t.push(i);}return [...new Set(t)]}generateNestedTypeInterface(e,t){let r=[],i=this.typeMapper.formatTypeName(`${e}${this.capitalizeFirst(t.identifier.name)}`);if(this.tsOptions.includeDocuments&&t.description&&(r.push("/**"),r.push(` * ${t.description}`),t.identifier.url&&r.push(` * @see ${t.identifier.url}`),r.push(" */")),r.push(`export interface ${i} {`),t.fields)for(let[s,o]of Object.entries(t.fields)){let a=this.generateFieldLines(s,o);for(let c of a)c&&r.push(` ${c}`);}return r.push("}"),r.join(`
36
- `)}capitalizeFirst(e){return e.charAt(0).toUpperCase()+e.slice(1)}generateFieldLines(e,t){if("choices"in t&&t.choices&&Array.isArray(t.choices))return [];let r=this.generateFieldLine(e,t);return r?[r]:[]}generateFieldLine(e,t){let r="any",i=false,s=false;if("type"in t&&t.type){if(t.binding&&this.shouldUseValueSetType(t.binding))r=this.getValueSetTypeName(t.binding);else if(t.binding&&this.shouldUseInlineEnum(t))r=this.generateInlineEnumType(t);else if(r=this.typeMapper.mapType(t.type).name,t.type.kind==="nested"){let l=t.type.url?.split("#")||[];if(l.length===2){let p=l[0].split("/").pop()||"",d=t.type.name;r=this.typeMapper.formatTypeName(`${p}${this.capitalizeFirst(d)}`);}else r=this.typeMapper.formatTypeName(t.type.name);}else if(r==="Reference"&&t.reference&&Array.isArray(t.reference)){let l=this.extractReferenceTypes(t.reference);l.length>0&&(l.forEach(d=>this.resourceTypes.add(d)),r=`Reference<${l.map(d=>`'${d}'`).join(" | ")}>`);}}return "required"in t&&(i=t.required),"array"in t&&(s=t.array),`${e}${i?"":"?"}: ${r}${s?"[]":""};`}extractExports(e){let t=[],r=/export\s*\{\s*([^}]+)\s*\}/g,i;for(;(i=r.exec(e))!==null;)if(i[1]){let o=i[1].split(",").map(a=>a.trim()).filter(Boolean);t.push(...o);}let s=[/export\s+interface\s+(\w+)/g,/export\s+type\s+(\w+)/g,/export\s+class\s+(\w+)/g,/export\s+enum\s+(\w+)/g,/export\s+const\s+(\w+)/g,/export\s+function\s+(\w+)/g];for(let o of s){let a;for(;(a=o.exec(e))!==null;)a[1]&&t.push(a[1]);}return [...new Set(t)]}setOutputDir(e){this.options.outputDir=e;}setOptions(e){this.options={...this.options,...e};}getOptions(){return {...this.options}}async generate(e){return await this.fileManager.cleanDirectory(),this.logger.debug("Cleaned output directory before generation"),super.generate(e)}async runPostGenerationHooks(){await super.runPostGenerationHooks(),await this.generateValueSetFiles(),await this.generateUtilitiesFile(),await this.generateMainIndexFile();}async generateUtilitiesFile(){if(this.resourceTypes.size===0){this.logger.warn("No resource types found, skipping utilities.ts generation");return}let e=[];e.push("/**"),e.push(" * FHIR Resource Type Utilities"),e.push(" * This file contains utility types for FHIR resources."),e.push(" * "),e.push(" * @generated This file is auto-generated. Do not edit manually."),e.push(" */"),e.push("");let t=Array.from(this.resourceTypes).sort();e.push("/**"),e.push(" * Union of all FHIR resource types in this package"),e.push(" */"),e.push("export type ResourceType =");for(let i=0;i<t.length;i++){let o=i===t.length-1?";":"";e.push(` | '${t[i]}'${o}`);}e.push(""),e.push("/**"),e.push(" * Helper type for creating typed References"),e.push(" * @example Reference<'Patient' | 'Practitioner'> - Reference that can point to Patient or Practitioner"),e.push(" */"),e.push("export type TypedReference<T extends ResourceType> = {"),e.push(" reference?: string;"),e.push(" type?: T;"),e.push(" identifier?: any; // Simplified for utility"),e.push(" display?: string;"),e.push("};");let r=e.join(`
36
+ `)}capitalizeFirst(e){return e.charAt(0).toUpperCase()+e.slice(1)}generateFieldLines(e,t){if("choices"in t&&t.choices&&Array.isArray(t.choices))return [];let r=this.generateFieldLine(e,t);return r?[r]:[]}generateFieldLine(e,t){let r="any",i=false,s=false;if("type"in t&&t.type){if(t.binding&&this.shouldUseValueSetType(t.binding))r=this.getValueSetTypeName(t.binding);else if(t.binding&&this.shouldUseInlineEnum(t))r=this.generateInlineEnumType(t);else if(r=this.typeMapper.mapType(t.type).name,t.type.kind==="nested"){let l=t.type.url?.split("#")||[];if(l.length===2){let p=l[0].split("/").pop()||"",d=t.type.name;r=this.typeMapper.formatTypeName(`${p}${this.capitalizeFirst(d)}`);}else r=this.typeMapper.formatTypeName(t.type.name);}else if(r==="Reference"&&t.reference&&Array.isArray(t.reference)){let l=this.extractReferenceTypes(t.reference);l.length>0&&(l.forEach(d=>{this.resourceTypes.add(d);}),r=`Reference<${l.map(d=>`'${d}'`).join(" | ")}>`);}}return "required"in t&&(i=t.required),"array"in t&&(s=t.array),`${e}${i?"":"?"}: ${r}${s?"[]":""};`}extractExports(e){let t=[],r=/export\s*\{\s*([^}]+)\s*\}/g,i;for(;(i=r.exec(e))!==null;)if(i[1]){let o=i[1].split(",").map(a=>a.trim()).filter(Boolean);t.push(...o);}let s=[/export\s+interface\s+(\w+)/g,/export\s+type\s+(\w+)/g,/export\s+class\s+(\w+)/g,/export\s+enum\s+(\w+)/g,/export\s+const\s+(\w+)/g,/export\s+function\s+(\w+)/g];for(let o of s){let a;for(;(a=o.exec(e))!==null;)a[1]&&t.push(a[1]);}return [...new Set(t)]}setOutputDir(e){this.options.outputDir=e;}setOptions(e){this.options={...this.options,...e};}getOptions(){return {...this.options}}async generate(e){return await this.fileManager.cleanDirectory(),this.logger.debug("Cleaned output directory before generation"),super.generate(e)}async runPostGenerationHooks(){await super.runPostGenerationHooks(),await this.generateValueSetFiles(),await this.generateUtilitiesFile(),await this.generateMainIndexFile();}async generateUtilitiesFile(){if(this.resourceTypes.size===0){this.logger.warn("No resource types found, skipping utilities.ts generation");return}let e=[];e.push("/**"),e.push(" * FHIR Resource Type Utilities"),e.push(" * This file contains utility types for FHIR resources."),e.push(" * "),e.push(" * @generated This file is auto-generated. Do not edit manually."),e.push(" */"),e.push("");let t=Array.from(this.resourceTypes).sort();e.push("/**"),e.push(" * Union of all FHIR resource types in this package"),e.push(" */"),e.push("export type ResourceType =");for(let i=0;i<t.length;i++){let o=i===t.length-1?";":"";e.push(` | '${t[i]}'${o}`);}e.push(""),e.push("/**"),e.push(" * Helper type for creating typed References"),e.push(" * @example Reference<'Patient' | 'Practitioner'> - Reference that can point to Patient or Practitioner"),e.push(" */"),e.push("export type TypedReference<T extends ResourceType> = {"),e.push(" reference?: string;"),e.push(" type?: T;"),e.push(" identifier?: any; // Simplified for utility"),e.push(" display?: string;"),e.push("};");let r=e.join(`
37
37
  `);await this.fileManager.writeFile("utilities.ts",r),this.logger.info(`Generated utilities.ts with ${this.resourceTypes.size} resource types`);}generateValueSetFile(e){let t=this.typeMapper.formatTypeName(e.identifier.name),r=e.enum?.map(s=>` '${s}'`).join(`,
38
38
  `)||"",i=[];return this.options.includeDocuments&&(i.push("/**"),i.push(` * ${e.identifier.name} value set`),e.description&&i.push(` * ${e.description}`),e.valueset?.url&&i.push(` * @see ${e.valueset.url}`),e.identifier.package&&i.push(` * @package ${e.identifier.package}`),i.push(" * @generated This file is auto-generated. Do not edit manually."),i.push(" */"),i.push("")),i.push(`export const ${t}Values = [`),r&&i.push(r),i.push("] as const;"),i.push(""),i.push(`export type ${t} = typeof ${t}Values[number];`),this.tsOptions.includeValueSetHelpers&&(i.push(""),i.push(`export const isValid${t} = (value: string): value is ${t} =>`),i.push(` ${t}Values.includes(value as ${t});`)),i.join(`
39
39
  `)}async generateValueSetFiles(){if(!(!this.tsOptions.generateValueSets||this.collectedValueSets.size===0)){for(let[e,t]of this.collectedValueSets){let r=this.generateValueSetFile(t),i=`valuesets/${e}.ts`;await this.fileManager.writeFile(i,r),this.logger.info(`Generated value set: ${i}`);}await this.generateValueSetIndexFile();}}async generateValueSetIndexFile(){let e=[];this.tsOptions.includeDocuments&&(e.push("/**"),e.push(" * FHIR Value Sets"),e.push(" * This file re-exports all generated value sets."),e.push(" * "),e.push(" * @generated This file is auto-generated. Do not edit manually."),e.push(" */"),e.push(""));let t=Array.from(this.collectedValueSets.keys()).sort();for(let i of t)e.push(`export * from './${i}.js';`);let r=e.join(`
40
40
  `);await this.fileManager.writeFile("valuesets/index.ts",r),this.logger.info(`Generated valuesets/index.ts with ${this.collectedValueSets.size} value sets`);}async generateMainIndexFile(){if(!this.options.generateIndex)return;let e=[];this.tsOptions.includeDocuments&&(e.push("/**"),e.push(" * FHIR R4 TypeScript Types"),e.push(" * Generated from FHIR StructureDefinitions"),e.push(" * "),e.push(" * @generated This file is auto-generated. Do not edit manually."),e.push(" */"),e.push("")),e.push('export * from "./utilities";'),this.tsOptions.generateValueSets&&this.collectedValueSets.size>0&&(e.push(""),e.push("// Value Sets"),e.push('export * from "./valuesets/index";'));let t=e.join(`
41
- `);await this.fileManager.writeFile("index.ts",t),this.logger.info(`Generated index.ts with type exports${this.tsOptions.generateValueSets&&this.collectedValueSets.size>0?" and value sets":""}`);}};var gi={boolean:"boolean",instant:"string",time:"string",date:"string",dateTime:"string",decimal:"number",integer:"number",unsignedInt:"number",positiveInt:"number",integer64:"number",base64Binary:"string",uri:"string",url:"string",canonical:"string",oid:"string",uuid:"string",string:"string",code:"string",markdown:"string",id:"string",xhtml:"string"},gr=n=>{let e=gi[n];if(e===void 0)throw new Error(`Unknown primitive type ${n}`);return e},di=n=>re(n),fr=n=>n.kind==="profile"?`${x(n)}_profile`:G(n.name),fi=n=>`${fr(n)}.ts`,ft=(n,e=true)=>{if(!n)return;let t=ge(n,e);if(t)return ht(t)},x=n=>{if(n.kind==="nested"){let e=n.url,t=ft(e,false);if(!t)return "";let[r,i]=t.split("#"),s=xe((i??"").split(".")).join("");return ht([r,s].join(""))}return ht(n.name)},hr=new Set(["class","function","return","if","for","while","const","let","var","import","export","interface"]),K=n=>hr.has(n)?`"${n}"`:n.includes(" ")||n.includes("-")?`"${n}"`:n,ht=n=>(hr.has(n)&&(n=`${n}_`),n.replace(/[- ]/g,"_")),H=(n,e)=>e.startsWith('"')?`${n}[${e}]`:`${n}.${e}`,dr=n=>`(${n.map(e=>`"${e}"`).join(" | ")})`,Oe=class extends J{tsImportType(e,...t){this.lineSM(`import type { ${t.join(", ")} } from "${e}"`);}generateFhirPackageIndexFile(e){this.cat("index.ts",()=>{let t=e.flatMap(r=>[{identifier:r.identifier,tsPackageName:fr(r.identifier),resourceName:x(r.identifier),nestedTypes:P(r)&&r.nested?r.nested.map(i=>x(i.identifier)):[],helpers:P(r)?[`is${x(r.identifier)}`]:[]}]).sort((r,i)=>r.resourceName.localeCompare(i.resourceName));t=Array.from(new Map(t.map(r=>[r.resourceName.toLowerCase(),r])).values()).sort((r,i)=>r.resourceName.localeCompare(i.resourceName));for(let r of t)this.debugComment(r.identifier),this.lineSM(`export type { ${[r.resourceName,...r.nestedTypes].join(", ")} } from "./${r.tsPackageName}"`),r.helpers.length>0&&this.lineSM(`export { ${r.helpers.join(", ")} } from "./${r.tsPackageName}"`);});}generateDependenciesImports(e){if(e.dependencies){let t=[],r=[];for(let i of e.dependencies)["complex-type","resource","logical"].includes(i.kind)?t.push({tsPackage:`../${re(i.package)}/${G(i.name)}`,name:E(i.name),dep:i}):N(i)?t.push({tsPackage:`../${re(i.package)}/${G(ft(i.url)??"")}`,name:x(i),dep:i}):r.push(i);t.sort((i,s)=>i.name.localeCompare(s.name));for(let i of t)this.debugComment(i.dep),this.tsImportType(i.tsPackage,i.name);for(let i of r)this.debugComment("skip:",i);this.line();}}generateComplexTypeReexports(e){let t=e.dependencies?.filter(r=>["complex-type"].includes(r.kind)).map(r=>({tsPackage:`../${re(r.package)}/${G(r.name)}`,name:E(r.name)}));if(t&&t.length>0){for(let r of t)this.lineSM(`export type { ${r.name} } from "${r.tsPackage}"`);this.line();}}addFieldExtension(e,t){if(t.type.kind==="primitive-type"){let r=K(`_${e}`);this.lineSM(`${r}?: Element`);}}generateType(e,t){let r;t.identifier.name==="Reference"?r="Reference<T extends string = string>":(t.identifier.kind,r=x(t.identifier));let i;if(t.base&&(i=`extends ${ft(t.base.url)}`),this.debugComment(t.identifier),!t.fields&&!i&&!P(t)){this.lineSM(`export type ${r} = object`);return}this.curlyBlock(["export","interface",r,i],()=>{if(P(t)){let o=[t.identifier];o.push(...e.resourceChildren(t.identifier)),this.lineSM(`resourceType: ${o.sort((a,c)=>a.name.localeCompare(c.name)).map(a=>`"${a.name}"`).join(" | ")}`),this.line();}if(!t.fields)return;let s=Object.entries(t.fields).sort((o,a)=>o[0].localeCompare(a[0]));for(let[o,a]of s){if(q(a))continue;this.debugComment(o,":",a);let c=K(o),l;a.enum?l=dr(a.enum):t.identifier.name==="Reference"&&c==="reference"?l="`${T}/${string}`":a.reference&&a.reference.length>0?l=`Reference<${a.reference.map(g=>`"${g.name}"`).join(" | ")}>`:Je(a.type)?l=gr(a.type.name):N(a.type)?l=x(a.type):l=a.type.name;let p=a.required?"":"?",d=a.array?"[]":"";this.lineSM(`${c}${p}: ${l}${d}`),["resource","complex-type"].includes(t.identifier.kind)&&this.addFieldExtension(o,a);}});}generateResourceTypePredicate(e){if(!P(e))return;let t=x(e.identifier);this.curlyBlock(["export","const",`is${t}`,"=",`(resource: unknown): resource is ${t}`,"=>"],()=>{this.lineSM(`return resource !== null && typeof resource === "object" && (resource as {resourceType: string}).resourceType === "${e.identifier.name}"`);});}generateNestedTypes(e,t){if(t.nested)for(let r of t.nested)this.generateType(e,r),this.line();}generateProfileType(e,t){this.debugComment("flatProfile",t);let r=x(t.identifier);this.debugComment("identifier",t.identifier),this.debugComment("base",t.base),this.curlyBlock(["export","interface",r],()=>{this.lineSM(`__profileUrl: "${t.identifier.url}"`),this.line();for(let[i,s]of Object.entries(t.fields??{})){if(q(s))continue;this.debugComment(i,s);let o=K(i),a;if(s.enum)a=dr(s.enum);else if(s.reference&&s.reference.length>0){let c=e.findLastSpecialization(t);if(!z(c))throw new Error(`Invalid specialization for ${t.identifier}`);let l=c.fields?.[i];if(l===void 0||q(l)||l.reference===void 0)throw new Error(`Invalid field declaration for ${i}`);let p=l.reference.map(m=>m.name),d=s.reference.map(m=>{let g=e.findLastSpecializationByIdentifier(m);return g.name!==m.name?`"${g.name}" /*${m.name}*/`:`'${m.name}'`}).join(" | ");p.length===1&&p[0]==="Resource"&&d!=='"Resource"'?a=`Reference<"Resource" /* ${d} */ >`:a=`Reference<${d}>`;}else if(N(s.type))a=x(s.type);else if(Je(s.type))a=gr(s.type.name);else {if(s.type===void 0)throw new Error(`Undefined type for '${i}' field at ${Wt(t)}`);a=s.type.name;}this.lineSM(`${o}${s.required?"":"?"}: ${a}${s.array?"[]":""}`);}}),this.line();}generateAttachProfile(e){let t=x(e.base),r=x(e.identifier),i=Object.entries(e.fields||{}).filter(([s,o])=>o&&X(o)&&o.type!==void 0).map(([s])=>K(s));this.curlyBlock([`export const attach_${r}_to_${t} =`,`(resource: ${t}, profile: ${r}): ${t}`,"=>"],()=>{this.curlyBlock(["return"],()=>{this.line("...resource,"),this.curlyBlock(["meta:"],()=>{this.line(`profile: ['${e.identifier.url}']`);},[","]),i.forEach(s=>{this.line(`${s}: ${H("profile",s)},`);});});}),this.line();}generateExtractProfile(e,t){let r=x(t.base),i=x(t.identifier),s=Object.entries(t.fields||{}).filter(([c,l])=>X(l)&&l.type!==void 0).map(([c])=>c),o=e.findLastSpecialization(t);if(!z(o))throw new Error(`Specialization not found for ${t.identifier.url}`);let a={};this.curlyBlock([`export const extract_${i}_from_${r} =`,`(resource: ${r}): ${i}`,"=>"],()=>{s.forEach(c=>{let l=K(c),p=t.fields?.[c],d=o.fields?.[c];if(!X(p)||!X(d))return;p.required&&!d.required&&this.curlyBlock([`if (${H("resource",l)} === undefined)`],()=>this.lineSM(`throw new Error("'${l}' is required for ${t.identifier.url}")`));let m=p?.reference?.map(h=>h.name),g=d?.reference?.map(h=>h.name);if(m&&g&&m.length!==g.length){let h=`reference_is_valid_${l}`;this.curlyBlock(["const",h,"=","(ref?: Reference)","=>"],()=>{this.line("return !ref"),this.indentBlock(()=>{g.forEach(f=>{this.line(`|| ref.reference?.startsWith('${f}/')`);}),this.line(";");});});let u=p?.required?"":`!${H("resource",l)} || `;p.array?u+=`${H("resource",l)}.every( (ref) => ${h}(ref) )`:u+=`!${h}(${H("resource",l)})`,this.curlyBlock(["if (",u,")"],()=>{this.lineSM(`throw new Error("'${c}' has different references in profile and specialization")`);}),this.line(),a[c]=true;}}),this.curlyBlock(["return"],()=>{this.line(`__profileUrl: '${t.identifier.url}',`),s.forEach(c=>{let l=K(c);a[c]?this.line(`${l}:`,`${H("resource",l)} as ${i}['${l}'],`):this.line(`${l}:`,`${H("resource",l)},`);});});});}generateResourceModule(e,t){this.cat(`${fi(t.identifier)}`,()=>{if(this.generateDisclaimer(),["complex-type","resource","logical"].includes(t.identifier.kind))this.generateDependenciesImports(t),this.generateComplexTypeReexports(t),this.generateNestedTypes(e,t),this.comment("CanonicalURL:",t.identifier.url),this.generateType(e,t),this.generateResourceTypePredicate(t);else if(de(t)){let r=e.flatProfile(t);this.generateDependenciesImports(r),this.comment("CanonicalURL:",t.identifier.url),this.generateProfileType(e,r),this.generateAttachProfile(r),this.generateExtractProfile(e,r);}else throw new Error(`Profile generation not implemented for kind: ${t.identifier.kind}`)});}generate(e){let t=[...e.collectComplexTypes(),...e.collectResources(),...this.opts.generateProfile?e.collectProfiles().filter(i=>e.isWithMetaField(i)):[]],r=at(t);this.cd("/",()=>{for(let[i,s]of Object.entries(r)){let o=di(i);this.cd(o,()=>{for(let a of s)this.generateResourceModule(e,a);this.generateFhirPackageIndexFile(s);});}});}};var mr=n=>{let e=()=>n.writtenFiles().map(t=>({path:R.normalize(R.join(n.opts.outputDir,t)),filename:t.replace(/^.*[\\/]/,""),content:"",exports:[],size:0,timestamp:new Date}));return {generate:async({index:t})=>(n.generate(t),e()),setOutputDir:t=>n.opts.outputDir=t,build:async t=>e()}},yr=n=>{let e=n.replace(/[^a-zA-Z0-9\-_.@#()]/g,"");return e.length===0?"unknown":e},yi=async(n,e)=>{e.info("Cleaning outputs...");try{e.info(`Clean ${n.outputDir}`),F.rmSync(n.outputDir,{recursive:!0,force:!0}),n.typeSchemaOutputDir&&(e.info(`Clean ${n.typeSchemaOutputDir}`),F.rmSync(n.typeSchemaOutputDir,{recursive:!0,force:!0})),n.exportTypeTree&&(e.info(`Clean ${n.exportTypeTree}`),F.rmSync(n.exportTypeTree,{recursive:!0,force:!0}));}catch(t){e.warn(`Error cleaning output directory: ${t instanceof Error?t.message:String(t)}`);}},Si=async(n,e,t)=>{await L.mkdir(e,{recursive:true}),t.info(`Writing TypeSchema files to ${e}/...`);let r={};for(let i of n){let s={name:i.identifier.package,version:i.identifier.version},o=yr(S(s)),a=yr(`${i.identifier.name}(${ge(i.identifier.url)})`),c=JSON.stringify(i,null,2),l=R.join(e,o,a);r[l]||(r[l]=[]),r[l]?.some(p=>p===c)||r[l].push(c);}for(let[i,s]of Object.entries(r))await Promise.all(s.map(async(o,a)=>{let c;a===0?c=`${i}.typeschema.json`:c=`${i}-${a}.typeschema.json`,await L.mkdir(R.dirname(c),{recursive:true}),await L.writeFile(c,o);}));},bi=async(n,e,t)=>{t.info(`Writing TypeSchema files to: ${e}`),await L.mkdir(R.dirname(e),{recursive:true}),t.info(`Writing TypeSchemas to one file ${e}...`);for(let r of n){let i=JSON.stringify(r,null,2);await L.appendFile(e,`${i}
41
+ `);await this.fileManager.writeFile("index.ts",t),this.logger.info(`Generated index.ts with type exports${this.tsOptions.generateValueSets&&this.collectedValueSets.size>0?" and value sets":""}`);}};var gi={boolean:"boolean",instant:"string",time:"string",date:"string",dateTime:"string",decimal:"number",integer:"number",unsignedInt:"number",positiveInt:"number",integer64:"number",base64Binary:"string",uri:"string",url:"string",canonical:"string",oid:"string",uuid:"string",string:"string",code:"string",markdown:"string",id:"string",xhtml:"string"},gr=n=>{let e=gi[n];if(e===void 0)throw new Error(`Unknown primitive type ${n}`);return e},di=n=>re(n),fr=n=>n.kind==="profile"?`${x(n)}_profile`:G(n.name),fi=n=>`${fr(n)}.ts`,ft=(n,e=true)=>{if(!n)return;let t=ge(n,e);if(t)return ht(t)},x=n=>{if(n.kind==="nested"){let e=n.url,t=ft(e,false);if(!t)return "";let[r,i]=t.split("#"),s=xe((i??"").split(".")).join("");return ht([r,s].join(""))}return ht(n.name)},hr=new Set(["class","function","return","if","for","while","const","let","var","import","export","interface"]),K=n=>hr.has(n)?`"${n}"`:n.includes(" ")||n.includes("-")?`"${n}"`:n,ht=n=>(hr.has(n)&&(n=`${n}_`),n.replace(/[- ]/g,"_")),H=(n,e)=>e.startsWith('"')?`${n}[${e}]`:`${n}.${e}`,dr=n=>`(${n.map(e=>`"${e}"`).join(" | ")})`,Oe=class extends J{tsImportType(e,...t){this.lineSM(`import type { ${t.join(", ")} } from "${e}"`);}generateFhirPackageIndexFile(e){this.cat("index.ts",()=>{let t=e.flatMap(r=>[{identifier:r.identifier,tsPackageName:fr(r.identifier),resourceName:x(r.identifier),nestedTypes:P(r)&&r.nested?r.nested.map(i=>x(i.identifier)):[],helpers:P(r)?[`is${x(r.identifier)}`]:[]}]).sort((r,i)=>r.resourceName.localeCompare(i.resourceName));t=Array.from(new Map(t.map(r=>[r.resourceName.toLowerCase(),r])).values()).sort((r,i)=>r.resourceName.localeCompare(i.resourceName));for(let r of t)this.debugComment(r.identifier),this.lineSM(`export type { ${[r.resourceName,...r.nestedTypes].join(", ")} } from "./${r.tsPackageName}"`),r.helpers.length>0&&this.lineSM(`export { ${r.helpers.join(", ")} } from "./${r.tsPackageName}"`);});}generateDependenciesImports(e){if(e.dependencies){let t=[],r=[];for(let i of e.dependencies)["complex-type","resource","logical"].includes(i.kind)?t.push({tsPackage:`../${re(i.package)}/${G(i.name)}`,name:E(i.name),dep:i}):N(i)?t.push({tsPackage:`../${re(i.package)}/${G(ft(i.url)??"")}`,name:x(i),dep:i}):r.push(i);t.sort((i,s)=>i.name.localeCompare(s.name));for(let i of t)this.debugComment(i.dep),this.tsImportType(i.tsPackage,i.name);for(let i of r)this.debugComment("skip:",i);this.line();}}generateComplexTypeReexports(e){let t=e.dependencies?.filter(r=>["complex-type"].includes(r.kind)).map(r=>({tsPackage:`../${re(r.package)}/${G(r.name)}`,name:E(r.name)}));if(t&&t.length>0){for(let r of t)this.lineSM(`export type { ${r.name} } from "${r.tsPackage}"`);this.line();}}addFieldExtension(e,t){if(t.type.kind==="primitive-type"){let r=K(`_${e}`);this.lineSM(`${r}?: Element`);}}generateType(e,t){let r;t.identifier.name==="Reference"?r="Reference<T extends string = string>":(t.identifier.kind,r=x(t.identifier));let i;if(t.base&&(i=`extends ${ft(t.base.url)}`),this.debugComment(t.identifier),!t.fields&&!i&&!P(t)){this.lineSM(`export type ${r} = object`);return}this.curlyBlock(["export","interface",r,i],()=>{if(P(t)){let o=[t.identifier];o.push(...e.resourceChildren(t.identifier)),this.lineSM(`resourceType: ${o.sort((a,c)=>a.name.localeCompare(c.name)).map(a=>`"${a.name}"`).join(" | ")}`),this.line();}if(!t.fields)return;let s=Object.entries(t.fields).sort((o,a)=>o[0].localeCompare(a[0]));for(let[o,a]of s){if(q(a))continue;this.debugComment(o,":",a);let c=K(o),l;a.enum?l=dr(a.enum):t.identifier.name==="Reference"&&c==="reference"?l="`${T}/${string}`":a.reference&&a.reference.length>0?l=`Reference<${a.reference.map(g=>`"${g.name}"`).join(" | ")}>`:Je(a.type)?l=gr(a.type.name):N(a.type)?l=x(a.type):l=a.type.name;let p=a.required?"":"?",d=a.array?"[]":"";this.lineSM(`${c}${p}: ${l}${d}`),["resource","complex-type"].includes(t.identifier.kind)&&this.addFieldExtension(o,a);}});}generateResourceTypePredicate(e){if(!P(e))return;let t=x(e.identifier);this.curlyBlock(["export","const",`is${t}`,"=",`(resource: unknown): resource is ${t}`,"=>"],()=>{this.lineSM(`return resource !== null && typeof resource === "object" && (resource as {resourceType: string}).resourceType === "${e.identifier.name}"`);});}generateNestedTypes(e,t){if(t.nested)for(let r of t.nested)this.generateType(e,r),this.line();}generateProfileType(e,t){this.debugComment("flatProfile",t);let r=x(t.identifier);this.debugComment("identifier",t.identifier),this.debugComment("base",t.base),this.curlyBlock(["export","interface",r],()=>{this.lineSM(`__profileUrl: "${t.identifier.url}"`),this.line();for(let[i,s]of Object.entries(t.fields??{})){if(q(s))continue;this.debugComment(i,s);let o=K(i),a;if(s.enum)a=dr(s.enum);else if(s.reference&&s.reference.length>0){let c=e.findLastSpecialization(t);if(!z(c))throw new Error(`Invalid specialization for ${t.identifier}`);let l=c.fields?.[i];if(l===void 0||q(l)||l.reference===void 0)throw new Error(`Invalid field declaration for ${i}`);let p=l.reference.map(m=>m.name),d=s.reference.map(m=>{let g=e.findLastSpecializationByIdentifier(m);return g.name!==m.name?`"${g.name}" /*${m.name}*/`:`'${m.name}'`}).join(" | ");p.length===1&&p[0]==="Resource"&&d!=='"Resource"'?a=`Reference<"Resource" /* ${d} */ >`:a=`Reference<${d}>`;}else if(N(s.type))a=x(s.type);else if(Je(s.type))a=gr(s.type.name);else {if(s.type===void 0)throw new Error(`Undefined type for '${i}' field at ${Wt(t)}`);a=s.type.name;}this.lineSM(`${o}${s.required?"":"?"}: ${a}${s.array?"[]":""}`);}}),this.line();}generateAttachProfile(e){let t=x(e.base),r=x(e.identifier),i=Object.entries(e.fields||{}).filter(([s,o])=>o&&X(o)&&o.type!==void 0).map(([s])=>K(s));this.curlyBlock([`export const attach_${r}_to_${t} =`,`(resource: ${t}, profile: ${r}): ${t}`,"=>"],()=>{this.curlyBlock(["return"],()=>{this.line("...resource,"),this.curlyBlock(["meta:"],()=>{this.line(`profile: ['${e.identifier.url}']`);},[","]),i.forEach(s=>{this.line(`${s}: ${H("profile",s)},`);});});}),this.line();}generateExtractProfile(e,t){let r=x(t.base),i=x(t.identifier),s=Object.entries(t.fields||{}).filter(([c,l])=>X(l)&&l.type!==void 0).map(([c])=>c),o=e.findLastSpecialization(t);if(!z(o))throw new Error(`Specialization not found for ${t.identifier.url}`);let a={};this.curlyBlock([`export const extract_${i}_from_${r} =`,`(resource: ${r}): ${i}`,"=>"],()=>{s.forEach(c=>{let l=K(c),p=t.fields?.[c],d=o.fields?.[c];if(!X(p)||!X(d))return;p.required&&!d.required&&this.curlyBlock([`if (${H("resource",l)} === undefined)`],()=>this.lineSM(`throw new Error("'${l}' is required for ${t.identifier.url}")`));let m=p?.reference?.map(h=>h.name),g=d?.reference?.map(h=>h.name);if(m&&g&&m.length!==g.length){let h=`reference_is_valid_${l}`;this.curlyBlock(["const",h,"=","(ref?: Reference)","=>"],()=>{this.line("return !ref"),this.indentBlock(()=>{g.forEach(f=>{this.line(`|| ref.reference?.startsWith('${f}/')`);}),this.line(";");});});let u=p?.required?"":`!${H("resource",l)} || `;p.array?u+=`${H("resource",l)}.every( (ref) => ${h}(ref) )`:u+=`!${h}(${H("resource",l)})`,this.curlyBlock(["if (",u,")"],()=>{this.lineSM(`throw new Error("'${c}' has different references in profile and specialization")`);}),this.line(),a[c]=true;}}),this.curlyBlock(["return"],()=>{this.line(`__profileUrl: '${t.identifier.url}',`),s.forEach(c=>{let l=K(c);a[c]?this.line(`${l}:`,`${H("resource",l)} as ${i}['${l}'],`):this.line(`${l}:`,`${H("resource",l)},`);});});});}generateResourceModule(e,t){this.cat(`${fi(t.identifier)}`,()=>{if(this.generateDisclaimer(),["complex-type","resource","logical"].includes(t.identifier.kind))this.generateDependenciesImports(t),this.generateComplexTypeReexports(t),this.generateNestedTypes(e,t),this.comment("CanonicalURL:",t.identifier.url),this.generateType(e,t),this.generateResourceTypePredicate(t);else if(de(t)){let r=e.flatProfile(t);this.generateDependenciesImports(r),this.comment("CanonicalURL:",t.identifier.url),this.generateProfileType(e,r),this.generateAttachProfile(r),this.generateExtractProfile(e,r);}else throw new Error(`Profile generation not implemented for kind: ${t.identifier.kind}`)});}async generate(e){let t=[...e.collectComplexTypes(),...e.collectResources(),...this.opts.generateProfile?e.collectProfiles().filter(i=>e.isWithMetaField(i)):[]],r=at(t);this.cd("/",()=>{for(let[i,s]of Object.entries(r)){let o=di(i);this.cd(o,()=>{for(let a of s)this.generateResourceModule(e,a);this.generateFhirPackageIndexFile(s);});}});}};var mr=n=>{let e=()=>n.writtenFiles().map(t=>({path:R.normalize(R.join(n.opts.outputDir,t)),filename:t.replace(/^.*[\\/]/,""),content:"",exports:[],size:0,timestamp:new Date}));return {generate:async({index:t})=>(await n.generate(t),e()),setOutputDir:t=>n.opts.outputDir=t,build:async t=>e()}},yr=n=>{let e=n.replace(/[^a-zA-Z0-9\-_.@#()]/g,"");return e.length===0?"unknown":e},yi=async(n,e)=>{e.info("Cleaning outputs...");try{e.info(`Clean ${n.outputDir}`),F.rmSync(n.outputDir,{recursive:!0,force:!0}),n.typeSchemaOutputDir&&(e.info(`Clean ${n.typeSchemaOutputDir}`),F.rmSync(n.typeSchemaOutputDir,{recursive:!0,force:!0})),n.exportTypeTree&&(e.info(`Clean ${n.exportTypeTree}`),F.rmSync(n.exportTypeTree,{recursive:!0,force:!0}));}catch(t){e.warn(`Error cleaning output directory: ${t instanceof Error?t.message:String(t)}`);}},Si=async(n,e,t)=>{await L.mkdir(e,{recursive:true}),t.info(`Writing TypeSchema files to ${e}/...`);let r={};for(let i of n){let s={name:i.identifier.package,version:i.identifier.version},o=yr(S(s)),a=yr(`${i.identifier.name}(${ge(i.identifier.url)})`),c=JSON.stringify(i,null,2),l=R.join(e,o,a);r[l]||(r[l]=[]),r[l]?.some(p=>p===c)||r[l].push(c);}for(let[i,s]of Object.entries(r))await Promise.all(s.map(async(o,a)=>{let c;a===0?c=`${i}.typeschema.json`:c=`${i}-${a}.typeschema.json`,await L.mkdir(R.dirname(c),{recursive:true}),await L.writeFile(c,o);}));},bi=async(n,e,t)=>{t.info(`Writing TypeSchema files to: ${e}`),await L.mkdir(R.dirname(e),{recursive:true}),t.info(`Writing TypeSchemas to one file ${e}...`);for(let r of n){let i=JSON.stringify(r,null,2);await L.appendFile(e,`${i}
42
42
  `);}},vi=async(n,e,t)=>{if(e.typeSchemaOutputDir)try{R.extname(e.typeSchemaOutputDir)===".ndjson"?await bi(n,e.typeSchemaOutputDir,t):await Si(n,e.typeSchemaOutputDir,t),t.info("Writing TypeSchema - DONE");}catch(r){if(t.error("Failed to write TypeSchema output",r instanceof Error?r:new Error(String(r))),e.throwException)throw r}},oe=class{schemas=[];options;generators=new Map;cache;pendingOperations=[];typeSchemaGenerator;logger;packages=[];progressCallback;typeSchemaConfig;constructor(e={}){this.options={outputDir:e.outputDir||"./generated",verbose:e.verbose??false,overwrite:e.overwrite??true,cache:e.cache??true,cleanOutput:e.cleanOutput??true,typeSchemaConfig:e.typeSchemaConfig,manager:e.manager||null,throwException:e.throwException||false,typeSchemaOutputDir:e.typeSchemaOutputDir,exportTypeTree:e.exportTypeTree,treeShake:e.treeShake},this.typeSchemaConfig=e.typeSchemaConfig,this.logger=e.logger||I({verbose:this.options.verbose,prefix:"API"}),this.options.cache&&(this.cache=new O(this.typeSchemaConfig));}fromPackage(e,t){let r=qe({name:e,version:t||"latest"});return this.packages.push(r),this}fromPackageRef(e){return this.packages.push(e),this}fromFiles(...e){this.logger.debug(`Loading from ${e.length} TypeSchema files`);let t=this.loadFromFiles(e);return this.pendingOperations.push(t),this}fromSchemas(e){return this.logger.debug(`Adding ${e.length} TypeSchemas to generation`),this.schemas=[...this.schemas,...e],this}typescriptDepricated(e={}){let t=`${this.options.outputDir}/types`,r=new se({outputDir:t,moduleFormat:e.moduleFormat||"esm",generateIndex:e.generateIndex??true,includeDocuments:e.includeDocuments??true,namingConvention:e.namingConvention||"PascalCase",includeExtensions:e.includeExtensions??false,includeProfiles:e.includeProfiles??false,generateValueSets:e.generateValueSets??false,includeValueSetHelpers:e.includeValueSetHelpers??false,valueSetStrengths:e.valueSetStrengths??["required"],logger:this.logger.child("TS"),valueSetMode:e.valueSetMode??"required-only",valueSetDirectory:e.valueSetDirectory??"valuesets",verbose:this.options.verbose,validate:true,overwrite:this.options.overwrite});return this.generators.set("typescript",r),this.logger.debug(`Configured TypeScript generator (${e.moduleFormat||"esm"})`),this}typescript(e){let t={outputDir:R.join(this.options.outputDir,"/types"),tabSize:4,withDebugComment:false,commentLinePrefix:"//",generateProfile:true,exportTypeTree:this.options.exportTypeTree},r={logger:this.logger,...t,...e},i=mr(new Oe(r));return this.generators.set("typescript",i),this.logger.debug(`Configured TypeScript generator (${JSON.stringify(r,void 0,2)})`),this}csharp(e,t){let r=mr(new we({outputDir:R.join(this.options.outputDir,"/types"),staticSourceDir:t??void 0,targetNamespace:e,logger:new _({prefix:"C#",timestamp:true,verbose:true,suppressLoggingLevel:[]})}));return this.generators.set("C#",r),this.logger.debug("Configured C# generator"),this}onProgress(e){return this.progressCallback=e,this}outputTo(e){this.logger.debug(`Setting output directory: ${e}`),this.options.outputDir=e;for(let t of this.generators.values())t.setOutputDir&&t.setOutputDir(e);return this}verbose(e=true){return this.options.verbose=e,this.logger?.configure({verbose:e}),this}throwException(e=true){return this.options.throwException=e,this}cleanOutput(e=true){return this.options.cleanOutput=e,this}writeTypeTree(e){return this.options.exportTypeTree=e,this}treeShake(e){return this.options.treeShake=e,this}writeTypeSchemas(e){return this.options.typeSchemaOutputDir=e,this}async generate(){let e=performance.now(),t={success:false,outputDir:this.options.outputDir,filesGenerated:[],errors:[],warnings:[],duration:0};this.logger.debug(`Starting generation with ${this.generators.size} generators`);try{this.options.cleanOutput&&yi(this.options,this.logger),this.logger.info("Initialize Canonical Manager");let r=CanonicalManager({packages:this.packages,workingDir:".codegen-cache/canonical-manager-cache"}),i=await r.init(),s=Object.values(i),o=await ee(r,{logger:this.logger,focusedPackages:s}),a=await _t(o,this.logger);await vi(a,this.options,this.logger);let c=ct(a,this.logger);this.options.treeShake&&(c=rr(c,this.options.treeShake,this.logger)),this.options.exportTypeTree&&await c.exportTree(this.options.exportTypeTree),this.logger.debug(`Executing ${this.generators.size} generators`),await this.executeGenerators(t,{schemas:a,index:c}),this.logger.info("Generation completed successfully"),t.success=t.errors.length===0,this.logger.debug(`Generation completed: ${t.filesGenerated.length} files`);}catch(r){if(this.logger.error("Code generation failed",r instanceof Error?r:new Error(String(r))),t.errors.push(r instanceof Error?r.message:String(r)),this.options.throwException)throw r}return {...t,success:t.errors.length===0,duration:performance.now()-e}}async build(){let e={};for(let[t,r]of this.generators.entries())r.build&&(e[t]=await r.build(this.schemas));return e}reset(){return this.schemas=[],this.generators.clear(),this.progressCallback=void 0,this}getSchemas(){return [...this.schemas]}getGenerators(){return Array.from(this.generators.keys())}async loadFromFiles(e){this.typeSchemaGenerator||(this.typeSchemaGenerator=new D({verbose:this.options.verbose,logger:this.logger.child("Schema"),treeshake:this.typeSchemaConfig?.treeshake},this.typeSchemaConfig));let r=await new W({format:"auto"}).parseFromFiles(e);this.schemas=[...this.schemas,...r],this.cache&&this.cache.setMany(r);}async executeGenerators(e,t){for(let[r,i]of this.generators.entries()){this.logger.info(`Generating ${r}...`);try{let s=await i.generate(t);e.filesGenerated.push(...s.map(o=>o.path||o.filename)),this.logger.info(`Generating ${r} finished successfully`);}catch(s){if(e.errors.push(`${r} generator failed: ${s instanceof Error?s.message:String(s)}`),this.options.throwException)throw s}}}};var mt={outputDir:"./generated",verbose:false,overwrite:true,validate:true,cache:true,cleanOutput:true,typescript:{moduleFormat:"esm",generateIndex:true,includeDocuments:false,namingConvention:"PascalCase",strictMode:true,includeProfiles:true,includeExtensions:false,includeCodeSystems:false,includeOperations:false,generateValueSets:false,valueSetDirectory:"valuesets",valueSetMode:"required-only",valueSetStrengths:["required"],includeValueSetHelpers:false,fhirVersion:"R4",resourceTypes:[],maxDepth:10,profileOptions:{generateKind:"interface",includeConstraints:true,includeDocumentation:true,strictMode:false,subfolder:"profiles"},generateBuilders:false,builderOptions:{includeValidation:true,includeFactoryMethods:true,includeInterfaces:true,generateNestedBuilders:true,includeHelperMethods:true,supportPartialBuild:true,includeJSDoc:true,generateFactories:true,includeTypeGuards:true,handleChoiceTypes:true,generateArrayHelpers:true},validatorOptions:{includeCardinality:true,includeTypes:true,includeConstraints:true,includeInvariants:false,validateRequired:true,allowAdditional:false,strictValidation:false,collectMetrics:false,generateAssertions:true,generatePartialValidators:true,optimizePerformance:true,includeJSDoc:true,generateCompositeValidators:true},guardOptions:{includeRuntimeValidation:true,includeErrorMessages:true,treeShakeable:true,targetTSVersion:"5.0",strictGuards:false,includeNullChecks:true,verbose:false}},typeSchema:{enablePersistence:true,cacheDir:".typeschema-cache",maxAge:1440*60*1e3,validateCached:true,forceRegenerate:false,shareCache:true,cacheKeyPrefix:"",treeshake:[],singleFile:false,profiles:{autoDetect:true}},packages:[],files:[],$schema:""},Be=["atomic-codegen.config.ts","atomic-codegen.config","atomic-codegen.config.json",".atomic-codegenrc","atomic-codegen.json",".atomic-codegen.json","codegen.config.json","codegen.json"],yt=class{validate(e){let t={valid:true,errors:[],warnings:[]};if(!e||typeof e!="object")return t.valid=false,t.errors.push({path:"root",message:"Configuration must be an object",value:e}),t;let r=e;r.outputDir!==void 0&&typeof r.outputDir!="string"&&t.errors.push({path:"outputDir",message:"outputDir must be a string",value:r.outputDir});let i=["verbose","overwrite","validate","cache"];for(let s of i)r[s]!==void 0&&typeof r[s]!="boolean"&&t.errors.push({path:s,message:`${s} must be a boolean`,value:r[s]});if(r.typescript!==void 0){let s=this.validateTypeScriptConfig(r.typescript);t.errors.push(...s);}if(r.typeSchema!==void 0){let s=this.validateTypeSchemaConfig(r.typeSchema);t.errors.push(...s);}return r.packages!==void 0&&(Array.isArray(r.packages)?r.packages.forEach((s,o)=>{typeof s!="string"&&t.errors.push({path:`packages[${o}]`,message:"package name must be a string",value:s});}):t.errors.push({path:"packages",message:"packages must be an array",value:r.packages})),r.files!==void 0&&(Array.isArray(r.files)?r.files.forEach((s,o)=>{typeof s!="string"&&t.errors.push({path:`files[${o}]`,message:"file path must be a string",value:s});}):t.errors.push({path:"files",message:"files must be an array",value:r.files})),t.valid=t.errors.length===0,t.valid&&(t.config=r),t}validateTypeScriptConfig(e){let t=[];if(typeof e!="object"||e===null)return t.push({path:"typescript",message:"typescript config must be an object",value:e}),t;let r=e;r.moduleFormat!==void 0&&(["esm","cjs"].includes(r.moduleFormat)||t.push({path:"typescript.moduleFormat",message:'moduleFormat must be "esm" or "cjs"',value:r.moduleFormat})),r.namingConvention!==void 0&&(["PascalCase","camelCase"].includes(r.namingConvention)||t.push({path:"typescript.namingConvention",message:'namingConvention must be "PascalCase" or "camelCase"',value:r.namingConvention}));let i=["generateIndex","includeDocuments","strictMode","includeProfiles","includeExtensions","includeCodeSystems","includeOperations","generateValueSets","includeValueSetHelpers"];for(let s of i)r[s]!==void 0&&typeof r[s]!="boolean"&&t.push({path:`typescript.${s}`,message:`${s} must be a boolean`,value:r[s]});if(r.validatorOptions!==void 0){let s=this.validateValidatorOptions(r.validatorOptions);t.push(...s);}if(r.guardOptions!==void 0){let s=this.validateGuardOptions(r.guardOptions);t.push(...s);}if(r.profileOptions!==void 0){let s=this.validateProfileOptions(r.profileOptions);t.push(...s);}return t}validateValidatorOptions(e){let t=[];if(typeof e!="object"||e===null)return t.push({path:"typescript.validatorOptions",message:"validatorOptions must be an object",value:e}),t;let r=e,i=["includeCardinality","includeTypes","includeConstraints","includeInvariants","validateRequired","allowAdditional","strictValidation","collectMetrics","generateAssertions","generatePartialValidators","optimizePerformance","includeJSDoc","generateCompositeValidators"];for(let s of i)r[s]!==void 0&&typeof r[s]!="boolean"&&t.push({path:`typescript.validatorOptions.${s}`,message:`${s} must be a boolean`,value:r[s]});return t}validateGuardOptions(e){let t=[];if(typeof e!="object"||e===null)return t.push({path:"typescript.guardOptions",message:"guardOptions must be an object",value:e}),t;let r=e;r.targetTSVersion!==void 0&&(["3.8","4.0","4.5","5.0"].includes(r.targetTSVersion)||t.push({path:"typescript.guardOptions.targetTSVersion",message:'targetTSVersion must be one of: "3.8", "4.0", "4.5", "5.0"',value:r.targetTSVersion}));let i=["includeRuntimeValidation","includeErrorMessages","treeShakeable","strictGuards","includeNullChecks","verbose"];for(let s of i)r[s]!==void 0&&typeof r[s]!="boolean"&&t.push({path:`typescript.guardOptions.${s}`,message:`${s} must be a boolean`,value:r[s]});return t}validateProfileOptions(e){let t=[];if(typeof e!="object"||e===null)return t.push({path:"typescript.profileOptions",message:"profileOptions must be an object",value:e}),t;let r=e;r.generateKind!==void 0&&(["interface","type","both"].includes(r.generateKind)||t.push({path:"typescript.profileOptions.generateKind",message:'generateKind must be "interface", "type", or "both"',value:r.generateKind})),r.subfolder!==void 0&&typeof r.subfolder!="string"&&t.push({path:"typescript.profileOptions.subfolder",message:"subfolder must be a string",value:r.subfolder});let i=["includeConstraints","includeDocumentation","strictMode"];for(let s of i)r[s]!==void 0&&typeof r[s]!="boolean"&&t.push({path:`typescript.profileOptions.${s}`,message:`${s} must be a boolean`,value:r[s]});return t}validateTypeSchemaConfig(e){let t=[];if(typeof e!="object"||e===null)return t.push({path:"typeSchema",message:"typeSchema config must be an object",value:e}),t;let r=e,i=["enablePersistence","validateCached","forceRegenerate","shareCache"];for(let o of i)r[o]!==void 0&&typeof r[o]!="boolean"&&t.push({path:`typeSchema.${o}`,message:`${o} must be a boolean`,value:r[o]});let s=["cacheDir","cacheKeyPrefix"];for(let o of s)r[o]!==void 0&&typeof r[o]!="string"&&t.push({path:`typeSchema.${o}`,message:`${o} must be a string`,value:r[o]});if(r.maxAge!==void 0&&(typeof r.maxAge!="number"||r.maxAge<=0)&&t.push({path:"typeSchema.maxAge",message:"maxAge must be a positive number",value:r.maxAge}),r.profiles!==void 0)if(typeof r.profiles!="object"||r.profiles===null)t.push({path:"typeSchema.profiles",message:"profiles must be an object",value:r.profiles});else {let o=r.profiles;o.autoDetect!==void 0&&typeof o.autoDetect!="boolean"&&t.push({path:"typeSchema.profiles.autoDetect",message:"autoDetect must be a boolean",value:o.autoDetect});}return t}},St=class{validator=new yt;async autoload(e=process.cwd()){let t=await this.findConfigFile(e);return t?this.loadFromFile(t):{...mt}}async loadFromFile(e){try{let t;if(e.endsWith(".ts")||e.endsWith("")){let s=await import(resolve(e));t=s.default||s;}else {let i=await readFile(e,"utf-8");t=JSON.parse(i);}let r=this.validator.validate(t);if(!r.valid){let i=r.errors.map(s=>`${s.path}: ${s.message}`).join(`
43
43
  `);throw new Error(`Configuration validation failed:
44
44
  ${i}`)}return this.mergeWithDefaults(r.config)}catch(t){throw t instanceof Error?new Error(`Failed to load config from ${e}: ${t.message}`):t}}async findConfigFile(e){for(let t of Be){let r=resolve(e,t);if(existsSync(r))return r}return null}mergeWithDefaults(e){return {...mt,...e,typescript:{...mt.typescript,...e.typescript}}}},wi=new St;async function Le(n){return wi.autoload(n)}var br={command:"generate",describe:"Generate code based on configuration file settings",builder:n=>n.option("verbose",{alias:"v",type:"boolean",default:false,description:"Enable verbose output"}).example("$0 generate","Generate code using settings from config file").example("$0 generate --verbose","Generate with verbose output"),handler:async n=>{if(n._.length>1){let o=n._.slice(1).join(" ");C(`Invalid syntax: 'atomic-codegen generate ${o}'
package/dist/index.js CHANGED
@@ -1496,6 +1496,7 @@ function determineKind(fhirSchema) {
1496
1496
  if (fhirSchema.kind === "primitive-type") return "primitive-type";
1497
1497
  if (fhirSchema.kind === "complex-type") return "complex-type";
1498
1498
  if (fhirSchema.kind === "resource") return "resource";
1499
+ if (fhirSchema.kind === "logical") return "logical";
1499
1500
  return "resource";
1500
1501
  }
1501
1502
  function mkIdentifier(fhirSchema) {
@@ -3065,7 +3066,7 @@ var FileSystemWriter = class {
3065
3066
  if (!this.currentFileDescriptor) throw new Error("No file opened");
3066
3067
  fs.writeSync(this.currentFileDescriptor, str);
3067
3068
  }
3068
- generate(_tsIndex) {
3069
+ async generate(_tsIndex) {
3069
3070
  throw new Error("Not implemented");
3070
3071
  }
3071
3072
  writtenFiles() {
@@ -3123,7 +3124,9 @@ var Writer = class extends FileSystemWriter {
3123
3124
  ];
3124
3125
  }
3125
3126
  generateDisclaimer() {
3126
- this.disclaimer().forEach((e) => this.comment(e));
3127
+ this.disclaimer().forEach((e) => {
3128
+ this.comment(e);
3129
+ });
3127
3130
  this.line();
3128
3131
  }
3129
3132
  indentBlock(gencontent) {
@@ -3262,7 +3265,7 @@ var CSharp = class extends Writer {
3262
3265
  ...options
3263
3266
  });
3264
3267
  }
3265
- generate(typeSchemaIndex) {
3268
+ async generate(typeSchemaIndex) {
3266
3269
  const complexTypes = typeSchemaIndex.collectComplexTypes();
3267
3270
  const resources = typeSchemaIndex.collectResources();
3268
3271
  const packages = Array.from(new Set(resources.map((r) => formatName(r.identifier.package))));
@@ -5250,7 +5253,9 @@ ${nestedInterfaces}`;
5250
5253
  if ("fields" in schema && schema.fields) {
5251
5254
  for (const [, field] of Object.entries(schema.fields)) {
5252
5255
  const importDeps = this.collectFieldImports(field);
5253
- importDeps.forEach((imp) => imports.add(imp));
5256
+ importDeps.forEach((imp) => {
5257
+ imports.add(imp);
5258
+ });
5254
5259
  }
5255
5260
  }
5256
5261
  lines.push("import type { ResourceType } from './utilities.js';");
@@ -5489,7 +5494,9 @@ ${nestedInterfaces}`;
5489
5494
  } else if (typeString === "Reference" && field.reference && Array.isArray(field.reference)) {
5490
5495
  const referenceTypes = this.extractReferenceTypes(field.reference);
5491
5496
  if (referenceTypes.length > 0) {
5492
- referenceTypes.forEach((type) => this.resourceTypes.add(type));
5497
+ referenceTypes.forEach((type) => {
5498
+ this.resourceTypes.add(type);
5499
+ });
5493
5500
  const unionType = referenceTypes.map((type) => `'${type}'`).join(" | ");
5494
5501
  typeString = `Reference<${unionType}>`;
5495
5502
  }
@@ -6120,7 +6127,7 @@ var TypeScript = class extends Writer {
6120
6127
  } else throw new Error(`Profile generation not implemented for kind: ${schema.identifier.kind}`);
6121
6128
  });
6122
6129
  }
6123
- generate(tsIndex) {
6130
+ async generate(tsIndex) {
6124
6131
  const typesToGenerate = [
6125
6132
  ...tsIndex.collectComplexTypes(),
6126
6133
  ...tsIndex.collectResources(),
@@ -6158,7 +6165,7 @@ var writerToGenerator = (writerGen) => {
6158
6165
  };
6159
6166
  return {
6160
6167
  generate: async ({ index: tsIndex }) => {
6161
- writerGen.generate(tsIndex);
6168
+ await writerGen.generate(tsIndex);
6162
6169
  return getGeneratedFiles();
6163
6170
  },
6164
6171
  setOutputDir: (outputDir) => writerGen.opts.outputDir = outputDir,