From 512f81d1f9847f200deffe0f2915d427f1f4b390 Mon Sep 17 00:00:00 2001 From: Jason Quense Date: Fri, 25 Jan 2019 12:02:29 -0500 Subject: [PATCH 1/3] feat: use local babel config if it exists --- bin/react-docgen.js | 5 +++-- package.json | 2 +- src/__tests__/parse-test.js | 24 +++++++++++++++++++++ src/babelParser.js | 43 ++++++++++++++++++++++++++----------- yarn.lock | 25 +++++++++++++++++++++ 5 files changed, 84 insertions(+), 15 deletions(-) diff --git a/bin/react-docgen.js b/bin/react-docgen.js index a4f8c5a4a2a..2638504a1fc 100755 --- a/bin/react-docgen.js +++ b/bin/react-docgen.js @@ -112,8 +112,9 @@ if (argv.resolver) { } } -function parse(source) { +function parse(source, filename) { return parser.parse(source, resolver, null, { + filename, legacyDecorators: argv.legacyDecorators, decoratorsBeforeExport: argv.decoratorsBeforeExport, }); @@ -153,7 +154,7 @@ function traverseDir(filePath, result, done) { throw error; } try { - result[filename] = parse(content); + result[filename] = parse(content, path.join(filePath, filename)); } catch (parseError) { writeError(parseError, filename); } diff --git a/package.json b/package.json index d0ff75d8d9d..06229fed844 100644 --- a/package.json +++ b/package.json @@ -36,7 +36,7 @@ "author": "Felix Kling", "license": "BSD-3-Clause", "dependencies": { - "@babel/parser": "^7.1.3", + "@babel/core": "^7.0.0", "@babel/runtime": "^7.0.0", "async": "^2.1.4", "commander": "^2.19.0", diff --git a/src/__tests__/parse-test.js b/src/__tests__/parse-test.js index fac742bdb7e..aab1415b617 100644 --- a/src/__tests__/parse-test.js +++ b/src/__tests__/parse-test.js @@ -10,6 +10,9 @@ /*global jest, describe, beforeEach, it, expect*/ +const fs = require('fs'); +const temp = require('temp'); + jest.disableAutomock(); describe('parse', () => { @@ -48,4 +51,25 @@ describe('parse', () => { ); expect(resolver).toBeCalled(); }); + + it.only('uses local babelrc', () => { + const dir = temp.mkdirSync(); + + try { + // Write and empty babelrc to override the parser defaults + fs.writeFileSync(`${dir}/.babelrc`, '{}'); + + expect(() => + parse('const chained = () => foo?.bar?.join?.()', () => {}, null, { + cwd: dir, + filename: `${dir}/component.js`, + }), + ).toThrowError( + /.*Support for the experimental syntax 'optionalChaining' isn't currently enabled.*/, + ); + } finally { + fs.unlinkSync(`${dir}/.babelrc`); + fs.rmdirSync(dir); + } + }); }); diff --git a/src/babelParser.js b/src/babelParser.js index d7be9278b66..85c21befdae 100644 --- a/src/babelParser.js +++ b/src/babelParser.js @@ -10,7 +10,7 @@ * */ -const parser = require('@babel/parser'); +const babel = require('@babel/core'); const babelParserOptions = { sourceType: 'module', @@ -43,33 +43,52 @@ const babelParserOptions = { }; export type Options = { + cwd?: string, + filename?: string, legacyDecorators?: boolean, decoratorsBeforeExport?: boolean, }; -function buildOptions(options?: Options = {}) { +function buildOptions(options: Options) { const parserOptions = { - ...babelParserOptions, - plugins: [...babelParserOptions.plugins], + strictMode: false, + tokens: true, + plugins: [], }; + if (options.legacyDecorators) { parserOptions.plugins.push('decorators-legacy'); - } else { - parserOptions.plugins.push([ - 'decorators', - { decoratorsBeforeExport: options.decoratorsBeforeExport || false }, - ]); + } + + const partialConfig = babel.loadPartialConfig({ + cwd: options.cwd, + filename: options.filename, + }); + + if (!partialConfig.hasFilesystemConfig()) { + parserOptions.plugins = [...babelParserOptions.plugins]; + + if (!options.legacyDecorators) { + parserOptions.plugins.push([ + 'decorators', + { decoratorsBeforeExport: options.decoratorsBeforeExport || false }, + ]); + } } return parserOptions; } -export default function buildParse(options: Options) { - const parserOptions = buildOptions(options); +export default function buildParse(options?: Options = {}) { + const parserOpts = buildOptions(options); return { parse(src: string) { - return parser.parse(src, parserOptions); + return babel.parseSync(src, { + parserOpts, + cwd: options.cwd, + filename: options.filename, + }); }, }; } diff --git a/yarn.lock b/yarn.lock index 99adf1e98ca..eda540ef8a5 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1406,6 +1406,11 @@ cross-spawn@^6.0.4, cross-spawn@^6.0.5: shebang-command "^1.2.0" which "^1.2.9" +crypto-random-string@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-1.0.0.tgz#a230f64f568310e1498009940790ec99545bca7e" + integrity sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4= + cssom@0.3.x, "cssom@>= 0.3.2 < 0.4.0": version "0.3.4" resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.4.tgz#8cd52e8a3acfd68d3aed38ee0a640177d2f9d797" @@ -4602,6 +4607,11 @@ tar@^4: safe-buffer "^5.1.2" yallist "^3.0.2" +temp-dir@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/temp-dir/-/temp-dir-1.0.0.tgz#0a7c0ea26d3a39afa7e0ebea9c1fc0bc4daa011d" + integrity sha1-CnwOom06Oa+n4OvqnB/AvE2qAR0= + temp@^0.8.1: version "0.8.3" resolved "https://registry.yarnpkg.com/temp/-/temp-0.8.3.tgz#e0c6bc4d26b903124410e4fed81103014dfc1f59" @@ -4610,6 +4620,14 @@ temp@^0.8.1: os-tmpdir "^1.0.0" rimraf "~2.2.6" +tempy@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/tempy/-/tempy-0.2.1.tgz#9038e4dbd1c201b74472214179bc2c6f7776e54c" + integrity sha512-LB83o9bfZGrntdqPuRdanIVCPReam9SOZKW0fOy5I9X3A854GGWi0tjCqoXEk84XIEYBc/x9Hq3EFop/H5wJaw== + dependencies: + temp-dir "^1.0.0" + unique-string "^1.0.0" + test-exclude@^4.2.1: version "4.2.3" resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-4.2.3.tgz#a9a5e64474e4398339245a0a769ad7c2f4a97c20" @@ -4768,6 +4786,13 @@ union-value@^1.0.0: is-extendable "^0.1.1" set-value "^0.4.3" +unique-string@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-1.0.0.tgz#9e1057cca851abb93398f8b33ae187b99caec11a" + integrity sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo= + dependencies: + crypto-random-string "^1.0.0" + unset-value@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" From 369c766828ed414002a6fbb0f4d7e6e485d76852 Mon Sep 17 00:00:00 2001 From: Jason Quense Date: Fri, 25 Jan 2019 12:10:10 -0500 Subject: [PATCH 2/3] fix import deuplicates --- .../__tests__/findAllExportedComponentDefinitions-test.js | 2 +- src/resolver/__tests__/findExportedComponentDefinition-test.js | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/src/resolver/__tests__/findAllExportedComponentDefinitions-test.js b/src/resolver/__tests__/findAllExportedComponentDefinitions-test.js index f3b18c718b1..1b0a56dc9e2 100644 --- a/src/resolver/__tests__/findAllExportedComponentDefinitions-test.js +++ b/src/resolver/__tests__/findAllExportedComponentDefinitions-test.js @@ -761,7 +761,7 @@ describe('findAllExportedComponentDefinitions', () => { parsed = parse(` import React from "React" - var React = require("React"); + var Component = React.createClass({}); export {Component, foo} `); diff --git a/src/resolver/__tests__/findExportedComponentDefinition-test.js b/src/resolver/__tests__/findExportedComponentDefinition-test.js index fa4e6d710f8..21597978cf6 100644 --- a/src/resolver/__tests__/findExportedComponentDefinition-test.js +++ b/src/resolver/__tests__/findExportedComponentDefinition-test.js @@ -619,7 +619,6 @@ describe('findExportedComponentDefinition', () => { source = ` import React from "React" - var React = require("React"); var Component = React.createClass({}); export {Component, foo} `; From 5ef5bbd07bbd3781f7db6d49e04516b8d02a9b40 Mon Sep 17 00:00:00 2001 From: Jason Quense Date: Fri, 25 Jan 2019 13:53:59 -0500 Subject: [PATCH 3/3] fix lock file --- yarn.lock | 25 ------------------------- 1 file changed, 25 deletions(-) diff --git a/yarn.lock b/yarn.lock index eda540ef8a5..99adf1e98ca 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1406,11 +1406,6 @@ cross-spawn@^6.0.4, cross-spawn@^6.0.5: shebang-command "^1.2.0" which "^1.2.9" -crypto-random-string@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-1.0.0.tgz#a230f64f568310e1498009940790ec99545bca7e" - integrity sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4= - cssom@0.3.x, "cssom@>= 0.3.2 < 0.4.0": version "0.3.4" resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.4.tgz#8cd52e8a3acfd68d3aed38ee0a640177d2f9d797" @@ -4607,11 +4602,6 @@ tar@^4: safe-buffer "^5.1.2" yallist "^3.0.2" -temp-dir@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/temp-dir/-/temp-dir-1.0.0.tgz#0a7c0ea26d3a39afa7e0ebea9c1fc0bc4daa011d" - integrity sha1-CnwOom06Oa+n4OvqnB/AvE2qAR0= - temp@^0.8.1: version "0.8.3" resolved "https://registry.yarnpkg.com/temp/-/temp-0.8.3.tgz#e0c6bc4d26b903124410e4fed81103014dfc1f59" @@ -4620,14 +4610,6 @@ temp@^0.8.1: os-tmpdir "^1.0.0" rimraf "~2.2.6" -tempy@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/tempy/-/tempy-0.2.1.tgz#9038e4dbd1c201b74472214179bc2c6f7776e54c" - integrity sha512-LB83o9bfZGrntdqPuRdanIVCPReam9SOZKW0fOy5I9X3A854GGWi0tjCqoXEk84XIEYBc/x9Hq3EFop/H5wJaw== - dependencies: - temp-dir "^1.0.0" - unique-string "^1.0.0" - test-exclude@^4.2.1: version "4.2.3" resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-4.2.3.tgz#a9a5e64474e4398339245a0a769ad7c2f4a97c20" @@ -4786,13 +4768,6 @@ union-value@^1.0.0: is-extendable "^0.1.1" set-value "^0.4.3" -unique-string@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-1.0.0.tgz#9e1057cca851abb93398f8b33ae187b99caec11a" - integrity sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo= - dependencies: - crypto-random-string "^1.0.0" - unset-value@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559"