PackageTrack
Sign in Get early access

stellarwp/uplink

A library that integrates a WordPress product with the StellarWP Licensing system.

v2.3.1 512K downloads/mo #3879 most downloaded on Packagist stellarwp/uplink

What this package is like to depend on

Last release 11 months ago

17 Sep 2025

Ships unpredictably

gaps range from 2 weeks to 8 months

Some releases are documented

notes for 11 of 34 stable releases

Nothing withdrawn

no release was ever pulled

4 years old

34 releases · first in 2022

1 release in the last 12 months

see the full history below

Release timeline

34 releases · Oct 2022 to Sep 2025
2023 2024 2025 2026
Release Pre-release

Releases

latest 34
  1. v2.3.1 17 Sep 2025
    Release notes

    What's Changed

    • Fix retrieving nonce value to validate key by @Rahmon in #100

    Full Changelog: v2.3.0...v2.3.1

    Open source →
  2. v2.3.0 09 Jan 2025
    Release notes

    What's Changed

    • Allow for validation of a license key without a Resource object by @borkweb in #94

    Full Changelog: v2.2.2...v2.3.0

    Open source →
  3. v2.2.2 05 Dec 2024
    Release notes

    What's Changed

    Full Changelog: v2.2.1...v2.2.2

    Open source →
  4. v2.2.1 30 Sep 2024
    Release notes

    What's Changed

    Full Changelog: v2.2.0...v2.2.1

    Open source →
  5. v2.2.0 13 Sep 2024
    Release notes

    What's Changed

    New Contributors

    Full Changelog: v2.1.0...v2.2.0

    Open source →
  6. v2.1.0 27 Aug 2024
    Release notes

    What's Changed

    New Contributors

    Full Changelog: v2.0.0...v2.1.0

    Open source →
  7. v2.0.0 13 Aug 2024
    Release notes

    What's Changed

    New Contributors

    Full Changelog: v1.4.3...v2.0.0

    Open source →
  8. v1.4.3 01 Mar 2024
    Release notes

    What's Changed

    • Update tests to run in a PHP+WP matrix by @defunctl in #67
    • [BUGFIX]: Type error in filter_upgrader_pre_download() by @defunctl in #68

    Full Changelog: v1.4.2...v1.4.3

    Open source →
  9. v1.4.2 29 Feb 2024
    Release notes

    What's Changed

    • Fix fatal in filter_upgrader_source_selection() by @defunctl in #66

    Full Changelog: v1.4.1...v1.4.2

    Open source →
  10. v1.4.1 17 Jan 2024
    Release notes

    What's Changed

    • remove unneeded custom update messaging by @kadencewp in #60
    • Make it so you can enable auto updates by @kadencewp in #57
    • Add filter to allow disabling update checks by @kadencewp in #62
    • fix check for data in status by @kadencewp in #63
    • Prevent fatal during update prevention when $source is a WP_Error rather than a string by @davegreenwp in #61

    Full Changelog: v1.4.0...v1.4.1

    Open source →
  11. v1.4.0 04 Jan 2024

    Nothing published for this version

  12. v1.3.0 01 Dec 2023

    Nothing published for this version

  13. v1.2.7 28 Nov 2023

    Nothing published for this version

  14. v1.2.6 13 Nov 2023

    Nothing published for this version

  15. v1.2.5 31 Aug 2023

    Nothing published for this version

  16. v1.2.4 31 Aug 2023

    Nothing published for this version

  17. v1.2.3 30 Aug 2023
    Release notes

    Options:

    • --overwrite-version : Optional version number to use instead of auto-determining

    • --dry-run : If true, only show what would be written without making changes

    • --date : Custom date to use for the changelog entry (supports PHP strtotime format)

    The command will:

    • Read all YAML change files from the changes directory

    • Determine the next version number based on change significance (if not specified)

    • Write the changes to each configured file using its specific writing strategy

    • Clean up processed change files

    When using --dry-run :

    • Shows what would be written to each configured file

    • Displays the formatted changelog entries

    • No changes are actually made to any files

    When using --overwrite-version :

    • Uses the specified version instead of auto-determining

    • If the version exists in the changelog, new changes are appended to that version

    • If the version doesn't exist, a new version entry is created

    When using --date :

    • Uses the specified date for the changelog entry

    • Supports PHP strtotime format for flexible date specification

    • Examples:

    • --date "2024-03-20" - Specific date

    • --date "yesterday" - Relative date

    • --date "last monday" - Relative date

    • --date "next friday" - Relative date

    • If not specified, uses the current date

    The command supports multiple output files with different writing strategies:

    • Keep a Changelog format

    • StellarWP changelog format

    • StellarWP readme format

    • Custom writing strategies

    Each file is processed according to its configured strategy and the changes are written in the appropriate format.

    As a Module

    import { addCommand , validateCommand , writeCommand , writingStrategies , versioningStrategies , loadConfig , loadWritingStrategy , loadVersioningStrategy , WritingStrategy , VersioningStrategy , } from "@stellarwp/changelogger" ; // Use built-in writing strategies const keepachangelog = writingStrategies . keepachangelog ; const stellarwpChangelog = writingStrategies . stellarwpChangelog ; const stellarwpReadme = writingStrategies . stellarwpReadme ; // Use built-in versioning strategies const semver = versioningStrategies . semverStrategy ; const stellarwp = versioningStrategies . stellarStrategy ; // Load custom strategies // Note: Custom strategy files must be compiled JavaScript (.js) files. // TypeScript (.ts) files are not supported and must be compiled first. const customWritingStrategy = await loadWritingStrategy ( "./path/to/custom-writing.js" ) ; const customVersioningStrategy = await loadVersioningStrategy ( "./path/to/custom-versioning.js" ) ;

    As a GitHub Action

    name : Verify changelog Entry. on : pull_request : types : [opened, synchronize] jobs : validate : runs-on : ubuntu-latest steps :

    • uses : actions/checkout@v4 - uses : stellarwp/changelogger@main with : command : validate

    Configuration

    Configure the changelogger through your package.json:

    { "changelogger" : { "changelogFile" : " CHANGELOG.md " , "changesDir" : " changelog " , "linkTemplate" : " https://github.com/owner/repo/compare/${old}...${new} " , "ordering" : [ " type " , " content " ], "types" : { "deprecated" : " Deprecated " , "feature" : " Feature " , "fix" : " Fix " , "removed" : " Removed " , "security" : " Security " "tweak" : " Tweak " , }, "versioning" : " semver " , "files" : [ { "path" : " CHANGELOG.md " , "strategy" : " keepachangelog " }, { "ordering" : [ " significance " , " content " ], "path" : " readme.txt " , "strategy" : " stellarwp-readme " } ] } }

    Versioning Strategies

    The changelogger supports multiple versioning strategies:

    semver (default): Standard semantic versioning (major.minor.patch)

    { "changelogger" : { "versioning" : " semver " } }

    stellarwp : StellarWP versioning with hotfix support (major.minor.patch[.hotfix])

    • Supports 3-part versions: 1.2.3

    • Supports 4-part versions with hotfix: 1.2.3.4

    • Hotfix number only appears when greater than 0

    • Version handling:

    • major : Increments major, resets others (1.2.3.4 → 2.0.0)

    • minor : Increments minor, resets patch/hotfix (1.2.3.4 → 1.3.0)

    • patch :

    • With hotfix: Increments hotfix (1.2.3.4 → 1.2.3.5)

    • Without hotfix: Increments patch (1.2.3 → 1.2.4)

    { "changelogger" : { "versioning" : " stellarwp " } }

    Custom Versioning : You can provide a path to a JavaScript file that implements the versioning strategy:

    { "changelogger" : { "versioning" : " ./path/to/custom-versioning.js " } }

    [!IMPORTANT] Custom strategy files must be JavaScript ( .js ) files. TypeScript ( .ts ) files are not supported at runtime and must be compiled to JavaScript first. This applies both when using the CLI and programmatically because strategy files are loaded dynamically using Node's import() , which requires JavaScript files. If you write your custom versioning strategy in TypeScript, compile it to CommonJS JavaScript first. Use the below example and then update your configuration to use the compiled .js file.

    tsc path/to/your/custom-versioning.ts --outDir path/to/your --module CommonJS --target ES2020 --esModuleInterop false --allowSyntheticDefaultImports false --declaration false --sourceMap false --strict --skipLibCheck

    The custom versioning file must export an object with these methods:

    // custom-versioning.js module . exports = { /** * Calculate the next version based on current version and significance * @param { string } currentVersion - Current version string * @param { "major" | "minor" | "patch" } significance - Type of change * @returns { string } The next version / getNextVersion ( currentVersion , significance ) { // Your custom logic here const parts = currentVersion . split ( "." ) ; const major = parseInt ( parts [ 0 ] || "0" ) ; const minor = parseInt ( parts [ 1 ] || "0" ) ; const patch = parseInt ( parts [ 2 ] || "0" ) ; switch ( significance ) { case "major" : return ${ major + 1 } .0.0 ; case "minor" : return ${ major } . ${ minor + 1 } .0 ; case "patch" : return ${ major } . ${ minor } . ${ patch + 1 } ; default : throw new Error ( Unknown significance: ${ significance } ) ; } } , /* * Check if a version string is valid * @param { string } version - Version string to validate * @returns { boolean } True if valid / isValidVersion ( version ) { return / ^ \d + . \d + . \d + $ / . test ( version ) ; } , /* * Compare two versions * @param { string } v1 - First version * @param { string } v2 - Second version * @returns { number } -1 if v1 < v2, 0 if equal, 1 if v1 > v2 */ compareVersions ( v1 , v2 ) { const parts1 = v1 . split ( "." ) . map ( Number ) ; const parts2 = v2 . split ( "." ) . map ( Number ) ; for ( let i = 0 ; i < Math . max ( parts1 . length , parts2 . length ) ; i ++ ) { const part1 = parts1 [ i ] || 0 ; const part2 = parts2 [ i ] || 0 ; if ( part1 < part2 ) return - 1 ; if ( part1 > part2 ) return 1 ; } return 0 ; } , } ;

    See examples/custom-versioning.js for a complete example.

    Writing Strategies

    The changelogger supports multiple writing strategies that can be configured per file in your package.json:

    { "changelogger" : { "files" : [ { "path" : " CHANGELOG.md " , "strategy" : " keepachangelog " }, { "path" : " readme.txt " , "strategy" : " stellarwp-readme " } ] } }

    Available built-in strategies:

    keepachangelog : Follows the Keep a Changelog format

    Example output:

    [ 1.2.3 ] - 2024-03-22 ### Added - New feature description ### Fixed - Bug fix description [ 1.2.3 ] : https://github.com/owner/repo/compare/1.2.2...1.2.3

    stellarwp-changelog : A WordPress-style changelog format

    Example output:

    [ 1.2.3 ] 2024-03-22 - Feature - Added new feature - Fix - Fixed a bug

    stellarwp-readme : Updates readme.txt in WordPress plugin format

    Example output:

    == Changelog ==

    = [1.2.3] 2024-03-22 =

    • Feature - Added new feature
    • Fix - Fixed a bug

    Custom Writing : You can provide a path to a JavaScript file that implements the writing strategy:

    { "changelogger" : { "files" : [ { "path" : " CHANGELOG.md " , "strategy" : " ./path/to/custom-writing.js " } ] } }

    [!IMPORTANT] Custom strategy files must be compiled JavaScript ( .js ) files. TypeScript ( .ts ) files are not supported at runtime and must be compiled to JavaScript first. This applies both when using the CLI and programmatically because strategy files are loaded dynamically using Node's import() , which requires JavaScript files. If you write your custom writing strategy in TypeScript, compile it to CommonJS JavaScript first. Use the below example and then update your configuration to use the compiled .js file.

    tsc path/to/your/custom-writing.ts --outDir path/to/your/ --module CommonJS --target ES2020 --esModuleInterop false --allowSyntheticDefaultImports false --declaration false --sourceMap false --strict --skipLibCheck

    The custom writing file must export an object with these methods:

    // custom-writing.js // You can import utilities from the main package to help with formatting // Note: These are only available when using the writing strategy through changelogger const { getTypeLabel , defaultConfig } = require ( "@stellarwp/changelogger" ) ; module . exports = { /** * Format the changes into a changelog entry * @param { string } version - Version being released * @param { Array<{type: string, entry: string, significance: string}> } changes - List of changes * @param { string } [previousVersion] - Previous version for comparison * @returns { string } Formatted changelog content / formatChanges ( version , changes , previousVersion ) { // Group changes by type const grouped = { } ; for ( const change of changes ) { if ( ! grouped [ change . type ] ) { grouped [ change . type ] = [ ] ; } grouped [ change . type ] . push ( change . entry ) ; } // Format each group let output = "" ; for ( const [ type , entries ] of Object . entries ( grouped ) ) { // Use getTypeLabel for consistent type formatting // Falls back to capitalized type if not in config const label = getTypeLabel ? getTypeLabel ( type ) : type . charAt ( 0 ) . toUpperCase ( ) + type . slice ( 1 ) ; output += \n### ${ label } \n\n ; for ( const entry of entries ) { output += - ${ entry } \n ; } } return output ; } , /* * Format the header for a new version * @param { string } version - Version being released * @param { string } date - Release date (YYYY-MM-DD format) * @param { string } [previousVersion] - Previous version * @returns { string } Formatted version header / formatVersionHeader ( version , date , previousVersion ) { return ## [ ${ version } ] - ${ date } \n ; } , /* * Optional: Format version comparison links * @param { string } version - Current version * @param { string } previousVersion - Previous version * @param { string } [template] - URL template from config * @returns { string } Formatted link / formatVersionLink ( version , previousVersion , template ) { if ( ! template ) return "" ; const link = template . replace ( "{version}" , version ) . replace ( "{previousVersion}" , previousVersion ) ; return \n[ ${ version } ]: ${ link } \n ; } , /* * Match an existing version header in the changelog * @param { string } content - Existing changelog content * @param { string } version - Version to find * @returns { string|undefined } Matched header or undefined / versionHeaderMatcher ( content , version ) { const regex = new RegExp ( ^## \\[ ${ version } \\].*$ , "m" ) ; const match = content . match ( regex ) ; return match ? match [ 0 ] : undefined ; } , /* * Find where to insert new changelog entries * @param { string } content - Existing changelog content * @returns { number } Index where new entries should be inserted */ changelogHeaderMatcher ( content ) { // Look for the first version header const match = content . match ( / ^ # # [ . * ? ] / m ) ; if ( match && match . index !== undefined ) { return match . index ; } // Look for main changelog header const headerMatch = content . match ( / ^ # C h a n g e l o g / m ) ; if ( headerMatch && headerMatch . index !== undefined ) { return headerMatch . index + headerMatch [ 0 ] . length + 1 ; } return 0 ; } , } ;

    See examples/custom-writing.js for a complete example.

    Example output:

    Open source →
  18. v1.2.2 30 Aug 2023

    Nothing published for this version

  19. v1.2.1 25 Aug 2023

    Nothing published for this version

  20. v1.2.0 08 Aug 2023

    Nothing published for this version

  21. v1.1.3 12 Jul 2023

    Nothing published for this version

  22. v1.1.2 20 Feb 2023

    Nothing published for this version

  23. v1.1.1 17 Feb 2023

    Nothing published for this version

  24. v1.1.0 15 Feb 2023

    Nothing published for this version

  25. v1.0.2 14 Feb 2023

    Nothing published for this version

  26. v1.0.1 09 Feb 2023

    Nothing published for this version

  27. v1.0.0 09 Feb 2023

    Nothing published for this version

  28. v0.3.3 05 Jan 2023

    Nothing published for this version

  29. v0.3.2 21 Dec 2022

    Nothing published for this version

  30. v0.3.1 21 Dec 2022

    Nothing published for this version

  31. v0.3.0 14 Dec 2022

    Nothing published for this version

  32. v0.2.1 07 Dec 2022

    Nothing published for this version

  33. v0.2.0 17 Nov 2022

    Nothing published for this version

  34. v0.1.0 18 Oct 2022

    Nothing published for this version

Every package, every release, already written down.

The archive is open and free. Watching your own project is what we are building next.

Browse the archive