diff -pruN 0.3.2-1/.github/workflows/check-release.yml 0.4.0-1/.github/workflows/check-release.yml
--- 0.3.2-1/.github/workflows/check-release.yml	2020-02-02 00:00:00.000000000 +0000
+++ 0.4.0-1/.github/workflows/check-release.yml	2020-02-02 00:00:00.000000000 +0000
@@ -1,29 +1,30 @@
 name: Check Release
 on:
   push:
-    branches: ["main"]
+    branches: ["*"]
   pull_request:
     branches: ["*"]
+  release:
+    types: [published]
+  schedule:
+    - cron: "0 0 * * *"
 
 jobs:
   check_release:
     runs-on: ubuntu-latest
     steps:
       - name: Checkout
-        uses: actions/checkout@v3
+        uses: actions/checkout@v4
       - name: Base Setup
         uses: jupyterlab/maintainer-tools/.github/actions/base-setup@v1
-      - name: Install Dependencies
-        run: |
-          pip install -e .
       - name: Check Release
         uses: jupyter-server/jupyter_releaser/.github/actions/check-release@v2
         with:
-
           token: ${{ secrets.GITHUB_TOKEN }}
+          version_spec: next
 
       - name: Upload Distributions
-        uses: actions/upload-artifact@v3
+        uses: actions/upload-artifact@v4
         with:
-          name: jupyterlab_myst-releaser-dist-${{ github.run_number }}
+          name: hatch-nodejs-version-dist-${{ github.run_number }}
           path: .jupyter_releaser_checkout/dist
diff -pruN 0.3.2-1/.github/workflows/full-release.yml 0.4.0-1/.github/workflows/full-release.yml
--- 0.3.2-1/.github/workflows/full-release.yml	2020-02-02 00:00:00.000000000 +0000
+++ 0.4.0-1/.github/workflows/full-release.yml	2020-02-02 00:00:00.000000000 +0000
@@ -12,6 +12,10 @@ on:
       post_version_spec:
         description: "Post Version Specifier"
         required: false
+      # silent:
+      #   description: "Set a placeholder in the changelog and don't publish the release."
+      #   required: false
+      #   type: boolean
       since:
         description: "Use PRs with activity since this date or git reference"
         required: false
@@ -23,12 +27,10 @@ on:
         description: "Comma separated list of steps to skip during Populate Release"
         required: false
 jobs:
-  full_release:
+  prep_release:
     runs-on: ubuntu-latest
     permissions:
-      # This is useful if you want to use PyPI trusted publisher
-      # and NPM provenance
-      id-token: write
+      contents: write
     steps:
       - uses: jupyterlab/maintainer-tools/.github/actions/base-setup@v1
 
@@ -36,27 +38,48 @@ jobs:
         id: prep-release
         uses: jupyter-server/jupyter_releaser/.github/actions/prep-release@v2
         with:
-          token: ${{ secrets.ADMIN_GITHUB_TOKEN }}
+          token: ${{ secrets.GITHUB_TOKEN }}
           version_spec: ${{ github.event.inputs.version_spec }}
+          # silent: ${{ github.event.inputs.silent }}
           post_version_spec: ${{ github.event.inputs.post_version_spec }}
+          target: ${{ github.event.inputs.target }}
           branch: ${{ github.event.inputs.branch }}
           since: ${{ github.event.inputs.since }}
           since_last_stable: ${{ github.event.inputs.since_last_stable }}
 
+  publish_release:
+    needs: [prep_release]
+    runs-on: ubuntu-latest
+    environment: release
+    permissions:
+      id-token: write
+    steps:
+      - uses: jupyterlab/maintainer-tools/.github/actions/base-setup@v1
+
+      - uses: actions/create-github-app-token@v1
+        id: app-token
+        with:
+          app-id: ${{ vars.APP_ID }}
+          private-key: ${{ secrets.APP_PRIVATE_KEY }}
+
       - name: Populate Release
         id: populate-release
         uses: jupyter-server/jupyter_releaser/.github/actions/populate-release@v2
         with:
-          token: ${{ secrets.ADMIN_GITHUB_TOKEN }}
+          token: ${{ steps.app-token.outputs.token }}
+          target: ${{ github.event.inputs.target }}
           branch: ${{ github.event.inputs.branch }}
