Skip to content

Commit c4978e9

Browse files
KyleAMathewspieh
andauthored
feature(gatsby): Warn when there's unknown flags in gatsby-config.js & suggest fixes to potential typos (#28326)
* feature(gatsby): Warn when there's unknown flags in gatsby-config.js & suggest fixes to potential typos * Update packages/gatsby/src/utils/handle-flags.ts Co-authored-by: Michal Piechowiak <[email protected]> * Reformat message per @pieh's suggestion * make typescript happy Co-authored-by: Michal Piechowiak <[email protected]>
1 parent a84f78e commit c4978e9

File tree

5 files changed

+89
-3
lines changed

5 files changed

+89
-3
lines changed

examples/using-drupal/gatsby-config.js

+3
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
11
module.exports = {
2+
flags: {
3+
DEV_SSR: true,
4+
},
25
siteMetadata: {
36
title: `Gatsby with Drupal`,
47
},

packages/gatsby/src/services/initialize.ts

+5-1
Original file line numberDiff line numberDiff line change
@@ -186,11 +186,15 @@ export async function initialize({
186186
if (config && config.flags) {
187187
const availableFlags = require(`../utils/flags`).default
188188
// Get flags
189-
const { enabledConfigFlags, message } = handleFlags(
189+
const { enabledConfigFlags, unknownFlagMessage, message } = handleFlags(
190190
availableFlags,
191191
config.flags
192192
)
193193

194+
if (unknownFlagMessage !== ``) {
195+
reporter.warn(unknownFlagMessage)
196+
}
197+
194198
// set process.env for each flag
195199
enabledConfigFlags.forEach(flag => {
196200
process.env[flag.env] = `true`

packages/gatsby/src/utils/__tests__/__snapshots__/handle-flags.ts.snap

+21
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,25 @@
11
// Jest Snapshot v1, https://goo.gl/fbAQLP
22

3+
exports[`handle flags returns a message about unknown flags in the config 1`] = `
4+
Object {
5+
"enabledConfigFlags": Array [
6+
Object {
7+
"command": "all",
8+
"description": "test",
9+
"env": "GATSBY_EXPERIMENTAL_SOMETHING_COOL",
10+
"name": "ALL_COMMANDS",
11+
"umbrellaIssue": "test",
12+
},
13+
],
14+
"message": "The following flags are active:
15+
- ALL_COMMANDS · (Umbrella Issue (test)) · test
16+
",
17+
"unknownFlagMessage": "The following flag(s) found in your gatsby-config.js are not known:
18+
- FASTLY_DEV (did you mean: FAST_DEV)
19+
- SUPER_COOL_FLAG",
20+
}
21+
`;
22+
323
exports[`handle flags returns validConfigFlags and a message 1`] = `
424
Object {
525
"enabledConfigFlags": Array [
@@ -42,5 +62,6 @@ Object {
4262
- DEV_SSR · (Umbrella Issue (https://github.com/gatsbyjs/gatsby/discussions/28138)) · SSR pages on full reloads during develop. Helps you detect SSR bugs and fix them without needing to do full builds.
4363
- QUERY_ON_DEMAND · (Umbrella Issue (https://github.com/gatsbyjs/gatsby/discussions/27620)) · Only run queries when needed instead of running all queries upfront. Speeds starting the develop server.
4464
",
65+
"unknownFlagMessage": "",
4566
}
4667
`;

packages/gatsby/src/utils/__tests__/handle-flags.ts

+9
Original file line numberDiff line numberDiff line change
@@ -84,4 +84,13 @@ describe(`handle flags`, () => {
8484
handleFlags(activeFlags, configFlags, `build`).enabledConfigFlags
8585
).toHaveLength(1)
8686
})
87+
88+
it(`returns a message about unknown flags in the config`, () => {
89+
const unknownConfigFlags = handleFlags(
90+
activeFlags,
91+
{ ALL_COMMANDS: true, FASTLY_DEV: true, SUPER_COOL_FLAG: true },
92+
`develop`
93+
)
94+
expect(unknownConfigFlags).toMatchSnapshot()
95+
})
8796
})

packages/gatsby/src/utils/handle-flags.ts

+51-2
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ import { isCI } from "gatsby-core-utils"
33
import realTerminalLink from "terminal-link"
44
import { IFlag } from "./flags"
55
import chalk from "chalk"
6+
import { commaListsAnd } from "common-tags"
7+
import { distance } from "fastest-levenshtein"
68

79
const terminalLink = (text, url): string => {
810
if (process.env.NODE_ENV === `test`) {
@@ -16,11 +18,54 @@ const handleFlags = (
1618
flags: Array<IFlag>,
1719
configFlags: Record<string, boolean>,
1820
executingCommand = process.env.gatsby_executing_command
19-
): { enabledConfigFlags: Array<IFlag>; message: string } => {
21+
): {
22+
enabledConfigFlags: Array<IFlag>
23+
unknownFlagMessage: string
24+
message: string
25+
} => {
2026
// Prepare config flags.
2127
// Filter out any flags that are set to false.
2228
const availableFlags = new Map()
2329
flags.forEach(flag => availableFlags.set(flag.name, flag))
30+
31+
// Find unknown flags someone has in their config to warn them about.
32+
const unknownConfigFlags: Array<any> = []
33+
for (const flagName in configFlags) {
34+
if (availableFlags.has(flagName)) {
35+
continue
36+
}
37+
let flagWithMinDistance
38+
let minDistance
39+
for (const availableFlag of flags) {
40+
if (availableFlag.name !== flagName) {
41+
const distanceToFlag = distance(flagName, availableFlag.name)
42+
if (!flagWithMinDistance || distanceToFlag < minDistance) {
43+
flagWithMinDistance = availableFlag.name
44+
minDistance = distanceToFlag
45+
}
46+
}
47+
}
48+
49+
if (flagName) {
50+
unknownConfigFlags.push({
51+
flag: flagName,
52+
didYouMean:
53+
flagWithMinDistance && minDistance < 4 ? flagWithMinDistance : ``,
54+
})
55+
}
56+
}
57+
58+
let unknownFlagMessage = ``
59+
if (unknownConfigFlags.length > 0) {
60+
unknownFlagMessage = commaListsAnd`The following flag(s) found in your gatsby-config.js are not known:`
61+
unknownConfigFlags.forEach(
62+
flag =>
63+
(unknownFlagMessage += `\n- ${flag?.flag}${
64+
flag?.didYouMean ? ` (did you mean: ${flag?.didYouMean})` : ``
65+
}`)
66+
)
67+
}
68+
2469
let enabledConfigFlags = Object.keys(configFlags)
2570
.filter(name => configFlags[name] && availableFlags.has(name))
2671
.map(flagName => availableFlags.get(flagName))
@@ -85,7 +130,11 @@ const handleFlags = (
85130
message += `\n`
86131
}
87132

88-
return { enabledConfigFlags, message }
133+
return {
134+
enabledConfigFlags,
135+
message,
136+
unknownFlagMessage,
137+
}
89138
}
90139

91140
export default handleFlags

0 commit comments

Comments
 (0)