Skip to content

Commit 23c9122

Browse files
ndbroadbentclaude
andcommitted
Upgrade to Gulp 5 and modularize build system
Major changes: - Upgraded from Gulp 3 to Gulp 5.0.0 - Now works with modern Node.js versions (18+) - Modularized gulpfile into smaller, maintainable modules - Updated deprecated dependencies: - gulp-minify-css → gulp-clean-css - Removed run-sequence (built into Gulp 4+) - Updated all gulp plugins to latest versions - Restructured build tasks using Gulp 5 syntax (series/parallel) - Fixed path issues (removed non-existent template directories) - Updated build-and-copy.sh to remove Node version check The build system is now compatible with modern development environments and follows best practices for Gulp task organization. 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <[email protected]>
1 parent 7f4f81e commit 23c9122

File tree

10 files changed

+769
-1105
lines changed

10 files changed

+769
-1105
lines changed

gulp/config.js

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
const pkg = require('../package.json');
2+
3+
module.exports = {
4+
package: pkg,
5+
versionableFiles: [
6+
"package.json",
7+
"alpaca.jquery.json",
8+
"bower.json"
9+
],
10+
umdWrapperPath: "./config/umd-wrapper.txt"
11+
};

gulp/tasks/clean.js

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
const { src } = require('gulp');
2+
const clean = require('gulp-clean');
3+
4+
function cleanTask() {
5+
return src(["build", "dist"], { read: false, allowEmpty: true })
6+
.pipe(clean());
7+
}
8+
9+
cleanTask.displayName = 'clean';
10+
cleanTask.description = 'Clean build and dist directories';
11+
12+
module.exports = cleanTask;

gulp/tasks/scripts.js

Lines changed: 181 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,181 @@
1+
const { src, dest, series, parallel } = require('gulp');
2+
const fs = require('fs');
3+
const concat = require('gulp-concat');
4+
const uglify = require('gulp-uglify-es').default;
5+
const wrapUmd = require('gulp-wrap-umd');
6+
const babel = require('gulp-babel');
7+
const notify = require('gulp-notify');
8+
const paths = require('../utils/paths');
9+
const config = require('../config');
10+
11+
// Read UMD wrapper template
12+
const getUmdWrapper = () => fs.readFileSync(config.umdWrapperPath, 'utf-8');
13+
14+
// UMD configurations for different builds
15+
const umdConfigs = {
16+
web: {
17+
deps: [{
18+
"name": "jquery",
19+
"globalName": "jQuery",
20+
"paramName": "$"
21+
}, {
22+
"name": "handlebars",
23+
"globalName": "Handlebars",
24+
"paramName": "Handlebars"
25+
}],
26+
namespace: "Alpaca",
27+
exports: "Alpaca",
28+
template: getUmdWrapper()
29+
},
30+
bootstrap: {
31+
deps: [{
32+
"name": "jquery",
33+
"globalName": "jQuery",
34+
"paramName": "$"
35+
}, {
36+
"name": "handlebars",
37+
"globalName": "Handlebars",
38+
"paramName": "Handlebars"
39+
}, {
40+
"name": "bootstrap",
41+
"globalName": "Bootstrap",
42+
"paramName": "Bootstrap"
43+
}],
44+
namespace: "Alpaca",
45+
exports: "Alpaca",
46+
template: getUmdWrapper(),
47+
defaultView: 'bootstrap'
48+
},
49+
jqueryui: {
50+
deps: [{
51+
"name": "jquery",
52+
"globalName": "jQuery",
53+
"paramName": "$"
54+
}, {
55+
"name": "handlebars",
56+
"globalName": "Handlebars",
57+
"paramName": "Handlebars"
58+
}, {
59+
"name": "jquery-ui",
60+
"globalName": "jQueryUI",
61+
"paramName": "jQueryUI"
62+
}],
63+
namespace: "Alpaca",
64+
exports: "Alpaca",
65+
template: getUmdWrapper(),
66+
defaultView: 'jqueryui'
67+
},
68+
jquerymobile: {
69+
deps: [{
70+
"name": "jquery",
71+
"globalName": "jQuery",
72+
"paramName": "$"
73+
}, {
74+
"name": "handlebars",
75+
"globalName": "Handlebars",
76+
"paramName": "Handlebars"
77+
}, {
78+
"name": "jquery-mobile",
79+
"globalName": "jQM",
80+
"paramName": "jQM"
81+
}],
82+
namespace: "Alpaca",
83+
exports: "Alpaca",
84+
template: getUmdWrapper(),
85+
defaultView: 'jquerymobile'
86+
}
87+
};
88+
89+
// Transpile files that need babel
90+
function transpileScripts() {
91+
return src(paths.scripts.filesToTranspile)
92+
.pipe(babel({
93+
presets: [
94+
['@babel/preset-env', {
95+
targets: {
96+
'ie': '9'
97+
}
98+
}]
99+
]
100+
}))
101+
.pipe(dest('build/tmp/transpiled'));
102+
}
103+
104+
// Concatenate core scripts
105+
function concatCoreScripts() {
106+
return src(paths.scripts.core)
107+
.pipe(concat('scripts-core.js'))
108+
.pipe(dest('build/tmp'));
109+
}
110+
111+
// Build Bootstrap version
112+
function buildBootstrapScripts() {
113+
return src(paths.scripts.bootstrap)
114+
.pipe(concat('alpaca.js'))
115+
.pipe(wrapUmd(umdConfigs.bootstrap))
116+
.pipe(dest('build/alpaca/bootstrap'))
117+
.pipe(concat('alpaca.min.js'))
118+
// .pipe(uglify()) // Commented out in original
119+
.pipe(dest('build/alpaca/bootstrap'));
120+
}
121+
122+
// Build Web version (commented out in original)
123+
function buildWebScripts() {
124+
return src(paths.scripts.web)
125+
.pipe(concat('alpaca.js'))
126+
.pipe(wrapUmd(umdConfigs.web))
127+
.pipe(dest('build/alpaca/web'))
128+
.pipe(concat('alpaca.min.js'))
129+
.pipe(uglify())
130+
.pipe(dest('build/alpaca/web'));
131+
}
132+
133+
// Build jQuery UI version (commented out in original)
134+
function buildJQueryUIScripts() {
135+
return src(paths.scripts.jqueryui)
136+
.pipe(concat('alpaca.js'))
137+
.pipe(wrapUmd(umdConfigs.jqueryui))
138+
.pipe(dest('build/alpaca/jqueryui'))
139+
.pipe(concat('alpaca.min.js'))
140+
.pipe(uglify())
141+
.pipe(dest('build/alpaca/jqueryui'));
142+
}
143+
144+
// Build jQuery Mobile version (commented out in original)
145+
function buildJQueryMobileScripts() {
146+
return src(paths.scripts.jquerymobile)
147+
.pipe(concat('alpaca.js'))
148+
.pipe(wrapUmd(umdConfigs.jquerymobile))
149+
.pipe(dest('build/alpaca/jquerymobile'))
150+
.pipe(concat('alpaca.min.js'))
151+
.pipe(uglify())
152+
.pipe(dest('build/alpaca/jquerymobile'));
153+
}
154+
155+
// Build distribution scripts
156+
function buildDistScripts() {
157+
// Note: In the original gulpfile, only bootstrap is built
158+
// Other builds are commented out
159+
return buildBootstrapScripts()
160+
.pipe(notify({ message: "Built Alpaca JS" }));
161+
}
162+
163+
// Main scripts task
164+
const buildScripts = series(
165+
transpileScripts,
166+
concatCoreScripts,
167+
buildDistScripts
168+
);
169+
170+
buildScripts.displayName = 'build-scripts';
171+
buildScripts.description = 'Build all JavaScript files';
172+
173+
module.exports = {
174+
buildScripts,
175+
transpileScripts,
176+
concatCoreScripts,
177+
buildBootstrapScripts,
178+
buildWebScripts,
179+
buildJQueryUIScripts,
180+
buildJQueryMobileScripts
181+
};

