\section{NPM Package Manager}
\subsection{}

\begin{frame}{Mi az npm?}
  \begin{itemize}
    \item \kiemel{Node Package Manager} - Node.js csomagkezelő
    \item A világ legnagyobb szoftver registry-je (2+ millió csomag)
    \item Node.js-szel együtt települ
    \item Csomagok telepítése, kezelése, megosztása
    \item Projekt függőségek kezelése
  \end{itemize}
  \vspace{0.5cm}
  \begin{block}{Verziószám ellenőrzése}
    \texttt{node --version} \hspace{1cm} \texttt{npm --version}
  \end{block}
  \vspace{0.3cm}
  \begin{block}{Alternatívák}
    \kiemelZ{yarn}, \kiemelZ{pnpm} - gyorsabb, hatékonyabb csomagkezelők
  \end{block}
\end{frame}

\begin{frame}[fragile,shrink=10]{npm init - Projekt inicializálás}
  \begin{block}{Interaktív projekt létrehozás}
    \begin{lstlisting}[language=bash]
npm init
    \end{lstlisting}
  \end{block}
  
  \begin{block}{Gyors inicializálás alapértelmezett értékekkel}
    \begin{lstlisting}[language=bash]
npm init -y
# vagy
npm init --yes
    \end{lstlisting}
  \end{block}
  
  \vspace{0.3cm}
  \begin{alertblock}{Eredmény}
    Létrejön a \kiemel{package.json} fájl, amely a projekt metaadatait tartalmazza
  \end{alertblock}
\end{frame}

\begin{frame}[fragile,shrink=10]{package.json struktúra}
  \begin{block}{Alapvető package.json}
    \begin{lstlisting}[style=JavaScript, basicstyle=\tiny\ttfamily]
{
  "name": "my-backend-app",
  "version": "1.0.0",
  "description": "Backend alkalmazas Node.js-sel",
  "main": "index.js",
  "scripts": {
    "start": "node index.js",
    "dev": "nodemon index.js",
    "test": "jest"
  },
  "keywords": ["nodejs", "backend", "api"],
  "author": "Magda Donat",
  "license": "MIT",
  "dependencies": {
    "express": "^4.18.2"
  },
  "devDependencies": {
    "nodemon": "^3.0.1"
  }
}
    \end{lstlisting}
  \end{block}
\end{frame}

\begin{frame}[fragile,shrink=10]{Csomagok telepítése}
  \begin{block}{Telepítés production függőségként}
    \begin{lstlisting}[language=bash]
npm install express
# vagy rovidebben
npm i express

# Tobbe csomag egyszerre
npm install express prisma dotenv
    \end{lstlisting}
  \end{block}
  
  \begin{block}{Telepítés development függőségként}
    \begin{lstlisting}[language=bash]
npm install --save-dev nodemon
# vagy
npm i -D nodemon jest eslint
    \end{lstlisting}
  \end{block}
  
  \begin{alertblock}{Mi a különbség?}
    \textbf{dependencies:} éles környezetben is kell | \textbf{devDependencies:} csak fejlesztéshez
  \end{alertblock}
\end{frame}

\begin{frame}[fragile,shrink=10]{Csomagok kezelése}
  \begin{columns}
    \begin{column}{0.5\textwidth}
      \begin{block}{Telepítés specifikus verzióval}
        \begin{lstlisting}[language=bash]
npm i express@4.18.0

# Legfrissebb verzio
npm i express@latest
        \end{lstlisting}
      \end{block}
      
      \begin{block}{Globális telepítés}
        \begin{lstlisting}[language=bash]
npm install -g nodemon
npm i -g typescript
        \end{lstlisting}
      \end{block}
    \end{column}
    \begin{column}{0.5\textwidth}
      \begin{block}{Eltávolítás}
        \begin{lstlisting}[language=bash]
npm uninstall express
npm un express

# Globalis eltavolitas
npm uninstall -g nodemon
        \end{lstlisting}
      \end{block}
      
      \begin{block}{Frissítés}
        \begin{lstlisting}[language=bash]
