diff options
| author | Leitwolf | 2026-10-15 18:43:48 +0300 |
|---|---|---|
| committer | GitHub | 2026-10-15 18:43:48 +0300 |
| commit | 0b4634261957c81626cf134d3126ae3d3a04735a (patch) | |
| tree | 4690238a1af85bfb71a3ef237ed1ac8bae32983c | |
| parent | c525fa05bbe85f3e7337d4a43c21ee6c864c839a (diff) | |
| parent | 607a15b1e856097ff4f8e3892368217a4672f16b (diff) | |
| download | website-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
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 }} @@ -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 <support@progmasoft.com></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/ ``` |