const path = require("path"); module.exports = grunt => { const testFilter = grunt.option("test-filter") || "'' ."; grunt.initConfig({ pkg: grunt.file.readJSON("package.json"), clean: { default: ["dist/*", "!dist/.death-notifier.db"], }, copy: { composer: { files: [{expand: true, cwd: "./vendor/", src: "**", dest: "dist/.vendor/", flatten: false}] }, css: { files: [{expand: true, cwd: "src/main/", src: "**/*.css", dest: "dist/", flatten: true}] }, html: { files: [{expand: true, cwd: "src/main/", src: "**/*.html", dest: "dist/", flatten: true}] }, php: { files: [ {expand: true, cwd: "src/main/", src: "*.php", dest: "dist/", flatten: false}, {expand: true, cwd: "src/main/php/", src: "**/*.php", dest: "dist/", flatten: false}, ] }, php_test: { files: [{expand: true, cwd: "src/test/php", src: "**/*.php", dest: "dist/", flatten: false}] }, }, focus: { dev: { include: ["css", "html", "php", "ts"], }, }, replace: { dev: { src: ["./dist/**/*.html", "./dist/**/*.js", "./dist/**/*.php"], replacements: [ { from: "%%VERSION_NUMBER%%", to: "<%= pkg.version %>+" + new Date().toISOString().slice(0, 19).replace(/[-:T]/g, "") }, { from: "%%DB_VERSION_NUMBER%%", to: "<%= pkg.version %>" } ], overwrite: true }, deploy: { src: ["./dist/**/*.html", "./dist/**/*.js", "./dist/**/*.php"], replacements: [ { from: "%%VERSION_NUMBER%%", to: "<%= pkg.version %>" }, { from: "%%DB_VERSION_NUMBER%%", to: "<%= pkg.version %>" } ], overwrite: true }, }, run: { composer_dev: { exec: "composer.phar install" }, composer: { exec: "composer.phar install --no-dev" }, phpunit: { exec: `cd dist/ && chmod +x .vendor/bin/phpunit && .vendor/bin/phpunit --filter ${testFilter}` }, stan: { exec: "vendor/bin/phpstan analyse -l 8 src/main src/test" }, }, watch: { css: { files: ["src/main/**/*.css"], tasks: ["copy:css", "replace:dev"], }, html: { files: ["src/main/**/*.html"], tasks: ["copy:html", "replace:dev"], }, php: { files: ["src/**/*.php"], tasks: ["copy:php", "copy:php_test", "replace:dev"], }, ts: { files: ["src/main/**/*.ts"], tasks: ["webpack:dev", "replace:dev"], }, }, webpack: { options: { entry: "./src/main/js/Main.ts", module: { rules: [ { test: /\.ts$/, use: "ts-loader", exclude: /node_modules/, }, ], }, resolve: { extensions: [".ts"], }, output: { filename: "bundle.js", path: path.resolve(__dirname, "dist/"), }, }, dev: { mode: "development", devtool: "inline-source-map", }, deploy: { mode: "production", }, }, }); grunt.loadNpmTasks("grunt-contrib-clean"); grunt.loadNpmTasks("grunt-contrib-copy"); grunt.loadNpmTasks("grunt-contrib-watch"); grunt.loadNpmTasks("grunt-focus"); grunt.loadNpmTasks("grunt-run"); grunt.loadNpmTasks("grunt-text-replace"); grunt.loadNpmTasks("grunt-webpack"); grunt.registerTask("dev", [ // Pre "clean", // Composer "run:composer_dev", // Copy files "copy:composer", "copy:css", "copy:html", "copy:php", "copy:php_test", // Compile JS "webpack:dev", "replace:dev", ]); grunt.registerTask("dev:server", ["dev", "focus:dev"]); grunt.registerTask("deploy", [ // Pre "clean", // Composer "run:composer", // Copy files "copy:composer", "copy:css", "copy:html", "copy:php", // Compile JS "webpack:deploy", "replace:deploy", ]); grunt.registerTask("analyze", ["run:stan"]); grunt.registerTask("check", ["dev", "run:stan", "run:phpunit"]); grunt.registerTask("test", ["dev", "run:phpunit"]); grunt.registerTask("default", ["dev"]); };