aboutsummaryrefslogtreecommitdiffstats
path: root/subprojects
diff options
context:
space:
mode:
authorLibravatar Kristóf Marussy <kristof@marussy.com>2021-12-13 02:07:04 +0100
committerLibravatar Kristóf Marussy <kristof@marussy.com>2021-12-14 02:14:23 +0100
commita96c52b21e7e590bbdd70b80896780a446fa2e8b (patch)
tree663619baa254577bb2f5342192e80bca692ad91d /subprojects
parentbuild: move modules into subproject directory (diff)
downloadrefinery-a96c52b21e7e590bbdd70b80896780a446fa2e8b.tar.gz
refinery-a96c52b21e7e590bbdd70b80896780a446fa2e8b.tar.zst
refinery-a96c52b21e7e590bbdd70b80896780a446fa2e8b.zip
build: separate module for frontend
This allows us to simplify the webpack configuration and the gradle build scripts.
Diffstat (limited to 'subprojects')
-rw-r--r--subprojects/frontend/.eslintrc.js (renamed from subprojects/language-web/.eslintrc.js)1
-rw-r--r--subprojects/frontend/.stylelintrc.js (renamed from subprojects/language-web/.stylelintrc.js)0
-rw-r--r--subprojects/frontend/build.gradle101
-rw-r--r--subprojects/frontend/package.json (renamed from subprojects/language-web/package.json)17
-rw-r--r--subprojects/frontend/src/App.tsx (renamed from subprojects/language-web/src/main/js/App.tsx)0
-rw-r--r--subprojects/frontend/src/RootStore.tsx (renamed from subprojects/language-web/src/main/js/RootStore.tsx)0
-rw-r--r--subprojects/frontend/src/editor/EditorArea.tsx (renamed from subprojects/language-web/src/main/js/editor/EditorArea.tsx)0
-rw-r--r--subprojects/frontend/src/editor/EditorButtons.tsx (renamed from subprojects/language-web/src/main/js/editor/EditorButtons.tsx)0
-rw-r--r--subprojects/frontend/src/editor/EditorParent.ts (renamed from subprojects/language-web/src/main/js/editor/EditorParent.ts)0
-rw-r--r--subprojects/frontend/src/editor/EditorStore.ts (renamed from subprojects/language-web/src/main/js/editor/EditorStore.ts)0
-rw-r--r--subprojects/frontend/src/editor/GenerateButton.tsx (renamed from subprojects/language-web/src/main/js/editor/GenerateButton.tsx)0
-rw-r--r--subprojects/frontend/src/editor/decorationSetExtension.ts (renamed from subprojects/language-web/src/main/js/editor/decorationSetExtension.ts)0
-rw-r--r--subprojects/frontend/src/editor/findOccurrences.ts (renamed from subprojects/language-web/src/main/js/editor/findOccurrences.ts)0
-rw-r--r--subprojects/frontend/src/editor/semanticHighlighting.ts (renamed from subprojects/language-web/src/main/js/editor/semanticHighlighting.ts)0
-rw-r--r--subprojects/frontend/src/global.d.ts (renamed from subprojects/language-web/src/main/js/global.d.ts)0
-rw-r--r--subprojects/frontend/src/index.html (renamed from subprojects/language-web/src/main/html/index.html)0
-rw-r--r--subprojects/frontend/src/index.scss (renamed from subprojects/language-web/src/main/css/index.scss)0
-rw-r--r--subprojects/frontend/src/index.tsx (renamed from subprojects/language-web/src/main/js/index.tsx)2
-rw-r--r--subprojects/frontend/src/language/folding.ts (renamed from subprojects/language-web/src/main/js/language/folding.ts)0
-rw-r--r--subprojects/frontend/src/language/indentation.ts (renamed from subprojects/language-web/src/main/js/language/indentation.ts)0
-rw-r--r--subprojects/frontend/src/language/problem.grammar (renamed from subprojects/language-web/src/main/js/language/problem.grammar)2
-rw-r--r--subprojects/frontend/src/language/problemLanguageSupport.ts (renamed from subprojects/language-web/src/main/js/language/problemLanguageSupport.ts)2
-rw-r--r--subprojects/frontend/src/language/props.ts (renamed from subprojects/language-web/src/main/js/language/props.ts)0
-rw-r--r--subprojects/frontend/src/theme/EditorTheme.ts (renamed from subprojects/language-web/src/main/js/theme/EditorTheme.ts)2
-rw-r--r--subprojects/frontend/src/theme/ThemeProvider.tsx (renamed from subprojects/language-web/src/main/js/theme/ThemeProvider.tsx)0
-rw-r--r--subprojects/frontend/src/theme/ThemeStore.ts (renamed from subprojects/language-web/src/main/js/theme/ThemeStore.ts)0
-rw-r--r--subprojects/frontend/src/themeVariables.module.scss (renamed from subprojects/language-web/src/main/css/themeVariables.module.scss)0
-rw-r--r--subprojects/frontend/src/themes.scss (renamed from subprojects/language-web/src/main/css/themes.scss)0
-rw-r--r--subprojects/frontend/src/utils/ConditionVariable.ts (renamed from subprojects/language-web/src/main/js/utils/ConditionVariable.ts)0
-rw-r--r--subprojects/frontend/src/utils/PendingTask.ts (renamed from subprojects/language-web/src/main/js/utils/PendingTask.ts)0
-rw-r--r--subprojects/frontend/src/utils/Timer.ts (renamed from subprojects/language-web/src/main/js/utils/Timer.ts)0
-rw-r--r--subprojects/frontend/src/utils/logger.ts (renamed from subprojects/language-web/src/main/js/utils/logger.ts)0
-rw-r--r--subprojects/frontend/src/xtext/ContentAssistService.ts (renamed from subprojects/language-web/src/main/js/xtext/ContentAssistService.ts)0
-rw-r--r--subprojects/frontend/src/xtext/HighlightingService.ts (renamed from subprojects/language-web/src/main/js/xtext/HighlightingService.ts)0
-rw-r--r--subprojects/frontend/src/xtext/OccurrencesService.ts (renamed from subprojects/language-web/src/main/js/xtext/OccurrencesService.ts)0
-rw-r--r--subprojects/frontend/src/xtext/UpdateService.ts (renamed from subprojects/language-web/src/main/js/xtext/UpdateService.ts)0
-rw-r--r--subprojects/frontend/src/xtext/ValidationService.ts (renamed from subprojects/language-web/src/main/js/xtext/ValidationService.ts)0
-rw-r--r--subprojects/frontend/src/xtext/XtextClient.ts (renamed from subprojects/language-web/src/main/js/xtext/XtextClient.ts)0
-rw-r--r--subprojects/frontend/src/xtext/XtextWebSocketClient.ts (renamed from subprojects/language-web/src/main/js/xtext/XtextWebSocketClient.ts)0
-rw-r--r--subprojects/frontend/src/xtext/xtextMessages.ts (renamed from subprojects/language-web/src/main/js/xtext/xtextMessages.ts)0
-rw-r--r--subprojects/frontend/src/xtext/xtextServiceResults.ts (renamed from subprojects/language-web/src/main/js/xtext/xtextServiceResults.ts)0
-rw-r--r--subprojects/frontend/tsconfig.json (renamed from subprojects/language-web/tsconfig.json)2
-rw-r--r--subprojects/frontend/tsconfig.sonar.json (renamed from subprojects/language-web/tsconfig.sonar.json)3
-rw-r--r--subprojects/frontend/webpack.config.js (renamed from subprojects/language-web/webpack.config.js)100
-rw-r--r--subprojects/language-web/.editorconfig5
-rw-r--r--subprojects/language-web/build.gradle115
46 files changed, 149 insertions, 203 deletions
diff --git a/subprojects/language-web/.eslintrc.js b/subprojects/frontend/.eslintrc.js
index b27feb0e..aa7636f8 100644
--- a/subprojects/language-web/.eslintrc.js
+++ b/subprojects/frontend/.eslintrc.js
@@ -26,7 +26,6 @@ module.exports = {
26 '@typescript-eslint/switch-exhaustiveness-check': 'error', 26 '@typescript-eslint/switch-exhaustiveness-check': 'error',
27 // https://github.com/airbnb/javascript/pull/2501 27 // https://github.com/airbnb/javascript/pull/2501
28 'react/function-component-definition': ['error', { 28 'react/function-component-definition': ['error', {
29 namedComponents: 'function-expression',
30 namedComponents: 'function-declaration', 29 namedComponents: 'function-declaration',
31 }], 30 }],
32 }, 31 },
diff --git a/subprojects/language-web/.stylelintrc.js b/subprojects/frontend/.stylelintrc.js
index 7adf8f26..7adf8f26 100644
--- a/subprojects/language-web/.stylelintrc.js
+++ b/subprojects/frontend/.stylelintrc.js
diff --git a/subprojects/frontend/build.gradle b/subprojects/frontend/build.gradle
new file mode 100644
index 00000000..71444e89
--- /dev/null
+++ b/subprojects/frontend/build.gradle
@@ -0,0 +1,101 @@
1plugins {
2 id 'refinery-frontend-workspace'
3 id 'refinery-sonarqube'
4}
5
6import org.siouan.frontendgradleplugin.infrastructure.gradle.RunYarn
7
8def webpackOutputDir = "${buildDir}/webpack"
9def productionResources = file("${webpackOutputDir}/production")
10
11frontend {
12 assembleScript = 'assemble:webpack'
13}
14
15configurations {
16 productionAssets {
17 canBeConsumed = true
18 canBeResolved = false
19 }
20}
21
22def installFrontend = tasks.named('installFrontend')
23
24def generateLezerGrammar = tasks.register('generateLezerGrammar', RunYarn) {
25 dependsOn installFrontend
26 inputs.file 'src/language/problem.grammar'
27 inputs.file 'package.json'
28 inputs.file rootProject.file('yarn.lock')
29 outputs.file "${buildDir}/generated/sources/lezer/problem.ts"
30 outputs.file "${buildDir}/generated/sources/lezer/problem.terms.ts"
31 script = 'run assemble:lezer'
32}
33
34def assembleFrontend = tasks.named('assembleFrontend')
35assembleFrontend.configure {
36 dependsOn generateLezerGrammar
37 inputs.dir 'src'
38 inputs.file "${buildDir}/generated/sources/lezer/problem.ts"
39 inputs.file "${buildDir}/generated/sources/lezer/problem.terms.ts"
40 inputs.files('package.json', 'webpack.config.js')
41 inputs.file rootProject.file('yarn.lock')
42 outputs.dir productionResources
43}
44
45artifacts {
46 productionAssets(productionResources) {
47 builtBy assembleFrontend
48 }
49}
50
51def eslint = tasks.register('eslint', RunYarn) {
52 dependsOn installFrontend
53 inputs.dir 'src'
54 inputs.files('.eslintrc.js', 'tsconfig.json')
55 inputs.file rootProject.file('yarn.lock')
56 if (project.hasProperty('ci')) {
57 outputs.file "${buildDir}/eslint.json"
58 script = 'run check:eslint:ci'
59 } else {
60 script = 'run check:eslint'
61 }
62 group = 'verification'
63 description = 'Check for TypeScript errors.'
64}
65
66def stylelint = tasks.register('stylelint', RunYarn) {
67 dependsOn installFrontend
68 inputs.dir 'src'
69 inputs.file '.stylelintrc.js'
70 inputs.file rootProject.file('yarn.lock')
71 if (project.hasProperty('ci')) {
72 outputs.file "${buildDir}/stylelint.json"
73 script = 'run check:stylelint:ci'
74 } else {
75 script = 'run check:stylelint'
76 }
77 group = 'verification'
78 description = 'Check for Sass errors.'
79}
80
81tasks.named('check') {
82 dependsOn(eslint, stylelint)
83}
84
85tasks.register('webpackServe', RunYarn) {
86 dependsOn installFrontend
87 dependsOn generateLezerGrammar
88 outputs.dir "${webpackOutputDir}/development"
89 script = 'run serve'
90 group = 'run'
91 description = 'Start a Webpack dev server with hot module replacement.'
92}
93
94sonarqube.properties {
95 properties['sonar.sources'] += ['src']
96 property 'sonar.nodejs.executable', "${frontend.nodeInstallDirectory.get()}/bin/node"
97 property 'sonar.eslint.reportPaths', "${buildDir}/eslint.json"
98 property 'sonar.css.stylelint.reportPaths', "${buildDir}/stylelint.json"
99 // SonarJS does not pick up typescript files with `exactOptionalPropertyTypes`
100 property 'sonar.typescript.tsconfigPath', 'tsconfig.sonar.json'
101}
diff --git a/subprojects/language-web/package.json b/subprojects/frontend/package.json
index 5fa977d9..14795885 100644
--- a/subprojects/language-web/package.json
+++ b/subprojects/frontend/package.json
@@ -1,23 +1,23 @@
1{ 1{
2 "name": "@refinery/language-web", 2 "name": "@refinery/frontend",
3 "version": "0.0.0", 3 "version": "0.0.0",
4 "description": "Web frontend for VIATRA-Generator", 4 "description": "Web frontend for Refinery",
5 "main": "index.js", 5 "main": "index.js",
6 "scripts": { 6 "scripts": {
7 "assemble:lezer": "lezer-generator src/main/js/language/problem.grammar -o build/generated/sources/lezer/problem.ts", 7 "assemble:lezer": "lezer-generator src/language/problem.grammar -o build/generated/sources/lezer/problem.ts",
8 "assemble:webpack": "webpack --node-env production", 8 "assemble:webpack": "webpack --node-env production",
9 "serve": "webpack serve --node-env development --hot", 9 "serve": "webpack serve --node-env development --hot",
10 "check": "yarn run check:eslint && yarn run check:stylelint", 10 "check": "yarn run check:eslint && yarn run check:stylelint",
11 "check:eslint": "eslint .", 11 "check:eslint": "eslint .",
12 "check:eslint:ci": "eslint -f json -o build/eslint.json .", 12 "check:eslint:ci": "eslint -f json -o build/eslint.json .",
13 "check:stylelint": "stylelint src/main/css/**/*.scss", 13 "check:stylelint": "stylelint src/**/*.scss",
14 "check:stylelint:ci": "stylelint -f json src/main/css/**/*.scss > build/stylelint.json" 14 "check:stylelint:ci": "stylelint -f json src/**/*.scss > build/stylelint.json"
15 }, 15 },
16 "repository": { 16 "repository": {
17 "type": "git", 17 "type": "git",
18 "url": "git+https://github.com/graphs4value/refinery.git" 18 "url": "git+https://github.com/graphs4value/refinery.git"
19 }, 19 },
20 "author": "VIATRA-Generator authors", 20 "author": "Refinery authors",
21 "license": "EPL-2.0", 21 "license": "EPL-2.0",
22 "bugs": { 22 "bugs": {
23 "url": "https://github.com/graphs4value/issues" 23 "url": "https://github.com/graphs4value/issues"
@@ -47,9 +47,8 @@
47 "eslint-plugin-react-hooks": "^4.3.0", 47 "eslint-plugin-react-hooks": "^4.3.0",
48 "html-webpack-plugin": "^5.5.0", 48 "html-webpack-plugin": "^5.5.0",
49 "image-webpack-loader": "^8.0.1", 49 "image-webpack-loader": "^8.0.1",
50 "magic-comments-loader": "^1.4.1",
51 "mini-css-extract-plugin": "^2.4.5", 50 "mini-css-extract-plugin": "^2.4.5",
52 "postcss": "^8.4.4", 51 "postcss": "^8.4.5",
53 "postcss-scss": "^4.0.2", 52 "postcss-scss": "^4.0.2",
54 "sass": "^1.45.0", 53 "sass": "^1.45.0",
55 "sass-loader": "^12.4.0", 54 "sass-loader": "^12.4.0",
@@ -81,7 +80,7 @@
81 "@codemirror/search": "^0.19.4", 80 "@codemirror/search": "^0.19.4",
82 "@codemirror/state": "^0.19.6", 81 "@codemirror/state": "^0.19.6",
83 "@codemirror/view": "^0.19.29", 82 "@codemirror/view": "^0.19.29",
84 "@emotion/react": "^11.7.0", 83 "@emotion/react": "^11.7.1",
85 "@emotion/styled": "^11.6.0", 84 "@emotion/styled": "^11.6.0",
86 "@fontsource/jetbrains-mono": "^4.5.0", 85 "@fontsource/jetbrains-mono": "^4.5.0",
87 "@fontsource/roboto": "^4.5.1", 86 "@fontsource/roboto": "^4.5.1",
diff --git a/subprojects/language-web/src/main/js/App.tsx b/subprojects/frontend/src/App.tsx
index 54f92f9a..54f92f9a 100644
--- a/subprojects/language-web/src/main/js/App.tsx
+++ b/subprojects/frontend/src/App.tsx
diff --git a/subprojects/language-web/src/main/js/RootStore.tsx b/subprojects/frontend/src/RootStore.tsx
index baf0b61e..baf0b61e 100644
--- a/subprojects/language-web/src/main/js/RootStore.tsx
+++ b/subprojects/frontend/src/RootStore.tsx
diff --git a/subprojects/language-web/src/main/js/editor/EditorArea.tsx b/subprojects/frontend/src/editor/EditorArea.tsx
index dba20f6e..dba20f6e 100644
--- a/subprojects/language-web/src/main/js/editor/EditorArea.tsx
+++ b/subprojects/frontend/src/editor/EditorArea.tsx
diff --git a/subprojects/language-web/src/main/js/editor/EditorButtons.tsx b/subprojects/frontend/src/editor/EditorButtons.tsx
index 150aa00d..150aa00d 100644
--- a/subprojects/language-web/src/main/js/editor/EditorButtons.tsx
+++ b/subprojects/frontend/src/editor/EditorButtons.tsx
diff --git a/subprojects/language-web/src/main/js/editor/EditorParent.ts b/subprojects/frontend/src/editor/EditorParent.ts
index 94ca24ea..94ca24ea 100644
--- a/subprojects/language-web/src/main/js/editor/EditorParent.ts
+++ b/subprojects/frontend/src/editor/EditorParent.ts
diff --git a/subprojects/language-web/src/main/js/editor/EditorStore.ts b/subprojects/frontend/src/editor/EditorStore.ts
index 5760de28..5760de28 100644
--- a/subprojects/language-web/src/main/js/editor/EditorStore.ts
+++ b/subprojects/frontend/src/editor/EditorStore.ts
diff --git a/subprojects/language-web/src/main/js/editor/GenerateButton.tsx b/subprojects/frontend/src/editor/GenerateButton.tsx
index 3834cec4..3834cec4 100644
--- a/subprojects/language-web/src/main/js/editor/GenerateButton.tsx
+++ b/subprojects/frontend/src/editor/GenerateButton.tsx
diff --git a/subprojects/language-web/src/main/js/editor/decorationSetExtension.ts b/subprojects/frontend/src/editor/decorationSetExtension.ts
index 2d630c20..2d630c20 100644
--- a/subprojects/language-web/src/main/js/editor/decorationSetExtension.ts
+++ b/subprojects/frontend/src/editor/decorationSetExtension.ts
diff --git a/subprojects/language-web/src/main/js/editor/findOccurrences.ts b/subprojects/frontend/src/editor/findOccurrences.ts
index 92102746..92102746 100644
--- a/subprojects/language-web/src/main/js/editor/findOccurrences.ts
+++ b/subprojects/frontend/src/editor/findOccurrences.ts
diff --git a/subprojects/language-web/src/main/js/editor/semanticHighlighting.ts b/subprojects/frontend/src/editor/semanticHighlighting.ts
index 2aed421b..2aed421b 100644
--- a/subprojects/language-web/src/main/js/editor/semanticHighlighting.ts
+++ b/subprojects/frontend/src/editor/semanticHighlighting.ts
diff --git a/subprojects/language-web/src/main/js/global.d.ts b/subprojects/frontend/src/global.d.ts
index 0533a46e..0533a46e 100644
--- a/subprojects/language-web/src/main/js/global.d.ts
+++ b/subprojects/frontend/src/global.d.ts
diff --git a/subprojects/language-web/src/main/html/index.html b/subprojects/frontend/src/index.html
index f404aa8a..f404aa8a 100644
--- a/subprojects/language-web/src/main/html/index.html
+++ b/subprojects/frontend/src/index.html
diff --git a/subprojects/language-web/src/main/css/index.scss b/subprojects/frontend/src/index.scss
index ad876aaf..ad876aaf 100644
--- a/subprojects/language-web/src/main/css/index.scss
+++ b/subprojects/frontend/src/index.scss
diff --git a/subprojects/language-web/src/main/js/index.tsx b/subprojects/frontend/src/index.tsx
index d368c9ba..15b26adb 100644
--- a/subprojects/language-web/src/main/js/index.tsx
+++ b/subprojects/frontend/src/index.tsx
@@ -6,7 +6,7 @@ import { App } from './App';
6import { RootStore, RootStoreProvider } from './RootStore'; 6import { RootStore, RootStoreProvider } from './RootStore';
7import { ThemeProvider } from './theme/ThemeProvider'; 7import { ThemeProvider } from './theme/ThemeProvider';
8 8
9import '../css/index.scss'; 9import './index.scss';
10 10
11const initialValue = `class Family { 11const initialValue = `class Family {
12 contains Person[] members 12 contains Person[] members
diff --git a/subprojects/language-web/src/main/js/language/folding.ts b/subprojects/frontend/src/language/folding.ts
index 5d51f796..5d51f796 100644
--- a/subprojects/language-web/src/main/js/language/folding.ts
+++ b/subprojects/frontend/src/language/folding.ts
diff --git a/subprojects/language-web/src/main/js/language/indentation.ts b/subprojects/frontend/src/language/indentation.ts
index 6d36ed3b..6d36ed3b 100644
--- a/subprojects/language-web/src/main/js/language/indentation.ts
+++ b/subprojects/frontend/src/language/indentation.ts
diff --git a/subprojects/language-web/src/main/js/language/problem.grammar b/subprojects/frontend/src/language/problem.grammar
index bccc2e31..1ace2872 100644
--- a/subprojects/language-web/src/main/js/language/problem.grammar
+++ b/subprojects/frontend/src/language/problem.grammar
@@ -1,6 +1,6 @@
1@detectDelim 1@detectDelim
2 2
3@external prop implicitCompletion from '../../../../src/main/js/language/props.ts' 3@external prop implicitCompletion from '../../../../src/language/props.ts'
4 4
5@top Problem { statement* } 5@top Problem { statement* }
6 6
diff --git a/subprojects/language-web/src/main/js/language/problemLanguageSupport.ts b/subprojects/frontend/src/language/problemLanguageSupport.ts
index 6508a2c0..b858ba91 100644
--- a/subprojects/language-web/src/main/js/language/problemLanguageSupport.ts
+++ b/subprojects/frontend/src/language/problemLanguageSupport.ts
@@ -9,7 +9,7 @@ import {
9} from '@codemirror/language'; 9} from '@codemirror/language';
10import { LRParser } from '@lezer/lr'; 10import { LRParser } from '@lezer/lr';
11 11
12import { parser } from '../../../../build/generated/sources/lezer/problem'; 12import { parser } from '../../build/generated/sources/lezer/problem';
13import { 13import {
14 foldBlockComment, 14 foldBlockComment,
15 foldConjunction, 15 foldConjunction,
diff --git a/subprojects/language-web/src/main/js/language/props.ts b/subprojects/frontend/src/language/props.ts
index 8e488bf5..8e488bf5 100644
--- a/subprojects/language-web/src/main/js/language/props.ts
+++ b/subprojects/frontend/src/language/props.ts
diff --git a/subprojects/language-web/src/main/js/theme/EditorTheme.ts b/subprojects/frontend/src/theme/EditorTheme.ts
index 1b0dd5de..294192fa 100644
--- a/subprojects/language-web/src/main/js/theme/EditorTheme.ts
+++ b/subprojects/frontend/src/theme/EditorTheme.ts
@@ -1,6 +1,6 @@
1import type { PaletteMode } from '@mui/material'; 1import type { PaletteMode } from '@mui/material';
2 2
3import cssVariables from '../../css/themeVariables.module.scss'; 3import cssVariables from '../themeVariables.module.scss';
4 4
5export enum EditorTheme { 5export enum EditorTheme {
6 Light, 6 Light,
diff --git a/subprojects/language-web/src/main/js/theme/ThemeProvider.tsx b/subprojects/frontend/src/theme/ThemeProvider.tsx
index f5b50be1..f5b50be1 100644
--- a/subprojects/language-web/src/main/js/theme/ThemeProvider.tsx
+++ b/subprojects/frontend/src/theme/ThemeProvider.tsx
diff --git a/subprojects/language-web/src/main/js/theme/ThemeStore.ts b/subprojects/frontend/src/theme/ThemeStore.ts
index ffaf6dde..ffaf6dde 100644
--- a/subprojects/language-web/src/main/js/theme/ThemeStore.ts
+++ b/subprojects/frontend/src/theme/ThemeStore.ts
diff --git a/subprojects/language-web/src/main/css/themeVariables.module.scss b/subprojects/frontend/src/themeVariables.module.scss
index 85af4219..85af4219 100644
--- a/subprojects/language-web/src/main/css/themeVariables.module.scss
+++ b/subprojects/frontend/src/themeVariables.module.scss
diff --git a/subprojects/language-web/src/main/css/themes.scss b/subprojects/frontend/src/themes.scss
index a30f1de3..a30f1de3 100644
--- a/subprojects/language-web/src/main/css/themes.scss
+++ b/subprojects/frontend/src/themes.scss
diff --git a/subprojects/language-web/src/main/js/utils/ConditionVariable.ts b/subprojects/frontend/src/utils/ConditionVariable.ts
index 0910dfa6..0910dfa6 100644
--- a/subprojects/language-web/src/main/js/utils/ConditionVariable.ts
+++ b/subprojects/frontend/src/utils/ConditionVariable.ts
diff --git a/subprojects/language-web/src/main/js/utils/PendingTask.ts b/subprojects/frontend/src/utils/PendingTask.ts
index 51b79fb0..51b79fb0 100644
--- a/subprojects/language-web/src/main/js/utils/PendingTask.ts
+++ b/subprojects/frontend/src/utils/PendingTask.ts
diff --git a/subprojects/language-web/src/main/js/utils/Timer.ts b/subprojects/frontend/src/utils/Timer.ts
index 8f653070..8f653070 100644
--- a/subprojects/language-web/src/main/js/utils/Timer.ts
+++ b/subprojects/frontend/src/utils/Timer.ts
diff --git a/subprojects/language-web/src/main/js/utils/logger.ts b/subprojects/frontend/src/utils/logger.ts
index 306d122c..306d122c 100644
--- a/subprojects/language-web/src/main/js/utils/logger.ts
+++ b/subprojects/frontend/src/utils/logger.ts
diff --git a/subprojects/language-web/src/main/js/xtext/ContentAssistService.ts b/subprojects/frontend/src/xtext/ContentAssistService.ts
index 8b872e06..8b872e06 100644
--- a/subprojects/language-web/src/main/js/xtext/ContentAssistService.ts
+++ b/subprojects/frontend/src/xtext/ContentAssistService.ts
diff --git a/subprojects/language-web/src/main/js/xtext/HighlightingService.ts b/subprojects/frontend/src/xtext/HighlightingService.ts
index dfbb4a19..dfbb4a19 100644
--- a/subprojects/language-web/src/main/js/xtext/HighlightingService.ts
+++ b/subprojects/frontend/src/xtext/HighlightingService.ts
diff --git a/subprojects/language-web/src/main/js/xtext/OccurrencesService.ts b/subprojects/frontend/src/xtext/OccurrencesService.ts
index bc865537..bc865537 100644
--- a/subprojects/language-web/src/main/js/xtext/OccurrencesService.ts
+++ b/subprojects/frontend/src/xtext/OccurrencesService.ts
diff --git a/subprojects/language-web/src/main/js/xtext/UpdateService.ts b/subprojects/frontend/src/xtext/UpdateService.ts
index e78944a9..e78944a9 100644
--- a/subprojects/language-web/src/main/js/xtext/UpdateService.ts
+++ b/subprojects/frontend/src/xtext/UpdateService.ts
diff --git a/subprojects/language-web/src/main/js/xtext/ValidationService.ts b/subprojects/frontend/src/xtext/ValidationService.ts
index ff7d3700..ff7d3700 100644
--- a/subprojects/language-web/src/main/js/xtext/ValidationService.ts
+++ b/subprojects/frontend/src/xtext/ValidationService.ts
diff --git a/subprojects/language-web/src/main/js/xtext/XtextClient.ts b/subprojects/frontend/src/xtext/XtextClient.ts
index 0898e725..0898e725 100644
--- a/subprojects/language-web/src/main/js/xtext/XtextClient.ts
+++ b/subprojects/frontend/src/xtext/XtextClient.ts
diff --git a/subprojects/language-web/src/main/js/xtext/XtextWebSocketClient.ts b/subprojects/frontend/src/xtext/XtextWebSocketClient.ts
index 2ce20a54..2ce20a54 100644
--- a/subprojects/language-web/src/main/js/xtext/XtextWebSocketClient.ts
+++ b/subprojects/frontend/src/xtext/XtextWebSocketClient.ts
diff --git a/subprojects/language-web/src/main/js/xtext/xtextMessages.ts b/subprojects/frontend/src/xtext/xtextMessages.ts
index c4305fcf..c4305fcf 100644
--- a/subprojects/language-web/src/main/js/xtext/xtextMessages.ts
+++ b/subprojects/frontend/src/xtext/xtextMessages.ts
diff --git a/subprojects/language-web/src/main/js/xtext/xtextServiceResults.ts b/subprojects/frontend/src/xtext/xtextServiceResults.ts
index f79b059c..f79b059c 100644
--- a/subprojects/language-web/src/main/js/xtext/xtextServiceResults.ts
+++ b/subprojects/frontend/src/xtext/xtextServiceResults.ts
diff --git a/subprojects/language-web/tsconfig.json b/subprojects/frontend/tsconfig.json
index cb5f6b13..94c357c5 100644
--- a/subprojects/language-web/tsconfig.json
+++ b/subprojects/frontend/tsconfig.json
@@ -13,6 +13,6 @@
13 "noEmit": true, 13 "noEmit": true,
14 "skipLibCheck": true 14 "skipLibCheck": true
15 }, 15 },
16 "include": ["./src/main/js/**/*"], 16 "include": ["./src/**/*"],
17 "exclude": ["./build/generated/sources/lezer/*"] 17 "exclude": ["./build/generated/sources/lezer/*"]
18} 18}
diff --git a/subprojects/language-web/tsconfig.sonar.json b/subprojects/frontend/tsconfig.sonar.json
index 54eef68b..9db12b91 100644
--- a/subprojects/language-web/tsconfig.sonar.json
+++ b/subprojects/frontend/tsconfig.sonar.json
@@ -12,6 +12,5 @@
12 "noEmit": true, 12 "noEmit": true,
13 "skipLibCheck": true 13 "skipLibCheck": true
14 }, 14 },
15 "include": ["./src/main/js/**/*"], 15 "include": ["./src/**/*"]
16 "exclude": ["./src/main/js/xtext/**/*"]
17} 16}
diff --git a/subprojects/language-web/webpack.config.js b/subprojects/frontend/webpack.config.js
index 801a705c..bacb7e4a 100644
--- a/subprojects/language-web/webpack.config.js
+++ b/subprojects/frontend/webpack.config.js
@@ -13,10 +13,11 @@ const currentNodeEnv = process.env.NODE_ENV || 'development';
13const devMode = currentNodeEnv !== 'production'; 13const devMode = currentNodeEnv !== 'production';
14const outputPath = path.resolve(__dirname, 'build/webpack', currentNodeEnv); 14const outputPath = path.resolve(__dirname, 'build/webpack', currentNodeEnv);
15 15
16const portNumberOrElse = (envName, fallback) => { 16function portNumberOrElse (envName, fallback) {
17 const value = process.env[envName]; 17 const value = process.env[envName];
18 return value ? parseInt(value) : fallback; 18 return value ? parseInt(value) : fallback;
19}; 19}
20
20const listenHost = process.env['LISTEN_HOST'] || 'localhost'; 21const listenHost = process.env['LISTEN_HOST'] || 'localhost';
21const listenPort = portNumberOrElse('LISTEN_PORT', 1313); 22const listenPort = portNumberOrElse('LISTEN_PORT', 1313);
22const apiHost = process.env['API_HOST'] || listenHost; 23const apiHost = process.env['API_HOST'] || listenHost;
@@ -24,78 +25,34 @@ const apiPort = portNumberOrElse('API_PORT', 1312);
24const publicHost = process.env['PUBLIC_HOST'] || listenHost; 25const publicHost = process.env['PUBLIC_HOST'] || listenHost;
25const publicPort = portNumberOrElse('PUBLIC_PORT', listenPort); 26const publicPort = portNumberOrElse('PUBLIC_PORT', listenPort);
26 27
27const resolveSources = sources => path.resolve(__dirname, 'src', sources);
28const mainJsSources = resolveSources('main/js');
29const babelLoaderFilters = {
30 include: [mainJsSources],
31};
32const babelPresets = [
33 [
34 '@babel/preset-env',
35 {
36 targets: 'defaults',
37 },
38 ],
39 '@babel/preset-react',
40];
41const babelPlugins = [
42 '@babel/plugin-transform-runtime',
43]
44const magicCommentsLoader = {
45 loader: 'magic-comments-loader',
46 options: {
47 webpackChunkName: true,
48 }
49};
50
51module.exports = { 28module.exports = {
52 mode: devMode ? 'development' : 'production', 29 mode: devMode ? 'development' : 'production',
53 entry: './src/main/js', 30 entry: './src/index',
54 output: { 31 output: {
55 path: outputPath, 32 path: outputPath,
56 publicPath: '/', 33 publicPath: '/',
57 filename: devMode ? '[name].js' : '[name].[contenthash].js', 34 filename: devMode ? '[name].js' : '[name].[contenthash].js',
58 chunkFilename: devMode ? '[name].js' : '[name].[contenthash].js', 35 assetModuleFilename: devMode ? '[name][ext]' : '[name].[contenthash][ext]',
59 assetModuleFilename: devMode ? '[name].js' : '[name].[contenthash][ext]',
60 clean: true, 36 clean: true,
61 crossOriginLoading: 'anonymous', 37 crossOriginLoading: 'anonymous',
62 }, 38 },
63 module: { 39 module: {
64 rules: [ 40 rules: [
65 { 41 {
66 test: /\.jsx?$/i, 42 test: /.[jt]sx?$/i,
67 ...babelLoaderFilters, 43 include: [path.resolve(__dirname, 'src')],
68 use: [ 44 use: [
69 { 45 {
70 loader: 'babel-loader', 46 loader: 'babel-loader',
71 options: { 47 options: {
72 presets: babelPresets, 48 presets: [
73 plugins: [
74 [ 49 [
75 '@babel/plugin-proposal-class-properties', 50 '@babel/preset-env',
76 { 51 {
77 loose: false, 52 targets: 'defaults',
78 }, 53 },
79 ...babelPlugins,
80 ], 54 ],
81 ], 55 '@babel/preset-react',
82 assumptions: {
83 'setPublicClassFields': false,
84 },
85 },
86 },
87 magicCommentsLoader,
88 ],
89 },
90 {
91 test: /.tsx?$/i,
92 ...babelLoaderFilters,
93 use: [
94 {
95 loader: 'babel-loader',
96 options: {
97 presets: [
98 ...babelPresets,
99 [ 56 [
100 '@babel/preset-typescript', 57 '@babel/preset-typescript',
101 { 58 {
@@ -107,10 +64,11 @@ module.exports = {
107 }, 64 },
108 ] 65 ]
109 ], 66 ],
110 plugins: babelPlugins, 67 plugins: [
68 '@babel/plugin-transform-runtime',
69 ],
111 }, 70 },
112 }, 71 },
113 magicCommentsLoader,
114 ], 72 ],
115 }, 73 },
116 { 74 {
@@ -145,11 +103,7 @@ module.exports = {
145 ], 103 ],
146 }, 104 },
147 resolve: { 105 resolve: {
148 modules: [ 106 extensions: ['.ts', '.tsx', '.js', '.jsx'],
149 'node_modules',
150 mainJsSources,
151 ],
152 extensions: ['.js', '.jsx', '.ts', '.tsx'],
153 }, 107 },
154 devtool: devMode ? 'inline-source-map' : 'source-map', 108 devtool: devMode ? 'inline-source-map' : 'source-map',
155 optimization: { 109 optimization: {
@@ -157,19 +111,6 @@ module.exports = {
157 sideEffects: devMode ? 'flag' : true, 111 sideEffects: devMode ? 'flag' : true,
158 splitChunks: { 112 splitChunks: {
159 chunks: 'all', 113 chunks: 'all',
160 cacheGroups: {
161 defaultVendors: {
162 test: /[\\/]node_modules[\\/]/,
163 priority: -10,
164 reuseExistingChunk: true,
165 filename: devMode ? 'vendor.[id].js' : 'vendor.[contenthash].js',
166 },
167 default: {
168 minChunks: 2,
169 priority: -20,
170 reuseExistingChunk: true,
171 },
172 },
173 }, 114 },
174 }, 115 },
175 devServer: { 116 devServer: {
@@ -205,16 +146,7 @@ module.exports = {
205 }), 146 }),
206 new SubresourceIntegrityPlugin(), 147 new SubresourceIntegrityPlugin(),
207 new HtmlWebpackPlugin({ 148 new HtmlWebpackPlugin({
208 template: 'src/main/html/index.html', 149 template: 'src/index.html',
209 minify: devMode ? false : {
210 collapseWhitespace: true,
211 removeComments: true,
212 removeOptionalTags: true,
213 removeRedundantAttributes: true,
214 removeScriptTypeAttributes: true,
215 removeStyleLinkTypeAttributes: true,
216 useShortDoctype: true,
217 },
218 }), 150 }),
219 new HtmlWebpackInjectPreload({ 151 new HtmlWebpackInjectPreload({
220 files: [ 152 files: [
diff --git a/subprojects/language-web/.editorconfig b/subprojects/language-web/.editorconfig
deleted file mode 100644
index 1b78e967..00000000
--- a/subprojects/language-web/.editorconfig
+++ /dev/null
@@ -1,5 +0,0 @@
1[src/main/css/xtext/**.css]
2indent_style = tab
3
4[src/main/js/xtext/**.js]
5indent_style = tab
diff --git a/subprojects/language-web/build.gradle b/subprojects/language-web/build.gradle
index a549288a..6be4d5e8 100644
--- a/subprojects/language-web/build.gradle
+++ b/subprojects/language-web/build.gradle
@@ -1,10 +1,14 @@
1plugins { 1plugins {
2 id 'refinery-frontend-workspace'
3 id 'refinery-java-application' 2 id 'refinery-java-application'
4 id 'refinery-xtext-conventions' 3 id 'refinery-xtext-conventions'
5} 4}
6 5
7import org.siouan.frontendgradleplugin.infrastructure.gradle.RunYarn 6configurations {
7 webapp {
8 canBeConsumed = false
9 canBeResolved = true
10 }
11}
8 12
9dependencies { 13dependencies {
10 implementation project(':refinery-language') 14 implementation project(':refinery-language')
@@ -16,6 +20,7 @@ dependencies {
16 implementation libs.jetty.websocket.server 20 implementation libs.jetty.websocket.server
17 implementation libs.slf4j.simple 21 implementation libs.slf4j.simple
18 implementation libs.slf4j.log4j 22 implementation libs.slf4j.log4j
23 webapp project(path: ':refinery-frontend', configuration: 'productionAssets')
19 testImplementation testFixtures(project(':refinery-language')) 24 testImplementation testFixtures(project(':refinery-language'))
20 testImplementation libs.jetty.websocket.client 25 testImplementation libs.jetty.websocket.client
21} 26}
@@ -28,120 +33,36 @@ for (taskName in ['compileJava', 'processResources']) {
28 } 33 }
29} 34}
30 35
31def webpackOutputDir = "${buildDir}/webpack" 36mainClassName = 'tools.refinery.language.web.ServerLauncher'
32def productionResources = "${webpackOutputDir}/production"
33def serverMainClass = 'tools.refinery.language.web.ServerLauncher'
34
35frontend {
36 assembleScript = 'assemble:webpack'
37}
38
39def installFrontend = tasks.named('installFrontend')
40
41def generateLezerGrammar = tasks.register('generateLezerGrammar', RunYarn) {
42 dependsOn installFrontend
43 inputs.file('src/main/js/language/problem.grammar')
44 inputs.files('package.json', 'yarn.lock')
45 outputs.file "${buildDir}/generated/sources/lezer/problem.ts"
46 outputs.file "${buildDir}/generated/sources/lezer/problem.terms.ts"
47 script = 'run assemble:lezer'
48}
49
50def assembleFrontend = tasks.named('assembleFrontend')
51assembleFrontend.configure {
52 dependsOn generateLezerGrammar
53 inputs.dir 'src/main/css'
54 inputs.dir 'src/main/html'
55 inputs.dir 'src/main/js'
56 inputs.file "${buildDir}/generated/sources/lezer/problem.ts"
57 inputs.file "${buildDir}/generated/sources/lezer/problem.terms.ts"
58 inputs.files('package.json', 'yarn.lock', 'webpack.config.js')
59 outputs.dir productionResources
60}
61
62def eslint = tasks.register('eslint', RunYarn) {
63 dependsOn installFrontend
64 inputs.dir 'src/main/js'
65 inputs.files('.eslintrc.js', 'tsconfig.json')
66 if (project.hasProperty('ci')) {
67 outputs.file "${buildDir}/eslint.json"
68 script = 'run check:eslint:ci'
69 } else {
70 script = 'run check:eslint'
71 }
72 group = 'verification'
73 description = 'Check for TypeScript errors.'
74}
75
76def stylelint = tasks.register('stylelint', RunYarn) {
77 dependsOn installFrontend
78 inputs.dir 'src/main/css'
79 inputs.file '.stylelintrc.js'
80 if (project.hasProperty('ci')) {
81 outputs.file "${buildDir}/stylelint.json"
82 script = 'run check:stylelint:ci'
83 } else {
84 script = 'run check:stylelint'
85 }
86 group = 'verification'
87 description = 'Check for Sass errors.'
88}
89
90tasks.named('check') {
91 dependsOn(eslint, stylelint)
92}
93
94mainClassName = serverMainClass
95 37
96tasks.named('jar') { 38tasks.named('jar') {
97 dependsOn assembleFrontend 39 dependsOn project.configurations.webapp
98 from(productionResources) { 40 from(project.configurations.webapp) {
99 into 'webapp' 41 into 'webapp'
100 } 42 }
101} 43}
102 44
103tasks.named('shadowJar') { 45tasks.named('shadowJar') {
104 dependsOn assembleFrontend 46 dependsOn project.configurations.webapp
105 from(project.convention.getPlugin(JavaPluginConvention).sourceSets.main.output) 47 from(project.sourceSets.main.output)
106 configurations = [project.configurations.runtimeClasspath] 48 configurations = [project.configurations.runtimeClasspath]
107 exclude('META-INF/INDEX.LIST', 'META-INF/*.SF', 'META-INF/*.DSA', 'META-INF/*.RSA','schema/*', 49 exclude('META-INF/INDEX.LIST', 'META-INF/*.SF', 'META-INF/*.DSA', 'META-INF/*.RSA','schema/*',
108 '.options', '.api_description', '*.profile', 'about.*', 'about_*.html', 'about_files/*', 50 '.options', '.api_description', '*.profile', 'about.*', 'about_*.html', 'about_files/*',
109 'plugin.xml', 'systembundle.properties', 'profile.list', 'META-INF/resources/xtext/**') 51 'plugin.xml', 'systembundle.properties', 'profile.list', 'META-INF/resources/xtext/**')
110 append('plugin.properties') 52 append('plugin.properties')
111 from(productionResources) { 53 from(project.configurations.webapp) {
112 into 'webapp' 54 into 'webapp'
113 } 55 }
114} 56}
115 57
116def jettyRun = tasks.register('jettyRun', JavaExec) { 58def jettyRun = tasks.register('jettyRun', JavaExec) {
117 dependsOn assembleFrontend 59 dependsOn project.configurations.webapp
118 dependsOn sourceSets.main.runtimeClasspath 60 dependsOn sourceSets.main.runtimeClasspath
119 classpath = sourceSets.main.runtimeClasspath.filter{it.exists()} 61 classpath = sourceSets.main.runtimeClasspath
120 mainClass = serverMainClass 62 mainClass = mainClassName
121 standardInput = System.in 63 standardInput = System.in
122 environment BASE_RESOURCE: productionResources 64 def baseResource = project.configurations.webapp.incoming.artifacts.artifactFiles.first()
65 environment BASE_RESOURCE: baseResource
123 group = 'run' 66 group = 'run'
124 description = 'Start a Jetty web server serving the Xtex API and assets.' 67 description = 'Start a Jetty web server serving the Xtex API and assets.'
125} 68}
126
127tasks.register('webpackServe', RunYarn) {
128 dependsOn installFrontend
129 dependsOn generateLezerGrammar
130 outputs.dir "${webpackOutputDir}/development"
131 script = 'run serve'
132 group = 'run'
133 description = 'Start a Webpack dev server with hot module replacement.'
134}
135
136sonarqube.properties {
137 properties['sonar.sources'] += [
138 'src/main/css',
139 'src/main/html',
140 'src/main/js',
141 ]
142 property 'sonar.nodejs.executable', "${frontend.nodeInstallDirectory.get()}/bin/node"
143 property 'sonar.eslint.reportPaths', "${buildDir}/eslint.json"
144 property 'sonar.css.stylelint.reportPaths', "${buildDir}/stylelint.json"
145 // SonarJS does not pick up typescript files with `exactOptionalPropertyTypes`
146 property 'sonar.typescript.tsconfigPath', 'tsconfig.sonar.json'
147}