diff --git a/.gitignore b/.gitignore index 825b6cf4..7083ee0d 100644 --- a/.gitignore +++ b/.gitignore @@ -11,6 +11,9 @@ build # Root index page is conditionally generated if docs is not at the root /src/pages/index.tsx +# Generated release notes data +/release-notes-data.json + # Misc .DS_Store .env.local diff --git a/release-notes/index.md b/release-notes/index.md deleted file mode 100644 index e211f3fe..00000000 --- a/release-notes/index.md +++ /dev/null @@ -1,301 +0,0 @@ ---- -title: Release Notes -description: Complete version history and changelog for Harper Database -keywords: [harper, release notes, changelog, version history, updates] ---- - -## Current Release - Version 4 (Tucker) - -[Meet Tucker](release-notes/v4-tucker/tucker) Our 4th Release Pup - -[4.7.0 Tucker](release-notes/v4-tucker/4.7.0) - -[4.6.8 Tucker](release-notes/v4-tucker/4.6.8) - -[4.6.7 Tucker](release-notes/v4-tucker/4.6.7) - -[4.6.6 Tucker](release-notes/v4-tucker/4.6.6) - -[4.6.5 Tucker](release-notes/v4-tucker/4.6.5) - -[4.6.4 Tucker](release-notes/v4-tucker/4.6.4) - -[4.6.3 Tucker](release-notes/v4-tucker/4.6.3) - -[4.6.2 Tucker](release-notes/v4-tucker/4.6.2) - -[4.6.1 Tucker](release-notes/v4-tucker/4.6.1) - -[4.6.0 Tucker](release-notes/v4-tucker/4.6.0) - -[4.5.25 Tucker](release-notes/v4-tucker/4.5.25) - -[4.5.24 Tucker](release-notes/v4-tucker/4.5.24) - -[4.5.23 Tucker](release-notes/v4-tucker/4.5.23) - -[4.5.22 Tucker](release-notes/v4-tucker/4.5.22) - -[4.5.21 Tucker](release-notes/v4-tucker/4.5.21) - -[4.5.20 Tucker](release-notes/v4-tucker/4.5.20) - -[4.5.19 Tucker](release-notes/v4-tucker/4.5.19) - -[4.5.18 Tucker](release-notes/v4-tucker/4.5.18) - -[4.5.17 Tucker](release-notes/v4-tucker/4.5.17) - -[4.5.16 Tucker](release-notes/v4-tucker/4.5.16) - -[4.5.15 Tucker](release-notes/v4-tucker/4.5.15) - -[4.5.14 Tucker](release-notes/v4-tucker/4.5.14) - -[4.5.13 Tucker](release-notes/v4-tucker/4.5.13) - -[4.5.12 Tucker](release-notes/v4-tucker/4.5.12) - -[4.5.11 Tucker](release-notes/v4-tucker/4.5.11) - -[4.5.10 Tucker](release-notes/v4-tucker/4.5.10) - -[4.5.9 Tucker](release-notes/v4-tucker/4.5.9) - -[4.5.8 Tucker](release-notes/v4-tucker/4.5.8) - -[4.5.7 Tucker](release-notes/v4-tucker/4.5.7) - -[4.5.6 Tucker](release-notes/v4-tucker/4.5.6) - -[4.5.5 Tucker](release-notes/v4-tucker/4.5.5) - -[4.5.4 Tucker](release-notes/v4-tucker/4.5.4) - -[4.5.3 Tucker](release-notes/v4-tucker/4.5.3) - -[4.5.2 Tucker](release-notes/v4-tucker/4.5.2) - -[4.5.1 Tucker](release-notes/v4-tucker/4.5.1) - -[4.5.0 Tucker](release-notes/v4-tucker/4.5.0) - -[4.4.24 Tucker](release-notes/v4-tucker/4.4.24) - -[4.4.23 Tucker](release-notes/v4-tucker/4.4.23) - -[4.4.22 Tucker](release-notes/v4-tucker/4.4.22) - -[4.4.21 Tucker](release-notes/v4-tucker/4.4.21) - -[4.4.20 Tucker](release-notes/v4-tucker/4.4.20) - -[4.4.19 Tucker](release-notes/v4-tucker/4.4.19) - -[4.4.18 Tucker](release-notes/v4-tucker/4.4.18) - -[4.4.17 Tucker](release-notes/v4-tucker/4.4.17) - -[4.4.16 Tucker](release-notes/v4-tucker/4.4.16) - -[4.4.15 Tucker](release-notes/v4-tucker/4.4.15) - -[4.4.14 Tucker](release-notes/v4-tucker/4.4.14) - -[4.4.13 Tucker](release-notes/v4-tucker/4.4.13) - -[4.4.12 Tucker](release-notes/v4-tucker/4.4.12) - -[4.4.11 Tucker](release-notes/v4-tucker/4.4.11) - -[4.4.10 Tucker](release-notes/v4-tucker/4.4.10) - -[4.4.9 Tucker](release-notes/v4-tucker/4.4.9) - -[4.4.8 Tucker](release-notes/v4-tucker/4.4.8) - -[4.4.7 Tucker](release-notes/v4-tucker/4.4.7) - -[4.4.6 Tucker](release-notes/v4-tucker/4.4.6) - -[4.4.5 Tucker](release-notes/v4-tucker/4.4.5) - -[4.4.4 Tucker](release-notes/v4-tucker/4.4.4) - -[4.4.3 Tucker](release-notes/v4-tucker/4.4.3) - -[4.4.2 Tucker](release-notes/v4-tucker/4.4.2) - -[4.4.1 Tucker](release-notes/v4-tucker/4.4.1) - -[4.4.0 Tucker](release-notes/v4-tucker/4.4.0) - -[4.3.38 Tucker](release-notes/v4-tucker/4.3.38) - -[4.3.37 Tucker](release-notes/v4-tucker/4.3.37) - -[4.3.36 Tucker](release-notes/v4-tucker/4.3.36) - -[4.3.35 Tucker](release-notes/v4-tucker/4.3.35) - -[4.3.34 Tucker](release-notes/v4-tucker/4.3.34) - -[4.3.33 Tucker](release-notes/v4-tucker/4.3.33) - -[4.3.32 Tucker](release-notes/v4-tucker/4.3.32) - -[4.3.31 Tucker](release-notes/v4-tucker/4.3.31) - -[4.3.30 Tucker](release-notes/v4-tucker/4.3.30) - -[4.3.29 Tucker](release-notes/v4-tucker/4.3.29) - -[4.3.28 Tucker](release-notes/v4-tucker/4.3.28) - -[4.3.27 Tucker](release-notes/v4-tucker/4.3.27) - -[4.3.26 Tucker](release-notes/v4-tucker/4.3.26) - -[4.3.25 Tucker](release-notes/v4-tucker/4.3.25) - -[4.3.24 Tucker](release-notes/v4-tucker/4.3.24) - -[4.3.23 Tucker](release-notes/v4-tucker/4.3.23) - -[4.3.22 Tucker](release-notes/v4-tucker/4.3.22) - -[4.3.21 Tucker](release-notes/v4-tucker/4.3.21) - -[4.3.20 Tucker](release-notes/v4-tucker/4.3.20) - -[4.3.19 Tucker](release-notes/v4-tucker/4.3.19) - -[4.3.18 Tucker](release-notes/v4-tucker/4.3.18) - -[4.3.17 Tucker](release-notes/v4-tucker/4.3.17) - -[4.3.16 Tucker](release-notes/v4-tucker/4.3.16) - -[4.3.15 Tucker](release-notes/v4-tucker/4.3.15) - -[4.3.14 Tucker](release-notes/v4-tucker/4.3.14) - -[4.3.13 Tucker](release-notes/v4-tucker/4.3.13) - -[4.3.12 Tucker](release-notes/v4-tucker/4.3.12) - -[4.3.11 Tucker](release-notes/v4-tucker/4.3.11) - -[4.3.10 Tucker](release-notes/v4-tucker/4.3.10) - -[4.3.9 Tucker](release-notes/v4-tucker/4.3.9) - -[4.3.8 Tucker](release-notes/v4-tucker/4.3.8) - -[4.3.7 Tucker](release-notes/v4-tucker/4.3.7) - -[4.3.6 Tucker](release-notes/v4-tucker/4.3.6) - -[4.3.5 Tucker](release-notes/v4-tucker/4.3.5) - -[4.3.4 Tucker](release-notes/v4-tucker/4.3.4) - -[4.3.3 Tucker](release-notes/v4-tucker/4.3.3) - -[4.3.2 Tucker](release-notes/v4-tucker/4.3.2) - -[4.3.1 Tucker](release-notes/v4-tucker/4.3.1) - -[4.3.0 Tucker](release-notes/v4-tucker/4.3.0) - -[4.2.8 Tucker](release-notes/v4-tucker/4.2.8) - -[4.2.7 Tucker](release-notes/v4-tucker/4.2.7) - -[4.2.6 Tucker](release-notes/v4-tucker/4.2.6) - -[4.2.5 Tucker](release-notes/v4-tucker/4.2.5) - -[4.2.4 Tucker](release-notes/v4-tucker/4.2.4) - -[4.2.3 Tucker](release-notes/v4-tucker/4.2.3) - -[4.2.2 Tucker](release-notes/v4-tucker/4.2.2) - -[4.2.1 Tucker](release-notes/v4-tucker/4.2.1) - -[4.2.0 Tucker](release-notes/v4-tucker/4.2.0) - -[4.1.2 Tucker](release-notes/v4-tucker/4.1.2) - -[4.1.1 Tucker](release-notes/v4-tucker/4.1.1) - -[4.1.0 Tucker](release-notes/v4-tucker/4.1.0) - -[4.0.7 Tucker](release-notes/v4-tucker/4.0.7) - -[4.0.6 Tucker](release-notes/v4-tucker/4.0.6) - -[4.0.5 Tucker](release-notes/v4-tucker/4.0.5) - -[4.0.4 Tucker](release-notes/v4-tucker/4.0.4) - -[4.0.3 Tucker](release-notes/v4-tucker/4.0.3) - -[4.0.2 Tucker](release-notes/v4-tucker/4.0.2) - -[4.0.1 Tucker](release-notes/v4-tucker/4.0.1) - -[4.0.0 Tucker](release-notes/v4-tucker/4.0.0) - -## Previous Major Releases - -### Version 3 - Monkey - -[Meet Monkey](release-notes/v3-monkey/) Our 3rd Release Pup - -[3.2.1 Monkey](release-notes/v3-monkey/3.2.1) - -[3.2.0 Monkey](release-notes/v3-monkey/3.2.0) - -[3.1.5 Monkey](release-notes/v3-monkey/3.1.5) - -[3.1.4 Monkey](release-notes/v3-monkey/3.1.4) - -[3.1.3 Monkey](release-notes/v3-monkey/3.1.3) - -[3.1.2 Monkey](release-notes/v3-monkey/3.1.2) - -[3.1.1 Monkey](release-notes/v3-monkey/3.1.1) - -[3.1.0 Monkey](release-notes/v3-monkey/3.1.0) - -[3.0.0 Monkey](release-notes/v3-monkey/3.0.0) - -### Version 2 - Penny - -[Meet Penny](release-notes/v2-penny/) Our 2nd Release Pup - -[2.3.1 Penny](release-notes/v2-penny/2.3.1) - -[2.3.0 Penny](release-notes/v2-penny/2.3.0) - -[2.2.3 Penny](release-notes/v2-penny/2.2.3) - -[2.2.2 Penny](release-notes/v2-penny/2.2.2) - -[2.2.0 Penny](release-notes/v2-penny/2.2.0) - -[2.1.1 Penny](release-notes/v2-penny/2.1.1) - -### Version 1 - Alby - -[Meet Alby](release-notes/v1-alby/) Our 1st Release Pup - -[1.3.1 Alby](release-notes/v1-alby/1.3.1) - -[1.3.0 Alby](release-notes/v1-alby/1.3.0) - -[1.2.0 Alby](release-notes/v1-alby/1.2.0) - -[1.1.0 Alby](release-notes/v1-alby/1.1.0) diff --git a/release-notes/index.mdx b/release-notes/index.mdx new file mode 100644 index 00000000..02964344 --- /dev/null +++ b/release-notes/index.mdx @@ -0,0 +1,9 @@ +--- +title: Release Notes +description: Complete version history and changelog for Harper +keywords: [harper, release notes, changelog, version history, updates] +--- + +import ReleaseNotesList from '@site/src/components/ReleaseNotesList'; + + diff --git a/release-notes/v4-tucker/index.md b/release-notes/v4-tucker/index.mdx similarity index 87% rename from release-notes/v4-tucker/index.md rename to release-notes/v4-tucker/index.mdx index bbafd780..a0577a40 100644 --- a/release-notes/v4-tucker/index.md +++ b/release-notes/v4-tucker/index.mdx @@ -2,18 +2,20 @@ title: Harper Tucker (Version 4) --- +import LatestPatchLink from '@site/src/components/LatestPatchLink'; + # Harper Tucker (Version 4) HarperDB version 4 ([Tucker release](v4-tucker/tucker)) represents major step forward in database technology. This release line has ground-breaking architectural advancements including: -## [4.7 alpha](v4-tucker/4.7.0) +## - Component status monitoring for tracking loading and status changes across all components - OCSP support for TLS certificate validation in replication and HTTP connections - New analytics and licensing functionality for Fabric services integration - Further improvements to the plugin API -## [4.6](v4-tucker/4.6.8) +## - Vector Indexing - 4.6 introduces a new Vector Indexing system based on Hierarchical Navigable Small World Graphs. - New extension API - 4.6 introduces a new extension API for creating extensions components. @@ -21,25 +23,25 @@ HarperDB version 4 ([Tucker release](v4-tucker/tucker)) represents major step fo - Resource API - 4.6 has updated Resource APIs for ease of use. - Data loader - 4.6 introduces a new data loader that allows for ensuring records exist as part of a component. -## [4.5](v4-tucker/4.5.25) +## - Blob Storage - 4.5 introduces a new [Blob storage system](/docs/reference/blob). - Password Hashing Upgrade - two new password hashing algorithms for better security (to replace md5). - New resource and storage Analytics -## [4.4](v4-tucker/4.4.24) +## - Native replication (codename "Plexus") which is faster, more efficient, secure, and reliable than the previous replication system and provides provisional sharding capabilities with a foundation for the future - Computed properties that allow applications to define properties that are computed from other properties, allowing for composite properties that are calculated from other data stored in records without requiring actual storage of the computed value - Custom indexing including composite, full-text indexing, and vector indexing -## [4.3](v4-tucker/4.3.38) +## - Relationships, joins, and broad new querying capabilities for complex and nested conditions, sorting, joining, and selecting with significant query optimizations - More advanced transaction support for CRDTs and storage of large integers (with BigInt) - Better management with new upgraded local studio and new CLI features -## [4.2](v4-tucker/4.2.8) +## - New component architecture and Resource API for advanced, robust custom database application development - Real-time capabilites through MQTT, WebSockets, and Server-Sent Events @@ -47,12 +49,12 @@ HarperDB version 4 ([Tucker release](v4-tucker/tucker)) represents major step fo - Native caching capabilities for high-performance cache scenarios - Clone node functionality -## [4.1](v4-tucker/4.1.2) +## - New streaming iterators mechanism that allows query results to be delivered to clients _while_ querying results are being processed, for incredibly fast time-to-first-byte and concurrent processing/delivery - New thread-based concurrency model for more efficient resource usage -## [4.0](v4-tucker/4.0.7) +## - New clustering technology that delivers robust, resilient and high-performance replication - Major storage improvements with highly-efficient adaptive-structure modified MessagePack format, with on-demand deserialization capabilities diff --git a/scripts/generateReleaseNotesData.js b/scripts/generateReleaseNotesData.js new file mode 100644 index 00000000..65ec06bd --- /dev/null +++ b/scripts/generateReleaseNotesData.js @@ -0,0 +1,92 @@ +const fs = require('node:fs'); +const path = require('node:path'); + +const pupNames = { + 4: 'Tucker', + 3: 'Monkey', + 2: 'Penny', + 1: 'Alby', +}; + +function parseVersion(version) { + const match = version.match(/^(\d+)\.(\d+)\.(\d+)$/); + if (!match) return null; + + const major = parseInt(match[1], 10); + const minor = parseInt(match[2], 10); + const patch = parseInt(match[3], 10); + + return { + version, + major, + minor, + patch, + }; +} + +function compareVersions(a, b) { + // Sort by major, minor, patch (newest first) + if (a.major !== b.major) return b.major - a.major; + if (a.minor !== b.minor) return b.minor - a.minor; + return b.patch - a.patch; +} + +function getReleaseNotes() { + const releaseNotesDir = path.join(__dirname, '..', 'release-notes'); + const versionsByMajor = {}; + + // Read all subdirectories in release-notes + const subdirs = fs + .readdirSync(releaseNotesDir, { withFileTypes: true }) + .filter((dirent) => dirent.isDirectory()) + .map((dirent) => dirent.name); + + subdirs.forEach((subdir) => { + const subdirPath = path.join(releaseNotesDir, subdir); + const files = fs.readdirSync(subdirPath); + + files.forEach((file) => { + // Match version pattern in filename (e.g., "4.6.8.md") + const match = file.match(/^(\d+\.\d+\.\d+)\.md$/); + if (match) { + const version = parseVersion(match[1]); + if (version) { + const major = version.major; + if (!versionsByMajor[major]) { + versionsByMajor[major] = { + pupName: pupNames[major] || 'Unknown', + versions: [], + }; + } + versionsByMajor[major].versions.push(version); + } + } + }); + }); + + // Sort versions within each major version and simplify to just version strings + Object.keys(versionsByMajor).forEach((major) => { + versionsByMajor[major].versions = versionsByMajor[major].versions.sort(compareVersions).map((v) => v.version); + }); + + return versionsByMajor; +} + +function generateReleaseNotesData() { + const data = getReleaseNotes(); + const outputPath = path.join(__dirname, '..', 'release-notes-data.json'); + + fs.writeFileSync(outputPath, JSON.stringify(data, null, 2)); + console.log(`Generated release notes data at ${outputPath}`); + console.log(`Found ${Object.keys(data).length} major versions`); + + return data; +} + +// Export the function for use in other scripts +module.exports = generateReleaseNotesData; + +// If this script is run directly (not imported), execute the function +if (require.main === module) { + generateReleaseNotesData(); +} diff --git a/scripts/prebuild.js b/scripts/prebuild.js index 663e9289..331a3bf8 100644 --- a/scripts/prebuild.js +++ b/scripts/prebuild.js @@ -68,3 +68,7 @@ export default function Home(): JSX.Element { fs.writeFileSync(indexPagePath, redirectContent); console.log(`Created index redirect to ${routeBasePath}`); } + +// Generate release notes data +console.log('Generating release notes data...'); +require('./generateReleaseNotesData')(); diff --git a/src/components/LatestPatchLink.tsx b/src/components/LatestPatchLink.tsx new file mode 100644 index 00000000..5d59ad65 --- /dev/null +++ b/src/components/LatestPatchLink.tsx @@ -0,0 +1,32 @@ +import React from 'react'; + +// Import the release notes data statically +const releaseNotesData = require('@site/release-notes-data.json'); + +interface LatestPatchLinkProps { + major: number; + minor: number; + label?: string; +} + +export default function LatestPatchLink({ major, minor, label }: LatestPatchLinkProps): React.JSX.Element { + const releaseData = releaseNotesData[major]; + + if (!releaseData) { + return <>[{label || `${major}.${minor}`}]; + } + + // Find the latest patch version for this minor release + const targetPrefix = `${major}.${minor}.`; + const latestPatch = releaseData.versions.find((version: string) => version.startsWith(targetPrefix)); + + if (!latestPatch) { + return <>[{label || `${major}.${minor}`}]; + } + + // Create the link - note we use a regular anchor tag since this is rendered in the heading + const href = `/release-notes/v${major}-${releaseData.pupName.toLowerCase()}/${latestPatch}`; + const displayLabel = label || `${major}.${minor}`; + + return [{displayLabel}]; +} diff --git a/src/components/ReleaseNotesList.tsx b/src/components/ReleaseNotesList.tsx new file mode 100644 index 00000000..be7c3514 --- /dev/null +++ b/src/components/ReleaseNotesList.tsx @@ -0,0 +1,88 @@ +import React from 'react'; +import Link from '@docusaurus/Link'; + +// Import the release notes data statically +// This will be populated at build time +const releaseNotesData = require('@site/release-notes-data.json'); + +interface ReleaseData { + pupName: string; + versions: string[]; +} + +export default function ReleaseNotesList(): React.JSX.Element { + const versionsByMajor = releaseNotesData as Record; + + // Get sorted major versions + const majorVersions = Object.keys(versionsByMajor) + .map((v) => parseInt(v)) + .sort((a, b) => b - a); + + const currentMajor = majorVersions[0]; + const previousMajors = majorVersions.slice(1); + + return ( + <> + {currentMajor && versionsByMajor[currentMajor] && ( + <> +

