Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions .changeset/zero-config-auto-mode.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
---
"@node-minify/action": minor
"@node-minify/utils": minor
---

feat: add zero-config auto mode for GitHub Action with smart file discovery

Adds `auto: true` mode that automatically discovers and minifies files without explicit input/output configuration. Includes smart file type detection, default glob patterns for common source directories, and comprehensive ignore patterns. Also adds ignore patterns support to the wildcards utility function.
168 changes: 167 additions & 1 deletion .github/workflows/test-action.yml
Original file line number Diff line number Diff line change
Expand Up @@ -101,6 +101,11 @@ jobs:
input: "test-action/input.js"
output: "test-action/output.min.js"
compressor: "terser"
auto: 'false'
patterns: ''
output-dir: 'dist'
ignore: ''
dry-run: 'false'

- name: Verify terser outputs
env:
Expand Down Expand Up @@ -137,6 +142,11 @@ jobs:
output: "test-action/output.esbuild.js"
compressor: "esbuild"
type: "js"
auto: 'false'
patterns: ''
output-dir: 'dist'
ignore: ''
dry-run: 'false'

- name: Compare results
env:
Expand Down Expand Up @@ -217,6 +227,11 @@ jobs:
output: "test-action/output.min.css"
compressor: "lightningcss"
type: "css"
auto: 'false'
patterns: ''
output-dir: 'dist'
ignore: ''
dry-run: 'false'

- name: Verify CSS output
run: |
Expand All @@ -231,10 +246,161 @@ jobs:

cat test-action/output.min.css

test-zero-config:
name: Test Zero Config (Auto Mode)
runs-on: ubuntu-latest
needs: build-action
steps:
- uses: actions/checkout@v4

- name: Download built action
uses: actions/download-artifact@v4
with:
name: action-dist
path: packages/action/dist/

- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: "20"

- name: Install compressors
run: |
mkdir -p /tmp/compressors && cd /tmp/compressors
npm init -y
npm install @node-minify/terser @node-minify/lightningcss
mkdir -p $GITHUB_WORKSPACE/node_modules
cp -r /tmp/compressors/node_modules/* $GITHUB_WORKSPACE/node_modules/

- name: Create test files
run: |
mkdir -p src
cat > src/app.js << 'EOF'
function hello() { console.log("hello world"); }
EOF

cat > src/utils.js << 'EOF'
export const add = (a, b) => a + b;
EOF

cat > src/styles.css << 'EOF'
body { margin: 0; padding: 0; }
EOF

- name: Run auto mode
uses: ./
with:
auto: "true"
output-dir: "dist"

- name: Verify outputs
run: |
test -f dist/src/app.js || (echo "dist/src/app.js not found" && exit 1)
test -f dist/src/utils.js || (echo "dist/src/utils.js not found" && exit 1)
test -f dist/src/styles.css || (echo "dist/src/styles.css not found" && exit 1)
echo "All output files created successfully"

test-zero-config-dry-run:
name: Test Zero Config Dry Run
runs-on: ubuntu-latest
needs: build-action
steps:
- uses: actions/checkout@v4

- name: Download built action
uses: actions/download-artifact@v4
with:
name: action-dist
path: packages/action/dist/

- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: "20"

- name: Install compressor
run: |
mkdir -p /tmp/compressors && cd /tmp/compressors
npm init -y
npm install @node-minify/terser
mkdir -p $GITHUB_WORKSPACE/node_modules
cp -r /tmp/compressors/node_modules/* $GITHUB_WORKSPACE/node_modules/

- name: Create test file
run: |
mkdir -p src
cat > src/app.js << 'EOF'
function test() { return 42; }
EOF

- name: Run dry-run mode
uses: ./
with:
auto: "true"
dry-run: "true"
output-dir: "dist"

- name: Verify no output created
run: |
test ! -d dist || (echo "dist/ should not exist in dry-run" && exit 1)
echo "Dry-run passed - no output created"

test-zero-config-custom-patterns:
name: Test Zero Config Custom Patterns
runs-on: ubuntu-latest
needs: build-action
steps:
- uses: actions/checkout@v4

- name: Download built action
uses: actions/download-artifact@v4
with:
name: action-dist
path: packages/action/dist/

- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: "20"

- name: Install compressor
run: |
mkdir -p /tmp/compressors && cd /tmp/compressors
npm init -y
npm install @node-minify/terser
mkdir -p $GITHUB_WORKSPACE/node_modules
cp -r /tmp/compressors/node_modules/* $GITHUB_WORKSPACE/node_modules/

- name: Create files in custom directory
run: |
mkdir -p custom/path
cat > custom/path/main.js << 'EOF'
console.log("custom location");
EOF

- name: Run with custom patterns
uses: ./
with:
auto: "true"
patterns: "custom/**/*.js"
output-dir: "dist"

- name: Verify custom output
run: |
test -f dist/custom/path/main.js || (echo "dist/custom/path/main.js not found" && exit 1)
echo "Custom patterns worked correctly"

