# Build-System

> Gulp-Tasks für JS/CSS-Bundling, Übersetzungen und Versionierung

---

Bundling, Übersetzungs-Kompilierung und Versionierung werden über [**Gulp**](https://gulpjs.com/)-Tasks in <a href="https://codeberg.org/bschwede/linkenhancer/src/branch/main/gulpfile.mjs" target="_blank" rel="noopener"><code>gulpfile.mjs</code></a>
 gesteuert, aufgerufen mit `npx gulp <task>`. Die `npm run *`-Skripte decken nur das Testing ab — siehe die Seite [Testing](./testing).

## Tasks

| Task | Befehl | Wirkung |
| --- | --- | --- |
| `build` | `npx gulp build` | `clean` → JS ([Rollup](https://rollupjs.org/)) + CSS ([PostCSS](https://postcss.org/)) |
| `devbuild` | `npx gulp devbuild` | wie `build`, aber Dev-Mode (kein Minify, SourceMaps) |
| `updatepo` | `npx gulp updatepo` | führt <a href="https://codeberg.org/bschwede/linkenhancer/src/branch/main/util/update-po-files.sh" target="_blank" rel="noopener"><code>update-po-files.sh</code></a>
 aus → `xgettext` über `src/` → <a href="https://codeberg.org/bschwede/linkenhancer/src/branch/main/resources/lang/messages.pot" target="_blank" rel="noopener"><code>messages.pot</code></a>
 |
| `po2php` | `npx gulp po2php` | kompiliert `resources/lang/*.po` → `resources/lang/*.php` |
| `syncversion` | `npx gulp syncversion` | hält <a href="https://codeberg.org/bschwede/linkenhancer/src/branch/main/latest-version.txt" target="_blank" rel="noopener"><code>latest-version.txt</code></a>
 ↔ <a href="https://codeberg.org/bschwede/linkenhancer/src/branch/main/src/LinkEnhancerModule.php" target="_blank" rel="noopener"><code>LinkEnhancerModule.php</code></a>
 synchron |
| `bumpversion` | `npx gulp bumpversion` | erfordert einen sauberen git-Tree → Version-Bump → `syncversion` |
| `archive` | `npx gulp archive` | `build` + `po2php` + <a href="https://codeberg.org/bschwede/linkenhancer/src/branch/main/util/create-archive.sh" target="_blank" rel="noopener"><code>create-archive.sh</code></a>
 (Release-ZIP) |
| `forgejo:issue-refs` | `npx gulp forgejo:issue-refs[:dry]` | ergänzt Issue-Referenzen in Commit-Messages (braucht `FORGEJO_TOKEN` in `.env`) - wurde nur einmalig angewendet für die Übernahme des Repos von GitHub zu Codeberg |

## JS / CSS Bundling

`build` = `clean` → (parallel) JS + CSS.

- **clean** löscht zunächst `resources/js/bundle*` und `resources/css/bundle*`.
- **JS** (Rollup): zwei Entry-Bundles — `jsIndex` (das Haupt-<a href="https://codeberg.org/bschwede/linkenhancer/src/branch/main/resources/js/index-le.js" target="_blank" rel="noopener"><code>index-le.js</code></a>
) und `jsExtractLeConfig` (<a href="https://codeberg.org/bschwede/linkenhancer/src/branch/main/resources/js/src/le-config.js" target="_blank" rel="noopener"><code>le-config.js</code></a>
). Ausgabe nach `resources/js/bundle*`.
- **CSS** (PostCSS): Dateibasierte Subtasks aus `getCssSubTasks()`, mit autoprefixer + cssnano. Ausgabe nach `resources/css/bundle*`.

**Dev-Mode** (`devbuild`) schaltet per `toggleDevMode(true)` einen Flag um — er deaktiviert das Minifizieren und erzeugt SourceMaps.

## Build- & Archive-Pipeline




<pre class="mermaid">flowchart LR
    subgraph B[&#34;🔧 npx gulp build&#34;]
        C[&#34;🧹 clean&lt;br/&gt;(bundle*)&#34;]
        J[&#34;`📜 Rollup&lt;br/&gt;**index-le.js** · le-config.js`&#34;]
        P[&#34;🎨 PostCSS&lt;br/&gt;autoprefixer · cssnano&#34;]
        C --&gt; J
        C --&gt; P
    end
    subgraph A[&#34;📦 npx gulp archive&#34;]
        A1[&#34;build&#34;]
        A2[&#34;po2php&#34;]
        A3[&#34;`create-archive.sh&lt;br/&gt;**dist/linkenhancer_v&lt;ver&gt;.zip**`&#34;]
        A1 --&gt; A2 --&gt; A3
    end

    classDef bStyle fill:#e3f2fd,stroke:#1565C0,stroke-width:2px
    classDef aStyle fill:#e8f5e9,stroke:#2E7D32,stroke-width:2px

    class C,J,P bStyle
    class A1,A2,A3 aStyle
</pre>

## Übersetzungsdateien

- `updatepo` regeneriert nur die **Vorlage** (`messages.pot`). Die `.po`-Dateien selbst werden über **Weblate** aktualisiert, nicht lokal, um Konflikte zu vermeiden — siehe die Seite [Übersetzungs-Pipeline](./translation-pipeline).
- `po2php` wandelt die committeten `.po`-Dateien in die PHP-Arrays um, die webtrees zur Laufzeit lädt.
