-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathgulp.tasks.js
144 lines (125 loc) · 4.14 KB
/
gulp.tasks.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
135
136
137
138
139
140
141
142
143
144
'use strict';
const fs = require('fs-extra');
const path = require('path');
const del = require('del');
const chalk = require('chalk');
// Sass
const gulpsass = require('gulp-sass')(require('node-sass'));
gulpsass.compiler = require('node-sass');
// Gulp
const gulp = require('gulp');
const sourcemaps = require('gulp-sourcemaps');
const esbuild = require('esbuild');
const {typecheckPlugin} = require("@jgoz/esbuild-plugin-typecheck");
// Config
const distName = 'dist';
const destFolder = path.resolve(process.cwd(), distName);
const jsBundle = 'bundle.js';
const entryPoint = "./src/module/main.ts";
/**
* CLEAN
* Removes all files from the dist folder
*/
async function cleanDist() {
const files = fs.readdirSync(destFolder);
for (const file of files) {
await del(path.resolve(destFolder, file));
}
}
/**
* .\node_modules\.bin\esbuild .\src\module\main.ts --bundle --outfile=.\dist\bundle.js --sourcemap --minify --watch
* @returns {Promise<*>}
*/
async function buildJS() {
esbuild.build({
entryPoints: [entryPoint],
bundle: true,
minify: false, // BEWARE: minify: true will break the system as class names are used as string references
sourcemap: true,
format: 'esm',
outfile: path.resolve(destFolder, jsBundle),
plugins: [typecheckPlugin()],
}).catch((err) => {
console.error(err)
})
}
/**
* COPY ASSETS
*/
async function copyAssets() {
gulp.src('assets/**/*').pipe(gulp.dest(path.resolve(destFolder, 'assets')));
gulp.src('src/templates/**/*').pipe(gulp.dest(path.resolve(destFolder, 'templates')));
gulp.src('locale/**/*').pipe(gulp.dest(path.resolve(destFolder, 'locale')));
}
/**
* WATCH
*/
async function watch() {
// Helper - watch the pattern, copy the output on change
function watch(pattern, out) {
gulp.watch(pattern).on('change', () => gulp.src(pattern).pipe(gulp.dest(path.resolve(destFolder, out))));
}
watch('assets/**/*', 'assets');
watch('src/templates/**/*', 'templates');
watch('locale/**/*', 'locale');
gulp.watch('src/**/*.scss').on('change', async () => await buildSass());
esbuild.build({
entryPoints: [entryPoint],
bundle: true,
minify: false, // BEWARE: minify: true will break the system as class names are used as string references
sourcemap: true,
format: 'esm',
outfile: path.resolve(destFolder, jsBundle),
plugins: [typecheckPlugin()],
watch: {
onRebuild(error, result) {
if (error) console.error('watch build failed:', error)
else console.log('watch build succeeded:', result)
},
},
}).catch((err) => {
console.log(err)
})
}
/**
* SASS
*/
async function buildSass() {
return gulp
.src('src/css/bundle.scss')
.pipe(gulpsass().on('error', gulpsass.logError))
.pipe(sourcemaps.init({loadMaps: true}))
.pipe(sourcemaps.write('./'))
.pipe(gulp.dest(destFolder));
}
async function linkUserData() {
const config = fs.readJSONSync('foundryconfig.json');
const projectConfig = fs.readJSONSync(path.resolve('.', 'system.json'));
let name = projectConfig.name;
try {
let linkDir;
if (config.dataPath) {
if (!fs.existsSync(path.join(config.dataPath, 'Data')))
throw Error('User Data path invalid, no Data directory found');
linkDir = path.join(config.dataPath, 'Data', 'systems', name);
} else {
throw Error('No User Data path defined in foundryconfig.json');
}
if (!fs.existsSync(linkDir)) {
console.log(
chalk.green(`Copying build to ${chalk.blueBright(linkDir)}`)
);
await fs.symlink(path.resolve('./'), linkDir);
}
return Promise.resolve();
} catch (err) {
Promise.reject(err);
}
}
exports.clean = cleanDist;
exports.sass = buildSass;
exports.assets = copyAssets;
exports.build = gulp.series(copyAssets, buildSass, buildJS);
exports.watch = gulp.series(watch);
exports.rebuild = gulp.series(cleanDist, exports.build);
exports.link = linkUserData;