Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 9 additions & 12 deletions .circleci/config.yml
Original file line number Diff line number Diff line change
Expand Up @@ -12,19 +12,16 @@ jobs:
steps:
- checkout
- run: sudo npm install -g npm@latest
#- restore_cache:
# keys:
# - node-deps-v1-{{ .Branch }}-{{checksum "package-lock.json"}}
- run:
name: install pnpm
command: sudo npm install -g pnpm@latest
- restore_cache:
keys:
- node-deps-v1-{{ .Branch }}-{{checksum "package-lock.json"}}
- run:
name: install packages
command: pnpm install --no-frozen-lockfile
#- save_cache:
# key: node-deps-v1-{{ .Branch }}-{{checksum "package-lock.json"}}
# paths:
# - ~/.npm
command: npm install
- save_cache:
key: node-deps-v1-{{ .Branch }}-{{checksum "package-lock.json"}}
paths:
- ~/.npm
- run:
name: Install dockerize
command: wget https://github.com/jwilder/dockerize/releases/download/$DOCKERIZE_VERSION/dockerize-linux-amd64-$DOCKERIZE_VERSION.tar.gz && sudo tar -C /usr/local/bin -xzvf dockerize-linux-amd64-$DOCKERIZE_VERSION.tar.gz && rm dockerize-linux-amd64-$DOCKERIZE_VERSION.tar.gz
Expand All @@ -35,7 +32,7 @@ jobs:
command: dockerize -wait tcp://localhost:6379 -timeout 1m
- run:
name: Run Tests
command: pnpm run ci:test
command: npm run ci:test
- codecov/upload

workflows:
Expand Down
27 changes: 15 additions & 12 deletions .github/workflows/node.js.xxx → .github/workflows/test.yml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
# This workflow will do a clean installation of node dependencies, cache/restore them, build the source code and run tests across different versions of node
# For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-nodejs

name: Node.js CI
name: Run tests

on:
push:
Expand All @@ -20,23 +20,26 @@ jobs:
# See supported Node.js release schedule at https://nodejs.org/en/about/releases/
redis:
- "7.2"
- "7.0"
- "6.2"
- "6.0"
- "5.0"
- "4.0"

steps:
- uses: actions/checkout@v4
- uses: shogo82148/actions-setup-redis@v1
with:
auto-start: true
redis-version: "7.x"
redis-conf: "requirepass ${{ secrets.AAA_REDIS_PASSWORD }}"
- run: redis-cli ping
- name: Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v4
with:
node-version: ${{ matrix.node-version }}
#cache: 'npm'
- run: npm install -g pnpm@latest
- run: pnpm install
cache: 'npm'
- run: npm install
# - run: apt install redis-tools
# - run: ./wait-for-redis.sh localhost:6379
- run: wget https://github.com/jwilder/dockerize/releases/download/v0.6.1/dockerize-linux-amd64-v0.6.1.tar.gz && sudo tar -C /usr/local/bin -xzvf dockerize-linux-amd64-v0.6.1.tar.gz && rm dockerize-linux-amd64-v0.6.1.tar.gz
- run: dockerize -wait tcp://localhost:6379 -timeout 1m
#- run: pnpm install
# - run: pnpm run build --if-present
- run: pnpm test
- run: npm run ci:test
env:
AAA_JWT_TOKEN_SECRET_KEY: ${{ secrets.AAA_JWT_TOKEN_SECRET_KEY }}
AAA_REDIS_PASSWORD: ${{ secrets.AAA_REDIS_PASSWORD }}
6 changes: 6 additions & 0 deletions .husky/post-commit
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
#!/usr/bin/env sh
. "$(dirname -- "$0")/_/husky.sh"

echo \"[Husky] post-commit\"

ts-node ci-cd/bumpTag.ts
4 changes: 3 additions & 1 deletion .husky/pre-commit
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
#!/usr/bin/env sh
. "$(dirname -- "$0")/_/husky.sh"

npm run lint && npm run test
echo \"[Husky] pre-commit\"

