diff --git a/packages/gatsby/src/schema/__tests__/create-key.js b/packages/gatsby/src/schema/__tests__/create-key.js new file mode 100644 index 0000000000000..da6484dda1888 --- /dev/null +++ b/packages/gatsby/src/schema/__tests__/create-key.js @@ -0,0 +1,26 @@ +const createKey = require(`../create-key`) + +describe(`createKey`, () => { + it(`leaves valid strings as is`, () => { + ;[`01234`, `validstring`, `_hello`, `_`].forEach(input => { + expect(createKey(input)).toBe(input) + }) + }) + + it(`replaces invalid characters`, () => { + ;[ + [`/hello`, `_hello`], + [`~/path/to/some/module`, `_-path-to-some-module`], + [`/*`, `_-`], + [`/*.js`, `_--js`], + ].forEach(([input, output]) => { + expect(createKey(input)).toBe(output) + }) + }) + + it(`does not generate same key for different input`, () => { + ;[[`/*.js`, `*js`]].forEach(([one, two]) => { + expect(createKey(one)).not.toBe(createKey(two)) + }) + }) +}) diff --git a/packages/gatsby/src/schema/create-key.js b/packages/gatsby/src/schema/create-key.js index 77d43f5e5c241..4cb78499f5552 100644 --- a/packages/gatsby/src/schema/create-key.js +++ b/packages/gatsby/src/schema/create-key.js @@ -1,6 +1,6 @@ // @flow const invariant = require(`invariant`) -const regex = new RegExp(`[^a-zA-Z0-9_]`, `g`) +const nonAlphaNumericExpr = new RegExp(`[^a-zA-Z0-9_]`, `g`) /** * GraphQL field names must be a string and cannot contain anything other than @@ -14,5 +14,12 @@ module.exports = (key: string): string => { `Graphql field name (key) is not a string -> ${key}` ) - return key.replace(regex, `_`) + const replaced = key.replace(nonAlphaNumericExpr, `_`) + + // key is invalid; normalize with a leading underscore and dasherize rest + if (replaced.match(/^__/)) { + return replaced.replace(/_/g, (char, index) => (index === 0 ? `_` : `-`)) + } + + return replaced }