1. Initialize the Project

mkdir my-ts-lib
cd my-ts-lib
npm init -y

2. Install Development Dependencies

npm install --save-dev typescript tsup eslint prettier

3. Create tsconfig.json

npx tsc --init

Then edit it like:

{
  "compilerOptions": {
    "target": "ESNext",
    "module": "ESNext",
    "declaration": true,
    "outDir": "dist",
    "strict": true,
    "esModuleInterop": true,
    "skipLibCheck": true,
    "moduleResolution": "Node",
    "resolveJsonModule": true
  },
  "include": ["src"]
}

4. Create Library Code

Create a src/ folder:

src/
├── index.ts

Example src/index.ts:

export function greet(name: string): string {
  return `Hello, ${name}!`;
}

5. Bundle with tsup

Add tsup.config.ts:

import { defineConfig } from 'tsup';

export default defineConfig({
  entry: ['src/index.ts'],
  format: ['esm', 'cjs'],
  dts: true,
  clean: true,
});

Add to package.json:

"scripts": {
  "build": "tsup"
}

Run:

npm run build

6. Prepare for Publishing

Edit package.json:

{
  "name": "your-lib-name",
  "version": "1.0.0",
  "main": "./dist/index.js",
  "module": "./dist/index.mjs",
  "types": "./dist/index.d.ts",
  "files": ["dist"],
  "exports": {
    "import": "./dist/index.mjs",
    "require": "./dist/index.js"
  }
}

7. Publish to npm

  1. Log in to npm:
npm login
  1. Publish:
npm publish --access public

If the name is taken, either pick a unique name or use a scoped package.


8. Install & Use the Library

Anywhere else:

npm install your-lib-name

Then in code:

import { greet } from 'your-lib-name';

console.log(greet('World'));

References

Github
npm