# npm run lint && npm run test && ts-node ci-cd/bumpPackage.ts
38 changes: 19 additions & 19 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,11 +9,11 @@ Applications built with this boilerplate aims to run `Anywhere, Anytime, Anyhow`
| [![Known Vulnerabilities](https://snyk.io/test/github/web2solutions/aaa-typescript-boilerplate/badge.svg)](https://snyk.io/test/github/web2solutions/aaa-typescript-boilerplate) | [![CircleCI](https://dl.circleci.com/status-badge/img/gh/web2solutions/aaa-typescript-boilerplate/tree/main.svg?style=svg)](https://dl.circleci.com/status-badge/redirect/gh/web2solutions/aaa-typescript-boilerplate/tree/main) | [![CircleCI](https://dl.circleci.com/status-badge/img/gh/web2solutions/aaa-typescript-boilerplate/tree/dev.svg?style=svg)](https://dl.circleci.com/status-badge/redirect/gh/web2solutions/aaa-typescript-boilerplate/tree/dev) | [![codecov](https://codecov.io/gh/web2solutions/aaa-typescript-boilerplate/graph/badge.svg?token=eEF1QUBbj9)](https://codecov.io/gh/web2solutions/aaa-typescript-boilerplate) | [![codecov](https://codecov.io/gh/web2solutions/aaa-typescript-boilerplate/branch/dev/graph/badge.svg?token=eEF1QUBbj9)](https://codecov.io/gh/web2solutions/aaa-typescript-boilerplate) |
| | | | | |

![TypeScript](https://img.shields.io/badge/typescript-%23007ACC.svg?style=for-the-badge&logo=typescript&logoColor=white) [![Run with Express](https://img.shields.io/badge/Run%20with%20Express-gold?style=flat-square&logo=JavaScript&logoColor=000)](https://expressjs.com/) [![Static Badge](https://img.shields.io/badge/Run%20with%20Fastify-gold?style=flat-square&logo=JavaScript&logoColor=000)](https://fastify.dev/) [![Static Badge](https://img.shields.io/badge/Run%20with%20Restify-gold?style=flat-square&logo=JavaScript&logoColor=000)](http://restify.com/) [![Static Badge](https://img.shields.io/badge/Run%20with%20HyperExpress-gold?style=flat-square&logo=JavaScript&logoColor=000)](https://github.com/kartikk221/hyper-express) [![Static Badge](https://img.shields.io/badge/Run%20with%20Serveless-gold?style=flat-square&logo=JavaScript&logoColor=000)](https://www.serverless.com/)
[![Run with Express](https://img.shields.io/badge/Run%20with%20Express-gold?style=flat-square&logo=JavaScript&logoColor=000)](https://expressjs.com/) [![Static Badge](https://img.shields.io/badge/Run%20with%20Fastify-gold?style=flat-square&logo=JavaScript&logoColor=000)](https://fastify.dev/) [![Static Badge](https://img.shields.io/badge/Run%20with%20Restify-gold?style=flat-square&logo=JavaScript&logoColor=000)](http://restify.com/) [![Static Badge](https://img.shields.io/badge/Run%20with%20HyperExpress-gold?style=flat-square&logo=JavaScript&logoColor=000)](https://github.com/kartikk221/hyper-express) [![Static Badge](https://img.shields.io/badge/Run%20with%20Serveless-gold?style=flat-square&logo=JavaScript&logoColor=000)](https://www.serverless.com/)



[![Quality Gate Status](https://sonarcloud.io/api/project_badges/measure?project=web2solutions_aaa-typescript-boilerplate&metric=alert_status)](https://sonarcloud.io/summary/new_code?id=web2solutions_aaa-typescript-boilerplate) [![Code Smells](https://sonarcloud.io/api/project_badges/measure?project=web2solutions_aaa-typescript-boilerplate&metric=code_smells)](https://sonarcloud.io/summary/new_code?id=web2solutions_aaa-typescript-boilerplate) [![Bugs](https://sonarcloud.io/api/project_badges/measure?project=web2solutions_aaa-typescript-boilerplate&metric=bugs)](https://sonarcloud.io/summary/new_code?id=web2solutions_aaa-typescript-boilerplate) [![Lines of Code](https://sonarcloud.io/api/project_badges/measure?project=web2solutions_aaa-typescript-boilerplate&metric=ncloc)](https://sonarcloud.io/summary/new_code?id=web2solutions_aaa-typescript-boilerplate) [![Reliability Rating](https://sonarcloud.io/api/project_badges/measure?project=web2solutions_aaa-typescript-boilerplate&metric=reliability_rating)](https://sonarcloud.io/summary/new_code?id=web2solutions_aaa-typescript-boilerplate) [![Security Rating](https://sonarcloud.io/api/project_badges/measure?project=web2solutions_aaa-typescript-boilerplate&metric=security_rating)](https://sonarcloud.io/summary/new_code?id=web2solutions_aaa-typescript-boilerplate) [![Technical Debt](https://sonarcloud.io/api/project_badges/measure?project=web2solutions_aaa-typescript-boilerplate&metric=sqale_index)](https://sonarcloud.io/summary/new_code?id=web2solutions_aaa-typescript-boilerplate) [![Maintainability Rating](https://sonarcloud.io/api/project_badges/measure?project=web2solutions_aaa-typescript-boilerplate&metric=sqale_rating)](https://sonarcloud.io/summary/new_code?id=web2solutions_aaa-typescript-boilerplate) [![Vulnerabilities](https://sonarcloud.io/api/project_badges/measure?project=web2solutions_aaa-typescript-boilerplate&metric=vulnerabilities)](https://sonarcloud.io/summary/new_code?id=web2solutions_aaa-typescript-boilerplate) ![GitHub Issues or Pull Requests](https://img.shields.io/github/issues/web2solutions/aaa-typescript-boilerplate) ![CircleCI](https://img.shields.io/badge/circle%20ci-%23161616.svg?style=for-the-badge&logo=circleci&logoColor=white)
[![Quality Gate Status](https://sonarcloud.io/api/project_badges/measure?project=web2solutions_aaa-typescript-boilerplate&metric=alert_status)](https://sonarcloud.io/summary/new_code?id=web2solutions_aaa-typescript-boilerplate) [![Code Smells](https://sonarcloud.io/api/project_badges/measure?project=web2solutions_aaa-typescript-boilerplate&metric=code_smells)](https://sonarcloud.io/summary/new_code?id=web2solutions_aaa-typescript-boilerplate) [![Bugs](https://sonarcloud.io/api/project_badges/measure?project=web2solutions_aaa-typescript-boilerplate&metric=bugs)](https://sonarcloud.io/summary/new_code?id=web2solutions_aaa-typescript-boilerplate) [![Lines of Code](https://sonarcloud.io/api/project_badges/measure?project=web2solutions_aaa-typescript-boilerplate&metric=ncloc)](https://sonarcloud.io/summary/new_code?id=web2solutions_aaa-typescript-boilerplate) [![Reliability Rating](https://sonarcloud.io/api/project_badges/measure?project=web2solutions_aaa-typescript-boilerplate&metric=reliability_rating)](https://sonarcloud.io/summary/new_code?id=web2solutions_aaa-typescript-boilerplate) [![Security Rating](https://sonarcloud.io/api/project_badges/measure?project=web2solutions_aaa-typescript-boilerplate&metric=security_rating)](https://sonarcloud.io/summary/new_code?id=web2solutions_aaa-typescript-boilerplate) [![Technical Debt](https://sonarcloud.io/api/project_badges/measure?project=web2solutions_aaa-typescript-boilerplate&metric=sqale_index)](https://sonarcloud.io/summary/new_code?id=web2solutions_aaa-typescript-boilerplate) [![Maintainability Rating](https://sonarcloud.io/api/project_badges/measure?project=web2solutions_aaa-typescript-boilerplate&metric=sqale_rating)](https://sonarcloud.io/summary/new_code?id=web2solutions_aaa-typescript-boilerplate) [![Vulnerabilities](https://sonarcloud.io/api/project_badges/measure?project=web2solutions_aaa-typescript-boilerplate&metric=vulnerabilities)](https://sonarcloud.io/summary/new_code?id=web2solutions_aaa-typescript-boilerplate) ![GitHub Issues or Pull Requests](https://img.shields.io/github/issues/web2solutions/aaa-typescript-boilerplate)


![GitHub License](https://img.shields.io/github/license/web2solutions/aaa-typescript-boilerplate) [![Commitizen friendly](https://img.shields.io/badge/commitizen-friendly-brightgreen.svg)](http://commitizen.github.io/cz-cli/) ![GitHub Created At](https://img.shields.io/github/created-at/web2solutions/aaa-typescript-boilerplate) ![GitHub code size in bytes](https://img.shields.io/github/languages/code-size/web2solutions/aaa-typescript-boilerplate) ![GitHub package.json version](https://img.shields.io/github/package-json/v/web2solutions/aaa-typescript-boilerplate) ![Made in Brazil with Love](https://img.shields.io/badge/made%20in-%F0%9F%87%A7%F0%9F%87%B7%20Brazil%20with%E2%9D%A4%EF%B8%8F-blue)
Expand Down Expand Up @@ -150,7 +150,7 @@ It may implement database access through native drivers or ORMs and ODMs.

## Required stack

- Node.js (^20 preferred) and pnpm
- Node.js (^20 preferred) and npm
- Typescript
- Jest
- Redis - used to implement mutex (included as Docker image)
Expand All @@ -162,71 +162,71 @@ It may implement database access through native drivers or ORMs and ODMs.
1. Install the project

```bash
pnpm install
npm install
```

2. Run Redis (if you don't have already)

```bash
pnpm run docker:composeredis
npm run docker:composeredis
```

### Testing

`Run the entire test suite`

```bash
pnpm test
npm test
```

`Run unit tests`

```bash
pnpm run test:unit
npm run test:unit
```

`Run integration tests`

```bash
pnpm run test:integration
npm run test:integration
```

`Run integration tests - Express`

```bash
pnpm run test:integration:express
npm run test:integration:express
```

`Run integration tests - Fastify`

```bash
pnpm run test:integration:fastify
npm run test:integration:fastify
```

`Run integration tests - Restify`

```bash
pnpm run test:integration:restify
npm run test:integration:restify
```

`Run integration tests - aws lambda`

```bash
pnpm run test:integration:lambda
npm run test:integration:lambda
```

### Run the API - 3000 port

Run with Express

```bash
pnpm run dev:fastify
npm run dev:fastify
```

Run with Fastify

```bash
pnpm run dev:fastify
npm run dev:fastify
```

1. Reach the URL <http://localhost:3000/OASdoc/> and click in the `Version 1.0.0`. It will open the API documentation.
Expand All @@ -235,7 +235,7 @@ Run with Fastify
### Run `aws Lambda dev mode` through the `serverless framework`

```bash
pnpm run dev:serverless
npm run dev:serverless
```

![serverless dev mode](sls.png "serverless dev mode")
Expand All @@ -246,7 +246,7 @@ Run with Fastify
2. `Run the app in TDD mode - live reload of tests`

```bash
pnpm run tdd
npm run tdd
```

3. Make your changes.
Expand All @@ -258,7 +258,7 @@ Run with Fastify
It will run `lint` and `test` before asking info about the commit

```bash
pnpm run commit
npm run commit
```

5. Ask for PR
Expand All @@ -268,13 +268,13 @@ It will run `lint` and `test` before asking info about the commit
`lint code`

```bash
pnpm run lint
npm run lint
```

`lint && fix code`

```bash
pnpm run lint:fix
npm run lint:fix
```

## Dependencies
Expand Down
39 changes: 39 additions & 0 deletions ci-cd/bumpPackage.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
/* eslint-disable no-console */
/* eslint-disable jest/require-hook */
// eslint-disable-next-line import/no-extraneous-dependencies
import fs from 'fs';
import pkg, { version } from '../package.json';

function getMinor(v: string) {
const versionArray = v.split('.');
return Number(versionArray[versionArray.length - 1]);
}

function bumpPackageVersion(pk: any, newVersion: string) : Promise<void> {
return new Promise((resolve, reject) => {
const newPackage = { ...pk };
newPackage.version = newVersion;
console.log(`>>> new package version: ${newVersion}`);
fs.writeFile('./package.json', JSON.stringify(newPackage, null, 2), (err) => {
if (err) reject(err);
else {
resolve();
}
});
});
}

(async () => {
setImmediate(async () => {
console.log('========== Start Bump Package');
console.log(`>>> current package version: ${version}`);
const versionArray = version.split('.');
let newMinor = getMinor(version);
// eslint-disable-next-line no-plusplus
newMinor++;
versionArray[versionArray.length - 1] = newMinor as unknown as string;
const newVersion = versionArray.join('.');
await bumpPackageVersion(pkg, newVersion);
console.log('========== End Bump Package');
});
})();
77 changes: 77 additions & 0 deletions ci-cd/bumpTag.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
/* eslint-disable no-console */
/* eslint-disable jest/require-hook */
// eslint-disable-next-line import/no-extraneous-dependencies
import {
simpleGit, SimpleGit, TagResult
} from 'simple-git';
import { version } from '../package.json';

const _VERSION_PREFIX_ = 'v';

function getMinor(v: string) {
const versionArray = v.split('.');
return Number(versionArray[versionArray.length - 1]);
}

export class GitClient {
private client: SimpleGit;

constructor() {
this.client = simpleGit();
}

getTags(): Promise<TagResult> {
return new Promise((resolve, reject) => {
this.client.tags({}, (error, TagList) => {
if (error) {
return reject(error);
}
return resolve(TagList);
});
});
}

setTag(newVersion: string) {
return new Promise((resolve, reject) => {
this.client.addTag(newVersion, (error, data) => {
if (error) {
return reject(error);
}
console.log('>>> new tag created:', data);
return resolve(data);
});
});
}
}
(async () => {
console.log('========== Start Bump Tag');
const gitClient = new GitClient();
const tagList: TagResult = await gitClient.getTags();
const latestTag = tagList.latest;
console.log(`>>> Latest tag: ${latestTag}`);
let newVersion = '';
let newTag = '';
if (!latestTag) {
newVersion = '0.0.1';
newTag = `${_VERSION_PREFIX_}${newVersion}`;
await gitClient.setTag(newTag);
return;
}

const versionArray = version.split('.');
let newMinor = getMinor(version);

// eslint-disable-next-line no-plusplus
newMinor++;

versionArray[versionArray.length - 1] = newMinor as unknown as string;
newVersion = versionArray.join('.');
newTag = `${_VERSION_PREFIX_}${newVersion}`;

const lastestMinor = getMinor(latestTag);

if (lastestMinor < newMinor) {
await gitClient.setTag(newTag);
}
console.log('========== End Bump Tag');
})();
2 changes: 1 addition & 1 deletion check-node-version.js → ci-cd/check-node-version.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
const semver = require('semver');
const engines = require('./package').engines;
const engines = require('../package').engines;

const version = engines.node;
if (!semver.satisfies(process.version, version)) {
Expand Down
File renamed without changes.
2 changes: 1 addition & 1 deletion jest.config.js
Original file line number Diff line number Diff line change
Expand Up @@ -11,5 +11,5 @@ module.exports = {
'@test/(.*)$': '<rootDir>/test/$1',
},
modulePathIgnorePatterns: ['dist', '.build', '.serverless', '.resources'],
setupFiles: ["./loadEnvironment.js"],
setupFiles: ["./ci-cd/loadEnvironment.js"],
};
Loading