UNPKG

4.82 kBJavaScriptView Raw
1"use strict";
2
3Object.defineProperty(exports, "__esModule", {
4 value: true
5});
6exports.default = void 0;
7
8var _core = require("@babel/core");
9
10var _fs = _interopRequireDefault(require("fs"));
11
12var _path = _interopRequireDefault(require("path"));
13
14var _debug = _interopRequireDefault(require("debug"));
15
16var _fsCache = _interopRequireDefault(require("./fs-cache"));
17
18function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
19
20function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; var ownKeys = Object.keys(source); if (typeof Object.getOwnPropertySymbols === 'function') { ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) { return Object.getOwnPropertyDescriptor(source, sym).enumerable; })); } ownKeys.forEach(function (key) { _defineProperty(target, key, source[key]); }); } return target; }
21
22function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
23
24let debug = (0, _debug.default)('WXA:BABEL_Loader');
25
26let pkg = require('../package.json');
27
28function readFile(p) {
29 p = typeof p === 'object' ? _path.default.join(p.dir, p.base) : p;
30 return _fs.default.readFileSync(p, 'utf-8');
31}
32
33function amazingCache(params, needCache) {
34 let defaultOpts = {
35 directory: true,
36 identifier: JSON.stringify({
37 '@wxa/compiler-babel': pkg.version,
38 'env': process.env.NODE_ENV || 'development'
39 })
40 };
41 let cacheParams = Object.assign({}, defaultOpts, params);
42
43 if (needCache) {
44 return (0, _fsCache.default)(cacheParams);
45 } else {
46 let {
47 source,
48 transform,
49 options
50 } = cacheParams;
51 return transform(source, options);
52 }
53}
54
55class BabelLoader {
56 constructor(cwd, configs) {
57 // default match file path.
58 this.test = /\.js$|\.wxs$/;
59 this.current = cwd; // get configuration from .babelrc, package.json or wxa.config.js
60 // find .babelrc first then babel.config.js
61
62 let babelrc = _path.default.join(this.current, '.babelrc');
63
64 let babeljs = _path.default.join(this.current, 'babel.config.js');
65
66 let pkg = _path.default.join(this.current, 'package.json');
67
68 if (_fs.default.existsSync(babelrc)) {
69 this.configs = JSON.parse(_fs.default.readFileSync(babelrc, 'utf-8'));
70 } else if (_fs.default.existsSync(babeljs)) {
71 this.configs = require(babeljs);
72 } else if (_fs.default.existsSync(pkg)) {
73 this.configs = require(pkg).babel;
74 } // setup default babel config
75
76
77 this.configs = this.configs || configs || {}; // process ignore to compat babel6
78
79 if (typeof this.configs.ignore === 'string' || this.configs.ignore instanceof RegExp) {
80 this.configs.ignore = [this.configs.ignore];
81 } else if (this.configs.ignore && !Array.isArray(this.configs.ignore)) {
82 throw new Error(`babel 配置 ignore 必须为Array类型`);
83 } else {
84 this.configs.ignore = this.configs.ignore || ["node_modules"];
85 }
86 }
87
88 transform(type, ...args) {
89 let map = new Map([['transform', _core.transform], ['transformFile', _core.transformFile]]);
90 return new Promise((resolve, reject) => {
91 debug('arguments %O', args);
92 map.get(type).call(null, ...args, function (err, result) {
93 if (err) reject(err);
94 resolve(result);
95 });
96 });
97 }
98
99 async parse(mdl, cmdOptions) {
100 debug('transform started %O', mdl);
101 let {
102 meta: {
103 source: src
104 },
105 content: code
106 } = mdl;
107 let configs = this.configs;
108 let type = 'transform';
109
110 let opath = _path.default.parse(src);
111
112 if (code == null) {
113 type = 'transformFile';
114 }
115
116 if (this.checkIgnore(opath, configs.ignore) || code === '') {
117 return Promise.resolve({
118 code
119 });
120 } else {
121 let ret = await amazingCache({
122 source: code || readFile(src),
123 options: _objectSpread({}, configs, {
124 filename: src
125 }),
126 transform: () => {
127 return this.transform(type, code || src, _objectSpread({}, configs, {
128 filename: src
129 }));
130 }
131 }, cmdOptions.cache);
132 debug('transform succ %s', ret.code);
133 return Promise.resolve({
134 ret,
135 code: ret.code
136 });
137 }
138 }
139
140 checkIgnore(opath, ignore) {
141 if (ignore == null) return false;
142 let filepath = this.normal(opath.dir + _path.default.sep + opath.base);
143 return ignore.some(str => {
144 let reg = typeof str === 'object' ? str : new RegExp(str);
145 return reg.test(filepath);
146 });
147 }
148
149 normal(path) {
150 return path.replace(/\\/g, '/');
151 }
152
153}
154
155var _default = BabelLoader;
156exports.default = _default;
\No newline at end of file