From 7844089673d5188c10366833d03b8da58ff85f9d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=98=BF=E5=B9=B3?= Date: Thu, 15 Apr 2021 01:56:09 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=94=AF=E6=8C=81=20React=2017=20(#152?= =?UTF-8?q?7)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: 谢仁洪 --- docs/guide/config/babel.md | 3 ++ packages/babel-preset-remax/README.md | 7 +++ packages/babel-preset-remax/jest.config.js | 12 ++++++ packages/babel-preset-remax/package.json | 3 +- packages/babel-preset-remax/src/index.test.ts | 43 +++++++++++++++++++ packages/babel-preset-remax/src/index.ts | 7 ++- 6 files changed, 72 insertions(+), 3 deletions(-) create mode 100644 packages/babel-preset-remax/jest.config.js create mode 100644 packages/babel-preset-remax/src/index.test.ts diff --git a/docs/guide/config/babel.md b/docs/guide/config/babel.md index 070024d24..ed6739a13 100644 --- a/docs/guide/config/babel.md +++ b/docs/guide/config/babel.md @@ -30,6 +30,9 @@ module.exports = { [ 'remax', { + react: { + runtime: 'automatic', + }, typescript: { allowNamespaces: true, }, diff --git a/packages/babel-preset-remax/README.md b/packages/babel-preset-remax/README.md index 95398889a..06fdaeff0 100644 --- a/packages/babel-preset-remax/README.md +++ b/packages/babel-preset-remax/README.md @@ -8,6 +8,10 @@ Babel preset for remax app. ## Options +### react + +configure react preset. https://babeljs.io/docs/en/babel-preset-react + ### typescript configure typescript preset. https://babeljs.io/docs/en/babel-preset-typescript @@ -30,6 +34,9 @@ configure react preset throwIfNamespace option. https://babeljs.io/docs/en/babel [ 'remax', { + react: { + runtime: 'classic', + }, typescript: { allowNamespaces: true, }, diff --git a/packages/babel-preset-remax/jest.config.js b/packages/babel-preset-remax/jest.config.js new file mode 100644 index 000000000..49743b063 --- /dev/null +++ b/packages/babel-preset-remax/jest.config.js @@ -0,0 +1,12 @@ +module.exports = { + preset: 'ts-jest', + testEnvironment: 'node', + testPathIgnorePatterns: ['/esm/', '/cjs/'], + testRegex: '.*\\.test\\.tsx?$', + coveragePathIgnorePatterns: ['/src/__tests__/'], + globals: { + 'ts-jest': { + isolatedModules: true, + }, + }, +}; diff --git a/packages/babel-preset-remax/package.json b/packages/babel-preset-remax/package.json index 7e4af13e2..f312d4e96 100644 --- a/packages/babel-preset-remax/package.json +++ b/packages/babel-preset-remax/package.json @@ -10,7 +10,8 @@ "scripts": { "clean": "rimraf lib tsconfig.tsbuildinfo", "prebuild": "npm run clean", - "build": "tsc" + "build": "tsc", + "test": "jest" }, "bugs": { "url": "https://github.com/remaxjs/remax/issues" diff --git a/packages/babel-preset-remax/src/index.test.ts b/packages/babel-preset-remax/src/index.test.ts new file mode 100644 index 000000000..0a9f4acfc --- /dev/null +++ b/packages/babel-preset-remax/src/index.test.ts @@ -0,0 +1,43 @@ +import { transformSync } from '@babel/core'; +import preset from './index'; + +test('react default', () => { + const code = transformSync( + ` + import React from 'react' + import { View } from '@remax/one' + + function Demo() { + return demo + } + `.trim(), + { + filename: 'file.tsx', + babelrc: false, + presets: [preset], + } + )!.code; + + expect(code).toMatch(`/*#__PURE__*/_react.default.createElement(_one.View, null, "demo")`); +}); + +test('react options', () => { + const code = transformSync( + ` + import React from 'react' + import { View } from '@remax/one' + + function Demo() { + return demo + } + `.trim(), + { + filename: 'file.tsx', + babelrc: false, + presets: [[preset, { react: { development: true } }]], + } + )!.code; + + expect(code).toMatch(`return /*#__PURE__*/_react.default.createElement(_one.View, {`); + expect(code).toMatch(`__self: this,`); +}); diff --git a/packages/babel-preset-remax/src/index.ts b/packages/babel-preset-remax/src/index.ts index 2adb2cbbd..4fb1e844c 100644 --- a/packages/babel-preset-remax/src/index.ts +++ b/packages/babel-preset-remax/src/index.ts @@ -1,7 +1,7 @@ import { declare } from '@babel/helper-plugin-utils'; interface PresetOption { - react?: boolean; + react?: boolean | { [key: string]: any }; typescript?: any; decorators?: any; 'class-properties'?: any; @@ -32,7 +32,10 @@ function preset(api: any, presetOption: PresetOption) { } if (react) { - presets.push([require.resolve('@babel/preset-react'), { throwIfNamespace }]); + const defaultReactOpt = { throwIfNamespace }; + const reactOpts = typeof react === 'boolean' ? defaultReactOpt : Object.assign(defaultReactOpt, react); + + presets.push([require.resolve('@babel/preset-react'), reactOpts]); } return {