constructor()

in src/FHIRSearchParametersRegistry/index.ts [95:161]


    constructor(fhirVersion: FhirVersion, compiledImplementationGuides?: any[]) {
        let compiledSearchParams: SearchParam[];
        if (fhirVersion === '4.0.1') {
            compiledSearchParams = compiledSearchParamsV4 as SearchParam[];
        } else {
            compiledSearchParams = compiledSearchParamsV3 as SearchParam[];
        }
        if (compiledImplementationGuides !== undefined) {
            // order is important. params from IGs are added last so that they overwrite base FHIR params with the same name
            compiledSearchParams = [...compiledSearchParams, ...compiledImplementationGuides];
        }

        this.includeMap = {};
        this.revincludeMap = {};
        this.typeNameMap = {};
        this.capabilityStatement = {};

        compiledSearchParams.forEach((searchParam) => {
            this.typeNameMap[searchParam.base] = this.typeNameMap[searchParam.base] ?? {};
            this.typeNameMap[searchParam.base][searchParam.name] = searchParam;

            if (searchParam.type === 'reference') {
                this.includeMap[searchParam.base] = this.includeMap[searchParam.base] ?? [];
                this.includeMap[searchParam.base].push(searchParam);

                // eslint-disable-next-line no-unused-expressions
                searchParam.target?.forEach((target) => {
                    this.revincludeMap[target] = this.revincludeMap[target] ?? [];
                    this.revincludeMap[target].push(searchParam);
                });
            }
        });

        Object.entries(this.typeNameMap).forEach(([resourceType, searchParams]) => {
            if (resourceType === 'Resource') {
                // search params of type Resource are handled separately since they must appear on ALL resource types
                return;
            }

            this.capabilityStatement[resourceType] = this.capabilityStatement[resourceType] ?? {};
            this.capabilityStatement[resourceType].searchParam = Object.values(searchParams).map(toCapabilityStatement);

            this.capabilityStatement[resourceType].searchInclude = [
                '*',
                ...(this.includeMap[resourceType]?.map((searchParam) => `${searchParam.base}:${searchParam.name}`) ??
                    []),
            ];

            this.capabilityStatement[resourceType].searchRevInclude = [
                '*',
                ...(this.revincludeMap[resourceType]?.map((searchParam) => `${searchParam.base}:${searchParam.name}`) ??
                    []),
            ];
        });

        const resourceSearchParams = Object.values(this.typeNameMap.Resource).map(toCapabilityStatement);

        // For each resource type, add all search params that have "Resource" as base, except when there is already
        // a more specific search parameter with the same name.
        Object.entries(this.capabilityStatement).forEach(([resourceType, searchCapabilities]) => {
            searchCapabilities.searchParam.push(
                ...resourceSearchParams.filter(
                    (resourceSearchParam) => !this.typeNameMap?.[resourceType]?.[resourceSearchParam.name],
                ),
            );
        });
    }