@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.
Files changed (38) hide show
  1. package/README.md +2 -1
  2. package/dist/modules/logger/CoastLogger.d.ts +8 -0
  3. package/dist/modules/logger/CoastLogger.js +6 -0
  4. package/dist/modules/logger/LoggerModule.d.ts +5 -0
  5. package/dist/modules/logger/LoggerModule.js +47 -0
  6. package/dist/modules/logger/PinoLogger.d.ts +11 -0
  7. package/dist/modules/logger/PinoLogger.js +72 -0
  8. package/dist/modules/logger/SilentLogger.d.ts +8 -0
  9. package/dist/modules/logger/SilentLogger.js +22 -0
  10. package/{lib/modules/trace/Trace.ts → dist/modules/trace/Trace.d.ts} +0 -1
  11. package/dist/modules/trace/Trace.js +2 -0
  12. package/{lib/modules/trace/TraceId.ts → dist/modules/trace/TraceId.d.ts} +1 -5
  13. package/dist/modules/trace/TraceId.js +6 -0
  14. package/dist/modules/trace/TraceInterceptor.d.ts +8 -0
  15. package/dist/modules/trace/TraceInterceptor.js +30 -0
  16. package/dist/modules/trace/TraceManager.d.ts +9 -0
  17. package/dist/modules/trace/TraceManager.js +43 -0
  18. package/dist/modules/trace/TraceModule.d.ts +2 -0
  19. package/dist/modules/trace/TraceModule.js +22 -0
  20. package/dist/modules/trace/Traceable.d.ts +4 -0
  21. package/dist/modules/trace/Traceable.js +2 -0
  22. package/package.json +18 -3
  23. package/.circleci/config.yml +0 -56
  24. package/.husky/pre-commit +0 -2
  25. package/.husky/prepare-commit-msg +0 -9
  26. package/.lintstagedrc +0 -3
  27. package/.nvmrc +0 -1
  28. package/eslint.config.cjs +0 -45
  29. package/jest.config.js +0 -8
  30. package/lib/modules/logger/CoastLogger.ts +0 -9
  31. package/lib/modules/logger/LoggerModule.ts +0 -37
  32. package/lib/modules/logger/PinoLogger.ts +0 -61
  33. package/lib/modules/logger/SilentLogger.ts +0 -19
  34. package/lib/modules/trace/TraceInterceptor.ts +0 -11
  35. package/lib/modules/trace/TraceManager.ts +0 -22
  36. package/lib/modules/trace/TraceModule.ts +0 -11
  37. package/lib/modules/trace/Traceable.ts +0 -3
  38. package/tsconfig.json +0 -31
package/README.md CHANGED
@@ -1 +1,2 @@
1
- # service-common
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,6 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CoastLogger = void 0;
4
+ class CoastLogger {
5
+ }
6
+ exports.CoastLogger = CoastLogger;
@@ -0,0 +1,5 @@
1
+ import { DynamicModule } from '@nestjs/common';
2
+ export declare class LoggerModule {
3
+ static forRootAsync(): DynamicModule;
4
+ static disabled(): DynamicModule;
5
+ }
@@ -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,8 @@
1
+ import { CoastLogger } from './CoastLogger';
2
+ export declare class SilentLogger extends CoastLogger {
3
+ log(): void;
4
+ error(): void;
5
+ warn(): void;
6
+ debug(): void;
7
+ verbose(): void;
8
+ }
@@ -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;
@@ -1,5 +1,4 @@
1
1
  import { TraceId } from './TraceId';
2
-
3
2
  export interface Trace {
4
3
  traceId: TraceId;
5
4
  subtraceId?: TraceId;
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -1,7 +1,3 @@
1
1
  import { Brand } from '@paradoxical-io/types';
2
-
3
2
  export type TraceId = Brand<string, 'TraceId'>;
4
-
5
- export function TraceId(id: string): TraceId {
6
- return id as TraceId;
7
- }
3
+ export declare function TraceId(id: string): TraceId;
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TraceId = TraceId;
4
+ function TraceId(id) {
5
+ return id;
6
+ }
@@ -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,2 @@
1
+ export declare class TraceModule {
2
+ }
@@ -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);
@@ -0,0 +1,4 @@
1
+ import { TraceId } from './TraceId';
2
+ export type Traceable<T> = T & {
3
+ traceId?: TraceId;
4
+ };
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
package/package.json CHANGED
@@ -1,12 +1,27 @@
1
1
  {
2
2
  "name": "@coast/service-common",
3
- "version": "1.0.1",
3
+ "version": "1.0.3",
4
4
  "description": "Common service package",
5
- "main": "dist",
6
- "types": "dist",
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",
@@ -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,2 +0,0 @@
1
- #!/bin/bash
2
- yarn lint-staged
@@ -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
@@ -1,3 +0,0 @@
1
- {
2
- "*.ts": "eslint --fix",
3
- }
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,8 +0,0 @@
1
- module.exports = {
2
- preset: 'ts-jest',
3
- testEnvironment: 'node',
4
- testPathIgnorePatterns: ['/node_modules/', '/dist/'],
5
- testMatch: ['**/test/**/*Test.ts'],
6
- setupFiles: ['dotenv/config'],
7
- bail: true,
8
- };
@@ -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 {}
@@ -1,3 +0,0 @@
1
- import { TraceId } from './TraceId';
2
-
3
- export type Traceable<T> = T & { traceId?: TraceId };
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
- }