apply plugin: 'java' apply from: "${rootDir}/gradle/xtext-common.gradle" apply from: "${rootDir}/gradle/junit.gradle" dependencies { implementation project(':refinery-language') implementation project(':refinery-language-ide') implementation "org.eclipse.xtext:org.eclipse.xtext.web:${xtextVersion}" implementation "org.eclipse.xtend:org.eclipse.xtend.lib:${xtextVersion}" implementation "org.eclipse.jetty:jetty-server:${jettyVersion}" implementation "org.eclipse.jetty:jetty-servlet:${jettyVersion}" implementation "org.eclipse.jetty.websocket:websocket-jetty-server:${jettyVersion}" implementation "org.slf4j:slf4j-simple:${slf4JVersion}" implementation "org.slf4j:log4j-over-slf4j:${slf4JVersion}" testImplementation testFixtures(project(':refinery-language')) testImplementation "org.eclipse.xtext:org.eclipse.xtext.testing:${xtextVersion}" testImplementation "org.eclipse.jetty.websocket:websocket-jetty-client:${jettyVersion}" } def generateXtextLanguage = project(':refinery-language').tasks.named('generateXtextLanguage') for (taskName in ['compileJava', 'processResources']) { tasks.named(taskName) { dependsOn generateXtextLanguage } } def webpackOutputDir = "${buildDir}/webpack" def productionResources = "${webpackOutputDir}/production" def serverMainClass = 'tools.refinery.language.web.ServerLauncher' apply plugin: 'org.siouan.frontend-jdk11' import org.siouan.frontendgradleplugin.infrastructure.gradle.RunNpmYarn def nodeDirectory = "${rootDir}/.gradle/node" frontend { nodeVersion = project.ext.nodeVersion nodeInstallDirectory = file(nodeDirectory) yarnEnabled = true yarnVersion = project.ext.yarnVersion yarnInstallDirectory = file("${rootDir}/.gradle/yarn") assembleScript = 'run assemble:webpack' } def installFrontend = tasks.named('installFrontend') def generateLezerGrammar = tasks.register('generateLezerGrammar', RunNpmYarn) { dependsOn installFrontend inputs.file('src/main/js/language/problem.grammar') inputs.files('package.json', 'yarn.lock') outputs.file "${buildDir}/generated/sources/lezer/problem.ts" outputs.file "${buildDir}/generated/sources/lezer/problem.terms.ts" script = 'run assemble:lezer' } def assembleFrontend = tasks.named('assembleFrontend') assembleFrontend.configure { dependsOn generateLezerGrammar inputs.dir 'src/main/css' inputs.dir 'src/main/html' inputs.dir 'src/main/js' inputs.file "${buildDir}/generated/sources/lezer/problem.ts" inputs.file "${buildDir}/generated/sources/lezer/problem.terms.ts" inputs.files('package.json', 'yarn.lock', 'webpack.config.js') outputs.dir productionResources } def eslint = tasks.register('eslint', RunNpmYarn) { dependsOn installFrontend inputs.dir 'src/main/js' inputs.files('.eslintrc.js', 'tsconfig.json') if (project.hasProperty('ci')) { outputs.file "${buildDir}/eslint.json" script = 'run check:eslint:ci' } else { script = 'run check:eslint' } group = 'verification' description = 'Check for TypeScript errors.' } def stylelint = tasks.register('stylelint', RunNpmYarn) { dependsOn installFrontend inputs.dir 'src/main/css' inputs.file '.stylelintrc.js' if (project.hasProperty('ci')) { outputs.file "${buildDir}/stylelint.json" script = 'run check:stylelint:ci' } else { script = 'run check:stylelint' } group = 'verification' description = 'Check for Sass errors.' } tasks.named('check') { dependsOn(eslint, stylelint) } tasks.named('jar') { dependsOn assembleFrontend from(productionResources) { into 'webapp' } } apply plugin: 'application' mainClassName = serverMainClass distTar.enabled = false distZip.enabled = false apply plugin: 'com.github.johnrengelman.shadow' shadowDistTar.enabled = false shadowDistZip.enabled = false tasks.named('shadowJar') { dependsOn assembleFrontend from(project.convention.getPlugin(JavaPluginConvention).sourceSets.main.output) configurations = [project.configurations.runtimeClasspath] exclude('META-INF/INDEX.LIST', 'META-INF/*.SF', 'META-INF/*.DSA', 'META-INF/*.RSA','schema/*', '.options', '.api_description', '*.profile', 'about.*', 'about_*.html', 'about_files/*', 'plugin.xml', 'systembundle.properties', 'profile.list', 'META-INF/resources/xtext/**') append('plugin.properties') from(productionResources) { into 'webapp' } } def jettyRun = tasks.register('jettyRun', JavaExec) { dependsOn assembleFrontend dependsOn sourceSets.main.runtimeClasspath classpath = sourceSets.main.runtimeClasspath.filter{it.exists()} mainClass = serverMainClass standardInput = System.in environment BASE_RESOURCE: productionResources group = 'run' description = 'Start a Jetty web server serving the Xtex API and assets (without rebuilding assets).' } tasks.register('webpackServe', RunNpmYarn) { dependsOn installFrontend dependsOn generateLezerGrammar outputs.dir "${webpackOutputDir}/development" script = 'run serve' group = 'run' description = 'Start a Webpack dev server with hot module replacement.' } sonarqube.properties { properties['sonar.sources'] += [ 'src/main/css', 'src/main/html', 'src/main/js', ] property 'sonar.nodejs.executable', "${nodeDirectory}/bin/node" property 'sonar.eslint.reportPaths', "${buildDir}/eslint.json" property 'sonar.css.stylelint.reportPaths', "${buildDir}/stylelint.json" // SonarJS does not pick up typescript files with `exactOptionalPropertyTypes` property 'sonar.typescript.tsconfigPath', 'tsconfig.sonar.json' }