From f60a3519ae09d8a83b544b55cdc93c60f4ce7a31 Mon Sep 17 00:00:00 2001 From: Patrick Camacho Date: Sun, 5 Jul 2026 21:09:48 +0200 Subject: [PATCH] convert version-badge to TypeScript: dist packaging, changeset index.ts + types.ts + index.spec.ts + example.ts, tsconfig.build.json (rootDir/include root-relative for the flat plugin layout), dist packaging with prepack. Logic unchanged (incl. prerelease-orange color and fail-loud missing-package.json throw), types + syntax + .ts specifiers only. Adds @types/semver devDependency since the installed semver@7 package does not ship its own type declarations. --- .changeset/ts-version-badge.md | 5 ++++ packages/version-badge/README.md | 8 ++--- .../version-badge/{example.js => example.ts} | 2 +- .../{index.spec.js => index.spec.ts} | 2 +- packages/version-badge/{index.js => index.ts} | 29 +++++++++++++------ packages/version-badge/package.json | 15 +++++++--- packages/version-badge/tsconfig.build.json | 18 ++++++++++++ packages/version-badge/types.ts | 17 +++++++++++ pnpm-lock.yaml | 14 +++++++++ 9 files changed, 91 insertions(+), 19 deletions(-) create mode 100644 .changeset/ts-version-badge.md rename packages/version-badge/{example.js => example.ts} (87%) rename packages/version-badge/{index.spec.js => index.spec.ts} (97%) rename packages/version-badge/{index.js => index.ts} (67%) create mode 100644 packages/version-badge/tsconfig.build.json create mode 100644 packages/version-badge/types.ts diff --git a/.changeset/ts-version-badge.md b/.changeset/ts-version-badge.md new file mode 100644 index 0000000..172d54d --- /dev/null +++ b/.changeset/ts-version-badge.md @@ -0,0 +1,5 @@ +--- +'markdown-magic-version-badge': minor +--- + +TypeScript: ship type declarations diff --git a/packages/version-badge/README.md b/packages/version-badge/README.md index 238ba7a..95cc32d 100644 --- a/packages/version-badge/README.md +++ b/packages/version-badge/README.md @@ -10,14 +10,14 @@ npm i markdown-magic markdown-magic-version-badge --save-dev ## Adding the plugin -See `example.js` for usage. +See `example.ts` for usage. - + -```js +```ts import path from 'path'; import { markdownMagic } from 'markdown-magic'; -import VERSIONBADGE from './index.js'; +import VERSIONBADGE from './index.ts'; const config = { matchWord: 'AUTO-GENERATED-CONTENT', diff --git a/packages/version-badge/example.js b/packages/version-badge/example.ts similarity index 87% rename from packages/version-badge/example.js rename to packages/version-badge/example.ts index bd087a8..d58593d 100644 --- a/packages/version-badge/example.js +++ b/packages/version-badge/example.ts @@ -1,6 +1,6 @@ import path from 'path'; import { markdownMagic } from 'markdown-magic'; -import VERSIONBADGE from './index.js'; +import VERSIONBADGE from './index.ts'; const config = { matchWord: 'AUTO-GENERATED-CONTENT', diff --git a/packages/version-badge/index.spec.js b/packages/version-badge/index.spec.ts similarity index 97% rename from packages/version-badge/index.spec.js rename to packages/version-badge/index.spec.ts index 060bcfe..d8548cf 100644 --- a/packages/version-badge/index.spec.js +++ b/packages/version-badge/index.spec.ts @@ -1,6 +1,6 @@ import path from 'path'; import { describe, expect, it } from 'vitest'; -import format from './index.js'; +import format from './index.ts'; const srcPath = path.join(import.meta.dirname, 'README.md'); diff --git a/packages/version-badge/index.js b/packages/version-badge/index.ts similarity index 67% rename from packages/version-badge/index.js rename to packages/version-badge/index.ts index a84e2a2..06d4704 100644 --- a/packages/version-badge/index.js +++ b/packages/version-badge/index.ts @@ -2,12 +2,15 @@ import path from 'path'; import { readFileSync } from 'fs'; import { findUpSync } from 'find-up'; import semver from 'semver'; +import type { TransformArgs, TransformOptions } from './types.ts'; -function encode(value) { +export type { TransformArgs, TransformOptions } from './types.ts'; + +function encode(value: string): string { return value.replace(/-/g, '--').replace(/_/g, '__').replace(/ /g, '_'); } -function findPkg(dir) { +function findPkg(dir: string): string { const pkgPath = findUpSync('package.json', { cwd: dir }); if (!pkgPath) { @@ -17,8 +20,11 @@ function findPkg(dir) { return pkgPath; } -function getPackage(options, srcPath) { - let pkgPath; +function getPackage( + options: TransformOptions, + srcPath: string, +): { name: string; version: string } { + let pkgPath: string; if (options?.pkg) { pkgPath = path.resolve(path.dirname(srcPath), options.pkg); @@ -29,12 +35,17 @@ function getPackage(options, srcPath) { return JSON.parse(readFileSync(pkgPath, 'utf8')); } -function getPrefix(options) { +function getPrefix(options: TransformOptions): string { return options?.prefix || 'npm'; } -function renderBadge(prefix, name, version, { color: _color } = {}) { - let color; +function renderBadge( + prefix: string, + name: string, + version: string, + { color: _color }: TransformOptions = {}, +): string { + let color: string; if (_color) { color = _color; @@ -53,7 +64,7 @@ function renderBadge(prefix, name, version, { color: _color } = {}) { return `![${prefix}](${img})`; } -function linkify(name, img, options) { +function linkify(name: string, img: string, options: TransformOptions): string { if (options?.link === 'false') return img; const url = options?.link || `https://www.npmjs.com/package/${name}`; return `[${img}](${url})`; @@ -63,7 +74,7 @@ export default function VERSIONBADGE({ content: _content, options = {}, srcPath, -}) { +}: TransformArgs): string { const { name, version } = getPackage(options, srcPath); const prefix = getPrefix(options); const img = renderBadge(prefix, name, version, options); diff --git a/packages/version-badge/package.json b/packages/version-badge/package.json index d511b15..8e5e109 100644 --- a/packages/version-badge/package.json +++ b/packages/version-badge/package.json @@ -3,17 +3,21 @@ "version": "2.0.0", "description": "Version badge via Markdown Magic", "type": "module", - "main": "index.js", + "main": "dist/index.js", + "types": "dist/index.d.ts", "exports": { - ".": "./index.js", + ".": "./dist/index.js", "./package.json": "./package.json" }, "engines": { "node": ">=22.18.0" }, "scripts": { + "prebuild": "rm -rf dist", + "build": "tsc --project tsconfig.build.json", + "prepack": "pnpm build", "test": "vitest run", - "docs": "node example.js && prettier --write README.md", + "docs": "node example.ts && prettier --write README.md", "format": "prettier --write ." }, "keywords": [ @@ -24,8 +28,11 @@ "author": "Patrick Camacho ", "license": "MIT", "devDependencies": { + "@types/node": "^24.13.2", + "@types/semver": "^7.7.1", "markdown-magic": "catalog:", "prettier": "catalog:", + "typescript": "^6.0.3", "vitest": "catalog:" }, "peerDependencies": { @@ -45,6 +52,6 @@ "url": "https://github.com/camacho/markdown-magic-plugins/issues" }, "files": [ - "index.js" + "dist" ] } diff --git a/packages/version-badge/tsconfig.build.json b/packages/version-badge/tsconfig.build.json new file mode 100644 index 0000000..d7ec333 --- /dev/null +++ b/packages/version-badge/tsconfig.build.json @@ -0,0 +1,18 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "noEmit": false, + "outDir": "dist", + "rootDir": ".", + "types": ["node"] + }, + "exclude": [ + "node_modules", + "dist", + "*.spec.ts", + "example.ts", + "__fixtures__", + "__snapshots__" + ], + "include": ["*.ts"] +} diff --git a/packages/version-badge/types.ts b/packages/version-badge/types.ts new file mode 100644 index 0000000..88df021 --- /dev/null +++ b/packages/version-badge/types.ts @@ -0,0 +1,17 @@ +// Transform interface shared by markdown-magic plugins. Adapted from +// format-package's scripts/markdown-transformers.ts TransformArgs/TransformOptions +// (content: unknown -> content: string, the plugins' actual contract), plus +// this package's own `pkg`/`prefix`/`link`/`color` options. +export interface TransformOptions { + pkg?: string; + prefix?: string; + link?: string; + color?: string; + [key: string]: unknown; +} + +export interface TransformArgs { + content: string; + options: TransformOptions; + srcPath: string; +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c1e0321..c739db2 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -244,12 +244,21 @@ importers: specifier: ^7.0.0 version: 7.8.5 devDependencies: + '@types/node': + specifier: ^24.13.2 + version: 24.13.2 + '@types/semver': + specifier: ^7.7.1 + version: 7.7.1 markdown-magic: specifier: 'catalog:' version: 4.10.5 prettier: specifier: 'catalog:' version: 3.9.1 + typescript: + specifier: ^6.0.3 + version: 6.0.3 vitest: specifier: 'catalog:' version: 4.1.9(@types/node@24.13.2)(vite@8.1.0(@types/node@24.13.2)) @@ -564,6 +573,9 @@ packages: '@types/node@24.13.2': resolution: {integrity: sha512-fRa09kZTgu8o71KFcDjUFuc7F+dEbZYZmkI0mg5YBTRs0yMKjYHsq/c0urDKeDb+D5qVgXOdFcuu+DZPKOITwA==} + '@types/semver@7.7.1': + resolution: {integrity: sha512-FmgJfu+MOcQ370SD0ev7EI8TlCAfKYU+B4m5T3yXc1CiRN94g/SZPtsCkk506aUDtlMnFZvasDwHHUcZUEaYuA==} + '@typescript-eslint/eslint-plugin@8.62.0': resolution: {integrity: sha512-o+mpz7EYiMzXoySXiKmzlabIvTVqUuK5yLrAedRPRDA0IpPFMUV1IXt6OqljIxX/kumN6EjUYp41Hqelh6p/Dw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -2377,6 +2389,8 @@ snapshots: dependencies: undici-types: 7.18.2 + '@types/semver@7.7.1': {} + '@typescript-eslint/eslint-plugin@8.62.0(@typescript-eslint/parser@8.62.0(eslint@10.6.0)(typescript@6.0.3))(eslint@10.6.0)(typescript@6.0.3)': dependencies: '@eslint-community/regexpp': 4.12.2