Skip to content

Commit 84186ac

Browse files
authored
Merge pull request #2756 from srod/develop
feat: new benchmark feature, minify-html compressor, and image optimization support
2 parents b3be590 + 9260971 commit 84186ac

174 files changed

Lines changed: 7783 additions & 333 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.Jules/palette.md

Lines changed: 0 additions & 3 deletions
This file was deleted.
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
---
2+
"@node-minify/minify-html": minor
3+
"@node-minify/cli": minor
4+
---
5+
6+
Add new `@node-minify/minify-html` compressor package
7+
8+
- Wraps [@minify-html/node](https://github.com/wilsonzlin/minify-html), a high-performance Rust-based HTML minifier
9+
- Significantly faster than JavaScript alternatives
10+
- Includes inline CSS minification via lightningcss (enabled by default)
11+
- Inline JS minification available via `minify_js: true` option
12+
- Supports template syntax preservation (Jinja, EJS, ERB, Handlebars)
13+
- Registered in CLI for use with `--compressor minify-html`
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
---
2+
"@node-minify/cli": minor
3+
"@node-minify/benchmark": minor
4+
---
5+
6+
Add benchmark feature to compare compressor performance.
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
---
2+
"@node-minify/utils": minor
3+
---
4+
5+
Add `resolveCompressor` utility for dynamic compressor loading
6+
7+
- Resolves built-in @node-minify compressors by name (e.g., "terser", "esbuild")
8+
- Supports npm packages as custom compressors
9+
- Supports local file paths (e.g., "./my-compressor.js")
10+
- Intelligent export detection: known export, camelCase name, 'compressor', default, or first function
11+
- Also exports `isBuiltInCompressor` and `getKnownExportName` helpers
Lines changed: 132 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,132 @@
1+
# node-minify GitHub Action
2+
3+
Minify JavaScript, CSS, and HTML files in your CI/CD pipeline with detailed reporting.
4+
5+
## Usage
6+
7+
### Basic Example
8+
9+
```yaml
10+
- name: Minify JavaScript
11+
uses: srod/node-minify/.github/actions/node-minify@main
12+
with:
13+
input: "src/app.js"
14+
output: "dist/app.min.js"
15+
compressor: "terser"
16+
```
17+
18+
### With All Options
19+
20+
```yaml
21+
- name: Minify with full options
22+
id: minify
23+
uses: srod/node-minify/.github/actions/node-minify@main
24+
with:
25+
input: "src/app.js"
26+
output: "dist/app.min.js"
27+
compressor: "esbuild"
28+
type: "js"
29+
options: '{"minify": true}'
30+
report-summary: "true"
31+
include-gzip: "true"
32+
33+
- name: Show results
34+
run: |
35+
echo "Reduction: ${{ steps.minify.outputs.reduction-percent }}%"
36+
```
37+
38+
## Inputs
39+
40+
| Input | Description | Required | Default |
41+
|-------|-------------|----------|---------|
42+
| `input` | Files to minify (glob pattern or path) | Yes | - |
43+
| `output` | Output file path | Yes | - |
44+
| `compressor` | Compressor to use | No | `terser` |
45+
| `type` | File type: js, css, or html | No | - |
46+
| `options` | Compressor options (JSON) | No | `{}` |
47+
| `report-summary` | Add results to job summary | No | `true` |
48+
| `include-gzip` | Include gzip sizes | No | `true` |
49+
| `java-version` | Java version for gcc/yui | No | - |
50+
51+
### Available Compressors
52+
53+
**JavaScript (no Java required):**
54+
- `terser` (recommended)
55+
- `esbuild` (fastest)
56+
- `swc`
57+
- `oxc`
58+
- `uglify-js`
59+
60+
**CSS (no Java required):**
61+
- `lightningcss` (recommended)
62+
- `clean-css`
63+
- `cssnano`
64+
- `csso`
65+
- `esbuild`
66+
67+
**HTML:**
68+
- `html-minifier`
69+
70+
**Requires Java:**
71+
- `gcc` (Google Closure Compiler)
72+
- `yui` (deprecated)
73+
74+
## Outputs
75+
76+
| Output | Description |
77+
|--------|-------------|
78+
| `original-size` | Original size in bytes |
79+
| `original-size-formatted` | Original size formatted (e.g., 45.2 kB) |
80+
| `minified-size` | Minified size in bytes |
81+
| `minified-size-formatted` | Minified size formatted |
82+
| `reduction-percent` | Size reduction percentage |
83+
| `gzip-size` | Gzipped size in bytes |
84+
| `gzip-size-formatted` | Gzipped size formatted |
85+
| `time-ms` | Compression time in milliseconds |
86+
87+
## Examples
88+
89+
### CSS Minification
90+
91+
```yaml
92+
- name: Minify CSS
93+
uses: srod/node-minify/.github/actions/node-minify@main
94+
with:
95+
input: "src/styles.css"
96+
output: "dist/styles.min.css"
97+
compressor: "lightningcss"
98+
type: "css"
99+
```
100+
101+
### Using Google Closure Compiler
102+
103+
```yaml
104+
- name: Setup Java
105+
uses: actions/setup-java@v4
106+
with:
107+
distribution: "temurin"
108+
java-version: "17"
109+
110+
- name: Minify with GCC
111+
uses: srod/node-minify/.github/actions/node-minify@main
112+
with:
113+
input: "src/app.js"
114+
output: "dist/app.min.js"
115+
compressor: "gcc"
116+
options: '{"compilation_level": "ADVANCED_OPTIMIZATIONS"}'
117+
```
118+
119+
### HTML Minification
120+
121+
```yaml
122+
- name: Minify HTML
123+
uses: srod/node-minify/.github/actions/node-minify@main
124+
with:
125+
input: "src/index.html"
126+
output: "dist/index.html"
127+
compressor: "html-minifier"
128+
```
129+
130+
## License
131+
132+
MIT
Lines changed: 137 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,137 @@
1+
name: "node-minify"
2+
description: "Minify JavaScript, CSS, and HTML files with detailed reporting"
3+
author: "srod"
4+
branding:
5+
icon: "minimize-2"
6+
color: "green"
7+
8+
inputs:
9+
input:
10+
description: "Files to minify (glob pattern or path)"
11+
required: true
12+
compressor:
13+
description: |
14+
Compressor to use.
15+
Recommended: terser, esbuild, swc (fast, no Java).
16+
Note: 'gcc' and 'yui' require Java (pre-installed on GitHub runners).
17+
required: false
18+
default: "terser"
19+
output:
20+
description: "Output file path"
21+
required: true
22+
type:
23+
description: "File type: js or css (required for esbuild, lightningcss, yui)"
24+
required: false
25+
options:
26+
description: "Compressor-specific options (JSON string)"
27+
required: false
28+
default: "{}"
29+
report-summary:
30+
description: "Add results to job summary"
31+
required: false
32+
default: "true"
33+
include-gzip:
34+
description: "Include gzip sizes in report"
35+
required: false
36+
default: "true"
37+
java-version:
38+
description: "Java version for gcc/yui compressors (optional)"
39+
required: false
40+
41+
outputs:
42+
original-size:
43+
description: "Original file size in bytes"
44+
value: ${{ steps.minify.outputs.original-size }}
45+
original-size-formatted:
46+
description: "Original file size formatted (e.g., 45.2 kB)"
47+
value: ${{ steps.minify.outputs.original-size-formatted }}
48+
minified-size:
49+
description: "Minified file size in bytes"
50+
value: ${{ steps.minify.outputs.minified-size }}
51+
minified-size-formatted:
52+
description: "Minified file size formatted (e.g., 12.3 kB)"
53+
value: ${{ steps.minify.outputs.minified-size-formatted }}
54+
reduction-percent:
55+
description: "Size reduction percentage"
56+
value: ${{ steps.minify.outputs.reduction-percent }}
57+
gzip-size:
58+
description: "Gzipped size in bytes"
59+
value: ${{ steps.minify.outputs.gzip-size }}
60+
gzip-size-formatted:
61+
description: "Gzipped size formatted"
62+
value: ${{ steps.minify.outputs.gzip-size-formatted }}
63+
time-ms:
64+
description: "Compression time in milliseconds"
65+
value: ${{ steps.minify.outputs.time-ms }}
66+
67+
runs:
68+
using: "composite"
69+
steps:
70+
# Setup Java for gcc/yui compressors (auto-setup with default if java-version not specified)
71+
- name: Setup Java (for gcc/yui)
72+
if: contains(fromJSON('["gcc", "google-closure-compiler", "yui"]'), inputs.compressor)
73+
uses: actions/setup-java@v4
74+
with:
75+
distribution: "temurin"
76+
java-version: ${{ inputs.java-version || '17' }}
77+
78+
# Warn about deprecated yui compressor
79+
- name: Deprecation warning (yui)
80+
if: inputs.compressor == 'yui'
81+
shell: bash
82+
run: |
83+
echo "::warning::YUI Compressor was deprecated by Yahoo in 2013. Consider using 'terser' for JS or 'lightningcss' for CSS."
84+
85+
- name: Setup Bun
86+
uses: oven-sh/setup-bun@v2
87+
with:
88+
bun-version: "1.3.5"
89+
90+
- name: Install dependencies
91+
shell: bash
92+
env:
93+
ACTION_PATH: ${{ github.action_path }}
94+
COMPRESSOR: ${{ inputs.compressor }}
95+
run: |
96+
TEMP_DIR="${RUNNER_TEMP}/node-minify-action"
97+
mkdir -p "$TEMP_DIR"
98+
cd "$TEMP_DIR"
99+
bun init -y
100+
bun add @node-minify/core @node-minify/utils "@node-minify/${COMPRESSOR}"
101+
cp "$ACTION_PATH/minify.ts" "$TEMP_DIR/"
102+
echo "NODE_MINIFY_ACTION_DIR=$TEMP_DIR" >> $GITHUB_ENV
103+
104+
- name: Run minification
105+
id: minify
106+
shell: bash
107+
env:
108+
INPUT_FILE: ${{ inputs.input }}
109+
OUTPUT_FILE: ${{ inputs.output }}
110+
COMPRESSOR: ${{ inputs.compressor }}
111+
FILE_TYPE: ${{ inputs.type }}
112+
OPTIONS: ${{ inputs.options }}
113+
INCLUDE_GZIP: ${{ inputs.include-gzip }}
114+
WORKSPACE_DIR: ${{ github.workspace }}
115+
run: |
116+
cd "$NODE_MINIFY_ACTION_DIR"
117+
bun run minify.ts
118+
119+
- name: Generate job summary
120+
if: inputs.report-summary == 'true'
121+
shell: bash
122+
run: |
123+
cat >> $GITHUB_STEP_SUMMARY << EOF
124+
## 📦 node-minify Results
125+
126+
| Metric | Value |
127+
|--------|-------|
128+
| **Input** | \`${{ inputs.input }}\` |
129+
| **Output** | \`${{ inputs.output }}\` |
130+
| **Compressor** | ${{ inputs.compressor }} |
131+
| **Original Size** | ${{ steps.minify.outputs.original-size-formatted }} |
132+
| **Minified Size** | ${{ steps.minify.outputs.minified-size-formatted }} |
133+
| **Reduction** | ${{ steps.minify.outputs.reduction-percent }}% |
134+
| **Gzip Size** | ${{ steps.minify.outputs.gzip-size-formatted }} |
135+
| **Time** | ${{ steps.minify.outputs.time-ms }}ms |
136+
137+
EOF

0 commit comments

Comments
 (0)