@evolith/infra-providers 1.0.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/config-parser.provider.d.ts +15 -0
- package/dist/config-parser.provider.js +68 -0
- package/dist/config-parser.provider.js.map +1 -0
- package/dist/disk-ruleset.repository.d.ts +16 -0
- package/dist/disk-ruleset.repository.js +178 -0
- package/dist/disk-ruleset.repository.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.js +19 -0
- package/dist/index.js.map +1 -0
- package/dist/logger.provider.d.ts +10 -0
- package/dist/logger.provider.js +84 -0
- package/dist/logger.provider.js.map +1 -0
- package/dist/moscow-prioritization.service.d.ts +48 -0
- package/dist/moscow-prioritization.service.js +212 -0
- package/dist/moscow-prioritization.service.js.map +1 -0
- package/dist/node-filesystem.provider.d.ts +23 -0
- package/dist/node-filesystem.provider.js +117 -0
- package/dist/node-filesystem.provider.js.map +1 -0
- package/dist/webhook.adapter.d.ts +5 -0
- package/dist/webhook.adapter.js +32 -0
- package/dist/webhook.adapter.js.map +1 -0
- package/package.json +31 -0
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { IConfigParser, IConfigParserProvider } from '@evolith/core-domain/domain/interfaces';
|
|
2
|
+
export declare class YamlConfigParserProvider implements IConfigParserProvider {
|
|
3
|
+
createConfigParser(_format: string): IConfigParser;
|
|
4
|
+
}
|
|
5
|
+
export declare class YamlConfigParserImpl implements IConfigParser {
|
|
6
|
+
parse(content: string): unknown;
|
|
7
|
+
stringify(data: unknown): string;
|
|
8
|
+
}
|
|
9
|
+
export declare class JsonConfigParserProvider implements IConfigParserProvider {
|
|
10
|
+
createConfigParser(_format: string): IConfigParser;
|
|
11
|
+
}
|
|
12
|
+
export declare class JsonConfigParserImpl implements IConfigParser {
|
|
13
|
+
parse(content: string): unknown;
|
|
14
|
+
stringify(data: unknown): string;
|
|
15
|
+
}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.JsonConfigParserImpl = exports.JsonConfigParserProvider = exports.YamlConfigParserImpl = exports.YamlConfigParserProvider = void 0;
|
|
37
|
+
const yaml = __importStar(require("yaml"));
|
|
38
|
+
class YamlConfigParserProvider {
|
|
39
|
+
createConfigParser(_format) {
|
|
40
|
+
return new YamlConfigParserImpl();
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
exports.YamlConfigParserProvider = YamlConfigParserProvider;
|
|
44
|
+
class YamlConfigParserImpl {
|
|
45
|
+
parse(content) {
|
|
46
|
+
return yaml.parse(content);
|
|
47
|
+
}
|
|
48
|
+
stringify(data) {
|
|
49
|
+
return yaml.stringify(data);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
exports.YamlConfigParserImpl = YamlConfigParserImpl;
|
|
53
|
+
class JsonConfigParserProvider {
|
|
54
|
+
createConfigParser(_format) {
|
|
55
|
+
return new JsonConfigParserImpl();
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
exports.JsonConfigParserProvider = JsonConfigParserProvider;
|
|
59
|
+
class JsonConfigParserImpl {
|
|
60
|
+
parse(content) {
|
|
61
|
+
return JSON.parse(content);
|
|
62
|
+
}
|
|
63
|
+
stringify(data) {
|
|
64
|
+
return JSON.stringify(data, null, 2);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
exports.JsonConfigParserImpl = JsonConfigParserImpl;
|
|
68
|
+
//# sourceMappingURL=config-parser.provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config-parser.provider.js","sourceRoot":"","sources":["../src/config-parser.provider.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,2CAA6B;AAG7B,MAAa,wBAAwB;IACnC,kBAAkB,CAAC,OAAe;QAChC,OAAO,IAAI,oBAAoB,EAAE,CAAC;IACpC,CAAC;CACF;AAJD,4DAIC;AAED,MAAa,oBAAoB;IAC/B,KAAK,CAAC,OAAe;QACnB,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC7B,CAAC;IAED,SAAS,CAAC,IAAa;QACrB,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IAC9B,CAAC;CACF;AARD,oDAQC;AAED,MAAa,wBAAwB;IACnC,kBAAkB,CAAC,OAAe;QAChC,OAAO,IAAI,oBAAoB,EAAE,CAAC;IACpC,CAAC;CACF;AAJD,4DAIC;AAED,MAAa,oBAAoB;IAC/B,KAAK,CAAC,OAAe;QACnB,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC7B,CAAC;IAED,SAAS,CAAC,IAAa;QACrB,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IACvC,CAAC;CACF;AARD,oDAQC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { IFileSystem, ILogger } from "@evolith/core-domain/domain/interfaces";
|
|
2
|
+
import { NormalizedRule } from "@evolith/core-domain/domain/models/normalized-rule";
|
|
3
|
+
import { IRulesetRepository } from "@evolith/core-domain/domain/ports/ruleset-repository.port";
|
|
4
|
+
export declare class DiskRulesetRepository implements IRulesetRepository {
|
|
5
|
+
private readonly fs;
|
|
6
|
+
private readonly logger;
|
|
7
|
+
private readonly ajv;
|
|
8
|
+
private validateSchema?;
|
|
9
|
+
constructor(fs: IFileSystem, logger: ILogger);
|
|
10
|
+
loadAllRulesets(corePath: string): Promise<NormalizedRule[]>;
|
|
11
|
+
private findRulesetFiles;
|
|
12
|
+
private normalizeRuleset;
|
|
13
|
+
private normalizeSeverity;
|
|
14
|
+
private defaultBlocking;
|
|
15
|
+
private deriveCategory;
|
|
16
|
+
}
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.DiskRulesetRepository = void 0;
|
|
40
|
+
const path = __importStar(require("path"));
|
|
41
|
+
const ajv_1 = __importDefault(require("ajv"));
|
|
42
|
+
const ajv_formats_1 = __importDefault(require("ajv-formats"));
|
|
43
|
+
class DiskRulesetRepository {
|
|
44
|
+
constructor(fs, logger) {
|
|
45
|
+
this.fs = fs;
|
|
46
|
+
this.logger = logger;
|
|
47
|
+
this.ajv = new ajv_1.default({ allErrors: true });
|
|
48
|
+
(0, ajv_formats_1.default)(this.ajv);
|
|
49
|
+
}
|
|
50
|
+
async loadAllRulesets(corePath) {
|
|
51
|
+
const rulesetsDir = path.join(corePath, "rulesets");
|
|
52
|
+
if (!(await this.fs.exists(rulesetsDir)))
|
|
53
|
+
return [];
|
|
54
|
+
const files = await this.findRulesetFiles(rulesetsDir);
|
|
55
|
+
const rules = [];
|
|
56
|
+
for (const filePath of files) {
|
|
57
|
+
try {
|
|
58
|
+
const content = await this.fs.readFile(filePath);
|
|
59
|
+
const parsed = JSON.parse(content);
|
|
60
|
+
if (!filePath.endsWith("phase-gates.rules.json")) {
|
|
61
|
+
if (!this.validateSchema) {
|
|
62
|
+
const schemaPath = path.join(rulesetsDir, "schema", "ruleset-standard.schema.json");
|
|
63
|
+
const schemaContent = await this.fs.readFile(schemaPath);
|
|
64
|
+
this.validateSchema = this.ajv.compile(JSON.parse(schemaContent));
|
|
65
|
+
}
|
|
66
|
+
const valid = this.validateSchema(parsed);
|
|
67
|
+
if (!valid) {
|
|
68
|
+
throw new Error(`Schema validation failed: ${this.ajv.errorsText(this.validateSchema.errors)}`);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
const relative = filePath.replace(corePath + path.sep, "");
|
|
72
|
+
rules.push(...this.normalizeRuleset(parsed, relative));
|
|
73
|
+
}
|
|
74
|
+
catch (err) {
|
|
75
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
76
|
+
this.logger.error(`Malformed ruleset detected at ${filePath}: ${message}`);
|
|
77
|
+
throw new Error(`Ruleset validation error in ${filePath}: ${message}`);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
return rules;
|
|
81
|
+
}
|
|
82
|
+
async findRulesetFiles(dir, depth = 0) {
|
|
83
|
+
if (depth > 4)
|
|
84
|
+
return [];
|
|
85
|
+
const files = [];
|
|
86
|
+
const entries = await this.fs.readdirNames(dir);
|
|
87
|
+
for (const entry of entries) {
|
|
88
|
+
const full = path.join(dir, entry);
|
|
89
|
+
if (entry.endsWith(".rules.json")) {
|
|
90
|
+
files.push(full);
|
|
91
|
+
continue;
|
|
92
|
+
}
|
|
93
|
+
if (!entry.includes(".")) {
|
|
94
|
+
const stat = await this.fs.stat(full);
|
|
95
|
+
if (stat?.isDirectory?.()) {
|
|
96
|
+
files.push(...(await this.findRulesetFiles(full, depth + 1)));
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
return files;
|
|
101
|
+
}
|
|
102
|
+
normalizeRuleset(parsed, sourceFile) {
|
|
103
|
+
const rawList = (parsed["rules"] ?? parsed["principles"]);
|
|
104
|
+
if (!Array.isArray(rawList))
|
|
105
|
+
return [];
|
|
106
|
+
if (rawList.length > 0 && !rawList[0]["id"] && rawList[0]["rules"])
|
|
107
|
+
return [];
|
|
108
|
+
return rawList
|
|
109
|
+
.filter((r) => Boolean(r["id"]))
|
|
110
|
+
.map((r) => ({
|
|
111
|
+
id: String(r["id"]),
|
|
112
|
+
severity: this.normalizeSeverity(r),
|
|
113
|
+
category: this.deriveCategory(r),
|
|
114
|
+
title: String(r["title"] ?? r["principle"] ?? r["id"]),
|
|
115
|
+
description: String(r["description"] ?? r["statement"] ?? ""),
|
|
116
|
+
blocking: Boolean(r["blocking"] ?? this.defaultBlocking(r)),
|
|
117
|
+
validationQuery: r["validationQuery"]
|
|
118
|
+
? String(r["validationQuery"])
|
|
119
|
+
: undefined,
|
|
120
|
+
sourceFile,
|
|
121
|
+
}));
|
|
122
|
+
}
|
|
123
|
+
normalizeSeverity(r) {
|
|
124
|
+
const raw = String(r["severity"] ?? "")
|
|
125
|
+
.toUpperCase()
|
|
126
|
+
.trim();
|
|
127
|
+
if (raw === "MUST NOT")
|
|
128
|
+
return "MUST NOT";
|
|
129
|
+
if (raw === "MUST")
|
|
130
|
+
return "MUST";
|
|
131
|
+
if (raw === "SHOULD")
|
|
132
|
+
return "SHOULD";
|
|
133
|
+
if (raw === "COULD" || raw === "MAY")
|
|
134
|
+
return "COULD";
|
|
135
|
+
return r["blocking"] === true || r["enforcement"] ? "MUST" : "SHOULD";
|
|
136
|
+
}
|
|
137
|
+
defaultBlocking(r) {
|
|
138
|
+
const sev = String(r["severity"] ?? "").toUpperCase();
|
|
139
|
+
return sev === "MUST" || sev === "MUST NOT";
|
|
140
|
+
}
|
|
141
|
+
deriveCategory(r) {
|
|
142
|
+
if (r["category"])
|
|
143
|
+
return String(r["category"]);
|
|
144
|
+
const prefix = String(r["id"] ?? "")
|
|
145
|
+
.replace(/-(?:EVD|RR|PAR)-?\d*$/, "")
|
|
146
|
+
.replace(/-\d+$/, "")
|
|
147
|
+
.toLowerCase();
|
|
148
|
+
const map = {
|
|
149
|
+
inh: "inheritance",
|
|
150
|
+
acl: "anti-corruption",
|
|
151
|
+
ocb: "open-core",
|
|
152
|
+
gov: "governance",
|
|
153
|
+
evd: "identity",
|
|
154
|
+
"obs-evd": "tracing",
|
|
155
|
+
dep: "version-pinning",
|
|
156
|
+
tax: "naming-conventions",
|
|
157
|
+
hxa: "layer-structure",
|
|
158
|
+
git: "branch-naming",
|
|
159
|
+
cicd: "ci-cd",
|
|
160
|
+
tpy: "testing-pyramid",
|
|
161
|
+
mtn: "multi-tenancy",
|
|
162
|
+
prot: "protocol",
|
|
163
|
+
runt: "multi-runtime",
|
|
164
|
+
dora: "metrics",
|
|
165
|
+
space: "metrics",
|
|
166
|
+
drift: "governance",
|
|
167
|
+
"cli-rr": "build",
|
|
168
|
+
"cli-par": "shared-logic",
|
|
169
|
+
mcp: "protocol",
|
|
170
|
+
f1: "topology",
|
|
171
|
+
f2: "module-autonomy",
|
|
172
|
+
f3: "autonomous-deployment",
|
|
173
|
+
};
|
|
174
|
+
return map[prefix] ?? "general";
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
exports.DiskRulesetRepository = DiskRulesetRepository;
|
|
178
|
+
//# sourceMappingURL=disk-ruleset.repository.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"disk-ruleset.repository.js","sourceRoot":"","sources":["../src/disk-ruleset.repository.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { NodeFileSystemProvider } from './node-filesystem.provider';
|
|
2
|
+
export { NestLoggerProvider, ConsoleLoggerProvider, NoOpLoggerProvider } from './logger.provider';
|
|
3
|
+
export { YamlConfigParserProvider, JsonConfigParserProvider } from './config-parser.provider';
|
|
4
|
+
export { DiskRulesetRepository } from './disk-ruleset.repository';
|
|
5
|
+
export { WebhookAdapter } from './webhook.adapter';
|
|
6
|
+
export { MoscowPrioritizationService, MoscowItem, MoscowAnalysis, MoscowPriority, } from './moscow-prioritization.service';
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.MoscowPrioritizationService = exports.WebhookAdapter = exports.DiskRulesetRepository = exports.JsonConfigParserProvider = exports.YamlConfigParserProvider = exports.NoOpLoggerProvider = exports.ConsoleLoggerProvider = exports.NestLoggerProvider = exports.NodeFileSystemProvider = void 0;
|
|
4
|
+
var node_filesystem_provider_1 = require("./node-filesystem.provider");
|
|
5
|
+
Object.defineProperty(exports, "NodeFileSystemProvider", { enumerable: true, get: function () { return node_filesystem_provider_1.NodeFileSystemProvider; } });
|
|
6
|
+
var logger_provider_1 = require("./logger.provider");
|
|
7
|
+
Object.defineProperty(exports, "NestLoggerProvider", { enumerable: true, get: function () { return logger_provider_1.NestLoggerProvider; } });
|
|
8
|
+
Object.defineProperty(exports, "ConsoleLoggerProvider", { enumerable: true, get: function () { return logger_provider_1.ConsoleLoggerProvider; } });
|
|
9
|
+
Object.defineProperty(exports, "NoOpLoggerProvider", { enumerable: true, get: function () { return logger_provider_1.NoOpLoggerProvider; } });
|
|
10
|
+
var config_parser_provider_1 = require("./config-parser.provider");
|
|
11
|
+
Object.defineProperty(exports, "YamlConfigParserProvider", { enumerable: true, get: function () { return config_parser_provider_1.YamlConfigParserProvider; } });
|
|
12
|
+
Object.defineProperty(exports, "JsonConfigParserProvider", { enumerable: true, get: function () { return config_parser_provider_1.JsonConfigParserProvider; } });
|
|
13
|
+
var disk_ruleset_repository_1 = require("./disk-ruleset.repository");
|
|
14
|
+
Object.defineProperty(exports, "DiskRulesetRepository", { enumerable: true, get: function () { return disk_ruleset_repository_1.DiskRulesetRepository; } });
|
|
15
|
+
var webhook_adapter_1 = require("./webhook.adapter");
|
|
16
|
+
Object.defineProperty(exports, "WebhookAdapter", { enumerable: true, get: function () { return webhook_adapter_1.WebhookAdapter; } });
|
|
17
|
+
var moscow_prioritization_service_1 = require("./moscow-prioritization.service");
|
|
18
|
+
Object.defineProperty(exports, "MoscowPrioritizationService", { enumerable: true, get: function () { return moscow_prioritization_service_1.MoscowPrioritizationService; } });
|
|
19
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,uEAAoE;AAA3D,kIAAA,sBAAsB,OAAA;AAC/B,qDAAkG;AAAzF,qHAAA,kBAAkB,OAAA;AAAE,wHAAA,qBAAqB,OAAA;AAAE,qHAAA,kBAAkB,OAAA;AACtE,mEAA8F;AAArF,kIAAA,wBAAwB,OAAA;AAAE,kIAAA,wBAAwB,OAAA;AAC3D,qEAAkE;AAAzD,gIAAA,qBAAqB,OAAA;AAC9B,qDAAmD;AAA1C,iHAAA,cAAc,OAAA;AACvB,iFAKyC;AAJvC,4IAAA,2BAA2B,OAAA"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { ILogger, ILoggerProvider } from '@evolith/core-domain/domain/interfaces';
|
|
2
|
+
export declare class NestLoggerProvider implements ILoggerProvider {
|
|
3
|
+
createLogger(context: string): ILogger;
|
|
4
|
+
}
|
|
5
|
+
export declare class NoOpLoggerProvider implements ILoggerProvider {
|
|
6
|
+
createLogger(_context: string): ILogger;
|
|
7
|
+
}
|
|
8
|
+
export declare class ConsoleLoggerProvider implements ILoggerProvider {
|
|
9
|
+
createLogger(context: string): ILogger;
|
|
10
|
+
}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ConsoleLoggerProvider = exports.NoOpLoggerProvider = exports.NestLoggerProvider = void 0;
|
|
4
|
+
const common_1 = require("@nestjs/common");
|
|
5
|
+
class NestLoggerProvider {
|
|
6
|
+
createLogger(context) {
|
|
7
|
+
return new NestLogger(context);
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
exports.NestLoggerProvider = NestLoggerProvider;
|
|
11
|
+
class NestLogger {
|
|
12
|
+
constructor(context) {
|
|
13
|
+
this.logger = new common_1.Logger(context);
|
|
14
|
+
}
|
|
15
|
+
debug(message, context) {
|
|
16
|
+
this.logger.debug(message, context);
|
|
17
|
+
}
|
|
18
|
+
info(message, context) {
|
|
19
|
+
this.logger.log(message, context);
|
|
20
|
+
}
|
|
21
|
+
warn(message, context) {
|
|
22
|
+
this.logger.warn(message, context);
|
|
23
|
+
}
|
|
24
|
+
error(message, context) {
|
|
25
|
+
this.logger.error(message, context);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
class NoOpLoggerProvider {
|
|
29
|
+
createLogger(_context) {
|
|
30
|
+
return new NoOpLogger();
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
exports.NoOpLoggerProvider = NoOpLoggerProvider;
|
|
34
|
+
class NoOpLogger {
|
|
35
|
+
constructor() {
|
|
36
|
+
this.logs = [];
|
|
37
|
+
}
|
|
38
|
+
debug(message, _context) {
|
|
39
|
+
this.logs.push({ level: 'debug', message, timestamp: new Date().toISOString() });
|
|
40
|
+
}
|
|
41
|
+
info(message, _context) {
|
|
42
|
+
this.logs.push({ level: 'info', message, timestamp: new Date().toISOString() });
|
|
43
|
+
}
|
|
44
|
+
warn(message, _context) {
|
|
45
|
+
this.logs.push({ level: 'warn', message, timestamp: new Date().toISOString() });
|
|
46
|
+
}
|
|
47
|
+
error(message, _context) {
|
|
48
|
+
this.logs.push({ level: 'error', message, timestamp: new Date().toISOString() });
|
|
49
|
+
}
|
|
50
|
+
getLogs() {
|
|
51
|
+
return [...this.logs];
|
|
52
|
+
}
|
|
53
|
+
clear() {
|
|
54
|
+
this.logs = [];
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
class ConsoleLoggerProvider {
|
|
58
|
+
createLogger(context) {
|
|
59
|
+
return new ConsoleLogger(context);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
exports.ConsoleLoggerProvider = ConsoleLoggerProvider;
|
|
63
|
+
class ConsoleLogger {
|
|
64
|
+
constructor(context) {
|
|
65
|
+
this.context = context;
|
|
66
|
+
}
|
|
67
|
+
format(level, message) {
|
|
68
|
+
const timestamp = new Date().toISOString();
|
|
69
|
+
return `[${timestamp}] [${level.toUpperCase()}] [${this.context}] ${message}`;
|
|
70
|
+
}
|
|
71
|
+
debug(message, _context) {
|
|
72
|
+
console.debug(this.format('debug', message));
|
|
73
|
+
}
|
|
74
|
+
info(message, _context) {
|
|
75
|
+
console.info(this.format('info', message));
|
|
76
|
+
}
|
|
77
|
+
warn(message, _context) {
|
|
78
|
+
console.warn(this.format('warn', message));
|
|
79
|
+
}
|
|
80
|
+
error(message, _context) {
|
|
81
|
+
console.error(this.format('error', message));
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=logger.provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.provider.js","sourceRoot":"","sources":["../src/logger.provider.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { IFileSystem, ILogger } from '@evolith/core-domain/domain/interfaces';
|
|
2
|
+
export type MoscowPriority = 'MUST' | 'SHOULD' | 'COULD' | 'WONT';
|
|
3
|
+
export interface MoscowItem {
|
|
4
|
+
id: string;
|
|
5
|
+
description: string;
|
|
6
|
+
priority: MoscowPriority;
|
|
7
|
+
category: string;
|
|
8
|
+
rationale: string;
|
|
9
|
+
phase: string;
|
|
10
|
+
}
|
|
11
|
+
export interface MoscowAnalysis {
|
|
12
|
+
repository: string;
|
|
13
|
+
phase: string;
|
|
14
|
+
items: MoscowItem[];
|
|
15
|
+
summary: {
|
|
16
|
+
must: number;
|
|
17
|
+
should: number;
|
|
18
|
+
could: number;
|
|
19
|
+
wont: number;
|
|
20
|
+
total: number;
|
|
21
|
+
};
|
|
22
|
+
createdAt: string;
|
|
23
|
+
updatedAt: string;
|
|
24
|
+
}
|
|
25
|
+
export declare class MoscowPrioritizationService {
|
|
26
|
+
private readonly fs;
|
|
27
|
+
constructor(options?: {
|
|
28
|
+
fileSystem?: IFileSystem;
|
|
29
|
+
logger?: ILogger;
|
|
30
|
+
});
|
|
31
|
+
createAnalysis(repoPath: string, phase: string, items: Omit<MoscowItem, 'id'>[]): Promise<MoscowAnalysis>;
|
|
32
|
+
loadAnalysis(repoPath: string, phase: string): Promise<MoscowAnalysis | null>;
|
|
33
|
+
updateItem(repoPath: string, phase: string, itemId: string, updates: Partial<MoscowItem>): Promise<MoscowAnalysis | null>;
|
|
34
|
+
removeItem(repoPath: string, phase: string, itemId: string): Promise<MoscowAnalysis | null>;
|
|
35
|
+
listAnalyses(repoPath: string): Promise<Array<{
|
|
36
|
+
phase: string;
|
|
37
|
+
path: string;
|
|
38
|
+
updatedAt: string;
|
|
39
|
+
}>>;
|
|
40
|
+
validateAnalysis(analysis: MoscowAnalysis): {
|
|
41
|
+
valid: boolean;
|
|
42
|
+
issues: string[];
|
|
43
|
+
};
|
|
44
|
+
generateReport(analysis: MoscowAnalysis): string;
|
|
45
|
+
private percentage;
|
|
46
|
+
private getAnalysisPath;
|
|
47
|
+
private saveAnalysis;
|
|
48
|
+
}
|
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.MoscowPrioritizationService = void 0;
|
|
37
|
+
const path = __importStar(require("path"));
|
|
38
|
+
const node_filesystem_provider_1 = require("./node-filesystem.provider");
|
|
39
|
+
class MoscowPrioritizationService {
|
|
40
|
+
constructor(options) {
|
|
41
|
+
this.fs = options?.fileSystem ?? new node_filesystem_provider_1.NodeFileSystemProvider().createFileSystem();
|
|
42
|
+
}
|
|
43
|
+
async createAnalysis(repoPath, phase, items) {
|
|
44
|
+
const analysis = {
|
|
45
|
+
repository: repoPath,
|
|
46
|
+
phase,
|
|
47
|
+
items: items.map((item, index) => ({
|
|
48
|
+
...item,
|
|
49
|
+
id: `${phase.toUpperCase()}-${String(index + 1).padStart(3, '0')}`,
|
|
50
|
+
})),
|
|
51
|
+
summary: {
|
|
52
|
+
must: 0,
|
|
53
|
+
should: 0,
|
|
54
|
+
could: 0,
|
|
55
|
+
wont: 0,
|
|
56
|
+
total: items.length,
|
|
57
|
+
},
|
|
58
|
+
createdAt: new Date().toISOString(),
|
|
59
|
+
updatedAt: new Date().toISOString(),
|
|
60
|
+
};
|
|
61
|
+
analysis.summary.must = analysis.items.filter(i => i.priority === 'MUST').length;
|
|
62
|
+
analysis.summary.should = analysis.items.filter(i => i.priority === 'SHOULD').length;
|
|
63
|
+
analysis.summary.could = analysis.items.filter(i => i.priority === 'COULD').length;
|
|
64
|
+
analysis.summary.wont = analysis.items.filter(i => i.priority === 'WONT').length;
|
|
65
|
+
await this.saveAnalysis(repoPath, phase, analysis);
|
|
66
|
+
return analysis;
|
|
67
|
+
}
|
|
68
|
+
async loadAnalysis(repoPath, phase) {
|
|
69
|
+
const analysisPath = this.getAnalysisPath(repoPath, phase);
|
|
70
|
+
if (await this.fs.exists(analysisPath)) {
|
|
71
|
+
const content = await this.fs.readFile(analysisPath);
|
|
72
|
+
return JSON.parse(content);
|
|
73
|
+
}
|
|
74
|
+
return null;
|
|
75
|
+
}
|
|
76
|
+
async updateItem(repoPath, phase, itemId, updates) {
|
|
77
|
+
const analysis = await this.loadAnalysis(repoPath, phase);
|
|
78
|
+
if (!analysis)
|
|
79
|
+
return null;
|
|
80
|
+
const itemIndex = analysis.items.findIndex(i => i.id === itemId);
|
|
81
|
+
if (itemIndex === -1)
|
|
82
|
+
return null;
|
|
83
|
+
analysis.items[itemIndex] = { ...analysis.items[itemIndex], ...updates };
|
|
84
|
+
analysis.updatedAt = new Date().toISOString();
|
|
85
|
+
analysis.summary.must = analysis.items.filter(i => i.priority === 'MUST').length;
|
|
86
|
+
analysis.summary.should = analysis.items.filter(i => i.priority === 'SHOULD').length;
|
|
87
|
+
analysis.summary.could = analysis.items.filter(i => i.priority === 'COULD').length;
|
|
88
|
+
analysis.summary.wont = analysis.items.filter(i => i.priority === 'WONT').length;
|
|
89
|
+
await this.saveAnalysis(repoPath, phase, analysis);
|
|
90
|
+
return analysis;
|
|
91
|
+
}
|
|
92
|
+
async removeItem(repoPath, phase, itemId) {
|
|
93
|
+
const analysis = await this.loadAnalysis(repoPath, phase);
|
|
94
|
+
if (!analysis)
|
|
95
|
+
return null;
|
|
96
|
+
analysis.items = analysis.items.filter(i => i.id !== itemId);
|
|
97
|
+
analysis.summary.total = analysis.items.length;
|
|
98
|
+
analysis.updatedAt = new Date().toISOString();
|
|
99
|
+
analysis.summary.must = analysis.items.filter(i => i.priority === 'MUST').length;
|
|
100
|
+
analysis.summary.should = analysis.items.filter(i => i.priority === 'SHOULD').length;
|
|
101
|
+
analysis.summary.could = analysis.items.filter(i => i.priority === 'COULD').length;
|
|
102
|
+
analysis.summary.wont = analysis.items.filter(i => i.priority === 'WONT').length;
|
|
103
|
+
await this.saveAnalysis(repoPath, phase, analysis);
|
|
104
|
+
return analysis;
|
|
105
|
+
}
|
|
106
|
+
async listAnalyses(repoPath) {
|
|
107
|
+
const moscoDir = path.join(repoPath, '.evolith', 'moscow');
|
|
108
|
+
const analyses = [];
|
|
109
|
+
if (await this.fs.exists(moscoDir)) {
|
|
110
|
+
const entries = await this.fs.readdirNames(moscoDir);
|
|
111
|
+
for (const entry of entries) {
|
|
112
|
+
if (entry.endsWith('.json')) {
|
|
113
|
+
const phase = entry.replace('.json', '');
|
|
114
|
+
const analysisPath = path.join(moscoDir, entry);
|
|
115
|
+
const _stat = await this.fs.stat(analysisPath);
|
|
116
|
+
analyses.push({
|
|
117
|
+
phase,
|
|
118
|
+
path: analysisPath,
|
|
119
|
+
updatedAt: new Date().toISOString(),
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
return analyses;
|
|
125
|
+
}
|
|
126
|
+
validateAnalysis(analysis) {
|
|
127
|
+
const issues = [];
|
|
128
|
+
if (analysis.items.length === 0) {
|
|
129
|
+
issues.push('No items in analysis');
|
|
130
|
+
}
|
|
131
|
+
const mustItems = analysis.items.filter(i => i.priority === 'MUST');
|
|
132
|
+
if (mustItems.length === 0) {
|
|
133
|
+
issues.push('No MUST items defined - at least one is required');
|
|
134
|
+
}
|
|
135
|
+
if (mustItems.length > analysis.items.length * 0.6) {
|
|
136
|
+
issues.push('Too many MUST items (>60%) - MoSCoW loses effectiveness');
|
|
137
|
+
}
|
|
138
|
+
const invalidPriorities = analysis.items.filter(i => !['MUST', 'SHOULD', 'COULD', 'WONT'].includes(i.priority));
|
|
139
|
+
if (invalidPriorities.length > 0) {
|
|
140
|
+
issues.push(`Invalid priorities found: ${invalidPriorities.map(i => i.priority).join(', ')}`);
|
|
141
|
+
}
|
|
142
|
+
const duplicateIds = analysis.items.filter((item, index) => analysis.items.findIndex(i => i.id === item.id) !== index);
|
|
143
|
+
if (duplicateIds.length > 0) {
|
|
144
|
+
issues.push(`Duplicate IDs found: ${duplicateIds.map(i => i.id).join(', ')}`);
|
|
145
|
+
}
|
|
146
|
+
return {
|
|
147
|
+
valid: issues.length === 0,
|
|
148
|
+
issues,
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
generateReport(analysis) {
|
|
152
|
+
const lines = [
|
|
153
|
+
`# MoSCoW Prioritization Report`,
|
|
154
|
+
``,
|
|
155
|
+
`**Repository:** ${analysis.repository}`,
|
|
156
|
+
`**Phase:** ${analysis.phase}`,
|
|
157
|
+
`**Created:** ${analysis.createdAt}`,
|
|
158
|
+
`**Updated:** ${analysis.updatedAt}`,
|
|
159
|
+
``,
|
|
160
|
+
`## Summary`,
|
|
161
|
+
``,
|
|
162
|
+
`| Priority | Count | Percentage |`,
|
|
163
|
+
`|----------|-------|------------|`,
|
|
164
|
+
`| MUST | ${analysis.summary.must} | ${this.percentage(analysis.summary.must, analysis.summary.total)} |`,
|
|
165
|
+
`| SHOULD | ${analysis.summary.should} | ${this.percentage(analysis.summary.should, analysis.summary.total)} |`,
|
|
166
|
+
`| COULD | ${analysis.summary.could} | ${this.percentage(analysis.summary.could, analysis.summary.total)} |`,
|
|
167
|
+
`| WONT | ${analysis.summary.wont} | ${this.percentage(analysis.summary.wont, analysis.summary.total)} |`,
|
|
168
|
+
`| **Total** | **${analysis.summary.total}** | **100%** |`,
|
|
169
|
+
``,
|
|
170
|
+
`## Items by Priority`,
|
|
171
|
+
``,
|
|
172
|
+
];
|
|
173
|
+
for (const priority of ['MUST', 'SHOULD', 'COULD', 'WONT']) {
|
|
174
|
+
const items = analysis.items.filter(i => i.priority === priority);
|
|
175
|
+
if (items.length > 0) {
|
|
176
|
+
lines.push(`### ${priority}`);
|
|
177
|
+
lines.push(``);
|
|
178
|
+
for (const item of items) {
|
|
179
|
+
lines.push(`- **${item.id}**: ${item.description}`);
|
|
180
|
+
lines.push(` - Category: ${item.category}`);
|
|
181
|
+
lines.push(` - Rationale: ${item.rationale}`);
|
|
182
|
+
lines.push(``);
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
const validation = this.validateAnalysis(analysis);
|
|
187
|
+
if (!validation.valid) {
|
|
188
|
+
lines.push(`## Validation Issues`);
|
|
189
|
+
lines.push(``);
|
|
190
|
+
for (const issue of validation.issues) {
|
|
191
|
+
lines.push(`- ⚠️ ${issue}`);
|
|
192
|
+
}
|
|
193
|
+
lines.push(``);
|
|
194
|
+
}
|
|
195
|
+
return lines.join('\n');
|
|
196
|
+
}
|
|
197
|
+
percentage(count, total) {
|
|
198
|
+
if (total === 0)
|
|
199
|
+
return '0%';
|
|
200
|
+
return `${Math.round((count / total) * 100)}%`;
|
|
201
|
+
}
|
|
202
|
+
getAnalysisPath(repoPath, phase) {
|
|
203
|
+
return path.join(repoPath, '.evolith', 'moscow', `${phase}.json`);
|
|
204
|
+
}
|
|
205
|
+
async saveAnalysis(repoPath, phase, analysis) {
|
|
206
|
+
const analysisPath = this.getAnalysisPath(repoPath, phase);
|
|
207
|
+
await this.fs.ensureDir(path.dirname(analysisPath));
|
|
208
|
+
await this.fs.writeJson(analysisPath, analysis);
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
exports.MoscowPrioritizationService = MoscowPrioritizationService;
|
|
212
|
+
//# sourceMappingURL=moscow-prioritization.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"moscow-prioritization.service.js","sourceRoot":"","sources":["../src/moscow-prioritization.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { IFileSystem, IFileSystemProvider, FileExistsOptions, FileReadOptions, FileWriteOptions, DirEntry } from '@evolith/core-domain/domain/interfaces';
|
|
2
|
+
export declare class NodeFileSystemProvider implements IFileSystemProvider, IFileSystem {
|
|
3
|
+
createFileSystem(): IFileSystem;
|
|
4
|
+
private resolvePath;
|
|
5
|
+
exists(filePath: string, options?: FileExistsOptions): Promise<boolean>;
|
|
6
|
+
existsSync(filePath: string): boolean;
|
|
7
|
+
readFile(filePath: string, options?: FileReadOptions): Promise<string>;
|
|
8
|
+
readFileBuffer(filePath: string): Promise<Buffer>;
|
|
9
|
+
readJson<T = unknown>(filePath: string, options?: FileReadOptions): Promise<T>;
|
|
10
|
+
writeFile(filePath: string, content: string, options?: FileWriteOptions): Promise<void>;
|
|
11
|
+
writeJson(filePath: string, data: unknown, options?: FileWriteOptions): Promise<void>;
|
|
12
|
+
readdir(filePath: string): Promise<DirEntry[]>;
|
|
13
|
+
readdirNames(filePath: string): Promise<string[]>;
|
|
14
|
+
remove(filePath: string): Promise<void>;
|
|
15
|
+
ensureDir(filePath: string): Promise<void>;
|
|
16
|
+
stat(filePath: string): Promise<{
|
|
17
|
+
isDirectory: () => boolean;
|
|
18
|
+
isFile: () => boolean;
|
|
19
|
+
}>;
|
|
20
|
+
mkdir(path: string): Promise<void>;
|
|
21
|
+
copy(src: string, dest: string): Promise<void>;
|
|
22
|
+
ensureFile(filePath: string): Promise<void>;
|
|
23
|
+
}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.NodeFileSystemProvider = void 0;
|
|
37
|
+
const fs = __importStar(require("fs-extra"));
|
|
38
|
+
const path = __importStar(require("path"));
|
|
39
|
+
class NodeFileSystemProvider {
|
|
40
|
+
createFileSystem() {
|
|
41
|
+
return this;
|
|
42
|
+
}
|
|
43
|
+
resolvePath(filePath, cwd) {
|
|
44
|
+
if (path.isAbsolute(filePath)) {
|
|
45
|
+
return filePath;
|
|
46
|
+
}
|
|
47
|
+
return cwd ? path.join(cwd, filePath) : path.resolve(filePath);
|
|
48
|
+
}
|
|
49
|
+
async exists(filePath, options) {
|
|
50
|
+
const resolved = this.resolvePath(filePath, options?.cwd);
|
|
51
|
+
return fs.pathExists(resolved);
|
|
52
|
+
}
|
|
53
|
+
existsSync(filePath) {
|
|
54
|
+
const resolved = this.resolvePath(filePath);
|
|
55
|
+
return fs.existsSync(resolved);
|
|
56
|
+
}
|
|
57
|
+
async readFile(filePath, options) {
|
|
58
|
+
const resolved = this.resolvePath(filePath, options?.cwd);
|
|
59
|
+
return fs.readFile(resolved, options?.encoding || 'utf-8');
|
|
60
|
+
}
|
|
61
|
+
async readFileBuffer(filePath) {
|
|
62
|
+
const resolved = this.resolvePath(filePath);
|
|
63
|
+
return fs.readFile(resolved);
|
|
64
|
+
}
|
|
65
|
+
async readJson(filePath, options) {
|
|
66
|
+
const content = await this.readFile(filePath, options);
|
|
67
|
+
return JSON.parse(content);
|
|
68
|
+
}
|
|
69
|
+
async writeFile(filePath, content, options) {
|
|
70
|
+
const resolved = this.resolvePath(filePath, options?.cwd);
|
|
71
|
+
await fs.writeFile(resolved, content, options?.encoding || 'utf-8');
|
|
72
|
+
}
|
|
73
|
+
async writeJson(filePath, data, options) {
|
|
74
|
+
const resolved = this.resolvePath(filePath, options?.cwd);
|
|
75
|
+
await fs.writeJson(resolved, data, { spaces: 2, ...options });
|
|
76
|
+
}
|
|
77
|
+
async readdir(filePath) {
|
|
78
|
+
const resolved = this.resolvePath(filePath);
|
|
79
|
+
const entries = await fs.readdir(resolved, { withFileTypes: true });
|
|
80
|
+
return entries.map(entry => ({
|
|
81
|
+
name: entry.name,
|
|
82
|
+
isDirectory: () => entry.isDirectory(),
|
|
83
|
+
isFile: () => entry.isFile(),
|
|
84
|
+
}));
|
|
85
|
+
}
|
|
86
|
+
async readdirNames(filePath) {
|
|
87
|
+
const resolved = this.resolvePath(filePath);
|
|
88
|
+
return fs.readdir(resolved);
|
|
89
|
+
}
|
|
90
|
+
async remove(filePath) {
|
|
91
|
+
const resolved = this.resolvePath(filePath);
|
|
92
|
+
await fs.remove(resolved);
|
|
93
|
+
}
|
|
94
|
+
async ensureDir(filePath) {
|
|
95
|
+
const resolved = this.resolvePath(filePath);
|
|
96
|
+
await fs.ensureDir(resolved);
|
|
97
|
+
}
|
|
98
|
+
async stat(filePath) {
|
|
99
|
+
const resolved = this.resolvePath(filePath);
|
|
100
|
+
const stat = await fs.stat(resolved);
|
|
101
|
+
return {
|
|
102
|
+
isDirectory: () => stat.isDirectory(),
|
|
103
|
+
isFile: () => stat.isFile(),
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
async mkdir(path) {
|
|
107
|
+
await fs.promises.mkdir(path, { recursive: true });
|
|
108
|
+
}
|
|
109
|
+
async copy(src, dest) {
|
|
110
|
+
await fs.promises.copyFile(src, dest);
|
|
111
|
+
}
|
|
112
|
+
async ensureFile(filePath) {
|
|
113
|
+
await fs.ensureFile(filePath);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
exports.NodeFileSystemProvider = NodeFileSystemProvider;
|
|
117
|
+
//# sourceMappingURL=node-filesystem.provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"node-filesystem.provider.js","sourceRoot":"","sources":["../src/node-filesystem.provider.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { IWebhookNotifier } from '@evolith/core-domain/application/ports/webhook-notifier.port';
|
|
2
|
+
import { GateEvidence } from '@evolith/core-domain/domain/gate-evidence';
|
|
3
|
+
export declare class WebhookAdapter implements IWebhookNotifier {
|
|
4
|
+
notify(url: string, evidence: GateEvidence): Promise<void>;
|
|
5
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.WebhookAdapter = void 0;
|
|
4
|
+
const request_context_1 = require("@evolith/core-domain/common/request-context");
|
|
5
|
+
class WebhookAdapter {
|
|
6
|
+
async notify(url, evidence) {
|
|
7
|
+
const context = request_context_1.requestContextStorage.getStore();
|
|
8
|
+
const headers = {
|
|
9
|
+
'Content-Type': 'application/json',
|
|
10
|
+
};
|
|
11
|
+
if (context) {
|
|
12
|
+
if (context.correlationId)
|
|
13
|
+
headers['x-correlation-id'] = context.correlationId;
|
|
14
|
+
if (context.initiative)
|
|
15
|
+
headers['x-evolith-initiative'] = context.initiative;
|
|
16
|
+
if (context.tenant)
|
|
17
|
+
headers['x-evolith-tenant'] = context.tenant;
|
|
18
|
+
if (context.phase)
|
|
19
|
+
headers['x-evolith-phase'] = context.phase;
|
|
20
|
+
}
|
|
21
|
+
const response = await fetch(url, {
|
|
22
|
+
method: 'POST',
|
|
23
|
+
headers,
|
|
24
|
+
body: JSON.stringify(evidence),
|
|
25
|
+
});
|
|
26
|
+
if (!response.ok) {
|
|
27
|
+
throw new Error(`Webhook delivery failed with status: ${response.status}`);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
exports.WebhookAdapter = WebhookAdapter;
|
|
32
|
+
//# sourceMappingURL=webhook.adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webhook.adapter.js","sourceRoot":"","sources":["../src/webhook.adapter.ts"],"names":[],"mappings":";;;AAEA,iFAAoF;AAMpF,MAAa,cAAc;IACzB,KAAK,CAAC,MAAM,CAAC,GAAW,EAAE,QAAsB;QAC9C,MAAM,OAAO,GAAG,uCAAqB,CAAC,QAAQ,EAAE,CAAC;QACjD,MAAM,OAAO,GAA2B;YACtC,cAAc,EAAE,kBAAkB;SACnC,CAAC;QAEF,IAAI,OAAO,EAAE,CAAC;YACZ,IAAI,OAAO,CAAC,aAAa;gBAAE,OAAO,CAAC,kBAAkB,CAAC,GAAG,OAAO,CAAC,aAAa,CAAC;YAC/E,IAAI,OAAO,CAAC,UAAU;gBAAE,OAAO,CAAC,sBAAsB,CAAC,GAAG,OAAO,CAAC,UAAU,CAAC;YAC7E,IAAI,OAAO,CAAC,MAAM;gBAAE,OAAO,CAAC,kBAAkB,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;YACjE,IAAI,OAAO,CAAC,KAAK;gBAAE,OAAO,CAAC,iBAAiB,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC;QAChE,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;YAChC,MAAM,EAAE,MAAM;YACd,OAAO;YACP,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC;SAC/B,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,wCAAwC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;QAC7E,CAAC;IACH,CAAC;CACF;AAxBD,wCAwBC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@evolith/infra-providers",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "Shared infrastructure providers for Evolith Core",
|
|
5
|
+
"main": "dist/index.js",
|
|
6
|
+
"types": "dist/index.d.ts",
|
|
7
|
+
"files": [
|
|
8
|
+
"dist",
|
|
9
|
+
"README.md"
|
|
10
|
+
],
|
|
11
|
+
"publishConfig": {
|
|
12
|
+
"access": "public",
|
|
13
|
+
"registry": "https://registry.npmjs.org"
|
|
14
|
+
},
|
|
15
|
+
"scripts": {
|
|
16
|
+
"build": "tsc"
|
|
17
|
+
},
|
|
18
|
+
"dependencies": {
|
|
19
|
+
"@evolith/core-domain": "1.0.0",
|
|
20
|
+
"@nestjs/common": "11.1.27",
|
|
21
|
+
"ajv": "8.20.0",
|
|
22
|
+
"ajv-formats": "3.0.1",
|
|
23
|
+
"fs-extra": "10.1.0",
|
|
24
|
+
"yaml": "1.10.3"
|
|
25
|
+
},
|
|
26
|
+
"devDependencies": {
|
|
27
|
+
"@types/fs-extra": "11.0.4",
|
|
28
|
+
"@types/node": "26.0.0",
|
|
29
|
+
"typescript": "6.0.3"
|
|
30
|
+
}
|
|
31
|
+
}
|