gulp/tasks/styles.js

Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
const { src, dest, parallel } = require('gulp');
2+
const concat = require('gulp-concat');
3+
const rename = require('gulp-rename');
4+
const cleanCss = require('gulp-clean-css'); // Updated from deprecated gulp-minify-css
5+
const paths = require('../utils/paths');
6+
7+
function buildWebStyles() {
8+
return src(paths.styles.web)
9+
.pipe(concat('alpaca.css'))
10+
.pipe(dest('build/alpaca/web'))
11+
.pipe(rename({ suffix: ".min" }))
12+
.pipe(cleanCss())
13+
.pipe(dest('build/alpaca/web'));
14+
}
15+
16+
function copyWebImages() {
17+
return src("src/css/images/**")
18+
.pipe(dest('./build/alpaca/web/images'));
19+
}
20+
21+
function buildBootstrapStyles() {
22+
return src(paths.styles.bootstrap)
23+
.pipe(concat('alpaca.css'))
24+
.pipe(dest('build/alpaca/bootstrap'))
25+
.pipe(rename({ suffix: ".min" }))
26+
.pipe(cleanCss())
27+
.pipe(dest('build/alpaca/bootstrap'));
28+
}
29+
30+
function copyBootstrapImages() {
31+
return src("src/css/images/**")
32+
.pipe(dest('./build/alpaca/bootstrap/images'));
33+
}
34+
35+
function buildJQueryUIStyles() {
36+
return src(paths.styles.jqueryui)
37+
.pipe(concat('alpaca.css'))
38+
.pipe(dest('build/alpaca/jqueryui'))
39+
.pipe(rename({ suffix: ".min" }))
40+
.pipe(cleanCss())
41+
.pipe(dest('build/alpaca/jqueryui'));
42+
}
43+
44+
function copyJQueryUIImages() {
45+
return src("src/css/images/**")
46+
.pipe(dest('./build/alpaca/jqueryui/images'));
47+
}
48+
49+
function buildJQueryMobileStyles() {
50+
return src(paths.styles.jquerymobile)
51+
.pipe(concat('alpaca.css'))
52+
.pipe(dest('build/alpaca/jquerymobile'))
53+
.pipe(rename({ suffix: ".min" }))
54+
.pipe(cleanCss())
55+
.pipe(dest('build/alpaca/jquerymobile'));
56+
}
57+
58+
function copyJQueryMobileImages() {
59+
return src("src/css/images/**")
60+
.pipe(dest('./build/alpaca/jquerymobile/images'));
61+
}
62+
63+
// Main styles task
64+
const buildStyles = parallel(
65+
buildWebStyles,
66+
copyWebImages,
67+
buildBootstrapStyles,
68+
copyBootstrapImages,
69+
buildJQueryUIStyles,
70+
copyJQueryUIImages,
71+
buildJQueryMobileStyles,
72+
copyJQueryMobileImages
73+
);
74+
75+
buildStyles.displayName = 'build-styles';
76+
buildStyles.description = 'Build all CSS files and copy images';
77+
78+
module.exports = {
79+
buildStyles,
80+
buildWebStyles,
81+
buildBootstrapStyles,
82+
buildJQueryUIStyles,
83+
buildJQueryMobileStyles
84+
};

