Files
upstream-mattermost/docs/site/scripts/gen-active-redirects.mjs
upstream-mirror 240db4e2a7
Some checks failed
Server CI / Postgres (shard 0) (push) Has been skipped
Server CI / Postgres (shard 3) (push) Has been skipped
BuildEnv Docker Image / build-image (push) Failing after 4s
BuildEnv Docker Image / build-image-fips (push) Failing after 4s
Migration Review & Release Notes / Generate migration review & release notes (push) Failing after 3s
Server CI / Build Environment (push) Failing after 3s
Server CI / Postgres (shard 1) (push) Has been skipped
Tools CI / check-style (mattermost-govet) (push) Failing after 4s
Server CI / Postgres (shard 2) (push) Has been skipped
Tools CI / check-style (mmgotool) (push) Failing after 3s
Server CI / Elasticsearch v8 Compatibility (push) Has been skipped
Server CI / OpenSearch v2 Compatibility (push) Has been skipped
Server CI / Postgres FIPS (shard 0) (push) Has been skipped
Tools CI / Test (mattermost-govet) (push) Failing after 3s
Server CI / Postgres FIPS (shard 1) (push) Has been skipped
Server CI / Postgres FIPS (shard 2) (push) Has been skipped
Tools CI / Test (mmgotool) (push) Failing after 3s
Server CI / Postgres FIPS (shard 3) (push) Has been skipped
Server CI / Run mmctl tests (push) Has been skipped
Server CI / Run mmctl tests (FIPS) (push) Has been skipped
Server CI / Merge Postgres Test Results (push) Has been skipped
Server CI / Merge Postgres FIPS Test Results (push) Has been skipped
Server CI / Check backport migrations (push) Has been skipped
Server CI / Check generated files (push) Has been skipped
Server CI / check-style (push) Has been skipped
Server CI / Vet API (push) Has been skipped
Server CI / Build mattermost server app (push) Has been skipped
Server CI / Server CI Complete (push) Failing after 2s
Server CI / Server CI Artifacts (push) Has been skipped
Server CI / Sentry Upload (push) Has been skipped
Server CI / Server CI Report (push) Failing after 5m1s
Server CI Nightly Race / Race Detector (push) Has been skipped
CodeQL / Analyze (go) (push) Has been cancelled
CodeQL / Analyze (javascript) (push) Has been cancelled
Webapp CI Cache Warm / Warm Webapp node_modules Cache (push) Has been cancelled
E2E CI Cache Warm / Warm E2E npm Registry Cache (push) Has been cancelled
API / build (push) Has been cancelled
Web App CI / check-types (push) Has been cancelled
Web App CI / check-lint (push) Has been cancelled
Web App CI / check-i18n (push) Has been cancelled
Web App CI / check-external-links (push) Has been cancelled
Web App CI / test (platform) (push) Has been cancelled
Web App CI / test (mattermost-redux) (push) Has been cancelled
Web App CI / test (channels shard 1/4) (push) Has been cancelled
Web App CI / test (channels shard 2/4) (push) Has been cancelled
Web App CI / test (channels shard 3/4) (push) Has been cancelled
Web App CI / test (channels shard 4/4) (push) Has been cancelled
Web App CI / upload-coverage (push) Has been cancelled
Web App CI / build (push) Has been cancelled
YAML Lint / yamllint (push) Has been cancelled
Push mirrored docker images / cd/Push mirrored docker images (push) Has been cancelled
docs-cd / Build and deploy docs (push) Has been cancelled
Docs CI / build (push) Has been cancelled
E2E Cache Warm: Cypress deps / Warm Cypress deps cache (push) Has been cancelled
Scorecards supply-chain security / Scorecard analysis (push) Has been cancelled
Server CI Weekly / Postgres FIPS (push) Has been skipped
Server CI Weekly / Run mmctl tests (FIPS) (push) Has been skipped
Server CI Weekly / Postgres with binary parameters (push) Has been skipped
Server CI Weekly / Build Environment (push) Failing after 1s
Server CI Cache Warm / Warm Go Module and Build Cache (push) Failing after 2s
Server CI Nightly Race / Build Environment (push) Failing after 1s
snapshot of https://github.com/mattermost/mattermost.git (master, 2026-09-16; blobs > 131072B omitted)
2026-09-16 00:29:55 +05:00

