Build: Test on Node 10, 16 & 18; fix CI in Node <16

Ref gh-2157
This commit is contained in:
Michał Gołębiowski-Owczarek 2023-03-30 00:21:25 +02:00 committed by Michał Gołębiowski-Owczarek
parent f36fe9e50d
commit afb83c315d
3 changed files with 116 additions and 92 deletions

View File

@ -12,7 +12,8 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
strategy: strategy:
matrix: matrix:
node-version: [12.x, 14.x] # Node.js 10 is required by jQuery infra
node-version: [10.x, 16.x, 18.x]
steps: steps:
- uses: actions/checkout@v3 - uses: actions/checkout@v3

View File

@ -2,92 +2,98 @@
module.exports = function( grunt ) { module.exports = function( grunt ) {
var // files
glob = require( "glob" ), const coreFiles = [
"core.js",
"widget.js",
"widgets/mouse.js",
"widgets/draggable.js",
"widgets/droppable.js",
"widgets/resizable.js",
"widgets/selectable.js",
"widgets/sortable.js",
"effect.js"
];
// files const uiFiles = coreFiles.map( function( file ) {
coreFiles = [ return "ui/" + file;
"core.js", } ).concat( expandFiles( "ui/**/*.js" ).filter( function( file ) {
"widget.js", return coreFiles.indexOf( file.substring( 3 ) ) === -1;
"widgets/mouse.js", } ) );
"widgets/draggable.js",
"widgets/droppable.js",
"widgets/resizable.js",
"widgets/selectable.js",
"widgets/sortable.js",
"effect.js"
],
uiFiles = coreFiles.map( function( file ) { const allI18nFiles = expandFiles( "ui/i18n/*.js" );
return "ui/" + file;
} ).concat( expandFiles( "ui/**/*.js" ).filter( function( file ) {
return coreFiles.indexOf( file.substring( 3 ) ) === -1;
} ) ),
allI18nFiles = expandFiles( "ui/i18n/*.js" ), const cssFiles = [
"core",
"accordion",
"autocomplete",
"button",
"checkboxradio",
"controlgroup",
"datepicker",
"dialog",
"draggable",
"menu",
"progressbar",
"resizable",
"selectable",
"selectmenu",
"sortable",
"slider",
"spinner",
"tabs",
"tooltip",
"theme"
].map( function( component ) {
return "themes/base/" + component + ".css";
} );
cssFiles = [ // minified files
"core", const minify = {
"accordion", options: {
"autocomplete", preserveComments: false
"button", },
"checkboxradio", main: {
"controlgroup",
"datepicker",
"dialog",
"draggable",
"menu",
"progressbar",
"resizable",
"selectable",
"selectmenu",
"sortable",
"slider",
"spinner",
"tabs",
"tooltip",
"theme"
].map( function( component ) {
return "themes/base/" + component + ".css";
} ),
// minified files
minify = {
options: { options: {
preserveComments: false banner: createBanner( uiFiles )
}, },
main: { files: {
options: { "dist/jquery-ui.min.js": "dist/jquery-ui.js"
banner: createBanner( uiFiles )
},
files: {
"dist/jquery-ui.min.js": "dist/jquery-ui.js"
}
},
i18n: {
options: {
banner: createBanner( allI18nFiles )
},
files: {
"dist/i18n/jquery-ui-i18n.min.js": "dist/i18n/jquery-ui-i18n.js"
}
} }
}, },
i18n: {
options: {
banner: createBanner( allI18nFiles )
},
files: {
"dist/i18n/jquery-ui-i18n.min.js": "dist/i18n/jquery-ui-i18n.js"
}
}
};
compareFiles = { const compareFiles = {
all: [ all: [
"dist/jquery-ui.js", "dist/jquery-ui.js",
"dist/jquery-ui.min.js" "dist/jquery-ui.min.js"
] ]
}, };
component = grunt.option( "component" ) || "**", const component = grunt.option( "component" ) || "**";
htmllintBad = [ const htmllintBad = [
"demos/tabs/ajax/content*.html", "demos/tabs/ajax/content*.html",
"demos/tooltip/ajax/content*.html", "demos/tooltip/ajax/content*.html",
"tests/unit/core/core.html", "tests/unit/core/core.html",
"tests/unit/tabs/data/test.html" "tests/unit/tabs/data/test.html"
]; ];
const nodeV16OrNewer = !/^v1[0-5]\./.test( process.version );
// Support: Node.js <16
// Skip running tasks that dropped support for Node.js 10-15
// in this Node version.
function runIfNewNode( task ) {
return nodeV16OrNewer ? task : "print_old_node_message:" + task;
}
function mapMinFile( file ) { function mapMinFile( file ) {
return "dist/" + file.replace( /ui\//, "minified/" ); return "dist/" + file.replace( /ui\//, "minified/" );
@ -115,12 +121,6 @@ uiFiles.forEach( function( file ) {
compareFiles[ file ] = [ file, mapMinFile( file ) ]; compareFiles[ file ] = [ file, mapMinFile( file ) ];
} ); } );
// grunt plugins
require( "load-grunt-tasks" )( grunt );
// local testswarm and build tasks
grunt.loadTasks( "build/tasks" );
function stripDirectory( file ) { function stripDirectory( file ) {
return file.replace( /.+\/(.+?)>?$/, "$1" ); return file.replace( /.+\/(.+?)>?$/, "$1" );
} }
@ -128,7 +128,7 @@ function stripDirectory( file ) {
function createBanner( files ) { function createBanner( files ) {
// strip folders // strip folders
var fileNames = files && files.map( stripDirectory ); const fileNames = files && files.map( stripDirectory );
return "/*! <%= pkg.title || pkg.name %> - v<%= pkg.version %> - " + return "/*! <%= pkg.title || pkg.name %> - v<%= pkg.version %> - " +
"<%= grunt.template.today('isoDate') %>\n" + "<%= grunt.template.today('isoDate') %>\n" +
"<%= pkg.homepage ? '* ' + pkg.homepage + '\\n' : '' %>" + "<%= pkg.homepage ? '* ' + pkg.homepage + '\\n' : '' %>" +
@ -184,9 +184,10 @@ grunt.initConfig( {
ignore: [ ignore: [
/The text content of element “script” was not in the required format: Expected space, tab, newline, or slash but found “.” instead/ /The text content of element “script” was not in the required format: Expected space, tab, newline, or slash but found “.” instead/
] }, ] },
src: glob.sync( "{demos,tests}/**/*.html", { src: [
ignore: htmllintBad "{demos,tests}/**/*.html",
} ) ...htmllintBad.map( pattern => `!${ pattern }` )
]
}, },
bad: { bad: {
options: { options: {
@ -469,9 +470,22 @@ grunt.initConfig( {
} }
} ); } );
// grunt plugins
require( "load-grunt-tasks" )( grunt, {
pattern: nodeV16OrNewer ? [ "grunt-*" ] : [
"grunt-*",
"!grunt-contrib-qunit",
"!grunt-eslint",
"!grunt-html"
]
} );
// local testswarm and build tasks
grunt.loadTasks( "build/tasks" );
grunt.registerTask( "update-authors", function() { grunt.registerTask( "update-authors", function() {
var getAuthors = require( "grunt-git-authors" ).getAuthors, const getAuthors = require( "grunt-git-authors" ).getAuthors;
done = this.async(); const done = this.async();
getAuthors( { getAuthors( {
priorAuthors: grunt.config( "authors.prior" ) priorAuthors: grunt.config( "authors.prior" )
@ -499,11 +513,21 @@ grunt.registerTask( "update-authors", function() {
} ); } );
} ); } );
grunt.registerTask( "print_old_node_message", ( ...args ) => {
const task = args.join( ":" );
grunt.log.writeln( "Old Node.js detected, running the task \"" + task + "\" skipped..." );
} );
// Keep this task list in sync with the testing steps in our GitHub action test workflow file! // Keep this task list in sync with the testing steps in our GitHub action test workflow file!
grunt.registerTask( "default", [ "lint", "requirejs", "test" ] ); grunt.registerTask( "default", [ "lint", "requirejs", "test" ] );
grunt.registerTask( "jenkins", [ "default", "concat" ] ); grunt.registerTask( "jenkins", [ "default", "concat" ] );
grunt.registerTask( "lint", [ "asciilint", "eslint", "csslint", "htmllint" ] ); grunt.registerTask( "lint", [
grunt.registerTask( "test", [ "qunit" ] ); "asciilint",
runIfNewNode( "eslint" ),
"csslint",
runIfNewNode( "htmllint" )
] );
grunt.registerTask( "test", [ runIfNewNode( "qunit" ) ] );
grunt.registerTask( "sizer", [ "requirejs:js", "uglify:main", "compare_size:all" ] ); grunt.registerTask( "sizer", [ "requirejs:js", "uglify:main", "compare_size:all" ] );
grunt.registerTask( "sizer_all", [ "requirejs:js", "uglify", "compare_size" ] ); grunt.registerTask( "sizer_all", [ "requirejs:js", "uglify", "compare_size" ] );

View File

@ -53,7 +53,6 @@
"devDependencies": { "devDependencies": {
"commitplease": "3.2.0", "commitplease": "3.2.0",
"eslint-config-jquery": "3.0.0", "eslint-config-jquery": "3.0.0",
"glob": "7.2.0",
"grunt": "1.5.3", "grunt": "1.5.3",
"grunt-bowercopy": "1.2.5", "grunt-bowercopy": "1.2.5",
"grunt-cli": "1.4.3", "grunt-cli": "1.4.3",