diff --git a/.github/workflows/deploy.yaml b/.github/workflows/deploy.yaml index b14d93d..e4f3b26 100644 --- a/.github/workflows/deploy.yaml +++ b/.github/workflows/deploy.yaml @@ -33,6 +33,7 @@ jobs: ${{ runner.os }}-node- - run: npm ci + - run: npm run zip-tutorial - run: hugo - name: Deploy diff --git a/README.md b/README.md index b8e5193..b09ce40 100644 --- a/README.md +++ b/README.md @@ -57,6 +57,15 @@ $ hugo This will build the static site files to the `./public` folder. They can then be served using any standard HTTP server. +# Tutorial files + +Files for the FSH tutorial are in the `./fsh-tutorial` folder. If you update any of these files, you should also rebuild the zipped version of the tutorial by running: +```bash +$ npm run zip-tutorial +``` + +This is also run automatically during the deployment process. + # License Copyright 2020+ Health Level Seven International diff --git a/content/docs/SUSHI/tutorial/_index.md b/content/docs/SUSHI/tutorial/_index.md index 8aefd23..892cd76 100644 --- a/content/docs/SUSHI/tutorial/_index.md +++ b/content/docs/SUSHI/tutorial/_index.md @@ -3,7 +3,7 @@ title: "SUSHI Tutorial" weight: 40 resources: - name: starter - src: fsh-tutorial-master.zip + src: fsh-tutorial.zip title: FSH Tutorial Starter aliases: - /docs/tutorials/basic/index.html diff --git a/content/docs/SUSHI/tutorial/fsh-tutorial-master.zip b/content/docs/SUSHI/tutorial/fsh-tutorial-master.zip deleted file mode 100644 index e1c6787..0000000 Binary files a/content/docs/SUSHI/tutorial/fsh-tutorial-master.zip and /dev/null differ diff --git a/content/docs/SUSHI/tutorial/fsh-tutorial.zip b/content/docs/SUSHI/tutorial/fsh-tutorial.zip new file mode 100644 index 0000000..ef84384 Binary files /dev/null and b/content/docs/SUSHI/tutorial/fsh-tutorial.zip differ diff --git a/fsh-tutorial/FishExample/_genonce.bat b/fsh-tutorial/FishExample/_genonce.bat new file mode 100644 index 0000000..a9864ef --- /dev/null +++ b/fsh-tutorial/FishExample/_genonce.bat @@ -0,0 +1,27 @@ +@ECHO OFF +SET publisher_jar=publisher.jar +SET input_cache_path=%CD%\input-cache + +ECHO Checking internet connection... +PING tx.fhir.org -4 -n 1 -w 1000 | FINDSTR TTL && GOTO isonline +ECHO We're offline... +SET txoption=-tx n/a +GOTO igpublish + +:isonline +ECHO We're online +SET txoption= + +:igpublish + +SET JAVA_TOOL_OPTIONS=-Dfile.encoding=UTF-8 + +IF EXIST "%input_cache_path%\%publisher_jar%" ( + JAVA -jar "%input_cache_path%\%publisher_jar%" -ig . %txoption% %* +) ELSE If exist "..\%publisher_jar%" ( + JAVA -jar "..\%publisher_jar%" -ig . %txoption% %* +) ELSE ( + ECHO IG Publisher NOT FOUND in input-cache or parent folder. Please run _updatePublisher. Aborting... +) + +PAUSE diff --git a/fsh-tutorial/FishExample/_genonce.sh b/fsh-tutorial/FishExample/_genonce.sh new file mode 100644 index 0000000..38efcb4 --- /dev/null +++ b/fsh-tutorial/FishExample/_genonce.sh @@ -0,0 +1,28 @@ +#!/bin/bash +publisher_jar=publisher.jar +input_cache_path=./input-cache/ +echo Checking internet connection... +curl -sSf tx.fhir.org > /dev/null + +if [ $? -eq 0 ]; then + echo "Online" + txoption="" +else + echo "Offline" + txoption="-tx n/a" +fi + +echo "$txoption" + +publisher=$input_cache_path/$publisher_jar +if test -f "$publisher"; then + java -jar $publisher -ig . $txoption $* + +else + publisher=../$publisher_jar + if test -f "$publisher"; then + java -jar $publisher -ig . $txoption $* + else + echo IG Publisher NOT FOUND in input-cache or parent folder. Please run _updatePublisher. Aborting... + fi +fi diff --git a/fsh-tutorial/FishExample/_updatePublisher.bat b/fsh-tutorial/FishExample/_updatePublisher.bat new file mode 100644 index 0000000..a8bf6ee --- /dev/null +++ b/fsh-tutorial/FishExample/_updatePublisher.bat @@ -0,0 +1,218 @@ +@ECHO OFF + +SETLOCAL + +SET dlurl=https://github.com/HL7/fhir-ig-publisher/releases/latest/download/publisher.jar +SET publisher_jar=publisher.jar +SET input_cache_path=%CD%\input-cache\ +SET skipPrompts=false + +set update_bat_url=https://raw.githubusercontent.com/FHIR/sample-ig/master/_updatePublisher.bat +set gen_bat_url=https://raw.githubusercontent.com/FHIR/sample-ig/master/_genonce.bat +set gencont_bat_url=https://raw.githubusercontent.com/FHIR/sample-ig/master/_gencontinuous.bat +set gencont_sh_url=https://raw.githubusercontent.com/FHIR/sample-ig/master/_gencontinuous.sh +set gen_sh_url=https://raw.githubusercontent.com/FHIR/sample-ig/master/_genonce.sh +set update_sh_url=https://raw.githubusercontent.com/FHIR/sample-ig/master/_updatePublisher.sh + +IF "%~1"=="/f" SET skipPrompts=true + + +ECHO. +ECHO Checking internet connection... +PING tx.fhir.org -4 -n 1 -w 1000 | FINDSTR TTL && GOTO isonline +ECHO We're offline, nothing to do... +GOTO end + +:isonline +ECHO We're online + + +:processflags +SET ARG=%1 +IF DEFINED ARG ( + IF "%ARG%"=="-f" SET FORCE=true + IF "%ARG%"=="--force" SET FORCE=true + SHIFT + GOTO processflags +) + +FOR %%x IN ("%CD%") DO SET upper_path=%%~dpx + +ECHO. +IF NOT EXIST "%input_cache_path%%publisher_jar%" ( + IF NOT EXIST "%upper_path%%publisher_jar%" ( + SET jarlocation="%input_cache_path%%publisher_jar%" + SET jarlocationname=Input Cache + ECHO IG Publisher is not yet in input-cache or parent folder. + REM we don't use jarlocation below because it will be empty because we're in a bracketed if statement + GOTO create + ) ELSE ( + ECHO IG Publisher FOUND in parent folder + SET jarlocation="%upper_path%%publisher_jar%" + SET jarlocationname=Parent folder + GOTO upgrade + ) +) ELSE ( + ECHO IG Publisher FOUND in input-cache + SET jarlocation="%input_cache_path%%publisher_jar%" + SET jarlocationname=Input Cache + GOTO upgrade +) + +:create +IF DEFINED FORCE ( + MKDIR "%input_cache_path%" 2> NUL + GOTO download +) + +IF "%skipPrompts%"=="true" ( + SET create="Y" +) ELSE ( + SET /p create="Ok? (Y/N) " +) +IF /I "%create%"=="Y" ( + ECHO Will place publisher jar here: %input_cache_path%%publisher_jar% + MKDIR "%input_cache_path%" 2> NUL + GOTO download +) +GOTO done + +:upgrade +IF "%skipPrompts%"=="true" ( + SET overwrite="Y" +) ELSE ( + SET /p overwrite="Overwrite %jarlocation%? (Y/N) " +) + +IF /I "%overwrite%"=="Y" ( + GOTO download +) +GOTO done + +:download +ECHO Downloading most recent publisher to %jarlocationname% - it's ~100 MB, so this may take a bit + +FOR /f "tokens=4-5 delims=. " %%i IN ('ver') DO SET VERSION=%%i.%%j +IF "%version%" == "10.0" GOTO win10 +IF "%version%" == "6.3" GOTO win8.1 +IF "%version%" == "6.2" GOTO win8 +IF "%version%" == "6.1" GOTO win7 +IF "%version%" == "6.0" GOTO vista + +ECHO Unrecognized version: %version% +GOTO done + +:win10 +CALL POWERSHELL -command if ('System.Net.WebClient' -as [type]) {(new-object System.Net.WebClient).DownloadFile(\"%dlurl%\",\"%jarlocation%\") } else { Invoke-WebRequest -Uri "%dlurl%" -Outfile "%jarlocation%" } + +GOTO done + +:win7 +rem this may be triggering the antivirus - bitsadmin.exe is a known threat +rem CALL bitsadmin /transfer GetPublisher /download /priority normal "%dlurl%" "%jarlocation%" + +rem this didn't work in win 10 +rem CALL Start-BitsTransfer /priority normal "%dlurl%" "%jarlocation%" + +rem this should work - untested +call (New-Object Net.WebClient).DownloadFile('%dlurl%', '%jarlocation%') +GOTO done + +:win8.1 +:win8 +:vista +GOTO done + + + +:done + + + + +ECHO. +ECHO Updating scripts +IF "%skipPrompts%"=="true" ( + SET updateScripts="Y" +) ELSE ( + SET /p updateScripts="Update scripts? (Y/N) " +) +IF /I "%updateScripts%"=="Y" ( + GOTO scripts +) +GOTO end + + +:scripts + +REM Download all batch files (and this one with a new name) + +SETLOCAL DisableDelayedExpansion + + + +:dl_script_1 +ECHO Updating _updatePublisher.sh +call POWERSHELL -command if ('System.Net.WebClient' -as [type]) {(new-object System.Net.WebClient).DownloadFile(\"%update_sh_url%\",\"_updatePublisher.new.sh\") } else { Invoke-WebRequest -Uri "%update_sh_url%" -Outfile "_updatePublisher.new.sh" } +if %ERRORLEVEL% == 0 goto upd_script_1 +echo "Errors encountered during download: %errorlevel%" +goto dl_script_2 +:upd_script_1 +start copy /y "_updatePublisher.new.sh" "_updatePublisher.sh" ^&^& del "_updatePublisher.new.sh" ^&^& exit + + +:dl_script_2 +ECHO Updating _genonce.bat +call POWERSHELL -command if ('System.Net.WebClient' -as [type]) {(new-object System.Net.WebClient).DownloadFile(\"%gen_bat_url%\",\"_genonce.new.bat\") } else { Invoke-WebRequest -Uri "%gen_bat_url%" -Outfile "_genonce.bat" } +if %ERRORLEVEL% == 0 goto upd_script_2 +echo "Errors encountered during download: %errorlevel%" +goto dl_script_3 +:upd_script_2 +start copy /y "_genonce.new.bat" "_genonce.bat" ^&^& del "_genonce.new.bat" ^&^& exit + +:dl_script_3 +ECHO Updating _gencontinuous.bat +call POWERSHELL -command if ('System.Net.WebClient' -as [type]) {(new-object System.Net.WebClient).DownloadFile(\"%gencont_bat_url%\",\"_gencontinuous.new.bat\") } else { Invoke-WebRequest -Uri "%gencont_bat_url%" -Outfile "_gencontinuous.bat" } +if %ERRORLEVEL% == 0 goto upd_script_3 +echo "Errors encountered during download: %errorlevel%" +goto dl_script_4 +:upd_script_3 +start copy /y "_gencontinuous.new.bat" "_gencontinuous.bat" ^&^& del "_gencontinuous.new.bat" ^&^& exit + + +:dl_script_4 +ECHO Updating _genonce.sh +call POWERSHELL -command if ('System.Net.WebClient' -as [type]) {(new-object System.Net.WebClient).DownloadFile(\"%gen_sh_url%\",\"_genonce.new.sh\") } else { Invoke-WebRequest -Uri "%gen_sh_url%" -Outfile "_genonce.sh" } +if %ERRORLEVEL% == 0 goto upd_script_4 +echo "Errors encountered during download: %errorlevel%" +goto dl_script_5 +:upd_script_4 +start copy /y "_genonce.new.sh" "_genonce.sh" ^&^& del "_genonce.new.sh" ^&^& exit + +:dl_script_5 +ECHO Updating _gencontinuous.sh +call POWERSHELL -command if ('System.Net.WebClient' -as [type]) {(new-object System.Net.WebClient).DownloadFile(\"%gencont_sh_url%\",\"_gencontinuous.new.sh\") } else { Invoke-WebRequest -Uri "%gencont_sh_url%" -Outfile "_gencontinuous.sh" } +if %ERRORLEVEL% == 0 goto upd_script_5 +echo "Errors encountered during download: %errorlevel%" +goto dl_script_6 +:upd_script_5 +start copy /y "_gencontinuous.new.sh" "_gencontinuous.sh" ^&^& del "_gencontinuous.new.sh" ^&^& exit + + + +:dl_script_6 +ECHO Updating _updatePublisher.bat +call POWERSHELL -command if ('System.Net.WebClient' -as [type]) {(new-object System.Net.WebClient).DownloadFile(\"%update_bat_url%\",\"_updatePublisher.new.bat\") } else { Invoke-WebRequest -Uri "%update_bat_url%" -Outfile "_updatePublisher.new.bat" } +if %ERRORLEVEL% == 0 goto upd_script_6 +echo "Errors encountered during download: %errorlevel%" +goto end +:upd_script_6 +start copy /y "_updatePublisher.new.bat" "_updatePublisher.bat" ^&^& del "_updatePublisher.new.bat" ^&^& exit + + +:end + + +IF "%skipPrompts%"=="true" ( + PAUSE +} diff --git a/fsh-tutorial/FishExample/_updatePublisher.sh b/fsh-tutorial/FishExample/_updatePublisher.sh new file mode 100644 index 0000000..1a3484b --- /dev/null +++ b/fsh-tutorial/FishExample/_updatePublisher.sh @@ -0,0 +1,133 @@ +#!/bin/bash +pubsource=https://github.com/HL7/fhir-ig-publisher/releases/latest/download/ +publisher_jar=publisher.jar +dlurl=$pubsource$publisher_jar + +input_cache_path=$PWD/input-cache/ + +scriptdlroot=https://raw.githubusercontent.com/FHIR/sample-ig/master +update_bat_url=$scriptdlroot/_updatePublisher.bat +gen_bat_url=$scriptdlroot/_genonce.bat +gencont_bat_url=$scriptdlroot/_gencontinuous.bat +gencont_sh_url=$scriptdlroot/_gencontinuous.sh +gen_sh_url=$scriptdlroot/_genonce.sh +update_sh_url=$scriptdlroot/_updatePublisher.sh + +skipPrompts=false +FORCE=false + +if ! type "curl" > /dev/null; then + echo "ERROR: Script needs curl to download latest IG Publisher. Please install curl." + exit 1 +fi + +while [ "$#" -gt 0 ]; do + case $1 in + -f|--force) FORCE=true ;; + -y|--yes) skipPrompts=true ; FORCE=true ;; + *) echo "Unknown parameter passed: $1. Exiting"; exit 1 ;; + esac + shift +done + +echo "Checking internet connection" +case "$OSTYPE" in + linux-gnu* ) ping tx.fhir.org -4 -c 1 -w 1000 >/dev/null ;; + darwin* ) ping tx.fhir.org -c 1 >/dev/null ;; + *) echo "unknown: $OSTYPE"; exit 1 ;; +esac + +if [ $? -ne 0 ] ; then + echo "Offline (or the terminology server is down), unable to update. Exiting" + exit 1 +fi + +if [ ! -d "$input_cache_path" ] ; then + if [ $FORCE != true ]; then + echo "$input_cache_path does not exist" + message="create it?" + read -r -p "$message" response + else + response=y + fi +fi + +if [[ $response =~ ^[yY].*$ ]] ; then + mkdir ./input-cache +fi + +publisher="$input_cache_path$publisher_jar" + +if test -f "$publisher" ; then + echo "IG Publisher FOUND in input-cache" + jarlocation="$publisher" + jarlocationname="Input Cache" + upgrade=true +else + publisher="../$publisher_jar" + upgrade=true + if test -f "$publisher"; then + echo "IG Publisher FOUND in parent folder" + jarlocation="$publisher" + jarlocationname="Parent Folder" + upgrade=true + else + echo "IG Publisher NOT FOUND in input-cache or parent folder" + jarlocation=$input_cache_path$publisher_jar + jarlocationname="Input Cache" + upgrade=false + fi +fi + +if [[ $skipPrompts == false ]]; then + + if [[ $upgrade == true ]]; then + message="Overwrite $jarlocation? (Y/N) " + else + echo Will place publisher jar here: "$jarlocation" + message="Ok (enter 'y' or 'Y' to continue, any other key to cancel)?" + fi + read -r -p "$message" response +else + response=y +fi +if [[ $skipPrompts == true ]] || [[ $response =~ ^[yY].*$ ]]; then + + echo "Downloading most recent publisher to $jarlocationname - it's ~100 MB, so this may take a bit" + curl -L $dlurl -o "$jarlocation" --create-dirs +else + echo cancelled publisher update +fi + +if [[ $skipPrompts != true ]]; then + message="Update scripts? (enter 'y' or 'Y' to continue, any other key to cancel)?" + read -r -p "$message" response + fi + +if [[ $skipPrompts == true ]] || [[ $response =~ ^[yY].*$ ]]; then + echo "Downloading most recent scripts " + + curl -L $update_bat_url -o /tmp/_updatePublisher.new + cp /tmp/_updatePublisher.new _updatePublisher.bat + rm /tmp/_updatePublisher.new + + curl -L $gen_bat_url -o /tmp/_genonce.new + cp /tmp/_genonce.new _genonce.bat + rm /tmp/_genonce.new + + curl -L $gencont_bat_url -o /tmp/_gencontinuous.new + cp /tmp/_gencontinuous.new _gencontinuous.bat + rm /tmp/_gencontinuous.new + + curl -L $gencont_sh_url -o /tmp/_gencontinuous.new + cp /tmp/_gencontinuous.new _gencontinuous.sh + rm /tmp/_gencontinuous.new + + curl -L $gen_sh_url -o /tmp/_genonce.new + cp /tmp/_genonce.new _genonce.sh + rm /tmp/_genonce.new + + curl -L $update_sh_url -o /tmp/_updatePublisher.new + cp /tmp/_updatePublisher.new _updatePublisher.sh + rm /tmp/_updatePublisher.new +fi diff --git a/fsh-tutorial/FishExample/ig.ini b/fsh-tutorial/FishExample/ig.ini new file mode 100644 index 0000000..5e6d8b1 --- /dev/null +++ b/fsh-tutorial/FishExample/ig.ini @@ -0,0 +1,3 @@ +[IG] +ig = fsh-generated/resources/ImplementationGuide-fish.json +template = fhir.base.template#current \ No newline at end of file diff --git a/fsh-tutorial/FishExample/input/fsh/FishPatient.fsh b/fsh-tutorial/FishExample/input/fsh/FishPatient.fsh new file mode 100644 index 0000000..29f3d1d --- /dev/null +++ b/fsh-tutorial/FishExample/input/fsh/FishPatient.fsh @@ -0,0 +1,7 @@ +Profile: FishPatient +Parent: Patient +Id: fish-patient +Title: "Fish Patient" +Description: "A patient that is a type of fish." +* name 1..* + diff --git a/fsh-tutorial/FishExample/input/fsh/Veterinarian.fsh b/fsh-tutorial/FishExample/input/fsh/Veterinarian.fsh new file mode 100644 index 0000000..8deed7c --- /dev/null +++ b/fsh-tutorial/FishExample/input/fsh/Veterinarian.fsh @@ -0,0 +1,7 @@ +Profile: Veterinarian +Parent: Practitioner +Id: veterinarian +Title: "Veterinarian" +Description: "A profile on the Practitioner resource for veterinarians. In the US, vets do not have National Provider Numbers." +* name 1..* + diff --git a/fsh-tutorial/FishExample/input/ignoreWarnings.txt b/fsh-tutorial/FishExample/input/ignoreWarnings.txt new file mode 100644 index 0000000..d03142b --- /dev/null +++ b/fsh-tutorial/FishExample/input/ignoreWarnings.txt @@ -0,0 +1,5 @@ +== Suppressed Messages == + +# Add warning and/or information messages here after you've confirmed that they aren't really a problem +# (And include comments like this justifying why) +# See https://github.com/FHIR/sample-ig/blob/master/input/ignoreWarnings.txt for examples \ No newline at end of file diff --git a/fsh-tutorial/FishExample/input/images/Shorty.png b/fsh-tutorial/FishExample/input/images/Shorty.png new file mode 100644 index 0000000..2c0c4a7 Binary files /dev/null and b/fsh-tutorial/FishExample/input/images/Shorty.png differ diff --git a/fsh-tutorial/FishExample/input/pagecontent/index.md b/fsh-tutorial/FishExample/input/pagecontent/index.md new file mode 100644 index 0000000..02ef704 --- /dev/null +++ b/fsh-tutorial/FishExample/input/pagecontent/index.md @@ -0,0 +1,23 @@ +### Background + +Fishkeeping is a popular hobby, practiced by aquarists, concerned with keeping fish in a home aquarium or garden pond. There is also a piscicultural fishkeeping industry, as a branch of agriculture. + +### Meet Shorty + +This is Shorty, the mascot for FHIR Shorthand. He's doing contortions to shape himself into an "S", for Shorthand. + +![Shorty the FSH](./Shorty.png) + +### FHIR Shorthand Resources + +FHIR Shorthand calls currently are the second Thursday of every month at 9 am Eastern US Time. [Click here to join](https://teams.microsoft.com/l/meetup-join/19%3ameeting_OGJmYmVlM2UtYzVkZi00YWJjLWJlNzMtN2ZkYTVkYTA1Mzlk%40thread.v2/0?context=%7b%22Tid%22%3a%22c620dc48-1d50-4952-8b39-df4d54d74d82%22%2c%22Oid%22%3a%22f9a60b6f-fbcc-48d0-bc8e-d6d742b4b339%22%7d) + +[HL7 Confluence site](https://confluence.hl7.org/display/FHIRI/FHIR+Shorthand) + +[FHIR Shorthand Documentation](https://build.fhir.org/ig/HL7/fhir-shorthand) + +[FHIR Shorthand documentation code repository](https://github.com/HL7/fhir-shorthand) + +[SUSHI code repository](https://github.com/FHIR/sushi) + +[Zulip](https://chat.fhir.org) channel: #shorthand \ No newline at end of file diff --git a/fsh-tutorial/FishExample/package-list.json b/fsh-tutorial/FishExample/package-list.json new file mode 100644 index 0000000..71ee159 --- /dev/null +++ b/fsh-tutorial/FishExample/package-list.json @@ -0,0 +1,25 @@ +{ + "package-id": "fish", + "canonical": "http://example.org/fhir/fish", + "title": "Fish Implementation Guide", + "introduction": "An example of how FSH can be used to create an IG about fish", + "list": [ + { + "version": "current", + "desc": "Continuous Integration Build (latest in version control)", + "path": "http://build.fhir.org/ig/example/example-ig", + "status": "ci-build", + "current": true + }, + { + "version": "0.0.1", + "date": "2099-01-01", + "desc": "Initial STU ballot (Mmm yyyy Ballot)", + "path": "http://example.org/fhir/STU1", + "status": "ballot", + "sequence": "STU 1", + "fhirversion": "4.0.1", + "current": true + } + ] +} diff --git a/fsh-tutorial/FishExample/sushi-config.yaml b/fsh-tutorial/FishExample/sushi-config.yaml new file mode 100644 index 0000000..104c245 --- /dev/null +++ b/fsh-tutorial/FishExample/sushi-config.yaml @@ -0,0 +1,36 @@ +# ╭─────────────────────────────────ImplementationGuide-fish.json──────────────────────────────────╮ +# │ The properties below are used to create the ImplementationGuide resource. For a list of │ +# │ supported properties, see: │ +# │ https://fshschool.org/docs/sushi/configuration/#full-configuration │ +# ╰────────────────────────────────────────────────────────────────────────────────────────────────╯ +id: fish +canonical: http://example.org/fhir/fish +version: 0.1.0 +name: FishImplementationGuide +title: Fish Implementation Guide +status: draft +publisher: James Tuna +contact: + - name: Bill Cod + telecom: + - system: email + value: cod@reef.gov +description: An example of how FSH can be used to create an IG about fish +license: CC0-1.0 +fhirVersion: 4.0.1 +parameters: + apply-publisher: true + apply-contact: true + show-inherited-invariants: false +copyrightYear: 2020+ +releaseLabel: ci-build + +# ╭────────────────────────────────────────────menu.xml────────────────────────────────────────────╮ +# │ To use a provided input/includes/menu.xml file, delete the "menu" property below. │ +# ╰────────────────────────────────────────────────────────────────────────────────────────────────╯ +menu: + IG Home: index.html + Table of Contents: toc.html + Artifacts Summary: artifacts.html + Other Resources: + "FHIR Spec ": new-tab {{site.data.fhir.path}}index.html diff --git a/fsh-tutorial/FishExampleComplete/_genonce.bat b/fsh-tutorial/FishExampleComplete/_genonce.bat new file mode 100644 index 0000000..a9864ef --- /dev/null +++ b/fsh-tutorial/FishExampleComplete/_genonce.bat @@ -0,0 +1,27 @@ +@ECHO OFF +SET publisher_jar=publisher.jar +SET input_cache_path=%CD%\input-cache + +ECHO Checking internet connection... +PING tx.fhir.org -4 -n 1 -w 1000 | FINDSTR TTL && GOTO isonline +ECHO We're offline... +SET txoption=-tx n/a +GOTO igpublish + +:isonline +ECHO We're online +SET txoption= + +:igpublish + +SET JAVA_TOOL_OPTIONS=-Dfile.encoding=UTF-8 + +IF EXIST "%input_cache_path%\%publisher_jar%" ( + JAVA -jar "%input_cache_path%\%publisher_jar%" -ig . %txoption% %* +) ELSE If exist "..\%publisher_jar%" ( + JAVA -jar "..\%publisher_jar%" -ig . %txoption% %* +) ELSE ( + ECHO IG Publisher NOT FOUND in input-cache or parent folder. Please run _updatePublisher. Aborting... +) + +PAUSE diff --git a/fsh-tutorial/FishExampleComplete/_genonce.sh b/fsh-tutorial/FishExampleComplete/_genonce.sh new file mode 100644 index 0000000..38efcb4 --- /dev/null +++ b/fsh-tutorial/FishExampleComplete/_genonce.sh @@ -0,0 +1,28 @@ +#!/bin/bash +publisher_jar=publisher.jar +input_cache_path=./input-cache/ +echo Checking internet connection... +curl -sSf tx.fhir.org > /dev/null + +if [ $? -eq 0 ]; then + echo "Online" + txoption="" +else + echo "Offline" + txoption="-tx n/a" +fi + +echo "$txoption" + +publisher=$input_cache_path/$publisher_jar +if test -f "$publisher"; then + java -jar $publisher -ig . $txoption $* + +else + publisher=../$publisher_jar + if test -f "$publisher"; then + java -jar $publisher -ig . $txoption $* + else + echo IG Publisher NOT FOUND in input-cache or parent folder. Please run _updatePublisher. Aborting... + fi +fi diff --git a/fsh-tutorial/FishExampleComplete/_updatePublisher.bat b/fsh-tutorial/FishExampleComplete/_updatePublisher.bat new file mode 100644 index 0000000..a8bf6ee --- /dev/null +++ b/fsh-tutorial/FishExampleComplete/_updatePublisher.bat @@ -0,0 +1,218 @@ +@ECHO OFF + +SETLOCAL + +SET dlurl=https://github.com/HL7/fhir-ig-publisher/releases/latest/download/publisher.jar +SET publisher_jar=publisher.jar +SET input_cache_path=%CD%\input-cache\ +SET skipPrompts=false + +set update_bat_url=https://raw.githubusercontent.com/FHIR/sample-ig/master/_updatePublisher.bat +set gen_bat_url=https://raw.githubusercontent.com/FHIR/sample-ig/master/_genonce.bat +set gencont_bat_url=https://raw.githubusercontent.com/FHIR/sample-ig/master/_gencontinuous.bat +set gencont_sh_url=https://raw.githubusercontent.com/FHIR/sample-ig/master/_gencontinuous.sh +set gen_sh_url=https://raw.githubusercontent.com/FHIR/sample-ig/master/_genonce.sh +set update_sh_url=https://raw.githubusercontent.com/FHIR/sample-ig/master/_updatePublisher.sh + +IF "%~1"=="/f" SET skipPrompts=true + + +ECHO. +ECHO Checking internet connection... +PING tx.fhir.org -4 -n 1 -w 1000 | FINDSTR TTL && GOTO isonline +ECHO We're offline, nothing to do... +GOTO end + +:isonline +ECHO We're online + + +:processflags +SET ARG=%1 +IF DEFINED ARG ( + IF "%ARG%"=="-f" SET FORCE=true + IF "%ARG%"=="--force" SET FORCE=true + SHIFT + GOTO processflags +) + +FOR %%x IN ("%CD%") DO SET upper_path=%%~dpx + +ECHO. +IF NOT EXIST "%input_cache_path%%publisher_jar%" ( + IF NOT EXIST "%upper_path%%publisher_jar%" ( + SET jarlocation="%input_cache_path%%publisher_jar%" + SET jarlocationname=Input Cache + ECHO IG Publisher is not yet in input-cache or parent folder. + REM we don't use jarlocation below because it will be empty because we're in a bracketed if statement + GOTO create + ) ELSE ( + ECHO IG Publisher FOUND in parent folder + SET jarlocation="%upper_path%%publisher_jar%" + SET jarlocationname=Parent folder + GOTO upgrade + ) +) ELSE ( + ECHO IG Publisher FOUND in input-cache + SET jarlocation="%input_cache_path%%publisher_jar%" + SET jarlocationname=Input Cache + GOTO upgrade +) + +:create +IF DEFINED FORCE ( + MKDIR "%input_cache_path%" 2> NUL + GOTO download +) + +IF "%skipPrompts%"=="true" ( + SET create="Y" +) ELSE ( + SET /p create="Ok? (Y/N) " +) +IF /I "%create%"=="Y" ( + ECHO Will place publisher jar here: %input_cache_path%%publisher_jar% + MKDIR "%input_cache_path%" 2> NUL + GOTO download +) +GOTO done + +:upgrade +IF "%skipPrompts%"=="true" ( + SET overwrite="Y" +) ELSE ( + SET /p overwrite="Overwrite %jarlocation%? (Y/N) " +) + +IF /I "%overwrite%"=="Y" ( + GOTO download +) +GOTO done + +:download +ECHO Downloading most recent publisher to %jarlocationname% - it's ~100 MB, so this may take a bit + +FOR /f "tokens=4-5 delims=. " %%i IN ('ver') DO SET VERSION=%%i.%%j +IF "%version%" == "10.0" GOTO win10 +IF "%version%" == "6.3" GOTO win8.1 +IF "%version%" == "6.2" GOTO win8 +IF "%version%" == "6.1" GOTO win7 +IF "%version%" == "6.0" GOTO vista + +ECHO Unrecognized version: %version% +GOTO done + +:win10 +CALL POWERSHELL -command if ('System.Net.WebClient' -as [type]) {(new-object System.Net.WebClient).DownloadFile(\"%dlurl%\",\"%jarlocation%\") } else { Invoke-WebRequest -Uri "%dlurl%" -Outfile "%jarlocation%" } + +GOTO done + +:win7 +rem this may be triggering the antivirus - bitsadmin.exe is a known threat +rem CALL bitsadmin /transfer GetPublisher /download /priority normal "%dlurl%" "%jarlocation%" + +rem this didn't work in win 10 +rem CALL Start-BitsTransfer /priority normal "%dlurl%" "%jarlocation%" + +rem this should work - untested +call (New-Object Net.WebClient).DownloadFile('%dlurl%', '%jarlocation%') +GOTO done + +:win8.1 +:win8 +:vista +GOTO done + + + +:done + + + + +ECHO. +ECHO Updating scripts +IF "%skipPrompts%"=="true" ( + SET updateScripts="Y" +) ELSE ( + SET /p updateScripts="Update scripts? (Y/N) " +) +IF /I "%updateScripts%"=="Y" ( + GOTO scripts +) +GOTO end + + +:scripts + +REM Download all batch files (and this one with a new name) + +SETLOCAL DisableDelayedExpansion + + + +:dl_script_1 +ECHO Updating _updatePublisher.sh +call POWERSHELL -command if ('System.Net.WebClient' -as [type]) {(new-object System.Net.WebClient).DownloadFile(\"%update_sh_url%\",\"_updatePublisher.new.sh\") } else { Invoke-WebRequest -Uri "%update_sh_url%" -Outfile "_updatePublisher.new.sh" } +if %ERRORLEVEL% == 0 goto upd_script_1 +echo "Errors encountered during download: %errorlevel%" +goto dl_script_2 +:upd_script_1 +start copy /y "_updatePublisher.new.sh" "_updatePublisher.sh" ^&^& del "_updatePublisher.new.sh" ^&^& exit + + +:dl_script_2 +ECHO Updating _genonce.bat +call POWERSHELL -command if ('System.Net.WebClient' -as [type]) {(new-object System.Net.WebClient).DownloadFile(\"%gen_bat_url%\",\"_genonce.new.bat\") } else { Invoke-WebRequest -Uri "%gen_bat_url%" -Outfile "_genonce.bat" } +if %ERRORLEVEL% == 0 goto upd_script_2 +echo "Errors encountered during download: %errorlevel%" +goto dl_script_3 +:upd_script_2 +start copy /y "_genonce.new.bat" "_genonce.bat" ^&^& del "_genonce.new.bat" ^&^& exit + +:dl_script_3 +ECHO Updating _gencontinuous.bat +call POWERSHELL -command if ('System.Net.WebClient' -as [type]) {(new-object System.Net.WebClient).DownloadFile(\"%gencont_bat_url%\",\"_gencontinuous.new.bat\") } else { Invoke-WebRequest -Uri "%gencont_bat_url%" -Outfile "_gencontinuous.bat" } +if %ERRORLEVEL% == 0 goto upd_script_3 +echo "Errors encountered during download: %errorlevel%" +goto dl_script_4 +:upd_script_3 +start copy /y "_gencontinuous.new.bat" "_gencontinuous.bat" ^&^& del "_gencontinuous.new.bat" ^&^& exit + + +:dl_script_4 +ECHO Updating _genonce.sh +call POWERSHELL -command if ('System.Net.WebClient' -as [type]) {(new-object System.Net.WebClient).DownloadFile(\"%gen_sh_url%\",\"_genonce.new.sh\") } else { Invoke-WebRequest -Uri "%gen_sh_url%" -Outfile "_genonce.sh" } +if %ERRORLEVEL% == 0 goto upd_script_4 +echo "Errors encountered during download: %errorlevel%" +goto dl_script_5 +:upd_script_4 +start copy /y "_genonce.new.sh" "_genonce.sh" ^&^& del "_genonce.new.sh" ^&^& exit + +:dl_script_5 +ECHO Updating _gencontinuous.sh +call POWERSHELL -command if ('System.Net.WebClient' -as [type]) {(new-object System.Net.WebClient).DownloadFile(\"%gencont_sh_url%\",\"_gencontinuous.new.sh\") } else { Invoke-WebRequest -Uri "%gencont_sh_url%" -Outfile "_gencontinuous.sh" } +if %ERRORLEVEL% == 0 goto upd_script_5 +echo "Errors encountered during download: %errorlevel%" +goto dl_script_6 +:upd_script_5 +start copy /y "_gencontinuous.new.sh" "_gencontinuous.sh" ^&^& del "_gencontinuous.new.sh" ^&^& exit + + + +:dl_script_6 +ECHO Updating _updatePublisher.bat +call POWERSHELL -command if ('System.Net.WebClient' -as [type]) {(new-object System.Net.WebClient).DownloadFile(\"%update_bat_url%\",\"_updatePublisher.new.bat\") } else { Invoke-WebRequest -Uri "%update_bat_url%" -Outfile "_updatePublisher.new.bat" } +if %ERRORLEVEL% == 0 goto upd_script_6 +echo "Errors encountered during download: %errorlevel%" +goto end +:upd_script_6 +start copy /y "_updatePublisher.new.bat" "_updatePublisher.bat" ^&^& del "_updatePublisher.new.bat" ^&^& exit + + +:end + + +IF "%skipPrompts%"=="true" ( + PAUSE +} diff --git a/fsh-tutorial/FishExampleComplete/_updatePublisher.sh b/fsh-tutorial/FishExampleComplete/_updatePublisher.sh new file mode 100644 index 0000000..1a3484b --- /dev/null +++ b/fsh-tutorial/FishExampleComplete/_updatePublisher.sh @@ -0,0 +1,133 @@ +#!/bin/bash +pubsource=https://github.com/HL7/fhir-ig-publisher/releases/latest/download/ +publisher_jar=publisher.jar +dlurl=$pubsource$publisher_jar + +input_cache_path=$PWD/input-cache/ + +scriptdlroot=https://raw.githubusercontent.com/FHIR/sample-ig/master +update_bat_url=$scriptdlroot/_updatePublisher.bat +gen_bat_url=$scriptdlroot/_genonce.bat +gencont_bat_url=$scriptdlroot/_gencontinuous.bat +gencont_sh_url=$scriptdlroot/_gencontinuous.sh +gen_sh_url=$scriptdlroot/_genonce.sh +update_sh_url=$scriptdlroot/_updatePublisher.sh + +skipPrompts=false +FORCE=false + +if ! type "curl" > /dev/null; then + echo "ERROR: Script needs curl to download latest IG Publisher. Please install curl." + exit 1 +fi + +while [ "$#" -gt 0 ]; do + case $1 in + -f|--force) FORCE=true ;; + -y|--yes) skipPrompts=true ; FORCE=true ;; + *) echo "Unknown parameter passed: $1. Exiting"; exit 1 ;; + esac + shift +done + +echo "Checking internet connection" +case "$OSTYPE" in + linux-gnu* ) ping tx.fhir.org -4 -c 1 -w 1000 >/dev/null ;; + darwin* ) ping tx.fhir.org -c 1 >/dev/null ;; + *) echo "unknown: $OSTYPE"; exit 1 ;; +esac + +if [ $? -ne 0 ] ; then + echo "Offline (or the terminology server is down), unable to update. Exiting" + exit 1 +fi + +if [ ! -d "$input_cache_path" ] ; then + if [ $FORCE != true ]; then + echo "$input_cache_path does not exist" + message="create it?" + read -r -p "$message" response + else + response=y + fi +fi + +if [[ $response =~ ^[yY].*$ ]] ; then + mkdir ./input-cache +fi + +publisher="$input_cache_path$publisher_jar" + +if test -f "$publisher" ; then + echo "IG Publisher FOUND in input-cache" + jarlocation="$publisher" + jarlocationname="Input Cache" + upgrade=true +else + publisher="../$publisher_jar" + upgrade=true + if test -f "$publisher"; then + echo "IG Publisher FOUND in parent folder" + jarlocation="$publisher" + jarlocationname="Parent Folder" + upgrade=true + else + echo "IG Publisher NOT FOUND in input-cache or parent folder" + jarlocation=$input_cache_path$publisher_jar + jarlocationname="Input Cache" + upgrade=false + fi +fi + +if [[ $skipPrompts == false ]]; then + + if [[ $upgrade == true ]]; then + message="Overwrite $jarlocation? (Y/N) " + else + echo Will place publisher jar here: "$jarlocation" + message="Ok (enter 'y' or 'Y' to continue, any other key to cancel)?" + fi + read -r -p "$message" response +else + response=y +fi +if [[ $skipPrompts == true ]] || [[ $response =~ ^[yY].*$ ]]; then + + echo "Downloading most recent publisher to $jarlocationname - it's ~100 MB, so this may take a bit" + curl -L $dlurl -o "$jarlocation" --create-dirs +else + echo cancelled publisher update +fi + +if [[ $skipPrompts != true ]]; then + message="Update scripts? (enter 'y' or 'Y' to continue, any other key to cancel)?" + read -r -p "$message" response + fi + +if [[ $skipPrompts == true ]] || [[ $response =~ ^[yY].*$ ]]; then + echo "Downloading most recent scripts " + + curl -L $update_bat_url -o /tmp/_updatePublisher.new + cp /tmp/_updatePublisher.new _updatePublisher.bat + rm /tmp/_updatePublisher.new + + curl -L $gen_bat_url -o /tmp/_genonce.new + cp /tmp/_genonce.new _genonce.bat + rm /tmp/_genonce.new + + curl -L $gencont_bat_url -o /tmp/_gencontinuous.new + cp /tmp/_gencontinuous.new _gencontinuous.bat + rm /tmp/_gencontinuous.new + + curl -L $gencont_sh_url -o /tmp/_gencontinuous.new + cp /tmp/_gencontinuous.new _gencontinuous.sh + rm /tmp/_gencontinuous.new + + curl -L $gen_sh_url -o /tmp/_genonce.new + cp /tmp/_genonce.new _genonce.sh + rm /tmp/_genonce.new + + curl -L $update_sh_url -o /tmp/_updatePublisher.new + cp /tmp/_updatePublisher.new _updatePublisher.sh + rm /tmp/_updatePublisher.new +fi diff --git a/fsh-tutorial/FishExampleComplete/ig.ini b/fsh-tutorial/FishExampleComplete/ig.ini new file mode 100644 index 0000000..5e6d8b1 --- /dev/null +++ b/fsh-tutorial/FishExampleComplete/ig.ini @@ -0,0 +1,3 @@ +[IG] +ig = fsh-generated/resources/ImplementationGuide-fish.json +template = fhir.base.template#current \ No newline at end of file diff --git a/fsh-tutorial/FishExampleComplete/input/fsh/FishPatient.fsh b/fsh-tutorial/FishExampleComplete/input/fsh/FishPatient.fsh new file mode 100644 index 0000000..29de19a --- /dev/null +++ b/fsh-tutorial/FishExampleComplete/input/fsh/FishPatient.fsh @@ -0,0 +1,34 @@ +Alias: SCT = http://snomed.info/sct + +Profile: FishPatient +Parent: Patient +Id: fish-patient +Title: "Fish Patient" +Description: "A patient that is a type of fish." +* name 1..* +// Add species extension +* extension contains FishSpecies named species 0..1 +// Remove communication, maritalStatus +* maritalStatus 0..0 +* communication 0..0 +// Make Species and Contact MS +* extension[FishSpecies] and contact MS + +Extension: FishSpecies +Id: fish-species +Title: "Fish Species" +Description: "The species name of a piscine (fish) patient." +* value[x] only CodeableConcept +* valueCodeableConcept from FishSpeciesValueSet (extensible) + +ValueSet: FishSpeciesValueSet +Id: fish-species-value-set +Title: "Fish Species Value Set" +Description: "Codes describing various species of fish from SNOMED-CT." +* codes from system SCT where concept is-a #90580008 "Fish (organism)" + +Instance: Shorty +InstanceOf: FishPatient +* name.given = "Shorty" +* name.family = "Koi-Fish" +* extension[FishSpecies].valueCodeableConcept = SCT#47978005 "Carpiodes cyprinus (organism)" diff --git a/fsh-tutorial/FishExampleComplete/input/fsh/Veterinarian.fsh b/fsh-tutorial/FishExampleComplete/input/fsh/Veterinarian.fsh new file mode 100644 index 0000000..e34bec8 --- /dev/null +++ b/fsh-tutorial/FishExampleComplete/input/fsh/Veterinarian.fsh @@ -0,0 +1,18 @@ +Alias: QUAL = http://nucc.org/provider-taxonomy +Alias: IDTYPE = http://terminology.hl7.org/CodeSystem/v2-0203 + +Profile: Veterinarian +Parent: Practitioner +Id: veterinarian +Title: "Veterinarian" +Description: "A profile on the Practitioner resource for veterinarians. In the US, vets do not have National Provider Numbers." +* name 1..* +* qualification.code = QUAL#174M00000X // Veterinarian +* identifier ^slicing.discriminator.type = #value +* identifier ^slicing.discriminator.path = "type.coding.code" +* identifier ^slicing.rules = #open +// Make this an inline extension (could also be done as a standalone extension) +* identifier contains licenseNumber 1..1 MS +* identifier[licenseNumber].type = IDTYPE#LN // License number +* identifier[licenseNumber].value MS + diff --git a/fsh-tutorial/FishExampleComplete/input/ignoreWarnings.txt b/fsh-tutorial/FishExampleComplete/input/ignoreWarnings.txt new file mode 100644 index 0000000..d03142b --- /dev/null +++ b/fsh-tutorial/FishExampleComplete/input/ignoreWarnings.txt @@ -0,0 +1,5 @@ +== Suppressed Messages == + +# Add warning and/or information messages here after you've confirmed that they aren't really a problem +# (And include comments like this justifying why) +# See https://github.com/FHIR/sample-ig/blob/master/input/ignoreWarnings.txt for examples \ No newline at end of file diff --git a/fsh-tutorial/FishExampleComplete/input/images/Shorty.png b/fsh-tutorial/FishExampleComplete/input/images/Shorty.png new file mode 100644 index 0000000..2c0c4a7 Binary files /dev/null and b/fsh-tutorial/FishExampleComplete/input/images/Shorty.png differ diff --git a/fsh-tutorial/FishExampleComplete/input/pagecontent/index.md b/fsh-tutorial/FishExampleComplete/input/pagecontent/index.md new file mode 100644 index 0000000..02ef704 --- /dev/null +++ b/fsh-tutorial/FishExampleComplete/input/pagecontent/index.md @@ -0,0 +1,23 @@ +### Background + +Fishkeeping is a popular hobby, practiced by aquarists, concerned with keeping fish in a home aquarium or garden pond. There is also a piscicultural fishkeeping industry, as a branch of agriculture. + +### Meet Shorty + +This is Shorty, the mascot for FHIR Shorthand. He's doing contortions to shape himself into an "S", for Shorthand. + +![Shorty the FSH](./Shorty.png) + +### FHIR Shorthand Resources + +FHIR Shorthand calls currently are the second Thursday of every month at 9 am Eastern US Time. [Click here to join](https://teams.microsoft.com/l/meetup-join/19%3ameeting_OGJmYmVlM2UtYzVkZi00YWJjLWJlNzMtN2ZkYTVkYTA1Mzlk%40thread.v2/0?context=%7b%22Tid%22%3a%22c620dc48-1d50-4952-8b39-df4d54d74d82%22%2c%22Oid%22%3a%22f9a60b6f-fbcc-48d0-bc8e-d6d742b4b339%22%7d) + +[HL7 Confluence site](https://confluence.hl7.org/display/FHIRI/FHIR+Shorthand) + +[FHIR Shorthand Documentation](https://build.fhir.org/ig/HL7/fhir-shorthand) + +[FHIR Shorthand documentation code repository](https://github.com/HL7/fhir-shorthand) + +[SUSHI code repository](https://github.com/FHIR/sushi) + +[Zulip](https://chat.fhir.org) channel: #shorthand \ No newline at end of file diff --git a/fsh-tutorial/FishExampleComplete/package-list.json b/fsh-tutorial/FishExampleComplete/package-list.json new file mode 100644 index 0000000..71ee159 --- /dev/null +++ b/fsh-tutorial/FishExampleComplete/package-list.json @@ -0,0 +1,25 @@ +{ + "package-id": "fish", + "canonical": "http://example.org/fhir/fish", + "title": "Fish Implementation Guide", + "introduction": "An example of how FSH can be used to create an IG about fish", + "list": [ + { + "version": "current", + "desc": "Continuous Integration Build (latest in version control)", + "path": "http://build.fhir.org/ig/example/example-ig", + "status": "ci-build", + "current": true + }, + { + "version": "0.0.1", + "date": "2099-01-01", + "desc": "Initial STU ballot (Mmm yyyy Ballot)", + "path": "http://example.org/fhir/STU1", + "status": "ballot", + "sequence": "STU 1", + "fhirversion": "4.0.1", + "current": true + } + ] +} diff --git a/fsh-tutorial/FishExampleComplete/sushi-config.yaml b/fsh-tutorial/FishExampleComplete/sushi-config.yaml new file mode 100644 index 0000000..104c245 --- /dev/null +++ b/fsh-tutorial/FishExampleComplete/sushi-config.yaml @@ -0,0 +1,36 @@ +# ╭─────────────────────────────────ImplementationGuide-fish.json──────────────────────────────────╮ +# │ The properties below are used to create the ImplementationGuide resource. For a list of │ +# │ supported properties, see: │ +# │ https://fshschool.org/docs/sushi/configuration/#full-configuration │ +# ╰────────────────────────────────────────────────────────────────────────────────────────────────╯ +id: fish +canonical: http://example.org/fhir/fish +version: 0.1.0 +name: FishImplementationGuide +title: Fish Implementation Guide +status: draft +publisher: James Tuna +contact: + - name: Bill Cod + telecom: + - system: email + value: cod@reef.gov +description: An example of how FSH can be used to create an IG about fish +license: CC0-1.0 +fhirVersion: 4.0.1 +parameters: + apply-publisher: true + apply-contact: true + show-inherited-invariants: false +copyrightYear: 2020+ +releaseLabel: ci-build + +# ╭────────────────────────────────────────────menu.xml────────────────────────────────────────────╮ +# │ To use a provided input/includes/menu.xml file, delete the "menu" property below. │ +# ╰────────────────────────────────────────────────────────────────────────────────────────────────╯ +menu: + IG Home: index.html + Table of Contents: toc.html + Artifacts Summary: artifacts.html + Other Resources: + "FHIR Spec ": new-tab {{site.data.fhir.path}}index.html diff --git a/package.json b/package.json index cb711c4..0f0c09a 100644 --- a/package.json +++ b/package.json @@ -5,6 +5,9 @@ "type": "git", "url": "https://github.com/FSHSchool/site.git" }, + "scripts": { + "zip-tutorial": "zip -r content/docs/SUSHI/tutorial/fsh-tutorial.zip fsh-tutorial/*" + }, "license": "Apache-2.0", "devDependencies": { "autoprefixer": "^9.8.8",