Skip to content

Commit 7fefec5

Browse files
committed
fix: 🐛 Copy output of unsupported images
Closes: #82
1 parent 36422cc commit 7fefec5

File tree

10 files changed

+59
-12
lines changed

10 files changed

+59
-12
lines changed

__tests__/cli/cache/index.test.ts

+2
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ describe('Cache', () => {
5858
cacheMeasurement,
5959
nonCacheMeasurement,
6060
errorMeasurement,
61+
pushInvalidFormatAssets: () => undefined,
6162
cliProgressBarIncrement,
6263
originalFilePath: path.join(srcDir, item.src),
6364
...item,
@@ -75,6 +76,7 @@ describe('Cache', () => {
7576
cacheMeasurement,
7677
nonCacheMeasurement,
7778
errorMeasurement,
79+
pushInvalidFormatAssets: () => undefined,
7880
cliProgressBarIncrement,
7981
originalFilePath: path.join(srcDir, item.src),
8082
...item,
Loading

__tests__/cli/image-optimize/index.test.ts

+6
Original file line numberDiff line numberDiff line change
@@ -47,4 +47,10 @@ describe('Image optimization.', () => {
4747
expect(exist('default_1920_75.avif')).toBeTruthy()
4848
expect(exist('default_3840_75.avif')).toBeTruthy()
4949
})
50+
51+
test('svg images copied', () => {
52+
expect(exist('default_10_75.svg')).toBeTruthy()
53+
expect(exist('default_1920_75.svg')).toBeTruthy()
54+
expect(exist('default_3840_75.svg')).toBeTruthy()
55+
})
5056
})

__tests__/cli/image-optimize/manifest.json

+3
Original file line numberDiff line numberDiff line change
@@ -13,3 +13,6 @@
1313
{"output":"/results/images/default_10_75.avif","src":"/default.avif","width":10,"quality":75,"extension":"avif"}
1414
{"output":"/results/images/default_1920_75.avif","src":"/default.avif","width":1920,"quality":75,"extension":"avif"}
1515
{"output":"/results/images/default_3840_75.avif","src":"/default.avif","width":3840,"quality":75,"extension":"avif"}
16+
{"output":"/results/images/default_10_75.svg","src":"/default.svg","width":10,"quality":75,"extension":"svg"}
17+
{"output":"/results/images/default_1920_75.svg","src":"/default.svg","width":1920,"quality":75,"extension":"svg"}
18+
{"output":"/results/images/default_3840_75.svg","src":"/default.svg","width":3840,"quality":75,"extension":"svg"}

__tests__/e2e/index.test.ts

+2
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@ const files = [
1515
'images/img_1920_75.webp',
1616
'images/img_2048_75.webp',
1717
'images/img_3840_75.webp',
18+
'images/img_1920_75.svg',
19+
'images/img_3840_75.svg',
1820
'og_1920_75.webp',
1921
'og_3840_75.webp',
2022
]

__tests__/e2e/pages/index.jsx

+3
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,9 @@ const IndexPage = () => {
1818
{/* Static image */}
1919
<Image src="/images/img.png" width={1920} height={1280} sizes="(min-width: 768px) 720px, 85vw" />
2020

21+
{/* Invalid format image */}
22+
<Image src="/images/img.svg" width={1920} height={1280} />
23+
2124
{/* External image */}
2225
<Image src="https://next-export-optimize-images.vercel.app/og.png" width={1920} height={1280} />
2326

__tests__/e2e/public/images/img.svg

+3
Loading

package.json

+3-2
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,14 @@
22
"name": "next-export-optimize-images",
33
"version": "1.5.0",
44
"description": "Optimize images at build time with Next.js.",
5-
"homepage": "https://next-export-optimize-images.vercel.app",
65
"keywords": [
76
"next.js",
87
"static",
98
"export",
109
"image",
1110
"optimization"
1211
],
12+
"homepage": "https://next-export-optimize-images.vercel.app",
1313
"bugs": {
1414
"url": "https://github.com/dc7290/next-export-optimize-images/issues"
1515
},
@@ -41,7 +41,8 @@
4141
"test:components:watch": "jest --watch __tests__/components",
4242
"pretest:e2e": "yarn pretest",
4343
"test:e2e": "jest __tests__/e2e",
44-
"semantic-release": "SKIP_BY_SEMANTIC_RELEASE=true semantic-release"
44+
"semantic-release": "SKIP_BY_SEMANTIC_RELEASE=true semantic-release",
45+
"typecheck": "yarn tsc --noEmit"
4546
},
4647
"lint-staged": {
4748
"*.{ts,tsx}": [

src/cli/external-images/index.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ type ExternalImagesDownloaderArgs = {
1414
const externalImagesDownloader = async ({ terse = false, manifest, destDir }: ExternalImagesDownloaderArgs) => {
1515
if (!terse) {
1616
// eslint-disable-next-line no-console
17-
console.log('Download external images.')
17+
console.log('\n- Download external images -')
1818
}
1919

2020
const promises: Promise<void>[] = []

src/cli/index.ts

+33-9
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ type GetOptimizeResultProps = {
2222
cacheMeasurement: () => void
2323
nonCacheMeasurement: () => void
2424
errorMeasurement: () => void
25+
pushInvalidFormatAssets: (asset: string) => void
2526
cliProgressBarIncrement: () => void
2627
originalFilePath: string
2728
sharpOptions?: Config['sharpOptions']
@@ -36,6 +37,7 @@ export const getOptimizeResult: GetOptimizeResult = async ({
3637
cacheMeasurement,
3738
nonCacheMeasurement,
3839
errorMeasurement,
40+
pushInvalidFormatAssets,
3941
cliProgressBarIncrement,
4042
originalFilePath,
4143
output,
@@ -102,13 +104,23 @@ export const getOptimizeResult: GetOptimizeResult = async ({
102104
cliProgressBarIncrement()
103105
} catch (error) {
104106
console.warn(error)
107+
cliProgressBarIncrement()
105108
errorMeasurement()
106109
}
107110
} else {
108-
console.warn(
109-
`${originalFilePath}: Not an allowed format.\`${extension}\`\nGive \`unoptimize\`prop to /next/image to disable optimization.`
110-
)
111-
errorMeasurement()
111+
try {
112+
const filePath = path.join(destDir, output)
113+
await fs.ensureFile(filePath)
114+
115+
await fs.copy(originalFilePath, filePath)
116+
117+
pushInvalidFormatAssets(originalFilePath)
118+
cliProgressBarIncrement()
119+
} catch (error) {
120+
console.warn(error)
121+
cliProgressBarIncrement()
122+
errorMeasurement()
123+
}
112124
}
113125
}
114126

@@ -137,6 +149,8 @@ export const optimizeImages = async ({ manifestJsonPath, noCache, config, terse
137149
}
138150

139151
if (!terse) {
152+
// eslint-disable-next-line no-console
153+
console.log(`\n- Image Optimization -`)
140154
cliProgressBarStart(manifest.length)
141155
}
142156

@@ -152,10 +166,12 @@ export const optimizeImages = async ({ manifestJsonPath, noCache, config, terse
152166
let measuredCache = 0
153167
let measuredNonCache = 0
154168
let measuredError = 0
169+
const invalidFormatAssets = new Set<string>([])
155170

156171
const cacheMeasurement = () => (measuredCache += 1)
157172
const nonCacheMeasurement = () => (measuredNonCache += 1)
158173
const errorMeasurement = () => (measuredError += 1)
174+
const pushInvalidFormatAssets = (asset: string) => invalidFormatAssets.add(asset)
159175

160176
for (const item of manifest) {
161177
const originalFilePath = path.join(destDir, item.src)
@@ -169,6 +185,7 @@ export const optimizeImages = async ({ manifestJsonPath, noCache, config, terse
169185
cacheMeasurement,
170186
nonCacheMeasurement,
171187
errorMeasurement,
188+
pushInvalidFormatAssets,
172189
cliProgressBarIncrement: terse ? () => undefined : cliProgressBarIncrement,
173190
originalFilePath,
174191
sharpOptions: config.sharpOptions ?? {},
@@ -185,11 +202,18 @@ export const optimizeImages = async ({ manifestJsonPath, noCache, config, terse
185202

186203
if (!terse) {
187204
// eslint-disable-next-line no-console
188-
console.log(
189-
`Cache assets: ${measuredCache}, NonCache assets: ${measuredNonCache}, Error assets: ${measuredError}\n`,
190-
'\x1b[35m\nSuccessful optimization!',
191-
'\x1b[39m'
192-
)
205+
console.log(`Cache assets: ${measuredCache}, NonCache assets: ${measuredNonCache}, Error assets: ${measuredError}`)
206+
207+
if (invalidFormatAssets.size !== 0) {
208+
// eslint-disable-next-line no-console
209+
console.log(
210+
`\nThe following images is in a non-optimized format and a simple copy was applied.\n`,
211+
Array.from(invalidFormatAssets).join('\n')
212+
)
213+
}
214+
215+
// eslint-disable-next-line no-console
216+
console.log('\x1b[35m\nSuccessful optimization!', '\x1b[39m')
193217
}
194218
}
195219

0 commit comments

Comments
 (0)