Merge branch '145-build-system-rewrite'
This commit is contained in:
commit
ce35c8efc9
65
.azure-pipelines/templates/jobs/release.yaml
Normal file
65
.azure-pipelines/templates/jobs/release.yaml
Normal file
@ -0,0 +1,65 @@
|
|||||||
|
# SPDX-FileCopyrightText: 2025 Sarah Vaupel <sarah.vaupel@uniworx.de>
|
||||||
|
#
|
||||||
|
# SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
|
|
||||||
|
parameters:
|
||||||
|
- name: releaseTag
|
||||||
|
type: string
|
||||||
|
- name: releaseEndpoint
|
||||||
|
type: string
|
||||||
|
default: 'devfra'
|
||||||
|
values:
|
||||||
|
- 'devfra'
|
||||||
|
- 'prodfra'
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
- job: Release
|
||||||
|
displayName: Release ${{ parameters.releaseTag }}
|
||||||
|
container:
|
||||||
|
image: devfra.azurecr.io/de.fraport.build/tools:1.1.0
|
||||||
|
endpoint: devfra
|
||||||
|
steps:
|
||||||
|
|
||||||
|
# Download required artifacts from pipeline
|
||||||
|
- task: DownloadPipelineArtifact@2
|
||||||
|
displayName: Download FraDrive binaries
|
||||||
|
inputs:
|
||||||
|
artifactName: Build_backend
|
||||||
|
patterns: 'Build_backend/bin/*'
|
||||||
|
targetPath: '$(Build.Repository.LocalPath)'
|
||||||
|
|
||||||
|
- task: Docker@2
|
||||||
|
displayName: Login to container registry
|
||||||
|
inputs:
|
||||||
|
command: login
|
||||||
|
containerRegistry: '${{ parameters.releaseEndpoint }}'
|
||||||
|
- task: Bash@3
|
||||||
|
displayName: Build FraDrive container
|
||||||
|
inputs:
|
||||||
|
targetType: inline
|
||||||
|
script: |
|
||||||
|
cp docker/fradrive/Dockerfile .
|
||||||
|
docker build \
|
||||||
|
--tag $(buildImageUpstream)/fradrive:$(Build.BuildNumber) \
|
||||||
|
--tag $(buildImageUpstream)/fradrive:${{parameters.releaseTag}} \
|
||||||
|
--build-arg FROM_IMG=devfra.azurecr.io/de.fraport.trusted/ubuntu \
|
||||||
|
--build-arg FROM_TAG=20.04 \
|
||||||
|
--build-arg PROJECT_DIR=$(Build.Repository.LocalPath) \
|
||||||
|
--build-arg IN_CI=true \
|
||||||
|
--build-arg IN_CONTAINER=true \
|
||||||
|
--build-arg HTTPS_PROXY=http://proxy.frankfurt-airport.de:8080 \
|
||||||
|
--build-arg HTTP_PROXY=http://proxy.frankfurt-airport.de:8080 \
|
||||||
|
--build-arg NO_PROXY='localhost,127.0.0.1,*.docker.internal,*.azmk8s.io,devfra.azurecr.io,devfra.westeurope.data.azurecr.io' \
|
||||||
|
--build-arg FRAPORT_NOPROXY=dev.azure.com,*.dev.azure.com,*.fraport.de,*.frankfurt-airport.de \
|
||||||
|
.
|
||||||
|
- task: Docker@2
|
||||||
|
displayName: Push container to registry
|
||||||
|
inputs:
|
||||||
|
command: push
|
||||||
|
repository: 'de.fraport.fradrive.build/fradrive'
|
||||||
|
tags: '$(Build.BuildNumber),${{parameters.releaseTag}}'
|
||||||
|
- task: Docker@2
|
||||||
|
displayName: Logout from container registry
|
||||||
|
inputs:
|
||||||
|
command: logout
|
||||||
|
containerRegistry: '${{ parameters.releaseEndpoint }}'
|
||||||
61
.azure-pipelines/templates/jobs/setup_dependencies.yaml
Normal file
61
.azure-pipelines/templates/jobs/setup_dependencies.yaml
Normal file
@ -0,0 +1,61 @@
|
|||||||
|
# SPDX-FileCopyrightText: 2024-2025 Sarah Vaupel <sarah.vaupel@uniworx.de>
|
||||||
|
#
|
||||||
|
# SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
|
|
||||||
|
parameters:
|
||||||
|
- name: serviceName
|
||||||
|
type: string
|
||||||
|
- name: dependenciesCaches
|
||||||
|
type: object
|
||||||
|
default: []
|
||||||
|
- name: dependenciesBuildPool
|
||||||
|
type: string
|
||||||
|
default: 'Prod Private Agent Pool'
|
||||||
|
values:
|
||||||
|
- 'Prod Private Agent Pool'
|
||||||
|
- 'Prod Private Agent Pool DS2'
|
||||||
|
- 'Prod Private Agent Pool DS3'
|
||||||
|
- name: dependenciesBuildCores
|
||||||
|
type: number
|
||||||
|
default: 1
|
||||||
|
- name: dependenciesBuildTimeout
|
||||||
|
type: number
|
||||||
|
default: 60
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
- job: SetupDependencies_${{parameters.serviceName}}
|
||||||
|
displayName: Install ${{parameters.serviceName}} dependencies
|
||||||
|
dependsOn: SetupImage_${{parameters.serviceName}}
|
||||||
|
${{ if eq(variables.setupImages, true) }}:
|
||||||
|
condition: succeeded()
|
||||||
|
${{ else }}:
|
||||||
|
condition: always()
|
||||||
|
pool: '${{parameters.dependenciesBuildPool}}'
|
||||||
|
timeoutInMinutes: ${{parameters.dependenciesBuildTimeout}}
|
||||||
|
container:
|
||||||
|
${{ if variables.setupImages }}:
|
||||||
|
image: $(buildImageUpstream)/${{parameters.serviceName}}:$(Build.BuildNumber)
|
||||||
|
${{ else }}:
|
||||||
|
image: $(buildImageUpstream)/${{parameters.serviceName}}:latest
|
||||||
|
endpoint: devfra
|
||||||
|
env:
|
||||||
|
PROJECT_DIR: $(Build.Repository.LocalPath)
|
||||||
|
IN_CONTAINER: true
|
||||||
|
IN_CI: true
|
||||||
|
steps:
|
||||||
|
# Restore previously-built dependencies from caches
|
||||||
|
- ${{ each cache in parameters.dependenciesCaches }}:
|
||||||
|
- template: ./../../steps/cache.yaml
|
||||||
|
parameters:
|
||||||
|
cacheIdent: '${{parameters.serviceName}}-dependencies'
|
||||||
|
cacheKeys: '${{cache.key}}'
|
||||||
|
cachePath: '${{cache.path}}'
|
||||||
|
|
||||||
|
# Compile dependencies
|
||||||
|
- template: ./../../steps/make.yaml
|
||||||
|
parameters:
|
||||||
|
makeJob: dependencies
|
||||||
|
makeService: ${{parameters.serviceName}}
|
||||||
|
makeVars: 'CPU_CORES=${{parameters.dependenciesBuildCores}} STACK_CORES=-j${{parameters.dependenciesBuildCores}}'
|
||||||
|
|
||||||
|
# (Note: a post-job for updating the dependency cache is automatically created, so no further step is due here.)
|
||||||
72
.azure-pipelines/templates/jobs/setup_image.yaml
Normal file
72
.azure-pipelines/templates/jobs/setup_image.yaml
Normal file
@ -0,0 +1,72 @@
|
|||||||
|
# SPDX-FileCopyrightText: 2024-2025 Sarah Vaupel <sarah.vaupel@uniworx.de>
|
||||||
|
#
|
||||||
|
# SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
|
|
||||||
|
parameters:
|
||||||
|
- name: imageName
|
||||||
|
type: string
|
||||||
|
- name: imageBase
|
||||||
|
type: object
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
- job: SetupImage_${{parameters.imageName}}
|
||||||
|
displayName: Build ${{parameters.imageName}} image
|
||||||
|
condition: eq(variables.setupImages, true)
|
||||||
|
container:
|
||||||
|
image: devfra.azurecr.io/de.fraport.build/tools:1.1.0
|
||||||
|
endpoint: devfra
|
||||||
|
steps:
|
||||||
|
- task: Docker@2
|
||||||
|
displayName: Login to container registry
|
||||||
|
inputs:
|
||||||
|
command: login
|
||||||
|
containerRegistry: devfra
|
||||||
|
- task: Bash@3
|
||||||
|
displayName: Build ${{parameters.imageName}} image
|
||||||
|
inputs:
|
||||||
|
targetType: inline
|
||||||
|
script: |
|
||||||
|
cp docker/${{parameters.imageName}}/Dockerfile .
|
||||||
|
docker build \
|
||||||
|
--tag $(buildImageUpstream)/${{parameters.imageName}}:$(Build.BuildNumber) \
|
||||||
|
--build-arg FROM_IMG=${{parameters.imageBase.image}} \
|
||||||
|
--build-arg FROM_TAG=${{parameters.imageBase.tag}} \
|
||||||
|
--build-arg HTTPS_PROXY=http://proxy.frankfurt-airport.de:8080 \
|
||||||
|
--build-arg HTTP_PROXY=http://proxy.frankfurt-airport.de:8080 \
|
||||||
|
--build-arg NO_PROXY='localhost,127.0.0.1,*.docker.internal,*.azmk8s.io,devfra.azurecr.io,devfra.westeurope.data.azurecr.io' \
|
||||||
|
--build-arg FRAPORT_NOPROXY=dev.azure.com,*.dev.azure.com,*.fraport.de,*.frankfurt-airport.de \
|
||||||
|
--build-arg PROJECT_DIR=$(Build.Repository.LocalPath) \
|
||||||
|
--build-arg IN_CI=true \
|
||||||
|
--build-arg IN_CONTAINER=true \
|
||||||
|
.
|
||||||
|
- task: Bash@3
|
||||||
|
displayName: Push ${{parameters.imageName}} image
|
||||||
|
inputs:
|
||||||
|
targetType: inline
|
||||||
|
script: |
|
||||||
|
docker push $(buildImageUpstream)/${{parameters.imageName}}:$(Build.BuildNumber)
|
||||||
|
- task: Bash@3
|
||||||
|
displayName: Update latest ${{parameters.imageName}} image
|
||||||
|
condition: or(eq(variables.forcePushLatest, true), eq(variables['Build.SourceBranch'], 'refs/heads/master'))
|
||||||
|
inputs:
|
||||||
|
targetType: inline
|
||||||
|
script: |
|
||||||
|
docker tag $(buildImageUpstream)/${{parameters.imageName}}:$(Build.BuildNumber) $(buildImageUpstream)/${{parameters.imageName}}:latest
|
||||||
|
docker push $(buildImageUpstream)/${{parameters.imageName}}:latest
|
||||||
|
- task: Bash@3
|
||||||
|
displayName: Save image for publication
|
||||||
|
inputs:
|
||||||
|
targetType: inline
|
||||||
|
script: |
|
||||||
|
docker image save --output=$(Build.ArtifactStagingDirectory)/${{parameters.imageName}}.tar $(buildImageUpstream)/${{parameters.imageName}}:$(Build.BuildNumber)
|
||||||
|
- task: PublishBuildArtifacts@1
|
||||||
|
displayName: Publish image as artifact
|
||||||
|
inputs:
|
||||||
|
PathtoPublish: '$(Build.ArtifactStagingDirectory)'
|
||||||
|
ArtifactName: Image_${{parameters.imageName}}
|
||||||
|
publishLocation: 'Container'
|
||||||
|
- task: Docker@2
|
||||||
|
displayName: Logout from container registry
|
||||||
|
inputs:
|
||||||
|
command: logout
|
||||||
|
containerRegistry: devfra
|
||||||
141
.azure-pipelines/templates/service.yaml
Executable file
141
.azure-pipelines/templates/service.yaml
Executable file
@ -0,0 +1,141 @@
|
|||||||
|
# SPDX-FileCopyrightText: 2024-2025 Sarah Vaupel <sarah.vaupel@uniworx.de>
|
||||||
|
#
|
||||||
|
# SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
|
|
||||||
|
parameters:
|
||||||
|
- name: serviceName
|
||||||
|
type: string
|
||||||
|
default: serviceName
|
||||||
|
- name: serviceBase
|
||||||
|
type: object
|
||||||
|
default:
|
||||||
|
image: baseImage
|
||||||
|
tag: baseImageTag
|
||||||
|
- name: servicePool
|
||||||
|
type: string
|
||||||
|
default: 'Prod Private Agent Pool'
|
||||||
|
- name: serviceTimeout
|
||||||
|
type: number
|
||||||
|
default: 60
|
||||||
|
# extraBuildOptions: ''
|
||||||
|
- name: serviceDependsOn
|
||||||
|
type: object
|
||||||
|
default: []
|
||||||
|
- name: serviceRequiredArtifacts
|
||||||
|
type: object
|
||||||
|
default: []
|
||||||
|
- name: serviceArtifacts
|
||||||
|
type: string
|
||||||
|
default: ''
|
||||||
|
- name: buildSteps
|
||||||
|
type: object
|
||||||
|
|
||||||
|
stages:
|
||||||
|
- stage: ${{ parameters.serviceName }}
|
||||||
|
dependsOn: ${{ parameters.serviceDependsOn }}
|
||||||
|
pool: '${{ parameters.servicePool }}'
|
||||||
|
jobs:
|
||||||
|
- job: ImageBuild_${{parameters.serviceName}}
|
||||||
|
displayName: Build ${{parameters.serviceName}} image
|
||||||
|
condition: or(eq(variables.forcePushLatest, true), eq(variables.onMasterBranch, true), eq(variables.onUpdateBranch, true))
|
||||||
|
container:
|
||||||
|
image: devfra.azurecr.io/de.fraport.build/tools:1.1.0
|
||||||
|
endpoint: devfra
|
||||||
|
steps:
|
||||||
|
- checkout: self
|
||||||
|
- task: Docker@2
|
||||||
|
displayName: Login to container registry
|
||||||
|
inputs:
|
||||||
|
command: login
|
||||||
|
containerRegistry: devFra
|
||||||
|
- script: |
|
||||||
|
ls -a .
|
||||||
|
pwd
|
||||||
|
find .
|
||||||
|
- task: Bash@3
|
||||||
|
displayName: Build ${{parameters.serviceName}} image
|
||||||
|
inputs:
|
||||||
|
targetType: inline
|
||||||
|
script: |
|
||||||
|
cp docker/${{parameters.serviceName}}/Dockerfile .
|
||||||
|
docker build \
|
||||||
|
--tag $(buildImageUpstream)/${{parameters.serviceName}}:$(Build.BuildNumber) \
|
||||||
|
--build-arg FROM_IMG=${{parameters.serviceBase.image}} \
|
||||||
|
--build-arg FROM_TAG=${{parameters.serviceBase.tag}} \
|
||||||
|
--build-arg HTTPS_PROXY=http://proxy.frankfurt-airport.de:8080 \
|
||||||
|
--build-arg HTTP_PROXY=http://proxy.frankfurt-airport.de:8080 \
|
||||||
|
--build-arg NO_PROXY='localhost,127.0.0.1,*.docker.internal,*.azmk8s.io,devfra.azurecr.io,devfra.westeurope.data.azurecr.io' \
|
||||||
|
--build-arg FRAPORT_NOPROXY=dev.azure.com,*.dev.azure.com,*.fraport.de,*.frankfurt-airport.de \
|
||||||
|
--build-arg PROJECT_DIR=$(Build.Repository.LocalPath) \
|
||||||
|
--build-arg IN_CI=true \
|
||||||
|
--build-arg IN_CONTAINER=true \
|
||||||
|
.
|
||||||
|
- task: Bash@3
|
||||||
|
displayName: Push ${{ parameters.serviceName }} image
|
||||||
|
inputs:
|
||||||
|
targetType: inline
|
||||||
|
script: |
|
||||||
|
docker push $(buildImageUpstream)/${{parameters.serviceName}}:$(Build.BuildNumber)
|
||||||
|
- task: Bash@3
|
||||||
|
displayName: Update latest ${{parameters.serviceName}} image
|
||||||
|
condition: or(eq(variables.forcePushLatest, true), eq(variables.onMasterBranch, true))
|
||||||
|
inputs:
|
||||||
|
targetType: inline
|
||||||
|
script: |
|
||||||
|
docker tag $(buildImageUpstream)/${{parameters.serviceName}}:$(Build.BuildNumber) $(buildImageUpstream)/${{parameters.serviceName}}:latest
|
||||||
|
docker push $(buildImageUpstream)/${{parameters.serviceName}}:latest
|
||||||
|
- task: Docker@2
|
||||||
|
displayName: Logout from container registry
|
||||||
|
inputs:
|
||||||
|
command: logout
|
||||||
|
containerRegistry: devFra
|
||||||
|
|
||||||
|
- job: Build_${{parameters.serviceName}}
|
||||||
|
displayName: Build ${{parameters.serviceName}}
|
||||||
|
dependsOn:
|
||||||
|
- ImageBuild_${{parameters.serviceName}}
|
||||||
|
condition: in(dependencies.ImageBuild_${{parameters.serviceName}}.result, 'Succeeded', 'Skipped')
|
||||||
|
timeoutInMinutes: ${{ parameters.serviceTimeout }}
|
||||||
|
container:
|
||||||
|
# TODO: use BuildNumber instead of latest in update branches
|
||||||
|
# image: devfra.azurecr.io/de.fraport.fradrive.build/frontend:$(Build.BuildNumber)
|
||||||
|
image: $(buildImageUpstream)/${{parameters.serviceName}}:latest
|
||||||
|
endpoint: devfra
|
||||||
|
env:
|
||||||
|
PROJECT_DIR: $(Build.Repository.LocalPath)
|
||||||
|
IN_CONTAINER: true
|
||||||
|
IN_CI: true
|
||||||
|
steps:
|
||||||
|
- checkout: self
|
||||||
|
- ${{ each dependency in parameters.serviceRequiredArtifacts }}:
|
||||||
|
- task: DownloadPipelineArtifact@2
|
||||||
|
displayName: Download artifacts from ${{ dependency.name }} dependency
|
||||||
|
continueOnError: ${{ dependency.continueOnError }}
|
||||||
|
condition: ${{ dependency.condition }}
|
||||||
|
inputs:
|
||||||
|
artifactName: ${{ dependency.artifact }}
|
||||||
|
source: ${{ dependency.source }}
|
||||||
|
project: 'Fahrerausbildung'
|
||||||
|
pipeline: $(System.DefinitionId)
|
||||||
|
buildVersionToDownload: '${{ dependency.version }}'
|
||||||
|
tags: '${{ dependency.artifact }}'
|
||||||
|
allowPartiallySucceededBuilds: true
|
||||||
|
allowFailedBuilds: true
|
||||||
|
patterns: '${{ dependency.patterns }}'
|
||||||
|
targetPath: '$(Build.Repository.LocalPath)'
|
||||||
|
- ${{ each buildStep in parameters.buildSteps }}:
|
||||||
|
- template: ./service/build-step.yaml
|
||||||
|
parameters:
|
||||||
|
service: ${{ parameters.serviceName }}
|
||||||
|
buildStep: ${{ buildStep }}
|
||||||
|
- task: CopyFiles@2
|
||||||
|
displayName: Copy ${{parameters.serviceName}} artifacts
|
||||||
|
inputs:
|
||||||
|
Contents: ${{ parameters.serviceArtifacts }}
|
||||||
|
TargetFolder: '$(Build.ArtifactStagingDirectory)'
|
||||||
|
- task: PublishBuildArtifacts@1
|
||||||
|
displayName: Publish ${{parameters.serviceName}} artifacts
|
||||||
|
inputs:
|
||||||
|
PathtoPublish: '$(Build.ArtifactStagingDirectory)'
|
||||||
|
ArtifactName: '${{parameters.serviceName}}'
|
||||||
|
publishLocation: 'Container'
|
||||||
15
.azure-pipelines/templates/steps/artifact-download.yaml
Normal file
15
.azure-pipelines/templates/steps/artifact-download.yaml
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
# SPDX-FileCopyrightText: 2025 Sarah Vaupel <sarah.vaupel@uniworx.de>
|
||||||
|
#
|
||||||
|
# SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
|
|
||||||
|
parameters:
|
||||||
|
- name: artifactName
|
||||||
|
type: string
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- task: DownloadPipelineArtifact@2
|
||||||
|
displayName: Download artifacts from ${{parameters.artifactName}}
|
||||||
|
inputs:
|
||||||
|
source: 'current'
|
||||||
|
artifactName: '${{parameters.artifactName}}'
|
||||||
|
targetPath: '$(Build.Repository.LocalPath)'
|
||||||
18
.azure-pipelines/templates/steps/cache.yaml
Normal file
18
.azure-pipelines/templates/steps/cache.yaml
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
# SPDX-FileCopyrightText: 2025 Sarah Vaupel <sarah.vaupel@uniworx.de>
|
||||||
|
#
|
||||||
|
# SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
|
|
||||||
|
parameters:
|
||||||
|
- name: cacheIdent
|
||||||
|
type: string
|
||||||
|
- name: cacheKeys
|
||||||
|
type: string
|
||||||
|
- name: cachePath
|
||||||
|
type: string
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- task: Cache@2
|
||||||
|
displayName: Restore ${{parameters.cacheIdent}} cache
|
||||||
|
inputs:
|
||||||
|
key: '"${{parameters.cacheIdent}}" | ${{parameters.cacheKeys}}'
|
||||||
|
path: '${{parameters.cachePath}}'
|
||||||
35
.azure-pipelines/templates/steps/make.yaml
Normal file
35
.azure-pipelines/templates/steps/make.yaml
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
# SPDX-FileCopyrightText: 2024-2025 Sarah Vaupel <sarah.vaupel@uniworx.de>
|
||||||
|
#
|
||||||
|
# SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
|
|
||||||
|
parameters:
|
||||||
|
- name: makeJob
|
||||||
|
type: string
|
||||||
|
values:
|
||||||
|
- dependencies
|
||||||
|
- compile
|
||||||
|
- lint
|
||||||
|
- test
|
||||||
|
- name: makeService
|
||||||
|
type: string
|
||||||
|
values:
|
||||||
|
- frontend
|
||||||
|
- backend
|
||||||
|
- name: makeVars
|
||||||
|
type: string
|
||||||
|
default: ''
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- task: Bash@3
|
||||||
|
name: ${{parameters.makeJob}}_${{parameters.makeService}}
|
||||||
|
displayName: make ${{parameters.makeJob}}-${{parameters.makeService}}
|
||||||
|
env:
|
||||||
|
HTTPS_PROXY: http://proxy.frankfurt-airport.de:8080
|
||||||
|
HTTP_PROXY: http://proxy.frankfurt-airport.de:8080
|
||||||
|
NO_PROXY: 'localhost,127.0.0.1,*.docker.internal,*.azmk8s.io,devfra.azurecr.io,devfra.westeurope.data.azurecr.io'
|
||||||
|
FRAPORT_NOPROXY: 'dev.azure.com,*.dev.azure.com,*.fraport.de,*.frankfurt-airport.de'
|
||||||
|
PROJECT_DIR: $(Build.Repository.LocalPath)
|
||||||
|
inputs:
|
||||||
|
targetType: inline
|
||||||
|
script: |
|
||||||
|
make -- --${{parameters.makeJob}}-${{parameters.makeService}} IN_CONTAINER=true IN_CI=true PROJECT_DIR=${PROJECT_DIR} ${{parameters.makeVars}}
|
||||||
17
.babelrc
17
.babelrc
@ -1,17 +0,0 @@
|
|||||||
{
|
|
||||||
"presets": [
|
|
||||||
["env", {
|
|
||||||
"useBuiltIns": "usage",
|
|
||||||
"targets": { "node": "current" }
|
|
||||||
}
|
|
||||||
]
|
|
||||||
],
|
|
||||||
"plugins": [
|
|
||||||
["@babel/plugin-proposal-decorators", { "legacy": true }],
|
|
||||||
["@babel/plugin-proposal-class-properties", { "loose": true }],
|
|
||||||
["@babel/plugin-proposal-private-methods", { "loose": true }],
|
|
||||||
["@babel/plugin-proposal-private-property-in-object", { "loose": true }],
|
|
||||||
["@babel/plugin-transform-modules-commonjs"],
|
|
||||||
["@babel/transform-runtime"]
|
|
||||||
]
|
|
||||||
}
|
|
||||||
@ -1 +0,0 @@
|
|||||||
**/*
|
|
||||||
@ -1,3 +0,0 @@
|
|||||||
SPDX-FileCopyrightText: 2022 Gregor Kleen <gregor.kleen@ifi.lmu.de>
|
|
||||||
|
|
||||||
SPDX-License-Identifier: AGPL-3.0-or-later
|
|
||||||
@ -1,30 +0,0 @@
|
|||||||
{
|
|
||||||
"env": {
|
|
||||||
"browser": true,
|
|
||||||
"es6": true,
|
|
||||||
"jasmine": true
|
|
||||||
},
|
|
||||||
"extends": "eslint:recommended",
|
|
||||||
"globals": {
|
|
||||||
"Atomics": "readonly",
|
|
||||||
"SharedArrayBuffer": "readonly",
|
|
||||||
"flatpickr": "readonly",
|
|
||||||
"$": "readonly"
|
|
||||||
},
|
|
||||||
"parser": "@babel/eslint-parser",
|
|
||||||
"parserOptions": {
|
|
||||||
"ecmaVersion": 2018,
|
|
||||||
"requireConfigFile": false,
|
|
||||||
"ecmaFeatures": {
|
|
||||||
"legacyDecorators": true
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"rules": {
|
|
||||||
"no-console": "off",
|
|
||||||
"no-extra-semi": "off",
|
|
||||||
"semi": ["error", "always"],
|
|
||||||
"comma-dangle": ["error", "always-multiline"],
|
|
||||||
"quotes": ["error", "single"],
|
|
||||||
"no-var": "error"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
21
.gitignore
vendored
21
.gitignore
vendored
@ -1,5 +1,10 @@
|
|||||||
|
.Dockerfile
|
||||||
dist*
|
dist*
|
||||||
|
develop
|
||||||
node_modules/
|
node_modules/
|
||||||
|
assets/icons
|
||||||
|
assets/favicons
|
||||||
|
bin/
|
||||||
*.hi
|
*.hi
|
||||||
*.o
|
*.o
|
||||||
*.sqlite3
|
*.sqlite3
|
||||||
@ -7,7 +12,14 @@ node_modules/
|
|||||||
*.sqlite3-wal
|
*.sqlite3-wal
|
||||||
.hsenv*
|
.hsenv*
|
||||||
cabal-dev/
|
cabal-dev/
|
||||||
.stack-work/
|
.cache/
|
||||||
|
.stack/
|
||||||
|
.stack-work
|
||||||
|
.job-*/
|
||||||
|
.dev-port-http
|
||||||
|
.dev-port-https
|
||||||
|
.bash_history
|
||||||
|
.lesshst
|
||||||
yesod-devel/
|
yesod-devel/
|
||||||
.cabal-sandbox
|
.cabal-sandbox
|
||||||
cabal.sandbox.config
|
cabal.sandbox.config
|
||||||
@ -25,6 +37,7 @@ uniworx.nix
|
|||||||
.kateproject
|
.kateproject
|
||||||
src/Handler/Assist.bak
|
src/Handler/Assist.bak
|
||||||
src/Handler/Course.SnapCustom.hs
|
src/Handler/Course.SnapCustom.hs
|
||||||
|
frontend/src/env.sass
|
||||||
*.orig
|
*.orig
|
||||||
/instance
|
/instance
|
||||||
.stack-work-*
|
.stack-work-*
|
||||||
@ -34,7 +47,8 @@ test.log
|
|||||||
*.dump-splices
|
*.dump-splices
|
||||||
/.stack-work.lock
|
/.stack-work.lock
|
||||||
/.npmrc
|
/.npmrc
|
||||||
/config/webpack.yml
|
/.npm/
|
||||||
|
/config/manifest.json
|
||||||
tunnel.log
|
tunnel.log
|
||||||
/static
|
/static
|
||||||
/well-known
|
/well-known
|
||||||
@ -51,4 +65,5 @@ tunnel.log
|
|||||||
**/result
|
**/result
|
||||||
**/result-*
|
**/result-*
|
||||||
.develop.cmd
|
.develop.cmd
|
||||||
/.vscode
|
/.vscode
|
||||||
|
.ghc/ghci_history
|
||||||
|
|||||||
870
.gitlab-ci.yml
870
.gitlab-ci.yml
@ -1,396 +1,588 @@
|
|||||||
# SPDX-FileCopyrightText: 2022-2023 Sarah Vaupel <sarah.vaupel@uniworx.de>, Gregor Kleen <gregor@kleen.consulting>
|
# SPDX-FileCopyrightText: 2022-2024 Sarah Vaupel <sarah.vaupel@uniworx.de>, Gregor Kleen <gregor@kleen.consulting>
|
||||||
#
|
#
|
||||||
# SPDX-License-Identifier: AGPL-3.0-or-later
|
# SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
|
|
||||||
|
### IMPORTANT NOTICE ###
|
||||||
|
# Our pipeline consists of static and dynamic parts.
|
||||||
|
#
|
||||||
|
# This file only contains the static parts of our pipeline.
|
||||||
|
# Dynamic jobs are defined in .gitlab-ci/frontend.yml and .gitlab-ci/backend.yml.
|
||||||
|
# These are used as a template to generate downstream (child) pipelines during
|
||||||
|
# the runtime of the upstream (parent) pipeline.
|
||||||
|
###
|
||||||
|
|
||||||
|
|
||||||
# workflow:
|
# workflow:
|
||||||
# rules:
|
# rules:
|
||||||
# - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
|
# - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
|
||||||
# - if: $CI_MERGE_REQUEST_ID
|
# - if: $CI_MERGE_REQUEST_ID
|
||||||
# - if: $CI_COMMIT_TAG =~ /^v/
|
# - if: $CI_COMMIT_TAG =~ /^v/
|
||||||
# - if: $CI_COMMIT_TAG =~ /^t/
|
# - if: $CI_COMMIT_TAG =~ /^t/
|
||||||
|
# - if: $CI_COMMIT_TAG =~ /^d/
|
||||||
|
|
||||||
|
|
||||||
|
variables:
|
||||||
|
IMAGE_BUILDER: quay.io/buildah/stable:latest
|
||||||
|
FRONTEND_IMAGE_DEPENDENCIES:
|
||||||
|
docker/frontend/Dockerfile
|
||||||
|
package.json
|
||||||
|
package-lock.json
|
||||||
|
webpack.config.js
|
||||||
|
BACKEND_IMAGE_DEPENDENCIES:
|
||||||
|
docker/backend/Dockerfile
|
||||||
|
package.yaml
|
||||||
|
stack.yaml
|
||||||
|
stack.yaml.lock
|
||||||
|
|
||||||
|
|
||||||
default:
|
default:
|
||||||
image:
|
image:
|
||||||
name: registry.uniworx.de/uniworx/containers/nix-attic:latest
|
name: ${CI_REGISTRY}/uniworx/containers/debian:12.5
|
||||||
|
entrypoint: [""]
|
||||||
|
docker:
|
||||||
|
platform: x86_64
|
||||||
|
artifacts:
|
||||||
|
name: "${CI_JOB_NAME}-${CI_COMMIT_SHORT_SHA}"
|
||||||
|
expire_in: "1 day"
|
||||||
|
retry: 2
|
||||||
|
interruptible: true
|
||||||
|
|
||||||
variables:
|
|
||||||
NIX_PATH: "nixpkgs=http://nixos.org/channels/nixos-21.05/nixexprs.tar.xz"
|
|
||||||
AWS_SHARED_CREDENTIALS_FILE: "/etc/aws/credentials"
|
|
||||||
|
|
||||||
TRANSFER_METER_FREQUENCY: "2s"
|
|
||||||
|
|
||||||
NIX_CONFIG: |-
|
|
||||||
extra-substituters = https://cache.iog.io
|
|
||||||
extra-trusted-public-keys = hydra.iohk.io:f/Ea+s+dFdN+3Y/G+FDgSq+a5NEWhJGzdjvKNGv0/EQ=
|
|
||||||
|
|
||||||
stages:
|
stages:
|
||||||
- frontend:build
|
- setup
|
||||||
- backend:build
|
- frontend
|
||||||
- test
|
- backend
|
||||||
- container:build
|
|
||||||
- prepare release
|
|
||||||
- release
|
- release
|
||||||
|
|
||||||
node dependencies:
|
|
||||||
stage: frontend:build
|
|
||||||
script:
|
|
||||||
- nix -L build -o result ".#uniworxNodeDependencies"
|
|
||||||
- nix-store --export $(nix-store -qR result) | xz -T0 -2 > node-dependencies.nar.xz
|
|
||||||
before_script: &nix-before
|
|
||||||
- git config --global init.defaultBranch master
|
|
||||||
- install -v -m 0700 -d ~/.ssh
|
|
||||||
- install -v -T -m 0644 "${SSH_KNOWN_HOSTS}" ~/.ssh/known_hosts
|
|
||||||
- install -v -T -m 0400 "${SSH_DEPLOY_KEY}" ~/.ssh/deploy && echo "IdentityFile ~/.ssh/deploy" >> ~/.ssh/config;
|
|
||||||
- install -v -T -m 0644 "${FONTAWESOME_NPM_AUTH_FILE}" /etc/fontawesome-token
|
|
||||||
- install -v -T -m 0644 "${NIX_NETRC}" /etc/nix/netrc
|
|
||||||
artifacts:
|
|
||||||
paths:
|
|
||||||
- node-dependencies.nar.xz
|
|
||||||
name: "${CI_JOB_NAME}-${CI_COMMIT_SHORT_SHA}"
|
|
||||||
expire_in: "1 day"
|
|
||||||
retry: 2
|
|
||||||
interruptible: true
|
|
||||||
|
|
||||||
well known:
|
setup:dynamic:
|
||||||
stage: frontend:build
|
stage: setup
|
||||||
|
before_script:
|
||||||
|
- apt-get -y update
|
||||||
|
- apt-get -y install git
|
||||||
|
variables:
|
||||||
|
GIT_DEPTH: 99999
|
||||||
|
GIT_STRATEGY: clone
|
||||||
|
GIT_LOG_COMMAND: 'git log --max-count=1 --date=format:%Y-%m-%dT%H-%M --pretty=format:%cd'
|
||||||
script:
|
script:
|
||||||
- xzcat node-dependencies.nar.xz | nix-store --import
|
- echo "${FRONTEND_IMAGE_DEPENDENCIES}"
|
||||||
- nix -L build -o result ".#uniworxWellKnown"
|
- echo "${BACKEND_IMAGE_DEPENDENCIES}"
|
||||||
- nix-store --export $(nix-store -qR result) | xz -T0 -2 > well-known.nar.xz
|
- FRONTEND_IMAGE_VERSION=`${GIT_LOG_COMMAND} ${FRONTEND_IMAGE_DEPENDENCIES} | tee frontend-image-version`
|
||||||
before_script: *nix-before
|
- BACKEND_IMAGE_VERSION=`${GIT_LOG_COMMAND} ${BACKEND_IMAGE_DEPENDENCIES} | tee backend-image-version`
|
||||||
needs:
|
- 'echo "FRONTEND_IMAGE_VERSION: ${FRONTEND_IMAGE_VERSION}, BACKEND_IMAGE_VERSION: ${BACKEND_IMAGE_VERSION}"'
|
||||||
- job: node dependencies
|
- cat .gitlab-ci/frontend.yml | .gitlab-ci/dynamci.pl FRONTEND_IMAGE_VERSION=${FRONTEND_IMAGE_VERSION} > frontend.yml
|
||||||
artifacts: true
|
- cat .gitlab-ci/backend.yml | .gitlab-ci/dynamci.pl BACKEND_IMAGE_VERSION=${BACKEND_IMAGE_VERSION} PARENT_PIPELINE_ID=${CI_PIPELINE_ID} > backend.yml
|
||||||
artifacts:
|
artifacts:
|
||||||
paths:
|
paths:
|
||||||
- well-known.nar.xz
|
- frontend-image-version
|
||||||
name: "${CI_JOB_NAME}-${CI_COMMIT_SHORT_SHA}"
|
- backend-image-version
|
||||||
expire_in: "1 day"
|
- frontend.yml
|
||||||
retry: 2
|
- backend.yml
|
||||||
|
rules:
|
||||||
|
- when: always
|
||||||
|
|
||||||
|
setup:containers:frontend: &setup-container
|
||||||
|
stage: setup
|
||||||
|
needs:
|
||||||
|
- setup:dynamic
|
||||||
|
image: ${IMAGE_BUILDER}
|
||||||
|
variables:
|
||||||
|
IMAGE_TYPE: frontend
|
||||||
|
before_script: &container-before
|
||||||
|
- IMAGE_VERSION=`cat ${IMAGE_TYPE}-image-version`
|
||||||
|
- IMAGE_TAG=${CI_COMMIT_REF_SLUG}/${IMAGE_TYPE}:${IMAGE_VERSION}
|
||||||
|
- REGISTRY_DESTINATION=${CI_REGISTRY_IMAGE}/${CI_COMMIT_REF_SLUG}/${IMAGE_TYPE}:${IMAGE_VERSION}
|
||||||
|
script:
|
||||||
|
- curl --request GET --header "PRIVATE-TOKEN:${REGISTRY_AUTH_TOKEN}" "${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/registry/repositories?tags=true" > .gitlab-ci/.container-registry-contents.json
|
||||||
|
- cat .gitlab-ci/.container-registry-contents.json
|
||||||
|
- IMAGE_EXISTS=`grep \""${REGISTRY_DESTINATION}"\" .gitlab-ci/.container-registry-contents.json || :`
|
||||||
|
- echo "${IMAGE_EXISTS}"
|
||||||
|
- test "${CI_JOB_MANUAL}" = true && echo "Force rebuilding container."
|
||||||
|
- >
|
||||||
|
if [ -z "${IMAGE_EXISTS}" -o "${CI_JOB_MANUAL}" = true ] ; then
|
||||||
|
echo "Building image ${REGISTRY_DESTINATION}..."
|
||||||
|
buildah bud -t ${IMAGE_TAG} --build-arg PROJECT_DIR=${CI_PROJECT_DIR} --build-arg MOUNT_DIR=/mnt/${CI_PROJECT_DIR} --volume ${CI_PROJECT_DIR}:/mnt/${CI_PROJECT_DIR} --file docker/${IMAGE_TYPE}/Dockerfile
|
||||||
|
buildah push --creds "${CI_REGISTRY_USER}:${CI_JOB_TOKEN}" ${IMAGE_TAG} ${REGISTRY_DESTINATION}
|
||||||
|
else
|
||||||
|
echo "Image ${IMAGE_TAG} already exists in the container registry. Skipping build."
|
||||||
|
fi
|
||||||
|
rules:
|
||||||
|
- if: $CI_MERGE_REQUEST_ID
|
||||||
|
when: never
|
||||||
|
- when: always
|
||||||
|
setup:containers:frontend:wait: &setup-container-wait
|
||||||
|
stage: setup
|
||||||
|
needs:
|
||||||
|
- setup:dynamic
|
||||||
|
before_script: *container-before
|
||||||
|
variables:
|
||||||
|
GIT_STRATEGY: none
|
||||||
|
IMAGE_TYPE: frontend
|
||||||
|
script:
|
||||||
|
- apt-get -y update && apt-get -y install curl
|
||||||
|
- >
|
||||||
|
while ! curl --request GET --header "PRIVATE-TOKEN:${REGISTRY_AUTH_TOKEN}" "${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/registry/repositories?tags=true" | grep \""${REGISTRY_DESTINATION}"\" ; do
|
||||||
|
echo "Waiting for container ${IMAGE_TAG} to appear in the container registry..."
|
||||||
|
sleep 5
|
||||||
|
done
|
||||||
|
- echo "Image ${IMAGE_TAG} has been found in the container registry. Proceeding with the pipeline."
|
||||||
|
rules:
|
||||||
|
- if: $CI_MERGE_REQUEST_ID
|
||||||
|
when: always
|
||||||
|
- when: never
|
||||||
|
retry: 0
|
||||||
interruptible: true
|
interruptible: true
|
||||||
|
timeout: 3h
|
||||||
|
|
||||||
|
setup:containers:backend:
|
||||||
|
<<: *setup-container
|
||||||
|
variables:
|
||||||
|
IMAGE_TYPE: backend
|
||||||
|
setup:containers:backend:wait:
|
||||||
|
<<: *setup-container-wait
|
||||||
|
variables:
|
||||||
|
GIT_STRATEGY: none
|
||||||
|
IMAGE_TYPE: backend
|
||||||
|
|
||||||
|
|
||||||
frontend:
|
frontend:
|
||||||
stage: frontend:build
|
stage: frontend
|
||||||
script:
|
variables:
|
||||||
- xzcat node-dependencies.nar.xz | nix-store --import
|
GIT_STRATEGY: clone
|
||||||
- xzcat well-known.nar.xz | nix-store --import
|
|
||||||
- nix -L build -o result ".#uniworxFrontend"
|
|
||||||
- nix-store --export $(nix-store -qR result) | xz -T0 -2 > frontend.nar.xz
|
|
||||||
before_script: *nix-before
|
|
||||||
needs:
|
needs:
|
||||||
- job: node dependencies
|
- setup:dynamic
|
||||||
artifacts: true
|
- job: setup:containers:frontend
|
||||||
- job: well known
|
optional: true
|
||||||
artifacts: true
|
trigger:
|
||||||
artifacts:
|
strategy: depend
|
||||||
paths:
|
include:
|
||||||
- frontend.nar.xz
|
- artifact: frontend.yml
|
||||||
name: "${CI_JOB_NAME}-${CI_COMMIT_SHORT_SHA}"
|
job: setup:dynamic
|
||||||
expire_in: "1 day"
|
|
||||||
retry: 2
|
|
||||||
interruptible: true
|
|
||||||
|
|
||||||
uniworx:lib:uniworx:
|
|
||||||
stage: backend:build
|
|
||||||
script:
|
|
||||||
- xzcat frontend.nar.xz | nix-store --import
|
|
||||||
- nix -L build -o result ".#uniworx:lib:uniworx"
|
|
||||||
- nix-store --export $(nix-store -qR result) | xz -T0 -2 > uniworx:lib:uniworx.nar.xz
|
|
||||||
before_script: *nix-before
|
|
||||||
needs:
|
|
||||||
- job: node dependencies # transitive
|
|
||||||
artifacts: false
|
|
||||||
- job: well known # transitive
|
|
||||||
artifacts: false
|
|
||||||
- job: frontend
|
|
||||||
artifacts: true
|
|
||||||
artifacts:
|
|
||||||
paths:
|
|
||||||
- uniworx:lib:uniworx.nar.xz
|
|
||||||
name: "${CI_JOB_NAME}-${CI_COMMIT_SHORT_SHA}"
|
|
||||||
expire_in: "1 day"
|
|
||||||
retry: 2
|
|
||||||
interruptible: true
|
|
||||||
|
|
||||||
uniworx:exe:uniworx:
|
backend:dev: &backend
|
||||||
stage: backend:build
|
stage: backend
|
||||||
script:
|
variables:
|
||||||
- xzcat uniworx:lib:uniworx.nar.xz | nix-store --import
|
GIT_STRATEGY: clone
|
||||||
- nix -L build -o result ".#uniworx:exe:uniworx"
|
|
||||||
- nix-store --export $(nix-store -qR result) | xz -T0 -2 > uniworx:exe:uniworx.nar.xz
|
|
||||||
before_script: *nix-before
|
|
||||||
needs:
|
needs:
|
||||||
- job: node dependencies # transitive
|
- setup:dynamic
|
||||||
artifacts: false
|
- job: setup:containers:backend
|
||||||
- job: well known # transitive
|
optional: true
|
||||||
artifacts: false
|
- frontend
|
||||||
- job: frontend # tranitive
|
trigger:
|
||||||
artifacts: false
|
strategy: depend
|
||||||
- job: uniworx:lib:uniworx
|
include:
|
||||||
artifacts: true
|
- artifact: backend.yml
|
||||||
artifacts:
|
job: setup:dynamic
|
||||||
paths:
|
|
||||||
- uniworx:exe:uniworx.nar.xz
|
|
||||||
name: "${CI_JOB_NAME}-${CI_COMMIT_SHORT_SHA}"
|
|
||||||
expire_in: "1 day"
|
|
||||||
retry: 2
|
|
||||||
interruptible: true
|
|
||||||
|
|
||||||
uniworx:exe:uniworxdb:
|
backend:prod:
|
||||||
stage: backend:build
|
<<: *backend
|
||||||
script:
|
variables:
|
||||||
- xzcat uniworx:lib:uniworx.nar.xz | nix-store --import
|
PROD_BUILD: -prod
|
||||||
- nix -L build -o result ".#uniworx:exe:uniworxdb"
|
|
||||||
- nix-store --export $(nix-store -qR result) | xz -T0 -2 > uniworx:exe:uniworxdb.nar.xz
|
|
||||||
before_script: *nix-before
|
|
||||||
needs:
|
|
||||||
- job: node dependencies # transitive
|
|
||||||
artifacts: false
|
|
||||||
- job: well known # transitive
|
|
||||||
artifacts: false
|
|
||||||
- job: frontend # tranitive
|
|
||||||
artifacts: false
|
|
||||||
- job: uniworx:lib:uniworx
|
|
||||||
artifacts: true
|
|
||||||
artifacts:
|
|
||||||
paths:
|
|
||||||
- uniworx:exe:uniworxdb.nar.xz
|
|
||||||
name: "${CI_JOB_NAME}-${CI_COMMIT_SHORT_SHA}"
|
|
||||||
expire_in: "1 day"
|
|
||||||
retry: 2
|
|
||||||
interruptible: true
|
|
||||||
|
|
||||||
uniworx:exe:uniworxload:
|
|
||||||
stage: backend:build
|
|
||||||
script:
|
|
||||||
- xzcat uniworx:lib:uniworx.nar.xz | nix-store --import
|
|
||||||
- nix -L build -o result ".#uniworx:exe:uniworxload"
|
|
||||||
- nix-store --export $(nix-store -qR result) | xz -T0 -2 > uniworx:exe:uniworxload.nar.xz
|
|
||||||
before_script: *nix-before
|
|
||||||
needs:
|
|
||||||
- job: node dependencies # transitive
|
|
||||||
artifacts: false
|
|
||||||
- job: well known # transitive
|
|
||||||
artifacts: false
|
|
||||||
- job: frontend # tranitive
|
|
||||||
artifacts: false
|
|
||||||
- job: uniworx:lib:uniworx
|
|
||||||
artifacts: true
|
|
||||||
artifacts:
|
|
||||||
paths:
|
|
||||||
- uniworx:exe:uniworxload.nar.xz
|
|
||||||
name: "${CI_JOB_NAME}-${CI_COMMIT_SHORT_SHA}"
|
|
||||||
expire_in: "1 day"
|
|
||||||
retry: 2
|
|
||||||
interruptible: true
|
|
||||||
|
|
||||||
check:
|
release:changelog:
|
||||||
stage: test
|
stage: release
|
||||||
script:
|
|
||||||
- xzcat frontend.nar.xz | nix-store --import
|
|
||||||
- xzcat uniworx:lib:uniworx.nar.xz | nix-store --import
|
|
||||||
- nix -L flake check .
|
|
||||||
before_script: *nix-before
|
|
||||||
needs:
|
|
||||||
- job: node dependencies # transitive
|
|
||||||
artifacts: false
|
|
||||||
- job: well known # transitive
|
|
||||||
artifacts: false
|
|
||||||
- job: frontend
|
|
||||||
artifacts: true
|
|
||||||
- job: uniworx:lib:uniworx
|
|
||||||
artifacts: true
|
|
||||||
retry: 2
|
|
||||||
interruptible: true
|
|
||||||
|
|
||||||
container:
|
|
||||||
stage: container:build
|
|
||||||
script:
|
|
||||||
- xzcat uniworx:exe:uniworx.nar.xz | nix-store --import
|
|
||||||
- cp -pr --reflink=auto -L $(nix build --print-out-paths ".#uniworxDocker") uniworx.tar.gz
|
|
||||||
before_script: *nix-before
|
|
||||||
needs:
|
|
||||||
- job: node dependencies # transitive
|
|
||||||
artifacts: false
|
|
||||||
- job: well known # transitive
|
|
||||||
artifacts: false
|
|
||||||
- job: frontend # tranitive
|
|
||||||
artifacts: false
|
|
||||||
- job: uniworx:lib:uniworx # transitive
|
|
||||||
artifacts: false
|
|
||||||
- job: uniworx:exe:uniworx
|
|
||||||
artifacts: true
|
|
||||||
- job: check # sanity
|
|
||||||
artifacts: false
|
|
||||||
artifacts:
|
|
||||||
paths:
|
|
||||||
- uniworx.tar.gz
|
|
||||||
name: "${CI_JOB_NAME}-${CI_COMMIT_SHORT_SHA}"
|
|
||||||
expire_in: "1 day"
|
|
||||||
retry: 2
|
|
||||||
interruptible: true
|
|
||||||
rules: &release-rules
|
rules: &release-rules
|
||||||
- if: $CI_COMMIT_TAG =~ /^v/
|
- if: $CI_COMMIT_TAG =~ /^v[0-9\.]+$/
|
||||||
test container:
|
- if: $CI_COMMIT_TAG =~ /^v[0-9\.]+-test-.*$/
|
||||||
stage: container:build
|
|
||||||
script:
|
script:
|
||||||
- xzcat uniworx:exe:uniworx.nar.xz | nix-store --import
|
- echo "Preparing release..."
|
||||||
- cp -pr --reflink=auto -L $(nix build --print-out-paths ".#uniworxTestDocker") uniworx.tar.gz
|
- ./.gitlab-ci/version.pl > .current-version
|
||||||
before_script: *nix-before
|
|
||||||
needs:
|
|
||||||
- job: node dependencies # transitive
|
|
||||||
artifacts: false
|
|
||||||
- job: well known # transitive
|
|
||||||
artifacts: false
|
|
||||||
- job: frontend # tranitive
|
|
||||||
artifacts: false
|
|
||||||
- job: uniworx:lib:uniworx # transitive
|
|
||||||
artifacts: false
|
|
||||||
- job: uniworx:exe:uniworx
|
|
||||||
artifacts: true
|
|
||||||
- job: check # sanity
|
|
||||||
artifacts: false
|
|
||||||
artifacts:
|
|
||||||
paths:
|
|
||||||
- uniworx.tar.gz
|
|
||||||
name: "${CI_JOB_NAME}-${CI_COMMIT_SHORT_SHA}"
|
|
||||||
expire_in: "1 day"
|
|
||||||
retry: 2
|
|
||||||
interruptible: true
|
|
||||||
rules: &test-release-rules
|
|
||||||
- if: $CI_COMMIT_TAG =~ /^t/
|
|
||||||
|
|
||||||
parse changelog:
|
|
||||||
stage: prepare release
|
|
||||||
needs:
|
|
||||||
- job: node dependencies
|
|
||||||
artifacts: true
|
|
||||||
rules: *release-rules
|
|
||||||
before_script: *nix-before
|
|
||||||
script:
|
|
||||||
- xzcat node-dependencies.nar.xz | nix-store --import
|
|
||||||
- nix -L run ".#jqChangelogJson" -- -r '.versions[0].version' > .current-version
|
|
||||||
- nix -L run ".#jqChangelogJson" -- -r '.versions[0].body' > .current-changelog.md
|
|
||||||
- echo "VERSION=$(cat .current-version)" >> build.env
|
- echo "VERSION=$(cat .current-version)" >> build.env
|
||||||
|
- ./.gitlab-ci/version.pl -changelog CHANGELOG.md
|
||||||
artifacts:
|
artifacts:
|
||||||
reports:
|
reports:
|
||||||
dotenv: build.env
|
dotenv: build.env
|
||||||
paths:
|
paths:
|
||||||
- .current-version
|
- .current-version
|
||||||
- .current-changelog.md
|
- .changelog.md
|
||||||
name: "changelog-${CI_COMMIT_SHORT_SHA}"
|
name: "changelog-${CI_COMMIT_SHORT_SHA}"
|
||||||
expire_in: "1 day"
|
expire_in: "1 day"
|
||||||
retry: 2
|
|
||||||
interruptible: true
|
|
||||||
parse test changelog:
|
|
||||||
stage: prepare release
|
|
||||||
needs:
|
|
||||||
- job: node dependencies
|
|
||||||
artifacts: true
|
|
||||||
rules: *test-release-rules
|
|
||||||
before_script: *nix-before
|
|
||||||
script:
|
|
||||||
- xzcat node-dependencies.nar.xz | nix-store --import
|
|
||||||
- nix -L run ".#jqChangelogJson" -- -r '.versions[0].version' > .current-version
|
|
||||||
- nix -L run ".#jqChangelogJson" -- -r '.versions[0].body' > .current-changelog.md
|
|
||||||
- echo "VERSION=$(cat .current-version)" >> build.env
|
|
||||||
artifacts:
|
|
||||||
reports:
|
|
||||||
dotenv: build.env
|
|
||||||
paths:
|
|
||||||
- .current-version
|
|
||||||
- .current-changelog.md
|
|
||||||
name: "changelog-${CI_COMMIT_SHORT_SHA}"
|
|
||||||
expire_in: "1 day"
|
|
||||||
retry: 2
|
|
||||||
interruptible: true
|
|
||||||
|
|
||||||
upload container:
|
release:container:
|
||||||
variables:
|
|
||||||
GIT_STRATEGY: none
|
|
||||||
stage: release
|
stage: release
|
||||||
image: quay.io/skopeo/stable:latest
|
|
||||||
script:
|
|
||||||
- skopeo --insecure-policy copy --dest-creds "${CI_REGISTRY_USER}:${CI_JOB_TOKEN}" docker-archive://$(pwd)/uniworx.tar.gz docker://${CI_REGISTRY_IMAGE}:${VERSION}
|
|
||||||
- skopeo --insecure-policy copy --src-creds "${CI_REGISTRY_USER}:${CI_JOB_TOKEN}" --dest-creds "${CI_REGISTRY_USER}:${CI_JOB_TOKEN}" docker://${CI_REGISTRY_IMAGE}:${VERSION} docker://${CI_REGISTRY_IMAGE}:latest
|
|
||||||
needs:
|
|
||||||
- job: node dependencies # transitive
|
|
||||||
artifacts: false
|
|
||||||
- job: well known # transitive
|
|
||||||
artifacts: false
|
|
||||||
- job: frontend # tranitive
|
|
||||||
artifacts: false
|
|
||||||
- job: uniworx:lib:uniworx # transitive
|
|
||||||
artifacts: false
|
|
||||||
- job: uniworx:exe:uniworx # transitive
|
|
||||||
artifacts: false
|
|
||||||
- job: container
|
|
||||||
artifacts: true
|
|
||||||
- job: parse changelog
|
|
||||||
artifacts: true
|
|
||||||
- job: check # sanity
|
|
||||||
artifacts: false
|
|
||||||
rules: *release-rules
|
rules: *release-rules
|
||||||
retry: 2
|
|
||||||
upload test container:
|
|
||||||
variables:
|
variables:
|
||||||
GIT_STRATEGY: none
|
GIT_STRATEGY: none
|
||||||
stage: release
|
image: ${IMAGE_BUILDER}
|
||||||
image: quay.io/skopeo/stable:latest
|
|
||||||
script:
|
script:
|
||||||
- skopeo --insecure-policy copy --dest-creds "${CI_REGISTRY_USER}:${CI_JOB_TOKEN}" docker-archive://$(pwd)/uniworx.tar.gz docker://${CI_REGISTRY}/fradrive/fradrive/test:${CI_COMMIT_REF_NAME}
|
- echo "Building container for release ${VERSION}..."
|
||||||
- skopeo --insecure-policy copy --src-creds "${CI_REGISTRY_USER}:${CI_JOB_TOKEN}" --dest-creds "${CI_REGISTRY_USER}:${CI_JOB_TOKEN}" docker://${CI_REGISTRY}/fradrive/fradrive/test:${CI_COMMIT_REF_NAME} docker://${CI_REGISTRY}/fradrive/fradrive/test:latest
|
- buildah bud --tag fradrive:${VERSION} --file docker/fradrive/Dockerfile
|
||||||
|
- buildah add --chown uniworx:uniworx bin/uniworx /bin/uniworx
|
||||||
|
- echo "Pushing container ${VERSION} to container registry..."
|
||||||
|
- buildah push --creds "${CI_REGISTRY_USER}:${CI_JOB_TOKEN}" fradrive:${VERSION} ${CI_REGISTRY_IMAGE}/fradrive:${VERSION}
|
||||||
needs:
|
needs:
|
||||||
- job: node dependencies # transitive
|
- frontend # sanity
|
||||||
artifacts: false
|
- backend:prod # sanity
|
||||||
- job: well known # transitive
|
- release:changelog
|
||||||
artifacts: false
|
|
||||||
- job: frontend # tranitive
|
|
||||||
artifacts: false
|
|
||||||
- job: uniworx:lib:uniworx # transitive
|
|
||||||
artifacts: false
|
|
||||||
- job: uniworx:exe:uniworx # transitive
|
|
||||||
artifacts: false
|
|
||||||
- job: test container
|
|
||||||
artifacts: true
|
|
||||||
- job: parse test changelog
|
|
||||||
artifacts: true
|
|
||||||
- job: check # sanity
|
|
||||||
artifacts: false
|
|
||||||
rules: *test-release-rules
|
|
||||||
retry: 2
|
|
||||||
|
|
||||||
release:
|
release:release:
|
||||||
variables:
|
|
||||||
GIT_STRATEGY: none
|
|
||||||
stage: release
|
stage: release
|
||||||
image: registry.gitlab.com/gitlab-org/release-cli:latest
|
|
||||||
rules: *release-rules
|
rules: *release-rules
|
||||||
script:
|
|
||||||
- echo "Will create release ${VERSION}..."
|
|
||||||
release:
|
|
||||||
name: '$VERSION'
|
|
||||||
tag_name: '$CI_COMMIT_TAG'
|
|
||||||
description: .current-changelog.md
|
|
||||||
needs:
|
|
||||||
- job: check # sanity
|
|
||||||
artifacts: false
|
|
||||||
- job: parse changelog
|
|
||||||
artifacts: true
|
|
||||||
test release:
|
|
||||||
variables:
|
variables:
|
||||||
GIT_STRATEGY: none
|
GIT_STRATEGY: none
|
||||||
stage: release
|
|
||||||
image: registry.gitlab.com/gitlab-org/release-cli:latest
|
image: registry.gitlab.com/gitlab-org/release-cli:latest
|
||||||
rules: *test-release-rules
|
|
||||||
script:
|
script:
|
||||||
- echo "Will create test release ${VERSION}-test..."
|
- echo "Creating release ${VERSION}"
|
||||||
release:
|
release:
|
||||||
name: "${VERSION}-test"
|
name: "${VERSION}"
|
||||||
tag_name: '$CI_COMMIT_TAG'
|
tag_name: "{$CI_COMMIT_TAG}"
|
||||||
description: .current-changelog.md
|
description: .changelog.md
|
||||||
needs:
|
needs:
|
||||||
- job: check # sanity
|
- frontend # sanity
|
||||||
artifacts: false
|
- backend:prod # sanity
|
||||||
- job: parse test changelog
|
- release:changelog
|
||||||
artifacts: true
|
- release:container
|
||||||
|
retry: 0
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# frontend dependencies:
|
||||||
|
# stage: setup
|
||||||
|
# cache:
|
||||||
|
# - &npm-cache
|
||||||
|
# key: default-npm
|
||||||
|
# paths: &npm-paths
|
||||||
|
# - node_modules/
|
||||||
|
# - .npm/
|
||||||
|
# - .npmrc
|
||||||
|
# script:
|
||||||
|
# - make node_modules
|
||||||
|
# artifacts:
|
||||||
|
# paths: *npm-paths
|
||||||
|
|
||||||
|
# well-known:
|
||||||
|
# stage: setup
|
||||||
|
# script:
|
||||||
|
# - make well-known
|
||||||
|
# needs:
|
||||||
|
# - job: frontend dependencies
|
||||||
|
# artifacts: true
|
||||||
|
# cache:
|
||||||
|
# - &frontend-cache
|
||||||
|
# key: default-frontend
|
||||||
|
# paths:
|
||||||
|
# - .well-known-cache
|
||||||
|
# artifacts:
|
||||||
|
# paths:
|
||||||
|
# - well-known/
|
||||||
|
# - .well-known-cache/
|
||||||
|
|
||||||
|
# # TODO: cache is always uploaded even if up-to-date; prevent re-upload when up-to-date
|
||||||
|
# backend dependencies:
|
||||||
|
# stage: setup
|
||||||
|
# cache:
|
||||||
|
# - &stack-cache
|
||||||
|
# key: default-stack
|
||||||
|
# paths:
|
||||||
|
# - .stack/
|
||||||
|
# - .stack-work/
|
||||||
|
# script:
|
||||||
|
# - make backend-dependencies-prod
|
||||||
|
# artifacts:
|
||||||
|
# paths:
|
||||||
|
# - .stack/
|
||||||
|
# - .stack-work/
|
||||||
|
|
||||||
|
# frontend build:
|
||||||
|
# stage: build
|
||||||
|
# cache:
|
||||||
|
# - *frontend-cache
|
||||||
|
# script:
|
||||||
|
# - make frontend-build
|
||||||
|
# needs:
|
||||||
|
# - job: frontend dependencies
|
||||||
|
# artifacts: true
|
||||||
|
# - job: well-known
|
||||||
|
# artifacts: true
|
||||||
|
# artifacts:
|
||||||
|
# paths:
|
||||||
|
# - static/
|
||||||
|
# - config/webpack.yml
|
||||||
|
|
||||||
|
# # TODO: .stack-work cache not working
|
||||||
|
# backend build:
|
||||||
|
# stage: build
|
||||||
|
# cache:
|
||||||
|
# - *stack-cache
|
||||||
|
# script:
|
||||||
|
# - make bin/uniworx
|
||||||
|
# # - find .stack-work
|
||||||
|
# # - cp $(stack path --dist-dir)/build/hlint/hlint bin/test-hlint
|
||||||
|
# # - cp $(stack path --dist-dir)/build/yesod/yesod bin/test-yesod
|
||||||
|
# needs:
|
||||||
|
# - job: frontend dependencies # transitive
|
||||||
|
# artifacts: false
|
||||||
|
# - job: well-known
|
||||||
|
# artifacts: true
|
||||||
|
# - job: backend dependencies
|
||||||
|
# artifacts: true
|
||||||
|
# - job: frontend build
|
||||||
|
# artifacts: true
|
||||||
|
# artifacts:
|
||||||
|
# paths:
|
||||||
|
# - bin/
|
||||||
|
# resource_group: ram
|
||||||
|
|
||||||
|
# # TODO: part of backend build; probably deprecated
|
||||||
|
# # uniworxdb:
|
||||||
|
# # stage: build
|
||||||
|
# # script:
|
||||||
|
# # - make bin/uniworxdb
|
||||||
|
# # needs:
|
||||||
|
# # # TODO: no frontend needed
|
||||||
|
# # - job: frontend dependencies # transitive
|
||||||
|
# # artifacts: false
|
||||||
|
# # - job: frontend build # transitive
|
||||||
|
# # artifacts: false
|
||||||
|
# # artifacts:
|
||||||
|
# # paths:
|
||||||
|
# # - bin/uniworxdb
|
||||||
|
|
||||||
|
# # TODO: part of backend build; probably deprecated
|
||||||
|
# # TODO: rewrite
|
||||||
|
# # uniworx:exe:uniworxload:
|
||||||
|
# # stage: build
|
||||||
|
# # script:
|
||||||
|
# # - xzcat uniworx:lib:uniworx.nar.xz | nix-store --import
|
||||||
|
# # - nix -L build -o result ".#uniworx:exe:uniworxload"
|
||||||
|
# # - nix-store --export $(nix-store -qR result) | xz -T0 -2 > uniworx:exe:uniworxload.nar.xz
|
||||||
|
# # needs:
|
||||||
|
# # - job: frontend dependencies # transitive
|
||||||
|
# # artifacts: false
|
||||||
|
# # - job: frontend build # transitive
|
||||||
|
# # artifacts: false
|
||||||
|
# # artifacts:
|
||||||
|
# # paths:
|
||||||
|
# # - uniworx:exe:uniworxload.nar.xz
|
||||||
|
|
||||||
|
# frontend lint:
|
||||||
|
# stage: lint
|
||||||
|
# script:
|
||||||
|
# - make frontend-lint
|
||||||
|
# cache:
|
||||||
|
# - *frontend-cache
|
||||||
|
# needs:
|
||||||
|
# - job: frontend dependencies
|
||||||
|
# artifacts: true
|
||||||
|
# - job: well-known # TODO: is this really needed?
|
||||||
|
# artifacts: true
|
||||||
|
|
||||||
|
# backend lint:
|
||||||
|
# stage: lint
|
||||||
|
# cache:
|
||||||
|
# - *stack-cache
|
||||||
|
# script:
|
||||||
|
# # TODO: - make backend-lint-dev
|
||||||
|
# - make backend-lint-prod
|
||||||
|
# needs:
|
||||||
|
# - job: backend dependencies
|
||||||
|
# artifacts: true
|
||||||
|
# - job: backend build
|
||||||
|
# artifacts: true
|
||||||
|
# - job: frontend build
|
||||||
|
# artifacts: true
|
||||||
|
# - job: well-known
|
||||||
|
# artifacts: true
|
||||||
|
|
||||||
|
# frontend test:
|
||||||
|
# stage: test
|
||||||
|
# script:
|
||||||
|
# - make frontend-test
|
||||||
|
# cache: *frontend-cache
|
||||||
|
# needs:
|
||||||
|
# - job: frontend dependencies
|
||||||
|
# artifacts: true
|
||||||
|
# # TODO: configure report artifacts
|
||||||
|
|
||||||
|
# backend test:
|
||||||
|
# stage: test
|
||||||
|
# script:
|
||||||
|
# - make backend-test-prod
|
||||||
|
# cache: *stack-cache
|
||||||
|
# needs:
|
||||||
|
# - job: well-known
|
||||||
|
# artifacts: true
|
||||||
|
# - job: frontend build
|
||||||
|
# artifacts: true
|
||||||
|
# - job: backend dependencies
|
||||||
|
# artifacts: true
|
||||||
|
# - job: backend build
|
||||||
|
# artifacts: true
|
||||||
|
# # TODO: configure report artifacts
|
||||||
|
|
||||||
|
# # TODO: unify prod and test versions
|
||||||
|
# # TODO: rewrite
|
||||||
|
# container:
|
||||||
|
# stage: container
|
||||||
|
# script:
|
||||||
|
# - xzcat uniworx:exe:uniworx.nar.xz | nix-store --import
|
||||||
|
# - cp -pr --reflink=auto -L $(nix build --print-out-paths ".#uniworxDocker") uniworx.tar.gz
|
||||||
|
# needs:
|
||||||
|
# - job: frontend dependencies # transitive
|
||||||
|
# artifacts: false
|
||||||
|
# - job: frontend build # transitive
|
||||||
|
# artifacts: false
|
||||||
|
# - job: frontend test # sanity
|
||||||
|
# artifacts: false
|
||||||
|
# - job: backend test # sanity
|
||||||
|
# artifacts: false
|
||||||
|
# artifacts:
|
||||||
|
# paths:
|
||||||
|
# - uniworx.tar.gz
|
||||||
|
# rules: &release-rules
|
||||||
|
# - if: $CI_COMMIT_TAG =~ /^v/
|
||||||
|
# # TODO: rewrite
|
||||||
|
# test container:
|
||||||
|
# stage: container
|
||||||
|
# script:
|
||||||
|
# - xzcat uniworx:exe:uniworx.nar.xz | nix-store --import
|
||||||
|
# - cp -pr --reflink=auto -L $(nix build --print-out-paths ".#uniworxTestDocker") uniworx.tar.gz
|
||||||
|
# needs:
|
||||||
|
# - job: frontend dependencies # transitive
|
||||||
|
# artifacts: false
|
||||||
|
# - job: frontend build # transitive
|
||||||
|
# artifacts: false
|
||||||
|
# - job: frontend test # sanity
|
||||||
|
# artifacts: false
|
||||||
|
# - job: backend test # sanity
|
||||||
|
# artifacts: false
|
||||||
|
# artifacts:
|
||||||
|
# paths:
|
||||||
|
# - uniworx.tar.gz
|
||||||
|
# rules: &test-release-rules
|
||||||
|
# - if: $CI_COMMIT_TAG =~ /^t/
|
||||||
|
|
||||||
|
# # TODO: unify prod and test versions
|
||||||
|
# # TODO: rewrite
|
||||||
|
# parse changelog:
|
||||||
|
# stage: prepare release
|
||||||
|
# needs:
|
||||||
|
# - job: frontend dependencies
|
||||||
|
# artifacts: true
|
||||||
|
# rules: *release-rules
|
||||||
|
# script:
|
||||||
|
# - xzcat node-dependencies.nar.xz | nix-store --import
|
||||||
|
# - nix -L run ".#jqChangelogJson" -- -r '.versions[0].version' > .current-version
|
||||||
|
# - nix -L run ".#jqChangelogJson" -- -r '.versions[0].body' > .current-changelog.md
|
||||||
|
# - echo "VERSION=$(cat .current-version)" >> build.env
|
||||||
|
# artifacts:
|
||||||
|
# reports:
|
||||||
|
# dotenv: build.env
|
||||||
|
# paths:
|
||||||
|
# - .current-version
|
||||||
|
# - .current-changelog.md
|
||||||
|
# name: "changelog-${CI_COMMIT_SHORT_SHA}"
|
||||||
|
# expire_in: "1 day"
|
||||||
|
# # TODO: rewrite
|
||||||
|
# parse test changelog:
|
||||||
|
# stage: prepare release
|
||||||
|
# needs:
|
||||||
|
# - job: frontend dependencies
|
||||||
|
# artifacts: true
|
||||||
|
# rules: *test-release-rules
|
||||||
|
# script:
|
||||||
|
# - xzcat node-dependencies.nar.xz | nix-store --import
|
||||||
|
# - nix -L run ".#jqChangelogJson" -- -r '.versions[0].version' > .current-version
|
||||||
|
# - nix -L run ".#jqChangelogJson" -- -r '.versions[0].body' > .current-changelog.md
|
||||||
|
# - echo "VERSION=$(cat .current-version)" >> build.env
|
||||||
|
# artifacts:
|
||||||
|
# reports:
|
||||||
|
# dotenv: build.env
|
||||||
|
# paths:
|
||||||
|
# - .current-version
|
||||||
|
# - .current-changelog.md
|
||||||
|
# name: "changelog-${CI_COMMIT_SHORT_SHA}"
|
||||||
|
|
||||||
|
# # TODO: unify prod and test versions
|
||||||
|
# # TODO: rewrite
|
||||||
|
# upload container:
|
||||||
|
# variables:
|
||||||
|
# GIT_STRATEGY: none
|
||||||
|
# stage: release
|
||||||
|
# image: quay.io/skopeo/stable:latest
|
||||||
|
# script:
|
||||||
|
# - skopeo --insecure-policy copy --dest-creds "${CI_REGISTRY_USER}:${CI_JOB_TOKEN}" docker-archive://$(pwd)/uniworx.tar.gz docker://${CI_REGISTRY_IMAGE}:${VERSION}
|
||||||
|
# - skopeo --insecure-policy copy --src-creds "${CI_REGISTRY_USER}:${CI_JOB_TOKEN}" --dest-creds "${CI_REGISTRY_USER}:${CI_JOB_TOKEN}" docker://${CI_REGISTRY_IMAGE}:${VERSION} docker://${CI_REGISTRY_IMAGE}:latest
|
||||||
|
# needs:
|
||||||
|
# - job: frontend dependencies # transitive
|
||||||
|
# artifacts: false
|
||||||
|
# - job: frontend build # transitive
|
||||||
|
# artifacts: false
|
||||||
|
# - job: container
|
||||||
|
# artifacts: true
|
||||||
|
# - job: parse changelog
|
||||||
|
# artifacts: true
|
||||||
|
# - job: frontend test # sanity
|
||||||
|
# artifacts: false
|
||||||
|
# - job: backend test # sanity
|
||||||
|
# artifacts: false
|
||||||
|
# rules: *release-rules
|
||||||
|
# # TODO: rewrite
|
||||||
|
# upload test container:
|
||||||
|
# variables:
|
||||||
|
# GIT_STRATEGY: none
|
||||||
|
# stage: release
|
||||||
|
# image: quay.io/skopeo/stable:latest
|
||||||
|
# script:
|
||||||
|
# - skopeo --insecure-policy copy --dest-creds "${CI_REGISTRY_USER}:${CI_JOB_TOKEN}" docker-archive://$(pwd)/uniworx.tar.gz docker://${CI_REGISTRY}/fradrive/fradrive/test:${CI_COMMIT_REF_NAME}
|
||||||
|
# - skopeo --insecure-policy copy --src-creds "${CI_REGISTRY_USER}:${CI_JOB_TOKEN}" --dest-creds "${CI_REGISTRY_USER}:${CI_JOB_TOKEN}" docker://${CI_REGISTRY}/fradrive/fradrive/test:${CI_COMMIT_REF_NAME} docker://${CI_REGISTRY}/fradrive/fradrive/test:latest
|
||||||
|
# needs:
|
||||||
|
# - job: frontend dependencies # transitive
|
||||||
|
# artifacts: false
|
||||||
|
# - job: frontend build # transitive
|
||||||
|
# artifacts: false
|
||||||
|
# - job: test container
|
||||||
|
# artifacts: true
|
||||||
|
# - job: parse test changelog
|
||||||
|
# artifacts: true
|
||||||
|
# - job: frontend test # sanity
|
||||||
|
# artifacts: false
|
||||||
|
# - job: backend test # sanity
|
||||||
|
# artifacts: false
|
||||||
|
# rules: *test-release-rules
|
||||||
|
|
||||||
|
# # TODO: unify prod and test versions
|
||||||
|
# # TODO: rewrite
|
||||||
|
# release:
|
||||||
|
# variables:
|
||||||
|
# GIT_STRATEGY: none
|
||||||
|
# stage: release
|
||||||
|
# image: registry.gitlab.com/gitlab-org/release-cli:latest
|
||||||
|
# rules: *release-rules
|
||||||
|
# script:
|
||||||
|
# - echo "Will create release ${VERSION}..."
|
||||||
|
# release:
|
||||||
|
# name: '$VERSION'
|
||||||
|
# tag_name: '$CI_COMMIT_TAG'
|
||||||
|
# description: .current-changelog.md
|
||||||
|
# needs:
|
||||||
|
# - job: frontend test # sanity
|
||||||
|
# artifacts: false
|
||||||
|
# - job: backend test # sanity
|
||||||
|
# artifacts: false
|
||||||
|
# - job: parse changelog
|
||||||
|
# artifacts: true
|
||||||
|
# retry: 0
|
||||||
|
# # TODO: rewrite
|
||||||
|
# test release:
|
||||||
|
# variables:
|
||||||
|
# GIT_STRATEGY: none
|
||||||
|
# stage: release
|
||||||
|
# image: registry.gitlab.com/gitlab-org/release-cli:latest
|
||||||
|
# rules: *test-release-rules
|
||||||
|
# script:
|
||||||
|
# - echo "Will create test release ${VERSION}-test..."
|
||||||
|
# release:
|
||||||
|
# name: "${VERSION}-test"
|
||||||
|
# tag_name: '$CI_COMMIT_TAG'
|
||||||
|
# description: .current-changelog.md
|
||||||
|
# needs:
|
||||||
|
# - job: frontend test # sanity
|
||||||
|
# artifacts: false
|
||||||
|
# - job: backend test # sanity
|
||||||
|
# artifacts: false
|
||||||
|
# - job: parse test changelog
|
||||||
|
# artifacts: true
|
||||||
|
# retry: 0
|
||||||
|
|||||||
77
.gitlab-ci/backend.yml
Normal file
77
.gitlab-ci/backend.yml
Normal file
@ -0,0 +1,77 @@
|
|||||||
|
# SPDX-FileCopyrightText: 2024 Sarah Vaupel <sarah.vaupel@uniworx.de>
|
||||||
|
#
|
||||||
|
# SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
|
|
||||||
|
### IMPORTANT NOTICE ###
|
||||||
|
# Our pipeline consists of static and dynamic parts.
|
||||||
|
#
|
||||||
|
# This file only contains the dynamic backend parts of our pipeline.
|
||||||
|
# Static jobs are defined in .gitlab-ci.yml.
|
||||||
|
#
|
||||||
|
# The marker "#dyn#" (without quotes) will be replaced by concrete values.
|
||||||
|
###
|
||||||
|
|
||||||
|
variables:
|
||||||
|
BACKEND_IMAGE_VERSION: #dyn#
|
||||||
|
PARENT_PIPELINE_ID: #dyn#
|
||||||
|
|
||||||
|
stages:
|
||||||
|
- compile
|
||||||
|
- lint
|
||||||
|
- test
|
||||||
|
- release
|
||||||
|
|
||||||
|
default:
|
||||||
|
image:
|
||||||
|
name: ${CI_REGISTRY_IMAGE}/${CI_COMMIT_REF_SLUG}/backend:${BACKEND_IMAGE_VERSION}
|
||||||
|
entrypoint: [""]
|
||||||
|
docker:
|
||||||
|
platform: x86_64
|
||||||
|
before_script:
|
||||||
|
- ./.gitlab-ci/pull-frontend-artifacts.pl "${REGISTRY_AUTH_TOKEN}" "${PARENT_PIPELINE_ID}"
|
||||||
|
- unzip ./.artifacts.tmp/artifacts.zip
|
||||||
|
artifacts:
|
||||||
|
name: "${CI_JOB_NAME}-${CI_COMMIT_SHORT_SHA}"
|
||||||
|
expire_in: "1 day"
|
||||||
|
retry: 2
|
||||||
|
interruptible: true
|
||||||
|
|
||||||
|
|
||||||
|
compile:
|
||||||
|
stage: compile
|
||||||
|
script:
|
||||||
|
- make -- compile${PROD_BUILD}-backend IN_CI=true IN_CONTAINER=true
|
||||||
|
artifacts:
|
||||||
|
paths:
|
||||||
|
- ${CI_PROJECT_DIR}/.stack-work/
|
||||||
|
- bin/
|
||||||
|
cache: &backend-cache
|
||||||
|
|
||||||
|
lint:
|
||||||
|
stage: lint
|
||||||
|
script:
|
||||||
|
- make -- lint${PROD_BUILD}-backend IN_CI=true IN_CONTAINER=true
|
||||||
|
cache: *backend-cache
|
||||||
|
|
||||||
|
test:
|
||||||
|
stage: test
|
||||||
|
needs:
|
||||||
|
- compile
|
||||||
|
script:
|
||||||
|
- make -- test${PROD_BUILD}-backend IN_CI=true IN_CONTAINER=true
|
||||||
|
cache: *backend-cache
|
||||||
|
|
||||||
|
container:
|
||||||
|
stage: release
|
||||||
|
image: ${IMAGE_BUILDER}
|
||||||
|
needs:
|
||||||
|
- compile
|
||||||
|
- lint
|
||||||
|
- test
|
||||||
|
script:
|
||||||
|
- IMAGE_TAG=`./.gitlab-ci/version.pl`
|
||||||
|
- buildah bud -t ${IMAGE_TAG} --volume ${CI_PROJECT_DIR}/bin/:/tmp/uniworx-bin --file docker/fradrive/Dockerfile
|
||||||
|
- buildah push --creds "${CI_REGISTRY_USER}:${CI_JOB_TOKEN}" ${IMAGE_TAG} ${CI_REGISTRY_IMAGE}/${IMAGE_TAG}
|
||||||
|
rules:
|
||||||
|
- if: '"${PROD_BUILD}" == "-prod"'
|
||||||
|
when: always
|
||||||
@ -1,25 +0,0 @@
|
|||||||
diff --git a/src/libstore/filetransfer.cc b/src/libstore/filetransfer.cc
|
|
||||||
index 514ab3bf9..25dab18bb 100644
|
|
||||||
--- a/src/libstore/filetransfer.cc
|
|
||||||
+++ b/src/libstore/filetransfer.cc
|
|
||||||
@@ -696,6 +696,8 @@ struct curlFileTransfer : public FileTransfer
|
|
||||||
std::string scheme = get(params, "scheme").value_or("");
|
|
||||||
std::string endpoint = get(params, "endpoint").value_or("");
|
|
||||||
|
|
||||||
+ debug("enqueueFileTransfer: scheme: %s", scheme);
|
|
||||||
+
|
|
||||||
S3Helper s3Helper(profile, region, scheme, endpoint);
|
|
||||||
|
|
||||||
// FIXME: implement ETag
|
|
||||||
diff --git a/src/libstore/s3-binary-cache-store.cc b/src/libstore/s3-binary-cache-store.cc
|
|
||||||
index 6bfbee044..ff406e5e4 100644
|
|
||||||
--- a/src/libstore/s3-binary-cache-store.cc
|
|
||||||
+++ b/src/libstore/s3-binary-cache-store.cc
|
|
||||||
@@ -126,6 +126,7 @@ ref<Aws::Client::ClientConfiguration> S3Helper::makeConfig(const string & region
|
|
||||||
initAWS();
|
|
||||||
auto res = make_ref<Aws::Client::ClientConfiguration>();
|
|
||||||
res->region = region;
|
|
||||||
+ debug("configuring scheme %s", scheme);
|
|
||||||
if (!scheme.empty()) {
|
|
||||||
res->scheme = Aws::Http::SchemeMapper::FromString(scheme.c_str());
|
|
||||||
}
|
|
||||||
@ -1,3 +0,0 @@
|
|||||||
SPDX-FileCopyrightText: 2022 Gregor Kleen <gregor.kleen@ifi.lmu.de>
|
|
||||||
|
|
||||||
SPDX-License-Identifier: AGPL-3.0-or-later
|
|
||||||
43
.gitlab-ci/dynamci.pl
Executable file
43
.gitlab-ci/dynamci.pl
Executable file
@ -0,0 +1,43 @@
|
|||||||
|
#!/usr/bin/env perl
|
||||||
|
|
||||||
|
use strict;
|
||||||
|
use warnings;
|
||||||
|
|
||||||
|
my %kv = ();
|
||||||
|
|
||||||
|
for(@ARGV) {
|
||||||
|
if(!m#^\s*([^=\s]+)\s*=\s*(.*?)\s*$#) {
|
||||||
|
die "$0: Bad parameter '$_': Not a key=value pair\n"
|
||||||
|
}
|
||||||
|
$kv{$1} = $2;
|
||||||
|
}
|
||||||
|
|
||||||
|
my $invar = 0;
|
||||||
|
|
||||||
|
LOOP: while(my $line = <STDIN>) {
|
||||||
|
if(1==$invar) {
|
||||||
|
if($line=~m/^(\s+)(\S+)(\s*:\s*)(\S+)(.*)/) {
|
||||||
|
my ($pre1, $key, $pre2, $var, $post) = ($1, $2, $3, $4, $5);
|
||||||
|
if('#dyn#' eq $var) {
|
||||||
|
if(not exists $kv{$key}) {
|
||||||
|
die "$0: No value given for key '$key' in the parameters but it is defined in input!\n"
|
||||||
|
}
|
||||||
|
my $v = $kv{$key};
|
||||||
|
delete $kv{$key};
|
||||||
|
print "$pre1$key$pre2$v$post\n";
|
||||||
|
next LOOP;
|
||||||
|
}
|
||||||
|
} elsif($line=~m/^[^#\t ]/) {
|
||||||
|
$invar = 2
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(0==$invar and $line=~m#^\s*variables\s*:\s*$#) {
|
||||||
|
$invar = 1;
|
||||||
|
}
|
||||||
|
print $line;
|
||||||
|
}
|
||||||
|
|
||||||
|
my @rem = sort keys %kv;
|
||||||
|
|
||||||
|
die "$0: Variables occur in parameter but not in input: @rem!\n" if @rem;
|
||||||
|
|
||||||
@ -1,13 +0,0 @@
|
|||||||
diff --git a/src/libstore/s3-binary-cache-store.cc b/src/libstore/s3-binary-cache-store.cc
|
|
||||||
index 6bfbee044..51d86c4e6 100644
|
|
||||||
--- a/src/libstore/s3-binary-cache-store.cc
|
|
||||||
+++ b/src/libstore/s3-binary-cache-store.cc
|
|
||||||
@@ -209,7 +209,7 @@ struct S3BinaryCacheStoreImpl : virtual S3BinaryCacheStoreConfig, public virtual
|
|
||||||
S3Helper s3Helper;
|
|
||||||
|
|
||||||
S3BinaryCacheStoreImpl(
|
|
||||||
- const std::string & scheme,
|
|
||||||
+ const std::string & uriScheme,
|
|
||||||
const std::string & bucketName,
|
|
||||||
const Params & params)
|
|
||||||
: StoreConfig(params)
|
|
||||||
@ -1,3 +0,0 @@
|
|||||||
SPDX-FileCopyrightText: 2022 Gregor Kleen <gregor.kleen@ifi.lmu.de>
|
|
||||||
|
|
||||||
SPDX-License-Identifier: AGPL-3.0-or-later
|
|
||||||
63
.gitlab-ci/frontend.yml
Normal file
63
.gitlab-ci/frontend.yml
Normal file
@ -0,0 +1,63 @@
|
|||||||
|
# SPDX-FileCopyrightText: 2024 Sarah Vaupel <sarah.vaupel@uniworx.de>
|
||||||
|
#
|
||||||
|
# SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
|
|
||||||
|
### IMPORTANT NOTICE ###
|
||||||
|
# Our pipeline consists of static and dynamic parts.
|
||||||
|
#
|
||||||
|
# This file only contains the dynamic frontend parts of our pipeline.
|
||||||
|
# Static jobs are defined in .gitlab-ci.yml.
|
||||||
|
#
|
||||||
|
# The marker "#dyn#" (without quotes) will be replaced by concrete values.
|
||||||
|
###
|
||||||
|
|
||||||
|
variables:
|
||||||
|
FRONTEND_IMAGE_VERSION: #dyn#
|
||||||
|
|
||||||
|
stages:
|
||||||
|
- compile
|
||||||
|
- lint
|
||||||
|
- test
|
||||||
|
|
||||||
|
default:
|
||||||
|
image:
|
||||||
|
name: ${CI_REGISTRY_IMAGE}/${CI_COMMIT_REF_SLUG}/frontend:${FRONTEND_IMAGE_VERSION}
|
||||||
|
entrypoint: [""]
|
||||||
|
docker:
|
||||||
|
platform: x86_64
|
||||||
|
artifacts:
|
||||||
|
name: "${CI_JOB_NAME}-${CI_COMMIT_SHORT_SHA}"
|
||||||
|
expire_in: "1 day"
|
||||||
|
retry: 2
|
||||||
|
interruptible: true
|
||||||
|
|
||||||
|
|
||||||
|
compile:
|
||||||
|
stage: compile
|
||||||
|
script:
|
||||||
|
- make -- compile-frontend IN_CI=true IN_CONTAINER=true
|
||||||
|
artifacts:
|
||||||
|
paths:
|
||||||
|
- ${CI_PROJECT_DIR}/node_modules
|
||||||
|
- ${CI_PROJECT_DIR}/well-known
|
||||||
|
- ${CI_PROJECT_DIR}/config/webpack.yml
|
||||||
|
cache:
|
||||||
|
- &frontend-cache
|
||||||
|
key: default-frontend
|
||||||
|
paths:
|
||||||
|
- ${CI_PROJECT_DIR}/.npm/
|
||||||
|
- ${CI_PROJECT_DIR}/.well-known-cache/
|
||||||
|
|
||||||
|
lint:
|
||||||
|
stage: lint
|
||||||
|
script:
|
||||||
|
- make -- lint-frontend IN_CI=true IN_CONTAINER=true
|
||||||
|
cache: *frontend-cache
|
||||||
|
|
||||||
|
test:
|
||||||
|
stage: test
|
||||||
|
needs:
|
||||||
|
- compile
|
||||||
|
script:
|
||||||
|
- make -- test-frontend IN_CI=true IN_CONTAINER=true
|
||||||
|
cache: *frontend-cache
|
||||||
@ -1,11 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
|
|
||||||
# SPDX-FileCopyrightText: 2022 Gregor Kleen <gregor.kleen@ifi.lmu.de>
|
|
||||||
#
|
|
||||||
# SPDX-License-Identifier: AGPL-3.0-or-later
|
|
||||||
|
|
||||||
#!/usr/bin/bash
|
|
||||||
|
|
||||||
export MC_HOST_minio=http://$(cat /minio-gitlab-runner-cache/accesskey):$(cat /minio-gitlab-runner-cache/secretkey)@minio-gitlab-runner-cache
|
|
||||||
|
|
||||||
mc mb --ignore-existing minio/nix-cache
|
|
||||||
@ -1,8 +0,0 @@
|
|||||||
# SPDX-FileCopyrightText: 2022 Gregor Kleen <gregor.kleen@ifi.lmu.de>
|
|
||||||
#
|
|
||||||
# SPDX-License-Identifier: AGPL-3.0-or-later
|
|
||||||
|
|
||||||
{ pkgs ? import <nixpkgs> {} }:
|
|
||||||
pkgs.nixUnstable.overrideAttrs (oldAttrs: {
|
|
||||||
patches = oldAttrs.patches or [] ++ [ ./fix-aws-scheme.patch ];
|
|
||||||
})
|
|
||||||
52
.gitlab-ci/pull-frontend-artifacts.pl
Executable file
52
.gitlab-ci/pull-frontend-artifacts.pl
Executable file
@ -0,0 +1,52 @@
|
|||||||
|
#!/usr/bin/env perl
|
||||||
|
|
||||||
|
use strict;
|
||||||
|
use warnings;
|
||||||
|
|
||||||
|
my $dir = ".artifacts.tmp";
|
||||||
|
my ($token, $id) = @ARGV;
|
||||||
|
die "usage: $0 [token] [id]" unless defined $token and defined $id;
|
||||||
|
die "id in bad format" unless $id=~m#^[0-9]+$#;
|
||||||
|
|
||||||
|
if(!-d $dir) {
|
||||||
|
mkdir($dir) or die "Cannot create directory '$dir', because: $!\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
system(qq(curl --globoff --header "PRIVATE-TOKEN: $token" "https://gitlab.uniworx.de/api/v4/projects/5/pipelines/$id/bridges" > $dir/bridges));
|
||||||
|
my $pips = pparse("$dir/bridges", {id=>qq#."downstream_pipeline"."id"#}, {name=>""});
|
||||||
|
|
||||||
|
my $fe = $pips->{frontend}{id};
|
||||||
|
|
||||||
|
die "No frontend pipeline found!" unless $fe;
|
||||||
|
|
||||||
|
system(qq(curl --globoff --header "PRIVATE-TOKEN: $token" "https://gitlab.uniworx.de/api/v4/projects/5/pipelines/$fe/jobs" > $dir/fe-jobs));
|
||||||
|
my $arte = pparse("$dir/fe-jobs", {id=>""}, {name=>"", web_url=>"", artifacts=>""});
|
||||||
|
|
||||||
|
system(qq#curl --output $dir/artifacts.zip --location --header "PRIVATE-TOKEN: $token" "https://gitlab.uniworx.de/api/v4/projects/5/jobs/$arte->{compile}{id}/artifacts"#);
|
||||||
|
|
||||||
|
|
||||||
|
sub pparse {
|
||||||
|
my ($file, $numerical, $alpha) = @_;
|
||||||
|
my %all = ();
|
||||||
|
for my $k(keys %$numerical) {
|
||||||
|
$all{$k} = $numerical->{$k} || qq#."$k"#;
|
||||||
|
}
|
||||||
|
for my $k(keys %$alpha) {
|
||||||
|
$all{$k} = $alpha->{$k} || qq#."$k"#;
|
||||||
|
}
|
||||||
|
my $select = join ', ', map {qq#"$_": $all{$_}#} sort keys %all;
|
||||||
|
my $cont = qx(cat $file | jq -c '.[] | {$select}');
|
||||||
|
my @cont = split m/\R/, $cont;
|
||||||
|
my %ret = ();
|
||||||
|
for my $c(@cont) {
|
||||||
|
my %block = ();
|
||||||
|
for(keys %$numerical) {
|
||||||
|
$block{$_} = $1 if $c=~m#"$_":([0-9]+)#;
|
||||||
|
}
|
||||||
|
for(keys %$alpha) {
|
||||||
|
$block{$_} = $1 if $c=~m#"$_":"([^"]*)"#;
|
||||||
|
}
|
||||||
|
$ret{$block{name}} =\%block;
|
||||||
|
}
|
||||||
|
return \%ret
|
||||||
|
}
|
||||||
@ -1,14 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
|
|
||||||
# SPDX-FileCopyrightText: 2022 Gregor Kleen <gregor.kleen@ifi.lmu.de>
|
|
||||||
#
|
|
||||||
# SPDX-License-Identifier: AGPL-3.0-or-later
|
|
||||||
|
|
||||||
#!/usr/bin/bash
|
|
||||||
|
|
||||||
set -eu
|
|
||||||
set -f # disable globbing
|
|
||||||
export IFS=' '
|
|
||||||
|
|
||||||
echo "Signing and uploading paths" $OUT_PATHS
|
|
||||||
exec nix copy --to "s3://nix-cache?region=us-east-1&scheme=http&endpoint=minio-gitlab-runner-cache&secret-key=${NIX_CACHE_KEYFILE}" $OUT_PATHS
|
|
||||||
@ -1,14 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
|
|
||||||
# SPDX-FileCopyrightText: 2022 Gregor Kleen <gregor.kleen@ifi.lmu.de>
|
|
||||||
#
|
|
||||||
# SPDX-License-Identifier: AGPL-3.0-or-later
|
|
||||||
|
|
||||||
#!/usr/bin/bash
|
|
||||||
|
|
||||||
mkdir -p $(dirname ${AWS_SHARED_CREDENTIALS_FILE})
|
|
||||||
cat > ${AWS_SHARED_CREDENTIALS_FILE} <<EOF
|
|
||||||
[default]
|
|
||||||
aws_access_key_id = $(cat /minio-gitlab-runner-cache/accesskey)
|
|
||||||
aws_secret_access_key = $(cat /minio-gitlab-runner-cache/secretkey)
|
|
||||||
EOF
|
|
||||||
28
.gnumake/Error.Mak
Normal file
28
.gnumake/Error.Mak
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
# This Makefile contains targets that are deprecated, commonly mispelled or otherwise "faulty".
|
||||||
|
|
||||||
|
################################
|
||||||
|
##### DEPRECATED TARGETS #####
|
||||||
|
|
||||||
|
# Deprecated since: 2024-10-18
|
||||||
|
.PHONY: serve
|
||||||
|
.PHONY: serve-%
|
||||||
|
serve-%: serve;
|
||||||
|
serve:
|
||||||
|
@echo "The serve targets have been deprecated. Please use the new start (and stop) targets instead."
|
||||||
|
@exit 1
|
||||||
|
|
||||||
|
##### DEPRECATED TARGETS #####
|
||||||
|
################################
|
||||||
|
|
||||||
|
#############################
|
||||||
|
##### COMMON MISTAKES #####
|
||||||
|
|
||||||
|
.PHONY: build
|
||||||
|
.PHONY: build-%
|
||||||
|
build-%: build;
|
||||||
|
build:
|
||||||
|
@echo "No recipe for build. Did you mean compile?"
|
||||||
|
@exit 1
|
||||||
|
|
||||||
|
##### COMMON MISTAKES #####
|
||||||
|
#############################
|
||||||
12
.npmrc.gup
12
.npmrc.gup
@ -1,12 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
|
|
||||||
set -e
|
|
||||||
|
|
||||||
if command -V gup 1>&- 2>&-; then
|
|
||||||
gup --always
|
|
||||||
fi
|
|
||||||
|
|
||||||
cat >${1:-.npmrc} <<EOF
|
|
||||||
@fortawesome:registry=https://npm.fontawesome.com/
|
|
||||||
//npm.fontawesome.com/:_authToken=${FONTAWESOME_NPM_AUTH_TOKEN}
|
|
||||||
EOF
|
|
||||||
9
.reuse/dep5
Normal file
9
.reuse/dep5
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
|
||||||
|
Upstream-Name: FraDrive
|
||||||
|
Upstream-Contact: Sarah Vaupel <sarah.vaupel@uniworx.de>
|
||||||
|
Source: https://gitlab.uniworx.de/fradrive/fradrive
|
||||||
|
|
||||||
|
Files: assets/fonts/fradrive/*
|
||||||
|
Copyright: 2010 Google Corporation with Reserved Font Arimo, Tinos and Cousine
|
||||||
|
Copyright: 2012 Red Hat, Inc. with Reserved Font Name Liberation
|
||||||
|
License: OFL-1.1-RFN
|
||||||
@ -7,33 +7,33 @@ const standardVersionUpdaterYaml = require.resolve('standard-version-updater-yam
|
|||||||
module.exports = {
|
module.exports = {
|
||||||
scripts: {
|
scripts: {
|
||||||
// postbump: './sync-versions.hs && git add -- package.yaml', // moved to bumpFiles
|
// postbump: './sync-versions.hs && git add -- package.yaml', // moved to bumpFiles
|
||||||
postchangelog: 'sed \'s/^### \\[/## [/g\' -i CHANGELOG.md'
|
postchangelog: 'sed \'s/^### \\[/## [/g\' -i CHANGELOG.md',
|
||||||
},
|
},
|
||||||
packageFiles: ['package.json', 'package.yaml'],
|
packageFiles: ['package.json', 'package.yaml'],
|
||||||
bumpFiles: [
|
bumpFiles: [
|
||||||
{
|
{
|
||||||
filename: 'package.json',
|
filename: 'package.json',
|
||||||
type: 'json'
|
type: 'json',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
filename: 'package-lock.json',
|
filename: 'package-lock.json',
|
||||||
type: 'json'
|
type: 'json',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
filename: 'package.yaml',
|
filename: 'package.yaml',
|
||||||
updater: standardVersionUpdaterYaml
|
updater: standardVersionUpdaterYaml,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
filename: 'nix/docker/version.json',
|
filename: 'nix/docker/version.json',
|
||||||
type: 'json'
|
type: 'json',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
filename: 'nix/docker/demo-version.json',
|
filename: 'nix/docker/demo-version.json',
|
||||||
type: 'json'
|
type: 'json',
|
||||||
}
|
},
|
||||||
],
|
],
|
||||||
commitUrlFormat: 'https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/{{hash}}',
|
commitUrlFormat: 'https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/{{hash}}',
|
||||||
compareUrlFormat: 'https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/compare/{{previousTag}}...{{currentTag}}',
|
compareUrlFormat: 'https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/compare/{{previousTag}}...{{currentTag}}',
|
||||||
issueUrlFormat: 'https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/issues/{{id}}',
|
issueUrlFormat: 'https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/issues/{{id}}',
|
||||||
userUrlFormat: 'https://gitlab2.rz.ifi.lmu.de/{{user}}'
|
userUrlFormat: 'https://gitlab2.rz.ifi.lmu.de/{{user}}',
|
||||||
};
|
};
|
||||||
|
|||||||
72
CHANGELOG.md
72
CHANGELOG.md
@ -216,6 +216,78 @@ All notable changes to this project will be documented in this file. See [standa
|
|||||||
* **i18n:** fix some bad plurals ([890f8ad](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/890f8ad8b60115533faa6b99f4c4504243cbfb1d))
|
* **i18n:** fix some bad plurals ([890f8ad](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/890f8ad8b60115533faa6b99f4c4504243cbfb1d))
|
||||||
* **lint:** remove minor superfluous dollar ([64a1233](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/64a123387f3539b73649d02a6ecd97de577097e6))
|
* **lint:** remove minor superfluous dollar ([64a1233](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/64a123387f3539b73649d02a6ecd97de577097e6))
|
||||||
* **qualification:** fix [#159](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/issues/159) by removing an misleadingly named column for user qualification table ([fd6a538](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/fd6a5384d3517958a3c7726e32eed3bad197a591))
|
* **qualification:** fix [#159](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/issues/159) by removing an misleadingly named column for user qualification table ([fd6a538](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/fd6a5384d3517958a3c7726e32eed3bad197a591))
|
||||||
|
## [v27.4.59-test-g0.0.17](https://fraport@dev.azure.com/fraport/Fahrerausbildung/_git/FRADrive//compare/v27.4.59-test-f0.0.17...v27.4.59-test-g0.0.17) (2025-02-18)
|
||||||
|
|
||||||
|
## [v27.4.59-test-f0.0.17](https://fraport@dev.azure.com/fraport/Fahrerausbildung/_git/FRADrive//compare/v27.4.59-test-g0.0.16...v27.4.59-test-f0.0.17) (2025-02-17)
|
||||||
|
|
||||||
|
## [v27.4.59-test-g0.0.16](https://fraport@dev.azure.com/fraport/Fahrerausbildung/_git/FRADrive//compare/v27.4.59-test-f0.0.16...v27.4.59-test-g0.0.16) (2025-02-16)
|
||||||
|
|
||||||
|
## [v27.4.59-test-f0.0.16](https://fraport@dev.azure.com/fraport/Fahrerausbildung/_git/FRADrive//compare/v27.4.59-test-f0.0.15...v27.4.59-test-f0.0.16) (2025-02-16)
|
||||||
|
|
||||||
|
## [v27.4.59-test-f0.0.15](https://fraport@dev.azure.com/fraport/Fahrerausbildung/_git/FRADrive//compare/v27.4.59-test-e0.0.15...v27.4.59-test-f0.0.15) (2025-02-15)
|
||||||
|
|
||||||
|
## [v27.4.59-test-e0.0.15](https://fraport@dev.azure.com/fraport/Fahrerausbildung/_git/FRADrive//compare/v27.4.59-test-f0.0.14...v27.4.59-test-e0.0.15) (2025-02-14)
|
||||||
|
|
||||||
|
## [v27.4.59-test-f0.0.14](https://fraport@dev.azure.com/fraport/Fahrerausbildung/_git/FRADrive//compare/v27.4.59-test-e0.0.14...v27.4.59-test-f0.0.14) (2025-02-14)
|
||||||
|
|
||||||
|
## [v27.4.59-test-e0.0.14](https://fraport@dev.azure.com/fraport/Fahrerausbildung/_git/FRADrive//compare/v27.4.59-test-e0.0.13...v27.4.59-test-e0.0.14) (2025-02-13)
|
||||||
|
|
||||||
|
## [v27.4.59-test-e0.0.13](https://fraport@dev.azure.com/fraport/Fahrerausbildung/_git/FRADrive//compare/v27.4.59-test-e0.0.12...v27.4.59-test-e0.0.13) (2025-02-12)
|
||||||
|
|
||||||
|
## [v27.4.59-test-e0.0.12](https://fraport@dev.azure.com/fraport/Fahrerausbildung/_git/FRADrive//compare/v27.4.59-test-d0.0.12...v27.4.59-test-e0.0.12) (2025-02-12)
|
||||||
|
|
||||||
|
## [v27.4.59-test-d0.0.12](https://fraport@dev.azure.com/fraport/Fahrerausbildung/_git/FRADrive//compare/v27.4.59-test-d0.0.11...v27.4.59-test-d0.0.12) (2025-02-11)
|
||||||
|
|
||||||
|
## [v27.4.59-test-d0.0.11](https://fraport@dev.azure.com/fraport/Fahrerausbildung/_git/FRADrive//compare/v27.4.59-test-c0.0.11...v27.4.59-test-d0.0.11) (2025-02-11)
|
||||||
|
|
||||||
|
## [v27.4.59-test-c0.0.11](https://fraport@dev.azure.com/fraport/Fahrerausbildung/_git/FRADrive//compare/v27.4.59-test-b0.0.11...v27.4.59-test-c0.0.11) (2025-02-11)
|
||||||
|
|
||||||
|
## [v27.4.59-test-b0.0.11](https://fraport@dev.azure.com/fraport/Fahrerausbildung/_git/FRADrive//compare/v27.4.59-test-c0.0.10...v27.4.59-test-b0.0.11) (2025-02-11)
|
||||||
|
|
||||||
|
## [v27.4.59-test-c0.0.10](https://fraport@dev.azure.com/fraport/Fahrerausbildung/_git/FRADrive//compare/v27.4.59-test-b0.0.10...v27.4.59-test-c0.0.10) (2025-02-11)
|
||||||
|
|
||||||
|
## [v27.4.59-test-b0.0.10](https://fraport@dev.azure.com/fraport/Fahrerausbildung/_git/FRADrive//compare/v27.4.59-test-a0.0.10...v27.4.59-test-b0.0.10) (2025-02-11)
|
||||||
|
|
||||||
|
## [v27.4.59-test-a0.0.10](https://fraport@dev.azure.com/fraport/Fahrerausbildung/_git/FRADrive//compare/v27.4.59-test-a0.0.9...v27.4.59-test-a0.0.10) (2025-02-11)
|
||||||
|
|
||||||
|
## [v27.4.59-test-a0.0.9](https://fraport@dev.azure.com/fraport/Fahrerausbildung/_git/FRADrive//compare/v27.4.59-test-a0.0.8...v27.4.59-test-a0.0.9) (2025-02-10)
|
||||||
|
|
||||||
|
## [v27.4.59-test-a0.0.8](https://fraport@dev.azure.com/fraport/Fahrerausbildung/_git/FRADrive//compare/v27.4.59-test-a0.0.7...v27.4.59-test-a0.0.8) (2025-02-10)
|
||||||
|
|
||||||
|
## [v27.4.59-test-a0.0.7](https://fraport@dev.azure.com/fraport/Fahrerausbildung/_git/FRADrive//compare/v27.4.59-test-a0.0.6...v27.4.59-test-a0.0.7) (2025-02-10)
|
||||||
|
|
||||||
|
## [v27.4.59-test-a0.0.6](https://fraport@dev.azure.com/fraport/Fahrerausbildung/_git/FRADrive//compare/v27.4.59-test-a0.0.5...v27.4.59-test-a0.0.6) (2025-02-08)
|
||||||
|
|
||||||
|
## [v27.4.59-test-a0.0.5](https://fraport@dev.azure.com/fraport/Fahrerausbildung/_git/FRADrive//compare/v27.4.59-test-a0.0.4...v27.4.59-test-a0.0.5) (2025-02-07)
|
||||||
|
|
||||||
|
## [v27.4.59-test-a0.0.4](https://fraport@dev.azure.com/fraport/Fahrerausbildung/_git/FRADrive//compare/v27.4.59-test-a0.0.3...v27.4.59-test-a0.0.4) (2025-02-07)
|
||||||
|
|
||||||
|
## [v27.4.59-test-a0.0.3](https://fraport@dev.azure.com/fraport/Fahrerausbildung/_git/FRADrive//compare/v27.4.59-test-a0.0.2...v27.4.59-test-a0.0.3) (2025-02-06)
|
||||||
|
|
||||||
|
## [v27.4.59-test-a0.0.2](https://fraport@dev.azure.com/fraport/Fahrerausbildung/_git/FRADrive//compare/v27.4.59-test-a0.0.1...v27.4.59-test-a0.0.2) (2025-02-05)
|
||||||
|
|
||||||
|
## [v27.4.59-test-a0.0.1](https://fraport@dev.azure.com/fraport/Fahrerausbildung/_git/FRADrive//compare/v27.4.59-test-a0.0.0...v27.4.59-test-a0.0.1) (2025-02-05)
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* **ghci:** ghci works now as expected ([c3117db](https://fraport@dev.azure.com/fraport/Fahrerausbildung/_git/FRADrive/commit/c3117dbdcd1de9ef9f0751afa45018e2ebce2c42))
|
||||||
|
|
||||||
|
## [v27.4.59-test-a0.0.0](https://fraport@dev.azure.com/fraport/Fahrerausbildung/_git/FRADrive//compare/v27.4.59...v27.4.59-test-a0.0.0) (2024-10-25)
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* **util script:** Util script for renaming of files added. ([caf8fec](https://fraport@dev.azure.com/fraport/Fahrerausbildung/_git/FRADrive/commit/caf8fec5acb94df16293bf9aa0cdab766f8829e8))
|
||||||
|
* **frontend:** load icons from svg files ([22781e1](https://fraport@dev.azure.com/fraport/Fahrerausbildung/_git/FRADrive/commit/22781e1565e890cf6c5b40973146b0334cb667aa))
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* **stack.yaml:** move to uniworx.de gitlab ([55484e6](https://fraport@dev.azure.com/fraport/Fahrerausbildung/_git/FRADrive/commit/55484e631b786ea3710d322282019baf5292c243))
|
||||||
|
* **utils/renamer:** Mehr outputs nur im verbose-Fall. ([ac30cb9](https://fraport@dev.azure.com/fraport/Fahrerausbildung/_git/FRADrive/commit/ac30cb9e6712d0ee3f204da4863d1e2509af8a76))
|
||||||
|
* **utils:** Verboseparameter -v hinzugefuegt; rekursives makedir; genauere Meldungen. ([1806d9f](https://fraport@dev.azure.com/fraport/Fahrerausbildung/_git/FRADrive/commit/1806d9f01fc4a0746d2f9df42ef1ee6827c7fa09))
|
||||||
|
* **Dockerfile:** change rights of source dir to env user ([e7a8183](https://fraport@dev.azure.com/fraport/Fahrerausbildung/_git/FRADrive/commit/e7a8183656ae419cfee2942543045c6fa6a9caa3))
|
||||||
|
* **Makefile:** add missing dependency on well-known for backend-builds ([a09dc59](https://fraport@dev.azure.com/fraport/Fahrerausbildung/_git/FRADrive/commit/a09dc59f260843f8815c382576bb5254d21104bf))
|
||||||
|
* **frontend:** fixed icon colour in table headers ([4c4571d](https://fraport@dev.azure.com/fraport/Fahrerausbildung/_git/FRADrive/commit/4c4571d2d0879e89f2572eba6015d34a7f4794c8))
|
||||||
|
* **doc:** minor haddock problems ([d4f8a6c](https://fraport@dev.azure.com/fraport/Fahrerausbildung/_git/FRADrive/commit/d4f8a6c77b2a4a4540935f7f0beca0d0605508c8))
|
||||||
|
|
||||||
## [27.4.59](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/compare/v27.4.58...v27.4.59) (2024-02-13)
|
## [27.4.59](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/compare/v27.4.58...v27.4.59) (2024-02-13)
|
||||||
|
|
||||||
|
|||||||
102
LICENSES/OFL-1.1-RFN.txt
Normal file
102
LICENSES/OFL-1.1-RFN.txt
Normal file
@ -0,0 +1,102 @@
|
|||||||
|
Digitized data copyright (c) 2010 Google Corporation
|
||||||
|
with Reserved Font Arimo, Tinos and Cousine.
|
||||||
|
Copyright (c) 2012 Red Hat, Inc.
|
||||||
|
with Reserved Font Name Liberation.
|
||||||
|
|
||||||
|
This Font Software is licensed under the SIL Open Font License,
|
||||||
|
Version 1.1.
|
||||||
|
|
||||||
|
This license is copied below, and is also available with a FAQ at:
|
||||||
|
http://scripts.sil.org/OFL
|
||||||
|
|
||||||
|
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
|
||||||
|
|
||||||
|
PREAMBLE The goals of the Open Font License (OFL) are to stimulate
|
||||||
|
worldwide development of collaborative font projects, to support the font
|
||||||
|
creation efforts of academic and linguistic communities, and to provide
|
||||||
|
a free and open framework in which fonts may be shared and improved in
|
||||||
|
partnership with others.
|
||||||
|
|
||||||
|
The OFL allows the licensed fonts to be used, studied, modified and
|
||||||
|
redistributed freely as long as they are not sold by themselves.
|
||||||
|
The fonts, including any derivative works, can be bundled, embedded,
|
||||||
|
redistributed and/or sold with any software provided that any reserved
|
||||||
|
names are not used by derivative works. The fonts and derivatives,
|
||||||
|
however, cannot be released under any other type of license. The
|
||||||
|
requirement for fonts to remain under this license does not apply to
|
||||||
|
any document created using the fonts or their derivatives.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
DEFINITIONS
|
||||||
|
"Font Software" refers to the set of files released by the Copyright
|
||||||
|
Holder(s) under this license and clearly marked as such.
|
||||||
|
This may include source files, build scripts and documentation.
|
||||||
|
|
||||||
|
"Reserved Font Name" refers to any names specified as such after the
|
||||||
|
copyright statement(s).
|
||||||
|
|
||||||
|
"Original Version" refers to the collection of Font Software components
|
||||||
|
as distributed by the Copyright Holder(s).
|
||||||
|
|
||||||
|
"Modified Version" refers to any derivative made by adding to, deleting,
|
||||||
|
or substituting ? in part or in whole ?
|
||||||
|
any of the components of the Original Version, by changing formats or
|
||||||
|
by porting the Font Software to a new environment.
|
||||||
|
|
||||||
|
"Author" refers to any designer, engineer, programmer, technical writer
|
||||||
|
or other person who contributed to the Font Software.
|
||||||
|
|
||||||
|
|
||||||
|
PERMISSION & CONDITIONS
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a
|
||||||
|
copy of the Font Software, to use, study, copy, merge, embed, modify,
|
||||||
|
redistribute, and sell modified and unmodified copies of the Font
|
||||||
|
Software, subject to the following conditions:
|
||||||
|
|
||||||
|
1) Neither the Font Software nor any of its individual components,in
|
||||||
|
Original or Modified Versions, may be sold by itself.
|
||||||
|
|
||||||
|
2) Original or Modified Versions of the Font Software may be bundled,
|
||||||
|
redistributed and/or sold with any software, provided that each copy
|
||||||
|
contains the above copyright notice and this license. These can be
|
||||||
|
included either as stand-alone text files, human-readable headers or
|
||||||
|
in the appropriate machine-readable metadata fields within text or
|
||||||
|
binary files as long as those fields can be easily viewed by the user.
|
||||||
|
|
||||||
|
3) No Modified Version of the Font Software may use the Reserved Font
|
||||||
|
Name(s) unless explicit written permission is granted by the
|
||||||
|
corresponding Copyright Holder. This restriction only applies to the
|
||||||
|
primary font name as presented to the users.
|
||||||
|
|
||||||
|
4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
|
||||||
|
Software shall not be used to promote, endorse or advertise any
|
||||||
|
Modified Version, except to acknowledge the contribution(s) of the
|
||||||
|
Copyright Holder(s) and the Author(s) or with their explicit written
|
||||||
|
permission.
|
||||||
|
|
||||||
|
5) The Font Software, modified or unmodified, in part or in whole, must
|
||||||
|
be distributed entirely under this license, and must not be distributed
|
||||||
|
under any other license. The requirement for fonts to remain under
|
||||||
|
this license does not apply to any document created using the Font
|
||||||
|
Software.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
TERMINATION
|
||||||
|
This license becomes null and void if any of the above conditions are not met.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
DISCLAIMER
|
||||||
|
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||||
|
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
|
||||||
|
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
|
||||||
|
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
|
||||||
|
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||||
|
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
|
||||||
|
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||||
|
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER
|
||||||
|
DEALINGS IN THE FONT SOFTWARE.
|
||||||
|
|
||||||
425
Makefile
Normal file
425
Makefile
Normal file
@ -0,0 +1,425 @@
|
|||||||
|
|
||||||
|
export SHELL=bash
|
||||||
|
|
||||||
|
# MAKE=make -f Makefile-loggingsymbols
|
||||||
|
# MAKE=make -d
|
||||||
|
|
||||||
|
# System information
|
||||||
|
export CPU_CORES = $(shell cat /proc/cpuinfo | grep '^processor' | wc -l)
|
||||||
|
|
||||||
|
export CONTAINER_COMMAND ?= podman
|
||||||
|
export CONTAINER_BGRUN ?= $(CONTAINER_COMMAND) run -dit --network=host --replace
|
||||||
|
export CONTAINER_FGRUN ?= $(CONTAINER_COMMAND) run -it --network=host --replace
|
||||||
|
|
||||||
|
export IMAGE_REGISTRY = docker.io
|
||||||
|
export MEMCACHED_IMAGE = $(IMAGE_REGISTRY)/memcached:latest
|
||||||
|
export MINIO_IMAGE = $(IMAGE_REGISTRY)/minio/minio:latest
|
||||||
|
export MAILDEV_IMAGE = $(IMAGE_REGISTRY)/maildev/maildev:latest # TODO: needs different port than 1025 to avoid conflicts
|
||||||
|
|
||||||
|
export IN_CONTAINER ?= false
|
||||||
|
export IN_CI ?= false
|
||||||
|
export CONTAINER_FILE
|
||||||
|
export CONTAINER_IDENT
|
||||||
|
export CF_PREFIX
|
||||||
|
export DEVELOP
|
||||||
|
export CONTAINER_ATTACHED
|
||||||
|
export CONTAINER_INIT
|
||||||
|
export CONTAINER_CLEANUP
|
||||||
|
export PROJECT_DIR=/fradrive
|
||||||
|
|
||||||
|
export SERVICE
|
||||||
|
export SERVICE_VARIANT ?= $(SERVICE)
|
||||||
|
export JOB
|
||||||
|
export IMAGE
|
||||||
|
export SET_IMAGE
|
||||||
|
export ENTRYPOINT
|
||||||
|
export EXEC_OPTS
|
||||||
|
|
||||||
|
export STACK_CORES = $(shell echo $(($(CPU_CORES)/2)))
|
||||||
|
export BASE_PORTS
|
||||||
|
export UNIWORXDB_OPTS ?= -cf
|
||||||
|
export PROD ?= false
|
||||||
|
export SRC
|
||||||
|
|
||||||
|
ifneq ($(PROD),true)
|
||||||
|
export --DEVELOPMENT=--flag uniworx:dev
|
||||||
|
endif
|
||||||
|
|
||||||
|
export DATE := $(shell date +'%Y-%m-%dT%H-%M-%S')
|
||||||
|
|
||||||
|
export CURR_DEV = $(shell cat develop/.current 2>/dev/null)
|
||||||
|
export SET_DEVELOP = $(eval DEVELOP=develop/$$(CURR_DEV))
|
||||||
|
export NEW_DEVELOP = $(eval DEVELOP=develop/$$(DATE))
|
||||||
|
|
||||||
|
|
||||||
|
.PHONY: help
|
||||||
|
# HELP: print out this help message
|
||||||
|
help:
|
||||||
|
@if [ -z "$$(which perl 2>/dev/null)" ] ; then \
|
||||||
|
$(CONTAINER_FGRUN) .:/mnt 'debian:12.5' '/mnt/utils/makehelp.pl' '/mnt/Makefile' ; \
|
||||||
|
else \
|
||||||
|
utils/makehelp.pl Makefile ; \
|
||||||
|
fi
|
||||||
|
|
||||||
|
.PHONY: clean
|
||||||
|
# HELP: stop all running containers and remove all compilation results in the directory (but leave images including dependencies unharmed)
|
||||||
|
clean:
|
||||||
|
rm -rf develop
|
||||||
|
-rm -rf node_modules .npm .cache assets/icons assets/favicons static well-known config/manifest.json frontend/src/env.sass
|
||||||
|
-rm -rf .stack-work .stack-work.lock
|
||||||
|
-rm -rf bin .Dockerfile develop
|
||||||
|
-$(CONTAINER_COMMAND) container prune --force
|
||||||
|
.PHONY: clean-images
|
||||||
|
# HELP: stop all running containers and clean all images from local repositories
|
||||||
|
clean-images:
|
||||||
|
rm -rf develop
|
||||||
|
sleep 5
|
||||||
|
-$(CONTAINER_COMMAND) system prune --all --force --volumes
|
||||||
|
-$(CONTAINER_COMMAND) image prune --all --force
|
||||||
|
-$(CONTAINER_COMMAND) volume prune --force
|
||||||
|
.PHONY: clean-all
|
||||||
|
# HELP: like clean but with full container, image, and volume prune
|
||||||
|
clean-all: clean-images
|
||||||
|
-rm -rf .stack
|
||||||
|
|
||||||
|
.PHONY: release
|
||||||
|
# HELP: create, commit and push a new release
|
||||||
|
# TODO: only release when build and tests are passing!!!
|
||||||
|
release:
|
||||||
|
VERSION=`./utils/version.pl -changelog CHANGELOG.md -v` ; \
|
||||||
|
git add CHANGELOG.md ; \
|
||||||
|
git commit -m "chore(release): $${VERSION}" ; \
|
||||||
|
git push ; \
|
||||||
|
git tag $${VERSION} ; \
|
||||||
|
git push origin $${VERSION}
|
||||||
|
|
||||||
|
.PHONY: compile
|
||||||
|
# HELP: perform full compilation (frontend and backend)
|
||||||
|
compile:
|
||||||
|
$(MAKE) compile-frontend
|
||||||
|
$(MAKE) compile-backend
|
||||||
|
|
||||||
|
.PHONY: start
|
||||||
|
# HELP: start complete development environment with a fresh test database
|
||||||
|
start:
|
||||||
|
$(MAKE) start-postgres
|
||||||
|
$(MAKE) start-memcached
|
||||||
|
$(MAKE) start-minio
|
||||||
|
$(MAKE) compile-frontend
|
||||||
|
$(MAKE) compile-uniworxdb
|
||||||
|
$(MAKE) start-backend
|
||||||
|
|
||||||
|
.PHONY: %-backend
|
||||||
|
%-backend: SERVICE=backend
|
||||||
|
%-backend: SERVICE_VARIANT=backend
|
||||||
|
%-backend: IMAGE=localhost/fradrive/backend
|
||||||
|
%-backend: BASE_PORTS = "DEV_PORT_HTTP=3000" "DEV_PORT_HTTPS=3443"
|
||||||
|
|
||||||
|
.PHONY: %-uniworxdb
|
||||||
|
%-uniworxdb: SERVICE=backend
|
||||||
|
%-uniworxdb: SERVICE_VARIANT=uniworxdb
|
||||||
|
%-uniworxdb: IMAGE=localhost/fradrive/backend
|
||||||
|
|
||||||
|
.PHONY: %-ghci
|
||||||
|
%-ghci: SERVICE=backend
|
||||||
|
%-ghci: SERVICE_VARIANT=ghci
|
||||||
|
%-ghci: IMAGE=localhost/fradrive/backend
|
||||||
|
|
||||||
|
.PHONY: %-hoogle
|
||||||
|
%-hoogle: SERVICE=backend
|
||||||
|
%-hoogle: SERVICE_VARIANT=hoogle
|
||||||
|
%-hoogle: BASE_PORTS = "HOOGLE_PORT=8081"
|
||||||
|
%-hoogle: IMAGE=localhost/fradrive/backend
|
||||||
|
--start-hoogle:
|
||||||
|
HOOGLE_PORT=`cat $(CONTAINER_FILE) | grep 'HOOGLE_PORT=' | sed 's/HOOGLE_PORT=//'` ; \
|
||||||
|
stack $(STACK_CORES) hoogle -- server --local --port $${HOOGLE_PORT}
|
||||||
|
|
||||||
|
.PHONY: %-frontend
|
||||||
|
%-frontend: SERVICE=frontend
|
||||||
|
%-frontend: SERVICE_VARIANT=frontend
|
||||||
|
%-frontend: IMAGE=localhost/fradrive/frontend
|
||||||
|
|
||||||
|
.PHONY: %-postgres
|
||||||
|
%-postgres: SERVICE=postgres
|
||||||
|
%-postgres: SERVICE_VARIANT=postgres
|
||||||
|
%-postgres: BASE_PORTS = "PGPORT=5432"
|
||||||
|
%-postgres: IMAGE=localhost/fradrive/postgres
|
||||||
|
|
||||||
|
.PHONY: %-memcached
|
||||||
|
%-memcached: SERVICE=memcached
|
||||||
|
%-memcached: SERVICE_VARIANT=memcached
|
||||||
|
%-memcached: SET_IMAGE=$$(MEMCACHED_IMAGE) --port=`cat $$(CONTAINER_FILE) | grep 'MEMCACHED_PORT=' | sed 's/MEMCACHED_PORT=//'`
|
||||||
|
%-memcached: BASE_PORTS = "MEMCACHED_PORT=11211"
|
||||||
|
|
||||||
|
.PHONY: %-minio
|
||||||
|
%-minio: SERVICE=minio
|
||||||
|
%-minio: SERVICE_VARIANT=minio
|
||||||
|
%-minio: SET_IMAGE=$$(MINIO_IMAGE) -- server `mktemp` --address=:`cat $$(CONTAINER_FILE) | grep 'UPLOAD_S3_PORT=' | sed 's/UPLOAD_S3_PORT=//'`
|
||||||
|
%-minio: BASE_PORTS = "UPLOAD_S3_PORT=9000"
|
||||||
|
|
||||||
|
.PHONY: start-%
|
||||||
|
start-%: JOB=start
|
||||||
|
start-%: CF_PREFIX = start-
|
||||||
|
start-%: CONTAINER_ATTACHED = false
|
||||||
|
start-%: --act ;
|
||||||
|
|
||||||
|
.PHONY: compile-%
|
||||||
|
compile-%: JOB=compile
|
||||||
|
compile-%: CF_PREFIX = compile-
|
||||||
|
compile-%: CONTAINER_ATTACHED = true
|
||||||
|
compile-%: --act ;
|
||||||
|
|
||||||
|
.PHONY: dependencies-%
|
||||||
|
dependencies-%: JOB=dependencies
|
||||||
|
dependencies-%: CF_PREFIX = dependencies-
|
||||||
|
dependencies-%: CONTAINER_ATTACHED = true
|
||||||
|
dependencies-%: --act ;
|
||||||
|
|
||||||
|
.PHONY: test-%
|
||||||
|
test-%: JOB=test
|
||||||
|
test-%: CF_PREFIX = test-
|
||||||
|
test-%: CONTAINER_ATTACHED = true
|
||||||
|
test-%: --act ;
|
||||||
|
|
||||||
|
.PHONY: lint-%
|
||||||
|
lint-%: JOB=lint
|
||||||
|
lint-%: CF_PREFIX = lint-
|
||||||
|
lint-%: CONTAINER_ATTACHED = true
|
||||||
|
lint-%: --act ;
|
||||||
|
|
||||||
|
.PHONY: shell-%
|
||||||
|
# HELP(shell-$SERVICE): launch (bash) shell inside a new $SERVICE container
|
||||||
|
shell-%: JOB=shell
|
||||||
|
shell-%: CF_PREFIX=shell-
|
||||||
|
shell-%: CONTAINER_ATTACHED=true
|
||||||
|
shell-%: --act ;
|
||||||
|
.PHONY: ghci
|
||||||
|
# HELP(ghci): launch new backend instance and enter interactive ghci shell
|
||||||
|
ghci: shell-ghci;
|
||||||
|
|
||||||
|
--act: --develop_containerized;
|
||||||
|
|
||||||
|
--develop_%: PORTS = $(foreach PORT,$(BASE_PORTS),$(shell utils/next_free_port.pl $(PORT)))
|
||||||
|
--develop_%: --ensure-develop
|
||||||
|
DEVELOP=develop/`cat develop/.current` ; \
|
||||||
|
CONTAINER_IDENT=$(CF_PREFIX)$(SERVICE_VARIANT) ; \
|
||||||
|
CONTAINER_FILE=$${DEVELOP}/$${CONTAINER_IDENT} ; \
|
||||||
|
if [[ -e $${CONTAINER_FILE} ]]; then \
|
||||||
|
>&2 echo "Another $* service is already running! Use \"make new-develop\" to start a new develop instance despite currently running services." ; \
|
||||||
|
exit 1 ; \
|
||||||
|
fi ; \
|
||||||
|
echo "$(PORTS)" | sed 's/ /\n/g' > $${CONTAINER_FILE} ; \
|
||||||
|
$(MAKE) -- --$* CONTAINER_FILE=$${CONTAINER_FILE} CONTAINER_IDENT=$${CONTAINER_IDENT} JOB=$(JOB)
|
||||||
|
|
||||||
|
.PHONY: rebuild-%
|
||||||
|
# HELP(rebuild-{backend,frontend,database,memcached,minio}): force-rebuild a given container image
|
||||||
|
rebuild-%:
|
||||||
|
$(MAKE) -- --image-build SERVICE=$* NO_CACHE=--no-cache
|
||||||
|
--image-build:
|
||||||
|
ifeq "$(IMAGE)" "localhost/fradrive/$(SERVICE)"
|
||||||
|
rm -f .Dockerfile
|
||||||
|
ln -s docker/$(SERVICE)/Dockerfile .Dockerfile
|
||||||
|
PROJECT_DIR=/fradrive; \
|
||||||
|
if [ "$(IN_CONTAINER)" == "false" ] ; then \
|
||||||
|
$(CONTAINER_COMMAND) build $(NO_CACHE) \
|
||||||
|
-v $(PWD):$${PROJECT_DIR}:rw \
|
||||||
|
--build-arg PROJECT_DIR=$${PROJECT_DIR} \
|
||||||
|
--env IN_CONTAINER=true \
|
||||||
|
--env JOB=$(JOB) \
|
||||||
|
--tag fradrive/$(SERVICE) \
|
||||||
|
--file $(PWD)/.Dockerfile ; \
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
:
|
||||||
|
endif
|
||||||
|
|
||||||
|
--containerized: --image-build
|
||||||
|
DEVELOP=`cat develop/.current` ; \
|
||||||
|
./utils/watchcontainerrun.sh "$(CONTAINER_COMMAND)" "$(CONTAINER_FILE)" "$(CONTAINER_INIT)" "$(CONTAINER_CLEANUP)" & \
|
||||||
|
CONTAINER_NAME=fradrive.$(CURR_DEV).$(CONTAINER_IDENT) ; \
|
||||||
|
if ! [ -z "$(SET_IMAGE)" ] ; \
|
||||||
|
then \
|
||||||
|
IMAGE="$(SET_IMAGE)" ; \
|
||||||
|
else \
|
||||||
|
IMAGE=$(IMAGE) ; \
|
||||||
|
fi ; \
|
||||||
|
CONTAINER_ID=`$(CONTAINER_BGRUN) \
|
||||||
|
-v $(PWD):$(PROJECT_DIR):rw \
|
||||||
|
--env IN_CONTAINER=true \
|
||||||
|
--env CONTAINER_FILE=$(CONTAINER_FILE) \
|
||||||
|
--env CONTAINER_NAME=$${CONTAINER_NAME} \
|
||||||
|
--env JOB=$(JOB) \
|
||||||
|
--env SRC=$(SRC) \
|
||||||
|
--name $${CONTAINER_NAME} \
|
||||||
|
$${IMAGE} \
|
||||||
|
make -- --$(JOB)-$(SERVICE_VARIANT) IN_CONTAINER=true \
|
||||||
|
` ; \
|
||||||
|
printf "CONTAINER_ID=$${CONTAINER_ID}" >> "$(CONTAINER_FILE)" ; \
|
||||||
|
if [[ "true" == "$(CONTAINER_ATTACHED)" ]] ; then \
|
||||||
|
$(CONTAINER_COMMAND) attach $${CONTAINER_ID} || : ; \
|
||||||
|
fi
|
||||||
|
|
||||||
|
# For Reverse Proxy Problem see: https://groups.google.com/g/yesodweb/c/2EO53kSOuy0/m/Lw6tq2VYat4J
|
||||||
|
# HELP(start-backend): start development instance
|
||||||
|
--start-backend:
|
||||||
|
export YESOD_IP_FROM_HEADER=true; \
|
||||||
|
export DEV_PORT_HTTP=`cat $(CONTAINER_FILE) | grep 'DEV_PORT_HTTP=' | sed 's/DEV_PORT_HTTP=//'`; \
|
||||||
|
export DEV_PORT_HTTPS=`cat $(CONTAINER_FILE) | grep 'DEV_PORT_HTTPS=' | sed 's/DEV_PORT_HTTPS=//'`; \
|
||||||
|
export HOST=127.0.0.1 ; \
|
||||||
|
export PORT=$${PORT:-$${DEV_PORT_HTTP}} ; \
|
||||||
|
export DETAILED_LOGGING=$${DETAILED_LOGGING:-true} ; \
|
||||||
|
export LOG_ALL=$${LOG_ALL:-false} ; \
|
||||||
|
export LOGLEVEL=$${LOGLEVEL:-info} ; \
|
||||||
|
export DUMMY_LOGIN=$${DUMMY_LOGIN:-true} ; \
|
||||||
|
export SERVER_SESSION_ACID_FALLBACK=$${SERVER_SESSION_ACID_FALLBACK:-true} ; \
|
||||||
|
export SERVER_SESSION_COOKIES_SECURE=$${SERVER_SESSION_COOKIES_SECURE:-false} ; \
|
||||||
|
export COOKIES_SECURE=$${COOKIES_SECURE:-false} ; \
|
||||||
|
export ALLOW_DEPRECATED=$${ALLOW_DEPRECATED:-true} ; \
|
||||||
|
export ENCRYPT_ERRORS=$${ENCRYPT_ERRORS:-false} ; \
|
||||||
|
export RIBBON=$${RIBBON:-$${HOST:-localhost}} ; \
|
||||||
|
export APPROOT=$${APPROOT:-http://localhost:$${DEV_PORT_HTTP}} ; \
|
||||||
|
export AVSPASS=$${AVSPASS:-nopasswordset} ; \
|
||||||
|
stack $(STACK_CORES) exec --local-bin-path $$(pwd)/bin --copy-bins -- yesod devel -p "$${DEV_PORT_HTTP}" -q "$${DEV_PORT_HTTPS}"
|
||||||
|
# HELP(compile-backend): compile backend binaries
|
||||||
|
--compile-backend:
|
||||||
|
stack build $(STACK_CORES) --fast --profile --library-profiling --executable-profiling --flag uniworx:-library-only $(--DEVELOPMENT) --local-bin-path $$(pwd)/bin --copy-bins
|
||||||
|
# HELP(dependencies-backend): (re-)build backend dependencies
|
||||||
|
--dependencies-backend: #uniworx.cabal
|
||||||
|
chown -R `id -un`:`id -gn` "$(PROJECT_DIR)"; \
|
||||||
|
stack build -j2 --only-dependencies
|
||||||
|
# HELP(lint-backend): lint backend
|
||||||
|
--lint-backend:
|
||||||
|
stack build $(STACK_CORES) --test --fast --flag uniworx:library-only $(--DEVELOPMENT) uniworx:test:hlint
|
||||||
|
# HELP(test-backend): test backend
|
||||||
|
--test-backend:
|
||||||
|
stack build $(STACK_CORES) --test --coverage --fast --flag uniworx:library-only $(--DEVELOPMENT)
|
||||||
|
# uniworx.cabal:
|
||||||
|
# stack exec -- hpack --force
|
||||||
|
|
||||||
|
# HELP(compile-frontend): compile frontend assets
|
||||||
|
--compile-frontend: node_modules assets esbuild.config.mjs frontend/src/env.sass
|
||||||
|
npm run build
|
||||||
|
--start-frontend: --compile-frontend;
|
||||||
|
--dependencies-frontend: node_modules assets;
|
||||||
|
node_modules: package.json package-lock.json
|
||||||
|
npm install --cache .npm --prefer-offline
|
||||||
|
package-lock.json: package.json
|
||||||
|
npm install --cache .npm --prefer-offline
|
||||||
|
assets: assets/favicons assets/icons;
|
||||||
|
assets/favicons:
|
||||||
|
./utils/faviconize.pl assets/favicon.svg long assets/favicons
|
||||||
|
assets/icons: node_modules assets/icons-src/fontawesome.json
|
||||||
|
./utils/renamer.pl node_modules/@fortawesome/fontawesome-free/svgs/solid assets/icons-src/fontawesome.json assets/icons/fradrive
|
||||||
|
./utils/renamer.pl node_modules/@fortawesome/fontawesome-free/svgs/regular assets/icons-src/fontawesome.json assets/icons/fradrive
|
||||||
|
-cp assets/icons-src/*.svg assets/icons/fradrive
|
||||||
|
frontend/src/env.sass:
|
||||||
|
echo "\$$path: '$${PROJECT_DIR}'" > frontend/src/env.sass
|
||||||
|
static: node_modules assets esbuild.config.mjs frontend/src/env.sass
|
||||||
|
npm run build
|
||||||
|
well-known: static;
|
||||||
|
--lint-frontend: --compile-frontend
|
||||||
|
npm run lint
|
||||||
|
--test-frontend: --compile-frontend
|
||||||
|
npm run test
|
||||||
|
|
||||||
|
# HELP(compile-uniworxdb): clear and fill database. requires running postgres instance (use "make start-postgres" to start one)
|
||||||
|
# TODO (db-m-$MIGRATION-backend): apply migration (see src/Model/Migration/Definition.hs for list of available migrations)
|
||||||
|
--compile-uniworxdb: --compile-backend
|
||||||
|
SERVER_SESSION_ACID_FALLBACK=${SERVER_SESSION_ACID_FALLBACK:-true} ; \
|
||||||
|
AVSPASS=${AVSPASS:-nopasswordset} ; \
|
||||||
|
./bin/uniworxdb $(UNIWORXDB_OPTS)
|
||||||
|
|
||||||
|
# HELP(shell-ghci): enter ghci shell. Use "make ghci SRC=<MODULE_FILE.hs>" to load specific source modules."
|
||||||
|
--shell-ghci:
|
||||||
|
stack ghci -- $(SRC)
|
||||||
|
# --main-is uniworx:exe:uniworx
|
||||||
|
|
||||||
|
# HELP(shell-{backend,frontend,memcached,minio,postgres}): enter (bash) shell inside a new container of a given service
|
||||||
|
--shell-%:
|
||||||
|
/bin/bash
|
||||||
|
|
||||||
|
# HELP(start-minio): start minio service
|
||||||
|
|
||||||
|
.PHONY: status
|
||||||
|
# HELP: print develop status: running containers, used ports
|
||||||
|
status:
|
||||||
|
@./utils/develop-status.pl -a
|
||||||
|
|
||||||
|
.PHONY: log-%
|
||||||
|
# HELP(log-$(JOB)-$(SERVICE)): inspect output of a given service. The service must be currently running When a service supports multiple running instances in one develop (i.e. backend), you need to specify the exact instance by its associated file (e.g. backend-1, backend-2, etc.), please check the contents of the develop/ directory for a list of running instances.
|
||||||
|
log-%:
|
||||||
|
DEVELOP=develop/`cat develop/.current` ; \
|
||||||
|
SEARCH_FILE="$${DEVELOP}/$*" ; \
|
||||||
|
if [[ ! -e "$${SEARCH_FILE}" ]] ; then \
|
||||||
|
SEARCH_FILE="$${DEVELOP}/.exited.$*" ; \
|
||||||
|
fi ; \
|
||||||
|
if [[ -e "$${SEARCH_FILE}" ]] ; then \
|
||||||
|
$(CONTAINER_COMMAND) logs --follow `cat "$${SEARCH_FILE}" | grep CONTAINER_ID= | sed 's/^CONTAINER_ID=//'` ; \
|
||||||
|
else \
|
||||||
|
>&2 echo "Cannot show log: No develop file found for '$*'" ; \
|
||||||
|
exit 1 ; \
|
||||||
|
fi
|
||||||
|
|
||||||
|
.PHONY: enter
|
||||||
|
# HELP: launch (bash) shell inside a currently running container. Use ./enter shell wrapper for more convenient usage, possibly with tab-completion in the future
|
||||||
|
enter: --ensure-develop
|
||||||
|
$(MAKE) -- --enter
|
||||||
|
|
||||||
|
.PHONY: psql
|
||||||
|
# HELP: enter psql (postgresql) cli inside a currently running database container
|
||||||
|
psql: ENTRYPOINT=/usr/bin/psql -d uniworx
|
||||||
|
psql: EXEC_OPTS=--user postgres
|
||||||
|
psql: --ensure-develop
|
||||||
|
$(MAKE) -- --enter CONTAINER_FILE=develop/`cat develop/.current`/start-postgres
|
||||||
|
|
||||||
|
--enter:
|
||||||
|
CONTAINER_ID=`cat $(CONTAINER_FILE) | grep 'CONTAINER_ID=' | sed 's/CONTAINER_ID=//'` ; \
|
||||||
|
$(CONTAINER_COMMAND) exec -it $(EXEC_OPTS) $${CONTAINER_ID} $(if $(ENTRYPOINT),$(ENTRYPOINT),/bin/bash)
|
||||||
|
|
||||||
|
.PHONY: stop
|
||||||
|
# HELP: stop all currently running develop instances
|
||||||
|
stop:
|
||||||
|
rm -rf develop
|
||||||
|
.PHONY: stop-%
|
||||||
|
# HELP(stop-SERVICE): stop all currently running develop instances of a given service (i.e. backend,frontend,uniworxdb,hoogle,postgres,...)
|
||||||
|
# HELP(stop-JOB): stop all currently running develop instances of a given job (i.e. compile,start,test,lint)
|
||||||
|
stop-compile: CF_PREFIX=compile-
|
||||||
|
stop-start: CF_PREFIX=start-
|
||||||
|
stop-test: CF_PREFIX=test-
|
||||||
|
stop-lint: CF_PREFIX=lint-
|
||||||
|
stop-%: --stop;
|
||||||
|
--stop:
|
||||||
|
$(SET_DEVELOP)
|
||||||
|
ifdef CF_PREFIX
|
||||||
|
rm -rf $(DEVELOP)/$(CF_PREFIX)*
|
||||||
|
endif
|
||||||
|
ifdef SERVICE_VARIANT
|
||||||
|
rm -rf $(DEVELOP)/*-$(SERVICE_VARIANT)
|
||||||
|
endif
|
||||||
|
|
||||||
|
.PHONY: new-develop
|
||||||
|
# HELP: instantiate new development bundle, i.e. create new directory under develop/
|
||||||
|
new-develop:
|
||||||
|
$(NEW_DEVELOP)
|
||||||
|
mkdir -p $(DEVELOP)
|
||||||
|
$(MAKE) develop/.current
|
||||||
|
.PHONY: switch-develop
|
||||||
|
# HELP: switch current develop instance to DEVELOP=...
|
||||||
|
switch-develop:
|
||||||
|
if ! [ -e develop/$(DEVELOP) ]; then \
|
||||||
|
echo "Specified develop $(DEVELOP) does not exist! Not switching." ; \
|
||||||
|
exit 1 ; \
|
||||||
|
fi ; \
|
||||||
|
echo "$(DEVELOP)" > develop/.current
|
||||||
|
--ensure-develop:
|
||||||
|
if ! [[ -e develop ]]; then \
|
||||||
|
$(MAKE) new-develop; \
|
||||||
|
fi
|
||||||
|
$(MAKE) develop/.current
|
||||||
|
$(SET_DEVELOP)
|
||||||
|
.PHONY: develop/.current
|
||||||
|
develop/.current:
|
||||||
|
ls -1 develop | tail -n1 > develop/.current
|
||||||
|
|
||||||
|
.PHONY: --%
|
||||||
|
.SUFFIXES: # Delete all default suffixes
|
||||||
Binary file not shown.
|
Before Width: | Height: | Size: 10 KiB |
@ -1,3 +0,0 @@
|
|||||||
SPDX-FileCopyrightText: 2022 Fraport AG
|
|
||||||
|
|
||||||
SPDX-License-Identifier: LicenseRef-Fraport-Corporate-Design
|
|
||||||
Binary file not shown.
|
Before Width: | Height: | Size: 1.1 KiB |
@ -1,3 +0,0 @@
|
|||||||
SPDX-FileCopyrightText: 2022 Fraport AG
|
|
||||||
|
|
||||||
SPDX-License-Identifier: LicenseRef-Fraport-Corporate-Design
|
|
||||||
@ -1,3 +0,0 @@
|
|||||||
SPDX-FileCopyrightText: 2022 Fraport AG
|
|
||||||
|
|
||||||
SPDX-License-Identifier: LicenseRef-Fraport-Corporate-Design
|
|
||||||
16
assets/fonts/fradrive/AUTHORS
Normal file
16
assets/fonts/fradrive/AUTHORS
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
AUTHORS
|
||||||
|
|
||||||
|
Current Contributors (sorted alphabetically):
|
||||||
|
|
||||||
|
- Vishal Vijayraghavan <vishalvvr at fedoraproject dot org>
|
||||||
|
Project Owner/ Maintainer (Current)
|
||||||
|
Red Hat, Inc.
|
||||||
|
|
||||||
|
Previous Contributors
|
||||||
|
- Pravin Satpute <psatpute at redhat dot com>
|
||||||
|
Project Owner/ Maintainer
|
||||||
|
Red Hat, Inc.
|
||||||
|
|
||||||
|
- Steve Matteson
|
||||||
|
Original Designer
|
||||||
|
Ascender, Inc.
|
||||||
79
assets/fonts/fradrive/ChangeLog
Normal file
79
assets/fonts/fradrive/ChangeLog
Normal file
@ -0,0 +1,79 @@
|
|||||||
|
* Thu Sep 30 2021 Vishal Vijayraghavan <vishalvijayraghavan@gmail.com>
|
||||||
|
- Releasing liberation-fonts 2.1.5 version
|
||||||
|
- Resolves #40: More fixes to Superscript and subscript Numbers missing issues
|
||||||
|
-- fixed inconsistent weight, missing glyphs and GSUB issues
|
||||||
|
|
||||||
|
* Tue May 04 2021 Vishal Vijayraghavan <vishalvijayraghavan@gmail.com>
|
||||||
|
- Releasing liberation-fonts 2.1.4 version
|
||||||
|
- Resolves #40: Superscript and subscript Numbers missing
|
||||||
|
- Resolves #24: Gender symbol are inconsistent in Sans
|
||||||
|
|
||||||
|
* Tue Feb 23 2021 Vishal Vijayraghavan <vishalvijayraghavan@gmail.com>
|
||||||
|
- Releasing liberation-fonts 2.1.3 version
|
||||||
|
- Resolves #37: U+2262,2669,266C too wide
|
||||||
|
- Resolves Bugzilla #1464310: Tilded G not works with Liberation Sans and Serif
|
||||||
|
|
||||||
|
* Mon Dec 21 2020 Vishal Vijayraghavan <vishalvijayraghavan@gmail.com>
|
||||||
|
- Releasing liberation-fonts 2.1.2 version
|
||||||
|
- Resolves #25: liberation-fonts doesn't have proper <==> symbol
|
||||||
|
- Resolves #33: Liberation Mono: U+20BF is too wide
|
||||||
|
- Resolves #14: Liberation mono fonts are not recognized as monospace by fontconfig and cairo
|
||||||
|
|
||||||
|
* Wed Jun 03 2020 Vishal Vijayraghavan <vishalvijayraghavan@gmail.com>
|
||||||
|
- Releasing liberation-fonts 2.1.1 version
|
||||||
|
- Few more fixes to Bugzilla #1072095: Liberation Sans renders most Latin combining characters incorrectly
|
||||||
|
|
||||||
|
* Mon Feb 10 2020 Vishal Vijayraghavan <vishalvijayraghavan@gmail.com>
|
||||||
|
- Releasing liberation-fonts 2.1.0 version
|
||||||
|
- Updated release versioning scheme
|
||||||
|
- Resolved Bugzilla #1072095: Liberation Sans renders most Latin combining characters incorrectly
|
||||||
|
- Resolved Pagure issue-11: Combining diaerasis below does not work except U
|
||||||
|
- Resolved GitHub issue-19: Incorrect glyph name mapped to unicode
|
||||||
|
- Resolved Pagure issue-5: Incorrect glyph of Cent sign (U+00A2) in Sans and Mono style
|
||||||
|
- Resolved Pagure issue-28 : U+25D2 and U+25D3 circle with lower / upper half black are backwards
|
||||||
|
|
||||||
|
* Mon Mar 4 2019 Vishal Vijayraghavan <vishalvijayraghavan@gmail.com>
|
||||||
|
- Releasing liberation-fonts 2.00.5 version
|
||||||
|
- Resolved issue-10: Improving lowercase Cyrillic glyps localized for Macedonian and Serbian, Patch fix by Dimitrij Mijoski
|
||||||
|
- Resolved #1014357: U+266B incorrect glyph with extra beam
|
||||||
|
-- Added two new glyphs U+266C and U+2669
|
||||||
|
- Resolved issue-13: COMBINING LONG SOLIDUS OVERLAY (U+0338) not centred on base character.
|
||||||
|
- Validated Missing Points at Extrema, Non-integral coordinates, Wrong Direction issues for newly added and existing glyphs
|
||||||
|
|
||||||
|
* Mon Nov 05 2018 Vishal Vijayraghavan <vishalvijayraghavan@gmail.com>
|
||||||
|
- Releasing liberation-fonts 2.00.4 version, it includes few bug fixes and enhancements as follows:
|
||||||
|
-- Added Bitcoin sign #1533798
|
||||||
|
-- Fixed Incorrect lowercase Cyrillic BE for Macedonian language in liberation v2 (look like Greek delta), Patch fix by Dimitrij Mijoski #1574410
|
||||||
|
-- Fixed Liberation Sans Mono Enhancement Request: Modification needed for "l" Character, Patch fix by Nikolaus Waxweiler #1574410
|
||||||
|
|
||||||
|
* Tue Sep 18 2018 Vishal Vijayraghavan <vishalvijayraghavan@gmail.com>
|
||||||
|
- Resolved #1574410: Incorrect lowercase Cyrillic BE for Macedonian language in liberation v2 (look like Greek delta)
|
||||||
|
- Patch fix by Dimitrij Mijoski: https://pagure.io/liberation-fonts/pull-request/21
|
||||||
|
- Updated LiberationMono-Bold, LiberationMono-Regular, LiberationSans-Bold, LiberationSans-Regular, LiberationSerif-Bold, LiberationSerif-Regular
|
||||||
|
|
||||||
|
* Thu May 17 2018 Pravin Satpute <psatpute AT redhat DOT com> - 2.00.3
|
||||||
|
- Releasing liberation-fonts 2.00.3 version, it includes fix for few bugs.
|
||||||
|
- This release was pending from long time, will work on other open bugs
|
||||||
|
post this release.
|
||||||
|
|
||||||
|
* Tue Oct 14 2014 Pravin Satpute <psatpute AT redhat DOT com>
|
||||||
|
- Resolved #1096336: Liberation 2.00.x missing unicode hyphen (U+2010)
|
||||||
|
- Added U+2007 character in Liberation Mono
|
||||||
|
- Imported missing gpos tables from Arimo #1072095
|
||||||
|
- Missing MIDDLE DOT (u+00B7) glyph for Liberation Sans Italic #1084493
|
||||||
|
- Rendering of Unicode tie bars could be improved #1076190
|
||||||
|
|
||||||
|
* Thu Oct 04 2012 Pravin Satpute <psatpute AT redhat DOT com>
|
||||||
|
- Resolved "Glyphs with multiple unicode encodings inhibit subsetting" #851790
|
||||||
|
- Resolved #851791, #854601 and #851825
|
||||||
|
- Following GASP table version as per Liberation old version. (Anti-aliasing disabled)
|
||||||
|
- Added support for Serbian glyphs for wikipedia #657849
|
||||||
|
- In Monospace fonts, isFixedPitch bit set via script for getting it recognized as Monospace in putty.exe
|
||||||
|
|
||||||
|
* Fri Jul 06 2012 Pravin Satpute <psatpute AT redhat DOT com>
|
||||||
|
- Initial version of Liberation fonts based on croscore fonts version 1.21.0
|
||||||
|
- Converted TTF files into SFD files to be open source.
|
||||||
|
- Update Copyright and License file
|
||||||
|
- set fsType bit to 0, Installable Embedding is allowed.
|
||||||
|
- Absolute value in HHeadAscent/Descent values for maintaining Metric compatibility.
|
||||||
|
|
||||||
BIN
assets/fonts/fradrive/FRADriveMono-Bold.ttf
Normal file
BIN
assets/fonts/fradrive/FRADriveMono-Bold.ttf
Normal file
Binary file not shown.
BIN
assets/fonts/fradrive/FRADriveMono-BoldItalic.ttf
Normal file
BIN
assets/fonts/fradrive/FRADriveMono-BoldItalic.ttf
Normal file
Binary file not shown.
BIN
assets/fonts/fradrive/FRADriveMono-Italic.ttf
Normal file
BIN
assets/fonts/fradrive/FRADriveMono-Italic.ttf
Normal file
Binary file not shown.
BIN
assets/fonts/fradrive/FRADriveMono-Regular.ttf
Normal file
BIN
assets/fonts/fradrive/FRADriveMono-Regular.ttf
Normal file
Binary file not shown.
BIN
assets/fonts/fradrive/FRADriveSans-Bold.ttf
Normal file
BIN
assets/fonts/fradrive/FRADriveSans-Bold.ttf
Normal file
Binary file not shown.
BIN
assets/fonts/fradrive/FRADriveSans-BoldItalic.ttf
Normal file
BIN
assets/fonts/fradrive/FRADriveSans-BoldItalic.ttf
Normal file
Binary file not shown.
BIN
assets/fonts/fradrive/FRADriveSans-Italic.ttf
Normal file
BIN
assets/fonts/fradrive/FRADriveSans-Italic.ttf
Normal file
Binary file not shown.
BIN
assets/fonts/fradrive/FRADriveSans-Regular.ttf
Normal file
BIN
assets/fonts/fradrive/FRADriveSans-Regular.ttf
Normal file
Binary file not shown.
86
assets/fonts/fradrive/README.md
Normal file
86
assets/fonts/fradrive/README.md
Normal file
@ -0,0 +1,86 @@
|
|||||||
|
Liberation Fonts
|
||||||
|
=================
|
||||||
|
|
||||||
|
The Liberation Fonts is font collection which aims to provide document
|
||||||
|
layout compatibility as usage of Times New Roman, Arial, Courier New.
|
||||||
|
|
||||||
|
|
||||||
|
Requirements
|
||||||
|
=================
|
||||||
|
|
||||||
|
* [fontforge](http://fontforge.sourceforge.net)
|
||||||
|
* [python fonttools](https://pypi.org/project/fonttools/)
|
||||||
|
|
||||||
|
|
||||||
|
Install
|
||||||
|
============
|
||||||
|
|
||||||
|
1. Get source
|
||||||
|
```
|
||||||
|
$ git clone https://github.com/liberationfonts/liberation-fonts.git
|
||||||
|
```
|
||||||
|
|
||||||
|
- Or downloading the tar.gz file from [releases](https://github.com/fontforge/fontforge/releases).
|
||||||
|
|
||||||
|
- Extract the tar file:
|
||||||
|
```
|
||||||
|
$ tar zxvf liberation-fonts-[VERSION].tar.gz
|
||||||
|
```
|
||||||
|
2. Build from the source
|
||||||
|
```
|
||||||
|
$ cd liberation-fonts or $ cd liberation-fonts-[VERSION]
|
||||||
|
$ make
|
||||||
|
```
|
||||||
|
The binary font files will be available in 'liberation-fonts-ttf-[VERSION]' directory.
|
||||||
|
|
||||||
|
3. Install to system
|
||||||
|
|
||||||
|
Fedora Users :
|
||||||
|
- One can manually install the fonts by copying the TTFs to `~/.fonts` for user wide usage
|
||||||
|
- and/or to `/usr/share/fonts/liberation` for system-wide availability.
|
||||||
|
- Then, run `fc-cache` to let that cached.
|
||||||
|
|
||||||
|
Other distributions :
|
||||||
|
please check out corresponding documentation.
|
||||||
|
|
||||||
|
|
||||||
|
Usage
|
||||||
|
==========
|
||||||
|
|
||||||
|
Simply select preferred liberation font in applications and start using.
|
||||||
|
|
||||||
|
|
||||||
|
License
|
||||||
|
============
|
||||||
|
|
||||||
|
This Font Software is licensed under the SIL Open Font License,
|
||||||
|
Version 1.1.
|
||||||
|
|
||||||
|
Please read file "LICENSE" for details.
|
||||||
|
|
||||||
|
|
||||||
|
For Maintainers
|
||||||
|
====================
|
||||||
|
|
||||||
|
1. Before packaging a new release based on a new source tarball, you have to update the version suffix in the Makefile:
|
||||||
|
```
|
||||||
|
VER = [NEW_VERSION]
|
||||||
|
```
|
||||||
|
2. After updating Makefile VER attribute, update all font metadata by executing:
|
||||||
|
```
|
||||||
|
$ make versionupdate
|
||||||
|
```
|
||||||
|
can verfy changes using ftinfo/otfinfo or fontforge itself.
|
||||||
|
3. It is highly recommended that file 'ChangeLog' is updated to reflect changes.
|
||||||
|
|
||||||
|
4. Create a tarball with the following command:
|
||||||
|
```
|
||||||
|
$ make dist
|
||||||
|
```
|
||||||
|
The new versioned tarball will be available in the dist/ folder as `liberation-fonts-[NEW_VERSION].tar.gz.`
|
||||||
|
5. Create github tag for that [NEW_VERSION] and upload dist tarball
|
||||||
|
|
||||||
|
Credits
|
||||||
|
============
|
||||||
|
|
||||||
|
Please read file "AUTHORS" for list of contributors.
|
||||||
4
assets/fonts/fradrive/TODO
Normal file
4
assets/fonts/fradrive/TODO
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
Here are todo for next release
|
||||||
|
1) Serbian glyph for wikipedia https://bugzilla.redhat.com/show_bug.cgi?id=657849
|
||||||
|
2) Liberation Mono not recognizing as Mono in Windows application #861003
|
||||||
|
- presently it is patch, we have to update zero width characters to fixed width
|
||||||
97
assets/icons-src/fontawesome.json
Normal file
97
assets/icons-src/fontawesome.json
Normal file
@ -0,0 +1,97 @@
|
|||||||
|
{
|
||||||
|
"/defaultExtension": "svg",
|
||||||
|
"/license": "SPDX-FileCopyrightText: 2024 Fonticons, Inc. (https://fontawesome.com)\n\nSPDX-License-Identifier: CC BY 4.0 License (https://creativecommons.org/licenses/by/4.0/)\n",
|
||||||
|
"new": "seedling",
|
||||||
|
"ok": "check",
|
||||||
|
"not-ok": "xmark",
|
||||||
|
"warning": "exclamation",
|
||||||
|
"problem": "bolt",
|
||||||
|
"visible": "eye",
|
||||||
|
"invisible": "eye-slash",
|
||||||
|
"course-favourite-manual": "star",
|
||||||
|
"course-favourite-automatic": "star-half-stroke",
|
||||||
|
"course-favourite-off": "slash",
|
||||||
|
"enrol-true": "user-plus",
|
||||||
|
"enrol-false": "user-slash",
|
||||||
|
"planned": "gear",
|
||||||
|
"announce": "bullhorn",
|
||||||
|
"exam": "square-poll-horizontal",
|
||||||
|
"exam-register-true": "calendar-check",
|
||||||
|
"exam-register-false": "calendar-xmark",
|
||||||
|
"exam-auto-occurrence-nudge-up": "user-plus",
|
||||||
|
"exam-auto-occurrence-nudge-down": "user-minus",
|
||||||
|
"exam-auto-occurrence-ignore": "user-slash",
|
||||||
|
"exam-auto-occurrence-reconsider": "users",
|
||||||
|
"comment-true": "comment",
|
||||||
|
"comment-false": "comment-slash",
|
||||||
|
"link": "link",
|
||||||
|
"file-donwload": "file-arrow-down",
|
||||||
|
"file-upload": "file-arrow-up",
|
||||||
|
"file-zip": "file-zipper",
|
||||||
|
"file-csv": "file-csv",
|
||||||
|
"sft-question": "circle-question",
|
||||||
|
"sft-hint": "life-ring",
|
||||||
|
"sft-solution": "circle-exclamation",
|
||||||
|
"sft-marking": "circle-check",
|
||||||
|
"email": "envelope",
|
||||||
|
"register-template": "file-lines",
|
||||||
|
"no-correctors": "user-slash",
|
||||||
|
"remove-user": "user-slash",
|
||||||
|
"tooltip-default": "circle-question",
|
||||||
|
"notification-success": "circle-check",
|
||||||
|
"notification-info": "circle-info",
|
||||||
|
"notification-warning": "circle-exclamation",
|
||||||
|
"notification-error": "triangle-exclamation",
|
||||||
|
"notification-nonactive": "info",
|
||||||
|
"favourite": "star",
|
||||||
|
"language": "flag",
|
||||||
|
"nav-container-close": "chevron-up",
|
||||||
|
"page-action-children-close": "chevron-up",
|
||||||
|
"menu-news": "bullhorn",
|
||||||
|
"menu-help": "question",
|
||||||
|
"menu-profile": "gears",
|
||||||
|
"menu-login": "right-to-bracket",
|
||||||
|
"menu-logout": "right-from-bracket",
|
||||||
|
"breadcrumbs-home": "house",
|
||||||
|
"menu-extra": "ellipsis",
|
||||||
|
"menu-course-list": "chalkboard-user",
|
||||||
|
"menu-corrections": "check",
|
||||||
|
"menu-exams": "square-poll-horizontal",
|
||||||
|
"menu-admin": "screwdriver",
|
||||||
|
"menu-lms": "list-check",
|
||||||
|
"menu-qualification": "graduation-cap",
|
||||||
|
"page-action-primary-expand": "bars",
|
||||||
|
"page-action-secondary": "ellipsis",
|
||||||
|
"breadcrumb-separator": "angle-right",
|
||||||
|
"file-upload-session": "file-arrow-up",
|
||||||
|
"standalone-field-error": "exclamation",
|
||||||
|
"file-user": "address-card",
|
||||||
|
"notification": "envelope",
|
||||||
|
"notification-sent": "envelope-open",
|
||||||
|
"no-notification": "bell-slash",
|
||||||
|
"personal-identification": "id-card",
|
||||||
|
"menu-workflows": "diagram-project",
|
||||||
|
"video": "video",
|
||||||
|
"submission-user-duplicate": "copy",
|
||||||
|
"submission-no-users": "user-slash",
|
||||||
|
"reset": "arrow-rotate-left",
|
||||||
|
"blocked": "ban",
|
||||||
|
"certificate": "certificate",
|
||||||
|
"print-center": "envelopes-bulk",
|
||||||
|
"letter": "envelopes-bulk",
|
||||||
|
"at": "at",
|
||||||
|
"supervisor": "person",
|
||||||
|
"supervisor-foreign": "person-rays",
|
||||||
|
"waiting-for-user": "user-gear",
|
||||||
|
"expired": "hourglass-end",
|
||||||
|
"locked": "lock",
|
||||||
|
"unlocked": "unlock",
|
||||||
|
"trash": "trash",
|
||||||
|
"reset-tries": "trash-can-arrow-up",
|
||||||
|
"company": "building",
|
||||||
|
"edit": "pen-to-square",
|
||||||
|
"user-edit": "user-pen",
|
||||||
|
"loading": "spinner",
|
||||||
|
"placeholder": "notdef"
|
||||||
|
}
|
||||||
|
|
||||||
@ -1,41 +0,0 @@
|
|||||||
{
|
|
||||||
"name": "App",
|
|
||||||
"icons": [
|
|
||||||
{
|
|
||||||
"src": "\/android-icon-36x36.png",
|
|
||||||
"sizes": "36x36",
|
|
||||||
"type": "image\/png",
|
|
||||||
"density": "0.75"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"src": "\/android-icon-48x48.png",
|
|
||||||
"sizes": "48x48",
|
|
||||||
"type": "image\/png",
|
|
||||||
"density": "1.0"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"src": "\/android-icon-72x72.png",
|
|
||||||
"sizes": "72x72",
|
|
||||||
"type": "image\/png",
|
|
||||||
"density": "1.5"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"src": "\/android-icon-96x96.png",
|
|
||||||
"sizes": "96x96",
|
|
||||||
"type": "image\/png",
|
|
||||||
"density": "2.0"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"src": "\/android-icon-144x144.png",
|
|
||||||
"sizes": "144x144",
|
|
||||||
"type": "image\/png",
|
|
||||||
"density": "3.0"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"src": "\/android-icon-192x192.png",
|
|
||||||
"sizes": "192x192",
|
|
||||||
"type": "image\/png",
|
|
||||||
"density": "4.0"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
@ -1,3 +0,0 @@
|
|||||||
SPDX-FileCopyrightText: 2022 Steffen Jost <jost@cip.ifi.lmu.de>
|
|
||||||
|
|
||||||
SPDX-License-Identifier: AGPL-3.0-or-later
|
|
||||||
197
azure-pipelines.yaml
Executable file
197
azure-pipelines.yaml
Executable file
@ -0,0 +1,197 @@
|
|||||||
|
# SPDX-FileCopyrightText: 2024-2025 Sarah Vaupel <sarah.vaupel@uniworx.de>
|
||||||
|
#
|
||||||
|
# SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
|
|
||||||
|
trigger:
|
||||||
|
branches:
|
||||||
|
include:
|
||||||
|
- '*'
|
||||||
|
tags:
|
||||||
|
include:
|
||||||
|
- '*'
|
||||||
|
#paths:
|
||||||
|
# exclude:
|
||||||
|
# - CHANGELOG.md
|
||||||
|
|
||||||
|
parameters:
|
||||||
|
- name: services
|
||||||
|
type: object
|
||||||
|
default:
|
||||||
|
- name: frontend
|
||||||
|
imageBase:
|
||||||
|
image: devfra.azurecr.io/de.fraport.build/npm
|
||||||
|
tag: node-20
|
||||||
|
# extraBuildOptions: |
|
||||||
|
# --build-arg NPM_CUSTOM_REGISTRY=https://pkgs.dev.azure.com/fraport/_packaging/packages/npm/registry/
|
||||||
|
dependsOn: []
|
||||||
|
dependenciesCaches:
|
||||||
|
- key: package.json | package-lock.json
|
||||||
|
path: node_modules/
|
||||||
|
- key: package.json | package-lock.json
|
||||||
|
path: .npm/
|
||||||
|
- key: package.json | esbuild.config.mjs | utils/renamer.pl | utils/faviconize.pl | frontend/src/icons.scss
|
||||||
|
path: assets/icons/
|
||||||
|
- key: package.json | esbuild.config.mjs | utils/renamer.pl | utils/faviconize.pl | frontend/src/icons.scss
|
||||||
|
path: assets/favicons/
|
||||||
|
buildPool: 'Prod Private Agent Pool'
|
||||||
|
buildCores: 1
|
||||||
|
buildTimeout: 60
|
||||||
|
buildArtifacts: |
|
||||||
|
assets/icons/fradrive/*.svg
|
||||||
|
assets/favicons/*.png
|
||||||
|
assets/favicons/include.html
|
||||||
|
frontend/src/env.sass
|
||||||
|
config/manifest.json
|
||||||
|
static/**/*
|
||||||
|
well-known/**/*
|
||||||
|
- name: backend
|
||||||
|
imageBase:
|
||||||
|
image: devfra.azurecr.io/de.fraport.build/haskell
|
||||||
|
tag: 8.10.4
|
||||||
|
dependsOn:
|
||||||
|
- Build_frontend
|
||||||
|
dependenciesCaches:
|
||||||
|
- key: stack.yaml | stack.yaml.lock
|
||||||
|
path: .stack/
|
||||||
|
buildPool: 'Prod Private Agent Pool DS3'
|
||||||
|
buildCores: 3
|
||||||
|
buildTimeout: 1440
|
||||||
|
buildArtifacts: |
|
||||||
|
bin/*
|
||||||
|
|
||||||
|
variables:
|
||||||
|
buildImageUpstream: devfra.azurecr.io/de.fraport.fradrive.build
|
||||||
|
setupImages: $[ or( eq(variables.forcePushLatest, true), eq(variables['Build.SourceBranch'], 'refs/heads/master'), startsWith(variables['Build.SourceBranch'], 'refs/heads/update'), startsWith(variables['Build.SourceBranch'], 'refs/tags/') ) ]
|
||||||
|
|
||||||
|
pool: 'Prod Private Agent Pool'
|
||||||
|
|
||||||
|
stages:
|
||||||
|
|
||||||
|
- stage: Setup
|
||||||
|
jobs:
|
||||||
|
- ${{ each service in parameters.services }}:
|
||||||
|
- template: .azure-pipelines/templates/jobs/setup_image.yaml
|
||||||
|
parameters:
|
||||||
|
imageName: ${{service.name}}
|
||||||
|
imageBase: ${{service.imageBase}}
|
||||||
|
- template: .azure-pipelines/templates/jobs/setup_dependencies.yaml
|
||||||
|
parameters:
|
||||||
|
serviceName: ${{service.name}}
|
||||||
|
dependenciesCaches: ${{service.dependenciesCaches}}
|
||||||
|
dependenciesBuildPool: ${{service.buildPool}}
|
||||||
|
dependenciesBuildCores: ${{service.buildCores}}
|
||||||
|
dependenciesBuildTimeout: ${{service.buildTimeout}}
|
||||||
|
|
||||||
|
- stage: Build
|
||||||
|
dependsOn: Setup
|
||||||
|
jobs:
|
||||||
|
- ${{ each service in parameters.services }}:
|
||||||
|
- job: Build_${{service.name}}
|
||||||
|
displayName: Compile ${{service.name}}
|
||||||
|
dependsOn: ${{service.dependsOn}}
|
||||||
|
pool: '${{service.buildPool}}'
|
||||||
|
timeoutInMinutes: ${{service.buildTimeout}}
|
||||||
|
container:
|
||||||
|
${{ if eq(variables.setupImages, true) }}:
|
||||||
|
image: $(buildImageUpstream)/${{service.name}}:$(Build.BuildNumber)
|
||||||
|
${{ else }}:
|
||||||
|
image: $(buildImageUpstream)/${{service.name}}:latest
|
||||||
|
endpoint: devfra
|
||||||
|
env:
|
||||||
|
PROJECT_DIR: $(Build.Repository.LocalPath)
|
||||||
|
IN_CONTAINER: true
|
||||||
|
IN_CI: true
|
||||||
|
steps:
|
||||||
|
- ${{ each dependencyCache in service.dependenciesCaches }}:
|
||||||
|
- template: .azure-pipelines/templates/steps/cache.yaml
|
||||||
|
parameters:
|
||||||
|
cacheIdent: '${{service.name}}-dependencies'
|
||||||
|
cacheKeys: '${{dependencyCache.key}}'
|
||||||
|
cachePath: '${{dependencyCache.path}}'
|
||||||
|
- ${{ each dependency in service.dependsOn }}:
|
||||||
|
- template: .azure-pipelines/templates/steps/artifact-download.yaml
|
||||||
|
parameters:
|
||||||
|
artifactName: '${{dependency}}'
|
||||||
|
- template: .azure-pipelines/templates/steps/make.yaml
|
||||||
|
parameters:
|
||||||
|
makeJob: compile
|
||||||
|
makeService: ${{service.name}}
|
||||||
|
makeVars: 'CPU_CORES=${{service.buildCores}} STACK_CORES=-j${{service.buildCores}}'
|
||||||
|
- task: CopyFiles@2
|
||||||
|
displayName: Prepare ${{service.name}} build artifacts for upload
|
||||||
|
inputs:
|
||||||
|
Contents: '${{service.buildArtifacts}}'
|
||||||
|
TargetFolder: '$(Build.ArtifactStagingDirectory)'
|
||||||
|
- task: PublishBuildArtifacts@1
|
||||||
|
displayName: Publish ${{service.name}} build artifacts
|
||||||
|
inputs:
|
||||||
|
PathtoPublish: '$(Build.ArtifactStagingDirectory)'
|
||||||
|
ArtifactName: 'Build_${{service.name}}'
|
||||||
|
publishLocation: 'Container'
|
||||||
|
|
||||||
|
# - stage: Test
|
||||||
|
# dependsOn: Build
|
||||||
|
# condition: eq(variables.skipTests, false)
|
||||||
|
# jobs:
|
||||||
|
# - ${{ each service in parameters.services }}:
|
||||||
|
# - job: Test_${{service.name}}
|
||||||
|
# displayName: Run ${{service.name}} tests
|
||||||
|
# pool: '${{service.buildPool}}'
|
||||||
|
# timeoutInMinutes: ${{service.buildTimeout}}
|
||||||
|
# container:
|
||||||
|
# # TODO: do not use latest on update branches
|
||||||
|
# image: $(buildImageUpstream)/${{service.name}}:latest
|
||||||
|
# endpoint: devfra
|
||||||
|
# env:
|
||||||
|
# PROJECT_DIR: $(Build.Repository.LocalPath)
|
||||||
|
# IN_CONTAINER: true
|
||||||
|
# IN_CI: true
|
||||||
|
# steps:
|
||||||
|
# - ${{ each dependencyCache in service.dependenciesCaches }}:
|
||||||
|
# - template: .azure-pipelines/templates/steps/cache.yaml
|
||||||
|
# parameters:
|
||||||
|
# cacheIdent: '${{service.name}}-dependencies'
|
||||||
|
# cacheKeys: '${{dependencyCache.key}}'
|
||||||
|
# cachePath: '${{dependencyCache.path}}'
|
||||||
|
# - ${{ each dependency in service.dependsOn }}:
|
||||||
|
# - template: .azure-pipelines/templates/steps/artifact-download.yaml
|
||||||
|
# parameters:
|
||||||
|
# artifactName: '${{dependency}}'
|
||||||
|
# - task: Docker@2
|
||||||
|
# displayName: Login to container registry
|
||||||
|
# inputs:
|
||||||
|
# command: login
|
||||||
|
# containerRegistry: devfra
|
||||||
|
# - task: Bash@3
|
||||||
|
# displayName: Start database container for testing
|
||||||
|
# inputs:
|
||||||
|
# targetType: inline
|
||||||
|
# script: |
|
||||||
|
# docker run -d devfra.azurecr.io/de.fraport.trusted/postgres:16.1-bookworm
|
||||||
|
# - template: .azure-pipelines/templates/steps/make.yaml
|
||||||
|
# parameters:
|
||||||
|
# makeJob: lint
|
||||||
|
# makeService: ${{service.name}}
|
||||||
|
# makeVars: 'CPU_CORES=${{service.buildCores}} STACK_CORES=-j${{service.buildCores}}'
|
||||||
|
# - template: .azure-pipelines/templates/steps/make.yaml
|
||||||
|
# parameters:
|
||||||
|
# makeJob: test
|
||||||
|
# makeService: ${{service.name}}
|
||||||
|
# makeVars: 'CPU_CORES=${{service.buildCores}} STACK_CORES=-j${{service.buildCores}}'
|
||||||
|
# - task: Docker@2
|
||||||
|
# displayName: Logout from container registry
|
||||||
|
# inputs:
|
||||||
|
# command: logout
|
||||||
|
# containerRegistry: devfra
|
||||||
|
# - job: TestReport_${{service.name}}
|
||||||
|
# displayName: Upload test reports for ${{service.name}}
|
||||||
|
# steps:
|
||||||
|
# - script: echo "Work in progress" # TODO
|
||||||
|
|
||||||
|
- stage: Release
|
||||||
|
dependsOn: Build # TODO Test
|
||||||
|
condition: or(eq(variables.forceRelease, true), startsWith(variables['Build.SourceBranch'], 'refs/tags/'))
|
||||||
|
jobs:
|
||||||
|
- template: .azure-pipelines/templates/jobs/release.yaml
|
||||||
|
parameters:
|
||||||
|
releaseTag: ${{split(variables['Build.SourceBranch'], '/')[2]}}
|
||||||
23
babel.config.cjs
Normal file
23
babel.config.cjs
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
module.exports = (api) => {
|
||||||
|
api.cache(true);
|
||||||
|
|
||||||
|
const presets = [
|
||||||
|
[ '@babel/preset-env'
|
||||||
|
]
|
||||||
|
];
|
||||||
|
|
||||||
|
const plugins = [
|
||||||
|
["@babel/plugin-proposal-decorators", { "legacy": true }],
|
||||||
|
["@babel/plugin-syntax-dynamic-import"],
|
||||||
|
["@babel/plugin-transform-class-properties", { "loose": true }],
|
||||||
|
["@babel/plugin-transform-private-methods", { "loose": true }],
|
||||||
|
["@babel/plugin-transform-private-property-in-object", { "loose": true }],
|
||||||
|
["@babel/plugin-transform-modules-commonjs"],
|
||||||
|
["@babel/transform-runtime"],
|
||||||
|
];
|
||||||
|
|
||||||
|
return {
|
||||||
|
presets,
|
||||||
|
plugins,
|
||||||
|
};
|
||||||
|
}
|
||||||
46
clean.sh
46
clean.sh
@ -1,46 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
|
|
||||||
set -e
|
|
||||||
|
|
||||||
# SPDX-FileCopyrightText: 2022 Gregor Kleen <gregor.kleen@ifi.lmu.de>
|
|
||||||
#
|
|
||||||
# SPDX-License-Identifier: AGPL-3.0-or-later
|
|
||||||
|
|
||||||
[ "${FLOCKER}" != "$0" ] && exec env FLOCKER="$0" flock -en .stack-work.lock "$0" "$@" || :
|
|
||||||
|
|
||||||
if [[ -n "${1}" ]]; then
|
|
||||||
target=".stack-work-${1}"
|
|
||||||
else
|
|
||||||
target=".stack-work"
|
|
||||||
fi
|
|
||||||
shift
|
|
||||||
|
|
||||||
if [[ ! -d "${target}" ]]; then
|
|
||||||
printf "%s does not exist or is no directory\n" "${target}" >&2
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [[ "${target}" != ".stack-work" ]]; then
|
|
||||||
if [[ -e .stack-work-clean ]]; then
|
|
||||||
printf ".stack-work-clean exists\n" >&2
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
move-back() {
|
|
||||||
if [[ -d .stack-work ]]; then
|
|
||||||
mv -vT .stack-work "${target}"
|
|
||||||
else
|
|
||||||
mkdir -v "${target}"
|
|
||||||
fi
|
|
||||||
[[ -d .stack-work-clean ]] && mv -vT .stack-work-clean .stack-work
|
|
||||||
}
|
|
||||||
|
|
||||||
mv -vT .stack-work .stack-work-clean
|
|
||||||
mv -vT "${target}" .stack-work
|
|
||||||
trap move-back EXIT
|
|
||||||
fi
|
|
||||||
|
|
||||||
(
|
|
||||||
set -ex
|
|
||||||
stack clean $@
|
|
||||||
)
|
|
||||||
@ -2,4 +2,4 @@
|
|||||||
//
|
//
|
||||||
// SPDX-License-Identifier: AGPL-3.0-or-later
|
// SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
|
|
||||||
module.exports = {extends: ['@commitlint/config-conventional']}
|
module.exports = {extends: ['@commitlint/config-conventional']};
|
||||||
|
|||||||
35
compose.yaml
Normal file
35
compose.yaml
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
services:
|
||||||
|
frontend:
|
||||||
|
# image: registry.uniworx.de/fradrive/fradrive/frontend # TODO: reference to current branch required; how to do that here?
|
||||||
|
# pull_policy: if_not_present
|
||||||
|
build:
|
||||||
|
dockerfile: ./docker/frontend/Dockerfile
|
||||||
|
context: .
|
||||||
|
environment:
|
||||||
|
- PROJECT_DIR=/fradrive
|
||||||
|
volumes:
|
||||||
|
- &fradrive-mnt .:/tmp/fradrive
|
||||||
|
backend:
|
||||||
|
# image: registry.uniworx.de/fradrive/fradrive/backend
|
||||||
|
# pull_policy: if_not_present
|
||||||
|
build:
|
||||||
|
dockerfile: ./docker/backend/Dockerfile
|
||||||
|
context: ./
|
||||||
|
volumes:
|
||||||
|
- *fradrive-mnt
|
||||||
|
depends_on:
|
||||||
|
- frontend
|
||||||
|
stdin_open: true
|
||||||
|
database:
|
||||||
|
# image: registry.uniworx.de/fradrive/fradrive/database
|
||||||
|
# pull_policy: if_not_present
|
||||||
|
build: ./docker/database
|
||||||
|
ports:
|
||||||
|
- "9876:5432"
|
||||||
|
# privileged: true
|
||||||
|
|
||||||
|
# driver: local
|
||||||
|
# driver_opts:
|
||||||
|
# type: none
|
||||||
|
# o: bind
|
||||||
|
# device: ./
|
||||||
@ -1,76 +0,0 @@
|
|||||||
{
|
|
||||||
"masterPicture": "assets/favicon.svg",
|
|
||||||
"design": {
|
|
||||||
"desktop_browser": {},
|
|
||||||
"ios": {
|
|
||||||
"picture_aspect": "background_and_margin",
|
|
||||||
"margin": "5%",
|
|
||||||
"background_color": "#ffffff",
|
|
||||||
"startup_image": {
|
|
||||||
"background_color": "#ffffff"
|
|
||||||
},
|
|
||||||
"app_name": "FRADrive",
|
|
||||||
"assets": {
|
|
||||||
"ios6_and_prior_icons": false,
|
|
||||||
"ios7_and_later_icons": true,
|
|
||||||
"precomposed_icons": true,
|
|
||||||
"declare_only_default_icon": true
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"windows": {
|
|
||||||
"picture_aspect": "white_silhouette",
|
|
||||||
"background_color": "#0a9342",
|
|
||||||
"app_name": "FRADrive"
|
|
||||||
},
|
|
||||||
"firefox_app": {
|
|
||||||
"picture_aspect": "circle",
|
|
||||||
"keep_picture_in_circle": false,
|
|
||||||
"circle_inner_margin": "5%",
|
|
||||||
"background_color": "#ffffff",
|
|
||||||
"overlay": false,
|
|
||||||
"manifest": {
|
|
||||||
"app_name": "FRADrive",
|
|
||||||
"app_description": {
|
|
||||||
"_i18n": true,
|
|
||||||
"de-de-formal": "Ein webbasiertes Schulungsverwaltungssystem",
|
|
||||||
"en-eu": "A web based training management system"
|
|
||||||
},
|
|
||||||
"developer_name": "Uni2work-Team",
|
|
||||||
"developer_url": "https://uni2work.ifi.lmu.de/info",
|
|
||||||
"display": "browser",
|
|
||||||
"start_url": "/"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"android_chrome": {
|
|
||||||
"picture_aspect": "shadow",
|
|
||||||
"manifest": {
|
|
||||||
"name": "FRADrive",
|
|
||||||
"display": "browser",
|
|
||||||
"orientation": "portrait",
|
|
||||||
"start_url": "/"
|
|
||||||
},
|
|
||||||
"assets": {
|
|
||||||
"legacy_icon": true,
|
|
||||||
"low_resolution_icons": false
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"safari_pinned_tab": {
|
|
||||||
"picture_aspect": "silhouette",
|
|
||||||
"theme_color": "#0a9342"
|
|
||||||
},
|
|
||||||
"coast": {
|
|
||||||
"picture_aspect": "background_and_margin",
|
|
||||||
"background_color": "#ffffff",
|
|
||||||
"margin": "10%"
|
|
||||||
},
|
|
||||||
"open_graph": {
|
|
||||||
"picture_aspect": "background_and_margin",
|
|
||||||
"background_color": "#ffffff",
|
|
||||||
"margin": "10%",
|
|
||||||
"ratio": "square"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"settings": {
|
|
||||||
"html_code_file": true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,3 +0,0 @@
|
|||||||
SPDX-FileCopyrightText: 2022 Gregor Kleen <gregor.kleen@ifi.lmu.de>,Steffen Jost <jost@tcs.ifi.lmu.de>
|
|
||||||
|
|
||||||
SPDX-License-Identifier: AGPL-3.0-or-later
|
|
||||||
5
config/i18n.json
Normal file
5
config/i18n.json
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
{
|
||||||
|
"_i18n": true,
|
||||||
|
"de-de-formal": "Ein webbasiertes Schulungsverwaltungssystem",
|
||||||
|
"en-eu": "A web-based training management system"
|
||||||
|
}
|
||||||
@ -1 +0,0 @@
|
|||||||
keter_testworx.yml
|
|
||||||
@ -1,77 +0,0 @@
|
|||||||
# SPDX-FileCopyrightText: 2022 Gregor Kleen <gregor.kleen@ifi.lmu.de>,Steffen Jost <jost@tcs.ifi.lmu.de>
|
|
||||||
#
|
|
||||||
# SPDX-License-Identifier: AGPL-3.0-or-later
|
|
||||||
|
|
||||||
root: ..
|
|
||||||
|
|
||||||
stanzas:
|
|
||||||
- type: webapp
|
|
||||||
|
|
||||||
# Name of your executable. You are unlikely to need to change this.
|
|
||||||
# Note that all file paths are relative to the keter.yml file.
|
|
||||||
#
|
|
||||||
# The path given is for Stack projects. If you're still using cabal, change
|
|
||||||
# to
|
|
||||||
# exec: ../dist/build/uniworx/uniworx
|
|
||||||
exec: ../dist/bin/uniworx
|
|
||||||
|
|
||||||
# Command line options passed to your application.
|
|
||||||
args: []
|
|
||||||
|
|
||||||
hosts:
|
|
||||||
- testworx.tcs.ifi.lmu.de
|
|
||||||
|
|
||||||
ssl: true
|
|
||||||
|
|
||||||
forward-env:
|
|
||||||
- LDAPHOST
|
|
||||||
- LDAPTLS
|
|
||||||
- LDAPPORT
|
|
||||||
- LDAPUSER
|
|
||||||
- LDAPPASS
|
|
||||||
- LDAPBASE
|
|
||||||
- LDAPSCOPE
|
|
||||||
- LDAPSEARCHTIME
|
|
||||||
- LDAPSTRIPES
|
|
||||||
- LDAPTIMEOUT
|
|
||||||
- LDAPLIMIT
|
|
||||||
- DUMMY_LOGIN
|
|
||||||
- DETAILED_LOGGING
|
|
||||||
- LOG_ALL
|
|
||||||
- LOGLEVEL
|
|
||||||
- ALLOW_DEPRECATED
|
|
||||||
- PWFILE
|
|
||||||
- CRYPTOID_KEYFILE
|
|
||||||
- IP_FROM_HEADER
|
|
||||||
- MAILFROM_NAME
|
|
||||||
- MAILFROM_EMAIL
|
|
||||||
- MAILOBJECT_DOMAIN
|
|
||||||
- SMTPHOST
|
|
||||||
- SMTPPORT
|
|
||||||
- SMTPSSL
|
|
||||||
- SMTPUSER
|
|
||||||
- SMTPPASS
|
|
||||||
- SMTPTIMEOUT
|
|
||||||
- SMTPLIMIT
|
|
||||||
- MAILSUPPORT
|
|
||||||
- MAILSUPPORT_NAME
|
|
||||||
- INSTANCE_ID
|
|
||||||
- MEMCACHEDHOST
|
|
||||||
- MEMCACHEDPORT
|
|
||||||
- MEMCACHEDLIMIT
|
|
||||||
- MEMCACHEDTIMEOUT
|
|
||||||
- MEMCACHEDROOT
|
|
||||||
- MEMCACHEDEXPIRATION
|
|
||||||
|
|
||||||
# Use the following to automatically copy your bundle upon creation via `yesod
|
|
||||||
# keter`. Uses `scp` internally, so you can set it to a remote destination
|
|
||||||
# copy-to: user@host:/opt/keter/incoming/
|
|
||||||
copy-to: keter@testworx.tcs.ifi.lmu.de:/opt/keter/incoming/
|
|
||||||
copy-to-args:
|
|
||||||
- "-P 30363"
|
|
||||||
|
|
||||||
# If you would like to have Keter automatically create a PostgreSQL database
|
|
||||||
# and set appropriate environment variables for it to be discovered, uncomment
|
|
||||||
# the following line.
|
|
||||||
plugins:
|
|
||||||
postgres: true
|
|
||||||
@ -1,79 +0,0 @@
|
|||||||
# SPDX-FileCopyrightText: 2022 Gregor Kleen <gregor.kleen@ifi.lmu.de>,Steffen Jost <jost@tcs.ifi.lmu.de>
|
|
||||||
#
|
|
||||||
# SPDX-License-Identifier: AGPL-3.0-or-later
|
|
||||||
|
|
||||||
root: ..
|
|
||||||
|
|
||||||
stanzas:
|
|
||||||
- type: webapp
|
|
||||||
|
|
||||||
# Name of your executable. You are unlikely to need to change this.
|
|
||||||
# Note that all file paths are relative to the keter.yml file.
|
|
||||||
#
|
|
||||||
# The path given is for Stack projects. If you're still using cabal, change
|
|
||||||
# to
|
|
||||||
# exec: ../dist/build/uniworx/uniworx
|
|
||||||
exec: ../dist/bin/uniworx
|
|
||||||
|
|
||||||
# Command line options passed to your application.
|
|
||||||
args: []
|
|
||||||
|
|
||||||
hosts:
|
|
||||||
- uni2work.ifi.lmu.de
|
|
||||||
|
|
||||||
ssl: true
|
|
||||||
|
|
||||||
forward-env:
|
|
||||||
- LDAPHOST
|
|
||||||
- LDAPTLS
|
|
||||||
- LDAPPORT
|
|
||||||
- LDAPUSER
|
|
||||||
- LDAPPASS
|
|
||||||
- LDAPBASE
|
|
||||||
- LDAPSCOPE
|
|
||||||
- LDAPSEARCHTIME
|
|
||||||
- LDAPSTRIPES
|
|
||||||
- LDAPTIMEOUT
|
|
||||||
- LDAPLIMIT
|
|
||||||
- DETAILED_LOGGING
|
|
||||||
- LOG_ALL
|
|
||||||
- LOGLEVEL
|
|
||||||
- ALLOW_DEPRECATED
|
|
||||||
- PWFILE
|
|
||||||
- CRYPTOID_KEYFILE
|
|
||||||
- IP_FROM_HEADER
|
|
||||||
- MAILFROM_NAME
|
|
||||||
- MAILFROM_EMAIL
|
|
||||||
- MAILOBJECT_DOMAIN
|
|
||||||
- SMTPHOST
|
|
||||||
- SMTPPORT
|
|
||||||
- SMTPSSL
|
|
||||||
- SMTPUSER
|
|
||||||
- SMTPPASS
|
|
||||||
- SMTPTIMEOUT
|
|
||||||
- SMTPLIMIT
|
|
||||||
- MAILSUPPORT
|
|
||||||
- MAILSUPPORT_NAME
|
|
||||||
- INSTANCE_ID
|
|
||||||
- MEMCACHEDHOST
|
|
||||||
- MEMCACHEDPORT
|
|
||||||
- MEMCACHEDLIMIT
|
|
||||||
- MEMCACHEDTIMEOUT
|
|
||||||
- MEMCACHEDROOT
|
|
||||||
- MEMCACHEDEXPIRATION
|
|
||||||
|
|
||||||
|
|
||||||
# Use the following to automatically copy your bundle upon creation via `yesod
|
|
||||||
# keter`. Uses `scp` internally, so you can set it to a remote destination
|
|
||||||
# copy-to: user@host:/opt/keter/incoming/
|
|
||||||
copy-to: root@uni2work.ifi.lmu.de:/opt/keter/incoming/
|
|
||||||
copy-to-args: []
|
|
||||||
|
|
||||||
|
|
||||||
# If you would like to have Keter automatically create a PostgreSQL database
|
|
||||||
# and set appropriate environment variables for it to be discovered, uncomment
|
|
||||||
# the following line.
|
|
||||||
plugins:
|
|
||||||
postgres:
|
|
||||||
- server: uniworxdb
|
|
||||||
port: 5432
|
|
||||||
@ -1,4 +1,4 @@
|
|||||||
# SPDX-FileCopyrightText: 2022 Gregor Kleen <gregor.kleen@ifi.lmu.de>,Sarah Vaupel <sarah.vaupel@ifi.lmu.de>,Steffen Jost <jost@tcs.ifi.lmu.de>,Wolfgang Witt <Wolfgang.Witt@campus.lmu.de>
|
# SPDX-FileCopyrightText: 2022-2024 Sarah Vaupel <sarah.vaupel@uniworx.de>, Gregor Kleen <gregor.kleen@ifi.lmu.de>,Sarah Vaupel <sarah.vaupel@ifi.lmu.de>,Steffen Jost <jost@tcs.ifi.lmu.de>,Wolfgang Witt <Wolfgang.Witt@campus.lmu.de>
|
||||||
#
|
#
|
||||||
# SPDX-License-Identifier: AGPL-3.0-or-later
|
# SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
|
|
||||||
@ -9,9 +9,9 @@
|
|||||||
|
|
||||||
static-dir: "_env:STATIC_DIR:static"
|
static-dir: "_env:STATIC_DIR:static"
|
||||||
well-known-dir: "_env:WELL_KNOWN_DIR:well-known"
|
well-known-dir: "_env:WELL_KNOWN_DIR:well-known"
|
||||||
well-known-link-file: html_code.html
|
well-known-link-file: include.html
|
||||||
|
|
||||||
webpack-manifest: "_env:WEBPACK_MANIFEST:config/webpack.yml"
|
bundler-manifest: "_env:BUNDLER_MANIFEST:config/manifest.json"
|
||||||
host: "_env:HOST:*4" # any IPv4 host
|
host: "_env:HOST:*4" # any IPv4 host
|
||||||
port: "_env:PORT:3000"
|
port: "_env:PORT:3000"
|
||||||
ip-from-header: "_env:IP_FROM_HEADER:false"
|
ip-from-header: "_env:IP_FROM_HEADER:false"
|
||||||
@ -124,7 +124,7 @@ auth-pw-hash:
|
|||||||
database:
|
database:
|
||||||
user: "_env:PGUSER:uniworx"
|
user: "_env:PGUSER:uniworx"
|
||||||
password: "_env:PGPASS:uniworx"
|
password: "_env:PGPASS:uniworx"
|
||||||
host: "_env:PGHOST:127.0.0.1"
|
host: "_env:PGHOST:localhost"
|
||||||
port: "_env:PGPORT:5432"
|
port: "_env:PGPORT:5432"
|
||||||
# See config/test-settings.yml for an override during tests
|
# See config/test-settings.yml for an override during tests
|
||||||
database: "_env:PGDATABASE:uniworx"
|
database: "_env:PGDATABASE:uniworx"
|
||||||
@ -200,6 +200,8 @@ session-memcached:
|
|||||||
timeout: "_env:SESSION_MEMCACHED_TIMEOUT:20"
|
timeout: "_env:SESSION_MEMCACHED_TIMEOUT:20"
|
||||||
expiration: "_env:SESSION_MEMCACHED_EXPIRATION:28807"
|
expiration: "_env:SESSION_MEMCACHED_EXPIRATION:28807"
|
||||||
|
|
||||||
|
|
||||||
|
# TODO: this one seems to be required!
|
||||||
memcached:
|
memcached:
|
||||||
host: "_env:MEMCACHED_HOST:localhost"
|
host: "_env:MEMCACHED_HOST:localhost"
|
||||||
port: "_env:MEMCACHED_PORT:11211"
|
port: "_env:MEMCACHED_PORT:11211"
|
||||||
@ -213,10 +215,10 @@ memcached-local:
|
|||||||
maximum-weight: 104857600 # 100MiB
|
maximum-weight: 104857600 # 100MiB
|
||||||
|
|
||||||
upload-cache:
|
upload-cache:
|
||||||
host: "_env:UPLOAD_S3_HOST:" # should be optional, but all file transfers will be empty without an S3 cache
|
host: "_env:UPLOAD_S3_HOST:localhost" # should be optional, but all file transfers will be empty without an S3 cache
|
||||||
port: "_env:UPLOAD_S3_PORT:9000"
|
port: "_env:UPLOAD_S3_PORT:9000"
|
||||||
access-key: "_env:UPLOAD_S3_KEY_ID:"
|
access-key: "_env:UPLOAD_S3_KEY_ID:minioadmin"
|
||||||
secret-key: "_env:UPLOAD_S3_KEY"
|
secret-key: "_env:UPLOAD_S3_KEY:minioadmin"
|
||||||
is-secure: "_env:UPLOAD_S3_SSL:false"
|
is-secure: "_env:UPLOAD_S3_SSL:false"
|
||||||
region: "_env:UPLOAD_S3_REGION:"
|
region: "_env:UPLOAD_S3_REGION:"
|
||||||
auto-discover-region: "_env:UPLOAD_S3_AUTO_DISCOVER_REGION:true"
|
auto-discover-region: "_env:UPLOAD_S3_AUTO_DISCOVER_REGION:true"
|
||||||
|
|||||||
7
db.sh
7
db.sh
@ -8,13 +8,6 @@ set -e
|
|||||||
|
|
||||||
# Options: see /test/Database.hs (Main)
|
# Options: see /test/Database.hs (Main)
|
||||||
|
|
||||||
[ "${FLOCKER}" != "$0" ] && exec env FLOCKER="$0" flock -en .stack-work.lock "$0" "$@" || :
|
|
||||||
|
|
||||||
if ! in-develop | grep -q 'In develop'; then
|
|
||||||
printf "Not in develop"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
stack build --fast --flag uniworx:-library-only --flag uniworx:dev
|
stack build --fast --flag uniworx:-library-only --flag uniworx:dev
|
||||||
|
|
||||||
export SERVER_SESSION_ACID_FALLBACK=${SERVER_SESSION_ACID_FALLBACK:-true}
|
export SERVER_SESSION_ACID_FALLBACK=${SERVER_SESSION_ACID_FALLBACK:-true}
|
||||||
|
|||||||
38
docker/backend/Dockerfile
Normal file
38
docker/backend/Dockerfile
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
ARG FROM_IMG=docker.io/library/haskell
|
||||||
|
ARG FROM_TAG=8.10.4
|
||||||
|
|
||||||
|
FROM ${FROM_IMG}:${FROM_TAG}
|
||||||
|
|
||||||
|
ENV LANG=de_DE.UTF-8
|
||||||
|
|
||||||
|
# compile-time dependencies
|
||||||
|
RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \
|
||||||
|
--mount=type=cache,target=/var/lib/apt,sharing=locked \
|
||||||
|
apt-get -y update && apt-get install -y libpq-dev libsodium-dev
|
||||||
|
# RUN apt-get -y update && apt-get -y install llvm
|
||||||
|
# RUN apt-get -y update && apt-get -y install g++ libghc-zlib-dev libpq-dev libsodium-dev pkg-config
|
||||||
|
# RUN apt-get -y update && DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends tzdata
|
||||||
|
RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \
|
||||||
|
--mount=type=cache,target=/var/lib/apt,sharing=locked \
|
||||||
|
apt-get -y update && apt-get install -y --no-install-recommends locales locales-all
|
||||||
|
|
||||||
|
# run-time dependencies for uniworx binary
|
||||||
|
RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \
|
||||||
|
--mount=type=cache,target=/var/lib/apt,sharing=locked \
|
||||||
|
apt-get -y update && apt-get -y install fonts-roboto
|
||||||
|
# RUN apt-get -y update && apt-get -y install pdftk
|
||||||
|
RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \
|
||||||
|
--mount=type=cache,target=/var/lib/apt,sharing=locked \
|
||||||
|
apt-get -y update && apt-get -y install texlive-latex-recommended texlive-luatex texlive-plain-generic texlive-lang-german texlive-lang-english
|
||||||
|
|
||||||
|
ARG PROJECT_DIR=/fradrive
|
||||||
|
ENV PROJECT_DIR=${PROJECT_DIR}
|
||||||
|
RUN mkdir -p "${PROJECT_DIR}"; chmod -R 7777 "${PROJECT_DIR}"
|
||||||
|
WORKDIR ${PROJECT_DIR}
|
||||||
|
ENV HOME=${PROJECT_DIR}
|
||||||
|
ENV STACK_ROOT="${PROJECT_DIR}/.stack"
|
||||||
|
|
||||||
|
RUN if [ ! -z "${IN_CI}" ]; then \
|
||||||
|
stack install yesod-bin; \
|
||||||
|
stack install hpack; \
|
||||||
|
fi
|
||||||
47
docker/fradrive/Dockerfile
Executable file
47
docker/fradrive/Dockerfile
Executable file
@ -0,0 +1,47 @@
|
|||||||
|
ARG FROM_IMG=docker.io/library/debian
|
||||||
|
ARG FROM_TAG=12.5
|
||||||
|
|
||||||
|
FROM ${FROM_IMG}:${FROM_TAG}
|
||||||
|
|
||||||
|
# Setup locales
|
||||||
|
# RUN apt-get update && apt-get -y install locales locales-all
|
||||||
|
# RUN sed -i '/en_US.UTF-8/s/^# //g' /etc/locale.gen && \
|
||||||
|
# locale-gen
|
||||||
|
# ENV LANG=en_US.UTF-8 LANGUAGE=en_US:en LC_ALL=en_US.UTF-8
|
||||||
|
|
||||||
|
# FraDrive runtime dependencies
|
||||||
|
ENV DEBIAN_FRONTEND=noninteractive
|
||||||
|
ENV TZ=Etc/UTC
|
||||||
|
RUN apt-get update && apt-get -y install libpq-dev
|
||||||
|
RUN apt-get update && apt-get -y install libsodium-dev
|
||||||
|
# TODO: minimize texlive dependencies, switch to basic schemes where possible
|
||||||
|
RUN apt-get update && apt-get -y install \
|
||||||
|
texlive-latex-base \
|
||||||
|
texlive-luatex \
|
||||||
|
texlive-fonts-recommended \
|
||||||
|
texlive-fonts-extra \
|
||||||
|
texlive-lang-english \
|
||||||
|
texlive-lang-german
|
||||||
|
|
||||||
|
# Add uniworx user and directories
|
||||||
|
RUN mkdir -p /var/lib
|
||||||
|
RUN mkdir -p /var/log
|
||||||
|
RUN groupadd -r uniworx
|
||||||
|
RUN useradd -r -g uniworx -d /var/lib/uniworx -M uniworx --uid 999
|
||||||
|
RUN mkdir -p /var/lib/uniworx && chown -R uniworx:uniworx /var/lib/uniworx
|
||||||
|
RUN mkdir -p /var/log/uniworx && chown -R uniworx:uniworx /var/log/uniworx
|
||||||
|
|
||||||
|
# Install FraDrive binaries
|
||||||
|
# RUN install -d -g uniworx -o uniworx -m 0750 /var/lib/uniworx
|
||||||
|
# RUN install -d -g uniworx -o uniworx -m 0755 /var/log/uniworx
|
||||||
|
COPY ./bin/uniworx /usr/bin/uniworx
|
||||||
|
COPY ./bin/uniworxdb /usr/bin/uniworxdb
|
||||||
|
# COPY uniworxload /usr/bin/uniworx
|
||||||
|
RUN chmod -R 777 /usr/bin
|
||||||
|
COPY ./docker/fradrive/fradrive-entrypoint.sh /entrypoint.sh
|
||||||
|
RUN chmod 777 /entrypoint.sh
|
||||||
|
|
||||||
|
USER uniworx
|
||||||
|
ENTRYPOINT /entrypoint.sh
|
||||||
|
EXPOSE 8080/tcp
|
||||||
|
VOLUME /var/lib/uniworx /var/log
|
||||||
22
docker/fradrive/fradrive-entrypoint.sh
Normal file
22
docker/fradrive/fradrive-entrypoint.sh
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
#!/bin/bash -xe
|
||||||
|
|
||||||
|
cTime=$(date -Is)
|
||||||
|
|
||||||
|
# export LOGDEST=/var/log/uniworx/${cTime}.log # kubernetes prefers log via stdout
|
||||||
|
|
||||||
|
# typeset -a configs
|
||||||
|
|
||||||
|
configDir=${CONFIG_DIR-/cfg}
|
||||||
|
# configs=()
|
||||||
|
# if [[ -d "${configDir}" ]]; then
|
||||||
|
# while IFS= read -d $'\0' cfg; do
|
||||||
|
# # IMPORTANT: The paths to the settings-yaml-files should not contain spaces, otherwise this might fail runtime!
|
||||||
|
# configs+=("${cfg}")
|
||||||
|
# done < <(find "${configDir}" \( -name '*.yml' -o -name '*.yaml' \) -print0 | sort -rz)
|
||||||
|
# fi
|
||||||
|
|
||||||
|
cd /var/lib/uniworx
|
||||||
|
|
||||||
|
# exec -- uniworx ${configs}
|
||||||
|
# find "${configDir}" \( -name '*.yml' -o -name '*.yaml' \) -print0 | sort -rz | xargs -0 exec -- uniworx
|
||||||
|
find "${configDir}" \( -name '*.yml' -o -name '*.yaml' \) -print0 | sort -rz | xargs -0 uniworx
|
||||||
29
docker/frontend/Dockerfile
Normal file
29
docker/frontend/Dockerfile
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
ARG FROM_IMG=docker.io/library/node
|
||||||
|
ARG FROM_TAG=20
|
||||||
|
|
||||||
|
FROM ${FROM_IMG}:${FROM_TAG}
|
||||||
|
|
||||||
|
ENV LANG=de_DE.UTF-8
|
||||||
|
ENV LANGUAGE=de_DE.UTF-8
|
||||||
|
|
||||||
|
# build and watch dependencies
|
||||||
|
RUN apt-get -y update && apt-get -y install exiftool
|
||||||
|
RUN apt-get -y update && apt-get -y install imagemagick
|
||||||
|
|
||||||
|
# test dependencies
|
||||||
|
# RUN apt-get -y update && apt-get -y install chromium
|
||||||
|
# ENV CHROME_BIN=chromium
|
||||||
|
|
||||||
|
# configure npm to use given proxy if specified
|
||||||
|
RUN if [ ! -z "${HTTP_PROXY}" ]; then npm config set proxy ${HTTP_PROXY}; fi
|
||||||
|
RUN if [ ! -z "${FRAPORT_NOPROXY}" ]; then npm config set noproxy "${FRAPORT_NOPROXY}"; fi
|
||||||
|
ENV NODE_EXTRA_CA_CERTS="/etc/ssl/certs/ca-certificates.crt"
|
||||||
|
|
||||||
|
ENV PROJECT_DIR=/fradrive
|
||||||
|
RUN mkdir -p ${PROJECT_DIR}
|
||||||
|
WORKDIR ${PROJECT_DIR}
|
||||||
|
ENV HOME=${PROJECT_DIR}
|
||||||
|
|
||||||
|
RUN if [ ! -z "${NPM_CUSTOM_REGISTRY}" ]; then \
|
||||||
|
printf 'registry=${NPM_CUSTOM_REGISTRY}' > .npmrc \
|
||||||
|
; fi
|
||||||
9
docker/postgres/Dockerfile
Normal file
9
docker/postgres/Dockerfile
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
FROM docker.io/postgres:12
|
||||||
|
|
||||||
|
# Allow for connecting to database without password authentication
|
||||||
|
ENV POSTGRES_HOST_AUTH_METHOD=trust
|
||||||
|
|
||||||
|
COPY --chown=postgres:postgres docker/postgres/pg_hba.conf /tmp/pg_hba.conf
|
||||||
|
COPY --chown=postgres:postgres docker/postgres/postgresql.conf /tmp/postgresql.conf
|
||||||
|
COPY docker/postgres/pgconfig.sh /docker-entrypoint-initdb.d/_pgconfig.sh
|
||||||
|
COPY --chown=postgres:postgres docker/postgres/schema.sql /docker-entrypoint-initdb.d/schema.sql
|
||||||
14
docker/postgres/initdb.sh
Normal file
14
docker/postgres/initdb.sh
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Init and start the postgres daemon
|
||||||
|
initdb --no-locale
|
||||||
|
pg_ctl start -w -o "-c listen_addresses='*' -c unix_socket_permissions=0700 -c max_connections=9990 -c shared_preload_libraries=pg_stat_statements -c session_preload_libraries=auto_explain -c auto_explain.log_min_duration=100ms"
|
||||||
|
POSTGRID=`cat /var/lib/postgresql/data/postmaster.pid | perl -le '<>=~m#(\d+)# and print $1'`
|
||||||
|
|
||||||
|
# Create uniworx and uniworx_test database
|
||||||
|
psql -f /schema.sql postgres
|
||||||
|
|
||||||
|
# Wait for postgres daemon to terminate
|
||||||
|
while [ -e /proc/$POSTGRID ]; do
|
||||||
|
sleep 0.5;
|
||||||
|
done
|
||||||
3
docker/postgres/pg_hba.conf
Normal file
3
docker/postgres/pg_hba.conf
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
local all all trust
|
||||||
|
host all all 0.0.0.0/0 trust
|
||||||
|
host all all ::1/128 trust
|
||||||
6
docker/postgres/pgconfig.sh
Executable file
6
docker/postgres/pgconfig.sh
Executable file
@ -0,0 +1,6 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
cat /tmp/pg_hba.conf > /var/lib/postgresql/data/pg_hba.conf
|
||||||
|
cat /tmp/postgresql.conf > /var/lib/postgresql/data/postgresql.conf
|
||||||
|
|
||||||
|
echo "Custom pg_hba.conf and postgresql.conf successfully deployed."
|
||||||
6
docker/postgres/postgresql.conf
Normal file
6
docker/postgres/postgresql.conf
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
listen_addresses='*'
|
||||||
|
unix_socket_permissions=0700
|
||||||
|
max_connections=9990
|
||||||
|
shared_preload_libraries=pg_stat_statements
|
||||||
|
session_preload_libraries=auto_explain
|
||||||
|
auto_explain.log_min_duration=100ms
|
||||||
5
docker/postgres/schema.sql
Normal file
5
docker/postgres/schema.sql
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
CREATE USER uniworx WITH SUPERUSER PASSWORD 'uniworx';
|
||||||
|
CREATE DATABASE uniworx_test;
|
||||||
|
GRANT ALL ON DATABASE uniworx_test TO uniworx;
|
||||||
|
CREATE DATABASE uniworx;
|
||||||
|
GRANT ALL ON DATABASE uniworx TO uniworx;
|
||||||
3
enter
Executable file
3
enter
Executable file
@ -0,0 +1,3 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
make enter CONTAINER_FILE=develop/`cat develop/.current`/"$1"
|
||||||
93
esbuild.config.mjs
Normal file
93
esbuild.config.mjs
Normal file
@ -0,0 +1,93 @@
|
|||||||
|
import * as esbuild from 'esbuild';
|
||||||
|
|
||||||
|
import babel from 'esbuild-plugin-babel';
|
||||||
|
import { sassPlugin } from 'esbuild-sass-plugin';
|
||||||
|
import svgPlugin from 'esbuild-plugin-svg-bundle';
|
||||||
|
// import svgPlugin from 'esbuild-plugin-svg';
|
||||||
|
import { copy } from 'esbuild-plugin-copy';
|
||||||
|
// import manifestPlugin from 'esbuild-plugin-manifest';
|
||||||
|
import manifestPlugin from 'esbuild-plugin-assets-manifest';
|
||||||
|
// import copyWithHashPlugin from '@enonic/esbuild-plugin-copy-with-hash';
|
||||||
|
// import inlineImportPlugin from 'esbuild-plugin-inline-import';
|
||||||
|
import { nodeModulesPolyfillPlugin } from 'esbuild-plugins-node-modules-polyfill';
|
||||||
|
|
||||||
|
const staticDir = './static';
|
||||||
|
const wellKnownDir = './well-known';
|
||||||
|
const wellKnownDirs = [ `${wellKnownDir}/de-de-formal`, `${wellKnownDir}/en-eu` ];
|
||||||
|
|
||||||
|
await esbuild.build({
|
||||||
|
bundle: true,
|
||||||
|
minify: true,
|
||||||
|
sourcemap: true,
|
||||||
|
entryPoints: {
|
||||||
|
main: './frontend/src/main.js',
|
||||||
|
polyfill: './frontend/src/polyfill.js',
|
||||||
|
},
|
||||||
|
outdir: staticDir,
|
||||||
|
plugins: [
|
||||||
|
/* inlineImportPlugin({
|
||||||
|
filter: /.svg/,
|
||||||
|
}), */
|
||||||
|
svgPlugin({
|
||||||
|
minify: true,
|
||||||
|
// hash: 'foo', // TODO: introduce caching of static files (maybe even in backend)
|
||||||
|
bundleFile: 'svg-bundle.svg',
|
||||||
|
bundleUrl: 'svg-bundle.svg',
|
||||||
|
}),
|
||||||
|
nodeModulesPolyfillPlugin({
|
||||||
|
// modules: ['crypto','worker_threads']
|
||||||
|
}),
|
||||||
|
sassPlugin(),
|
||||||
|
copy({
|
||||||
|
resolveFrom: 'cwd',
|
||||||
|
assets: {
|
||||||
|
from: [ './assets/favicons/*' ],
|
||||||
|
to: wellKnownDirs,
|
||||||
|
},
|
||||||
|
}),
|
||||||
|
copy({
|
||||||
|
resolveFrom: 'cwd',
|
||||||
|
assets: {
|
||||||
|
from: [ './config/robots.txt' ],
|
||||||
|
to: wellKnownDirs,
|
||||||
|
},
|
||||||
|
}),
|
||||||
|
// ...['de-de-formal','en-eu'].map((lang) => manifestPlugin({
|
||||||
|
manifestPlugin({
|
||||||
|
filename: 'manifest.json',
|
||||||
|
path: 'config',
|
||||||
|
// metadata: { timestamp: new Date(), module: 'myapp', type: 'esm', },
|
||||||
|
processOutput(assets) {
|
||||||
|
const orderAssets = {
|
||||||
|
main: assets['main'],
|
||||||
|
...assets
|
||||||
|
};
|
||||||
|
return JSON.stringify(orderAssets, null, ' ');
|
||||||
|
},
|
||||||
|
}),
|
||||||
|
/* copyWithHashPlugin({
|
||||||
|
patterns: [
|
||||||
|
'./assets/favicons/*',
|
||||||
|
'./config/robots.txt',
|
||||||
|
],
|
||||||
|
}), */
|
||||||
|
babel({
|
||||||
|
config: {
|
||||||
|
"sourceMaps": "inline",
|
||||||
|
"presets": [
|
||||||
|
"@babel/preset-env",
|
||||||
|
],
|
||||||
|
"plugins": [
|
||||||
|
["@babel/plugin-proposal-decorators", { "legacy": true }],
|
||||||
|
["@babel/plugin-syntax-dynamic-import"],
|
||||||
|
["@babel/plugin-transform-class-properties", { "loose": true }],
|
||||||
|
["@babel/plugin-transform-private-methods", { "loose": true }],
|
||||||
|
["@babel/plugin-transform-private-property-in-object", { "loose": true }],
|
||||||
|
["@babel/plugin-transform-modules-commonjs"],
|
||||||
|
["@babel/transform-runtime"],
|
||||||
|
["@babel/plugin-syntax-jsx"],
|
||||||
|
],
|
||||||
|
},
|
||||||
|
}),
|
||||||
|
],
|
||||||
|
});
|
||||||
33
eslint.config.mjs
Normal file
33
eslint.config.mjs
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
import js from "@eslint/js";
|
||||||
|
import globals from "globals";
|
||||||
|
import babelParser from "@babel/eslint-parser";
|
||||||
|
|
||||||
|
export default [
|
||||||
|
js.configs.recommended,
|
||||||
|
{
|
||||||
|
files: ["frontend/src/**/*.js"],
|
||||||
|
plugins: {},
|
||||||
|
languageOptions: {
|
||||||
|
ecmaVersion: 2018,
|
||||||
|
globals: {
|
||||||
|
...globals.browser,
|
||||||
|
...globals.es6,
|
||||||
|
...globals.node,
|
||||||
|
...globals.jasmine,
|
||||||
|
Atomics: "readonly",
|
||||||
|
SharedArrayBuffer: "readonly",
|
||||||
|
flatpickr: "readonly",
|
||||||
|
$: "readonly",
|
||||||
|
},
|
||||||
|
parser: babelParser,
|
||||||
|
},
|
||||||
|
rules: {
|
||||||
|
"no-console": "off",
|
||||||
|
"no-extra-semi": "off",
|
||||||
|
"semi": ["error", "always"],
|
||||||
|
"comma-dangle": ["error", "always-multiline"],
|
||||||
|
"quotes": ["error", "single"],
|
||||||
|
"no-var": "error",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
];
|
||||||
488
flake.lock
488
flake.lock
@ -37,10 +37,10 @@
|
|||||||
"flake": false,
|
"flake": false,
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1603716527,
|
"lastModified": 1603716527,
|
||||||
"narHash": "sha256-sDbrmur9Zfp4mPKohCD8IDZfXJ0Tjxpmr2R+kg5PpSY=",
|
"narHash": "sha256-X0TFfdD4KZpwl0Zr6x+PLxUt/VyKQfX7ylXHdmZIL+w=",
|
||||||
"owner": "haskell",
|
"owner": "haskell",
|
||||||
"repo": "cabal",
|
"repo": "cabal",
|
||||||
"rev": "94aaa8e4720081f9c75497e2735b90f6a819b08e",
|
"rev": "48bf10787e27364730dd37a42b603cee8d6af7ee",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
@ -53,11 +53,11 @@
|
|||||||
"cabal-34": {
|
"cabal-34": {
|
||||||
"flake": false,
|
"flake": false,
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1622475795,
|
"lastModified": 1645834128,
|
||||||
"narHash": "sha256-chwTL304Cav+7p38d9mcb+egABWmxo2Aq+xgVBgEb/U=",
|
"narHash": "sha256-wG3d+dOt14z8+ydz4SL7pwGfe7SiimxcD/LOuPCV6xM=",
|
||||||
"owner": "haskell",
|
"owner": "haskell",
|
||||||
"repo": "cabal",
|
"repo": "cabal",
|
||||||
"rev": "b086c1995cdd616fc8d91f46a21e905cc50a1049",
|
"rev": "5ff598c67f53f7c4f48e31d722ba37172230c462",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
@ -67,6 +67,23 @@
|
|||||||
"type": "github"
|
"type": "github"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"cabal-36": {
|
||||||
|
"flake": false,
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1669081697,
|
||||||
|
"narHash": "sha256-I5or+V7LZvMxfbYgZATU4awzkicBwwok4mVoje+sGmU=",
|
||||||
|
"owner": "haskell",
|
||||||
|
"repo": "cabal",
|
||||||
|
"rev": "8fd619e33d34924a94e691c5fea2c42f0fc7f144",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "haskell",
|
||||||
|
"ref": "3.6",
|
||||||
|
"repo": "cabal",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
"cardano-shell": {
|
"cardano-shell": {
|
||||||
"flake": false,
|
"flake": false,
|
||||||
"locked": {
|
"locked": {
|
||||||
@ -185,16 +202,33 @@
|
|||||||
"url": "https://gitlab.ifi.lmu.de/uni2work/haskell/esqueleto.git"
|
"url": "https://gitlab.ifi.lmu.de/uni2work/haskell/esqueleto.git"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"flake-compat": {
|
||||||
|
"flake": false,
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1672831974,
|
||||||
|
"narHash": "sha256-z9k3MfslLjWQfnjBtEtJZdq3H7kyi2kQtUThfTgdRk0=",
|
||||||
|
"owner": "input-output-hk",
|
||||||
|
"repo": "flake-compat",
|
||||||
|
"rev": "45f2638735f8cdc40fe302742b79f248d23eb368",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "input-output-hk",
|
||||||
|
"ref": "hkm/gitlab-fix",
|
||||||
|
"repo": "flake-compat",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
"flake-utils": {
|
"flake-utils": {
|
||||||
"inputs": {
|
"inputs": {
|
||||||
"systems": "systems"
|
"systems": "systems"
|
||||||
},
|
},
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1681202837,
|
"lastModified": 1705309234,
|
||||||
"narHash": "sha256-H+Rh19JDwRtpVPAWp64F+rlEtxUWBAQW28eAi3SRSzg=",
|
"narHash": "sha256-uNRRNRKmJyCRC/8y1RqBkqWBLM034y4qN7EprSdmgyA=",
|
||||||
"owner": "numtide",
|
"owner": "numtide",
|
||||||
"repo": "flake-utils",
|
"repo": "flake-utils",
|
||||||
"rev": "cfacdce06f30d2b68473a46042957675eebb3401",
|
"rev": "1ef2e671c3b0c19053962c07dbda38332dcebf26",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
@ -204,21 +238,6 @@
|
|||||||
"type": "github"
|
"type": "github"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"flake-utils_2": {
|
|
||||||
"locked": {
|
|
||||||
"lastModified": 1623875721,
|
|
||||||
"narHash": "sha256-A8BU7bjS5GirpAUv4QA+QnJ4CceLHkcXdRp4xITDB0s=",
|
|
||||||
"owner": "numtide",
|
|
||||||
"repo": "flake-utils",
|
|
||||||
"rev": "f7e004a55b120c02ecb6219596820fcd32ca8772",
|
|
||||||
"type": "github"
|
|
||||||
},
|
|
||||||
"original": {
|
|
||||||
"owner": "numtide",
|
|
||||||
"repo": "flake-utils",
|
|
||||||
"type": "github"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"ghc-8.6.5-iohk": {
|
"ghc-8.6.5-iohk": {
|
||||||
"flake": false,
|
"flake": false,
|
||||||
"locked": {
|
"locked": {
|
||||||
@ -236,14 +255,51 @@
|
|||||||
"type": "github"
|
"type": "github"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"ghc98X": {
|
||||||
|
"flake": false,
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1696643148,
|
||||||
|
"narHash": "sha256-E02DfgISH7EvvNAu0BHiPvl1E5FGMDi0pWdNZtIBC9I=",
|
||||||
|
"ref": "ghc-9.8",
|
||||||
|
"rev": "443e870d977b1ab6fc05f47a9a17bc49296adbd6",
|
||||||
|
"revCount": 61642,
|
||||||
|
"submodules": true,
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://gitlab.haskell.org/ghc/ghc"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"ref": "ghc-9.8",
|
||||||
|
"submodules": true,
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://gitlab.haskell.org/ghc/ghc"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"ghc99": {
|
||||||
|
"flake": false,
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1701580282,
|
||||||
|
"narHash": "sha256-drA01r3JrXnkKyzI+owMZGxX0JameMzjK0W5jJE/+V4=",
|
||||||
|
"ref": "refs/heads/master",
|
||||||
|
"rev": "f5eb0f2982e9cf27515e892c4bdf634bcfb28459",
|
||||||
|
"revCount": 62197,
|
||||||
|
"submodules": true,
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://gitlab.haskell.org/ghc/ghc"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"submodules": true,
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://gitlab.haskell.org/ghc/ghc"
|
||||||
|
}
|
||||||
|
},
|
||||||
"hackage": {
|
"hackage": {
|
||||||
"flake": false,
|
"flake": false,
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1629940355,
|
"lastModified": 1705796710,
|
||||||
"narHash": "sha256-o9/U8R/JtyHIcxhMLaWYP+D/52B6LH/ikCyNZ7+mymI=",
|
"narHash": "sha256-BdAqEqx6rdp8O8lu9yW1nXa8/da7+/QPgVjCJVEXyWw=",
|
||||||
"owner": "input-output-hk",
|
"owner": "input-output-hk",
|
||||||
"repo": "hackage.nix",
|
"repo": "hackage.nix",
|
||||||
"rev": "429deb2a137084c011310bad92f4cecf244f2fc2",
|
"rev": "31d4fed569912819adbf66b580489b45dc80a29a",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
@ -257,26 +313,44 @@
|
|||||||
"HTTP": "HTTP",
|
"HTTP": "HTTP",
|
||||||
"cabal-32": "cabal-32",
|
"cabal-32": "cabal-32",
|
||||||
"cabal-34": "cabal-34",
|
"cabal-34": "cabal-34",
|
||||||
|
"cabal-36": "cabal-36",
|
||||||
"cardano-shell": "cardano-shell",
|
"cardano-shell": "cardano-shell",
|
||||||
"flake-utils": "flake-utils_2",
|
"flake-compat": "flake-compat",
|
||||||
"ghc-8.6.5-iohk": "ghc-8.6.5-iohk",
|
"ghc-8.6.5-iohk": "ghc-8.6.5-iohk",
|
||||||
|
"ghc98X": "ghc98X",
|
||||||
|
"ghc99": "ghc99",
|
||||||
"hackage": "hackage",
|
"hackage": "hackage",
|
||||||
|
"hls-1.10": "hls-1.10",
|
||||||
|
"hls-2.0": "hls-2.0",
|
||||||
|
"hls-2.2": "hls-2.2",
|
||||||
|
"hls-2.3": "hls-2.3",
|
||||||
|
"hls-2.4": "hls-2.4",
|
||||||
|
"hls-2.5": "hls-2.5",
|
||||||
|
"hls-2.6": "hls-2.6",
|
||||||
"hpc-coveralls": "hpc-coveralls",
|
"hpc-coveralls": "hpc-coveralls",
|
||||||
"nix-tools": "nix-tools",
|
"hydra": "hydra",
|
||||||
"nixpkgs": "nixpkgs",
|
"iserv-proxy": "iserv-proxy",
|
||||||
|
"nixpkgs": [
|
||||||
|
"haskell-nix",
|
||||||
|
"nixpkgs-unstable"
|
||||||
|
],
|
||||||
"nixpkgs-2003": "nixpkgs-2003",
|
"nixpkgs-2003": "nixpkgs-2003",
|
||||||
"nixpkgs-2009": "nixpkgs-2009",
|
|
||||||
"nixpkgs-2105": "nixpkgs-2105",
|
"nixpkgs-2105": "nixpkgs-2105",
|
||||||
|
"nixpkgs-2111": "nixpkgs-2111",
|
||||||
|
"nixpkgs-2205": "nixpkgs-2205",
|
||||||
|
"nixpkgs-2211": "nixpkgs-2211",
|
||||||
|
"nixpkgs-2305": "nixpkgs-2305",
|
||||||
|
"nixpkgs-2311": "nixpkgs-2311",
|
||||||
"nixpkgs-unstable": "nixpkgs-unstable",
|
"nixpkgs-unstable": "nixpkgs-unstable",
|
||||||
"old-ghc-nix": "old-ghc-nix",
|
"old-ghc-nix": "old-ghc-nix",
|
||||||
"stackage": "stackage"
|
"stackage": "stackage"
|
||||||
},
|
},
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1629940530,
|
"lastModified": 1705798224,
|
||||||
"narHash": "sha256-cf/bshYWloj+rJSmOcFokN6Rs1lpFkiECKpykN3JBH8=",
|
"narHash": "sha256-/zJa0hC58vLD8PqTEQNeN9EJAQpbS+YluJhLVstgqY8=",
|
||||||
"owner": "input-output-hk",
|
"owner": "input-output-hk",
|
||||||
"repo": "haskell.nix",
|
"repo": "haskell.nix",
|
||||||
"rev": "5fcd4faf98fc8ca8287e2c7bc1fff71dfd340f1f",
|
"rev": "2a31673a97ed3efbae9835ea7334528d2bc4b6ab",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
@ -285,6 +359,125 @@
|
|||||||
"type": "github"
|
"type": "github"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"hls-1.10": {
|
||||||
|
"flake": false,
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1680000865,
|
||||||
|
"narHash": "sha256-rc7iiUAcrHxwRM/s0ErEsSPxOR3u8t7DvFeWlMycWgo=",
|
||||||
|
"owner": "haskell",
|
||||||
|
"repo": "haskell-language-server",
|
||||||
|
"rev": "b08691db779f7a35ff322b71e72a12f6e3376fd9",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "haskell",
|
||||||
|
"ref": "1.10.0.0",
|
||||||
|
"repo": "haskell-language-server",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"hls-2.0": {
|
||||||
|
"flake": false,
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1687698105,
|
||||||
|
"narHash": "sha256-OHXlgRzs/kuJH8q7Sxh507H+0Rb8b7VOiPAjcY9sM1k=",
|
||||||
|
"owner": "haskell",
|
||||||
|
"repo": "haskell-language-server",
|
||||||
|
"rev": "783905f211ac63edf982dd1889c671653327e441",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "haskell",
|
||||||
|
"ref": "2.0.0.1",
|
||||||
|
"repo": "haskell-language-server",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"hls-2.2": {
|
||||||
|
"flake": false,
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1693064058,
|
||||||
|
"narHash": "sha256-8DGIyz5GjuCFmohY6Fa79hHA/p1iIqubfJUTGQElbNk=",
|
||||||
|
"owner": "haskell",
|
||||||
|
"repo": "haskell-language-server",
|
||||||
|
"rev": "b30f4b6cf5822f3112c35d14a0cba51f3fe23b85",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "haskell",
|
||||||
|
"ref": "2.2.0.0",
|
||||||
|
"repo": "haskell-language-server",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"hls-2.3": {
|
||||||
|
"flake": false,
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1695910642,
|
||||||
|
"narHash": "sha256-tR58doOs3DncFehHwCLczJgntyG/zlsSd7DgDgMPOkI=",
|
||||||
|
"owner": "haskell",
|
||||||
|
"repo": "haskell-language-server",
|
||||||
|
"rev": "458ccdb55c9ea22cd5d13ec3051aaefb295321be",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "haskell",
|
||||||
|
"ref": "2.3.0.0",
|
||||||
|
"repo": "haskell-language-server",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"hls-2.4": {
|
||||||
|
"flake": false,
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1699862708,
|
||||||
|
"narHash": "sha256-YHXSkdz53zd0fYGIYOgLt6HrA0eaRJi9mXVqDgmvrjk=",
|
||||||
|
"owner": "haskell",
|
||||||
|
"repo": "haskell-language-server",
|
||||||
|
"rev": "54507ef7e85fa8e9d0eb9a669832a3287ffccd57",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "haskell",
|
||||||
|
"ref": "2.4.0.1",
|
||||||
|
"repo": "haskell-language-server",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"hls-2.5": {
|
||||||
|
"flake": false,
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1701080174,
|
||||||
|
"narHash": "sha256-fyiR9TaHGJIIR0UmcCb73Xv9TJq3ht2ioxQ2mT7kVdc=",
|
||||||
|
"owner": "haskell",
|
||||||
|
"repo": "haskell-language-server",
|
||||||
|
"rev": "27f8c3d3892e38edaef5bea3870161815c4d014c",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "haskell",
|
||||||
|
"ref": "2.5.0.0",
|
||||||
|
"repo": "haskell-language-server",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"hls-2.6": {
|
||||||
|
"flake": false,
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1705325287,
|
||||||
|
"narHash": "sha256-+P87oLdlPyMw8Mgoul7HMWdEvWP/fNlo8jyNtwME8E8=",
|
||||||
|
"owner": "haskell",
|
||||||
|
"repo": "haskell-language-server",
|
||||||
|
"rev": "6e0b342fa0327e628610f2711f8c3e4eaaa08b1e",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "haskell",
|
||||||
|
"ref": "2.6.0.0",
|
||||||
|
"repo": "haskell-language-server",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
"hpc-coveralls": {
|
"hpc-coveralls": {
|
||||||
"flake": false,
|
"flake": false,
|
||||||
"locked": {
|
"locked": {
|
||||||
@ -301,6 +494,46 @@
|
|||||||
"type": "github"
|
"type": "github"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"hydra": {
|
||||||
|
"inputs": {
|
||||||
|
"nix": "nix",
|
||||||
|
"nixpkgs": [
|
||||||
|
"haskell-nix",
|
||||||
|
"hydra",
|
||||||
|
"nix",
|
||||||
|
"nixpkgs"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1671755331,
|
||||||
|
"narHash": "sha256-hXsgJj0Cy0ZiCiYdW2OdBz5WmFyOMKuw4zyxKpgUKm4=",
|
||||||
|
"owner": "NixOS",
|
||||||
|
"repo": "hydra",
|
||||||
|
"rev": "f48f00ee6d5727ae3e488cbf9ce157460853fea8",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"id": "hydra",
|
||||||
|
"type": "indirect"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"iserv-proxy": {
|
||||||
|
"flake": false,
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1691634696,
|
||||||
|
"narHash": "sha256-MZH2NznKC/gbgBu8NgIibtSUZeJ00HTLJ0PlWKCBHb0=",
|
||||||
|
"ref": "hkm/remote-iserv",
|
||||||
|
"rev": "43a979272d9addc29fbffc2e8542c5d96e993d73",
|
||||||
|
"revCount": 14,
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://gitlab.haskell.org/hamishmack/iserv-proxy.git"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"ref": "hkm/remote-iserv",
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://gitlab.haskell.org/hamishmack/iserv-proxy.git"
|
||||||
|
}
|
||||||
|
},
|
||||||
"ldap-client": {
|
"ldap-client": {
|
||||||
"flake": false,
|
"flake": false,
|
||||||
"locked": {
|
"locked": {
|
||||||
@ -318,6 +551,22 @@
|
|||||||
"url": "https://gitlab.ifi.lmu.de/uni2work/haskell/ldap-client.git"
|
"url": "https://gitlab.ifi.lmu.de/uni2work/haskell/ldap-client.git"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"lowdown-src": {
|
||||||
|
"flake": false,
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1633514407,
|
||||||
|
"narHash": "sha256-Dw32tiMjdK9t3ETl5fzGrutQTzh2rufgZV4A/BbxuD4=",
|
||||||
|
"owner": "kristapsdz",
|
||||||
|
"repo": "lowdown",
|
||||||
|
"rev": "d2c2b44ff6c27b936ec27358a2653caaef8f73b8",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "kristapsdz",
|
||||||
|
"repo": "lowdown",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
"memcached-binary": {
|
"memcached-binary": {
|
||||||
"flake": false,
|
"flake": false,
|
||||||
"locked": {
|
"locked": {
|
||||||
@ -352,34 +601,39 @@
|
|||||||
"url": "https://gitlab.ifi.lmu.de/uni2work/haskell/minio-hs.git"
|
"url": "https://gitlab.ifi.lmu.de/uni2work/haskell/minio-hs.git"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"nix-tools": {
|
"nix": {
|
||||||
"flake": false,
|
"inputs": {
|
||||||
|
"lowdown-src": "lowdown-src",
|
||||||
|
"nixpkgs": "nixpkgs",
|
||||||
|
"nixpkgs-regression": "nixpkgs-regression"
|
||||||
|
},
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1626997434,
|
"lastModified": 1661606874,
|
||||||
"narHash": "sha256-1judQmP298ao6cGUNxcGhcAXHOnA9qSLvWk/ZtoUL7w=",
|
"narHash": "sha256-9+rpYzI+SmxJn+EbYxjGv68Ucp22bdFUSy/4LkHkkDQ=",
|
||||||
"owner": "input-output-hk",
|
"owner": "NixOS",
|
||||||
"repo": "nix-tools",
|
"repo": "nix",
|
||||||
"rev": "c8c5e6a6fbb12a73598d1a434984a36e880ce3cf",
|
"rev": "11e45768b34fdafdcf019ddbd337afa16127ff0f",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
"owner": "input-output-hk",
|
"owner": "NixOS",
|
||||||
"repo": "nix-tools",
|
"ref": "2.11.0",
|
||||||
|
"repo": "nix",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"nixpkgs": {
|
"nixpkgs": {
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1624291665,
|
"lastModified": 1657693803,
|
||||||
"narHash": "sha256-kNkaoa3dai9WOi7fsPklCCWZ8hRAkXx0ZUhpYKShyUk=",
|
"narHash": "sha256-G++2CJ9u0E7NNTAi9n5G8TdDmGJXcIjkJ3NF8cetQB8=",
|
||||||
"owner": "NixOS",
|
"owner": "NixOS",
|
||||||
"repo": "nixpkgs",
|
"repo": "nixpkgs",
|
||||||
"rev": "3c6f3f84af60a8ed5b8a79cf3026b7630fcdefb8",
|
"rev": "365e1b3a859281cf11b94f87231adeabbdd878a2",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
"owner": "NixOS",
|
"owner": "NixOS",
|
||||||
"ref": "nixpkgs-20.09-darwin",
|
"ref": "nixos-22.05-small",
|
||||||
"repo": "nixpkgs",
|
"repo": "nixpkgs",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
}
|
}
|
||||||
@ -400,29 +654,13 @@
|
|||||||
"type": "github"
|
"type": "github"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"nixpkgs-2009": {
|
|
||||||
"locked": {
|
|
||||||
"lastModified": 1624271064,
|
|
||||||
"narHash": "sha256-qns/uRW7MR2EfVf6VEeLgCsCp7pIOjDeR44JzTF09MA=",
|
|
||||||
"owner": "NixOS",
|
|
||||||
"repo": "nixpkgs",
|
|
||||||
"rev": "46d1c3f28ca991601a53e9a14fdd53fcd3dd8416",
|
|
||||||
"type": "github"
|
|
||||||
},
|
|
||||||
"original": {
|
|
||||||
"owner": "NixOS",
|
|
||||||
"ref": "nixpkgs-20.09-darwin",
|
|
||||||
"repo": "nixpkgs",
|
|
||||||
"type": "github"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"nixpkgs-2105": {
|
"nixpkgs-2105": {
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1624291665,
|
"lastModified": 1659914493,
|
||||||
"narHash": "sha256-kNkaoa3dai9WOi7fsPklCCWZ8hRAkXx0ZUhpYKShyUk=",
|
"narHash": "sha256-lkA5X3VNMKirvA+SUzvEhfA7XquWLci+CGi505YFAIs=",
|
||||||
"owner": "NixOS",
|
"owner": "NixOS",
|
||||||
"repo": "nixpkgs",
|
"repo": "nixpkgs",
|
||||||
"rev": "3c6f3f84af60a8ed5b8a79cf3026b7630fcdefb8",
|
"rev": "022caabb5f2265ad4006c1fa5b1ebe69fb0c3faf",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
@ -432,6 +670,86 @@
|
|||||||
"type": "github"
|
"type": "github"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"nixpkgs-2111": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1659446231,
|
||||||
|
"narHash": "sha256-hekabNdTdgR/iLsgce5TGWmfIDZ86qjPhxDg/8TlzhE=",
|
||||||
|
"owner": "NixOS",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"rev": "eabc38219184cc3e04a974fe31857d8e0eac098d",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "NixOS",
|
||||||
|
"ref": "nixpkgs-21.11-darwin",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"nixpkgs-2205": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1685573264,
|
||||||
|
"narHash": "sha256-Zffu01pONhs/pqH07cjlF10NnMDLok8ix5Uk4rhOnZQ=",
|
||||||
|
"owner": "NixOS",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"rev": "380be19fbd2d9079f677978361792cb25e8a3635",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "NixOS",
|
||||||
|
"ref": "nixpkgs-22.05-darwin",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"nixpkgs-2211": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1688392541,
|
||||||
|
"narHash": "sha256-lHrKvEkCPTUO+7tPfjIcb7Trk6k31rz18vkyqmkeJfY=",
|
||||||
|
"owner": "NixOS",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"rev": "ea4c80b39be4c09702b0cb3b42eab59e2ba4f24b",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "NixOS",
|
||||||
|
"ref": "nixpkgs-22.11-darwin",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"nixpkgs-2305": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1701362232,
|
||||||
|
"narHash": "sha256-GVdzxL0lhEadqs3hfRLuj+L1OJFGiL/L7gCcelgBlsw=",
|
||||||
|
"owner": "NixOS",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"rev": "d2332963662edffacfddfad59ff4f709dde80ffe",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "NixOS",
|
||||||
|
"ref": "nixpkgs-23.05-darwin",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"nixpkgs-2311": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1701386440,
|
||||||
|
"narHash": "sha256-xI0uQ9E7JbmEy/v8kR9ZQan6389rHug+zOtZeZFiDJk=",
|
||||||
|
"owner": "NixOS",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"rev": "293822e55ec1872f715a66d0eda9e592dc14419f",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "NixOS",
|
||||||
|
"ref": "nixpkgs-23.11-darwin",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
"nixpkgs-recent": {
|
"nixpkgs-recent": {
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1669833724,
|
"lastModified": 1669833724,
|
||||||
@ -448,19 +766,35 @@
|
|||||||
"type": "github"
|
"type": "github"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"nixpkgs-unstable": {
|
"nixpkgs-regression": {
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1628785280,
|
"lastModified": 1643052045,
|
||||||
"narHash": "sha256-2B5eMrEr6O8ff2aQNeVxTB+9WrGE80OB4+oM6T7fOcc=",
|
"narHash": "sha256-uGJ0VXIhWKGXxkeNnq4TvV3CIOkUJ3PAoLZ3HMzNVMw=",
|
||||||
"owner": "NixOS",
|
"owner": "NixOS",
|
||||||
"repo": "nixpkgs",
|
"repo": "nixpkgs",
|
||||||
"rev": "6525bbc06a39f26750ad8ee0d40000ddfdc24acb",
|
"rev": "215d4d0fd80ca5163643b03a33fde804a29cc1e2",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
"owner": "NixOS",
|
"owner": "NixOS",
|
||||||
"ref": "nixpkgs-unstable",
|
|
||||||
"repo": "nixpkgs",
|
"repo": "nixpkgs",
|
||||||
|
"rev": "215d4d0fd80ca5163643b03a33fde804a29cc1e2",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"nixpkgs-unstable": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1694822471,
|
||||||
|
"narHash": "sha256-6fSDCj++lZVMZlyqOe9SIOL8tYSBz1bI8acwovRwoX8=",
|
||||||
|
"owner": "NixOS",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"rev": "47585496bcb13fb72e4a90daeea2f434e2501998",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "NixOS",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"rev": "47585496bcb13fb72e4a90daeea2f434e2501998",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -483,16 +817,16 @@
|
|||||||
"old-ghc-nix": {
|
"old-ghc-nix": {
|
||||||
"flake": false,
|
"flake": false,
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1621819714,
|
"lastModified": 1631092763,
|
||||||
"narHash": "sha256-EJCnYQSWk7FRLwS0lZgTWIiQ6pcvDX1VuD6LGD4Uwzs=",
|
"narHash": "sha256-sIKgO+z7tj4lw3u6oBZxqIhDrzSkvpHtv0Kki+lh9Fg=",
|
||||||
"owner": "angerman",
|
"owner": "angerman",
|
||||||
"repo": "old-ghc-nix",
|
"repo": "old-ghc-nix",
|
||||||
"rev": "f089a6f090cdb35fcf95f865fc6a31ba6b3ac4eb",
|
"rev": "af48a7a7353e418119b6dfe3cd1463a657f342b8",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
"owner": "angerman",
|
"owner": "angerman",
|
||||||
"ref": "master2",
|
"ref": "master",
|
||||||
"repo": "old-ghc-nix",
|
"repo": "old-ghc-nix",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
}
|
}
|
||||||
@ -539,11 +873,11 @@
|
|||||||
"stackage": {
|
"stackage": {
|
||||||
"flake": false,
|
"flake": false,
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1629940472,
|
"lastModified": 1705795852,
|
||||||
"narHash": "sha256-LFrNC25OpNoS6dGG5om+UGP8YdYjp01Qm6cenbemaVg=",
|
"narHash": "sha256-Po+1G5KgHVRbP/PzK3HgdI1ZS7XJtP63vJmpSZMvFV8=",
|
||||||
"owner": "input-output-hk",
|
"owner": "input-output-hk",
|
||||||
"repo": "stackage.nix",
|
"repo": "stackage.nix",
|
||||||
"rev": "c50dd0527babf85818cc67a7099e532e453752db",
|
"rev": "8adfc78e62d3dbc3498a03579a50f3cf70cd4328",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
|
|||||||
24
flake.nix
24
flake.nix
@ -114,7 +114,9 @@
|
|||||||
(final: prev: let
|
(final: prev: let
|
||||||
pkgs-recent = import nixpkgs-recent { inherit system; };
|
pkgs-recent = import nixpkgs-recent { inherit system; };
|
||||||
in {
|
in {
|
||||||
inherit (pkgs-recent) dockerTools node2nix glibcLocalesUtf8 tzdata chromium minio minio-client skopeo; inherit (pkgs-recent.stdenv) fetchurlBoot;
|
inherit (pkgs-recent) gup dockerTools nodejs-14_x glibcLocalesUtf8 tzdata chromium minio minio-client skopeo;
|
||||||
|
inherit (pkgs-recent.stdenv) fetchurlBoot make;
|
||||||
|
inherit (pkgs-recent.coreutils) touch;
|
||||||
stack = pkgs.symlinkJoin {
|
stack = pkgs.symlinkJoin {
|
||||||
inherit (pkgs-recent.stack) name;
|
inherit (pkgs-recent.stack) name;
|
||||||
paths = [pkgs-recent.stack];
|
paths = [pkgs-recent.stack];
|
||||||
@ -133,36 +135,16 @@
|
|||||||
};
|
};
|
||||||
})
|
})
|
||||||
|
|
||||||
(import ./nix/maildev)
|
|
||||||
haskell-nix.overlay
|
haskell-nix.overlay
|
||||||
(import ./nix/uniworx { inherit inputs frontendSource backendSource; gitRevision = if self ? rev then self.rev else null; })
|
|
||||||
(import ./nix/docker { inherit self; })
|
|
||||||
(import ./nix/parse-changelog.nix {})
|
|
||||||
];
|
];
|
||||||
|
|
||||||
haskellFlake = pkgs.uniworx.flake {};
|
haskellFlake = pkgs.uniworx.flake {};
|
||||||
|
|
||||||
inherit (pkgs.lib) recursiveUpdate;
|
inherit (pkgs.lib) recursiveUpdate;
|
||||||
in {
|
in {
|
||||||
packages = haskellFlake.packages // {
|
|
||||||
inherit (pkgs) uniworxNodeDependencies uniworxWellKnown uniworxFrontend uniworxTestDocker uniworxDocker changelogJson;
|
|
||||||
};
|
|
||||||
|
|
||||||
apps = haskellFlake.apps // {
|
|
||||||
calculateMaterializedSha = flake-utils.lib.mkApp { drv = pkgs.uniworx.stack-nix.passthru.calculateMaterializedSha; exePath = ""; };
|
|
||||||
jqChangelogJson = flake-utils.lib.mkApp { drv = pkgs.jqChangelogJson; };
|
|
||||||
};
|
|
||||||
|
|
||||||
checks = haskellFlake.checks // {
|
|
||||||
uniworxFrontend = pkgs.uniworxFrontend.check;
|
|
||||||
};
|
|
||||||
|
|
||||||
devShell = import ./shell.nix { pkgs = self.legacyPackages.${system}; nixpkgsPath = nixpkgs; };
|
devShell = import ./shell.nix { pkgs = self.legacyPackages.${system}; nixpkgsPath = nixpkgs; };
|
||||||
|
|
||||||
legacyPackages = pkgs.lib.foldr (overlay: acc: acc // recursiveUpdate (overlay self.legacyPackages.${system} pkgs) pkgs) {} overlays;
|
legacyPackages = pkgs.lib.foldr (overlay: acc: acc // recursiveUpdate (overlay self.legacyPackages.${system} pkgs) pkgs) {} overlays;
|
||||||
|
|
||||||
defaultPackage = self.packages.${system}."uniworx:exe:uniworx";
|
|
||||||
defaultApp = self.apps.${system}."uniworx:exe:uniworx";
|
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,14 +1,18 @@
|
|||||||
// SPDX-FileCopyrightText: 2022 Gregor Kleen <gregor.kleen@ifi.lmu.de>
|
// SPDX-FileCopyrightText: 2022-2024 Sarah Vaupel <sarah.vaupel@uniworx.de>, Gregor Kleen <gregor.kleen@ifi.lmu.de>, David Mosbach <david.mosbach@uniworx.de>
|
||||||
//
|
//
|
||||||
// SPDX-License-Identifier: AGPL-3.0-or-later
|
// SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
// SPDX-License-Identifier: LicenseRef-Fraport-Corporate-Design
|
// SPDX-License-Identifier: LicenseRef-Fraport-Corporate-Design
|
||||||
|
|
||||||
@use "~@fortawesome/fontawesome-pro/scss/fontawesome" with ( $fa-font-path: "~@fortawesome/fontawesome-pro/webfonts" )
|
//@use "~@fortawesome/fontawesome-pro/scss/fontawesome" with ( $fa-font-path: "~@fortawesome/fontawesome-pro/webfonts" )
|
||||||
|
|
||||||
@forward "~@fortawesome/fontawesome-pro/scss/fontawesome"
|
//@forward "~@fortawesome/fontawesome-pro/scss/fontawesome"
|
||||||
|
|
||||||
@use "~@fortawesome/fontawesome-pro/scss/solid"
|
//@use "~@fortawesome/fontawesome-pro/scss/solid"
|
||||||
|
|
||||||
|
@use "icons.scss"
|
||||||
|
|
||||||
|
$icons: '~/assets/icons/fradrive'
|
||||||
|
|
||||||
|
@function ico-content($ico)
|
||||||
|
@return url('#{$icons}/#{$ico}.svg')
|
||||||
|
|
||||||
@use "~typeface-roboto" as roboto
|
|
||||||
@use "~typeface-source-sans-pro" as source-sans-pro
|
|
||||||
@use "~typeface-source-code-pro" as source-code-pro
|
|
||||||
|
|||||||
@ -1,9 +1,10 @@
|
|||||||
// SPDX-FileCopyrightText: 2022 Gregor Kleen <gregor.kleen@ifi.lmu.de>,Sarah Vaupel <sarah.vaupel@ifi.lmu.de>,Sarah Vaupel <vaupel.sarah@campus.lmu.de>,Steffen Jost <jost@cip.ifi.lmu.de>,Wolfgang Witt <Wolfgang.Witt@campus.lmu.de>
|
// SPDX-FileCopyrightText: 2022-2024 Sarah Vaupel <sarah.vaupel@uniworx.de>, Gregor Kleen <gregor.kleen@ifi.lmu.de>,Sarah Vaupel <sarah.vaupel@ifi.lmu.de>,Sarah Vaupel <vaupel.sarah@campus.lmu.de>,Steffen Jost <jost@cip.ifi.lmu.de>,Wolfgang Witt <Wolfgang.Witt@campus.lmu.de>,David Mosbach <david.mosbach@uniworx.de>
|
||||||
//
|
//
|
||||||
// SPDX-License-Identifier: AGPL-3.0-or-later
|
// SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
// SPDX-License-Identifier: LicenseRef-Fraport-Corporate-Design
|
// SPDX-License-Identifier: LicenseRef-Fraport-Corporate-Design
|
||||||
|
|
||||||
@use "common" as *
|
@use "common" as *
|
||||||
|
@use "icons"
|
||||||
|
|
||||||
\:root
|
\:root
|
||||||
// THEME INDEPENDENT COLORS
|
// THEME INDEPENDENT COLORS
|
||||||
@ -27,9 +28,9 @@
|
|||||||
--color-fontsec: #5b5861
|
--color-fontsec: #5b5861
|
||||||
|
|
||||||
// FONTS
|
// FONTS
|
||||||
--font-base: "Source Sans Pro", "Trebuchet MS", sans-serif
|
--font-base: 'Arial', sans-serif
|
||||||
--font-logo: "Roboto", var(--font-base)
|
--font-logo: var(--font-base)
|
||||||
--font-monospace: "Source Code Pro", monospace
|
--font-monospace: 'Arial Mono', monospace
|
||||||
|
|
||||||
// DIMENSIONS
|
// DIMENSIONS
|
||||||
--header-height: 100px
|
--header-height: 100px
|
||||||
@ -62,6 +63,7 @@ body
|
|||||||
--color-link: var(--color-font)
|
--color-link: var(--color-font)
|
||||||
--color-link-hover: var(--color-font)
|
--color-link-hover: var(--color-font)
|
||||||
--color-lmu-box-border: var(--color-lightwhite)
|
--color-lmu-box-border: var(--color-lightwhite)
|
||||||
|
--filter-primary: invert(7%) sepia(83%) saturate(4889%) hue-rotate(241deg) brightness(106%) contrast(169%)
|
||||||
|
|
||||||
&.theme--lavender
|
&.theme--lavender
|
||||||
--color-primary: #584c9c
|
--color-primary: #584c9c
|
||||||
@ -71,6 +73,7 @@ body
|
|||||||
--color-darker: #3c2765
|
--color-darker: #3c2765
|
||||||
--color-link: var(--color-dark)
|
--color-link: var(--color-dark)
|
||||||
--color-link-hover: var(--color-darker)
|
--color-link-hover: var(--color-darker)
|
||||||
|
--filter-primary: invert(28%) sepia(36%) saturate(1286%) hue-rotate(212deg) brightness(97%) contrast(83%)
|
||||||
|
|
||||||
&.theme--neutral-blue
|
&.theme--neutral-blue
|
||||||
--color-primary: #3E606F
|
--color-primary: #3E606F
|
||||||
@ -78,6 +81,7 @@ body
|
|||||||
--color-lighter: rgb(145, 159, 170)
|
--color-lighter: rgb(145, 159, 170)
|
||||||
--color-dark: rgb(42, 74, 88)
|
--color-dark: rgb(42, 74, 88)
|
||||||
--color-darker: #193441
|
--color-darker: #193441
|
||||||
|
--filter-primary: invert(35%) sepia(8%) saturate(2168%) hue-rotate(153deg) brightness(88%) contrast(80%)
|
||||||
|
|
||||||
&.theme--aberdeen-reds
|
&.theme--aberdeen-reds
|
||||||
--color-primary: #820333
|
--color-primary: #820333
|
||||||
@ -85,6 +89,7 @@ body
|
|||||||
--color-lighter: #F0433A
|
--color-lighter: #F0433A
|
||||||
--color-dark: #540032
|
--color-dark: #540032
|
||||||
--color-darker: #2E112D
|
--color-darker: #2E112D
|
||||||
|
--filter-primary: invert(12%) sepia(38%) saturate(6051%) hue-rotate(322deg) brightness(91%) contrast(110%)
|
||||||
|
|
||||||
&.theme--moss-green
|
&.theme--moss-green
|
||||||
--color-primary: #5C996B
|
--color-primary: #5C996B
|
||||||
@ -92,6 +97,7 @@ body
|
|||||||
--color-lighter: #99FFB2
|
--color-lighter: #99FFB2
|
||||||
--color-dark: #3D6647
|
--color-dark: #3D6647
|
||||||
--color-darker: #1F3324
|
--color-darker: #1F3324
|
||||||
|
--filter-primary: invert(57%) sepia(19%) saturate(788%) hue-rotate(82deg) brightness(92%) contrast(87%)
|
||||||
|
|
||||||
&.theme--sky-love
|
&.theme--sky-love
|
||||||
--color-primary: #87ABE5
|
--color-primary: #87ABE5
|
||||||
@ -101,6 +107,7 @@ body
|
|||||||
--color-darker: #6B7BC9
|
--color-darker: #6B7BC9
|
||||||
--color-link: var(--color-lightblack)
|
--color-link: var(--color-lightblack)
|
||||||
--color-link-hover: var(--color-darker)
|
--color-link-hover: var(--color-darker)
|
||||||
|
--filter-primary: invert(55%) sepia(47%) saturate(394%) hue-rotate(180deg) brightness(115%) contrast(80%)
|
||||||
|
|
||||||
// END THEMES
|
// END THEMES
|
||||||
|
|
||||||
@ -263,6 +270,9 @@ button:not(.btn-link),
|
|||||||
&.btn-danger
|
&.btn-danger
|
||||||
background-color: var(--color-error-dark)
|
background-color: var(--color-error-dark)
|
||||||
|
|
||||||
|
span
|
||||||
|
@extend .white-ico
|
||||||
|
|
||||||
.buttongroup
|
.buttongroup
|
||||||
display: grid
|
display: grid
|
||||||
grid: min-content / auto-flow max-content
|
grid: min-content / auto-flow max-content
|
||||||
@ -450,9 +460,9 @@ input[type="button"].btn-info:not(.btn-link):hover,
|
|||||||
color: inherit
|
color: inherit
|
||||||
|
|
||||||
&::before
|
&::before
|
||||||
@extend .fas
|
@extend .ico-link
|
||||||
|
|
||||||
content: fa-content($fa-var-link)
|
content:""
|
||||||
margin-right: 0.25em
|
margin-right: 0.25em
|
||||||
|
|
||||||
&.table__th-link::before
|
&.table__th-link::before
|
||||||
@ -655,7 +665,6 @@ section
|
|||||||
margin: 0 auto 0.5rem
|
margin: 0 auto 0.5rem
|
||||||
|
|
||||||
&::before
|
&::before
|
||||||
@extend .fas
|
|
||||||
|
|
||||||
position: absolute
|
position: absolute
|
||||||
display: flex
|
display: flex
|
||||||
@ -675,6 +684,13 @@ section
|
|||||||
&.notification--broad
|
&.notification--broad
|
||||||
max-width: none
|
max-width: none
|
||||||
|
|
||||||
|
.fas
|
||||||
|
position: absolute
|
||||||
|
left: 20px
|
||||||
|
top: 0
|
||||||
|
height: 100%
|
||||||
|
width: 60px
|
||||||
|
|
||||||
&:first-child
|
&:first-child
|
||||||
margin-top: 0
|
margin-top: 0
|
||||||
&:last-child
|
&:last-child
|
||||||
@ -1271,6 +1287,9 @@ ul.breadcrumbs__list
|
|||||||
margin: 0 5px
|
margin: 0 5px
|
||||||
margin-top: 1px
|
margin-top: 1px
|
||||||
|
|
||||||
|
span
|
||||||
|
@extend .white-ico
|
||||||
|
|
||||||
a.breadcrumbs__home
|
a.breadcrumbs__home
|
||||||
opacity: 0.5
|
opacity: 0.5
|
||||||
margin-right: 7px
|
margin-right: 7px
|
||||||
@ -1281,6 +1300,10 @@ a.breadcrumbs__home
|
|||||||
&:hover
|
&:hover
|
||||||
opacity: 1
|
opacity: 1
|
||||||
|
|
||||||
|
i
|
||||||
|
@extend .white-ico
|
||||||
|
|
||||||
|
|
||||||
.breadcrumbs__last-item
|
.breadcrumbs__last-item
|
||||||
font-weight: 600
|
font-weight: 600
|
||||||
opacity: 1
|
opacity: 1
|
||||||
|
|||||||
165
frontend/src/icons.scss
Normal file
165
frontend/src/icons.scss
Normal file
@ -0,0 +1,165 @@
|
|||||||
|
// SPDX-FileCopyrightText: 2024-2025 David Mosbach <david.mosbach@uniworx.de>, Sarah Vaupel <sarah.vaupel@uniworx.de>
|
||||||
|
//
|
||||||
|
// SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
|
// SPDX-License-Identifier: LicenseRef-Fraport-Corporate-Design
|
||||||
|
|
||||||
|
@import 'env';
|
||||||
|
|
||||||
|
$ico-width: 30px;
|
||||||
|
|
||||||
|
$icons: new,
|
||||||
|
ok,
|
||||||
|
not-ok,
|
||||||
|
warning,
|
||||||
|
problem,
|
||||||
|
visible,
|
||||||
|
invisible,
|
||||||
|
course-favourite-manual,
|
||||||
|
course-favourite-automatic,
|
||||||
|
course-favourite-off,
|
||||||
|
enrol-true,
|
||||||
|
enrol-false,
|
||||||
|
planned,
|
||||||
|
announce,
|
||||||
|
exam,
|
||||||
|
exam-register-true,
|
||||||
|
exam-register-false,
|
||||||
|
exam-auto-occurrence-nudge-up,
|
||||||
|
exam-auto-occurrence-nudge-down,
|
||||||
|
exam-auto-occurrence-ignore,
|
||||||
|
exam-auto-occurrence-reconsider,
|
||||||
|
comment-true,
|
||||||
|
comment-false,
|
||||||
|
link,
|
||||||
|
file-donwload,
|
||||||
|
file-upload,
|
||||||
|
file-zip,
|
||||||
|
file-csv,
|
||||||
|
sft-question,
|
||||||
|
sft-hint,
|
||||||
|
sft-solution,
|
||||||
|
sft-marking,
|
||||||
|
email,
|
||||||
|
register-template,
|
||||||
|
no-correctors,
|
||||||
|
remove-user,
|
||||||
|
tooltip-default,
|
||||||
|
notification-success,
|
||||||
|
notification-info,
|
||||||
|
notification-warning,
|
||||||
|
notification-error,
|
||||||
|
notification-nonactive,
|
||||||
|
favourite,
|
||||||
|
language,
|
||||||
|
nav-container-close,
|
||||||
|
page-action-children-close,
|
||||||
|
menu-news,
|
||||||
|
menu-help,
|
||||||
|
menu-profile,
|
||||||
|
menu-login,
|
||||||
|
menu-logout,
|
||||||
|
breadcrumbs-home,
|
||||||
|
menu-extra,
|
||||||
|
menu-course-list,
|
||||||
|
menu-corrections,
|
||||||
|
menu-exams,
|
||||||
|
menu-admin,
|
||||||
|
menu-lms,
|
||||||
|
menu-qualification,
|
||||||
|
page-action-primary-expand,
|
||||||
|
page-action-secondary,
|
||||||
|
breadcrumb-separator,
|
||||||
|
file-upload-session,
|
||||||
|
standalone-field-error,
|
||||||
|
file-user,
|
||||||
|
notification,
|
||||||
|
notification-sent,
|
||||||
|
no-notification,
|
||||||
|
personal-identification,
|
||||||
|
menu-workflows,
|
||||||
|
video,
|
||||||
|
submission-user-duplicate,
|
||||||
|
submission-no-users,
|
||||||
|
reset,
|
||||||
|
blocked,
|
||||||
|
certificate,
|
||||||
|
print-center,
|
||||||
|
letter,
|
||||||
|
at,
|
||||||
|
supervisor,
|
||||||
|
supervisor-foreign,
|
||||||
|
waiting-for-user,
|
||||||
|
expired,
|
||||||
|
locked,
|
||||||
|
unlocked,
|
||||||
|
trash,
|
||||||
|
reset-tries,
|
||||||
|
company,
|
||||||
|
edit,
|
||||||
|
user-edit,
|
||||||
|
placeholder,
|
||||||
|
loading;
|
||||||
|
|
||||||
|
|
||||||
|
@each $name in $icons {
|
||||||
|
.ico-#{$name} {
|
||||||
|
background-image: url('#{$path}/assets/icons/fradrive/#{$name}.svg');
|
||||||
|
background-size: contain;
|
||||||
|
background-repeat: no-repeat;
|
||||||
|
background-position: center;
|
||||||
|
aspect-ratio: 1/1;
|
||||||
|
min-width: 1em;
|
||||||
|
font-size: inherit;
|
||||||
|
display: inline-block;
|
||||||
|
vertical-align: middle;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.white-ico {
|
||||||
|
filter: invert(100%) sepia(20%) saturate(901%) hue-rotate(47deg) brightness(106%) contrast(101%);
|
||||||
|
}
|
||||||
|
|
||||||
|
.fw-ico {
|
||||||
|
width: $ico-width;
|
||||||
|
}
|
||||||
|
|
||||||
|
.small-ico {
|
||||||
|
font-size: 1em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.medium-ico {
|
||||||
|
font-size: 1.5em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.large-ico {
|
||||||
|
font-size: 2em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ico-spin {
|
||||||
|
animation-name: ico-spin;
|
||||||
|
animation-delay: 0s;
|
||||||
|
animation-duration: 3s;
|
||||||
|
animation-direction: normal;
|
||||||
|
animation-iteration-count: infinite;
|
||||||
|
animation-timing-function: linear;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (prefers-reduced-motion: reduce) {
|
||||||
|
.ico-spin {
|
||||||
|
animation-delay: -1ms;
|
||||||
|
animation-duration: 1ms;
|
||||||
|
animation-iteration-count: 1;
|
||||||
|
transition-delay: 0s;
|
||||||
|
transition-duration: 0s;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes ico-spin {
|
||||||
|
0% {
|
||||||
|
transform: rotate(0deg);
|
||||||
|
}
|
||||||
|
100% {
|
||||||
|
transform: rotate(360deg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@ -1,11 +1,11 @@
|
|||||||
// SPDX-FileCopyrightText: 2022 Gregor Kleen <gregor.kleen@ifi.lmu.de>,Johannes Eder <ederj@cip.ifi.lmu.de>,Sarah Vaupel <sarah.vaupel@ifi.lmu.de>,Sarah Vaupel <vaupel.sarah@campus.lmu.de>
|
// SPDX-FileCopyrightText: 2022-2025 Sarah Vaupel <sarah.vaupel@uniworx.de>, Gregor Kleen <gregor.kleen@ifi.lmu.de>,Johannes Eder <ederj@cip.ifi.lmu.de>,Sarah Vaupel <sarah.vaupel@ifi.lmu.de>,Sarah Vaupel <vaupel.sarah@campus.lmu.de>
|
||||||
//
|
//
|
||||||
// SPDX-License-Identifier: AGPL-3.0-or-later
|
// SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
|
|
||||||
/* global global:writable */
|
/* global:writable */
|
||||||
|
|
||||||
import semver from 'semver';
|
import semver from 'semver';
|
||||||
import sodium from 'sodium-javascript';
|
// import sodium from 'sodium-javascript';
|
||||||
|
|
||||||
import { HttpClient } from '../../services/http-client/http-client';
|
import { HttpClient } from '../../services/http-client/http-client';
|
||||||
|
|
||||||
@ -365,7 +365,7 @@ export class StorageManager {
|
|||||||
}
|
}
|
||||||
|
|
||||||
addHistoryListener(listener, options=this._options, ...args) {
|
addHistoryListener(listener, options=this._options, ...args) {
|
||||||
const modified_listener = (function(event, ...listener_args) { // eslint-disable-line no-unused-vars
|
const modified_listener = (function(event, ...listener_args) {
|
||||||
|
|
||||||
// do not propagate popstate events with empty state
|
// do not propagate popstate events with empty state
|
||||||
if(event.state === null)
|
if(event.state === null)
|
||||||
@ -460,7 +460,7 @@ export class StorageManager {
|
|||||||
const enc = this.load('encryption', { ...options, encryption: false });
|
const enc = this.load('encryption', { ...options, encryption: false });
|
||||||
const requestBody = {
|
const requestBody = {
|
||||||
type : options.encryption,
|
type : options.encryption,
|
||||||
length : sodium.crypto_secretbox_KEYBYTES,
|
length : undefined, // sodium.crypto_secretbox_KEYBYTES,
|
||||||
salt : enc.salt,
|
salt : enc.salt,
|
||||||
timestamp : enc.timestamp,
|
timestamp : enc.timestamp,
|
||||||
};
|
};
|
||||||
@ -498,17 +498,15 @@ function encrypt(plaintext, key) {
|
|||||||
if (!plaintext) return '';
|
if (!plaintext) return '';
|
||||||
if (!key) throw new Error('Cannot encrypt plaintext without a valid key!');
|
if (!key) throw new Error('Cannot encrypt plaintext without a valid key!');
|
||||||
|
|
||||||
/* eslint-disable no-undef */
|
|
||||||
// TODO use const if possible
|
// TODO use const if possible
|
||||||
let plaintextB = Buffer.from(plaintext);
|
// let plaintextB = Buffer.from(plaintext);
|
||||||
let cipherB = Buffer.alloc(plaintextB.length + sodium.crypto_secretbox_MACBYTES);
|
// let cipherB = Buffer.alloc(plaintextB.length + sodium.crypto_secretbox_MACBYTES);
|
||||||
let nonceB = Buffer.alloc(sodium.crypto_secretbox_NONCEBYTES);
|
// let nonceB = Buffer.alloc(sodium.crypto_secretbox_NONCEBYTES);
|
||||||
let keyB = Buffer.from(key);
|
// let keyB = Buffer.from(key);
|
||||||
/* eslint-enable no-undef */
|
|
||||||
|
|
||||||
sodium.crypto_secretbox_easy(cipherB, plaintextB, nonceB, keyB);
|
// sodium.crypto_secretbox_easy(cipherB, plaintextB, nonceB, keyB);
|
||||||
|
|
||||||
const result = cipherB;
|
const result = null; // cipherB;
|
||||||
console.log('encrypt result', result);
|
console.log('encrypt result', result);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
@ -520,15 +518,13 @@ function decrypt(ciphertext, key) {
|
|||||||
if (!ciphertext) return '';
|
if (!ciphertext) return '';
|
||||||
if (!key) throw new Error('Cannot decrypt ciphertext without a valid key!');
|
if (!key) throw new Error('Cannot decrypt ciphertext without a valid key!');
|
||||||
|
|
||||||
/* eslint-disable no-undef */
|
|
||||||
// TODO use const if possible
|
// TODO use const if possible
|
||||||
let cipherB = Buffer.from(ciphertext);
|
// let cipherB = Buffer.from(ciphertext);
|
||||||
let plaintextB = Buffer.alloc(cipherB.length - sodium.crypto_secretbox_MACBYTES);
|
let plaintextB = null; // Buffer.alloc(cipherB.length - sodium.crypto_secretbox_MACBYTES);
|
||||||
let nonceB = Buffer.alloc(sodium.crypto_secretbox_NONCEBYTES);
|
// let nonceB = undefined; Buffer.alloc(sodium.crypto_secretbox_NONCEBYTES);
|
||||||
let keyB = Buffer.from(key);
|
// let keyB = Buffer.from(key);
|
||||||
/* eslint-enable no-undef */
|
|
||||||
|
|
||||||
sodium.crypto_secretbox_open_easy(plaintextB, cipherB, nonceB, keyB);
|
// sodium.crypto_secretbox_open_easy(plaintextB, cipherB, nonceB, keyB);
|
||||||
|
|
||||||
const result = plaintextB.toString();
|
const result = plaintextB.toString();
|
||||||
console.log('decrypt result', result);
|
console.log('decrypt result', result);
|
||||||
|
|||||||
@ -171,7 +171,7 @@ export class Alerts {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
_createAlertElement(type, content, icon = 'info-circle') {
|
_createAlertElement(type, content, icon = 'notification-info') {
|
||||||
const alertElement = document.createElement('div');
|
const alertElement = document.createElement('div');
|
||||||
alertElement.classList.add(ALERT_CLASS, 'alert-' + type);
|
alertElement.classList.add(ALERT_CLASS, 'alert-' + type);
|
||||||
|
|
||||||
@ -179,7 +179,7 @@ export class Alerts {
|
|||||||
alertCloser.classList.add(ALERT_CLOSER_CLASS);
|
alertCloser.classList.add(ALERT_CLOSER_CLASS);
|
||||||
|
|
||||||
const alertIcon = document.createElement('div');
|
const alertIcon = document.createElement('div');
|
||||||
alertIcon.classList.add(ALERT_ICON_CLASS, 'fas', 'fa-' + icon);
|
alertIcon.classList.add(ALERT_ICON_CLASS, 'ico-' + icon);
|
||||||
|
|
||||||
const alertContent = document.createElement('div');
|
const alertContent = document.createElement('div');
|
||||||
alertContent.classList.add(ALERT_CONTENT_CLASS);
|
alertContent.classList.add(ALERT_CONTENT_CLASS);
|
||||||
|
|||||||
@ -1,9 +1,10 @@
|
|||||||
// SPDX-FileCopyrightText: 2022 Gregor Kleen <gregor.kleen@ifi.lmu.de>
|
// SPDX-FileCopyrightText: 2022-2024 Gregor Kleen <gregor.kleen@ifi.lmu.de>,David Mosbach <david.mosbach@uniworx.de>
|
||||||
//
|
//
|
||||||
// SPDX-License-Identifier: AGPL-3.0-or-later
|
// SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
// SPDX-License-Identifier: LicenseRef-Fraport-Corporate-Design
|
// SPDX-License-Identifier: LicenseRef-Fraport-Corporate-Design
|
||||||
|
|
||||||
@use "../../common" as *
|
@use "../../common" as *
|
||||||
|
@use '../../icons'
|
||||||
|
|
||||||
.alerts
|
.alerts
|
||||||
position: fixed
|
position: fixed
|
||||||
@ -24,9 +25,9 @@
|
|||||||
cursor: pointer
|
cursor: pointer
|
||||||
|
|
||||||
&::before
|
&::before
|
||||||
@extend .fas
|
@extend .ico-nav-container-close
|
||||||
|
|
||||||
content: fa-content($fa-var-chevron-up)
|
content: ""
|
||||||
position: absolute
|
position: absolute
|
||||||
left: 50%
|
left: 50%
|
||||||
top: 0
|
top: 0
|
||||||
@ -111,7 +112,7 @@
|
|||||||
.alert__icon
|
.alert__icon
|
||||||
text-align: right
|
text-align: right
|
||||||
position: absolute
|
position: absolute
|
||||||
left: 0px
|
left: 8px
|
||||||
bottom: 0
|
bottom: 0
|
||||||
width: 50px
|
width: 50px
|
||||||
height: 100%
|
height: 100%
|
||||||
@ -152,9 +153,9 @@
|
|||||||
color: white
|
color: white
|
||||||
|
|
||||||
&::before
|
&::before
|
||||||
@extend .fas
|
@extend .ico-not-ok
|
||||||
|
|
||||||
content: fa-content($fa-var-times)
|
content: ""
|
||||||
position: absolute
|
position: absolute
|
||||||
top: 50%
|
top: 50%
|
||||||
left: 50%
|
left: 50%
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
// SPDX-FileCopyrightText: 2022 Gregor Kleen <gregor.kleen@ifi.lmu.de>,Sarah Vaupel <sarah.vaupel@ifi.lmu.de>,Sarah Vaupel <vaupel.sarah@campus.lmu.de>
|
// SPDX-FileCopyrightText: 2022-2024 Gregor Kleen <gregor.kleen@ifi.lmu.de>,Sarah Vaupel <sarah.vaupel@ifi.lmu.de>,Sarah Vaupel <vaupel.sarah@campus.lmu.de>,David Mosbach <david.mosbach@uniworx.de>
|
||||||
//
|
//
|
||||||
// SPDX-License-Identifier: AGPL-3.0-or-later
|
// SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
|
|
||||||
@ -461,7 +461,7 @@ export class ExamCorrect {
|
|||||||
for (let [k, v] of Object.entries(newEntry.results)) {
|
for (let [k, v] of Object.entries(newEntry.results)) {
|
||||||
const resultCell = row.cells.item(this._cIndices.get(k));
|
const resultCell = row.cells.item(this._cIndices.get(k));
|
||||||
if (v === null) {
|
if (v === null) {
|
||||||
resultCell.innerHTML = '<i class="fas fa-fw fa-trash"></i>';
|
resultCell.innerHTML = '<i class="fas fw-ico ico-trash"></i>';
|
||||||
resultCell.classList.remove('exam-correct--result-unconfirmed');
|
resultCell.classList.remove('exam-correct--result-unconfirmed');
|
||||||
} else if (v && v.result !== undefined && v.result !== null) {
|
} else if (v && v.result !== undefined && v.result !== null) {
|
||||||
resultCell.innerHTML = v.result;
|
resultCell.innerHTML = v.result;
|
||||||
@ -499,7 +499,7 @@ export class ExamCorrect {
|
|||||||
else
|
else
|
||||||
html = examResult.status;
|
html = examResult.status;
|
||||||
} else if (examResult === null) {
|
} else if (examResult === null) {
|
||||||
html = '<i class="fas fa-fw fa-trash"></i>';
|
html = '<i class="fas fw-ico ico-trash"></i>';
|
||||||
}
|
}
|
||||||
|
|
||||||
return html;
|
return html;
|
||||||
@ -598,7 +598,7 @@ export class ExamCorrect {
|
|||||||
const partCell = document.createElement('TD');
|
const partCell = document.createElement('TD');
|
||||||
|
|
||||||
if (partResult === null) {
|
if (partResult === null) {
|
||||||
partCell.innerHTML = '<i class="fas fa-fw fa-trash"></i>';
|
partCell.innerHTML = '<i class="fas fw-ico ico-trash"></i>';
|
||||||
} else {
|
} else {
|
||||||
partCell.innerHTML = partResult;
|
partCell.innerHTML = partResult;
|
||||||
}
|
}
|
||||||
@ -683,10 +683,10 @@ function userToHTML(user) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function setStatus(elem, status) {
|
function setStatus(elem, status) {
|
||||||
const successClasses = ['fas', 'fa-fw', 'fa-check', 'exam-correct--success'];
|
const successClasses = ['fas', 'fw-ico', 'ico-ok', 'exam-correct--success'];
|
||||||
const ambiguousClasses = ['fas', 'fa-fw', 'fa-question', 'exam-correct--ambiguous'];
|
const ambiguousClasses = ['fas', 'fw-ico', 'ico-menu-help', 'exam-correct--ambiguous'];
|
||||||
const errorClasses = ['fas', 'fa-fw', 'fa-times', 'exam-correct--error'];
|
const errorClasses = ['fas', 'fw-ico', 'ico-not-ok', 'exam-correct--error'];
|
||||||
const loadingClasses = ['fas', 'fa-fw', 'fa-spinner-third', 'fa-spin'];
|
const loadingClasses = ['fas', 'fw-ico', 'ico-loading', 'ico-spin'];
|
||||||
|
|
||||||
elem.classList.remove(...successClasses, ...ambiguousClasses, ...errorClasses, ...loadingClasses);
|
elem.classList.remove(...successClasses, ...ambiguousClasses, ...errorClasses, ...loadingClasses);
|
||||||
|
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
// SPDX-FileCopyrightText: 2022 Gregor Kleen <gregor.kleen@ifi.lmu.de>,Sarah Vaupel <sarah.vaupel@ifi.lmu.de>,Sarah Vaupel <vaupel.sarah@campus.lmu.de>
|
// SPDX-FileCopyrightText: 2022-2024 Gregor Kleen <gregor.kleen@ifi.lmu.de>,Sarah Vaupel <sarah.vaupel@ifi.lmu.de>,Sarah Vaupel <vaupel.sarah@campus.lmu.de>,David Mosbach <david.mosbach@uniworx.de>
|
||||||
//
|
//
|
||||||
// SPDX-License-Identifier: AGPL-3.0-or-later
|
// SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
|
|
||||||
@ -104,8 +104,8 @@ export class HideColumns {
|
|||||||
|
|
||||||
const hider = document.createElement('span');
|
const hider = document.createElement('span');
|
||||||
|
|
||||||
const hiderIcon = document.createElement('i');
|
const hiderIcon = document.createElement('span');
|
||||||
hiderIcon.classList.add('fas', 'fa-fw');
|
hiderIcon.classList.add('fas');
|
||||||
hider.appendChild(hiderIcon);
|
hider.appendChild(hiderIcon);
|
||||||
|
|
||||||
const hiderContent = document.createElement('span');
|
const hiderContent = document.createElement('span');
|
||||||
@ -240,8 +240,8 @@ export class HideColumns {
|
|||||||
|
|
||||||
updateHiderIcon(hider, hidden) {
|
updateHiderIcon(hider, hidden) {
|
||||||
Array.from(hider.getElementsByClassName('fas')).forEach(hiderIcon => {
|
Array.from(hider.getElementsByClassName('fas')).forEach(hiderIcon => {
|
||||||
hiderIcon.classList.remove(hidden ? 'fa-eye' : 'fa-eye-slash');
|
hiderIcon.classList.remove(hidden ? 'ico-visible' : 'ico-invisible');
|
||||||
hiderIcon.classList.add(hidden ? 'fa-eye-slash' : 'fa-eye');
|
hiderIcon.classList.add(hidden ? 'ico-invisible' : 'ico-visible');
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -1,8 +1,10 @@
|
|||||||
// SPDX-FileCopyrightText: 2022 Gregor Kleen <gregor.kleen@ifi.lmu.de>
|
// SPDX-FileCopyrightText: 2022-2024 Gregor Kleen <gregor.kleen@ifi.lmu.de>,David Mosbach <david.mosbach@uniworx.de>
|
||||||
//
|
//
|
||||||
// SPDX-License-Identifier: AGPL-3.0-or-later
|
// SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
// SPDX-License-Identifier: LicenseRef-Fraport-Corporate-Design
|
// SPDX-License-Identifier: LicenseRef-Fraport-Corporate-Design
|
||||||
|
|
||||||
|
@use "../../icons.scss"
|
||||||
|
|
||||||
.table-hider
|
.table-hider
|
||||||
background-color: #fff
|
background-color: #fff
|
||||||
color: var(--color-link)
|
color: var(--color-link)
|
||||||
@ -16,6 +18,9 @@
|
|||||||
transform-origin: top
|
transform-origin: top
|
||||||
z-index: 1
|
z-index: 1
|
||||||
|
|
||||||
|
.fas
|
||||||
|
filter: var(--filter-primary)
|
||||||
|
|
||||||
&:hover
|
&:hover
|
||||||
background-color: var(--color-grey-light)
|
background-color: var(--color-grey-light)
|
||||||
|
|
||||||
@ -66,5 +71,9 @@
|
|||||||
&:empty
|
&:empty
|
||||||
margin: 0
|
margin: 0
|
||||||
|
|
||||||
|
.fas
|
||||||
|
@extend .white-ico
|
||||||
|
|
||||||
|
|
||||||
.hide-columns--hidden-cell
|
.hide-columns--hidden-cell
|
||||||
display: none
|
display: none
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
// SPDX-FileCopyrightText: 2022 Gregor Kleen <gregor.kleen@ifi.lmu.de>,Sarah Vaupel <sarah.vaupel@ifi.lmu.de>
|
// SPDX-FileCopyrightText: 2022-2024 Gregor Kleen <gregor.kleen@ifi.lmu.de>,Sarah Vaupel <sarah.vaupel@ifi.lmu.de>,David Mosbach <david.mosbach@uniworx.de>
|
||||||
//
|
//
|
||||||
// SPDX-License-Identifier: AGPL-3.0-or-later
|
// SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
|
|
||||||
@ -42,7 +42,7 @@ export class Password {
|
|||||||
this._wrapperEl.appendChild(this._toggleContainerEl);
|
this._wrapperEl.appendChild(this._toggleContainerEl);
|
||||||
|
|
||||||
this._iconEl = document.createElement('i');
|
this._iconEl = document.createElement('i');
|
||||||
this._iconEl.classList.add('fas', 'fa-fw');
|
this._iconEl.classList.add('fas');
|
||||||
this._toggleContainerEl.appendChild(this._iconEl);
|
this._toggleContainerEl.appendChild(this._iconEl);
|
||||||
|
|
||||||
parentEl.insertBefore(this._wrapperEl, siblingEl);
|
parentEl.insertBefore(this._wrapperEl, siblingEl);
|
||||||
@ -91,7 +91,7 @@ export class Password {
|
|||||||
|
|
||||||
updateVisibleIcon(visible) {
|
updateVisibleIcon(visible) {
|
||||||
function visibleClass(visible) {
|
function visibleClass(visible) {
|
||||||
return 'fa-' + (visible ? 'eye' : 'eye-slash');
|
return `ico-${visible ? '' : 'in'}visible`;
|
||||||
}
|
}
|
||||||
|
|
||||||
this._iconEl.classList.remove(visibleClass(!visible));
|
this._iconEl.classList.remove(visibleClass(!visible));
|
||||||
|
|||||||
@ -2,7 +2,7 @@
|
|||||||
//
|
//
|
||||||
// SPDX-License-Identifier: AGPL-3.0-or-later
|
// SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
|
|
||||||
/* global global:writable */
|
/* global:writable */
|
||||||
|
|
||||||
import { Utility } from '../../core/utility';
|
import { Utility } from '../../core/utility';
|
||||||
import { Datepicker } from '../form/datepicker';
|
import { Datepicker } from '../form/datepicker';
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
// SPDX-FileCopyrightText: 2022 Gregor Kleen <gregor.kleen@ifi.lmu.de>
|
// SPDX-FileCopyrightText: 2022-2024 Gregor Kleen <gregor.kleen@ifi.lmu.de>,David Mosbach <david.mosbach@uniworx.de>
|
||||||
//
|
//
|
||||||
// SPDX-License-Identifier: AGPL-3.0-or-later
|
// SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
// SPDX-License-Identifier: LicenseRef-Fraport-Corporate-Design
|
// SPDX-License-Identifier: LicenseRef-Fraport-Corporate-Design
|
||||||
@ -98,9 +98,10 @@ div.modal__trigger
|
|||||||
z-index: 20
|
z-index: 20
|
||||||
|
|
||||||
&::before
|
&::before
|
||||||
@extend .fas
|
@extend .ico-not-ok
|
||||||
|
@extend .white-ico
|
||||||
|
|
||||||
content: fa-content($fa-var-times)
|
content: ""
|
||||||
color: white
|
color: white
|
||||||
|
|
||||||
.modal__content
|
.modal__content
|
||||||
|
|||||||
@ -1,8 +1,10 @@
|
|||||||
// SPDX-FileCopyrightText: 2022 Gregor Kleen <gregor.kleen@ifi.lmu.de>
|
// SPDX-FileCopyrightText: 2022-2024 Gregor Kleen <gregor.kleen@ifi.lmu.de>,David Mosbach <david.mosbach@uniworx.de>
|
||||||
//
|
//
|
||||||
// SPDX-License-Identifier: AGPL-3.0-or-later
|
// SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
// SPDX-License-Identifier: LicenseRef-Fraport-Corporate-Design
|
// SPDX-License-Identifier: LicenseRef-Fraport-Corporate-Design
|
||||||
|
|
||||||
|
@use '../../icons.scss'
|
||||||
|
|
||||||
.navbar-container
|
.navbar-container
|
||||||
position: relative
|
position: relative
|
||||||
|
|
||||||
@ -170,6 +172,9 @@
|
|||||||
transition: opacity 0.2s ease
|
transition: opacity 0.2s ease
|
||||||
margin-bottom: 7px
|
margin-bottom: 7px
|
||||||
|
|
||||||
|
span
|
||||||
|
@extend .white-ico
|
||||||
|
|
||||||
.navbar__link-label
|
.navbar__link-label
|
||||||
transition: opacity .2s ease
|
transition: opacity .2s ease
|
||||||
padding: 2px 4px
|
padding: 2px 4px
|
||||||
@ -253,6 +258,11 @@
|
|||||||
.navbar__link-wrapper
|
.navbar__link-wrapper
|
||||||
color: var(--color-dark)
|
color: var(--color-dark)
|
||||||
|
|
||||||
|
.navbar__link-icon
|
||||||
|
.white-ico
|
||||||
|
filter: var(--filter-primary)
|
||||||
|
|
||||||
|
|
||||||
.navbar__list-item--active .navbar__link-wrapper
|
.navbar__list-item--active .navbar__link-wrapper
|
||||||
color: var(--color-dark)
|
color: var(--color-dark)
|
||||||
|
|
||||||
@ -263,6 +273,7 @@
|
|||||||
.navbar__link-icon
|
.navbar__link-icon
|
||||||
opacity: 1
|
opacity: 1
|
||||||
|
|
||||||
|
|
||||||
// sticky state
|
// sticky state
|
||||||
.navbar--sticky
|
.navbar--sticky
|
||||||
height: var(--header-height-collapsed)
|
height: var(--header-height-collapsed)
|
||||||
|
|||||||
@ -1,9 +1,10 @@
|
|||||||
// SPDX-FileCopyrightText: 2022 Gregor Kleen <gregor.kleen@ifi.lmu.de>
|
// SPDX-FileCopyrightText: 2022-2024 Gregor Kleen <gregor.kleen@ifi.lmu.de>,David Mosbach <david.mosbach@uniworx.de>
|
||||||
//
|
//
|
||||||
// SPDX-License-Identifier: AGPL-3.0-or-later
|
// SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
// SPDX-License-Identifier: LicenseRef-Fraport-Corporate-Design
|
// SPDX-License-Identifier: LicenseRef-Fraport-Corporate-Design
|
||||||
|
|
||||||
@use "../../common" as *
|
@use "../../common" as *
|
||||||
|
@use "../../icons.scss"
|
||||||
|
|
||||||
.tooltip
|
.tooltip
|
||||||
position: relative
|
position: relative
|
||||||
@ -63,11 +64,19 @@
|
|||||||
.table__th &
|
.table__th &
|
||||||
color: white
|
color: white
|
||||||
|
|
||||||
|
.fas
|
||||||
|
@extend .white-ico
|
||||||
|
|
||||||
.tooltip.tooltip__inline
|
.tooltip.tooltip__inline
|
||||||
.tooltip__handle
|
.tooltip__handle
|
||||||
height: 1.0rem
|
height: 1.0rem
|
||||||
line-height: 1.0rem
|
line-height: 1.0rem
|
||||||
font-size: 1.0rem
|
font-size: 1.0rem
|
||||||
|
.fas
|
||||||
|
filter: var(--filter-primary)
|
||||||
|
.table__th & .fas
|
||||||
|
@extend .white-ico
|
||||||
|
|
||||||
|
|
||||||
.tooltip__content
|
.tooltip__content
|
||||||
position: absolute
|
position: absolute
|
||||||
@ -112,6 +121,11 @@
|
|||||||
left: unset
|
left: unset
|
||||||
top: unset
|
top: unset
|
||||||
transform: unset
|
transform: unset
|
||||||
|
.tooltip__handle
|
||||||
|
.fas
|
||||||
|
filter: var(--filter-primary)
|
||||||
|
.table__th & .fas
|
||||||
|
@extend .white-ico
|
||||||
|
|
||||||
.tooltip--spread
|
.tooltip--spread
|
||||||
width: 100%
|
width: 100%
|
||||||
@ -123,10 +137,10 @@
|
|||||||
padding: 4px 17px 4px 4px
|
padding: 4px 17px 4px 4px
|
||||||
|
|
||||||
&::after
|
&::after
|
||||||
@extend .fas
|
@extend .ico-notification-nonactive
|
||||||
@extend .fa-fw
|
@extend .fw-ico
|
||||||
|
|
||||||
content: '\f129'
|
content: ''
|
||||||
position: absolute
|
position: absolute
|
||||||
right: 2px
|
right: 2px
|
||||||
top: 6px
|
top: 6px
|
||||||
|
|||||||
@ -1,4 +0,0 @@
|
|||||||
cabal2nix.gup:
|
|
||||||
*.nix
|
|
||||||
hpack.gup:
|
|
||||||
*.cabal
|
|
||||||
@ -1,3 +0,0 @@
|
|||||||
SPDX-FileCopyrightText: 2022 Gregor Kleen <gregor.kleen@ifi.lmu.de>
|
|
||||||
|
|
||||||
SPDX-License-Identifier: AGPL-3.0-or-later
|
|
||||||
@ -1,8 +0,0 @@
|
|||||||
#! /usr/bin/env nix-shell
|
|
||||||
#! nix-shell -i zsh -p zsh haskellPackages.cabal2nix
|
|
||||||
|
|
||||||
gup -u ${2:r}.cabal
|
|
||||||
|
|
||||||
cd ${2:h}
|
|
||||||
|
|
||||||
cabal2nix . > $1
|
|
||||||
@ -1,3 +0,0 @@
|
|||||||
SPDX-FileCopyrightText: 2022 Gregor Kleen <gregor.kleen@ifi.lmu.de>
|
|
||||||
|
|
||||||
SPDX-License-Identifier: AGPL-3.0-or-later
|
|
||||||
@ -1,6 +0,0 @@
|
|||||||
#! /usr/bin/env nix-shell
|
|
||||||
#! nix-shell -i sh -p haskellPackages.hpack
|
|
||||||
|
|
||||||
gup -u package.yaml
|
|
||||||
|
|
||||||
hpack - >$1
|
|
||||||
@ -1,3 +0,0 @@
|
|||||||
SPDX-FileCopyrightText: 2022 Gregor Kleen <gregor.kleen@ifi.lmu.de>
|
|
||||||
|
|
||||||
SPDX-License-Identifier: AGPL-3.0-or-later
|
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user