105 lines
3.6 KiB
JavaScript

#!/usr/bin/env node
// Filter the raw redirects.json (extracted from the legacy Sphinx
// redirects.py) to the subset whose target MDX page actually exists in
// the migrated `docs/` tree. Output:
// docs-site/sidebars/active-redirects.json
// (kept in the sidebars/ folder since that's already gitignore-aware and
// regenerated). Consumed by docusaurus.config.ts via
// @docusaurus/plugin-client-redirects.
//
// Internal redirects whose destination is still missing (target page not
// yet migrated, or marked draft) are dropped silently — they'll start
// working as soon as the destination lands. External redirects (to
// github.com, other-host) need server-side rules and aren't emitted here.
//
// Usage: node docs-site/scripts/gen-active-redirects.mjs
import {readFileSync, writeFileSync, readdirSync, statSync, existsSync} from 'node:fs';
import {join, resolve, basename, dirname} from 'node:path';
import {fileURLToPath} from 'node:url';
const HERE = dirname(fileURLToPath(import.meta.url));
const SITE_ROOT = resolve(HERE, '..');
const REPO_ROOT = resolve(SITE_ROOT, '..');
const DOCS = join(REPO_ROOT, 'main');
const SRC = join(SITE_ROOT, 'scripts', 'migrate-main-docs', 'redirects.json');
const OUT = join(SITE_ROOT, 'sidebars', 'active-redirects.json');
function isDraft(filePath) {
try {
const head = readFileSync(filePath, 'utf8').slice(0, 800);
return /^draft:\s*true/m.test(head);
} catch { return false; }
}
function urlFromMdx(absPath) {
// docs/foo/bar.mdx → /foo/bar (index.mdx → /foo)
let rel = absPath.slice(DOCS.length).replace(/\\/g, '/');
rel = rel.replace(/\.mdx$/, '');
if (rel.endsWith('/index')) rel = rel.slice(0, -'/index'.length);
return rel || '/';
}
function collectExistingUrls() {
const urls = new Set();
(function walk(dir) {
for (const name of readdirSync(dir)) {
const p = join(dir, name);
const s = statSync(p);
if (s.isDirectory()) walk(p);
else if (p.endsWith('.mdx') && !isDraft(p)) urls.add(urlFromMdx(p));
}
})(DOCS);
return urls;
}
function main() {
const raw = JSON.parse(readFileSync(SRC, 'utf8'));
const existing = collectExistingUrls();
const active = [];
const missing = [];
const droppedAnchoredFrom = [];
for (const r of raw.internal) {
// @docusaurus/plugin-client-redirects requires `from` paths without
// anchors. Sphinx allowed anchored sources for mid-page redirects —
// those need server-side rules, not client-side. Drop them.
if (r.from.includes('#')) { droppedAnchoredFrom.push(r); continue; }
// Strip anchor when checking existence; preserve it in the emitted to.
const target = r.to.split('#')[0];
if (existing.has(target)) active.push({from: r.from, to: r.to});
else missing.push(r);
}
// De-duplicate: the plugin refuses duplicate FROM values.
const seenFrom = new Map();
const final = [];
for (const r of active) {
if (seenFrom.has(r.from)) continue;
seenFrom.set(r.from, true);
final.push(r);
}
writeFileSync(
OUT,
JSON.stringify(
{
_meta: {
source: 'docs-site/scripts/migrate-main-docs/redirects.json',
active: final.length,
missing_target: missing.length,
dropped_anchored_from: droppedAnchoredFrom.length,
total_internal: raw.internal.length,
},
redirects: final,
},
null,
2,
),
);
console.log(`[redirects] wrote ${OUT}`);
console.log(` active: ${final.length}`);
console.log(` missing target: ${missing.length}`);
console.log(` dropped (anchored): ${droppedAnchoredFrom.length}`);
console.log(` total internal: ${raw.internal.length}`);
}
main();