Skip to content

feat: swagger-ui from node_modules - #3141

Merged
witalisoft merged 1 commit into
masterfrom
deps/swagger-ui-from-node-modules
Oct 12, 2026
Merged

witalisoft merged 1 commit into
masterfrom
deps/swagger-ui-from-node-modules

Conversation

@witalisoft

@witalisoft witalisoft commented Oct 12, 2026 •

Copy link
Copy Markdown
Contributor

Serve Swagger UI from node_modules instead of a committed vendor copy

Summary

/api loads Swagger UI from files copied out of the locked swagger-ui-dist package at build time. Nothing from the distribution is committed, so a Dependabot bump no longer needs a manual re-vendor step and no longer turns the Netlify build red.

flowchart LR
    lock[yarn.lock<br/>version + integrity] --> nm[node_modules/swagger-ui-dist]
    nm -->|swagger-ui-assets plugin<br/>on start/build| gen[generated-static/swagger-ui/<br/>gitignored, 11 files]
    static[static/<br/>api.html, swagger-initializer.js] --> build[build/]
    gen -->|staticDirectories| build
Loading
 build:netlify
   verify-git-history
   verify-indexnow-vendor
-  verify-swagger-ui-vendor      # failed on every swagger-ui-dist bump
   npm ci site-build-gate
   docusaurus build
+    swagger-ui-assets plugin    # copies the files api.html loads
   run-post-build-gates
 src/plugins/
+└── swagger-ui-assets.js          # copy list + staging, fails if a file disappears upstream
 static/
 ├── api.html                      # unchanged
 ├── swagger-initializer.js        # unchanged
-├── swagger-ui*.js|css|map|LICENSE.txt, index.css, favicon-*.png   # 19 files
-├── oauth2-redirect.html|js       # unused: the API spec has no OAuth2 scheme
-└── swagger-ui-vendor.json        # version/integrity/SHA-256 contract
 scripts/
-└── verify-swagger-ui-vendor.js
 tests/
-├── swagger_ui_vendor.test.js
+└── swagger_ui_assets.test.js     # api.html refs ⊆ copy list; installed package ships them

Also in this PR:

  • Drops the unused swagger-ui dependency. Nothing imports it; it removes about 80 packages from yarn.lock and no remaining package changes version.
  • Moves swagger-ui-dist into the browser-runtime Dependabot group. tests/dependency_authority.test.js is updated to match, and its "Swagger must stay independent" assertion is removed.
  • Removes oauth2-redirect.html from the Cloudflare analytics gate's sensitive routes and from two tests. api.html stays protected.
  • Rewrites the README's Swagger section, including how to restore the OAuth2 redirect page if the API ever adds OAuth2.
  • dependency-impact workflow is not only triggered for Dependabot.

Evidence

  • Before: a Dependabot-style bump (only package.json and the yarn.lock entry changed) fails before Docusaurus even starts:

    $ node scripts/verify-swagger-ui-vendor.js      # swagger-ui-dist 5.33.1 → 5.33.0
    Swagger UI vendor verification failed: Swagger UI vendor contract does not match the locked distribution
    exit=1
    

    Bump swagger-ui-dist from 5.32.14 to 5.33.1 #3082 (5.32.14 → 5.33.1) shows the same thing in practice: every GitHub check was green, netlify/netdata-docusaurus/deploy-preview was red, and the PR was closed until Consolidate Learn dependencies and runtime updates #3136 re-vendored by hand.

    After: the plugin stages whatever version is installed, with no manual step:

    stageSwaggerUiAssets(<site with swagger-ui-dist 5.33.0>)
    { version: '5.33.0', files: 11 }
    
  • Full Netlify build (npm run build:netlify, Node 22.23.2): passes. Site build gate: 0 findings across 2,030 pages. Cloudflare analytics gate: "1 credential-handling route" (api.html). Broken-anchor warnings: 297, the same as master.

  • Tests: yarn test:run passes: Vitest 494 passed and 1 skipped, plus the first-touch (26), IndexNow (64), swagger-ui-assets (3), dependency-authority (3) and site-build-gate (4) suites.

  • Browser (headless Chromium, local docusaurus serve): /api renders 72 API operations. swagger-ui.css, index.css, swagger-ui-bundle.js, swagger-ui-standalone-preset.js and swagger-initializer.js all return 200. No console errors or warnings.

  • Build output, master vs this branch (both built from directories at the same depth, compared file by file):

    Output Result
    All JS chunks, sitemap identical
    Files /api loads (bundle, preset, CSS, index.css, favicons, bundle source map) byte-identical
    es-bundle*, swagger-ui.js, oauth2-redirect.*, swagger-ui-vendor.json removed (never loaded by /api)
    styles.css about 4 KB smaller: Tailwind no longer generates unused utilities from strings inside the committed Swagger bundles
    main.js only the new plugin entry and the extra staticDirectories value
    HTML pages new main/styles hash names and one extra blank line; no content change

