mirror of
https://github.com/Psychotoxical/psysonic.git
synced 2026-07-21 23:05:46 +00:00
c7d71ea57c
* feat(whats-new): remote release notes with dev workspace mode Add WHATS_NEW.md, CI whats-new.md asset upload, and client fetch/cache with embedded fallbacks. Dev and -dev builds read the full file from the repo for debugging; RC/stable download the release asset on first use. * fix(whats-new): render ## headings and add changelog tab Parse h2 sections in release-notes markdown; load changelog alongside highlights and let users switch views on the What's New page. * fix(whats-new): prefetch on startup and fix CI typecheck prebuild Prefetch whats-new asset when the shell loads on RC/stable builds. Run prebuild:release-notes before tsc and coverage jobs so the gitignored generated bundle exists in CI. * docs: CHANGELOG and credits for What's New remote notes (PR #1058) * fix(whats-new): always slice embedded release notes to current line Drop full CHANGELOG embed for -dev bundles; tauri:dev still reads live markdown from the repo. Ignore all of src/generated/ in git. * fix(whats-new): fetch release asset via Rust to bypass CORS Route whats-new.md download through fetch_url_bytes; rename the technical tab label; add fetch unit tests (PR #1058 review).
46 lines
1.8 KiB
JavaScript
46 lines
1.8 KiB
JavaScript
#!/usr/bin/env node
|
|
/**
|
|
* Build src/generated/releaseNotesBundle.ts for production bundles.
|
|
* Embeds only the ## [X.Y.Z] slice for package.json version (dev, RC, and stable).
|
|
* tauri:dev reads live markdown from the repo via Vite ?raw imports instead.
|
|
*/
|
|
|
|
import { readFileSync, mkdirSync, writeFileSync } from 'node:fs';
|
|
import { dirname, join } from 'node:path';
|
|
import { fileURLToPath } from 'node:url';
|
|
import { findReleaseSection } from './extract-release-section.mjs';
|
|
|
|
const root = join(dirname(fileURLToPath(import.meta.url)), '..');
|
|
const pkg = JSON.parse(readFileSync(join(root, 'package.json'), 'utf8'));
|
|
const version = pkg.version;
|
|
|
|
const whatsNewPath = join(root, 'WHATS_NEW.md');
|
|
const changelogPath = join(root, 'CHANGELOG.md');
|
|
const whatsNewFull = readFileSync(whatsNewPath, 'utf8');
|
|
const changelogFull = readFileSync(changelogPath, 'utf8');
|
|
|
|
function sliceForVersion(full, fileLabel) {
|
|
const entry = findReleaseSection(full, version);
|
|
if (!entry?.body) {
|
|
console.warn(`warn: no section in ${fileLabel} for ${version} — embedding empty slice`);
|
|
return '';
|
|
}
|
|
const dateSuffix = entry.date ? ` - ${entry.date}` : '';
|
|
return `## [${entry.headerVersion}]${dateSuffix}\n\n${entry.body}`;
|
|
}
|
|
|
|
const whatsNewRaw = sliceForVersion(whatsNewFull, 'WHATS_NEW.md');
|
|
const changelogRaw = sliceForVersion(changelogFull, 'CHANGELOG.md');
|
|
|
|
const outDir = join(root, 'src/generated');
|
|
mkdirSync(outDir, { recursive: true });
|
|
|
|
const ts = `/** @generated — run: node scripts/generate-release-notes-bundle.mjs */
|
|
export const WHATS_NEW_RAW: string = ${JSON.stringify(whatsNewRaw)};
|
|
|
|
export const CHANGELOG_RAW: string = ${JSON.stringify(changelogRaw)};
|
|
`;
|
|
|
|
writeFileSync(join(outDir, 'releaseNotesBundle.ts'), ts, 'utf8');
|
|
console.log(`wrote src/generated/releaseNotesBundle.ts (sliced for ${version})`);
|