gulp/tasks/templates.js

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
const { src, dest, parallel } = require('gulp');
2+
const handlebars = require('gulp-handlebars');
3+
const wrap = require('gulp-wrap');
4+
const declare = require('gulp-declare');
5+
const concat = require('gulp-concat');
6+
const paths = require('../utils/paths');
7+
const { processTemplateName } = require('../utils/helpers');
8+
9+
function buildWebTemplates() {
10+
return src(paths.templates.web)
11+
.pipe(handlebars({ handlebars: require('handlebars') }))
12+
.pipe(wrap('Handlebars.template(<%= contents %>)'))
13+
.pipe(declare({
14+
namespace: 'HandlebarsPrecompiled',
15+
processName: processTemplateName,
16+
noRedeclare: true
17+
}))
18+
.pipe(concat('templates-web.js'))
19+
.pipe(dest('build/tmp/'));
20+
}
21+
22+
function buildBootstrapTemplates() {
23+
return src(paths.templates.bootstrap)
24+
.pipe(handlebars({ handlebars: require('handlebars') }))
25+
.pipe(wrap('Handlebars.template(<%= contents %>)'))
26+
.pipe(declare({
27+
namespace: 'HandlebarsPrecompiled',
28+
processName: processTemplateName,
29+
noRedeclare: true
30+
}))
31+
.pipe(concat('templates-bootstrap.js'))
32+
.pipe(dest('build/tmp/'));
33+
}
34+
35+
function buildJQueryUITemplates() {
36+
return src(paths.templates.jqueryui)
37+
.pipe(handlebars({ handlebars: require('handlebars') }))
38+
.pipe(wrap('Handlebars.template(<%= contents %>)'))
39+
.pipe(declare({
40+
namespace: 'HandlebarsPrecompiled',
41+
processName: processTemplateName,
42+
noRedeclare: true
43+
}))
44+
.pipe(concat('templates-jqueryui.js'))
45+
.pipe(dest('build/tmp/'));
46+
}
47+
48+
function buildJQueryMobileTemplates() {
49+
return src(paths.templates.jquerymobile)
50+
.pipe(handlebars({ handlebars: require('handlebars') }))
51+
.pipe(wrap('Handlebars.template(<%= contents %>)'))
52+
.pipe(declare({
53+
namespace: 'HandlebarsPrecompiled',
54+
processName: processTemplateName,
55+
noRedeclare: true
56+
}))
57+
.pipe(concat('templates-jquerymobile.js'))
58+
.pipe(dest('build/tmp/'));
59+
}
60+
61+
// Named exports for individual tasks
62+
buildWebTemplates.displayName = 'build-templates:web';
63+
buildBootstrapTemplates.displayName = 'build-templates:bootstrap';
64+
buildJQueryUITemplates.displayName = 'build-templates:jqueryui';
65+
buildJQueryMobileTemplates.displayName = 'build-templates:jquerymobile';
66+
67+
// Main templates task
68+
const buildTemplates = parallel(
69+
buildWebTemplates,
70+
buildBootstrapTemplates,
71+
buildJQueryUITemplates,
72+
buildJQueryMobileTemplates
73+
);
74+
buildTemplates.displayName = 'build-templates';
75+
buildTemplates.description = 'Compile all Handlebars templates';
76+
77+
module.exports = {
78+
buildTemplates,
79+
buildWebTemplates,
80+
buildBootstrapTemplates,
81+
buildJQueryUITemplates,
82+
buildJQueryMobileTemplates
83+
};

0 commit comments

Comments
 (0)