npm update
npm update express
        \end{lstlisting}
      \end{block}
    \end{column}
  \end{columns}
\end{frame}

\begin{frame}{Semantic Versioning (SemVer)}
  \begin{block}{Verzió formátum: \kiemel{MAJOR.MINOR.PATCH}}
    \texttt{1.2.3} $\rightarrow$ \kiemelN{1} (major) . \kiemelZ{2} (minor) . \kiemel{3} (patch)
  \end{block}
  
  \vspace{0.3cm}
  \begin{itemize}
    \item \kiemelN{MAJOR:} Nem kompatibilis API változások
    \item \kiemelZ{MINOR:} Új funkciók, visszafelé kompatibilis
    \item \kiemel{PATCH:} Hibajavítások, visszafelé kompatibilis
  \end{itemize}
  
  \vspace{0.5cm}
  \begin{table}
    \centering
    \begin{tabular}{|l|l|}
      \hline
      \textbf{Jelölés} & \textbf{Jelentés} \\
      \hline
      \texttt{1.2.3} & Pontosan 1.2.3 verzió \\
      \hline
      \texttt{\textasciicircum1.2.3} & $\geq$ 1.2.3 és $<$ 2.0.0 (MINOR frissítések) \\
      \hline
      \texttt{\textasciitilde1.2.3} & $\geq$ 1.2.3 és $<$ 1.3.0 (PATCH frissítések) \\
      \hline
      \texttt{*} vagy \texttt{latest} & Legfrissebb verzió \\
      \hline
    \end{tabular}
  \end{table}
\end{frame}

\begin{frame}[fragile,shrink=10]{npm scripts}
  \begin{block}{Scripts definiálása package.json-ben}
    \begin{lstlisting}[style=JavaScript]
{
  "scripts": {
    "start": "node index.js",
    "dev": "nodemon index.js",
    "test": "jest",
    "build": "tsc",
    "lint": "eslint .",
    "format": "prettier --write ."
  }
}
    \end{lstlisting}
  \end{block}
  
  \begin{block}{Scripts futtatása}
    \begin{lstlisting}[language=bash]
npm run dev
npm run test
npm start    # 'run' nelkul is mukodik (start, test, stop)
    \end{lstlisting}
  \end{block}
\end{frame}

\begin{frame}[fragile,shrink=10]{node\_modules és package-lock.json}
  \begin{columns}
    \begin{column}{0.5\textwidth}
      \begin{block}{node\_modules}
        \begin{itemize}
          \item Telepített csomagok mappája
          \item Nagyon nagy lehet (100+ MB)
          \item \kiemel{Ne commitoljuk} git-be!
          \item .gitignore-ba: \texttt{node\_modules/}
          \item Újragenerálás: \texttt{npm install}
        \end{itemize}
      \end{block}
    \end{column}
    \begin{column}{0.5\textwidth}
      \begin{block}{package-lock.json}
        \begin{itemize}
          \item Pontos verziókat rögzít
          \item Függőségek fája
          \item Determinisztikus telepítés
          \item \kiemelZ{Commitoljuk} git-be!
          \item Reprodukálható build-ek
        \end{itemize}
      \end{block}
    \end{column}
  \end{columns}
  
  \vspace{0.5cm}
  \begin{alertblock}{Fontos}
    \texttt{npm install} a package-lock.json alapján telepít (ha létezik)
  \end{alertblock}
\end{frame}

\begin{frame}[fragile,shrink=10]{Hasznos npm parancsok}
  \begin{columns}
    \begin{column}{0.5\textwidth}
      \begin{block}{Információk lekérése}
        \begin{lstlisting}[language=bash]
# Telepitett csomagok listaja
npm list

# Elavult csomagok
npm outdated

# Csomag informacio
npm info express

# Csomag keresese
npm search prisma
        \end{lstlisting}
      \end{block}
    \end{column}
    \begin{column}{0.5\textwidth}
      \begin{block}{Karbantartás}
        \begin{lstlisting}[language=bash]
# Cache torlese
npm cache clean --force

