Skip to content

Commit c82c3a6

Browse files
author
LB
authored
fix(gatsby-plugin-image): Conditionally require dependencies and give better warnings (#28921)
* Better error handling for missing dependencies * fix eslint * /reporter
1 parent d33793e commit c82c3a6

File tree

3 files changed

+44
-10
lines changed

3 files changed

+44
-10
lines changed

packages/gatsby-plugin-image/package.json

+1
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,7 @@
7676
"gatsby": ">=2",
7777
"gatsby-image": "*",
7878
"gatsby-plugin-sharp": "*",
79+
"gatsby-source-filesystem": "*",
7980
"react": ">=16.8.0",
8081
"react-dom": ">=16.8.0"
8182
},

packages/gatsby-plugin-image/src/node-apis/image-processing.ts

+41-9
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,11 @@ import {
55
Actions,
66
Store,
77
} from "gatsby"
8-
import * as PluginSharp from "gatsby-plugin-sharp"
9-
import { createFileNode } from "gatsby-source-filesystem/create-file-node"
108
import fs from "fs-extra"
119
import path from "path"
1210
import { ImageProps, SharpProps } from "../utils"
1311
import { watchImage } from "./watcher"
14-
import { createRemoteFileNode, FileSystemNode } from "gatsby-source-filesystem"
12+
import type { FileSystemNode } from "gatsby-source-filesystem"
1513

1614
const supportedTypes = new Set([`image/png`, `image/jpeg`, `image/webp`])
1715
export interface IImageMetadata {
@@ -25,15 +23,27 @@ export async function createImageNode({
2523
fullPath,
2624
createNodeId,
2725
createNode,
26+
reporter,
2827
}: {
2928
fullPath: string
3029
createNodeId: ParentSpanPluginArgs["createNodeId"]
3130
createNode: Actions["createNode"]
31+
reporter: Reporter
3232
}): Promise<FileSystemNode | undefined> {
3333
if (!fs.existsSync(fullPath)) {
3434
return undefined
3535
}
36-
const file: FileSystemNode = await createFileNode(fullPath, createNodeId, {})
36+
37+
let file: FileSystemNode
38+
try {
39+
const {
40+
createFileNode,
41+
} = require(`gatsby-source-filesystem/create-file-node`)
42+
file = await createFileNode(fullPath, createNodeId, {})
43+
} catch (e) {
44+
reporter.panic(`Please install gatsby-source-filesystem`)
45+
return undefined
46+
}
3747

3848
if (!file) {
3949
return undefined
@@ -75,6 +85,13 @@ export async function writeImages({
7585
let file: FileSystemNode | undefined
7686
let fullPath
7787
if (process.env.GATSBY_EXPERIMENTAL_REMOTE_IMAGES && isRemoteURL(src)) {
88+
let createRemoteFileNode
89+
try {
90+
;({ createRemoteFileNode } = require(`gatsby-source-filesystem`))
91+
} catch (e) {
92+
reporter.panic(`Please install gatsby-source-filesystem`)
93+
}
94+
7895
try {
7996
file = await createRemoteFileNode({
8097
url: src,
@@ -89,12 +106,12 @@ export async function writeImages({
89106
return
90107
}
91108
if (
92-
!file.internal.mediaType ||
109+
!file?.internal.mediaType ||
93110
!supportedTypes.has(file.internal.mediaType)
94111
) {
95112
reporter.error(
96113
`The file loaded from ${src} is not a valid image type. Found "${
97-
file.internal.mediaType || `unknown`
114+
file?.internal.mediaType || `unknown`
98115
}"`
99116
)
100117
return
@@ -106,7 +123,16 @@ export async function writeImages({
106123
reporter.warn(`Could not find image "${src}". Looked for ${fullPath}`)
107124
return
108125
}
109-
file = await createFileNode(fullPath, createNodeId, {})
126+
127+
try {
128+
const {
129+
createFileNode,
130+
} = require(`gatsby-source-filesystem/create-file-node`)
131+
132+
file = await createFileNode(fullPath, createNodeId, {})
133+
} catch (e) {
134+
reporter.panic(`Please install gatsby-source-filesystem`)
135+
}
110136
}
111137

112138
if (!file) {
@@ -161,15 +187,21 @@ export async function writeImage(
161187
cache: GatsbyCache,
162188
filename: string
163189
): Promise<void> {
190+
let generateImageData
191+
try {
192+
generateImageData = require(`gatsby-plugin-sharp`).generateImageData
193+
} catch (e) {
194+
reporter.panic(`Please install gatsby-plugin-sharp`)
195+
}
164196
try {
165197
const options = { file, args, pathPrefix, reporter, cache }
166198

167-
if (!PluginSharp.generateImageData) {
199+
if (!generateImageData) {
168200
reporter.warn(`Please upgrade gatsby-plugin-sharp`)
169201
return
170202
}
171203
// get standard set of fields from sharp
172-
const sharpData = await PluginSharp.generateImageData(options)
204+
const sharpData = await generateImageData(options)
173205

174206
if (sharpData) {
175207
// Write the image properties to the cache

packages/gatsby-plugin-image/src/node-apis/watcher.ts

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import chokidar, { FSWatcher } from "chokidar"
22
import { Actions, ParentSpanPluginArgs, GatsbyCache, Reporter } from "gatsby"
33
import { createImageNode, IImageMetadata, writeImage } from "./image-processing"
4-
import { FileSystemNode } from "gatsby-source-filesystem"
4+
import type { FileSystemNode } from "gatsby-source-filesystem"
55

66
let watcher: FSWatcher | undefined
77

@@ -34,6 +34,7 @@ export function watchImage({
3434
fullPath: path,
3535
createNodeId,
3636
createNode,
37+
reporter,
3738
})
3839
if (!node) {
3940
reporter.warn(`Could not process image ${path}`)

0 commit comments

Comments
 (0)