#!/bin/bash

set -e

function usage()
{
cat <<EOF
Usage: nodepath <option> module

nodepath shows the file or the package that corresponds to the node given module.

Options:
 -p: print package
 -o: print only package (implies -p)

Copyright (C) 2019 Xavier Guimard <yadd@debian.org>

Licensed under GPL-2+ (see /usr/share/common-licenses/GPL-2)
EOF
}

if test "$1" = "--version"; then
	echo `perl -MDebian::PkgJs::Version -e 'print $VERSION'`
	exit
fi
PACKAGE=0
PACKAGEONLY=0
while getopts 'hpo' opt; do
	case $opt in
		h)
			usage
			exit
			;;
		p)
			PACKAGE=1
			;;
		o)
			PACKAGE=1
			PACKAGEONLY=1
			;;
		*)
			echo "Unknown option $opt" >&2
			exit 1
			;;
	esac
done
shift $((OPTIND-1))
MODULE=$1

FILE=`(node -p "require.resolve('$MODULE'+'/package.json')" 2>/dev/null || true) | perl -pe 's/\/package\.json$/$1/'`
if [ "$FILE" == "" ]; then
	LOG=`mktemp`
	FILE=`cd /;node -p "require.resolve('$MODULE')" 2>$LOG|perl -pe 's/(nodejs\/(?:\@[^\/]*\/)?[^\@][^\/]*)(\/.*)?$/$1/' || true`
	if [ "$FILE" == "" ]; then
		if grep 'ERR_PACKAGE_PATH_NOT_EXPORTED' $LOG >/dev/null; then
			FILE=`perl -ne 'if(m#(/usr/\S+/nodejs/\S+)/package\.json#){print $1;exit}' $LOG`
		else
			echo "Not found" >&2
			rm -f $LOG
			exit 1
		fi
	fi
	rm -f $LOG
fi
if test "$PACKAGE" = "1"; then
	if test $PACKAGEONLY = 1; then
		dpkg -S $FILE|sed -e 's/:.*//'
	else
		dpkg -S $FILE
	fi
else
	echo $FILE
fi