Merge Danger

Door: two-way

Reverting this PR restores the vendored files and the check exactly. The one thing that doesn't come back on its own is the /oauth2-redirect.html URL: it returns 404 from the first deploy after merge. It is an OAuth callback page, not content, but backlinks for that path haven't been checked yet.

Blast Radius: /api

  • If the copy step broke, the cause is visible and blocking: the build fails, or the dep-impact /api check (.swagger-ui .opblock count) shows the page as broken.
  • Other pages change only by losing unused Tailwind utilities that came from Swagger's bundles. Those classes weren't used anywhere else in Learn's sources.
  • This changes earlier policy decisions: Swagger kept out of Dependabot groups, and the vendor contract required at build time. @ktsaou needs to agree before merge.

Summary by cubic

/api now serves Swagger UI copied from the locked swagger-ui-dist package at build/start time instead of a committed vendor copy, so Dependabot bumps no longer fail the Netlify build or require a manual re-vendor step.

Notable changes

  • The new swagger-ui-assets plugin stages the 11 files api.html loads into the gitignored generated-static/swagger-ui/ directory; the committed vendor copy, its contract, and the build-time verification script are removed.
  • The unused swagger-ui dependency is dropped (~80 fewer packages in yarn.lock), and swagger-ui-dist is now grouped with browser-runtime in Dependabot.
  • /oauth2-redirect.html and its script are removed; the URL now 404s, but it was dead because the API spec has no OAuth2 scheme.
  • The dependency-impact workflow's author filter is commented out, so its advisory job also runs for non-Dependabot PR authors.

Merge notes

  • The first deploy after merging will 404 on /oauth2-redirect.html; backlinks to that path haven't been checked yet.
  • This reverses earlier decisions to keep Swagger out of Dependabot groups and to require a build-time vendor contract, so sign-off is needed before merge.

Written for commit 3a6399d. Summary will update on new commits.

View guided diff Turn on auto-fix

Summary by CodeRabbit

  • Documentation
    • Updated the API documentation to explain that Swagger UI assets are prepared during site builds and that builds fail if required assets are missing.
    • Clarified that the site does not publish an OAuth2 redirect page and documented the assets needed if OAuth2 support is added.
    • Updated analytics guidance to exclude only the API page from beacon and third-party analytics checks.
  • Changes
    • The OAuth2 redirect page is no longer published.

@netlify

netlify Bot commented Oct 12, 2026 •

Copy link
Copy Markdown

✅ Deploy Preview for netdata-docusaurus ready!

Name Link
🔨 Latest commit 3a6399d
🔍 Latest deploy log https://app.netlify.com/projects/netdata-docusaurus/deploys/6acc9c0e93fb26b707b043ec
😎 Deploy Preview https://deploy-preview-3141--netdata-docusaurus.netlify.app
📱 Preview on mobile
Toggle QR Code...

QR Code

Use your smartphone camera to open QR code link.

To edit notification comments on pull requests, go to your Netlify project configuration.

@coderabbitai

coderabbitai Bot commented Oct 12, 2026 •

Copy link
Copy Markdown

Review in Change Stack →

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration
  • Configuration used: defaults
  • Review profile: CHILL
  • Plan: Advanced
  • Run ID: f76f9cf8-981f-467c-8b90-a242966db9ab

📥 Commits

Reviewing files that changed from the base of the PR and between f87fcb9 and 3a6399d.


⛔ Files ignored due to path filters (9)
  • static/favicon-16x16.png is excluded by !**/*.png
  • static/favicon-32x32.png is excluded by !**/*.png
  • static/swagger-ui-bundle.js.map is excluded by !**/*.map
  • static/swagger-ui-es-bundle-core.js.map is excluded by !**/*.map
  • static/swagger-ui-es-bundle.js.map is excluded by !**/*.map
  • static/swagger-ui-standalone-preset.js.map is excluded by !**/*.map
  • static/swagger-ui.css.map is excluded by !**/*.map
  • static/swagger-ui.js.map is excluded by !**/*.map
  • yarn.lock is excluded by !**/yarn.lock, !**/*.lock

📒 Files selected for processing (28)
  • .github/dependabot.yml
  • .github/workflows/dependency-impact.yml
  • .gitignore
  • README.md
  • docusaurus.config.js
  • package.json
  • scripts/verify-cloudflare-rum.js
  • scripts/verify-swagger-ui-vendor.js
  • src/plugins/swagger-ui-assets.js
  • src/seo/deploymentIntegrations.test.js
  • static/index.css
  • static/oauth2-redirect.html
  • static/oauth2-redirect.js
  • static/swagger-ui-bundle.js
  • static/swagger-ui-bundle.js.LICENSE.txt
  • static/swagger-ui-es-bundle-core.js
  • static/swagger-ui-es-bundle-core.js.LICENSE.txt
  • static/swagger-ui-es-bundle.js
  • static/swagger-ui-es-bundle.js.LICENSE.txt
  • static/swagger-ui-standalone-preset.js
  • static/swagger-ui-standalone-preset.js.LICENSE.txt
  • static/swagger-ui-vendor.json
  • static/swagger-ui.css
  • static/swagger-ui.js
  • tests/dependency_authority.test.js
  • tests/first_touch_capture.test.mjs
  • tests/swagger_ui_assets.test.js
  • tests/swagger_ui_vendor.test.js

💤 Files with no reviewable changes (10)
  • static/oauth2-redirect.html
  • static/swagger-ui-es-bundle-core.js.LICENSE.txt
  • tests/swagger_ui_vendor.test.js
  • static/swagger-ui-vendor.json
  • static/index.css
  • scripts/verify-swagger-ui-vendor.js
  • static/swagger-ui-bundle.js.LICENSE.txt
  • static/swagger-ui-es-bundle.js.LICENSE.txt
  • static/swagger-ui-standalone-preset.js.LICENSE.txt
  • static/oauth2-redirect.js

Included review availability: This review used your included allowance. Your plan provides up to 1 included review per hour; 0 remain after this review.



📝 Walkthrough

Walkthrough

The site now stages Swagger UI assets from the installed swagger-ui-dist package during the build. It removes checked-in vendor files and the OAuth2 redirect page. Dependency update configuration and related tests are updated.

Changes

Swagger UI assets

Layer / File(s) Summary
Dependency update configuration
.github/dependabot.yml, .github/workflows/dependency-impact.yml, tests/dependency_authority.test.js
The browser-runtime update group includes swagger-ui-dist. The dependency-impact job no longer restricts execution by pull request author.
Stage and publish Swagger UI assets
src/plugins/swagger-ui-assets.js, docusaurus.config.js, package.json, .gitignore, tests/swagger_ui_assets.test.js, README.md, static/*, scripts/verify-swagger-ui-vendor.js, tests/swagger_ui_vendor.test.js, src/seo/deploymentIntegrations.test.js
The plugin copies a fixed list of assets from the installed package into generated-static/swagger-ui, which Docusaurus serves. Tests cover asset staging, and the build scripts and documentation use the generated-asset flow. The previous vendor verification script, manifest, and checked-in assets are removed.
Remove OAuth2 redirect page checks and files
static/oauth2-redirect.html, static/oauth2-redirect.js, scripts/verify-cloudflare-rum.js, src/seo/deploymentIntegrations.test.js, tests/first_touch_capture.test.mjs, tests/swagger_ui_assets.test.js, README.md
The OAuth2 redirect page and handler are removed and are not staged. Analytics checks and documentation now treat api.html as the only sensitive route.

Priority: ⬇️ Low

Estimated code review effort: 3 (Moderate) | ~25 minutes

Change: Refactor

Sequence Diagram(s)

sequenceDiagram
  participant Docusaurus
  participant swaggerUiAssetsPlugin
  participant swaggerUiDist
  participant GeneratedStatic
  participant ApiPage
  Docusaurus->>swaggerUiAssetsPlugin: Load plugin with siteDir
  swaggerUiAssetsPlugin->>swaggerUiDist: Resolve package and read listed assets
  swaggerUiAssetsPlugin->>GeneratedStatic: Copy listed assets
  Docusaurus->>GeneratedStatic: Serve generated static directory
  ApiPage->>GeneratedStatic: Request Swagger UI assets
Loading

Suggested reviewers: ktsaou


Merge Risk | ⚪ Minimal · up to 3a639

Merge Risk: ⚪ Minimal · up to 3a639

The staged assets and route changes align with the repository’s current API configuration; mergeable with normal checks.

Security Architecture Review

Security architecture risk: 🔵 Low · up to 3a639

The replacement browser files match the previous files, and package versions and CI permissions remain restricted. No introduced vulnerability was established. Residual risk concerns reliance on installed-package integrity and unverified behavior during concurrent staging or deployment.

Retained concerns
No architecture-level concerns identified.

Security review details

Security Blast Radius

  • inferred — Compromise of the staged JavaScript would affect browsers loading the API documentation under the site's origin. The inspected change does not establish new tenant, data-store, or service authority; its concrete security boundary is installed package content becoming public executable browser content.

Trust Boundaries and Controls

  • observed — The separate vendor version, lock-metadata, and per-file hash verification is removed. The replacement control model uses the pinned package and supported frozen-lockfile installation, a fixed publication list, and failure on missing assets; staging itself does not revalidate package integrity.
  • observed — The expanded dependency workflow executes PR-controlled tooling and builds. Installation-script suppression does not prevent build-code execution. Repository controls retain pull_request triggering, contents: read, disabled checkout credential persistence, and no explicit workflow secret references.

Resilience and Maintainability Implications

  • inferred — Sequential staging is not an atomic publication mechanism and has no concurrency lock. Normal build-time ordering contains ordinary failures, so the incomplete-directory state is not retained as a production security concern without evidence of a live or concurrent publication reader.

Hardening Proposals

  • proposed — If OAuth support is introduced later, restore the callback's sensitive-route analytics checks along with its assets and title requirement, rather than treating asset restoration alone as sufficient.

Pre-merge checks | Passed 4 | Failed 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage Warning Docstring coverage is 20.00% which is insufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff. Analyzed 5 functions across 7 files. (5 skipped: 5… Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check Passed The title clearly identifies the main change: serving Swagger UI from the installed node_modules package instead of committed vendor assets.
Linked Issues check Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check Passed Check skipped because no linked issues were found for this pull request.

Full details: Docstring Coverage

Explanation

Docstring coverage is 20.00% which is insufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff. Analyzed 5 functions across 7 files. (5 skipped: 5 unsupported.)


  • Fix all pre-merge checks with AI
✨ Finishing Touches 💡 1
📝 Generate docstrings 💡
  • Commit to this branch
  • Create a new PR

🧪 Generate unit tests (beta)
  • Commit to this branch
  • Create a new PR

  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@cubic-dev-ai cubic-dev-ai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

1 issue found across 36 files

Confidence score: 5/5

  • In tests/swagger_ui_assets.test.js, the pattern skips local URLs with directory paths like /js/... and /img/..., so broken Swagger UI assets can slip through this check. Update it to capture and resolve the full local URL path.
Prompt for AI agents (unresolved issues)

Check if these issues are valid — if so, understand the root cause of each and fix them. When an issue isn't valid or won't be fixed in this PR, reply in its thread with the reason and then resolve the thread. If appropriate, use sub-agents to investigate and fix each issue separately.


<file name="tests/swagger_ui_assets.test.js">

<violation number="1" location="tests/swagger_ui_assets.test.js:16">
P3: This pattern skips local references containing directories, including `/js/...` and `/img/...`, so the test never verifies those API assets resolve. Capture and resolve the full local URL path before checking whether it is Learn-owned or staged.</violation>
</file>
Architecture diagram
sequenceDiagram
    participant Dev as Developer
    participant Yarn as Yarn (package manager)
    participant NM as node_modules/swagger-ui-dist
    participant Plug as swagger-ui-assets Plugin
    participant Docus as Docusaurus
    participant Static as static/ (api.html, swagger-initializer.js)
    participant Gen as generated-static/swagger-ui/
    participant Build as build/ (site output)
    participant Browser as Browser
    participant CF as Cloudflare Analytics

    Note over Dev,Build: Build/Start Time Flow

    Dev->>Yarn: yarn install / npm ci
    Yarn->>NM: Install locked swagger-ui-dist version
    NM-->>Dev: Package installed

    Dev->>Docus: docusaurus build / start
    Docus->>Plug: Load plugin (plugin factory)
    Plug->>NM: Resolve swagger-ui-dist package.json
    NM-->>Plug: Installed version + file paths
    Plug->>Plug: Read SWAGGER_UI_ASSETS list (11 files)
    Plug->>Gen: Create/clear dir, copy each asset
    alt Missing asset in package
        Plug-->>Docus: Throw error (build fails)
    else All assets present
        Plug-->>Docus: Return plugin config
    end

    Docus->>Docus: Read staticDirectories from config
    Docus->>Static: Include static/ dir
    Docus->>Gen: Include generated-static/swagger-ui/ dir
    Docus->>Build: Generate static site (api.html + swagger assets)

    Note over Browser,CF: Runtime / Serving Flow

    Browser->>Build: GET /api
    Build-->>Browser: Serve api.html
    Browser->>Build: GET swagger-ui-bundle.js, swagger-ui-standalone-preset.js, swagger-ui.css, index.css, favicons
    Build-->>Browser: Serve staged assets from generated-static/swagger-ui/
    Browser->>Build: GET swagger-initializer.js
    Build-->>Browser: Serve from static/
    Browser->>CF: Load Cloudflare analytics beacon
    Note over Browser,CF: api.html is the only sensitive route for analytics (oauth2-redirect removed)

    Browser->>Browser: Render Swagger UI with API spec
Loading

Reply with feedback, questions, or to request a fix.

View guided diff | Turn on auto-fix | Re-trigger cubic


test('the API page loads only Learn-owned files and staged Swagger UI assets', () => {
const api = fs.readFileSync(path.join(root, 'static', 'api.html'), 'utf8');
const localReferences = [...api.matchAll(/(?:src|href)="\.?\/?([^"/:]+\.(?:css|js|png))"/g)]

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P3: This pattern skips local references containing directories, including /js/... and /img/..., so the test never verifies those API assets resolve. Capture and resolve the full local URL path before checking whether it is Learn-owned or staged.

Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. When an issue isn't valid or won't be fixed in this PR, reply in its thread with the reason and then resolve the thread. At tests/swagger_ui_assets.test.js, line 16:

<comment>This pattern skips local references containing directories, including `/js/...` and `/img/...`, so the test never verifies those API assets resolve. Capture and resolve the full local URL path before checking whether it is Learn-owned or staged.</comment>

<file context>
@@ -0,0 +1,46 @@
+
+test('the API page loads only Learn-owned files and staged Swagger UI assets', () => {
+  const api = fs.readFileSync(path.join(root, 'static', 'api.html'), 'utf8');
+  const localReferences = [...api.matchAll(/(?:src|href)="\.?\/?([^"/:]+\.(?:css|js|png))"/g)]
+    .map((match) => match[1])
+    .filter((filename) => !fs.existsSync(path.join(root, 'static', filename)));
</file context>

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

out of the scope from this test, it checks only the files related to the swagger-ui

@cubic-dev-ai cubic-dev-ai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

1 issue found across 1 file (changes from recent commits).

Confidence score: 4/5

  • In .github/workflows/dependency-impact.yml, removing the if gate makes the advisory job run on every PR that changes package.json or yarn.lock, not just Dependabot PRs. Restore the gate after testing.
Prompt for AI agents (unresolved issues)

Check if these issues are valid — if so, understand the root cause of each and fix them. When an issue isn't valid or won't be fixed in this PR, reply in its thread with the reason and then resolve the thread. If appropriate, use sub-agents to investigate and fix each issue separately.


<file name=".github/workflows/dependency-impact.yml">

<violation number="1" location=".github/workflows/dependency-impact.yml:23">
P2: Commenting out this `if` gate makes the advisory job run on every PR that touches package.json/yarn.lock, not just Dependabot PRs. It looks like a temporary "test dep-impact" change for this non-Dependabot PR, which runs two full builds plus a headless-browser comparison (up to 45 minutes). Restore the condition before merge, or the expensive job silently runs on every dependency PR.</violation>
</file>

Reply with feedback, questions, or to request a fix.

View guided diff | Turn on auto-fix | Re-trigger cubic

Comment thread .github/workflows/dependency-impact.yml Outdated
name: Advisory dependency impact
# The PR author, not github.actor: a maintainer re-running the job must not skip it.
if: ${{ github.event.pull_request.user.login == 'dependabot[bot]' }}
# if: ${{ github.event.pull_request.user.login == 'dependabot[bot]' }}

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2: Commenting out this if gate makes the advisory job run on every PR that touches package.json/yarn.lock, not just Dependabot PRs. It looks like a temporary "test dep-impact" change for this non-Dependabot PR, which runs two full builds plus a headless-browser comparison (up to 45 minutes). Restore the condition before merge, or the expensive job silently runs on every dependency PR.

Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. When an issue isn't valid or won't be fixed in this PR, reply in its thread with the reason and then resolve the thread. At .github/workflows/dependency-impact.yml, line 23:

<comment>Commenting out this `if` gate makes the advisory job run on every PR that touches package.json/yarn.lock, not just Dependabot PRs. It looks like a temporary "test dep-impact" change for this non-Dependabot PR, which runs two full builds plus a headless-browser comparison (up to 45 minutes). Restore the condition before merge, or the expensive job silently runs on every dependency PR.</comment>

<file context>
@@ -20,7 +20,7 @@ jobs:
     name: Advisory dependency impact
     # The PR author, not github.actor: a maintainer re-running the job must not skip it.
-    if: ${{ github.event.pull_request.user.login == 'dependabot[bot]' }}
+    # if: ${{ github.event.pull_request.user.login == 'dependabot[bot]' }}
     runs-on: ubuntu-latest
     timeout-minutes: 45
</file context>
Suggested change
# if: ${{ github.event.pull_request.user.login == 'dependabot[bot]' }}
if: ${{ github.event.pull_request.user.login == 'dependabot[bot]' }}

@witalisoft
witalisoft force-pushed the deps/swagger-ui-from-node-modules branch from 43b4884 to 3a6399d Compare October 12, 2026 08:36
@witalisoft
witalisoft marked this pull request as ready for review October 12, 2026 09:16
@witalisoft
witalisoft requested a review from a team as a code owner October 12, 2026 09:16
@witalisoft
witalisoft requested review from ktsaou and mtblz October 12, 2026 09:16
@witalisoft
witalisoft merged commit 5e85127 into master Oct 12, 2026
15 checks passed
@witalisoft
witalisoft deleted the deps/swagger-ui-from-node-modules branch October 12, 2026 10:03
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants