forked from nolimits4web/swiper
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathbuild-styles.js
134 lines (119 loc) · 4.49 KB
/
build-styles.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
/* eslint import/no-extraneous-dependencies: ["error", {"devDependencies": true}] */
/* eslint no-console: "off" */
const fs = require('fs-extra');
const path = require('path');
const globby = require('globby');
const chalk = require('chalk');
const elapsed = require('elapsed-time-logger');
const less = require('./utils/less');
const autoprefixer = require('./utils/autoprefixer');
const minifyCSS = require('./utils/clean-css');
const { banner } = require('./utils/banner');
const config = require('./build-config');
const { outputDir } = require('./utils/output-dir');
const isProd = require('./utils/isProd')();
const readSwiperFile = async (filePath) => {
const fileContent = await fs.readFile(filePath, 'utf-8');
if (filePath.includes('swiper.less')) {
const coreContent = fs.readFileSync(path.resolve(__dirname, '../src/core/core.less'), 'utf-8');
return fileContent
.replace('//IMPORT_MODULES', '')
.replace(`@import url('./less/mixins.less');`, '')
.replace(`@import url('./core/core.less');`, coreContent);
}
if (filePath.includes('swiper-vars.less')) {
return fileContent;
}
if (filePath.includes('navigation.less') || filePath.includes('pagination.less')) {
return ["@import url('../../swiper-vars.less');", fileContent].join('\n\n');
}
if (filePath.includes('swiper.scss')) {
const coreContent = await fs.readFile(
path.resolve(__dirname, '../src/core/core.scss'),
'utf-8',
);
return fileContent
.replace(`@import './core/core';`, coreContent)
.replace('//IMPORT_MODULES', '');
}
return fileContent;
};
const buildCSS = async ({ isBundle, modules, minified }) => {
let lessContent = await fs.readFile(path.resolve(__dirname, '../src/swiper.less'), 'utf8');
lessContent = lessContent.replace(
'//IMPORT_MODULES',
!isBundle
? ''
: modules.map((mod) => `@import url('./modules/${mod}/${mod}.less');`).join('\n'),
);
const cssContent = await autoprefixer(
await less(lessContent, path.resolve(__dirname, '../src')),
).catch((err) => {
throw err;
});
const fileName = isBundle ? 'swiper-bundle' : 'swiper';
// Write file
await fs.ensureDir(`./${outputDir}`);
if (isBundle) {
await fs.writeFile(`./${outputDir}/${fileName}.css`, `${banner()}\n${cssContent}`);
}
if (minified || !isBundle) {
const minifiedContent = await minifyCSS(cssContent);
await fs.writeFile(`./${outputDir}/${fileName}.min.css`, `${banner()}\n${minifiedContent}`);
}
};
async function buildStyles() {
elapsed.start('styles');
const modules = config.modules.filter((name) => {
const lessFilePath = `./src/modules/${name}/${name}.less`;
return fs.existsSync(lessFilePath);
});
buildCSS({ isBundle: true, modules, minified: isProd });
buildCSS({ isBundle: false, modules, minified: isProd });
if (isProd) {
// Copy less & scss
const files = await globby(
[
'**/**.scss',
'**/**.less',
'!**/mixins.less',
'!**/icons/**',
'!**/angular/**',
'!**/core/**',
],
{
cwd: path.resolve(__dirname, '../src'),
},
);
await Promise.all(
files.map(async (file) => {
const distFilePath = path.resolve(__dirname, `../${outputDir}`, file);
const srcFilePath = path.resolve(__dirname, '../src', file);
const distFileContent = await readSwiperFile(srcFilePath);
await fs.ensureDir(path.dirname(distFilePath));
await fs.writeFile(distFilePath, distFileContent);
}),
);
const modulesLessFiles = await globby(['**/**.less'], {
cwd: path.resolve(__dirname, '../dist/modules'),
absolute: true,
});
await Promise.all(
modulesLessFiles.map(async (filePath) => {
const fileContent = await fs.readFile(filePath, 'utf-8');
const content = fileContent.replace('@themeColor', config.themeColor);
const lessContent = await less(content, path.dirname(filePath)).catch((err) => {
throw new Error(`${filePath}: ${err}`);
});
const resultCSS = await autoprefixer(lessContent);
const resultFilePath = filePath.replace(/\.less$/, '');
const minifiedCSS = await minifyCSS(resultCSS);
// not sure if needed. Possibly can produce a bug cause of the same naming
// await fs.writeFile(`${resultFilePath}.css`, resultCSS);
await fs.writeFile(`${resultFilePath}.min.css`, minifiedCSS);
}),
);
}
elapsed.end('styles', chalk.green('Styles build completed!'));
}
module.exports = buildStyles;