#!/usr/bin/env python3
# Copyright 2025 The Emscripten Authors.  All rights reserved.
# Emscripten is available under two separate licenses, the MIT license and the
# University of Illinois/NCSA Open Source License.  Both these licenses can be
# found in the LICENSE file.

"""Update npm dependencies using npm-check-updates."""

import os
import subprocess
import sys

script_dir = os.path.dirname(os.path.abspath(__file__))
root_dir = os.path.dirname(os.path.dirname(script_dir))


def run(cmd, **args):
  print('->', ' '.join(cmd))
  return subprocess.check_output(cmd, text=True, cwd=root_dir, **args)


def main():
  if run(['git', 'status', '-uno', '--porcelain']).strip():
    print('tree is not clean')
    return 1

  output = run(['npx', 'npm-check-updates', '-u'], stderr=subprocess.STDOUT).strip()

  if not run(['git', 'status', '-uno', '--porcelain']).strip():
    print('no updates')
    return 0

  message = 'Automatic update of npm dependencies. NFC\n\n'
  message += 'This change was automatically generated by tools/maint/npm_update.py\n\n'
  lines = output.splitlines()
  assert lines[0].startswith('Upgrading ')
  assert not lines[1]
  assert lines[-1].startswith('Run npm install to install new versions')
  assert not lines[-2]
  lines = lines[2:-2]
  message += '\n'.join(lines) + '\n'

  run(['npm', 'install'])
  run(['git', 'checkout', '-b', 'npm_update'])
  run(['git', 'add', '-u', 'package.json', 'package-lock.json'])
  run(['git', 'commit', '-F', '-'], input=message)


if __name__ == '__main__':
  sys.exit(main())
