{
  lib,
  buildPythonPackage,
  fetchFromGitHub,
  yarnConfigHook,
  fetchYarnDeps,

  jupyterlab,
  jupyter,
  jupyter-packaging,
  hatchling,
  hatch-jupyter-builder,
  hatch-nodejs-version,
  nodejs,
}:

buildPythonPackage rec {
  pname = "jupyterlab-myst";
  version = "0-unstable-2024-07-30";
  pyproject = true;

  src = fetchFromGitHub {
    owner = "jupyter-book";
    repo = "jupyterlab-myst";
    rev = "4c70b0312aee6f2f65c18d1aeec80521c1fa5bc3";
    hash = "sha256-Q7sQ2Al4/HCogGayYifBLX/yElDWS4wcTJVe4nFOQY8=";
  };

  patches = [
    ./add-tailwind-base-directive.patch
  ];

  prePatch = ''
    cp ${./yarn.lock} yarn.lock
    substituteInPlace package.json \
        --replace-fail '"@myst-theme/frontmatter": "^0.9.0"' '"@myst-theme/frontmatter": "^0.13.2"'
  '';

  yarnOfflineCache = fetchYarnDeps {
    yarnLock = ./yarn.lock;
    hash = "sha256-ou3Tjml5VU1O14k/oIDufj3QV2sQYD8EzVGAPhF9RZI=";
  };

  nativeBuildInputs = [
    yarnConfigHook
    nodejs
  ];

  build-system = [
    hatchling
    hatch-jupyter-builder
    hatch-nodejs-version
    jupyterlab
    jupyter
    jupyter-packaging
  ];
  dependencies = [
    jupyterlab
    jupyter
    jupyter-packaging
  ];

  preConfigure = ''
    substituteInPlace package.json \
        --replace-fail 'jlpm' 'yarn'
  '';

  preBuild = ''
    substituteInPlace node_modules/@types/markdown-it/lib/index.d.ts \
        --replace 'readonly linkify: LinkifyIt.LinkifyIt;' 'readonly linkify: typeof LinkifyIt;'

    # Generate the jupyterlab extension files
    yarn --offline run build:prod
  '';

  # has no tests
  doCheck = false;

  pythonImportsCheck = [ "jupyterlab_myst" ];

  meta = with lib; {
    description = "Use MyST Markdown directly in Jupyter Lab";
    homepage = "https://github.com/jupyter-book/jupyterlab-myst";
    license = licenses.bsd3;
    maintainers = [ ];
  };
}
