---
description: >-
  In this tutorial, you will learn how to create a FHIR NPM package and import
  it into Aidbox.
---

# How to create FHIR npm package

A FHIR package groups a coherent collection of conformance resources, like StructureDefinitions, SearchParameters, etc., into an easily distributed NPM package.

## 1. Create a new package folder

Create a new folder for the package.

```bash
mkdir -p package
```


## 2. Prepare the package manifest file

To start, we need to describe the package manifest file for our NPM package. A package manifest is a JSON file called `package.json`.

{% code title="package/package.json" %}
```json
{
    // The globally unique identifier of the package.
    // A package name consists of two or more namespaces separated by a dot.
    // Each namespace starts with a lowercase alphabet character
    "name": "my.fhir.package.name",

    // The version of the package (SemVer).
    // SHALL contain only letters, numbers, and the characters ".", "_", and "-"
    "version": "1.0.0",

    // The description of the package.
    "description": "My FHIR NPM Package",

    // The author of the package.
    "author": "Author Name",

    // The list of package dependencies.
    // Should contain at least one FHIR core package.
    "dependencies": {
        "hl7.fhir.r4.core": "4.0.1",
        "hl7.fhir.us.core": "5.0.1"
    }
}
```
{% endcode %}

## 3. Write Package Content

A package contains a set of FHIR resources in the JSON format. Let's describe a few resources for the package.

### 3.1 StructureDefinition resource

Let's describe a profile of the US Core Patient in the file `my-patient-profile.json`.

{% code title="package/my-patient-profile.json" %}
```json
{
    // Type of the FHIR resource.
    "resourceType": "StructureDefinition",
    
    // How the type relates to the baseDefinition.
    "derivation": "constraint",
    
    // Defines the kind of structure that this definition is describing.
    "kind": "resource",
    
    // Type constrained by this structure.
    "type": "Patient",
    
    // The status of this structure definition.
    "status": "active",
    
    // Name for this structure definition (computer friendly).
    "name": "my-patient-profile",
    
    // 	Whether the structure is abstract.
    "abstract": false,
    
    //The Canonical identifier for this structure definition is represented as a URI (globally unique).
    "url": "http://custom-url/my-patient-profile",
    
    // Definition from which this type is constrained.
    "baseDefinition": "http://hl7.org/fhir/us/core/StructureDefinition/us-core-patient",
    
    "differential": {
        "element": [
            {
                // Element ID
                "id": "Patient.address",
                
                // Path of the element in the hierarchy of elements
                "path": "Patient.address",
                
                // The minimum number of times this element SHALL appear in the instance.
                "min": 1
            }
        ]
    }
}
```
{% endcode %}

We have described a profile that inherits from the US Core Patient and adds a required field for address.

### 3.2 SearchParameter resource

Let's describe a custom search parameter on the Patient resource in the file `my-patient-search.json`.

{% code title="package/my-patient-search.json" %}
```json
{
    // Type of the FHIR resource.
    "resourceType": "SearchParameter",
    
    // ID of the search parameter.
    "id": "Patient-myname",
    
    // Canonical identifier for this search parameter, represented as a URI (globally unique).
    "url": "http://hl7.org/fhir/SearchParameter/Patient-myname",
    
    // Business version of the search parameter.
    "version": "4.0.1", 
    
    // Name for this search parameter (computer friendly).
    "name": "myname",
    
    // Natural language description of the search parameter.
    "description": "text",
    
    // The resource type(s) this search parameter applies to.
    "base": ["Patient"],
    
    // Status of the search parameter.
    "status": "active", 
    
    // Recommended name for the parameter in search url.
    "code": "myname",
    
    // 	The type of value that a search parameter may contain, and how the content is interpreted.
    "type": "string",
    
    //FHIRPath expression that extracts the values.
    "expression": "Patient.name"
}
```
{% endcode %}

### 3.3 Create .index.json file

The [.index.json](https://build.fhir.org/packages.html#2.1.10.5) contains information from the resources in the package folder.

```package/index.json
{
  "index-version": 2,
  "files": [
    {
      "filename": "my-patient-profile.json",
      "resourceType": "StructureDefinition",
      "url": "http://custom-url/my-patient-profile",
      "kind": "resource",
      "type": "Patient",
      "derivation": "constraint"
    },
    {
      "filename": "my-patient-search.json",
      "resourceType": "SearchParameter",
      "url": "http://hl7.org/fhir/SearchParameter/Patient-myname"
    }
  ]
}
```

## 4. Build NPM package

The resulting npm package has the following structure:

```
package
├── .index.json
├── my-patient-profile.json
├── my-patient-search.json
└── package.json
```

We need to build the artifacts of the npm package into an archive in the TAR (.tar.gz) format.

{% tabs %}
{% tab title="Linux" %}
```bash
tar -czvf package.tar.gz package 
```
{% endtab %}

{% tab title="Windows" %}
If Windows supports a native tar command:

```bash
tar -cvzf package.tar.gz package
```

or download and install **7-Zip**

1. `"C:\Program Files\7-Zip/7z.exe" a -ttar package.tar package`
2. `"C:\Program Files\7-Zip/7z.exe" a -tgzip package.tar.gz package.tar`
{% endtab %}
{% endtabs %}

Following the guide below, upload the archive to Aidbox.

{% content-ref url="upload-fhir-implementation-guide/aidbox-ui/local-ig-package.md" %}
[local-ig-package.md](upload-fhir-implementation-guide/aidbox-ui/local-ig-package.md)
{% endcontent-ref %}