test-summary:
name: Summary
runs-on: ubuntu-latest
needs: [test-js-minification, test-css-minification]
needs:
[
test-js-minification,
test-css-minification,
test-zero-config,
test-zero-config-dry-run,
test-zero-config-custom-patterns,
]
steps:
- name: All tests passed
run: echo "All node-minify action tests passed!"
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -16,3 +16,5 @@ examples/public/**/*-dist
examples/public/**/*.min.html
packages/utils/__tests__/temp_perf/
*.tmp
.sisyphus/
.claude/
22 changes: 20 additions & 2 deletions action.yml
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,28 @@ branding:
inputs:
input:
description: "Files to minify (glob pattern or path)"
required: true
required: false
output:
description: "Output file path"
required: true
required: false
auto:
description: "Enable zero-config auto mode"
required: false
default: "false"
patterns:
description: "Custom glob patterns for auto mode (comma-separated)"
required: false
output-dir:
description: "Output directory for auto mode"
required: false
default: "dist"
ignore:
description: "Additional ignore patterns for auto mode (comma-separated)"
required: false
dry-run:
description: "Preview mode - show what would be processed without minifying"
required: false
default: "false"
compressor:
description: |
Compressor to use.
Expand Down
134 changes: 134 additions & 0 deletions docs/src/content/docs/github-action.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,140 @@ Minify JavaScript, CSS, and HTML files directly in your GitHub workflows with de
- 🎯 **Thresholds** - Fail builds on size regressions
- 🏁 **Benchmark** - Compare compressor performance

## Zero-Config Mode

Enable automatic file discovery and compressor selection with `auto: true`. The action scans standard directories (`src/`, `app/`, `lib/`, `styles/`), detects file types, and applies appropriate compressors automatically.

### How It Works

1. **File Discovery**: Scans project for JS, CSS, HTML, JSON, and SVG files
2. **Type Detection**: Determines file type from extension
3. **Compressor Selection**: Chooses optimal compressor per file type
4. **Parallel Processing**: Minifies files concurrently with concurrency limit
5. **Grouped Results**: Summary organized by file type

### Default Behavior

**Included Directories**:
- `src/**/*.{js,mjs,cjs,jsx,css,html,htm,json,svg}`
- `app/**/*.{js,mjs,cjs,jsx,css,html,htm,json,svg}`
- `lib/**/*.{js,mjs,cjs,jsx,css,html,htm,json,svg}`
- `styles/**/*.{css}`
- Root-level `*.{js,css,html,json,svg}`

**Excluded By Default**:
- `**/node_modules/**`
- `**/dist/**`, `**/build/**`, `**/.next/**`
- `**/*.min.{js,css}` (already minified)
- `**/__tests__/**` (test files)
- `**/.*` (hidden files)
- `**/*.d.ts` (TypeScript declarations)

**Note**: TypeScript files (`.ts`, `.tsx`) are excluded. Minifiers operate on compiled JavaScript, not TypeScript source. Compile first, then minify.

### Required Compressor Packages

| File Type | Default Compressor | Required Package |
|-----------|-------------------|------------------|
| JavaScript (`.js`, `.mjs`, `.cjs`, `.jsx`) | terser | `@node-minify/terser` |
| CSS (`.css`) | lightningcss | `@node-minify/lightningcss` |
| HTML (`.html`, `.htm`) | html-minifier | `@node-minify/html-minifier` |
| JSON (`.json`) | jsonminify | `@node-minify/jsonminify` |
| SVG (`.svg`) | svgo | `@node-minify/svgo` |

**Install only the compressors you need** based on your project's file types.

### Basic Usage

```yaml
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '20'

# Install compressors for your file types
- name: Install compressors
run: |
npm install @node-minify/terser @node-minify/lightningcss

- name: Minify all files
uses: srod/node-minify@v1
with:
auto: 'true'
```

Output files preserve directory structure in `dist/`:
- `src/app.js` → `dist/src/app.js`
- `src/styles.css` → `dist/src/styles.css`

### Custom Patterns

Override default patterns to target specific files:

```yaml
- name: Minify custom locations
uses: srod/node-minify@v1
with:
auto: 'true'
patterns: 'public/**/*.js,assets/**/*.css'
output-dir: 'build'
```

### Custom Ignore Patterns

Add additional ignore patterns (merges with defaults):

```yaml
- name: Minify with custom ignores
uses: srod/node-minify@v1
with:
auto: 'true'
ignore: '**/*.config.js,**/vendor/**'
```

### Dry-Run Mode

Preview which files would be processed without minifying:

```yaml
- name: Preview auto mode
uses: srod/node-minify@v1
with:
auto: 'true'
dry-run: 'true'
```

Check the job summary or logs to see discovered files.

### Inputs

| Input | Description | Required | Default |
|-------|-------------|----------|---------|
| `auto` | Enable zero-config mode | No | `false` |
| `patterns` | Custom glob patterns (comma-separated) | No | Standard directories |
| `output-dir` | Output directory | No | `dist` |
| `ignore` | Additional ignore patterns (comma-separated) | No | - |
| `dry-run` | Preview mode - discover files without processing | No | `false` |

### Example: Mixed Project

For a project with JavaScript, CSS, and HTML:

```yaml
- name: Install all compressors
run: |
npm install \
@node-minify/terser \
@node-minify/lightningcss \
@node-minify/html-minifier

- name: Minify all assets
uses: srod/node-minify@v1
with:
auto: 'true'
output-dir: 'public/dist'
```

## Quick Start

```yaml
Expand Down
Loading