7828 lines
234 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!doctype html>
<html lang="en" class="no-js">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<meta name="description" content="Build Power. Not Rent It. Own your digital infrastructure.">
<meta name="author" content="Bunker Operations">
<link rel="canonical" href="https://bnkserve.org/v2/development/npm-commands/">
<link rel="prev" href="../git-workflow/">
<link rel="next" href="../migrations/">
<link rel="icon" href="../../../assets/favicon.png">
<meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.7.1">
<title>NPM Commands - Changemaker Lite</title>
<link rel="stylesheet" href="../../../assets/stylesheets/main.484c7ddc.min.css">
<link rel="stylesheet" href="../../../assets/stylesheets/palette.ab4e12ef.min.css">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Inter:300,300i,400,400i,700,700i%7CJetBrains+Mono:400,400i,700,700i&display=fallback">
<style>:root{--md-text-font:"Inter";--md-code-font:"JetBrains Mono"}</style>
<link rel="stylesheet" href="../../../stylesheets/extra.css">
<link rel="stylesheet" href="../../../stylesheets/home.css">
<link rel="stylesheet" href="../../../assets/css/video-player.css">
<script>__md_scope=new URL("../../..",location),__md_hash=e=>[...e].reduce(((e,_)=>(e<<5)-e+_.charCodeAt(0)),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+"."+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+"."+e,JSON.stringify(_))}catch(e){}}</script>
<meta property="og:type" content="website" />
<meta property="og:title" content="NPM Commands - Changemaker Lite" />
<meta property="og:description" content="Build Power. Not Rent It. Own your digital infrastructure." />
<meta property="og:image" content="https://bnkserve.org/assets/images/social/v2/development/npm-commands.png" />
<meta property="og:image:type" content="image/png" />
<meta property="og:image:width" content="1200" />
<meta property="og:image:height" content="630" />
<meta property="og:url" content="https://bnkserve.org/v2/development/npm-commands/" />
<meta property="twitter:card" content="summary_large_image" />
<meta property="twitter:title" content="NPM Commands - Changemaker Lite" />
<meta property="twitter:description" content="Build Power. Not Rent It. Own your digital infrastructure." />
<meta property="twitter:image" content="https://bnkserve.org/assets/images/social/v2/development/npm-commands.png" />
</head>
<body dir="ltr" data-md-color-scheme="slate" data-md-color-primary="deep-purple" data-md-color-accent="amber">
<input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off">
<input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off">
<label class="md-overlay" for="__drawer"></label>
<div data-md-component="skip">
<a href="#npm-commands-reference" class="md-skip">
Skip to content
</a>
</div>
<div data-md-component="announce">
</div>
<header class="md-header md-header--shadow md-header--lifted" data-md-component="header">
<nav class="md-header__inner md-grid" aria-label="Header">
<a href="../../.." title="Changemaker Lite" class="md-header__button md-logo" aria-label="Changemaker Lite" data-md-component="logo">
<img src="../../../assets/logo.png" alt="logo">
</a>
<label class="md-header__button md-icon" for="__drawer">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3zm0 5h18v2H3zm0 5h18v2H3z"/></svg>
</label>
<div class="md-header__title" data-md-component="header-title">
<div class="md-header__ellipsis">
<div class="md-header__topic">
<span class="md-ellipsis">
Changemaker Lite
</span>
</div>
<div class="md-header__topic" data-md-component="header-topic">
<span class="md-ellipsis">
NPM Commands
</span>
</div>
</div>
</div>
<form class="md-header__option" data-md-component="palette">
<input class="md-option" data-md-color-media="" data-md-color-scheme="slate" data-md-color-primary="deep-purple" data-md-color-accent="amber" aria-label="Switch to light mode" type="radio" name="__palette" id="__palette_0">
<label class="md-header__button md-icon" title="Switch to light mode" for="__palette_1" hidden>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="m17.75 4.09-2.53 1.94.91 3.06-2.63-1.81-2.63 1.81.91-3.06-2.53-1.94L12.44 4l1.06-3 1.06 3zm3.5 6.91-1.64 1.25.59 1.98-1.7-1.17-1.7 1.17.59-1.98L15.75 11l2.06-.05L18.5 9l.69 1.95zm-2.28 4.95c.83-.08 1.72 1.1 1.19 1.85-.32.45-.66.87-1.08 1.27C15.17 23 8.84 23 4.94 19.07c-3.91-3.9-3.91-10.24 0-14.14.4-.4.82-.76 1.27-1.08.75-.53 1.93.36 1.85 1.19-.27 2.86.69 5.83 2.89 8.02a9.96 9.96 0 0 0 8.02 2.89m-1.64 2.02a12.08 12.08 0 0 1-7.8-3.47c-2.17-2.19-3.33-5-3.49-7.82-2.81 3.14-2.7 7.96.31 10.98 3.02 3.01 7.84 3.12 10.98.31"/></svg>
</label>
<input class="md-option" data-md-color-media="" data-md-color-scheme="default" data-md-color-primary="deep-purple" data-md-color-accent="amber" aria-label="Switch to dark mode" type="radio" name="__palette" id="__palette_1">
<label class="md-header__button md-icon" title="Switch to dark mode" for="__palette_0" hidden>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 7a5 5 0 0 1 5 5 5 5 0 0 1-5 5 5 5 0 0 1-5-5 5 5 0 0 1 5-5m0 2a3 3 0 0 0-3 3 3 3 0 0 0 3 3 3 3 0 0 0 3-3 3 3 0 0 0-3-3m0-7 2.39 3.42C13.65 5.15 12.84 5 12 5s-1.65.15-2.39.42zM3.34 7l4.16-.35A7.2 7.2 0 0 0 5.94 8.5c-.44.74-.69 1.5-.83 2.29zm.02 10 1.76-3.77a7.131 7.131 0 0 0 2.38 4.14zM20.65 7l-1.77 3.79a7.02 7.02 0 0 0-2.38-4.15zm-.01 10-4.14.36c.59-.51 1.12-1.14 1.54-1.86.42-.73.69-1.5.83-2.29zM12 22l-2.41-3.44c.74.27 1.55.44 2.41.44.82 0 1.63-.17 2.37-.44z"/></svg>
</label>
</form>
<script>var palette=__md_get("__palette");if(palette&&palette.color){if("(prefers-color-scheme)"===palette.color.media){var media=matchMedia("(prefers-color-scheme: light)"),input=document.querySelector(media.matches?"[data-md-color-media='(prefers-color-scheme: light)']":"[data-md-color-media='(prefers-color-scheme: dark)']");palette.color.media=input.getAttribute("data-md-color-media"),palette.color.scheme=input.getAttribute("data-md-color-scheme"),palette.color.primary=input.getAttribute("data-md-color-primary"),palette.color.accent=input.getAttribute("data-md-color-accent")}for(var[key,value]of Object.entries(palette.color))document.body.setAttribute("data-md-color-"+key,value)}</script>
<label class="md-header__button md-icon" for="__search">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg>
</label>
<div class="md-search" data-md-component="search" role="dialog">
<label class="md-search__overlay" for="__search"></label>
<div class="md-search__inner" role="search">
<form class="md-search__form" name="search">
<input type="text" class="md-search__input" name="query" aria-label="Search" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="search-query" required>
<label class="md-search__icon md-icon" for="__search">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11z"/></svg>
</label>
<nav class="md-search__options" aria-label="Search">
<a href="javascript:void(0)" class="md-search__icon md-icon" title="Share" aria-label="Share" data-clipboard data-clipboard-text="" data-md-component="search-share" tabindex="-1">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M18 16.08c-.76 0-1.44.3-1.96.77L8.91 12.7c.05-.23.09-.46.09-.7s-.04-.47-.09-.7l7.05-4.11c.54.5 1.25.81 2.04.81a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3c0 .24.04.47.09.7L8.04 9.81C7.5 9.31 6.79 9 6 9a3 3 0 0 0-3 3 3 3 0 0 0 3 3c.79 0 1.5-.31 2.04-.81l7.12 4.15c-.05.21-.08.43-.08.66 0 1.61 1.31 2.91 2.92 2.91s2.92-1.3 2.92-2.91A2.92 2.92 0 0 0 18 16.08"/></svg>
</a>
<button type="reset" class="md-search__icon md-icon" title="Clear" aria-label="Clear" tabindex="-1">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"/></svg>
</button>
</nav>
<div class="md-search__suggest" data-md-component="search-suggest"></div>
</form>
<div class="md-search__output">
<div class="md-search__scrollwrap" tabindex="0" data-md-scrollfix>
<div class="md-search-result" data-md-component="search-result">
<div class="md-search-result__meta">
Initializing search
</div>
<ol class="md-search-result__list" role="presentation"></ol>
</div>
</div>
</div>
</div>
</div>
<div class="md-header__source">
<a href="https://gitea.bnkops.com/admin/changemaker.lite" title="Go to repository" class="md-source" data-md-component="source">
<div class="md-source__icon md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d="M439.6 236.1 244 40.5c-5.4-5.5-12.8-8.5-20.4-8.5s-15 3-20.4 8.4L162.5 81l51.5 51.5c27.1-9.1 52.7 16.8 43.4 43.7l49.7 49.7c34.2-11.8 61.2 31 35.5 56.7-26.5 26.5-70.2-2.9-56-37.3L240.3 199v121.9c25.3 12.5 22.3 41.8 9.1 55-6.4 6.4-15.2 10.1-24.3 10.1s-17.8-3.6-24.3-10.1c-17.6-17.6-11.1-46.9 11.2-56v-123c-20.8-8.5-24.6-30.7-18.6-45L142.6 101 8.5 235.1C3 240.6 0 247.9 0 255.5s3 15 8.5 20.4l195.6 195.7c5.4 5.4 12.7 8.4 20.4 8.4s15-3 20.4-8.4l194.7-194.7c5.4-5.4 8.4-12.8 8.4-20.4s-3-15-8.4-20.4"/></svg>
</div>
<div class="md-source__repository">
changemaker.lite
</div>
</a>
</div>
</nav>
<nav class="md-tabs" aria-label="Tabs" data-md-component="tabs">
<div class="md-grid">
<ul class="md-tabs__list">
<li class="md-tabs__item">
<a href="../../.." class="md-tabs__link">
Home
</a>
</li>
<li class="md-tabs__item md-tabs__item--active">
<a href="../../" class="md-tabs__link">
V2 Documentation
</a>
</li>
<li class="md-tabs__item">
<a href="../../../phil/" class="md-tabs__link">
Philosophy
</a>
</li>
<li class="md-tabs__item">
<a href="../../../v1/" class="md-tabs__link">
V1 Documentation (Legacy)
</a>
</li>
<li class="md-tabs__item">
<a href="../../../blog/" class="md-tabs__link">
Blog
</a>
</li>
</ul>
</div>
</nav>
</header>
<div class="md-container" data-md-component="container">
<main class="md-main" data-md-component="main">
<div class="md-main__inner md-grid">
<div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" >
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<nav class="md-nav md-nav--primary md-nav--lifted" aria-label="Navigation" data-md-level="0">
<label class="md-nav__title" for="__drawer">
<a href="../../.." title="Changemaker Lite" class="md-nav__button md-logo" aria-label="Changemaker Lite" data-md-component="logo">
<img src="../../../assets/logo.png" alt="logo">
</a>
Changemaker Lite
</label>
<div class="md-nav__source">
<a href="https://gitea.bnkops.com/admin/changemaker.lite" title="Go to repository" class="md-source" data-md-component="source">
<div class="md-source__icon md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d="M439.6 236.1 244 40.5c-5.4-5.5-12.8-8.5-20.4-8.5s-15 3-20.4 8.4L162.5 81l51.5 51.5c27.1-9.1 52.7 16.8 43.4 43.7l49.7 49.7c34.2-11.8 61.2 31 35.5 56.7-26.5 26.5-70.2-2.9-56-37.3L240.3 199v121.9c25.3 12.5 22.3 41.8 9.1 55-6.4 6.4-15.2 10.1-24.3 10.1s-17.8-3.6-24.3-10.1c-17.6-17.6-11.1-46.9 11.2-56v-123c-20.8-8.5-24.6-30.7-18.6-45L142.6 101 8.5 235.1C3 240.6 0 247.9 0 255.5s3 15 8.5 20.4l195.6 195.7c5.4 5.4 12.7 8.4 20.4 8.4s15-3 20.4-8.4l194.7-194.7c5.4-5.4 8.4-12.8 8.4-20.4s-3-15-8.4-20.4"/></svg>
</div>
<div class="md-source__repository">
changemaker.lite
</div>
</a>
</div>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../.." class="md-nav__link">
<span class="md-ellipsis">
Home
</span>
</a>
</li>
<li class="md-nav__item md-nav__item--active md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_2" checked>
<div class="md-nav__link md-nav__container">
<a href="../../" class="md-nav__link ">
<span class="md-ellipsis">
V2 Documentation
</span>
</a>
<label class="md-nav__link " for="__nav_2" id="__nav_2_label" tabindex="">
<span class="md-nav__icon md-icon"></span>
</label>
</div>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_2_label" aria-expanded="true">
<label class="md-nav__title" for="__nav_2">
<span class="md-nav__icon md-icon"></span>
V2 Documentation
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_2_2" >
<div class="md-nav__link md-nav__container">
<a href="../../getting-started/" class="md-nav__link ">
<span class="md-ellipsis">
Getting Started
</span>
</a>
<label class="md-nav__link " for="__nav_2_2" id="__nav_2_2_label" tabindex="">
<span class="md-nav__icon md-icon"></span>
</label>
</div>
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_2_2_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_2_2">
<span class="md-nav__icon md-icon"></span>
Getting Started
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../getting-started/quick-start/" class="md-nav__link">
<span class="md-ellipsis">
Quick Start
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_2_3" >
<div class="md-nav__link md-nav__container">
<a href="../../architecture/" class="md-nav__link ">
<span class="md-ellipsis">
Architecture
</span>
</a>
<label class="md-nav__link " for="__nav_2_3" id="__nav_2_3_label" tabindex="">
<span class="md-nav__icon md-icon"></span>
</label>
</div>
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_2_3_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_2_3">
<span class="md-nav__icon md-icon"></span>
Architecture
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../architecture/dual-api/" class="md-nav__link">
<span class="md-ellipsis">
Dual API System
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../architecture/authentication/" class="md-nav__link">
<span class="md-ellipsis">
Authentication & Security
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_2_4" >
<div class="md-nav__link md-nav__container">
<a href="../../backend/" class="md-nav__link ">
<span class="md-ellipsis">
Backend
</span>
</a>
<label class="md-nav__link " for="__nav_2_4" id="__nav_2_4_label" tabindex="">
<span class="md-nav__icon md-icon"></span>
</label>
</div>
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_2_4_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_2_4">
<span class="md-nav__icon md-icon"></span>
Backend
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item md-nav__item--pruned md-nav__item--nested">
<a href="../../backend/modules/" class="md-nav__link">
<span class="md-ellipsis">
Modules
</span>
<span class="md-nav__icon md-icon"></span>
</a>
</li>
<li class="md-nav__item md-nav__item--pruned md-nav__item--nested">
<a href="../../backend/services/" class="md-nav__link">
<span class="md-ellipsis">
Services
</span>
<span class="md-nav__icon md-icon"></span>
</a>
</li>
<li class="md-nav__item md-nav__item--pruned md-nav__item--nested">
<a href="../../backend/middleware/" class="md-nav__link">
<span class="md-ellipsis">
Middleware
</span>
<span class="md-nav__icon md-icon"></span>
</a>
</li>
<li class="md-nav__item md-nav__item--pruned md-nav__item--nested">
<a href="../../backend/utilities/" class="md-nav__link">
<span class="md-ellipsis">
Utilities
</span>
<span class="md-nav__icon md-icon"></span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_2_5" >
<div class="md-nav__link md-nav__container">
<a href="../../frontend/" class="md-nav__link ">
<span class="md-ellipsis">
Frontend
</span>
</a>
<label class="md-nav__link " for="__nav_2_5" id="__nav_2_5_label" tabindex="">
<span class="md-nav__icon md-icon"></span>
</label>
</div>
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_2_5_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_2_5">
<span class="md-nav__icon md-icon"></span>
Frontend
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item md-nav__item--pruned md-nav__item--nested">
<a href="../../frontend/components/" class="md-nav__link">
<span class="md-ellipsis">
Components
</span>
<span class="md-nav__icon md-icon"></span>
</a>
</li>
<li class="md-nav__item md-nav__item--pruned md-nav__item--nested">
<a href="../../frontend/layouts/" class="md-nav__link">
<span class="md-ellipsis">
Layouts
</span>
<span class="md-nav__icon md-icon"></span>
</a>
</li>
<li class="md-nav__item md-nav__item--pruned md-nav__item--nested">
<a href="../../frontend/pages/" class="md-nav__link">
<span class="md-ellipsis">
Pages
</span>
<span class="md-nav__icon md-icon"></span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_2_6" >
<div class="md-nav__link md-nav__container">
<a href="../../database/" class="md-nav__link ">
<span class="md-ellipsis">
Database
</span>
</a>
<label class="md-nav__link " for="__nav_2_6" id="__nav_2_6_label" tabindex="">
<span class="md-nav__icon md-icon"></span>
</label>
</div>
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_2_6_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_2_6">
<span class="md-nav__icon md-icon"></span>
Database
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../database/schema/" class="md-nav__link">
<span class="md-ellipsis">
Schema Overview
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../database/migrations/" class="md-nav__link">
<span class="md-ellipsis">
Migrations
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../database/seeding/" class="md-nav__link">
<span class="md-ellipsis">
Seeding
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../database/indexes/" class="md-nav__link">
<span class="md-ellipsis">
Indexes
</span>
</a>
</li>
<li class="md-nav__item md-nav__item--pruned md-nav__item--nested">
<a href="../../database/models/" class="md-nav__link">
<span class="md-ellipsis">
Models
</span>
<span class="md-nav__icon md-icon"></span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_2_7" >
<div class="md-nav__link md-nav__container">
<a href="../../features/" class="md-nav__link ">
<span class="md-ellipsis">
Features
</span>
</a>
<label class="md-nav__link " for="__nav_2_7" id="__nav_2_7_label" tabindex="">
<span class="md-nav__icon md-icon"></span>
</label>
</div>
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_2_7_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_2_7">
<span class="md-nav__icon md-icon"></span>
Features
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item md-nav__item--pruned md-nav__item--nested">
<a href="../../features/influence/" class="md-nav__link">
<span class="md-ellipsis">
Influence
</span>
<span class="md-nav__icon md-icon"></span>
</a>
</li>
<li class="md-nav__item md-nav__item--pruned md-nav__item--nested">
<a href="../../features/map/" class="md-nav__link">
<span class="md-ellipsis">
Map
</span>
<span class="md-nav__icon md-icon"></span>
</a>
</li>
<li class="md-nav__item md-nav__item--pruned md-nav__item--nested">
<a href="../../features/landing-pages/" class="md-nav__link">
<span class="md-ellipsis">
Landing Pages
</span>
<span class="md-nav__icon md-icon"></span>
</a>
</li>
<li class="md-nav__item md-nav__item--pruned md-nav__item--nested">
<a href="../../features/email-templates/" class="md-nav__link">
<span class="md-ellipsis">
Email Templates
</span>
<span class="md-nav__icon md-icon"></span>
</a>
</li>
<li class="md-nav__item md-nav__item--pruned md-nav__item--nested">
<a href="../../features/media/" class="md-nav__link">
<span class="md-ellipsis">
Media
</span>
<span class="md-nav__icon md-icon"></span>
</a>
</li>
<li class="md-nav__item md-nav__item--pruned md-nav__item--nested">
<a href="../../features/newsletter/" class="md-nav__link">
<span class="md-ellipsis">
Newsletter
</span>
<span class="md-nav__icon md-icon"></span>
</a>
</li>
<li class="md-nav__item md-nav__item--pruned md-nav__item--nested">
<a href="../../features/observability/" class="md-nav__link">
<span class="md-ellipsis">
Observability
</span>
<span class="md-nav__icon md-icon"></span>
</a>
</li>
<li class="md-nav__item md-nav__item--pruned md-nav__item--nested">
<a href="../../features/tunnel/" class="md-nav__link">
<span class="md-ellipsis">
Tunnel
</span>
<span class="md-nav__icon md-icon"></span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_2_8" >
<div class="md-nav__link md-nav__container">
<a href="../../deployment/" class="md-nav__link ">
<span class="md-ellipsis">
Deployment
</span>
</a>
<label class="md-nav__link " for="__nav_2_8" id="__nav_2_8_label" tabindex="">
<span class="md-nav__icon md-icon"></span>
</label>
</div>
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_2_8_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_2_8">
<span class="md-nav__icon md-icon"></span>
Deployment
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../deployment/docker-compose/" class="md-nav__link">
<span class="md-ellipsis">
Docker Compose
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../deployment/environment-variables/" class="md-nav__link">
<span class="md-ellipsis">
Environment Variables
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../deployment/nginx/" class="md-nav__link">
<span class="md-ellipsis">
Nginx Configuration
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../deployment/ssl-tls/" class="md-nav__link">
<span class="md-ellipsis">
SSL/TLS
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../deployment/tunneling/" class="md-nav__link">
<span class="md-ellipsis">
Tunneling
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../deployment/monitoring-stack/" class="md-nav__link">
<span class="md-ellipsis">
Monitoring Stack
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../deployment/healthchecks/" class="md-nav__link">
<span class="md-ellipsis">
Health Checks
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../deployment/scaling/" class="md-nav__link">
<span class="md-ellipsis">
Scaling
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../deployment/backup-restore/" class="md-nav__link">
<span class="md-ellipsis">
Backup & Restore
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--active md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_2_9" checked>
<div class="md-nav__link md-nav__container">
<a href="../" class="md-nav__link ">
<span class="md-ellipsis">
Development
</span>
</a>
<label class="md-nav__link " for="__nav_2_9" id="__nav_2_9_label" tabindex="">
<span class="md-nav__icon md-icon"></span>
</label>
</div>
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_2_9_label" aria-expanded="true">
<label class="md-nav__title" for="__nav_2_9">
<span class="md-nav__icon md-icon"></span>
Development
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../local-setup/" class="md-nav__link">
<span class="md-ellipsis">
Local Setup
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../docker-workflow/" class="md-nav__link">
<span class="md-ellipsis">
Docker Workflow
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../git-workflow/" class="md-nav__link">
<span class="md-ellipsis">
Git Workflow
</span>
</a>
</li>
<li class="md-nav__item md-nav__item--active">
<input class="md-nav__toggle md-toggle" type="checkbox" id="__toc">
<label class="md-nav__link md-nav__link--active" for="__toc">
<span class="md-ellipsis">
NPM Commands
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<a href="./" class="md-nav__link md-nav__link--active">
<span class="md-ellipsis">
NPM Commands
</span>
</a>
<nav class="md-nav md-nav--secondary" aria-label="On this page">
<label class="md-nav__title" for="__toc">
<span class="md-nav__icon md-icon"></span>
On this page
</label>
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
<li class="md-nav__item">
<a href="#overview" class="md-nav__link">
<span class="md-ellipsis">
Overview
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#api-scripts" class="md-nav__link">
<span class="md-ellipsis">
API Scripts
</span>
</a>
<nav class="md-nav" aria-label="API Scripts">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#development-scripts" class="md-nav__link">
<span class="md-ellipsis">
Development Scripts
</span>
</a>
<nav class="md-nav" aria-label="Development Scripts">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#npm-run-dev" class="md-nav__link">
<span class="md-ellipsis">
npm run dev
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#npm-run-devmedia" class="md-nav__link">
<span class="md-ellipsis">
npm run dev:media
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#build-scripts" class="md-nav__link">
<span class="md-ellipsis">
Build Scripts
</span>
</a>
<nav class="md-nav" aria-label="Build Scripts">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#npm-run-build" class="md-nav__link">
<span class="md-ellipsis">
npm run build
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#npm-run-clean" class="md-nav__link">
<span class="md-ellipsis">
npm run clean
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#production-scripts" class="md-nav__link">
<span class="md-ellipsis">
Production Scripts
</span>
</a>
<nav class="md-nav" aria-label="Production Scripts">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#npm-start" class="md-nav__link">
<span class="md-ellipsis">
npm start
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#npm-run-startmedia" class="md-nav__link">
<span class="md-ellipsis">
npm run start:media
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#code-quality-scripts" class="md-nav__link">
<span class="md-ellipsis">
Code Quality Scripts
</span>
</a>
<nav class="md-nav" aria-label="Code Quality Scripts">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#npm-run-type-check" class="md-nav__link">
<span class="md-ellipsis">
npm run type-check
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#npm-run-lint" class="md-nav__link">
<span class="md-ellipsis">
npm run lint
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#npm-run-lintfix" class="md-nav__link">
<span class="md-ellipsis">
npm run lint:fix
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#npm-run-format" class="md-nav__link">
<span class="md-ellipsis">
npm run format
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#npm-run-formatcheck" class="md-nav__link">
<span class="md-ellipsis">
npm run format:check
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#database-scripts" class="md-nav__link">
<span class="md-ellipsis">
Database Scripts
</span>
</a>
<nav class="md-nav" aria-label="Database Scripts">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#npm-run-prismamigrate" class="md-nav__link">
<span class="md-ellipsis">
npm run prisma:migrate
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#npm-run-prismadeploy" class="md-nav__link">
<span class="md-ellipsis">
npm run prisma:deploy
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#npm-run-prismaseed" class="md-nav__link">
<span class="md-ellipsis">
npm run prisma:seed
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#npm-run-prismastudio" class="md-nav__link">
<span class="md-ellipsis">
npm run prisma:studio
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#npm-run-prismareset" class="md-nav__link">
<span class="md-ellipsis">
npm run prisma:reset
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#npm-run-prismavalidate" class="md-nav__link">
<span class="md-ellipsis">
npm run prisma:validate
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#npm-run-drizzlepush" class="md-nav__link">
<span class="md-ellipsis">
npm run drizzle:push
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#npm-run-drizzlestudio" class="md-nav__link">
<span class="md-ellipsis">
npm run drizzle:studio
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#testing-scripts" class="md-nav__link">
<span class="md-ellipsis">
Testing Scripts
</span>
</a>
<nav class="md-nav" aria-label="Testing Scripts">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#npm-test" class="md-nav__link">
<span class="md-ellipsis">
npm test
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#npm-run-testwatch" class="md-nav__link">
<span class="md-ellipsis">
npm run test:watch
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#npm-run-testcoverage" class="md-nav__link">
<span class="md-ellipsis">
npm run test:coverage
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#utility-scripts" class="md-nav__link">
<span class="md-ellipsis">
Utility Scripts
</span>
</a>
<nav class="md-nav" aria-label="Utility Scripts">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#npm-run-envvalidate" class="md-nav__link">
<span class="md-ellipsis">
npm run env:validate
</span>
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#admin-scripts" class="md-nav__link">
<span class="md-ellipsis">
Admin Scripts
</span>
</a>
<nav class="md-nav" aria-label="Admin Scripts">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#development-scripts_1" class="md-nav__link">
<span class="md-ellipsis">
Development Scripts
</span>
</a>
<nav class="md-nav" aria-label="Development Scripts">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#npm-run-dev_1" class="md-nav__link">
<span class="md-ellipsis">
npm run dev
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#build-scripts_1" class="md-nav__link">
<span class="md-ellipsis">
Build Scripts
</span>
</a>
<nav class="md-nav" aria-label="Build Scripts">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#npm-run-build_1" class="md-nav__link">
<span class="md-ellipsis">
npm run build
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#npm-run-preview" class="md-nav__link">
<span class="md-ellipsis">
npm run preview
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#code-quality-scripts_1" class="md-nav__link">
<span class="md-ellipsis">
Code Quality Scripts
</span>
</a>
<nav class="md-nav" aria-label="Code Quality Scripts">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#npm-run-type-check_1" class="md-nav__link">
<span class="md-ellipsis">
npm run type-check
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#npm-run-lint_1" class="md-nav__link">
<span class="md-ellipsis">
npm run lint
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#npm-run-lintfix_1" class="md-nav__link">
<span class="md-ellipsis">
npm run lint:fix
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#npm-run-format_1" class="md-nav__link">
<span class="md-ellipsis">
npm run format
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#npm-run-formatcheck_1" class="md-nav__link">
<span class="md-ellipsis">
npm run format:check
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#testing-scripts_1" class="md-nav__link">
<span class="md-ellipsis">
Testing Scripts
</span>
</a>
<nav class="md-nav" aria-label="Testing Scripts">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#npm-test_1" class="md-nav__link">
<span class="md-ellipsis">
npm test
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#npm-run-testwatch_1" class="md-nav__link">
<span class="md-ellipsis">
npm run test:watch
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#npm-run-testui" class="md-nav__link">
<span class="md-ellipsis">
npm run test:ui
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#npm-run-testcoverage_1" class="md-nav__link">
<span class="md-ellipsis">
npm run test:coverage
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#utility-scripts_1" class="md-nav__link">
<span class="md-ellipsis">
Utility Scripts
</span>
</a>
<nav class="md-nav" aria-label="Utility Scripts">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#npm-run-clean_1" class="md-nav__link">
<span class="md-ellipsis">
npm run clean
</span>
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#docker-commands" class="md-nav__link">
<span class="md-ellipsis">
Docker Commands
</span>
</a>
<nav class="md-nav" aria-label="Docker Commands">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#api-in-docker" class="md-nav__link">
<span class="md-ellipsis">
API in Docker
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#admin-in-docker" class="md-nav__link">
<span class="md-ellipsis">
Admin in Docker
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#rebuild-containers" class="md-nav__link">
<span class="md-ellipsis">
Rebuild Containers
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#script-chaining" class="md-nav__link">
<span class="md-ellipsis">
Script Chaining
</span>
</a>
<nav class="md-nav" aria-label="Script Chaining">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#sequential-execution" class="md-nav__link">
<span class="md-ellipsis">
Sequential Execution (&amp;&amp;)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#parallel-execution-npm-run-all" class="md-nav__link">
<span class="md-ellipsis">
Parallel Execution (npm-run-all)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#prepost-hooks" class="md-nav__link">
<span class="md-ellipsis">
Pre/Post Hooks
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#common-script-combinations" class="md-nav__link">
<span class="md-ellipsis">
Common Script Combinations
</span>
</a>
<nav class="md-nav" aria-label="Common Script Combinations">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#full-development-setup" class="md-nav__link">
<span class="md-ellipsis">
Full Development Setup
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#pre-commit-quality-check" class="md-nav__link">
<span class="md-ellipsis">
Pre-Commit Quality Check
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#production-build" class="md-nav__link">
<span class="md-ellipsis">
Production Build
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#database-migration-workflow" class="md-nav__link">
<span class="md-ellipsis">
Database Migration Workflow
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#database-inspection" class="md-nav__link">
<span class="md-ellipsis">
Database Inspection
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#full-type-check" class="md-nav__link">
<span class="md-ellipsis">
Full Type Check
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#cicd-integration" class="md-nav__link">
<span class="md-ellipsis">
CI/CD Integration
</span>
</a>
<nav class="md-nav" aria-label="CI/CD Integration">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#github-actions-example" class="md-nav__link">
<span class="md-ellipsis">
GitHub Actions Example
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#troubleshooting" class="md-nav__link">
<span class="md-ellipsis">
Troubleshooting
</span>
</a>
<nav class="md-nav" aria-label="Troubleshooting">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#script-not-found" class="md-nav__link">
<span class="md-ellipsis">
Script Not Found
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#permission-errors" class="md-nav__link">
<span class="md-ellipsis">
Permission Errors
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#port-already-in-use" class="md-nav__link">
<span class="md-ellipsis">
Port Already in Use
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#typescript-errors-on-build" class="md-nav__link">
<span class="md-ellipsis">
TypeScript Errors on Build
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#prisma-migration-conflicts" class="md-nav__link">
<span class="md-ellipsis">
Prisma Migration Conflicts
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#npm-install-failures" class="md-nav__link">
<span class="md-ellipsis">
npm install Failures
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#vite-build-errors" class="md-nav__link">
<span class="md-ellipsis">
Vite Build Errors
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#best-practices" class="md-nav__link">
<span class="md-ellipsis">
Best Practices
</span>
</a>
<nav class="md-nav" aria-label="Best Practices">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#script-naming-conventions" class="md-nav__link">
<span class="md-ellipsis">
Script Naming Conventions
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#script-organization" class="md-nav__link">
<span class="md-ellipsis">
Script Organization
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#environment-specific-scripts" class="md-nav__link">
<span class="md-ellipsis">
Environment-Specific Scripts
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#script-documentation" class="md-nav__link">
<span class="md-ellipsis">
Script Documentation
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#quick-reference" class="md-nav__link">
<span class="md-ellipsis">
Quick Reference
</span>
</a>
<nav class="md-nav" aria-label="Quick Reference">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#api-scripts_1" class="md-nav__link">
<span class="md-ellipsis">
API Scripts
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#admin-scripts_1" class="md-nav__link">
<span class="md-ellipsis">
Admin Scripts
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#docker-scripts" class="md-nav__link">
<span class="md-ellipsis">
Docker Scripts
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#related-documentation" class="md-nav__link">
<span class="md-ellipsis">
Related Documentation
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#summary" class="md-nav__link">
<span class="md-ellipsis">
Summary
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../migrations/" class="md-nav__link">
<span class="md-ellipsis">
Migrations
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../typescript/" class="md-nav__link">
<span class="md-ellipsis">
TypeScript
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../testing/" class="md-nav__link">
<span class="md-ellipsis">
Testing
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../debugging/" class="md-nav__link">
<span class="md-ellipsis">
Debugging
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../code-style/" class="md-nav__link">
<span class="md-ellipsis">
Code Style
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_2_10" >
<div class="md-nav__link md-nav__container">
<a href="../../api-reference/" class="md-nav__link ">
<span class="md-ellipsis">
API Reference
</span>
</a>
</div>
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_2_10_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_2_10">
<span class="md-nav__icon md-icon"></span>
API Reference
</label>
<ul class="md-nav__list" data-md-scrollfix>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_2_11" >
<div class="md-nav__link md-nav__container">
<a href="../../user-guides/" class="md-nav__link ">
<span class="md-ellipsis">
User Guides
</span>
</a>
<label class="md-nav__link " for="__nav_2_11" id="__nav_2_11_label" tabindex="">
<span class="md-nav__icon md-icon"></span>
</label>
</div>
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_2_11_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_2_11">
<span class="md-nav__icon md-icon"></span>
User Guides
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../user-guides/admin-guide/" class="md-nav__link">
<span class="md-ellipsis">
Admin Guide
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../user-guides/campaign-manager-guide/" class="md-nav__link">
<span class="md-ellipsis">
Campaign Manager Guide
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../user-guides/map-organizer-guide/" class="md-nav__link">
<span class="md-ellipsis">
Map Organizer Guide
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../user-guides/content-editor-guide/" class="md-nav__link">
<span class="md-ellipsis">
Content Editor Guide
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../user-guides/volunteer-guide/" class="md-nav__link">
<span class="md-ellipsis">
Volunteer Guide
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_2_12" >
<div class="md-nav__link md-nav__container">
<a href="../../troubleshooting/" class="md-nav__link ">
<span class="md-ellipsis">
Troubleshooting
</span>
</a>
<label class="md-nav__link " for="__nav_2_12" id="__nav_2_12_label" tabindex="">
<span class="md-nav__icon md-icon"></span>
</label>
</div>
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_2_12_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_2_12">
<span class="md-nav__icon md-icon"></span>
Troubleshooting
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../troubleshooting/faq/" class="md-nav__link">
<span class="md-ellipsis">
FAQ
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../troubleshooting/common-errors/" class="md-nav__link">
<span class="md-ellipsis">
Common Errors
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../troubleshooting/auth-issues/" class="md-nav__link">
<span class="md-ellipsis">
Auth Issues
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../troubleshooting/database-issues/" class="md-nav__link">
<span class="md-ellipsis">
Database Issues
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../troubleshooting/docker-issues/" class="md-nav__link">
<span class="md-ellipsis">
Docker Issues
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../troubleshooting/email-issues/" class="md-nav__link">
<span class="md-ellipsis">
Email Issues
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../troubleshooting/geocoding-issues/" class="md-nav__link">
<span class="md-ellipsis">
Geocoding Issues
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../troubleshooting/monitoring-issues/" class="md-nav__link">
<span class="md-ellipsis">
Monitoring Issues
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../troubleshooting/performance-optimization/" class="md-nav__link">
<span class="md-ellipsis">
Performance Optimization
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_2_13" >
<div class="md-nav__link md-nav__container">
<a href="../../migration/" class="md-nav__link ">
<span class="md-ellipsis">
Migration
</span>
</a>
<label class="md-nav__link " for="__nav_2_13" id="__nav_2_13_label" tabindex="">
<span class="md-nav__icon md-icon"></span>
</label>
</div>
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_2_13_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_2_13">
<span class="md-nav__icon md-icon"></span>
Migration
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../migration/feature-parity/" class="md-nav__link">
<span class="md-ellipsis">
Feature Parity
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../migration/breaking-changes/" class="md-nav__link">
<span class="md-ellipsis">
Breaking Changes
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../migration/api-changes/" class="md-nav__link">
<span class="md-ellipsis">
API Changes
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../migration/data-migration/" class="md-nav__link">
<span class="md-ellipsis">
Data Migration
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_2_14" >
<div class="md-nav__link md-nav__container">
<a href="../../contributing/" class="md-nav__link ">
<span class="md-ellipsis">
Contributing
</span>
</a>
<label class="md-nav__link " for="__nav_2_14" id="__nav_2_14_label" tabindex="">
<span class="md-nav__icon md-icon"></span>
</label>
</div>
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_2_14_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_2_14">
<span class="md-nav__icon md-icon"></span>
Contributing
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../contributing/development-setup/" class="md-nav__link">
<span class="md-ellipsis">
Development Setup
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../contributing/code-of-conduct/" class="md-nav__link">
<span class="md-ellipsis">
Code of Conduct
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../contributing/pull-requests/" class="md-nav__link">
<span class="md-ellipsis">
Pull Requests
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../contributing/roadmap/" class="md-nav__link">
<span class="md-ellipsis">
Roadmap
</span>
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--pruned md-nav__item--nested">
<a href="../../../phil/" class="md-nav__link">
<span class="md-ellipsis">
Philosophy
</span>
<span class="md-nav__icon md-icon"></span>
</a>
</li>
<li class="md-nav__item md-nav__item--pruned md-nav__item--nested">
<a href="../../../v1/" class="md-nav__link">
<span class="md-ellipsis">
V1 Documentation (Legacy)
</span>
<span class="md-nav__icon md-icon"></span>
</a>
</li>
<li class="md-nav__item md-nav__item--pruned md-nav__item--nested">
<a href="../../../blog/" class="md-nav__link">
<span class="md-ellipsis">
Blog
</span>
<span class="md-nav__icon md-icon"></span>
</a>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc" >
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<nav class="md-nav md-nav--secondary" aria-label="On this page">
<label class="md-nav__title" for="__toc">
<span class="md-nav__icon md-icon"></span>
On this page
</label>
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
<li class="md-nav__item">
<a href="#overview" class="md-nav__link">
<span class="md-ellipsis">
Overview
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#api-scripts" class="md-nav__link">
<span class="md-ellipsis">
API Scripts
</span>
</a>
<nav class="md-nav" aria-label="API Scripts">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#development-scripts" class="md-nav__link">
<span class="md-ellipsis">
Development Scripts
</span>
</a>
<nav class="md-nav" aria-label="Development Scripts">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#npm-run-dev" class="md-nav__link">
<span class="md-ellipsis">
npm run dev
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#npm-run-devmedia" class="md-nav__link">
<span class="md-ellipsis">
npm run dev:media
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#build-scripts" class="md-nav__link">
<span class="md-ellipsis">
Build Scripts
</span>
</a>
<nav class="md-nav" aria-label="Build Scripts">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#npm-run-build" class="md-nav__link">
<span class="md-ellipsis">
npm run build
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#npm-run-clean" class="md-nav__link">
<span class="md-ellipsis">
npm run clean
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#production-scripts" class="md-nav__link">
<span class="md-ellipsis">
Production Scripts
</span>
</a>
<nav class="md-nav" aria-label="Production Scripts">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#npm-start" class="md-nav__link">
<span class="md-ellipsis">
npm start
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#npm-run-startmedia" class="md-nav__link">
<span class="md-ellipsis">
npm run start:media
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#code-quality-scripts" class="md-nav__link">
<span class="md-ellipsis">
Code Quality Scripts
</span>
</a>
<nav class="md-nav" aria-label="Code Quality Scripts">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#npm-run-type-check" class="md-nav__link">
<span class="md-ellipsis">
npm run type-check
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#npm-run-lint" class="md-nav__link">
<span class="md-ellipsis">
npm run lint
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#npm-run-lintfix" class="md-nav__link">
<span class="md-ellipsis">
npm run lint:fix
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#npm-run-format" class="md-nav__link">
<span class="md-ellipsis">
npm run format
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#npm-run-formatcheck" class="md-nav__link">
<span class="md-ellipsis">
npm run format:check
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#database-scripts" class="md-nav__link">
<span class="md-ellipsis">
Database Scripts
</span>
</a>
<nav class="md-nav" aria-label="Database Scripts">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#npm-run-prismamigrate" class="md-nav__link">
<span class="md-ellipsis">
npm run prisma:migrate
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#npm-run-prismadeploy" class="md-nav__link">
<span class="md-ellipsis">
npm run prisma:deploy
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#npm-run-prismaseed" class="md-nav__link">
<span class="md-ellipsis">
npm run prisma:seed
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#npm-run-prismastudio" class="md-nav__link">
<span class="md-ellipsis">
npm run prisma:studio
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#npm-run-prismareset" class="md-nav__link">
<span class="md-ellipsis">
npm run prisma:reset
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#npm-run-prismavalidate" class="md-nav__link">
<span class="md-ellipsis">
npm run prisma:validate
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#npm-run-drizzlepush" class="md-nav__link">
<span class="md-ellipsis">
npm run drizzle:push
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#npm-run-drizzlestudio" class="md-nav__link">
<span class="md-ellipsis">
npm run drizzle:studio
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#testing-scripts" class="md-nav__link">
<span class="md-ellipsis">
Testing Scripts
</span>
</a>
<nav class="md-nav" aria-label="Testing Scripts">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#npm-test" class="md-nav__link">
<span class="md-ellipsis">
npm test
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#npm-run-testwatch" class="md-nav__link">
<span class="md-ellipsis">
npm run test:watch
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#npm-run-testcoverage" class="md-nav__link">
<span class="md-ellipsis">
npm run test:coverage
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#utility-scripts" class="md-nav__link">
<span class="md-ellipsis">
Utility Scripts
</span>
</a>
<nav class="md-nav" aria-label="Utility Scripts">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#npm-run-envvalidate" class="md-nav__link">
<span class="md-ellipsis">
npm run env:validate
</span>
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#admin-scripts" class="md-nav__link">
<span class="md-ellipsis">
Admin Scripts
</span>
</a>
<nav class="md-nav" aria-label="Admin Scripts">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#development-scripts_1" class="md-nav__link">
<span class="md-ellipsis">
Development Scripts
</span>
</a>
<nav class="md-nav" aria-label="Development Scripts">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#npm-run-dev_1" class="md-nav__link">
<span class="md-ellipsis">
npm run dev
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#build-scripts_1" class="md-nav__link">
<span class="md-ellipsis">
Build Scripts
</span>
</a>
<nav class="md-nav" aria-label="Build Scripts">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#npm-run-build_1" class="md-nav__link">
<span class="md-ellipsis">
npm run build
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#npm-run-preview" class="md-nav__link">
<span class="md-ellipsis">
npm run preview
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#code-quality-scripts_1" class="md-nav__link">
<span class="md-ellipsis">
Code Quality Scripts
</span>
</a>
<nav class="md-nav" aria-label="Code Quality Scripts">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#npm-run-type-check_1" class="md-nav__link">
<span class="md-ellipsis">
npm run type-check
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#npm-run-lint_1" class="md-nav__link">
<span class="md-ellipsis">
npm run lint
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#npm-run-lintfix_1" class="md-nav__link">
<span class="md-ellipsis">
npm run lint:fix
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#npm-run-format_1" class="md-nav__link">
<span class="md-ellipsis">
npm run format
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#npm-run-formatcheck_1" class="md-nav__link">
<span class="md-ellipsis">
npm run format:check
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#testing-scripts_1" class="md-nav__link">
<span class="md-ellipsis">
Testing Scripts
</span>
</a>
<nav class="md-nav" aria-label="Testing Scripts">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#npm-test_1" class="md-nav__link">
<span class="md-ellipsis">
npm test
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#npm-run-testwatch_1" class="md-nav__link">
<span class="md-ellipsis">
npm run test:watch
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#npm-run-testui" class="md-nav__link">
<span class="md-ellipsis">
npm run test:ui
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#npm-run-testcoverage_1" class="md-nav__link">
<span class="md-ellipsis">
npm run test:coverage
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#utility-scripts_1" class="md-nav__link">
<span class="md-ellipsis">
Utility Scripts
</span>
</a>
<nav class="md-nav" aria-label="Utility Scripts">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#npm-run-clean_1" class="md-nav__link">
<span class="md-ellipsis">
npm run clean
</span>
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#docker-commands" class="md-nav__link">
<span class="md-ellipsis">
Docker Commands
</span>
</a>
<nav class="md-nav" aria-label="Docker Commands">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#api-in-docker" class="md-nav__link">
<span class="md-ellipsis">
API in Docker
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#admin-in-docker" class="md-nav__link">
<span class="md-ellipsis">
Admin in Docker
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#rebuild-containers" class="md-nav__link">
<span class="md-ellipsis">
Rebuild Containers
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#script-chaining" class="md-nav__link">
<span class="md-ellipsis">
Script Chaining
</span>
</a>
<nav class="md-nav" aria-label="Script Chaining">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#sequential-execution" class="md-nav__link">
<span class="md-ellipsis">
Sequential Execution (&amp;&amp;)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#parallel-execution-npm-run-all" class="md-nav__link">
<span class="md-ellipsis">
Parallel Execution (npm-run-all)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#prepost-hooks" class="md-nav__link">
<span class="md-ellipsis">
Pre/Post Hooks
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#common-script-combinations" class="md-nav__link">
<span class="md-ellipsis">
Common Script Combinations
</span>
</a>
<nav class="md-nav" aria-label="Common Script Combinations">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#full-development-setup" class="md-nav__link">
<span class="md-ellipsis">
Full Development Setup
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#pre-commit-quality-check" class="md-nav__link">
<span class="md-ellipsis">
Pre-Commit Quality Check
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#production-build" class="md-nav__link">
<span class="md-ellipsis">
Production Build
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#database-migration-workflow" class="md-nav__link">
<span class="md-ellipsis">
Database Migration Workflow
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#database-inspection" class="md-nav__link">
<span class="md-ellipsis">
Database Inspection
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#full-type-check" class="md-nav__link">
<span class="md-ellipsis">
Full Type Check
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#cicd-integration" class="md-nav__link">
<span class="md-ellipsis">
CI/CD Integration
</span>
</a>
<nav class="md-nav" aria-label="CI/CD Integration">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#github-actions-example" class="md-nav__link">
<span class="md-ellipsis">
GitHub Actions Example
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#troubleshooting" class="md-nav__link">
<span class="md-ellipsis">
Troubleshooting
</span>
</a>
<nav class="md-nav" aria-label="Troubleshooting">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#script-not-found" class="md-nav__link">
<span class="md-ellipsis">
Script Not Found
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#permission-errors" class="md-nav__link">
<span class="md-ellipsis">
Permission Errors
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#port-already-in-use" class="md-nav__link">
<span class="md-ellipsis">
Port Already in Use
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#typescript-errors-on-build" class="md-nav__link">
<span class="md-ellipsis">
TypeScript Errors on Build
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#prisma-migration-conflicts" class="md-nav__link">
<span class="md-ellipsis">
Prisma Migration Conflicts
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#npm-install-failures" class="md-nav__link">
<span class="md-ellipsis">
npm install Failures
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#vite-build-errors" class="md-nav__link">
<span class="md-ellipsis">
Vite Build Errors
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#best-practices" class="md-nav__link">
<span class="md-ellipsis">
Best Practices
</span>
</a>
<nav class="md-nav" aria-label="Best Practices">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#script-naming-conventions" class="md-nav__link">
<span class="md-ellipsis">
Script Naming Conventions
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#script-organization" class="md-nav__link">
<span class="md-ellipsis">
Script Organization
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#environment-specific-scripts" class="md-nav__link">
<span class="md-ellipsis">
Environment-Specific Scripts
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#script-documentation" class="md-nav__link">
<span class="md-ellipsis">
Script Documentation
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#quick-reference" class="md-nav__link">
<span class="md-ellipsis">
Quick Reference
</span>
</a>
<nav class="md-nav" aria-label="Quick Reference">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#api-scripts_1" class="md-nav__link">
<span class="md-ellipsis">
API Scripts
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#admin-scripts_1" class="md-nav__link">
<span class="md-ellipsis">
Admin Scripts
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#docker-scripts" class="md-nav__link">
<span class="md-ellipsis">
Docker Scripts
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#related-documentation" class="md-nav__link">
<span class="md-ellipsis">
Related Documentation
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#summary" class="md-nav__link">
<span class="md-ellipsis">
Summary
</span>
</a>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-content" data-md-component="content">
<nav class="md-path" aria-label="Navigation" >
<ol class="md-path__list">
<li class="md-path__item">
<a href="../../.." class="md-path__link">
<span class="md-ellipsis">
Home
</span>
</a>
</li>
<li class="md-path__item">
<a href="../../" class="md-path__link">
<span class="md-ellipsis">
V2 Documentation
</span>
</a>
</li>
<li class="md-path__item">
<a href="../" class="md-path__link">
<span class="md-ellipsis">
Development
</span>
</a>
</li>
</ol>
</nav>
<article class="md-content__inner md-typeset">
<a href="https://gitea.bnkops.com/admin/changemaker.lite/src/branch/main/mkdocs/docs/v2/development/npm-commands.md" title="Edit this page" class="md-content__button md-icon" rel="edit">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M10 20H6V4h7v5h5v3.1l2-2V8l-6-6H6c-1.1 0-2 .9-2 2v16c0 1.1.9 2 2 2h4zm10.2-7c.1 0 .3.1.4.2l1.3 1.3c.2.2.2.6 0 .8l-1 1-2.1-2.1 1-1c.1-.1.2-.2.4-.2m0 3.9L14.1 23H12v-2.1l6.1-6.1z"/></svg>
</a>
<a href="https://gitea.bnkops.com/admin/changemaker.lite/src/branch/main/mkdocs/docs/v2/development/npm-commands.md" title="View source of this page" class="md-content__button md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M17 18c.56 0 1 .44 1 1s-.44 1-1 1-1-.44-1-1 .44-1 1-1m0-3c-2.73 0-5.06 1.66-6 4 .94 2.34 3.27 4 6 4s5.06-1.66 6-4c-.94-2.34-3.27-4-6-4m0 6.5a2.5 2.5 0 0 1-2.5-2.5 2.5 2.5 0 0 1 2.5-2.5 2.5 2.5 0 0 1 2.5 2.5 2.5 2.5 0 0 1-2.5 2.5M9.27 20H6V4h7v5h5v4.07c.7.08 1.36.25 2 .49V8l-6-6H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h4.5a8.2 8.2 0 0 1-1.23-2"/></svg>
</a>
<h1 id="npm-commands-reference">NPM Commands Reference<a class="headerlink" href="#npm-commands-reference" title="Permanent link">&para;</a></h1>
<p>Complete reference for all npm scripts in Changemaker Lite V2.</p>
<h2 id="overview">Overview<a class="headerlink" href="#overview" title="Permanent link">&para;</a></h2>
<p>Changemaker Lite V2 uses npm scripts for development, building, testing, and database management. Scripts are defined in <code>package.json</code> files in two main directories:</p>
<ul>
<li><strong>api/package.json</strong> - Backend API scripts (Express + Fastify)</li>
<li><strong>admin/package.json</strong> - Frontend GUI scripts (React + Vite)</li>
</ul>
<p>This guide documents all available scripts, their usage, and common combinations.</p>
<h2 id="api-scripts">API Scripts<a class="headerlink" href="#api-scripts" title="Permanent link">&para;</a></h2>
<p>Location: <code>api/package.json</code></p>
<h3 id="development-scripts">Development Scripts<a class="headerlink" href="#development-scripts" title="Permanent link">&para;</a></h3>
<h4 id="npm-run-dev"><code>npm run dev</code><a class="headerlink" href="#npm-run-dev" title="Permanent link">&para;</a></h4>
<p>Starts the Express API server in development mode with hot reload.</p>
<div class="language-bash highlight"><pre><span></span><code><span id="__span-0-1"><a id="__codelineno-0-1" name="__codelineno-0-1" href="#__codelineno-0-1"></a><span class="nb">cd</span><span class="w"> </span>api
</span><span id="__span-0-2"><a id="__codelineno-0-2" name="__codelineno-0-2" href="#__codelineno-0-2"></a>npm<span class="w"> </span>run<span class="w"> </span>dev
</span></code></pre></div>
<p><strong>What it does:</strong>
- Runs <code>tsx watch src/server.ts</code>
- Auto-restarts on file changes (<code>.ts</code> files)
- Loads environment from <code>.env</code>
- Runs on port <code>API_PORT</code> (default: 4000)</p>
<p><strong>Output:</strong>
<div class="language-text highlight"><pre><span></span><code><span id="__span-1-1"><a id="__codelineno-1-1" name="__codelineno-1-1" href="#__codelineno-1-1"></a>Server running on port 4000
</span><span id="__span-1-2"><a id="__codelineno-1-2" name="__codelineno-1-2" href="#__codelineno-1-2"></a>Database connected
</span><span id="__span-1-3"><a id="__codelineno-1-3" name="__codelineno-1-3" href="#__codelineno-1-3"></a>Redis connected
</span><span id="__span-1-4"><a id="__codelineno-1-4" name="__codelineno-1-4" href="#__codelineno-1-4"></a>BullMQ worker started
</span></code></pre></div></p>
<p><strong>Use when:</strong>
- Developing API endpoints
- Testing backend changes
- Debugging server code</p>
<h4 id="npm-run-devmedia"><code>npm run dev:media</code><a class="headerlink" href="#npm-run-devmedia" title="Permanent link">&para;</a></h4>
<p>Starts the Fastify Media API server in development mode.</p>
<div class="language-bash highlight"><pre><span></span><code><span id="__span-2-1"><a id="__codelineno-2-1" name="__codelineno-2-1" href="#__codelineno-2-1"></a><span class="nb">cd</span><span class="w"> </span>api
</span><span id="__span-2-2"><a id="__codelineno-2-2" name="__codelineno-2-2" href="#__codelineno-2-2"></a>npm<span class="w"> </span>run<span class="w"> </span>dev:media
</span></code></pre></div>
<p><strong>What it does:</strong>
- Runs <code>tsx watch src/media-server.ts</code>
- Auto-restarts on file changes
- Runs on port <code>MEDIA_API_PORT</code> (default: 4100)</p>
<p><strong>Output:</strong>
<div class="language-text highlight"><pre><span></span><code><span id="__span-3-1"><a id="__codelineno-3-1" name="__codelineno-3-1" href="#__codelineno-3-1"></a>Media API server running on port 4100
</span><span id="__span-3-2"><a id="__codelineno-3-2" name="__codelineno-3-2" href="#__codelineno-3-2"></a>Database connected
</span></code></pre></div></p>
<p><strong>Use when:</strong>
- Developing media features (video upload, reactions)
- Testing Media API endpoints
- Working on FFprobe integration</p>
<h3 id="build-scripts">Build Scripts<a class="headerlink" href="#build-scripts" title="Permanent link">&para;</a></h3>
<h4 id="npm-run-build"><code>npm run build</code><a class="headerlink" href="#npm-run-build" title="Permanent link">&para;</a></h4>
<p>Compiles TypeScript to JavaScript for production.</p>
<div class="language-bash highlight"><pre><span></span><code><span id="__span-4-1"><a id="__codelineno-4-1" name="__codelineno-4-1" href="#__codelineno-4-1"></a><span class="nb">cd</span><span class="w"> </span>api
</span><span id="__span-4-2"><a id="__codelineno-4-2" name="__codelineno-4-2" href="#__codelineno-4-2"></a>npm<span class="w"> </span>run<span class="w"> </span>build
</span></code></pre></div>
<p><strong>What it does:</strong>
- Runs <code>tsc --build</code>
- Outputs to <code>dist/</code> directory
- Type-checks all code
- Fails on type errors</p>
<p><strong>Output:</strong>
<div class="language-text highlight"><pre><span></span><code><span id="__span-5-1"><a id="__codelineno-5-1" name="__codelineno-5-1" href="#__codelineno-5-1"></a>dist/
</span><span id="__span-5-2"><a id="__codelineno-5-2" name="__codelineno-5-2" href="#__codelineno-5-2"></a>├── server.js
</span><span id="__span-5-3"><a id="__codelineno-5-3" name="__codelineno-5-3" href="#__codelineno-5-3"></a>├── media-server.js
</span><span id="__span-5-4"><a id="__codelineno-5-4" name="__codelineno-5-4" href="#__codelineno-5-4"></a>└── modules/
</span><span id="__span-5-5"><a id="__codelineno-5-5" name="__codelineno-5-5" href="#__codelineno-5-5"></a> ├── auth/
</span><span id="__span-5-6"><a id="__codelineno-5-6" name="__codelineno-5-6" href="#__codelineno-5-6"></a> ├── users/
</span><span id="__span-5-7"><a id="__codelineno-5-7" name="__codelineno-5-7" href="#__codelineno-5-7"></a> └── ...
</span></code></pre></div></p>
<p><strong>Use when:</strong>
- Preparing for production deployment
- Verifying build succeeds
- Creating Docker images</p>
<h4 id="npm-run-clean"><code>npm run clean</code><a class="headerlink" href="#npm-run-clean" title="Permanent link">&para;</a></h4>
<p>Removes compiled JavaScript and build artifacts.</p>
<div class="language-bash highlight"><pre><span></span><code><span id="__span-6-1"><a id="__codelineno-6-1" name="__codelineno-6-1" href="#__codelineno-6-1"></a><span class="nb">cd</span><span class="w"> </span>api
</span><span id="__span-6-2"><a id="__codelineno-6-2" name="__codelineno-6-2" href="#__codelineno-6-2"></a>npm<span class="w"> </span>run<span class="w"> </span>clean
</span></code></pre></div>
<p><strong>What it does:</strong>
- Deletes <code>dist/</code> directory
- Removes <code>*.tsbuildinfo</code> files</p>
<p><strong>Use when:</strong>
- Starting fresh build
- Fixing build cache issues
- Cleaning up after development</p>
<h3 id="production-scripts">Production Scripts<a class="headerlink" href="#production-scripts" title="Permanent link">&para;</a></h3>
<h4 id="npm-start"><code>npm start</code><a class="headerlink" href="#npm-start" title="Permanent link">&para;</a></h4>
<p>Runs the compiled API server (production mode).</p>
<div class="language-bash highlight"><pre><span></span><code><span id="__span-7-1"><a id="__codelineno-7-1" name="__codelineno-7-1" href="#__codelineno-7-1"></a><span class="nb">cd</span><span class="w"> </span>api
</span><span id="__span-7-2"><a id="__codelineno-7-2" name="__codelineno-7-2" href="#__codelineno-7-2"></a>npm<span class="w"> </span>start
</span></code></pre></div>
<p><strong>What it does:</strong>
- Runs <code>node dist/server.js</code>
- Requires <code>npm run build</code> first
- Uses production environment (<code>NODE_ENV=production</code>)</p>
<p><strong>Output:</strong>
<div class="language-text highlight"><pre><span></span><code><span id="__span-8-1"><a id="__codelineno-8-1" name="__codelineno-8-1" href="#__codelineno-8-1"></a>Server running on port 4000
</span><span id="__span-8-2"><a id="__codelineno-8-2" name="__codelineno-8-2" href="#__codelineno-8-2"></a>Database connected
</span><span id="__span-8-3"><a id="__codelineno-8-3" name="__codelineno-8-3" href="#__codelineno-8-3"></a>Redis connected
</span></code></pre></div></p>
<p><strong>Use when:</strong>
- Running in production (Docker)
- Testing production build locally</p>
<h4 id="npm-run-startmedia"><code>npm run start:media</code><a class="headerlink" href="#npm-run-startmedia" title="Permanent link">&para;</a></h4>
<p>Runs the compiled Media API server (production mode).</p>
<div class="language-bash highlight"><pre><span></span><code><span id="__span-9-1"><a id="__codelineno-9-1" name="__codelineno-9-1" href="#__codelineno-9-1"></a><span class="nb">cd</span><span class="w"> </span>api
</span><span id="__span-9-2"><a id="__codelineno-9-2" name="__codelineno-9-2" href="#__codelineno-9-2"></a>npm<span class="w"> </span>run<span class="w"> </span>start:media
</span></code></pre></div>
<p><strong>What it does:</strong>
- Runs <code>node dist/media-server.js</code>
- Requires <code>npm run build</code> first</p>
<p><strong>Use when:</strong>
- Running Media API in production
- Testing production Media API</p>
<h3 id="code-quality-scripts">Code Quality Scripts<a class="headerlink" href="#code-quality-scripts" title="Permanent link">&para;</a></h3>
<h4 id="npm-run-type-check"><code>npm run type-check</code><a class="headerlink" href="#npm-run-type-check" title="Permanent link">&para;</a></h4>
<p>Type-checks TypeScript without emitting files.</p>
<div class="language-bash highlight"><pre><span></span><code><span id="__span-10-1"><a id="__codelineno-10-1" name="__codelineno-10-1" href="#__codelineno-10-1"></a><span class="nb">cd</span><span class="w"> </span>api
</span><span id="__span-10-2"><a id="__codelineno-10-2" name="__codelineno-10-2" href="#__codelineno-10-2"></a>npm<span class="w"> </span>run<span class="w"> </span>type-check
</span></code></pre></div>
<p><strong>What it does:</strong>
- Runs <code>tsc --noEmit</code>
- Reports type errors
- Does NOT generate files</p>
<p><strong>Output:</strong>
<div class="language-text highlight"><pre><span></span><code><span id="__span-11-1"><a id="__codelineno-11-1" name="__codelineno-11-1" href="#__codelineno-11-1"></a># Success (no output)
</span><span id="__span-11-2"><a id="__codelineno-11-2" name="__codelineno-11-2" href="#__codelineno-11-2"></a>
</span><span id="__span-11-3"><a id="__codelineno-11-3" name="__codelineno-11-3" href="#__codelineno-11-3"></a># Errors
</span><span id="__span-11-4"><a id="__codelineno-11-4" name="__codelineno-11-4" href="#__codelineno-11-4"></a>src/modules/auth/auth.service.ts:45:12 - error TS2345: Argument of type &#39;string&#39; is not assignable to parameter of type &#39;number&#39;.
</span></code></pre></div></p>
<p><strong>Use when:</strong>
- Before committing code
- In CI/CD pipeline
- Debugging type errors</p>
<h4 id="npm-run-lint"><code>npm run lint</code><a class="headerlink" href="#npm-run-lint" title="Permanent link">&para;</a></h4>
<p>Runs ESLint to check code style.</p>
<div class="language-bash highlight"><pre><span></span><code><span id="__span-12-1"><a id="__codelineno-12-1" name="__codelineno-12-1" href="#__codelineno-12-1"></a><span class="nb">cd</span><span class="w"> </span>api
</span><span id="__span-12-2"><a id="__codelineno-12-2" name="__codelineno-12-2" href="#__codelineno-12-2"></a>npm<span class="w"> </span>run<span class="w"> </span>lint
</span></code></pre></div>
<p><strong>What it does:</strong>
- Runs <code>eslint src/ --ext .ts</code>
- Reports style violations
- Checks for common errors</p>
<p><strong>Output:</strong>
<div class="language-text highlight"><pre><span></span><code><span id="__span-13-1"><a id="__codelineno-13-1" name="__codelineno-13-1" href="#__codelineno-13-1"></a># Success
</span><span id="__span-13-2"><a id="__codelineno-13-2" name="__codelineno-13-2" href="#__codelineno-13-2"></a>✔ 150 files linted, 0 errors, 0 warnings
</span><span id="__span-13-3"><a id="__codelineno-13-3" name="__codelineno-13-3" href="#__codelineno-13-3"></a>
</span><span id="__span-13-4"><a id="__codelineno-13-4" name="__codelineno-13-4" href="#__codelineno-13-4"></a># Errors
</span><span id="__span-13-5"><a id="__codelineno-13-5" name="__codelineno-13-5" href="#__codelineno-13-5"></a>src/modules/auth/auth.service.ts
</span><span id="__span-13-6"><a id="__codelineno-13-6" name="__codelineno-13-6" href="#__codelineno-13-6"></a> 45:12 error &#39;foo&#39; is assigned a value but never used @typescript-eslint/no-unused-vars
</span></code></pre></div></p>
<p><strong>Use when:</strong>
- Before committing code
- Enforcing code style
- Finding potential bugs</p>
<h4 id="npm-run-lintfix"><code>npm run lint:fix</code><a class="headerlink" href="#npm-run-lintfix" title="Permanent link">&para;</a></h4>
<p>Automatically fixes ESLint errors where possible.</p>
<div class="language-bash highlight"><pre><span></span><code><span id="__span-14-1"><a id="__codelineno-14-1" name="__codelineno-14-1" href="#__codelineno-14-1"></a><span class="nb">cd</span><span class="w"> </span>api
</span><span id="__span-14-2"><a id="__codelineno-14-2" name="__codelineno-14-2" href="#__codelineno-14-2"></a>npm<span class="w"> </span>run<span class="w"> </span>lint:fix
</span></code></pre></div>
<p><strong>What it does:</strong>
- Runs <code>eslint src/ --ext .ts --fix</code>
- Auto-fixes style issues (formatting, imports, etc.)
- Reports unfixable errors</p>
<p><strong>Use when:</strong>
- After writing new code
- Cleaning up formatting
- Before commit</p>
<h4 id="npm-run-format"><code>npm run format</code><a class="headerlink" href="#npm-run-format" title="Permanent link">&para;</a></h4>
<p>Formats code with Prettier.</p>
<div class="language-bash highlight"><pre><span></span><code><span id="__span-15-1"><a id="__codelineno-15-1" name="__codelineno-15-1" href="#__codelineno-15-1"></a><span class="nb">cd</span><span class="w"> </span>api
</span><span id="__span-15-2"><a id="__codelineno-15-2" name="__codelineno-15-2" href="#__codelineno-15-2"></a>npm<span class="w"> </span>run<span class="w"> </span>format
</span></code></pre></div>
<p><strong>What it does:</strong>
- Runs <code>prettier --write "src/**/*.{ts,js,json}"</code>
- Formats all TypeScript, JavaScript, and JSON files
- Overwrites files in place</p>
<p><strong>Use when:</strong>
- Standardizing code format
- After merge conflicts
- Team-wide formatting</p>
<h4 id="npm-run-formatcheck"><code>npm run format:check</code><a class="headerlink" href="#npm-run-formatcheck" title="Permanent link">&para;</a></h4>
<p>Checks if code is formatted correctly (CI).</p>
<div class="language-bash highlight"><pre><span></span><code><span id="__span-16-1"><a id="__codelineno-16-1" name="__codelineno-16-1" href="#__codelineno-16-1"></a><span class="nb">cd</span><span class="w"> </span>api
</span><span id="__span-16-2"><a id="__codelineno-16-2" name="__codelineno-16-2" href="#__codelineno-16-2"></a>npm<span class="w"> </span>run<span class="w"> </span>format:check
</span></code></pre></div>
<p><strong>What it does:</strong>
- Runs <code>prettier --check "src/**/*.{ts,js,json}"</code>
- Reports unformatted files
- Does NOT modify files</p>
<p><strong>Use when:</strong>
- In CI/CD pipeline
- Verifying format before commit</p>
<h3 id="database-scripts">Database Scripts<a class="headerlink" href="#database-scripts" title="Permanent link">&para;</a></h3>
<h4 id="npm-run-prismamigrate"><code>npm run prisma:migrate</code><a class="headerlink" href="#npm-run-prismamigrate" title="Permanent link">&para;</a></h4>
<p>Creates and applies a new Prisma migration.</p>
<div class="language-bash highlight"><pre><span></span><code><span id="__span-17-1"><a id="__codelineno-17-1" name="__codelineno-17-1" href="#__codelineno-17-1"></a><span class="nb">cd</span><span class="w"> </span>api
</span><span id="__span-17-2"><a id="__codelineno-17-2" name="__codelineno-17-2" href="#__codelineno-17-2"></a>npm<span class="w"> </span>run<span class="w"> </span>prisma:migrate
</span><span id="__span-17-3"><a id="__codelineno-17-3" name="__codelineno-17-3" href="#__codelineno-17-3"></a><span class="c1"># Or with name:</span>
</span><span id="__span-17-4"><a id="__codelineno-17-4" name="__codelineno-17-4" href="#__codelineno-17-4"></a>npx<span class="w"> </span>prisma<span class="w"> </span>migrate<span class="w"> </span>dev<span class="w"> </span>--name<span class="w"> </span>add_user_field
</span></code></pre></div>
<p><strong>What it does:</strong>
- Prompts for migration name
- Generates SQL migration in <code>prisma/migrations/</code>
- Applies migration to development database
- Regenerates Prisma Client</p>
<p><strong>Output:</strong>
<div class="language-text highlight"><pre><span></span><code><span id="__span-18-1"><a id="__codelineno-18-1" name="__codelineno-18-1" href="#__codelineno-18-1"></a>✔ Enter a name for the new migration: … add_user_field
</span><span id="__span-18-2"><a id="__codelineno-18-2" name="__codelineno-18-2" href="#__codelineno-18-2"></a>Applying migration `20260213000000_add_user_field`
</span><span id="__span-18-3"><a id="__codelineno-18-3" name="__codelineno-18-3" href="#__codelineno-18-3"></a>✔ Generated Prisma Client to ./node_modules/@prisma/client
</span></code></pre></div></p>
<p><strong>Use when:</strong>
- Changing database schema
- Adding new models
- Modifying fields</p>
<h4 id="npm-run-prismadeploy"><code>npm run prisma:deploy</code><a class="headerlink" href="#npm-run-prismadeploy" title="Permanent link">&para;</a></h4>
<p>Applies pending migrations (production).</p>
<div class="language-bash highlight"><pre><span></span><code><span id="__span-19-1"><a id="__codelineno-19-1" name="__codelineno-19-1" href="#__codelineno-19-1"></a><span class="nb">cd</span><span class="w"> </span>api
</span><span id="__span-19-2"><a id="__codelineno-19-2" name="__codelineno-19-2" href="#__codelineno-19-2"></a>npm<span class="w"> </span>run<span class="w"> </span>prisma:deploy
</span></code></pre></div>
<p><strong>What it does:</strong>
- Runs <code>prisma migrate deploy</code>
- Applies unapplied migrations only
- Does NOT create new migrations
- Safe for production</p>
<p><strong>Output:</strong>
<div class="language-text highlight"><pre><span></span><code><span id="__span-20-1"><a id="__codelineno-20-1" name="__codelineno-20-1" href="#__codelineno-20-1"></a>Environment variables loaded from .env
</span><span id="__span-20-2"><a id="__codelineno-20-2" name="__codelineno-20-2" href="#__codelineno-20-2"></a>Datasource &quot;db&quot;: PostgreSQL database &quot;changemaker_v2_db&quot;
</span><span id="__span-20-3"><a id="__codelineno-20-3" name="__codelineno-20-3" href="#__codelineno-20-3"></a>
</span><span id="__span-20-4"><a id="__codelineno-20-4" name="__codelineno-20-4" href="#__codelineno-20-4"></a>2 migrations found in prisma/migrations
</span><span id="__span-20-5"><a id="__codelineno-20-5" name="__codelineno-20-5" href="#__codelineno-20-5"></a>
</span><span id="__span-20-6"><a id="__codelineno-20-6" name="__codelineno-20-6" href="#__codelineno-20-6"></a>Applying migration `20260213000000_add_user_field`
</span><span id="__span-20-7"><a id="__codelineno-20-7" name="__codelineno-20-7" href="#__codelineno-20-7"></a>All migrations have been successfully applied.
</span></code></pre></div></p>
<p><strong>Use when:</strong>
- Deploying to production
- Applying migrations in Docker
- CI/CD deployment</p>
<h4 id="npm-run-prismaseed"><code>npm run prisma:seed</code><a class="headerlink" href="#npm-run-prismaseed" title="Permanent link">&para;</a></h4>
<p>Seeds database with initial data.</p>
<div class="language-bash highlight"><pre><span></span><code><span id="__span-21-1"><a id="__codelineno-21-1" name="__codelineno-21-1" href="#__codelineno-21-1"></a><span class="nb">cd</span><span class="w"> </span>api
</span><span id="__span-21-2"><a id="__codelineno-21-2" name="__codelineno-21-2" href="#__codelineno-21-2"></a>npm<span class="w"> </span>run<span class="w"> </span>prisma:seed
</span></code></pre></div>
<p><strong>What it does:</strong>
- Runs <code>tsx prisma/seed.ts</code>
- Creates admin user
- Creates default settings
- Creates sample blocks</p>
<p><strong>Output:</strong>
<div class="language-text highlight"><pre><span></span><code><span id="__span-22-1"><a id="__codelineno-22-1" name="__codelineno-22-1" href="#__codelineno-22-1"></a>Running seed command `tsx prisma/seed.ts` ...
</span><span id="__span-22-2"><a id="__codelineno-22-2" name="__codelineno-22-2" href="#__codelineno-22-2"></a>Seeding database...
</span><span id="__span-22-3"><a id="__codelineno-22-3" name="__codelineno-22-3" href="#__codelineno-22-3"></a>Created default settings
</span><span id="__span-22-4"><a id="__codelineno-22-4" name="__codelineno-22-4" href="#__codelineno-22-4"></a>Created admin user: admin@example.com
</span><span id="__span-22-5"><a id="__codelineno-22-5" name="__codelineno-22-5" href="#__codelineno-22-5"></a>Created 10 sample blocks
</span><span id="__span-22-6"><a id="__codelineno-22-6" name="__codelineno-22-6" href="#__codelineno-22-6"></a>Seed completed successfully
</span></code></pre></div></p>
<p><strong>Use when:</strong>
- First-time setup
- After reset
- Populating test data</p>
<h4 id="npm-run-prismastudio"><code>npm run prisma:studio</code><a class="headerlink" href="#npm-run-prismastudio" title="Permanent link">&para;</a></h4>
<p>Opens Prisma Studio (database GUI).</p>
<div class="language-bash highlight"><pre><span></span><code><span id="__span-23-1"><a id="__codelineno-23-1" name="__codelineno-23-1" href="#__codelineno-23-1"></a><span class="nb">cd</span><span class="w"> </span>api
</span><span id="__span-23-2"><a id="__codelineno-23-2" name="__codelineno-23-2" href="#__codelineno-23-2"></a>npm<span class="w"> </span>run<span class="w"> </span>prisma:studio
</span></code></pre></div>
<p><strong>What it does:</strong>
- Runs <code>prisma studio</code>
- Opens browser at http://localhost:5555
- Shows all tables and data
- Allows CRUD operations</p>
<p><strong>Use when:</strong>
- Inspecting database
- Manual data editing
- Debugging data issues</p>
<h4 id="npm-run-prismareset"><code>npm run prisma:reset</code><a class="headerlink" href="#npm-run-prismareset" title="Permanent link">&para;</a></h4>
<p>Resets database (DESTRUCTIVE).</p>
<div class="language-bash highlight"><pre><span></span><code><span id="__span-24-1"><a id="__codelineno-24-1" name="__codelineno-24-1" href="#__codelineno-24-1"></a><span class="nb">cd</span><span class="w"> </span>api
</span><span id="__span-24-2"><a id="__codelineno-24-2" name="__codelineno-24-2" href="#__codelineno-24-2"></a>npm<span class="w"> </span>run<span class="w"> </span>prisma:reset
</span></code></pre></div>
<p><strong>What it does:</strong>
- Drops all tables
- Re-applies all migrations
- Runs seed script
- <strong>DELETES ALL DATA</strong></p>
<p><strong>Output:</strong>
<div class="language-text highlight"><pre><span></span><code><span id="__span-25-1"><a id="__codelineno-25-1" name="__codelineno-25-1" href="#__codelineno-25-1"></a>⚠️ You are about to drop the database &#39;changemaker_v2_db&#39;
</span><span id="__span-25-2"><a id="__codelineno-25-2" name="__codelineno-25-2" href="#__codelineno-25-2"></a> All data will be lost.
</span><span id="__span-25-3"><a id="__codelineno-25-3" name="__codelineno-25-3" href="#__codelineno-25-3"></a>
</span><span id="__span-25-4"><a id="__codelineno-25-4" name="__codelineno-25-4" href="#__codelineno-25-4"></a>Do you want to continue? [y/N]: y
</span><span id="__span-25-5"><a id="__codelineno-25-5" name="__codelineno-25-5" href="#__codelineno-25-5"></a>
</span><span id="__span-25-6"><a id="__codelineno-25-6" name="__codelineno-25-6" href="#__codelineno-25-6"></a>Database reset successful
</span><span id="__span-25-7"><a id="__codelineno-25-7" name="__codelineno-25-7" href="#__codelineno-25-7"></a>Migrations applied
</span><span id="__span-25-8"><a id="__codelineno-25-8" name="__codelineno-25-8" href="#__codelineno-25-8"></a>Seed completed
</span></code></pre></div></p>
<p><strong>Use when:</strong>
- Starting fresh in development
- Fixing migration conflicts
- <strong>NEVER in production</strong></p>
<h4 id="npm-run-prismavalidate"><code>npm run prisma:validate</code><a class="headerlink" href="#npm-run-prismavalidate" title="Permanent link">&para;</a></h4>
<p>Validates Prisma schema.</p>
<div class="language-bash highlight"><pre><span></span><code><span id="__span-26-1"><a id="__codelineno-26-1" name="__codelineno-26-1" href="#__codelineno-26-1"></a><span class="nb">cd</span><span class="w"> </span>api
</span><span id="__span-26-2"><a id="__codelineno-26-2" name="__codelineno-26-2" href="#__codelineno-26-2"></a>npm<span class="w"> </span>run<span class="w"> </span>prisma:validate
</span></code></pre></div>
<p><strong>What it does:</strong>
- Runs <code>prisma validate</code>
- Checks schema syntax
- Verifies relations
- Does NOT touch database</p>
<p><strong>Output:</strong>
<div class="language-text highlight"><pre><span></span><code><span id="__span-27-1"><a id="__codelineno-27-1" name="__codelineno-27-1" href="#__codelineno-27-1"></a># Success
</span><span id="__span-27-2"><a id="__codelineno-27-2" name="__codelineno-27-2" href="#__codelineno-27-2"></a>The schema is valid ✔
</span><span id="__span-27-3"><a id="__codelineno-27-3" name="__codelineno-27-3" href="#__codelineno-27-3"></a>
</span><span id="__span-27-4"><a id="__codelineno-27-4" name="__codelineno-27-4" href="#__codelineno-27-4"></a># Errors
</span><span id="__span-27-5"><a id="__codelineno-27-5" name="__codelineno-27-5" href="#__codelineno-27-5"></a>Error validating model &quot;User&quot;: Field &quot;foo&quot; references unknown model &quot;Bar&quot;
</span></code></pre></div></p>
<p><strong>Use when:</strong>
- After editing schema
- Before creating migration
- In CI/CD pipeline</p>
<h4 id="npm-run-drizzlepush"><code>npm run drizzle:push</code><a class="headerlink" href="#npm-run-drizzlepush" title="Permanent link">&para;</a></h4>
<p>Pushes Drizzle schema changes to database (Media API).</p>
<div class="language-bash highlight"><pre><span></span><code><span id="__span-28-1"><a id="__codelineno-28-1" name="__codelineno-28-1" href="#__codelineno-28-1"></a><span class="nb">cd</span><span class="w"> </span>api
</span><span id="__span-28-2"><a id="__codelineno-28-2" name="__codelineno-28-2" href="#__codelineno-28-2"></a>npm<span class="w"> </span>run<span class="w"> </span>drizzle:push
</span></code></pre></div>
<p><strong>What it does:</strong>
- Runs <code>drizzle-kit push</code>
- Syncs <code>src/modules/media/db/schema.ts</code> to database
- Does NOT create migration files
- Direct schema sync</p>
<p><strong>Output:</strong>
<div class="language-text highlight"><pre><span></span><code><span id="__span-29-1"><a id="__codelineno-29-1" name="__codelineno-29-1" href="#__codelineno-29-1"></a>Reading config from drizzle.config.ts
</span><span id="__span-29-2"><a id="__codelineno-29-2" name="__codelineno-29-2" href="#__codelineno-29-2"></a>Pushing schema to database...
</span><span id="__span-29-3"><a id="__codelineno-29-3" name="__codelineno-29-3" href="#__codelineno-29-3"></a>✔ Schema pushed successfully
</span></code></pre></div></p>
<p><strong>Use when:</strong>
- Changing Media API tables (videos, jobs, reactions)
- Rapid prototyping (no migrations)
- Development only</p>
<h4 id="npm-run-drizzlestudio"><code>npm run drizzle:studio</code><a class="headerlink" href="#npm-run-drizzlestudio" title="Permanent link">&para;</a></h4>
<p>Opens Drizzle Studio (database GUI for Media API).</p>
<div class="language-bash highlight"><pre><span></span><code><span id="__span-30-1"><a id="__codelineno-30-1" name="__codelineno-30-1" href="#__codelineno-30-1"></a><span class="nb">cd</span><span class="w"> </span>api
</span><span id="__span-30-2"><a id="__codelineno-30-2" name="__codelineno-30-2" href="#__codelineno-30-2"></a>npm<span class="w"> </span>run<span class="w"> </span>drizzle:studio
</span></code></pre></div>
<p><strong>What it does:</strong>
- Runs <code>drizzle-kit studio</code>
- Opens browser at http://localhost:4983
- Shows Media API tables only</p>
<p><strong>Use when:</strong>
- Inspecting media tables
- Debugging video data
- Manual media data editing</p>
<h3 id="testing-scripts">Testing Scripts<a class="headerlink" href="#testing-scripts" title="Permanent link">&para;</a></h3>
<h4 id="npm-test"><code>npm test</code><a class="headerlink" href="#npm-test" title="Permanent link">&para;</a></h4>
<p>Runs all tests (when configured).</p>
<div class="language-bash highlight"><pre><span></span><code><span id="__span-31-1"><a id="__codelineno-31-1" name="__codelineno-31-1" href="#__codelineno-31-1"></a><span class="nb">cd</span><span class="w"> </span>api
</span><span id="__span-31-2"><a id="__codelineno-31-2" name="__codelineno-31-2" href="#__codelineno-31-2"></a>npm<span class="w"> </span><span class="nb">test</span>
</span></code></pre></div>
<p><strong>What it does:</strong>
- Runs Jest test suite
- Executes <code>*.test.ts</code> files
- Reports pass/fail</p>
<p><strong>Note:</strong> Tests are part of Phase 15 (in progress).</p>
<h4 id="npm-run-testwatch"><code>npm run test:watch</code><a class="headerlink" href="#npm-run-testwatch" title="Permanent link">&para;</a></h4>
<p>Runs tests in watch mode.</p>
<div class="language-bash highlight"><pre><span></span><code><span id="__span-32-1"><a id="__codelineno-32-1" name="__codelineno-32-1" href="#__codelineno-32-1"></a><span class="nb">cd</span><span class="w"> </span>api
</span><span id="__span-32-2"><a id="__codelineno-32-2" name="__codelineno-32-2" href="#__codelineno-32-2"></a>npm<span class="w"> </span>run<span class="w"> </span>test:watch
</span></code></pre></div>
<p><strong>What it does:</strong>
- Runs <code>jest --watch</code>
- Re-runs tests on file changes</p>
<h4 id="npm-run-testcoverage"><code>npm run test:coverage</code><a class="headerlink" href="#npm-run-testcoverage" title="Permanent link">&para;</a></h4>
<p>Runs tests with coverage report.</p>
<div class="language-bash highlight"><pre><span></span><code><span id="__span-33-1"><a id="__codelineno-33-1" name="__codelineno-33-1" href="#__codelineno-33-1"></a><span class="nb">cd</span><span class="w"> </span>api
</span><span id="__span-33-2"><a id="__codelineno-33-2" name="__codelineno-33-2" href="#__codelineno-33-2"></a>npm<span class="w"> </span>run<span class="w"> </span>test:coverage
</span></code></pre></div>
<p><strong>What it does:</strong>
- Runs <code>jest --coverage</code>
- Generates coverage report in <code>coverage/</code></p>
<h3 id="utility-scripts">Utility Scripts<a class="headerlink" href="#utility-scripts" title="Permanent link">&para;</a></h3>
<h4 id="npm-run-envvalidate"><code>npm run env:validate</code><a class="headerlink" href="#npm-run-envvalidate" title="Permanent link">&para;</a></h4>
<p>Validates required environment variables.</p>
<div class="language-bash highlight"><pre><span></span><code><span id="__span-34-1"><a id="__codelineno-34-1" name="__codelineno-34-1" href="#__codelineno-34-1"></a><span class="nb">cd</span><span class="w"> </span>api
</span><span id="__span-34-2"><a id="__codelineno-34-2" name="__codelineno-34-2" href="#__codelineno-34-2"></a>npm<span class="w"> </span>run<span class="w"> </span>env:validate
</span></code></pre></div>
<p><strong>What it does:</strong>
- Checks <code>.env</code> has required vars
- Uses Zod validation (from <code>config/env.ts</code>)
- Fails if vars missing/invalid</p>
<p><strong>Output:</strong>
<div class="language-text highlight"><pre><span></span><code><span id="__span-35-1"><a id="__codelineno-35-1" name="__codelineno-35-1" href="#__codelineno-35-1"></a># Success
</span><span id="__span-35-2"><a id="__codelineno-35-2" name="__codelineno-35-2" href="#__codelineno-35-2"></a>✔ Environment variables valid
</span><span id="__span-35-3"><a id="__codelineno-35-3" name="__codelineno-35-3" href="#__codelineno-35-3"></a>
</span><span id="__span-35-4"><a id="__codelineno-35-4" name="__codelineno-35-4" href="#__codelineno-35-4"></a># Errors
</span><span id="__span-35-5"><a id="__codelineno-35-5" name="__codelineno-35-5" href="#__codelineno-35-5"></a>Error: Missing required environment variables:
</span><span id="__span-35-6"><a id="__codelineno-35-6" name="__codelineno-35-6" href="#__codelineno-35-6"></a> - JWT_ACCESS_SECRET
</span><span id="__span-35-7"><a id="__codelineno-35-7" name="__codelineno-35-7" href="#__codelineno-35-7"></a> - REDIS_PASSWORD
</span></code></pre></div></p>
<p><strong>Use when:</strong>
- After editing .env
- Before deployment
- Debugging config issues</p>
<h2 id="admin-scripts">Admin Scripts<a class="headerlink" href="#admin-scripts" title="Permanent link">&para;</a></h2>
<p>Location: <code>admin/package.json</code></p>
<h3 id="development-scripts_1">Development Scripts<a class="headerlink" href="#development-scripts_1" title="Permanent link">&para;</a></h3>
<h4 id="npm-run-dev_1"><code>npm run dev</code><a class="headerlink" href="#npm-run-dev_1" title="Permanent link">&para;</a></h4>
<p>Starts Vite development server with HMR.</p>
<div class="language-bash highlight"><pre><span></span><code><span id="__span-36-1"><a id="__codelineno-36-1" name="__codelineno-36-1" href="#__codelineno-36-1"></a><span class="nb">cd</span><span class="w"> </span>admin
</span><span id="__span-36-2"><a id="__codelineno-36-2" name="__codelineno-36-2" href="#__codelineno-36-2"></a>npm<span class="w"> </span>run<span class="w"> </span>dev
</span></code></pre></div>
<p><strong>What it does:</strong>
- Runs <code>vite</code>
- Starts dev server on port <code>ADMIN_PORT</code> (default: 3000)
- Enables Hot Module Replacement (HMR)
- Proxies API requests to <code>VITE_API_URL</code></p>
<p><strong>Output:</strong>
<div class="language-text highlight"><pre><span></span><code><span id="__span-37-1"><a id="__codelineno-37-1" name="__codelineno-37-1" href="#__codelineno-37-1"></a> VITE v5.x.x ready in 500 ms
</span><span id="__span-37-2"><a id="__codelineno-37-2" name="__codelineno-37-2" href="#__codelineno-37-2"></a>
</span><span id="__span-37-3"><a id="__codelineno-37-3" name="__codelineno-37-3" href="#__codelineno-37-3"></a> ➜ Local: http://localhost:3000/
</span><span id="__span-37-4"><a id="__codelineno-37-4" name="__codelineno-37-4" href="#__codelineno-37-4"></a> ➜ Network: use --host to expose
</span></code></pre></div></p>
<p><strong>Use when:</strong>
- Developing frontend components
- Testing UI changes
- Working on React code</p>
<h3 id="build-scripts_1">Build Scripts<a class="headerlink" href="#build-scripts_1" title="Permanent link">&para;</a></h3>
<h4 id="npm-run-build_1"><code>npm run build</code><a class="headerlink" href="#npm-run-build_1" title="Permanent link">&para;</a></h4>
<p>Builds production-optimized bundle.</p>
<div class="language-bash highlight"><pre><span></span><code><span id="__span-38-1"><a id="__codelineno-38-1" name="__codelineno-38-1" href="#__codelineno-38-1"></a><span class="nb">cd</span><span class="w"> </span>admin
</span><span id="__span-38-2"><a id="__codelineno-38-2" name="__codelineno-38-2" href="#__codelineno-38-2"></a>npm<span class="w"> </span>run<span class="w"> </span>build
</span></code></pre></div>
<p><strong>What it does:</strong>
- Runs <code>tsc --noEmit &amp;&amp; vite build</code>
- Type-checks TypeScript
- Bundles JavaScript/CSS
- Optimizes assets (minify, tree-shake)
- Outputs to <code>dist/</code></p>
<p><strong>Output:</strong>
<div class="language-text highlight"><pre><span></span><code><span id="__span-39-1"><a id="__codelineno-39-1" name="__codelineno-39-1" href="#__codelineno-39-1"></a>vite v5.x.x building for production...
</span><span id="__span-39-2"><a id="__codelineno-39-2" name="__codelineno-39-2" href="#__codelineno-39-2"></a>✓ 1245 modules transformed.
</span><span id="__span-39-3"><a id="__codelineno-39-3" name="__codelineno-39-3" href="#__codelineno-39-3"></a>dist/index.html 0.45 kB
</span><span id="__span-39-4"><a id="__codelineno-39-4" name="__codelineno-39-4" href="#__codelineno-39-4"></a>dist/assets/index-a1b2c3d4.js 245.67 kB │ gzip: 78.23 kB
</span><span id="__span-39-5"><a id="__codelineno-39-5" name="__codelineno-39-5" href="#__codelineno-39-5"></a>dist/assets/index-e5f6g7h8.css 12.34 kB │ gzip: 3.45 kB
</span><span id="__span-39-6"><a id="__codelineno-39-6" name="__codelineno-39-6" href="#__codelineno-39-6"></a>✓ built in 15.23s
</span></code></pre></div></p>
<p><strong>Use when:</strong>
- Preparing for production deployment
- Creating Docker image
- Verifying build size</p>
<h4 id="npm-run-preview"><code>npm run preview</code><a class="headerlink" href="#npm-run-preview" title="Permanent link">&para;</a></h4>
<p>Previews production build locally.</p>
<div class="language-bash highlight"><pre><span></span><code><span id="__span-40-1"><a id="__codelineno-40-1" name="__codelineno-40-1" href="#__codelineno-40-1"></a><span class="nb">cd</span><span class="w"> </span>admin
</span><span id="__span-40-2"><a id="__codelineno-40-2" name="__codelineno-40-2" href="#__codelineno-40-2"></a>npm<span class="w"> </span>run<span class="w"> </span>preview
</span></code></pre></div>
<p><strong>What it does:</strong>
- Runs <code>vite preview</code>
- Serves <code>dist/</code> directory
- Runs on port 4173 (Vite default)</p>
<p><strong>Output:</strong>
<div class="language-text highlight"><pre><span></span><code><span id="__span-41-1"><a id="__codelineno-41-1" name="__codelineno-41-1" href="#__codelineno-41-1"></a> ➜ Local: http://localhost:4173/
</span><span id="__span-41-2"><a id="__codelineno-41-2" name="__codelineno-41-2" href="#__codelineno-41-2"></a> ➜ Network: use --host to expose
</span></code></pre></div></p>
<p><strong>Use when:</strong>
- Testing production build
- Verifying optimizations
- Before deployment</p>
<h3 id="code-quality-scripts_1">Code Quality Scripts<a class="headerlink" href="#code-quality-scripts_1" title="Permanent link">&para;</a></h3>
<h4 id="npm-run-type-check_1"><code>npm run type-check</code><a class="headerlink" href="#npm-run-type-check_1" title="Permanent link">&para;</a></h4>
<p>Type-checks TypeScript without emitting files.</p>
<div class="language-bash highlight"><pre><span></span><code><span id="__span-42-1"><a id="__codelineno-42-1" name="__codelineno-42-1" href="#__codelineno-42-1"></a><span class="nb">cd</span><span class="w"> </span>admin
</span><span id="__span-42-2"><a id="__codelineno-42-2" name="__codelineno-42-2" href="#__codelineno-42-2"></a>npm<span class="w"> </span>run<span class="w"> </span>type-check
</span></code></pre></div>
<p><strong>What it does:</strong>
- Runs <code>tsc --noEmit</code>
- Reports type errors
- Checks all <code>.ts</code> and <code>.tsx</code> files</p>
<p><strong>Output:</strong>
<div class="language-text highlight"><pre><span></span><code><span id="__span-43-1"><a id="__codelineno-43-1" name="__codelineno-43-1" href="#__codelineno-43-1"></a># Success (no output)
</span><span id="__span-43-2"><a id="__codelineno-43-2" name="__codelineno-43-2" href="#__codelineno-43-2"></a>
</span><span id="__span-43-3"><a id="__codelineno-43-3" name="__codelineno-43-3" href="#__codelineno-43-3"></a># Errors
</span><span id="__span-43-4"><a id="__codelineno-43-4" name="__codelineno-43-4" href="#__codelineno-43-4"></a>src/pages/UsersPage.tsx:123:45 - error TS2339: Property &#39;foo&#39; does not exist on type &#39;User&#39;.
</span></code></pre></div></p>
<p><strong>Use when:</strong>
- Before committing code
- In CI/CD pipeline
- Debugging type errors</p>
<h4 id="npm-run-lint_1"><code>npm run lint</code><a class="headerlink" href="#npm-run-lint_1" title="Permanent link">&para;</a></h4>
<p>Runs ESLint to check code style.</p>
<div class="language-bash highlight"><pre><span></span><code><span id="__span-44-1"><a id="__codelineno-44-1" name="__codelineno-44-1" href="#__codelineno-44-1"></a><span class="nb">cd</span><span class="w"> </span>admin
</span><span id="__span-44-2"><a id="__codelineno-44-2" name="__codelineno-44-2" href="#__codelineno-44-2"></a>npm<span class="w"> </span>run<span class="w"> </span>lint
</span></code></pre></div>
<p><strong>What it does:</strong>
- Runs <code>eslint src/ --ext .ts,.tsx</code>
- Reports style violations
- Checks React best practices</p>
<p><strong>Output:</strong>
<div class="language-text highlight"><pre><span></span><code><span id="__span-45-1"><a id="__codelineno-45-1" name="__codelineno-45-1" href="#__codelineno-45-1"></a># Success
</span><span id="__span-45-2"><a id="__codelineno-45-2" name="__codelineno-45-2" href="#__codelineno-45-2"></a>✔ 85 files linted, 0 errors, 0 warnings
</span><span id="__span-45-3"><a id="__codelineno-45-3" name="__codelineno-45-3" href="#__codelineno-45-3"></a>
</span><span id="__span-45-4"><a id="__codelineno-45-4" name="__codelineno-45-4" href="#__codelineno-45-4"></a># Errors
</span><span id="__span-45-5"><a id="__codelineno-45-5" name="__codelineno-45-5" href="#__codelineno-45-5"></a>src/pages/UsersPage.tsx
</span><span id="__span-45-6"><a id="__codelineno-45-6" name="__codelineno-45-6" href="#__codelineno-45-6"></a> 123:45 error &#39;foo&#39; is assigned a value but never used @typescript-eslint/no-unused-vars
</span><span id="__span-45-7"><a id="__codelineno-45-7" name="__codelineno-45-7" href="#__codelineno-45-7"></a> 200:10 warning Missing dependency in useEffect react-hooks/exhaustive-deps
</span></code></pre></div></p>
<p><strong>Use when:</strong>
- Before committing code
- Enforcing code style
- Finding potential bugs</p>
<h4 id="npm-run-lintfix_1"><code>npm run lint:fix</code><a class="headerlink" href="#npm-run-lintfix_1" title="Permanent link">&para;</a></h4>
<p>Automatically fixes ESLint errors where possible.</p>
<div class="language-bash highlight"><pre><span></span><code><span id="__span-46-1"><a id="__codelineno-46-1" name="__codelineno-46-1" href="#__codelineno-46-1"></a><span class="nb">cd</span><span class="w"> </span>admin
</span><span id="__span-46-2"><a id="__codelineno-46-2" name="__codelineno-46-2" href="#__codelineno-46-2"></a>npm<span class="w"> </span>run<span class="w"> </span>lint:fix
</span></code></pre></div>
<p><strong>What it does:</strong>
- Runs <code>eslint src/ --ext .ts,.tsx --fix</code>
- Auto-fixes style issues
- Reports unfixable errors</p>
<p><strong>Use when:</strong>
- After writing new code
- Cleaning up formatting
- Before commit</p>
<h4 id="npm-run-format_1"><code>npm run format</code><a class="headerlink" href="#npm-run-format_1" title="Permanent link">&para;</a></h4>
<p>Formats code with Prettier.</p>
<div class="language-bash highlight"><pre><span></span><code><span id="__span-47-1"><a id="__codelineno-47-1" name="__codelineno-47-1" href="#__codelineno-47-1"></a><span class="nb">cd</span><span class="w"> </span>admin
</span><span id="__span-47-2"><a id="__codelineno-47-2" name="__codelineno-47-2" href="#__codelineno-47-2"></a>npm<span class="w"> </span>run<span class="w"> </span>format
</span></code></pre></div>
<p><strong>What it does:</strong>
- Runs <code>prettier --write "src/**/*.{ts,tsx,css,json}"</code>
- Formats all source files
- Overwrites files in place</p>
<p><strong>Use when:</strong>
- Standardizing code format
- After merge conflicts
- Team-wide formatting</p>
<h4 id="npm-run-formatcheck_1"><code>npm run format:check</code><a class="headerlink" href="#npm-run-formatcheck_1" title="Permanent link">&para;</a></h4>
<p>Checks if code is formatted correctly (CI).</p>
<div class="language-bash highlight"><pre><span></span><code><span id="__span-48-1"><a id="__codelineno-48-1" name="__codelineno-48-1" href="#__codelineno-48-1"></a><span class="nb">cd</span><span class="w"> </span>admin
</span><span id="__span-48-2"><a id="__codelineno-48-2" name="__codelineno-48-2" href="#__codelineno-48-2"></a>npm<span class="w"> </span>run<span class="w"> </span>format:check
</span></code></pre></div>
<p><strong>What it does:</strong>
- Runs <code>prettier --check "src/**/*.{ts,tsx,css,json}"</code>
- Reports unformatted files
- Does NOT modify files</p>
<p><strong>Use when:</strong>
- In CI/CD pipeline
- Verifying format before commit</p>
<h3 id="testing-scripts_1">Testing Scripts<a class="headerlink" href="#testing-scripts_1" title="Permanent link">&para;</a></h3>
<h4 id="npm-test_1"><code>npm test</code><a class="headerlink" href="#npm-test_1" title="Permanent link">&para;</a></h4>
<p>Runs all tests (when configured).</p>
<div class="language-bash highlight"><pre><span></span><code><span id="__span-49-1"><a id="__codelineno-49-1" name="__codelineno-49-1" href="#__codelineno-49-1"></a><span class="nb">cd</span><span class="w"> </span>admin
</span><span id="__span-49-2"><a id="__codelineno-49-2" name="__codelineno-49-2" href="#__codelineno-49-2"></a>npm<span class="w"> </span><span class="nb">test</span>
</span></code></pre></div>
<p><strong>What it does:</strong>
- Runs Vitest test suite
- Executes <code>*.test.tsx</code> and <code>*.spec.tsx</code> files
- Reports pass/fail</p>
<p><strong>Note:</strong> Tests are part of Phase 15 (in progress).</p>
<h4 id="npm-run-testwatch_1"><code>npm run test:watch</code><a class="headerlink" href="#npm-run-testwatch_1" title="Permanent link">&para;</a></h4>
<p>Runs tests in watch mode.</p>
<div class="language-bash highlight"><pre><span></span><code><span id="__span-50-1"><a id="__codelineno-50-1" name="__codelineno-50-1" href="#__codelineno-50-1"></a><span class="nb">cd</span><span class="w"> </span>admin
</span><span id="__span-50-2"><a id="__codelineno-50-2" name="__codelineno-50-2" href="#__codelineno-50-2"></a>npm<span class="w"> </span>run<span class="w"> </span>test:watch
</span></code></pre></div>
<p><strong>What it does:</strong>
- Runs <code>vitest</code>
- Re-runs tests on file changes</p>
<h4 id="npm-run-testui"><code>npm run test:ui</code><a class="headerlink" href="#npm-run-testui" title="Permanent link">&para;</a></h4>
<p>Runs tests with UI (Vitest UI).</p>
<div class="language-bash highlight"><pre><span></span><code><span id="__span-51-1"><a id="__codelineno-51-1" name="__codelineno-51-1" href="#__codelineno-51-1"></a><span class="nb">cd</span><span class="w"> </span>admin
</span><span id="__span-51-2"><a id="__codelineno-51-2" name="__codelineno-51-2" href="#__codelineno-51-2"></a>npm<span class="w"> </span>run<span class="w"> </span>test:ui
</span></code></pre></div>
<p><strong>What it does:</strong>
- Runs <code>vitest --ui</code>
- Opens browser with test UI
- Shows test results visually</p>
<h4 id="npm-run-testcoverage_1"><code>npm run test:coverage</code><a class="headerlink" href="#npm-run-testcoverage_1" title="Permanent link">&para;</a></h4>
<p>Runs tests with coverage report.</p>
<div class="language-bash highlight"><pre><span></span><code><span id="__span-52-1"><a id="__codelineno-52-1" name="__codelineno-52-1" href="#__codelineno-52-1"></a><span class="nb">cd</span><span class="w"> </span>admin
</span><span id="__span-52-2"><a id="__codelineno-52-2" name="__codelineno-52-2" href="#__codelineno-52-2"></a>npm<span class="w"> </span>run<span class="w"> </span>test:coverage
</span></code></pre></div>
<p><strong>What it does:</strong>
- Runs <code>vitest --coverage</code>
- Generates coverage report in <code>coverage/</code></p>
<h3 id="utility-scripts_1">Utility Scripts<a class="headerlink" href="#utility-scripts_1" title="Permanent link">&para;</a></h3>
<h4 id="npm-run-clean_1"><code>npm run clean</code><a class="headerlink" href="#npm-run-clean_1" title="Permanent link">&para;</a></h4>
<p>Removes build artifacts and cache.</p>
<div class="language-bash highlight"><pre><span></span><code><span id="__span-53-1"><a id="__codelineno-53-1" name="__codelineno-53-1" href="#__codelineno-53-1"></a><span class="nb">cd</span><span class="w"> </span>admin
</span><span id="__span-53-2"><a id="__codelineno-53-2" name="__codelineno-53-2" href="#__codelineno-53-2"></a>npm<span class="w"> </span>run<span class="w"> </span>clean
</span></code></pre></div>
<p><strong>What it does:</strong>
- Deletes <code>dist/</code> directory
- Removes <code>node_modules/.vite/</code> cache
- Removes <code>tsconfig.tsbuildinfo</code></p>
<p><strong>Use when:</strong>
- Starting fresh build
- Fixing build cache issues
- Cleaning up after development</p>
<h2 id="docker-commands">Docker Commands<a class="headerlink" href="#docker-commands" title="Permanent link">&para;</a></h2>
<p>When running services in Docker, use <code>docker compose exec</code> to run npm scripts:</p>
<h3 id="api-in-docker">API in Docker<a class="headerlink" href="#api-in-docker" title="Permanent link">&para;</a></h3>
<div class="language-bash highlight"><pre><span></span><code><span id="__span-54-1"><a id="__codelineno-54-1" name="__codelineno-54-1" href="#__codelineno-54-1"></a><span class="c1"># Development server (already running via docker compose up)</span>
</span><span id="__span-54-2"><a id="__codelineno-54-2" name="__codelineno-54-2" href="#__codelineno-54-2"></a>docker<span class="w"> </span>compose<span class="w"> </span>logs<span class="w"> </span>-f<span class="w"> </span>api
</span><span id="__span-54-3"><a id="__codelineno-54-3" name="__codelineno-54-3" href="#__codelineno-54-3"></a>
</span><span id="__span-54-4"><a id="__codelineno-54-4" name="__codelineno-54-4" href="#__codelineno-54-4"></a><span class="c1"># Type-check</span>
</span><span id="__span-54-5"><a id="__codelineno-54-5" name="__codelineno-54-5" href="#__codelineno-54-5"></a>docker<span class="w"> </span>compose<span class="w"> </span><span class="nb">exec</span><span class="w"> </span>api<span class="w"> </span>npm<span class="w"> </span>run<span class="w"> </span>type-check
</span><span id="__span-54-6"><a id="__codelineno-54-6" name="__codelineno-54-6" href="#__codelineno-54-6"></a>
</span><span id="__span-54-7"><a id="__codelineno-54-7" name="__codelineno-54-7" href="#__codelineno-54-7"></a><span class="c1"># Prisma migrate</span>
</span><span id="__span-54-8"><a id="__codelineno-54-8" name="__codelineno-54-8" href="#__codelineno-54-8"></a>docker<span class="w"> </span>compose<span class="w"> </span><span class="nb">exec</span><span class="w"> </span>api<span class="w"> </span>npx<span class="w"> </span>prisma<span class="w"> </span>migrate<span class="w"> </span>dev<span class="w"> </span>--name<span class="w"> </span>add_field
</span><span id="__span-54-9"><a id="__codelineno-54-9" name="__codelineno-54-9" href="#__codelineno-54-9"></a>
</span><span id="__span-54-10"><a id="__codelineno-54-10" name="__codelineno-54-10" href="#__codelineno-54-10"></a><span class="c1"># Prisma Studio</span>
</span><span id="__span-54-11"><a id="__codelineno-54-11" name="__codelineno-54-11" href="#__codelineno-54-11"></a>docker<span class="w"> </span>compose<span class="w"> </span><span class="nb">exec</span><span class="w"> </span>api<span class="w"> </span>npx<span class="w"> </span>prisma<span class="w"> </span>studio
</span><span id="__span-54-12"><a id="__codelineno-54-12" name="__codelineno-54-12" href="#__codelineno-54-12"></a>
</span><span id="__span-54-13"><a id="__codelineno-54-13" name="__codelineno-54-13" href="#__codelineno-54-13"></a><span class="c1"># Prisma seed</span>
</span><span id="__span-54-14"><a id="__codelineno-54-14" name="__codelineno-54-14" href="#__codelineno-54-14"></a>docker<span class="w"> </span>compose<span class="w"> </span><span class="nb">exec</span><span class="w"> </span>api<span class="w"> </span>npx<span class="w"> </span>prisma<span class="w"> </span>db<span class="w"> </span>seed
</span><span id="__span-54-15"><a id="__codelineno-54-15" name="__codelineno-54-15" href="#__codelineno-54-15"></a>
</span><span id="__span-54-16"><a id="__codelineno-54-16" name="__codelineno-54-16" href="#__codelineno-54-16"></a><span class="c1"># Drizzle push (Media API)</span>
</span><span id="__span-54-17"><a id="__codelineno-54-17" name="__codelineno-54-17" href="#__codelineno-54-17"></a>docker<span class="w"> </span>compose<span class="w"> </span><span class="nb">exec</span><span class="w"> </span>api<span class="w"> </span>npx<span class="w"> </span>drizzle-kit<span class="w"> </span>push
</span><span id="__span-54-18"><a id="__codelineno-54-18" name="__codelineno-54-18" href="#__codelineno-54-18"></a>
</span><span id="__span-54-19"><a id="__codelineno-54-19" name="__codelineno-54-19" href="#__codelineno-54-19"></a><span class="c1"># Lint</span>
</span><span id="__span-54-20"><a id="__codelineno-54-20" name="__codelineno-54-20" href="#__codelineno-54-20"></a>docker<span class="w"> </span>compose<span class="w"> </span><span class="nb">exec</span><span class="w"> </span>api<span class="w"> </span>npm<span class="w"> </span>run<span class="w"> </span>lint
</span><span id="__span-54-21"><a id="__codelineno-54-21" name="__codelineno-54-21" href="#__codelineno-54-21"></a>
</span><span id="__span-54-22"><a id="__codelineno-54-22" name="__codelineno-54-22" href="#__codelineno-54-22"></a><span class="c1"># Format</span>
</span><span id="__span-54-23"><a id="__codelineno-54-23" name="__codelineno-54-23" href="#__codelineno-54-23"></a>docker<span class="w"> </span>compose<span class="w"> </span><span class="nb">exec</span><span class="w"> </span>api<span class="w"> </span>npm<span class="w"> </span>run<span class="w"> </span>format
</span></code></pre></div>
<h3 id="admin-in-docker">Admin in Docker<a class="headerlink" href="#admin-in-docker" title="Permanent link">&para;</a></h3>
<div class="language-bash highlight"><pre><span></span><code><span id="__span-55-1"><a id="__codelineno-55-1" name="__codelineno-55-1" href="#__codelineno-55-1"></a><span class="c1"># Development server (already running via docker compose up)</span>
</span><span id="__span-55-2"><a id="__codelineno-55-2" name="__codelineno-55-2" href="#__codelineno-55-2"></a>docker<span class="w"> </span>compose<span class="w"> </span>logs<span class="w"> </span>-f<span class="w"> </span>admin
</span><span id="__span-55-3"><a id="__codelineno-55-3" name="__codelineno-55-3" href="#__codelineno-55-3"></a>
</span><span id="__span-55-4"><a id="__codelineno-55-4" name="__codelineno-55-4" href="#__codelineno-55-4"></a><span class="c1"># Type-check</span>
</span><span id="__span-55-5"><a id="__codelineno-55-5" name="__codelineno-55-5" href="#__codelineno-55-5"></a>docker<span class="w"> </span>compose<span class="w"> </span><span class="nb">exec</span><span class="w"> </span>admin<span class="w"> </span>npm<span class="w"> </span>run<span class="w"> </span>type-check
</span><span id="__span-55-6"><a id="__codelineno-55-6" name="__codelineno-55-6" href="#__codelineno-55-6"></a>
</span><span id="__span-55-7"><a id="__codelineno-55-7" name="__codelineno-55-7" href="#__codelineno-55-7"></a><span class="c1"># Lint</span>
</span><span id="__span-55-8"><a id="__codelineno-55-8" name="__codelineno-55-8" href="#__codelineno-55-8"></a>docker<span class="w"> </span>compose<span class="w"> </span><span class="nb">exec</span><span class="w"> </span>admin<span class="w"> </span>npm<span class="w"> </span>run<span class="w"> </span>lint
</span><span id="__span-55-9"><a id="__codelineno-55-9" name="__codelineno-55-9" href="#__codelineno-55-9"></a>
</span><span id="__span-55-10"><a id="__codelineno-55-10" name="__codelineno-55-10" href="#__codelineno-55-10"></a><span class="c1"># Build</span>
</span><span id="__span-55-11"><a id="__codelineno-55-11" name="__codelineno-55-11" href="#__codelineno-55-11"></a>docker<span class="w"> </span>compose<span class="w"> </span><span class="nb">exec</span><span class="w"> </span>admin<span class="w"> </span>npm<span class="w"> </span>run<span class="w"> </span>build
</span></code></pre></div>
<h3 id="rebuild-containers">Rebuild Containers<a class="headerlink" href="#rebuild-containers" title="Permanent link">&para;</a></h3>
<div class="language-bash highlight"><pre><span></span><code><span id="__span-56-1"><a id="__codelineno-56-1" name="__codelineno-56-1" href="#__codelineno-56-1"></a><span class="c1"># Rebuild after package.json changes</span>
</span><span id="__span-56-2"><a id="__codelineno-56-2" name="__codelineno-56-2" href="#__codelineno-56-2"></a>docker<span class="w"> </span>compose<span class="w"> </span>build<span class="w"> </span>--no-cache<span class="w"> </span>api<span class="w"> </span>admin
</span><span id="__span-56-3"><a id="__codelineno-56-3" name="__codelineno-56-3" href="#__codelineno-56-3"></a>
</span><span id="__span-56-4"><a id="__codelineno-56-4" name="__codelineno-56-4" href="#__codelineno-56-4"></a><span class="c1"># Restart services</span>
</span><span id="__span-56-5"><a id="__codelineno-56-5" name="__codelineno-56-5" href="#__codelineno-56-5"></a>docker<span class="w"> </span>compose<span class="w"> </span>restart<span class="w"> </span>api<span class="w"> </span>admin
</span></code></pre></div>
<h2 id="script-chaining">Script Chaining<a class="headerlink" href="#script-chaining" title="Permanent link">&para;</a></h2>
<h3 id="sequential-execution">Sequential Execution (&amp;&amp;)<a class="headerlink" href="#sequential-execution" title="Permanent link">&para;</a></h3>
<p>Run scripts in sequence, stop on first failure:</p>
<div class="language-bash highlight"><pre><span></span><code><span id="__span-57-1"><a id="__codelineno-57-1" name="__codelineno-57-1" href="#__codelineno-57-1"></a><span class="c1"># Type-check, then build</span>
</span><span id="__span-57-2"><a id="__codelineno-57-2" name="__codelineno-57-2" href="#__codelineno-57-2"></a><span class="nb">cd</span><span class="w"> </span>api
</span><span id="__span-57-3"><a id="__codelineno-57-3" name="__codelineno-57-3" href="#__codelineno-57-3"></a>npm<span class="w"> </span>run<span class="w"> </span>type-check<span class="w"> </span><span class="o">&amp;&amp;</span><span class="w"> </span>npm<span class="w"> </span>run<span class="w"> </span>build
</span><span id="__span-57-4"><a id="__codelineno-57-4" name="__codelineno-57-4" href="#__codelineno-57-4"></a>
</span><span id="__span-57-5"><a id="__codelineno-57-5" name="__codelineno-57-5" href="#__codelineno-57-5"></a><span class="c1"># Lint, format, type-check</span>
</span><span id="__span-57-6"><a id="__codelineno-57-6" name="__codelineno-57-6" href="#__codelineno-57-6"></a><span class="nb">cd</span><span class="w"> </span>admin
</span><span id="__span-57-7"><a id="__codelineno-57-7" name="__codelineno-57-7" href="#__codelineno-57-7"></a>npm<span class="w"> </span>run<span class="w"> </span>lint<span class="w"> </span><span class="o">&amp;&amp;</span><span class="w"> </span>npm<span class="w"> </span>run<span class="w"> </span>format<span class="w"> </span><span class="o">&amp;&amp;</span><span class="w"> </span>npm<span class="w"> </span>run<span class="w"> </span>type-check
</span><span id="__span-57-8"><a id="__codelineno-57-8" name="__codelineno-57-8" href="#__codelineno-57-8"></a>
</span><span id="__span-57-9"><a id="__codelineno-57-9" name="__codelineno-57-9" href="#__codelineno-57-9"></a><span class="c1"># Full quality check before commit</span>
</span><span id="__span-57-10"><a id="__codelineno-57-10" name="__codelineno-57-10" href="#__codelineno-57-10"></a><span class="nb">cd</span><span class="w"> </span>api
</span><span id="__span-57-11"><a id="__codelineno-57-11" name="__codelineno-57-11" href="#__codelineno-57-11"></a>npm<span class="w"> </span>run<span class="w"> </span>lint:fix<span class="w"> </span><span class="o">&amp;&amp;</span><span class="w"> </span>npm<span class="w"> </span>run<span class="w"> </span>format<span class="w"> </span><span class="o">&amp;&amp;</span><span class="w"> </span>npm<span class="w"> </span>run<span class="w"> </span>type-check<span class="w"> </span><span class="o">&amp;&amp;</span><span class="w"> </span>npm<span class="w"> </span><span class="nb">test</span>
</span></code></pre></div>
<h3 id="parallel-execution-npm-run-all">Parallel Execution (npm-run-all)<a class="headerlink" href="#parallel-execution-npm-run-all" title="Permanent link">&para;</a></h3>
<p>Install <code>npm-run-all</code> for parallel script execution:</p>
<div class="language-bash highlight"><pre><span></span><code><span id="__span-58-1"><a id="__codelineno-58-1" name="__codelineno-58-1" href="#__codelineno-58-1"></a><span class="c1"># Install (project root)</span>
</span><span id="__span-58-2"><a id="__codelineno-58-2" name="__codelineno-58-2" href="#__codelineno-58-2"></a>npm<span class="w"> </span>install<span class="w"> </span>--save-dev<span class="w"> </span>npm-run-all
</span><span id="__span-58-3"><a id="__codelineno-58-3" name="__codelineno-58-3" href="#__codelineno-58-3"></a>
</span><span id="__span-58-4"><a id="__codelineno-58-4" name="__codelineno-58-4" href="#__codelineno-58-4"></a><span class="c1"># Add to package.json</span>
</span><span id="__span-58-5"><a id="__codelineno-58-5" name="__codelineno-58-5" href="#__codelineno-58-5"></a><span class="o">{</span>
</span><span id="__span-58-6"><a id="__codelineno-58-6" name="__codelineno-58-6" href="#__codelineno-58-6"></a><span class="w"> </span><span class="s2">&quot;scripts&quot;</span>:<span class="w"> </span><span class="o">{</span>
</span><span id="__span-58-7"><a id="__codelineno-58-7" name="__codelineno-58-7" href="#__codelineno-58-7"></a><span class="w"> </span><span class="s2">&quot;check&quot;</span>:<span class="w"> </span><span class="s2">&quot;npm-run-all --parallel type-check lint test&quot;</span>
</span><span id="__span-58-8"><a id="__codelineno-58-8" name="__codelineno-58-8" href="#__codelineno-58-8"></a><span class="w"> </span><span class="o">}</span>
</span><span id="__span-58-9"><a id="__codelineno-58-9" name="__codelineno-58-9" href="#__codelineno-58-9"></a><span class="o">}</span>
</span><span id="__span-58-10"><a id="__codelineno-58-10" name="__codelineno-58-10" href="#__codelineno-58-10"></a>
</span><span id="__span-58-11"><a id="__codelineno-58-11" name="__codelineno-58-11" href="#__codelineno-58-11"></a><span class="c1"># Run all checks in parallel</span>
</span><span id="__span-58-12"><a id="__codelineno-58-12" name="__codelineno-58-12" href="#__codelineno-58-12"></a>npm<span class="w"> </span>run<span class="w"> </span>check
</span></code></pre></div>
<h3 id="prepost-hooks">Pre/Post Hooks<a class="headerlink" href="#prepost-hooks" title="Permanent link">&para;</a></h3>
<p>npm automatically runs <code>pre*</code> and <code>post*</code> scripts:</p>
<div class="language-bash highlight"><pre><span></span><code><span id="__span-59-1"><a id="__codelineno-59-1" name="__codelineno-59-1" href="#__codelineno-59-1"></a><span class="c1"># package.json</span>
</span><span id="__span-59-2"><a id="__codelineno-59-2" name="__codelineno-59-2" href="#__codelineno-59-2"></a><span class="o">{</span>
</span><span id="__span-59-3"><a id="__codelineno-59-3" name="__codelineno-59-3" href="#__codelineno-59-3"></a><span class="w"> </span><span class="s2">&quot;scripts&quot;</span>:<span class="w"> </span><span class="o">{</span>
</span><span id="__span-59-4"><a id="__codelineno-59-4" name="__codelineno-59-4" href="#__codelineno-59-4"></a><span class="w"> </span><span class="s2">&quot;prebuild&quot;</span>:<span class="w"> </span><span class="s2">&quot;npm run clean&quot;</span>,
</span><span id="__span-59-5"><a id="__codelineno-59-5" name="__codelineno-59-5" href="#__codelineno-59-5"></a><span class="w"> </span><span class="s2">&quot;build&quot;</span>:<span class="w"> </span><span class="s2">&quot;tsc --build&quot;</span>,
</span><span id="__span-59-6"><a id="__codelineno-59-6" name="__codelineno-59-6" href="#__codelineno-59-6"></a><span class="w"> </span><span class="s2">&quot;postbuild&quot;</span>:<span class="w"> </span><span class="s2">&quot;npm run copy-assets&quot;</span>
</span><span id="__span-59-7"><a id="__codelineno-59-7" name="__codelineno-59-7" href="#__codelineno-59-7"></a><span class="w"> </span><span class="o">}</span>
</span><span id="__span-59-8"><a id="__codelineno-59-8" name="__codelineno-59-8" href="#__codelineno-59-8"></a><span class="o">}</span>
</span><span id="__span-59-9"><a id="__codelineno-59-9" name="__codelineno-59-9" href="#__codelineno-59-9"></a>
</span><span id="__span-59-10"><a id="__codelineno-59-10" name="__codelineno-59-10" href="#__codelineno-59-10"></a><span class="c1"># Running npm run build executes:</span>
</span><span id="__span-59-11"><a id="__codelineno-59-11" name="__codelineno-59-11" href="#__codelineno-59-11"></a><span class="c1"># 1. npm run prebuild (clean)</span>
</span><span id="__span-59-12"><a id="__codelineno-59-12" name="__codelineno-59-12" href="#__codelineno-59-12"></a><span class="c1"># 2. npm run build (tsc)</span>
</span><span id="__span-59-13"><a id="__codelineno-59-13" name="__codelineno-59-13" href="#__codelineno-59-13"></a><span class="c1"># 3. npm run postbuild (copy-assets)</span>
</span></code></pre></div>
<h2 id="common-script-combinations">Common Script Combinations<a class="headerlink" href="#common-script-combinations" title="Permanent link">&para;</a></h2>
<h3 id="full-development-setup">Full Development Setup<a class="headerlink" href="#full-development-setup" title="Permanent link">&para;</a></h3>
<div class="language-bash highlight"><pre><span></span><code><span id="__span-60-1"><a id="__codelineno-60-1" name="__codelineno-60-1" href="#__codelineno-60-1"></a><span class="c1"># 1. Install dependencies</span>
</span><span id="__span-60-2"><a id="__codelineno-60-2" name="__codelineno-60-2" href="#__codelineno-60-2"></a><span class="nb">cd</span><span class="w"> </span>api<span class="w"> </span><span class="o">&amp;&amp;</span><span class="w"> </span>npm<span class="w"> </span>install<span class="w"> </span><span class="o">&amp;&amp;</span><span class="w"> </span><span class="nb">cd</span><span class="w"> </span>..
</span><span id="__span-60-3"><a id="__codelineno-60-3" name="__codelineno-60-3" href="#__codelineno-60-3"></a><span class="nb">cd</span><span class="w"> </span>admin<span class="w"> </span><span class="o">&amp;&amp;</span><span class="w"> </span>npm<span class="w"> </span>install<span class="w"> </span><span class="o">&amp;&amp;</span><span class="w"> </span><span class="nb">cd</span><span class="w"> </span>..
</span><span id="__span-60-4"><a id="__codelineno-60-4" name="__codelineno-60-4" href="#__codelineno-60-4"></a>
</span><span id="__span-60-5"><a id="__codelineno-60-5" name="__codelineno-60-5" href="#__codelineno-60-5"></a><span class="c1"># 2. Setup database</span>
</span><span id="__span-60-6"><a id="__codelineno-60-6" name="__codelineno-60-6" href="#__codelineno-60-6"></a><span class="nb">cd</span><span class="w"> </span>api
</span><span id="__span-60-7"><a id="__codelineno-60-7" name="__codelineno-60-7" href="#__codelineno-60-7"></a>npx<span class="w"> </span>prisma<span class="w"> </span>migrate<span class="w"> </span>deploy
</span><span id="__span-60-8"><a id="__codelineno-60-8" name="__codelineno-60-8" href="#__codelineno-60-8"></a>npx<span class="w"> </span>prisma<span class="w"> </span>db<span class="w"> </span>seed
</span><span id="__span-60-9"><a id="__codelineno-60-9" name="__codelineno-60-9" href="#__codelineno-60-9"></a><span class="nb">cd</span><span class="w"> </span>..
</span><span id="__span-60-10"><a id="__codelineno-60-10" name="__codelineno-60-10" href="#__codelineno-60-10"></a>
</span><span id="__span-60-11"><a id="__codelineno-60-11" name="__codelineno-60-11" href="#__codelineno-60-11"></a><span class="c1"># 3. Start development servers</span>
</span><span id="__span-60-12"><a id="__codelineno-60-12" name="__codelineno-60-12" href="#__codelineno-60-12"></a><span class="c1"># Option A: Docker</span>
</span><span id="__span-60-13"><a id="__codelineno-60-13" name="__codelineno-60-13" href="#__codelineno-60-13"></a>docker<span class="w"> </span>compose<span class="w"> </span>up<span class="w"> </span>-d<span class="w"> </span>api<span class="w"> </span>admin
</span><span id="__span-60-14"><a id="__codelineno-60-14" name="__codelineno-60-14" href="#__codelineno-60-14"></a>
</span><span id="__span-60-15"><a id="__codelineno-60-15" name="__codelineno-60-15" href="#__codelineno-60-15"></a><span class="c1"># Option B: Local</span>
</span><span id="__span-60-16"><a id="__codelineno-60-16" name="__codelineno-60-16" href="#__codelineno-60-16"></a><span class="nb">cd</span><span class="w"> </span>api<span class="w"> </span><span class="o">&amp;&amp;</span><span class="w"> </span>npm<span class="w"> </span>run<span class="w"> </span>dev<span class="w"> </span><span class="c1"># Terminal 1</span>
</span><span id="__span-60-17"><a id="__codelineno-60-17" name="__codelineno-60-17" href="#__codelineno-60-17"></a><span class="nb">cd</span><span class="w"> </span>admin<span class="w"> </span><span class="o">&amp;&amp;</span><span class="w"> </span>npm<span class="w"> </span>run<span class="w"> </span>dev<span class="w"> </span><span class="c1"># Terminal 2</span>
</span></code></pre></div>
<h3 id="pre-commit-quality-check">Pre-Commit Quality Check<a class="headerlink" href="#pre-commit-quality-check" title="Permanent link">&para;</a></h3>
<div class="language-bash highlight"><pre><span></span><code><span id="__span-61-1"><a id="__codelineno-61-1" name="__codelineno-61-1" href="#__codelineno-61-1"></a><span class="c1"># API quality check</span>
</span><span id="__span-61-2"><a id="__codelineno-61-2" name="__codelineno-61-2" href="#__codelineno-61-2"></a><span class="nb">cd</span><span class="w"> </span>api
</span><span id="__span-61-3"><a id="__codelineno-61-3" name="__codelineno-61-3" href="#__codelineno-61-3"></a>npm<span class="w"> </span>run<span class="w"> </span>lint:fix
</span><span id="__span-61-4"><a id="__codelineno-61-4" name="__codelineno-61-4" href="#__codelineno-61-4"></a>npm<span class="w"> </span>run<span class="w"> </span>format
</span><span id="__span-61-5"><a id="__codelineno-61-5" name="__codelineno-61-5" href="#__codelineno-61-5"></a>npm<span class="w"> </span>run<span class="w"> </span>type-check
</span><span id="__span-61-6"><a id="__codelineno-61-6" name="__codelineno-61-6" href="#__codelineno-61-6"></a><span class="c1"># npm test # When tests available</span>
</span><span id="__span-61-7"><a id="__codelineno-61-7" name="__codelineno-61-7" href="#__codelineno-61-7"></a><span class="nb">cd</span><span class="w"> </span>..
</span><span id="__span-61-8"><a id="__codelineno-61-8" name="__codelineno-61-8" href="#__codelineno-61-8"></a>
</span><span id="__span-61-9"><a id="__codelineno-61-9" name="__codelineno-61-9" href="#__codelineno-61-9"></a><span class="c1"># Admin quality check</span>
</span><span id="__span-61-10"><a id="__codelineno-61-10" name="__codelineno-61-10" href="#__codelineno-61-10"></a><span class="nb">cd</span><span class="w"> </span>admin
</span><span id="__span-61-11"><a id="__codelineno-61-11" name="__codelineno-61-11" href="#__codelineno-61-11"></a>npm<span class="w"> </span>run<span class="w"> </span>lint:fix
</span><span id="__span-61-12"><a id="__codelineno-61-12" name="__codelineno-61-12" href="#__codelineno-61-12"></a>npm<span class="w"> </span>run<span class="w"> </span>format
</span><span id="__span-61-13"><a id="__codelineno-61-13" name="__codelineno-61-13" href="#__codelineno-61-13"></a>npm<span class="w"> </span>run<span class="w"> </span>type-check
</span><span id="__span-61-14"><a id="__codelineno-61-14" name="__codelineno-61-14" href="#__codelineno-61-14"></a><span class="c1"># npm test # When tests available</span>
</span><span id="__span-61-15"><a id="__codelineno-61-15" name="__codelineno-61-15" href="#__codelineno-61-15"></a><span class="nb">cd</span><span class="w"> </span>..
</span><span id="__span-61-16"><a id="__codelineno-61-16" name="__codelineno-61-16" href="#__codelineno-61-16"></a>
</span><span id="__span-61-17"><a id="__codelineno-61-17" name="__codelineno-61-17" href="#__codelineno-61-17"></a><span class="c1"># Commit if all pass</span>
</span><span id="__span-61-18"><a id="__codelineno-61-18" name="__codelineno-61-18" href="#__codelineno-61-18"></a>git<span class="w"> </span>add<span class="w"> </span>.
</span><span id="__span-61-19"><a id="__codelineno-61-19" name="__codelineno-61-19" href="#__codelineno-61-19"></a>git<span class="w"> </span>commit<span class="w"> </span>-m<span class="w"> </span><span class="s2">&quot;feat: add new feature&quot;</span>
</span></code></pre></div>
<h3 id="production-build">Production Build<a class="headerlink" href="#production-build" title="Permanent link">&para;</a></h3>
<div class="language-bash highlight"><pre><span></span><code><span id="__span-62-1"><a id="__codelineno-62-1" name="__codelineno-62-1" href="#__codelineno-62-1"></a><span class="c1"># Build API</span>
</span><span id="__span-62-2"><a id="__codelineno-62-2" name="__codelineno-62-2" href="#__codelineno-62-2"></a><span class="nb">cd</span><span class="w"> </span>api
</span><span id="__span-62-3"><a id="__codelineno-62-3" name="__codelineno-62-3" href="#__codelineno-62-3"></a>npm<span class="w"> </span>run<span class="w"> </span>clean
</span><span id="__span-62-4"><a id="__codelineno-62-4" name="__codelineno-62-4" href="#__codelineno-62-4"></a>npm<span class="w"> </span>run<span class="w"> </span>build
</span><span id="__span-62-5"><a id="__codelineno-62-5" name="__codelineno-62-5" href="#__codelineno-62-5"></a><span class="nb">cd</span><span class="w"> </span>..
</span><span id="__span-62-6"><a id="__codelineno-62-6" name="__codelineno-62-6" href="#__codelineno-62-6"></a>
</span><span id="__span-62-7"><a id="__codelineno-62-7" name="__codelineno-62-7" href="#__codelineno-62-7"></a><span class="c1"># Build Admin</span>
</span><span id="__span-62-8"><a id="__codelineno-62-8" name="__codelineno-62-8" href="#__codelineno-62-8"></a><span class="nb">cd</span><span class="w"> </span>admin
</span><span id="__span-62-9"><a id="__codelineno-62-9" name="__codelineno-62-9" href="#__codelineno-62-9"></a>npm<span class="w"> </span>run<span class="w"> </span>clean
</span><span id="__span-62-10"><a id="__codelineno-62-10" name="__codelineno-62-10" href="#__codelineno-62-10"></a>npm<span class="w"> </span>run<span class="w"> </span>build
</span><span id="__span-62-11"><a id="__codelineno-62-11" name="__codelineno-62-11" href="#__codelineno-62-11"></a><span class="nb">cd</span><span class="w"> </span>..
</span><span id="__span-62-12"><a id="__codelineno-62-12" name="__codelineno-62-12" href="#__codelineno-62-12"></a>
</span><span id="__span-62-13"><a id="__codelineno-62-13" name="__codelineno-62-13" href="#__codelineno-62-13"></a><span class="c1"># Build Docker images</span>
</span><span id="__span-62-14"><a id="__codelineno-62-14" name="__codelineno-62-14" href="#__codelineno-62-14"></a>docker<span class="w"> </span>compose<span class="w"> </span>build<span class="w"> </span>api<span class="w"> </span>admin
</span><span id="__span-62-15"><a id="__codelineno-62-15" name="__codelineno-62-15" href="#__codelineno-62-15"></a>
</span><span id="__span-62-16"><a id="__codelineno-62-16" name="__codelineno-62-16" href="#__codelineno-62-16"></a><span class="c1"># Start production services</span>
</span><span id="__span-62-17"><a id="__codelineno-62-17" name="__codelineno-62-17" href="#__codelineno-62-17"></a>docker<span class="w"> </span>compose<span class="w"> </span>-f<span class="w"> </span>docker-compose.yml<span class="w"> </span>up<span class="w"> </span>-d<span class="w"> </span>api<span class="w"> </span>admin
</span></code></pre></div>
<h3 id="database-migration-workflow">Database Migration Workflow<a class="headerlink" href="#database-migration-workflow" title="Permanent link">&para;</a></h3>
<div class="language-bash highlight"><pre><span></span><code><span id="__span-63-1"><a id="__codelineno-63-1" name="__codelineno-63-1" href="#__codelineno-63-1"></a><span class="c1"># 1. Edit schema</span>
</span><span id="__span-63-2"><a id="__codelineno-63-2" name="__codelineno-63-2" href="#__codelineno-63-2"></a><span class="nb">cd</span><span class="w"> </span>api
</span><span id="__span-63-3"><a id="__codelineno-63-3" name="__codelineno-63-3" href="#__codelineno-63-3"></a>vi<span class="w"> </span>prisma/schema.prisma
</span><span id="__span-63-4"><a id="__codelineno-63-4" name="__codelineno-63-4" href="#__codelineno-63-4"></a>
</span><span id="__span-63-5"><a id="__codelineno-63-5" name="__codelineno-63-5" href="#__codelineno-63-5"></a><span class="c1"># 2. Validate schema</span>
</span><span id="__span-63-6"><a id="__codelineno-63-6" name="__codelineno-63-6" href="#__codelineno-63-6"></a>npx<span class="w"> </span>prisma<span class="w"> </span>validate
</span><span id="__span-63-7"><a id="__codelineno-63-7" name="__codelineno-63-7" href="#__codelineno-63-7"></a>
</span><span id="__span-63-8"><a id="__codelineno-63-8" name="__codelineno-63-8" href="#__codelineno-63-8"></a><span class="c1"># 3. Create migration</span>
</span><span id="__span-63-9"><a id="__codelineno-63-9" name="__codelineno-63-9" href="#__codelineno-63-9"></a>npx<span class="w"> </span>prisma<span class="w"> </span>migrate<span class="w"> </span>dev<span class="w"> </span>--name<span class="w"> </span>add_user_field
</span><span id="__span-63-10"><a id="__codelineno-63-10" name="__codelineno-63-10" href="#__codelineno-63-10"></a>
</span><span id="__span-63-11"><a id="__codelineno-63-11" name="__codelineno-63-11" href="#__codelineno-63-11"></a><span class="c1"># 4. Verify migration SQL</span>
</span><span id="__span-63-12"><a id="__codelineno-63-12" name="__codelineno-63-12" href="#__codelineno-63-12"></a>cat<span class="w"> </span>prisma/migrations/20260213000000_add_user_field/migration.sql
</span><span id="__span-63-13"><a id="__codelineno-63-13" name="__codelineno-63-13" href="#__codelineno-63-13"></a>
</span><span id="__span-63-14"><a id="__codelineno-63-14" name="__codelineno-63-14" href="#__codelineno-63-14"></a><span class="c1"># 5. Test on clean database</span>
</span><span id="__span-63-15"><a id="__codelineno-63-15" name="__codelineno-63-15" href="#__codelineno-63-15"></a>npx<span class="w"> </span>prisma<span class="w"> </span>migrate<span class="w"> </span>reset<span class="w"> </span><span class="c1"># WARNING: Deletes data</span>
</span><span id="__span-63-16"><a id="__codelineno-63-16" name="__codelineno-63-16" href="#__codelineno-63-16"></a>npx<span class="w"> </span>prisma<span class="w"> </span>migrate<span class="w"> </span>deploy
</span><span id="__span-63-17"><a id="__codelineno-63-17" name="__codelineno-63-17" href="#__codelineno-63-17"></a>npx<span class="w"> </span>prisma<span class="w"> </span>db<span class="w"> </span>seed
</span><span id="__span-63-18"><a id="__codelineno-63-18" name="__codelineno-63-18" href="#__codelineno-63-18"></a>
</span><span id="__span-63-19"><a id="__codelineno-63-19" name="__codelineno-63-19" href="#__codelineno-63-19"></a><span class="c1"># 6. Commit migration</span>
</span><span id="__span-63-20"><a id="__codelineno-63-20" name="__codelineno-63-20" href="#__codelineno-63-20"></a>git<span class="w"> </span>add<span class="w"> </span>prisma/migrations/<span class="w"> </span>prisma/schema.prisma
</span><span id="__span-63-21"><a id="__codelineno-63-21" name="__codelineno-63-21" href="#__codelineno-63-21"></a>git<span class="w"> </span>commit<span class="w"> </span>-m<span class="w"> </span><span class="s2">&quot;feat(db): add field to User model&quot;</span>
</span></code></pre></div>
<h3 id="database-inspection">Database Inspection<a class="headerlink" href="#database-inspection" title="Permanent link">&para;</a></h3>
<div class="language-bash highlight"><pre><span></span><code><span id="__span-64-1"><a id="__codelineno-64-1" name="__codelineno-64-1" href="#__codelineno-64-1"></a><span class="c1"># Prisma Studio (main API)</span>
</span><span id="__span-64-2"><a id="__codelineno-64-2" name="__codelineno-64-2" href="#__codelineno-64-2"></a><span class="nb">cd</span><span class="w"> </span>api
</span><span id="__span-64-3"><a id="__codelineno-64-3" name="__codelineno-64-3" href="#__codelineno-64-3"></a>npx<span class="w"> </span>prisma<span class="w"> </span>studio
</span><span id="__span-64-4"><a id="__codelineno-64-4" name="__codelineno-64-4" href="#__codelineno-64-4"></a><span class="c1"># Open http://localhost:5555</span>
</span><span id="__span-64-5"><a id="__codelineno-64-5" name="__codelineno-64-5" href="#__codelineno-64-5"></a>
</span><span id="__span-64-6"><a id="__codelineno-64-6" name="__codelineno-64-6" href="#__codelineno-64-6"></a><span class="c1"># Drizzle Studio (Media API)</span>
</span><span id="__span-64-7"><a id="__codelineno-64-7" name="__codelineno-64-7" href="#__codelineno-64-7"></a><span class="nb">cd</span><span class="w"> </span>api
</span><span id="__span-64-8"><a id="__codelineno-64-8" name="__codelineno-64-8" href="#__codelineno-64-8"></a>npx<span class="w"> </span>drizzle-kit<span class="w"> </span>studio
</span><span id="__span-64-9"><a id="__codelineno-64-9" name="__codelineno-64-9" href="#__codelineno-64-9"></a><span class="c1"># Open http://localhost:4983</span>
</span><span id="__span-64-10"><a id="__codelineno-64-10" name="__codelineno-64-10" href="#__codelineno-64-10"></a>
</span><span id="__span-64-11"><a id="__codelineno-64-11" name="__codelineno-64-11" href="#__codelineno-64-11"></a><span class="c1"># Direct PostgreSQL query</span>
</span><span id="__span-64-12"><a id="__codelineno-64-12" name="__codelineno-64-12" href="#__codelineno-64-12"></a>docker<span class="w"> </span>compose<span class="w"> </span><span class="nb">exec</span><span class="w"> </span>v2-postgres<span class="w"> </span>psql<span class="w"> </span>-U<span class="w"> </span>changemaker_v2<span class="w"> </span>-d<span class="w"> </span>changemaker_v2_db
</span><span id="__span-64-13"><a id="__codelineno-64-13" name="__codelineno-64-13" href="#__codelineno-64-13"></a><span class="c1"># Run SQL queries</span>
</span></code></pre></div>
<h3 id="full-type-check">Full Type Check<a class="headerlink" href="#full-type-check" title="Permanent link">&para;</a></h3>
<div class="language-bash highlight"><pre><span></span><code><span id="__span-65-1"><a id="__codelineno-65-1" name="__codelineno-65-1" href="#__codelineno-65-1"></a><span class="c1"># Type-check both projects</span>
</span><span id="__span-65-2"><a id="__codelineno-65-2" name="__codelineno-65-2" href="#__codelineno-65-2"></a><span class="nb">cd</span><span class="w"> </span>api<span class="w"> </span><span class="o">&amp;&amp;</span><span class="w"> </span>npx<span class="w"> </span>tsc<span class="w"> </span>--noEmit<span class="w"> </span><span class="o">&amp;&amp;</span><span class="w"> </span><span class="nb">cd</span><span class="w"> </span>..
</span><span id="__span-65-3"><a id="__codelineno-65-3" name="__codelineno-65-3" href="#__codelineno-65-3"></a><span class="nb">cd</span><span class="w"> </span>admin<span class="w"> </span><span class="o">&amp;&amp;</span><span class="w"> </span>npx<span class="w"> </span>tsc<span class="w"> </span>--noEmit<span class="w"> </span><span class="o">&amp;&amp;</span><span class="w"> </span><span class="nb">cd</span><span class="w"> </span>..
</span><span id="__span-65-4"><a id="__codelineno-65-4" name="__codelineno-65-4" href="#__codelineno-65-4"></a>
</span><span id="__span-65-5"><a id="__codelineno-65-5" name="__codelineno-65-5" href="#__codelineno-65-5"></a><span class="c1"># Or create root script (package.json in project root)</span>
</span><span id="__span-65-6"><a id="__codelineno-65-6" name="__codelineno-65-6" href="#__codelineno-65-6"></a><span class="o">{</span>
</span><span id="__span-65-7"><a id="__codelineno-65-7" name="__codelineno-65-7" href="#__codelineno-65-7"></a><span class="w"> </span><span class="s2">&quot;scripts&quot;</span>:<span class="w"> </span><span class="o">{</span>
</span><span id="__span-65-8"><a id="__codelineno-65-8" name="__codelineno-65-8" href="#__codelineno-65-8"></a><span class="w"> </span><span class="s2">&quot;type-check&quot;</span>:<span class="w"> </span><span class="s2">&quot;cd api &amp;&amp; npm run type-check &amp;&amp; cd ../admin &amp;&amp; npm run type-check&quot;</span>
</span><span id="__span-65-9"><a id="__codelineno-65-9" name="__codelineno-65-9" href="#__codelineno-65-9"></a><span class="w"> </span><span class="o">}</span>
</span><span id="__span-65-10"><a id="__codelineno-65-10" name="__codelineno-65-10" href="#__codelineno-65-10"></a><span class="o">}</span>
</span><span id="__span-65-11"><a id="__codelineno-65-11" name="__codelineno-65-11" href="#__codelineno-65-11"></a>
</span><span id="__span-65-12"><a id="__codelineno-65-12" name="__codelineno-65-12" href="#__codelineno-65-12"></a><span class="c1"># Run from root</span>
</span><span id="__span-65-13"><a id="__codelineno-65-13" name="__codelineno-65-13" href="#__codelineno-65-13"></a>npm<span class="w"> </span>run<span class="w"> </span>type-check
</span></code></pre></div>
<h2 id="cicd-integration">CI/CD Integration<a class="headerlink" href="#cicd-integration" title="Permanent link">&para;</a></h2>
<h3 id="github-actions-example">GitHub Actions Example<a class="headerlink" href="#github-actions-example" title="Permanent link">&para;</a></h3>
<div class="language-yaml highlight"><pre><span></span><code><span id="__span-66-1"><a id="__codelineno-66-1" name="__codelineno-66-1" href="#__codelineno-66-1"></a><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">CI</span>
</span><span id="__span-66-2"><a id="__codelineno-66-2" name="__codelineno-66-2" href="#__codelineno-66-2"></a>
</span><span id="__span-66-3"><a id="__codelineno-66-3" name="__codelineno-66-3" href="#__codelineno-66-3"></a><span class="nt">on</span><span class="p">:</span><span class="w"> </span><span class="p p-Indicator">[</span><span class="nv">push</span><span class="p p-Indicator">,</span><span class="w"> </span><span class="nv">pull_request</span><span class="p p-Indicator">]</span>
</span><span id="__span-66-4"><a id="__codelineno-66-4" name="__codelineno-66-4" href="#__codelineno-66-4"></a>
</span><span id="__span-66-5"><a id="__codelineno-66-5" name="__codelineno-66-5" href="#__codelineno-66-5"></a><span class="nt">jobs</span><span class="p">:</span>
</span><span id="__span-66-6"><a id="__codelineno-66-6" name="__codelineno-66-6" href="#__codelineno-66-6"></a><span class="w"> </span><span class="nt">api</span><span class="p">:</span>
</span><span id="__span-66-7"><a id="__codelineno-66-7" name="__codelineno-66-7" href="#__codelineno-66-7"></a><span class="w"> </span><span class="nt">runs-on</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">ubuntu-latest</span>
</span><span id="__span-66-8"><a id="__codelineno-66-8" name="__codelineno-66-8" href="#__codelineno-66-8"></a><span class="w"> </span><span class="nt">steps</span><span class="p">:</span>
</span><span id="__span-66-9"><a id="__codelineno-66-9" name="__codelineno-66-9" href="#__codelineno-66-9"></a><span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="nt">uses</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">actions/checkout@v3</span>
</span><span id="__span-66-10"><a id="__codelineno-66-10" name="__codelineno-66-10" href="#__codelineno-66-10"></a><span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="nt">uses</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">actions/setup-node@v3</span>
</span><span id="__span-66-11"><a id="__codelineno-66-11" name="__codelineno-66-11" href="#__codelineno-66-11"></a><span class="w"> </span><span class="nt">with</span><span class="p">:</span>
</span><span id="__span-66-12"><a id="__codelineno-66-12" name="__codelineno-66-12" href="#__codelineno-66-12"></a><span class="w"> </span><span class="nt">node-version</span><span class="p">:</span><span class="w"> </span><span class="s">&#39;20&#39;</span>
</span><span id="__span-66-13"><a id="__codelineno-66-13" name="__codelineno-66-13" href="#__codelineno-66-13"></a>
</span><span id="__span-66-14"><a id="__codelineno-66-14" name="__codelineno-66-14" href="#__codelineno-66-14"></a><span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">Install dependencies</span>
</span><span id="__span-66-15"><a id="__codelineno-66-15" name="__codelineno-66-15" href="#__codelineno-66-15"></a><span class="w"> </span><span class="nt">working-directory</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">./api</span>
</span><span id="__span-66-16"><a id="__codelineno-66-16" name="__codelineno-66-16" href="#__codelineno-66-16"></a><span class="w"> </span><span class="nt">run</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">npm ci</span>
</span><span id="__span-66-17"><a id="__codelineno-66-17" name="__codelineno-66-17" href="#__codelineno-66-17"></a>
</span><span id="__span-66-18"><a id="__codelineno-66-18" name="__codelineno-66-18" href="#__codelineno-66-18"></a><span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">Type check</span>
</span><span id="__span-66-19"><a id="__codelineno-66-19" name="__codelineno-66-19" href="#__codelineno-66-19"></a><span class="w"> </span><span class="nt">working-directory</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">./api</span>
</span><span id="__span-66-20"><a id="__codelineno-66-20" name="__codelineno-66-20" href="#__codelineno-66-20"></a><span class="w"> </span><span class="nt">run</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">npm run type-check</span>
</span><span id="__span-66-21"><a id="__codelineno-66-21" name="__codelineno-66-21" href="#__codelineno-66-21"></a>
</span><span id="__span-66-22"><a id="__codelineno-66-22" name="__codelineno-66-22" href="#__codelineno-66-22"></a><span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">Lint</span>
</span><span id="__span-66-23"><a id="__codelineno-66-23" name="__codelineno-66-23" href="#__codelineno-66-23"></a><span class="w"> </span><span class="nt">working-directory</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">./api</span>
</span><span id="__span-66-24"><a id="__codelineno-66-24" name="__codelineno-66-24" href="#__codelineno-66-24"></a><span class="w"> </span><span class="nt">run</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">npm run lint</span>
</span><span id="__span-66-25"><a id="__codelineno-66-25" name="__codelineno-66-25" href="#__codelineno-66-25"></a>
</span><span id="__span-66-26"><a id="__codelineno-66-26" name="__codelineno-66-26" href="#__codelineno-66-26"></a><span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">Format check</span>
</span><span id="__span-66-27"><a id="__codelineno-66-27" name="__codelineno-66-27" href="#__codelineno-66-27"></a><span class="w"> </span><span class="nt">working-directory</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">./api</span>
</span><span id="__span-66-28"><a id="__codelineno-66-28" name="__codelineno-66-28" href="#__codelineno-66-28"></a><span class="w"> </span><span class="nt">run</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">npm run format:check</span>
</span><span id="__span-66-29"><a id="__codelineno-66-29" name="__codelineno-66-29" href="#__codelineno-66-29"></a>
</span><span id="__span-66-30"><a id="__codelineno-66-30" name="__codelineno-66-30" href="#__codelineno-66-30"></a><span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">Test</span>
</span><span id="__span-66-31"><a id="__codelineno-66-31" name="__codelineno-66-31" href="#__codelineno-66-31"></a><span class="w"> </span><span class="nt">working-directory</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">./api</span>
</span><span id="__span-66-32"><a id="__codelineno-66-32" name="__codelineno-66-32" href="#__codelineno-66-32"></a><span class="w"> </span><span class="nt">run</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">npm test</span>
</span><span id="__span-66-33"><a id="__codelineno-66-33" name="__codelineno-66-33" href="#__codelineno-66-33"></a>
</span><span id="__span-66-34"><a id="__codelineno-66-34" name="__codelineno-66-34" href="#__codelineno-66-34"></a><span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">Build</span>
</span><span id="__span-66-35"><a id="__codelineno-66-35" name="__codelineno-66-35" href="#__codelineno-66-35"></a><span class="w"> </span><span class="nt">working-directory</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">./api</span>
</span><span id="__span-66-36"><a id="__codelineno-66-36" name="__codelineno-66-36" href="#__codelineno-66-36"></a><span class="w"> </span><span class="nt">run</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">npm run build</span>
</span><span id="__span-66-37"><a id="__codelineno-66-37" name="__codelineno-66-37" href="#__codelineno-66-37"></a>
</span><span id="__span-66-38"><a id="__codelineno-66-38" name="__codelineno-66-38" href="#__codelineno-66-38"></a><span class="w"> </span><span class="nt">admin</span><span class="p">:</span>
</span><span id="__span-66-39"><a id="__codelineno-66-39" name="__codelineno-66-39" href="#__codelineno-66-39"></a><span class="w"> </span><span class="nt">runs-on</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">ubuntu-latest</span>
</span><span id="__span-66-40"><a id="__codelineno-66-40" name="__codelineno-66-40" href="#__codelineno-66-40"></a><span class="w"> </span><span class="nt">steps</span><span class="p">:</span>
</span><span id="__span-66-41"><a id="__codelineno-66-41" name="__codelineno-66-41" href="#__codelineno-66-41"></a><span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="nt">uses</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">actions/checkout@v3</span>
</span><span id="__span-66-42"><a id="__codelineno-66-42" name="__codelineno-66-42" href="#__codelineno-66-42"></a><span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="nt">uses</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">actions/setup-node@v3</span>
</span><span id="__span-66-43"><a id="__codelineno-66-43" name="__codelineno-66-43" href="#__codelineno-66-43"></a><span class="w"> </span><span class="nt">with</span><span class="p">:</span>
</span><span id="__span-66-44"><a id="__codelineno-66-44" name="__codelineno-66-44" href="#__codelineno-66-44"></a><span class="w"> </span><span class="nt">node-version</span><span class="p">:</span><span class="w"> </span><span class="s">&#39;20&#39;</span>
</span><span id="__span-66-45"><a id="__codelineno-66-45" name="__codelineno-66-45" href="#__codelineno-66-45"></a>
</span><span id="__span-66-46"><a id="__codelineno-66-46" name="__codelineno-66-46" href="#__codelineno-66-46"></a><span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">Install dependencies</span>
</span><span id="__span-66-47"><a id="__codelineno-66-47" name="__codelineno-66-47" href="#__codelineno-66-47"></a><span class="w"> </span><span class="nt">working-directory</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">./admin</span>
</span><span id="__span-66-48"><a id="__codelineno-66-48" name="__codelineno-66-48" href="#__codelineno-66-48"></a><span class="w"> </span><span class="nt">run</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">npm ci</span>
</span><span id="__span-66-49"><a id="__codelineno-66-49" name="__codelineno-66-49" href="#__codelineno-66-49"></a>
</span><span id="__span-66-50"><a id="__codelineno-66-50" name="__codelineno-66-50" href="#__codelineno-66-50"></a><span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">Type check</span>
</span><span id="__span-66-51"><a id="__codelineno-66-51" name="__codelineno-66-51" href="#__codelineno-66-51"></a><span class="w"> </span><span class="nt">working-directory</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">./admin</span>
</span><span id="__span-66-52"><a id="__codelineno-66-52" name="__codelineno-66-52" href="#__codelineno-66-52"></a><span class="w"> </span><span class="nt">run</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">npm run type-check</span>
</span><span id="__span-66-53"><a id="__codelineno-66-53" name="__codelineno-66-53" href="#__codelineno-66-53"></a>
</span><span id="__span-66-54"><a id="__codelineno-66-54" name="__codelineno-66-54" href="#__codelineno-66-54"></a><span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">Lint</span>
</span><span id="__span-66-55"><a id="__codelineno-66-55" name="__codelineno-66-55" href="#__codelineno-66-55"></a><span class="w"> </span><span class="nt">working-directory</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">./admin</span>
</span><span id="__span-66-56"><a id="__codelineno-66-56" name="__codelineno-66-56" href="#__codelineno-66-56"></a><span class="w"> </span><span class="nt">run</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">npm run lint</span>
</span><span id="__span-66-57"><a id="__codelineno-66-57" name="__codelineno-66-57" href="#__codelineno-66-57"></a>
</span><span id="__span-66-58"><a id="__codelineno-66-58" name="__codelineno-66-58" href="#__codelineno-66-58"></a><span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">Format check</span>
</span><span id="__span-66-59"><a id="__codelineno-66-59" name="__codelineno-66-59" href="#__codelineno-66-59"></a><span class="w"> </span><span class="nt">working-directory</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">./admin</span>
</span><span id="__span-66-60"><a id="__codelineno-66-60" name="__codelineno-66-60" href="#__codelineno-66-60"></a><span class="w"> </span><span class="nt">run</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">npm run format:check</span>
</span><span id="__span-66-61"><a id="__codelineno-66-61" name="__codelineno-66-61" href="#__codelineno-66-61"></a>
</span><span id="__span-66-62"><a id="__codelineno-66-62" name="__codelineno-66-62" href="#__codelineno-66-62"></a><span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">Test</span>
</span><span id="__span-66-63"><a id="__codelineno-66-63" name="__codelineno-66-63" href="#__codelineno-66-63"></a><span class="w"> </span><span class="nt">working-directory</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">./admin</span>
</span><span id="__span-66-64"><a id="__codelineno-66-64" name="__codelineno-66-64" href="#__codelineno-66-64"></a><span class="w"> </span><span class="nt">run</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">npm test</span>
</span><span id="__span-66-65"><a id="__codelineno-66-65" name="__codelineno-66-65" href="#__codelineno-66-65"></a>
</span><span id="__span-66-66"><a id="__codelineno-66-66" name="__codelineno-66-66" href="#__codelineno-66-66"></a><span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">Build</span>
</span><span id="__span-66-67"><a id="__codelineno-66-67" name="__codelineno-66-67" href="#__codelineno-66-67"></a><span class="w"> </span><span class="nt">working-directory</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">./admin</span>
</span><span id="__span-66-68"><a id="__codelineno-66-68" name="__codelineno-66-68" href="#__codelineno-66-68"></a><span class="w"> </span><span class="nt">run</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">npm run build</span>
</span></code></pre></div>
<h2 id="troubleshooting">Troubleshooting<a class="headerlink" href="#troubleshooting" title="Permanent link">&para;</a></h2>
<h3 id="script-not-found">Script Not Found<a class="headerlink" href="#script-not-found" title="Permanent link">&para;</a></h3>
<p><strong>Problem:</strong>
<div class="language-text highlight"><pre><span></span><code><span id="__span-67-1"><a id="__codelineno-67-1" name="__codelineno-67-1" href="#__codelineno-67-1"></a>npm ERR! missing script: dev
</span></code></pre></div></p>
<p><strong>Solution:</strong>
- Check <code>package.json</code> has the script defined
- Verify you're in correct directory (<code>api/</code> or <code>admin/</code>)
- Run <code>npm install</code> to ensure dependencies installed</p>
<h3 id="permission-errors">Permission Errors<a class="headerlink" href="#permission-errors" title="Permanent link">&para;</a></h3>
<p><strong>Problem:</strong>
<div class="language-text highlight"><pre><span></span><code><span id="__span-68-1"><a id="__codelineno-68-1" name="__codelineno-68-1" href="#__codelineno-68-1"></a>Error: EACCES: permission denied
</span></code></pre></div></p>
<p><strong>Solution:</strong>
- Don't use <code>sudo npm</code> (creates permission issues)
- Fix npm permissions: <code>sudo chown -R $(whoami) ~/.npm</code>
- Or use nvm for user-level Node.js installation</p>
<h3 id="port-already-in-use">Port Already in Use<a class="headerlink" href="#port-already-in-use" title="Permanent link">&para;</a></h3>
<p><strong>Problem:</strong>
<div class="language-text highlight"><pre><span></span><code><span id="__span-69-1"><a id="__codelineno-69-1" name="__codelineno-69-1" href="#__codelineno-69-1"></a>Error: listen EADDRINUSE: address already in use :::4000
</span></code></pre></div></p>
<p><strong>Solution:</strong>
- Find and kill process using port: <code>lsof -ti:4000 | xargs kill -9</code>
- Or change port in <code>.env</code>: <code>API_PORT=4002</code>
- Or use Docker (isolated ports)</p>
<h3 id="typescript-errors-on-build">TypeScript Errors on Build<a class="headerlink" href="#typescript-errors-on-build" title="Permanent link">&para;</a></h3>
<p><strong>Problem:</strong>
<div class="language-text highlight"><pre><span></span><code><span id="__span-70-1"><a id="__codelineno-70-1" name="__codelineno-70-1" href="#__codelineno-70-1"></a>src/modules/auth/auth.service.ts:45:12 - error TS2339
</span></code></pre></div></p>
<p><strong>Solution:</strong>
- Fix type errors in code
- Or check <code>tsconfig.json</code> is correct
- Or update type definitions: <code>npm install --save-dev @types/node@latest</code></p>
<h3 id="prisma-migration-conflicts">Prisma Migration Conflicts<a class="headerlink" href="#prisma-migration-conflicts" title="Permanent link">&para;</a></h3>
<p><strong>Problem:</strong>
<div class="language-text highlight"><pre><span></span><code><span id="__span-71-1"><a id="__codelineno-71-1" name="__codelineno-71-1" href="#__codelineno-71-1"></a>Error: P3005 The database schema is not in sync with the migration history
</span></code></pre></div></p>
<p><strong>Solution:</strong>
- Development: <code>npx prisma migrate reset</code> (DELETES DATA)
- Production: <code>npx prisma migrate resolve --applied &lt;migration_name&gt;</code>
- Or create new migration to fix state</p>
<h3 id="npm-install-failures">npm install Failures<a class="headerlink" href="#npm-install-failures" title="Permanent link">&para;</a></h3>
<p><strong>Problem:</strong>
<div class="language-text highlight"><pre><span></span><code><span id="__span-72-1"><a id="__codelineno-72-1" name="__codelineno-72-1" href="#__codelineno-72-1"></a>npm ERR! code ERESOLVE
</span><span id="__span-72-2"><a id="__codelineno-72-2" name="__codelineno-72-2" href="#__codelineno-72-2"></a>npm ERR! ERESOLVE unable to resolve dependency tree
</span></code></pre></div></p>
<p><strong>Solution:</strong>
- Clear cache: <code>npm cache clean --force</code>
- Delete and reinstall: <code>rm -rf node_modules package-lock.json &amp;&amp; npm install</code>
- Use <code>--legacy-peer-deps</code> flag: <code>npm install --legacy-peer-deps</code></p>
<h3 id="vite-build-errors">Vite Build Errors<a class="headerlink" href="#vite-build-errors" title="Permanent link">&para;</a></h3>
<p><strong>Problem:</strong>
<div class="language-text highlight"><pre><span></span><code><span id="__span-73-1"><a id="__codelineno-73-1" name="__codelineno-73-1" href="#__codelineno-73-1"></a>Error: Could not resolve entry module (index.html)
</span></code></pre></div></p>
<p><strong>Solution:</strong>
- Ensure <code>index.html</code> exists in <code>admin/</code>
- Check <code>vite.config.ts</code> has correct root
- Clear cache: <code>rm -rf node_modules/.vite &amp;&amp; npm run dev</code></p>
<h2 id="best-practices">Best Practices<a class="headerlink" href="#best-practices" title="Permanent link">&para;</a></h2>
<h3 id="script-naming-conventions">Script Naming Conventions<a class="headerlink" href="#script-naming-conventions" title="Permanent link">&para;</a></h3>
<ul>
<li><strong>dev</strong> - Development mode with hot reload</li>
<li><strong>build</strong> - Production build</li>
<li><strong>start</strong> - Run production build</li>
<li><strong>test</strong> - Run tests</li>
<li><strong>lint</strong> - Check code style</li>
<li><strong>lint:fix</strong> - Auto-fix code style</li>
<li><strong>format</strong> - Format code</li>
<li><strong>type-check</strong> - TypeScript validation</li>
<li><strong>clean</strong> - Remove build artifacts</li>
</ul>
<h3 id="script-organization">Script Organization<a class="headerlink" href="#script-organization" title="Permanent link">&para;</a></h3>
<p>Group related scripts:</p>
<div class="language-json highlight"><pre><span></span><code><span id="__span-74-1"><a id="__codelineno-74-1" name="__codelineno-74-1" href="#__codelineno-74-1"></a><span class="p">{</span>
</span><span id="__span-74-2"><a id="__codelineno-74-2" name="__codelineno-74-2" href="#__codelineno-74-2"></a><span class="w"> </span><span class="nt">&quot;scripts&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
</span><span id="__span-74-3"><a id="__codelineno-74-3" name="__codelineno-74-3" href="#__codelineno-74-3"></a><span class="w"> </span><span class="c1">// Development</span>
</span><span id="__span-74-4"><a id="__codelineno-74-4" name="__codelineno-74-4" href="#__codelineno-74-4"></a><span class="w"> </span><span class="nt">&quot;dev&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;tsx watch src/server.ts&quot;</span><span class="p">,</span>
</span><span id="__span-74-5"><a id="__codelineno-74-5" name="__codelineno-74-5" href="#__codelineno-74-5"></a><span class="w"> </span><span class="nt">&quot;dev:media&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;tsx watch src/media-server.ts&quot;</span><span class="p">,</span>
</span><span id="__span-74-6"><a id="__codelineno-74-6" name="__codelineno-74-6" href="#__codelineno-74-6"></a>
</span><span id="__span-74-7"><a id="__codelineno-74-7" name="__codelineno-74-7" href="#__codelineno-74-7"></a><span class="w"> </span><span class="c1">// Build</span>
</span><span id="__span-74-8"><a id="__codelineno-74-8" name="__codelineno-74-8" href="#__codelineno-74-8"></a><span class="w"> </span><span class="nt">&quot;build&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;tsc --build&quot;</span><span class="p">,</span>
</span><span id="__span-74-9"><a id="__codelineno-74-9" name="__codelineno-74-9" href="#__codelineno-74-9"></a><span class="w"> </span><span class="nt">&quot;clean&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;rm -rf dist&quot;</span><span class="p">,</span>
</span><span id="__span-74-10"><a id="__codelineno-74-10" name="__codelineno-74-10" href="#__codelineno-74-10"></a>
</span><span id="__span-74-11"><a id="__codelineno-74-11" name="__codelineno-74-11" href="#__codelineno-74-11"></a><span class="w"> </span><span class="c1">// Quality</span>
</span><span id="__span-74-12"><a id="__codelineno-74-12" name="__codelineno-74-12" href="#__codelineno-74-12"></a><span class="w"> </span><span class="nt">&quot;type-check&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;tsc --noEmit&quot;</span><span class="p">,</span>
</span><span id="__span-74-13"><a id="__codelineno-74-13" name="__codelineno-74-13" href="#__codelineno-74-13"></a><span class="w"> </span><span class="nt">&quot;lint&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;eslint src/ --ext .ts&quot;</span><span class="p">,</span>
</span><span id="__span-74-14"><a id="__codelineno-74-14" name="__codelineno-74-14" href="#__codelineno-74-14"></a><span class="w"> </span><span class="nt">&quot;lint:fix&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;eslint src/ --ext .ts --fix&quot;</span><span class="p">,</span>
</span><span id="__span-74-15"><a id="__codelineno-74-15" name="__codelineno-74-15" href="#__codelineno-74-15"></a><span class="w"> </span><span class="nt">&quot;format&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;prettier --write \&quot;src/**/*.ts\&quot;&quot;</span><span class="p">,</span>
</span><span id="__span-74-16"><a id="__codelineno-74-16" name="__codelineno-74-16" href="#__codelineno-74-16"></a>
</span><span id="__span-74-17"><a id="__codelineno-74-17" name="__codelineno-74-17" href="#__codelineno-74-17"></a><span class="w"> </span><span class="c1">// Database</span>
</span><span id="__span-74-18"><a id="__codelineno-74-18" name="__codelineno-74-18" href="#__codelineno-74-18"></a><span class="w"> </span><span class="nt">&quot;prisma:migrate&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;prisma migrate dev&quot;</span><span class="p">,</span>
</span><span id="__span-74-19"><a id="__codelineno-74-19" name="__codelineno-74-19" href="#__codelineno-74-19"></a><span class="w"> </span><span class="nt">&quot;prisma:deploy&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;prisma migrate deploy&quot;</span><span class="p">,</span>
</span><span id="__span-74-20"><a id="__codelineno-74-20" name="__codelineno-74-20" href="#__codelineno-74-20"></a><span class="w"> </span><span class="nt">&quot;prisma:seed&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;tsx prisma/seed.ts&quot;</span>
</span><span id="__span-74-21"><a id="__codelineno-74-21" name="__codelineno-74-21" href="#__codelineno-74-21"></a><span class="w"> </span><span class="p">}</span>
</span><span id="__span-74-22"><a id="__codelineno-74-22" name="__codelineno-74-22" href="#__codelineno-74-22"></a><span class="p">}</span>
</span></code></pre></div>
<h3 id="environment-specific-scripts">Environment-Specific Scripts<a class="headerlink" href="#environment-specific-scripts" title="Permanent link">&para;</a></h3>
<p>Use cross-env for environment variables:</p>
<div class="language-bash highlight"><pre><span></span><code><span id="__span-75-1"><a id="__codelineno-75-1" name="__codelineno-75-1" href="#__codelineno-75-1"></a>npm<span class="w"> </span>install<span class="w"> </span>--save-dev<span class="w"> </span>cross-env
</span></code></pre></div>
<div class="language-json highlight"><pre><span></span><code><span id="__span-76-1"><a id="__codelineno-76-1" name="__codelineno-76-1" href="#__codelineno-76-1"></a><span class="p">{</span>
</span><span id="__span-76-2"><a id="__codelineno-76-2" name="__codelineno-76-2" href="#__codelineno-76-2"></a><span class="w"> </span><span class="nt">&quot;scripts&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
</span><span id="__span-76-3"><a id="__codelineno-76-3" name="__codelineno-76-3" href="#__codelineno-76-3"></a><span class="w"> </span><span class="nt">&quot;dev&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;cross-env NODE_ENV=development tsx watch src/server.ts&quot;</span><span class="p">,</span>
</span><span id="__span-76-4"><a id="__codelineno-76-4" name="__codelineno-76-4" href="#__codelineno-76-4"></a><span class="w"> </span><span class="nt">&quot;build&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;cross-env NODE_ENV=production tsc --build&quot;</span><span class="p">,</span>
</span><span id="__span-76-5"><a id="__codelineno-76-5" name="__codelineno-76-5" href="#__codelineno-76-5"></a><span class="w"> </span><span class="nt">&quot;test&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;cross-env NODE_ENV=test jest&quot;</span>
</span><span id="__span-76-6"><a id="__codelineno-76-6" name="__codelineno-76-6" href="#__codelineno-76-6"></a><span class="w"> </span><span class="p">}</span>
</span><span id="__span-76-7"><a id="__codelineno-76-7" name="__codelineno-76-7" href="#__codelineno-76-7"></a><span class="p">}</span>
</span></code></pre></div>
<h3 id="script-documentation">Script Documentation<a class="headerlink" href="#script-documentation" title="Permanent link">&para;</a></h3>
<p>Add comments in package.json:</p>
<div class="language-json highlight"><pre><span></span><code><span id="__span-77-1"><a id="__codelineno-77-1" name="__codelineno-77-1" href="#__codelineno-77-1"></a><span class="p">{</span>
</span><span id="__span-77-2"><a id="__codelineno-77-2" name="__codelineno-77-2" href="#__codelineno-77-2"></a><span class="w"> </span><span class="nt">&quot;scripts&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
</span><span id="__span-77-3"><a id="__codelineno-77-3" name="__codelineno-77-3" href="#__codelineno-77-3"></a><span class="w"> </span><span class="nt">&quot;// Development&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;&quot;</span><span class="p">,</span>
</span><span id="__span-77-4"><a id="__codelineno-77-4" name="__codelineno-77-4" href="#__codelineno-77-4"></a><span class="w"> </span><span class="nt">&quot;dev&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;tsx watch src/server.ts&quot;</span><span class="p">,</span>
</span><span id="__span-77-5"><a id="__codelineno-77-5" name="__codelineno-77-5" href="#__codelineno-77-5"></a>
</span><span id="__span-77-6"><a id="__codelineno-77-6" name="__codelineno-77-6" href="#__codelineno-77-6"></a><span class="w"> </span><span class="nt">&quot;// Build&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;&quot;</span><span class="p">,</span>
</span><span id="__span-77-7"><a id="__codelineno-77-7" name="__codelineno-77-7" href="#__codelineno-77-7"></a><span class="w"> </span><span class="nt">&quot;build&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;tsc --build&quot;</span><span class="p">,</span>
</span><span id="__span-77-8"><a id="__codelineno-77-8" name="__codelineno-77-8" href="#__codelineno-77-8"></a>
</span><span id="__span-77-9"><a id="__codelineno-77-9" name="__codelineno-77-9" href="#__codelineno-77-9"></a><span class="w"> </span><span class="nt">&quot;// Quality&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;&quot;</span><span class="p">,</span>
</span><span id="__span-77-10"><a id="__codelineno-77-10" name="__codelineno-77-10" href="#__codelineno-77-10"></a><span class="w"> </span><span class="nt">&quot;type-check&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;tsc --noEmit&quot;</span>
</span><span id="__span-77-11"><a id="__codelineno-77-11" name="__codelineno-77-11" href="#__codelineno-77-11"></a><span class="w"> </span><span class="p">}</span>
</span><span id="__span-77-12"><a id="__codelineno-77-12" name="__codelineno-77-12" href="#__codelineno-77-12"></a><span class="p">}</span>
</span></code></pre></div>
<h2 id="quick-reference">Quick Reference<a class="headerlink" href="#quick-reference" title="Permanent link">&para;</a></h2>
<h3 id="api-scripts_1">API Scripts<a class="headerlink" href="#api-scripts_1" title="Permanent link">&para;</a></h3>
<div class="language-bash highlight"><pre><span></span><code><span id="__span-78-1"><a id="__codelineno-78-1" name="__codelineno-78-1" href="#__codelineno-78-1"></a>npm<span class="w"> </span>run<span class="w"> </span>dev<span class="w"> </span><span class="c1"># Dev server (port 4000)</span>
</span><span id="__span-78-2"><a id="__codelineno-78-2" name="__codelineno-78-2" href="#__codelineno-78-2"></a>npm<span class="w"> </span>run<span class="w"> </span>dev:media<span class="w"> </span><span class="c1"># Media API dev (port 4100)</span>
</span><span id="__span-78-3"><a id="__codelineno-78-3" name="__codelineno-78-3" href="#__codelineno-78-3"></a>npm<span class="w"> </span>run<span class="w"> </span>build<span class="w"> </span><span class="c1"># Build for production</span>
</span><span id="__span-78-4"><a id="__codelineno-78-4" name="__codelineno-78-4" href="#__codelineno-78-4"></a>npm<span class="w"> </span>start<span class="w"> </span><span class="c1"># Run production server</span>
</span><span id="__span-78-5"><a id="__codelineno-78-5" name="__codelineno-78-5" href="#__codelineno-78-5"></a>npm<span class="w"> </span>run<span class="w"> </span>type-check<span class="w"> </span><span class="c1"># TypeScript validation</span>
</span><span id="__span-78-6"><a id="__codelineno-78-6" name="__codelineno-78-6" href="#__codelineno-78-6"></a>npm<span class="w"> </span>run<span class="w"> </span>lint<span class="w"> </span><span class="c1"># ESLint check</span>
</span><span id="__span-78-7"><a id="__codelineno-78-7" name="__codelineno-78-7" href="#__codelineno-78-7"></a>npm<span class="w"> </span>run<span class="w"> </span>lint:fix<span class="w"> </span><span class="c1"># ESLint auto-fix</span>
</span><span id="__span-78-8"><a id="__codelineno-78-8" name="__codelineno-78-8" href="#__codelineno-78-8"></a>npm<span class="w"> </span>run<span class="w"> </span>format<span class="w"> </span><span class="c1"># Prettier format</span>
</span><span id="__span-78-9"><a id="__codelineno-78-9" name="__codelineno-78-9" href="#__codelineno-78-9"></a>npx<span class="w"> </span>prisma<span class="w"> </span>migrate<span class="w"> </span>dev<span class="w"> </span><span class="c1"># Create migration</span>
</span><span id="__span-78-10"><a id="__codelineno-78-10" name="__codelineno-78-10" href="#__codelineno-78-10"></a>npx<span class="w"> </span>prisma<span class="w"> </span>migrate<span class="w"> </span>deploy<span class="w"> </span><span class="c1"># Apply migrations</span>
</span><span id="__span-78-11"><a id="__codelineno-78-11" name="__codelineno-78-11" href="#__codelineno-78-11"></a>npx<span class="w"> </span>prisma<span class="w"> </span>db<span class="w"> </span>seed<span class="w"> </span><span class="c1"># Seed database</span>
</span><span id="__span-78-12"><a id="__codelineno-78-12" name="__codelineno-78-12" href="#__codelineno-78-12"></a>npx<span class="w"> </span>prisma<span class="w"> </span>studio<span class="w"> </span><span class="c1"># Database GUI</span>
</span><span id="__span-78-13"><a id="__codelineno-78-13" name="__codelineno-78-13" href="#__codelineno-78-13"></a>npx<span class="w"> </span>drizzle-kit<span class="w"> </span>push<span class="w"> </span><span class="c1"># Push Media schema</span>
</span></code></pre></div>
<h3 id="admin-scripts_1">Admin Scripts<a class="headerlink" href="#admin-scripts_1" title="Permanent link">&para;</a></h3>
<div class="language-bash highlight"><pre><span></span><code><span id="__span-79-1"><a id="__codelineno-79-1" name="__codelineno-79-1" href="#__codelineno-79-1"></a>npm<span class="w"> </span>run<span class="w"> </span>dev<span class="w"> </span><span class="c1"># Dev server (port 3000)</span>
</span><span id="__span-79-2"><a id="__codelineno-79-2" name="__codelineno-79-2" href="#__codelineno-79-2"></a>npm<span class="w"> </span>run<span class="w"> </span>build<span class="w"> </span><span class="c1"># Build for production</span>
</span><span id="__span-79-3"><a id="__codelineno-79-3" name="__codelineno-79-3" href="#__codelineno-79-3"></a>npm<span class="w"> </span>run<span class="w"> </span>preview<span class="w"> </span><span class="c1"># Preview production build</span>
</span><span id="__span-79-4"><a id="__codelineno-79-4" name="__codelineno-79-4" href="#__codelineno-79-4"></a>npm<span class="w"> </span>run<span class="w"> </span>type-check<span class="w"> </span><span class="c1"># TypeScript validation</span>
</span><span id="__span-79-5"><a id="__codelineno-79-5" name="__codelineno-79-5" href="#__codelineno-79-5"></a>npm<span class="w"> </span>run<span class="w"> </span>lint<span class="w"> </span><span class="c1"># ESLint check</span>
</span><span id="__span-79-6"><a id="__codelineno-79-6" name="__codelineno-79-6" href="#__codelineno-79-6"></a>npm<span class="w"> </span>run<span class="w"> </span>lint:fix<span class="w"> </span><span class="c1"># ESLint auto-fix</span>
</span><span id="__span-79-7"><a id="__codelineno-79-7" name="__codelineno-79-7" href="#__codelineno-79-7"></a>npm<span class="w"> </span>run<span class="w"> </span>format<span class="w"> </span><span class="c1"># Prettier format</span>
</span><span id="__span-79-8"><a id="__codelineno-79-8" name="__codelineno-79-8" href="#__codelineno-79-8"></a>npm<span class="w"> </span><span class="nb">test</span><span class="w"> </span><span class="c1"># Run tests</span>
</span><span id="__span-79-9"><a id="__codelineno-79-9" name="__codelineno-79-9" href="#__codelineno-79-9"></a>npm<span class="w"> </span>run<span class="w"> </span>test:ui<span class="w"> </span><span class="c1"># Test UI</span>
</span></code></pre></div>
<h3 id="docker-scripts">Docker Scripts<a class="headerlink" href="#docker-scripts" title="Permanent link">&para;</a></h3>
<div class="language-bash highlight"><pre><span></span><code><span id="__span-80-1"><a id="__codelineno-80-1" name="__codelineno-80-1" href="#__codelineno-80-1"></a>docker<span class="w"> </span>compose<span class="w"> </span><span class="nb">exec</span><span class="w"> </span>api<span class="w"> </span>npm<span class="w"> </span>run<span class="w"> </span>type-check
</span><span id="__span-80-2"><a id="__codelineno-80-2" name="__codelineno-80-2" href="#__codelineno-80-2"></a>docker<span class="w"> </span>compose<span class="w"> </span><span class="nb">exec</span><span class="w"> </span>api<span class="w"> </span>npx<span class="w"> </span>prisma<span class="w"> </span>migrate<span class="w"> </span>dev
</span><span id="__span-80-3"><a id="__codelineno-80-3" name="__codelineno-80-3" href="#__codelineno-80-3"></a>docker<span class="w"> </span>compose<span class="w"> </span><span class="nb">exec</span><span class="w"> </span>admin<span class="w"> </span>npm<span class="w"> </span>run<span class="w"> </span>lint
</span><span id="__span-80-4"><a id="__codelineno-80-4" name="__codelineno-80-4" href="#__codelineno-80-4"></a>docker<span class="w"> </span>compose<span class="w"> </span>build<span class="w"> </span>--no-cache<span class="w"> </span>api<span class="w"> </span>admin
</span></code></pre></div>
<h2 id="related-documentation">Related Documentation<a class="headerlink" href="#related-documentation" title="Permanent link">&para;</a></h2>
<ul>
<li><strong>Setup:</strong> <a href="../local-setup/">Local Development Setup</a></li>
<li><strong>Workflow:</strong> <a href="../docker-workflow/">Docker Workflow</a></li>
<li><strong>Database:</strong> <a href="../migrations/">Migrations Guide</a></li>
<li><strong>Testing:</strong> <a href="../testing/">Testing Guide</a></li>
<li><strong>Code Style:</strong> <a href="../code-style/">Code Style Guide</a></li>
<li><strong>Debugging:</strong> <a href="../debugging/">Debugging Guide</a></li>
</ul>
<h2 id="summary">Summary<a class="headerlink" href="#summary" title="Permanent link">&para;</a></h2>
<p>You now know:
- ✅ All available npm scripts in API and Admin
- ✅ What each script does and when to use it
- ✅ How to run scripts in Docker containers
- ✅ How to chain scripts together
- ✅ Common script combinations for workflows
- ✅ How to troubleshoot script errors
- ✅ Best practices for script organization</p>
<p><strong>Quick Start:</strong>
<div class="language-bash highlight"><pre><span></span><code><span id="__span-81-1"><a id="__codelineno-81-1" name="__codelineno-81-1" href="#__codelineno-81-1"></a><span class="c1"># Development</span>
</span><span id="__span-81-2"><a id="__codelineno-81-2" name="__codelineno-81-2" href="#__codelineno-81-2"></a><span class="nb">cd</span><span class="w"> </span>api<span class="w"> </span><span class="o">&amp;&amp;</span><span class="w"> </span>npm<span class="w"> </span>run<span class="w"> </span>dev
</span><span id="__span-81-3"><a id="__codelineno-81-3" name="__codelineno-81-3" href="#__codelineno-81-3"></a><span class="nb">cd</span><span class="w"> </span>admin<span class="w"> </span><span class="o">&amp;&amp;</span><span class="w"> </span>npm<span class="w"> </span>run<span class="w"> </span>dev
</span><span id="__span-81-4"><a id="__codelineno-81-4" name="__codelineno-81-4" href="#__codelineno-81-4"></a>
</span><span id="__span-81-5"><a id="__codelineno-81-5" name="__codelineno-81-5" href="#__codelineno-81-5"></a><span class="c1"># Pre-commit</span>
</span><span id="__span-81-6"><a id="__codelineno-81-6" name="__codelineno-81-6" href="#__codelineno-81-6"></a><span class="nb">cd</span><span class="w"> </span>api<span class="w"> </span><span class="o">&amp;&amp;</span><span class="w"> </span>npm<span class="w"> </span>run<span class="w"> </span>lint:fix<span class="w"> </span><span class="o">&amp;&amp;</span><span class="w"> </span>npm<span class="w"> </span>run<span class="w"> </span>type-check
</span><span id="__span-81-7"><a id="__codelineno-81-7" name="__codelineno-81-7" href="#__codelineno-81-7"></a><span class="nb">cd</span><span class="w"> </span>admin<span class="w"> </span><span class="o">&amp;&amp;</span><span class="w"> </span>npm<span class="w"> </span>run<span class="w"> </span>lint:fix<span class="w"> </span><span class="o">&amp;&amp;</span><span class="w"> </span>npm<span class="w"> </span>run<span class="w"> </span>type-check
</span><span id="__span-81-8"><a id="__codelineno-81-8" name="__codelineno-81-8" href="#__codelineno-81-8"></a>
</span><span id="__span-81-9"><a id="__codelineno-81-9" name="__codelineno-81-9" href="#__codelineno-81-9"></a><span class="c1"># Production build</span>
</span><span id="__span-81-10"><a id="__codelineno-81-10" name="__codelineno-81-10" href="#__codelineno-81-10"></a><span class="nb">cd</span><span class="w"> </span>api<span class="w"> </span><span class="o">&amp;&amp;</span><span class="w"> </span>npm<span class="w"> </span>run<span class="w"> </span>build
</span><span id="__span-81-11"><a id="__codelineno-81-11" name="__codelineno-81-11" href="#__codelineno-81-11"></a><span class="nb">cd</span><span class="w"> </span>admin<span class="w"> </span><span class="o">&amp;&amp;</span><span class="w"> </span>npm<span class="w"> </span>run<span class="w"> </span>build
</span></code></pre></div></p>
</article>
</div>
<script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script>
</div>
<button type="button" class="md-top md-icon" data-md-component="top" hidden>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M13 20h-2V8l-5.5 5.5-1.42-1.42L12 4.16l7.92 7.92-1.42 1.42L13 8z"/></svg>
Back to top
</button>
</main>
<footer class="md-footer">
<nav class="md-footer__inner md-grid" aria-label="Footer" >
<a href="../git-workflow/" class="md-footer__link md-footer__link--prev" aria-label="Previous: Git Workflow">
<div class="md-footer__button md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11z"/></svg>
</div>
<div class="md-footer__title">
<span class="md-footer__direction">
Previous
</span>
<div class="md-ellipsis">
Git Workflow
</div>
</div>
</a>
<a href="../migrations/" class="md-footer__link md-footer__link--next" aria-label="Next: Migrations">
<div class="md-footer__title">
<span class="md-footer__direction">
Next
</span>
<div class="md-ellipsis">
Migrations
</div>
</div>
<div class="md-footer__button md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M4 11v2h12l-5.5 5.5 1.42 1.42L19.84 12l-7.92-7.92L10.5 5.5 16 11z"/></svg>
</div>
</a>
</nav>
<div class="md-footer-meta md-typeset">
<div class="md-footer-meta__inner md-grid">
<div class="md-copyright">
<div class="md-copyright__highlight">
Copyright &copy; 2024 The Bunker Operations <a href="#__consent">Change cookie settings</a>
</div>
</div>
<div class="md-social">
<a href="https://gitea.bnkops.com/admin" target="_blank" rel="noopener" title="Gitea Repository" class="md-social__link">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d="M173.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6m-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3m44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9M252.8 8C114.1 8 8 113.3 8 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C436.2 457.8 504 362.9 504 252 504 113.3 391.5 8 252.8 8M105.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1m-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7m32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1m-11.4-14.7c-1.6 1-1.6 3.6 0 5.9s4.3 3.3 5.6 2.3c1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2"/></svg>
</a>
<a href="https://listmonk.bnkops.com/subscription/form" target="_blank" rel="noopener" title="Newsletter" class="md-social__link">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"><!--! Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d="M536.4-26.3c9.8-3.5 20.6-1 28 6.3s9.8 18.2 6.3 28l-178 496.9c-5 13.9-18.1 23.1-32.8 23.1-14.2 0-27-8.6-32.3-21.7l-64.2-158c-4.5-11-2.5-23.6 5.2-32.6l94.5-112.4c5.1-6.1 4.7-15-.9-20.6s-14.6-6-20.6-.9l-112.4 94.3c-9.1 7.6-21.6 9.6-32.6 5.2L38.1 216.8c-13.1-5.3-21.7-18.1-21.7-32.3 0-14.7 9.2-27.8 23.1-32.8z"/></svg>
</a>
</div>
</div>
</div>
</footer>
</div>
<div class="md-dialog" data-md-component="dialog">
<div class="md-dialog__inner md-typeset"></div>
</div>
<script id="__config" type="application/json">{"annotate": null, "base": "../../..", "features": ["announce.dismiss", "content.action.edit", "content.action.view", "content.code.annotate", "content.code.copy", "content.tooltips", "navigation.expand", "navigation.footer", "navigation.indexes", "navigation.path", "navigation.prune", "navigation.sections", "navigation.tabs", "navigation.tabs.sticky", "navigation.top", "navigation.tracking", "search.highlight", "search.share", "search.suggest", "toc.follow"], "search": "../../../assets/javascripts/workers/search.2c215733.min.js", "tags": null, "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}, "version": null}</script>
<script src="../../../assets/javascripts/bundle.79ae519e.min.js"></script>
<script src="../../../javascripts/home.js"></script>
<script src="../../../javascripts/github-widget.js"></script>
<script src="../../../javascripts/gitea-widget.js"></script>
<script src="../../../assets/js/env-config.js"></script>
<script src="../../../assets/js/video-player.js"></script>
</body>
</html>