{`Current Release - Version ${currentMajor} (${versionsByMajor[currentMajor].pupName})`}

+ +

+ + {`Meet ${versionsByMajor[currentMajor].pupName}`} + + {` Our ${currentMajor === 1 ? '1st' : currentMajor === 2 ? '2nd' : currentMajor === 3 ? '3rd' : `${currentMajor}th`} Release Pup`} +

+ +
    + {versionsByMajor[currentMajor].versions.map((version: string) => ( +
  1. + + {`${version} ${versionsByMajor[currentMajor].pupName}`} + +
  2. + ))} +
+ + )} + + {previousMajors.length > 0 && ( + <> +

Previous Major Releases

+ + {previousMajors.map((major) => { + const releaseData = versionsByMajor[major]; + if (!releaseData || releaseData.versions.length === 0) return null; + + return ( +
+

{`Version ${major} - ${releaseData.pupName}`}

+ +

+ + {`Meet ${releaseData.pupName}`} + + {` Our ${major === 1 ? '1st' : major === 2 ? '2nd' : major === 3 ? '3rd' : `${major}th`} Release Pup`} +

+ +
    + {releaseData.versions.map((version: string) => ( +
  1. + + {`${version} ${releaseData.pupName}`} + +
  2. + ))} +
+
+ ); + })} + + )} + + ); +}