refactor(@vant/cli): migrate to ESM package

This commit is contained in:
chenjiahan
2021-10-28 11:48:11 +08:00
committed by neverland
parent eec2ac4c0f
commit 1b45f38133
50 changed files with 255 additions and 196 deletions

View File

@@ -0,0 +1,26 @@
/**
* @babel/preset-typescript 不支持编译 Vue 文件中的 ts 代码
* 通过手动添加 @babel/plugin-transform-typescript 的方式来解决这个问题
* see: https://github.com/babel/babel-loader/pull/738
*/
const { readFileSync } = require('fs');
const { declare } = require('@babel/helper-plugin-utils');
module.exports = declare(() => ({
overrides: [
{
test: (filePath) => {
if (/\.vue$/.test(filePath)) {
const template = readFileSync(filePath, { encoding: 'utf8' });
return (
template.includes('lang="ts"') || template.includes("lang='ts'")
);
}
return false;
},
plugins: [require('@babel/plugin-transform-typescript')],
},
],
}));

View File

@@ -0,0 +1,31 @@
module.exports = function (api, options) {
if (api) {
api.cache.never();
}
const { BABEL_MODULE, NODE_ENV } = process.env;
const isTest = NODE_ENV === 'test';
const useESModules = BABEL_MODULE !== 'commonjs' && !isTest;
return {
presets: [
[
require.resolve('@babel/preset-env'),
{
modules: useESModules ? false : 'commonjs',
loose: options.loose,
},
],
require.resolve('@babel/preset-typescript'),
require('./babel-preset-vue-ts.cjs'),
],
plugins: [
[
require.resolve('@vue/babel-plugin-jsx'),
{
enableObjectSlots: options.enableObjectSlots,
},
],
],
};
};

View File

@@ -0,0 +1,47 @@
const { join } = require('path');
const { existsSync } = require('fs');
const { ROOT } = require('./shared.cjs');
const JEST_SETUP_FILE = join(__dirname, 'jest.setup.cjs');
const JEST_FILE_MOCK_FILE = join(__dirname, 'jest.file-mock.cjs');
const JEST_STYLE_MOCK_FILE = join(__dirname, 'jest.style-mock.cjs');
const DEFAULT_CONFIG = {
testEnvironment: 'jsdom',
moduleNameMapper: {
'\\.(css|less|scss)$': JEST_STYLE_MOCK_FILE,
'\\.(jpg|jpeg|png|gif|eot|otf|webp|svg|ttf|woff|woff2|mp4|webm|wav|mp3|m4a|aac|oga)$':
JEST_FILE_MOCK_FILE,
},
setupFilesAfterEnv: [JEST_SETUP_FILE],
moduleFileExtensions: ['js', 'jsx', 'vue', 'ts', 'tsx'],
transform: {
'\\.(vue)$': 'vue3-jest',
'\\.(js|jsx|ts|tsx)$': 'babel-jest',
},
transformIgnorePatterns: ['/node_modules/(?!(@vant/cli))/'],
snapshotSerializers: ['jest-serializer-html'],
collectCoverage: true,
collectCoverageFrom: [
'src/**/*.{js,jsx,ts,tsx,vue}',
'!**/demo/**',
'!**/test/**',
],
coverageReporters: ['html', 'lcov', 'text-summary'],
coverageDirectory: './test/coverage',
};
function readRootConfig() {
const ROOT_CONFIG_PATH = join(ROOT, 'jest.config.js');
if (existsSync(ROOT_CONFIG_PATH)) {
return require(ROOT_CONFIG_PATH);
}
return {};
}
module.exports = {
...DEFAULT_CONFIG,
...readRootConfig(),
};

View File

@@ -0,0 +1 @@
module.exports = 'test-file-stub';

View File

@@ -0,0 +1 @@
require('jest-canvas-mock');

View File

@@ -0,0 +1 @@
module.exports = {};

View File

@@ -0,0 +1,42 @@
const { join } = require('path');
const { existsSync } = require('fs');
const { ROOT } = require('./shared.cjs');
function getRootPostcssConfig() {
const ROOT_POSTCSS_CONFIG_FILE = join(ROOT, 'postcss.config.js');
if (existsSync(ROOT_POSTCSS_CONFIG_FILE)) {
return require(ROOT_POSTCSS_CONFIG_FILE);
}
return { plugins: [] };
}
function getPostcssPlugins(rootConfig) {
const plugins = rootConfig.plugins || [];
if (Array.isArray(plugins)) {
const hasPostcssPlugin = plugins.find(
(plugin) =>
plugin === 'autoprefixer' && plugin.postcssPlugin === 'autoprefixer'
);
if (hasPostcssPlugin) {
return plugins;
}
return [require('autoprefixer'), ...plugins];
}
return {
autoprefixer: {},
...plugins,
};
}
function resolvePostcssConfig() {
const rootConfig = getRootPostcssConfig();
return {
...rootConfig,
plugins: getPostcssPlugins(rootConfig),
};
}
module.exports = resolvePostcssConfig();

View File

@@ -0,0 +1,23 @@
const { join, dirname } = require('path');
const { existsSync } = require('fs');
function findRootDir(dir) {
if (existsSync(join(dir, 'vant.config.js'))) {
return dir;
}
const parentDir = dirname(dir);
if (dir === parentDir) {
return dir;
}
return findRootDir(parentDir);
}
const CWD = process.cwd();
const ROOT = findRootDir(CWD);
module.exports = {
CWD,
ROOT,
};