Skip to content

Commit df98ccd

Browse files
authored
Merge pull request #24 from devatherock/exclusions
feat: Added ability to exclude specific files from minification
2 parents cb44392 + 549df04 commit df98ccd

File tree

5 files changed

+82
-14
lines changed

5 files changed

+82
-14
lines changed

CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
# Changelog
22

33
## [Unreleased]
4+
### Added
5+
- [#22](https://github.com/devatherock/minify-js/issues/22): Ability to exclude specific files/folders within the input directory from minification
6+
47
### Changed
58
- Replaced `ubuntu-2004:2022.04.1` image with `ubuntu-2204:2023.04.2`
69

README.md

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ The following parameters can be set to configure the action.
2121

2222
* **inclusions** - Multi-line string, each line of which contains a regex representing files/paths within the input directory to include/minify. By default, all files in the input directory will be minified
2323

24+
* **exclusions** - Multi-line string, each line of which contains a regex representing files to exclude from minification. By default, no file in the input directory will be excluded
25+
2426
```yaml
2527
jobs:
2628
build:
@@ -35,6 +37,8 @@ jobs:
3537
inclusions: |- # Optional
3638
.*assets.*
3739
.*static/index.html
40+
exclusions: |- # Optional
41+
.*assets/generated/.*
3842
```
3943
4044
### Docker
@@ -47,6 +51,7 @@ docker run --rm \
4751
-e PARAMETER_OUTPUT_PATH=/work/minify/src \
4852
-e PARAMETER_ADD_SUFFIX=false \
4953
-e PARAMETER_INCLUSIONS=".*assets.*\n.*static/index.html" \
54+
-e PARAMETER_EXCLUSIONS=".*assets/generated/.*" \
5055
devatherock/minify-js:3.0.0
5156
```
5257

@@ -63,6 +68,8 @@ The following parameters can be set to configure the plugin.
6368

6469
* **inclusions** - Multi-line string, each line of which contains a regex representing files to include/minify. By default, all files in the input directory will be minified
6570

71+
* **exclusions** - Multi-line string, each line of which contains a regex representing files to exclude from minification. By default, no file in the input directory will be excluded
72+
6673
```yaml
6774
steps:
6875
- name: minify_js
@@ -77,6 +84,8 @@ steps:
7784
inclusions: |-
7885
.*assets.*
7986
.*static/index.html
87+
exclusions: |-
88+
.*assets/generated/.*
8089
```
8190
8291
### CircleCI
@@ -93,6 +102,7 @@ jobs:
93102
PARAMETER_OUTPUT_PATH: minify/src
94103
PARAMETER_ADD_SUFFIX: false
95104
PARAMETER_INCLUSIONS: '.*assets.*\n.*static/index.html'
105+
PARAMETER_EXCLUSIONS: '.*assets/generated/.*'
96106
steps:
97107
- checkout
98108
- run: node /app/bin/cli.mjs

bin/cli.mjs

Lines changed: 24 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,26 @@ import { hideBin } from 'yargs/helpers'
55
import { minifyFiles } from '../lib/minify-js.mjs'
66
import { stringToBoolean, valueFromEnvVariables, getLogger } from '../lib/utils.mjs'
77

8+
function readRegexArray(array) {
9+
var regexes = []
10+
11+
if (array) {
12+
const arrayParts = array.replace('\\n', '\n').split(/[\r\n]+/)
13+
getLogger().debug('Regexes: ', arrayParts)
14+
15+
for (var index = 0; index < arrayParts.length; index++) {
16+
regexes.push(RegExp(arrayParts[index]))
17+
}
18+
}
19+
20+
return regexes
21+
}
22+
823
const inputPathVariables = ['PLUGIN_INPUT_PATH', 'PARAMETER_INPUT_PATH', 'INPUT_DIRECTORY']
924
const outputPathVariables = ['PLUGIN_OUTPUT_PATH', 'PARAMETER_OUTPUT_PATH', 'INPUT_OUTPUT']
1025
const addSuffixVariables = ['PLUGIN_ADD_SUFFIX', 'PARAMETER_ADD_SUFFIX', 'INPUT_ADD_SUFFIX']
1126
const inclusionsVariables = ['PLUGIN_INCLUSIONS', 'PARAMETER_INCLUSIONS', 'INPUT_INCLUSIONS']
27+
const exclusionsVariables = ['PLUGIN_EXCLUSIONS', 'PARAMETER_EXCLUSIONS', 'INPUT_EXCLUSIONS']
1228

1329
const options = yargs(hideBin(process.argv))
1430
.option('input-path', {
@@ -34,24 +50,21 @@ const options = yargs(hideBin(process.argv))
3450
description: 'Multi-line string, each line of which contains a regex representing files to include/minify',
3551
default: valueFromEnvVariables(inclusionsVariables)
3652
})
53+
.option('exclusions', {
54+
type: 'string',
55+
description: 'Multi-line string, each line of which contains a regex representing files to exclude from minification',
56+
default: valueFromEnvVariables(exclusionsVariables)
57+
})
3758
.parse()
3859

3960
const inputPath = options.i
4061
const outputPath = options.o
4162
const addSuffix = options.a
42-
var inclusions = []
43-
44-
if (options.inclusions) {
45-
const inclusionParts = options.inclusions.replace('\\n', '\n').split(/[\r\n]+/)
46-
getLogger().debug('Inclusions: ', inclusionParts)
47-
48-
for (var index = 0; index < inclusionParts.length; index++) {
49-
inclusions.push(RegExp(inclusionParts[index]))
50-
}
51-
}
63+
var inclusions = readRegexArray(options.inclusions)
64+
var exclusions = readRegexArray(options.exclusions)
5265

5366
if (fs.existsSync(inputPath)) {
54-
minifyFiles(inputPath, addSuffix, outputPath, inclusions)
67+
minifyFiles(inputPath, addSuffix, outputPath, inclusions, exclusions)
5568
} else {
5669
getLogger().error('Input path ', inputPath, " doesn't exist")
5770
}

lib/minify-js.mjs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -42,21 +42,22 @@ export async function minifyFile (inputFile, addSuffix, outputPath) {
4242
getLogger().info('Minified ', inputFile, ' > ', outputFileName)
4343
}
4444

45-
export function minifyFiles (inputPath, addSuffix, outputPath, inclusions) {
45+
export function minifyFiles (inputPath, addSuffix, outputPath, inclusions, exclusions) {
4646
if (isDirectory(inputPath)) {
4747
getLogger().debug('Input path ', inputPath, ' is a directory')
4848

4949
// Loop through all the files in the input path
5050
fs.readdir(inputPath, function (_, files) {
5151
files.forEach(function (file, index) {
52-
minifyFiles(pathWithTrailingSeparator(inputPath) + file, addSuffix, outputPath, inclusions)
52+
minifyFiles(pathWithTrailingSeparator(inputPath) + file, addSuffix, outputPath, inclusions, exclusions)
5353
})
5454
})
5555
} else {
5656
getLogger().debug('Input path ', inputPath, ' is a file')
5757

5858
if (supportedExtensions.includes(path.extname(inputPath))) {
59-
if (inclusions.length === 0 || inclusions.some((regex) => regex.test(inputPath))) {
59+
if ((inclusions.length === 0 || inclusions.some((regex) => regex.test(inputPath)))
60+
&& (exclusions.length === 0 || !exclusions.some((regex) => regex.test(inputPath)))) {
6061
minifyFile(inputPath, addSuffix, outputPath)
6162
} else {
6263
getLogger().debug('Skipping file ', inputPath, " that doesn't match any inclusions")

src/test/groovy/io/github/devatherock/minify/MinifyJsDockerSpec.groovy

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -243,4 +243,45 @@ class MinifyJsDockerSpec extends Specification {
243243
'github'
244244
]
245245
}
246+
247+
@Unroll
248+
void 'test minify - exclusions specified. ci: #ci'() {
249+
given:
250+
String outputHtmlFile = "${System.properties['user.dir']}/src/test/resources/output/index.min.html"
251+
String outputJsFile = "${System.properties['user.dir']}/src/test/resources/output/scripts.min.js"
252+
String outputCssFile = "${System.properties['user.dir']}/src/test/resources/output/main.min.css"
253+
254+
when:
255+
def output = ProcessUtil.executeCommand(['docker', 'run', '--rm',
256+
'-v', "${System.properties['user.dir']}:/work",
257+
'-w=/work',
258+
'-e', "${config[ci].inputPathParam}=/work/src/test/resources",
259+
'-e', "${config[ci].outputPathParam}=/work/src/test/resources/output",
260+
'-e', "${config[ci].envPrefix}EXCLUSIONS=.*static/.*",
261+
imageName])
262+
263+
then:
264+
output[0] == 0
265+
output[1].contains('Minified /work/src/test/resources/scripts/scripts.js > /work/src/test/resources/output/scripts.min.js')
266+
new File(outputJsFile).text ==
267+
'$((function(){$("#templateAndModelForm *:input[type!=hidden]:first").focus()}));\n'
268+
269+
then: "html and css output files should not exist as their parent folder was specified in exclusions"
270+
Files.notExists(Paths.get(outputHtmlFile))
271+
Files.notExists(Paths.get(outputCssFile))
272+
!output[1].contains('Minified /work/src/test/resources/static/index.html > /work/src/test/resources/output/index.min.html')
273+
!output[1].contains('Minified /work/src/test/resources/static/main.css > /work/src/test/resources/output/main.min.css')
274+
275+
cleanup:
276+
Files.deleteIfExists(Paths.get(outputHtmlFile))
277+
Files.deleteIfExists(Paths.get(outputJsFile))
278+
Files.deleteIfExists(Paths.get(outputCssFile))
279+
280+
where:
281+
ci << [
282+
'drone',
283+
'vela',
284+
'github'
285+
]
286+
}
246287
}

0 commit comments

Comments
 (0)