@cenk1cenk2/oclif-common 6.3.29 → 6.4.0
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/dist/commands/base.command.d.ts +43 -0
- package/dist/commands/base.command.js +156 -0
- package/dist/commands/index.js +1 -0
- package/dist/constants/file.constants.d.ts +6 -0
- package/dist/constants/file.constants.js +8 -0
- package/dist/constants/help-groups.constants.d.ts +6 -0
- package/dist/constants/help-groups.constants.js +8 -0
- package/dist/hooks/index.js +2 -0
- package/dist/hooks/not-found.hook.d.ts +6 -0
- package/dist/hooks/not-found.hook.js +18 -0
- package/dist/hooks/update-notifier.hook.d.ts +6 -0
- package/dist/hooks/update-notifier.hook.js +11 -0
- package/dist/index.d.ts +51 -413
- package/dist/index.js +44 -1881
- package/dist/interfaces/class.interface.d.ts +4 -0
- package/dist/interfaces/hooks.interface.d.ts +16 -0
- package/dist/interfaces/index.js +1 -0
- package/dist/interfaces/oclif.interface.d.ts +9 -0
- package/dist/interfaces/oclif.interface.js +3 -0
- package/dist/interfaces/type-helper.interface.d.ts +7 -0
- package/dist/lib/cli.interface.d.ts +8 -0
- package/dist/lib/cli.module.d.ts +11 -0
- package/dist/lib/cli.module.js +57 -0
- package/dist/lib/config/config.constants.js +12 -0
- package/dist/lib/config/config.interface.d.ts +21 -0
- package/dist/lib/config/config.module.d.ts +4 -0
- package/dist/lib/config/config.module.js +15 -0
- package/dist/lib/config/config.service.d.ts +32 -0
- package/dist/lib/config/config.service.js +152 -0
- package/dist/lib/config/index.js +2 -0
- package/dist/lib/fs/filesystem.interface.d.ts +2 -0
- package/dist/lib/fs/filesystem.module.d.ts +4 -0
- package/dist/lib/fs/filesystem.module.js +13 -0
- package/dist/lib/fs/filesystem.service.d.ts +31 -0
- package/dist/lib/fs/filesystem.service.js +141 -0
- package/dist/lib/fs/index.js +2 -0
- package/dist/lib/index.js +32 -0
- package/dist/lib/locker/index.js +2 -0
- package/dist/lib/locker/locker.interface.d.ts +28 -0
- package/dist/lib/locker/locker.module.d.ts +9 -0
- package/dist/lib/locker/locker.module.js +33 -0
- package/dist/lib/locker/locker.service.d.ts +41 -0
- package/dist/lib/locker/locker.service.js +170 -0
- package/dist/lib/logger/index.js +6 -0
- package/dist/lib/logger/logger.constants.d.ts +21 -0
- package/dist/lib/logger/logger.constants.js +24 -0
- package/dist/lib/logger/logger.interface.d.ts +13 -0
- package/dist/lib/logger/logger.module.d.ts +4 -0
- package/dist/lib/logger/logger.module.js +17 -0
- package/dist/lib/logger/logger.service.d.ts +31 -0
- package/dist/lib/logger/logger.service.js +70 -0
- package/dist/lib/logger/pipe/pipe-process-to-listr.d.ts +7 -0
- package/dist/lib/logger/pipe/pipe-process-to-listr.js +9 -0
- package/dist/lib/logger/pipe/pipe-process-to-logger.d.ts +12 -0
- package/dist/lib/logger/pipe/pipe-process-to-logger.interface.d.ts +19 -0
- package/dist/lib/logger/pipe/pipe-process-to-logger.js +54 -0
- package/dist/lib/logger/winston.service.d.ts +15 -0
- package/dist/lib/logger/winston.service.js +91 -0
- package/dist/lib/logo/index.js +3 -0
- package/dist/lib/logo/logo.constants.d.ts +6 -0
- package/dist/lib/logo/logo.constants.js +5 -0
- package/dist/lib/logo/logo.interface.d.ts +6 -0
- package/dist/lib/logo/logo.module.d.ts +4 -0
- package/dist/lib/logo/logo.module.js +13 -0
- package/dist/lib/logo/logo.service.d.ts +17 -0
- package/dist/lib/logo/logo.service.js +42 -0
- package/dist/lib/parser/fts/env-parser.service.d.ts +16 -0
- package/dist/lib/parser/fts/env-parser.service.js +42 -0
- package/dist/lib/parser/fts/index.js +3 -0
- package/dist/lib/parser/fts/json-parser.service.d.ts +15 -0
- package/dist/lib/parser/fts/json-parser.service.js +32 -0
- package/dist/lib/parser/fts/yaml-parser.service.d.ts +15 -0
- package/dist/lib/parser/fts/yaml-parser.service.js +33 -0
- package/dist/lib/parser/index.js +6 -0
- package/dist/lib/parser/parser.interface.d.ts +8 -0
- package/dist/lib/parser/parser.module.d.ts +4 -0
- package/dist/lib/parser/parser.module.js +16 -0
- package/dist/lib/parser/parser.service.d.ts +29 -0
- package/dist/lib/parser/parser.service.js +76 -0
- package/dist/lib/setup.d.ts +4 -0
- package/dist/lib/setup.js +16 -0
- package/dist/lib/validator/index.js +3 -0
- package/dist/lib/validator/validator.constants.d.ts +6 -0
- package/dist/lib/validator/validator.constants.js +5 -0
- package/dist/lib/validator/validator.interface.d.ts +10 -0
- package/dist/lib/validator/validator.module.d.ts +4 -0
- package/dist/lib/validator/validator.module.js +13 -0
- package/dist/lib/validator/validator.service.d.ts +19 -0
- package/dist/lib/validator/validator.service.js +76 -0
- package/dist/utils/defaults.d.ts +12 -0
- package/dist/utils/defaults.js +16 -0
- package/dist/utils/environment.d.ts +8 -0
- package/dist/utils/environment.js +16 -0
- package/dist/utils/guards.d.ts +9 -0
- package/dist/utils/guards.js +13 -0
- package/dist/utils/index.d.ts +7 -0
- package/dist/utils/index.js +8 -0
- package/dist/utils/merge.constants.d.ts +7 -0
- package/dist/utils/merge.constants.js +9 -0
- package/dist/utils/merge.d.ts +9 -0
- package/dist/utils/merge.js +15 -0
- package/package.json +31 -27
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { LoggerService } from "../logger/logger.service.js";
|
|
2
|
+
import "../logger/index.js";
|
|
3
|
+
import { FileSystemService } from "../fs/filesystem.service.js";
|
|
4
|
+
import "../fs/index.js";
|
|
5
|
+
import { ParserService } from "../parser/parser.service.js";
|
|
6
|
+
import "../parser/index.js";
|
|
7
|
+
import { LockerService } from "./locker.service.js";
|
|
8
|
+
import { Module } from "@nestjs/common";
|
|
9
|
+
import _decorate from "@oxc-project/runtime/helpers/decorate";
|
|
10
|
+
|
|
11
|
+
//#region src/lib/locker/locker.module.ts
|
|
12
|
+
var _LockerModule;
|
|
13
|
+
let LockerModule = _LockerModule = class LockerModule$1 {
|
|
14
|
+
static forFeature(options) {
|
|
15
|
+
const token = options.token ?? LockerService;
|
|
16
|
+
return {
|
|
17
|
+
module: _LockerModule,
|
|
18
|
+
providers: [{
|
|
19
|
+
provide: token,
|
|
20
|
+
useFactory: (logger, fs, parser) => new LockerService(logger, fs, parser, options),
|
|
21
|
+
inject: [
|
|
22
|
+
LoggerService,
|
|
23
|
+
FileSystemService,
|
|
24
|
+
ParserService
|
|
25
|
+
]
|
|
26
|
+
}]
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
};
|
|
30
|
+
LockerModule = _LockerModule = _decorate([Module({})], LockerModule);
|
|
31
|
+
|
|
32
|
+
//#endregion
|
|
33
|
+
export { LockerModule };
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { LoggerService } from "../logger/logger.service.js";
|
|
2
|
+
import { FileSystemService } from "../fs/filesystem.service.js";
|
|
3
|
+
import { ParserService } from "../parser/parser.service.js";
|
|
4
|
+
import { LockData, LockableData, LockerServiceOptions, UnlockData } from "./locker.interface.js";
|
|
5
|
+
import { OnModuleInit } from "@nestjs/common";
|
|
6
|
+
import op from "object-path-immutable";
|
|
7
|
+
|
|
8
|
+
//#region src/lib/locker/locker.service.d.ts
|
|
9
|
+
declare class LockerService<LockFile extends LockableData = LockableData> implements OnModuleInit {
|
|
10
|
+
private readonly logger;
|
|
11
|
+
private readonly fs;
|
|
12
|
+
private readonly parser;
|
|
13
|
+
private readonly options;
|
|
14
|
+
readonly op: typeof op;
|
|
15
|
+
private toLock;
|
|
16
|
+
private toUnlock;
|
|
17
|
+
constructor(logger: LoggerService, fs: FileSystemService, parser: ParserService, options: LockerServiceOptions);
|
|
18
|
+
onModuleInit(): Promise<void>;
|
|
19
|
+
hasLock(): boolean;
|
|
20
|
+
hasUnlock(): boolean;
|
|
21
|
+
addLock<T extends LockableData = LockFile>(...data: LockData<T>[]): void;
|
|
22
|
+
addUnlock(...data: UnlockData[]): void;
|
|
23
|
+
applyLockAll(lock: LockFile): Promise<LockFile>;
|
|
24
|
+
lockAll(): Promise<void>;
|
|
25
|
+
applyUnlockAll(lock: LockFile): Promise<LockFile>;
|
|
26
|
+
unlockAll(): Promise<void>;
|
|
27
|
+
all(): Promise<void>;
|
|
28
|
+
applyAll(lock: LockFile): Promise<LockFile>;
|
|
29
|
+
applyLock<T extends LockableData = LockFile>(lock: LockFile, ...data: LockData<T>[]): Promise<LockFile>;
|
|
30
|
+
lock<T extends LockableData = LockFile>(...data: LockData<T>[]): Promise<LockFile>;
|
|
31
|
+
applyUnlock(lock: LockFile, ...data: UnlockData[]): Promise<LockFile>;
|
|
32
|
+
unlock(...data: UnlockData[]): Promise<LockFile | undefined>;
|
|
33
|
+
read(): Promise<LockFile>;
|
|
34
|
+
tryRead(): Promise<LockFile | undefined>;
|
|
35
|
+
tryRemove(): Promise<void>;
|
|
36
|
+
write(data: LockFile): Promise<void>;
|
|
37
|
+
private buildPath;
|
|
38
|
+
private normalizePath;
|
|
39
|
+
}
|
|
40
|
+
//#endregion
|
|
41
|
+
export { LockerService };
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
import { LoggerService } from "../logger/logger.service.js";
|
|
2
|
+
import "../logger/index.js";
|
|
3
|
+
import { FileSystemService } from "../fs/filesystem.service.js";
|
|
4
|
+
import "../fs/index.js";
|
|
5
|
+
import { ParserService } from "../parser/parser.service.js";
|
|
6
|
+
import { merge } from "../../utils/merge.js";
|
|
7
|
+
import "../../utils/index.js";
|
|
8
|
+
import "../parser/index.js";
|
|
9
|
+
import { Injectable } from "@nestjs/common";
|
|
10
|
+
import op from "object-path-immutable";
|
|
11
|
+
import _decorateMetadata from "@oxc-project/runtime/helpers/decorateMetadata";
|
|
12
|
+
import _decorate from "@oxc-project/runtime/helpers/decorate";
|
|
13
|
+
|
|
14
|
+
//#region src/lib/locker/locker.service.ts
|
|
15
|
+
var _ref, _ref2, _ref3;
|
|
16
|
+
let LockerService = class LockerService$1 {
|
|
17
|
+
constructor(logger, fs, parser, options) {
|
|
18
|
+
this.logger = logger;
|
|
19
|
+
this.fs = fs;
|
|
20
|
+
this.parser = parser;
|
|
21
|
+
this.options = options;
|
|
22
|
+
this.op = op;
|
|
23
|
+
this.toLock = [];
|
|
24
|
+
this.toUnlock = [];
|
|
25
|
+
}
|
|
26
|
+
async onModuleInit() {
|
|
27
|
+
this.logger.setup(this.constructor.name);
|
|
28
|
+
}
|
|
29
|
+
hasLock() {
|
|
30
|
+
return this.toLock.length > 0;
|
|
31
|
+
}
|
|
32
|
+
hasUnlock() {
|
|
33
|
+
return this.toUnlock.length > 0;
|
|
34
|
+
}
|
|
35
|
+
addLock(...data) {
|
|
36
|
+
this.toLock.push(...data);
|
|
37
|
+
}
|
|
38
|
+
addUnlock(...data) {
|
|
39
|
+
this.toUnlock.push(...data);
|
|
40
|
+
}
|
|
41
|
+
async applyLockAll(lock) {
|
|
42
|
+
if (this.hasLock()) return this.applyLock(lock, ...this.toLock);
|
|
43
|
+
return lock;
|
|
44
|
+
}
|
|
45
|
+
async lockAll() {
|
|
46
|
+
if (this.hasLock()) {
|
|
47
|
+
await this.lock(...this.toLock);
|
|
48
|
+
this.toLock = [];
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
async applyUnlockAll(lock) {
|
|
52
|
+
if (this.hasUnlock()) return this.applyUnlock(lock, ...this.toUnlock);
|
|
53
|
+
return lock;
|
|
54
|
+
}
|
|
55
|
+
async unlockAll() {
|
|
56
|
+
if (this.hasUnlock()) {
|
|
57
|
+
await this.unlock(...this.toUnlock);
|
|
58
|
+
this.toUnlock = [];
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
async all() {
|
|
62
|
+
await this.unlockAll();
|
|
63
|
+
await this.lockAll();
|
|
64
|
+
}
|
|
65
|
+
async applyAll(lock) {
|
|
66
|
+
lock = await this.applyUnlockAll(lock);
|
|
67
|
+
lock = await this.applyLockAll(lock);
|
|
68
|
+
return lock;
|
|
69
|
+
}
|
|
70
|
+
async applyLock(lock, ...data) {
|
|
71
|
+
data.forEach((d) => {
|
|
72
|
+
if (d?.enabled === false) return;
|
|
73
|
+
else if (!d?.data || Array.isArray(d?.data) && d.data.length === 0 || typeof d?.data === "object" && Object.keys(d.data).length === 0) return;
|
|
74
|
+
const path = this.buildPath(d);
|
|
75
|
+
if (d?.merge) {
|
|
76
|
+
let parsed;
|
|
77
|
+
if (typeof d.data === "object") parsed = merge(d.merge, this.op.get(lock, path, Array.isArray(d.data) ? [] : {}), d.data);
|
|
78
|
+
else {
|
|
79
|
+
this.logger.warn("\"%s\" path with type \"%s\" is not mergeable.", path, typeof d.data);
|
|
80
|
+
parsed = d.data;
|
|
81
|
+
}
|
|
82
|
+
lock = this.op.set(lock, path, parsed);
|
|
83
|
+
this.logger.verbose("Merge lock: %s -> %o", path, d.data);
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
lock = this.op.set(lock, path, d.data);
|
|
87
|
+
this.logger.verbose("Override lock: %s -> %o", path, d.data);
|
|
88
|
+
});
|
|
89
|
+
return lock;
|
|
90
|
+
}
|
|
91
|
+
async lock(...data) {
|
|
92
|
+
const lock = await this.applyLock(await this.tryRead() ?? {}, ...data);
|
|
93
|
+
await this.write(lock);
|
|
94
|
+
return lock;
|
|
95
|
+
}
|
|
96
|
+
async applyUnlock(lock, ...data) {
|
|
97
|
+
if (data.length > 0) {
|
|
98
|
+
data.forEach((d) => {
|
|
99
|
+
if (d?.enabled === false) return;
|
|
100
|
+
const path = this.buildPath(d);
|
|
101
|
+
lock = op.del(lock, path);
|
|
102
|
+
this.logger.verbose("Unlocked: %s", path);
|
|
103
|
+
for (let i = path.length - 1; i >= 0; i--) {
|
|
104
|
+
const parentPath = path.slice(0, i);
|
|
105
|
+
const parent = this.op.get(lock, parentPath);
|
|
106
|
+
if (!parent || Array.isArray(parent) && parent.length === 0 || typeof parent === "object" && Object.keys(parent).length === 0) {
|
|
107
|
+
this.logger.verbose("Unlocked parent: %s -> %s", path, parentPath);
|
|
108
|
+
lock = op.del(lock, parentPath);
|
|
109
|
+
} else break;
|
|
110
|
+
}
|
|
111
|
+
});
|
|
112
|
+
return lock;
|
|
113
|
+
}
|
|
114
|
+
lock = op.del(lock, this.options.root);
|
|
115
|
+
this.logger.verbose("Unlocked module: %s", this.options.root);
|
|
116
|
+
return lock;
|
|
117
|
+
}
|
|
118
|
+
async unlock(...data) {
|
|
119
|
+
const state = await this.tryRead();
|
|
120
|
+
if (!state) {
|
|
121
|
+
this.logger.verbose("Lock file not found. Nothing to unlock.");
|
|
122
|
+
return;
|
|
123
|
+
}
|
|
124
|
+
const lock = await this.applyUnlock(state, ...data);
|
|
125
|
+
await this.write(lock);
|
|
126
|
+
return lock;
|
|
127
|
+
}
|
|
128
|
+
async read() {
|
|
129
|
+
return this.parser.fetch(this.options.parser).parse(await this.fs.read(this.options.file));
|
|
130
|
+
}
|
|
131
|
+
async tryRead() {
|
|
132
|
+
const lock = await this.fs.read(this.options.file).catch((err) => {
|
|
133
|
+
this.logger.trace("Can not read lockfile: %s -> %s", this.options.file, err.message);
|
|
134
|
+
});
|
|
135
|
+
if (!lock) return;
|
|
136
|
+
return this.parser.fetch(this.options.parser).parse(lock);
|
|
137
|
+
}
|
|
138
|
+
async tryRemove() {
|
|
139
|
+
return this.fs.remove(this.options.file).then(() => {
|
|
140
|
+
this.logger.trace("Removed lockfile: %s", this.options.file);
|
|
141
|
+
}).catch((err) => {
|
|
142
|
+
this.logger.trace("Can not remove lockfile: %s -> %s", this.options.file, err.message);
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
async write(data) {
|
|
146
|
+
if (!data || Array.isArray(data) && data.length === 0 || typeof data === "object" && Object.keys(data).length === 0) {
|
|
147
|
+
this.logger.trace("Trying to write empty lock file, deleting it instead: %s", this.options.file);
|
|
148
|
+
return this.fs.remove(this.options.file);
|
|
149
|
+
}
|
|
150
|
+
return this.fs.write(this.options.file, this.parser.fetch(this.options.parser).stringify(data));
|
|
151
|
+
}
|
|
152
|
+
buildPath(d) {
|
|
153
|
+
if (d?.root !== true && this.options.root?.length) return [...this.options.root, ...this.normalizePath(d.path)];
|
|
154
|
+
return this.normalizePath(d.path);
|
|
155
|
+
}
|
|
156
|
+
normalizePath(path) {
|
|
157
|
+
if (Array.isArray(path)) return path.map((p) => p.toString());
|
|
158
|
+
else if (typeof path === "string") return path.split(".");
|
|
159
|
+
return [];
|
|
160
|
+
}
|
|
161
|
+
};
|
|
162
|
+
LockerService = _decorate([Injectable(), _decorateMetadata("design:paramtypes", [
|
|
163
|
+
typeof (_ref = typeof LoggerService !== "undefined" && LoggerService) === "function" ? _ref : Object,
|
|
164
|
+
typeof (_ref2 = typeof FileSystemService !== "undefined" && FileSystemService) === "function" ? _ref2 : Object,
|
|
165
|
+
typeof (_ref3 = typeof ParserService !== "undefined" && ParserService) === "function" ? _ref3 : Object,
|
|
166
|
+
Object
|
|
167
|
+
])], LockerService);
|
|
168
|
+
|
|
169
|
+
//#endregion
|
|
170
|
+
export { LockerService };
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { pipeProcessThroughListr } from "./pipe/pipe-process-to-listr.js";
|
|
2
|
+
import { LogFieldStatus, LogLevels } from "./logger.constants.js";
|
|
3
|
+
import { pipeProcessToLogger } from "./pipe/pipe-process-to-logger.js";
|
|
4
|
+
import { WinstonService } from "./winston.service.js";
|
|
5
|
+
import { LoggerService } from "./logger.service.js";
|
|
6
|
+
import { LoggerModule } from "./logger.module.js";
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
//#region src/lib/logger/logger.constants.d.ts
|
|
2
|
+
declare enum LogLevels {
|
|
3
|
+
SILENT = "SILENT",
|
|
4
|
+
DIRECT = "DIRECT",
|
|
5
|
+
FATAL = "FATAL",
|
|
6
|
+
ERROR = "ERROR",
|
|
7
|
+
WARN = "WARN",
|
|
8
|
+
INFO = "INFO",
|
|
9
|
+
VERBOSE = "VERBOSE",
|
|
10
|
+
DEBUG = "DEBUG",
|
|
11
|
+
TRACE = "TRACE",
|
|
12
|
+
}
|
|
13
|
+
declare enum LogFieldStatus {
|
|
14
|
+
RUN = "run",
|
|
15
|
+
END = "end",
|
|
16
|
+
STAGE = "stage",
|
|
17
|
+
EXIT = "exit",
|
|
18
|
+
TERMINATE = "terminate",
|
|
19
|
+
}
|
|
20
|
+
//#endregion
|
|
21
|
+
export { LogFieldStatus, LogLevels };
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
//#region src/lib/logger/logger.constants.ts
|
|
2
|
+
let LogLevels = /* @__PURE__ */ function(LogLevels$1) {
|
|
3
|
+
LogLevels$1["SILENT"] = "SILENT";
|
|
4
|
+
LogLevels$1["DIRECT"] = "DIRECT";
|
|
5
|
+
LogLevels$1["FATAL"] = "FATAL";
|
|
6
|
+
LogLevels$1["ERROR"] = "ERROR";
|
|
7
|
+
LogLevels$1["WARN"] = "WARN";
|
|
8
|
+
LogLevels$1["INFO"] = "INFO";
|
|
9
|
+
LogLevels$1["VERBOSE"] = "VERBOSE";
|
|
10
|
+
LogLevels$1["DEBUG"] = "DEBUG";
|
|
11
|
+
LogLevels$1["TRACE"] = "TRACE";
|
|
12
|
+
return LogLevels$1;
|
|
13
|
+
}({});
|
|
14
|
+
let LogFieldStatus = /* @__PURE__ */ function(LogFieldStatus$1) {
|
|
15
|
+
LogFieldStatus$1["RUN"] = "run";
|
|
16
|
+
LogFieldStatus$1["END"] = "end";
|
|
17
|
+
LogFieldStatus$1["STAGE"] = "stage";
|
|
18
|
+
LogFieldStatus$1["EXIT"] = "exit";
|
|
19
|
+
LogFieldStatus$1["TERMINATE"] = "terminate";
|
|
20
|
+
return LogFieldStatus$1;
|
|
21
|
+
}({});
|
|
22
|
+
|
|
23
|
+
//#endregion
|
|
24
|
+
export { LogFieldStatus, LogLevels };
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { LogLevels } from "./logger.constants.js";
|
|
2
|
+
import { LeveledLogMethod, Logger } from "winston";
|
|
3
|
+
|
|
4
|
+
//#region src/lib/logger/logger.interface.d.ts
|
|
5
|
+
interface LoggerFormat {
|
|
6
|
+
level: LogLevels;
|
|
7
|
+
message: string;
|
|
8
|
+
context: string;
|
|
9
|
+
status: string;
|
|
10
|
+
}
|
|
11
|
+
type Winston = Logger & Record<keyof typeof LogLevels, LeveledLogMethod>;
|
|
12
|
+
//#endregion
|
|
13
|
+
export { LoggerFormat, Winston };
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { WinstonService } from "./winston.service.js";
|
|
2
|
+
import { LoggerService } from "./logger.service.js";
|
|
3
|
+
import { ConfigModule } from "../config/config.module.js";
|
|
4
|
+
import "../config/index.js";
|
|
5
|
+
import { Global, Module } from "@nestjs/common";
|
|
6
|
+
import _decorate from "@oxc-project/runtime/helpers/decorate";
|
|
7
|
+
|
|
8
|
+
//#region src/lib/logger/logger.module.ts
|
|
9
|
+
let LoggerModule = class LoggerModule$1 {};
|
|
10
|
+
LoggerModule = _decorate([Global(), Module({
|
|
11
|
+
imports: [ConfigModule],
|
|
12
|
+
providers: [WinstonService, LoggerService],
|
|
13
|
+
exports: [LoggerService]
|
|
14
|
+
})], LoggerModule);
|
|
15
|
+
|
|
16
|
+
//#endregion
|
|
17
|
+
export { LoggerModule };
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { LogLevels } from "./logger.constants.js";
|
|
2
|
+
import { WinstonService } from "./winston.service.js";
|
|
3
|
+
import { splat } from "listr2";
|
|
4
|
+
|
|
5
|
+
//#region src/lib/logger/logger.service.d.ts
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* A general logger for the the CLI applications.
|
|
9
|
+
*/
|
|
10
|
+
declare class LoggerService {
|
|
11
|
+
private readonly winston;
|
|
12
|
+
context: string;
|
|
13
|
+
constructor(winston: WinstonService);
|
|
14
|
+
setup(context: string): LoggerService;
|
|
15
|
+
log(level: LogLevels, data: string | Buffer, ...args: any): void;
|
|
16
|
+
direct(data: string | Buffer, ...args: any): void;
|
|
17
|
+
fatal(data: string | Buffer, ...args: any): void;
|
|
18
|
+
error(data: string | Buffer, ...args: any): void;
|
|
19
|
+
warn(data: string | Buffer, ...args: any): void;
|
|
20
|
+
info(data: string | Buffer, ...args: any): void;
|
|
21
|
+
verbose(data: string | Buffer, ...args: any): void;
|
|
22
|
+
debug(data: string | Buffer, ...args: any): void;
|
|
23
|
+
trace(data: string | Buffer, ...args: any): void;
|
|
24
|
+
run(data: string | Buffer, ...args: any): void;
|
|
25
|
+
end(data: string | Buffer, ...args: any): void;
|
|
26
|
+
stage(data: string | Buffer, ...args: any): void;
|
|
27
|
+
splat(...args: Parameters<typeof splat>): ReturnType<typeof splat>;
|
|
28
|
+
private parseMessage;
|
|
29
|
+
}
|
|
30
|
+
//#endregion
|
|
31
|
+
export { LoggerService };
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { LogFieldStatus, LogLevels } from "./logger.constants.js";
|
|
2
|
+
import { WinstonService } from "./winston.service.js";
|
|
3
|
+
import { Injectable, Scope } from "@nestjs/common";
|
|
4
|
+
import { splat } from "listr2";
|
|
5
|
+
import _decorateMetadata from "@oxc-project/runtime/helpers/decorateMetadata";
|
|
6
|
+
import _decorate from "@oxc-project/runtime/helpers/decorate";
|
|
7
|
+
|
|
8
|
+
//#region src/lib/logger/logger.service.ts
|
|
9
|
+
var _ref;
|
|
10
|
+
let LoggerService = class LoggerService$1 {
|
|
11
|
+
constructor(winston) {
|
|
12
|
+
this.winston = winston;
|
|
13
|
+
}
|
|
14
|
+
setup(context) {
|
|
15
|
+
this.context = context;
|
|
16
|
+
return this;
|
|
17
|
+
}
|
|
18
|
+
log(level, data, ...args) {
|
|
19
|
+
return this.parseMessage(level, data, args);
|
|
20
|
+
}
|
|
21
|
+
direct(data, ...args) {
|
|
22
|
+
return this.parseMessage(LogLevels.DIRECT, data, args);
|
|
23
|
+
}
|
|
24
|
+
fatal(data, ...args) {
|
|
25
|
+
return this.parseMessage(LogLevels.FATAL, data, args);
|
|
26
|
+
}
|
|
27
|
+
error(data, ...args) {
|
|
28
|
+
return this.parseMessage(LogLevels.ERROR, data, args);
|
|
29
|
+
}
|
|
30
|
+
warn(data, ...args) {
|
|
31
|
+
return this.parseMessage(LogLevels.WARN, data, args);
|
|
32
|
+
}
|
|
33
|
+
info(data, ...args) {
|
|
34
|
+
return this.parseMessage(LogLevels.INFO, data, args);
|
|
35
|
+
}
|
|
36
|
+
verbose(data, ...args) {
|
|
37
|
+
return this.parseMessage(LogLevels.VERBOSE, data, args);
|
|
38
|
+
}
|
|
39
|
+
debug(data, ...args) {
|
|
40
|
+
return this.parseMessage(LogLevels.DEBUG, data, args);
|
|
41
|
+
}
|
|
42
|
+
trace(data, ...args) {
|
|
43
|
+
return this.parseMessage(LogLevels.TRACE, data, args);
|
|
44
|
+
}
|
|
45
|
+
run(data, ...args) {
|
|
46
|
+
return this.parseMessage(LogLevels.INFO, data, args, { status: LogFieldStatus.RUN });
|
|
47
|
+
}
|
|
48
|
+
end(data, ...args) {
|
|
49
|
+
return this.parseMessage(LogLevels.INFO, data, args, { status: LogFieldStatus.END });
|
|
50
|
+
}
|
|
51
|
+
stage(data, ...args) {
|
|
52
|
+
return this.parseMessage(LogLevels.TRACE, data, args, { status: LogFieldStatus.STAGE });
|
|
53
|
+
}
|
|
54
|
+
splat(...args) {
|
|
55
|
+
const message = args.shift();
|
|
56
|
+
if (typeof message === "undefined") return "";
|
|
57
|
+
if (args.length === 0) return message;
|
|
58
|
+
return splat(message, args);
|
|
59
|
+
}
|
|
60
|
+
parseMessage(level, data, args, format) {
|
|
61
|
+
this.winston.instance.log(level, data.toString(), ...args ?? [], {
|
|
62
|
+
context: this.context,
|
|
63
|
+
...format ?? {}
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
};
|
|
67
|
+
LoggerService = _decorate([Injectable({ scope: Scope.TRANSIENT }), _decorateMetadata("design:paramtypes", [typeof (_ref = typeof WinstonService !== "undefined" && WinstonService) === "function" ? _ref : Object])], LoggerService);
|
|
68
|
+
|
|
69
|
+
//#endregion
|
|
70
|
+
export { LoggerService };
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { ListrTaskWrapper } from "listr2";
|
|
2
|
+
import { ChildProcess } from "child_process";
|
|
3
|
+
|
|
4
|
+
//#region src/lib/logger/pipe/pipe-process-to-listr.d.ts
|
|
5
|
+
declare function pipeProcessThroughListr(task: ListrTaskWrapper<any, any, any>, instance: ChildProcess): ChildProcess;
|
|
6
|
+
//#endregion
|
|
7
|
+
export { pipeProcessThroughListr };
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { PipeProcessToLoggerOptions } from "./pipe-process-to-logger.interface.js";
|
|
2
|
+
import { LoggerService } from "../logger.service.js";
|
|
3
|
+
import { ChildProcess } from "child_process";
|
|
4
|
+
|
|
5
|
+
//#region src/lib/logger/pipe/pipe-process-to-logger.d.ts
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Given the instance it will pipe process output through the logger to append prefixes such as the application name.
|
|
9
|
+
*/
|
|
10
|
+
declare function pipeProcessToLogger(logger: LoggerService, instance: ChildProcess, options?: PipeProcessToLoggerOptions): ChildProcess;
|
|
11
|
+
//#endregion
|
|
12
|
+
export { pipeProcessToLogger };
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { LogLevels } from "../logger.constants.js";
|
|
2
|
+
|
|
3
|
+
//#region src/lib/logger/pipe/pipe-process-to-logger.interface.d.ts
|
|
4
|
+
interface PipeProcessToLoggerOptions {
|
|
5
|
+
/** Will log the command when the process starts. */
|
|
6
|
+
start?: LogLevels;
|
|
7
|
+
/** Will log the command when the process ends. */
|
|
8
|
+
end?: LogLevels;
|
|
9
|
+
/** enable/disable stdout */
|
|
10
|
+
stdout?: LogLevels;
|
|
11
|
+
/** enable/disable stderrr */
|
|
12
|
+
stderr?: LogLevels;
|
|
13
|
+
/** will callback on error in the instance */
|
|
14
|
+
callback?: (error?: Error) => void;
|
|
15
|
+
/** context for logger */
|
|
16
|
+
context?: string;
|
|
17
|
+
}
|
|
18
|
+
//#endregion
|
|
19
|
+
export { PipeProcessToLoggerOptions };
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { LogLevels } from "../logger.constants.js";
|
|
2
|
+
import { Writable } from "stream";
|
|
3
|
+
|
|
4
|
+
//#region src/lib/logger/pipe/pipe-process-to-logger.ts
|
|
5
|
+
/**
|
|
6
|
+
* Given the instance it will pipe process output through the logger to append prefixes such as the application name.
|
|
7
|
+
*/
|
|
8
|
+
function pipeProcessToLogger(logger, instance, options) {
|
|
9
|
+
options = {
|
|
10
|
+
start: LogLevels.INFO,
|
|
11
|
+
end: LogLevels.INFO,
|
|
12
|
+
stdout: LogLevels.INFO,
|
|
13
|
+
stderr: LogLevels.WARN,
|
|
14
|
+
...options
|
|
15
|
+
};
|
|
16
|
+
if (options.start) logger.run(instance.spawnargs.join(" "), {
|
|
17
|
+
level: options.start,
|
|
18
|
+
context: options.context
|
|
19
|
+
});
|
|
20
|
+
if (instance.stdout) {
|
|
21
|
+
const writable = new Writable();
|
|
22
|
+
writable.write = (chunk) => {
|
|
23
|
+
logger.log(options.stdout, chunk, { context: options.context });
|
|
24
|
+
return true;
|
|
25
|
+
};
|
|
26
|
+
instance.stdout.pipe(writable);
|
|
27
|
+
}
|
|
28
|
+
if (instance.stderr) {
|
|
29
|
+
const writable = new Writable();
|
|
30
|
+
writable.write = (chunk) => {
|
|
31
|
+
logger.log(options.stderr, chunk, { context: options.context });
|
|
32
|
+
return true;
|
|
33
|
+
};
|
|
34
|
+
instance.stderr.pipe(writable);
|
|
35
|
+
}
|
|
36
|
+
instance.on("exit", (code, signal) => {
|
|
37
|
+
const message = `Process ended with code ${code}${signal ? ` and signal ${signal}` : ""}.`;
|
|
38
|
+
logger.debug(message, { context: options.context });
|
|
39
|
+
if (options.end) logger.end(instance.spawnargs.join(" "), {
|
|
40
|
+
level: options.end,
|
|
41
|
+
context: options.context
|
|
42
|
+
});
|
|
43
|
+
if (options?.callback) options.callback();
|
|
44
|
+
});
|
|
45
|
+
instance.on("error", (error) => {
|
|
46
|
+
logger.fatal(error.message, { context: options.context });
|
|
47
|
+
logger.debug(error.stack, { context: options.context });
|
|
48
|
+
if (options?.callback) options.callback(error);
|
|
49
|
+
});
|
|
50
|
+
return instance;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
//#endregion
|
|
54
|
+
export { pipeProcessToLogger };
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { ConfigModuleOptions } from "../config/config.interface.js";
|
|
2
|
+
import { Winston } from "./logger.interface.js";
|
|
3
|
+
import { OnModuleInit } from "@nestjs/common";
|
|
4
|
+
|
|
5
|
+
//#region src/lib/logger/winston.service.d.ts
|
|
6
|
+
declare class WinstonService implements OnModuleInit {
|
|
7
|
+
private readonly options;
|
|
8
|
+
instance: Winston;
|
|
9
|
+
constructor(options: ConfigModuleOptions);
|
|
10
|
+
onModuleInit(): void;
|
|
11
|
+
private initiateLogger;
|
|
12
|
+
private logColoring;
|
|
13
|
+
}
|
|
14
|
+
//#endregion
|
|
15
|
+
export { WinstonService };
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { TOKEN_CONFIG_MODULE_OPTIONS } from "../config/config.constants.js";
|
|
2
|
+
import { LogLevels } from "./logger.constants.js";
|
|
3
|
+
import { Inject, Injectable } from "@nestjs/common";
|
|
4
|
+
import { color, figures } from "listr2";
|
|
5
|
+
import { EOL } from "os";
|
|
6
|
+
import winston, { format, transports } from "winston";
|
|
7
|
+
import _decorateMetadata from "@oxc-project/runtime/helpers/decorateMetadata";
|
|
8
|
+
import _decorateParam from "@oxc-project/runtime/helpers/decorateParam";
|
|
9
|
+
import _decorate from "@oxc-project/runtime/helpers/decorate";
|
|
10
|
+
|
|
11
|
+
//#region src/lib/logger/winston.service.ts
|
|
12
|
+
let WinstonService = class WinstonService$1 {
|
|
13
|
+
constructor(options) {
|
|
14
|
+
this.options = options;
|
|
15
|
+
}
|
|
16
|
+
onModuleInit() {
|
|
17
|
+
this.instance = this.initiateLogger();
|
|
18
|
+
}
|
|
19
|
+
initiateLogger() {
|
|
20
|
+
const logFormat = format.printf((({ level, message, context, status }) => {
|
|
21
|
+
return message.split(EOL).filter((msg) => !msg || msg.trim() !== "").map((msg) => {
|
|
22
|
+
return this.logColoring({
|
|
23
|
+
level,
|
|
24
|
+
message: msg,
|
|
25
|
+
context,
|
|
26
|
+
status
|
|
27
|
+
});
|
|
28
|
+
}).join(EOL);
|
|
29
|
+
}));
|
|
30
|
+
const logger = winston.createLogger({
|
|
31
|
+
level: this.options.config.logLevel,
|
|
32
|
+
format: format.combine(format.splat(), format.json({ space: 2 }), format.prettyPrint(), logFormat),
|
|
33
|
+
levels: Object.fromEntries(Object.values(LogLevels).map((level, i) => {
|
|
34
|
+
return [level, i];
|
|
35
|
+
})),
|
|
36
|
+
silent: this.options.config.logLevel === LogLevels.SILENT || this.options.config.isJson,
|
|
37
|
+
transports: [new transports.Console({ stderrLevels: [LogLevels.FATAL, LogLevels.ERROR] })]
|
|
38
|
+
});
|
|
39
|
+
logger.log(LogLevels.TRACE, "Initiated new winston with level: %s", this.options.config.logLevel, { context: this.constructor.name });
|
|
40
|
+
return logger;
|
|
41
|
+
}
|
|
42
|
+
logColoring({ level, message, context, status }) {
|
|
43
|
+
let icon;
|
|
44
|
+
let coloring = (input) => {
|
|
45
|
+
return input;
|
|
46
|
+
};
|
|
47
|
+
let msgColoring = (input) => {
|
|
48
|
+
return input;
|
|
49
|
+
};
|
|
50
|
+
switch (level) {
|
|
51
|
+
case LogLevels.DIRECT: return message;
|
|
52
|
+
case LogLevels.FATAL:
|
|
53
|
+
coloring = color.red;
|
|
54
|
+
msgColoring = color.red;
|
|
55
|
+
break;
|
|
56
|
+
case LogLevels.ERROR:
|
|
57
|
+
coloring = color.red;
|
|
58
|
+
icon = figures.cross;
|
|
59
|
+
break;
|
|
60
|
+
case LogLevels.WARN:
|
|
61
|
+
coloring = color.yellow;
|
|
62
|
+
icon = figures.warning;
|
|
63
|
+
break;
|
|
64
|
+
case LogLevels.INFO:
|
|
65
|
+
coloring = color.green;
|
|
66
|
+
icon = figures.pointerSmall;
|
|
67
|
+
break;
|
|
68
|
+
case LogLevels.VERBOSE:
|
|
69
|
+
coloring = color.dim;
|
|
70
|
+
break;
|
|
71
|
+
case LogLevels.DEBUG:
|
|
72
|
+
coloring = color.cyan;
|
|
73
|
+
msgColoring = color.dim;
|
|
74
|
+
break;
|
|
75
|
+
case LogLevels.TRACE:
|
|
76
|
+
coloring = color.magenta;
|
|
77
|
+
msgColoring = color.dim;
|
|
78
|
+
break;
|
|
79
|
+
}
|
|
80
|
+
if (!icon) icon = `[${level.at(0).toUpperCase()}]`;
|
|
81
|
+
return `${coloring(icon)}${context ? " " + coloring(`[${context}]`) : ""}${status ? " " + coloring(`[${status}]`) : ""} ${msgColoring(message)}`;
|
|
82
|
+
}
|
|
83
|
+
};
|
|
84
|
+
WinstonService = _decorate([
|
|
85
|
+
Injectable(),
|
|
86
|
+
_decorateMetadata("design:paramtypes", [Object]),
|
|
87
|
+
_decorateParam(0, Inject(TOKEN_CONFIG_MODULE_OPTIONS))
|
|
88
|
+
], WinstonService);
|
|
89
|
+
|
|
90
|
+
//#endregion
|
|
91
|
+
export { WinstonService };
|