Creator App Tests / PR Spam Gate (push) Skipped
Frontend Tests / PR Spam Gate (push) Skipped
NPM Format (website & console) / PR Spam Gate (push) Skipped
Pre-commit Checks / PR Spam Gate (push) Skipped
QwenPaw Creator Plugin Release / check-version (push) Canceled after 0s
QwenPaw Creator Plugin Release / upload-oss (push) Canceled after 0s
Tests / PR Spam Gate (push) Skipped
CodeQL / CodeQL (python) (push) Canceled after 0s
CodeQL / CodeQL (typescript) (push) Canceled after 0s
Creator App Tests / Creator Backend Tests (push) Canceled after 0s
Creator App Tests / Creator UI Build & Tests (push) Canceled after 0s
E2E Smoke Tests / Playwright UI Smoke (push) Canceled after 0s
Frontend Tests / Detect console changes (push) Canceled after 0s
NPM Format (website & console) / website format check (push) Canceled after 0s
NPM Format (website & console) / console format check (push) Canceled after 0s
Pre-commit Checks / Pre-commit (push) Canceled after 0s
QwenPaw Data Plugin Release / check-version (push) Canceled after 0s
Tests / Detect code changes (push) Canceled after 0s
Frontend Tests / Vitest Unit Tests (push) Canceled after 0s
Frontend Tests / Frontend Summary (push) Canceled after 0s
QwenPaw Data Plugin Release / upload-oss (push) Canceled after 0s
Tests / Maintainer Approval (push) Canceled after 0s
Tests / Unit Tests - py3.11 - macos-latest (push) Canceled after 0s
Tests / Unit Tests - py3.11 - ubuntu-latest (push) Canceled after 0s
Tests / Unit Tests - py3.13 - ubuntu-latest (push) Canceled after 0s
Tests / Unit Tests - py3.11 - windows-latest (push) Canceled after 0s
Tests / Contract Tests - py3.11 - macos-latest (push) Canceled after 0s
Tests / Contract Tests - py3.11 - ubuntu-latest (push) Canceled after 0s
Tests / Contract Tests - py3.13 - ubuntu-latest (push) Canceled after 0s
Tests / Contract Tests - py3.11 - windows-latest (push) Canceled after 0s
Tests / Integrated Tests - py3.11 - macos-latest - p0 (push) Canceled after 0s
Tests / Integrated Tests - py3.11 - macos-latest - p1 (push) Canceled after 0s
Tests / Integrated Tests - py3.11 - macos-latest - p2 (push) Canceled after 0s
Tests / Integrated Tests - py3.11 - ubuntu-latest - fallback (push) Canceled after 0s
Tests / Integrated Tests - py3.11 - ubuntu-latest - p0 (push) Canceled after 0s
Tests / Integrated Tests - py3.11 - ubuntu-latest - p1 (push) Canceled after 0s
Tests / Integrated Tests - py3.11 - ubuntu-latest - p2 (push) Canceled after 0s
Tests / Integrated Tests - py3.13 - ubuntu-latest - p0 (push) Canceled after 0s
Tests / Integrated Tests - py3.13 - ubuntu-latest - p1 (push) Canceled after 0s
Tests / Integrated Tests - py3.13 - ubuntu-latest - p2 (push) Canceled after 0s
Tests / Integrated Tests - py3.11 - windows-latest - p0 (push) Canceled after 0s
Tests / Integrated Tests - py3.11 - windows-latest - p1 (push) Canceled after 0s
Tests / Integrated Tests - py3.11 - windows-latest - p2 (push) Canceled after 0s
Tests / Coverage Report (push) Canceled after 0s
Tests / Test Summary (push) Canceled after 0s
63 lines
2.1 KiB
JavaScript
63 lines
2.1 KiB
JavaScript
#!/usr/bin/env node
|
|
/**
|
|
* Build guard: assert the console bundle still ships Monaco's stylesheet.
|
|
*
|
|
* Monaco keeps a hidden `<textarea class="inputarea">` for keyboard / IME
|
|
* input. Without `monaco-editor`'s CSS that textarea renders with browser
|
|
* default styles (a large white box floating over the code) and the editor
|
|
* loses its input-layer positioning, so clicks no longer land on the caret
|
|
* (issue #6547). That is exactly what happens when node_modules CSS is
|
|
* stubbed out during a real build, so fail loudly instead of shipping a
|
|
* broken Coding Mode editor.
|
|
*
|
|
* Usage: node scripts/verify-monaco-css.mjs [outDir] (default: dist)
|
|
*/
|
|
import { readdirSync, readFileSync } from "node:fs";
|
|
import path from "node:path";
|
|
|
|
// Substrings that only exist in monaco-editor's stylesheet. Deliberately not
|
|
// tied to hashed file names or minified whitespace.
|
|
const MARKERS = ["inputarea", "overflow-guard"];
|
|
|
|
function collectCssFiles(dir) {
|
|
const found = [];
|
|
for (const entry of readdirSync(dir, { withFileTypes: true })) {
|
|
const full = path.join(dir, entry.name);
|
|
if (entry.isDirectory()) {
|
|
found.push(...collectCssFiles(full));
|
|
} else if (entry.name.endsWith(".css")) {
|
|
found.push(full);
|
|
}
|
|
}
|
|
return found;
|
|
}
|
|
|
|
const outDir = process.argv[2] ?? "dist";
|
|
let cssFiles;
|
|
try {
|
|
cssFiles = collectCssFiles(outDir);
|
|
} catch (err) {
|
|
console.error(`[verify-monaco-css] cannot read build output "${outDir}"`);
|
|
throw err;
|
|
}
|
|
|
|
const missing = MARKERS.filter(
|
|
(marker) =>
|
|
!cssFiles.some((file) => readFileSync(file, "utf8").includes(marker)),
|
|
);
|
|
|
|
if (cssFiles.length === 0 || missing.length > 0) {
|
|
console.error(
|
|
`[verify-monaco-css] Monaco stylesheet missing from ${outDir}: ` +
|
|
`${missing.join(", ") || "no CSS emitted at all"}.\n` +
|
|
"The Coding Mode editor will show a floating white textarea and " +
|
|
"misplaced cursor. Check that no plugin stubs node_modules CSS " +
|
|
"during builds (console/vite.config.ts).",
|
|
);
|
|
process.exit(1);
|
|
}
|
|
|
|
console.log(
|
|
`[verify-monaco-css] OK - Monaco stylesheet present in ${cssFiles.length} CSS file(s).`,
|
|
);
|