UNPKG

2.05 kBJavaScriptView Raw
1const gulp = require("gulp");
2const path = require("path");
3const execSync = require("child_process").execSync;
4const fs = require("fs-extra");
5const { isDir } = require("./utils");
6const babelLoader = require("./loaders/babel");
7const eslintLoader = require("./loaders/eslint");
8const cssLoader = require("./loaders/css");
9const log = require("./logger");
10
11let hasInstall = false;
12
13function hasInstallDeps() {
14 if (hasInstall) return true;
15
16 const pkgFile = process.cwd() + "/package.json";
17 let pkg = {};
18 if (fs.existsSync(pkgFile)) {
19 pkg = require(pkgFile);
20 }
21 const allDeps = Object.assign({}, pkg.dependencies, pkg.devDependencies);
22
23 hasInstall = "gulp-sass" in allDeps;
24
25 return hasInstall;
26}
27
28function installDeps() {
29 if (hasInstall) return;
30 hasInstall = true;
31
32 log("安装依赖 gulp-sass ...");
33 cmd = `npm install --save-dev gulp-sass@4.0.2`;
34 try {
35 execSync(cmd);
36 } catch (e) {
37 log("依赖安装失败,请自行安装 gulp-sass");
38 process.exit(0);
39 }
40 log("安装完成");
41}
42
43function checkFileIfNeedInstall(file) {
44 return /\.scss$/.test(file);
45}
46
47module.exports = async function compile(file, options) {
48 const ignore =
49 options.ignore ||
50 function () {
51 return false;
52 };
53 const absPath = path.resolve(options.appSrc, file);
54 const outFile = path.resolve(options.outDir, file);
55 let outDir = options.outDir;
56
57 if (isDir(absPath)) {
58 await fs.ensureDir(outFile);
59 return Promise.resolve(file);
60 }
61
62 // install node-sass check
63 // if (checkFileIfNeedInstall(file) && !hasInstallDeps()) {
64 // installDeps();
65 // options._hasInstallScss = true;
66 // }
67
68 outDir = path.dirname(outFile);
69
70 return new Promise(resolve => {
71 let stream = gulp.src(absPath, {
72 cwd: options.appSrc,
73 allowEmpty: true,
74 });
75
76 if (!ignore(file)) {
77 stream = eslintLoader(stream, options);
78 stream = cssLoader(stream, options);
79 stream = babelLoader(stream, options);
80 }
81 stream = stream.pipe(gulp.dest(outDir));
82
83 stream.on("finish", () => {
84 resolve(file);
85 });
86 stream.on("error", () => {
87 resolve(file);
88 });
89 });
90};