Read-only mirrors. Development, issues and pull requests are on GitHub.

summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorLeitwolf2026-10-15 18:43:48 +0300
committerGitHub2026-10-15 18:43:48 +0300
commit0b4634261957c81626cf134d3126ae3d3a04735a (patch)
tree4690238a1af85bfb71a3ef237ed1ac8bae32983c
parentc525fa05bbe85f3e7337d4a43c21ee6c864c839a (diff)
parent607a15b1e856097ff4f8e3892368217a4672f16b (diff)
downloadwebsite-0b4634261957c81626cf134d3126ae3d3a04735a.tar.gz
Merge pull request #34 from Progmasoft/feature/tala-run
Serve tala.run, document talac and Tazel, and move the site API to ASP.NET Core 10
-rw-r--r--.codacy.yml4
-rw-r--r--.config/dotnet-tools.json11
-rw-r--r--.github/ISSUE_TEMPLATE/diagnostic.yml4
-rw-r--r--.github/codeql/codeql-config.yml3
-rw-r--r--.github/pull_request_template.md4
-rw-r--r--.github/renovate.json54
-rw-r--r--.github/workflows/ci.yml35
-rw-r--r--.github/workflows/codeql.yml22
-rw-r--r--.gitignore4
-rw-r--r--Directory.Build.props18
-rw-r--r--Documents/ARCHITECTURE.md43
-rw-r--r--Documents/DEVELOPMENT.md50
-rw-r--r--Documents/OPERATIONS.md105
-rw-r--r--Documents/api/CheckDocumentation.cs118
-rw-r--r--Documents/api/docfx.json39
-rw-r--r--Documents/api/index.md31
-rw-r--r--Documents/api/namespaces/Progmasoft.Tala.Website.Api.md10
-rw-r--r--Documents/api/packages.lock.json35
-rw-r--r--Documents/api/toc.yml7
-rw-r--r--Progmasoft.Tala.Website.slnx6
-rw-r--r--README.md54
-rw-r--r--REUSE.toml20
-rw-r--r--backend/Progmasoft.Tala.Website.Api.Tests/Progmasoft.Tala.Website.Api.Tests.csproj21
-rw-r--r--backend/Progmasoft.Tala.Website.Api.Tests/SiteEndpointTests.cs86
-rw-r--r--backend/Progmasoft.Tala.Website.Api.Tests/packages.lock.json158
-rw-r--r--backend/Progmasoft.Tala.Website.Api/Progmasoft.Tala.Website.Api.csproj19
-rw-r--r--backend/Progmasoft.Tala.Website.Api/Program.cs50
-rw-r--r--backend/Progmasoft.Tala.Website.Api/SiteInformation.cs29
-rw-r--r--backend/Progmasoft.Tala.Website.Api/appsettings.json9
-rw-r--r--backend/Progmasoft.Tala.Website.Api/packages.lock.json6
-rw-r--r--backend/build.gradle.kts62
-rw-r--r--backend/gradle.lockfile153
-rw-r--r--backend/gradle/verification-metadata.xml2143
-rw-r--r--backend/settings.gradle.kts4
-rw-r--r--backend/src/main/kotlin/com/progmasoft/visual/xsharp/website/SiteController.kt56
-rw-r--r--backend/src/main/kotlin/com/progmasoft/visual/xsharp/website/WebsiteApplication.kt20
-rw-r--r--backend/src/main/resources/application.properties8
-rw-r--r--backend/src/test/kotlin/com/progmasoft/visual/xsharp/website/SiteControllerTest.kt53
-rw-r--r--forum/index.html12
-rw-r--r--forum/tala-mark.svg (renamed from forum/visual-xsharp-mark.svg)0
-rw-r--r--forum/tala.svg (renamed from forum/visual-xsharp.svg)0
-rw-r--r--frontend/index.html8
-rw-r--r--frontend/public/hosts/talac/robots.txt64
-rw-r--r--frontend/public/hosts/talac/sitemap.xml15
-rw-r--r--frontend/public/hosts/tazel/robots.txt64
-rw-r--r--frontend/public/hosts/tazel/sitemap.xml15
-rw-r--r--frontend/public/robots.txt2
-rw-r--r--frontend/public/sitemap.xml11
-rw-r--r--frontend/public/tala-mark.svg (renamed from frontend/public/visual-xsharp-mark.svg)0
-rw-r--r--frontend/src/App.vue48
-rw-r--r--frontend/src/content/routes.ts34
-rw-r--r--frontend/src/content/syntax.ts234
-rw-r--r--frontend/src/content/talac.ts441
-rw-r--r--frontend/src/content/tazel.ts466
-rw-r--r--frontend/src/content/types.ts32
-rw-r--r--frontend/src/main.ts31
-rw-r--r--frontend/src/pages/DocPage.vue60
-rw-r--r--frontend/src/pages/GettingStartedPage.vue38
-rw-r--r--frontend/src/pages/OverviewPage.vue16
-rw-r--r--frontend/src/seo.ts35
-rw-r--r--frontend/src/site.ts83
-rw-r--r--frontend/src/styles/site.css9
-rw-r--r--frontend/tests/seo.test.mjs24
-rw-r--r--frontend/tests/site-integrity.test.mjs134
-rw-r--r--frontend/tests/sites.test.mjs145
-rw-r--r--frontend/tsconfig.json1
-rw-r--r--frontend/vite.config.ts2
-rw-r--r--global.json9
-rw-r--r--ops/nginx/forum.conf45
-rw-r--r--ops/nginx/tala-maintenance.conf (renamed from ops/nginx/xsharp-maintenance.conf)12
-rw-r--r--ops/nginx/tala.conf279
-rw-r--r--ops/nginx/xsharp.conf137
-rw-r--r--ops/systemd/tala-site-api.service (renamed from ops/systemd/xsharp-site-api.service)9
73 files changed, 3067 insertions, 2952 deletions
diff --git a/.codacy.yml b/.codacy.yml
index 47c6743..4905f40 100644
--- a/.codacy.yml
+++ b/.codacy.yml
@@ -5,7 +5,7 @@
exclude_paths:
- 'frontend/node_modules/**'
- 'frontend/dist/**'
- - 'backend/build/**'
- - 'backend/.gradle/**'
+ - 'backend/**/bin/**'
+ - 'backend/**/obj/**'
- 'coverage/**'
diff --git a/.config/dotnet-tools.json b/.config/dotnet-tools.json
new file mode 100644
index 0000000..e4d2756
--- /dev/null
+++ b/.config/dotnet-tools.json
@@ -0,0 +1,11 @@
+{
+ "version": 1,
+ "isRoot": true,
+ "tools": {
+ "docfx": {
+ "version": "2.81.0",
+ "commands": ["docfx"],
+ "rollForward": false
+ }
+ }
+}
diff --git a/.github/ISSUE_TEMPLATE/diagnostic.yml b/.github/ISSUE_TEMPLATE/diagnostic.yml
index 28e20e4..29be55f 100644
--- a/.github/ISSUE_TEMPLATE/diagnostic.yml
+++ b/.github/ISSUE_TEMPLATE/diagnostic.yml
@@ -13,7 +13,7 @@ body:
label: Affected area
options:
- Vue website or page content
- - Kotlin/Spring site API
+ - ASP.NET Core site API
- Localization or theme
- Routing, metadata, or indexing
- Deployment or Nginx configuration
@@ -45,7 +45,7 @@ body:
id: environment
attributes:
label: Environment
- description: OS/browser, website commit, Node.js version, or Java 25 version when relevant.
+ description: OS/browser, website commit, Node.js version, or .NET 10 version when relevant.
validations:
required: true
- type: textarea
diff --git a/.github/codeql/codeql-config.yml b/.github/codeql/codeql-config.yml
index 20ed569..90424aa 100644
--- a/.github/codeql/codeql-config.yml
+++ b/.github/codeql/codeql-config.yml
@@ -5,5 +5,6 @@ name: Tala website owned sources
paths-ignore:
- frontend/node_modules
- frontend/dist
- - backend/build
+ - backend/**/bin
+ - backend/**/obj
diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md
index 653c9c9..a90aac6 100644
--- a/.github/pull_request_template.md
+++ b/.github/pull_request_template.md
@@ -10,9 +10,9 @@ Describe the Tala website behavior or content changed. This repository is not th
## Verification
- [ ] Frontend checks, tests, formatting, and build were run where relevant.
-- [ ] Kotlin/Spring tests were run where relevant.
+- [ ] ASP.NET Core tests were run where relevant.
- [ ] en-US/de-DE, light/dark, accessibility, and small-screen behavior were considered for UI changes.
-- [ ] Internal links, forum availability messaging, and the legacy ViGet redirect were checked if affected.
+- [ ] Internal links, and forum availability messaging were checked if affected.
- [ ] No credentials, generated output, or unrelated files are included.
Commands and results (including anything not run):
diff --git a/.github/renovate.json5 b/.github/renovate.json5
index 6d8623b..78d6dc6 100644
--- a/.github/renovate.json5
+++ b/.github/renovate.json5
@@ -35,12 +35,12 @@
ignorePaths: ["**/node_modules/**"],
// What Dependabot watched here, and nothing more for now.
- enabledManagers: ["github-actions", "npm", "gradle", "gradle-wrapper"],
+ enabledManagers: ["github-actions", "npm", "nuget"],
// One pull request for each kind of dependency.
packageRules: [
{ matchManagers: ["github-actions"], groupName: "GitHub Actions" },
{ matchManagers: ["npm"], groupName: "Frontend packages" },
- { matchManagers: ["gradle", "gradle-wrapper"], groupName: "Backend plugins and libraries" },
+ { matchManagers: ["nuget"], groupName: "Backend packages" },
],
}
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 70631c6..6aee49a 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -48,28 +48,33 @@ jobs:
working-directory: frontend
backend:
- runs-on: macos-latest
+ runs-on: ubuntu-latest
timeout-minutes: 25
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
persist-credentials: false
- - uses: actions/setup-java@de7274f081f381c8f8158605e0321c36c376e2e6 # v6.0.1
- with:
- distribution: temurin
- java-version: "25"
- - uses: gradle/actions/setup-gradle@9c971963bec38e04b3d30dcc455b5382be2fdbfb # v6.3.0
+ - uses: actions/setup-dotnet@26b0ec14cb23fa6904739307f278c14f94c95bf1 # v5
with:
- gradle-version: "9.6.0"
- cache-provider: basic
- # dokkaGenerate is the documentation gate: an undocumented public
- # declaration or a broken reference fails the build.
- - run: gradle test jacocoTestReport bootJar dokkaGenerate --no-daemon
- working-directory: backend
+ dotnet-version: 10.0.x
+ cache: true
+ cache-dependency-path: "**/packages.lock.json"
+ # The build is the documentation gate: GenerateDocumentationFile with
+ # warnings as errors fails on a public declaration without its comment.
+ - run: dotnet restore Progmasoft.Tala.Website.slnx --locked-mode
+ - run: dotnet build Progmasoft.Tala.Website.slnx --configuration Release --no-restore
+ - run: dotnet test --project backend/Progmasoft.Tala.Website.Api.Tests/Progmasoft.Tala.Website.Api.Tests.csproj --configuration Release --no-build --coverlet --coverlet-output-format cobertura --results-directory TestResults
+ - run: dotnet publish backend/Progmasoft.Tala.Website.Api/Progmasoft.Tala.Website.Api.csproj --configuration Release --no-restore --output publish
+ # Documentation gate. DocFX builds the API reference with every warning
+ # as an error; the coverage check then fails when a namespace, type or
+ # member of the reference has no description.
+ - run: dotnet tool restore
+ - run: dotnet docfx Documents/api/docfx.json --warningsAsErrors
+ - run: dotnet run Documents/api/CheckDocumentation.cs -- Documents/api
- uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: website-backend-coverage
- path: backend/build/reports/jacoco/test/jacocoTestReport.xml
+ path: TestResults/coverage.cobertura.xml
if-no-files-found: error
retention-days: 1
@@ -105,7 +110,7 @@ jobs:
contents: read
id-token: write
steps:
- # Keep OIDC-capable jobs isolated from Gradle build scripts.
+ # Keep OIDC-capable jobs isolated from the backend build.
- uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
with:
name: website-backend-coverage
@@ -113,7 +118,7 @@ jobs:
- uses: codecov/codecov-action@fb8b3582c8e4def4969c97caa2f19720cb33a72f # v7.0.0
with:
use_oidc: true
- files: coverage/backend/jacocoTestReport.xml
+ files: coverage/backend/coverage.cobertura.xml
flags: website-backend
fail_ci_if_error: true
diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml
index c5dde81..b565115 100644
--- a/.github/workflows/codeql.yml
+++ b/.github/workflows/codeql.yml
@@ -25,31 +25,27 @@ jobs:
build_mode: none
- language: javascript-typescript
build_mode: none
- - language: java-kotlin
+ - language: csharp
build_mode: manual
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
persist-credentials: false
- - uses: actions/setup-java@de7274f081f381c8f8158605e0321c36c376e2e6 # v6.0.1
- if: matrix.language == 'java-kotlin'
+ - uses: actions/setup-dotnet@26b0ec14cb23fa6904739307f278c14f94c95bf1 # v5
+ if: matrix.language == 'csharp'
with:
- distribution: temurin
- java-version: "25"
- - uses: gradle/actions/setup-gradle@9c971963bec38e04b3d30dcc455b5382be2fdbfb # v6.3.0
- if: matrix.language == 'java-kotlin'
- with:
- gradle-version: "9.6.0"
+ dotnet-version: 10.0.x
- uses: github/codeql-action/init@7999b86c43a865dc79d8923397f35af22de63401 # v4
with:
languages: ${{ matrix.language }}
build-mode: ${{ matrix.build_mode }}
config-file: ./.github/codeql/codeql-config.yml
queries: security-extended
- - name: Build Kotlin backend for extraction
- if: matrix.language == 'java-kotlin'
- run: gradle classes --no-daemon
- working-directory: backend
+ - name: Build the backend for extraction
+ if: matrix.language == 'csharp'
+ run: |
+ dotnet restore Progmasoft.Tala.Website.slnx --locked-mode
+ dotnet build Progmasoft.Tala.Website.slnx --configuration Release --no-restore
- uses: github/codeql-action/analyze@7999b86c43a865dc79d8923397f35af22de63401 # v4
with:
category: /language:${{ matrix.language }}
diff --git a/.gitignore b/.gitignore
index 3a9dcfc..2aea83e 100644
--- a/.gitignore
+++ b/.gitignore
@@ -15,3 +15,7 @@ coverage/
out/
build/
*.user
+TestResults/
+publish/
+Documents/api/_site/
+Documents/api/reference/
diff --git a/Directory.Build.props b/Directory.Build.props
new file mode 100644
index 0000000..21e7adf
--- /dev/null
+++ b/Directory.Build.props
@@ -0,0 +1,18 @@
+<!-- SPDX-FileCopyrightText: 2026 Progmasoft <support@progmasoft.com> -->
+<!-- SPDX-License-Identifier: AGPL-3.0-or-later WITH AdditionRef-Progmasoft-Patent-Grant-1.1 -->
+
+<Project>
+ <PropertyGroup>
+ <AnalysisLevel>latest-recommended</AnalysisLevel>
+ <Authors>Progmasoft</Authors>
+ <Company>Progmasoft</Company>
+ <ContinuousIntegrationBuild Condition="'$(CI)' == 'true'">true</ContinuousIntegrationBuild>
+ <Copyright>Copyright © 2026 Progmasoft &lt;support@progmasoft.com&gt;</Copyright>
+ <Deterministic>true</Deterministic>
+ <EnforceCodeStyleInBuild>true</EnforceCodeStyleInBuild>
+ <ImplicitUsings>enable</ImplicitUsings>
+ <Nullable>enable</Nullable>
+ <RestorePackagesWithLockFile>true</RestorePackagesWithLockFile>
+ <TreatWarningsAsErrors>true</TreatWarningsAsErrors>
+ </PropertyGroup>
+</Project>
diff --git a/Documents/ARCHITECTURE.md b/Documents/ARCHITECTURE.md
index c11cfea..2521b49 100644
--- a/Documents/ARCHITECTURE.md
+++ b/Documents/ARCHITECTURE.md
@@ -8,32 +8,38 @@ anything about a visitor on a server.
| Part | Technology | Artifact | Serves |
| --- | --- | --- | --- |
-| `frontend/` | Vue 3, Vite, TypeScript | static files in `frontend/dist/` | `xsharp-lang.xyz` |
-| `backend/` | Kotlin on JVM 25, Spring Boot | one executable jar | `xsharp-lang.xyz/api/v1/site` |
-| `forum/` | one HTML page with plain CSS and JavaScript | the five files as they are | `forum.xsharp-lang.xyz` |
+| `frontend/` | Vue 3, Vite, TypeScript | static files in `frontend/dist/` | `tala.run`, `talac.tala.run`, `tazel.tala.run` |
+| `backend/` | ASP.NET Core 10 | one published application | `tala.run/api/v1/site` |
+| `forum/` | one HTML page with plain CSS and JavaScript | the five files as they are | `forum.tala.run` |
```text
browser
| HTTPS
v
Nginx
- |-- xsharp-lang.xyz static files of the Vue build; unknown paths fall back to index.html
- |-- xsharp-lang.xyz/api/v1/site -> http://127.0.0.1:5086 (Spring)
- |-- forum.xsharp-lang.xyz five named static files; every other path is 404
- `-- www, docs, spec, viget permanent redirects
+ |-- tala.run, talac.tala.run, tazel.tala.run static files of the Vue build; unknown paths fall back to index.html
+ |-- tala.run/api/v1/site -> http://127.0.0.1:5086 (ASP.NET Core)
+ |-- forum.tala.run five named static files; every other path is 404
+ |-- www.tala.run permanent redirect to tala.run
+ `-- xsharp-lang.xyz and its subdomains permanent redirects to tala.run, and viget to viget.progmasoft.com
```
## Frontend
-A single-page application with three routes, defined in `frontend/src/main.ts`:
+A single-page application that serves three sites. `site.ts` decides the site from the host name, and
+`frontend/src/main.ts` registers the routes of that site:
-| Route | Page | Source |
-| --- | --- | --- |
-| `/` | why the language exists, and its current state | `pages/HomePage.vue` |
-| `/docs/overview` | the design direction and the compiler stages | `pages/OverviewPage.vue` |
-| `/docs/getting-started` | building the compiler from its repository | `pages/GettingStartedPage.vue` |
-
-Any other path redirects to `/`. The router uses history URLs, so the server must answer unknown paths with
+| Host | Route | Page | Source |
+| --- | --- | --- | --- |
+| `tala.run` | `/` | why the language exists, and its current state | `pages/HomePage.vue` |
+| `tala.run` | `/docs/overview` | the design direction and the compiler stages | `pages/OverviewPage.vue` |
+| `tala.run` | `/docs/getting-started` | building the compiler from its repository | `pages/GettingStartedPage.vue` |
+| `tala.run` | `/docs/syntax` | a first look at the syntax | `content/syntax.ts` |
+| `talac.tala.run` | `/docs/command-line`, `/docs/outputs` | the compiler | `content/talac.ts` |
+| `tazel.tala.run` | `/docs/commands`, `/docs/project-file` | the build system | `content/tazel.ts` |
+
+The pages from `content/` are rendered by `pages/DocPage.vue`; each topic carries its text in all four languages. The
+root of the two documentation hosts opens their first topic. Any other path redirects to the root. The router uses history URLs, so the server must answer unknown paths with
`index.html`.
The rest of the frontend is small:
@@ -67,7 +73,7 @@ to the backend does not publish it.
## Forum page
-`forum.xsharp-lang.xyz` is a notice that the forum is not open yet. It is not a forum: there are no accounts, no
+`forum.tala.run` is a notice that the forum is not open yet. It is not a forum: there are no accounts, no
posts and no service behind it. The page shows its one notice in the language of the browser and offers a theme
button; it has no language menu and stores no language. It is marked `noindex` in the page and in the response
header.
@@ -80,13 +86,14 @@ allows only its own script, stylesheet and two images.
- **Accounts and packages.** Progmasoft accounts and the ViGet package registry belong to the Progmaweb repository
and live on `progmasoft.com` hosts. This site links to neither a sign-in nor a registry.
- **A legacy redirect only.** `viget.xsharp-lang.xyz` redirects permanently to `viget.progmasoft.com`, keeping path
- and query. That redirect is routing compatibility, not a feature of this site.
+ and query. That redirect is routing compatibility, not a feature of this site; tala.run has no ViGet host.
- **Visitor data.** The language and theme a visitor chose are kept in the browser's local storage. The site sets no
cookie and sends nothing about the visitor to the backend.
## Search engines and crawlers
-- `sitemap.xml` lists exactly the three routes above.
+- Each host has its own `sitemap.xml` and `robots.txt`; Nginx serves `public/hosts/talac/` and
+ `public/hosts/tazel/` for the two documentation hosts. A sitemap lists exactly the routes of its host.
- Every route has its own title, description and canonical URL. A language is a preference, not a second URL, so
there are no `hreflang` alternatives.
- `robots.txt` names the crawlers the site has a rule for. Search and answer-retrieval crawlers are allowed. Among
diff --git a/Documents/DEVELOPMENT.md b/Documents/DEVELOPMENT.md
index 4781e76..0bf7f55 100644
--- a/Documents/DEVELOPMENT.md
+++ b/Documents/DEVELOPMENT.md
@@ -9,8 +9,7 @@
| --- | --- | --- |
| Node.js | 22.18 or newer; CI uses 24 | the frontend and all JavaScript tests |
| npm | the one that ships with Node.js | frontend dependencies |
-| Temurin JDK | 25 | the backend |
-| Gradle | 9.6.0, the version CI installs | the backend build; the repository has no Gradle wrapper |
+| .NET SDK | 10, as `global.json` allows | the backend |
## Frontend
@@ -25,7 +24,9 @@ npm run build # type check and production build into dist/
```