#!/bin/bash SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" cd "$SCRIPT_DIR" if [ ! -f "package.json" ]; then echo "package.json not found in $SCRIPT_DIR" exit 1 fi PKG_MANAGER="bun" MODE="dev" next_is_value=0 last_key="" for arg in "$@"; do if [ "$next_is_value" == "1" ]; then if [ "$last_key" == "manager" ]; then PKG_MANAGER="$arg" fi if [ "$last_key" == "mode" ]; then MODE="$arg" fi next_is_value=0 fi if [ "$arg" == "clean" ] || [ "$arg" == "cleanup" ]; then goto_cleanup=1 fi if [ "$arg" == "manager" ]; then last_key="manager" next_is_value=1 fi if [ "$arg" == "mode" ]; then last_key="mode" next_is_value=1 fi done ALLOWED_MANAGERS=("bun" "npm" "yarn" "pnpm") ALLOWED_MODES=("dev" "prod" "development" "production") manager_allowed=0 for allowed_manager in "${ALLOWED_MANAGERS[@]}"; do if [ "$PKG_MANAGER" == "$allowed_manager" ]; then manager_allowed=1 fi done mode_allowed=0 for allowed_mode in "${ALLOWED_MODES[@]}"; do if [ "$MODE" == "$allowed_mode" ]; then mode_allowed=1 fi done if [ "$manager_allowed" == "0" ]; then echo "$PKG_MANAGER is not a valid package manager, please use one of the following: ${ALLOWED_MANAGERS[@]}" exit 1 fi if [ "$mode_allowed" == "0" ]; then echo "$MODE is not a valid mode, please use one of the following: ${ALLOWED_MODES[@]}" exit 1 fi echo "Using package manager: $PKG_MANAGER" echo "Mode: $MODE" NPM_MARKER="node_modules/.npm_used" YARN_MARKER="node_modules/.yarn_used" PNPM_MARKER="node_modules/.pnpm_used" BUN_MARKER="node_modules/.bun_used" if [ "$PKG_MANAGER" != "bun" ]; then if ! command -v nodemon >/dev/null 2>&1; then echo "nodemon not found, installing..." case "$PKG_MANAGER" in npm) npm install -g nodemon ;; yarn) yarn global add nodemon ;; pnpm) pnpm add -g nodemon ;; *) echo "Unsupported package manager: $PKG_MANAGER" exit 1 ;; esac fi fi if [ "$PKG_MANAGER" == "npm" ]; then INSTALL_CMD="npm install" if [ "$MODE" == "dev" ] || [ "$MODE" == "development" ]; then RUN_CMD="nodemon --watch src --exec npm exec tsx src/index.ts" else RUN_CMD="npm exec tsx src/index.ts" fi CURRENT_MARKER="$NPM_MARKER" elif [ "$PKG_MANAGER" == "yarn" ]; then INSTALL_CMD="yarn install" if [ "$MODE" == "dev" ] || [ "$MODE" == "development" ]; then RUN_CMD="nodemon --watch src --exec yarn exec tsx src/index.ts" else RUN_CMD="yarn exec tsx src/index.ts" fi CURRENT_MARKER="$YARN_MARKER" elif [ "$PKG_MANAGER" == "pnpm" ]; then INSTALL_CMD="pnpm install" if [ "$MODE" == "dev" ] || [ "$MODE" == "development" ]; then RUN_CMD="nodemon --watch src --exec pnpm exec tsx src/index.ts" else RUN_CMD="pnpm exec tsx src/index.ts" fi CURRENT_MARKER="$PNPM_MARKER" elif [ "$PKG_MANAGER" == "bun" ]; then INSTALL_CMD="bun install" if [ "$MODE" == "dev" ] || [ "$MODE" == "development" ]; then RUN_CMD="bun run --watch src/index.ts --development" else RUN_CMD="bun run src/index.ts" fi CURRENT_MARKER="$BUN_MARKER" fi if [ -f "$NPM_MARKER" ] && [ "$CURRENT_MARKER" != "$NPM_MARKER" ]; then goto_cleanup=1; fi if [ -f "$YARN_MARKER" ] && [ "$CURRENT_MARKER" != "$YARN_MARKER" ]; then goto_cleanup=1; fi if [ -f "$PNPM_MARKER" ] && [ "$CURRENT_MARKER" != "$PNPM_MARKER" ]; then goto_cleanup=1; fi if [ -f "$BUN_MARKER" ] && [ "$CURRENT_MARKER" != "$BUN_MARKER" ]; then goto_cleanup=1; fi if [ "$goto_cleanup" == "1" ]; then files_to_delete=("package-lock.json" "yarn.lock" "pnpm-lock.yaml" "bun.lockb") folders_to_delete=("node_modules" "dist" "logs") markers_to_delete=("$NPM_MARKER" "$YARN_MARKER" "$PNPM_MARKER" "$BUN_MARKER") echo "Cleaning up files and folders..." for file in "${files_to_delete[@]}"; do if [ -f "$file" ]; then echo "Found $file in $SCRIPT_DIR - deleting..." rm -f "$file" fi done for folder in "${folders_to_delete[@]}"; do if [ -d "$folder" ]; then echo "Found $folder in $SCRIPT_DIR - deleting..." rm -rf "$folder" fi done for marker in "${markers_to_delete[@]}"; do if [ -f "$marker" ]; then rm -f "$marker" fi done exit 0 fi if [ -n "$RUN_CMD" ]; then echo "Running $RUN_CMD..." $INSTALL_CMD $RUN_CMD else echo "No run command set, exiting..." fi exit 0