import normalizeOptions from "../src/normalize-options"; describe("normalize options", () => { (process.env.BABEL_8_BREAKING ? describe : describe.skip)("Babel 8", () => { it("should throw on unknown options", () => { expect(() => normalizeOptions({ throwIfNamespaces: true })).toThrowError( "@babel/preset-react: 'throwIfNamespaces' is not a valid top-level option.\n- Did you mean 'throwIfNamespace'?", ); }); it.each(["development", "pure", "throwIfNamespace"])( "should throw when `%p` is not a boolean", optionName => { expect(() => normalizeOptions({ [optionName]: 0 })).toThrow( `@babel/preset-react: '${optionName}' option must be a boolean.`, ); }, ); it.each(["importSource", "pragma", "pragmaFrag", "runtime"])( "should throw when `%p` is not a string", optionName => { expect(() => normalizeOptions({ [optionName]: 0 })).toThrow( `@babel/preset-react: '${optionName}' option must be a string.`, ); }, ); it("should throw on Babel 7 'useBuiltIns' option", () => { expect(() => normalizeOptions({ useBuiltIns: true })) .toThrowErrorMatchingInlineSnapshot(` "@babel/preset-react: Since \\"useBuiltIns\\" is removed in Babel 8, you can remove it from the config. - Babel 8 now transforms JSX spread to object spread. If you need to transpile object spread with \`useBuiltIns: true\`, you can use the following config { \\"plugins\\": [ [\\"@babel/plugin-proposal-object-rest-spread\\", { \\"loose\\": true, \\"useBuiltIns\\": true }] ], \\"presets\\": [\\"@babel/preset-react\\"] }" `); }); it("should throw on Babel 7 'useSpread' option", () => { expect(() => normalizeOptions({ useSpread: true }), ).toThrowErrorMatchingInlineSnapshot( `"@babel/preset-react: Since Babel 8, an inline object with spread elements is always used, and the \\"useSpread\\" option is no longer available. Please remove it from your config."`, ); }); it("should throw on unknown 'runtime' option", () => { expect(() => normalizeOptions({ runtime: "classical" })) .toThrowErrorMatchingInlineSnapshot(` "@babel/preset-react: 'runtime' must be one of ['automatic', 'classic'] but we have 'classical' - Did you mean 'classic'?" `); }); it("should not throw when options are not defined", () => { expect(() => normalizeOptions()).not.toThrowError(); }); it("default values", () => { expect(normalizeOptions({})).toMatchInlineSnapshot(` Object { "development": false, "importSource": "react", "pragma": undefined, "pragmaFrag": undefined, "pure": undefined, "runtime": "automatic", "throwIfNamespace": true, } `); expect(normalizeOptions({ runtime: "classic" })).toMatchInlineSnapshot(` Object { "development": false, "importSource": undefined, "pragma": "React.createElement", "pragmaFrag": "React.Fragment", "pure": undefined, "runtime": "classic", "throwIfNamespace": true, } `); }); }); (process.env.BABEL_8_BREAKING ? describe.skip : describe)("Babel 7", () => { it("should not throw on unknown options", () => { expect(() => normalizeOptions({ throwIfNamespaces: true }), ).not.toThrowError(); }); it.each(["development", "pure", "throwIfNamespace"])( "should not throw when `%p` is not a boolean", optionName => { expect(() => normalizeOptions({ [optionName]: 0 })).not.toThrowError(); }, ); it.each(["importSource", "pragma", "pragmaFrag", "runtime"])( "should throw when `%p` is not a string", optionName => { expect(() => normalizeOptions({ [optionName]: 0 })).not.toThrowError(); }, ); it("default values", () => { expect(normalizeOptions({})).toMatchInlineSnapshot(` Object { "development": false, "importSource": undefined, "pragma": "React.createElement", "pragmaFrag": "React.Fragment", "pure": undefined, "runtime": "classic", "throwIfNamespace": true, "useBuiltIns": undefined, "useSpread": undefined, } `); expect(normalizeOptions({ runtime: "automatic" })).toMatchInlineSnapshot(` Object { "development": false, "importSource": undefined, "pragma": undefined, "pragmaFrag": undefined, "pure": undefined, "runtime": "automatic", "throwIfNamespace": true, "useBuiltIns": undefined, "useSpread": undefined, } `); }); }); });