-          release_url: ${{ steps.prep-release.outputs.release_url }}
+          release_url: ${{ github.event.inputs.release_url }}
           steps_to_skip: ${{ github.event.inputs.steps_to_skip }}
 
       - name: Finalize Release
         id: finalize-release
-        uses: jupyter-server/jupyter-releaser/.github/actions/finalize-release@v2
+        env:
+          NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
+        uses: jupyter-server/jupyter_releaser/.github/actions/finalize-release@v2
         with:
-          token: ${{ secrets.ADMIN_GITHUB_TOKEN }}
+          token: ${{ steps.app-token.outputs.token }}
+          target: ${{ github.event.inputs.target }}
           release_url: ${{ steps.populate-release.outputs.release_url }}
 
       - name: "** Next Step **"
@@ -64,3 +87,9 @@ jobs:
         run: |
           echo "Verify the final release"
           echo ${{ steps.finalize-release.outputs.release_url }}
+
+      - name: "** Failure Message **"
+        if: ${{ failure() }}
+        run: |
+          echo "Failed to Publish the Draft Release Url:"
+          echo ${{ steps.populate-release.outputs.release_url }}
diff -pruN 0.3.2-1/.github/workflows/prep-release.yml 0.4.0-1/.github/workflows/prep-release.yml
--- 0.3.2-1/.github/workflows/prep-release.yml	2020-02-02 00:00:00.000000000 +0000
+++ 0.4.0-1/.github/workflows/prep-release.yml	2020-02-02 00:00:00.000000000 +0000
@@ -12,6 +12,10 @@ on:
       post_version_spec:
         description: "Post Version Specifier"
         required: false
+      # silent:
+      #   description: "Set a placeholder in the changelog and don't publish the release."
+      #   required: false
+      #   type: boolean
       since:
         description: "Use PRs with activity since this date or git reference"
         required: false
@@ -22,6 +26,8 @@ on:
 jobs:
   prep_release:
     runs-on: ubuntu-latest
+    permissions:
+      contents: write
     steps:
       - uses: jupyterlab/maintainer-tools/.github/actions/base-setup@v1
 
@@ -29,8 +35,9 @@ jobs:
         id: prep-release
         uses: jupyter-server/jupyter_releaser/.github/actions/prep-release@v2
         with:
-          token: ${{ secrets.ADMIN_GITHUB_TOKEN }}
+          token: ${{ secrets.GITHUB_TOKEN }}
           version_spec: ${{ github.event.inputs.version_spec }}
+          # silent: ${{ github.event.inputs.silent }}
           post_version_spec: ${{ github.event.inputs.post_version_spec }}
           branch: ${{ github.event.inputs.branch }}
           since: ${{ github.event.inputs.since }}
diff -pruN 0.3.2-1/.github/workflows/publish-changelog.yml 0.4.0-1/.github/workflows/publish-changelog.yml
--- 0.3.2-1/.github/workflows/publish-changelog.yml	1970-01-01 00:00:00.000000000 +0000
+++ 0.4.0-1/.github/workflows/publish-changelog.yml	2020-02-02 00:00:00.000000000 +0000
@@ -0,0 +1,34 @@
+name: "Publish Changelog"
+on:
+  release:
+    types: [published]
+
+  workflow_dispatch:
+    inputs:
+      branch:
+        description: "The branch to target"
+        required: false
+
+jobs:
+  publish_changelog:
+    runs-on: ubuntu-latest
+    environment: release
+    steps:
+      - uses: jupyterlab/maintainer-tools/.github/actions/base-setup@v1
+
+      - uses: actions/create-github-app-token@v1
+        id: app-token
+        with:
+          app-id: ${{ vars.APP_ID }}
+          private-key: ${{ secrets.APP_PRIVATE_KEY }}
+
+      - name: Publish changelog
+        id: publish-changelog
+        uses: jupyter-server/jupyter_releaser/.github/actions/publish-changelog@v2
+        with:
+          token: ${{ steps.app-token.outputs.token }}
+          branch: ${{ github.event.inputs.branch }}
+
+      - name: "** Next Step **"
+        run: |
+          echo "Merge the changelog update PR: ${{ steps.publish-changelog.outputs.pr_url }}"
diff -pruN 0.3.2-1/.github/workflows/publish-release.yml 0.4.0-1/.github/workflows/publish-release.yml
--- 0.3.2-1/.github/workflows/publish-release.yml	2020-02-02 00:00:00.000000000 +0000
+++ 0.4.0-1/.github/workflows/publish-release.yml	2020-02-02 00:00:00.000000000 +0000
@@ -15,27 +15,34 @@ on:
 jobs:
   publish_release:
     runs-on: ubuntu-latest
+    environment: release
     permissions:
-      # This is useful if you want to use PyPI trusted publisher
-      # and NPM provenance
       id-token: write
     steps:
       - uses: jupyterlab/maintainer-tools/.github/actions/base-setup@v1
 
+      - uses: actions/create-github-app-token@v1
+        id: app-token
+        with:
+          app-id: ${{ vars.APP_ID }}
+          private-key: ${{ secrets.APP_PRIVATE_KEY }}
+
       - name: Populate Release
         id: populate-release
         uses: jupyter-server/jupyter_releaser/.github/actions/populate-release@v2
         with:
-          token: ${{ secrets.ADMIN_GITHUB_TOKEN }}
+          token: ${{ steps.app-token.outputs.token }}
           branch: ${{ github.event.inputs.branch }}
           release_url: ${{ github.event.inputs.release_url }}
           steps_to_skip: ${{ github.event.inputs.steps_to_skip }}
 
       - name: Finalize Release
         id: finalize-release
-        uses: jupyter-server/jupyter-releaser/.github/actions/finalize-release@v2
+        env:
+          NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
+        uses: jupyter-server/jupyter_releaser/.github/actions/finalize-release@v2
         with:
-          token: ${{ secrets.ADMIN_GITHUB_TOKEN }}
+          token: ${{ steps.app-token.outputs.token }}
           release_url: ${{ steps.populate-release.outputs.release_url }}
 
       - name: "** Next Step **"
diff -pruN 0.3.2-1/.github/workflows/tests.yml 0.4.0-1/.github/workflows/tests.yml
--- 0.3.2-1/.github/workflows/tests.yml	2020-02-02 00:00:00.000000000 +0000
+++ 0.4.0-1/.github/workflows/tests.yml	2020-02-02 00:00:00.000000000 +0000
@@ -18,19 +18,18 @@ jobs:
     runs-on: ubuntu-latest
     strategy:
       matrix:
-        python-version: ["3.7", "3.8", "3.9", "3.10"]
+        python-version: ["3.9", "3.10", "3.11", "3.12", "3.13"]
 
     steps:
-      - uses: actions/checkout@v3
+      - uses: actions/checkout@v4
       - name: Set up Python ${{ matrix.python-version }}
-        uses: actions/setup-python@v4
+        uses: actions/setup-python@v5
         with:
           python-version: ${{ matrix.python-version }}
+          cache: 'pip' # caching pip dependencies
       - name: Install dependencies
         run: |
-          python -m pip install --upgrade pip
-          pip install -e .
-          pip install pytest
+          pip install -e . --group test
       - name: Test with pytest
         run: |
           pytest
diff -pruN 0.3.2-1/.pre-commit-config.yaml 0.4.0-1/.pre-commit-config.yaml
--- 0.3.2-1/.pre-commit-config.yaml	2020-02-02 00:00:00.000000000 +0000
+++ 0.4.0-1/.pre-commit-config.yaml	2020-02-02 00:00:00.000000000 +0000
@@ -1,20 +1,20 @@
 repos:
--   repo: https://github.com/pre-commit/pre-commit-hooks
+  - repo: https://github.com/pre-commit/pre-commit-hooks
     rev: v2.3.0
     hooks:
-    -   id: check-yaml
-    -   id: end-of-file-fixer
-    -   id: trailing-whitespace
--   repo: https://github.com/psf/black
-    rev: 22.8.0
+      - id: check-yaml
+      - id: end-of-file-fixer
+      - id: trailing-whitespace
+  - repo: https://github.com/psf/black
+    rev: 25.1.0
     hooks:
-    -   id: black
--   repo: https://github.com/pycqa/isort
-    rev: 5.10.1
+      - id: black
+  - repo: https://github.com/pycqa/isort
+    rev: 6.0.1
     hooks:
       - id: isort
         name: isort
--   repo: https://github.com/pycqa/flake8
-    rev: 5.0.4
+  - repo: https://github.com/pycqa/flake8
+    rev: 7.3.0
     hooks:
