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
.
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:
- Test
test
: Run test automation programbenchmark
: Run performance benchmark program
- Build
build
: Build everythingbuild:main
: Build main program (src
directory)build:test
Build test automation program (test
directory)build:sdk
: Build SDK into main program onlybuild:swagger
: Build Swagger Documentsdev
: Incremental build for development (test program)
- Deploy
package:api
: Build and deploy the SDK library to the NPMstart
: Start local NestJS server
- Webpack
webpack
: Run webpack bundlerwebpack:start
: Start the backend server built by webpackwebpack:test
: Run test program to the webpack built
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 |
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 {
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: