https://github.com/grafana/grafana
Raw File
Tip revision: 09707fbabe944cc10512c29696c2b62bb00a1e8b authored by Alexander Zobnin on 16 August 2023, 05:55:25 UTC
Avoid expensive computations
Tip revision: 09707fb
validate-npm-packages.sh
#!/bin/bash

# This script is used to validate the npm packages that are published to npmjs.org are in the correct format.
# It won't catch things like malformed JS or Types but it will assert that the package has
# the correct files and package.json properties.
ARTIFACTS_DIR="./npm-artifacts"

for file in "$ARTIFACTS_DIR"/*.tgz; do
  echo "🔍 Checking NPM package: $file"
  # get filename then strip everything after package name.
  dir_name=$(basename "$file" .tgz | sed 's/^@\(.*\)-[0-9]*[.]*[0-9]*[.]*[0-9]*-\([0-9]*[a-zA-Z]*\)/\1/')
  mkdir -p "./npm-artifacts/$dir_name"
  tar -xzf "$file" -C "./npm-artifacts/$dir_name" --strip-components=1

  # Make sure the tar wasn't empty
  if [ ! -d "./npm-artifacts/$dir_name" ]; then
    echo -e "❌ Failed: Empty package $dir_name.\n"
    exit 1
  fi

  # Navigate inside the new extracted directory
  pushd "./npm-artifacts/$dir_name" || exit

  # Check for required files
	check_files=("package.json" "README.md" "CHANGELOG.md" "LICENSE_APACHE2")
	for check_file in "${check_files[@]}"; do
		if [ ! -f "$check_file" ]; then
			echo -e "❌ Failed: Missing required file $check_file in package $dir_name.\n"
			exit 1
		fi
	done

  # @grafana/toolkit structure is different to the other packages
  if [[ "$dir_name" == "grafana-toolkit" ]]; then
    if [ ! -d bin ] || [ ! -f bin/grafana-toolkit.js ]; then
      echo -e "❌ Failed: Missing 'bin' directory or required files in package $dir_name.\n"
      exit 1
    fi

    echo -e "✅ Passed: package checks for $file.\n"
    popd || exit
    continue
  fi

  # Assert commonjs builds
  if [ ! -d dist ] || [ ! -f dist/index.js ] || [ ! -f dist/index.d.ts ]; then
    echo -e "❌ Failed: Missing 'dist' directory or required commonjs files in package $dir_name.\n"
    exit 1
  fi

  if [ "$(jq -r '.main' package.json)" != "dist/index.js" ] || \
     [ "$(jq -r '.types' package.json)" != "dist/index.d.ts" ]; then
    echo -e "❌ Failed: Incorrect package.json properties in package $dir_name.\n"
    exit 1
  fi

  # Assert esm builds
  esm_packages=("grafana-data" "grafana-ui" "grafana-runtime" "grafana-e2e-selectors" "grafana-schema")
  for esm_package in "${esm_packages[@]}"; do
    if [[ "$dir_name" == "$esm_package" ]]; then
      if [ ! -d dist/esm ] || [ ! -f dist/esm/index.js ]; then
        echo -e "❌ Failed: Missing 'dist/esm' directory or required esm files in package $dir_name.\n"
        exit 1
      fi

      if [ "$(jq -r '.module' package.json)" != "dist/esm/index.js" ]; then
        echo -e "❌ Failed: Incorrect package.json properties in package $dir_name.\n"
        exit 1
      fi
    fi
  done

  echo -e "✅ Passed: package checks for $file.\n"
  popd || exit

done

echo "🚀 All NPM package checks passed! 🚀"
rm -rf "${ARTIFACTS_DIR:?}/"*/
exit 0
back to top