/nestia-start

Nestia template project installed by "npx nestia start"

Primary LanguageTypeScriptMIT LicenseMIT

Nestia Template

Outline

Build Status

A template repository for backend projects using nestia.

You can create a new project from this boilerplate by running below command:

npx nestia start <directory>

For reference, this is a minimal boilerplate project concentrating only on nestia SDK generation.

If you wanna much detailed boilerplate project, visit @samchon/backend.

Directories and Files

This template project has categorized directories like below.

As you can see from the below, all of the Backend source files are placed into the src directory. When you build the TypeScript source files, compiled files would be placed into the lib directory following the tsconfig.json configuration. Otherwise you build client SDK library for npm publishing and their compiled files would be placed into the packages directory.

NPM Run Commands

List of the run commands defined in the package.json are like below:

  • Test
    • test: Run test automation program
    • benchmark: Run performance benchmark program
  • Build
    • build: Build everything
    • build:main: Build main program (src directory)
    • build:test Build test automation program (test directory)
    • build:sdk: Build SDK into main program only
    • build:swagger: Build Swagger Documents
    • dev: Incremental build for development (test program)
  • Deploy
    • package:api: Build and deploy the SDK library to the NPM
    • start: Start local NestJS server
  • Webpack
    • webpack: Run webpack bundler
    • webpack:start: Start the backend server built by webpack
    • webpack:test: Run test program to the webpack built

Specialization

Transform this template project to be yours.

When you've created a new backend project through this template project, you can specialize it to be suitable for you by changing some words. Replace below words through IDE specific function like Edit > Replace in Files (Ctrl + Shift + H), who've been supported by the VSCode.

Before After
ORGANIZATION Your account or corporation name
PROJECT Your own project name
AUTHOR Author name
https://github.com/samchon/nestia-start Your repository URL

Test Driven Development

With nestia helps to accomplish TDD (Test Driven Development).

Just define DTOs and API controllers' methods (only declarations) first. After the definitions, and build SDK (Software Development Kit) through nestia (npm run build:sdk). After buildling those SDK, develop test automation program using the SDK, following use-case scenarios in the framework of client side.

During the test automation program development, you can find that which API is mis-designed or which requirement analysis is not exact. Development of the main program must be the last step after such validation process during TDD.

Visit the samchon/backend, then you may find much detailed story about this TDD.

  1. Definitions
  2. SDK
  3. Test Automation Program
  4. Main Program
import {
  ArrayUtil,
  GaffComparator,
  RandomGenerator,
  TestValidator,
} from "@nestia/e2e";

import api from "@ORGANIZATION/PROJECT-api/lib/index";
import { IBbsArticle } from "@ORGANIZATION/PROJECT-api/lib/structures/bbs/IBbsArticle";
import { IPage } from "@ORGANIZATION/PROJECT-api/lib/structures/common/IPage";

export async function test_api_bbs_article_index_sort(
  connection: api.IConnection,
): Promise<void> {
  // GENERATE 100 ARTICLES
  const section: string = "general";
  await ArrayUtil.asyncRepeat(100)(() =>
    api.functional.bbs.articles.create(connection, section, {
      writer: RandomGenerator.name(),
      title: RandomGenerator.paragraph(5)(),
      body: RandomGenerator.content(8)()(),
      format: "txt",
      files: [],
      password: RandomGenerator.alphabets(8),
    }),
  );

  // PREPARE VALIDATOR
  const validator = TestValidator.sort("BbsArticleProvider.index()")(async (
    sort: IPage.Sort<IBbsArticle.IRequest.SortableColumns>,
  ) => {
    const page: IPage<IBbsArticle.ISummary> =
      await api.functional.bbs.articles.index(connection, section, {
        limit: 100,
        sort,
      });
    return page.data;
  });

  // DO VALIDATE
  const components = [
    validator("created_at")(GaffComparator.dates((x) => x.created_at)),
    validator("updated_at")(GaffComparator.dates((x) => x.updated_at)),
    validator("title")(GaffComparator.strings((x) => x.title)),
    validator("writer")(GaffComparator.strings((x) => x.writer)),
    validator(
      "writer",
      "title",
    )(GaffComparator.strings((x) => [x.writer, x.title])),
  ];
  for (const comp of components) {
    await comp("+", false);
    await comp("-", false);
  }
}

For reference, if you run npm run benchmark command, your test functions defined in the test/features/api directory would be utilized for performance benchmarking. If you want to see the performance bench result earlier, visit below link please: