From 51b9a5930bef337472eff2e97cb2f8ab010c78dd Mon Sep 17 00:00:00 2001 From: Patrick Camacho Date: Sun, 5 Jul 2026 21:10:53 +0200 Subject: [PATCH] convert install-command to TypeScript: dist packaging, changeset --- .changeset/ts-install-command.md | 5 ++ packages/install-command/README.md | 8 ++-- ...{index.spec.js.snap => index.spec.ts.snap} | 0 .../{example.js => example.ts} | 2 +- .../{index.spec.js => index.spec.ts} | 2 +- .../install-command/{index.js => index.ts} | 46 ++++++++++++------- packages/install-command/package.json | 14 ++++-- packages/install-command/tsconfig.build.json | 18 ++++++++ packages/install-command/types.ts | 20 ++++++++ pnpm-lock.yaml | 6 +++ 10 files changed, 95 insertions(+), 26 deletions(-) create mode 100644 .changeset/ts-install-command.md rename packages/install-command/__snapshots__/{index.spec.js.snap => index.spec.ts.snap} (100%) rename packages/install-command/{example.js => example.ts} (88%) rename packages/install-command/{index.spec.js => index.spec.ts} (97%) rename packages/install-command/{index.js => index.ts} (64%) create mode 100644 packages/install-command/tsconfig.build.json create mode 100644 packages/install-command/types.ts diff --git a/.changeset/ts-install-command.md b/.changeset/ts-install-command.md new file mode 100644 index 0000000..7e7a4b9 --- /dev/null +++ b/.changeset/ts-install-command.md @@ -0,0 +1,5 @@ +--- +'markdown-magic-install-command': minor +--- + +TypeScript: ship type declarations diff --git a/packages/install-command/README.md b/packages/install-command/README.md index 9d7b999..ccdf543 100644 --- a/packages/install-command/README.md +++ b/packages/install-command/README.md @@ -14,14 +14,14 @@ npm add -D markdown-magic-install-command markdown-magic@^4 ## 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 INSTALLCMD from './index.js'; +import INSTALLCMD from './index.ts'; const config = { matchWord: 'AUTO-GENERATED-CONTENT', diff --git a/packages/install-command/__snapshots__/index.spec.js.snap b/packages/install-command/__snapshots__/index.spec.ts.snap similarity index 100% rename from packages/install-command/__snapshots__/index.spec.js.snap rename to packages/install-command/__snapshots__/index.spec.ts.snap diff --git a/packages/install-command/example.js b/packages/install-command/example.ts similarity index 88% rename from packages/install-command/example.js rename to packages/install-command/example.ts index 7745a64..583ea9a 100644 --- a/packages/install-command/example.js +++ b/packages/install-command/example.ts @@ -1,6 +1,6 @@ import path from 'path'; import { markdownMagic } from 'markdown-magic'; -import INSTALLCMD from './index.js'; +import INSTALLCMD from './index.ts'; const config = { matchWord: 'AUTO-GENERATED-CONTENT', diff --git a/packages/install-command/index.spec.js b/packages/install-command/index.spec.ts similarity index 97% rename from packages/install-command/index.spec.js rename to packages/install-command/index.spec.ts index 13ffa02..50cfa61 100644 --- a/packages/install-command/index.spec.js +++ b/packages/install-command/index.spec.ts @@ -1,6 +1,6 @@ import path from 'path'; import { describe, expect, it } from 'vitest'; -import INSTALLCMD from './index.js'; +import INSTALLCMD from './index.ts'; const srcPath = path.join(import.meta.dirname, 'README.md'); diff --git a/packages/install-command/index.js b/packages/install-command/index.ts similarity index 64% rename from packages/install-command/index.js rename to packages/install-command/index.ts index ac4fb05..f3f4af1 100644 --- a/packages/install-command/index.js +++ b/packages/install-command/index.ts @@ -1,6 +1,9 @@ import { existsSync, readFileSync } from 'fs'; import path from 'path'; import { findUpSync } from 'find-up'; +import type { Client, TransformArgs, TransformOptions } from './types.ts'; + +export type { Client, TransformArgs, TransformOptions } from './types.ts'; const defaults = { flags: '["--save"]', @@ -8,7 +11,7 @@ const defaults = { exact: false, }; -const installMappings = { +const installMappings: Record> = { '--global': { npm: '--global', yarn: '', pnpm: '--global', bun: '--global' }, '--save': { npm: '--save', yarn: '', pnpm: '', bun: '' }, '--save-exact': { @@ -31,15 +34,15 @@ const installMappings = { }, }; -function quoteSpacesInDep(dep) { +function quoteSpacesInDep(dep: string): string { return dep.includes(' ') ? `"${dep}"` : dep; } -function filterFalseyAndJoin(array, join = ' ') { +function filterFalseyAndJoin(array: unknown[], join = ' '): string { return array.filter((v) => !!v).join(join); } -function findPkg(dir) { +function findPkg(dir: string): string { const pkgPath = findUpSync('package.json', { cwd: dir }); if (!pkgPath) { @@ -49,7 +52,7 @@ function findPkg(dir) { return pkgPath; } -function pickClient(dir) { +function pickClient(dir: string): Client { if ( existsSync(path.join(dir, 'bun.lock')) || existsSync(path.join(dir, 'bun.lockb')) @@ -68,7 +71,15 @@ function pickClient(dir) { return 'npm'; } -function buildDeps(pkg, exactFlag, peersFlag) { +function buildDeps( + pkg: { + name: string; + version: string; + peerDependencies?: Record; + }, + exactFlag?: boolean, + peersFlag?: boolean, +): string { const mainDep = filterFalseyAndJoin( [pkg.name, exactFlag ? pkg.version : ''], '@', @@ -79,18 +90,21 @@ function buildDeps(pkg, exactFlag, peersFlag) { const pkgPeers = pkg.peerDependencies; if (!pkgPeers) return mainDep; - const peers = Object.keys(pkg.peerDependencies).map(buildDep(pkgPeers)); + const peers = Object.keys(pkgPeers).map(buildDep(pkgPeers)); return filterFalseyAndJoin([mainDep, ...peers]); } -const buildDep = (obj) => (key) => quoteSpacesInDep([key, obj[key]].join('@')); +const buildDep = + (obj: Record) => + (key: string): string => + quoteSpacesInDep([key, obj[key]].join('@')); -function buildInstallCmd(client, isGlobal) { +function buildInstallCmd(client: Client, isGlobal: boolean): string { return `${client}${isGlobal && client === 'yarn' ? ' global' : ''} add`; } -function buildCmdFlags(client, flags) { +function buildCmdFlags(client: Client, flags: string[]): string { return filterFalseyAndJoin( flags.map((flag) => installMappings[flag]?.[client] ?? flag), ); @@ -100,11 +114,11 @@ export default function INSTALLCMD({ content: _content, options: _options = {}, srcPath, -}) { - const options = Object.assign({}, defaults, _options); - options.flags = JSON.parse(options.flags); +}: TransformArgs): string { + const options: TransformOptions = Object.assign({}, defaults, _options); + const flags: string[] = JSON.parse(options.flags as unknown as string); - let pkgPath; + let pkgPath: string; if (options.pkg) { pkgPath = path.resolve(path.dirname(srcPath), options.pkg); @@ -116,8 +130,8 @@ export default function INSTALLCMD({ const client = options.client || pickClient(path.dirname(pkgPath)); const cmd = filterFalseyAndJoin([ - buildInstallCmd(client, options.flags.includes('--global')), - buildCmdFlags(client, options.flags), + buildInstallCmd(client, flags.includes('--global')), + buildCmdFlags(client, flags), buildDeps(pkg, options.exact, options.peers !== 'false'), ]); diff --git a/packages/install-command/package.json b/packages/install-command/package.json index 6415824..b8d95d7 100644 --- a/packages/install-command/package.json +++ b/packages/install-command/package.json @@ -3,17 +3,21 @@ "version": "3.0.0", "description": "Print install command for markdown file", "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": [ @@ -25,8 +29,10 @@ "author": "Patrick Camacho ", "license": "MIT", "devDependencies": { + "@types/node": "^24.13.2", "markdown-magic": "catalog:", "prettier": "catalog:", + "typescript": "^6.0.3", "vitest": "catalog:" }, "peerDependencies": { @@ -45,6 +51,6 @@ }, "homepage": "https://github.com/camacho/markdown-magic-plugins#readme", "files": [ - "index.js" + "dist" ] } diff --git a/packages/install-command/tsconfig.build.json b/packages/install-command/tsconfig.build.json new file mode 100644 index 0000000..d7ec333 --- /dev/null +++ b/packages/install-command/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/install-command/types.ts b/packages/install-command/types.ts new file mode 100644 index 0000000..a3b9d74 --- /dev/null +++ b/packages/install-command/types.ts @@ -0,0 +1,20 @@ +// 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`/`client`/`flags`/`peers`/`exact` options. +export type Client = 'npm' | 'yarn' | 'pnpm' | 'bun'; + +export interface TransformOptions { + pkg?: string; + client?: Client; + flags?: string; + peers?: boolean | string; + exact?: boolean; + [key: string]: unknown; +} + +export interface TransformArgs { + content: string; + options: TransformOptions; + srcPath: string; +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c1e0321..11efe3f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -139,12 +139,18 @@ importers: specifier: ^8.0.0 version: 8.0.0 devDependencies: + '@types/node': + specifier: ^24.13.2 + version: 24.13.2 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))