# Fuggosegek auditja
npm audit

# Sebezhetosegek javitasa
npm audit fix

# Projekt tisztitas
rm -rf node_modules
npm install
        \end{lstlisting}
      \end{block}
    \end{column}
  \end{columns}
\end{frame}

\begin{frame}[fragile,shrink=10]{npx - Csomag futtatás telepítés nélkül}
  \begin{block}{npx használata}
    \begin{lstlisting}[language=bash]
# Egyszeri futtatas telepites nelkul
npx create-react-app my-app
npx prisma init
npx tsx index.ts

# Lokalis csomag futtatas
npx nodemon index.js
    \end{lstlisting}
  \end{block}
  
  \vspace{0.3cm}
  \begin{block}{Előnyök}
    \begin{itemize}
      \item Nem szennyezi a globális telepítéseket
      \item Mindig a legfrissebb verzió
      \item Gyors prototípuskészítés
      \item CLI eszközök futtatása
    \end{itemize}
  \end{block}
\end{frame}

\begin{frame}[fragile,shrink=10]{Gyakori csomagok Backend fejlesztéshez}
  \begin{block}{Production dependencies}
    \begin{lstlisting}[language=bash]
npm i express              # Web framework
npm i @prisma/client       # ORM kliens
npm i dotenv               # Kornyezeti valtozok
npm i cors                 # CORS middleware
npm i bcrypt               # Jelszo hash
npm i jsonwebtoken         # JWT token
npm i express-validator    # Validacio
    \end{lstlisting}
  \end{block}
  
  \begin{block}{Development dependencies}
    \begin{lstlisting}[language=bash]
npm i -D nodemon          # Auto-restart
npm i -D prisma           # ORM CLI
npm i -D typescript       # TypeScript
npm i -D @types/node      # Node.js tipusok
    \end{lstlisting}
  \end{block}
\end{frame}

\begin{frame}[fragile,shrink=10]{.npmrc - npm konfiguráció}
  \begin{block}{Projekt .npmrc fájl}
    \begin{lstlisting}[language=bash]
# Pontos verziot ment (^ nelkul)
save-exact=true

# Engine strict mod
engine-strict=true

# Automaikus audit
audit=true
    \end{lstlisting}
  \end{block}
  
  \begin{block}{package.json - Node verzió megkötés}
    \begin{lstlisting}[style=JavaScript]
{
  "engines": {
    "node": ">=18.0.0",
    "npm": ">=9.0.0"
  }
}
    \end{lstlisting}
  \end{block}
\end{frame}

\begin{frame}{npm Registry és publikálás}
  \begin{itemize}
    \item \kiemel{npmjs.com} - Publikus npm registry
    \item Ingyenes, bárki publikálhat csomagot
    \item Saját csomag publikálás: \texttt{npm publish}
    \item Privát csomagok: fizetős npm Pro/Teams
    \item Alternatív registry-k: GitHub Packages, Verdaccio
  \end{itemize}
  
  \vspace{0.5cm}
  \begin{block}{Saját csomag publikálás lépései}
    \begin{enumerate}
      \item \texttt{npm login} - Bejelentkezés
      \item package.json konfiguráció
      \item \texttt{npm publish} - Publikálás
      \item \texttt{npm version patch/minor/major} - Verziókezelés
    \end{enumerate}
  \end{block}
\end{frame}

\begin{frame}{Összefoglalás}
  \begin{block}{npm alapok}
    \begin{itemize}
      \item npm: Node Package Manager, 2+ millió csomag
      \item \texttt{npm init} - projekt inicializálás
      \item \texttt{npm install/uninstall/update} - csomagkezelés
      \item package.json: projekt metaadatok, függőségek, scripts
      \item Semantic Versioning: MAJOR.MINOR.PATCH
      \item dependencies vs devDependencies
      \item node\_modules (ne commit), package-lock.json (commit)
      \item npm scripts: egyéni parancsok definiálása
      \item npx: csomagok futtatása telepítés nélkül
    \end{itemize}
  \end{block}
\end{frame}
