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 even configured DB and Non-distruptive update system, visit samchon/backend and create a new repository from that.
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.
- packages/api/: SDK module built by
npm run build:api
- src/: Backend source directory
- src/api/: Client SDK that would be published to the
@ORGANIZATION/PROJECT-api
- src/api/functional/: API functions generated by the
nestia
- src/api/structures/: DTO structures
- src/api/functional/: API functions generated by the
- src/controllers/: Controller classes of the Main Program
- src/api/: Client SDK that would be published to the
- test/: Test Automation Program
- nestia.config.ts: Configuration file of
nestia
- package.json: NPM configuration
- tsconfig.json: TypeScript configuration for the main program
- tsconfig.api.json: TypeScript configuration for the SDK generation
List of the run commands defined in the package.json are like below:
build
: Build everythingbuild:api
: Build client SDK libray for the client developersbuild:main
: Build main program (src
directory)build:sdk
: Build SDK into main program onlybuild:swagger
: Build Swagger Documentsbuild:test
Build test automation program (test
directory)dev
: Incremental build for development (test program)eslint
&eslint:fix
&prettier
: Prettier and ESLint executionstart
: Start local NestJS servertest
: Run test automation program
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-template | Your repository URL |
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.
- Definitions
- SDK
- Test Automation Program
- Main Program
import typia from "typia";
import api from "@ORGANIZATION/PROJECT-api/lib/index";
import { IBbsArticle } from "@ORGANIZATION/PROJECT-api/lib/structures/bbs/IBbsArticle";
import { ArrayUtil } from "../../../../utils/ArrayUtil";
import { GaffComparator } from "../../../internal/GaffComparator";
import { RandomGenerator } from "../../../internal/RandomGenerator";
import { validate_index_sort } from "../../../internal/validate_index_sort";
export async function test_api_bbs_article_index_sort(
connection: api.IConnection,
): Promise<void> {
// GENERATE 100 ARTICLES
const section: string = "general";
const articles: IBbsArticle[] = await ArrayUtil.asyncRepeat(100, () =>
api.functional.bbs.articles.store(connection, section, {
writer: RandomGenerator.name(),
title: RandomGenerator.paragraph(),
body: RandomGenerator.content(),
format: "txt",
files: [],
password: RandomGenerator.alphabets(8),
}),
);
typia.assertEquals(articles);
// PREPARE VALIDATOR
const validator = validate_index_sort("BbsArticleProvider.index()")(
(input: IBbsArticle.IRequest) =>
api.functional.bbs.articles.index(connection, section, input),
);
// 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("+");
await comp("-");
}
}