# Deployment / Penempatan > docs/user/ > Deployment --- PromptJS menyediakan 3 deployment adapter yang mengubah output build sesuai target hosting. Adapter dipilih melalui flag `--adapter` pada `pjs build` atau field `adapter` di `pjs.config.js`. PromptJS provides 3 deployment adapters that transform build output for the target hosting. Adapters are selected via the `--adapter` flag on `pjs build` or the `adapter` field in `pjs.config.js`. **Bukti / Evidence:** Adapter yang valid didefinisikan di `src/engine/config.js` dalam `KNOWN_ADAPTERS = new Set(['static', 'node', 'vercel'])`. Implementasi masing-masing ada di `src/engine/adapters/`. --- ## Front-Matter Build / Build dengan Multi-Page Sebelum menggunakan adapter, pastikan proyek memiliki struktur multi-page yang benar: Before using adapters, ensure the project has a correct multi-page structure: ``` proyek/ ├── src/ │ ├── pages/ │ │ ├── index.pjs │ │ ├── tentang.pjs │ │ └── blog/[slug].pjs │ └── assets/ ├── pjs.config.js └── package.json ``` Builder mendeteksi folder `pages/` di dalam `src/` atau di root proyek. Jika ditemukan, builder menjalankan mode project build (bukan single-file legacy mode). **Bukti / Evidence:** Di `src/cli/commands/build.js`, builder mengecek `src/pages/` lalu `pages/` secara berurutan. Jika salah satu ada, `Builder.buildProject()` dipanggil. ### Rute Dinamis / Dynamic Routes File dengan `[nama].pjs` di dalam subfolder menghasilkan rute dengan parameter. Misalnya `pages/blog/[slug].pjs` menghasilkan rute `/blog/:slug`. Parameter bisa diakses di halaman melalui argument kedua factory function. Files with `[name].pjs` in subfolders produce routes with parameters. For example, `pages/blog/[slug].pjs` produces the route `/blog/:slug`. **Bukti / Evidence:** Fungsi `fileToRoute()` di `builder.js` mengubah `[slug]` menjadi `:slug` menggunakan regex. Parameter diteruskan ke factory function sebagai argumen kedua. --- ## Konfigurasi Build / Build Configuration File konfigurasi: `pjs.config.js` atau `promptjs.config.js` (dicari secara ascending dari working directory). Configuration file: `pjs.config.js` or `promptjs.config.js` (searched upward from the working directory). **Bukti / Evidence:** `CONFIG_FILENAMES = new Set(['pjs.config.js', 'promptjs.config.js'])` di `src/engine/config.js`. Hanya file `.js` yang didukung (bukan `.json`, `.yaml`, atau `.toml`). ```js // pjs.config.js module.exports = { adapter: 'static', // 'static' | 'node' | 'vercel' outDir: 'dist', // Direktori output pagesDir: 'pages', // Subfolder halaman (relatif terhadap rootDir) assetsDir: 'assets', // Subfolder aset baseUrl: '/', // Base URL untuk asset meta: { title: 'Nama Aplikasi', description: 'Deskripsi aplikasi', ogImage: '/og-image.png', ogType: 'website', }, siteUrl: 'https://example.com', // Untuk sitemap dan canonical URL apiUrl: 'https://api.example.com', // Untuk Node adapter API proxy plugins: [], // Array plugin (fungsi atau objek) }; ``` ### Merge dengan CLI / CLI Override CLI flags selalu mengambil alih konfigurasi file. Flag yang bisa override: CLI flags always override config file values. Overridable flags: | Flag CLI | Override Field | |----------|----------------| | `--out-dir ` | `config.outDir` | | `--adapter ` | `config.adapter` | | `--csp` | `config.csp` | **Bukti / Evidence:** Fungsi `mergeWithCliArgs()` di `config.js` melakukan merge dengan prioritas: CLI > config file > default. Tepatnya tiga properti yang dapat di-override dari CLI: `outDir`, `adapter`, dan `csp`. --- ## Content-Security-Policy (CSP) / Mode CSP Flag `--csp` pada `pjs build` (atau `csp: true` di config) mengaktifkan mode emisi yang ramah Content-Security-Policy. Aktifkan ini bila target hosting Anda menerapkan header CSP yang ketat. ```bash # Build dengan mode CSP aktif pjs build --adapter static --csp ``` The `--csp` flag on `pjs build` (or `csp: true` in config) enables Content-Security-Policy-friendly emission. Enable it when your hosting target enforces a strict CSP header. **Bukti / Evidence:** `src/cli/commands/build.js` membaca `const csp = argv.csp || projectConfig.csp || false;`, dan `mergeWithCliArgs()` di `src/engine/config.js` meng-override `merged.csp` bila `cliArgs.csp !== undefined`. --- ## Adapter: Static Adapter untuk deployment ke CDN atau hosting statis (Netlify, Cloudflare Pages, GitHub Pages, S3, dll). Adapter for deployment to CDN or static hosting (Netlify, Cloudflare Pages, GitHub Pages, S3, etc.). ```bash pjs build --adapter static ``` ### Apa yang Dilakukan / What It Does Berdasarkan implementasi di `src/engine/adapters/static.js`, adapter ini melakukan: Based on the implementation in `src/engine/adapters/static.js`, this adapter: 1. **Asset hashing** — `prompt.js` dan `prompt.css` di-rename dengan hash MD5 (8 karakter hex). Misalnya `prompt.js` → `prompt.a1b2c3.js`. Semua referensi `