-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathgulpfile.js
126 lines (107 loc) · 3.44 KB
/
gulpfile.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
const path = require('path')
const { readFileSync } = require('fs')
const gulp = require('gulp')
const through2 = require('through2')
const babel = require('gulp-babel')
const ts = require('gulp-typescript')
const del = require('del')
const merge2 = require('merge2')
const less = require('less')
const postcss = require('postcss')
const autoprefixer = require('autoprefixer')
const NpmImportPlugin = require('less-plugin-npm-import')
const ROOT_PATH = __dirname
const CJS_DIR_NAME = 'lib'
const ESM_DIR_NAME = 'es'
const libDir = path.join(process.cwd(), CJS_DIR_NAME)
const esDir = path.join(process.cwd(), ESM_DIR_NAME)
const tsConfigPath = path.resolve(process.cwd(), 'tsconfig.pro.json')
function transformLess(lessFile, config = {}) {
const { cwd = process.cwd() } = config
const resolvedLessFile = path.resolve(cwd, lessFile)
let data = readFileSync(resolvedLessFile, 'utf-8')
data = data.replace(/^\uFEFF/, '')
// Do less compile
const lessOpts = {
paths: [path.dirname(resolvedLessFile)],
filename: resolvedLessFile,
plugins: [new NpmImportPlugin({ prefix: '~' })],
javascriptEnabled: true,
modifyVars: {},
}
if (resolvedLessFile.includes('desktop-ui'))
lessOpts.modifyVars['@root-entry-name'] = 'default'
return less
.render(data, lessOpts)
.then(result => postcss([autoprefixer]).process(result.css, { from: undefined }))
.then(r => r.css)
}
function compileLess(ismModules) {
del.sync(ismModules !== false ? libDir : esDir)
const lessS = gulp
.src(['src/**/*.less', '!src/*/demo/**/*.less'])
.pipe(
through2.obj(function (file, encoding, next) {
this.push(file.clone())
if (file.path.match(/(\/|\\)style(\/|\\)index\.less$/)) {
transformLess(file.path)
.then((css) => {
file.contents = Buffer.from(css)
file.path = file.path.replace(/\.less$/, '.css')
this.push(file)
next()
})
.catch((e) => {
console.error(e)
})
}
else {
next()
}
}),
)
.pipe(gulp.dest(ismModules === false ? esDir : libDir))
const assets = gulp
.src(['src/**/*.@(png|svg)'])
.pipe(gulp.dest(ismModules === false ? esDir : libDir))
return merge2([lessS, assets])
}
gulp.task('clean', async () => {
await del('lib/**')
await del('es/**')
await del('dist/**')
})
gulp.task('compile:less', (done) => {
compileLess(false).on('finish', done)
compileLess(true).on('finish', done)
})
gulp.task('cjs', () => {
const tsProject = ts.createProject(tsConfigPath, {
module: 'CommonJS',
})
const babelConfigFilePath = path.resolve(ROOT_PATH, '.babelrc')
return tsProject
.src()
.pipe(tsProject())
.pipe(babel({ configFile: babelConfigFilePath }))
.pipe(gulp.dest(libDir))
})
gulp.task('es', () => {
const tsProject = ts.createProject(tsConfigPath, {
module: 'ESNext',
})
const babelConfigFilePath = path.resolve(ROOT_PATH, '.babelrc')
return tsProject
.src()
.pipe(tsProject())
.pipe(babel({ configFile: babelConfigFilePath }))
.pipe(gulp.dest(esDir))
})
gulp.task('declaration', () => {
const tsProject = ts.createProject(tsConfigPath, {
declaration: true,
emitDeclarationOnly: true,
})
return tsProject.src().pipe(tsProject()).pipe(gulp.dest(esDir)).pipe(gulp.dest(libDir))
})
exports.default = gulp.series('clean', gulp.parallel('compile:less', 'cjs', 'es', 'declaration'))