How to package an existing typescript project and release it to npm in 5 steps

We will ensure the following things
  • The npm package only contains the relevant javascript files along with type declarations
  • Our public repo doesn't need to contain any javascript file
  • My current typescript project
    It has the following file structure
    Screen Shot 2021-07-05 at 1.42.16 AM
    Below is the content of getJoke.ts
    import fetch from 'node-fetch';
    
    export default async (): Promise<string> => {
      const res = await fetch('https://official-joke-api.appspot.com/random_joke');
      const json = await res.json();
      const joke = json.setup + '\n' +json.punchline;
      return joke;
    }
    Below is the content of index.ts
    import getJoke from './getJoke'
    
    for (let i = 0; i < 20; i++) {
      getJoke().then(joke => {
        console.log(joke)
        console.log('\n \n')
      })
    }
    It's a simple project which prints 20 random jokes.
    I used
    tsc -init
    and
    npm init
    to generate my tsconfig.json and package.json files respectively.
    My package.json is almost unchanged, the only difference is the addition of a script
    "scripts": {
        "main": "tsc && node ./dist/index.js"
      }
    My tsconfig.json has a few changes. I deleted all the irrelevant configurations and add paths to outDir and rootDir. Below is my tsconfig.json
    {
      "compilerOptions": {                     
        "target": "es5",
        "module": "commonjs",
        "lib": ["es2017", "es7", "es6", "dom"],                         
        "outDir": "./dist",                             
        "rootDir": "./src",                             
        "esModuleInterop": true,                       
        "forceConsistentCasingInFileNames": true ,
        "declaration": true     
      }
    }
    Steps to Publish the typescript project
    Step1: Update tsconfig.json
    Add the following to your tsconfig.json
    "declaration": true
    Step2: Update package.json
    First we will need to add the path to our types.
    "main": "./dist/index.js",
      "types": "./dist/index.d.ts",
    We will need to add a new key-value for "types" the value should be the same as that of "main". The only difference is the extension, the value for "types" should have ".d.ts" instead of ".js"
    We will need to add another key-value pair
    "files":[
        "dist/**"
      ]
    This will tell npm which files to include in the package. Since we only want to include our compiled javascript files, we only include the files inside the dist folder. If your JS files are stored in some other directory, ensure you whitelist the correct files/path.
    Step 3: Update .gitignore
    Add the following to gitignore
    dist
    This will ensure that our javascript files do not get pushed to our repo
    Step4: Confirm everything is working
    Run the following command
    tsc && npm pack
    This should create a zip file. The zip file is essentially a representation of what your package would look like when installed using npm. After you run the command, it will also generate an output with the file contents. Ensure the javascript files are included in the package.
    Step5: Publish
    Update the name,author,license etc in package.json if you'd like. Once you are ready, simply run the below command
    tsc && npm publish
    If you get an error like below
    npm ERR! publish Failed PUT 404
    Try running the following command to login the npm using the cli
    npm login
    and then adding an user to the registry
    npm adduser
    Ensure you have an npm account with a verified addres.
    If you want to republish, run the following command
    tsc && npm version <new version number> && npm publish
    Let's try importing our package
    We will import it in a typescript file and then in a javascript file.
    Install your packages
    npm i typescript-jokes-rahul
    You can check the package inside node_modules to confirm that right files have been added to the package.
    Importing package in JavaScript
    const joke = require('typescript-jokes-rahul/dist/getJoke')
    
    joke.default()
        .then(
            joke => console.log(joke),
    )
    Importing package in typescript
    import getJoke  from 'typescript-jokes-rahul/dist/getJoke'
    
    getJoke()
        .then(
            joke => console.log(joke),
    )
    In my next article, I will talk about how to fix the weird import paths.
    Resources

    32

    This website collects cookies to deliver better user experience

    How to package an existing typescript project and release it to npm in 5 steps