Publish Nest JS Dynamic Package to Github
Tags: nestjs, package, github, node
Published: 2024-07-17 01:53:01

Publish Nest JS Dynamic Package to Github 

{% embed https://www.youtube.com/watch?v=YhgKijxE9Ao %}

In this video we are publishing Nest JS Dynamic Package to Github, Package contains a simple NestJS Package that gives dynamic random Numbers 

!['private package deployed to github'](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/vh06yvtfjp503eud1gnt.png)


!['github repo to play with package'](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6gxlwhkrbpqcht5a4wcr.png)

```js
// Package.
import { Inject } from "@nestjs/common";

// Internal.
import { RANDOM_NUMBER_CLIENT_MODULE_OPTIONS } from "./random-number.constants";
import { RandomNumberModuleOptions } from "./random-number.interface";

export class RandomNumberService {
  private readonly min: number = 0;
  private readonly max: number = 100;

  constructor(
    @Inject(RANDOM_NUMBER_CLIENT_MODULE_OPTIONS)
    private readonly options: RandomNumberModuleOptions
  ) {
    this.min = this.options.min;
    this.max = this.options.max;
  }

  generate(): number {
    const range = this.max - this.min;
    return this.min + Math.floor(Math.random() * range);
  }
}
```

## Nest JS Dynamic module 

```js
// Package.
import { DynamicModule, Global, Module, Provider, Type } from "@nestjs/common";

//Internal
import {
  RANDOM_NUMBER_CLIENT_TOKEN,
  RANDOM_NUMBER_CLIENT_MODULE_OPTIONS,
} from "./random-number.constants";
import {
  RandomNumberModuleOptions,
  RandomNumberModuleAsyncOptions,
  RandomNumberModuleFactory,
} from "./random-number.interface";
import { getRandomNumberModuleOptions } from "./utils";

//Code.
@Global()
@Module({})
export class RandomNumberModule {
  public static forRoot(options: RandomNumberModuleOptions): DynamicModule {
    const providers: Provider[] = [
      {
        provide: RANDOM_NUMBER_CLIENT_TOKEN,
        useValue: getRandomNumberModuleOptions(options),
      }
    ]
    return {
      module: RandomNumberModule,
      providers: providers,
      exports: providers,
    };
  }

  public static forRootAsync(
    options: RandomNumberModuleAsyncOptions
  ): DynamicModule {
    
    const provider: Provider = {
      inject: [RANDOM_NUMBER_CLIENT_MODULE_OPTIONS],
      provide: RANDOM_NUMBER_CLIENT_TOKEN,
      useFactory: async (options: RandomNumberModuleOptions) =>
        getRandomNumberModuleOptions(options),
    };

    return {
      module: RandomNumberModule,
      imports: options.imports,
      providers: [...this.createAsyncProviders(options), provider],
      exports: [provider],
    };
  }

  private static createAsyncProviders(
    options: RandomNumberModuleAsyncOptions
  ): Provider[] {
    if (options.useExisting || options.useFactory) {
      return [this.createAsyncOptionsProvider(options)];
    }

    const useClass = options.useClass as Type<RandomNumberModuleFactory>;

    return [
      this.createAsyncOptionsProvider(options),
      {
        provide: useClass,
        useClass,
      },
    ];
  }

  private static createAsyncOptionsProvider(
    options: RandomNumberModuleAsyncOptions
  ): Provider {
    if (options.useFactory) {
      return {
        provide: RANDOM_NUMBER_CLIENT_MODULE_OPTIONS,
        useFactory: options.useFactory,
        inject: options.inject || [],
      };
    }

    const inject = [
      (options.useClass ||
        options.useExisting) as Type<RandomNumberModuleFactory>,
    ];

    return {
      provide: RANDOM_NUMBER_CLIENT_MODULE_OPTIONS,
      useFactory: async (optionsFactory: RandomNumberModuleFactory) =>
        await optionsFactory.createApiModuleOptions(),
      inject,
    };
  }
}

```

Please checkout My video on the channel to Learn More about the package

publishing to Github using Github actions

### Info About playlist 

PlalyList Link 
https://www.youtube.com/watch?v=lVze5eT5DQQ&list=PLIGDNOJWiL18ucL7WGWeVjXmSzOVTRObE
GitHub Link 
https://github.com/tkssharma/publish-packages

🚀 Publish Node JS Utility Package to GitHub 
🚀 Publish React JS Component Package to GitHub 
🚀 Publish React JS Component and deploy using CI GitHub Actions to GitHub 
🚀 Publish Nest JS Utility Package to GitHub 
🚀 Publish Nest JS Dynamic Package to GitHub 

🚀🚀 How to Publish Private NPM Packages With Github Package Registry

We'll begin by first making our modules repository private.
Publishing private NPM packages using GitHub Package Registry involves several steps to configure your package and authenticate with GitHub. Here's a step-by-step guide:

🚀🚀 Prerequisites
Node.js and npm: Make sure you have Node.js and npm installed.
GitHub Account: Ensure you have a GitHub account and a repository where you want to host the package.
Repository Permissions: Ensure you have the necessary permissions to publish to the GitHub repository.

🚀🚀We will follow these steps 

- Create a GitHub Personal Access Token
- Authenticating With NPM Using the GitHub Registry
- Publish Your Package
- Using Your Private Package in Another Project