-    -   id: flake8
+      - id: flake8
diff -pruN 0.3.2-1/CHANGELOG.md 0.4.0-1/CHANGELOG.md
--- 0.3.2-1/CHANGELOG.md	2020-02-02 00:00:00.000000000 +0000
+++ 0.4.0-1/CHANGELOG.md	2020-02-02 00:00:00.000000000 +0000
@@ -2,6 +2,36 @@
 
 <!-- <START NEW CHANGELOG ENTRY> -->
 
+## 0.4.0
+
+([Full Changelog](https://github.com/agoose77/hatch-nodejs-version/compare/v0.3.2...14290e3cb9e53ebab6934901dc7f5220bafbf4b9))
+
+### Enhancements made
+
+- ENH: Accept dev prerelease versions [#26](https://github.com/agoose77/hatch-nodejs-version/pull/26) ([@minrk](https://github.com/minrk))
+
+### Bugs fixed
+
+- chore: fix check-release workflow [#30](https://github.com/agoose77/hatch-nodejs-version/pull/30) ([@agoose77](https://github.com/agoose77))
+
+### Documentation improvements
+
+- DOCS: drop installation link [#24](https://github.com/agoose77/hatch-nodejs-version/pull/24) ([@agoose77](https://github.com/agoose77))
+
+### Other merged PRs
+
+- chore: update version info [#31](https://github.com/agoose77/hatch-nodejs-version/pull/31) ([@agoose77](https://github.com/agoose77))
+- chore: update CI [#29](https://github.com/agoose77/hatch-nodejs-version/pull/29) ([@agoose77](https://github.com/agoose77))
+- feat: use dependency-groups [#28](https://github.com/agoose77/hatch-nodejs-version/pull/28) ([@agoose77](https://github.com/agoose77))
+
+### Contributors to this release
+
+([GitHub contributors page for this release](https://github.com/agoose77/hatch-nodejs-version/graphs/contributors?from=2023-09-06&to=2025-07-24&type=c))
+
+[@agoose77](https://github.com/search?q=repo%3Aagoose77%2Fhatch-nodejs-version+involves%3Aagoose77+updated%3A2023-09-06..2025-07-24&type=Issues) | [@minrk](https://github.com/search?q=repo%3Aagoose77%2Fhatch-nodejs-version+involves%3Aminrk+updated%3A2023-09-06..2025-07-24&type=Issues)
+
+<!-- <END NEW CHANGELOG ENTRY> -->
+
 ## 0.3.2
 
 ([Full Changelog](https://github.com/agoose77/hatch-nodejs-version/compare/v0.3.0...4d3c73d2f4e5ac927274dc810351bc0be95ef224))
@@ -19,5 +49,3 @@
 ([GitHub contributors page for this release](https://github.com/agoose77/hatch-nodejs-version/graphs/contributors?from=2022-09-21&to=2023-09-06&type=c))
 
 [@agoose77](https://github.com/search?q=repo%3Aagoose77%2Fhatch-nodejs-version+involves%3Aagoose77+updated%3A2022-09-21..2023-09-06&type=Issues) | [@blink1073](https://github.com/search?q=repo%3Aagoose77%2Fhatch-nodejs-version+involves%3Ablink1073+updated%3A2022-09-21..2023-09-06&type=Issues) | [@vikramaditya91](https://github.com/search?q=repo%3Aagoose77%2Fhatch-nodejs-version+involves%3Avikramaditya91+updated%3A2022-09-21..2023-09-06&type=Issues)
-
-<!-- <END NEW CHANGELOG ENTRY> -->
diff -pruN 0.3.2-1/PKG-INFO 0.4.0-1/PKG-INFO
--- 0.3.2-1/PKG-INFO	2020-02-02 00:00:00.000000000 +0000
+++ 0.4.0-1/PKG-INFO	2020-02-02 00:00:00.000000000 +0000
@@ -1,20 +1,21 @@
-Metadata-Version: 2.1
+Metadata-Version: 2.4
 Name: hatch-nodejs-version
-Version: 0.3.2
+Version: 0.4.0
 Summary: Hatch plugin for versioning from a package.json file
 Project-URL: Homepage, https://github.com/agoose77/hatch-nodejs-version
 Project-URL: Issue Tracker, https://github.com/agoose77/hatch-nodejs-version/issues
 Project-URL: Source Code, https://github.com/agoose77/hatch-nodejs-version
+Author: Frédéric Collonval
 Author-email: Angus Hollands <goosey15@gmail.com>
 License: MIT
 License-File: LICENSE.txt
 Classifier: Framework :: Hatch
-Classifier: Programming Language :: Python :: 3.7
-Classifier: Programming Language :: Python :: 3.8
 Classifier: Programming Language :: Python :: 3.9
 Classifier: Programming Language :: Python :: 3.10
 Classifier: Programming Language :: Python :: 3.11
-Requires-Python: >=3.7
+Classifier: Programming Language :: Python :: 3.12
+Classifier: Programming Language :: Python :: 3.13
+Requires-Python: >=3.9
 Requires-Dist: hatchling>=0.21.0
 Description-Content-Type: text/markdown
 
@@ -34,7 +35,6 @@ This package provides two Hatch plugins:
 
 **Table of Contents**
 
-- [Installation](#installation)
 - [Global dependency](#global-dependency)
 - [Version source](#version-source)
 - [Metadata hook](#metadata-hook)
@@ -95,6 +95,7 @@ accepts the common version parts:
 - `minor`
 - `patch`
 - `pre-release`
+- `dev-release`
 
 e.g. `1.2.3-rc0`.
 
diff -pruN 0.3.2-1/README.md 0.4.0-1/README.md
--- 0.3.2-1/README.md	2020-02-02 00:00:00.000000000 +0000
+++ 0.4.0-1/README.md	2020-02-02 00:00:00.000000000 +0000
@@ -14,7 +14,6 @@ This package provides two Hatch plugins:
 
 **Table of Contents**
 
-- [Installation](#installation)
 - [Global dependency](#global-dependency)
 - [Version source](#version-source)
 - [Metadata hook](#metadata-hook)
@@ -75,6 +74,7 @@ accepts the common version parts:
 - `minor`
 - `patch`
 - `pre-release`
+- `dev-release`
 
 e.g. `1.2.3-rc0`.
 
diff -pruN 0.3.2-1/debian/changelog 0.4.0-1/debian/changelog
--- 0.3.2-1/debian/changelog	2023-12-10 16:48:39.000000000 +0000
+++ 0.4.0-1/debian/changelog	2025-08-13 13:02:04.000000000 +0000
@@ -1,3 +1,9 @@
+python-hatch-nodejs-version (0.4.0-1) unstable; urgency=low
+
+  * New upstream release.
+
+ -- Ying-Chun Liu (PaulLiu) <paulliu@debian.org>  Wed, 13 Aug 2025 14:02:04 +0100
+
 python-hatch-nodejs-version (0.3.2-1) unstable; urgency=low
 
   * New upstream release.
diff -pruN 0.3.2-1/hatch_nodejs_version/__init__.py 0.4.0-1/hatch_nodejs_version/__init__.py
--- 0.3.2-1/hatch_nodejs_version/__init__.py	2020-02-02 00:00:00.000000000 +0000
+++ 0.4.0-1/hatch_nodejs_version/__init__.py	2020-02-02 00:00:00.000000000 +0000
@@ -1,4 +1,4 @@
 # SPDX-FileCopyrightText: 2022-present Angus Hollands <goosey15@gmail.com>
 #
 # SPDX-License-Identifier: MIT
-from ._version import __version__
+from ._version import __version__  # noqa:  F401
diff -pruN 0.3.2-1/hatch_nodejs_version/_version.py 0.4.0-1/hatch_nodejs_version/_version.py
--- 0.3.2-1/hatch_nodejs_version/_version.py	2020-02-02 00:00:00.000000000 +0000
+++ 0.4.0-1/hatch_nodejs_version/_version.py	2020-02-02 00:00:00.000000000 +0000
@@ -1,4 +1,4 @@
 # SPDX-FileCopyrightText: 2022-present Angus Hollands <goosey15@gmail.com>
 #
 # SPDX-License-Identifier: MIT
-__version__ = "0.3.2"
+__version__ = "0.4.0"
diff -pruN 0.3.2-1/hatch_nodejs_version/hooks.py 0.4.0-1/hatch_nodejs_version/hooks.py
--- 0.3.2-1/hatch_nodejs_version/hooks.py	2020-02-02 00:00:00.000000000 +0000
+++ 0.4.0-1/hatch_nodejs_version/hooks.py	2020-02-02 00:00:00.000000000 +0000
@@ -3,8 +3,8 @@
 # SPDX-License-Identifier: MIT
 from hatchling.plugin import hookimpl
 
-from .version_source import NodeJSVersionSource
 from .metadata_source import NodeJSMetadataHook
+from .version_source import NodeJSVersionSource
 
 
 @hookimpl
diff -pruN 0.3.2-1/hatch_nodejs_version/metadata_source.py 0.4.0-1/hatch_nodejs_version/metadata_source.py
--- 0.3.2-1/hatch_nodejs_version/metadata_source.py	2020-02-02 00:00:00.000000000 +0000
+++ 0.4.0-1/hatch_nodejs_version/metadata_source.py	2020-02-02 00:00:00.000000000 +0000
@@ -7,11 +7,13 @@ import json
 import os.path
 import re
 import urllib.parse
-from typing import Any, Union
+from typing import Any
 
 from hatchling.metadata.plugin.interface import MetadataHookInterface
 
-AUTHOR_PATTERN = r"^(?P<name>[^<(]+?)?[ \t]*(?:<(?P<email>[^>(]+?)>)?[ \t]*(?:\((?P<url>[^)]+?)\)|$)"
+AUTHOR_PATTERN = (
+    r"^(?P<name>[^<(]+?)?[ \t]*(?:<(?P<email>[^>(]+?)>)?[ \t]*(?:\((?P<url>[^)]+?)\)|$)"
+)
 REPOSITORY_PATTERN = r"^(?:(gist|bitbucket|gitlab|github):)?(.*?)$"
 REPOSITORY_TABLE = {
     "gitlab": "https://gitlab.com",
diff -pruN 0.3.2-1/hatch_nodejs_version/version_source.py 0.4.0-1/hatch_nodejs_version/version_source.py
--- 0.3.2-1/hatch_nodejs_version/version_source.py	2020-02-02 00:00:00.000000000 +0000
+++ 0.4.0-1/hatch_nodejs_version/version_source.py	2020-02-02 00:00:00.000000000 +0000
@@ -7,22 +7,44 @@ import re
 
 from hatchling.version.source.plugin.interface import VersionSourceInterface
 
+PRE_PATTERN = r"""
+        (?P<{prefix}pre_l>(a|b|c|rc|alpha|beta|pre|preview))
+        [-.]?
+        (?P<{prefix}pre_n>[0-9]+)?
+
+"""
+DEV_PATTERN = r"""
+        dev
+        [-.]?
+        (?P<{prefix}dev_n>[0-9]+)?
+"""
+
 # The Python-aware NodeJS version regex
 # This is very similar to `packaging.version.VERSION_PATTERN`, with a few changes:
 # - Don't accept underscores
 # - Only support four-component release, prerelease, and build segments
 # - Require - to indicate prerelease
-NODE_VERSION_PATTERN = r"""
+NODE_VERSION_PATTERN = rf"""
     (?P<major>[0-9]+)                             # major
     \.
     (?P<minor>[0-9]+)                             # minor
     \.
     (?P<patch>[0-9]+)                             # patch
-    (?P<pre>                                      # pre-release
+    (?:
+      (?P<pre_only>                               # pre-release    
+        -
+        {PRE_PATTERN.format(prefix="pre_only_")}
+      ) | 
+      (?P<dev_only>                               # dev
         -
-        (?P<pre_l>(a|b|c|rc|alpha|beta|pre|preview))
-        [-\.]?
-        (?P<pre_n>[0-9]+)?
+        {DEV_PATTERN.format(prefix="dev_only_")}
+      ) |
+      (?P<pre_dev>                                # pre-release and dev    
+        -
+        {PRE_PATTERN.format(prefix="pre_dev_")}
+        \.
+        {DEV_PATTERN.format(prefix="pre_dev_")}
+      )
     )?
     (?:
        \+
@@ -40,7 +62,7 @@ NODE_VERSION_PATTERN = r"""
 
 # The NodeJS-aware Python version regex
 # This is very similar to `packaging.version.VERSION_PATTERN`, with a few changes:
-# - Only support four-component release, prerelease, and build segments
+# - Only support five-component release, prerelease, dev, and build segments
 PYTHON_VERSION_PATTERN = r"""
    v?
    (?:
@@ -50,12 +72,17 @@ PYTHON_VERSION_PATTERN = r"""
        \.
        (?P<patch>[0-9]+)                           # patch
        (?P<pre>                                    # pre-release
-           [-_\.]?
+           [-_.]?
            (?P<pre_l>(alpha|beta|preview|a|b|c|rc|pre))
-           [-_\.]?
+           [-_.]?
            (?P<pre_n>[0-9]+)?
        )?
-       (?:
+       (?P<dev>
+           [-_.]?
+           dev
+           (?P<dev_n>[0-9]+)
+       )?
+       (?:                                         # local version number
            \+
            (?P<local>
                 [0-9A-Za-z][0-9A-Za-z-_]*          # non-hyphen/dash leading identifier
@@ -105,16 +132,31 @@ class NodeJSVersionSource(VersionSourceI
         if match is None:
             raise ValueError(f"Version {version!r} did not match regex")
 
-        parts = ["{major}.{minor}.{patch}".format_map(match)]
+        groups = {}
+        for key, value in match.groupdict().items():
+            key = re.sub("pre_dev_|pre_only_|dev_only_", "", key)
+            if key not in groups:
+                groups[key] = value
+            elif value is not None:
+                groups[key] = value
+
+        del match
+        parts = ["{major}.{minor}.{patch}".format_map(groups)]
+
+        if groups["pre_only"] or groups["pre_dev"]:
+            if groups["pre_n"] is None:
+                parts.append("{pre_l}".format_map(groups))
+            else:
+                parts.append("{pre_l}{pre_n}".format_map(groups))
 
-        if match["pre"]:
-            if match["pre_n"] is None:
-                parts.append("{pre_l}".format_map(match))
+        if groups["dev_only"] or groups["pre_dev"]:
+            if groups["dev_n"] is None:
+                parts.append("dev0")
             else:
-                parts.append("{pre_l}{pre_n}".format_map(match))
+                parts.append("dev{dev_n}".format_map(groups))
 
-        if match["build"]:
-            parts.append("+{build}".format_map(match))
+        if groups["build"]:
+            parts.append("+{build}".format_map(groups))
 
         return "".join(parts)
 
@@ -137,6 +179,12 @@ class NodeJSVersionSource(VersionSourceI
             else:
                 parts.append("-{pre_l}{pre_n}".format_map(match))
 
+        if match["dev"]:
+            if match["pre"]:
+                parts.append(".dev{dev_n}".format_map(match))
+            else:
+                parts.append("-dev{dev_n}".format_map(match))
+
         if match["local"]:
             parts.append("+{local}".format_map(match))
         return "".join(parts)
@@ -166,5 +214,5 @@ class NodeJSVersionSource(VersionSourceI
         data["version"] = self.python_version_to_node(version)
         with open(path, "w") as f:
             json.dump(data, f, indent=4)
-            if raw_data.endswith('\n'):
-                f.write('\n')
+            if raw_data.endswith("\n"):
+                f.write("\n")
diff -pruN 0.3.2-1/pyproject.toml 0.4.0-1/pyproject.toml
--- 0.3.2-1/pyproject.toml	2020-02-02 00:00:00.000000000 +0000
+++ 0.4.0-1/pyproject.toml	2020-02-02 00:00:00.000000000 +0000
@@ -7,25 +7,23 @@ name = "hatch-nodejs-version"
 description = "Hatch plugin for versioning from a package.json file"
 authors = [
     {name = "Angus Hollands", email = "goosey15@gmail.com"},
+    {name = "Frédéric Collonval" },
 ]
 dependencies = [
     "hatchling>=0.21.0"
 ]
-requires-python = ">= 3.7"
+requires-python = ">= 3.9"
 readme = "README.md"
 license = {text = "MIT"}
 classifiers = [
   "Framework :: Hatch",
-  "Programming Language :: Python :: 3.7",
-  "Programming Language :: Python :: 3.8",
   "Programming Language :: Python :: 3.9",
   "Programming Language :: Python :: 3.10",
   "Programming Language :: Python :: 3.11",
+  "Programming Language :: Python :: 3.12",
+  "Programming Language :: Python :: 3.13",
 ]
 dynamic = ["version"]
-
-[project.optional-dependencies]
-
 [project.entry-points.hatch]
 nodejs = "hatch_nodejs_version.hooks"
 
@@ -34,6 +32,9 @@ Homepage = "https://github.com/agoose77/
 "Issue Tracker" = "https://github.com/agoose77/hatch-nodejs-version/issues"
 "Source Code" = "https://github.com/agoose77/hatch-nodejs-version"
 
+[dependency-groups]
+test = ["pytest>=7.0"]
+
 [tool.hatch.version]
 path = "hatch_nodejs_version/_version.py"
 
diff -pruN 0.3.2-1/tests/__init__.py 0.4.0-1/tests/__init__.py
--- 0.3.2-1/tests/__init__.py	2020-02-02 00:00:00.000000000 +0000
+++ 0.4.0-1/tests/__init__.py	2020-02-02 00:00:00.000000000 +0000
@@ -1,4 +1,3 @@
 # SPDX-FileCopyrightText: 2022-present Angus Hollands <goosey15@gmail.com>
 #
 # SPDX-License-Identifier: MIT
-import pytest
diff -pruN 0.3.2-1/tests/conftest.py 0.4.0-1/tests/conftest.py
--- 0.3.2-1/tests/conftest.py	2020-02-02 00:00:00.000000000 +0000
+++ 0.4.0-1/tests/conftest.py	2020-02-02 00:00:00.000000000 +0000
@@ -4,11 +4,11 @@
 # SPDX-License-Identifier: MIT
 import errno
 import os
+import pathlib
 import shutil
 import stat
 import tempfile
 from contextlib import contextmanager
-import pathlib
 
 import pytest
 
diff -pruN 0.3.2-1/tests/test_metadata_config.py 0.4.0-1/tests/test_metadata_config.py
--- 0.3.2-1/tests/test_metadata_config.py	2020-02-02 00:00:00.000000000 +0000
+++ 0.4.0-1/tests/test_metadata_config.py	2020-02-02 00:00:00.000000000 +0000
@@ -1,9 +1,10 @@
 # SPDX-FileCopyrightText: 2022-present Angus Hollands <goosey15@gmail.com>
 #
 # SPDX-License-Identifier: MIT
-import pytest
 import json
 
+import pytest
+
 from hatch_nodejs_version.metadata_source import NodeJSMetadataHook
 
 TRIVIAL_PYPROJECT_CONTENTS = """
@@ -170,9 +171,11 @@ class TestMetadata:
     def test_authors_accepted_as_strings(self, project):
         original_package_content = json.loads(TRIVIAL_PACKAGE_CONTENTS)
         updated_package_content = original_package_content.copy()
-        author_as_string = f"{original_package_content['author']['name']} " \
-                           f"<{original_package_content['author']['email']}>"
-        updated_package_content['author'] = author_as_string
+        author_as_string = (
+            f"{original_package_content['author']['name']} "
+            f"<{original_package_content['author']['email']}>"
+        )
+        updated_package_content["author"] = author_as_string
         (project / "pyproject.toml").write_text(TRIVIAL_PYPROJECT_CONTENTS)
         (project / "package.json").write_text(json.dumps(updated_package_content))
 
@@ -181,4 +184,3 @@ class TestMetadata:
         metadata_source = NodeJSMetadataHook(project, config=config)
         metadata_source.update(metadata)
         assert metadata == TRIVIAL_EXPECTED_METADATA
-
diff -pruN 0.3.2-1/tests/test_version_config.py 0.4.0-1/tests/test_version_config.py
--- 0.3.2-1/tests/test_version_config.py	2020-02-02 00:00:00.000000000 +0000
+++ 0.4.0-1/tests/test_version_config.py	2020-02-02 00:00:00.000000000 +0000
@@ -14,6 +14,8 @@ GOOD_NODE_PYTHON_VERSIONS = [
     ("1.4.5-b0", "1.4.5b0"),
     ("1.4.5-c1", "1.4.5c1"),
     ("1.4.5-rc0", "1.4.5rc0"),
+    ("1.4.5-dev0", "1.4.5dev0"),
+    ("1.4.5-a1.dev0", "1.4.5a1dev0"),
     ("1.4.5-alpha0", "1.4.5alpha0"),
     ("1.4.5-beta0", "1.4.5beta0"),
     ("1.4.5-pre9", "1.4.5pre9"),
