@coast/service-common 1.0.1 → 1.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -1
- package/dist/modules/logger/CoastLogger.d.ts +8 -0
- package/dist/modules/logger/CoastLogger.js +6 -0
- package/dist/modules/logger/LoggerModule.d.ts +5 -0
- package/dist/modules/logger/LoggerModule.js +47 -0
- package/dist/modules/logger/PinoLogger.d.ts +11 -0
- package/dist/modules/logger/PinoLogger.js +72 -0
- package/dist/modules/logger/SilentLogger.d.ts +8 -0
- package/dist/modules/logger/SilentLogger.js +22 -0
- package/{lib/modules/trace/Trace.ts → dist/modules/trace/Trace.d.ts} +0 -1
- package/dist/modules/trace/Trace.js +2 -0
- package/{lib/modules/trace/TraceId.ts → dist/modules/trace/TraceId.d.ts} +1 -5
- package/dist/modules/trace/TraceId.js +6 -0
- package/dist/modules/trace/TraceInterceptor.d.ts +8 -0
- package/dist/modules/trace/TraceInterceptor.js +30 -0
- package/dist/modules/trace/TraceManager.d.ts +9 -0
- package/dist/modules/trace/TraceManager.js +43 -0
- package/dist/modules/trace/TraceModule.d.ts +2 -0
- package/dist/modules/trace/TraceModule.js +22 -0
- package/dist/modules/trace/Traceable.d.ts +4 -0
- package/dist/modules/trace/Traceable.js +2 -0
- package/package.json +18 -3
- package/.circleci/config.yml +0 -56
- package/.husky/pre-commit +0 -2
- package/.husky/prepare-commit-msg +0 -9
- package/.lintstagedrc +0 -3
- package/.nvmrc +0 -1
- package/eslint.config.cjs +0 -45
- package/jest.config.js +0 -8
- package/lib/modules/logger/CoastLogger.ts +0 -9
- package/lib/modules/logger/LoggerModule.ts +0 -37
- package/lib/modules/logger/PinoLogger.ts +0 -61
- package/lib/modules/logger/SilentLogger.ts +0 -19
- package/lib/modules/trace/TraceInterceptor.ts +0 -11
- package/lib/modules/trace/TraceManager.ts +0 -22
- package/lib/modules/trace/TraceModule.ts +0 -11
- package/lib/modules/trace/Traceable.ts +0 -3
- package/tsconfig.json +0 -31
package/README.md
CHANGED
|
@@ -1 +1,2 @@
|
|
|
1
|
-
#
|
|
1
|
+
# Coast Service-Common
|
|
2
|
+
This project contains common NestJS modules and code for Coast services
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { LoggerService } from '@nestjs/common';
|
|
2
|
+
export declare abstract class CoastLogger implements LoggerService {
|
|
3
|
+
abstract error(message: unknown, trace?: string): void;
|
|
4
|
+
abstract log(message: unknown): void;
|
|
5
|
+
abstract warn(message: unknown): void;
|
|
6
|
+
abstract debug(message: unknown): void;
|
|
7
|
+
abstract verbose(message: unknown): void;
|
|
8
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var LoggerModule_1;
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.LoggerModule = void 0;
|
|
11
|
+
const common_1 = require("@nestjs/common");
|
|
12
|
+
const config_1 = require("@nestjs/config");
|
|
13
|
+
const PinoLogger_1 = require("./PinoLogger");
|
|
14
|
+
const SilentLogger_1 = require("./SilentLogger");
|
|
15
|
+
const CoastLogger_1 = require("./CoastLogger");
|
|
16
|
+
let LoggerModule = LoggerModule_1 = class LoggerModule {
|
|
17
|
+
static forRootAsync() {
|
|
18
|
+
const coastLogger = {
|
|
19
|
+
inject: [config_1.ConfigService],
|
|
20
|
+
provide: CoastLogger_1.CoastLogger,
|
|
21
|
+
useFactory: (configService) => new PinoLogger_1.PinoLogger(configService),
|
|
22
|
+
};
|
|
23
|
+
return {
|
|
24
|
+
module: LoggerModule_1,
|
|
25
|
+
imports: [config_1.ConfigModule],
|
|
26
|
+
providers: [coastLogger],
|
|
27
|
+
exports: [coastLogger],
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
static disabled() {
|
|
31
|
+
const coastLogger = {
|
|
32
|
+
provide: CoastLogger_1.CoastLogger,
|
|
33
|
+
useValue: new SilentLogger_1.SilentLogger(),
|
|
34
|
+
};
|
|
35
|
+
return {
|
|
36
|
+
module: LoggerModule_1,
|
|
37
|
+
imports: [config_1.ConfigModule],
|
|
38
|
+
providers: [coastLogger],
|
|
39
|
+
exports: [coastLogger],
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
};
|
|
43
|
+
exports.LoggerModule = LoggerModule;
|
|
44
|
+
exports.LoggerModule = LoggerModule = LoggerModule_1 = __decorate([
|
|
45
|
+
(0, common_1.Module)({}),
|
|
46
|
+
(0, common_1.Global)()
|
|
47
|
+
], LoggerModule);
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { ConfigService } from '@nestjs/config';
|
|
2
|
+
import { CoastLogger } from './CoastLogger';
|
|
3
|
+
export declare class PinoLogger extends CoastLogger {
|
|
4
|
+
private readonly instance;
|
|
5
|
+
constructor(configService: ConfigService);
|
|
6
|
+
error(message: unknown, trace?: string): void;
|
|
7
|
+
log(message: unknown): void;
|
|
8
|
+
warn(message: unknown): void;
|
|
9
|
+
debug(message: unknown): void;
|
|
10
|
+
verbose(message: unknown): void;
|
|
11
|
+
}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
12
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
13
|
+
};
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.PinoLogger = void 0;
|
|
16
|
+
const common_1 = require("@nestjs/common");
|
|
17
|
+
const config_1 = require("@nestjs/config");
|
|
18
|
+
const pino_1 = __importDefault(require("pino"));
|
|
19
|
+
const CoastLogger_1 = require("./CoastLogger");
|
|
20
|
+
let PinoLogger = class PinoLogger extends CoastLogger_1.CoastLogger {
|
|
21
|
+
constructor(configService) {
|
|
22
|
+
super();
|
|
23
|
+
const level = configService.get('LOG_LEVEL');
|
|
24
|
+
const redact = [
|
|
25
|
+
'MYSQL_PASSWORD',
|
|
26
|
+
'STRIPE_SECRETKEY',
|
|
27
|
+
'JWT_SECRET',
|
|
28
|
+
'headers.authorization',
|
|
29
|
+
'user.passcode',
|
|
30
|
+
'user.lastName',
|
|
31
|
+
'user.phoneNumber',
|
|
32
|
+
'user.email',
|
|
33
|
+
];
|
|
34
|
+
const pino = configService.get('LOG_PRETTY')
|
|
35
|
+
? (0, pino_1.default)({
|
|
36
|
+
level,
|
|
37
|
+
redact,
|
|
38
|
+
transport: {
|
|
39
|
+
target: 'pino-pretty',
|
|
40
|
+
options: {
|
|
41
|
+
colorize: true,
|
|
42
|
+
translateTime: true,
|
|
43
|
+
},
|
|
44
|
+
},
|
|
45
|
+
})
|
|
46
|
+
: (0, pino_1.default)({
|
|
47
|
+
level,
|
|
48
|
+
redact,
|
|
49
|
+
});
|
|
50
|
+
this.instance = pino;
|
|
51
|
+
}
|
|
52
|
+
error(message, trace = '') {
|
|
53
|
+
this.instance.error(message, trace);
|
|
54
|
+
}
|
|
55
|
+
log(message) {
|
|
56
|
+
this.instance.info(message);
|
|
57
|
+
}
|
|
58
|
+
warn(message) {
|
|
59
|
+
this.instance.warn(message);
|
|
60
|
+
}
|
|
61
|
+
debug(message) {
|
|
62
|
+
this.instance.debug(message);
|
|
63
|
+
}
|
|
64
|
+
verbose(message) {
|
|
65
|
+
this.instance.trace(message);
|
|
66
|
+
}
|
|
67
|
+
};
|
|
68
|
+
exports.PinoLogger = PinoLogger;
|
|
69
|
+
exports.PinoLogger = PinoLogger = __decorate([
|
|
70
|
+
(0, common_1.Injectable)(),
|
|
71
|
+
__metadata("design:paramtypes", [config_1.ConfigService])
|
|
72
|
+
], PinoLogger);
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SilentLogger = void 0;
|
|
4
|
+
const CoastLogger_1 = require("./CoastLogger");
|
|
5
|
+
class SilentLogger extends CoastLogger_1.CoastLogger {
|
|
6
|
+
log() {
|
|
7
|
+
return;
|
|
8
|
+
}
|
|
9
|
+
error() {
|
|
10
|
+
return;
|
|
11
|
+
}
|
|
12
|
+
warn() {
|
|
13
|
+
return;
|
|
14
|
+
}
|
|
15
|
+
debug() {
|
|
16
|
+
return;
|
|
17
|
+
}
|
|
18
|
+
verbose() {
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
exports.SilentLogger = SilentLogger;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { CallHandler, ExecutionContext, NestInterceptor } from '@nestjs/common';
|
|
2
|
+
import { Observable } from 'rxjs';
|
|
3
|
+
import { TraceManager } from './TraceManager';
|
|
4
|
+
export declare class TraceInterceptor implements NestInterceptor {
|
|
5
|
+
private readonly traceManager;
|
|
6
|
+
constructor(traceManager: TraceManager);
|
|
7
|
+
intercept(_context: ExecutionContext, next: CallHandler): Observable<unknown> | Promise<Observable<unknown>>;
|
|
8
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
12
|
+
return function (target, key) { decorator(target, key, paramIndex); }
|
|
13
|
+
};
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.TraceInterceptor = void 0;
|
|
16
|
+
const common_1 = require("@nestjs/common");
|
|
17
|
+
const TraceManager_1 = require("./TraceManager");
|
|
18
|
+
let TraceInterceptor = class TraceInterceptor {
|
|
19
|
+
constructor(traceManager) {
|
|
20
|
+
this.traceManager = traceManager;
|
|
21
|
+
}
|
|
22
|
+
intercept(_context, next) {
|
|
23
|
+
return this.traceManager.withNewTrace(next.handle);
|
|
24
|
+
}
|
|
25
|
+
};
|
|
26
|
+
exports.TraceInterceptor = TraceInterceptor;
|
|
27
|
+
exports.TraceInterceptor = TraceInterceptor = __decorate([
|
|
28
|
+
__param(0, (0, common_1.Inject)()),
|
|
29
|
+
__metadata("design:paramtypes", [TraceManager_1.TraceManager])
|
|
30
|
+
], TraceInterceptor);
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { Trace } from './Trace';
|
|
2
|
+
import { AsyncLocalStorage } from 'node:async_hooks';
|
|
3
|
+
import { TraceId } from './TraceId';
|
|
4
|
+
export declare class TraceManager {
|
|
5
|
+
private readonly asyncLocalStorage;
|
|
6
|
+
constructor(asyncLocalStorage: AsyncLocalStorage<Trace>);
|
|
7
|
+
getTrace(): Trace | undefined;
|
|
8
|
+
withNewTrace<T>(fn: () => T, traceId?: TraceId): T;
|
|
9
|
+
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
12
|
+
return function (target, key) { decorator(target, key, paramIndex); }
|
|
13
|
+
};
|
|
14
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
15
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
16
|
+
};
|
|
17
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
18
|
+
exports.TraceManager = void 0;
|
|
19
|
+
const uuid_1 = __importDefault(require("uuid"));
|
|
20
|
+
const common_1 = require("@nestjs/common");
|
|
21
|
+
const node_async_hooks_1 = require("node:async_hooks");
|
|
22
|
+
const TraceId_1 = require("./TraceId");
|
|
23
|
+
let TraceManager = class TraceManager {
|
|
24
|
+
constructor(asyncLocalStorage) {
|
|
25
|
+
this.asyncLocalStorage = asyncLocalStorage;
|
|
26
|
+
}
|
|
27
|
+
getTrace() {
|
|
28
|
+
return this.asyncLocalStorage.getStore();
|
|
29
|
+
}
|
|
30
|
+
withNewTrace(fn, traceId) {
|
|
31
|
+
const trace = {
|
|
32
|
+
traceId: traceId ?? (0, TraceId_1.TraceId)(uuid_1.default.v4()),
|
|
33
|
+
subtraceId: (0, TraceId_1.TraceId)(uuid_1.default.v4()),
|
|
34
|
+
};
|
|
35
|
+
return this.asyncLocalStorage.run(trace, fn);
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
exports.TraceManager = TraceManager;
|
|
39
|
+
exports.TraceManager = TraceManager = __decorate([
|
|
40
|
+
(0, common_1.Injectable)(),
|
|
41
|
+
__param(0, (0, common_1.Inject)()),
|
|
42
|
+
__metadata("design:paramtypes", [node_async_hooks_1.AsyncLocalStorage])
|
|
43
|
+
], TraceManager);
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.TraceModule = void 0;
|
|
10
|
+
const common_1 = require("@nestjs/common");
|
|
11
|
+
const TraceManager_1 = require("./TraceManager");
|
|
12
|
+
const TraceInterceptor_1 = require("./TraceInterceptor");
|
|
13
|
+
const node_async_hooks_1 = require("node:async_hooks");
|
|
14
|
+
let TraceModule = class TraceModule {
|
|
15
|
+
};
|
|
16
|
+
exports.TraceModule = TraceModule;
|
|
17
|
+
exports.TraceModule = TraceModule = __decorate([
|
|
18
|
+
(0, common_1.Module)({
|
|
19
|
+
providers: [(node_async_hooks_1.AsyncLocalStorage), TraceManager_1.TraceManager, TraceInterceptor_1.TraceInterceptor],
|
|
20
|
+
exports: [TraceManager_1.TraceManager, TraceInterceptor_1.TraceInterceptor],
|
|
21
|
+
})
|
|
22
|
+
], TraceModule);
|
package/package.json
CHANGED
|
@@ -1,12 +1,27 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@coast/service-common",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.3",
|
|
4
4
|
"description": "Common service package",
|
|
5
|
-
"main": "
|
|
6
|
-
"types": "
|
|
5
|
+
"main": "./modules",
|
|
6
|
+
"types": "./modules",
|
|
7
7
|
"engines": {
|
|
8
8
|
"node": ">=20.0.0"
|
|
9
9
|
},
|
|
10
|
+
"exports": {
|
|
11
|
+
"./*": "./dist/modules/*"
|
|
12
|
+
},
|
|
13
|
+
"typesVersions": {
|
|
14
|
+
"*": {
|
|
15
|
+
"*": [
|
|
16
|
+
"./dist/modules/*"
|
|
17
|
+
]
|
|
18
|
+
}
|
|
19
|
+
},
|
|
20
|
+
"files": [
|
|
21
|
+
"dist",
|
|
22
|
+
"README.md",
|
|
23
|
+
"LICENSE"
|
|
24
|
+
],
|
|
10
25
|
"scripts": {
|
|
11
26
|
"prebuild": "rimraf dist",
|
|
12
27
|
"build": "yarn prebuild && yarn dlx @nestjs/cli build",
|
package/.circleci/config.yml
DELETED
|
@@ -1,56 +0,0 @@
|
|
|
1
|
-
version: 2.1
|
|
2
|
-
jobs:
|
|
3
|
-
build:
|
|
4
|
-
docker:
|
|
5
|
-
- image: cimg/node:20.12.0
|
|
6
|
-
steps:
|
|
7
|
-
- checkout
|
|
8
|
-
- run: sudo corepack enable
|
|
9
|
-
- run: yarn install --immutable
|
|
10
|
-
- run: yarn lint
|
|
11
|
-
- run: yarn build
|
|
12
|
-
publish:
|
|
13
|
-
docker:
|
|
14
|
-
- image: 'cimg/node:20.12.0'
|
|
15
|
-
steps:
|
|
16
|
-
- checkout
|
|
17
|
-
- setup-git
|
|
18
|
-
- run: sudo corepack enable
|
|
19
|
-
- run: yarn install --immutable
|
|
20
|
-
- run: yarn build
|
|
21
|
-
- configure-yarn-publish
|
|
22
|
-
- run: yarn version patch
|
|
23
|
-
- run: git add package.json
|
|
24
|
-
- run: git commit -m "Bump version[skip ci]"
|
|
25
|
-
- run: git push
|
|
26
|
-
- run: yarn npm publish --access public
|
|
27
|
-
workflows:
|
|
28
|
-
build_and_publish:
|
|
29
|
-
jobs:
|
|
30
|
-
- build:
|
|
31
|
-
context: coast
|
|
32
|
-
- publish:
|
|
33
|
-
context: coast
|
|
34
|
-
requires:
|
|
35
|
-
- build
|
|
36
|
-
filters:
|
|
37
|
-
branches:
|
|
38
|
-
only: master
|
|
39
|
-
commands:
|
|
40
|
-
configure-yarn-publish:
|
|
41
|
-
steps:
|
|
42
|
-
- run: |
|
|
43
|
-
yarn config set npmAuthToken $NPM_TOKEN
|
|
44
|
-
yarn config set npmRegistryServer https://registry.npmjs.org/
|
|
45
|
-
setup-git:
|
|
46
|
-
steps:
|
|
47
|
-
- add_ssh_keys:
|
|
48
|
-
fingerprints:
|
|
49
|
-
- 'SHA256:J9pGnIRru8syuYQ6WPwHMkMYkggR+Z4j4uUKFr++iuI'
|
|
50
|
-
- run:
|
|
51
|
-
name: add github.com to known hosts
|
|
52
|
-
command: ssh-keyscan github.com >> ~/.ssh/known_hosts
|
|
53
|
-
- run: |
|
|
54
|
-
git config --global user.email "circleci@coastapp.com"
|
|
55
|
-
git config --global user.name "CircleCI"
|
|
56
|
-
git config --global push.default current
|
package/.husky/pre-commit
DELETED
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
#!/bin/bash
|
|
2
|
-
FILE=$1
|
|
3
|
-
MESSAGE=$(cat $FILE)
|
|
4
|
-
TICKET="[$(git rev-parse --abbrev-ref HEAD | grep -Eo 'sc-[0-9]+')]" || true
|
|
5
|
-
if [[ $TICKET == "[]" || "$MESSAGE" == "$TICKET"* ]];then
|
|
6
|
-
exit 0;
|
|
7
|
-
fi
|
|
8
|
-
TICKET=$(echo ${TICKET} | tr [:lower:] [:upper:])
|
|
9
|
-
echo "$TICKET $MESSAGE" > $FILE
|
package/.lintstagedrc
DELETED
package/.nvmrc
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
20.12.2
|
package/eslint.config.cjs
DELETED
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
const typescriptEslintPlugin = require('@typescript-eslint/eslint-plugin');
|
|
2
|
-
const typescriptEslintParser = require('@typescript-eslint/parser');
|
|
3
|
-
const eslintConfigPrettier = require('eslint-config-prettier');
|
|
4
|
-
const eslintPluginPrettier = require('eslint-plugin-prettier');
|
|
5
|
-
const { configs } = typescriptEslintPlugin;
|
|
6
|
-
module.exports = [
|
|
7
|
-
{
|
|
8
|
-
files: ['{lib,test}/**/*.ts', '{lib,test}/**/*.tsx'],
|
|
9
|
-
languageOptions: {
|
|
10
|
-
parser: typescriptEslintParser,
|
|
11
|
-
parserOptions: {
|
|
12
|
-
project: './tsconfig.json',
|
|
13
|
-
sourceType: 'module',
|
|
14
|
-
},
|
|
15
|
-
},
|
|
16
|
-
plugins: {
|
|
17
|
-
'@typescript-eslint': typescriptEslintPlugin,
|
|
18
|
-
prettier: eslintPluginPrettier,
|
|
19
|
-
},
|
|
20
|
-
rules: {
|
|
21
|
-
...configs.recommended.rules, // Recommended rules
|
|
22
|
-
...configs.strict.rules, // Strict rules
|
|
23
|
-
...eslintConfigPrettier.rules, // Disable Prettier conflicts
|
|
24
|
-
// Custom overrides
|
|
25
|
-
'@typescript-eslint/no-explicit-any': 'error',
|
|
26
|
-
'no-console': 'warn',
|
|
27
|
-
'@typescript-eslint/no-extraneous-class': ['error', {'allowWithDecorator': true}],
|
|
28
|
-
'prettier/prettier': [
|
|
29
|
-
'error',
|
|
30
|
-
{
|
|
31
|
-
printWidth: 130,
|
|
32
|
-
tabWidth: 4,
|
|
33
|
-
singleQuote: true,
|
|
34
|
-
trailingComma: 'es5',
|
|
35
|
-
arrowParens: 'always',
|
|
36
|
-
jsxBracketSameLine: true,
|
|
37
|
-
},
|
|
38
|
-
],
|
|
39
|
-
},
|
|
40
|
-
ignores: [
|
|
41
|
-
'node_modules/',
|
|
42
|
-
'dist/',
|
|
43
|
-
],
|
|
44
|
-
},
|
|
45
|
-
];
|
package/jest.config.js
DELETED
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
import { LoggerService } from '@nestjs/common';
|
|
2
|
-
|
|
3
|
-
export abstract class CoastLogger implements LoggerService {
|
|
4
|
-
public abstract error(message: unknown, trace?: string): void;
|
|
5
|
-
public abstract log(message: unknown): void;
|
|
6
|
-
public abstract warn(message: unknown): void;
|
|
7
|
-
public abstract debug(message: unknown): void;
|
|
8
|
-
public abstract verbose(message: unknown): void;
|
|
9
|
-
}
|
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
import { DynamicModule, Global, Module } from '@nestjs/common';
|
|
2
|
-
import { FactoryProvider, ValueProvider } from '@nestjs/common/interfaces';
|
|
3
|
-
import { ConfigModule, ConfigService } from '@nestjs/config';
|
|
4
|
-
import { PinoLogger } from './PinoLogger';
|
|
5
|
-
import { SilentLogger } from './SilentLogger';
|
|
6
|
-
import { CoastLogger } from './CoastLogger';
|
|
7
|
-
|
|
8
|
-
@Module({})
|
|
9
|
-
@Global()
|
|
10
|
-
export class LoggerModule {
|
|
11
|
-
public static forRootAsync(): DynamicModule {
|
|
12
|
-
const coastLogger: FactoryProvider = {
|
|
13
|
-
inject: [ConfigService],
|
|
14
|
-
provide: CoastLogger,
|
|
15
|
-
useFactory: (configService: ConfigService): PinoLogger => new PinoLogger(configService),
|
|
16
|
-
};
|
|
17
|
-
return {
|
|
18
|
-
module: LoggerModule,
|
|
19
|
-
imports: [ConfigModule],
|
|
20
|
-
providers: [coastLogger],
|
|
21
|
-
exports: [coastLogger],
|
|
22
|
-
};
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
public static disabled(): DynamicModule {
|
|
26
|
-
const coastLogger: ValueProvider = {
|
|
27
|
-
provide: CoastLogger,
|
|
28
|
-
useValue: new SilentLogger(),
|
|
29
|
-
};
|
|
30
|
-
return {
|
|
31
|
-
module: LoggerModule,
|
|
32
|
-
imports: [ConfigModule],
|
|
33
|
-
providers: [coastLogger],
|
|
34
|
-
exports: [coastLogger],
|
|
35
|
-
};
|
|
36
|
-
}
|
|
37
|
-
}
|
|
@@ -1,61 +0,0 @@
|
|
|
1
|
-
import { Injectable } from '@nestjs/common';
|
|
2
|
-
import { ConfigService } from '@nestjs/config';
|
|
3
|
-
import Pino from 'pino';
|
|
4
|
-
import { CoastLogger } from './CoastLogger';
|
|
5
|
-
|
|
6
|
-
@Injectable()
|
|
7
|
-
export class PinoLogger extends CoastLogger {
|
|
8
|
-
private readonly instance: Pino.Logger;
|
|
9
|
-
|
|
10
|
-
public constructor(configService: ConfigService) {
|
|
11
|
-
super();
|
|
12
|
-
const level = configService.get('LOG_LEVEL');
|
|
13
|
-
const redact = [
|
|
14
|
-
'MYSQL_PASSWORD',
|
|
15
|
-
'STRIPE_SECRETKEY',
|
|
16
|
-
'JWT_SECRET',
|
|
17
|
-
'headers.authorization',
|
|
18
|
-
'user.passcode',
|
|
19
|
-
'user.lastName',
|
|
20
|
-
'user.phoneNumber',
|
|
21
|
-
'user.email',
|
|
22
|
-
];
|
|
23
|
-
const pino = configService.get('LOG_PRETTY')
|
|
24
|
-
? Pino({
|
|
25
|
-
level,
|
|
26
|
-
redact,
|
|
27
|
-
transport: {
|
|
28
|
-
target: 'pino-pretty',
|
|
29
|
-
options: {
|
|
30
|
-
colorize: true,
|
|
31
|
-
translateTime: true,
|
|
32
|
-
},
|
|
33
|
-
},
|
|
34
|
-
})
|
|
35
|
-
: Pino({
|
|
36
|
-
level,
|
|
37
|
-
redact,
|
|
38
|
-
});
|
|
39
|
-
this.instance = pino;
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
public error(message: unknown, trace: string = ''): void {
|
|
43
|
-
this.instance.error(message, trace);
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
public log(message: unknown): void {
|
|
47
|
-
this.instance.info(message);
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
public warn(message: unknown): void {
|
|
51
|
-
this.instance.warn(message);
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
public debug(message: unknown): void {
|
|
55
|
-
this.instance.debug(message);
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
public verbose(message: unknown): void {
|
|
59
|
-
this.instance.trace(message);
|
|
60
|
-
}
|
|
61
|
-
}
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
import { CoastLogger } from './CoastLogger';
|
|
2
|
-
|
|
3
|
-
export class SilentLogger extends CoastLogger {
|
|
4
|
-
public log(): void {
|
|
5
|
-
return;
|
|
6
|
-
}
|
|
7
|
-
public error(): void {
|
|
8
|
-
return;
|
|
9
|
-
}
|
|
10
|
-
public warn(): void {
|
|
11
|
-
return;
|
|
12
|
-
}
|
|
13
|
-
public debug(): void {
|
|
14
|
-
return;
|
|
15
|
-
}
|
|
16
|
-
public verbose(): void {
|
|
17
|
-
return;
|
|
18
|
-
}
|
|
19
|
-
}
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
import { CallHandler, ExecutionContext, Inject, NestInterceptor } from '@nestjs/common';
|
|
2
|
-
import { Observable } from 'rxjs';
|
|
3
|
-
import { TraceManager } from './TraceManager';
|
|
4
|
-
|
|
5
|
-
export class TraceInterceptor implements NestInterceptor {
|
|
6
|
-
constructor(@Inject() private readonly traceManager: TraceManager) {}
|
|
7
|
-
|
|
8
|
-
public intercept(_context: ExecutionContext, next: CallHandler): Observable<unknown> | Promise<Observable<unknown>> {
|
|
9
|
-
return this.traceManager.withNewTrace(next.handle);
|
|
10
|
-
}
|
|
11
|
-
}
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
import { Trace } from './Trace';
|
|
2
|
-
import uuid from 'uuid';
|
|
3
|
-
import { Inject, Injectable } from '@nestjs/common';
|
|
4
|
-
import { AsyncLocalStorage } from 'node:async_hooks';
|
|
5
|
-
import { TraceId } from './TraceId';
|
|
6
|
-
|
|
7
|
-
@Injectable()
|
|
8
|
-
export class TraceManager {
|
|
9
|
-
constructor(@Inject() private readonly asyncLocalStorage: AsyncLocalStorage<Trace>) {}
|
|
10
|
-
|
|
11
|
-
public getTrace(): Trace | undefined {
|
|
12
|
-
return this.asyncLocalStorage.getStore();
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
public withNewTrace<T>(fn: () => T, traceId?: TraceId): T {
|
|
16
|
-
const trace: Trace = {
|
|
17
|
-
traceId: traceId ?? TraceId(uuid.v4()),
|
|
18
|
-
subtraceId: TraceId(uuid.v4()),
|
|
19
|
-
};
|
|
20
|
-
return this.asyncLocalStorage.run(trace, fn);
|
|
21
|
-
}
|
|
22
|
-
}
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
import { Module } from '@nestjs/common';
|
|
2
|
-
import { TraceManager } from './TraceManager';
|
|
3
|
-
import { TraceInterceptor } from './TraceInterceptor';
|
|
4
|
-
import { AsyncLocalStorage } from 'node:async_hooks';
|
|
5
|
-
import { Trace } from './Trace';
|
|
6
|
-
|
|
7
|
-
@Module({
|
|
8
|
-
providers: [AsyncLocalStorage<Trace>, TraceManager, TraceInterceptor],
|
|
9
|
-
exports: [TraceManager, TraceInterceptor],
|
|
10
|
-
})
|
|
11
|
-
export class TraceModule {}
|
package/tsconfig.json
DELETED
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"compilerOptions": {
|
|
3
|
-
"outDir": "./dist",
|
|
4
|
-
"baseUrl": "./",
|
|
5
|
-
"alwaysStrict": true,
|
|
6
|
-
"strict": true,
|
|
7
|
-
"allowSyntheticDefaultImports": true,
|
|
8
|
-
"forceConsistentCasingInFileNames": true,
|
|
9
|
-
"emitDecoratorMetadata": true,
|
|
10
|
-
"esModuleInterop": true,
|
|
11
|
-
"experimentalDecorators": true,
|
|
12
|
-
"declaration": true,
|
|
13
|
-
"module": "commonjs",
|
|
14
|
-
"moduleResolution": "node",
|
|
15
|
-
"noFallthroughCasesInSwitch": false,
|
|
16
|
-
"noImplicitAny": true,
|
|
17
|
-
"noImplicitReturns": false,
|
|
18
|
-
"noImplicitThis": true,
|
|
19
|
-
"noUnusedLocals": true,
|
|
20
|
-
"noUnusedParameters": true,
|
|
21
|
-
"removeComments": true,
|
|
22
|
-
"resolveJsonModule": true,
|
|
23
|
-
"rootDir": "./lib",
|
|
24
|
-
"strictNullChecks": true,
|
|
25
|
-
"skipLibCheck": true,
|
|
26
|
-
"target": "es2021"
|
|
27
|
-
},
|
|
28
|
-
"compileOnSave": true,
|
|
29
|
-
"include": ["lib/**/*.ts", "test/**/*.ts"],
|
|
30
|
-
"exclude": ["node_modules", "dist"]
|
|
31
|
-
}
|