Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

MakePack is a command-line interface (CLI) tool that helps you to quickly set up, build, and manage JavaScript, TypeScript, React, and React-TypeScript libraries for use in npm projects.

Notifications You must be signed in to change notification settings

devnax/makepack

Folders and files

NameName
Last commit message
Last commit date

Latest commit

History

87 Commits

Repository files navigation

makepack

makepack

A zero‐config (yet configurable) CLI to scaffold, develop, build, and publish modern JavaScript / TypeScript / React libraries.

Create a production‐ready npm package in seconds: pick a template, start a hot‐reloading dev server, bundle to ESM + CJS (and optionally a single bundle), generate type declarations, and publish – all with one tool.

npm version build issues license


✨ Features

  • Rapid project creation with four templates:
    • TypeScript library
    • JavaScript library
    • React + TypeScript component library
    • React + JavaScript component library
  • Development server with hot reload + optional Express middleware (express.ts / express.js)
  • Automatic dependency graph tracking (via madge) for efficient reloads
  • Incremental TypeScript compilation and declaration output
  • Dual module build (esm, cjs, or both) with optional single bundled file
  • Tree‐shaken and optionally minified output
  • Sourcemaps & type declarations by default
  • Clean build output in an isolated .mpack directory (publish‐ready)
  • Simple release workflow (makepack release or npm run release guidance)

🚀 Quick Start

Install globally (recommended) or use npx.

npm install -g makepack # global
# or
npx makepack create # without global install

Create a new project:

makepack create
# Answer the interactive prompts:
# - Project name
# - Template

Enter the project (if created in a new folder) and start the dev server:

cd your-project
npm start

Build the library:

makepack build

Release (after building):

makepack release # publishes the contents of ./.mpack to npm

Tip: You can also run via package scripts (auto‐generated or added manually): npm run build / npm run start.


📦 Generated Project Structure

Depending on template, you’ll get something like:

your-lib/
	package.json
	readme.md
	tsconfig.json (TypeScript templates)
	src/
		index.(ts|js|tsx|jsx)
		(React templates include an example component + export)

During development/build:

.mpack/ # Build output (cleaned & regenerated each build)
	package.json # Stripped (scripts & "type" removed for publishing clarity)
	readme.md
	dist files # ESM/CJS outputs + declarations + sourcemaps

Do not edit files inside .mpack directly. Treat it as a disposable publish directory.


🧪 Development Server

Run: makepack start --port 3000

Features:

  • Hot reload on dependency change
  • Optional custom Express bootstrap via a root express.ts or express.js exporting a default function (app) => { ... }
  • Safe handler wrapping to catch async errors

Example express.ts:

import { Express } from 'express';
export default function routes(app: Express) {
	app.get('/health', (_req, res) => {
		res.json({ ok: true, ts: Date.now() });
	});
}

If present, it’s reloaded automatically when edited.


🏗 Build System

Command:

makepack build [options]
Option Default Values Description
--format / -f both cjs, esm, both Module formats to output
--bundle / -b false true/false Bundle into a single file (rollup/esbuild assisted)
--minify / -m false true/false Minify output (Terser)
--sourcemap / -s true true/false Emit source maps
--declaration / -d true true/false Emit TypeScript .d.ts files

Behavior notes:

  • The tool auto‐detects src/index.(ts|js|tsx|jsx) as the entry.
  • Boolean flags accept either actual booleans or string equivalents: --minify=true.
  • Output is always placed in .mpack/ (cleaned each run).
  • package.json in output has scripts and type removed for neutral publishing.

Example Builds

Dual build with declarations (default):

makepack build

ESM only, minified, bundled:

makepack build --format=esm --bundle=true --minify=true

Disable sourcemaps & declarations (faster):

makepack build -s=false -d=false

🚢 Releasing

  1. Ensure you are logged in to npm: npm login
  2. Build your package: makepack build
  3. Publish from the generated directory:
    • Quick command: makepack release
    • Manual: cd .mpack && npm publish

The release command simply runs npm publish inside .mpack after verifying a build exists.


🔌 Express Integration (Optional)

Add express.ts or express.js in the project root. Export a default function receiving the Express app. Example with middleware:

import compression from 'compression';
export default function(app) {
	app.use(compression());
	app.get('/', (_req, res) => res.send('Hello from makepack dev server'));
}

The file and all its dependency graph (resolved via madge) are watched; edits trigger a reload.


🧬 Technology Stack

Area Tooling
CLI commander
Dev Server express, vite, chokidar, madge
Builds rollup, @rollup/plugin-*, esbuild, rollup-plugin-dts, terser
UX inquirer, ora
FS/Utils fs-extra, lodash.debounce

🛠 Templates Overview

Template Use Case Entry Extras
typescript Library in TypeScript src/index.ts tsconfig.json
javascript Plain JS library src/index.js
react with typescript React component library (TSX) src/index.tsx React + types setup
react with javascript React component library (JSX) src/index.jsx React setup

Generated React templates export a sample component you can replace.


🔄 Lifecycle Summary

  1. create → scaffold + install deps
  2. start → hot dev (optionally with express middleware)
  3. build → produce distributable code in .mpack
  4. release → publish the build to npm

📘 Command Reference

makepack create # Interactive project scaffolding
makepack start --port 4000 # Start dev server on custom port
makepack build [flags] # Build library
makepack release # Publish from .mpack

See build flags in the Build System section.


🧩 Using From package.json

You can wire scripts (some templates already do this):

{
	"scripts": {
		"start": "makepack start --port 3000",
		"build": "makepack build",
		"release": "makepack release"
	}
}

Run with npm run build etc.


🧷 Best Practices

  • Keep a clean root: limit extra build artifacts outside src/.
  • Export your public API from a single src/index.*.
  • Use semantic versioning (e.g. npm version patch).
  • For React libraries, avoid bundling peer deps – list react & react-dom as peerDependencies in your own package.json before publishing.
  • Add a LICENSE file (see below) – required for many consumers.

🐞 Troubleshooting

Issue Cause Fix
"No entry file found" Missing src/index.* Create src/index.ts or equivalent
Express not reloading File outside dependency graph Import files directly from `express.(ts
Declarations missing --declaration=false or JS template Use TS template or enable flag
Publish fails Not built Run makepack build first
ESM import errors Missing "type": "module" in root Add type back in your source project (it’s stripped only in .mpack)

🤝 Contributing

Contributions welcome! Suggested flow:

  1. Fork & clone
  2. Create a feature branch: git checkout -b feat/your-idea
  3. Implement + add/update docs
  4. Commit with conventional style: feat(build): add xyz
  5. Open a PR

Please include clear reproduction steps for any bug fix.

Future Ideas (Open for PRs)

  • Plugin system for custom build steps
  • Peer dependency auto‐detection
  • Template customization presets
  • E2E test harness

🔐 Security

No network calls are performed beyond npm install/publish and user code execution. Always audit generated dependencies before publishing.

Report vulnerabilities via GitHub Issues (consider labeling as security). Avoid posting exploit details publicly – request a private channel if needed.


📄 License

License: TBD (e.g. MIT). Add a LICENSE file such as:

MIT License
Copyright (c) 2025 Devnax
Permission is hereby granted, free of charge, to any person obtaining a copy...

🙋 FAQ

Why strip scripts and type from the published package.json?
To minimize accidental exposure of internal scripts and to keep the distributed package neutral; consumers rarely need them.

Can I output only one format?
Yes: --format=esm or --format=cjs.

How do I include assets (e.g. CSS)?
Import them from your entry; configure rollup/esbuild plugins in future versions (PRs welcome) – currently you’d manually copy in a post-step.

Does it support monorepos?
Not natively; you can still run it per package folder.

Why another tool?
To reduce the ceremony of picking + wiring rollup, tsconfig, scripts, vite dev preview, express hooks, and publish layout – all unified.


📬 Support

Open an issue for bugs, ideas, or questions: https://github.com/devnax/makepack/issues


Built with ❤️ to streamline modern package creation.

About

MakePack is a command-line interface (CLI) tool that helps you to quickly set up, build, and manage JavaScript, TypeScript, React, and React-TypeScript libraries for use in npm projects.

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

AltStyle によって変換されたページ (->オリジナル) /