| /* eslint-disable node/no-unpublished-require */ |
| /* eslint-disable prettier/prettier */ |
| /* eslint-disable no-console */ |
| |
| const timer = require('grunt-timer'); |
| |
| const kAllSuites = ['webgpu', 'stress', 'manual', 'unittests', 'demo']; |
| |
| module.exports = function (grunt) { |
| timer.init(grunt); |
| |
| // Project configuration. |
| grunt.initConfig({ |
| pkg: grunt.file.readJSON('package.json'), |
| |
| clean: { |
| out: ['gen/', 'out/', 'out-wpt/', 'out-node/'], |
| }, |
| |
| run: { |
| 'generate-version': { |
| cmd: 'node', |
| args: ['tools/gen_version'], |
| }, |
| 'generate-listings': { |
| cmd: 'node', |
| args: ['tools/gen_listings', 'gen/', ...kAllSuites.map(s => 'src/' + s)], |
| }, |
| validate: { |
| cmd: 'node', |
| args: ['tools/validate', ...kAllSuites.map(s => 'src/' + s)], |
| }, |
| 'generate-cache': { |
| // Note this generates files into the src/ directory (not the gen/ directory). |
| cmd: 'node', |
| args: ['tools/gen_cache', 'src/webgpu'], |
| }, |
| 'validate-cache': { |
| cmd: 'node', |
| args: ['tools/gen_cache', 'src/webgpu', '--validate'], |
| }, |
| 'write-out-wpt-cts-html': { |
| // Note this generates directly into the out-wpt/ directory rather than the gen/ directory. |
| cmd: 'node', |
| args: ['tools/gen_wpt_cts_html', 'tools/gen_wpt_cfg_unchunked.json'], |
| }, |
| 'write-out-wpt-cts-html-chunked2sec': { |
| // Note this generates directly into the out-wpt/ directory rather than the gen/ directory. |
| cmd: 'node', |
| args: ['tools/gen_wpt_cts_html', 'tools/gen_wpt_cfg_chunked2sec.json'], |
| }, |
| unittest: { |
| cmd: 'node', |
| args: ['tools/run_node', 'unittests:*'], |
| }, |
| 'build-out': { |
| cmd: 'node', |
| args: [ |
| 'node_modules/@babel/cli/bin/babel', |
| '--extensions=.ts,.js', |
| '--source-maps=true', |
| '--out-dir=out/', |
| 'src/', |
| // These files will be generated, instead of compiled from TypeScript. |
| '--ignore=src/common/internal/version.ts', |
| '--ignore=src/*/listing.ts', |
| ], |
| }, |
| 'build-out-wpt': { |
| cmd: 'node', |
| args: [ |
| 'node_modules/@babel/cli/bin/babel', |
| '--extensions=.ts,.js', |
| '--source-maps=false', |
| '--delete-dir-on-start', |
| '--out-dir=out-wpt/', |
| 'src/', |
| '--only=src/common/', |
| '--only=src/external/', |
| '--only=src/webgpu/', |
| // These files will be generated, instead of compiled from TypeScript. |
| '--ignore=src/common/internal/version.ts', |
| '--ignore=src/*/listing.ts', |
| // These files are only used by non-WPT builds. |
| '--ignore=src/common/runtime/cmdline.ts', |
| '--ignore=src/common/runtime/server.ts', |
| '--ignore=src/common/runtime/standalone.ts', |
| '--ignore=src/common/runtime/helper/sys.ts', |
| '--ignore=src/common/tools', |
| ], |
| }, |
| 'build-out-node': { |
| cmd: 'node', |
| args: [ |
| 'node_modules/typescript/lib/tsc.js', |
| '--project', 'node.tsconfig.json', |
| '--outDir', 'out-node/', |
| ], |
| }, |
| 'copy-assets': { |
| cmd: 'node', |
| args: [ |
| 'node_modules/@babel/cli/bin/babel', |
| 'src/resources/', |
| '--out-dir=out/resources/', |
| '--copy-files' |
| ], |
| }, |
| 'copy-assets-wpt': { |
| cmd: 'node', |
| args: [ |
| 'node_modules/@babel/cli/bin/babel', |
| 'src/resources/', |
| '--out-dir=out-wpt/resources/', |
| '--copy-files' |
| ], |
| }, |
| 'copy-assets-node': { |
| cmd: 'node', |
| args: [ |
| 'node_modules/@babel/cli/bin/babel', |
| 'src/resources/', |
| '--out-dir=out-node/resources/', |
| '--copy-files' |
| ], |
| }, |
| lint: { |
| cmd: 'node', |
| args: ['node_modules/eslint/bin/eslint', 'src/**/*.ts', '--max-warnings=0'], |
| }, |
| fix: { |
| cmd: 'node', |
| args: ['node_modules/eslint/bin/eslint', 'src/**/*.ts', '--fix'], |
| }, |
| 'autoformat-out-wpt': { |
| cmd: 'node', |
| // MAINTENANCE_TODO(gpuweb/cts#3128): This autoformat step is broken after a dependencies upgrade. |
| args: ['node_modules/prettier/bin/prettier.cjs', '--log-level=warn', '--write', 'out-wpt/**/*.js'], |
| }, |
| tsdoc: { |
| cmd: 'node', |
| args: ['node_modules/typedoc/bin/typedoc'], |
| }, |
| 'tsdoc-treatWarningsAsErrors': { |
| cmd: 'node', |
| args: ['node_modules/typedoc/bin/typedoc', '--treatWarningsAsErrors'], |
| }, |
| |
| serve: { |
| cmd: 'node', |
| args: ['node_modules/http-server/bin/http-server', '-p8080', '-a127.0.0.1', '-c-1'] |
| } |
| }, |
| |
| copy: { |
| 'gen-to-out': { |
| // Must run after generate-common and run:build-out. |
| files: [ |
| { expand: true, dest: 'out/', cwd: 'gen', src: 'common/internal/version.js' }, |
| { expand: true, dest: 'out/', cwd: 'gen', src: '*/listing.js' }, |
| ], |
| }, |
| 'gen-to-out-wpt': { |
| // Must run after generate-common and run:build-out-wpt. |
| files: [ |
| { expand: true, dest: 'out-wpt/', cwd: 'gen', src: 'common/internal/version.js' }, |
| { expand: true, dest: 'out-wpt/', cwd: 'gen', src: 'webgpu/listing.js' }, |
| ], |
| }, |
| 'htmlfiles-to-out-wpt': { |
| // Must run after run:build-out-wpt. |
| files: [ |
| { expand: true, dest: 'out-wpt/', cwd: 'src', src: 'webgpu/**/*.html' }, |
| ], |
| }, |
| }, |
| |
| ts: { |
| check: { |
| tsconfig: { |
| tsconfig: 'tsconfig.json', |
| passThrough: true, |
| }, |
| }, |
| }, |
| |
| concurrent: { |
| 'write-out-wpt-cts-html-all': { |
| tasks: [ |
| 'run:write-out-wpt-cts-html', |
| 'run:write-out-wpt-cts-html-chunked2sec', |
| ], |
| }, |
| 'all-builds': { |
| tasks: [ |
| 'build-standalone', |
| 'build-wpt', |
| 'run:build-out-node', |
| ], |
| }, |
| 'all-checks': { |
| tasks: [ |
| 'ts:check', |
| 'run:validate', |
| 'run:validate-cache', |
| 'run:unittest', |
| 'run:lint', |
| 'run:tsdoc-treatWarningsAsErrors', |
| ], |
| }, |
| 'all-builds-and-checks': { |
| tasks: [ |
| 'build-all', // Internally concurrent |
| 'concurrent:all-checks', |
| ], |
| }, |
| }, |
| }); |
| |
| grunt.loadNpmTasks('grunt-contrib-clean'); |
| grunt.loadNpmTasks('grunt-contrib-copy'); |
| grunt.loadNpmTasks('grunt-concurrent'); |
| grunt.loadNpmTasks('grunt-run'); |
| grunt.loadNpmTasks('grunt-ts'); |
| |
| const helpMessageTasks = []; |
| function registerTaskAndAddToHelp(name, desc, deps) { |
| grunt.registerTask(name, deps); |
| addExistingTaskToHelp(name, desc); |
| } |
| function addExistingTaskToHelp(name, desc) { |
| helpMessageTasks.push({ name, desc }); |
| } |
| |
| grunt.registerTask('generate-common', 'Generate files into gen/ and src/', [ |
| 'run:generate-version', |
| 'run:generate-listings', |
| 'run:generate-cache', |
| ]); |
| grunt.registerTask('build-standalone', 'Build out/ (no checks; run after generate-common)', [ |
| 'run:build-out', |
| 'run:copy-assets', |
| 'copy:gen-to-out', |
| ]); |
| grunt.registerTask('build-wpt', 'Build out-wpt/ (no checks; run after generate-common)', [ |
| 'run:build-out-wpt', |
| 'run:copy-assets-wpt', |
| 'copy:gen-to-out-wpt', |
| 'copy:htmlfiles-to-out-wpt', |
| 'concurrent:write-out-wpt-cts-html-all', |
| 'run:autoformat-out-wpt', |
| ]); |
| grunt.registerTask('build-node', 'Build out-node/ (no checks; run after generate-common)', [ |
| 'run:build-out-node', |
| 'run:copy-assets-node', |
| ]); |
| grunt.registerTask('build-all', 'Build out*/ (no checks; run after generate-common)', [ |
| 'concurrent:all-builds', |
| 'build-done-message', |
| ]); |
| grunt.registerTask('build-done-message', () => { |
| grunt.log.writeln(`\ |
| ===================================================== |
| ==== Build completed! Continuing checks/tests... ==== |
| =====================================================`); |
| }); |
| |
| grunt.registerTask('pre', ['all']); |
| |
| registerTaskAndAddToHelp('all', 'Run all builds and checks', [ |
| 'clean', |
| 'generate-common', |
| 'concurrent:all-builds-and-checks', |
| ]); |
| registerTaskAndAddToHelp('standalone', 'Build standalone (out/) (no checks)', [ |
| 'generate-common', |
| 'build-standalone', |
| 'build-done-message', |
| ]); |
| registerTaskAndAddToHelp('wpt', 'Build for WPT (out-wpt/) (no checks)', [ |
| 'generate-common', |
| 'build-wpt', |
| 'build-done-message', |
| ]); |
| registerTaskAndAddToHelp('node', 'Build node (out-node/) (no checks)', [ |
| 'generate-common', |
| 'build-node', |
| 'build-done-message', |
| ]); |
| registerTaskAndAddToHelp('checks', 'Run all checks (and build tsdoc)', [ |
| 'concurrent:all-checks', |
| ]); |
| registerTaskAndAddToHelp('unittest', 'Just run unittests', [ |
| 'run:unittest', |
| ]); |
| registerTaskAndAddToHelp('typecheck', 'Just typecheck', [ |
| 'ts:check', |
| ]); |
| registerTaskAndAddToHelp('tsdoc', 'Just build tsdoc', [ |
| 'run:tsdoc', |
| ]); |
| |
| registerTaskAndAddToHelp('serve', 'Serve out/ (without building anything)', ['run:serve']); |
| registerTaskAndAddToHelp('fix', 'Fix lint and formatting', ['run:fix']); |
| |
| addExistingTaskToHelp('clean', 'Delete built and generated files'); |
| |
| grunt.registerTask('default', '', () => { |
| console.error('\nRecommended tasks:'); |
| let nameColumnSize = Math.max(...helpMessageTasks.map(({ name }) => name.length)); |
| for (const { name, desc } of helpMessageTasks) { |
| console.error(`$ grunt ${name.padEnd(nameColumnSize)} # ${desc}`); |
| } |
| }); |
| }; |